Author: Alex.Kolonitsky
Date: 2009-05-11 04:21:42 -0400 (Mon, 11 May 2009)
New Revision: 14099
Added:
trunk/ui/editor/src/main/java/org/richfaces/convert/seamtext/tags/RootTag.java
Modified:
trunk/ui/editor/src/main/java/org/richfaces/convert/seamtext/HtmlToSeamTransformer.java
trunk/ui/editor/src/main/java/org/richfaces/convert/seamtext/tags/HtmlTag.java
trunk/ui/editor/src/main/java/org/richfaces/convert/seamtext/tags/TagFactory.java
trunk/ui/editor/src/main/java/org/richfaces/convert/seamtext/tags/UnorderedListTag.java
trunk/ui/editor/src/test/java/org/richfaces/seamparser/HtmlSeamParserTest.java
Log:
Editor: exception if input html source in SeamTextMode.
https://jira.jboss.org/jira/browse/RF-7064
Modified:
trunk/ui/editor/src/main/java/org/richfaces/convert/seamtext/HtmlToSeamTransformer.java
===================================================================
---
trunk/ui/editor/src/main/java/org/richfaces/convert/seamtext/HtmlToSeamTransformer.java 2009-05-10
14:31:42 UTC (rev 14098)
+++
trunk/ui/editor/src/main/java/org/richfaces/convert/seamtext/HtmlToSeamTransformer.java 2009-05-11
08:21:42 UTC (rev 14099)
@@ -147,8 +147,8 @@
case '\n':
final HtmlTag token = htmlElementStack.peek();
- if (!(token.isParagraph()
- || isHeaderProcessed
+ if (!(/*token.isParagraph()
+ ||*/ isHeaderProcessed
|| HtmlToSeamSAXParser.ROOT_TAG_NAME.equals(token.getName())
|| token.isList())) {
out(text, start, localLength);
Modified: trunk/ui/editor/src/main/java/org/richfaces/convert/seamtext/tags/HtmlTag.java
===================================================================
---
trunk/ui/editor/src/main/java/org/richfaces/convert/seamtext/tags/HtmlTag.java 2009-05-10
14:31:42 UTC (rev 14098)
+++
trunk/ui/editor/src/main/java/org/richfaces/convert/seamtext/tags/HtmlTag.java 2009-05-11
08:21:42 UTC (rev 14099)
@@ -42,7 +42,7 @@
private String name;
private Map<String, String> attributes;
- protected List<Object> body;
+ protected LinkedList<Object> body;
private boolean isEmpty = true;
@@ -63,6 +63,14 @@
setAttributes(attributes);
}
+ protected boolean isBreakLineChild(Object child) {
+ if (!(child instanceof String)) {
+ return false;
+ }
+ final String str = (String) child;
+ return "\r".equals(str) || "\n".equals(str) ||
"\r\n".equals(str);
+ }
+
protected String printPlainStart(){
final StringBuilder builder = new StringBuilder();
builder.append('<').append(getName());
@@ -152,7 +160,15 @@
protected String printEnd(){
return printPlainEnd();
}
+
+ public boolean isLineTag() {
+ return this instanceof LineTag;
+ }
+ public boolean isQuote() {
+ return Q.equals(name);
+ }
+
public boolean isLink() {
return A.equals(name);
}
@@ -174,7 +190,7 @@
}
public boolean isPreFormattedElement() {
- return PRE.equals(name) || TT.equals(name);
+ return TT.equals(name);
}
public void setEmpty() {
Added: trunk/ui/editor/src/main/java/org/richfaces/convert/seamtext/tags/RootTag.java
===================================================================
--- trunk/ui/editor/src/main/java/org/richfaces/convert/seamtext/tags/RootTag.java
(rev 0)
+++
trunk/ui/editor/src/main/java/org/richfaces/convert/seamtext/tags/RootTag.java 2009-05-11
08:21:42 UTC (rev 14099)
@@ -0,0 +1,81 @@
+package org.richfaces.convert.seamtext.tags;
+
+import java.util.LinkedList;
+
+public class RootTag extends HtmlTag{
+
+ private static final long serialVersionUID = -5798300257186134777L;
+
+ RootTag () {
+ super("root");
+ }
+
+ @Override
+ protected String printEnd() {
+ return "";
+ }
+
+ @Override
+ protected String printStart() {
+ return "";
+ }
+
+ @Override
+ protected String printBody() {
+ body = prepareBody();
+ return super.printBody();
+ }
+
+ /*
+ * from seam-text.g
+ *
+ * startRule: (newline)* ( (heading (newline)* )? text (heading (newline)* text)* )?
+ * ;
+ *
+ * text : ( (paragraph|preformatted|blockquote|list|html) (newline)* )+
+ * ;
+ *
+ * After header alwas must be text.
+ *
+ * */
+ private LinkedList<Object> prepareBody() {
+ LinkedList<Object> res = new LinkedList<Object>();
+ StringBuilder builder = new StringBuilder("<span>");
+
+ for (int i = 0; i < body.size(); i++) {
+ Object child = body.get(i);
+ Object nextChild = i+1 < body.size() ? body.get(i+1) : null;
+
+ if (isChildString(child)) {
+ builder.append(child);
+ if (nextChild == null || !isChildString(nextChild)) {
+ builder.append("</span>");
+
+ res.add(builder.toString());
+
+ builder = new StringBuilder("<span>");
+ }
+ } else if (isChildHeader(child) && (isChildHeader(nextChild) ||
nextChild == null)) {
+ res.add(child);
+ res.add(" \n\n"); // empty paragraph
+ } else if (child instanceof HtmlTag && ((HtmlTag)child).isQuote()) {
+ res.add(child);
+ res.add("\n\n"); // empty paragraph
+ } else if (child instanceof HtmlTag) {
+ res.add(child);
+ } else {
+ throw new IllegalStateException("Unknow child element '" +
child + "'");
+ }
+ }
+
+ return res;
+ }
+
+ private boolean isChildHeader(Object child) {
+ return child instanceof LineTag && ((LineTag)child).isHeader();
+ }
+
+ private boolean isChildString(Object child) {
+ return child instanceof String;
+ }
+}
Modified:
trunk/ui/editor/src/main/java/org/richfaces/convert/seamtext/tags/TagFactory.java
===================================================================
---
trunk/ui/editor/src/main/java/org/richfaces/convert/seamtext/tags/TagFactory.java 2009-05-10
14:31:42 UTC (rev 14098)
+++
trunk/ui/editor/src/main/java/org/richfaces/convert/seamtext/tags/TagFactory.java 2009-05-11
08:21:42 UTC (rev 14099)
@@ -28,7 +28,7 @@
* Collection of special Seam Tags
* */
private static final Collection<HtmlTag> TAGS = Arrays.asList(
- getNewTagDefinition("root", "", ""),
+ new RootTag(),
new EmptyHtmlTag(HR),
new EmptyHtmlTag(BR),
new EmptyHtmlTag(IMG),
@@ -54,8 +54,33 @@
return super.printBody();
}
},
- getNewTagDefinition(P, "", "\n\n"),
+ new HtmlTag(P) {
+ @Override
+ public String printStart() {
+ return "";
+ }
+
+ @Override
+ protected String printBody() {
+ while (isBreakLineChild(body.getLast())) {
+ body.removeLast();
+ }
+
+ return super.printBody();
+ }
+
+ @Override
+ public String printEnd() {
+ return "\n\n";
+ }
+
+ @Override
+ public String printStartSuffix() {
+ return "";
+ }
+ },
+
new FormattingTag(I, SEAM_STAR),
new FormattingTag(DEL, SEAM_TWIDDLE),
new FormattingTag(SUP, SEAM_HAT),
@@ -68,7 +93,7 @@
}
},
- getNewTagDefinition(PRE, SEAM_BACKTICK, SEAM_BACKTICK),
+// getNewTagDefinition(PRE, SEAM_BACKTICK, SEAM_BACKTICK),
getNewTagDefinition(Q, SEAM_DOUBLEQUOTE, SEAM_DOUBLEQUOTE),
new LinkTag(),
Modified:
trunk/ui/editor/src/main/java/org/richfaces/convert/seamtext/tags/UnorderedListTag.java
===================================================================
---
trunk/ui/editor/src/main/java/org/richfaces/convert/seamtext/tags/UnorderedListTag.java 2009-05-10
14:31:42 UTC (rev 14098)
+++
trunk/ui/editor/src/main/java/org/richfaces/convert/seamtext/tags/UnorderedListTag.java 2009-05-11
08:21:42 UTC (rev 14099)
@@ -21,6 +21,8 @@
return "\n";
}
+
+
@Override
protected void appendChildTag(StringBuilder res, HtmlTag child) {
if (LI.equals(child.getName()) && !isHtml) {
@@ -29,4 +31,9 @@
super.appendChildTag(res, child);
}
}
+
+ @Override
+ public void appendBody(String str) {
+ // Do nothing.
+ }
}
Modified: trunk/ui/editor/src/test/java/org/richfaces/seamparser/HtmlSeamParserTest.java
===================================================================
---
trunk/ui/editor/src/test/java/org/richfaces/seamparser/HtmlSeamParserTest.java 2009-05-10
14:31:42 UTC (rev 14098)
+++
trunk/ui/editor/src/test/java/org/richfaces/seamparser/HtmlSeamParserTest.java 2009-05-11
08:21:42 UTC (rev 14099)
@@ -122,7 +122,10 @@
assertSeamConverting(SEAM_TEXT_EXPRESSION_5);
}
- public void testStandartSeamTextConverting6() throws Exception {
+ /*
+ * Element <pre> not processed after
https://jira.jboss.org/jira/browse/RF-7030
+ * */
+ public void standartSeamTextConverting6() throws Exception {
assertSeamConverting(SEAM_TEXT_EXPRESSION_6);
}
@@ -218,6 +221,13 @@
assertSeamConverting(SEAM_TEXT_EXPRESSION_29);
}
+ /*
+ * Element <pre> not processed after
https://jira.jboss.org/jira/browse/RF-7030
+ * */
+ public void standartSeamTextConverting30() throws Exception {
+ assertSeamConverting("`for (int i=0; i<100; i--)\n{\n
doSomething();\n}`");
+ }
+
public void testRF5717() throws Exception {
assertHtml2SeamConverting("<p>a<b
a&b</p>");
}
@@ -254,12 +264,77 @@
}
public void testEmrtyTags02() throws Exception {
- final String html = " <br/>Hello <hr/><img/><area/>
World! <col/>";
+ assertHtml2SeamConverting(" <br/>Hello
<hr/><img/><area/> World! <col/>");
+ }
+
+ public void testPreformated() throws Exception {
+ final String html =
"<pre>aaaaa<br/>bbbb<br/></pre>";
final String result = assertHtml2SeamConverting(html);
assertTrue(result.contains(html));
}
+ public void testPreformated02() throws Exception {
+ final String html =
"<pre><br/><sup>sdsdf</sup></pre>";
+ final String result = assertHtml2SeamConverting(html);
+
+ assertTrue(result.contains(html));
+ }
+
+ public void testPreformated03() throws Exception {
+ final String html = "<pre><></pre>";
+ final String result = assertHtml2SeamConverting(html);
+
+ assertTrue(result.equals(html));
+ }
+
+ public void testHeading() throws Exception {
+
assertHtml2SeamConverting("<h1></h1><p>\nqwe<br/></p>\n\n\n<h2>adsfasdf</h2>qwe");
+ }
+
+ public void testHeading02() throws Exception {
+ assertHtml2SeamConverting("<h1></h1>");
+ }
+
+ public void testHeading03() throws Exception {
+
assertHtml2SeamConverting("<h1></h1>qwe\n<h1></h1><h1></h1>");
+ }
+
+ public void testHeading04() throws Exception {
+ assertHtml2SeamConverting("<h1></h1>qwe");
+ }
+
+ public void testList() throws Exception {
+ assertHtml2SeamConverting("<ol> \n\n<li>first
item</li>\n\n<li>second item</li>\n\n<li>and even the
<i>third</i> item</li>\n\n</ol>");
+ }
+
+ public void testFullList() throws Exception {
+ assertHtml2SeamConverting("<p>\n\nAn ordered list:\n\n</p>\n\n
\n\n<ol> \n\n<li>first item</li>\n\n<li>second
item</li>\n\n<li>and even the <i>third</i>
item</li>\n\n</ol>\n\n\n\n<p>\n\nAn unordered
list:\n\n</p>\n\n\n\n<ul>\n\n<li>an item</li>\n\n<li>another
item</li>\n\n</ul>\n");
+ }
+
+ public void testBlockquote() throws Exception {
+ assertHtml2SeamConverting("<p>\n\nThe other guy
said:\n\n</p>\n\n \n\n<q>Nyeah nyeah-nee\n<i>nyeah</i>
nyeah!</q>\n\n\n\n<p>\n\nBut what do you think he means by
<q>nyeah-nee</q>?\n\n</p>");
+ }
+
+ public void testBlockquote02() throws Exception {
+ assertHtml2SeamConverting("asdsadasd <q>word</q> my
<span>red</span> ");
+ }
+
+ public void testText() throws Exception {
+ assertHtml2SeamConverting("test ");
+ }
+
+ public void testSeamDocumentation01() throws Exception {
+ assertHtml2SeamConverting("<p>\nIt's easy to make
<i>emphasis</i>, <tt>monospace</tt>\n<del>deleted
text</del>, super<sup>scripts</sup> or
<u>underlines</u>.\n</p>");
+ }
+
+ public void testSeamDocumentation02() throws Exception {
+ final String content = "\nYou can write down equations like 2*3=6 and HTML
tags\nlike <body> using the escape character: \\.\n";
+ final String result =
assertHtml2SeamConverting("<p>"+content+"</p>");
+
+ assertTrue(result.contains(content));
+ }
+
public void testUglyTextFromWord() throws Exception {
final String str = "<p><meta content=\"text/html;
charset=utf-8\" http-equiv=\"Content-Type\"/><meta
content=\"Word.Document\" name=\"ProgId\"/><meta
content=\"Microsoft Word 12\" name=\"Generator\"/><meta
content=\"Microsoft Word 12\" name=\"Originator\"/><link
href=\"file:///E:\\TEMP~1\\msohtmlclip1\\01\\clip_filelist.xml\"
rel=\"File-List\"/><link
href=\"file:///E:\\TEMP~1\\msohtmlclip1\\01\\clip_themedata.thmx\"
rel=\"themeData\"/><link
href=\"file:///E:\\TEMP~1\\msohtmlclip1\\01\\clip_colorschememapping.xml\"
rel=\"colorSchemeMapping\"/>"
+ "<!--[if gte mso 9]><xml>\n"
@@ -740,26 +815,39 @@
}
private String assertHtml2SeamConverting(String htmlText) throws Exception {
+ System.out.println("Html -> SeamText -> Html");
+ System.out.println("------------------- Html
-----------------------");
+ System.out.println("html = " + htmlText);
+
+ System.out.println("------------------- SeamText
-------------------");
final String seamText = convertHtmlToSeamText(htmlText);
System.out.println("seamText = \n'" + seamText +
"'");
- final SeamTextParser seamParser = new SeamTextParser(new SeamTextLexer(
- new StringReader(seamText)));
+ final SeamTextParser seamParser =
+ new SeamTextParser(new SeamTextLexer(new StringReader(seamText)));
seamParser.startRule();
- return seamParser.toString();
+ final String string = seamParser.toString();
+ System.out.println("------------------- Html
-----------------------");
+ System.out.println("html = " + string);
+
+ return string;
}
private void assertSeamConverting(String seamTextExpression)
throws TokenStreamException, RecognitionException {
-
+ System.out.println("SeamText -> Html -> SeamText");
+ System.out.println("------------------- SeamText
-------------------");
final SeamTextParser seamParser = new SeamTextParser(new SeamTextLexer(
new StringReader(seamTextExpression)));
seamParser.startRule();
+
+ System.out.println("------------------- Html
-----------------------");
final String html = seamParser.toString();
System.out.println("html = " + html);
+ System.out.println("------------------- SeamText
-------------------");
final String seamtext = convertHtmlToSeamText(html);
assertEquals(seamTextExpression, seamtext.trim());