[richfaces-svn-commits] JBoss Rich Faces SVN: r14099 - in trunk/ui/editor/src: main/java/org/richfaces/convert/seamtext/tags and 1 other directories.

richfaces-svn-commits at lists.jboss.org richfaces-svn-commits at lists.jboss.org
Mon May 11 04:21:42 EDT 2009


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&lt;b a&amp;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>&lt;&gt;</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 &lt;body&gt; 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());




More information about the richfaces-svn-commits mailing list