[multiple changes]

2005-04-19  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* gnu/xml/dom/html2/DomHTMLParser.java:
	Changed 'enum' references to become 'enumeration'.

2005-04-19  Audrius Meskauskas  <audriusa@bluewin.ch>

	* gnu/xml/dom/html2/DomHTMLParser.java: New file.

2005-04-19  Andrew John Hughes  <gnu_andrew@member.fsf.org>

	* gnu/javax/swing/text/html/parser/htmlAttributeSet.java:
	(getAttributeNames()): Replaced 'enum' with 'enumeration'.
	* gnu/javax/swing/text/html/parser/htmlValidator.java:
	(validateParameters(TagElement,htmlAttributeSet)):
	Replaced 'enum' with 'enumeration'.
	(validateAttribute(TagElement,htmlAttributeSet,Enumeration,Enumeration)):
	Likewise.

2005-04-19  Audrius Meskauskas  <audriusa@bluewin.ch>

	* javax/swing/text/html/parser/Entity.java (getType): New method.
	* javax/swing/text/html/parser/DocumentParser.java:
	Inherit from javax.swing.text.html.parser.Parser.

2005-04-19  Chris Burdess  <dog@gnu.org>

	* gnu/xml/dom/html2/DomHTMLDocument.java: Fixed element creation and
	check for HTML/XHTML namespace.

2005-04-19  Audrius Meskauskas  <audriusa@bluewin.ch>

	* javax/swing/text/html/parser/Parser.java,
	javax/swing/text/html/parser/Entity.java:
	Inheriting from DTDConstants.
	* javax/swing/text/html/parser/AttributeList.java
	(getValues): Changed return type.
	* javax/swing/text/html/parser/DocumentParser
	(parse): Adding the callback parameter that receives
	the parsing events.

2005-04-19  Chris Burdess  <dog@gnu.org>

	* gnu/xml/dom/DomImpl.java,
	gnu/xml/dom/html2/DomHTMLAnchorElement.java,
	gnu/xml/dom/html2/DomHTMLDocument.java,
	gnu/xml/dom/html2/DomHTMLElement.java,
	gnu/xml/dom/html2/DomHTMLFormElement.java,
	gnu/xml/dom/html2/DomHTMLFrameElement.java,
	gnu/xml/dom/html2/DomHTMLIFrameElement.java,
	gnu/xml/dom/html2/DomHTMLImpl.java,
	gnu/xml/dom/html2/DomHTMLInputElement.java,
	gnu/xml/dom/html2/DomHTMLObjectElement.java,
	gnu/xml/dom/html2/DomHTMLOptionElement.java,
	gnu/xml/dom/html2/DomHTMLSelectElement.java,
	gnu/xml/dom/html2/DomHTMLTableCellElement.java,
	gnu/xml/dom/html2/DomHTMLTableElement.java,
	gnu/xml/dom/html2/DomHTMLTableRowElement.java,
	gnu/xml/dom/html2/DomHTMLTableSectionElement.java,
	gnu/xml/dom/html2/DomHTMLTextAreaElement.java: JAXP integration,
	UI events, and tree utility functions.

2005-04-19  Michael Koch  <konqueror@gmx.de>

	* gnu/javax/swing/text/html/parser/HTML_401F.java,
	gnu/javax/swing/text/html/parser/gnuDTD.java,
	gnu/javax/swing/text/html/parser/models/node.java:
	Reworked import statements.

2005-04-19  Audrius Meskauskas, Lithuania  <AudriusA@Bioinformatics.org>

	* javax/swing/text/html/HTMLDocument.java: New file.

2005-04-19  Michael Koch  <konqueror@gmx.de>

	* javax/swing/text/html/HTMLFrameHyperlinkEvent.java:
	Reformatted.
	* javax/swing/text/html/parser/AttributeList.java:
	Fixed order of modifiers.
	(AttributeList): Made final.
	* javax/swing/text/html/parser/ContentModel.java:
	Fixed html characters in javadocs.
	* javax/swing/text/html/parser/DTD.java
	(DTD): Don't implement java.io.Serializable directly.
	(getElement): Simplified.
	* javax/swing/text/html/parser/DTDConstants.java:
	Reformatted file.
	* javax/swing/text/html/parser/Element.java:
	Fixed order of modifiers.
	* javax/swing/text/html/parser/Parser.java:
	Reformatted. Don't use fully-qualified class names.
	* javax/swing/text/html/parser/ParserDelegator.java:
	Fixed order of modifiers.
	* javax/swing/text/rtf/RTFParser.java:
	Re-ordered import statements.
	* javax/swing/text/rtf/RTFScanner.java:
	Removed unused import statement.

2005-04-19  Chris Burdess  <dog@gnu.org>

	* gnu/xml/dom/html2/DomHTMLButtonElement.java,
	gnu/xml/dom/html2/DomHTMLCollection.java,
	gnu/xml/dom/html2/DomHTMLDocument.java,
	gnu/xml/dom/html2/DomHTMLElement.java: Extensions for new element
	types.
	* gnu/xml/dom/html2/DomHTMLDListElement.java,
	gnu/xml/dom/html2/DomHTMLDirectoryElement.java,
	gnu/xml/dom/html2/DomHTMLDivElement.java,
	gnu/xml/dom/html2/DomHTMLFieldSetElement.java,
	gnu/xml/dom/html2/DomHTMLFontElement.java,
	gnu/xml/dom/html2/DomHTMLFormElement.java,
	gnu/xml/dom/html2/DomHTMLFrameElement.java,
	gnu/xml/dom/html2/DomHTMLFrameSetElement.java,
	gnu/xml/dom/html2/DomHTMLHRElement.java,
	gnu/xml/dom/html2/DomHTMLHeadElement.java,
	gnu/xml/dom/html2/DomHTMLHeadingElement.java,
	gnu/xml/dom/html2/DomHTMLHtmlElement.java,
	gnu/xml/dom/html2/DomHTMLIFrameElement.java,
	gnu/xml/dom/html2/DomHTMLImageElement.java,
	gnu/xml/dom/html2/DomHTMLInputElement.java,
	gnu/xml/dom/html2/DomHTMLIsIndexElement.java,
	gnu/xml/dom/html2/DomHTMLLIElement.java,
	gnu/xml/dom/html2/DomHTMLLabelElement.java,
	gnu/xml/dom/html2/DomHTMLLegendElement.java,
	gnu/xml/dom/html2/DomHTMLLinkElement.java,
	gnu/xml/dom/html2/DomHTMLMapElement.java,
	gnu/xml/dom/html2/DomHTMLMenuElement.java,
	gnu/xml/dom/html2/DomHTMLMetaElement.java,
	gnu/xml/dom/html2/DomHTMLModElement.java,
	gnu/xml/dom/html2/DomHTMLOListElement.java,
	gnu/xml/dom/html2/DomHTMLObjectElement.java,
	gnu/xml/dom/html2/DomHTMLOptGroupElement.java,
	gnu/xml/dom/html2/DomHTMLOptionElement.java,
	gnu/xml/dom/html2/DomHTMLParagraphElement.java,
	gnu/xml/dom/html2/DomHTMLParamElement.java,
	gnu/xml/dom/html2/DomHTMLPreElement.java,
	gnu/xml/dom/html2/DomHTMLQuoteElement.java,
	gnu/xml/dom/html2/DomHTMLScriptElement.java,
	gnu/xml/dom/html2/DomHTMLSelectElement.java,
	gnu/xml/dom/html2/DomHTMLStyleElement.java,
	gnu/xml/dom/html2/DomHTMLTableCaptionElement.java,
	gnu/xml/dom/html2/DomHTMLTableCellElement.java,
	gnu/xml/dom/html2/DomHTMLTableColElement.java,
	gnu/xml/dom/html2/DomHTMLTableElement.java,
	gnu/xml/dom/html2/DomHTMLTableRowElement.java,
	gnu/xml/dom/html2/DomHTMLTableSectionElement.java,
	gnu/xml/dom/html2/DomHTMLTextAreaElement.java,
	gnu/xml/dom/html2/DomHTMLTitleElement.java,
	gnu/xml/dom/html2/DomHTMLUListElement.java: New files.

2005-04-19  Audrius Meskauskas  <audriusa@bluewin.ch>

	* javax/swing/text/ChangedCharSetException.java,
	javax/swing/text/html/HTMLEditorKit.java,
	javax/swing/text/html/HTMLFrameHyperlinkEvent.java,
	javax/swing/text/html/parser/AttributeList.java,
	javax/swing/text/html/parser/ContentModel.java,
	javax/swing/text/html/parser/DocumentParser.java,
	javax/swing/text/html/parser/DTD.java,
	javax/swing/text/html/parser/DTDConstants.java,
	javax/swing/text/html/parser/Element.java,
	javax/swing/text/html/parser/Entity.java,
	javax/swing/text/html/parser/Parser.java,
	javax/swing/text/html/parser/TagElement.java,
	gnu/javax/swing/text/html/package.html,
	gnu/javax/swing/text/html/parser/gnuDTD.java,
	gnu/javax/swing/text/html/parser/HTML_401F.java,
	gnu/javax/swing/text/html/parser/htmlAttributeSet.java,
	gnu/javax/swing/text/html/parser/htmlValidator.java,
	gnu/javax/swing/text/html/parser/package.html,
	gnu/javax/swing/text/html/parser/models/list.java,
	gnu/javax/swing/text/html/parser/models/node.java,
	gnu/javax/swing/text/html/parser/models/noTagModel.java,
	gnu/javax/swing/text/html/parser/models/package.html,
	gnu/javax/swing/text/html/parser/models/PCDATAonly_model.java,
	gnu/javax/swing/text/html/parser/models/TableRowContentModel.java,
	gnu/javax/swing/text/html/parser/models/transformer.java,
	gnu/javax/swing/text/html/parser/support/gnuStringIntMapper.java,
	gnu/javax/swing/text/html/parser/support/package.html,
	gnu/javax/swing/text/html/parser/support/parameterDefaulter.java,
	gnu/javax/swing/text/html/parser/support/Parser.java,
	gnu/javax/swing/text/html/parser/support/textPreProcessor.java,
	gnu/javax/swing/text/html/parser/support/low/Buffer.java,
	gnu/javax/swing/text/html/parser/support/low/Constants.java,
	gnu/javax/swing/text/html/parser/support/low/Location.java,
	gnu/javax/swing/text/html/parser/support/low/node.java,
	gnu/javax/swing/text/html/parser/support/low/package.html,
	gnu/javax/swing/text/html/parser/support/low/ParseException.java,
	gnu/javax/swing/text/html/parser/support/low/pattern.java,
	gnu/javax/swing/text/html/parser/support/low/Queue.java,
	gnu/javax/swing/text/html/parser/support/low/ReaderTokenizer.java:
	New files.
	* javax/swing/text/html/HTML.java,
	javax/swing/text/html/parser/ParserDelegator.java:
	New files (replacing).
	* javax/swing/text/html/package.html,
	javax/swing/text/html/parser/package.html: Documenting the
	packages.

