001: package org.andromda.maven.site;
002:
003: import org.apache.commons.jelly.XMLOutput;
004: import org.xml.sax.SAXException;
005:
006: import java.util.StringTokenizer;
007:
008: public class HighlightXmlTag extends AbstractHighlightTag {
009: private String elementClass = null;
010: private String attributeClass = null;
011: private String literalClass = null;
012: private String cdataClass = null;
013: private String commentClass = null;
014:
015: protected void highlight(XMLOutput output, String text)
016: throws SAXException {
017: boolean inElement = false;
018: boolean inCdata = false;
019: boolean inComment = false;
020: boolean inString = false;
021: boolean inAttribute = false;
022:
023: boolean wroteOpeningCharacter = false;
024: boolean commentsAwaitClosure = false; // flagged when the '>' needs to be in comment style
025:
026: StringTokenizer tokenizer = new StringTokenizer(text,
027: " \n\r\t\f<>\"\'=", true);
028: while (tokenizer.hasMoreTokens()) {
029: String token = tokenizer.nextToken();
030:
031: if (inCdata) {
032: output.write(token);
033:
034: if (token.indexOf("]]") > -1) {
035: commentsAwaitClosure = true;
036: inCdata = false;
037: }
038: } else if (inComment) {
039: output.write(token);
040:
041: if (token.indexOf("--") > -1) {
042: commentsAwaitClosure = true;
043: inComment = false;
044: }
045: } else if (inString) {
046: output.write(token);
047:
048: if (token.equals("\"") || token.equals("\'")) {
049: endTokenHighlight(output);
050: inString = false;
051: startTokenHighlight(output, getAttributeClass());
052: }
053: } else if (inAttribute) {
054: if (token.equals("\"") || token.equals("\'")) {
055: endTokenHighlight(output);
056: startTokenHighlight(output, getLiteralClass());
057: output.write(token);
058: inString = true;
059: } else if (token.equals(">")) {
060:
061: endTokenHighlight(output);
062: output.write(token);
063: inElement = false;
064: inAttribute = false;
065: } else {
066: output.write(token);
067: }
068: } else if (inElement) {
069: if (inAttribute == false
070: && (token.equals(" ") || token.equals("\t")
071: || token.equals("\f")
072: || token.equals("\n") || token
073: .equals("\r"))) {
074: endTokenHighlight(output);
075: startTokenHighlight(output, getAttributeClass());
076: output.write(token);
077: inAttribute = true;
078: } else if (token.equals(">")) {
079: endTokenHighlight(output);
080: output.write(token);
081: inElement = false;
082: } else if (token.startsWith("![CDATA[")) {
083: inCdata = true;
084: inElement = false;
085: startTokenHighlight(output, getCdataClass());
086: output.write("<");
087: output.write(token);
088: } else if (token.startsWith("!--")) {
089: inComment = true;
090: inElement = false;
091: startTokenHighlight(output, getCommentClass());
092: output.write("<");
093: output.write(token);
094: } else {
095: if (wroteOpeningCharacter == false) {
096: output.write("<");
097: wroteOpeningCharacter = true;
098: }
099: startTokenHighlight(output, getElementClass());
100: output.write(token);
101: }
102: } else {
103: if (token.equals("<")) {
104: inElement = true;
105: wroteOpeningCharacter = false;
106: } else if (token.equals(">")) {
107: output.write(token);
108: if (commentsAwaitClosure) {
109: commentsAwaitClosure = false;
110: endTokenHighlight(output);
111: }
112: } else {
113: output.write(token);
114: }
115: }
116: }
117: }
118:
119: public String getCommentClass() {
120: return commentClass;
121: }
122:
123: public void setCommentClass(String commentClass) {
124: this .commentClass = commentClass;
125: }
126:
127: public String getCdataClass() {
128: return cdataClass;
129: }
130:
131: public void setCdataClass(String cdataClass) {
132: this .cdataClass = cdataClass;
133: }
134:
135: public String getLiteralClass() {
136: return literalClass;
137: }
138:
139: public void setLiteralClass(String literalClass) {
140: this .literalClass = literalClass;
141: }
142:
143: public String getAttributeClass() {
144: return attributeClass;
145: }
146:
147: public void setAttributeClass(String attributeClass) {
148: this .attributeClass = attributeClass;
149: }
150:
151: public String getElementClass() {
152: return elementClass;
153: }
154:
155: public void setElementClass(String elementClass) {
156: this.elementClass = elementClass;
157: }
158:
159: }
|