001: /******************************************************************************
002: * JBoss, a division of Red Hat *
003: * Copyright 2006, Red Hat Middleware, LLC, and individual *
004: * contributors as indicated by the @authors tag. See the *
005: * copyright.txt in the distribution for a full listing of *
006: * individual contributors. *
007: * *
008: * This is free software; you can redistribute it and/or modify it *
009: * under the terms of the GNU Lesser General Public License as *
010: * published by the Free Software Foundation; either version 2.1 of *
011: * the License, or (at your option) any later version. *
012: * *
013: * This software is distributed in the hope that it will be useful, *
014: * but WITHOUT ANY WARRANTY; without even the implied warranty of *
015: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
016: * Lesser General Public License for more details. *
017: * *
018: * You should have received a copy of the GNU Lesser General Public *
019: * License along with this software; if not, write to the Free *
020: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
021: * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
022: ******************************************************************************/package org.jboss.portal.format.render.bbcodehtml;
023:
024: import org.jboss.portal.format.parser.ParseEvent;
025: import org.jboss.portal.format.parser.ParseEventHandler;
026: import org.jboss.portal.format.parser.TextEvent;
027: import org.jboss.portal.format.parser.bbcode.BBCodeParser;
028: import org.jboss.portal.format.parser.html.TagParser;
029: import org.jboss.portal.format.parser.linebreak.LineBreakParser;
030: import org.jboss.portal.format.render.AbstractRenderer;
031:
032: /**
033: * @author <a href="mailto:julien@jboss.org">Julien Viet </a>
034: * @version $Revision: 8784 $
035: */
036: public class ToTextRenderer extends AbstractRenderer {
037:
038: private final String PRECEDE_CODE = " | ";
039:
040: /*
041: * Different parsers.
042: */
043:
044: private final BBCodeParser codeParser = new BBCodeParser();
045:
046: private final TagParser tagParser = new TagParser();
047:
048: private final LineBreakParser lineBreakParser = new LineBreakParser();
049:
050: /** Code depth. */
051: private int isInCode = 0;
052:
053: /** Indentation level. */
054: private int indentLevel = 0;
055:
056: public ToTextRenderer() {
057: codeParser.setHandler(codeHandler);
058: tagParser.setHandler(tagHandler);
059: lineBreakParser.setHandler(lineBreakHandler);
060: }
061:
062: public void render(char[] chars, int offset, int length) {
063: codeParser.parse(chars, offset, length);
064: }
065:
066: private ParseEventHandler codeHandler = new ParseEventHandler() {
067: public void handle(ParseEvent event) {
068: if (event instanceof BBCodeParser.OpenEvent) {
069: BBCodeParser.OpenEvent openEvent = (BBCodeParser.OpenEvent) event;
070: String string = openEvent.getString();
071: switch (openEvent.getType()) {
072: case BBCodeParser.EVENT_BOLD:
073: if (isInCode == 0) {
074: write("*");
075: }
076: break;
077: case BBCodeParser.EVENT_ITALIC:
078: break;
079: case BBCodeParser.EVENT_UNDERLINE:
080: break;
081: case BBCodeParser.EVENT_COLOR:
082: break;
083: case BBCodeParser.EVENT_SIZE:
084: break;
085: case BBCodeParser.EVENT_QUOTE:
086: indentLevel++;
087: write(string != null ? string : "anonymous");
088: write(" wrote : ");
089: break;
090: case BBCodeParser.EVENT_CODE:
091: isInCode++;
092: indentLevel++;
093: int count = indentLevel;
094: while (count-- > 0) {
095: write(PRECEDE_CODE);
096: }
097: break;
098: case BBCodeParser.EVENT_UNORDERED_LIST:
099: indentLevel++;
100: break;
101: case BBCodeParser.EVENT_NUMERICALLY_ORDERED_LIST:
102: indentLevel++;
103: break;
104: case BBCodeParser.EVENT_ALPHABETICALLY_ORDERED_LIST:
105: indentLevel++;
106: break;
107: case BBCodeParser.EVENT_ITEM:
108: write("-> ");
109: break;
110: case BBCodeParser.EVENT_LINK:
111: write("[ " + string);
112: break;
113: }
114: } else if (event instanceof BBCodeParser.CloseEvent) {
115: BBCodeParser.CloseEvent closeEvent = (BBCodeParser.CloseEvent) event;
116: String string = closeEvent.getString();
117: switch (closeEvent.getType()) {
118: case BBCodeParser.EVENT_BOLD:
119: if (isInCode == 0) {
120: write("*");
121: }
122: break;
123: case BBCodeParser.EVENT_ITALIC:
124: break;
125: case BBCodeParser.EVENT_UNDERLINE:
126: break;
127: case BBCodeParser.EVENT_COLOR:
128: break;
129: case BBCodeParser.EVENT_SIZE:
130: break;
131: case BBCodeParser.EVENT_QUOTE:
132: indentLevel--;
133: break;
134: case BBCodeParser.EVENT_CODE:
135: isInCode--;
136: indentLevel--;
137: break;
138: case BBCodeParser.EVENT_UNORDERED_LIST:
139: indentLevel--;
140: break;
141: case BBCodeParser.EVENT_NUMERICALLY_ORDERED_LIST:
142: indentLevel--;
143: break;
144: case BBCodeParser.EVENT_ALPHABETICALLY_ORDERED_LIST:
145: indentLevel--;
146: break;
147: case BBCodeParser.EVENT_ITEM:
148: break;
149: case BBCodeParser.EVENT_LINK:
150: write(" ]");
151: break;
152: }
153: } else {
154: TextEvent textEvent = (TextEvent) event;
155: if (isInCode > 0) {
156: lineBreakParser.parse(textEvent.chars(), textEvent
157: .offset(), textEvent.length());
158: } else {
159: tagParser.parse(textEvent.chars(), textEvent
160: .offset(), textEvent.length());
161: }
162: }
163: }
164: };
165:
166: private ParseEventHandler tagHandler = new ParseEventHandler() {
167: public void handle(ParseEvent event) {
168: if (event instanceof TagParser.OpenEvent) {
169: // TagParser.OpenEvent openEvent = (TagParser.OpenEvent)event;
170: // switch (openEvent.getType())
171: // {
172: // case TagParser.EVENT_TAG:
173: // break;
174: // }
175: } else if (event instanceof TagParser.CloseEvent) {
176: // TagParser.CloseEvent closeEvent = (TagParser.CloseEvent)event;
177: // switch (closeEvent.getType())
178: // {
179: // case TagParser.EVENT_TAG:
180: // break;
181: // }
182: } else {
183: TextEvent textEvent = (TextEvent) event;
184: lineBreakParser.parse(textEvent.chars(), textEvent
185: .offset(), textEvent.length());
186: }
187: }
188: };
189:
190: // private int maxCharWidth = 75;
191:
192: private ParseEventHandler lineBreakHandler = new ParseEventHandler() {
193: public void handle(ParseEvent event) {
194: if (event instanceof TextEvent) {
195: TextEvent textEvent = (TextEvent) event;
196: write(textEvent.chars(), textEvent.offset(), textEvent
197: .length());
198:
199: // this code perform wrapping but is not used now because
200: // it does not work very well
201: // char[] chars = textEvent.chars();
202: // int from = textEvent.offset();
203: // int to = from + textEvent.length();
204: // while (from + maxCharWidth < to)
205: // {
206: // write(chars, from, maxCharWidth);
207: // lineBreak();
208: // from += maxCharWidth;
209: // }
210: // if (from < to)
211: // {
212: // write(chars, from, to - from);
213: // }
214: } else {
215: lineBreak();
216: }
217: }
218:
219: private void lineBreak() {
220: if (indentLevel == 0) {
221: ToTextRenderer.this .write("\n");
222: } else {
223: ToTextRenderer.this .write("\n");
224: int count = indentLevel;
225: while (count-- > 0) {
226: ToTextRenderer.this.write(PRECEDE_CODE);
227: }
228: }
229: }
230: };
231: }
|