2005-04-19  Chris Burdess  <dog@gnu.org>

	* gnu/xml/dom/html2/DomHTMLAnchorElement.java,
	gnu/xml/dom/html2/DomHTMLAppletElement.java,
	gnu/xml/dom/html2/DomHTMLAreaElement.java,
	gnu/xml/dom/html2/DomHTMLBaseElement.java,
	gnu/xml/dom/html2/DomHTMLBaseFontElement.java,
	gnu/xml/dom/html2/DomHTMLBodyElement.java,
	gnu/xml/dom/html2/DomHTMLBRElement.java,
	gnu/xml/dom/html2/DomHTMLButtonElement.java,
	gnu/xml/dom/html2/DomHTMLCollection.java,
	gnu/xml/dom/html2/DomHTMLDocument.java,
	gnu/xml/dom/html2/DomHTMLElement.java: New files.

2005-04-19  Michael Koch  <konqueror@gmx.de>

	* Makefile.am: Added new files.
	* Makefile.in: Regenerated.

From-SVN: r98406
This commit is contained in:
Michael Koch 2005-04-19 12:19:44 +00:00
parent c5f083efc5
commit 18e479e213
104 changed files with 22587 additions and 27 deletions

View file

@ -0,0 +1,50 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<!-- package.html - describes classes in javax.swing.text.html package.
Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. -->
<html>
<head><title>GNU Classpath - javax.swing.text.html</title></head>
<body>
<p> Provides supporting classes for web browsers,
web robots, web page content analysers, web editors and
other applications applications working with Hypertext
Markup Language (HTML).
</p>
</body>
</html>

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,422 @@
/* gnuDTD.java --
Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.javax.swing.text.html.parser;
import java.io.PrintStream;
import java.io.Serializable;
import java.util.BitSet;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Vector;
import javax.swing.text.html.parser.AttributeList;
import javax.swing.text.html.parser.ContentModel;
import javax.swing.text.html.parser.Element;
import javax.swing.text.html.parser.Entity;
/**
* <p>
* The class is derived from {@link gnu.javax.swing.text.html.parser.DTD }
* making structure creation methods public. This is required when
* creating the DTD by SGML parser that must have access to the structure.
*
* SGML DTD representation. Provides basis for describing a syntax of the
* HTML documents. The fields of this class are NOT initialized in
* constructor. You need to do this separately before passing this data
* structure to the parser constructor.</p>
*
* <p>This implementation also provides you the derived class
* <code>gnu.javax.swing.text.html.parser.DTD.HTML_4_0_1</code>, where
* all fields are initialized to the values, representing HTML 4.01
* ("-//W3C//DTD HTML 4.01 Frameset//EN") DTD. You can use it if you do not care
* about the portability between different implementations of the core
* class libraries. </p>
* <p>Use {@link javax.swing.HTML.HTMLEditorKit.Parser#parse }
* for parsing in accordance with "-//W3C//DTD HTML 4.01 Frameset//EN"
* without specifying DTD separately.</p>
*
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class gnuDTD
extends javax.swing.text.html.parser.DTD
implements javax.swing.text.html.parser.DTDConstants, Serializable
{
/* The undocumented element types, used to specify types, not defined
in DTDConstants. */
/**
* The URI element type (not defined in DTDConstants).
*/
public static final int URI = 512;
/**
* The Length element type
*/
public static final int Length = 513;
/**
* The Char element type
*/
public static final int Char = 514;
/**
* The Color element type
*/
public static final int Color = 515;
/**
* Creates a new instance of gnuDTD.
* @param name the name of the DTD.
*/
public gnuDTD(String name)
{
super(name);
}
/**
* Creates and returns new attribute (not an attribute list).
* @param name the name of this attribute
* @param type the type of this attribute (FIXED, IMPLIED or
* REQUIRED from <code>DTDConstants</code>).
* @param modifier the modifier of this attribute
* @param default_value the default value of this attribute or null if
* it is not specified.
* @param allowed_values the allowed values of this attribute. The multiple
* possible values in this parameter are supposed to be separated by
* '|', same as in SGML DTD <code>&lt;!ATTLIST </code>tag. This parameter
* can be null if no list of allowed values is specified.
* @param atts the previous attribute of this element. This is
* placed to the field
* {@link javax.swing.text.html.parser.AttributeList#next },
* creating a linked list.
* @return
*/
public AttributeList defAttributeList(String name, int type, int modifier,
String default_value,
String allowed_values,
AttributeList atts
)
{
return super.defAttributeList(name, type, modifier, default_value,
allowed_values, atts
);
}
/**
* Define the attributes for the element with the given name.
* If the element is not exist, it is created. This method is
* needed if the element attributes are defined befor the
* element itself.
* @param forElement
* @param attributes
*/
public void defAttrsFor(String forElement, AttributeList attributes)
{
super.defineAttributes(forElement, attributes);
}
/**
* Creates a new content model.
* @param type specifies the BNF operation for this content model.
* The valid operations are documented in the
* {@link javax.swing.text.html.parser.ContentModel#type }.
* @param content the content of this content model
* @param next if the content model is specified by BNF-like
* expression, contains the rest of this expression.
* @return The newly created content model.
*/
public ContentModel defContentModel(int type, Object content,
ContentModel next
)
{
return super.defContentModel(type, content, next);
}
/**
* Defines a new element and adds it to the element table.
* If the element alredy exists,
* overrides it settings with the specified values.
* @param name the name of the new element
* @param type the type of the element
* @param headless true if the element needs no starting tag
* @param tailless true if the element needs no closing tag
* @param content the element content.
* @param exclusions the elements that must be excluded from the
* content of this element, in all levels of the hierarchy.
* @param inclusions the elements that can be included as the
* content of this element.
* @param attributes the element attributes.
* @return the created or updated element.
*/
public Element defElement(String name, int type, boolean headless,
boolean tailless, ContentModel content,
String[] exclusions, String[] inclusions,
AttributeList attributes
)
{
return super.defElement(name, type, headless, tailless, content,
exclusions, inclusions, attributes
);
}
/**
* Defines a new element and adds it to the element table.
* If the element alredy exists,
* overrides it settings with the specified values.
* @param name the name of the new element
* @param type the type of the element
* @param headless true if the element needs no starting tag
* @param tailless true if the element needs no closing tag
* @param content the element content.
* @param exclusions the elements that must be excluded from the
* content of this element, in all levels of the hierarchy.
* @param inclusions the elements that can be included as the
* content of this element.
* @param attributes the element attributes.
* @return the created or updated element.
*/
public Element defElement(String name, int type, boolean headless,
boolean tailless, ContentModel content,
Collection exclusions, Collection inclusions,
AttributeList attributes
)
{
return super.defElement(name, type, headless, tailless, content,
toStringArray(exclusions),
toStringArray(inclusions), attributes
);
}
/**
* Defines a new element and adds it to the element table.
* If the element alredy exists,
* overrides it settings with the specified values.
* @param name the name of the new element
* @param type the type of the element
* @param headless true if the element needs no starting tag
* @param tailless true if the element needs no closing tag
* @param content the element content.
* @param exclusions the elements that must be excluded from the
* content of this element, in all levels of the hierarchy.
* @param inclusions the elements that can be included as the
* content of this element.
* @param attributes the element attributes (an array and not a
* linked list). The attributes are chained into the linked list
* inside this method.
* @return the created or updated element.
*/
public Element defElement(String name, int type, boolean headless,
boolean tailless, ContentModel content,
String[] exclusions, String[] inclusions,
AttributeList[] attributes
)
{
AttributeList list;
if (attributes == null || attributes.length == 0)
list = null;
else
{
if (attributes.length > 1)
for (int i = 1; i < attributes.length; i++)
{
attributes [ i - 1 ].next = attributes [ i ];
}
list = attributes [ 0 ];
}
Element e =
super.defElement(name, type, headless, tailless, content, exclusions,
inclusions, list
);
return e;
}
/**
* Creates, adds into the internal table and returns the
* character entity like <code>&amp;lt;</code>
* (means '<code>&lt;</code>' );
* This method inactivates the recursive refenrences to the same
* entity.
* @param name The entity name (without heading &amp; and closing ;)
* @param type The entity type
* @param character The entity value (single character)
* @return The created entity
*/
public Entity defEntity(String name, int type, String data)
{
int r;
String eref = "%" + name + ";";
do
{
r = data.indexOf(eref);
if (r > 0)
{
data = data.substring(0, r) + data.substring(r + 1);
}
}
while (r > 0);
return super.defEntity(name, type, data);
}
/**
* Summarises the document content into the given PrintStream.
*/
public void dump(PrintStream p)
{
Iterator iter = entityHash.entrySet().iterator();
while (iter.hasNext())
{
Map.Entry item = (Map.Entry) iter.next();
Entity e = (Entity) item.getValue();
if (e.isGeneral())
p.println("Entity " + e.getName() + ": " + e.getString());
}
iter = elementHash.entrySet().iterator();
while (iter.hasNext())
{
Map.Entry item = (Map.Entry) iter.next();
Element e = (Element) item.getValue();
p.println("Element " + e.getName());
System.out.println(" includes:");
dump(e.inclusions);
System.out.println(" excludes:");
dump(e.exclusions);
System.out.println(" attributes:");
AttributeList atts = e.atts;
while (atts != null)
{
p.print(" " + atts.name + " = " + atts.value);
if (atts.values == null || atts.values.size() == 0)
p.println();
else
{
Iterator viter = atts.values.iterator();
System.out.print(" ( ");
while (viter.hasNext())
{
System.out.print(viter.next());
if (viter.hasNext())
System.out.print(" | ");
}
System.out.println(" ) ");
}
atts = atts.next;
}
}
}
/**
* Prints the content of the given attribute set to the System.out.
* @param b
*/
public void dump(BitSet b)
{
if (b != null)
{
for (int i = 0; i < b.size(); i++)
{
if (b.get(i))
System.out.println(" " + elements.get(i));
}
}
else
System.out.println(" NULL set");
}
/**
* Creates the attribute.
* @param name The attribute name.
* @param type The attribute type.
* @param modifier The attribute modifier.
* @param defaultValue Default value (or null)
* @param allowed_values Allowed values (or null)
* @return The newly created AttributeList. The <code>next</code>
* field is initialized to null.
*/
protected AttributeList attr(String name, String default_value,
String[] allowed_values, int type, int modifier
)
{
Vector allowed = null;
if (allowed_values != null)
{
allowed = new Vector(allowed_values.length);
for (int i = 0; i < allowed_values.length; i++)
{
allowed.add(allowed_values [ i ]);
}
}
;
AttributeList attr =
new AttributeList(name, type, modifier, default_value, allowed, null);
return attr;
}
/**
* Define the general entity, holding a single character.
* @param name The entity name (for example, 'amp').
* The defined entity <b>is</b> stored into the entity table.
* @param character The entity character (for example, '&').
*/
protected void defineEntity(String name, int character)
{
super.defEntity(name, GENERAL, character);
}
private String[] toStringArray(Collection c)
{
String[] s = new String[ c.size() ];
Iterator iter = c.iterator();
for (int i = 0; i < s.length; i++)
{
s [ i ] = iter.next().toString();
}
return s;
}
}

View file

@ -0,0 +1,133 @@
/* htmlAttributeSet.java -- A set to store HTML attributes
Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.javax.swing.text.html.parser;
import java.util.Enumeration;
import javax.swing.text.AttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.html.HTML;
/**
* A set, adapted to store HTML attributes.
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class htmlAttributeSet
extends SimpleAttributeSet
{
public static final htmlAttributeSet EMPTY_HTML_ATTRIBUTE_SET =
new htmlAttributeSet();
AttributeSet parent;
/**
* Looks in this set and, if not found, later looks in the parent set.
* Calls toString(), allowing to pass as HTML.Attribute, as String
* to this method.
* @param key A key to search for a value.
* @return The value, if one is defined.
*/
public Object getAttribute(Object _key)
{
Object key = _key.toString().toLowerCase();
Object v = super.getAttribute(key);
if (v != null)
return v;
else if (parent != null)
return parent.getAttribute(key);
else
return null;
}
/**
* The name set must return HTML.Attribute and not a string,
* where applicable.
*/
public Enumeration getAttributeNames()
{
// Replace the string keys by HTML.attribute, where applicable
final Enumeration enumeration = super.getAttributeNames();
return new Enumeration()
{
public boolean hasMoreElements()
{
return enumeration.hasMoreElements();
}
public Object nextElement()
{
Object key = enumeration.nextElement();
HTML.Attribute hKey = HTML.getAttributeKey((String) key);
if (hKey != null)
return hKey;
else
return key;
}
};
}
/**
* Set the parent set, containing the default values.
* @param a_parent
*/
public void setResolveParent(AttributeSet a_parent)
{
parent = a_parent;
}
/**
* Get the parent set, containing the default values.
* @return
*/
public AttributeSet getResolveParent()
{
return parent;
}
/**
* Add the attribute to this attribute set.
* @param key Attribute key (will be case insensitive)
* @param value Attribute value
*/
public void addAttribute(Object key, Object value)
{
super.addAttribute(key.toString().toLowerCase(), value);
}
}

View file

@ -0,0 +1,610 @@
/* tagStack.java -- The HTML tag stack.
Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.javax.swing.text.html.parser;
import gnu.javax.swing.text.html.parser.models.node;
import gnu.javax.swing.text.html.parser.models.transformer;
import java.util.BitSet;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.ListIterator;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.html.HTML;
import javax.swing.text.html.parser.*;
/**
* <p>The HTML content validator, is responsible for opening and
* closing elements with optional start/end tags, detecting
* the wrongly placed html tags and reporting errors. The working instance
* is the inner class inside the {@link javax.swing.text.html.parser.Parser }
* </p>
* <p>This class could potentially
* provide basis for automated closing and insertion of the html tags,
* correcting the found html errors.
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public abstract class htmlValidator
{
/**
* The tag reference, holding additional information that the tag
* has been forcibly closed.
*/
protected class hTag
{
protected final Element element;
protected final HTML.Tag tag;
protected final TagElement tgElement;
protected boolean forcibly_closed;
protected node validationTrace;
protected hTag(TagElement an_element)
{
element = an_element.getElement();
tag = an_element.getHTMLTag();
tgElement = an_element;
if (element.content != null)
validationTrace = transformer.transform(element.content, dtd);
}
/**
* This is called when the tag must be forcibly closed because
* it would make the newly appearing tag invalid.
* The parser is not notified about such event (just the error
* is reported). For such tags, the closing message does not
* appear when later reaching the end of stream. The exception is
* the &lt;head&gt; tag: the parser is notified about its silent closing
* when &lt;body&gt; or other html content appears.
*/
protected void forciblyCloseDueContext()
{
forcibly_closed = true;
}
/**
* This is called when the tag must be forcibly closed after
* reaching the end of stream. The parser is notified as if
* closing the tag explicitly.
*/
protected void forciblyCloseDueEndOfStream()
{
forcibly_closed = true;
handleSupposedEndTag(element);
}
}
/**
* The DTD, providing information about the valid document structure.
*/
protected final DTD dtd;
/**
* The stack, holding the current tag context.
*/
protected final LinkedList stack = new LinkedList();
/**
* Creates a new tag stack, using the given DTD.
* @param a_dtd A DTD, providing the information about the valid
* tag content.
*/
public htmlValidator(DTD a_dtd)
{
dtd = a_dtd;
}
/**
* Close all opened tags (called at the end of parsing).
*/
public void closeAll()
{
hTag h;
while (!stack.isEmpty())
{
h = (hTag) stack.getLast();
if (!h.forcibly_closed && !h.element.omitEnd())
s_error("Unclosed <" + h.tag + ">, closing at the end of stream");
handleSupposedEndTag(h.element);
closeTag(h.tgElement);
}
}
/**
* Remove the given tag from the stack or (if found) from the list
* of the forcibly closed tags.
*/
public void closeTag(TagElement tElement)
{
HTML.Tag tag = tElement.getHTMLTag();
hTag x;
hTag close;
if (!stack.isEmpty())
{
ListIterator iter = stack.listIterator(stack.size());
while (iter.hasPrevious())
{
x = (hTag) iter.previous();
if (tag.equals(x.tag))
{
if (x.forcibly_closed && !x.element.omitEnd())
s_error("The tag <" + x.tag +
"> has already been forcibly closed"
);
// If the tag has a content model defined, forcibly close all
// tags that were opened after the tag being currently closed.
closing:
if (x.element.content != null)
{
iter = stack.listIterator(stack.size());
while (iter.hasPrevious())
{
close = (hTag) iter.previous();
if (close == x)
break closing;
handleSupposedEndTag(close.element);
iter.remove();
}
}
stack.remove(x);
return;
}
}
}
s_error("Closing unopened <" + tag + ">");
}
/**
* Add the given HTML tag to the stack of the opened tags. Forcibly closes
* all tags in the stack that does not allow this tag in they content (error
* is reported).
* @param element
*/
public void openTag(TagElement tElement, htmlAttributeSet parameters)
{
// If this is a fictional call, the message from the parser
// has recursively returned - ignore.
if (tElement.fictional())
return;
validateParameters(tElement, parameters);
// If the stack is empty, start from HTML
if (stack.isEmpty() && tElement.getHTMLTag() != HTML.Tag.HTML)
{
Element html = dtd.getElement(HTML.Tag.HTML.toString());
openFictionalTag(html);
}
Object v = tagIsValidForContext(tElement);
if (v != Boolean.TRUE)
{
// The tag is not valid for context, the content
// model suggest to open another tag.
if (v instanceof Element)
{
int n = 0;
while (v instanceof Element && (n++ < 100))
{
Element fe = (Element) v;
// notify the content model that we add the proposed tag
getCurrentContentModel().show(fe);
openFictionalTag(fe);
Object vv = tagIsValidForContext(tElement);
if (vv instanceof Element) // One level of nesting is supported.
{
openFictionalTag((Element) vv);
Object vx = tagIsValidForContext(tElement);
if (vx instanceof Element)
openFictionalTag((Element) vx);
}
else if (vv == Boolean.FALSE)
{
// The tag is still not valid for the current
// content after opening a fictional element.
if (fe.omitEnd())
{
// close the previously opened fictional tag.
closeLast();
vv = tagIsValidForContext(tElement);
if (vv instanceof Element)
// another tag was suggested by the content model
openFictionalTag((Element) vv);
}
}
v = tagIsValidForContext(tElement);
}
}
else // If the current element has the optional end tag, close it.
{
if (!stack.isEmpty())
{
closing:
do
{
hTag last = (hTag) stack.getLast();
if (last.element.omitEnd())
{
closeLast();
v = tagIsValidForContext(tElement);
if (v instanceof Element) // another tag was suggested by the content model
{
openFictionalTag((Element) v);
break closing;
}
}
else
break closing;
}
while (v == Boolean.FALSE && !stack.isEmpty());
}
}
}
stack.add(new hTag(tElement));
}
/**
* Clear the stack.
*/
public void restart()
{
stack.clear();
}
/**
* Check if this tag is valid for the current context.
* Return Boolean.True if it is OK, Boolean.False
* if it is surely not OK or the Element that the
* content model recommends to insert making the situation
* ok. If Boolean.True is returned, the content model current
* position is moved forward. Otherwise this position remains
* the same.
* @param tElement
* @return
*/
public Object tagIsValidForContext(TagElement tElement)
{
// Check the current content model, if one is available.
node cv = getCurrentContentModel();
if (cv != null)
return cv.show(tElement.getElement());
// Check exclusions and inclusions.
ListIterator iter = stack.listIterator(stack.size());
hTag t;
final int idx = tElement.getElement().index;
// Check only known tags.
if (idx >= 0)
{
BitSet inclusions = new BitSet();
while (iter.hasPrevious())
{
t = (hTag) iter.previous();
if (!t.forcibly_closed)
{
if (t.element.exclusions != null &&
t.element.exclusions.get(idx)
)
return Boolean.FALSE;
if (t.element.inclusions != null)
inclusions.or(t.element.inclusions);
}
}
if (!inclusions.get(idx))
return Boolean.FALSE;
}
return Boolean.TRUE;
}
/**
* Validate tag without storing in into the tag stack. This is called
* for the empty tags and results the subsequent calls to the openTag
* and closeTag.
*/
public void validateTag(TagElement tElement, htmlAttributeSet parameters)
{
openTag(tElement, parameters);
closeTag(tElement);
}
/**
* Check for mandatory elements, subsequent to the last tag:
* @param tElement The element that will be inserted next.
*/
protected void checkContentModel(TagElement tElement, boolean first)
{
if (stack.isEmpty())
return;
hTag last = (hTag) stack.getLast();
if (last.validationTrace == null)
return;
Object r = last.validationTrace.show(tElement.getElement());
if (r == Boolean.FALSE)
s_error("The <" + last.element + "> does not match the content model " +
last.validationTrace
);
else if (r instanceof Element) // The content model recommends insertion of this element
{
if (!first)
closeTag(last.tgElement);
handleSupposedStartTag((Element) r);
openTag(new TagElement((Element) r), null);
}
}
/**
* The method is called when the tag must be closed because
* it does not allow the subsequent elements inside its context
* or the end of stream has been reached. The parser is only
* informed if the element being closed does not require the
* end tag (the "omitEnd" flag is set).
* The closing message must be passed to the parser mechanism
* before passing message about the opening the next tag.
*
* @param element The tag being fictionally (forcibly) closed.
*/
protected abstract void handleSupposedEndTag(Element element);
/**
* The method is called when the validator decides to open the
* tag on its own initiative. This may happen if the content model
* includes the element with the optional (supposed) start tag.
*
* @param element The tag being opened.
*/
protected abstract void handleSupposedStartTag(Element element);
/**
* Handles the error message. This method must be overridden to pass
* the message where required.
* @param msg The message text.
*/
protected abstract void s_error(String msg);
/**
* Validate the parameters, report the error if the given parameter is
* not in the parameter set, valid for the given attribute. The information
* about the valid parameter set is taken from the Element, enclosed
* inside the tag. The method does not validate the default parameters.
* @param tag The tag
* @param parameters The parameters of this tag.
*/
protected void validateParameters(TagElement tag, htmlAttributeSet parameters)
{
if (parameters == null ||
parameters == htmlAttributeSet.EMPTY_HTML_ATTRIBUTE_SET ||
parameters == SimpleAttributeSet.EMPTY
)
return;
Enumeration enumeration = parameters.getAttributeNames();
while (enumeration.hasMoreElements())
{
validateAttribute(tag, parameters, enumeration);
}
// Check for missing required values.
AttributeList a = tag.getElement().getAttributes();
while (a != null)
{
if (a.getModifier() == DTDConstants.REQUIRED)
if (parameters.getAttribute(a.getName()) == null)
{
s_error("Missing required attribute '" + a.getName() + "' for <" +
tag.getHTMLTag() + ">"
);
}
a = a.next;
}
}
private node getCurrentContentModel()
{
if (!stack.isEmpty())
{
hTag last = (hTag) stack.getLast();
return last.validationTrace;
}
else
return null;
}
private void closeLast()
{
handleSupposedEndTag(((hTag) stack.getLast()).element);
stack.removeLast();
}
private void openFictionalTag(Element e)
{
handleSupposedStartTag(e);
stack.add(new hTag(new TagElement(e, true)));
if (!e.omitStart())
s_error("<" + e + "> is expected (supposing it)");
}
private void validateAttribute(TagElement tag, htmlAttributeSet parameters,
Enumeration enumeration
)
{
Object foundAttribute;
AttributeList dtdAttribute;
foundAttribute = enumeration.nextElement();
dtdAttribute = tag.getElement().getAttribute(foundAttribute.toString());
if (dtdAttribute == null)
{
StringBuffer valid =
new StringBuffer("The tag <" + tag.getHTMLTag() +
"> cannot contain the attribute '" + foundAttribute +
"'. The valid attributes for this tag are: "
);
AttributeList a = tag.getElement().getAttributes();
while (a != null)
{
valid.append(a.name.toUpperCase());
valid.append(' ');
a = a.next;
}
s_error(valid.toString());
}
else
{
String value = parameters.getAttribute(foundAttribute).toString();
if (dtdAttribute.type == DTDConstants.NUMBER)
validateNumberAttribute(tag, foundAttribute, value);
if (dtdAttribute.type == DTDConstants.NAME ||
dtdAttribute.type == DTDConstants.ID
)
validateNameOrIdAttribute(tag, foundAttribute, value);
if (dtdAttribute.values != null)
validateAttributeWithValueList(tag, foundAttribute, dtdAttribute,
value
);
}
}
private void validateAttributeWithValueList(TagElement tag,
Object foundAttribute,
AttributeList dtdAttribute,
String value
)
{
if (!dtdAttribute.values.contains(value.toLowerCase()) &&
!dtdAttribute.values.contains(value.toUpperCase())
)
{
StringBuffer valid;
if (dtdAttribute.values.size() == 1)
valid =
new StringBuffer("The attribute '" + foundAttribute +
"' of the tag <" + tag.getHTMLTag() +
"> cannot have the value '" + value +
"'. The only valid value is "
);
else
valid =
new StringBuffer("The attribute '" + foundAttribute +
"' of the tag <" + tag.getHTMLTag() +
"> cannot have the value '" + value + "'. The " +
dtdAttribute.values.size() +
" valid values are: "
);
Enumeration vv = dtdAttribute.values.elements();
while (vv.hasMoreElements())
{
valid.append('"');
valid.append(vv.nextElement());
valid.append("\" ");
}
s_error(valid.toString());
}
}
private void validateNameOrIdAttribute(TagElement tag, Object foundAttribute,
String value
)
{
boolean ok = true;
if (!Character.isLetter(value.charAt(0)))
ok = false;
char c;
for (int i = 0; i < value.length(); i++)
{
c = value.charAt(i);
if (!(
Character.isLetter(c) || Character.isDigit(c) ||
"".indexOf(c) >= 0
)
)
ok = false;
}
if (!ok)
s_error("The '" + foundAttribute + "' attribute of the tag <" +
tag.getHTMLTag() + "> must start from letter and consist of " +
"letters, digits, hypens, colons, underscores and periods. " +
"It cannot be '" + value + "'"
);
}
private void validateNumberAttribute(TagElement tag, Object foundAttribute,
String value
)
{
try
{
Integer.parseInt(value);
}
catch (NumberFormatException ex)
{
s_error("The '" + foundAttribute + "' attribute of the tag <" +
tag.getHTMLTag() + "> must be a valid number and not '" +
value + "'"
);
}
}
}

View file

@ -0,0 +1,62 @@
/* PCDATAonly_model.java --
Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.javax.swing.text.html.parser.models;
import java.io.Serializable;
/**
* The model, allowing only PCDATA in it (like for element OPTION).
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class PCDATAonly_model
extends node
implements Serializable
{
private static final long serialVersionUID = 1;
public PCDATAonly_model()
{
super((char) 0, (char) 0, null);
}
public Object show(Object x)
{
return x.toString().equalsIgnoreCase("#pcdata") ? Boolean.TRUE : Boolean.FALSE;
}
}

View file

@ -0,0 +1,77 @@
/* TableRowContentModel.java --
Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.javax.swing.text.html.parser.models;
import java.io.Serializable;
import javax.swing.text.html.parser.DTD;
import javax.swing.text.html.parser.Element;
/**
* Table row content model.
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class TableRowContentModel
extends node
implements Serializable
{
private static final long serialVersionUID = 1;
final Element TD;
public TableRowContentModel(DTD dtd)
{
super((char) 0, (char) 0, null);
TD = dtd.getElement("TD");
}
public Object show(Object x)
{
// Always accept TD and TH
String s = x.toString();
if (s.equalsIgnoreCase("TD") || s.equalsIgnoreCase("TH"))
return Boolean.TRUE;
// Suggest closing in response to TR:
if (s.equalsIgnoreCase("TR"))
return Boolean.FALSE;
// Recommend TD for other cases:
return TD;
}
}

View file

@ -0,0 +1,382 @@
/* list.java --
Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.javax.swing.text.html.parser.models;
import java.io.Serializable;
/**
* Part of the internal representation of the content model.
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class list
extends node
implements Serializable
{
private static final long serialVersionUID = 1;
/**
* Setting to true means that the list nodes must always be connected
* by the same operation. This is far safer and clearer, but not
* required by default standard.
*/
public static boolean CLEAR;
/**
* A list of nodes.
*/
public final node[] nodes;
/**
* Creates a new model list that is a member of some enclosing list.
* @param binary_operator An operator with that this list is connected
* with other members of the enclosing list.
* @param unary_operator The unary operator for this list.
* @param a_nodes The nodes inside this list.
*/
public list(char binary_operator, char unary_operator, node[] a_nodes)
{
super(binary_operator, unary_operator, a_nodes);
nodes = a_nodes;
}
/**
* Creates a new model list. Assigns the previous field.
* @param a_nodes The nodes for this list.
* @throws an error if the node elements are connected by the
* different operations. This is not supported, use grouping.
*/
public list(node[] a_nodes)
throws Error
{
this(',', (char) 0, a_nodes);
int operation = nodes [ 0 ].binary;
for (int i = 0; i < nodes.length; i++)
{
if (CLEAR && nodes [ i ].binary != operation)
throw new Error("List members can only be connected by " +
"the same operation, use grouping"
);
if (i > 0)
nodes [ i ].previous = nodes [ i - 1 ];
}
}
/**
* Returns true if all members in the list are closed.
*/
public boolean isClosed()
{
if (super.isClosed())
return true;
for (int i = 0; i < nodes.length; i++)
{
if (!nodes [ i ].isClosed())
return false;
}
return true;
}
/**
* Find the token that could match as the next token in
* the token list.
*
* @return Such token object or null if none is found.
*/
public Object findFreeNode()
{
Object fn;
for (int j = 0; j < nodes.length; j++)
{
if (!nodes [ j ].isClosed())
{
fn = nodes [ j ].findFreeNode();
if (fn != null)
return fn;
}
}
return null;
}
/**
* Tries to match this list agains the given token sequence.
* @param tokens the sequence of the tokens to match.
* @return true if the valid match is found.
*/
public boolean matches(Object[] tokens)
{
reset();
Object x;
boolean m;
boolean matched = false;
for (int i = 0; i < tokens.length; i++)
{
matched = false;
x = tokens [ i ];
nodescan:
for (int j = 0; j < nodes.length; j++)
{
if (!nodes [ j ].isClosed())
{
m = nodes [ j ].performMatch(x);
if (m)
{
matched = true;
break nodescan;
}
}
}
if (!matched)
return false;
}
boolean valid = true;
for (int i = 0; i < nodes.length; i++)
{
if (!nodes [ i ].valid())
valid = false;
}
return valid;
}
/**
* The list never closes, despite it is trated as closed
* if all members in the list are closed.
* @return false.
*/
public boolean mustClose()
{
return false;
}
/**
* Perform a match operation for the single token
* against this list.
* @param token a token to match.
* @return true if the match is found.
*/
public boolean performMatch(Object token)
{
boolean ok = false;
Matching:
for (int i = 0; i < nodes.length; i++)
{
ok = nodes [ i ].performMatch(token);
if (ok)
break Matching;
}
if (ok)
matches();
return ok;
}
/**
* Prepeares the list for the next matching operation.
*/
public void reset()
{
super.reset();
for (int i = 0; i < nodes.length; i++)
nodes [ i ].reset();
}
/**
* Check if the provided token can match as a next token in the
* list. In the case of match, the list state changes, moving
* current position after the matched token. However if this method
* returns a suggested new token to insert before the provided one,
* the state of the list does not change.
* @return Boolean.TRUE if the match is found,
* Boolean.FALSE if the match is not possible and no token can be
* inserted to make the match valid. Otherwise, returns the
* token object that can be inserted before the last token in the
* list, probably (not for sure) making the match valid.
* If the object is an instance of Element or TagElement,
* it is first ensured that the object flag "omit start" is set.
*/
public Object show(Object x)
{
boolean m;
boolean matched = false;
nodescan:
for (int j = 0; j < nodes.length; j++)
{
if (!nodes [ j ].isClosed())
{
m = nodes [ j ].performMatch(x);
if (m)
{
matched = true;
break nodescan;
}
else
{
// For comma operation, only first not closed
// node must be tested for a match.
// unless it allows matching zero times.
if (binary == ',' &&
!(nodes [ j ].unary == '?' || nodes [ j ].unary == '*')
)
break nodescan;
}
}
}
if (!matched)
{
// Find and return that would be matched.
Object freeNode = findFreeNode();
if (freeNode == null)
return Boolean.FALSE;
else
return freeNode;
}
for (int i = 0; i < nodes.length; i++)
if (!nodes [ i ].validPreliminary())
{
return Boolean.FALSE;
}
return Boolean.TRUE;
}
/**
* Returns a string representation of the list.
* @return String representation, similar to BNF expression.
*/
public String toString()
{
StringBuffer b = new StringBuffer();
b.append(" ( ");
for (int i = 0; i < nodes.length; i++)
{
if (i > 0)
b.append(" " + (char) nodes [ i ].binary + " ");
b.append(nodes [ i ]);
}
b.append(" )");
if (unary != 0)
b.append((char) unary);
else
b.append(' ');
return b.toString();
}
/**
* Returns true if all memebers in the list are valid.
*/
public boolean valid()
{
for (int i = 0; i < nodes.length; i++)
{
if (!nodes [ i ].valid())
return false;
}
return true;
}
/**
* Returns true if all memebers in the list are either valid
* or unvisited. The unvisited members can become valid after
* more tokens will be shown.
*/
public boolean validPreliminary()
{
if (silenceAllowed())
{
boolean everVisited = false;
for (int i = 0; i < nodes.length; i++)
{
if (nodes [ i ].visits > 0)
{
everVisited = true;
break;
}
}
if (!everVisited)
return true;
}
for (int i = 0; i < nodes.length; i++)
{
if (!nodes [ i ].validPreliminary())
return false;
}
return true;
}
/**
* Closes all members in the list.
*/
protected void close()
{
super.close();
for (int i = 0; i < nodes.length; i++)
{
nodes [ i ].close();
}
}
/**
* Compare given token with the token of this node.
* If the token represents a <code>list</code>, the call may be
* delegeted to the child subnodes.
* @param a_token A token to compare.
* @return True if the token matches the token of this node.
*/
protected boolean compare(Object a_token)
{
return performMatch(a_token);
}
}

View file

@ -0,0 +1,75 @@
/* noTagModel.java --
Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.javax.swing.text.html.parser.models;
import java.io.Serializable;
/**
* Disallows a single given tag at the current content level only.
* <p>@author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)</p>
*/
public class noTagModel
extends node
implements Serializable
{
private static final long serialVersionUID = 1;
final String[] no;
public noTagModel(String[] noTag)
{
super((char) 0, (char) 0, null);
no = noTag;
}
public noTagModel(String noTag)
{
super((char) 0, (char) 0, null);
no = new String[] { noTag };
}
public Object show(Object x)
{
for (int i = 0; i < no.length; i++)
{
if (x.toString().equalsIgnoreCase(no [ i ]))
return Boolean.FALSE;
}
return Boolean.TRUE;
}
}

View file

@ -0,0 +1,337 @@
/* node.java --
Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.javax.swing.text.html.parser.models;
import java.io.Serializable;
/**
* Part of the internal representation of the content model.
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class node
implements Serializable
{
private static final long serialVersionUID = 1;
/**
* The token to match (can be instance of list).
*/
public Object token;
/**
* True for the node that cannot be visited again.
*/
public boolean _closed;
/**
* The binary operation for this node.
*/
public char binary;
/**
* The unary opeation for this node.
*/
public char unary;
/**
* The number of times the node already was visited.
*/
public int visits;
/**
* The previous node in content model (used for closing nodes).
*/
public node previous;
/**
* Creates a new node.
* @param binary_operator The operator, connecting all nodes in the list.
* The nodes, connected by the different operators, must be arranged into
* the different lists.
* @param unary_operator The unary operator for this node or zero if
* no such was specified.
* @param token The token to match. This can be either a string or
* the new instance of the list.
* @param a_previous The previous node in the list, null for the first
* node. This is used for propagating the closing operation for the
* comma delimited list.
*/
public node(char binary_operator, char unary_operator, Object a_token)
{
if (a_token != null)
if (a_token.getClass().equals(node.class))
throw new Error("Creating node in node is redundant and ineffective.");
binary = binary_operator;
unary = unary_operator;
token = a_token;
}
/**
* Checks if this node is in the closed state.
* @return True if the node is closed.
*/
public boolean isClosed()
{
return _closed;
}
/**
* Check if closing this node means closing the previous node.
*/
public boolean closePrevious()
{
return binary == ',';
}
/**
* Return the token object if it could match as a next token in
* a token list of null if it could not.
* @return
*/
public Object findFreeNode()
{
boolean ok;
if (isClosed() || silenceAllowed())
return null;
// Try if the node would stay valid after a one more visit.
visits++;
ok = valid();
visits--;
if (ok)
{
if (token instanceof node)
return ((node) token).findFreeNode();
else
return token;
}
else
return null;
}
/**
* Check if the current situation is such that the node must be closed
* now.
*/
public boolean mustClose()
{
switch (unary)
{
case 0 :
return true;
case '*' :
return false;
case '+' :
return false;
case '?' :
return visits <= 1;
default :
throw new Error("Invalid unary operation " + unary + " ( '" +
(char) unary + "' )"
);
}
}
/**
* Do the match operation with the given token. This sets various
* flags.
* @param token The token to match.
* @return true if the the token matches node, false if it does not match
* or if the node is closed.
*/
public boolean performMatch(Object a_token)
{
if (isClosed())
return false;
boolean matches = compare(a_token);
if (matches)
matches();
return matches;
}
/**
* Prepares the node for matching against a new list of tokens.
*/
public void reset()
{
_closed = false;
visits = 0;
}
/**
* Check if the provided token can match this node.
* In the case of match, the node state changes, moving
* current position after the matched token. However if this method
* returns a suggested new token to insert before the provided one,
* the state of the list does not change.
* @return Boolean.TRUE if the match is found,
* Boolean.FALSE if the match is not possible and no token can be
* inserted to make the match valid. Otherwise, returns the
* token object that can be inserted before the last token in the
* list, probably (not for sure) making the match valid.
*/
public Object show(Object x)
{
if (compare(x))
return performMatch(x) ? Boolean.TRUE : Boolean.FALSE;
Object recommended = findFreeNode();
return recommended != null ? recommended : Boolean.FALSE;
}
/**
* Check if it would be a valid case if this node is visited zero times.
* Nodes with unary operator * or ? need not be matched to make a
* model valid.
*/
public boolean silenceAllowed()
{
return unary == '?' || unary == '*';
}
/**
* Returns a string representation of the list.
* @return String representation, similar to BNF expression.
*/
public String toString()
{
StringBuffer b = new StringBuffer();
b.append(token);
if (unary != 0)
b.append((char) unary);
else
b.append('\'');
return b.toString();
}
/**
* Check if the node state is valid.
*/
public boolean valid()
{
switch (unary)
{
case 0 :
if (binary == '|')
return true;
else
return visits == 1;
case '*' :
return true;
case '+' :
return visits > 0;
case '?' :
return visits <= 1;
default :
throw new Error("Invalid unary operation " + unary + " ( '" +
(char) unary + "' )"
);
}
}
public boolean validPreliminary()
{
return visits == 0 || valid();
}
/**
* Closes this node and, if closePrevious() returs true, calls close() for
* the previous node.
*/
protected void close()
{
_closed = true;
if (previous != null && closePrevious())
previous.close();
}
/**
* Compare the provided token object with the token object of this node.
*/
protected boolean compare(Object a_token)
{
if (token instanceof Object[])
throw new Error("Invalid token object, probably the 'list' " +
"should be used. "
);
if (token instanceof node[])
throw new Error("Do not use 'node' for the array of nodes, use 'list'. ");
if (token instanceof node)
{
return ((node) token).performMatch(a_token);
}
boolean rt = false;
if (token == a_token)
rt = true;
if (token.equals(a_token))
rt = true;
if (token.toString().equalsIgnoreCase(a_token.toString()))
rt = true;
return rt;
}
/**
* Fire the changes that must happen then the token matches this node.
*/
protected void matches()
{
visits++;
if (mustClose())
close();
}
}

View file

@ -0,0 +1,53 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<!-- package.html - describes classes in javax.swing.text.html.parser package.
Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. -->
<html>
<head><title>GNU Classpath - gnu.javax.swing.text.html.parser.models</title></head>
<body>
<p>This package contains classes for working with content models. In this implementation, the
standardized content model is pre-processed by <code>transformer</code> into an instance of
<code>node</code>. Node holds a single element of the content model with the optional unary operation.
The derived class <code>list</code> holds multiple nodes connected by the same binary operation.
As the members of this <code>list</code> can also be lists itself, these structures support
the most of required operations. Several cases when the model cannot be expressed using
BNF syntax are handled providing specialised classes that are also derived from <code>node</code>.
</p>
@author Audrius Meskauskas, Lithuania
</body>
</html>

View file

@ -0,0 +1,201 @@
/* transformer.java -- Content model transforms.
Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.javax.swing.text.html.parser.models;
import java.io.Serializable;
import javax.swing.text.html.parser.ContentModel;
import javax.swing.text.html.parser.DTD;
/**
* Transforms the standard ContentModel tree into the internal representation,
* used in this implementation.
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class transformer
implements Serializable
{
private static final long serialVersionUID = 1;
/**
* All binary operators.
*/
protected static String binary = "&|,";
/**
* All unary operators.
*/
protected static String unary = "+*?";
/**
* Measure length of the linked list of the content models.
* @param c The heading element of the linked list.
* @return the length of the list (0 for null 1 if c!=null and c.next==null,
* etc.
*/
public static int measureChainLength(ContentModel c)
{
if (c == null)
return 0;
else
return measureChainLength(c.next) + 1;
}
/**
* Transform into internal representation without usind dtd.
* This should be used only for testing.
*/
public static node transform(ContentModel c)
{
return transform(c, null);
}
/**
* Transform into internal representation.
* @param c a model to transform
* @return a transformed model
* @throws Error if the model structure contains errors.
*/
public static node transform(ContentModel c, DTD dtd)
{
// Handle the special cases first.
if (c.content instanceof node)
return (node) c.content;
// Do the typical transform.
node n;
/* Case with the single token */
if (c.next == null)
{
n = optionalTransform(c, dtd);
}
else /* Case with the chain of the multiple tokens. */
{
node[] l = new node[ measureChainLength(c) ];
ContentModel m = c;
for (int i = 0; i < l.length; i++)
{
if (m.content instanceof ContentModel)
{
ContentModel nested = (ContentModel) m.content;
if (nested.next == null &&
!(nested.content instanceof ContentModel)
)
{
l [ i ] =
new node((char) m.type, (char) nested.type, nested.content);
}
else
{
l [ i ] = transform(nested, dtd);
}
}
else
l [ i ] = new node((char) 0, (char) 0, m.content);
addtype(l [ i ], (char) m.type);
m = m.next;
}
if (isBinary(c.type))
for (int i = 0; i < l.length; i++)
{
l [ i ].binary = (char) c.type;
}
n = new list(l);
}
addtype(n, (char) c.type);
return n;
}
/**
* True for binary operator
* @param c a character to test
* @return true for [ ,&| ], false otherwise.
*/
private static boolean isBinary(int c)
{
return binary.indexOf((char) c) >= 0;
}
/**
* True for unary operator.
* @param c a character to test
* @return true for [ +?* ], false otherwise.
*/
private static boolean isUnary(int c)
{
return unary.indexOf((char) c) >= 0;
}
/**
* Assign an operation type for the given node.
* @param n A node to set the operation to.
* @param type Either binary or unary operation, is assigned to the
* corresponding field of the node.
* @throws error if the operation type is not
* representing a valid unary or binary operation.
*/
private static void addtype(node n, char type)
{
if (isBinary(type))
n.binary = type;
else if (isUnary(type))
n.unary = type;
else if (type != 0)
throw new Error("Invalid operation '" + (char) type + "'");
}
private static node optionalTransform(ContentModel c, DTD dtd)
{
node n;
if (c.content instanceof ContentModel)
n = transform((ContentModel) c.content, dtd);
else
/* A single token with the specified operation */
n = new node((char) 0, (char) 0, c.content);
return n;
}
}

