[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:
parent
c5f083efc5
commit
18e479e213
104 changed files with 22587 additions and 27 deletions
50
libjava/gnu/javax/swing/text/html/package.html
Normal file
50
libjava/gnu/javax/swing/text/html/package.html
Normal 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>
|
3729
libjava/gnu/javax/swing/text/html/parser/HTML_401F.java
Executable file
3729
libjava/gnu/javax/swing/text/html/parser/HTML_401F.java
Executable file
File diff suppressed because it is too large
Load diff
422
libjava/gnu/javax/swing/text/html/parser/gnuDTD.java
Executable file
422
libjava/gnu/javax/swing/text/html/parser/gnuDTD.java
Executable 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><!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>&lt;</code>
|
||||
* (means '<code><</code>' );
|
||||
* This method inactivates the recursive refenrences to the same
|
||||
* entity.
|
||||
* @param name The entity name (without heading & 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;
|
||||
}
|
||||
}
|
133
libjava/gnu/javax/swing/text/html/parser/htmlAttributeSet.java
Normal file
133
libjava/gnu/javax/swing/text/html/parser/htmlAttributeSet.java
Normal 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);
|
||||
}
|
||||
}
|
610
libjava/gnu/javax/swing/text/html/parser/htmlValidator.java
Normal file
610
libjava/gnu/javax/swing/text/html/parser/htmlValidator.java
Normal 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 <head> tag: the parser is notified about its silent closing
|
||||
* when <body> 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 + "'"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
62
libjava/gnu/javax/swing/text/html/parser/models/PCDATAonly_model.java
Executable file
62
libjava/gnu/javax/swing/text/html/parser/models/PCDATAonly_model.java
Executable 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;
|
||||
}
|
||||
}
|
77
libjava/gnu/javax/swing/text/html/parser/models/TableRowContentModel.java
Executable file
77
libjava/gnu/javax/swing/text/html/parser/models/TableRowContentModel.java
Executable 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;
|
||||
}
|
||||
}
|
382
libjava/gnu/javax/swing/text/html/parser/models/list.java
Executable file
382
libjava/gnu/javax/swing/text/html/parser/models/list.java
Executable 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);
|
||||
}
|
||||
}
|
75
libjava/gnu/javax/swing/text/html/parser/models/noTagModel.java
Executable file
75
libjava/gnu/javax/swing/text/html/parser/models/noTagModel.java
Executable 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;
|
||||
}
|
||||
}
|
337
libjava/gnu/javax/swing/text/html/parser/models/node.java
Executable file
337
libjava/gnu/javax/swing/text/html/parser/models/node.java
Executable 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();
|
||||
}
|
||||
}
|
53
libjava/gnu/javax/swing/text/html/parser/models/package.html
Normal file
53
libjava/gnu/javax/swing/text/html/parser/models/package.html
Normal 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>
|
201
libjava/gnu/javax/swing/text/html/parser/models/transformer.java
Executable file
201
libjava/gnu/javax/swing/text/html/parser/models/transformer.java
Executable 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;
|
||||
}
|
||||
}
|
51
libjava/gnu/javax/swing/text/html/parser/package.html
Normal file
51
libjava/gnu/javax/swing/text/html/parser/package.html
Normal 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>
|
1440
libjava/gnu/javax/swing/text/html/parser/support/Parser.java
Executable file
1440
libjava/gnu/javax/swing/text/html/parser/support/Parser.java
Executable file
File diff suppressed because it is too large
Load diff
112
libjava/gnu/javax/swing/text/html/parser/support/gnuStringIntMapper.java
Executable file
112
libjava/gnu/javax/swing/text/html/parser/support/gnuStringIntMapper.java
Executable 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();
|
||||
}
|
||||
}
|
238
libjava/gnu/javax/swing/text/html/parser/support/low/Buffer.java
Normal file
238
libjava/gnu/javax/swing/text/html/parser/support/low/Buffer.java
Normal 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);
|
||||
}
|
||||
}
|
422
libjava/gnu/javax/swing/text/html/parser/support/low/Constants.java
Executable file
422
libjava/gnu/javax/swing/text/html/parser/support/low/Constants.java
Executable 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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
142
libjava/gnu/javax/swing/text/html/parser/support/low/Queue.java
Executable file
142
libjava/gnu/javax/swing/text/html/parser/support/low/Queue.java
Executable 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;
|
||||
}
|
||||
}
|
374
libjava/gnu/javax/swing/text/html/parser/support/low/ReaderTokenizer.java
Executable file
374
libjava/gnu/javax/swing/text/html/parser/support/low/ReaderTokenizer.java
Executable 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));
|
||||
}
|
||||
}
|
169
libjava/gnu/javax/swing/text/html/parser/support/low/Token.java
Normal file
169
libjava/gnu/javax/swing/text/html/parser/support/low/Token.java
Normal 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 + ">";
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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>
|
105
libjava/gnu/javax/swing/text/html/parser/support/low/pattern.java
Executable file
105
libjava/gnu/javax/swing/text/html/parser/support/low/pattern.java
Executable 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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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>
|
106
libjava/gnu/javax/swing/text/html/parser/support/parameterDefaulter.java
Executable file
106
libjava/gnu/javax/swing/text/html/parser/support/parameterDefaulter.java
Executable 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;
|
||||
}
|
||||
}
|
193
libjava/gnu/javax/swing/text/html/parser/support/textPreProcessor.java
Executable file
193
libjava/gnu/javax/swing/text/html/parser/support/textPreProcessor.java
Executable 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;
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue