Author: abelevich
Date: 2008-11-06 13:15:19 -0500 (Thu, 06 Nov 2008)
New Revision: 11049
Modified:
trunk/sandbox/ui/editor/pom.xml
trunk/sandbox/ui/editor/src/main/antlr/html-seamtext.g
Log:
healing grammar alfa version
Modified: trunk/sandbox/ui/editor/pom.xml
===================================================================
--- trunk/sandbox/ui/editor/pom.xml 2008-11-06 18:01:04 UTC (rev 11048)
+++ trunk/sandbox/ui/editor/pom.xml 2008-11-06 18:15:19 UTC (rev 11049)
@@ -73,7 +73,7 @@
<dependency>
<groupId>org.jboss.seam</groupId>
<artifactId>jboss-seam</artifactId>
- <version>2.1.0.CR1</version>
+ <version>2.1.0.SP1</version>
<scope>provided</scope>
</dependency>
</dependencies>
Modified: trunk/sandbox/ui/editor/src/main/antlr/html-seamtext.g
===================================================================
--- trunk/sandbox/ui/editor/src/main/antlr/html-seamtext.g 2008-11-06 18:01:04 UTC (rev
11048)
+++ trunk/sandbox/ui/editor/src/main/antlr/html-seamtext.g 2008-11-06 18:15:19 UTC (rev
11049)
@@ -78,8 +78,11 @@
SEAM_CLOSE, SEAM_GT
));
+
protected java.util.Set<String> htmlSeamTextElements = new
java.util.HashSet(java.util.Arrays.asList(
"del", "sup", "pre","p", "q"
,"h1" ,"h2" ,"h3" ,"h4" ,"ul"
,"ol" ,"li" ,"i" ,"tt" ,"u"
,"a"));
+ protected java.util.Set<String> simpleHtmlSeamTextElements = new
java.util.HashSet(java.util.Arrays.asList(
+ "del", "sup", "pre","p", "q"
,"i" ,"tt" ,"u" ,"a"));
private Sanitizer sanitizer = new DefaultSanitizer();
@@ -189,50 +192,47 @@
return seamText != null ? seamText : "";
}
- // validate lists and headers'
- public void validateNestedMarkup(Token name, java.util.Stack <Token>
htmlElementStack) throws SemanticException {
+ public boolean isPlainHMTLRequired(Token name, java.util.Stack <Token>
htmlElementStack) throws SemanticException {
+ boolean require = false;
if(!htmlElementStack.isEmpty()) {
for(Token token : htmlElementStack) {
-
if(token.getText().equals("h1") ||
token.getText().equals("h2") || token.getText().equals("h3")
- || token.getText().equals("h4")
|| token.getText().equals("ol") || token.getText().equals("ul")) {
- String message = "<" + token.getText() + "> contains nested
<" + name.getText() + "> token";
- throw new SemanticException( message, name.getFilename(), name.getLine(),
name.getColumn());
+ || token.getText().equals("h4")
|| token.getText().equals("li")) {
+ require = true;
}
}
}
+
+
+ return require;
}
- public void validateHeaderMarkup(Token token, java.util.Stack <Token>
htmlElementStack) throws TokenStreamException, SemanticException{
+ public void healingHeaderMarkup(java.util.Stack <Token> htmlElementStack)
throws TokenStreamException, SemanticException{
int EOF = 1;
int ALPHANUMERICWORD = 4;
int i = 0;
- int type;
+ Token token;
boolean containText = false;
-
- Token element = htmlElementStack.peek();
- String header = element.getText();
-
- if (header.equals("h1") || header.equals("h2") ||
header.equals("h3") || header.equals("h4")) {
- do {
- i++;
- type = LT(i).getType();
- if (type == ALPHANUMERICWORD) {
- containText = true;
- break;
- }
-
- } while ( type != EOF);
+
+ do {
+ i++;
+ token = LT(i);
- if (!containText) {
- String message = "You must have some text following a heading";
- throw new SemanticException( message, element.getFilename(), element.getLine(),
element.getColumn());
- }
- }
-
- }
+ if (token.getType() == ALPHANUMERICWORD) {
+ if(!isHeader(token)) {
+ containText = true;
+ }
+ break;
+ }
+
+ } while ( token.getType() != EOF);
+
+ if (!containText) {
+ append("<span></span>");
+ }
+ }
public String createSimpleSeamText(Token token) throws SemanticException{
@@ -267,7 +267,13 @@
String name = element.getText().toLowerCase();
return htmlSeamTextElements.contains(name);
}
-
+
+
+ public boolean isSimpleSeamTextElement(Token element){
+ String name = element.getText().toLowerCase();
+ return simpleHtmlSeamTextElements.contains(name);
+ }
+
public String escapeSeamText(Token token, java.util.Stack <Token>
parentHtmlTokens) throws TokenStreamException {
@@ -316,7 +322,8 @@
| lt:ESCAPED_LT {append(escapeSeamText(lt, htmlElementStack));}
| gt:ESCAPED_GT {append(escapeSeamText(gt, htmlElementStack));}
| amp:ESCAPED_AMP {append(escapeSeamText(amp, htmlElementStack));}
- | qout:ESCAPED_QOUT {append(escapeSeamText(qout, htmlElementStack));}
+ | qout:ESCAPED_QOUT {append(escapeSeamText(qout, htmlElementStack));}
+ | nbsp:NBSP {append(nbsp.getText());}
;
eof: EOF;
@@ -424,23 +431,24 @@
LT name:ALPHANUMERICWORD
{
-
sanitizer.validateHtmlElement(name);
- if (isSeamTextElement(name)) {
- if (isList(name)) {
- validateNestedMarkup(name, htmlElementStack);
- } else if (isListItem(name)) {
- append(createSeamTextList(name,htmlElementStack));
- } else if (isHeader(name)) {
- validateNestedMarkup(name, htmlElementStack);
+
+ Token token = null;
+
+ if (isSeamTextElement(name) && !isPlainHMTLRequired(name,
htmlElementStack)) {
+ if (isListItem(name)) {
+ append(createSeamTextList(name, htmlElementStack));
+ } else if (isHeader(name)) {
append(createSeamTextHeader(name));
- }
+ }
- } else {
- append("<");
- append(name.getText());
+ } else if(!isSimpleSeamTextElement(name)){
+ append("<");
+ append(name.getText());
+
}
+
htmlElementStack.push(name);
}
@@ -458,12 +466,19 @@
beforeBody: GT {
- Token name = htmlElementStack.peek();
+ Token name = htmlElementStack.pop();
if(isSeamTextElement(name)){
- append(createSimpleSeamText(name));
+ if(isSimpleSeamTextElement(name)) {
+ append(createSimpleSeamText(name));
+ } else if( isPlainHMTLRequired(name,htmlElementStack)) {
+ append(">");
+
+ }
} else {
append(">");
}
+ htmlElementStack.push(name);
+
}
;
exception
@@ -479,19 +494,30 @@
closeTagWithBody:
LT SLASH name:ALPHANUMERICWORD GT
- {
+ {
+ htmlElementStack.pop();
+
if(isSeamTextElement(name)){
- if(isLink(name)){
+
+ if(isLink(name)){
append(createSeamTextLink(linkHolder,linkValueCollector.toString().trim()));
} else {
append(createSimpleSeamText(name));
}
- if(isListItem(name) || isHeader(name)) {
- append("\n");
- validateHeaderMarkup(name,htmlElementStack);
- }
-
+
+ if(!isPlainHMTLRequired(name, htmlElementStack)) {
+ if(isHeader(name)) {
+ append("\n");
+ healingHeaderMarkup(htmlElementStack);
+ }
+
+ } else if(isHeader(name)|| isList(name) || isListItem(name)) {
+ append("</");
+ append(name.getText());
+ append(">");
+ }
+
} else {
append("</");
append(name.getText());
@@ -499,7 +525,6 @@
}
- htmlElementStack.pop();
}
;
@@ -775,6 +800,8 @@
ESCAPED_QOUT : """
;
+NBSP : " "
+ ;