View file

@ -0,0 +1,51 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<!-- package.html - describes classes in javax.swing.text.html.parser package.
Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. -->
<html>
<head><title>GNU Classpath - javax.swing.text.html.parser</title></head>
<body>
<p>Provides the error tolerant, DTD-driven HTML 4.01 parser.
The parser that is used in web robots, html content analysers,
web browsers, web editors and other related applications.
It should compativle with the older HTML versions, supporting
obsoleted HTML featues. This package also includes some
supporting classes.</p>
@author Audrius Meskauskas, Lithuania
</body>
</html>

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,112 @@
/* gnuStringIntMapper.java --
Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.javax.swing.text.html.parser.support;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
/**
* A helper class, mapping between the strings and they unique integer
* identifiers.
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public abstract class gnuStringIntMapper
{
/**
* Maps argument integer values from DTDConstants into they string
* names. Initialized on demand.
*/
private Map is_Map;
/**
* Maps argument string names into they integer values from DTDConstants.
* Initialized on demand.
*/
private Map si_Map;
/**
* Get string from id or null if no such id is present in the mapper.
*/
public final String get(int id)
{
if (is_Map == null)
createTheMap();
return (String) is_Map.get(new Integer(id));
}
/** Get id from string or 0 if no such string is present in the mapper. */
public final int get(String id)
{
if (si_Map == null)
createTheMap();
Integer i = (Integer) si_Map.get(id);
return i != null ? i.intValue() : 0;
}
/**
* Create the mapping table for this mapper by adding the required
* String/int pairs. The method is invoked
* only once for each instance, after the first invocation of the any
* form of the <code>get</code> method. Use <code>add</code> to
* create a map for a concrete instance.
*/
protected abstract void create();
/**
* Add an id/string pair to this mapper. This is called from
* the method <code>create</code> only.
*/
protected void add(String name, int id)
{
Integer i = new Integer(id);
si_Map.put(name, i);
is_Map.put(i, name);
}
private void createTheMap()
{
is_Map = new HashMap();
si_Map = new TreeMap();
create();
}
}

View file

@ -0,0 +1,238 @@
/* Buffer.java --
Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.javax.swing.text.html.parser.support.low;
/**
* A string buffer that additionally holds line and absolute postion
* information.
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class Buffer
{
public static int INITIAL_SIZE = 2048;
/**
* True if the \n symbol has been seen.
*/
public boolean n_seen;
/**
* True if the \r symbol has been seen.
*/
public boolean r_seen;
char[] chr = new char[ INITIAL_SIZE ];
int[] line = new int[ INITIAL_SIZE ];
int[] position = new int[ INITIAL_SIZE ];
/**
* Current line.
*/
int current_line = 0;
/**
* Point to the next free position.
*/
int length;
public Buffer()
{
}
public Buffer(String content)
{
for (int i = 0; i < content.length(); i++)
{
append(content.charAt(i), i);
}
}
/**
* Get the characters into array.
* @param srcBegin From, inclusive
* @param srcEnd To, exclusive.
* @param dst Into
* @param dstBegin Offset.
*/
public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
{
System.arraycopy(chr, srcBegin, dst, dstBegin, (srcEnd - srcBegin));
}
/**
* Return the sequence, used to separate lines in the document.
* @return one of \n, \r or \r\n.
*/
public String getEndOfLineSequence()
{
if (r_seen && n_seen)
return "\r\n";
else if (r_seen)
return "\r";
else
// This also is returned for single-line document.
return "\n";
}
/**
* Truncate.
* @param n The length to truncate till.
*/
public void setLength(int n)
{
length = n;
}
/**
* Get location information for the given region.
* @param from Region start, inclusive.
* @param to Region end, exclusive.
* @return The location, covering the region.
*/
public Location getLocation(int from, int to)
{
Location l = new Location();
l.beginLine = line [ from ];
l.endLine = line [ to - 1 ];
l.startPosition = position [ from ];
l.endPosition = position [ to - 1 ] + 1;
return l;
}
/**
* Add the character.
* @param c The character.
* @param pos The character position in the stream (the line number
* is handled internally in the buffer).
*/
public void append(char c, int pos)
{
if (length >= chr.length)
expand();
chr [ length ] = c;
position [ length ] = pos;
if (c == '\n')
{
if (!r_seen)
current_line++;
n_seen = true;
}
else if (c == '\r')
{
current_line++;
r_seen = true;
}
line [ length ] = current_line;
length++;
}
/**
* Return char at the given positon.
*/
public char charAt(int i)
{
return chr [ i ];
}
/**
* Delete the range
* @param from Start position, inclusive.
* @param to End position, exclusive.
*/
public void delete(int from, int to)
{
int len = to - from;
if (len < 1)
throw new AssertionError("Deleting " + from + " till " + to);
int tail = length - to;
System.arraycopy(chr, to, chr, from, tail);
System.arraycopy(position, to, position, from, tail);
System.arraycopy(line, to, line, from, tail);
length = length - len;
}
/**
* Double the buffer size.
*/
public void expand()
{
int nSize = 2 * chr.length;
char[] nchr = new char[ nSize ];
int[] nposition = new int[ nSize ];
int[] nline = new int[ nSize ];
System.arraycopy(chr, 0, nchr, 0, chr.length);
System.arraycopy(position, 0, nposition, 0, position.length);
System.arraycopy(line, 0, nline, 0, line.length);
chr = nchr;
position = nposition;
line = nline;
}
/**
* Return length of the occupied part of the buffer.
*/
public int length()
{
return length;
}
/**
* Prepare for parsing the new document.
*/
public void reset()
{
setLength(0);
r_seen = n_seen = false;
}
public String toString()
{
return new String(chr, 0, length);
}
}

View file

@ -0,0 +1,422 @@
/* Constants.java --
Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.javax.swing.text.html.parser.support.low;
import java.util.BitSet;
/**
* The parser constants and operations, directly related to the parser
* constants.
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class Constants
{
/* Single character tokens are reflected into they ASCII codes. */
/**
* Start of HTML token.
*/
public static final int BEGIN = '<';
/**
* End of HTML token.
*/
public static final int END = '>';
/**
* Exclamation (indicates SGML or comment).
*/
public static final int EXCLAMATION = '!';
/**
* Slash (indicates closing tag).
*/
public static final int SLASH = '/';
/**
* Equals sign.
*/
public static final int EQ = '=';
/**
* Quoting sign.
*/
public static final int AP = '\'';
/**
* Quoting sign.
*/
public static final int QUOT = '"';
/* The numbers of other tokens start outside the ascii space. */
/* String tokens */
/**
* Double dash (--)
*/
public static final int DOUBLE_DASH = 1000;
/**
* The STYLE tag (needs special handling).
*/
public static final int STYLE = 1001;
/**
* The SCRIPT tag (needs special handling).
*/
public static final int SCRIPT = 1002;
/* Pattern tokens */
/**
* HTML whitespace.
*/
public static final int WS = 1003;
/**
* Named or numeric entity,
*/
public static final int ENTITY = 1004;
/**
* Sequence of valid name characters (can start from digit).
*/
public static final int NUMTOKEN = 1005;
/* Complex tokens */
/**
* Comment opening sequence.
*/
public static final pattern COMMENT_OPEN =
new pattern(new node[]
{
new node(BEGIN), new node(WS, true), new node(EXCLAMATION),
new node(WS, true), new node(DOUBLE_DASH),
}
);
/**
* Comment closing sequence
*/
public static final pattern COMMENT_END =
new pattern(new node[]
{
new node(DOUBLE_DASH), new node(WS, true), new node(END)
}
);
/**
* Special case ---> (also is treated as end of comment).
*/
public static final pattern COMMENT_TRIPLEDASH_END =
new pattern(new node[]
{
new node(DOUBLE_DASH), new node(NUMTOKEN), new node(END)
}
);
/**
* STYLE element heading pattern.
*/
public static final pattern STYLE_OPEN =
new pattern(new node[] { new node(BEGIN), new node(WS, true), new node(STYLE) });
/**
* SCRIPT element heading pattern.
*/
public static final pattern SCRIPT_OPEN =
new pattern(new node[] { new node(BEGIN), new node(WS, true), new node(SCRIPT) });
/**
* SGML element heading pattern.
*/
public static final pattern SGML =
new pattern(new node[]
{
new node(BEGIN), new node(WS, true), new node(EXCLAMATION)
}
);
/**
* SCRIPT element closing pattern.
*/
public static final pattern SCRIPT_CLOSE =
new pattern(new node[]
{
new node(BEGIN), new node(WS, true), new node(SLASH),
new node(WS, true), new node(SCRIPT), new node(WS, true),
new node(END)
}
);
/**
* STYLE element closing pattern.
*/
public static final pattern STYLE_CLOSE =
new pattern(new node[]
{
new node(BEGIN), new node(WS, true), new node(SLASH),
new node(WS, true), new node(STYLE), new node(WS, true),
new node(END)
}
);
/**
* Ordinary HTML tag heading pattern.
*/
public static final pattern TAG =
new pattern(new node[]
{
new node(BEGIN), new node(WS, true), new node(SLASH, true),
new node(WS, true), new node(NUMTOKEN)
}
);
/* Special tokens */
/**
* All other tokens.
*/
public static final int OTHER = 1999;
/**
* The UNICODE "end of text" control code
*/
static final char ETX = 3;
/**
* End of file.
*/
public static final int EOF = ETX;
/* Character categories */
/**
* All single char tokens.
*/
public static final BitSet bSINGLE_CHAR_TOKEN = new BitSet();
/**
* Non letters and non numbers, allowed in HTML names.
*/
public static final BitSet bSPECIAL = new BitSet();
/**
* All letters, used in HTML names.
*/
public static final BitSet bLETTER = new BitSet();
/**
* Digits.
*/
public static final BitSet bDIGIT = new BitSet();
/**
* Both line breaks.
*/
public static final BitSet bLINEBREAK = new BitSet();
/**
* All whitespace.
*/
public static final BitSet bWHITESPACE = new BitSet();
/**
* Both quoting characters.
*/
public static final BitSet bQUOTING = new BitSet();
/**
* Valid name characters.
*/
public static final BitSet bNAME = new BitSet();
/* Entity subcategories */
/**
* Named entity.
*/
public static final int ENTITY_NAMED = 1;
/**
* Numeric entity.
*/
public static final int ENTITY_NUMERIC = 2;
static
{
bQUOTING.set(AP);
bQUOTING.set(QUOT);
bSINGLE_CHAR_TOKEN.set(BEGIN);
bSINGLE_CHAR_TOKEN.set(END);
bSINGLE_CHAR_TOKEN.set(EXCLAMATION);
bSINGLE_CHAR_TOKEN.set(SLASH);
bSINGLE_CHAR_TOKEN.set(EQ);
bSINGLE_CHAR_TOKEN.set(EOF);
bSINGLE_CHAR_TOKEN.or(bQUOTING);
bLINEBREAK.set('\r');
bLINEBREAK.set('\n');
bWHITESPACE.set(' ');
bWHITESPACE.set('\t');
bWHITESPACE.set(0xC);
bWHITESPACE.or(bLINEBREAK);
for (char i = '0'; i <= '9'; i++)
{
bDIGIT.set(i);
}
for (char i = 'a'; i <= 'z'; i++)
{
bLETTER.set(i);
}
for (char i = 'A'; i <= 'Z'; i++)
{
bLETTER.set(i);
}
bSPECIAL.set('-');
bSPECIAL.set('_');
bSPECIAL.set(':');
bSPECIAL.set('.');
bNAME.or(bLETTER);
bNAME.or(bDIGIT);
bNAME.or(bSPECIAL);
}
/**
* Verifies if one of the tokens matches the end of string
* buffer. The last character in the string buffer is the
* "future character", some tokens needs to verify it the
* token does not continue "towards the future". If the token
* matches, it matches till "pre-last" character in the buffer.
* @param b
* @return
*/
public Token endMatches(Buffer b)
{
if (b.length() < 2)
return null;
int p = b.length() - 2;
if (b.length() > 2 && b.charAt(p) == '-' && b.charAt(p - 1) == '-')
return new Token(DOUBLE_DASH, "--", b.getLocation(p - 1, p + 1));
char last = b.charAt(p);
if (bSINGLE_CHAR_TOKEN.get(last))
return new Token(last, last, b.getLocation(p, p + 1));
char future = b.charAt(p + 1);
// Check for numtokens, script and style:
if (bNAME.get(last) && !bNAME.get(future))
{
// Scan the history up:
int u = p - 1;
while (u >= 0 && bNAME.get(b.charAt(u)))
u--;
u++;
char[] token = new char[ p - u + 1 ];
// Found a numtoken
b.getChars(u, p + 1, token, 0);
// Verify for the built-in tokens:
String e = new String(token);
// found the entity reference
if (u > 0 && b.charAt(u - 1) == '&')
{
// The subsequent semicolon may be the part of the token
// as well. The semicolon must be ignored. This must be
// handled elsewhere.
return new Token(ENTITY, ENTITY_NAMED, "&" + e,
b.getLocation(u - 1, p + 1)
);
}
// found the numeric entity reference
if (u > 1 && b.charAt(u - 1) == '#' && b.charAt(u - 2) == '&')
{
// The subsequent semicolon may be the part of the token
// as well. The semicolon must be ignored. This must be
// handled elsewhere.
return new Token(ENTITY, ENTITY_NUMERIC, "&#" + e,
b.getLocation(u - 2, p + 2)
);
}
Location le = b.getLocation(u, p + 1);
if (e.equalsIgnoreCase("SCRIPT"))
return new Token(SCRIPT, e, le);
else if (e.equalsIgnoreCase("STYLE"))
return new Token(STYLE, e, le);
else
return new Token(NUMTOKEN, e, le);
}
// Check for whitespace
if (bWHITESPACE.get(last) && !bWHITESPACE.get(future))
{
// Scan the history up:
int u = p - 1;
while (u >= 0 && bWHITESPACE.get(b.charAt(u)))
u--;
u++;
char[] token = new char[ p - u + 1 ];
b.getChars(u, p + 1, token, 0);
return new Token(WS, new String(token), b.getLocation(u, p + 1));
}
return null;
}
}

