[jboss-svn-commits] JBL Code SVN: r16780 - in labs/jbossforums/branches/forums101P26: forums/src/main/org/jboss/portlet/forums and 24 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sat Nov 24 17:47:34 EST 2007
Author: unibrew
Date: 2007-11-24 17:47:34 -0500 (Sat, 24 Nov 2007)
New Revision: 16780
Added:
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/AbstractParser.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/ParseEvent.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/ParseEventHandler.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/ParseEventNotifier.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/TextEvent.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/Token.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/bbcode/
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/bbcode/Analyzer.flex
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/bbcode/Analyzer.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/bbcode/BBCodeParser.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/chars/
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/chars/Chars.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/chars/MutableChars.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/entity/
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/entity/CharacterEntityReferenceEvent.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/entity/HTML4_0CharacterEntityReferenceParser.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/entity/XML1_0CharacterEntityReferenceParser.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/html/
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/html/Analyzer.flex
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/html/Analyzer.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/html/TagParser.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/linebreak/
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/linebreak/LineBreakParser.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/render/
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/render/AbstractRenderer.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/render/bbcodehtml/
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/render/bbcodehtml/ToHTMLConfig.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/render/bbcodehtml/ToHTMLRenderer.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/ASCII_CharStream.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/AbstractContext.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/BuildException.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/ChildrenStrategy.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/Context.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/DelegateContext.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/ParseException.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/Template.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateAnalyzer.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateAnalyzer.jj
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateAnalyzerConstants.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateAnalyzerTokenManager.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateBuilder.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateLoader.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateParser.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateRepository.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/Token.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TokenMgrError.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/util/
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/util/CLLoader.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/util/EntityTable.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/util/Loader.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/util/Stack.java
labs/jbossforums/branches/forums101P26/thirdparty/dom4j/
labs/jbossforums/branches/forums101P26/thirdparty/dom4j/component-info.xml
labs/jbossforums/branches/forums101P26/thirdparty/dom4j/lib/
labs/jbossforums/branches/forums101P26/thirdparty/dom4j/lib/dom4j.jar
labs/jbossforums/branches/forums101P26/thirdparty/javassist/
labs/jbossforums/branches/forums101P26/thirdparty/javassist/component-info.xml
labs/jbossforums/branches/forums101P26/thirdparty/javassist/lib/
labs/jbossforums/branches/forums101P26/thirdparty/javassist/lib/javassist.jar
labs/jbossforums/branches/forums101P26/thirdparty/jflex/
labs/jbossforums/branches/forums101P26/thirdparty/jflex/component-info.xml
labs/jbossforums/branches/forums101P26/thirdparty/jflex/lib/
labs/jbossforums/branches/forums101P26/thirdparty/jflex/lib/jflex.jar
labs/jbossforums/branches/forums101P26/thirdparty/sun-javacc/
labs/jbossforums/branches/forums101P26/thirdparty/sun-javacc/component-info.xml
labs/jbossforums/branches/forums101P26/thirdparty/sun-javacc/lib/
labs/jbossforums/branches/forums101P26/thirdparty/sun-javacc/lib/JavaCC.zip
Modified:
labs/jbossforums/branches/forums101P26/forums/build.xml
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/ui/Constants.java
labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/ui/action/AdminController.java
labs/jbossforums/branches/forums101P26/forums/src/resources/portal-forums-war/views/admin/index.xhtml
labs/jbossforums/branches/forums101P26/tools/etc/buildfragments/libraries.ent
Log:
[JBFORUMS-267] I've copied bbcode/html parsers from JBoss Portal codebase to Forums.
Modified: labs/jbossforums/branches/forums101P26/forums/build.xml
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/build.xml 2007-11-24 13:29:44 UTC (rev 16779)
+++ labs/jbossforums/branches/forums101P26/forums/build.xml 2007-11-24 22:47:34 UTC (rev 16780)
@@ -82,6 +82,9 @@
<path refid="jbportal.classpath"/>
<path refid="facelets.classpath"/>
<path refid="rome.classpath"/>
+ <path refid="jflex.jflex.classpath" />
+ <path refid="jboss.javassist.classpath" />
+ <path refid="dom4j.dom4j.classpath" />
</path>
<!-- Configure modules -->
@@ -115,7 +118,31 @@
</target>
+ <target name="configure-jflex">
+ <taskdef name="jflex"
+ classname="JFlex.anttask.JFlexTask"
+ classpathref="jflex.jflex.classpath"/>
+ </target>
+
+ <target name="generate-parsers" depends="init">
+ <mkdir dir="${build.gen.classes}/org/jboss/portlet/forums/format/template"/>
+ <javacc
+ buildparser="true"
+ buildtokenmanager="true"
+ target="${source.java}/org/jboss/portlet/forums/format/template/TemplateAnalyzer.jj"
+ outputdirectory="${source.java}/org/jboss/portlet/forums/format/template"
+ javacchome="${sun.javacc.lib}"/>
+ <jflex
+ file="${source.java}/org/jboss/portlet/forums/format/parser/bbcode/Analyzer.flex"
+ destdir="${source.java}">
+ </jflex>
+ <jflex
+ file="${source.java}/org/jboss/portlet/forums/format/parser/html/Analyzer.flex"
+ destdir="${source.java}">
+ </jflex>
+ </target>
+
<!--+====================================================================+-->
<!--| Compile |-->
<!--| |-->
@@ -124,7 +151,7 @@
<!--| documentation compiles. |-->
<!--+====================================================================+-->
- <target name="compile" description="Compile all source files." depends="generate-classes,
+ <target name="compile" description="Compile all source files." depends="generate-classes,generate-parsers,
_default:compile-classes,
_default:compile-etc,
_default:compile-resources">
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/AbstractParser.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/AbstractParser.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/AbstractParser.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,47 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.parser;
+
+
+/**
+ * This is an abstract parser. All the parsed events will go though the event notifier interface.
+ *
+ * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
+ * @version $Revision: 5448 $
+ */
+public abstract class AbstractParser implements ParseEventNotifier
+{
+
+ /** The event handler. */
+ protected ParseEventHandler handler;
+
+ /** Set the event handler on this parser. */
+ public void setHandler(ParseEventHandler handler)
+ {
+ this.handler = handler;
+ }
+
+ /** Ask the parser to its job. */
+ public abstract void parse(char[] chars, int offset, int length);
+
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/AbstractParser.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/ParseEvent.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/ParseEvent.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/ParseEvent.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,28 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.parser;
+
+/** An event that is emmited by ParseEventNotifier implementations. */
+public interface ParseEvent
+{
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/ParseEvent.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/ParseEventHandler.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/ParseEventHandler.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/ParseEventHandler.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,30 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.parser;
+
+
+/** Implementors want to receive events produced by a parser. */
+public interface ParseEventHandler
+{
+ void handle(ParseEvent event);
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/ParseEventHandler.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/ParseEventNotifier.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/ParseEventNotifier.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/ParseEventNotifier.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,30 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.parser;
+
+
+/** Implemented by any class that wants to generate parsing events. */
+public interface ParseEventNotifier
+{
+ void setHandler(ParseEventHandler handler);
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/ParseEventNotifier.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/TextEvent.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/TextEvent.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/TextEvent.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,60 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.parser;
+
+
+/** An event implementation that says there is some text to handle. */
+public class TextEvent implements ParseEvent
+{
+
+ protected char[] chars = null;
+ protected int offset = -1;
+ protected int length = -1;
+
+ public void setText(char[] chars, int offset, int length)
+ {
+ this.chars = chars;
+ this.offset = offset;
+ this.length = length;
+ }
+
+ public char[] chars()
+ {
+ return chars;
+ }
+
+ public int offset()
+ {
+ return offset;
+ }
+
+ public int length()
+ {
+ return length;
+ }
+
+ public String toString()
+ {
+ return "text:" + new String(chars, offset, length);
+ }
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/TextEvent.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/Token.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/Token.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/Token.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,38 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.parser;
+
+/**
+ * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
+ * @version $Revision: 5448 $
+ */
+public class Token
+{
+ public int type = -1;
+ public String value = null;
+
+ public String toString()
+ {
+ return type + " " + value;
+ }
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/Token.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/bbcode/Analyzer.flex
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/bbcode/Analyzer.flex (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/bbcode/Analyzer.flex 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,111 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.portlet.forums.format.parser.bbcode;
+
+import java.io.CharArrayReader;
+import org.jboss.portlet.forums.format.parser.Token;;
+
+%%
+
+%unicode
+%public
+%class Analyzer
+%type Token
+
+%{
+
+public static final int OPEN_B = 0;
+public static final int CLOSE_B = 1;
+public static final int OPEN_I = 2;
+public static final int CLOSE_I = 3;
+public static final int OPEN_U = 4;
+public static final int CLOSE_U = 5;
+public static final int OPEN_COLOR = 6;
+public static final int CLOSE_COLOR = 7;
+public static final int OPEN_SIZE = 8;
+public static final int CLOSE_SIZE = 9;
+public static final int OPEN_QUOTE_ANONYMOUS = 10;
+public static final int OPEN_QUOTE = 11;
+public static final int CLOSE_QUOTE = 12;
+public static final int OPEN_CODE = 13;
+public static final int CLOSE_CODE = 14;
+public static final int OPEN_LIST_UNORDERED = 15;
+public static final int OPEN_LIST_ORDERED_NUMERICAL = 16;
+public static final int OPEN_LIST_ORDERED_ALPHABETICAL = 17;
+public static final int CLOSE_LIST = 18;
+public static final int LIST_ITEM = 19;
+public static final int LINK = 20;
+public static final int TEXT = 21;
+
+private static final int FROM_1 = "[url".length();
+private static final int FROM_2 = "[url=".length();
+private static final int DELTA = "[/url]".length();
+
+public void reset(char[] chars, int off, int len)
+{
+ yyreset(new CharArrayReader(chars, off, len));
+}
+
+public Token next()
+{
+ try { return yylex(); }
+ catch(java.io.IOException e) { e.printStackTrace(); return null; }
+}
+
+private Token token = new Token();
+
+private Token token(int type, String value)
+{
+ token.type = type;
+ token.value = value;
+ return token;
+}
+
+%}
+
+%%
+
+<YYINITIAL>
+{
+ "[b]" { return token(OPEN_B, null); }
+ "[/b]" { return token(CLOSE_B, null); }
+ "[i]" { return token(OPEN_I, null); }
+ "[/i]" { return token(CLOSE_I, null); }
+ "[u]" { return token(OPEN_U, null); }
+ "[/u]" { return token(CLOSE_U, null); }
+ "[color="(([A-Za-z]+)|("#"[0-9A-Fa-f]{6}))"]" { return token(OPEN_COLOR, yytext().substring(7, yytext().length() - 1)); }
+ "[/color]" { return token(CLOSE_COLOR, null); }
+ "[size="[0-9]{1,2}"]" { return token(OPEN_SIZE, yytext().substring(6, yytext().length() - 1)); }
+ "[/size]" { return token(CLOSE_SIZE, null); }
+ "[quote]" { return token(OPEN_QUOTE_ANONYMOUS, null); }
+ "[quote="~["]"] { return token(OPEN_QUOTE, yytext().substring(7, yytext().length() - 1)); }
+ "[/quote]" { return token(CLOSE_QUOTE, null); }
+ "[code]" { return token(OPEN_CODE, null); }
+ "[/code]" { return token(CLOSE_CODE, null); }
+ "[list]" { return token(OPEN_LIST_UNORDERED, null); }
+ "[list=1]" { return token(OPEN_LIST_ORDERED_NUMERICAL, null); }
+ "[list=a]" { return token(OPEN_LIST_ORDERED_ALPHABETICAL, null); }
+ "[/list]" { return token(CLOSE_LIST, null); }
+ "[*]" { return token(LIST_ITEM, null); }
+ "[url"~["]"]~["["]"/url]" { return token(LINK, yytext().substring(4, yytext().length() - 6)); }
+ .|\n { return token(TEXT, yytext()); }
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/bbcode/Analyzer.flex
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/bbcode/Analyzer.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/bbcode/Analyzer.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/bbcode/Analyzer.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,722 @@
+/* The following code was generated by JFlex 1.4.1 on 24.11.07 23:16 */
+
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.portlet.forums.format.parser.bbcode;
+
+import java.io.CharArrayReader;
+import org.jboss.portlet.forums.format.parser.Token;;
+
+
+/**
+ * This class is a scanner generated by
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1
+ * on 24.11.07 23:16 from the specification file
+ * <tt>/Users/rysiek/Work/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/bbcode/Analyzer.flex</tt>
+ */
+public class Analyzer {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** initial size of the lookahead buffer */
+ private static final int ZZ_BUFFERSIZE = 16384;
+
+ /** lexical states */
+ public static final int YYINITIAL = 0;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\12\0\1\0\30\0\1\15\6\0\1\30\4\0\1\4\1\16\1\26"+
+ "\10\16\3\0\1\13\3\0\6\17\24\14\1\1\1\0\1\3\3\0"+
+ "\1\27\1\2\1\7\1\25\1\22\1\17\2\14\1\5\2\14\1\11"+
+ "\2\14\1\10\1\14\1\23\1\12\1\20\1\24\1\6\4\14\1\21"+
+ "\uff85\0";
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+ /**
+ * Translates DFA states to action switch labels.
+ */
+ private static final int [] ZZ_ACTION = zzUnpackAction();
+
+ private static final String ZZ_ACTION_PACKED_0 =
+ "\1\0\2\1\11\0\1\2\7\0\1\3\1\4\5\0"+
+ "\1\5\1\6\1\7\1\10\34\0\1\11\1\12\4\0"+
+ "\1\13\1\14\1\15\6\0\1\16\1\0\1\17\1\20"+
+ "\3\0\1\21\1\22\1\23\1\0\1\24\1\0\1\25"+
+ "\3\0\1\26\4\0";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[96];
+ int offset = 0;
+ offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+ return result;
+ }
+
+ private static int zzUnpackAction(String packed, int offset, int [] result) {
+ int i = 0; /* index in packed string */
+ int j = offset; /* index in unpacked array */
+ int l = packed.length();
+ while (i < l) {
+ int count = packed.charAt(i++);
+ int value = packed.charAt(i++);
+ do result[j++] = value; while (--count > 0);
+ }
+ return j;
+ }
+
+
+ /**
+ * Translates a state to a row index in the transition table
+ */
+ private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+ private static final String ZZ_ROWMAP_PACKED_0 =
+ "\0\0\0\31\0\62\0\113\0\144\0\175\0\226\0\257"+
+ "\0\310\0\341\0\372\0\u0113\0\31\0\u012c\0\u0145\0\u015e"+
+ "\0\u0177\0\u0190\0\u01a9\0\u01c2\0\31\0\31\0\u01db\0\u01f4"+
+ "\0\u020d\0\u0226\0\u023f\0\31\0\31\0\31\0\31\0\u0258"+
+ "\0\u0271\0\u028a\0\u02a3\0\u02bc\0\u02d5\0\u02ee\0\u0307\0\u0320"+
+ "\0\u0339\0\u0352\0\u036b\0\u0384\0\u039d\0\u03b6\0\u03cf\0\u03e8"+
+ "\0\u0401\0\u041a\0\u0433\0\u044c\0\u0465\0\u047e\0\u0497\0\u04b0"+
+ "\0\u04c9\0\u04e2\0\u04fb\0\31\0\31\0\u0514\0\u052d\0\u0546"+
+ "\0\u055f\0\31\0\31\0\31\0\u0578\0\u0591\0\u05aa\0\u05c3"+
+ "\0\u05dc\0\u05f5\0\31\0\u060e\0\31\0\31\0\u0627\0\u0640"+
+ "\0\u0659\0\31\0\31\0\31\0\u0672\0\31\0\u068b\0\31"+
+ "\0\u06a4\0\u06bd\0\u06d6\0\31\0\u06ef\0\u0708\0\u0721\0\u073a";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[96];
+ int offset = 0;
+ offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+ return result;
+ }
+
+ private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+ int i = 0; /* index in packed string */
+ int j = offset; /* index in unpacked array */
+ int l = packed.length();
+ while (i < l) {
+ int high = packed.charAt(i++) << 16;
+ result[j++] = high | packed.charAt(i++);
+ }
+ return j;
+ }
+
+ /**
+ * The transition table of the DFA
+ */
+ private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+ private static final String ZZ_TRANS_PACKED_0 =
+ "\1\2\1\3\27\2\33\0\1\4\1\0\1\5\1\6"+
+ "\1\7\1\10\1\0\1\11\6\0\1\12\2\0\1\13"+
+ "\4\0\1\14\3\0\1\15\27\0\1\16\2\0\1\17"+
+ "\1\20\1\21\1\0\1\22\6\0\1\23\2\0\1\24"+
+ "\10\0\1\25\30\0\1\26\6\0\1\27\26\0\1\30"+
+ "\25\0\1\31\30\0\1\32\31\0\1\33\25\0\1\34"+
+ "\30\0\1\35\30\0\1\36\30\0\1\37\35\0\1\40"+
+ "\25\0\1\41\30\0\1\42\31\0\1\43\33\0\1\44"+
+ "\30\0\1\45\13\0\1\46\23\0\1\47\31\0\1\50"+
+ "\17\0\1\51\31\0\1\52\13\0\1\53\23\0\1\54"+
+ "\31\0\1\55\17\0\1\56\20\0\3\44\1\57\25\44"+
+ "\10\0\1\60\42\0\1\61\32\0\1\62\26\0\1\63"+
+ "\32\0\1\64\14\0\1\65\42\0\1\66\32\0\1\67"+
+ "\26\0\1\70\32\0\1\71\4\0\1\57\1\72\27\57"+
+ "\12\0\1\73\21\0\1\74\30\0\1\75\7\0\1\76"+
+ "\30\0\1\77\37\0\1\100\20\0\1\101\21\0\1\102"+
+ "\30\0\1\103\30\0\1\104\47\0\1\105\12\0\1\106"+
+ "\37\0\1\107\43\0\1\110\1\111\17\0\1\112\7\0"+
+ "\1\112\5\0\1\113\7\0\1\114\20\0\1\115\30\0"+
+ "\1\116\33\0\1\117\24\0\1\120\2\0\6\120\1\0"+
+ "\1\120\1\121\1\0\7\120\1\0\1\120\4\0\1\122"+
+ "\30\0\1\123\30\0\1\124\12\0\1\125\7\0\1\125"+
+ "\2\0\3\114\1\126\25\114\12\0\1\127\20\0\1\120"+
+ "\1\130\1\0\6\120\1\0\1\120\2\0\7\120\1\0"+
+ "\1\120\3\0\1\131\4\0\1\131\6\0\2\131\2\0"+
+ "\1\131\2\0\3\131\4\0\1\124\36\0\1\132\21\0"+
+ "\1\133\4\0\1\133\6\0\2\133\2\0\1\133\2\0"+
+ "\3\133\4\0\1\134\27\0\1\135\4\0\1\135\6\0"+
+ "\2\135\2\0\1\135\2\0\3\135\3\0\1\136\4\0"+
+ "\1\136\6\0\2\136\2\0\1\136\2\0\3\136\3\0"+
+ "\1\137\4\0\1\137\6\0\2\137\2\0\1\137\2\0"+
+ "\3\137\3\0\1\140\4\0\1\140\6\0\2\140\2\0"+
+ "\1\140\2\0\3\140\4\0\1\130\25\0";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[1875];
+ int offset = 0;
+ offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+ return result;
+ }
+
+ private static int zzUnpackTrans(String packed, int offset, int [] result) {
+ int i = 0; /* index in packed string */
+ int j = offset; /* index in unpacked array */
+ int l = packed.length();
+ while (i < l) {
+ int count = packed.charAt(i++);
+ int value = packed.charAt(i++);
+ value--;
+ do result[j++] = value; while (--count > 0);
+ }
+ return j;
+ }
+
+
+ /* error codes */
+ private static final int ZZ_UNKNOWN_ERROR = 0;
+ private static final int ZZ_NO_MATCH = 1;
+ private static final int ZZ_PUSHBACK_2BIG = 2;
+
+ /* error messages for the codes above */
+ private static final String ZZ_ERROR_MSG[] = {
+ "Unkown internal scanner error",
+ "Error: could not match input",
+ "Error: pushback value was too large"
+ };
+
+ /**
+ * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+ */
+ private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+ private static final String ZZ_ATTRIBUTE_PACKED_0 =
+ "\1\0\1\11\1\1\11\0\1\11\7\0\2\11\5\0"+
+ "\4\11\34\0\2\11\4\0\3\11\6\0\1\11\1\0"+
+ "\2\11\3\0\3\11\1\0\1\11\1\0\1\11\3\0"+
+ "\1\11\4\0";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[96];
+ int offset = 0;
+ offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+ return result;
+ }
+
+ private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+ int i = 0; /* index in packed string */
+ int j = offset; /* index in unpacked array */
+ int l = packed.length();
+ while (i < l) {
+ int count = packed.charAt(i++);
+ int value = packed.charAt(i++);
+ do result[j++] = value; while (--count > 0);
+ }
+ return j;
+ }
+
+ /** the input device */
+ private java.io.Reader zzReader;
+
+ /** the current state of the DFA */
+ private int zzState;
+
+ /** the current lexical state */
+ private int zzLexicalState = YYINITIAL;
+
+ /** this buffer contains the current text to be matched and is
+ the source of the yytext() string */
+ private char zzBuffer[] = new char[ZZ_BUFFERSIZE];
+
+ /** the textposition at the last accepting state */
+ private int zzMarkedPos;
+
+ /** the textposition at the last state to be included in yytext */
+ private int zzPushbackPos;
+
+ /** the current text position in the buffer */
+ private int zzCurrentPos;
+
+ /** startRead marks the beginning of the yytext() string in the buffer */
+ private int zzStartRead;
+
+ /** endRead marks the last character in the buffer, that has been read
+ from input */
+ private int zzEndRead;
+
+ /** number of newlines encountered up to the start of the matched text */
+ private int yyline;
+
+ /** the number of characters up to the start of the matched text */
+ private int yychar;
+
+ /**
+ * the number of characters from the last newline up to the start of the
+ * matched text
+ */
+ private int yycolumn;
+
+ /**
+ * zzAtBOL == true <=> the scanner is currently at the beginning of a line
+ */
+ private boolean zzAtBOL = true;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+public static final int OPEN_B = 0;
+public static final int CLOSE_B = 1;
+public static final int OPEN_I = 2;
+public static final int CLOSE_I = 3;
+public static final int OPEN_U = 4;
+public static final int CLOSE_U = 5;
+public static final int OPEN_COLOR = 6;
+public static final int CLOSE_COLOR = 7;
+public static final int OPEN_SIZE = 8;
+public static final int CLOSE_SIZE = 9;
+public static final int OPEN_QUOTE_ANONYMOUS = 10;
+public static final int OPEN_QUOTE = 11;
+public static final int CLOSE_QUOTE = 12;
+public static final int OPEN_CODE = 13;
+public static final int CLOSE_CODE = 14;
+public static final int OPEN_LIST_UNORDERED = 15;
+public static final int OPEN_LIST_ORDERED_NUMERICAL = 16;
+public static final int OPEN_LIST_ORDERED_ALPHABETICAL = 17;
+public static final int CLOSE_LIST = 18;
+public static final int LIST_ITEM = 19;
+public static final int LINK = 20;
+public static final int TEXT = 21;
+
+private static final int FROM_1 = "[url".length();
+private static final int FROM_2 = "[url=".length();
+private static final int DELTA = "[/url]".length();
+
+public void reset(char[] chars, int off, int len)
+{
+ yyreset(new CharArrayReader(chars, off, len));
+}
+
+public Token next()
+{
+ try { return yylex(); }
+ catch(java.io.IOException e) { e.printStackTrace(); return null; }
+}
+
+private Token token = new Token();
+
+private Token token(int type, String value)
+{
+ token.type = type;
+ token.value = value;
+ return token;
+}
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public Analyzer(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public Analyzer(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * Unpacks the compressed character translation table.
+ *
+ * @param packed the packed character translation table
+ * @return the unpacked character translation table
+ */
+ private static char [] zzUnpackCMap(String packed) {
+ char [] map = new char[0x10000];
+ int i = 0; /* index in packed string */
+ int j = 0; /* index in unpacked array */
+ while (i < 82) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>false</code>, iff there was new input.
+ *
+ * @exception java.io.IOException if any I/O-Error occurs
+ */
+ private boolean zzRefill() throws java.io.IOException {
+
+ /* first: make room (if you can) */
+ if (zzStartRead > 0) {
+ System.arraycopy(zzBuffer, zzStartRead,
+ zzBuffer, 0,
+ zzEndRead-zzStartRead);
+
+ /* translate stored positions */
+ zzEndRead-= zzStartRead;
+ zzCurrentPos-= zzStartRead;
+ zzMarkedPos-= zzStartRead;
+ zzPushbackPos-= zzStartRead;
+ zzStartRead = 0;
+ }
+
+ /* is the buffer big enough? */
+ if (zzCurrentPos >= zzBuffer.length) {
+ /* if not: blow it up */
+ char newBuffer[] = new char[zzCurrentPos*2];
+ System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length);
+ zzBuffer = newBuffer;
+ }
+
+ /* finally: fill the buffer with new input */
+ int numRead = zzReader.read(zzBuffer, zzEndRead,
+ zzBuffer.length-zzEndRead);
+
+ if (numRead < 0) {
+ return true;
+ }
+ else {
+ zzEndRead+= numRead;
+ return false;
+ }
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Resets the scanner to read from a new input stream.
+ * Does not close the old reader.
+ *
+ * All internal variables are reset, the old input stream
+ * <b>cannot</b> be reused (internal buffer is discarded and lost).
+ * Lexical state is set to <tt>ZZ_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ zzEndRead = zzStartRead = 0;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = 0;
+ yyline = yychar = yycolumn = 0;
+ zzLexicalState = YYINITIAL;
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public final String yytext() {
+ return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+ }
+
+
+ /**
+ * Returns the character at position <tt>pos</tt> from the
+ * matched text.
+ *
+ * It is equivalent to yytext().charAt(pos), but faster
+ *
+ * @param pos the position of the character to fetch.
+ * A value from 0 to yylength()-1.
+ *
+ * @return the character at position pos
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public final int yylength() {
+ return zzMarkedPos-zzStartRead;
+ }
+
+
+ /**
+ * Reports an error that occured while scanning.
+ *
+ * In a wellformed scanner (no or only correct usage of
+ * yypushback(int) and a match-all fallback rule) this method
+ * will only be called with things that "Can't Possibly Happen".
+ * If this method is called, something is seriously wrong
+ * (e.g. a JFlex bug producing a faulty scanner etc.).
+ *
+ * Usual syntax/scanner level error handling should be done
+ * in error fallback rules.
+ *
+ * @param errorCode the code of the errormessage to display
+ */
+ private void zzScanError(int errorCode) {
+ String message;
+ try {
+ message = ZZ_ERROR_MSG[errorCode];
+ }
+ catch (ArrayIndexOutOfBoundsException e) {
+ message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+ }
+
+ throw new Error(message);
+ }
+
+
+ /**
+ * Pushes the specified amount of characters back into the input stream.
+ *
+ * They will be read again by then next call of the scanning method
+ *
+ * @param number the number of characters to be read again.
+ * This number must not be greater than yylength()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * Resumes scanning until the next regular expression is matched,
+ * the end of input is encountered or an I/O-Error occurs.
+ *
+ * @return the next token
+ * @exception java.io.IOException if any I/O-Error occurs
+ */
+ public Token yylex() throws java.io.IOException {
+ int zzInput;
+ int zzAction;
+
+ // cached fields:
+ int zzCurrentPosL;
+ int zzMarkedPosL;
+ int zzEndReadL = zzEndRead;
+ char [] zzBufferL = zzBuffer;
+ char [] zzCMapL = ZZ_CMAP;
+
+ int [] zzTransL = ZZ_TRANS;
+ int [] zzRowMapL = ZZ_ROWMAP;
+ int [] zzAttrL = ZZ_ATTRIBUTE;
+
+ while (true) {
+ zzMarkedPosL = zzMarkedPos;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ zzForAction: {
+ while (true) {
+
+ if (zzCurrentPosL < zzEndReadL)
+ zzInput = zzBufferL[zzCurrentPosL++];
+ else if (zzAtEOF) {
+ zzInput = YYEOF;
+ break zzForAction;
+ }
+ else {
+ // store back cached positions
+ zzCurrentPos = zzCurrentPosL;
+ zzMarkedPos = zzMarkedPosL;
+ boolean eof = zzRefill();
+ // get translated positions and possibly new buffer
+ zzCurrentPosL = zzCurrentPos;
+ zzMarkedPosL = zzMarkedPos;
+ zzBufferL = zzBuffer;
+ zzEndReadL = zzEndRead;
+ if (eof) {
+ zzInput = YYEOF;
+ break zzForAction;
+ }
+ else {
+ zzInput = zzBufferL[zzCurrentPosL++];
+ }
+ }
+ int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+ if (zzNext == -1) break zzForAction;
+ zzState = zzNext;
+
+ int zzAttributes = zzAttrL[zzState];
+ if ( (zzAttributes & 1) == 1 ) {
+ zzAction = zzState;
+ zzMarkedPosL = zzCurrentPosL;
+ if ( (zzAttributes & 8) == 8 ) break zzForAction;
+ }
+
+ }
+ }
+
+ // store back cached position
+ zzMarkedPos = zzMarkedPosL;
+
+ switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+ case 1:
+ { return token(TEXT, yytext());
+ }
+ case 23: break;
+ case 16:
+ { return token(CLOSE_QUOTE, null);
+ }
+ case 24: break;
+ case 10:
+ { return token(OPEN_LIST_UNORDERED, null);
+ }
+ case 25: break;
+ case 18:
+ { return token(OPEN_LIST_ORDERED_ALPHABETICAL, null);
+ }
+ case 26: break;
+ case 11:
+ { return token(CLOSE_CODE, null);
+ }
+ case 27: break;
+ case 4:
+ { return token(OPEN_U, null);
+ }
+ case 28: break;
+ case 7:
+ { return token(CLOSE_I, null);
+ }
+ case 29: break;
+ case 14:
+ { return token(OPEN_QUOTE_ANONYMOUS, null);
+ }
+ case 30: break;
+ case 12:
+ { return token(CLOSE_LIST, null);
+ }
+ case 31: break;
+ case 3:
+ { return token(OPEN_I, null);
+ }
+ case 32: break;
+ case 20:
+ { return token(OPEN_QUOTE, yytext().substring(7, yytext().length() - 1));
+ }
+ case 33: break;
+ case 19:
+ { return token(OPEN_SIZE, yytext().substring(6, yytext().length() - 1));
+ }
+ case 34: break;
+ case 2:
+ { return token(OPEN_B, null);
+ }
+ case 35: break;
+ case 21:
+ { return token(OPEN_COLOR, yytext().substring(7, yytext().length() - 1));
+ }
+ case 36: break;
+ case 8:
+ { return token(CLOSE_U, null);
+ }
+ case 37: break;
+ case 22:
+ { return token(LINK, yytext().substring(4, yytext().length() - 6));
+ }
+ case 38: break;
+ case 15:
+ { return token(CLOSE_COLOR, null);
+ }
+ case 39: break;
+ case 13:
+ { return token(CLOSE_SIZE, null);
+ }
+ case 40: break;
+ case 17:
+ { return token(OPEN_LIST_ORDERED_NUMERICAL, null);
+ }
+ case 41: break;
+ case 5:
+ { return token(LIST_ITEM, null);
+ }
+ case 42: break;
+ case 9:
+ { return token(OPEN_CODE, null);
+ }
+ case 43: break;
+ case 6:
+ { return token(CLOSE_B, null);
+ }
+ case 44: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ return null;
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/bbcode/BBCodeParser.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/bbcode/BBCodeParser.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/bbcode/BBCodeParser.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,325 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.parser.bbcode;
+
+import org.jboss.portlet.forums.format.parser.AbstractParser;
+import org.jboss.portlet.forums.format.parser.ParseEvent;
+import org.jboss.portlet.forums.format.parser.TextEvent;
+import org.jboss.portlet.forums.format.parser.Token;
+import org.jboss.portlet.forums.format.parser.chars.MutableChars;
+import org.jboss.portlet.forums.format.util.Stack;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.util.Iterator;
+
+/**
+ * This nasty class parse BB code and create events.
+ *
+ * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
+ * @version $Revision: 5448 $
+ */
+public class BBCodeParser
+ extends AbstractParser
+{
+
+ // Public constants
+
+ public static final int EVENT_NORMAL = 0;
+ public static final int EVENT_BOLD = 1;
+ public static final int EVENT_ITALIC = 2;
+ public static final int EVENT_UNDERLINE = 3;
+ public static final int EVENT_COLOR = 4;
+ public static final int EVENT_SIZE = 5;
+ public static final int EVENT_QUOTE = 6;
+ public static final int EVENT_CODE = 7;
+ public static final int EVENT_ITEM = 8;
+ public static final int EVENT_LINK = 9;
+ public static final int EVENT_UNORDERED_LIST = 10;
+ public static final int EVENT_ALPHABETICALLY_ORDERED_LIST = 11;
+ public static final int EVENT_NUMERICALLY_ORDERED_LIST = 12;
+
+ public static final String BUNDLE_KEY_CODE = "Message_code";
+ public static final String BUNDLE_KEY_QUOTE = "Message_quote";
+ public static final String BUNDLE_KEY_WROTE = "Message_wrote";
+
+ // The parser state
+
+ public static final Reader NULL_READER = new Reader()
+ {
+ public int read(char cbuf[], int off, int len) throws IOException
+ {
+ return 0;
+ }
+
+ public void close() throws IOException
+ {
+ }
+ };
+
+ private Analyzer analyzer = new Analyzer(BBCodeParser.NULL_READER);
+ private CodeKey myKey = new CodeKey();
+ private MutableChars buffer = new MutableChars();
+ private TextEvent textEvent = new TextEvent();
+ private OpenEvent openEvent = new OpenEvent();
+
+ private Stack stack = new Stack(10)
+ {
+ protected Stack.Key createKey()
+ {
+ return new CloseEvent();
+ }
+
+ protected boolean equals(Stack.Key key1, Stack.Key key2)
+ {
+ return ((CodeKey)key1).getType() == ((CodeKey)key2).getType();
+ }
+ };
+
+ public BBCodeParser()
+ {
+ }
+
+ public void parse(char[] chars, int offset, int length)
+ {
+ // First we initialize the parser state
+ stack.reset();
+ analyzer.reset(chars, offset, length);
+ buffer.reset();
+
+ // First
+ _start(EVENT_NORMAL, null);
+
+ // Enter the switch loop
+ while (true)
+ {
+ // Get the next token
+ Token t = analyzer.next();
+
+ if (t == null)
+ {
+ // No more tokens to read
+ break;
+ }
+
+ // According to the token we fire the approriate events
+ switch (t.type)
+ {
+ case Analyzer.OPEN_B:
+ _start(EVENT_BOLD, null);
+ break;
+ case Analyzer.CLOSE_B:
+ _end(EVENT_BOLD);
+ break;
+
+ case Analyzer.OPEN_I:
+ _start(EVENT_ITALIC, null);
+ break;
+ case Analyzer.CLOSE_I:
+ _end(EVENT_ITALIC);
+ break;
+
+ case Analyzer.OPEN_U:
+ _start(EVENT_UNDERLINE, null);
+ break;
+ case Analyzer.CLOSE_U:
+ _end(EVENT_UNDERLINE);
+ break;
+
+ case Analyzer.OPEN_COLOR:
+ _start(EVENT_COLOR, t.value);
+ break;
+ case Analyzer.CLOSE_COLOR:
+ _end(EVENT_COLOR);
+ break;
+
+ case Analyzer.OPEN_SIZE:
+ _start(EVENT_SIZE, t.value);
+ break;
+ case Analyzer.CLOSE_SIZE:
+ _end(EVENT_SIZE);
+ break;
+
+ case Analyzer.OPEN_QUOTE_ANONYMOUS:
+ _start(EVENT_QUOTE, null);
+ break;
+ case Analyzer.OPEN_QUOTE:
+ _start(EVENT_QUOTE, t.value);
+ break;
+ case Analyzer.CLOSE_QUOTE:
+ _end(EVENT_QUOTE);
+ break;
+
+ case Analyzer.OPEN_CODE:
+ _start(EVENT_CODE, null);
+ break;
+ case Analyzer.CLOSE_CODE:
+ _end(EVENT_CODE);
+ break;
+
+ case Analyzer.OPEN_LIST_UNORDERED:
+ _start(EVENT_UNORDERED_LIST, null);
+ break;
+ case Analyzer.OPEN_LIST_ORDERED_NUMERICAL:
+ _start(EVENT_NUMERICALLY_ORDERED_LIST, null);
+ break;
+ case Analyzer.OPEN_LIST_ORDERED_ALPHABETICAL:
+ _start(EVENT_ALPHABETICALLY_ORDERED_LIST, null);
+ break;
+
+ case Analyzer.CLOSE_LIST:
+ // If we match a list token on the stack at
+ // level -1 (because of the list item that should
+ // be pushed on the stack) we close
+ CodeKey tmp = (CodeKey)stack.peek(0);
+ if (tmp != null)
+ {
+ int type = tmp.type;
+ if (type == EVENT_UNORDERED_LIST ||
+ type == EVENT_NUMERICALLY_ORDERED_LIST ||
+ type == EVENT_ALPHABETICALLY_ORDERED_LIST)
+ {
+ _end(type);
+ }
+ }
+ break;
+
+ case Analyzer.LIST_ITEM:
+ // If we have a sibling item close it
+ CodeKey tmp2 = (CodeKey)stack.peek(0);
+ if (tmp2 != null && tmp2.type == EVENT_ITEM)
+ {
+ _end(EVENT_ITEM);
+ }
+ _start(EVENT_ITEM, null);
+ break;
+
+ case Analyzer.LINK:
+ int bracket = t.value.indexOf(']');
+ if (bracket > 0)
+ {
+ boolean hasEquals = t.value.charAt(0) == '=';
+ if (hasEquals)
+ {
+ // todo add support for the link value which is not used yet
+ String url = t.value.substring(1, bracket);
+ String link = t.value.substring(bracket + 1);
+ _start(EVENT_LINK, url);
+ _end(EVENT_LINK);
+ }
+ }
+ else
+ {
+ _start(EVENT_LINK, t.value.substring(1));
+ _end(EVENT_LINK);
+ }
+
+ break;
+
+ case Analyzer.TEXT:
+ buffer.append(t.value.charAt(0));
+ break;
+
+ default:
+ throw new IllegalStateException("This should not be possible");
+ }
+ }
+
+ // Last
+ _end(EVENT_NORMAL);
+ }
+
+ private void _text()
+ {
+ if (buffer.length() > 0)
+ {
+ textEvent.setText(buffer.chars(), 0, buffer.length());
+ buffer.reset();
+ handler.handle(textEvent);
+ }
+ }
+
+ private void _start(int type, String string)
+ {
+ _text();
+ CloseEvent closeEvent = (CloseEvent)stack.push();
+ openEvent.type = closeEvent.type = type;
+ openEvent.string = string;
+ handler.handle(openEvent);
+ }
+
+ private void _end(int type)
+ {
+ myKey.type = type;
+ Iterator i = stack.pop(myKey);
+ if (i.hasNext())
+ {
+ _text();
+ do
+ {
+ handler.handle((CloseEvent)i.next());
+ }
+ while (i.hasNext());
+ }
+ }
+
+ private static class CodeKey implements Stack.Key
+ {
+ protected int type;
+ protected String string;
+
+ public CodeKey()
+ {
+ type = -1;
+ string = null;
+ }
+
+ public int getType()
+ {
+ return type;
+ }
+
+ public String getString()
+ {
+ return string;
+ }
+ }
+
+ public static class OpenEvent extends CodeKey implements ParseEvent
+ {
+ public String toString()
+ {
+ return "open: " + type + " " + string;
+ }
+ }
+
+ public static class CloseEvent extends CodeKey implements ParseEvent
+ {
+ public String toString()
+ {
+ return "close: " + type + " " + string;
+ }
+ }
+}
+
+
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/bbcode/BBCodeParser.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/chars/Chars.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/chars/Chars.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/chars/Chars.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,48 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.parser.chars;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.Writer;
+
+/**
+ * An ordered collection of char.
+ *
+ * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
+ * @version $Revision: 5448 $
+ */
+public interface Chars
+{
+ /** Append the chars to a Writer. */
+ void appendTo(Writer writer) throws IOException;
+
+ /** Get a Reader for the chars. */
+ Reader getReader();
+
+ /** Returns how many chars there are. */
+ int length();
+
+ /** Returns a String made of the chars. */
+ String toString();
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/chars/Chars.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/chars/MutableChars.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/chars/MutableChars.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/chars/MutableChars.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,154 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.parser.chars;
+
+import java.io.CharArrayReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.Writer;
+
+/**
+ * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
+ * @version $Revision: 5448 $
+ */
+public class MutableChars implements Chars
+{
+
+ protected int index;
+ protected char[] chars;
+ protected Writer writer;
+
+ public MutableChars(int length)
+ {
+ this(new char[length]);
+ }
+
+ public MutableChars()
+ {
+ this(20);
+ }
+
+ public MutableChars(char[] chars)
+ {
+ this.index = 0;
+ this.chars = chars;
+ this.writer = new MyWriter();
+ }
+
+ public MutableChars(String s)
+ {
+ this(s.toCharArray());
+ }
+
+ private void increase()
+ {
+ char[] temp = new char[1 + chars.length * 2];
+ System.arraycopy(chars, 0, temp, 0, chars.length);
+ chars = temp;
+ }
+
+ public MutableChars append(String s)
+ {
+ int mark = index;
+ index += s.length();
+ while (index > chars.length - 1)
+ {
+ increase();
+ }
+ s.getChars(0, s.length(), chars, mark);
+ return this;
+ }
+
+ public MutableChars append(char cbuf[], int off, int len)
+ {
+ int mark = index;
+ index += len;
+ while (index > chars.length - 1)
+ {
+ increase();
+ }
+ System.arraycopy(cbuf, off, chars, mark, len);
+ return this;
+ }
+
+ public MutableChars append(char c)
+ {
+ if (index > chars.length - 1) // ~ to index >= length
+ {
+ increase();
+ }
+ chars[index++] = c;
+ return this;
+ }
+
+ public void reset()
+ {
+ index = 0;
+ }
+
+ public void appendTo(Writer writer) throws IOException
+ {
+ writer.write(chars, 0, index);
+ }
+
+ public String toString()
+ {
+ return new String(chars, 0, index);
+ }
+
+ public Reader getReader()
+ {
+ return new CharArrayReader(chars, 0, index);
+ }
+
+ public int length()
+ {
+ return index;
+ }
+
+ public Writer getWriter()
+ {
+ return writer;
+ }
+
+ public char[] chars()
+ {
+ return chars;
+ }
+
+ public class MyWriter extends Writer
+ {
+ public void write(char cbuf[], int off, int len) throws IOException
+ {
+ MutableChars.this.append(cbuf, off, len);
+ }
+
+ public void flush() throws IOException
+ {
+ }
+
+ public void close() throws IOException
+ {
+ }
+ }
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/chars/MutableChars.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/entity/CharacterEntityReferenceEvent.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/entity/CharacterEntityReferenceEvent.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/entity/CharacterEntityReferenceEvent.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,37 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.parser.entity;
+
+import org.jboss.portlet.forums.format.parser.TextEvent;
+
+/**
+ * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
+ * @version $Revision: 5448 $
+ */
+public class CharacterEntityReferenceEvent extends TextEvent
+{
+ public String toString()
+ {
+ return "charref:" + new String(chars, offset, length);
+ }
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/entity/CharacterEntityReferenceEvent.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/entity/HTML4_0CharacterEntityReferenceParser.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/entity/HTML4_0CharacterEntityReferenceParser.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/entity/HTML4_0CharacterEntityReferenceParser.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,79 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.parser.entity;
+
+import org.jboss.portlet.forums.format.parser.AbstractParser;
+import org.jboss.portlet.forums.format.parser.TextEvent;
+import org.jboss.portlet.forums.format.util.EntityTable;
+
+/**
+ * Convert chars that have an an HTML 4 character reference.
+ *
+ * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
+ * @version $Revision: 5448 $
+ */
+public class HTML4_0CharacterEntityReferenceParser extends AbstractParser
+{
+
+ private final TextEvent textEvent = new TextEvent();
+ private final CharacterEntityReferenceEvent cere = new CharacterEntityReferenceEvent();
+ private final char[] buffer = new char[10];
+
+ public void parse(char[] chars, int startOffset, int length)
+ {
+ // Calculate the startOffset of the last chars to process
+ int endOffset = startOffset + length;
+ int previousOffset = startOffset;
+
+ // Iterates over all the chars
+ for (int currentOffset = startOffset; currentOffset < endOffset; currentOffset++)
+ {
+ char c = chars[currentOffset];
+ String result = EntityTable.FULL.lookup(c);
+ if (result != null)
+ {
+ if (currentOffset > previousOffset)
+ {
+ textEvent.setText(chars, previousOffset, currentOffset - previousOffset);
+ handler.handle(textEvent);
+ }
+
+ int size = result.length();
+ buffer[0] = '&';
+ result.getChars(0, size, buffer, 1);
+ buffer[size + 1] = ';';
+ cere.setText(buffer, 0, size + 2);
+ handler.handle(cere);
+ previousOffset = currentOffset + 1;
+ }
+ }
+
+ // Send the last chunck
+ if (endOffset > previousOffset)
+ {
+ textEvent.setText(chars, previousOffset, endOffset - previousOffset);
+ handler.handle(textEvent);
+ }
+ }
+
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/entity/HTML4_0CharacterEntityReferenceParser.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/entity/XML1_0CharacterEntityReferenceParser.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/entity/XML1_0CharacterEntityReferenceParser.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/entity/XML1_0CharacterEntityReferenceParser.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,94 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.parser.entity;
+
+import org.jboss.portlet.forums.format.parser.AbstractParser;
+import org.jboss.portlet.forums.format.parser.TextEvent;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Detect XML 1.0 character entity references.
+ *
+ * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
+ * @version $Revision: 5448 $
+ */
+public class XML1_0CharacterEntityReferenceParser extends AbstractParser
+{
+
+ private final TextEvent textEvent = new TextEvent();
+ private final CharacterEntityReferenceEvent cere = new CharacterEntityReferenceEvent();
+
+ private static Pattern pattern = Pattern.compile("&#(?:(?:x[0-9a-fA-F]{1,4})|(?:[0-9]{1,5}));");
+
+ public void parse(char[] chars, int offset, int length)
+ {
+ CharSequence seq = new CharSequenceImpl(chars, offset, length);
+ Matcher matcher = pattern.matcher(seq);
+ int from = offset;
+ while (matcher.find())
+ {
+ int to = matcher.start();
+ textEvent.setText(chars, from, to - from);
+ handler.handle(textEvent);
+ from = matcher.end();
+ cere.setText(chars, to, from - to);
+ handler.handle(cere);
+ }
+ if (from < offset + length)
+ {
+ textEvent.setText(chars, from, offset + length - from);
+ handler.handle(textEvent);
+ }
+ }
+
+ private static class CharSequenceImpl implements CharSequence
+ {
+ private final char[] chars;
+ private final int offset;
+ private final int length;
+
+ public CharSequenceImpl(char[] chars, int offset, int length)
+ {
+ this.chars = chars;
+ this.offset = offset;
+ this.length = length;
+ }
+
+ public int length()
+ {
+ return length;
+ }
+
+ public char charAt(int index)
+ {
+ return chars[offset + index];
+ }
+
+ public CharSequence subSequence(int start, int end)
+ {
+ return new CharSequenceImpl(chars, start, end - start);
+ }
+ }
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/entity/XML1_0CharacterEntityReferenceParser.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/html/Analyzer.flex
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/html/Analyzer.flex (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/html/Analyzer.flex 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,77 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.portlet.forums.format.parser.html;
+
+import java.io.CharArrayReader;
+import org.jboss.portlet.forums.format.parser.Token;
+
+%%
+
+%unicode
+%public
+%class Analyzer
+%type Token
+
+%{
+
+public static final int STAG = 0;
+public static final int ETAG = 1;
+public static final int EMPTY = 2;
+public static final int CDATA = 3;
+
+
+public void reset(char[] chars, int off, int len)
+{
+ yyreset(new CharArrayReader(chars, off, len));
+}
+
+public Token next()
+{
+ try { return yylex(); }
+ catch(java.io.IOException e) { e.printStackTrace(); return null; }
+}
+
+private Token token = new Token();
+
+private Token token(int type, String value)
+{
+ token.type = type;
+ token.value = value;
+ return token;
+}
+
+%}
+
+S = (" "|"\t"|"\r"|"\n")+
+Name = [A-Za-z]+
+Attribute = [A-Za-z]+(" "|"\t"|"\r"|"\n")*"="(" "|"\t"|"\r"|"\n")*[\"']~[\"']
+
+%%
+
+<YYINITIAL>
+{
+ "<"{Name}({S}{Attribute})*{S}?">" { return token(STAG, yytext()); }
+ "</"{Name}{S}?">" { return token(ETAG, yytext()); }
+ "<"{Name}({S}{Attribute})*{S}?"/>" { return token(EMPTY, yytext()); }
+ .|\n { return token(CDATA, yytext()); }
+}
+
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/html/Analyzer.flex
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/html/Analyzer.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/html/Analyzer.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/html/Analyzer.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,587 @@
+/* The following code was generated by JFlex 1.4.1 on 24.11.07 23:16 */
+
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2005, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.portlet.forums.format.parser.html;
+
+import java.io.CharArrayReader;
+import org.jboss.portlet.forums.format.parser.Token;
+
+
+/**
+ * This class is a scanner generated by
+ * <a href="http://www.jflex.de/">JFlex</a> 1.4.1
+ * on 24.11.07 23:16 from the specification file
+ * <tt>/Users/rysiek/Work/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/html/Analyzer.flex</tt>
+ */
+public class Analyzer {
+
+ /** This character denotes the end of file */
+ public static final int YYEOF = -1;
+
+ /** initial size of the lookahead buffer */
+ private static final int ZZ_BUFFERSIZE = 16384;
+
+ /** lexical states */
+ public static final int YYINITIAL = 0;
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final String ZZ_CMAP_PACKED =
+ "\11\0\1\1\1\1\2\0\1\1\22\0\1\1\1\0\1\4\4\0"+
+ "\1\4\7\0\1\7\14\0\1\5\1\3\1\6\2\0\32\2\6\0"+
+ "\32\2\uff85\0";
+
+ /**
+ * Translates characters to character classes
+ */
+ private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
+
+ /**
+ * Translates DFA states to action switch labels.
+ */
+ private static final int [] ZZ_ACTION = zzUnpackAction();
+
+ private static final String ZZ_ACTION_PACKED_0 =
+ "\1\0\2\1\3\0\1\2\3\0\1\3\1\0\1\4"+
+ "\4\0";
+
+ private static int [] zzUnpackAction() {
+ int [] result = new int[17];
+ int offset = 0;
+ offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
+ return result;
+ }
+
+ private static int zzUnpackAction(String packed, int offset, int [] result) {
+ int i = 0; /* index in packed string */
+ int j = offset; /* index in unpacked array */
+ int l = packed.length();
+ while (i < l) {
+ int count = packed.charAt(i++);
+ int value = packed.charAt(i++);
+ do result[j++] = value; while (--count > 0);
+ }
+ return j;
+ }
+
+
+ /**
+ * Translates a state to a row index in the transition table
+ */
+ private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
+
+ private static final String ZZ_ROWMAP_PACKED_0 =
+ "\0\0\0\10\0\20\0\30\0\40\0\50\0\10\0\60"+
+ "\0\70\0\100\0\10\0\110\0\10\0\120\0\130\0\140"+
+ "\0\150";
+
+ private static int [] zzUnpackRowMap() {
+ int [] result = new int[17];
+ int offset = 0;
+ offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
+ return result;
+ }
+
+ private static int zzUnpackRowMap(String packed, int offset, int [] result) {
+ int i = 0; /* index in packed string */
+ int j = offset; /* index in unpacked array */
+ int l = packed.length();
+ while (i < l) {
+ int high = packed.charAt(i++) << 16;
+ result[j++] = high | packed.charAt(i++);
+ }
+ return j;
+ }
+
+ /**
+ * The transition table of the DFA
+ */
+ private static final int [] ZZ_TRANS = zzUnpackTrans();
+
+ private static final String ZZ_TRANS_PACKED_0 =
+ "\5\2\1\3\2\2\12\0\1\4\4\0\1\5\1\0"+
+ "\1\6\1\4\3\0\1\7\1\10\2\0\1\11\6\0"+
+ "\1\6\1\12\3\0\1\7\1\10\6\0\1\13\2\0"+
+ "\1\14\1\11\3\0\1\15\2\0\1\16\1\12\1\17"+
+ "\5\0\1\14\4\0\1\15\2\0\1\16\1\0\1\17"+
+ "\5\0\1\17\2\0\1\20\3\0\4\20\1\21\3\20"+
+ "\1\0\1\6\4\0\1\7\1\10";
+
+ private static int [] zzUnpackTrans() {
+ int [] result = new int[112];
+ int offset = 0;
+ offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
+ return result;
+ }
+
+ private static int zzUnpackTrans(String packed, int offset, int [] result) {
+ int i = 0; /* index in packed string */
+ int j = offset; /* index in unpacked array */
+ int l = packed.length();
+ while (i < l) {
+ int count = packed.charAt(i++);
+ int value = packed.charAt(i++);
+ value--;
+ do result[j++] = value; while (--count > 0);
+ }
+ return j;
+ }
+
+
+ /* error codes */
+ private static final int ZZ_UNKNOWN_ERROR = 0;
+ private static final int ZZ_NO_MATCH = 1;
+ private static final int ZZ_PUSHBACK_2BIG = 2;
+
+ /* error messages for the codes above */
+ private static final String ZZ_ERROR_MSG[] = {
+ "Unkown internal scanner error",
+ "Error: could not match input",
+ "Error: pushback value was too large"
+ };
+
+ /**
+ * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
+ */
+ private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
+
+ private static final String ZZ_ATTRIBUTE_PACKED_0 =
+ "\1\0\1\11\1\1\3\0\1\11\3\0\1\11\1\0"+
+ "\1\11\4\0";
+
+ private static int [] zzUnpackAttribute() {
+ int [] result = new int[17];
+ int offset = 0;
+ offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
+ return result;
+ }
+
+ private static int zzUnpackAttribute(String packed, int offset, int [] result) {
+ int i = 0; /* index in packed string */
+ int j = offset; /* index in unpacked array */
+ int l = packed.length();
+ while (i < l) {
+ int count = packed.charAt(i++);
+ int value = packed.charAt(i++);
+ do result[j++] = value; while (--count > 0);
+ }
+ return j;
+ }
+
+ /** the input device */
+ private java.io.Reader zzReader;
+
+ /** the current state of the DFA */
+ private int zzState;
+
+ /** the current lexical state */
+ private int zzLexicalState = YYINITIAL;
+
+ /** this buffer contains the current text to be matched and is
+ the source of the yytext() string */
+ private char zzBuffer[] = new char[ZZ_BUFFERSIZE];
+
+ /** the textposition at the last accepting state */
+ private int zzMarkedPos;
+
+ /** the textposition at the last state to be included in yytext */
+ private int zzPushbackPos;
+
+ /** the current text position in the buffer */
+ private int zzCurrentPos;
+
+ /** startRead marks the beginning of the yytext() string in the buffer */
+ private int zzStartRead;
+
+ /** endRead marks the last character in the buffer, that has been read
+ from input */
+ private int zzEndRead;
+
+ /** number of newlines encountered up to the start of the matched text */
+ private int yyline;
+
+ /** the number of characters up to the start of the matched text */
+ private int yychar;
+
+ /**
+ * the number of characters from the last newline up to the start of the
+ * matched text
+ */
+ private int yycolumn;
+
+ /**
+ * zzAtBOL == true <=> the scanner is currently at the beginning of a line
+ */
+ private boolean zzAtBOL = true;
+
+ /** zzAtEOF == true <=> the scanner is at the EOF */
+ private boolean zzAtEOF;
+
+ /* user code: */
+
+public static final int STAG = 0;
+public static final int ETAG = 1;
+public static final int EMPTY = 2;
+public static final int CDATA = 3;
+
+
+public void reset(char[] chars, int off, int len)
+{
+ yyreset(new CharArrayReader(chars, off, len));
+}
+
+public Token next()
+{
+ try { return yylex(); }
+ catch(java.io.IOException e) { e.printStackTrace(); return null; }
+}
+
+private Token token = new Token();
+
+private Token token(int type, String value)
+{
+ token.type = type;
+ token.value = value;
+ return token;
+}
+
+
+
+ /**
+ * Creates a new scanner
+ * There is also a java.io.InputStream version of this constructor.
+ *
+ * @param in the java.io.Reader to read input from.
+ */
+ public Analyzer(java.io.Reader in) {
+ this.zzReader = in;
+ }
+
+ /**
+ * Creates a new scanner.
+ * There is also java.io.Reader version of this constructor.
+ *
+ * @param in the java.io.Inputstream to read input from.
+ */
+ public Analyzer(java.io.InputStream in) {
+ this(new java.io.InputStreamReader(in));
+ }
+
+ /**
+ * Unpacks the compressed character translation table.
+ *
+ * @param packed the packed character translation table
+ * @return the unpacked character translation table
+ */
+ private static char [] zzUnpackCMap(String packed) {
+ char [] map = new char[0x10000];
+ int i = 0; /* index in packed string */
+ int j = 0; /* index in unpacked array */
+ while (i < 44) {
+ int count = packed.charAt(i++);
+ char value = packed.charAt(i++);
+ do map[j++] = value; while (--count > 0);
+ }
+ return map;
+ }
+
+
+ /**
+ * Refills the input buffer.
+ *
+ * @return <code>false</code>, iff there was new input.
+ *
+ * @exception java.io.IOException if any I/O-Error occurs
+ */
+ private boolean zzRefill() throws java.io.IOException {
+
+ /* first: make room (if you can) */
+ if (zzStartRead > 0) {
+ System.arraycopy(zzBuffer, zzStartRead,
+ zzBuffer, 0,
+ zzEndRead-zzStartRead);
+
+ /* translate stored positions */
+ zzEndRead-= zzStartRead;
+ zzCurrentPos-= zzStartRead;
+ zzMarkedPos-= zzStartRead;
+ zzPushbackPos-= zzStartRead;
+ zzStartRead = 0;
+ }
+
+ /* is the buffer big enough? */
+ if (zzCurrentPos >= zzBuffer.length) {
+ /* if not: blow it up */
+ char newBuffer[] = new char[zzCurrentPos*2];
+ System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length);
+ zzBuffer = newBuffer;
+ }
+
+ /* finally: fill the buffer with new input */
+ int numRead = zzReader.read(zzBuffer, zzEndRead,
+ zzBuffer.length-zzEndRead);
+
+ if (numRead < 0) {
+ return true;
+ }
+ else {
+ zzEndRead+= numRead;
+ return false;
+ }
+ }
+
+
+ /**
+ * Closes the input stream.
+ */
+ public final void yyclose() throws java.io.IOException {
+ zzAtEOF = true; /* indicate end of file */
+ zzEndRead = zzStartRead; /* invalidate buffer */
+
+ if (zzReader != null)
+ zzReader.close();
+ }
+
+
+ /**
+ * Resets the scanner to read from a new input stream.
+ * Does not close the old reader.
+ *
+ * All internal variables are reset, the old input stream
+ * <b>cannot</b> be reused (internal buffer is discarded and lost).
+ * Lexical state is set to <tt>ZZ_INITIAL</tt>.
+ *
+ * @param reader the new input stream
+ */
+ public final void yyreset(java.io.Reader reader) {
+ zzReader = reader;
+ zzAtBOL = true;
+ zzAtEOF = false;
+ zzEndRead = zzStartRead = 0;
+ zzCurrentPos = zzMarkedPos = zzPushbackPos = 0;
+ yyline = yychar = yycolumn = 0;
+ zzLexicalState = YYINITIAL;
+ }
+
+
+ /**
+ * Returns the current lexical state.
+ */
+ public final int yystate() {
+ return zzLexicalState;
+ }
+
+
+ /**
+ * Enters a new lexical state
+ *
+ * @param newState the new lexical state
+ */
+ public final void yybegin(int newState) {
+ zzLexicalState = newState;
+ }
+
+
+ /**
+ * Returns the text matched by the current regular expression.
+ */
+ public final String yytext() {
+ return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
+ }
+
+
+ /**
+ * Returns the character at position <tt>pos</tt> from the
+ * matched text.
+ *
+ * It is equivalent to yytext().charAt(pos), but faster
+ *
+ * @param pos the position of the character to fetch.
+ * A value from 0 to yylength()-1.
+ *
+ * @return the character at position pos
+ */
+ public final char yycharat(int pos) {
+ return zzBuffer[zzStartRead+pos];
+ }
+
+
+ /**
+ * Returns the length of the matched text region.
+ */
+ public final int yylength() {
+ return zzMarkedPos-zzStartRead;
+ }
+
+
+ /**
+ * Reports an error that occured while scanning.
+ *
+ * In a wellformed scanner (no or only correct usage of
+ * yypushback(int) and a match-all fallback rule) this method
+ * will only be called with things that "Can't Possibly Happen".
+ * If this method is called, something is seriously wrong
+ * (e.g. a JFlex bug producing a faulty scanner etc.).
+ *
+ * Usual syntax/scanner level error handling should be done
+ * in error fallback rules.
+ *
+ * @param errorCode the code of the errormessage to display
+ */
+ private void zzScanError(int errorCode) {
+ String message;
+ try {
+ message = ZZ_ERROR_MSG[errorCode];
+ }
+ catch (ArrayIndexOutOfBoundsException e) {
+ message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
+ }
+
+ throw new Error(message);
+ }
+
+
+ /**
+ * Pushes the specified amount of characters back into the input stream.
+ *
+ * They will be read again by then next call of the scanning method
+ *
+ * @param number the number of characters to be read again.
+ * This number must not be greater than yylength()!
+ */
+ public void yypushback(int number) {
+ if ( number > yylength() )
+ zzScanError(ZZ_PUSHBACK_2BIG);
+
+ zzMarkedPos -= number;
+ }
+
+
+ /**
+ * Resumes scanning until the next regular expression is matched,
+ * the end of input is encountered or an I/O-Error occurs.
+ *
+ * @return the next token
+ * @exception java.io.IOException if any I/O-Error occurs
+ */
+ public Token yylex() throws java.io.IOException {
+ int zzInput;
+ int zzAction;
+
+ // cached fields:
+ int zzCurrentPosL;
+ int zzMarkedPosL;
+ int zzEndReadL = zzEndRead;
+ char [] zzBufferL = zzBuffer;
+ char [] zzCMapL = ZZ_CMAP;
+
+ int [] zzTransL = ZZ_TRANS;
+ int [] zzRowMapL = ZZ_ROWMAP;
+ int [] zzAttrL = ZZ_ATTRIBUTE;
+
+ while (true) {
+ zzMarkedPosL = zzMarkedPos;
+
+ zzAction = -1;
+
+ zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
+
+ zzState = zzLexicalState;
+
+
+ zzForAction: {
+ while (true) {
+
+ if (zzCurrentPosL < zzEndReadL)
+ zzInput = zzBufferL[zzCurrentPosL++];
+ else if (zzAtEOF) {
+ zzInput = YYEOF;
+ break zzForAction;
+ }
+ else {
+ // store back cached positions
+ zzCurrentPos = zzCurrentPosL;
+ zzMarkedPos = zzMarkedPosL;
+ boolean eof = zzRefill();
+ // get translated positions and possibly new buffer
+ zzCurrentPosL = zzCurrentPos;
+ zzMarkedPosL = zzMarkedPos;
+ zzBufferL = zzBuffer;
+ zzEndReadL = zzEndRead;
+ if (eof) {
+ zzInput = YYEOF;
+ break zzForAction;
+ }
+ else {
+ zzInput = zzBufferL[zzCurrentPosL++];
+ }
+ }
+ int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
+ if (zzNext == -1) break zzForAction;
+ zzState = zzNext;
+
+ int zzAttributes = zzAttrL[zzState];
+ if ( (zzAttributes & 1) == 1 ) {
+ zzAction = zzState;
+ zzMarkedPosL = zzCurrentPosL;
+ if ( (zzAttributes & 8) == 8 ) break zzForAction;
+ }
+
+ }
+ }
+
+ // store back cached position
+ zzMarkedPos = zzMarkedPosL;
+
+ switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
+ case 3:
+ { return token(EMPTY, yytext());
+ }
+ case 5: break;
+ case 4:
+ { return token(ETAG, yytext());
+ }
+ case 6: break;
+ case 2:
+ { return token(STAG, yytext());
+ }
+ case 7: break;
+ case 1:
+ { return token(CDATA, yytext());
+ }
+ case 8: break;
+ default:
+ if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
+ zzAtEOF = true;
+ return null;
+ }
+ else {
+ zzScanError(ZZ_NO_MATCH);
+ }
+ }
+ }
+ }
+
+
+}
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/html/TagParser.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/html/TagParser.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/html/TagParser.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,223 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.parser.html;
+
+import org.jboss.portlet.forums.format.parser.AbstractParser;
+import org.jboss.portlet.forums.format.parser.ParseEvent;
+import org.jboss.portlet.forums.format.parser.TextEvent;
+import org.jboss.portlet.forums.format.parser.Token;
+import org.jboss.portlet.forums.format.parser.bbcode.BBCodeParser;
+import org.jboss.portlet.forums.format.parser.chars.MutableChars;
+import org.jboss.portlet.forums.format.util.Stack;
+
+import java.util.Iterator;
+
+/**
+ * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
+ * @version $Revision: 5448 $
+ */
+public class TagParser
+ extends AbstractParser
+{
+
+ public static final int EVENT_NORMAL = 0;
+ public static final int EVENT_TAG = 1;
+
+ private MutableChars buffer = new MutableChars();
+ private Analyzer analyzer = new Analyzer(BBCodeParser.NULL_READER);
+
+ private OpenEvent openEvent = new OpenEvent();
+ private TextEvent textEvent = new TextEvent();
+
+ private Stack stack = new Stack(10)
+ {
+ protected Stack.Key createKey()
+ {
+ return new CloseEvent();
+ }
+
+ protected boolean equals(Stack.Key o1, Stack.Key o2)
+ {
+ HTMLKey key1 = (HTMLKey)o1;
+ HTMLKey key2 = (HTMLKey)o2;
+ if (key1.getType() != key2.getType())
+ {
+ return false;
+ }
+ if (key1.getType() == 1)
+ {
+ return key1.getTag().equals(key2.getTag());
+ }
+ return false;
+ }
+ };
+
+ public TagParser()
+ {
+ }
+
+ private HTMLKey temporaryKey = new HTMLKey();
+
+ public void parse(char[] chars, int off, int len)
+ {
+
+ // Build the stream
+ stack.reset();
+ analyzer.reset(chars, off, len);
+ buffer.reset();
+
+ //
+ CloseEvent closeEvent = (CloseEvent)stack.push();
+ closeEvent.type = openEvent.type = EVENT_NORMAL;
+ closeEvent.tag = openEvent.tag = null;
+ openEvent.attributes = null;
+ handler.handle(openEvent);
+
+ while (true)
+ {
+ // Get the next token
+ Token t = analyzer.next();
+
+ if (t == null)
+ {
+ // No more token to read
+ break;
+ }
+
+ switch (t.type)
+ {
+ case Analyzer.STAG:
+ {
+ closeEvent = (CloseEvent)stack.push();
+ String tag = t.value;
+ int start = 1;
+ int end = tag.indexOf(' ', 1);
+ if (end == -1)
+ {
+ openEvent.type = closeEvent.type = EVENT_TAG;
+ openEvent.tag = closeEvent.tag = tag.substring(start, tag.length() - 1);
+ openEvent.attributes = "";
+ }
+ else
+ {
+ openEvent.type = closeEvent.type = EVENT_TAG;
+ openEvent.tag = closeEvent.tag = tag.substring(start, end);
+ openEvent.attributes = tag.substring(end, tag.length() - 1);
+ }
+ text();
+ handler.handle(openEvent);
+ break;
+ }
+ case Analyzer.ETAG:
+ {
+ temporaryKey.type = 1;
+ temporaryKey.tag = t.value.substring(2, t.value.length() - 1);
+ Iterator i = stack.pop(temporaryKey);
+ if (i.hasNext())
+ {
+ text();
+ do
+ {
+ handler.handle((CloseEvent)i.next());
+ }
+ while (i.hasNext());
+ }
+ break;
+ }
+ case Analyzer.EMPTY:
+ {
+// String tag = t.value;
+// int start = 1;
+// int end = tag.indexOf(' ', 1);
+// if (end == -1)
+// {
+// end = tag.length() - 2;
+// }
+// String name = tag.substring(start, end);
+// helper.empty(1, name);
+ break;
+ }
+ case Analyzer.CDATA:
+ buffer.append(t.value.charAt(0));
+ break;
+ default:
+ throw new IllegalStateException("Unexpected token : " + t.type);
+ }
+ }
+
+ //
+ text();
+ temporaryKey.type = EVENT_NORMAL;
+ Iterator i = stack.pop(temporaryKey);
+ while (i.hasNext())
+ {
+ handler.handle((CloseEvent)i.next());
+ }
+ }
+
+ private void text()
+ {
+ if (buffer.length() > 0)
+ {
+ textEvent.setText(buffer.chars(), 0, buffer.length());
+ buffer.reset();
+ handler.handle(textEvent);
+ }
+ }
+
+ private static class HTMLKey implements Stack.Key
+ {
+ int type;
+ String tag;
+
+ private HTMLKey()
+ {
+ type = -1;
+ tag = null;
+ }
+
+ public int getType()
+ {
+ return type;
+ }
+
+ public String getTag()
+ {
+ return tag;
+ }
+ }
+
+ public static class OpenEvent extends HTMLKey implements ParseEvent
+ {
+ private String attributes;
+
+ public String getAttribute()
+ {
+ return attributes;
+ }
+ }
+
+ public static class CloseEvent extends HTMLKey implements ParseEvent
+ {
+ }
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/html/TagParser.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/linebreak/LineBreakParser.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/linebreak/LineBreakParser.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/linebreak/LineBreakParser.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,70 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.parser.linebreak;
+
+import org.jboss.portlet.forums.format.parser.AbstractParser;
+import org.jboss.portlet.forums.format.parser.ParseEvent;
+import org.jboss.portlet.forums.format.parser.TextEvent;
+
+/**
+ * Break the parsed chars into text events and line break events.
+ *
+ * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
+ * @version $Revision: 5448 $
+ */
+public class LineBreakParser extends AbstractParser
+{
+
+ private static final LineBreakEvent event = new LineBreakEvent();
+
+ private final TextEvent textEvent = new TextEvent();
+
+ public void parse(char[] chars, int startOffset, int length)
+ {
+ int endOffset = startOffset + length;
+ int previousOffset = startOffset;
+ for (int currentOffset = startOffset; currentOffset < endOffset; currentOffset++)
+ {
+ char c = chars[currentOffset];
+ if (c == '\n')
+ {
+ if (currentOffset > previousOffset)
+ {
+ textEvent.setText(chars, previousOffset, currentOffset - previousOffset);
+ handler.handle(textEvent);
+ }
+ handler.handle(event);
+ previousOffset = currentOffset + 1;
+ }
+ }
+ if (endOffset > previousOffset)
+ {
+ textEvent.setText(chars, previousOffset, endOffset - previousOffset);
+ handler.handle(textEvent);
+ }
+ }
+
+ public static class LineBreakEvent implements ParseEvent
+ {
+ }
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/parser/linebreak/LineBreakParser.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/render/AbstractRenderer.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/render/AbstractRenderer.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/render/AbstractRenderer.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,85 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.render;
+
+import org.apache.log4j.Logger;
+
+import java.io.IOException;
+import java.io.Writer;
+
+/** An abstract renderer. */
+public abstract class AbstractRenderer
+{
+
+
+ /** The logger. */
+ protected final Logger log = Logger.getLogger(getClass());
+
+ /** Hold the final result. */
+ protected Writer writer = null;
+
+ /** Render. */
+ public abstract void render(char[] chars, int offset, int length);
+
+
+ /** Render. */
+ public void render(String string)
+ {
+ char[] tmp = string.toCharArray();
+ render(tmp, 0, tmp.length);
+ }
+
+ /** Set the write that will hold the rendered result. */
+ public final void setWriter(Writer writer)
+ {
+ this.writer = writer;
+ }
+
+ /** Helper method that catch any IOException throw by the write. */
+ protected final void write(String s)
+ {
+ try
+ {
+ writer.write(s);
+ }
+ catch (IOException e)
+ {
+ log.error("Cannot write to output", e);
+ }
+ }
+
+ /** @see #write(java.lang.String) */
+ protected final void write(char[] chars, int offset, int length)
+ {
+ try
+ {
+ writer.write(chars, offset, length);
+ }
+ catch (IOException e)
+ {
+ log.error("Cannot write to output", e);
+ }
+ }
+
+
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/render/AbstractRenderer.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/render/bbcodehtml/ToHTMLConfig.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/render/bbcodehtml/ToHTMLConfig.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/render/bbcodehtml/ToHTMLConfig.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,241 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.render.bbcodehtml;
+
+import org.apache.log4j.Logger;
+import org.jboss.portlet.forums.format.template.BuildException;
+import org.jboss.portlet.forums.format.template.Template;
+import org.jboss.portlet.forums.format.template.TemplateLoader;
+import org.jboss.portlet.forums.format.template.TemplateRepository;
+import org.jboss.portlet.forums.format.util.CLLoader;
+import org.jboss.portlet.forums.format.util.Loader;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ */
+public class ToHTMLConfig
+{
+
+ /** Template name constants. */
+
+ public static final String TPL_THEME_CODE_B_CLOSE = "b_close";
+ public static final String TPL_THEME_CODE_B_OPEN = "b_open";
+ public static final String TPL_THEME_CODE_CODE_CLOSE = "code_close";
+ public static final String TPL_THEME_CODE_CODE_OPEN = "code_open";
+ public static final String TPL_THEME_CODE_COLOR_CLOSE = "color_close";
+ public static final String TPL_THEME_CODE_COLOR_OPEN = "color_open";
+ public static final String TPL_THEME_CODE_EMAIL = "email";
+ public static final String TPL_THEME_CODE_I_CLOSE = "i_close";
+ public static final String TPL_THEME_CODE_I_OPEN = "i_open";
+ public static final String TPL_THEME_CODE_IMG = "img";
+ public static final String TPL_THEME_CODE_LISTITEM = "listitem";
+ public static final String TPL_THEME_CODE_OLIST_CLOSE = "olist_close";
+ public static final String TPL_THEME_CODE_OLIST_OPEN = "olist_open";
+ public static final String TPL_THEME_CODE_QUOTE_CLOSE = "quote_close";
+ public static final String TPL_THEME_CODE_QUOTE_OPEN = "quote_open";
+ public static final String TPL_THEME_CODE_QUOTE_USERNAME_OPEN = "quote_username_open";
+ public static final String TPL_THEME_CODE_SIZE_CLOSE = "size_close";
+ public static final String TPL_THEME_CODE_SIZE_OPEN = "size_open";
+ public static final String TPL_THEME_CODE_U_CLOSE = "u_close";
+ public static final String TPL_THEME_CODE_U_OPEN = "u_open";
+ public static final String TPL_THEME_CODE_ULIST_CLOSE = "ulist_close";
+ public static final String TPL_THEME_CODE_ULIST_OPEN = "ulist_open";
+ public static final String TPL_THEME_CODE_URL = "url";
+
+ public static final int FILTER_MODE_ALWAYS_PRINT = 0;
+ public static final int FILTER_MODE_NEVER_PRINT = 1;
+ public static final int FILTER_MODE_PRINT_IF_NOT_IN_TAGS = 2;
+ public static final int FILTER_MODE_PRINT_IF_IN_TAGS = 3;
+
+ public static final int OUTPUT_MODE_REMOVE = 0;
+ public static final int OUTPUT_MODE_DISPLAY = 1;
+
+ private static final Loader loader = new CLLoader(ToHTMLRenderer.class.getClassLoader(), "");
+ private static final TemplateRepository defaultRepository = createRepository(loader);
+
+ Template r_ulist_open;
+ Template r_ulist_close;
+ Template r_olist_open;
+ Template r_olist_close;
+ Template r_listitem;
+ Template r_quote_open;
+ Template r_quote_close;
+ Template r_quote_username_open;
+ Template r_code_open;
+ Template r_code_close;
+ Template r_b_open;
+ Template r_b_close;
+ Template r_u_open;
+ Template r_u_close;
+ Template r_i_open;
+ Template r_i_close;
+ Template r_color_open;
+ Template r_color_close;
+ Template r_size_open;
+ Template r_size_close;
+ Template r_img;
+ Template r_url;
+ Template r_email;
+
+ private Set tags = new HashSet();
+ private int filterMode = FILTER_MODE_ALWAYS_PRINT;
+ private int ouputMode = OUTPUT_MODE_REMOVE;
+ private int maxTextWidth = 100;
+
+ public ToHTMLConfig()
+ {
+ setRepository(defaultRepository);
+ }
+
+ public void setLoader(Loader loader)
+ {
+ TemplateRepository repository = createRepository(loader);
+ setRepository(repository);
+ }
+
+ public int getMaxTextWidth()
+ {
+ return maxTextWidth;
+ }
+
+ public void setMaxTextWidth(int maxTextWidth)
+ {
+ this.maxTextWidth = maxTextWidth;
+ }
+
+ public void setTags(Set tags)
+ {
+ this.tags = tags;
+ }
+
+ public Set getTags()
+ {
+ return tags;
+ }
+
+ public int getFilterMode()
+ {
+ return filterMode;
+ }
+
+ public void setFilterMode(int filterMode)
+ {
+ this.filterMode = filterMode;
+ }
+
+ public int getOuputMode()
+ {
+ return ouputMode;
+ }
+
+ public void setOuputMode(int ouputMode)
+ {
+ this.ouputMode = ouputMode;
+ }
+
+ public boolean print(String tag)
+ {
+ switch (filterMode)
+ {
+ case FILTER_MODE_NEVER_PRINT:
+ return false;
+ case FILTER_MODE_PRINT_IF_NOT_IN_TAGS:
+ return !tags.contains(tag);
+ case FILTER_MODE_PRINT_IF_IN_TAGS:
+ return tags.contains(tag);
+ case FILTER_MODE_ALWAYS_PRINT:
+ return true;
+ }
+ return false;
+ }
+
+ private void setRepository(TemplateRepository repository)
+ {
+ r_ulist_open = repository.createTemplate(TPL_THEME_CODE_ULIST_OPEN);
+ r_ulist_close = repository.createTemplate(TPL_THEME_CODE_ULIST_CLOSE);
+ r_olist_open = repository.createTemplate(TPL_THEME_CODE_OLIST_OPEN);
+ r_olist_close = repository.createTemplate(TPL_THEME_CODE_OLIST_CLOSE);
+ r_listitem = repository.createTemplate(TPL_THEME_CODE_LISTITEM);
+ r_quote_open = repository.createTemplate(TPL_THEME_CODE_QUOTE_OPEN);
+ r_quote_close = repository.createTemplate(TPL_THEME_CODE_QUOTE_CLOSE);
+ r_quote_username_open = repository.createTemplate(TPL_THEME_CODE_QUOTE_USERNAME_OPEN);
+ r_code_open = repository.createTemplate(TPL_THEME_CODE_CODE_OPEN);
+ r_code_close = repository.createTemplate(TPL_THEME_CODE_CODE_CLOSE);
+ r_b_open = repository.createTemplate(TPL_THEME_CODE_B_OPEN);
+ r_b_close = repository.createTemplate(TPL_THEME_CODE_B_CLOSE);
+ r_u_open = repository.createTemplate(TPL_THEME_CODE_U_OPEN);
+ r_u_close = repository.createTemplate(TPL_THEME_CODE_U_CLOSE);
+ r_i_open = repository.createTemplate(TPL_THEME_CODE_I_OPEN);
+ r_i_close = repository.createTemplate(TPL_THEME_CODE_I_CLOSE);
+ r_color_open = repository.createTemplate(TPL_THEME_CODE_COLOR_OPEN);
+ r_color_close = repository.createTemplate(TPL_THEME_CODE_COLOR_CLOSE);
+ r_size_open = repository.createTemplate(TPL_THEME_CODE_SIZE_OPEN);
+ r_size_close = repository.createTemplate(TPL_THEME_CODE_SIZE_CLOSE);
+ r_img = repository.createTemplate(TPL_THEME_CODE_IMG);
+ r_url = repository.createTemplate(TPL_THEME_CODE_URL);
+ r_email = repository.createTemplate(TPL_THEME_CODE_EMAIL);
+ }
+
+ private static void loadTemplate(TemplateLoader repository, String name)
+ {
+ try
+ {
+ repository.addTemplate(name, "/" + name + ".tpl");
+ }
+ catch (BuildException e)
+ {
+ Logger.getLogger(ToHTMLRenderer.class).error("Cannot load template : " + name, e);
+ }
+ }
+
+ private static TemplateLoader createRepository(Loader loader)
+ {
+ TemplateLoader repository = new TemplateLoader(loader);
+ loadTemplate(repository, TPL_THEME_CODE_ULIST_OPEN);
+ loadTemplate(repository, TPL_THEME_CODE_ULIST_CLOSE);
+ loadTemplate(repository, TPL_THEME_CODE_OLIST_OPEN);
+ loadTemplate(repository, TPL_THEME_CODE_OLIST_CLOSE);
+ loadTemplate(repository, TPL_THEME_CODE_LISTITEM);
+ loadTemplate(repository, TPL_THEME_CODE_QUOTE_OPEN);
+ loadTemplate(repository, TPL_THEME_CODE_QUOTE_CLOSE);
+ loadTemplate(repository, TPL_THEME_CODE_QUOTE_USERNAME_OPEN);
+ loadTemplate(repository, TPL_THEME_CODE_CODE_OPEN);
+ loadTemplate(repository, TPL_THEME_CODE_CODE_CLOSE);
+ loadTemplate(repository, TPL_THEME_CODE_B_OPEN);
+ loadTemplate(repository, TPL_THEME_CODE_B_CLOSE);
+ loadTemplate(repository, TPL_THEME_CODE_U_OPEN);
+ loadTemplate(repository, TPL_THEME_CODE_U_CLOSE);
+ loadTemplate(repository, TPL_THEME_CODE_I_OPEN);
+ loadTemplate(repository, TPL_THEME_CODE_I_CLOSE);
+ loadTemplate(repository, TPL_THEME_CODE_COLOR_OPEN);
+ loadTemplate(repository, TPL_THEME_CODE_COLOR_CLOSE);
+ loadTemplate(repository, TPL_THEME_CODE_SIZE_OPEN);
+ loadTemplate(repository, TPL_THEME_CODE_SIZE_CLOSE);
+ loadTemplate(repository, TPL_THEME_CODE_IMG);
+ loadTemplate(repository, TPL_THEME_CODE_URL);
+ loadTemplate(repository, TPL_THEME_CODE_EMAIL);
+ return repository;
+ }
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/render/bbcodehtml/ToHTMLConfig.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/render/bbcodehtml/ToHTMLRenderer.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/render/bbcodehtml/ToHTMLRenderer.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/render/bbcodehtml/ToHTMLRenderer.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,366 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.render.bbcodehtml;
+
+import org.jboss.portlet.forums.format.parser.ParseEvent;
+import org.jboss.portlet.forums.format.parser.ParseEventHandler;
+import org.jboss.portlet.forums.format.parser.TextEvent;
+import org.jboss.portlet.forums.format.parser.bbcode.BBCodeParser;
+import org.jboss.portlet.forums.format.parser.entity.CharacterEntityReferenceEvent;
+import org.jboss.portlet.forums.format.parser.entity.HTML4_0CharacterEntityReferenceParser;
+import org.jboss.portlet.forums.format.parser.entity.XML1_0CharacterEntityReferenceParser;
+import org.jboss.portlet.forums.format.parser.html.TagParser;
+import org.jboss.portlet.forums.format.parser.linebreak.LineBreakParser;
+import org.jboss.portlet.forums.format.render.AbstractRenderer;
+import org.jboss.portlet.forums.format.template.DelegateContext;
+
+import java.util.ResourceBundle;
+
+
+/**
+ * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
+ * @version $Revision: 5448 $
+ */
+public class ToHTMLRenderer extends AbstractRenderer
+{
+
+ /*
+ * Different parsers.
+ */
+
+ private final BBCodeParser codeParser = new BBCodeParser();
+ private final TagParser tagParser = new TagParser();
+ private final XML1_0CharacterEntityReferenceParser XMLCERP = new XML1_0CharacterEntityReferenceParser();
+ private final HTML4_0CharacterEntityReferenceParser HTMLCERP = new HTML4_0CharacterEntityReferenceParser();
+ private final LineBreakParser lineBreakParser = new LineBreakParser();
+
+ /** Context used by the code handler templates. */
+ private final DelegateContext ctx = new DelegateContext();
+
+ /** Code depth. */
+ private int isInPre = 0;
+
+ /** Config. */
+ private ToHTMLConfig config;
+
+ /*
+ * Templates.
+ */
+
+ /** Setup the renderer with the given template repository. */
+ public ToHTMLRenderer(ToHTMLConfig config, ResourceBundle bundle)
+ {
+ if (config == null)
+ {
+ throw new IllegalArgumentException("no config");
+ }
+ if (bundle == null)
+ {
+ throw new IllegalArgumentException("no bundle");
+ }
+ this.config = config;
+ codeParser.setHandler(bbCodeHandler);
+ tagParser.setHandler(tagHandler);
+ XMLCERP.setHandler(XMLCRPHandler);
+ HTMLCERP.setHandler(HTMLCRPHandler);
+ lineBreakParser.setHandler(lineBreakHandler);
+ ctx.put("L_CODE", bundle.getString(BBCodeParser.BUNDLE_KEY_CODE));
+ ctx.put("L_QUOTE", bundle.getString(BBCodeParser.BUNDLE_KEY_QUOTE));
+ ctx.put("L_WROTE", bundle.getString(BBCodeParser.BUNDLE_KEY_WROTE));
+ }
+
+ public ToHTMLRenderer(ResourceBundle bundle)
+ {
+ this(new ToHTMLConfig(), bundle);
+ }
+
+ public ToHTMLConfig getConfig()
+ {
+ return config;
+ }
+
+ public void setConfig(ToHTMLConfig config)
+ {
+ this.config = config;
+ }
+
+ public void render(char[] chars, int offset, int length)
+ {
+ codeParser.parse(chars, offset, length);
+ }
+
+ public ParseEventHandler bbCodeHandler = new ParseEventHandler()
+ {
+ public void handle(ParseEvent event)
+ {
+ if (event instanceof BBCodeParser.OpenEvent)
+ {
+ BBCodeParser.OpenEvent openEvent = (BBCodeParser.OpenEvent)event;
+ String string = openEvent.getString();
+ switch (openEvent.getType())
+ {
+ case BBCodeParser.EVENT_BOLD:
+ config.r_b_open.render(ctx, writer);
+ break;
+ case BBCodeParser.EVENT_ITALIC:
+ config.r_i_open.render(ctx, writer);
+ break;
+ case BBCodeParser.EVENT_UNDERLINE:
+ config.r_u_open.render(ctx, writer);
+ break;
+ case BBCodeParser.EVENT_COLOR:
+ ctx.put("COLOR", string);
+ config.r_color_open.render(ctx, writer);
+ break;
+ case BBCodeParser.EVENT_SIZE:
+ ctx.put("SIZE", string);
+ config.r_size_open.render(ctx, writer);
+ break;
+ case BBCodeParser.EVENT_QUOTE:
+ if (string == null)
+ {
+ config.r_quote_open.render(ctx, writer);
+ }
+ else
+ {
+ ctx.put("USERNAME", string);
+ config.r_quote_username_open.render(ctx, writer);
+ }
+ break;
+ case BBCodeParser.EVENT_CODE:
+ isInPre++;
+ config.r_code_open.render(ctx, writer);
+ break;
+ case BBCodeParser.EVENT_UNORDERED_LIST:
+ config.r_ulist_open.render(ctx, writer);
+ break;
+ case BBCodeParser.EVENT_NUMERICALLY_ORDERED_LIST:
+ ctx.put("LIST_TYPE", "1");
+ config.r_olist_open.render(ctx, writer);
+ break;
+ case BBCodeParser.EVENT_ALPHABETICALLY_ORDERED_LIST:
+ ctx.put("LIST_TYPE", "a");
+ config.r_olist_open.render(ctx, writer);
+ break;
+ case BBCodeParser.EVENT_ITEM:
+ config.r_listitem.render(ctx, writer);
+ break;
+ case BBCodeParser.EVENT_LINK:
+ ctx.put("URL", string);
+ ctx.put("DESCRIPTION", string);
+ config.r_url.render(ctx, writer);
+ break;
+ }
+ }
+ else if (event instanceof BBCodeParser.CloseEvent)
+ {
+ BBCodeParser.CloseEvent closeEvent = (BBCodeParser.CloseEvent)event;
+ switch (closeEvent.getType())
+ {
+ case BBCodeParser.EVENT_BOLD:
+ config.r_b_close.render(ctx, writer);
+ break;
+ case BBCodeParser.EVENT_ITALIC:
+ config.r_i_close.render(ctx, writer);
+ break;
+ case BBCodeParser.EVENT_UNDERLINE:
+ config.r_u_close.render(ctx, writer);
+ break;
+ case BBCodeParser.EVENT_COLOR:
+ config.r_color_close.render(ctx, writer);
+ break;
+ case BBCodeParser.EVENT_SIZE:
+ config.r_size_close.render(ctx, writer);
+ break;
+ case BBCodeParser.EVENT_QUOTE:
+ config.r_quote_close.render(ctx, writer);
+ break;
+ case BBCodeParser.EVENT_CODE:
+ isInPre--;
+ config.r_code_close.render(ctx, writer);
+ break;
+ case BBCodeParser.EVENT_UNORDERED_LIST:
+ config.r_ulist_close.render(ctx, writer);
+ break;
+ case BBCodeParser.EVENT_NUMERICALLY_ORDERED_LIST:
+ config.r_olist_close.render(ctx, writer);
+ break;
+ case BBCodeParser.EVENT_ALPHABETICALLY_ORDERED_LIST:
+ config.r_olist_close.render(ctx, writer);
+ break;
+ case BBCodeParser.EVENT_ITEM:
+ break;
+ case BBCodeParser.EVENT_LINK:
+ break;
+ }
+ }
+ else
+ {
+ TextEvent textEvent = (TextEvent)event;
+ if (isInPre > 0)
+ {
+ XMLCERP.parse(textEvent.chars(), textEvent.offset(), textEvent.length());
+ }
+ else
+ {
+ tagParser.parse(textEvent.chars(), textEvent.offset(), textEvent.length());
+ }
+ }
+ }
+ };
+
+ public ParseEventHandler tagHandler = new ParseEventHandler()
+ {
+ public void handle(ParseEvent event)
+ {
+ if (event instanceof TagParser.OpenEvent)
+ {
+ TagParser.OpenEvent openEvent = (TagParser.OpenEvent)event;
+ switch (openEvent.getType())
+ {
+ case TagParser.EVENT_TAG:
+ String tag = openEvent.getTag();
+ if (config.print(tag))
+ {
+ if ("pre".equals(tag))
+ {
+ isInPre++;
+ }
+ write("<");
+ write(tag);
+ write(openEvent.getAttribute());
+ write(">");
+ }
+ else if (config.getOuputMode() == ToHTMLConfig.OUTPUT_MODE_DISPLAY)
+ {
+ write("<");
+ write(tag);
+ write(openEvent.getAttribute());
+ write(">");
+ }
+ break;
+ }
+ }
+ else if (event instanceof TagParser.CloseEvent)
+ {
+ TagParser.CloseEvent closeEvent = (TagParser.CloseEvent)event;
+ switch (closeEvent.getType())
+ {
+ case TagParser.EVENT_TAG:
+ String tag = closeEvent.getTag();
+ if (config.print(tag))
+ {
+ if ("pre".equals(tag))
+ {
+ isInPre--;
+ }
+ write("</");
+ write(tag);
+ write(">");
+ }
+ else if (config.getOuputMode() == ToHTMLConfig.OUTPUT_MODE_DISPLAY)
+ {
+ write("</");
+ write(tag);
+ write(">");
+ }
+ break;
+ }
+ }
+ else
+ {
+ TextEvent textEvent = (TextEvent)event;
+ XMLCERP.parse(textEvent.chars(), textEvent.offset(), textEvent.length());
+ }
+ }
+ };
+
+ public ParseEventHandler XMLCRPHandler = new ParseEventHandler()
+ {
+ public void handle(ParseEvent event)
+ {
+ if (event instanceof CharacterEntityReferenceEvent)
+ {
+ CharacterEntityReferenceEvent cere = (CharacterEntityReferenceEvent)event;
+ lineBreakParser.parse(cere.chars(), cere.offset(), cere.length());
+ }
+ else
+ {
+ TextEvent te = (TextEvent)event;
+ HTMLCERP.parse(te.chars(), te.offset(), te.length());
+ }
+ }
+ };
+
+ public ParseEventHandler HTMLCRPHandler = new ParseEventHandler()
+ {
+ public void handle(ParseEvent event)
+ {
+ TextEvent textEvent = (TextEvent)event;
+ lineBreakParser.parse(textEvent.chars(), textEvent.offset(), textEvent.length());
+ }
+ };
+
+ public ParseEventHandler lineBreakHandler = new ParseEventHandler()
+ {
+ public void handle(ParseEvent event)
+ {
+ if (event instanceof TextEvent)
+ {
+ TextEvent textEvent = (TextEvent)event;
+ if (isInPre == 0)
+ {
+ write(textEvent.chars(), textEvent.offset(), textEvent.length());
+ }
+ else
+ {
+ // Break the content in small chunks
+ char[] chars = textEvent.chars();
+ int offset = textEvent.offset();
+ int length = textEvent.length();
+ int maxSize = config.getMaxTextWidth();
+ while (length > maxSize)
+ {
+ write(chars, offset, maxSize);
+ length -= maxSize;
+ offset += maxSize;
+ write("\n");
+ }
+ // Ouput the last chunk
+ write(chars, offset, length);
+ }
+ }
+ else
+ {
+ if (isInPre == 0)
+ {
+ write("<br/>");
+ }
+ else
+ {
+ write("\n");
+ }
+ }
+ }
+ };
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/render/bbcodehtml/ToHTMLRenderer.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/ASCII_CharStream.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/ASCII_CharStream.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/ASCII_CharStream.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,386 @@
+/* Generated By:JavaCC: Do not edit this line. ASCII_CharStream.java Version 0.7pre6 */
+/*****************************************
+ * *
+ * JBoss Portal: The OpenSource Portal *
+ * *
+ * Distributable under LGPL license. *
+ * See terms of license at gnu.org. *
+ * *
+ *****************************************/
+
+package org.jboss.portlet.forums.format.template;
+
+/**
+ * An implementation of interface CharStream, where the stream is assumed to
+ * contain only ASCII characters (without unicode processing).
+ */
+
+public final class ASCII_CharStream
+{
+ public static final boolean staticFlag = false;
+ int bufsize;
+ int available;
+ int tokenBegin;
+ public int bufpos = -1;
+ private int bufline[];
+ private int bufcolumn[];
+
+ private int column = 0;
+ private int line = 1;
+
+ private boolean prevCharIsCR = false;
+ private boolean prevCharIsLF = false;
+
+ private java.io.Reader inputStream;
+
+ private char[] buffer;
+ private int maxNextCharInd = 0;
+ private int inBuf = 0;
+
+ private final void ExpandBuff(boolean wrapAround)
+ {
+ char[] newbuffer = new char[bufsize + 2048];
+ int newbufline[] = new int[bufsize + 2048];
+ int newbufcolumn[] = new int[bufsize + 2048];
+
+ try
+ {
+ if (wrapAround)
+ {
+ System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+ System.arraycopy(buffer, 0, newbuffer,
+ bufsize - tokenBegin, bufpos);
+ buffer = newbuffer;
+
+ System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+ System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
+ bufline = newbufline;
+
+ System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+ System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
+ bufcolumn = newbufcolumn;
+
+ maxNextCharInd = (bufpos += (bufsize - tokenBegin));
+ }
+ else
+ {
+ System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+ buffer = newbuffer;
+
+ System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+ bufline = newbufline;
+
+ System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+ bufcolumn = newbufcolumn;
+
+ maxNextCharInd = (bufpos -= tokenBegin);
+ }
+ }
+ catch (Throwable t)
+ {
+ throw new Error(t.getMessage());
+ }
+
+
+ bufsize += 2048;
+ available = bufsize;
+ tokenBegin = 0;
+ }
+
+ private final void FillBuff() throws java.io.IOException
+ {
+ if (maxNextCharInd == available)
+ {
+ if (available == bufsize)
+ {
+ if (tokenBegin > 2048)
+ {
+ bufpos = maxNextCharInd = 0;
+ available = tokenBegin;
+ }
+ else if (tokenBegin < 0)
+ bufpos = maxNextCharInd = 0;
+ else
+ ExpandBuff(false);
+ }
+ else if (available > tokenBegin)
+ available = bufsize;
+ else if ((tokenBegin - available) < 2048)
+ ExpandBuff(true);
+ else
+ available = tokenBegin;
+ }
+
+ int i;
+ try {
+ if ((i = inputStream.read(buffer, maxNextCharInd,
+ available - maxNextCharInd)) == -1)
+ {
+ inputStream.close();
+ throw new java.io.IOException();
+ }
+ else
+ maxNextCharInd += i;
+ return;
+ }
+ catch(java.io.IOException e) {
+ --bufpos;
+ backup(0);
+ if (tokenBegin == -1)
+ tokenBegin = bufpos;
+ throw e;
+ }
+ }
+
+ public final char BeginToken() throws java.io.IOException
+ {
+ tokenBegin = -1;
+ char c = readChar();
+ tokenBegin = bufpos;
+
+ return c;
+ }
+
+ private final void UpdateLineColumn(char c)
+ {
+ column++;
+
+ if (prevCharIsLF)
+ {
+ prevCharIsLF = false;
+ line += (column = 1);
+ }
+ else if (prevCharIsCR)
+ {
+ prevCharIsCR = false;
+ if (c == '\n')
+ {
+ prevCharIsLF = true;
+ }
+ else
+ line += (column = 1);
+ }
+
+ switch (c)
+ {
+ case '\r' :
+ prevCharIsCR = true;
+ break;
+ case '\n' :
+ prevCharIsLF = true;
+ break;
+ case '\t' :
+ column--;
+ column += (8 - (column & 07));
+ break;
+ default :
+ break;
+ }
+
+ bufline[bufpos] = line;
+ bufcolumn[bufpos] = column;
+ }
+
+ public final char readChar() throws java.io.IOException
+ {
+ if (inBuf > 0)
+ {
+ --inBuf;
+ return (char)((char)0xff & buffer[(bufpos == bufsize - 1) ? (bufpos = 0) : ++bufpos]);
+ }
+
+ if (++bufpos >= maxNextCharInd)
+ FillBuff();
+
+ char c = (char)((char)0xff & buffer[bufpos]);
+
+ UpdateLineColumn(c);
+ return (c);
+ }
+
+ /**
+ * @deprecated
+ * @see #getEndColumn
+ */
+
+ public final int getColumn() {
+ return bufcolumn[bufpos];
+ }
+
+ /**
+ * @deprecated
+ * @see #getEndLine
+ */
+
+ public final int getLine() {
+ return bufline[bufpos];
+ }
+
+ public final int getEndColumn() {
+ return bufcolumn[bufpos];
+ }
+
+ public final int getEndLine() {
+ return bufline[bufpos];
+ }
+
+ public final int getBeginColumn() {
+ return bufcolumn[tokenBegin];
+ }
+
+ public final int getBeginLine() {
+ return bufline[tokenBegin];
+ }
+
+ public final void backup(int amount) {
+
+ inBuf += amount;
+ if ((bufpos -= amount) < 0)
+ bufpos += bufsize;
+ }
+
+ public ASCII_CharStream(java.io.Reader dstream, int startline,
+ int startcolumn, int buffersize)
+ {
+ inputStream = dstream;
+ line = startline;
+ column = startcolumn - 1;
+
+ available = bufsize = buffersize;
+ buffer = new char[buffersize];
+ bufline = new int[buffersize];
+ bufcolumn = new int[buffersize];
+ }
+
+ public ASCII_CharStream(java.io.Reader dstream, int startline,
+ int startcolumn)
+ {
+ this(dstream, startline, startcolumn, 4096);
+ }
+ public void ReInit(java.io.Reader dstream, int startline,
+ int startcolumn, int buffersize)
+ {
+ inputStream = dstream;
+ line = startline;
+ column = startcolumn - 1;
+
+ if (buffer == null || buffersize != buffer.length)
+ {
+ available = bufsize = buffersize;
+ buffer = new char[buffersize];
+ bufline = new int[buffersize];
+ bufcolumn = new int[buffersize];
+ }
+ prevCharIsLF = prevCharIsCR = false;
+ tokenBegin = inBuf = maxNextCharInd = 0;
+ bufpos = -1;
+ }
+
+ public void ReInit(java.io.Reader dstream, int startline,
+ int startcolumn)
+ {
+ ReInit(dstream, startline, startcolumn, 4096);
+ }
+ public ASCII_CharStream(java.io.InputStream dstream, int startline,
+ int startcolumn, int buffersize)
+ {
+ this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
+ }
+
+ public ASCII_CharStream(java.io.InputStream dstream, int startline,
+ int startcolumn)
+ {
+ this(dstream, startline, startcolumn, 4096);
+ }
+
+ public void ReInit(java.io.InputStream dstream, int startline,
+ int startcolumn, int buffersize)
+ {
+ ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
+ }
+ public void ReInit(java.io.InputStream dstream, int startline,
+ int startcolumn)
+ {
+ ReInit(dstream, startline, startcolumn, 4096);
+ }
+ public final String GetImage()
+ {
+ if (bufpos >= tokenBegin)
+ return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
+ else
+ return new String(buffer, tokenBegin, bufsize - tokenBegin) +
+ new String(buffer, 0, bufpos + 1);
+ }
+
+ public final char[] GetSuffix(int len)
+ {
+ char[] ret = new char[len];
+
+ if ((bufpos + 1) >= len)
+ System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
+ else
+ {
+ System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
+ len - bufpos - 1);
+ System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
+ }
+
+ return ret;
+ }
+
+ public void Done()
+ {
+ buffer = null;
+ bufline = null;
+ bufcolumn = null;
+ }
+
+ /**
+ * Method to adjust line and column numbers for the start of a token.<BR>
+ */
+ public void adjustBeginLineColumn(int newLine, int newCol)
+ {
+ int start = tokenBegin;
+ int len;
+
+ if (bufpos >= tokenBegin)
+ {
+ len = bufpos - tokenBegin + inBuf + 1;
+ }
+ else
+ {
+ len = bufsize - tokenBegin + bufpos + 1 + inBuf;
+ }
+
+ int i = 0, j = 0, k = 0;
+ int nextColDiff = 0, columnDiff = 0;
+
+ while (i < len &&
+ bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
+ {
+ bufline[j] = newLine;
+ nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
+ bufcolumn[j] = newCol + columnDiff;
+ columnDiff = nextColDiff;
+ i++;
+ }
+
+ if (i < len)
+ {
+ bufline[j] = newLine++;
+ bufcolumn[j] = newCol + columnDiff;
+
+ while (i++ < len)
+ {
+ if (bufline[j = start % bufsize] != bufline[++start % bufsize])
+ bufline[j] = newLine++;
+ else
+ bufline[j] = newLine;
+ }
+ }
+
+ line = bufline[j];
+ column = bufcolumn[j];
+ }
+
+}
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/AbstractContext.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/AbstractContext.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/AbstractContext.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,47 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.template;
+
+import java.util.Iterator;
+
+/**
+ * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
+ * @version $Revision: 5448 $
+ */
+public abstract class AbstractContext implements Context
+{
+ public Iterator childIterator(String name)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public String get(String o)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public Context put(String key, String value)
+ {
+ throw new UnsupportedOperationException();
+ }
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/AbstractContext.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/BuildException.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/BuildException.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/BuildException.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,56 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.template;
+
+import org.jboss.util.NestedException;
+
+/**
+ * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
+ * @version $Revision: 5448 $
+ */
+public class BuildException
+ extends NestedException
+{
+
+ /** The serialVersionUID */
+ private static final long serialVersionUID = -2549615796913473453L;
+
+ public BuildException()
+ {
+ }
+
+ public BuildException(String message)
+ {
+ super(message);
+ }
+
+ public BuildException(Exception nested)
+ {
+ super(nested);
+ }
+
+ public BuildException(String message, Exception nested)
+ {
+ super(message, nested);
+ }
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/BuildException.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/ChildrenStrategy.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/ChildrenStrategy.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/ChildrenStrategy.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,62 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.template;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
+ * @version $Revision: 5448 $
+ */
+public class ChildrenStrategy
+{
+
+ public ChildrenStrategy(Map children)
+ {
+ this.children = children;
+ }
+
+ private Map children;
+
+ public void append(String name, Context ctx)
+ {
+ List child = (List)children.get(name);
+ if (child == null)
+ {
+ child = new LinkedList();
+ children.put(name, child);
+ }
+ child.add(ctx);
+ }
+
+ public Iterator childIterator(String name)
+ {
+ List child = (List)children.get(name);
+ return child != null ? child.iterator() : Collections.EMPTY_LIST.iterator();
+ }
+
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/ChildrenStrategy.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/Context.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/Context.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/Context.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,80 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.template;
+
+import java.util.Collections;
+import java.util.Iterator;
+
+
+/**
+ * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
+ * @version $Revision: 5448 $
+ */
+public interface Context
+{
+ /** null context */
+ Context NULL_CONTEXT = new AbstractContext()
+ {
+ final Iterator it = Collections.EMPTY_LIST.iterator();
+
+ public Iterator childIterator(String name)
+ {
+ return it;
+ }
+
+ public String get(String key)
+ {
+ return "";
+ }
+
+ public Context put(String key, String value)
+ {
+ return this;
+ }
+ };
+
+ /**
+ * get the template data from the context
+ *
+ * @param key template variable name
+ * @return template value
+ */
+ public String get(String key);
+
+ /**
+ * add data to be rendered in the template through variable substitution
+ *
+ * @param key template variable name
+ * @param value value to render in template
+ * @return context to place data into
+ */
+ public Context put(String key, String value);
+
+ /**
+ * get an iterator for the nested/loop data contexts
+ *
+ * @param name template variable prefix name
+ * @return iterator for the children
+ */
+ Iterator childIterator(String name);
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/Context.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/DelegateContext.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/DelegateContext.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/DelegateContext.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,127 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.template;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+
+/**
+ * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
+ * @version $Revision: 5448 $
+ */
+public class DelegateContext implements Context
+{
+ /** context's children */
+ private ChildrenStrategy children;
+
+ /** template name/value pairs for substitution */
+ private Map delegate;
+
+ /** creates a new DelegateContext object. */
+ public DelegateContext()
+ {
+ this(new HashMap(), new HashMap());
+ }
+
+ /**
+ * creates a new DelegateContext object.
+ *
+ * @param delegate name/value pairs for "root" data
+ * @param children name/value pairs for nested or loop data
+ */
+ public DelegateContext(Map delegate, Map children)
+ {
+ this.delegate = delegate;
+ this.children = new ChildrenStrategy(children);
+ }
+
+ /**
+ * create a new "root" data context and name/value pairs to be used as nested or loop data
+ *
+ * @param children name/value pairs for nested or loop data
+ * @return context to continue adding template data too
+ */
+ public static final DelegateContext createWithChildren(Map children)
+ {
+ return new DelegateContext(new HashMap(), children);
+ }
+
+ /**
+ * create a new data context with already existing name/value pairs
+ *
+ * @param values existing name/value pair map
+ * @return context to continue adding template data too
+ */
+ public static final DelegateContext createWithValues(Map values)
+ {
+ return new DelegateContext(values, new HashMap());
+ }
+
+ /**
+ * add an existing data context into this context for use in template loops or nested template data.
+ *
+ * @param name variable prefix name
+ * @param ctx context to add
+ */
+ public void append(String name, Context ctx)
+ {
+ children.append(name, ctx);
+ }
+
+ /** @see org.jboss.portal.format.template.Context#childIterator(java.lang.String) */
+ public Iterator childIterator(String name)
+ {
+ return children.childIterator(name);
+ }
+
+ /** @see org.jboss.portal.format.template.Context#get(java.lang.String) */
+ public String get(String key)
+ {
+ return (String)delegate.get(key);
+ }
+
+ /**
+ * create a new object to place data for use in template loops or nested template data. tpl var format: {
+ * prefix.VAR_NAME }
+ *
+ * @param name variable prefix name
+ * @return delegate context that will contain the loop or nested data
+ */
+ public DelegateContext next(String name)
+ {
+ DelegateContext ctx = new DelegateContext();
+ append(name, ctx);
+
+ return ctx;
+ }
+
+ /** @see org.jboss.portal.format.template.Context#put(java.lang.String,java.lang.String) */
+ public Context put(String key, String value)
+ {
+ delegate.put(key, value);
+
+ return this;
+ }
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/DelegateContext.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/ParseException.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/ParseException.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/ParseException.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,200 @@
+/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 0.7pre6 */
+/*****************************************
+ * *
+ * JBoss Portal: The OpenSource Portal *
+ * *
+ * Distributable under LGPL license. *
+ * See terms of license at gnu.org. *
+ * *
+ *****************************************/
+
+package org.jboss.portlet.forums.format.template;
+
+/**
+ * This exception is thrown when parse errors are encountered.
+ * You can explicitly create objects of this exception type by
+ * calling the method generateParseException in the generated
+ * parser.
+ *
+ * You can modify this class to customize your error reporting
+ * mechanisms so long as you retain the public fields.
+ */
+public class ParseException extends Exception {
+
+ /**
+ * This constructor is used by the method "generateParseException"
+ * in the generated parser. Calling this constructor generates
+ * a new object of this type with the fields "currentToken",
+ * "expectedTokenSequences", and "tokenImage" set. The boolean
+ * flag "specialConstructor" is also set to true to indicate that
+ * this constructor was used to create this object.
+ * This constructor calls its super class with the empty string
+ * to force the "toString" method of parent class "Throwable" to
+ * print the error message in the form:
+ * ParseException: <result of getMessage>
+ */
+ public ParseException(Token currentTokenVal,
+ int[][] expectedTokenSequencesVal,
+ String[] tokenImageVal
+ )
+ {
+ super("");
+ specialConstructor = true;
+ currentToken = currentTokenVal;
+ expectedTokenSequences = expectedTokenSequencesVal;
+ tokenImage = tokenImageVal;
+ }
+
+ /**
+ * The following constructors are for use by you for whatever
+ * purpose you can think of. Constructing the exception in this
+ * manner makes the exception behave in the normal way - i.e., as
+ * documented in the class "Throwable". The fields "errorToken",
+ * "expectedTokenSequences", and "tokenImage" do not contain
+ * relevant information. The JavaCC generated code does not use
+ * these constructors.
+ */
+
+ public ParseException() {
+ super();
+ specialConstructor = false;
+ }
+
+ public ParseException(String message) {
+ super(message);
+ specialConstructor = false;
+ }
+
+ /**
+ * This variable determines which constructor was used to create
+ * this object and thereby affects the semantics of the
+ * "getMessage" method (see below).
+ */
+ protected boolean specialConstructor;
+
+ /**
+ * This is the last token that has been consumed successfully. If
+ * this object has been created due to a parse error, the token
+ * followng this token will (therefore) be the first error token.
+ */
+ public Token currentToken;
+
+ /**
+ * Each entry in this array is an array of integers. Each array
+ * of integers represents a sequence of tokens (by their ordinal
+ * values) that is expected at this point of the parse.
+ */
+ public int[][] expectedTokenSequences;
+
+ /**
+ * This is a reference to the "tokenImage" array of the generated
+ * parser within which the parse error occurred. This array is
+ * defined in the generated ...Constants interface.
+ */
+ public String[] tokenImage;
+
+ /**
+ * This method has the standard behavior when this object has been
+ * created using the standard constructors. Otherwise, it uses
+ * "currentToken" and "expectedTokenSequences" to generate a parse
+ * error message and returns it. If this object has been created
+ * due to a parse error, and you do not catch it (it gets thrown
+ * from the parser), then this method is called during the printing
+ * of the final stack trace, and hence the correct error message
+ * gets displayed.
+ */
+ public String getMessage() {
+ if (!specialConstructor) {
+ return super.getMessage();
+ }
+ String expected = "";
+ int maxSize = 0;
+ for (int i = 0; i < expectedTokenSequences.length; i++) {
+ if (maxSize < expectedTokenSequences[i].length) {
+ maxSize = expectedTokenSequences[i].length;
+ }
+ for (int j = 0; j < expectedTokenSequences[i].length; j++) {
+ expected += tokenImage[expectedTokenSequences[i][j]] + " ";
+ }
+ if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
+ expected += "...";
+ }
+ expected += eol + " ";
+ }
+ String retval = "Encountered \"";
+ Token tok = currentToken.next;
+ for (int i = 0; i < maxSize; i++) {
+ if (i != 0) retval += " ";
+ if (tok.kind == 0) {
+ retval += tokenImage[0];
+ break;
+ }
+ retval += add_escapes(tok.image);
+ tok = tok.next;
+ }
+ retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn + "." + eol;
+ if (expectedTokenSequences.length == 1) {
+ retval += "Was expecting:" + eol + " ";
+ } else {
+ retval += "Was expecting one of:" + eol + " ";
+ }
+ retval += expected;
+ return retval;
+ }
+
+ /**
+ * The end of line string for this machine.
+ */
+ protected String eol = System.getProperty("line.separator", "\n");
+
+ /**
+ * Used to convert raw characters to their escaped version
+ * when these raw version cannot be used as part of an ASCII
+ * string literal.
+ */
+ protected String add_escapes(String str) {
+ StringBuffer retval = new StringBuffer();
+ char ch;
+ for (int i = 0; i < str.length(); i++) {
+ switch (str.charAt(i))
+ {
+ case 0 :
+ continue;
+ case '\b':
+ retval.append("\\b");
+ continue;
+ case '\t':
+ retval.append("\\t");
+ continue;
+ case '\n':
+ retval.append("\\n");
+ continue;
+ case '\f':
+ retval.append("\\f");
+ continue;
+ case '\r':
+ retval.append("\\r");
+ continue;
+ case '\"':
+ retval.append("\\\"");
+ continue;
+ case '\'':
+ retval.append("\\\'");
+ continue;
+ case '\\':
+ retval.append("\\\\");
+ continue;
+ default:
+ if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+ String s = "0000" + Integer.toString(ch, 16);
+ retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+ } else {
+ retval.append(ch);
+ }
+ continue;
+ }
+ }
+ return retval.toString();
+ }
+
+}
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/Template.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/Template.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/Template.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,60 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.template;
+
+import org.apache.log4j.Logger;
+
+import java.io.StringWriter;
+import java.io.Writer;
+
+/** @author <a href="mailto:julien at jboss.org">Julien Viet</a> */
+public abstract class Template
+{
+
+ public final Logger log = Logger.getLogger(getClass());
+
+ protected final Context local;
+
+ public Template(Context local)
+ {
+ this.local = local;
+ }
+
+ public final String render(Context ctx)
+ {
+ StringWriter writer = new StringWriter();
+ render(ctx, writer);
+ return writer.toString();
+ }
+
+ public final Context getLocalContext()
+ {
+ return local;
+ }
+
+ /** This may be subclassed. */
+ public void render(Context ctx, Writer writer)
+ {
+ }
+
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/Template.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateAnalyzer.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateAnalyzer.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateAnalyzer.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,159 @@
+/* Generated By:JavaCC: Do not edit this line. TemplateAnalyzer.java */
+/*****************************************
+ * *
+ * JBoss Portal: The OpenSource Portal *
+ * *
+ * Distributable under LGPL license. *
+ * See terms of license at gnu.org. *
+ * *
+ *****************************************/
+
+package org.jboss.portlet.forums.format.template;
+
+/**
+ * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
+ */
+public class TemplateAnalyzer implements TemplateAnalyzerConstants {
+
+ public TemplateAnalyzerTokenManager token_source;
+ ASCII_CharStream jj_input_stream;
+ public Token token, jj_nt;
+ private int jj_ntk;
+ private int jj_gen;
+ final private int[] jj_la1 = new int[0];
+ final private int[] jj_la1_0 = {};
+
+ public TemplateAnalyzer(java.io.InputStream stream) {
+ jj_input_stream = new ASCII_CharStream(stream, 1, 1);
+ token_source = new TemplateAnalyzerTokenManager(jj_input_stream);
+ token = new Token();
+ jj_ntk = -1;
+ jj_gen = 0;
+ for (int i = 0; i < 0; i++) jj_la1[i] = -1;
+ }
+
+ public void ReInit(java.io.InputStream stream) {
+ jj_input_stream.ReInit(stream, 1, 1);
+ token_source.ReInit(jj_input_stream);
+ token = new Token();
+ jj_ntk = -1;
+ jj_gen = 0;
+ for (int i = 0; i < 0; i++) jj_la1[i] = -1;
+ }
+
+ public TemplateAnalyzer(java.io.Reader stream) {
+ jj_input_stream = new ASCII_CharStream(stream, 1, 1);
+ token_source = new TemplateAnalyzerTokenManager(jj_input_stream);
+ token = new Token();
+ jj_ntk = -1;
+ jj_gen = 0;
+ for (int i = 0; i < 0; i++) jj_la1[i] = -1;
+ }
+
+ public void ReInit(java.io.Reader stream) {
+ jj_input_stream.ReInit(stream, 1, 1);
+ token_source.ReInit(jj_input_stream);
+ token = new Token();
+ jj_ntk = -1;
+ jj_gen = 0;
+ for (int i = 0; i < 0; i++) jj_la1[i] = -1;
+ }
+
+ public TemplateAnalyzer(TemplateAnalyzerTokenManager tm) {
+ token_source = tm;
+ token = new Token();
+ jj_ntk = -1;
+ jj_gen = 0;
+ for (int i = 0; i < 0; i++) jj_la1[i] = -1;
+ }
+
+ public void ReInit(TemplateAnalyzerTokenManager tm) {
+ token_source = tm;
+ token = new Token();
+ jj_ntk = -1;
+ jj_gen = 0;
+ for (int i = 0; i < 0; i++) jj_la1[i] = -1;
+ }
+
+ final private Token jj_consume_token(int kind) throws ParseException {
+ Token oldToken;
+ if ((oldToken = token).next != null) token = token.next;
+ else token = token.next = token_source.getNextToken();
+ jj_ntk = -1;
+ if (token.kind == kind) {
+ jj_gen++;
+ return token;
+ }
+ token = oldToken;
+ jj_kind = kind;
+ throw generateParseException();
+ }
+
+ final public Token getNextToken() {
+ if (token.next != null) token = token.next;
+ else token = token.next = token_source.getNextToken();
+ jj_ntk = -1;
+ jj_gen++;
+ return token;
+ }
+
+ final public Token getToken(int index) {
+ Token t = token;
+ for (int i = 0; i < index; i++) {
+ if (t.next != null) t = t.next;
+ else t = t.next = token_source.getNextToken();
+ }
+ return t;
+ }
+
+ final private int jj_ntk() {
+ if ((jj_nt=token.next) == null)
+ return (jj_ntk = (token.next=token_source.getNextToken()).kind);
+ else
+ return (jj_ntk = jj_nt.kind);
+ }
+
+ private java.util.Vector jj_expentries = new java.util.Vector();
+ private int[] jj_expentry;
+ private int jj_kind = -1;
+
+ final public ParseException generateParseException() {
+ jj_expentries.removeAllElements();
+ boolean[] la1tokens = new boolean[8];
+ for (int i = 0; i < 8; i++) {
+ la1tokens[i] = false;
+ }
+ if (jj_kind >= 0) {
+ la1tokens[jj_kind] = true;
+ jj_kind = -1;
+ }
+ for (int i = 0; i < 0; i++) {
+ if (jj_la1[i] == jj_gen) {
+ for (int j = 0; j < 32; j++) {
+ if ((jj_la1_0[i] & (1<<j)) != 0) {
+ la1tokens[j] = true;
+ }
+ }
+ }
+ }
+ for (int i = 0; i < 8; i++) {
+ if (la1tokens[i]) {
+ jj_expentry = new int[1];
+ jj_expentry[0] = i;
+ jj_expentries.addElement(jj_expentry);
+ }
+ }
+ int[][] exptokseq = new int[jj_expentries.size()][];
+ for (int i = 0; i < jj_expentries.size(); i++) {
+ exptokseq[i] = (int[])jj_expentries.elementAt(i);
+ }
+ return new ParseException(token, exptokseq, tokenImage);
+ }
+
+ final public void enable_tracing() {
+ }
+
+ final public void disable_tracing() {
+ }
+
+}
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateAnalyzer.jj
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateAnalyzer.jj (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateAnalyzer.jj 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,65 @@
+options
+{
+ STATIC = false;
+}
+
+PARSER_BEGIN(TemplateAnalyzer)
+
+/*****************************************
+ * *
+ * JBoss Portal: The OpenSource Portal *
+ * *
+ * Distributable under LGPL license. *
+ * See terms of license at gnu.org. *
+ * *
+ *****************************************/
+
+package org.jboss.portlet.forums.format.template;
+
+/**
+ * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
+ */
+public class TemplateAnalyzer
+{
+}
+
+PARSER_END(TemplateAnalyzer)
+
+<DEFAULT> TOKEN :
+{
+ <BEGIN: "<!-- BEGIN " (~[" "])+ " -->" >
+}
+
+<DEFAULT> TOKEN :
+{
+ <END: "<!-- END " (~[" "])+ " -->" >
+}
+
+<DEFAULT> TOKEN :
+{
+ <PROPERTY: "${" (~["}"])* "}" >
+}
+
+<DEFAULT> TOKEN :
+{
+ <REF: "{" (<LITTERAL> ".")* <LITTERAL> "}" >
+}
+
+<DEFAULT> TOKEN :
+{
+ <#LITTERAL: (["A"-"Z","a"-"z","0"-"9","-","_"])* >
+}
+
+<DEFAULT> TOKEN :
+{
+ <TEXT: ~["\n"] >
+}
+
+<DEFAULT> TOKEN :
+{
+ <NEWLINE: "\n" >
+}
+
+
+
+
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateAnalyzer.jj
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateAnalyzerConstants.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateAnalyzerConstants.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateAnalyzerConstants.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,37 @@
+/* Generated By:JavaCC: Do not edit this line. TemplateAnalyzerConstants.java */
+/*****************************************
+ * *
+ * JBoss Portal: The OpenSource Portal *
+ * *
+ * Distributable under LGPL license. *
+ * See terms of license at gnu.org. *
+ * *
+ *****************************************/
+
+package org.jboss.portlet.forums.format.template;
+
+public interface TemplateAnalyzerConstants {
+
+ int EOF = 0;
+ int BEGIN = 1;
+ int END = 2;
+ int PROPERTY = 3;
+ int REF = 4;
+ int LITTERAL = 5;
+ int TEXT = 6;
+ int NEWLINE = 7;
+
+ int DEFAULT = 0;
+
+ String[] tokenImage = {
+ "<EOF>",
+ "<BEGIN>",
+ "<END>",
+ "<PROPERTY>",
+ "<REF>",
+ "<LITTERAL>",
+ "<TEXT>",
+ "\"\\n\"",
+ };
+
+}
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateAnalyzerTokenManager.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateAnalyzerTokenManager.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateAnalyzerTokenManager.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,481 @@
+/* Generated By:JavaCC: Do not edit this line. TemplateAnalyzerTokenManager.java */
+/*****************************************
+ * *
+ * JBoss Portal: The OpenSource Portal *
+ * *
+ * Distributable under LGPL license. *
+ * See terms of license at gnu.org. *
+ * *
+ *****************************************/
+
+package org.jboss.portlet.forums.format.template;
+
+public class TemplateAnalyzerTokenManager implements TemplateAnalyzerConstants
+{
+private final int jjStopStringLiteralDfa_0(int pos, long active0)
+{
+ switch (pos)
+ {
+ default :
+ return -1;
+ }
+}
+private final int jjStartNfa_0(int pos, long active0)
+{
+ return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1);
+}
+private final int jjStopAtPos(int pos, int kind)
+{
+ jjmatchedKind = kind;
+ jjmatchedPos = pos;
+ return pos + 1;
+}
+private final int jjStartNfaWithStates_0(int pos, int kind, int state)
+{
+ jjmatchedKind = kind;
+ jjmatchedPos = pos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return pos + 1; }
+ return jjMoveNfa_0(state, pos + 1);
+}
+private final int jjMoveStringLiteralDfa0_0()
+{
+ switch(curChar)
+ {
+ case 10:
+ return jjStopAtPos(0, 7);
+ default :
+ return jjMoveNfa_0(3, 0);
+ }
+}
+private final void jjCheckNAdd(int state)
+{
+ if (jjrounds[state] != jjround)
+ {
+ jjstateSet[jjnewStateCnt++] = state;
+ jjrounds[state] = jjround;
+ }
+}
+private final void jjAddStates(int start, int end)
+{
+ do {
+ jjstateSet[jjnewStateCnt++] = jjnextStates[start];
+ } while (start++ != end);
+}
+private final void jjCheckNAddTwoStates(int state1, int state2)
+{
+ jjCheckNAdd(state1);
+ jjCheckNAdd(state2);
+}
+private final void jjCheckNAddStates(int start, int end)
+{
+ do {
+ jjCheckNAdd(jjnextStates[start]);
+ } while (start++ != end);
+}
+private final void jjCheckNAddStates(int start)
+{
+ jjCheckNAdd(jjnextStates[start]);
+ jjCheckNAdd(jjnextStates[start + 1]);
+}
+static final long[] jjbitVec0 = {
+ 0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
+};
+private final int jjMoveNfa_0(int startState, int curPos)
+{
+ int[] nextStates;
+ int startsAt = 0;
+ jjnewStateCnt = 40;
+ int i = 1;
+ jjstateSet[0] = startState;
+ int j, kind = 0x7fffffff;
+ for (;;)
+ {
+ if (++jjround == 0x7fffffff)
+ ReInitRounds();
+ if (curChar < 64)
+ {
+ long l = 1L << curChar;
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 3:
+ if ((0xfffffffffffffbffL & l) != 0L)
+ {
+ if (kind > 6)
+ kind = 6;
+ }
+ if (curChar == 60)
+ jjAddStates(0, 1);
+ else if (curChar == 36)
+ jjstateSet[jjnewStateCnt++] = 0;
+ break;
+ case 1:
+ jjAddStates(2, 3);
+ break;
+ case 5:
+ if (curChar == 46)
+ jjCheckNAddStates(4, 6);
+ break;
+ case 7:
+ if ((0x3ff200000000000L & l) != 0L)
+ jjCheckNAddStates(7, 10);
+ break;
+ case 8:
+ if ((0x3ff200000000000L & l) != 0L)
+ jjCheckNAddTwoStates(8, 5);
+ break;
+ case 9:
+ if ((0x3ff200000000000L & l) != 0L)
+ jjCheckNAddTwoStates(9, 6);
+ break;
+ case 10:
+ if ((0xfffffffffffffbffL & l) != 0L && kind > 6)
+ kind = 6;
+ break;
+ case 11:
+ if (curChar == 60)
+ jjAddStates(0, 1);
+ break;
+ case 12:
+ if (curChar == 32)
+ jjCheckNAdd(13);
+ break;
+ case 13:
+ if ((0xfffffffeffffffffL & l) != 0L)
+ jjCheckNAddTwoStates(13, 17);
+ break;
+ case 14:
+ if (curChar == 62 && kind > 1)
+ kind = 1;
+ break;
+ case 15:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 14;
+ break;
+ case 16:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 15;
+ break;
+ case 17:
+ if (curChar == 32)
+ jjstateSet[jjnewStateCnt++] = 16;
+ break;
+ case 23:
+ if (curChar == 32)
+ jjstateSet[jjnewStateCnt++] = 22;
+ break;
+ case 24:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 23;
+ break;
+ case 25:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 24;
+ break;
+ case 26:
+ if (curChar == 33)
+ jjstateSet[jjnewStateCnt++] = 25;
+ break;
+ case 27:
+ if (curChar == 32)
+ jjCheckNAdd(28);
+ break;
+ case 28:
+ if ((0xfffffffeffffffffL & l) != 0L)
+ jjCheckNAddTwoStates(28, 32);
+ break;
+ case 29:
+ if (curChar == 62 && kind > 2)
+ kind = 2;
+ break;
+ case 30:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 29;
+ break;
+ case 31:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 30;
+ break;
+ case 32:
+ if (curChar == 32)
+ jjstateSet[jjnewStateCnt++] = 31;
+ break;
+ case 36:
+ if (curChar == 32)
+ jjstateSet[jjnewStateCnt++] = 35;
+ break;
+ case 37:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 36;
+ break;
+ case 38:
+ if (curChar == 45)
+ jjstateSet[jjnewStateCnt++] = 37;
+ break;
+ case 39:
+ if (curChar == 33)
+ jjstateSet[jjnewStateCnt++] = 38;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else if (curChar < 128)
+ {
+ long l = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 3:
+ if (kind > 6)
+ kind = 6;
+ if (curChar == 123)
+ jjCheckNAddStates(4, 6);
+ break;
+ case 0:
+ if (curChar == 123)
+ jjCheckNAddTwoStates(1, 2);
+ break;
+ case 1:
+ if ((0xdfffffffffffffffL & l) != 0L)
+ jjCheckNAddTwoStates(1, 2);
+ break;
+ case 2:
+ if (curChar == 125 && kind > 3)
+ kind = 3;
+ break;
+ case 4:
+ if (curChar == 123)
+ jjCheckNAddStates(4, 6);
+ break;
+ case 6:
+ if (curChar == 125 && kind > 4)
+ kind = 4;
+ break;
+ case 7:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddStates(7, 10);
+ break;
+ case 8:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(8, 5);
+ break;
+ case 9:
+ if ((0x7fffffe87fffffeL & l) != 0L)
+ jjCheckNAddTwoStates(9, 6);
+ break;
+ case 10:
+ if (kind > 6)
+ kind = 6;
+ break;
+ case 13:
+ jjAddStates(11, 12);
+ break;
+ case 18:
+ if (curChar == 78)
+ jjstateSet[jjnewStateCnt++] = 12;
+ break;
+ case 19:
+ if (curChar == 73)
+ jjstateSet[jjnewStateCnt++] = 18;
+ break;
+ case 20:
+ if (curChar == 71)
+ jjstateSet[jjnewStateCnt++] = 19;
+ break;
+ case 21:
+ if (curChar == 69)
+ jjstateSet[jjnewStateCnt++] = 20;
+ break;
+ case 22:
+ if (curChar == 66)
+ jjstateSet[jjnewStateCnt++] = 21;
+ break;
+ case 28:
+ jjAddStates(13, 14);
+ break;
+ case 33:
+ if (curChar == 68)
+ jjstateSet[jjnewStateCnt++] = 27;
+ break;
+ case 34:
+ if (curChar == 78)
+ jjstateSet[jjnewStateCnt++] = 33;
+ break;
+ case 35:
+ if (curChar == 69)
+ jjstateSet[jjnewStateCnt++] = 34;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else
+ {
+ int i2 = (curChar & 0xff) >> 6;
+ long l2 = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 3:
+ if ((jjbitVec0[i2] & l2) != 0L && kind > 6)
+ kind = 6;
+ break;
+ case 1:
+ if ((jjbitVec0[i2] & l2) != 0L)
+ jjAddStates(2, 3);
+ break;
+ case 13:
+ if ((jjbitVec0[i2] & l2) != 0L)
+ jjAddStates(11, 12);
+ break;
+ case 28:
+ if ((jjbitVec0[i2] & l2) != 0L)
+ jjAddStates(13, 14);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ if (kind != 0x7fffffff)
+ {
+ jjmatchedKind = kind;
+ jjmatchedPos = curPos;
+ kind = 0x7fffffff;
+ }
+ ++curPos;
+ if ((i = jjnewStateCnt) == (startsAt = 40 - (jjnewStateCnt = startsAt)))
+ return curPos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return curPos; }
+ }
+}
+static final int[] jjnextStates = {
+ 26, 39, 1, 2, 5, 6, 7, 8, 5, 9, 6, 13, 17, 28, 32,
+};
+public static final String[] jjstrLiteralImages = {
+"", null, null, null, null, null, null, "\12", };
+public static final String[] lexStateNames = {
+ "DEFAULT",
+};
+private ASCII_CharStream input_stream;
+private final int[] jjrounds = new int[40];
+private final int[] jjstateSet = new int[80];
+protected char curChar;
+public TemplateAnalyzerTokenManager(ASCII_CharStream stream)
+{
+ if (ASCII_CharStream.staticFlag)
+ throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
+ input_stream = stream;
+}
+public TemplateAnalyzerTokenManager(ASCII_CharStream stream, int lexState)
+{
+ this(stream);
+ SwitchTo(lexState);
+}
+public void ReInit(ASCII_CharStream stream)
+{
+ jjmatchedPos = jjnewStateCnt = 0;
+ curLexState = defaultLexState;
+ input_stream = stream;
+ ReInitRounds();
+}
+private final void ReInitRounds()
+{
+ int i;
+ jjround = 0x80000001;
+ for (i = 40; i-- > 0;)
+ jjrounds[i] = 0x80000000;
+}
+public void ReInit(ASCII_CharStream stream, int lexState)
+{
+ ReInit(stream);
+ SwitchTo(lexState);
+}
+public void SwitchTo(int lexState)
+{
+ if (lexState >= 1 || lexState < 0)
+ throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
+ else
+ curLexState = lexState;
+}
+
+private final Token jjFillToken()
+{
+ Token t = Token.newToken(jjmatchedKind);
+ t.kind = jjmatchedKind;
+ String im = jjstrLiteralImages[jjmatchedKind];
+ t.image = (im == null) ? input_stream.GetImage() : im;
+ t.beginLine = input_stream.getBeginLine();
+ t.beginColumn = input_stream.getBeginColumn();
+ t.endLine = input_stream.getEndLine();
+ t.endColumn = input_stream.getEndColumn();
+ return t;
+}
+
+int curLexState = 0;
+int defaultLexState = 0;
+int jjnewStateCnt;
+int jjround;
+int jjmatchedPos;
+int jjmatchedKind;
+
+public final Token getNextToken()
+{
+ int kind;
+ Token specialToken = null;
+ Token matchedToken;
+ int curPos = 0;
+
+ EOFLoop :
+ for (;;)
+ {
+ try
+ {
+ curChar = input_stream.BeginToken();
+ }
+ catch(java.io.IOException e)
+ {
+ jjmatchedKind = 0;
+ matchedToken = jjFillToken();
+ return matchedToken;
+ }
+
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_0();
+ if (jjmatchedKind != 0x7fffffff)
+ {
+ if (jjmatchedPos + 1 < curPos)
+ input_stream.backup(curPos - jjmatchedPos - 1);
+ matchedToken = jjFillToken();
+ return matchedToken;
+ }
+ int error_line = input_stream.getEndLine();
+ int error_column = input_stream.getEndColumn();
+ String error_after = null;
+ boolean EOFSeen = false;
+ try { input_stream.readChar(); input_stream.backup(1); }
+ catch (java.io.IOException e1) {
+ EOFSeen = true;
+ error_after = curPos <= 1 ? "" : input_stream.GetImage();
+ if (curChar == '\n' || curChar == '\r') {
+ error_line++;
+ error_column = 0;
+ }
+ else
+ error_column++;
+ }
+ if (!EOFSeen) {
+ input_stream.backup(1);
+ error_after = curPos <= 1 ? "" : input_stream.GetImage();
+ }
+ throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
+ }
+}
+
+}
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateBuilder.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateBuilder.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateBuilder.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,206 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.template;
+
+import javassist.CannotCompileException;
+import javassist.ClassPool;
+import javassist.CtClass;
+import javassist.CtConstructor;
+import javassist.CtField;
+import javassist.CtMethod;
+import javassist.CtNewMethod;
+import javassist.LoaderClassPath;
+import javassist.Modifier;
+import javassist.NotFoundException;
+import org.apache.log4j.Logger;
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.Node;
+import org.dom4j.Text;
+
+import java.io.Writer;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Set;
+
+/** @author <a href="mailto:julien at jboss.org">Julien Viet</a> */
+public class TemplateBuilder
+{
+
+ private static final String CONTEXT = Context.class.getName();
+ private static final String ITERATOR = Iterator.class.getName();
+
+ private final ClassPool pool;
+ private final Element node;
+ private final int index;
+ private final Logger log;
+ private final Set propertyNames;
+ private CtClass cc;
+
+ public static int classNameCounter = 0;
+
+ public TemplateBuilder(Document doc, Set propertyNames)
+ {
+ this(doc.getRootElement(), propertyNames);
+ }
+
+ public TemplateBuilder(Element node, Set propertyNames)
+ {
+ this(new ClassPool(null), node, propertyNames);
+ pool.appendClassPath(new LoaderClassPath(Thread.currentThread().getContextClassLoader()));
+ }
+
+ public TemplateBuilder(ClassPool pool, Document doc, Set names)
+ {
+ this(pool, doc.getRootElement(), names);
+ }
+
+ public TemplateBuilder(ClassPool pool, Element node, Set names)
+ {
+ this.index = classNameCounter++;
+ this.pool = pool;
+ this.node = node;
+ this.propertyNames = names;
+ this.log = Logger.getLogger(getClass() + "." + index);
+ }
+
+ public CtClass getGeneratedClass()
+ {
+ return cc;
+ }
+
+ public void build() throws BuildException
+ {
+ try
+ {
+ cc = pool.makeClass("org.jboss.nukes.common.template.Generated" + index);
+ cc.setSuperclass(pool.get(Template.class.getName()));
+ cc.setModifiers(Modifier.PUBLIC);
+
+ addConstructor();
+ implementRender();
+ }
+ catch (CannotCompileException e)
+ {
+ throw new BuildException("Unexpected error, cannot build template", e);
+ }
+ catch (NotFoundException e)
+ {
+ throw new BuildException("Unexpected error, cannot build template", e);
+ }
+ }
+
+ private void addConstructor() throws CannotCompileException, NotFoundException
+ {
+ CtConstructor ctor = new CtConstructor(new CtClass[]{pool.get(CONTEXT)}, cc);
+ ctor.setBody("{ super($1); }");
+ cc.addConstructor(ctor);
+ log.debug("Added constructor on template " + cc.getName());
+ }
+
+ private void implementRender() throws CannotCompileException, NotFoundException
+ {
+ LinkedList stack = new LinkedList();
+ stack.add("");
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("public void render(").append(Context.class.getName()).append(" ctx, ").append(Writer.class.getName()).append(" writer)\n").
+ append("{\n").
+ append(" ").append(CONTEXT).append(" ctx_ = $1;\n");
+ generateRender(stack, buffer, " ", node);
+ buffer.append("}\n");
+ String code = buffer.toString();
+ CtMethod method = CtNewMethod.make(code, cc);
+ cc.addMethod(method);
+ CtField gc = new CtField(pool.get(String.class.getName()), "_generated_code", cc);
+ gc.setModifiers(Modifier.PUBLIC | Modifier.STATIC);
+ CtField.Initializer initializer = CtField.Initializer.constant(code);
+ cc.addField(gc, initializer);
+ log.debug("Created render method on template " + cc.getName() + " with body " + code);
+ }
+
+ private void generateRender(LinkedList stack, StringBuffer buffer, String indent, Element node)
+ {
+ buffer.append(indent).append("String s_").append(stack.size()).append(" = null;\n");
+ for (Iterator i = node.content().iterator(); i.hasNext();)
+ {
+ Node item = (Node)i.next();
+ if (item instanceof Text)
+ {
+ String text = item.getText().trim();
+ text = org.jboss.portal.common.util.Tools.replace(text, "\n", "\\n");
+ text = org.jboss.portal.common.util.Tools.replace(text, "\"", "\\\"");
+ buffer.append(indent).append("$2.write(\"").append(text).append("\");\n");
+ }
+ else if (item instanceof Element)
+ {
+ Element elt = (Element)item;
+ if ("loop".equals(elt.getName()))
+ {
+ String name = elt.attributeValue("name");
+ String iterator = "it_" + name;
+ String context = "ctx_" + name;
+ buffer.append(indent).append("for (").append(ITERATOR).append(" ").append(iterator).append(" = ").append("ctx_").append(stack.getLast()).append(".childIterator(\"").append(name).append("\");").
+ append(iterator).append(".hasNext();").
+ append(")\n").
+ append(indent).append("{\n").
+ append(indent).append(" ").append(CONTEXT).append(" ").append(context).append(" = (").append(CONTEXT).append(")").append(iterator).append(".next();\n");
+ stack.add(name);
+ generateRender(stack, buffer, indent + " ", elt.element("node"));
+ stack.removeLast();
+ buffer.append(indent).append("}\n");
+ }
+ else if ("ref".equals(elt.getName()))
+ {
+ String name = elt.attributeValue("name");
+ int depth = Integer.parseInt(elt.attributeValue("depth"));
+ String target = null;
+ if (depth == 0)
+ {
+ target = propertyNames.contains(name) ? "$0.local" : "ctx_";
+ }
+ else
+ {
+ target = "ctx_" + (String)stack.get(depth);
+ }
+ if (target != null)
+ {
+ buffer.append(indent).append("s_").append(stack.size()).append(" = (java.lang.String)").append(target).append(".get(\"").append(name).append("\");\n").
+ append(indent).append("if (s_").append(stack.size()).append(" != null)\n").
+ append(indent).append("{\n").
+ append(indent).append(" $2.write(s_").append(stack.size()).append(");\n").
+ append(indent).append("}\n").
+ append(indent).append("else if (log.isDebugEnabled())\n").
+ append(indent).append("{\n").
+ append(indent).append(" log.debug(\"field ").append(name).append(" is null\");\n").
+ append(indent).append("}\n");
+ }
+ else
+ {
+// log.warn("Path not usable ");
+ }
+ }
+ }
+ }
+ }
+
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateBuilder.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateLoader.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateLoader.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateLoader.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,180 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.template;
+
+import org.dom4j.Document;
+import org.jboss.portlet.forums.format.util.CLLoader;
+import org.jboss.portlet.forums.format.util.Loader;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.Set;
+
+/**
+ * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
+ * @version $Revision: 7374 $
+ */
+public class TemplateLoader extends TemplateRepository
+{
+
+ private Loader loader;
+// private Map defaults = new HashMap();
+
+ public TemplateLoader(Loader loader)
+ {
+ setLoader(loader);
+ }
+
+ public Loader getLoader()
+ {
+ return loader;
+ }
+
+ public void setLoader(Loader loader)
+ {
+ if (loader == null)
+ {
+ throw new IllegalArgumentException("loader cannot be null");
+ }
+ this.loader = loader;
+ }
+
+// public void load(String name)
+// {
+// InputStream in = loader.load(name + ".properties");
+// if (in != null)
+// {
+// Properties props = new Properties();
+// }
+// else
+// {
+//
+// }
+// }
+
+// /**
+// * Creates a template instance.
+// */
+// public Template createTemplate(String name)
+// {
+// Properties props = (Properties)defaults.get(name);
+// Context ctx = Context.NULL_CONTEXT;
+// if (props != null)
+// {
+// ctx = new HashContext();
+// ctx.putAll(props);
+// }
+// return createTemplate(name, ctx);
+// }
+
+// public void addTemplate(String name)
+// {
+// addTemplate(name, name);
+// }
+//
+//
+
+ public void addTemplate(String name, String loadName) throws BuildException
+ {
+ Document doc = loadTemplate(loadName);
+ addTemplate(name, doc);
+ }
+
+ public void addTemplate(String name, String loadName, Set names) throws BuildException
+ {
+ Document doc = loadTemplate(loadName);
+ addTemplate(name, doc, names);
+ }
+
+// public void addSubTemplate(String templateName, String loadName, String xpath, Set names)
+// {
+// Document template = loadTemplate(loadName);
+// addTemplate(templateName, (Element)template.selectSingleNode(xpath), names);
+// }
+
+// public void addSubTemplate(String templateName, String loadName, String xpath)
+// {
+// InputStream pin = null;
+// try
+// {
+// Properties props = new Properties();
+// pin = loader.loadProperties(loadName);
+// if (pin != null)
+// {
+// defaults.put(loadName, props);
+// props.load(pin);
+// }
+// addSubTemplate(templateName, props.keySet());
+// }
+// catch(IOException e)
+// {
+// e.printStackTrace();
+// }
+// finally
+// {
+// Tools.safeClose(pin);
+// }
+// }
+
+ /** Simply loads a template and returns it. */
+ public Document loadTemplate(String name) throws BuildException
+ {
+ InputStream tin = null;
+ try
+ {
+ tin = loader.load(name);
+ if (tin != null)
+ {
+ Reader reader = new InputStreamReader(tin);
+ TemplateParser parser = new TemplateParser(reader);
+ return parser.parse();
+ }
+ else
+ {
+ throw new BuildException("Template " + name + " not found");
+ }
+ }
+ catch (ParseException e)
+ {
+ throw new BuildException("Cannot parse the template source " + name, e);
+ }
+ finally
+ {
+ try
+ {
+ tin.close();
+ }
+ catch (IOException e)
+ {
+ throw new BuildException("Could not close templates InputStreamReader."+name,e);
+ }
+ }
+ }
+
+ public static TemplateLoader create(ClassLoader cl, String base)
+ {
+ return new TemplateLoader(new CLLoader(cl, base));
+ }
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateLoader.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateParser.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateParser.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateParser.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,192 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.template;
+
+import org.dom4j.Document;
+import org.dom4j.DocumentFactory;
+import org.dom4j.Element;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.LinkedList;
+
+/** @author <a href="mailto:julien at jboss.org">Julien Viet</a> */
+public final class TemplateParser
+ implements TemplateAnalyzerConstants
+{
+
+ private Reader source;
+ private TemplateAnalyzerTokenManager analyzer;
+ private LinkedList stack = new LinkedList();
+ private Document template;
+ private Element current;
+ private StringBuffer text = null;
+
+ public TemplateParser(File source) throws FileNotFoundException
+ {
+ this(new FileReader(source));
+ }
+
+ public TemplateParser(String source)
+ {
+ this(new StringReader(source));
+ }
+
+ public TemplateParser(Reader source)
+ {
+ this.source = source;
+ analyzer = new TemplateAnalyzerTokenManager(new ASCII_CharStream(source, 1, 1));
+ template = DocumentFactory.getInstance().createDocument();
+ current = template.addElement("node");
+ }
+
+ /** This method should be called only once. If it is called more than once there are no garanty on the result. */
+ public Document parse() throws ParseException
+ {
+ while (true)
+ {
+ // getChild the next token
+ Token t = analyzer.getNextToken();
+
+ if (t.image.length() == 0)
+ {
+ if (text != null)
+ {
+ current.addText(text.toString());
+ text = null;
+ }
+
+ // no more token to read
+ if (current != template.getRootElement())
+ {
+ throw new ParseException("An opening loop is not closed");
+ }
+ return template;
+ }
+
+ switch (t.kind)
+ {
+ case BEGIN:
+ if (text != null)
+ {
+ current.addText(text.toString());
+ text = null;
+ }
+ Element loop = current.addElement("loop");
+ loop.addAttribute("name", t.image.substring("<!-- BEGIN ".length(), t.image.length() - " -->".length()));
+ push(loop.addElement("node"));
+ break;
+
+ case END:
+ if (text != null)
+ {
+ current.addText(text.toString());
+ text = null;
+ }
+ if (!"node".equals(current.getName()))
+ {
+ throw new ParseException("Unexpected closing loop");
+ }
+ pop();
+// if (!((Loop)current.getContent().getLast()).validate(t.image))
+// {
+// throw new ParseException("Closing loop does not match");
+// }
+ break;
+
+ case PROPERTY:
+ case TEXT:
+ if (text == null)
+ {
+ text = new StringBuffer();
+ }
+ text.append(t.image);
+ break;
+ case NEWLINE:
+ if (text == null)
+ {
+ text = new StringBuffer();
+ }
+ text.append("\n");
+ break;
+
+
+ case REF:
+ if (text != null)
+ {
+ current.addText(text.toString());
+ text = null;
+ }
+ Element ref = current.addElement("ref");
+ String tmp = t.image.substring(1, t.image.length() - 1);
+ int count = 0;
+ int previous = -1;
+ while (true)
+ {
+ int index = tmp.indexOf('.', previous + 1);
+ if (index == -1)
+ {
+ String name = tmp.substring(previous + 1);
+ ref.addAttribute("name", name);
+ break;
+ }
+ count++;
+ previous = index;
+ }
+ ref.addAttribute("depth", "" + count);
+ break;
+
+ default:
+ throw new ParseException("Unexpected token");
+ }
+ }
+ }
+
+ public void close()
+ {
+ try
+ {
+ source.close();
+ }
+ catch (IOException ignore)
+ {
+ //
+ }
+ }
+
+ private void push(Element node)
+ {
+ stack.addLast(current);
+ current = node;
+ }
+
+ private void pop()
+ {
+ current = (Element)stack.removeLast();
+ }
+
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateParser.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateRepository.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateRepository.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateRepository.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,198 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.template;
+
+import javassist.CannotCompileException;
+import javassist.CtClass;
+import org.apache.log4j.Logger;
+import org.dom4j.Document;
+import org.dom4j.Element;
+
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/** @author <a href="mailto:julien at jboss.org">Julien Viet</a> */
+public class TemplateRepository
+{
+
+ /** The class logger. */
+ private final Logger log = Logger.getLogger(getClass());
+
+ /** Template name -> template object. */
+ private Map templates = new HashMap();
+
+ /** Template name -> Class object. */
+ private Map classes = new HashMap();
+
+ /** Compile the template definitions to bytecode. */
+ private TemplateClassLoader tcl = new TemplateClassLoader(Thread.currentThread().getContextClassLoader());
+
+ public TemplateRepository()
+ {
+ }
+
+ public Template createTemplate(String name)
+ {
+ return createTemplate(name, Context.NULL_CONTEXT);
+ }
+
+ /**
+ * Creates a new template instance.
+ *
+ * @param name the template name
+ * @param ctx the context with the template properties
+ * @return the template instance or null if it is not found
+ */
+ public Template createTemplate(String name, Context ctx)
+ {
+ Template template = null;
+ try
+ {
+ Class clazz = (Class)classes.get(name);
+ if (clazz != null)
+ {
+ Constructor ctor = clazz.getConstructor(new Class[]{Context.class});
+ template = (Template)ctor.newInstance(new Object[]{ctx});
+ }
+ else
+ {
+ log.warn("Template " + name + " not found");
+ }
+ }
+ catch (Exception e)
+ {
+ log.error("Cannot instantiate template " + name, e);
+ throw new RuntimeException("An unexpected exception occured during the template instantiation");
+ }
+ return template;
+ }
+
+ public void addTemplate(String name, Document doc) throws BuildException
+ {
+ addTemplate(name, doc, Collections.EMPTY_SET);
+ }
+
+ public void addTemplate(String name, Element node) throws BuildException
+ {
+ addTemplate(name, node, Collections.EMPTY_SET);
+ }
+
+ public void addTemplate(String name, Document doc, Set names) throws BuildException
+ {
+ addTemplate(name, doc.getRootElement(), names);
+ }
+
+ public void addTemplate(String name, Element node, Set names) throws BuildException
+ {
+ // Keep the original template
+ templates.put(name, node);
+ log.debug("Loaded template " + name);
+
+ // Generate the class
+ Class clazz = generate(node, names);
+ log.debug("Template " + name + " generated " + clazz.getName());
+
+ // Save the class for later
+ classes.put(name, clazz);
+ }
+
+ private Class generate(Element node, Set names) throws BuildException
+ {
+ try
+ {
+ // This is the classloader that will load the template
+ String className = tcl.addTemplate(node, names);
+
+ // Return the class corresponding to the template
+ return tcl.loadClass(className);
+ }
+ catch (ClassNotFoundException e)
+ {
+ throw new BuildException("Unexpected error, cannot compile template", e);
+ }
+ }
+
+ public void clear()
+ {
+ classes.clear();
+ templates.clear();
+ tcl = new TemplateClassLoader(Thread.currentThread().getContextClassLoader());
+ }
+
+ public static class TemplateClassLoader extends ClassLoader
+ {
+
+ private final Map classes;
+
+ public TemplateClassLoader(ClassLoader parent)
+ {
+ super(parent);
+ this.classes = new HashMap();
+ }
+
+ public String addTemplate(Document doc, Set names) throws BuildException
+ {
+ return addTemplate(doc.getRootElement(), names);
+ }
+
+ public String addTemplate(Element node, Set names) throws BuildException
+ {
+ try
+ {
+ TemplateBuilder builder = new TemplateBuilder(node, names);
+ builder.build();
+ CtClass cc = builder.getGeneratedClass();
+ classes.put(cc.getName(), cc.toBytecode());
+ return cc.getName();
+ }
+ catch (IOException e)
+ {
+ throw new BuildException("Unexpected error cannot compile template", e);
+ }
+ catch (CannotCompileException e)
+ {
+ throw new BuildException("Unexpected error cannot compile template", e);
+ }
+ }
+
+ public Collection getClassNames()
+ {
+ return Collections.unmodifiableCollection(classes.keySet());
+ }
+
+ protected Class findClass(String name) throws ClassNotFoundException
+ {
+ byte[] bytes = (byte[])classes.get(name);
+ if (bytes == null)
+ {
+ throw new ClassNotFoundException("Class " + name + " does not exists");
+ }
+ return defineClass(name, bytes, 0, bytes.length);
+ }
+ }
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TemplateRepository.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/Token.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/Token.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/Token.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,90 @@
+/* Generated By:JavaCC: Do not edit this line. Token.java Version 0.7pre3 */
+/*****************************************
+ * *
+ * JBoss Portal: The OpenSource Portal *
+ * *
+ * Distributable under LGPL license. *
+ * See terms of license at gnu.org. *
+ * *
+ *****************************************/
+
+package org.jboss.portlet.forums.format.template;
+
+/**
+ * Describes the input token stream.
+ */
+
+public class Token {
+
+ /**
+ * An integer that describes the kind of this token. This numbering
+ * system is determined by JavaCCParser, and a table of these numbers is
+ * stored in the file ...Constants.java.
+ */
+ public int kind;
+
+ /**
+ * beginLine and beginColumn describe the position of the first character
+ * of this token; endLine and endColumn describe the position of the
+ * last character of this token.
+ */
+ public int beginLine, beginColumn, endLine, endColumn;
+
+ /**
+ * The string image of the token.
+ */
+ public String image;
+
+ /**
+ * A reference to the next regular (non-special) token from the input
+ * stream. If this is the last token from the input stream, or if the
+ * token manager has not read tokens beyond this one, this field is
+ * set to null. This is true only if this token is also a regular
+ * token. Otherwise, see below for a description of the contents of
+ * this field.
+ */
+ public Token next;
+
+ /**
+ * This field is used to access special tokens that occur prior to this
+ * token, but after the immediately preceding regular (non-special) token.
+ * If there are no such special tokens, this field is set to null.
+ * When there are more than one such special token, this field refers
+ * to the last of these special tokens, which in turn refers to the next
+ * previous special token through its specialToken field, and so on
+ * until the first special token (whose specialToken field is null).
+ * The next fields of special tokens refer to other special tokens that
+ * immediately follow it (without an intervening regular token). If there
+ * is no such token, this field is null.
+ */
+ public Token specialToken;
+
+ /**
+ * Returns the image.
+ */
+ public final String toString()
+ {
+ return image;
+ }
+
+ /**
+ * Returns a new Token object, by default. However, if you want, you
+ * can create and return subclass objects based on the value of ofKind.
+ * Simply add the cases to the switch for all those special cases.
+ * For example, if you have a subclass of Token called IDToken that
+ * you want to create if ofKind is ID, simlpy add something like :
+ *
+ * case MyParserConstants.ID : return new IDToken();
+ *
+ * to the following switch statement. Then you can cast matchedToken
+ * variable to the appropriate type and use it in your lexical actions.
+ */
+ public static final Token newToken(int ofKind)
+ {
+ switch(ofKind)
+ {
+ default : return new Token();
+ }
+ }
+
+}
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TokenMgrError.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TokenMgrError.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/template/TokenMgrError.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,142 @@
+/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 0.7pre2 */
+/*****************************************
+ * *
+ * JBoss Portal: The OpenSource Portal *
+ * *
+ * Distributable under LGPL license. *
+ * See terms of license at gnu.org. *
+ * *
+ *****************************************/
+
+package org.jboss.portlet.forums.format.template;
+
+public class TokenMgrError extends Error
+{
+ /*
+ * Ordinals for various reasons why an Error of this type can be thrown.
+ */
+
+ /**
+ * Lexical error occured.
+ */
+ static final int LEXICAL_ERROR = 0;
+
+ /**
+ * An attempt wass made to create a second instance of a static token manager.
+ */
+ static final int STATIC_LEXER_ERROR = 1;
+
+ /**
+ * Tried to change to an invalid lexical state.
+ */
+ static final int INVALID_LEXICAL_STATE = 2;
+
+ /**
+ * Detected (and bailed out of) an infinite loop in the token manager.
+ */
+ static final int LOOP_DETECTED = 3;
+
+ /**
+ * Indicates the reason why the exception is thrown. It will have
+ * one of the above 4 values.
+ */
+ int errorCode;
+
+ /**
+ * Replaces unprintable characters by their espaced (or unicode escaped)
+ * equivalents in the given string
+ */
+ protected static final String addEscapes(String str) {
+ StringBuffer retval = new StringBuffer();
+ char ch;
+ for (int i = 0; i < str.length(); i++) {
+ switch (str.charAt(i))
+ {
+ case 0 :
+ continue;
+ case '\b':
+ retval.append("\\b");
+ continue;
+ case '\t':
+ retval.append("\\t");
+ continue;
+ case '\n':
+ retval.append("\\n");
+ continue;
+ case '\f':
+ retval.append("\\f");
+ continue;
+ case '\r':
+ retval.append("\\r");
+ continue;
+ case '\"':
+ retval.append("\\\"");
+ continue;
+ case '\'':
+ retval.append("\\\'");
+ continue;
+ case '\\':
+ retval.append("\\\\");
+ continue;
+ default:
+ if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+ String s = "0000" + Integer.toString(ch, 16);
+ retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+ } else {
+ retval.append(ch);
+ }
+ continue;
+ }
+ }
+ return retval.toString();
+ }
+
+ /**
+ * Returns a detailed message for the Error when it is thrown by the
+ * token manager to indicate a lexical error.
+ * Parameters :
+ * EOFSeen : indicates if EOF caused the lexicl error
+ * curLexState : lexical state in which this error occured
+ * errorLine : line number when the error occured
+ * errorColumn : column number when the error occured
+ * errorAfter : prefix that was seen before this error occured
+ * curchar : the offending character
+ * Note: You can customize the lexical error message by modifying this method.
+ */
+ private static final String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
+ return("Lexical error at line " +
+ errorLine + ", column " +
+ errorColumn + ". Encountered: " +
+ (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
+ "after : \"" + addEscapes(errorAfter) + "\"");
+ }
+
+ /**
+ * You can also modify the body of this method to customize your error messages.
+ * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
+ * of end-users concern, so you can return something like :
+ *
+ * "Internal Error : Please file a bug report .... "
+ *
+ * from this method for such cases in the release version of your parser.
+ */
+ public String getMessage() {
+ return super.getMessage();
+ }
+
+ /*
+ * Constructors of various flavors follow.
+ */
+
+ public TokenMgrError() {
+ }
+
+ public TokenMgrError(String message, int reason) {
+ super(message);
+ errorCode = reason;
+ }
+
+ public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
+ this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
+ }
+}
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/util/CLLoader.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/util/CLLoader.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/util/CLLoader.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,74 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.util;
+
+import java.io.InputStream;
+
+/**
+ * Loader implementation that loads through a ClassLoader.
+ *
+ * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
+ * @version $Revision: 5448 $
+ */
+public class CLLoader implements Loader
+{
+
+ private final ClassLoader cl;
+ private String base;
+
+ public CLLoader()
+ {
+ this(Thread.currentThread().getContextClassLoader(), null);
+ }
+
+ public CLLoader(ClassLoader cl, String base)
+ {
+ this.cl = cl;
+ setBase(base);
+ }
+
+ public CLLoader(ClassLoader cl)
+ {
+ this(cl, null);
+ }
+
+ public CLLoader(String base)
+ {
+ this(Thread.currentThread().getContextClassLoader(), base);
+ }
+
+ public String getBase()
+ {
+ return base;
+ }
+
+ public void setBase(String base)
+ {
+ this.base = base != null ? base : "";
+ }
+
+ public InputStream load(String name)
+ {
+ return cl.getResourceAsStream(base.length() == 0 ? name.substring(1) : base + name);
+ }
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/util/CLLoader.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/util/EntityTable.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/util/EntityTable.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/util/EntityTable.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,366 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.util;
+
+/** This table provides lookup for converting a char to its HTML entity representation. */
+public class EntityTable
+{
+
+ /** All HTML entities. */
+ public static final EntityTable FULL = new EntityTable();
+
+ /** All HTML entities except the HTML chars which are used to do HTML itself. */
+ public static final EntityTable BASIC = new BasicEntityTable();
+
+ private static class BasicEntityTable extends EntityTable
+ {
+ public BasicEntityTable()
+ {
+ remove('<');
+ remove('>');
+ remove('"');
+ remove('&');
+ }
+ }
+
+ private String[] charToEntity = new String[65536];
+
+ protected EntityTable()
+ {
+ put(160, "nbsp");
+ put(161, "iexcl");
+ put(162, "cent");
+ put(163, "pound");
+ put(164, "curren");
+ put(165, "yen");
+ put(166, "brvbar");
+ put(167, "sect");
+ put(168, "uml");
+ put(169, "copy");
+ put(170, "ordf");
+ put(171, "laquo");
+ put(172, "not");
+ put(173, "shy");
+ put(174, "reg");
+ put(175, "macr");
+ put(176, "deg");
+ put(177, "plusmn");
+ put(178, "sup2");
+ put(179, "sup3");
+ put(180, "acute");
+ put(181, "micro");
+ put(182, "para");
+ put(183, "middot");
+ put(184, "cedil");
+ put(185, "sup1");
+ put(186, "ordm");
+ put(187, "raquo");
+ put(188, "frac14");
+ put(189, "frac12");
+ put(190, "frac34");
+ put(191, "iquest");
+ put(192, "Agrave");
+ put(193, "Aacute");
+ put(194, "Acirc");
+ put(195, "Atilde");
+ put(196, "Auml");
+ put(197, "Aring");
+ put(198, "AElig");
+ put(199, "Ccedil");
+ put(200, "Egrave");
+ put(201, "Eacute");
+ put(202, "Ecirc");
+ put(203, "Euml");
+ put(204, "Igrave");
+ put(205, "Iacute");
+ put(206, "Icirc");
+ put(207, "Iuml");
+ put(208, "ETH");
+ put(209, "Ntilde");
+ put(210, "Ograve");
+ put(211, "Oacute");
+ put(212, "Ocirc");
+ put(213, "Otilde");
+ put(214, "Ouml");
+ put(215, "times");
+ put(216, "Oslash");
+ put(217, "Ugrave");
+ put(218, "Uacute");
+ put(219, "Ucirc");
+ put(220, "Uuml");
+ put(221, "Yacute");
+ put(222, "THORN");
+ put(223, "szlig");
+ put(224, "agrave");
+ put(225, "aacute");
+ put(226, "acirc");
+ put(227, "atilde");
+ put(228, "auml");
+ put(229, "aring");
+ put(230, "aelig");
+ put(231, "ccedil");
+ put(232, "egrave");
+ put(233, "eacute");
+ put(234, "ecirc");
+ put(235, "euml");
+ put(236, "igrave");
+ put(237, "iacute");
+ put(238, "icirc");
+ put(239, "iuml");
+ put(240, "eth");
+ put(241, "ntilde");
+ put(242, "ograve");
+ put(243, "oacute");
+ put(244, "ocirc");
+ put(245, "otilde");
+ put(246, "ouml");
+ put(247, "divide");
+ put(248, "oslash");
+ put(249, "ugrave");
+ put(250, "uacute");
+ put(251, "ucirc");
+ put(252, "uuml");
+ put(253, "yacute");
+ put(254, "thorn");
+ put(255, "yuml");
+ put(402, "fnof");
+ put(913, "Alpha");
+ put(914, "Beta");
+ put(915, "Gamma");
+ put(916, "Delta");
+ put(917, "Epsilon");
+ put(918, "Zeta");
+ put(919, "Eta");
+ put(920, "Theta");
+ put(921, "Iota");
+ put(922, "Kappa");
+ put(923, "Lambda");
+ put(924, "Mu");
+ put(925, "Nu");
+ put(926, "Xi");
+ put(927, "Omicron");
+ put(928, "Pi");
+ put(929, "Rho");
+ put(931, "Sigma");
+ put(932, "Tau");
+ put(933, "Upsilon");
+ put(934, "Phi");
+ put(935, "Chi");
+ put(936, "Psi");
+ put(937, "Omega");
+ put(945, "alpha");
+ put(946, "beta");
+ put(947, "gamma");
+ put(948, "delta");
+ put(949, "epsilon");
+ put(950, "zeta");
+ put(951, "eta");
+ put(952, "theta");
+ put(953, "iota");
+ put(954, "kappa");
+ put(955, "lambda");
+ put(956, "mu");
+ put(957, "nu");
+ put(958, "xi");
+ put(959, "omicron");
+ put(960, "pi");
+ put(961, "rho");
+ put(962, "sigmaf");
+ put(963, "sigma");
+ put(964, "tau");
+ put(965, "upsilon");
+ put(966, "phi");
+ put(967, "chi");
+ put(968, "psi");
+ put(969, "omega");
+ put(977, "thetasym");
+ put(978, "upsih");
+ put(982, "piv");
+ put(8226, "bull");
+ put(8230, "hellip");
+ put(8242, "prime");
+ put(8243, "Prime");
+ put(8254, "oline");
+ put(8260, "frasl");
+ put(8472, "weierp");
+ put(8465, "image");
+ put(8476, "real");
+ put(8482, "trade");
+ put(8501, "alefsym");
+ put(8592, "larr");
+ put(8593, "uarr");
+ put(8594, "rarr");
+ put(8595, "darr");
+ put(8596, "harr");
+ put(8629, "crarr");
+ put(8656, "lArr");
+ put(8657, "uArr");
+ put(8658, "rArr");
+ put(8659, "dArr");
+ put(8660, "hArr");
+ put(8704, "forall");
+ put(8706, "part");
+ put(8707, "exist");
+ put(8709, "empty");
+ put(8711, "nabla");
+ put(8712, "isin");
+ put(8713, "notin");
+ put(8715, "ni");
+ put(8719, "prod");
+ put(8721, "sum");
+ put(8722, "minus");
+ put(8727, "lowast");
+ put(8730, "radic");
+ put(8733, "prop");
+ put(8734, "infin");
+ put(8736, "ang");
+ put(8743, "and");
+ put(8744, "or");
+ put(8745, "cap");
+ put(8746, "cup");
+ put(8747, "int");
+ put(8756, "there4");
+ put(8764, "sim");
+ put(8773, "cong");
+ put(8776, "asymp");
+ put(8800, "ne");
+ put(8801, "equiv");
+ put(8804, "le");
+ put(8805, "ge");
+ put(8834, "sub");
+ put(8835, "sup");
+ put(8836, "nsub");
+ put(8838, "sube");
+ put(8839, "supe");
+ put(8853, "oplus");
+ put(8855, "otimes");
+ put(8869, "perp");
+ put(8901, "sdot");
+ put(8968, "lceil");
+ put(8969, "rceil");
+ put(8970, "lfloor");
+ put(8971, "rfloor");
+ put(9001, "lang");
+ put(9002, "rang");
+ put(9674, "loz");
+ put(9824, "spades");
+ put(9827, "clubs");
+ put(9829, "hearts");
+ put(9830, "diams");
+ put(34, "quot");
+ put(38, "amp");
+ put(60, "lt");
+ put(62, "gt");
+ put(338, "OElig");
+ put(339, "oelig");
+ put(352, "Scaron");
+ put(353, "scaron");
+ put(376, "Yuml");
+ put(710, "circ");
+ put(732, "tilde");
+ put(8194, "ensp");
+ put(8195, "emsp");
+ put(8201, "thinsp");
+ put(8204, "zwnj");
+ put(8205, "zwj");
+ put(8206, "lrm");
+ put(8207, "rlm");
+ put(8211, "ndash");
+ put(8212, "mdash");
+ put(8216, "lsquo");
+ put(8217, "rsquo");
+ put(8218, "sbquo");
+ put(8220, "ldquo");
+ put(8221, "rdquo");
+ put(8222, "bdquo");
+ put(8224, "dagger");
+ put(8225, "Dagger");
+ put(8240, "permil");
+ put(8249, "lsaquo");
+ put(8250, "rsaquo");
+ put(8364, "euro");
+ }
+
+ protected final void put(int c, String entity)
+ {
+ charToEntity[c] = entity;
+ }
+
+ protected final void remove(int c)
+ {
+ charToEntity[c] = null;
+ }
+
+ /** Returns null if no entity is found or return the converted entity. */
+ public final String lookup(char c)
+ {
+ return charToEntity[c];
+ }
+
+ public final String convertEntities(String txt)
+ {
+ // Get the chars it's faster
+ char[] chars = txt.toCharArray();
+
+ // The new result if any
+ StringBuffer result = null;
+
+ // The index of the last copied char
+ int previous = 0;
+
+ // Perform lookup char by char
+ for (int current = 0; current < chars.length; current++)
+ {
+ // Lookup
+ String replacement = lookup(chars[current]);
+
+ // Do we have a replacement
+ if (replacement != null)
+ {
+ // We lazy create the result
+ if (result == null)
+ {
+ // Allocate 1/2 more than the current txt size
+ result = new StringBuffer(txt.length() * 3 / 2);
+ }
+ // Append the previous chars if any
+ result.append(chars, previous, current - previous);
+ // Append the replaced entity
+ result.append('&').append(replacement).append(';');
+ // Update the previous pointer
+ previous = current + 1;
+ }
+ }
+
+ // If we have a result we need to complete it
+ if (result != null)
+ {
+ result.append(chars, previous, chars.length - previous);
+ return result.toString();
+ }
+ else
+ {
+ return txt;
+ }
+ }
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/util/EntityTable.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/util/Loader.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/util/Loader.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/util/Loader.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,41 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.util;
+
+import java.io.InputStream;
+
+/**
+ * A generic interface which define loading capabilities. The name format must follow the regular expression :
+ * ^(/[-a-zA-Z0-9_\.]+)+$
+ *
+ * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
+ * @version $Revision: 5448 $
+ */
+public interface Loader
+{
+
+ String NAME_VALIDATOR = "^(/[-a-zA-Z0-9_\\.]+)+$";
+
+ /** Returns an InputStream or null if not found. */
+ InputStream load(String path);
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/util/Loader.java
___________________________________________________________________
Name: svn:executable
+ *
Added: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/util/Stack.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/util/Stack.java (rev 0)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/util/Stack.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,161 @@
+/******************************************************************************
+ * JBoss, a division of Red Hat *
+ * Copyright 2006, Red Hat Middleware, LLC, and individual *
+ * contributors as indicated by the @authors tag. See the *
+ * copyright.txt in the distribution for a full listing of *
+ * individual contributors. *
+ * *
+ * This is free software; you can redistribute it and/or modify it *
+ * under the terms of the GNU Lesser General Public License as *
+ * published by the Free Software Foundation; either version 2.1 of *
+ * the License, or (at your option) any later version. *
+ * *
+ * This software is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
+ * Lesser General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU Lesser General Public *
+ * License along with this software; if not, write to the Free *
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA *
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org. *
+ ******************************************************************************/
+package org.jboss.portlet.forums.format.util;
+
+import java.util.Collections;
+import java.util.Iterator;
+
+/**
+ * The goal of this class is to ensure that any event with open/close well formdness semantics are respected.
+ * <p/>
+ * This class maintain a stack of keys.
+ * <p/>
+ * To be operational this class must be subclassed to provide semantics that the user wants to give to the key
+ * identities.
+ *
+ * @author <a href="mailto:julien at jboss.org">Julien Viet</a>
+ * @version $Revision: 5448 $
+ */
+public abstract class Stack
+{
+
+ /** The stack pointer which always points the first available element. */
+ protected int ptr = 0;
+
+ /** The stack holder. */
+ protected Key[] stack;
+
+ /** The reusable iterator. */
+ private KeyIterator iterator = new KeyIterator();
+
+ /** Create a new stack with a specified depth. */
+ public Stack(int initalCapacity)
+ {
+ this.stack = new Key[initalCapacity];
+ for (int i = 0; i < stack.length; i++)
+ {
+ this.stack[i] = createKey();
+ }
+ }
+
+ /** Reset the stack state. */
+ public final void reset()
+ {
+ ptr = 0;
+ }
+
+ /** Push a key on the stack. */
+ public final Key push()
+ {
+ if (ptr == stack.length)
+ {
+ enlarge();
+ }
+ return stack[ptr++];
+ }
+
+ /** Peek a key on the stack. */
+ public Key peek(int level)
+ {
+ level = ptr - 1 - level;
+ return level >= 0 ? stack[level] : null;
+ }
+
+ /** Pop keys until it finds the good one. */
+ public final Iterator pop(Key candidate)
+ {
+ if (ptr > 0)
+ {
+ iterator.from = ptr - 1;
+ for (Key key = stack[--ptr]; !equals(candidate, key) && ptr >= 1; key = stack[--ptr])
+ {
+ ;
+ }
+ iterator.to = ptr - 1;
+ return iterator;
+ }
+ else
+ {
+ // This is a warn because it is not possible to pop with empty stack
+ return Collections.EMPTY_LIST.iterator();
+ }
+ }
+
+ /** The implementation must provide a reusable key. */
+ protected abstract Key createKey();
+
+ /** The implementation must test keys equality. */
+ protected abstract boolean equals(Key key1, Key key2);
+
+ /** Enlarge the key stack. For now it simply add 3 keys to the actual length */
+ protected void enlarge()
+ {
+ Key[] tmp = new Key[stack.length + 3];
+ System.arraycopy(stack, 0, tmp, 0, stack.length);
+ for (int i = stack.length; i < tmp.length; i++)
+ {
+ tmp[i] = createKey();
+ }
+ stack = tmp;
+ }
+
+ /** Iterates over the poped keys. */
+ public class KeyIterator implements Iterator
+ {
+ private int from;
+ private int to;
+
+ public boolean hasNext()
+ {
+ return from > to;
+ }
+
+ public Object next()
+ {
+ return stack[from--];
+ }
+
+ public void remove()
+ {
+ throw new UnsupportedOperationException();
+ }
+ }
+
+ /** A key for the stack. */
+ public interface Key
+ {
+ }
+
+ public String toString()
+ {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("[stack[");
+ for (int i = 0; i < ptr; i++)
+ {
+ Stack.Key key = stack[i];
+ buffer.append(i == 0 ? "" : ",").append(key);
+ }
+ buffer.append("]]");
+ return buffer.toString();
+ }
+}
Property changes on: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/format/util/Stack.java
___________________________________________________________________
Name: svn:executable
+ *
Modified: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/ui/Constants.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/ui/Constants.java 2007-11-24 13:29:44 UTC (rev 16779)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/ui/Constants.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -39,6 +39,8 @@
public static final String FEEDBACK = "feedback";
public static final String EDIT_CATEGORY = "editCategory";
public static final String EDIT_FORUM = "editForum";
+ public static final String ADD_CATEGORY = "addCategory";
+ public static final String ADD_FORUM = "addForum";
public static final String EDIT_WATCH = "editWatch";
public static final String DELETE_CATEGORY = "deleteCategory";
public static final String DELETE_FORUM = "deleteForum";
Modified: labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/ui/action/AdminController.java
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/ui/action/AdminController.java 2007-11-24 13:29:44 UTC (rev 16779)
+++ labs/jbossforums/branches/forums101P26/forums/src/main/org/jboss/portlet/forums/ui/action/AdminController.java 2007-11-24 22:47:34 UTC (rev 16780)
@@ -67,6 +67,8 @@
*/
private boolean editCategoryMode;
private boolean editForumMode;
+ private boolean addCategoryMode;
+ private boolean addForumMode;
//-----ui data-------------------------------------------------------------------------------------------------------------------------
/**
@@ -172,6 +174,8 @@
this.selectedForum = -1;
this.editCategoryMode = false;
this.editForumMode = false;
+ this.addCategoryMode = false;
+ this.addForumMode = false;
}
//-------------------------------------------------------------------------------------------------------------------------------------
/**
@@ -240,6 +244,19 @@
{
this.editForumMode = Boolean.valueOf(editForStr).booleanValue();
}
+
+ // Checking for addModes flags
+ String addCatStr = ForumUtil.getParameter(Constants.ADD_CATEGORY);
+ if (addCatStr != null && addCatStr.trim().length()>0)
+ {
+ this.addCategoryMode = Boolean.valueOf(editCatStr).booleanValue();
+ }
+
+ String addForStr = ForumUtil.getParameter(Constants.ADD_FORUM);
+ if (editForStr != null && editForStr.trim().length()>0)
+ {
+ this.addForumMode = Boolean.valueOf(addForStr).booleanValue();
+ }
}
catch(Exception e)
{
Modified: labs/jbossforums/branches/forums101P26/forums/src/resources/portal-forums-war/views/admin/index.xhtml
===================================================================
--- labs/jbossforums/branches/forums101P26/forums/src/resources/portal-forums-war/views/admin/index.xhtml 2007-11-24 13:29:44 UTC (rev 16779)
+++ labs/jbossforums/branches/forums101P26/forums/src/resources/portal-forums-war/views/admin/index.xhtml 2007-11-24 22:47:34 UTC (rev 16780)
@@ -43,10 +43,11 @@
<!-- Add new category button -->
<forums:isAllowed fragment="acl://addCategory">
<h:form>
+ <input type="hidden" name="addCategory" value="true" />
<div class="actionbuttons">
<ul>
<li>
- <h:commandLink action="#{adminController.addCategory}">
+ <h:commandLink action="#{adminController.dummyAction}">
<img src="${forums:themeURL('resourceAdminNewCategoryURL')}"
alt="${resource.Create_category}" name="newCategory"
border="0" />
@@ -73,7 +74,7 @@
<c:choose>
- <c:when test="${ ( (adminController.editCategoryMode or forums:message('form:Category') ne null)
+ <c:when test="${ ( (adminController.editCategoryMode or adminController.addCategoryMode or forums:message('form:Category') ne null)
and (adminController.selectedCategory eq category.id) )
or
( (forums:nullIfEmptyString(category.title) eq null) )}" >
@@ -103,8 +104,9 @@
<forums:isAllowed fragment="acl://addForum">
<h:form>
<input type="hidden" name="c" value="#{category.id}"/>
+ <input type="hidden" name="addForum" value="true" />
<div class="forumfloatright actionbuttons">
- <h:commandLink action="#{adminController.addForum}">
+ <h:commandLink action="#{adminController.dummyAction}">
<img src="${forums:themeURL('resourceAdminNewForumURL')}"
alt="${resource.Create_forum}" border="0" />
</h:commandLink>
@@ -213,7 +215,7 @@
<c:choose>
- <c:when test="${( (adminController.editForumMode or forums:message('forumForm:Forum') ne null)
+ <c:when test="${( (adminController.editForumMode or adminController.addForumMode or forums:message('forumForm:Forum') ne null)
and adminController.selectedForum eq forum.id )
or ( forums:nullIfEmptyString(forum.name) eq null )}" >
<tr class="editRow">
@@ -368,9 +370,10 @@
<forums:isAllowed fragment="acl://addCategory">
<h:form>
<div class="actionbuttons">
+ <input type="hidden" name="addCategory" value="true" />
<ul>
<li>
- <h:commandLink action="#{adminController.addCategory}">
+ <h:commandLink action="#{adminController.dummyAction}">
<img src="${forums:themeURL('resourceAdminNewCategoryURL')}"
alt="${resource.Create_category}" name="newCategory"
border="0" />
Added: labs/jbossforums/branches/forums101P26/thirdparty/dom4j/component-info.xml
===================================================================
--- labs/jbossforums/branches/forums101P26/thirdparty/dom4j/component-info.xml (rev 0)
+++ labs/jbossforums/branches/forums101P26/thirdparty/dom4j/component-info.xml 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,19 @@
+<project name="dom4j-component-info">
+
+ <!-- ============================================================ -->
+ <!-- DOM4J -->
+ <!-- ============================================================ -->
+
+ <component id="dom4j"
+ licenseType="dom4j"
+ version="1.6.1jboss"
+ projectHome="http://dom4j.org/"
+ description="Library for XML, XPath and XSLT on the Java platform">
+ <artifact id="dom4j.jar"/>
+ <export>
+ <include input="dom4j.jar"/>
+ </export>
+ </component>
+
+
+</project>
Added: labs/jbossforums/branches/forums101P26/thirdparty/dom4j/lib/dom4j.jar
===================================================================
(Binary files differ)
Property changes on: labs/jbossforums/branches/forums101P26/thirdparty/dom4j/lib/dom4j.jar
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: labs/jbossforums/branches/forums101P26/thirdparty/javassist/component-info.xml
===================================================================
--- labs/jbossforums/branches/forums101P26/thirdparty/javassist/component-info.xml (rev 0)
+++ labs/jbossforums/branches/forums101P26/thirdparty/javassist/component-info.xml 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,18 @@
+<project name="javassist-component-info">
+ <!-- ============================================================ -->
+ <!-- Javassist -->
+ <!-- ============================================================ -->
+
+ <component id="javassist"
+ licenseType="lgpl"
+ version="3.3.0.GA"
+ projectHome="http://sourceforge.net/projects/jboss"
+ description="Simple Java bytecode manipulation (cvstag Javassist_3_3_GA)">
+ <artifact id="javassist.jar"/>
+ <export>
+ <include input="javassist.jar"/>
+ </export>
+ </component>
+
+
+</project>
Added: labs/jbossforums/branches/forums101P26/thirdparty/javassist/lib/javassist.jar
===================================================================
(Binary files differ)
Property changes on: labs/jbossforums/branches/forums101P26/thirdparty/javassist/lib/javassist.jar
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: labs/jbossforums/branches/forums101P26/thirdparty/jflex/component-info.xml
===================================================================
--- labs/jbossforums/branches/forums101P26/thirdparty/jflex/component-info.xml (rev 0)
+++ labs/jbossforums/branches/forums101P26/thirdparty/jflex/component-info.xml 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,14 @@
+<project name="jflex-component-info">
+ <component id="jflex"
+ licenseType="gpl"
+ version="1.4.0"
+ projectHome="http://jflex.de/"
+ description="lexical analyzer generator">
+ <artifact id="jflex.jar"/>
+
+ <export>
+ <include input="jflex.jar"/>
+ </export>
+ </component>
+
+</project>
\ No newline at end of file
Added: labs/jbossforums/branches/forums101P26/thirdparty/jflex/lib/jflex.jar
===================================================================
(Binary files differ)
Property changes on: labs/jbossforums/branches/forums101P26/thirdparty/jflex/lib/jflex.jar
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: labs/jbossforums/branches/forums101P26/thirdparty/sun-javacc/component-info.xml
===================================================================
--- labs/jbossforums/branches/forums101P26/thirdparty/sun-javacc/component-info.xml (rev 0)
+++ labs/jbossforums/branches/forums101P26/thirdparty/sun-javacc/component-info.xml 2007-11-24 22:47:34 UTC (rev 16780)
@@ -0,0 +1,16 @@
+<project name="sun-javacc-component-info">
+
+ <component id="sun-javacc"
+ version="3.2-portal"
+ licenseType="bsd"
+ projectHome="https://javacc.dev.java.net/"
+ description="JavaCC is a parser/scanner generator for java"
+ >
+ <artifact id="JavaCC.zip"/>
+ <export>
+ <include input="JavaCC.zip"/>
+ </export>
+ </component>
+
+</project>
+
Added: labs/jbossforums/branches/forums101P26/thirdparty/sun-javacc/lib/JavaCC.zip
===================================================================
(Binary files differ)
Property changes on: labs/jbossforums/branches/forums101P26/thirdparty/sun-javacc/lib/JavaCC.zip
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Modified: labs/jbossforums/branches/forums101P26/tools/etc/buildfragments/libraries.ent
===================================================================
--- labs/jbossforums/branches/forums101P26/tools/etc/buildfragments/libraries.ent 2007-11-24 13:29:44 UTC (rev 16779)
+++ labs/jbossforums/branches/forums101P26/tools/etc/buildfragments/libraries.ent 2007-11-24 22:47:34 UTC (rev 16780)
@@ -199,4 +199,29 @@
<filelist dir="${sun.portlet.lib}" files="jsf-portlet.jar"/>
</path>
+ <!-- JFlex -->
+ <property name="jflex.jflex.root" value="${project.thirdparty}/jflex"/>
+ <property name="jflex.jflex.lib" value="${jflex.jflex.root}/lib"/>
+ <path id="jflex.jflex.classpath">
+ <pathelement path="${jflex.jflex.lib}/jflex.jar"/>
+ </path>
+
+ <!-- JavaCC -->
+ <property name="sun.javacc.root" value="${project.thirdparty}/sun-javacc"/>
+ <property name="sun.javacc.lib" value="${sun.javacc.root}/lib"/>
+
+ <!-- Javassist -->
+ <property name="jboss.javassist.root" value="${project.thirdparty}/javassist"/>
+ <property name="jboss.javassist.lib" value="${jboss.javassist.root}/lib"/>
+ <path id="jboss.javassist.classpath">
+ <pathelement path="${jboss.javassist.lib}/javassist.jar"/>
+ </path>
+
+ <!-- Dom4j -->
+ <property name="dom4j.dom4j.root" value="${project.thirdparty}/dom4j"/>
+ <property name="dom4j.dom4j.lib" value="${dom4j.dom4j.root}/lib"/>
+ <path id="dom4j.dom4j.classpath">
+ <pathelement path="${dom4j.dom4j.lib}/dom4j.jar"/>
+ </path>
+
</target>
More information about the jboss-svn-commits
mailing list