Author: abelevich
Date: 2008-11-14 13:03:33 -0500 (Fri, 14 Nov 2008)
New Revision: 11177
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-14 18:02:21 UTC (rev
11176)
+++ trunk/sandbox/ui/editor/src/main/antlr/html-seamtext.g 2008-11-14 18:03:33 UTC (rev
11177)
@@ -42,7 +42,6 @@
}
-
private final String SEAMTEXT_MONOSPACE = "|";
private final String SEAMTEXT_TWIDDLE = "~";
@@ -73,18 +72,18 @@
public boolean preformatted = false;
-
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, 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","blockqoute"));
+
protected java.util.Set<String> simpleHtmlSeamTextElements = new
java.util.HashSet(java.util.Arrays.asList(
"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", "p", "blockqoute"));
@@ -96,6 +95,10 @@
private String linkHolder;
+ private int newlines;
+
+ private boolean isHeaderProcessed = false;
+
private StringBuilder builder = mainBuilder;
public StringBuilder valueCollector;
@@ -105,20 +108,24 @@
this.sanitizer = sanitizer;
}
+
public String toString() {
return builder.toString();
}
+
private void beginCapture() {
builder = new StringBuilder();
}
+
private String endCapture() {
String result = builder.toString();
builder = mainBuilder;
return result;
}
+
private void append(String... strings) {
for (String string: strings) builder.append(string);
}
@@ -128,6 +135,7 @@
String name = token.getText().toLowerCase();
return "a".equals(name);
}
+
private String createSeamTextLink(String link, String value) {
@@ -146,6 +154,7 @@
}
+
public boolean isHeader(Token token) {
String name = token.getText().toLowerCase();
return ("h1".equals(name) || "h2".equals(name) ||
"h3".equals(name) || "h4".equals(name));
@@ -158,22 +167,27 @@
StringBuilder seamHeader = new StringBuilder();
if("h1".equals(name)) {
- seamHeader.append("\n").append(SEAMTEXT_PLUS);
+ seamHeader.append(BLANK_LINE).append(SEAMTEXT_PLUS);
} else if("h2".equals(name)) {
- seamHeader.append("\n").append(SEAMTEXT_PLUS).append(SEAMTEXT_PLUS);
+ seamHeader.append(BLANK_LINE).append(SEAMTEXT_PLUS).append(SEAMTEXT_PLUS);
} else if("h3".equals(name)) {
-
seamHeader.append("\n").append(SEAMTEXT_PLUS).append(SEAMTEXT_PLUS).append(SEAMTEXT_PLUS);
+
seamHeader.append(BLANK_LINE).append(SEAMTEXT_PLUS).append(SEAMTEXT_PLUS).append(SEAMTEXT_PLUS);
} else if("h4".equals(name)) {
-
seamHeader.append("\n").append(SEAMTEXT_PLUS).append(SEAMTEXT_PLUS).append(SEAMTEXT_PLUS).append(SEAMTEXT_PLUS);
+
seamHeader.append(BLANK_LINE).append(SEAMTEXT_PLUS).append(SEAMTEXT_PLUS).append(SEAMTEXT_PLUS).append(SEAMTEXT_PLUS);
}
return seamHeader.toString();
}
- public void healingHeaderMarkup() throws TokenStreamException{
- int EOF = 1;
- int ALPHANUMERICWORD = 4;
+ public boolean isParagraph(Token token) {
+ String name = token.getText().toLowerCase();
+ return "p".equals(name) ;
+ }
+
+ public String checkHeaderMarkup() throws TokenStreamException{
+
int i = 0;
+ StringBuilder result = new StringBuilder();
Token token;
boolean containText = false;
@@ -181,56 +195,96 @@
do {
i++;
token = LT(i);
+ if (token.getType() == ALPHANUMERICWORD) {
- if (token.getType() == ALPHANUMERICWORD) {
- if(!isHeader(token)) {
+ if (!isHeader(token)) {
+ result.append("\n");
containText = true;
- }
+ }
+
break;
}
} while ( token.getType() != EOF);
-
+
+
if (!containText) {
- append("<span></span>");
- append("\n");
+ result.append("\n").append("<span></span>");
+ isHeaderProcessed = true;
}
+ return result.toString();
}
- public boolean isParagraph(Token token) {
- String name = token.getText().toLowerCase();
- return "p".equals(name) ;
- }
- public String healingParagraphMarkup() throws TokenStreamException{
+
+
+ public String checkParagraphMarkup() throws TokenStreamException{
int i = 0;
Token token;
do {
i++;
token = LT(i);
if (token.getType() == ALPHANUMERICWORD) {
- if(isParagraph(token) || isList(token)) {
- return BLANK_LINE;
- } else if(isHeader(token)) {
- return "\n";
- }
-
- break;
+ if(!(isParagraph(token) || isHeader(token) || isList(token))) {
+ return "\n\n";
+ }
+ break ;
}
}while(token.getType() != EOF);
return "";
}
+ public String checkListMarkup() throws TokenStreamException {
+ int i = 0;
+ Token token;
+ do {
+ i++;
+ token = LT(i);
+ if (token.getType() == ALPHANUMERICWORD) {
+ if(!(isParagraph(token) || isHeader(token))) {
+ System.out.println(token);
+ return "\n\n";
+ }
+ break;
+
+ }
+
+ }while(token.getType() != EOF);
+ return "";
+
+ }
+
+ public String checkListItemMarkup() throws TokenStreamException {
+ int i = 0;
+ Token token;
+ do {
+ i++;
+ token = LT(i);
+ if (token.getType() == ALPHANUMERICWORD) {
+ if(isList(token)) {
+ return "";
+ } else if(isListItem(token)) {
+ return "\n";
+ }
+ break;
+ }
+
+ }while(token.getType() != EOF);
+ return "";
+ }
+
public boolean isList(Token token){
String name = token.getText();
return ("ul".equals(name) || "ol".equals(name));
}
+
public boolean isListItem(Token token) {
String name = token.getText().toLowerCase();
return "li".equals(name);
}
+
public String createSeamTextList(Token token, java.util.Stack <Token>
htmlElementStack) throws SemanticException {
String seamText = null;
@@ -249,13 +303,13 @@
return seamText != null ? seamText : "";
}
+
public boolean isPlainHMTLRequired(Token name, java.util.Stack <Token>
htmlElementStack) throws SemanticException {
- boolean required = false;
-
+
if(!isSeamTextElement(name)) {
return true;
}
-
+
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")
@@ -267,6 +321,7 @@
return false;
}
+
public String getSimpleSeamText(Token token) throws
SemanticException,TokenStreamException{
@@ -293,6 +348,7 @@
}
+
public String escapeSeamText(Token token, boolean preformatted) throws
TokenStreamException {
StringBuilder result = new StringBuilder();
@@ -343,11 +399,13 @@
return simpleHtmlSeamTextElements.contains(name);
}
+
public boolean isFormattedHtmlSeamTextElement(Token element) {
String name = element.getText().toLowerCase();
return formattedHtmlSeamTextElements.contains(name);
}
+
public boolean isPreFormattedElement(Token element) {
String name = element.getText().toLowerCase();
return ("pre".equals(name) || "tt".equals(name));
@@ -356,13 +414,34 @@
}
-startRule: (NEWLINE)* (text eof)?
+startRule: (NEWLINE)* (text eof)?
;
+
-text: ((seamCharacters|plain|html|htmlSpecialChars) (NEWLINE)*)+
+text: ((seamCharacters|plain|html|htmlSpecialChars) (NEWLINE
+ {
+ Token token = LT(2);
+// newlines++;
+ if(!isParagraph(token)) {
+ if(isHeaderProcessed) {
+ isHeaderProcessed = false;
+ }
+ }
+
+ }
+
+ )*)+
;
-plain: (word|punctuation|space:SPACE {append(space.getText());})
+plain: (word|punctuation|space:SPACE {append(space.getText());})
+
+ {
+
+ Token token = LT(2);
+ if (isList(token)) {
+// append(BLANK_LINE);
+ }
+ }
;
word: an:ALPHANUMERICWORD { append( an.getText() ); } | uc:UNICODEWORD { append(
uc.getText() ); }
@@ -434,21 +513,19 @@
body: (
- {
- Token token = htmlElementStack.peek();
- boolean isLink = isLink(token);
-
- }
-
+
(
{
beginCapture();
}
- (seamCharacters|plain|htmlSpecialChars
+ (
+ seamCharacters|plain|htmlSpecialChars
+
{
- if(isLink) {
+ Token token = htmlElementStack.peek();
+ if(isLink(token)) {
String message = "unexpected token";
throw new SemanticException(message);
}
@@ -456,12 +533,13 @@
)
{
+
String plain = endCapture();
if(valueCollector == null) {
valueCollector = new StringBuilder();
}
valueCollector.append(plain);
- }
+ }
|html
{
if(valueCollector != null) {
@@ -476,51 +554,48 @@
openTag:
LT name:ALPHANUMERICWORD
{
-
sanitizer.validateHtmlElement(name);
-
+
Token token = null;
if(isPreFormattedElement(name)) {
preformatted = true;
}
-
- if (isFormattedHtmlSeamTextElement(name)) {
- if(!isPlainHMTLRequired(name, htmlElementStack)) {
- if (isListItem(name)) {
- append(createSeamTextList(name, htmlElementStack));
+
+ if(!isPlainHMTLRequired(name, htmlElementStack)) {
+
+ if (isFormattedHtmlSeamTextElement(name)) {
+
+ if(isList(name)) {
+ append(BLANK_LINE);
+ } else if (isListItem(name)) {
+ append(createSeamTextList(name, htmlElementStack));
}else if (isHeader(name)) {
append(createSeamTextHeader(name));
+ }else if(isParagraph(name)) {
+ if(!isHeaderProcessed) {
+ append(BLANK_LINE);
+ }
}
-// if(valueCollector != null) {
-// append(valueCollector.toString().trim());
-// valueCollector = null;
-// }
- } else {
+
+ } else if(isSimpleSeamTextElement(name)) {
if(valueCollector != null) {
- append(valueCollector.toString().trim());
+ append(valueCollector.toString());
valueCollector = null;
- }
- append("<");
- append(name.getText());
- }
-
-
- } else if(isSimpleSeamTextElement(name)){
- if(valueCollector != null) {
- append(valueCollector.toString());
- valueCollector = null;
- }
- append(getSimpleSeamText(name));
+ }
+ append(getSimpleSeamText(name));
+ }
+
} else {
- if(valueCollector != null) {
+
+ if(valueCollector != null) {
append(valueCollector.toString().trim());
valueCollector = null;
- }
- append("<");
- append(name.getText());
+ }
+ append("<");
+ append(name.getText());
}
-
+
htmlElementStack.push(name);
}
@@ -539,11 +614,10 @@
beforeBody: GT {
Token name = htmlElementStack.pop();
- if((isFormattedHtmlSeamTextElement(name) &&
isPlainHMTLRequired(name,htmlElementStack)) || !isSeamTextElement(name)) {
- append(">");
- }
-
- htmlElementStack.push(name);
+ if((isPlainHMTLRequired(name,htmlElementStack))) {
+ append(">");
+ }
+ htmlElementStack.push(name);
}
;
exception
@@ -566,46 +640,43 @@
value = valueCollector.toString();
}
-
- if(isFormattedHtmlSeamTextElement(name)) {
-
- if(isLink(name)){
- append(createSeamTextLink(linkHolder,value.trim()));
- } else if(isParagraph(name)) {
- append(value);
- append(healingParagraphMarkup());
- }else {
- append(value.trim());
- }
-
- if(!isPlainHMTLRequired(name, htmlElementStack)) {
- if(isHeader(name)) {
- append("\n");
- healingHeaderMarkup();
- }
-
- if(isList(name)) {
- append("\n");
- }
-
- if(isListItem(name)){
- append("\n");
- }
- } else {
- append("</");
- append(name.getText());
- append(">");
- }
-
- } else if(isSimpleSeamTextElement(name)) {
- append(value.trim());
- append(getSimpleSeamText(name));
- } else {
+ if(!isPlainHMTLRequired(name, htmlElementStack)) {
+ if(isFormattedHtmlSeamTextElement(name)) {
+ if(isLink(name)){
+ append(createSeamTextLink(linkHolder,value.trim()));
+ } else if(isParagraph(name)) {
+ append(value);
+ if(isHeaderProcessed) {
+ isHeaderProcessed = false;
+ } else {
+ append(checkParagraphMarkup());
+ }
+
+ } else {
+ append(value.trim());
+ }
+
+ if(isList(name)) {
+ append(checkListMarkup());
+ } else if(isListItem(name)) {
+ append(checkListItemMarkup());
+ } else if(isHeader(name)) {
+// append("\n");
+ append(checkHeaderMarkup());
+ isHeaderProcessed = true;
+ }
+
+ } else if(isSimpleSeamTextElement(name)) {
+ append(value.trim());
+ append(getSimpleSeamText(name));
+ }
+ } else {
append(value);
append("</");
append(name.getText());
append(">");
- }
+ }
+
valueCollector = null;
if(isPreFormattedElement(name)) {