View file

@ -0,0 +1,83 @@
/* Location.java --
Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.javax.swing.text.html.parser.support.low;
/**
* Defines a region in the text: its bounding positions and the line number.
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class Location
{
/**
* The line number, where the token starts.
*/
public int beginLine;
/**
* The line, where the token ends.
*/
public int endLine;
/**
* The absolute token end position in the input stream,
* exclusive.
*/
public int endPosition;
/**
* The absolute token start position in the input stream,
* inclusive.
*/
public int startPosition;
public Location()
{
}
/**
* Special case, used to mark EOF.
* @param p The total stream length.
*/
public Location(int p)
{
startPosition = p;
endPosition = p + 1;
beginLine = endLine = -1;
}
}

View file

@ -0,0 +1,51 @@
/* ParseException.java --
Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.javax.swing.text.html.parser.support.low;
/**
* This can be thrown from various parsing methods.
*/
public class ParseException
extends RuntimeException
{
public ParseException(String s, Throwable cause)
{
super(s, cause);
}
}

View file

@ -0,0 +1,142 @@
/* Queue.java -- a token queue.
Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.javax.swing.text.html.parser.support.low;
import java.util.Arrays;
/**
* A token queue.
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class Queue
{
Token[] m = new Token[ 64 ];
int a = 0;
int b = 0;
/**
* True for the empty queue.
*/
public boolean isEmpty()
{
return size() == 0;
}
/**
* Add this trace to the end of the queue.
*/
public void add(Token u)
{
if (a < m.length)
{
m [ a ] = u;
a++;
}
else // The end of array has been reached.
{
if (b > 0) // If some elements were deleted from the start of the queue, shift.
{
int d = b;
System.arraycopy(m, b, m, 0, a - b);
b = b - d;
a = a - d;
m [ a ] = u;
a++;
}
else // Enlarge the queue, doubling the size.
{
int n = m.length * 2;
Token[] nm = new Token[ 2 * n ];
System.arraycopy(m, 0, nm, 0, m.length);
Arrays.fill(m, null);
nm [ a ] = u;
m = nm;
a++;
}
}
}
/**
* Clear the queue.
*/
public void clear()
{
a = b = 0;
Arrays.fill(m, null);
}
/**
* Read the value ahead. 0 is the value that will be returned with
* the following next. This method does not remove values from the
* queue. To test if there is enough tokens in the queue, size() must
* be checked before calling this method.
*/
public Token get(int ahead)
{
int p = b + ahead;
if (p < a)
return m [ p ];
else
throw new ArrayIndexOutOfBoundsException("Not enough tokens");
}
/**
* Read the oldest value from the queue and remove this value from
* the queue.
*/
public Token next()
{
if (a == b)
throw new ArrayIndexOutOfBoundsException("queue empty");
Token r = m [ b ];
m [ b ] = null;
b++;
return r;
}
/**
* Size of the queue.
*/
public int size()
{
return a - b;
}
}

View file

@ -0,0 +1,374 @@
/* ReaderTokenizer.java -- splits the input char sequence int tokens.
Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.javax.swing.text.html.parser.support.low;
import java.io.IOException;
import java.io.Reader;
/**
* Reader splits the input char sequence into tokens.
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class ReaderTokenizer
extends Constants
{
/**
* This is set to true each time the getNextToken is called.
* Used in preventing loops when all patterns refuse to accept
* the invalid input.
*/
protected boolean advanced;
/**
* If true, the returned tokens are also placed in the backup
* queue.
*/
protected boolean backupMode;
/**
* The buffer to read document into.
*/
Buffer buffer = new Buffer();
/**
* The queue for supporting mark().
*/
Queue backup = new Queue();
/**
* The queue of found tokens.
*/
Queue queue = new Queue();
/**
* The reader to read the document from.
*/
Reader reader;
/**
* Array of char tokens
*/
char[] charTokens;
/**
* Array of string tokens.
*/
String[] stringTokens;
/**
* The current reader position.
*/
int readerPosition = -1;
/**
* Creates a new ReaderTokenizer. The reset(...) method must be
* subsequently called to set the reader.
*/
public ReaderTokenizer()
{
}
/**
* Return the sequence, used to separate lines in the document.
* @return one of \n, \r or \r\n.
*/
public String getEndOfLineSequence()
{
return buffer.getEndOfLineSequence();
}
/**
* Get the next token.
* @return
*/
public Token getNextToken()
{
Token rt;
advanced = true;
try
{
if (queue.isEmpty())
read(1);
if (!queue.isEmpty())
rt = queue.next();
else
rt = new Token(EOF, new Location(readerPosition));
}
catch (IOException ex)
{
throw new ParseException("IO Exception", ex);
}
if (backupMode)
backup.add(rt);
return rt;
}
/**
* Get a token, lying the given number of tokens
* ahead. getToken(0) will return the same token,
* what would be returned by getNextToken().
* getToken(..) does change the current position
* in the input stream. If the end of stream is
* reached, the EOF token is always returned.
*/
public Token getTokenAhead(int ahead)
{
try
{
read(ahead - queue.size() + 1);
return queue.size() >= ahead ? queue.get(ahead) : eofToken();
}
catch (IOException ex)
{
throw new ParseException("IO Exception", ex);
}
}
/**
* Get a token, bein immediatley ahead.
* If the end of stream is
* reached, the EOF token is always returned.
* The method is equivalent calling getTokenAhead(0).
*/
public Token getTokenAhead()
{
try
{
if (queue.isEmpty())
read(1);
if (!queue.isEmpty())
return queue.get(0);
else
return eofToken();
}
catch (IOException ex)
{
throw new ParseException("IO Exception", ex);
}
}
/**
* Invokes the error handler.
*/
public void error(String msg, Token at)
{
System.out.println(msg);
}
/**
* Turns the backup mode on or off.
* It is possible to return where the mark(true) was last called
* by calling reset().
* @param mode True if it is required to save tokens, making
* returning to the current point possible.
*/
public void mark(boolean mode)
{
backup.clear();
backupMode = mode;
}
/**
* Prepare for new parsing from the given stream.
* @param a_reader A reader to parse from.
*/
public void reset(Reader a_reader)
{
reader = a_reader;
readerPosition = -1;
buffer.reset();
queue.clear();
}
/**
* Reset the internal cursor to the position where the mark()
* was last time called. Switches the backup mode off.
*/
public void reset()
{
if (!backupMode)
throw new AssertionError("Call mark(true) before using reset()!");
backupMode = false;
// That is now in the queue, will be appended to the end of backup.
while (!queue.isEmpty())
backup.add(queue.next());
Queue t = queue;
queue = backup;
backup = t;
backup.clear();
}
/**
* Read the given number of the tokens. Add the needed number of EOF
* tokens if there are no more data in the stream.
* @param amount The number of additional tokens to read.
*/
void read(int numberOfTokens)
throws IOException
{
if (numberOfTokens <= 0)
return;
reading:
for (int i = 0; i < numberOfTokens; i++)
readToken();
}
/**
* Read next token from the reader, add it to the queue
*/
void readToken()
throws IOException
{
Token t;
int ch;
enlarging:
while (true)
{
t = tokenMatches();
if (t != null)
break enlarging;
else
{
ch = reader.read();
readerPosition++;
if (ch == ETX)
ch = ' ';
if (ch < 0)
{
if (buffer.length() == 0)
{
queue.add(eofToken());
return;
}
else
{
if (buffer.charAt(buffer.length() - 1) != ETX)
buffer.append(ETX, readerPosition++);
else
{
// Discard terminating ETX
buffer.setLength(buffer.length() - 1);
if (buffer.length() > 0)
{
t = new Token(OTHER, buffer.toString(),
buffer.getLocation(0, buffer.length())
);
queue.add(t);
buffer.setLength(0);
}
return;
}
}
}
else
buffer.append((char) ch, readerPosition);
}
}
}
/**
* Check if the end of buffer matches one of the tokens. If it does,
* return this token and remove the token sequence from the end of
* buffer.
* @return The matching token.
*/
Token tokenMatches()
{
Token rt = endMatches(buffer);
if (rt != null) // Remove the matched image
{
// Consume future character if it was an entity and the future
// character is semicolon.
if (rt.kind == ENTITY)
{
if (buffer.charAt(buffer.length() - 1) == ';')
buffer.setLength(buffer.length() - rt.getImage().length() - 1);
else
{
error("Missing closing semicolon for entity '" + rt.getImage() +
"'", rt
);
consumeBuffer(rt);
}
}
else
{
consumeBuffer(rt);
}
}
// If the buffer is not empty, some sequence does not match any tokens.
// Add it to the queue as "OTHER".
if (rt != null)
{
if (buffer.length() > 1)
{
String rest = buffer.toString();
rest = rest.substring(0, rest.length() - 1);
Token other =
new Token(OTHER, rest, buffer.getLocation(0, buffer.length));
queue.add(other);
consumeBuffer(other);
}
queue.add(rt);
}
return rt;
}
private void consumeBuffer(Token rt)
{
buffer.delete(buffer.length() - rt.getImage().length() - 1,
buffer.length() - 1
);
}
/**
* Create EOF token.
*/
private Token eofToken()
{
return new Token(EOF, "#", new Location(readerPosition));
}
}

