Author: abelevich
Date: 2008-11-12 10:37:31 -0500 (Wed, 12 Nov 2008)
New Revision: 11116
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 15:14:21 UTC (rev
11115)
+++ trunk/sandbox/ui/editor/src/main/antlr/html-seamtext.g 2008-11-12 15:37:31 UTC (rev
11116)
@@ -1,6 +1,6 @@
header
{
- package org.richfaces.antlr;
+ package org.richfaces;
}
{
@@ -71,7 +71,9 @@
private final String SEAM_GT = ">";
+ 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,
@@ -291,31 +293,41 @@
}
- public String escapeSeamText(Token token, java.util.Stack <Token>
parentHtmlTokens) throws TokenStreamException {
+ public String escapeSeamText(Token token, boolean preformatted) throws
TokenStreamException {
StringBuilder result = new StringBuilder();
String tokenName = token.getText();
-
- if(parentHtmlTokens != null && !parentHtmlTokens.isEmpty()){
- Token parentToken = parentHtmlTokens.peek();
- String parentTokenName = parentToken.getText().toLowerCase();
-
- if ("tt".equals(parentTokenName) ||
"pre".equals(parentTokenName)) {
-
- if ("<".equals(tokenName)) {
- result.append("<");
- } else if("&".equals(tokenName)) {
- result.append("&");
- } else if (">".equals(tokenName)) {
- result.append(">");
- } else if(""".equals(tokenName)){
- result.append("\"");
- }else if(seamTextSymbols.contains(tokenName)) {
- result.append(tokenName);
- }
- }
- }
- result = result.length() != 0 ? result :
result.append("\\").append(tokenName);
+
+ if(preformatted) {
+ if ("<".equals(tokenName)) {
+ result.append("<");
+ } else if("&".equals(tokenName)) {
+ result.append("&");
+ } else if (">".equals(tokenName)) {
+ result.append(">");
+ } else if(""".equals(tokenName)){
+ result.append("\"");
+ } else if(seamTextSymbols.contains(tokenName)) {
+ result.append(tokenName);
+ }
+
+ } else {
+
+ if ("<".equals(tokenName)) {
+ result.append("\\<");
+ } else if("&".equals(tokenName)) {
+ result.append("&");
+ } else if (">".equals(tokenName)) {
+ result.append("\\>");
+ } else if(""".equals(tokenName)){
+ result.append("\"");
+ } else if("\\".equals(tokenName)){
+ result.append("\\\\");
+ }else if(seamTextSymbols.contains(tokenName)) {
+ result.append("\\").append(tokenName);
+ }
+ }
+
return result.toString();
}
@@ -336,6 +348,11 @@
return formattedHtmlSeamTextElements.contains(name);
}
+ public boolean isPreFormattedElement(Token element) {
+ String name = element.getText().toLowerCase();
+ return ("pre".equals(name) || "tt".equals(name));
+ }
+
}
@@ -353,10 +370,10 @@
htmlSpecialChars:
DOUBLEQUOTE { append("\""); }
- | 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));}
+ | lt:ESCAPED_LT {append(escapeSeamText(lt, preformatted));}
+ | gt:ESCAPED_GT {append(escapeSeamText(gt, preformatted));}
+ | amp:ESCAPED_AMP {append(escapeSeamText(amp, preformatted));}
+ | qout:ESCAPED_QOUT {append(escapeSeamText(qout, preformatted));}
| nbsp:ESCAPED_NBSP {append(nbsp.getText());}
;
@@ -381,32 +398,31 @@
seamCharacters:
- hat:HAT {append(escapeSeamText(hat, htmlElementStack));}
- | hash:HASH {append(escapeSeamText(hash, htmlElementStack));}
- | open:OPEN {append(escapeSeamText(open, htmlElementStack)) ;}
- | close:CLOSE {append(escapeSeamText(close, htmlElementStack));}
- | twiddle:TWIDDLE {append(escapeSeamText(twiddle, htmlElementStack));}
- | bar:BAR {append(escapeSeamText(bar, htmlElementStack));}
- | eq:EQ {append(escapeSeamText(eq, htmlElementStack));}
- | plus:PLUS {append(escapeSeamText(plus, htmlElementStack));}
- | backtick:BACKTICK {append(escapeSeamText(backtick, htmlElementStack));}
- | st:STAR {append(escapeSeamText(st, htmlElementStack));}
- | e:ESCAPE {append(escapeSeamText(e, htmlElementStack));}
- | gt:GT {append(escapeSeamText(gt, htmlElementStack));}
+ hat:HAT {append(escapeSeamText(hat, preformatted));}
+ | hash:HASH {append(escapeSeamText(hash, preformatted));}
+ | open:OPEN {append(escapeSeamText(open, preformatted)) ;}
+ | close:CLOSE {append(escapeSeamText(close, preformatted));}
+ | twiddle:TWIDDLE {append(escapeSeamText(twiddle, preformatted));}
+ | bar:BAR {append(escapeSeamText(bar, preformatted));}
+ | eq:EQ {append(escapeSeamText(eq, preformatted));}
+ | plus:PLUS {append(escapeSeamText(plus, preformatted));}
+ | backtick:BACKTICK {append(escapeSeamText(backtick, preformatted));}
+ | st:STAR {append(escapeSeamText(st, preformatted));}
+ | e:ESCAPE {append(escapeSeamText(e, preformatted));}
+ | gt:GT {append(escapeSeamText(gt, preformatted));}
;
space: s:SPACE {
if(!htmlElementStack.isEmpty()) {
Token token = htmlElementStack.peek();
- if(!isSeamTextElement(token)) {
- append(s.getText());
- }
+ if(!isSeamTextElement(token)) {
+ append(s.getText());
+ }
}
-
- }
+ }
;
-newline: n:NEWLINE {append(n.getText());}
+newline: n:NEWLINE { if (preformatted && valueCollector!=null)
valueCollector.append(n.getText());}
;
newlineOrEof: newline | EOF
@@ -423,39 +439,37 @@
boolean isLink = isLink(token);
}
+
(
- seamCharacters|
-
{
beginCapture();
- }
- plain
+ }
- {
- String plain = endCapture();
+ (seamCharacters|plain|htmlSpecialChars
+ {
+ if(isLink) {
+ String message = "unexpected token";
+ throw new SemanticException(message);
+ }
+ }
+ )
+
+ {
+ String plain = endCapture();
if(valueCollector == null) {
valueCollector = new StringBuilder();
}
valueCollector.append(plain);
- }
-
+ }
|html
- |
- {
- append(valueCollector.toString());
- valueCollector=null;
- }
- htmlSpecialChars
- {
- if(isLink) {
- String message = "unexpected token";
- throw new SemanticException(message);
+ {
+ if(valueCollector != null) {
+ append(valueCollector.toString());
}
-
- }
- |NEWLINE
+ }
+ |newline
)*)
;
@@ -467,6 +481,10 @@
Token token = null;
+ if(isPreFormattedElement(name)) {
+ preformatted = true;
+ }
+
if (isFormattedHtmlSeamTextElement(name)) {
if(!isPlainHMTLRequired(name, htmlElementStack)) {
if (isListItem(name)) {
@@ -474,10 +492,10 @@
}else if (isHeader(name)) {
append(createSeamTextHeader(name));
}
- if(valueCollector != null) {
- append(valueCollector.toString().trim());
- valueCollector = null;
- }
+// if(valueCollector != null) {
+// append(valueCollector.toString().trim());
+// valueCollector = null;
+// }
} else {
if(valueCollector != null) {
append(valueCollector.toString().trim());
@@ -547,7 +565,8 @@
if(valueCollector != null) {
value = valueCollector.toString();
}
-
+
+
if(isFormattedHtmlSeamTextElement(name)) {
if(isLink(name)){
@@ -589,6 +608,9 @@
}
valueCollector = null;
+ if(isPreFormattedElement(name)) {
+ preformatted = false;
+ }
}
;