Author: abelevich
Date: 2008-11-11 12:46:12 -0500 (Tue, 11 Nov 2008)
New Revision: 11089
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-11 17:31:40 UTC (rev
11088)
+++ trunk/sandbox/ui/editor/src/main/antlr/html-seamtext.g 2008-11-11 17:46:12 UTC (rev
11089)
@@ -82,7 +82,9 @@
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"));
+ "del", "sup", "pre","p", "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"));
private Sanitizer sanitizer = new DefaultSanitizer();
@@ -147,6 +149,7 @@
return ("h1".equals(name) || "h2".equals(name) ||
"h3".equals(name) || "h4".equals(name));
}
+
public String createSeamTextHeader(Token token) throws SemanticException {
String name = token.getText();
@@ -165,7 +168,7 @@
return seamHeader.toString();
}
- public void healingHeaderMarkup(java.util.Stack <Token> htmlElementStack)
throws TokenStreamException, SemanticException{
+ public void healingHeaderMarkup(java.util.Stack <Token> htmlElementStack)
throws TokenStreamException{
int EOF = 1;
int ALPHANUMERICWORD = 4;
int i = 0;
@@ -188,8 +191,29 @@
if (!containText) {
append("<span></span>");
+ append("\n");
}
}
+
+ public String getSeamParagraphMarkup() throws TokenStreamException{
+ int i = 0;
+ Token token;
+ do {
+ i++;
+ token = LT(i);
+ if (token.getType() == ALPHANUMERICWORD) {
+ if("p".equals(token.getText())) {
+ return SEAMTEXT_PARAGRAPH;
+ } else if(isHeader(token)) {
+ return "\n";
+ }
+
+ break;
+ }
+
+ }while(token.getType() != EOF);
+ return "";
+ }
public boolean isList(Token token){
String name = token.getText();
@@ -233,7 +257,7 @@
}
- public String createSimpleSeamText(Token token) throws SemanticException{
+ public String createSimpleSeamText(Token token) throws
SemanticException,TokenStreamException{
String name = token.getText().toLowerCase();
StringBuilder seamText = new StringBuilder();
@@ -251,7 +275,7 @@
} else if("pre".equals(name)) {
seamText.append(SEAMTEXT_BACKTICK);
} else if("p".equals(name)) {
- seamText.append(SEAMTEXT_PARAGRAPH);
+ seamText.append(getSeamParagraphMarkup());
} else if("q".equals(name)) {
seamText.append(SEAM_DOUBLEQUOTE);
} else if("blockquote".equals(name)) {
@@ -262,19 +286,7 @@
}
- public boolean isSeamTextElement(Token element){
- 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 {
+ public String escapeSeamText(Token token, java.util.Stack <Token>
parentHtmlTokens) throws TokenStreamException {
StringBuilder result = new StringBuilder();
String tokenName = token.getText();
@@ -301,18 +313,53 @@
result = result.length() != 0 ? result :
result.append("\\").append(tokenName);
return result.toString();
}
+
+
+ public boolean isSeamTextElement(Token element){
+ String name = element.getText().toLowerCase();
+ return htmlSeamTextElements.contains(name);
+ }
-
-
+
+ public boolean isSimpleSeamTextElement(Token element){
+ String name = element.getText().toLowerCase();
+ return simpleHtmlSeamTextElements.contains(name);
+ }
+
+ public boolean isFormattedHtmlSeamTextElement(Token element) {
+ 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) {
+ }
}
-startRule: (newline)* (text eof)?
+startRule: (NEWLINE)* (text eof)?
;
-text: ((seamCharacters|plain|html|htmlSpecialChars) (newline)*)+
+text: ((seamCharacters|plain|html|htmlSpecialChars) (NEWLINE)*)+
;
+plain: (word|punctuation|space:SPACE {append(space.getText());})
+ ;
+
word: an:ALPHANUMERICWORD { append( an.getText() ); } | uc:UNICODEWORD { append(
uc.getText() ); }
;
@@ -361,33 +408,25 @@
;
space: s:SPACE {
-
- if(!htmlElementStack.isEmpty()) {
- String tokenName = htmlElementStack.peek().getText();
- if(!("ul".equals(tokenName) || "ol".equals(tokenName))) {
+ if(!htmlElementStack.isEmpty()) {
+ Token token = htmlElementStack.peek();
+ if(!isSeamTextElement(token)) {
append(s.getText());
- }
-
- } else {
- append(s.getText());
- }
+ }
+ }
}
;
-newline: n:NEWLINE { append(n.getText());}
-
-
- ;
-
+newline: n:NEWLINE {append(n.getText());}
+ ;
+
newlineOrEof: newline | EOF
;
html: openTag ( space | space attribute )* ( ( beforeBody body closeTagWithBody ) |
closeTagWithNoBody)
;
-plain: (word|punctuation|space)
- ;
body: (
@@ -399,20 +438,20 @@
(
seamCharacters|
-
-
- { if(isLink) {
+
+ {
+ if(isLink) {
beginCapture();
- }
-
+ }
+
}
plain
+
{
if(isLink) {
String plain = endCapture();
linkValueCollector.append(plain);
- }
-
+ }
}
|html
@@ -423,7 +462,8 @@
throw new SemanticException(message);
}
}
- |newline: NEWLINE )*)
+ |NEWLINE
+ )*)
;
openTag:
@@ -431,21 +471,21 @@
{
sanitizer.validateHtmlElement(name);
-
-
+
Token token = null;
- if (isSeamTextElement(name) && !isPlainHMTLRequired(name,
htmlElementStack)) {
+ if (isFormattedHtmlSeamTextElement(name) && !isPlainHMTLRequired(name,
htmlElementStack)) {
if (isListItem(name)) {
append(createSeamTextList(name, htmlElementStack));
} else if (isHeader(name)) {
append(createSeamTextHeader(name));
}
- } else if(!isSimpleSeamTextElement(name)){
- append("<");
- append(name.getText());
-
+ } else if(isSimpleSeamTextElement(name)){
+ createSimpleSeamText(name)
+ } else {
+ append("<");
+ append(name.getText());
}
htmlElementStack.push(name);
@@ -466,18 +506,10 @@
beforeBody: GT {
Token name = htmlElementStack.pop();
- if(isSeamTextElement(name)){
- if(isSimpleSeamTextElement(name)) {
- append(createSimpleSeamText(name));
- } else if( isPlainHMTLRequired(name,htmlElementStack)) {
- append(">");
-
- }
- } else {
+ if(!isSimpleSeamTextElement && !isPlainHMTLRequired(name,htmlElementStack)) {
append(">");
- }
+ }
htmlElementStack.push(name);
-
}
;
exception
@@ -495,35 +527,39 @@
LT SLASH name:ALPHANUMERICWORD GT
{
htmlElementStack.pop();
-
- if(isSeamTextElement(name)){
-
- if(isLink(name)){
+
+ if(isSimpleSeamTextElement(name)) {
+ append(createSimpleSeamText(name));
+ }
+
+ if(isFormattedSeamTextElement) {
+
+ if(isLink(name)){
append(createSeamTextLink(linkHolder,linkValueCollector.toString().trim()));
- } else {
- append(createSimpleSeamText(name));
}
-
- if(!isPlainHMTLRequired(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(">");
+
+ if(isListItem(name)){
+ append("\n");
+ }
+
+ } else {
+ append("</");
+ append(name.getText());
+ append(">");
}
-
+
} else {
append("</");
append(name.getText());
append(">");
}
-
-
}
;