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("&amp;");
-				break;
-			case '<':
-				buf.append("&lt;");
-				break;
-			case '>':
-				buf.append("&gt;");
-				break;
-			case '"':
-				buf.append("&quot;");
-				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("&nbsp;"," ");
-		s = s.replace("&quot;","\"");
-		s = s.replace("&gt;",">");
-		s = s.replace("&lt;","<");
-		s = s.replace("&amp;","&");
-		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("&quot;");
-				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();
 	}
 
 }