Mercurial Hosting > luan
diff src/luan/modules/HtmlLuan.java @ 1712:36c28be6d432
improve html and bbcode
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 14 Jul 2022 22:14:21 -0600 |
parents | 21f5edab1fbf |
children | 31a82b0d0a87 |
line wrap: on
line diff
--- a/src/luan/modules/HtmlLuan.java Wed Jul 13 21:50:41 2022 -0600 +++ b/src/luan/modules/HtmlLuan.java Thu Jul 14 22:14:21 2022 -0600 @@ -2,13 +2,9 @@ import java.util.List; import java.util.ArrayList; -import java.util.Arrays; import java.util.Set; import java.util.HashSet; -import java.util.Map; -import java.util.regex.Pattern; -import java.util.regex.Matcher; -import luan.Luan; +import goodjava.html.Html; import luan.LuanTable; import luan.LuanException; @@ -17,67 +13,63 @@ public static String encode(String s) throws LuanException { Utils.checkNotNull(s); - final char[] a = s.toCharArray(); - StringBuilder buf = new StringBuilder(); - for( char c : a ) { - switch(c) { - case '&': - buf.append("&"); - break; - case '<': - buf.append("<"); - break; - case '>': - buf.append(">"); - break; - case '"': - buf.append("""); - break; - default: - buf.append(c); - } - } - return buf.toString(); + return Html.encode(s); } - private static final Pattern entityPtn = Pattern.compile( - "&#(\\d+);" - ); - public static String decode(String s) { - StringBuffer buf = new StringBuffer(); - Matcher m = entityPtn.matcher(s); - while( m.find() ) { - String entity = new String(new char[]{(char)Integer.parseInt(m.group(1))}); - m.appendReplacement(buf,entity); - } - m.appendTail(buf); - s = buf.toString(); - s = s.replace(" "," "); - s = s.replace(""","\""); - s = s.replace(">",">"); - s = s.replace("<","<"); - s = s.replace("&","&"); - return s; + return Html.decode(s); } - public static String quote(String s) { - StringBuilder buf = new StringBuilder(); - buf.append('"'); - int i = 0; - while(true) { - int i2 = s.indexOf('"',i); - if( i2 == -1 ) { - buf.append(s.substring(i)); - break; - } else { - buf.append(s.substring(i,i2)); - buf.append("""); - i = i2 + 1; + private static LuanTable tag(Html.Tag tag) throws LuanException { + LuanTable tbl = new LuanTable(); + tbl.rawPut("type","tag"); + tbl.rawPut("name",tag.name); + tbl.rawPut("attributes",new LuanTable(tag.attributes)); + tbl.rawPut("is_empty",tag.isEmpty); + tbl.rawPut("raw",tag.raw); + return tbl; + } + public static LuanTable parse(String text,LuanTable containerTagsTbl) { + try { + Set<String> containerTags = new HashSet(); + for( Object s : containerTagsTbl.asList() ) { + containerTags.add((String)s); } + List list = Html.parse(text,containerTags); + List rtn = new ArrayList(); + for( Object el : list ) { + if( el instanceof String ) { + rtn.add(el); + } else if( el instanceof Html.Tag ) { + Html.Tag tag = (Html.Tag)el; + rtn.add(tag(tag)); + } else if( el instanceof Html.Comment ) { + Html.Comment comment = (Html.Comment)el; + LuanTable tbl = new LuanTable(); + tbl.rawPut("type","comment"); + tbl.rawPut("text",comment.text); + rtn.add(tbl); + } else if( el instanceof Html.CData ) { + Html.CData cdata = (Html.CData)el; + LuanTable tbl = new LuanTable(); + tbl.rawPut("type","cdata"); + tbl.rawPut("text",cdata.text); + rtn.add(tbl); + } else if( el instanceof Html.Container ) { + Html.Container container = (Html.Container)el; + LuanTable tbl = new LuanTable(); + tbl.rawPut("type","container"); + tbl.rawPut("tag",tag(container.tag)); + tbl.rawPut("text",container.text); + rtn.add(tbl); + } else { + throw new RuntimeException("invalid el "+el); + } + } + return new LuanTable(rtn); + } catch(LuanException e) { + throw new RuntimeException(e); } - buf.append('"'); - return buf.toString(); } }