View file

@ -0,0 +1,169 @@
/* Token.java --
Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.javax.swing.text.html.parser.support.low;
/**
* A token.
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class Token
{
/**
* The place of this token in the document.
*/
public Location where;
/**
* The additional category of token.
*/
public int category;
/**
* An integer that describes the kind of this token.
*/
public int kind;
/**
* The string image of the token, null if the char image must be used.
*/
private String stringImage;
/**
* The char image of the token.
*/
private char charImage;
/**
* Creates a new token with fields, initialized to the default values.
*/
public Token()
{
}
/**
* Creates a new token of the given kind.
*/
public Token(int _kind, Location _where)
{
kind = _kind;
where = _where;
}
/**
* Creates a new token of the given kind and given single char image.
*/
public Token(int _kind, char _image, Location _where)
{
kind = _kind;
charImage = _image;
where = _where;
}
/**
* Creates a new token of the given kind and given string image.
*/
public Token(int _kind, String _image, Location _where)
{
kind = _kind;
stringImage = _image;
where = _where;
}
/**
* Creates a new token of the given kind, category and given string image.
*/
public Token(int _kind, int _category, String _image, Location _where)
{
kind = _kind;
category = _category;
stringImage = _image;
where = _where;
}
/**
* Creates a new token, where location fields are set as for token,
* spanning over two provided tokens and any tokens between them.
* The image field is initialized to null, the kind field is set to -1.
*/
public Token(Token fromInclusive, Token toInclusive)
{
where = new Location();
where.beginLine = fromInclusive.where.beginLine;
where.startPosition = fromInclusive.where.startPosition;
where.endLine = toInclusive.where.endLine;
where.endPosition = toInclusive.where.endPosition;
}
public String getImage()
{
if (kind == 3)
return "#";
if (stringImage == null)
{
if (charImage == 0)
return null;
stringImage = new String(new char[] { charImage });
}
return stringImage;
}
/**
* Append the token image to the given string buffer.
* This may be more effective that buffer.append(this.getImage()).
* @param buffer A buffer to append.
*/
public void appendTo(StringBuffer buffer)
{
if (charImage == 0)
buffer.append(getImage());
else
buffer.append(charImage);
}
/**
* Returns the string image or, if null, the bounding positions.
*/
public String toString()
{
return getImage() != null ? kind + "'" + getImage()
: "<line " + where.beginLine + ", abs pos " + where.startPosition +
".." + where.endPosition + ">";
}
}

View file

@ -0,0 +1,78 @@
/* node.java --
Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.javax.swing.text.html.parser.support.low;
/**
* A text level content model node. The only required unary operations
* here are "appears" and "optionally appears" ('?').
* <p>@author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)</p>
*/
public class node
{
/**
* True for node that is optional for the given position.
*/
public boolean optional;
/**
* The kind of the token to match.
*/
public int kind;
/**
* Creates the new node for matching a given kind of the token.
* @param kind The kind of the token to match.
* @param modifier The modifier (*?+).
*/
public node(int kind, boolean _optional)
{
this.kind = kind;
optional = _optional;
}
/**
* Creates the node, indicating that token must match exactluy one time.
* @param kind The kind of token to match.
*/
public node(int kind)
{
this.kind = kind;
optional = false;
}
}

View file

@ -0,0 +1,47 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<!-- package.html - describes classes in javax.swing.text.html.parser package.
Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. -->
<html>
<head><title>GNU Classpath - gnu.javax.swing.text.html.parser.support.low</title></head>
<body>
<p>This package contains classes that are directly used to process
the text input: adapted stream tokenizer, specialized buffer and text-level content models .</p>
@author Audrius Meskauskas, Lithuania
</body>
</html>

View file

@ -0,0 +1,105 @@
/* pattern.java --
Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.javax.swing.text.html.parser.support.low;
/**
* The simple pattern, consisting from the sequence of tokens that
* may have the unary modifier '?'. Choices and grouping
* are not required here.
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class pattern
{
/**
* The nodes of this pattern.
*/
public final node[] nodes;
/**
* Create a pattern, containing the given list of nodes.
* @param a_nodes
*/
public pattern(node[] a_nodes)
{
nodes = a_nodes;
}
/**
* Checks if the pattern can match the tokens in this
* tokenizer. Does not change the state of tokenizer.
* @param stream The tokenizer to read data from
* @return True if the pattern sequence matches the
* beginning of the tokenizer content.
*/
public boolean matches(ReaderTokenizer stream)
{
try
{
int pt = 0;
int pn = 0;
Token t;
node n;
while (pn < nodes.length)
{
n = nodes [ pn ];
t = stream.getTokenAhead(pt);
if (t.kind == n.kind)
{
pn++;
pt++;
}
else
{
if (!n.optional)
return false;
else
pn++;
}
}
return true;
}
catch (Exception ex)
{
throw new ParseException("Exception", ex);
}
}
}

View file

@ -0,0 +1,47 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<!-- package.html - describes classes in javax.swing.text.html.parser package.
Copyright (C) 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. -->
<html>
<head><title>GNU Classpath - gnu.javax.swing.text.html.parser.support</title></head>
<body>
<p>This package provides various specialised classes, needed by HTML parser.
</p>
@author Audrius Meskauskas, Lithuania
</body>
</html>

View file

@ -0,0 +1,106 @@
/* parameterDefaulter.java --
Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.javax.swing.text.html.parser.support;
import gnu.javax.swing.text.html.parser.htmlAttributeSet;
import java.util.Hashtable;
import javax.swing.text.html.parser.AttributeList;
import javax.swing.text.html.parser.DTD;
import javax.swing.text.html.parser.Element;
/**
* Returns an attribute set, containing default
* parameters for the given element. Caches sets of default
* parameters.
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class parameterDefaulter
{
public final DTD dtd;
Hashtable sets = new Hashtable();
/**
* Create a parameterDefaulter that looks for the default attribute
* values in the given DTD.
* @param a_dtd
*/
public parameterDefaulter(DTD a_dtd)
{
dtd = a_dtd;
}
/**
* Get the default parameter set for the given element.
* @param element The element name (case insensitive).
* @return the default attrbute set.
*/
public htmlAttributeSet getDefaultParameters(String element)
{
String key = element.toLowerCase();
htmlAttributeSet atts = (htmlAttributeSet) sets.get(key);
if (atts == null)
{
htmlAttributeSet set = new htmlAttributeSet();
Element e = (Element) dtd.elementHash.get(element.toLowerCase());
if (e != null)
{
AttributeList a = e.getAttributes();
while (a != null)
{
if (a.value != null)
set.addAttribute(a.name, a.value);
a = a.next;
}
}
if (set.getAttributeCount() > 0)
sets.put(key, set);
else
sets.put(key, htmlAttributeSet.EMPTY_HTML_ATTRIBUTE_SET);
atts = set;
}
return atts;
}
}

View file

@ -0,0 +1,193 @@
/* textPreProcessor.java --
Copyright (C) 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Classpath 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
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING. If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package gnu.javax.swing.text.html.parser.support;
import gnu.javax.swing.text.html.parser.support.low.Constants;
/**
* Pre - processes text in text parts of the html document.
* Not thread - safe.
* @author Audrius Meskauskas, Lithuania (AudriusA@Bioinformatics.org)
*/
public class textPreProcessor
{
/**
* Pre - process non-preformatted text.
* \t, \r and \n mutate into spaces, then multiple spaces mutate
* into single one, all whitespace around tags is consumed.
* The content of the passed buffer is destroyed.
* @param text A text to pre-process.
*/
public char[] preprocess(StringBuffer a_text)
{
if (a_text.length() == 0)
return null;
char[] text = toCharArray(a_text);
int a = 0;
int b = text.length - 1;
try
{
while (Constants.bWHITESPACE.get(text [ a ]))
a++;
while (Constants.bWHITESPACE.get(text [ b ]))
b--;
}
catch (ArrayIndexOutOfBoundsException sx)
{
// A text fragment, consisting from line breaks only.
return null;
}
a_text.setLength(0);
boolean spacesWere = false;
boolean spaceNow;
char c;
chars:
for (int i = a; i <= b; i++)
{
c = text [ i ];
spaceNow = Constants.bWHITESPACE.get(c);
if (spacesWere && spaceNow)
continue chars;
if (spaceNow)
a_text.append(' ');
else
a_text.append(c);
spacesWere = spaceNow;
}
if (a_text.length() == text.length)
{
a_text.getChars(0, a_text.length(), text, 0);
return text;
}
else
return toCharArray(a_text);
}
/**
* Pre - process pre-formatted text.
* Heading/closing spaces and tabs preserved.
* ONE bounding \r, \n or \r\n is removed.
* \r or \r\n mutate into \n. Tabs are
* preserved.
* The content of the passed buffer is destroyed.
* @param text
* @return
*/
public char[] preprocessPreformatted(StringBuffer a_text)
{
if (a_text.length() == 0)
return null;
char[] text = toCharArray(a_text);
int a = 0;
int n = text.length - 1;
int b = n;
if (text [ 0 ] == '\n')
a++;
else
{
if (text [ 0 ] == '\r')
{
a++;
if (text.length > 1 && text [ 1 ] == '\n')
a++;
}
}
if (text [ n ] == '\r')
b--;
else
{
if (text [ n ] == '\n')
{
b--;
if (n > 0 && text [ n - 1 ] == '\r')
b--;
}
}
a_text.setLength(0);
if (a > b)
return null;
char c;
for (int i = a; i <= b; i++)
{
c = text [ i ];
if (c == '\r')
{
if (i == b || text [ i + 1 ] != '\n')
a_text.append('\n');
}
else
a_text.append(c);
}
if (a_text.length() == text.length)
{
a_text.getChars(0, a_text.length(), text, 0);
return text;
}
else
return toCharArray(a_text);
}
/**
* Return array of chars, present in the given buffer.
* @param a_text The buffer
* @return
*/
private static char[] toCharArray(StringBuffer a_text)
{
char[] text = new char[ a_text.length() ];
a_text.getChars(0, text.length, text, 0);
return text;
}
}