Author: abelevich
Date: 2008-11-12 03:51:36 -0500 (Wed, 12 Nov 2008)
New Revision: 11100
Modified:
trunk/sandbox/ui/editor/src/main/antlr/html-seamtext.g
Log:
Modified: trunk/sandbox/ui/editor/src/main/antlr/html-seamtext.g
===================================================================
--- trunk/sandbox/ui/editor/src/main/antlr/html-seamtext.g 2008-11-12 07:15:09 UTC (rev
11099)
+++ trunk/sandbox/ui/editor/src/main/antlr/html-seamtext.g 2008-11-12 08:51:36 UTC (rev
11100)
@@ -1,6 +1,6 @@
header
{
- package org.richfaces.antlr;
+ package org.richfaces;
}
{
@@ -61,7 +61,7 @@
private final String SEAMTEXT_BACKTICK = "`";
- private final String SEAMTEXT_PARAGRAPH = "\n\n";
+ private final String BLANK_LINE = "\n\n";
private final String SEAM_DOUBLEQUOTE = "\"";
@@ -74,17 +74,17 @@
protected java.util.Set<String> seamTextSymbols = new
java.util.HashSet(java.util.Arrays.asList(
SEAMTEXT_MONOSPACE, SEAMTEXT_TWIDDLE, SEAMTEXT_HASH, SEAMTEXT_HAT, SEAMTEXT_PLUS,
SEAMTEXT_STAR,
- SEAMTEXT_UNDERSCORE, SEAMTEXT_EQ, SEAMTEXT_BACKTICK, SEAMTEXT_PARAGRAPH,
SEAM_DOUBLEQUOTE, SEAM_OPEN,
+ SEAMTEXT_UNDERSCORE, SEAMTEXT_EQ, SEAMTEXT_BACKTICK, BLANK_LINE, SEAM_DOUBLEQUOTE,
SEAM_OPEN,
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"));
+ "del", "sup", "pre","p", "q"
,"h1" ,"h2" ,"h3" ,"h4" ,"ul"
,"ol" ,"li" ,"i" ,"tt" ,"u"
,"a","blockqoute"));
protected java.util.Set<String> simpleHtmlSeamTextElements = new
java.util.HashSet(java.util.Arrays.asList(
- "del", "sup", "pre","p", "q"
,"i" ,"tt" ,"u"));
+ "del", "sup", "pre", "q", "i"
,"tt" ,"u"));
protected java.util.Set<String> formattedHtmlSeamTextElements = new
java.util.HashSet(java.util.Arrays.asList(
- "ul", "ol", "li", "h1", "h2",
"h3", "h4", "a"));
+ "ul", "ol", "li", "h1", "h2",
"h3", "h4", "a", "p", "blockqoute"));
private Sanitizer sanitizer = new DefaultSanitizer();
@@ -92,13 +92,13 @@
private StringBuilder mainBuilder = new StringBuilder();
- private StringBuilder linkValueCollector = new StringBuilder();
-
private String linkHolder;
private StringBuilder builder = mainBuilder;
+ public StringBuilder valueCollector;
+
public void setSanitizer(Sanitizer sanitizer) {
this.sanitizer = sanitizer;
}
@@ -168,7 +168,7 @@
return seamHeader.toString();
}
- public void healingHeaderMarkup(java.util.Stack <Token> htmlElementStack)
throws TokenStreamException{
+ public void healingHeaderMarkup() throws TokenStreamException{
int EOF = 1;
int ALPHANUMERICWORD = 4;
int i = 0;
@@ -195,15 +195,20 @@
}
}
- public String getSeamParagraphMarkup() throws TokenStreamException{
+ public boolean isParagraph(Token token) {
+ String name = token.getText().toLowerCase();
+ return "p".equals(name) ;
+ }
+
+ public String healingParagraphMarkup() throws TokenStreamException{
int i = 0;
Token token;
do {
i++;
token = LT(i);
if (token.getType() == ALPHANUMERICWORD) {
- if("p".equals(token.getText())) {
- return SEAMTEXT_PARAGRAPH;
+ if(isParagraph(token) || isList(token)) {
+ return BLANK_LINE;
} else if(isHeader(token)) {
return "\n";
}
@@ -231,9 +236,9 @@
Token parent = htmlElementStack.peek();
String parentName = parent.getText().toLowerCase();
if(parentName.equals("ul")) {
+ seamText = SEAMTEXT_EQ;
+ } else if (parentName.equals("ol")){
seamText = SEAMTEXT_HASH;
- } else if (parentName.equals("ol")){
- seamText = SEAMTEXT_EQ;
} else {
String message = "<li> must follow <ol> or <ul> not <"
+ parent.getText() + ">";
throw new SemanticException( message, parent.getFilename(), parent.getLine(),
parent.getColumn());
@@ -244,20 +249,25 @@
public boolean isPlainHMTLRequired(Token name, java.util.Stack <Token>
htmlElementStack) throws SemanticException {
boolean required = 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("li")) {
- required = true;
- }
- }
+
+ if(!isSeamTextElement(name)) {
+ return true;
}
-
- return required;
+
+ if(!htmlElementStack.isEmpty() &&
!"a".equals(name.getText().toLowerCase()) &&
!"p".equals(name.getText().toLowerCase())) {
+ for(Token token : htmlElementStack) {
+ if(token.getText().equals("h1") || token.getText().equals("h2")
|| token.getText().equals("h3")
+ || token.getText().equals("h4") || token.getText().equals("li"))
{
+ return true;
+ }
+ }
+ }
+
+ return false;
}
- public String createSimpleSeamText(Token token) throws
SemanticException,TokenStreamException{
+ public String getSimpleSeamText(Token token) throws
SemanticException,TokenStreamException{
String name = token.getText().toLowerCase();
StringBuilder seamText = new StringBuilder();
@@ -274,14 +284,9 @@
seamText.append(SEAMTEXT_UNDERSCORE);
} else if("pre".equals(name)) {
seamText.append(SEAMTEXT_BACKTICK);
- } else if("p".equals(name)) {
- seamText.append(getSeamParagraphMarkup());
} else if("q".equals(name)) {
seamText.append(SEAM_DOUBLEQUOTE);
- } else if("blockquote".equals(name)) {
- seamText.append(SEAM_DOUBLEQUOTE);
- }
-
+ }
return seamText.toString();
}
@@ -330,24 +335,7 @@
String name = element.getText().toLowerCase();
return formattedHtmlSeamTextElements.contains(name);
}
-
- public void validateFormattedHtmlSeamText(Token token) {
-
- Token token;
- int next = 0;
-
- do {
- next++;
- token = LT(next);
-
-
-
- } while (token.getType() != EOF);
-
- }
-
- public void validateSimpleHtmlSeamText(Token token) {
- }
+
}
@@ -413,7 +401,7 @@
if(!isSeamTextElement(token)) {
append(s.getText());
}
- }
+ }
}
;
@@ -433,34 +421,39 @@
{
Token token = htmlElementStack.peek();
boolean isLink = isLink(token);
- linkValueCollector = new StringBuilder();
+
}
(
seamCharacters|
{
- if(isLink) {
- beginCapture();
- }
-
+ beginCapture();
}
plain
{
- if(isLink) {
- String plain = endCapture();
- linkValueCollector.append(plain);
- }
+ String plain = endCapture();
+ if(valueCollector == null) {
+ valueCollector = new StringBuilder();
+ }
+ valueCollector.append(plain);
}
|html
- |htmlSpecialChars
+ |
{
+ append(valueCollector.toString());
+ valueCollector=null;
+ }
+ htmlSpecialChars
+ {
if(isLink) {
String message = "unexpected token";
throw new SemanticException(message);
}
+
+
}
|NEWLINE
)*)
@@ -473,18 +466,40 @@
sanitizer.validateHtmlElement(name);
Token token = null;
-
- if (isFormattedHtmlSeamTextElement(name) && !isPlainHMTLRequired(name,
htmlElementStack)) {
- if (isListItem(name)) {
- append(createSeamTextList(name, htmlElementStack));
- } else if (isHeader(name)) {
- append(createSeamTextHeader(name));
+
+ if (isFormattedHtmlSeamTextElement(name)) {
+ if(!isPlainHMTLRequired(name, htmlElementStack)) {
+ if (isListItem(name)) {
+ append(createSeamTextList(name, htmlElementStack));
+ }else if (isHeader(name)) {
+ append(createSeamTextHeader(name));
+ }
+ if(valueCollector != null) {
+ append(valueCollector.toString().trim());
+ valueCollector = null;
+ }
+ } else {
+ if(valueCollector != null) {
+ append(valueCollector.toString().trim());
+ valueCollector = null;
+ }
+ append("<");
+ append(name.getText());
}
-
+
+
} else if(isSimpleSeamTextElement(name)){
- createSimpleSeamText(name)
+ if(valueCollector != null) {
+ append(valueCollector.toString());
+ valueCollector = null;
+ }
+ append(getSimpleSeamText(name));
} else {
- append("<");
+ if(valueCollector != null) {
+ append(valueCollector.toString().trim());
+ valueCollector = null;
+ }
+ append("<");
append(name.getText());
}
@@ -506,9 +521,10 @@
beforeBody: GT {
Token name = htmlElementStack.pop();
- if(!isSimpleSeamTextElement && !isPlainHMTLRequired(name,htmlElementStack)) {
+ if((isFormattedHtmlSeamTextElement(name) &&
isPlainHMTLRequired(name,htmlElementStack)) || !isSeamTextElement(name)) {
append(">");
- }
+ }
+
htmlElementStack.push(name);
}
;
@@ -527,39 +543,52 @@
LT SLASH name:ALPHANUMERICWORD GT
{
htmlElementStack.pop();
-
- if(isSimpleSeamTextElement(name)) {
- append(createSimpleSeamText(name));
+ String value = "";
+ if(valueCollector != null) {
+ value = valueCollector.toString();
}
-
- if(isFormattedSeamTextElement) {
+
+ if(isFormattedHtmlSeamTextElement(name)) {
if(isLink(name)){
- append(createSeamTextLink(linkHolder,linkValueCollector.toString().trim()));
+ append(createSeamTextLink(linkHolder,value.trim()));
+ } else if(isParagraph(name)) {
+ append(value);
+ append(healingParagraphMarkup());
+ }else {
+ append(value.trim());
}
-
+
if(!isPlainHMTLRequired(name, htmlElementStack)) {
-
- if(isHeader(name)) {
+ if(isHeader(name)) {
append("\n");
- healingHeaderMarkup(htmlElementStack);
+ healingHeaderMarkup();
}
+
+ if(isList(name)) {
+ append("\n");
+ }
if(isListItem(name)){
append("\n");
}
-
} else {
append("</");
- append(name.getText());
+ append(name.getText());
append(">");
}
- } else {
+ } else if(isSimpleSeamTextElement(name)) {
+ append(value.trim());
+ append(getSimpleSeamText(name));
+ } else {
+ append(value);
append("</");
append(name.getText());
append(">");
}
+ valueCollector = null;
+
}
;