summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--application/palemoon/app/profile/palemoon.js9
-rw-r--r--build/moz.configure/windows.configure12
-rw-r--r--dom/base/nsDocumentEncoder.cpp39
-rw-r--r--dom/base/nsHTMLContentSerializer.cpp1
-rw-r--r--dom/base/nsHTMLContentSerializer.h1
-rw-r--r--dom/base/nsIContentSerializer.h1
-rw-r--r--dom/base/nsObjectLoadingContent.cpp14
-rw-r--r--dom/base/nsPlainTextSerializer.cpp1
-rw-r--r--dom/base/nsPlainTextSerializer.h1
-rwxr-xr-xdom/base/nsXHTMLContentSerializer.cpp3
-rw-r--r--dom/base/nsXHTMLContentSerializer.h1
-rw-r--r--dom/base/nsXMLContentSerializer.cpp9
-rw-r--r--dom/base/nsXMLContentSerializer.h2
-rw-r--r--dom/html/ImageDocument.cpp2
-rw-r--r--dom/html/PluginDocument.cpp2
-rw-r--r--dom/html/VideoDocument.cpp2
-rw-r--r--dom/indexedDB/IDBCursor.cpp8
-rw-r--r--dom/indexedDB/IDBFactory.cpp4
-rw-r--r--dom/indexedDB/IDBKeyRange.cpp2
-rw-r--r--dom/indexedDB/IDBObjectStore.cpp15
-rw-r--r--dom/indexedDB/Key.cpp38
-rw-r--r--dom/indexedDB/Key.h15
-rw-r--r--dom/indexedDB/KeyPath.cpp22
-rw-r--r--dom/indexedDB/KeyPath.h12
-rw-r--r--dom/security/nsCSPContext.cpp15
-rw-r--r--dom/security/nsCSPUtils.cpp32
-rw-r--r--gfx/2d/Matrix.h44
-rw-r--r--gfx/tests/gtest/TestMatrix.cpp61
-rw-r--r--gfx/tests/gtest/moz.build1
-rw-r--r--js/src/jit/IonAnalysis.cpp32
-rw-r--r--js/src/jit/IonAnalysis.h7
-rw-r--r--js/src/jsapi.cpp22
-rw-r--r--js/src/jsapi.h3
-rw-r--r--js/src/vm/TypeInference.cpp84
-rw-r--r--js/src/vm/TypeInference.h59
-rw-r--r--parser/html/jArray.h43
-rw-r--r--parser/html/java/Makefile59
-rw-r--r--parser/html/java/README.txt46
-rw-r--r--parser/html/java/manifest.txt2
-rw-r--r--parser/html/java/named-character-references.html7
-rw-r--r--parser/html/javasrc/AttributeName.java2473
-rw-r--r--parser/html/javasrc/ElementName.java1609
-rw-r--r--parser/html/javasrc/HtmlAttributes.java618
-rw-r--r--parser/html/javasrc/MetaScanner.java854
-rw-r--r--parser/html/javasrc/Portability.java150
-rw-r--r--parser/html/javasrc/README.txt6
-rw-r--r--parser/html/javasrc/StackNode.java295
-rw-r--r--parser/html/javasrc/StateSnapshot.java204
-rw-r--r--parser/html/javasrc/Tokenizer.java7064
-rw-r--r--parser/html/javasrc/TreeBuilder.java6558
-rw-r--r--parser/html/javasrc/UTF16Buffer.java151
-rw-r--r--parser/html/nsHtml5ArrayCopy.h1
-rw-r--r--parser/html/nsHtml5AttributeName.cpp6
-rw-r--r--parser/html/nsHtml5AttributeName.h6
-rw-r--r--parser/html/nsHtml5ElementName.cpp6
-rw-r--r--parser/html/nsHtml5ElementName.h6
-rw-r--r--parser/html/nsHtml5HtmlAttributes.cpp6
-rw-r--r--parser/html/nsHtml5HtmlAttributes.h6
-rw-r--r--parser/html/nsHtml5MetaScanner.cpp6
-rw-r--r--parser/html/nsHtml5MetaScanner.h6
-rw-r--r--parser/html/nsHtml5Portability.h6
-rw-r--r--parser/html/nsHtml5StackNode.cpp6
-rw-r--r--parser/html/nsHtml5StackNode.h6
-rw-r--r--parser/html/nsHtml5StateSnapshot.cpp6
-rw-r--r--parser/html/nsHtml5StateSnapshot.h6
-rw-r--r--parser/html/nsHtml5Tokenizer.cpp24
-rw-r--r--parser/html/nsHtml5Tokenizer.h8
-rw-r--r--parser/html/nsHtml5TreeBuilder.cpp27
-rw-r--r--parser/html/nsHtml5TreeBuilder.h6
-rw-r--r--parser/html/nsHtml5UTF16Buffer.cpp6
-rw-r--r--parser/html/nsHtml5UTF16Buffer.h6
-rw-r--r--security/manager/ssl/nsISiteSecurityService.idl12
-rw-r--r--security/manager/ssl/nsSiteSecurityService.cpp31
-rw-r--r--xpcom/threads/nsThreadPool.cpp4
74 files changed, 578 insertions, 20340 deletions
diff --git a/application/palemoon/app/profile/palemoon.js b/application/palemoon/app/profile/palemoon.js
index ee71c4ea1..df46ea4b6 100644
--- a/application/palemoon/app/profile/palemoon.js
+++ b/application/palemoon/app/profile/palemoon.js
@@ -682,6 +682,15 @@ pref("plugins.update.notifyUser", false);
//Enable tri-state option (Always/Never/Ask)
pref("plugins.click_to_play", true);
+// Platform pref is to enable all plugins by default.
+// Uncomment this pref to default to click-to-play
+// pref("plugin.default.state", 1);
+
+// Don't load plugin instances with no src declared.
+// These prefs are documented in detail in all.js.
+pref("plugins.favorfallback.mode", "follow-ctp");
+pref("plugins.favorfallback.rules", "nosrc");
+
#ifdef XP_WIN
pref("browser.preferences.instantApply", false);
#else
diff --git a/build/moz.configure/windows.configure b/build/moz.configure/windows.configure
index b9a3898a1..631049566 100644
--- a/build/moz.configure/windows.configure
+++ b/build/moz.configure/windows.configure
@@ -361,10 +361,10 @@ set_config('LIB', lib_path)
option(env='MT', nargs=1, help='Path to the Microsoft Manifest Tool')
-@depends_win(valid_windows_sdk_dir)
+@depends_win(valid_windows_sdk_dir, valid_ucrt_sdk_dir)
@imports(_from='os', _import='environ')
@imports('platform')
-def sdk_bin_path(valid_windows_sdk_dir):
+def sdk_bin_path(valid_windows_sdk_dir, valid_ucrt_sdk_dir):
if not valid_windows_sdk_dir:
return
@@ -373,13 +373,17 @@ def sdk_bin_path(valid_windows_sdk_dir):
'AMD64': 'x64',
}.get(platform.machine())
+ # From version 10.0.15063.0 onwards the bin path contains the version number.
+ versioned_bin = ('bin' if valid_ucrt_sdk_dir.version < '10.0.15063.0'
+ else os.path.join('bin', str(valid_ucrt_sdk_dir.version)))
+
result = [
environ['PATH'],
- os.path.join(valid_windows_sdk_dir.path, 'bin', vc_host)
+ os.path.join(valid_windows_sdk_dir.path, versioned_bin, vc_host)
]
if vc_host == 'x64':
result.append(
- os.path.join(valid_windows_sdk_dir.path, 'bin', 'x86'))
+ os.path.join(valid_windows_sdk_dir.path, versioned_bin, 'x86'))
return result
diff --git a/dom/base/nsDocumentEncoder.cpp b/dom/base/nsDocumentEncoder.cpp
index 84b128b15..34eb6ed38 100644
--- a/dom/base/nsDocumentEncoder.cpp
+++ b/dom/base/nsDocumentEncoder.cpp
@@ -82,7 +82,9 @@ protected:
nsAString& aStr,
bool aDontSerializeRoot,
uint32_t aMaxLength = 0);
- nsresult SerializeNodeEnd(nsINode* aNode, nsAString& aStr);
+ nsresult SerializeNodeEnd(nsINode* aOriginalNode,
+ nsAString& aStr,
+ nsINode* aFixupNode = nullptr);
// This serializes the content of aNode.
nsresult SerializeToStringIterative(nsINode* aNode,
nsAString& aStr);
@@ -405,14 +407,37 @@ nsDocumentEncoder::SerializeNodeStart(nsINode* aNode,
}
nsresult
-nsDocumentEncoder::SerializeNodeEnd(nsINode* aNode,
- nsAString& aStr)
+nsDocumentEncoder::SerializeNodeEnd(nsINode* aOriginalNode,
+ nsAString& aStr,
+ nsINode* aFixupNode)
{
- if (!IsVisibleNode(aNode))
+ if (!IsVisibleNode(aOriginalNode))
return NS_OK;
- if (aNode->IsElement()) {
- mSerializer->AppendElementEnd(aNode->AsElement(), aStr);
+ nsINode* node = nullptr;
+ nsCOMPtr<nsINode> fixedNodeKungfuDeathGrip;
+
+ // Caller didn't do fixup, so we'll do it ourselves
+ if (!aFixupNode) {
+ aFixupNode = aOriginalNode;
+ if (mNodeFixup) {
+ bool dummy;
+ nsCOMPtr<nsIDOMNode> domNodeIn = do_QueryInterface(aOriginalNode);
+ nsCOMPtr<nsIDOMNode> domNodeOut;
+ mNodeFixup->FixupNode(domNodeIn, &dummy, getter_AddRefs(domNodeOut));
+ fixedNodeKungfuDeathGrip = do_QueryInterface(domNodeOut);
+ node = fixedNodeKungfuDeathGrip;
+ }
+ }
+
+ // Fall back to original node if needed.
+ if (!node)
+ node = aOriginalNode;
+
+ if (node->IsElement()) {
+ mSerializer->AppendElementEnd(node->AsElement(),
+ aOriginalNode->AsElement(),
+ aStr);
}
return NS_OK;
}
@@ -481,7 +506,7 @@ nsDocumentEncoder::SerializeToStringRecursive(nsINode* aNode,
}
if (!aDontSerializeRoot) {
- rv = SerializeNodeEnd(maybeFixedNode, aStr);
+ rv = SerializeNodeEnd(aNode, aStr, maybeFixedNode);
NS_ENSURE_SUCCESS(rv, rv);
}
diff --git a/dom/base/nsHTMLContentSerializer.cpp b/dom/base/nsHTMLContentSerializer.cpp
index ab8b4f2b2..c135c4cf8 100644
--- a/dom/base/nsHTMLContentSerializer.cpp
+++ b/dom/base/nsHTMLContentSerializer.cpp
@@ -301,6 +301,7 @@ nsHTMLContentSerializer::AppendElementStart(Element* aElement,
NS_IMETHODIMP
nsHTMLContentSerializer::AppendElementEnd(Element* aElement,
+ Element* aOriginalElement /* unused */,
nsAString& aStr)
{
NS_ENSURE_ARG(aElement);
diff --git a/dom/base/nsHTMLContentSerializer.h b/dom/base/nsHTMLContentSerializer.h
index 6f3500e01..8e23d54ca 100644
--- a/dom/base/nsHTMLContentSerializer.h
+++ b/dom/base/nsHTMLContentSerializer.h
@@ -31,6 +31,7 @@ class nsHTMLContentSerializer final : public nsXHTMLContentSerializer {
nsAString& aStr) override;
NS_IMETHOD AppendElementEnd(mozilla::dom::Element* aElement,
+ mozilla::dom::Element* aOriginalElement,
nsAString& aStr) override;
NS_IMETHOD AppendDocumentStart(nsIDocument *aDocument,
diff --git a/dom/base/nsIContentSerializer.h b/dom/base/nsIContentSerializer.h
index f023cbc90..35014bd2c 100644
--- a/dom/base/nsIContentSerializer.h
+++ b/dom/base/nsIContentSerializer.h
@@ -55,6 +55,7 @@ class nsIContentSerializer : public nsISupports {
nsAString& aStr) = 0;
NS_IMETHOD AppendElementEnd(mozilla::dom::Element* aElement,
+ mozilla::dom::Element* aOriginalElement,
nsAString& aStr) = 0;
NS_IMETHOD Flush(nsAString& aStr) = 0;
diff --git a/dom/base/nsObjectLoadingContent.cpp b/dom/base/nsObjectLoadingContent.cpp
index 3c850c4cd..4978744e8 100644
--- a/dom/base/nsObjectLoadingContent.cpp
+++ b/dom/base/nsObjectLoadingContent.cpp
@@ -718,9 +718,9 @@ nsObjectLoadingContent::UnbindFromTree(bool aDeep, bool aNullParent)
if (mType == eType_Plugin) {
nsIDocument* doc = thisContent->GetComposedDoc();
if (doc && doc->IsActive()) {
- nsCOMPtr<nsIRunnable> ev = new nsSimplePluginEvent(doc,
- NS_LITERAL_STRING("PluginRemoved"));
- NS_DispatchToCurrentThread(ev);
+ nsCOMPtr<nsIRunnable> ev = new nsSimplePluginEvent(doc,
+ NS_LITERAL_STRING("PluginRemoved"));
+ NS_DispatchToCurrentThread(ev);
}
}
}
@@ -3628,6 +3628,14 @@ nsObjectLoadingContent::HasGoodFallback() {
}
}
+ // RULE "nosrc":
+ // Use fallback content if the object has not specified a src URI.
+ if (rulesList[i].EqualsLiteral("nosrc")) {
+ if (!mOriginalURI) {
+ return true;
+ }
+ }
+
// RULE "adobelink":
// Don't use fallback content when it has a link to adobe's website.
if (rulesList[i].EqualsLiteral("adobelink")) {
diff --git a/dom/base/nsPlainTextSerializer.cpp b/dom/base/nsPlainTextSerializer.cpp
index ef6bdcac7..8097c4ec8 100644
--- a/dom/base/nsPlainTextSerializer.cpp
+++ b/dom/base/nsPlainTextSerializer.cpp
@@ -390,6 +390,7 @@ nsPlainTextSerializer::AppendElementStart(Element* aElement,
NS_IMETHODIMP
nsPlainTextSerializer::AppendElementEnd(Element* aElement,
+ Element* aOriginalElement /* unused */,
nsAString& aStr)
{
NS_ENSURE_ARG(aElement);
diff --git a/dom/base/nsPlainTextSerializer.h b/dom/base/nsPlainTextSerializer.h
index 95cf5590c..5055c75a0 100644
--- a/dom/base/nsPlainTextSerializer.h
+++ b/dom/base/nsPlainTextSerializer.h
@@ -61,6 +61,7 @@ public:
mozilla::dom::Element* aOriginalElement,
nsAString& aStr) override;
NS_IMETHOD AppendElementEnd(mozilla::dom::Element* aElement,
+ mozilla::dom::Element* aOriginalElement,
nsAString& aStr) override;
NS_IMETHOD Flush(nsAString& aStr) override;
diff --git a/dom/base/nsXHTMLContentSerializer.cpp b/dom/base/nsXHTMLContentSerializer.cpp
index 111ed46c7..0a39ef663 100755
--- a/dom/base/nsXHTMLContentSerializer.cpp
+++ b/dom/base/nsXHTMLContentSerializer.cpp
@@ -514,6 +514,7 @@ nsXHTMLContentSerializer::CheckElementStart(nsIContent * aContent,
bool
nsXHTMLContentSerializer::CheckElementEnd(mozilla::dom::Element* aElement,
+ mozilla::dom::Element* aOriginalElement,
bool& aForceFormat,
nsAString& aStr)
{
@@ -532,7 +533,7 @@ nsXHTMLContentSerializer::CheckElementEnd(mozilla::dom::Element* aElement,
}
bool dummyFormat;
- return nsXMLContentSerializer::CheckElementEnd(aElement, dummyFormat, aStr);
+ return nsXMLContentSerializer::CheckElementEnd(aElement, aOriginalElement, dummyFormat, aStr);
}
bool
diff --git a/dom/base/nsXHTMLContentSerializer.h b/dom/base/nsXHTMLContentSerializer.h
index 7473ba074..79ecf28f1 100644
--- a/dom/base/nsXHTMLContentSerializer.h
+++ b/dom/base/nsXHTMLContentSerializer.h
@@ -53,6 +53,7 @@ class nsXHTMLContentSerializer : public nsXMLContentSerializer {
nsAString& aStr) override;
virtual bool CheckElementEnd(mozilla::dom::Element* aContent,
+ mozilla::dom::Element* aOriginalElement,
bool& aForceFormat,
nsAString& aStr) override;
diff --git a/dom/base/nsXMLContentSerializer.cpp b/dom/base/nsXMLContentSerializer.cpp
index 54fadaa94..f12bb8fdc 100644
--- a/dom/base/nsXMLContentSerializer.cpp
+++ b/dom/base/nsXMLContentSerializer.cpp
@@ -1028,6 +1028,7 @@ nsXMLContentSerializer::AppendEndOfElementStart(Element* aElement,
NS_IMETHODIMP
nsXMLContentSerializer::AppendElementEnd(Element* aElement,
+ Element* aOriginalElement,
nsAString& aStr)
{
NS_ENSURE_ARG(aElement);
@@ -1035,7 +1036,7 @@ nsXMLContentSerializer::AppendElementEnd(Element* aElement,
nsIContent* content = aElement;
bool forceFormat = false, outputElementEnd;
- outputElementEnd = CheckElementEnd(aElement, forceFormat, aStr);
+ outputElementEnd = CheckElementEnd(aElement, aOriginalElement, forceFormat, aStr);
nsIAtom *name = content->NodeInfo()->NameAtom();
@@ -1161,16 +1162,14 @@ nsXMLContentSerializer::CheckElementStart(nsIContent * aContent,
bool
nsXMLContentSerializer::CheckElementEnd(Element* aElement,
+ Element* aOriginalElement,
bool& aForceFormat,
nsAString& aStr)
{
// We don't output a separate end tag for empty element
aForceFormat = false;
- // XXXbz this is a bit messed up, but by now we don't have our fixed-up
- // version of aElement anymore. Let's hope fixup never changes the localName
- // or namespace...
- return ElementNeedsSeparateEndTag(aElement, aElement);
+ return ElementNeedsSeparateEndTag(aElement, aOriginalElement);
}
bool
diff --git a/dom/base/nsXMLContentSerializer.h b/dom/base/nsXMLContentSerializer.h
index 941acb179..2f76b0892 100644
--- a/dom/base/nsXMLContentSerializer.h
+++ b/dom/base/nsXMLContentSerializer.h
@@ -59,6 +59,7 @@ class nsXMLContentSerializer : public nsIContentSerializer {
nsAString& aStr) override;
NS_IMETHOD AppendElementEnd(mozilla::dom::Element* aElement,
+ mozilla::dom::Element* aOriginalElement,
nsAString& aStr) override;
NS_IMETHOD Flush(nsAString& aStr) override { return NS_OK; }
@@ -263,6 +264,7 @@ class nsXMLContentSerializer : public nsIContentSerializer {
* @return boolean true if the element can be output
*/
virtual bool CheckElementEnd(mozilla::dom::Element* aElement,
+ mozilla::dom::Element* aOriginalElement,
bool& aForceFormat,
nsAString& aStr);
diff --git a/dom/html/ImageDocument.cpp b/dom/html/ImageDocument.cpp
index f83a804be..451d989c3 100644
--- a/dom/html/ImageDocument.cpp
+++ b/dom/html/ImageDocument.cpp
@@ -659,7 +659,7 @@ ImageDocument::CreateSyntheticDocument()
NS_ENSURE_SUCCESS(rv, rv);
// Add the image element
- Element* body = GetBodyElement();
+ RefPtr<Element> body = GetBodyElement();
if (!body) {
NS_WARNING("no body on image document!");
return NS_ERROR_FAILURE;
diff --git a/dom/html/PluginDocument.cpp b/dom/html/PluginDocument.cpp
index 1c923ecc6..f6be8a915 100644
--- a/dom/html/PluginDocument.cpp
+++ b/dom/html/PluginDocument.cpp
@@ -206,7 +206,7 @@ PluginDocument::CreateSyntheticPluginDocument()
NS_ENSURE_SUCCESS(rv, rv);
// then attach our plugin
- Element* body = GetBodyElement();
+ RefPtr<Element> body = GetBodyElement();
if (!body) {
NS_WARNING("no body on plugin document!");
return NS_ERROR_FAILURE;
diff --git a/dom/html/VideoDocument.cpp b/dom/html/VideoDocument.cpp
index 1bd898564..76b2e326f 100644
--- a/dom/html/VideoDocument.cpp
+++ b/dom/html/VideoDocument.cpp
@@ -90,7 +90,7 @@ VideoDocument::CreateSyntheticVideoDocument(nsIChannel* aChannel,
nsresult rv = MediaDocument::CreateSyntheticDocument();
NS_ENSURE_SUCCESS(rv, rv);
- Element* body = GetBodyElement();
+ RefPtr<Element> body = GetBodyElement();
if (!body) {
NS_WARNING("no body on video document!");
return NS_ERROR_FAILURE;
diff --git a/dom/indexedDB/IDBCursor.cpp b/dom/indexedDB/IDBCursor.cpp
index af88742f0..be0295dc7 100644
--- a/dom/indexedDB/IDBCursor.cpp
+++ b/dom/indexedDB/IDBCursor.cpp
@@ -430,7 +430,7 @@ IDBCursor::Continue(JSContext* aCx,
}
Key key;
- aRv = key.SetFromJSVal(aCx, aKey);
+ aRv = key.SetFromJSVal(aCx, aKey, /* aCallGetters */ true);
if (aRv.Failed()) {
return;
}
@@ -536,7 +536,7 @@ IDBCursor::ContinuePrimaryKey(JSContext* aCx,
}
Key key;
- aRv = key.SetFromJSVal(aCx, aKey);
+ aRv = key.SetFromJSVal(aCx, aKey, /* aCallGetters */ true);
if (aRv.Failed()) {
return;
}
@@ -558,7 +558,7 @@ IDBCursor::ContinuePrimaryKey(JSContext* aCx,
}
Key primaryKey;
- aRv = primaryKey.SetFromJSVal(aCx, aPrimaryKey);
+ aRv = primaryKey.SetFromJSVal(aCx, aPrimaryKey, /* aCallGetters */ true);
if (aRv.Failed()) {
return;
}
@@ -718,7 +718,7 @@ IDBCursor::Update(JSContext* aCx, JS::Handle<JS::Value> aValue,
const KeyPath& keyPath = objectStore->GetKeyPath();
Key key;
- aRv = keyPath.ExtractKey(aCx, aValue, key);
+ aRv = keyPath.ExtractKey(aCx, aValue, key, /* aCallGetters */ false);
if (aRv.Failed()) {
return nullptr;
}
diff --git a/dom/indexedDB/IDBFactory.cpp b/dom/indexedDB/IDBFactory.cpp
index c1ef6353d..66471fe24 100644
--- a/dom/indexedDB/IDBFactory.cpp
+++ b/dom/indexedDB/IDBFactory.cpp
@@ -482,13 +482,13 @@ IDBFactory::Cmp(JSContext* aCx, JS::Handle<JS::Value> aFirst,
JS::Handle<JS::Value> aSecond, ErrorResult& aRv)
{
Key first, second;
- nsresult rv = first.SetFromJSVal(aCx, aFirst);
+ nsresult rv = first.SetFromJSVal(aCx, aFirst, /* aCallGetters */ true);
if (NS_FAILED(rv)) {
aRv.Throw(rv);
return 0;
}
- rv = second.SetFromJSVal(aCx, aSecond);
+ rv = second.SetFromJSVal(aCx, aSecond, /* aCallGetters */ true);
if (NS_FAILED(rv)) {
aRv.Throw(rv);
return 0;
diff --git a/dom/indexedDB/IDBKeyRange.cpp b/dom/indexedDB/IDBKeyRange.cpp
index e61c80617..168fb4a5a 100644
--- a/dom/indexedDB/IDBKeyRange.cpp
+++ b/dom/indexedDB/IDBKeyRange.cpp
@@ -24,7 +24,7 @@ GetKeyFromJSVal(JSContext* aCx,
JS::Handle<JS::Value> aVal,
Key& aKey)
{
- nsresult rv = aKey.SetFromJSVal(aCx, aVal);
+ nsresult rv = aKey.SetFromJSVal(aCx, aVal, /* aCallGetters */ true);
if (NS_FAILED(rv)) {
MOZ_ASSERT(NS_ERROR_GET_MODULE(rv) == NS_ERROR_MODULE_DOM_INDEXEDDB);
return rv;
diff --git a/dom/indexedDB/IDBObjectStore.cpp b/dom/indexedDB/IDBObjectStore.cpp
index 756792741..f86c619a7 100644
--- a/dom/indexedDB/IDBObjectStore.cpp
+++ b/dom/indexedDB/IDBObjectStore.cpp
@@ -1084,7 +1084,7 @@ IDBObjectStore::AppendIndexUpdateInfo(
if (!aMultiEntry) {
Key key;
- rv = aKeyPath.ExtractKey(aCx, aVal, key);
+ rv = aKeyPath.ExtractKey(aCx, aVal, key, /* aCallGetters */ false);
// If an index's keyPath doesn't match an object, we ignore that object.
if (rv == NS_ERROR_DOM_INDEXEDDB_DATA_ERR || key.IsUnset()) {
@@ -1128,13 +1128,13 @@ IDBObjectStore::AppendIndexUpdateInfo(
for (uint32_t arrayIndex = 0; arrayIndex < arrayLength; arrayIndex++) {
JS::Rooted<JS::Value> arrayItem(aCx);
- if (NS_WARN_IF(!JS_GetElement(aCx, array, arrayIndex, &arrayItem))) {
+ if (NS_WARN_IF(!JS_GetOwnElement(aCx, array, arrayIndex, &arrayItem))) {
IDB_REPORT_INTERNAL_ERR();
return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR;
}
Key value;
- if (NS_FAILED(value.SetFromJSVal(aCx, arrayItem)) ||
+ if (NS_FAILED(value.SetFromJSVal(aCx, arrayItem, /* aCallGetters */ false)) ||
value.IsUnset()) {
// Not a value we can do anything with, ignore it.
continue;
@@ -1153,7 +1153,7 @@ IDBObjectStore::AppendIndexUpdateInfo(
}
else {
Key value;
- if (NS_FAILED(value.SetFromJSVal(aCx, val)) ||
+ if (NS_FAILED(value.SetFromJSVal(aCx, val, /* aCallGetters */ false)) ||
value.IsUnset()) {
// Not a value we can do anything with, ignore it.
return NS_OK;
@@ -1324,12 +1324,12 @@ IDBObjectStore::GetAddInfo(JSContext* aCx,
if (!HasValidKeyPath()) {
// Out-of-line keys must be passed in.
- rv = aKey.SetFromJSVal(aCx, aKeyVal);
+ rv = aKey.SetFromJSVal(aCx, aKeyVal, /* aCallGetters */ true);
if (NS_FAILED(rv)) {
return rv;
}
} else if (!isAutoIncrement) {
- rv = GetKeyPath().ExtractKey(aCx, aValue, aKey);
+ rv = GetKeyPath().ExtractKey(aCx, aValue, aKey, /* aCallGetters */ false);
if (NS_FAILED(rv)) {
return rv;
}
@@ -1368,7 +1368,8 @@ IDBObjectStore::GetAddInfo(JSContext* aCx,
aValue,
aKey,
&GetAddInfoCallback,
- &data);
+ &data,
+ /* aCallGetters */ false);
} else {
rv = GetAddInfoCallback(aCx, &data);
}
diff --git a/dom/indexedDB/Key.cpp b/dom/indexedDB/Key.cpp
index 0f693b2c6..575734af2 100644
--- a/dom/indexedDB/Key.cpp
+++ b/dom/indexedDB/Key.cpp
@@ -201,8 +201,11 @@ Key::ToLocaleBasedKey(Key& aTarget, const nsCString& aLocale) const
}
nsresult
-Key::EncodeJSValInternal(JSContext* aCx, JS::Handle<JS::Value> aVal,
- uint8_t aTypeOffset, uint16_t aRecursionDepth)
+Key::EncodeJSValInternal(JSContext* aCx,
+ JS::Handle<JS::Value> aVal,
+ uint8_t aTypeOffset,
+ uint16_t aRecursionDepth,
+ bool aCallGetters)
{
static_assert(eMaxType * kMaxArrayCollapse < 256,
"Unable to encode jsvals.");
@@ -257,13 +260,18 @@ Key::EncodeJSValInternal(JSContext* aCx, JS::Handle<JS::Value> aVal,
for (uint32_t index = 0; index < length; index++) {
JS::Rooted<JS::Value> val(aCx);
- if (!JS_GetElement(aCx, obj, index, &val)) {
+ bool ok = aCallGetters ? JS_GetElement(aCx, obj, index, &val)
+ : JS_GetOwnElement(aCx, obj, index, &val);
+ if (!ok) {
IDB_REPORT_INTERNAL_ERR();
return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR;
}
- nsresult rv = EncodeJSValInternal(aCx, val, aTypeOffset,
- aRecursionDepth + 1);
+ nsresult rv = EncodeJSValInternal(aCx,
+ val,
+ aTypeOffset,
+ aRecursionDepth + 1,
+ aCallGetters);
if (NS_FAILED(rv)) {
return rv;
}
@@ -406,9 +414,10 @@ Key::DecodeJSValInternal(const unsigned char*& aPos, const unsigned char* aEnd,
nsresult
Key::EncodeJSVal(JSContext* aCx,
JS::Handle<JS::Value> aVal,
- uint8_t aTypeOffset)
+ uint8_t aTypeOffset,
+ bool aCallGetters)
{
- return EncodeJSValInternal(aCx, aVal, aTypeOffset, 0);
+ return EncodeJSValInternal(aCx, aVal, aTypeOffset, 0, aCallGetters);
}
void
@@ -741,7 +750,8 @@ Key::SetFromValueArray(mozIStorageValueArray* aValues,
nsresult
Key::SetFromJSVal(JSContext* aCx,
- JS::Handle<JS::Value> aVal)
+ JS::Handle<JS::Value> aVal,
+ bool aCallGetters)
{
mBuffer.Truncate();
@@ -750,7 +760,7 @@ Key::SetFromJSVal(JSContext* aCx,
return NS_OK;
}
- nsresult rv = EncodeJSVal(aCx, aVal, 0);
+ nsresult rv = EncodeJSVal(aCx, aVal, 0, aCallGetters);
if (NS_FAILED(rv)) {
Unset();
return rv;
@@ -793,9 +803,15 @@ Key::ToJSVal(JSContext* aCx,
}
nsresult
-Key::AppendItem(JSContext* aCx, bool aFirstOfArray, JS::Handle<JS::Value> aVal)
+Key::AppendItem(JSContext* aCx,
+ bool aFirstOfArray,
+ JS::Handle<JS::Value> aVal,
+ bool aCallGetters)
{
- nsresult rv = EncodeJSVal(aCx, aVal, aFirstOfArray ? eMaxType : 0);
+ nsresult rv = EncodeJSVal(aCx,
+ aVal,
+ aFirstOfArray ? eMaxType : 0,
+ aCallGetters);
if (NS_FAILED(rv)) {
Unset();
return rv;
diff --git a/dom/indexedDB/Key.h b/dom/indexedDB/Key.h
index 9d70ce6ad..a4fb65b48 100644
--- a/dom/indexedDB/Key.h
+++ b/dom/indexedDB/Key.h
@@ -203,7 +203,7 @@ public:
}
nsresult
- SetFromJSVal(JSContext* aCx, JS::Handle<JS::Value> aVal);
+ SetFromJSVal(JSContext* aCx, JS::Handle<JS::Value> aVal, bool aCallGetters);
nsresult
ToJSVal(JSContext* aCx, JS::MutableHandle<JS::Value> aVal) const;
@@ -212,7 +212,10 @@ public:
ToJSVal(JSContext* aCx, JS::Heap<JS::Value>& aVal) const;
nsresult
- AppendItem(JSContext* aCx, bool aFirstOfArray, JS::Handle<JS::Value> aVal);
+ AppendItem(JSContext* aCx,
+ bool aFirstOfArray,
+ JS::Handle<JS::Value> aVal,
+ bool aCallGetters);
nsresult
ToLocaleBasedKey(Key& aTarget, const nsCString& aLocale) const;
@@ -283,7 +286,10 @@ private:
// Encoding functions. These append the encoded value to the end of mBuffer
nsresult
- EncodeJSVal(JSContext* aCx, JS::Handle<JS::Value> aVal, uint8_t aTypeOffset);
+ EncodeJSVal(JSContext* aCx,
+ JS::Handle<JS::Value> aVal,
+ uint8_t aTypeOffset,
+ bool aCallGetters);
void
EncodeString(const nsAString& aString, uint8_t aTypeOffset);
@@ -331,7 +337,8 @@ private:
EncodeJSValInternal(JSContext* aCx,
JS::Handle<JS::Value> aVal,
uint8_t aTypeOffset,
- uint16_t aRecursionDepth);
+ uint16_t aRecursionDepth,
+ bool aCallGetters);
static nsresult
DecodeJSValInternal(const unsigned char*& aPos,
diff --git a/dom/indexedDB/KeyPath.cpp b/dom/indexedDB/KeyPath.cpp
index 30edd8cd7..0221c9450 100644
--- a/dom/indexedDB/KeyPath.cpp
+++ b/dom/indexedDB/KeyPath.cpp
@@ -372,11 +372,13 @@ KeyPath::AppendStringWithValidation(const nsAString& aString)
}
nsresult
-KeyPath::ExtractKey(JSContext* aCx, const JS::Value& aValue, Key& aKey) const
+KeyPath::ExtractKey(JSContext* aCx,
+ const JS::Value& aValue,
+ Key& aKey,
+ bool aCallGetters) const
{
uint32_t len = mStrings.Length();
JS::Rooted<JS::Value> value(aCx);
-
aKey.Unset();
for (uint32_t i = 0; i < len; ++i) {
@@ -388,7 +390,10 @@ KeyPath::ExtractKey(JSContext* aCx, const JS::Value& aValue, Key& aKey) const
return rv;
}
- if (NS_FAILED(aKey.AppendItem(aCx, IsArray() && i == 0, value))) {
+ if (NS_FAILED(aKey.AppendItem(aCx,
+ IsArray() && i == 0,
+ value,
+ aCallGetters))) {
NS_ASSERTION(aKey.IsUnset(), "Encoding error should unset");
return NS_ERROR_DOM_INDEXEDDB_DATA_ERR;
}
@@ -437,9 +442,12 @@ KeyPath::ExtractKeyAsJSVal(JSContext* aCx, const JS::Value& aValue,
}
nsresult
-KeyPath::ExtractOrCreateKey(JSContext* aCx, const JS::Value& aValue,
- Key& aKey, ExtractOrCreateKeyCallback aCallback,
- void* aClosure) const
+KeyPath::ExtractOrCreateKey(JSContext* aCx,
+ const JS::Value& aValue,
+ Key& aKey,
+ ExtractOrCreateKeyCallback aCallback,
+ void* aClosure,
+ bool aCallGetters) const
{
NS_ASSERTION(IsString(), "This doesn't make sense!");
@@ -455,7 +463,7 @@ KeyPath::ExtractOrCreateKey(JSContext* aCx, const JS::Value& aValue,
return rv;
}
- if (NS_FAILED(aKey.AppendItem(aCx, false, value))) {
+ if (NS_FAILED(aKey.AppendItem(aCx, false, value, aCallGetters))) {
NS_ASSERTION(aKey.IsUnset(), "Should be unset");
return value.isUndefined() ? NS_OK : NS_ERROR_DOM_INDEXEDDB_DATA_ERR;
}
diff --git a/dom/indexedDB/KeyPath.h b/dom/indexedDB/KeyPath.h
index c133cdc4a..e6e5f57d4 100644
--- a/dom/indexedDB/KeyPath.h
+++ b/dom/indexedDB/KeyPath.h
@@ -72,7 +72,10 @@ public:
Parse(const Nullable<OwningStringOrStringSequence>& aValue, KeyPath* aKeyPath);
nsresult
- ExtractKey(JSContext* aCx, const JS::Value& aValue, Key& aKey) const;
+ ExtractKey(JSContext* aCx,
+ const JS::Value& aValue,
+ Key& aKey,
+ bool aCallGetters) const;
nsresult
ExtractKeyAsJSVal(JSContext* aCx, const JS::Value& aValue,
@@ -82,9 +85,12 @@ public:
(*ExtractOrCreateKeyCallback)(JSContext* aCx, void* aClosure);
nsresult
- ExtractOrCreateKey(JSContext* aCx, const JS::Value& aValue, Key& aKey,
+ ExtractOrCreateKey(JSContext* aCx,
+ const JS::Value& aValue,
+ Key& aKey,
ExtractOrCreateKeyCallback aCallback,
- void* aClosure) const;
+ void* aClosure,
+ bool aCallGetters) const;
inline bool IsValid() const {
return mType != NONEXISTENT;
diff --git a/dom/security/nsCSPContext.cpp b/dom/security/nsCSPContext.cpp
index 65be02809..56a119e1a 100644
--- a/dom/security/nsCSPContext.cpp
+++ b/dom/security/nsCSPContext.cpp
@@ -513,8 +513,19 @@ nsCSPContext::GetAllowsInline(nsContentPolicyType aContentType,
for (uint32_t i = 0; i < mPolicies.Length(); i++) {
bool allowed =
mPolicies[i]->allows(aContentType, CSP_UNSAFE_INLINE, EmptyString(), aParserCreated) ||
- mPolicies[i]->allows(aContentType, CSP_NONCE, aNonce, aParserCreated) ||
- mPolicies[i]->allows(aContentType, CSP_HASH, aContent, aParserCreated);
+ mPolicies[i]->allows(aContentType, CSP_NONCE, aNonce, aParserCreated);
+
+ // If the inlined script or style is allowed by either unsafe-inline or the
+ // nonce, go ahead and shortcut this loop.
+ if (allowed) {
+ continue;
+ }
+
+ // Check if the csp-hash matches against the hash of the script.
+ // If we don't have any content to check, block the script.
+ if (!aContent.IsEmpty()) {
+ allowed = mPolicies[i]->allows(aContentType, CSP_HASH, aContent, aParserCreated);
+ }
if (!allowed) {
// policy is violoated: deny the load unless policy is report only and
diff --git a/dom/security/nsCSPUtils.cpp b/dom/security/nsCSPUtils.cpp
index 71c8e3433..d07ad7945 100644
--- a/dom/security/nsCSPUtils.cpp
+++ b/dom/security/nsCSPUtils.cpp
@@ -641,13 +641,22 @@ nsCSPHostSrc::permits(nsIURI* aUri, const nsAString& aNonce, bool aWasRedirected
// just a specific scheme, the parser should generate a nsCSPSchemeSource.
NS_ASSERTION((!mHost.IsEmpty()), "host can not be the empty string");
+ // Before we can check if the host matches, we have to
+ // extract the host part from aUri.
+ nsAutoCString uriHost;
+ nsresult rv = aUri->GetAsciiHost(uriHost);
+ NS_ENSURE_SUCCESS(rv, false);
+
+ nsString decodedUriHost;
+ CSP_PercentDecodeStr(NS_ConvertUTF8toUTF16(uriHost), decodedUriHost);
+
// 2) host matching: Enforce a single *
if (mHost.EqualsASCII("*")) {
// The single ASTERISK character (*) does not match a URI's scheme of a type
// designating a globally unique identifier (such as blob:, data:, or filesystem:)
- // At the moment firefox does not support filesystem; but for future compatibility
+ // At the moment UXP does not support "filesystem:" but for future compatibility
// we support it in CSP according to the spec, see: 4.2.2 Matching Source Expressions
- // Note, that whitelisting any of these schemes would call nsCSPSchemeSrc::permits().
+ // Note: whitelisting any of these schemes would call nsCSPSchemeSrc::permits().
bool isBlobScheme =
(NS_SUCCEEDED(aUri->SchemeIs("blob", &isBlobScheme)) && isBlobScheme);
bool isDataScheme =
@@ -658,20 +667,15 @@ nsCSPHostSrc::permits(nsIURI* aUri, const nsAString& aNonce, bool aWasRedirected
if (isBlobScheme || isDataScheme || isFileScheme) {
return false;
}
- return true;
- }
-
- // Before we can check if the host matches, we have to
- // extract the host part from aUri.
- nsAutoCString uriHost;
- nsresult rv = aUri->GetAsciiHost(uriHost);
- NS_ENSURE_SUCCESS(rv, false);
-
- nsString decodedUriHost;
- CSP_PercentDecodeStr(NS_ConvertUTF8toUTF16(uriHost), decodedUriHost);
+ // If no scheme is present there also won't be a port and folder to check
+ // which means we can return early.
+ if (mScheme.IsEmpty()) {
+ return true;
+ }
+ }
// 4.5) host matching: Check if the allowed host starts with a wilcard.
- if (mHost.First() == '*') {
+ else if (mHost.First() == '*') {
NS_ASSERTION(mHost[1] == '.', "Second character needs to be '.' whenever host starts with '*'");
// Eliminate leading "*", but keeping the FULL STOP (.) thereafter before checking
diff --git a/gfx/2d/Matrix.h b/gfx/2d/Matrix.h
index 22a01ca10..d6835c8e6 100644
--- a/gfx/2d/Matrix.h
+++ b/gfx/2d/Matrix.h
@@ -723,7 +723,7 @@ public:
* The resulting vertices are populated in aVerts. aVerts must be
* pre-allocated to hold at least kTransformAndClipRectMaxVerts Points.
* The vertex count is returned by TransformAndClipRect. It is possible to
- * emit fewer that 3 vertices, indicating that aRect will not be visible
+ * emit fewer than 3 vertices, indicating that aRect will not be visible
* within aClip.
*/
template<class F>
@@ -734,7 +734,8 @@ public:
// Initialize a double-buffered array of points in homogenous space with
// the input rectangle, aRect.
Point4DTyped<UnknownUnits, F> points[2][kTransformAndClipRectMaxVerts];
- Point4DTyped<UnknownUnits, F>* dstPoint = points[0];
+ Point4DTyped<UnknownUnits, F>* dstPointStart = points[0];
+ Point4DTyped<UnknownUnits, F>* dstPoint = dstPointStart;
*dstPoint++ = TransformPoint(Point4DTyped<UnknownUnits, F>(aRect.x, aRect.y, 0, 1));
*dstPoint++ = TransformPoint(Point4DTyped<UnknownUnits, F>(aRect.XMost(), aRect.y, 0, 1));
@@ -750,16 +751,26 @@ public:
planeNormals[3] = Point4DTyped<UnknownUnits, F>(0.0, -1.0, 0.0, aClip.YMost());
// Iterate through each clipping plane and clip the polygon.
- // In each pass, we double buffer, alternating between points[0] and
- // points[1].
+ // For each clipping plane, we intersect the plane with all polygon edges.
+ // Each pass can increase or decrease the number of points that make up the
+ // current clipped polygon. We double buffer that set of points, alternating
+ // between points[0] and points[1].
for (int plane=0; plane < 4; plane++) {
planeNormals[plane].Normalize();
- Point4DTyped<UnknownUnits, F>* srcPoint = points[plane & 1];
+ Point4DTyped<UnknownUnits, F>* srcPoint = dstPointStart;
Point4DTyped<UnknownUnits, F>* srcPointEnd = dstPoint;
- dstPoint = points[~plane & 1];
- Point4DTyped<UnknownUnits, F>* dstPointStart = dstPoint;
-
+ dstPointStart = points[~plane & 1];
+ dstPoint = dstPointStart;
+
+ // Iterate over the polygon edges. In each iteration the current edge is
+ // the edge from prevPoint to srcPoint. If the two end points lie on
+ // different sides of the plane, we have an intersection. Otherwise, the
+ // edge is either completely "inside" the half-space created by the
+ // clipping plane, and we add srcPoint, or it is completely "outside", and
+ // we discard srcPoint.
+ // We may create duplicated points in the polygon. We keep those around
+ // until all clipping is done and then filter out duplicates at the end.
Point4DTyped<UnknownUnits, F>* prevPoint = srcPointEnd - 1;
F prevDot = planeNormals[plane].DotProduct(*prevPoint);
while (srcPoint < srcPointEnd && ((dstPoint - dstPointStart) < kTransformAndClipRectMaxVerts)) {
@@ -783,14 +794,16 @@ public:
}
if (dstPoint == dstPointStart) {
+ // No polygon points were produced, so the polygon has been
+ // completely clipped away by the current clipping plane. Exit.
break;
}
}
- size_t dstPointCount = 0;
- size_t srcPointCount = dstPoint - points[0];
- for (Point4DTyped<UnknownUnits, F>* srcPoint = points[0]; srcPoint < points[0] + srcPointCount; srcPoint++) {
-
+ Point4DTyped<UnknownUnits, F>* srcPoint = dstPointStart;
+ Point4DTyped<UnknownUnits, F>* srcPointEnd = dstPoint;
+ size_t vertCount = 0;
+ while (srcPoint < srcPointEnd) {
PointTyped<TargetUnits, F> p;
if (srcPoint->w == 0.0) {
// If a point lies on the intersection of the clipping planes at
@@ -800,12 +813,13 @@ public:
p = srcPoint->As2DPoint();
}
// Emit only unique points
- if (dstPointCount == 0 || p != aVerts[dstPointCount - 1]) {
- aVerts[dstPointCount++] = p;
+ if (vertCount == 0 || p != aVerts[vertCount - 1]) {
+ aVerts[vertCount++] = p;
}
+ srcPoint++;
}
- return dstPointCount;
+ return vertCount;
}
static const int kTransformAndClipRectMaxVerts = 32;
diff --git a/gfx/tests/gtest/TestMatrix.cpp b/gfx/tests/gtest/TestMatrix.cpp
new file mode 100644
index 000000000..bc2f9e63c
--- /dev/null
+++ b/gfx/tests/gtest/TestMatrix.cpp
@@ -0,0 +1,61 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "gtest/gtest.h"
+#include "mozilla/gfx/Matrix.h"
+
+using namespace mozilla;
+using namespace mozilla::gfx;
+
+static Rect NudgedToInt(const Rect& aRect) {
+ Rect r(aRect);
+ r.NudgeToIntegers();
+ return r;
+}
+
+TEST(Matrix, TransformAndClipRect)
+{
+ Rect c(100, 100, 100, 100);
+ Matrix4x4 m;
+ EXPECT_TRUE(m.TransformAndClipBounds(Rect(50, 50, 20, 20), c).IsEmpty());
+ EXPECT_TRUE(m.TransformAndClipBounds(Rect(250, 50, 20, 20), c).IsEmpty());
+ EXPECT_TRUE(m.TransformAndClipBounds(Rect(250, 250, 20, 20), c).IsEmpty());
+ EXPECT_TRUE(m.TransformAndClipBounds(Rect(50, 250, 20, 20), c).IsEmpty());
+
+ EXPECT_TRUE(m.TransformAndClipBounds(Rect(50, 50, 100, 20), c).IsEmpty());
+ EXPECT_TRUE(m.TransformAndClipBounds(Rect(150, 50, 100, 20), c).IsEmpty());
+ EXPECT_TRUE(m.TransformAndClipBounds(Rect(50, 250, 100, 20), c).IsEmpty());
+ EXPECT_TRUE(m.TransformAndClipBounds(Rect(150, 250, 100, 20), c).IsEmpty());
+
+ EXPECT_TRUE(m.TransformAndClipBounds(Rect(50, 50, 20, 100), c).IsEmpty());
+ EXPECT_TRUE(m.TransformAndClipBounds(Rect(50, 150, 20, 100), c).IsEmpty());
+ EXPECT_TRUE(m.TransformAndClipBounds(Rect(250, 50, 20, 100), c).IsEmpty());
+ EXPECT_TRUE(m.TransformAndClipBounds(Rect(250, 150, 20, 100), c).IsEmpty());
+
+ EXPECT_TRUE(NudgedToInt(m.TransformAndClipBounds(Rect(50, 50, 100, 100), c))
+ .IsEqualInterior(Rect(100, 100, 50, 50)));
+ EXPECT_TRUE(NudgedToInt(m.TransformAndClipBounds(Rect(150, 50, 100, 100), c))
+ .IsEqualInterior(Rect(150, 100, 50, 50)));
+ EXPECT_TRUE(NudgedToInt(m.TransformAndClipBounds(Rect(150, 150, 100, 100), c))
+ .IsEqualInterior(Rect(150, 150, 50, 50)));
+ EXPECT_TRUE(NudgedToInt(m.TransformAndClipBounds(Rect(50, 150, 100, 100), c))
+ .IsEqualInterior(Rect(100, 150, 50, 50)));
+
+ EXPECT_TRUE(NudgedToInt(m.TransformAndClipBounds(Rect(110, 110, 80, 80), c))
+ .IsEqualInterior(Rect(110, 110, 80, 80)));
+
+ EXPECT_TRUE(NudgedToInt(m.TransformAndClipBounds(Rect(50, 50, 200, 200), c))
+ .IsEqualInterior(Rect(100, 100, 100, 100)));
+
+ EXPECT_TRUE(NudgedToInt(m.TransformAndClipBounds(Rect(50, 50, 200, 100), c))
+ .IsEqualInterior(Rect(100, 100, 100, 50)));
+ EXPECT_TRUE(NudgedToInt(m.TransformAndClipBounds(Rect(50, 150, 200, 100), c))
+ .IsEqualInterior(Rect(100, 150, 100, 50)));
+ EXPECT_TRUE(NudgedToInt(m.TransformAndClipBounds(Rect(50, 50, 100, 200), c))
+ .IsEqualInterior(Rect(100, 100, 50, 100)));
+ EXPECT_TRUE(NudgedToInt(m.TransformAndClipBounds(Rect(150, 50, 100, 200), c))
+ .IsEqualInterior(Rect(150, 100, 50, 100)));
+}
diff --git a/gfx/tests/gtest/moz.build b/gfx/tests/gtest/moz.build
index 23b019d1b..ea18c1e3b 100644
--- a/gfx/tests/gtest/moz.build
+++ b/gfx/tests/gtest/moz.build
@@ -17,6 +17,7 @@ UNIFIED_SOURCES += [
'TestGfxWidgets.cpp',
'TestJobScheduler.cpp',
'TestLayers.cpp',
+ 'TestMatrix.cpp',
'TestMoz2D.cpp',
'TestPolygon.cpp',
'TestQcms.cpp',
diff --git a/js/src/jit/IonAnalysis.cpp b/js/src/jit/IonAnalysis.cpp
index 5fc624fb1..ace6cd81e 100644
--- a/js/src/jit/IonAnalysis.cpp
+++ b/js/src/jit/IonAnalysis.cpp
@@ -4005,7 +4005,7 @@ jit::ConvertLinearInequality(TempAllocator& alloc, MBasicBlock* block, const Lin
}
static bool
-AnalyzePoppedThis(JSContext* cx, ObjectGroup* group,
+AnalyzePoppedThis(JSContext* cx, DPAConstraintInfo& constraintInfo, ObjectGroup* group,
MDefinition* thisValue, MInstruction* ins, bool definitelyExecuted,
HandlePlainObject baseobj,
Vector<TypeNewScript::Initializer>* initializerList,
@@ -4046,7 +4046,12 @@ AnalyzePoppedThis(JSContext* cx, ObjectGroup* group,
return true;
RootedId id(cx, NameToId(setprop->name()));
- if (!AddClearDefiniteGetterSetterForPrototypeChain(cx, group, id)) {
+ bool added = false;
+ if (!AddClearDefiniteGetterSetterForPrototypeChain(cx, constraintInfo,
+ group, id, &added)) {
+ return false;
+ }
+ if (!added) {
// The prototype chain already contains a getter/setter for this
// property, or type information is too imprecise.
return true;
@@ -4106,7 +4111,12 @@ AnalyzePoppedThis(JSContext* cx, ObjectGroup* group,
if (!baseobj->lookup(cx, id) && !accessedProperties->append(get->name()))
return false;
- if (!AddClearDefiniteGetterSetterForPrototypeChain(cx, group, id)) {
+ bool added = false;
+ if (!AddClearDefiniteGetterSetterForPrototypeChain(cx, constraintInfo,
+ group, id, &added)) {
+ return false;
+ }
+ if (!added) {
// The |this| value can escape if any property reads it does go
// through a getter.
return true;
@@ -4132,8 +4142,11 @@ CmpInstructions(const void* a, const void* b)
}
bool
-jit::AnalyzeNewScriptDefiniteProperties(JSContext* cx, HandleFunction fun,
- ObjectGroup* group, HandlePlainObject baseobj,
+jit::AnalyzeNewScriptDefiniteProperties(JSContext* cx,
+ DPAConstraintInfo& constraintInfo,
+ HandleFunction fun,
+ ObjectGroup* group,
+ HandlePlainObject baseobj,
Vector<TypeNewScript::Initializer>* initializerList)
{
MOZ_ASSERT(cx->zone()->types.activeAnalysis);
@@ -4293,7 +4306,7 @@ jit::AnalyzeNewScriptDefiniteProperties(JSContext* cx, HandleFunction fun,
bool handled = false;
size_t slotSpan = baseobj->slotSpan();
- if (!AnalyzePoppedThis(cx, group, thisValue, ins, definitelyExecuted,
+ if (!AnalyzePoppedThis(cx, constraintInfo, group, thisValue, ins, definitelyExecuted,
baseobj, initializerList, &accessedProperties, &handled))
{
return false;
@@ -4312,7 +4325,6 @@ jit::AnalyzeNewScriptDefiniteProperties(JSContext* cx, HandleFunction fun,
// contingent on the correct frames being inlined. Add constraints to
// invalidate the definite properties if additional functions could be
// called at the inline frame sites.
- Vector<MBasicBlock*> exitBlocks(cx);
for (MBasicBlockIterator block(graph.begin()); block != graph.end(); block++) {
// Inlining decisions made after the last new property was added to
// the object don't need to be frozen.
@@ -4320,9 +4332,11 @@ jit::AnalyzeNewScriptDefiniteProperties(JSContext* cx, HandleFunction fun,
break;
if (MResumePoint* rp = block->callerResumePoint()) {
if (block->numPredecessors() == 1 && block->getPredecessor(0) == rp->block()) {
- JSScript* script = rp->block()->info().script();
- if (!AddClearDefiniteFunctionUsesInScript(cx, group, script, block->info().script()))
+ JSScript* caller = rp->block()->info().script();
+ JSScript* callee = block->info().script();
+ if (!constraintInfo.addInliningConstraint(caller, callee)) {
return false;
+ }
}
}
}
diff --git a/js/src/jit/IonAnalysis.h b/js/src/jit/IonAnalysis.h
index efd31415b..49bc0b591 100644
--- a/js/src/jit/IonAnalysis.h
+++ b/js/src/jit/IonAnalysis.h
@@ -196,8 +196,11 @@ MCompare*
ConvertLinearInequality(TempAllocator& alloc, MBasicBlock* block, const LinearSum& sum);
MOZ_MUST_USE bool
-AnalyzeNewScriptDefiniteProperties(JSContext* cx, HandleFunction fun,
- ObjectGroup* group, HandlePlainObject baseobj,
+AnalyzeNewScriptDefiniteProperties(JSContext* cx,
+ DPAConstraintInfo& constraintInfo,
+ HandleFunction fun,
+ ObjectGroup* group,
+ HandlePlainObject baseobj,
Vector<TypeNewScript::Initializer>* initializerList);
MOZ_MUST_USE bool
diff --git a/js/src/jsapi.cpp b/js/src/jsapi.cpp
index 84a315587..cad0840e0 100644
--- a/js/src/jsapi.cpp
+++ b/js/src/jsapi.cpp
@@ -2011,6 +2011,28 @@ JS_GetOwnUCPropertyDescriptor(JSContext* cx, HandleObject obj, const char16_t* n
}
JS_PUBLIC_API(bool)
+JS_GetOwnElement(JSContext* cx, JS::HandleObject obj, uint32_t index, JS::MutableHandleValue vp)
+{
+ RootedId id(cx);
+ if (!IndexToId(cx, index, &id)) {
+ return false;
+ }
+
+ Rooted<PropertyDescriptor> desc(cx);
+ if (!JS_GetOwnPropertyDescriptorById(cx, obj, id, &desc)) {
+ return false;
+ }
+
+ if (desc.object() && desc.isDataDescriptor()) {
+ vp.set(desc.value());
+ } else {
+ vp.setUndefined();
+ }
+
+ return true;
+}
+
+JS_PUBLIC_API(bool)
JS_GetPropertyDescriptorById(JSContext* cx, HandleObject obj, HandleId id,
MutableHandle<PropertyDescriptor> desc)
{
diff --git a/js/src/jsapi.h b/js/src/jsapi.h
index 67b3d4267..dc00c650d 100644
--- a/js/src/jsapi.h
+++ b/js/src/jsapi.h
@@ -2922,6 +2922,9 @@ extern JS_PUBLIC_API(bool)
JS_GetOwnUCPropertyDescriptor(JSContext* cx, JS::HandleObject obj, const char16_t* name, size_t namelen,
JS::MutableHandle<JS::PropertyDescriptor> desc);
+extern JS_PUBLIC_API(bool)
+JS_GetOwnElement(JSContext* cx, JS::HandleObject obj, uint32_t index, JS::MutableHandleValue vp);
+
/**
* Like JS_GetOwnPropertyDescriptorById, but also searches the prototype chain
* if no own property is found directly on obj. The object on which the
diff --git a/js/src/vm/TypeInference.cpp b/js/src/vm/TypeInference.cpp
index 7c2c0194e..88327b47e 100644
--- a/js/src/vm/TypeInference.cpp
+++ b/js/src/vm/TypeInference.cpp
@@ -3084,29 +3084,39 @@ class TypeConstraintClearDefiniteGetterSetter : public TypeConstraint
};
bool
-js::AddClearDefiniteGetterSetterForPrototypeChain(JSContext* cx, ObjectGroup* group, HandleId id)
+js::AddClearDefiniteGetterSetterForPrototypeChain(JSContext* cx,
+ DPAConstraintInfo& constraintInfo,
+ ObjectGroup* group,
+ HandleId id,
+ bool* added)
{
/*
* Ensure that if the properties named here could have a getter, setter or
* a permanent property in any transitive prototype, the definite
* properties get cleared from the group.
*/
+
+ *added = false;
+
RootedObject proto(cx, group->proto().toObjectOrNull());
while (proto) {
ObjectGroup* protoGroup = JSObject::getGroup(cx, proto);
if (!protoGroup) {
- cx->recoverFromOutOfMemory();
return false;
}
if (protoGroup->unknownProperties())
- return false;
+ return true;
HeapTypeSet* protoTypes = protoGroup->getProperty(cx, proto, id);
- if (!protoTypes || protoTypes->nonDataProperty() || protoTypes->nonWritableProperty())
+ if (!protoTypes)
return false;
- if (!protoTypes->addConstraint(cx, cx->typeLifoAlloc().new_<TypeConstraintClearDefiniteGetterSetter>(group)))
+ if (protoTypes->nonDataProperty() || protoTypes->nonWritableProperty())
+ return true;
+ if (!constraintInfo.addProtoConstraint(proto, id))
return false;
proto = proto->staticPrototype();
}
+
+ *added = true;
return true;
}
@@ -3612,6 +3622,43 @@ struct DestroyTypeNewScript
} // namespace
+bool DPAConstraintInfo::finishConstraints(JSContext* cx, ObjectGroup* group) {
+ for (const ProtoConstraint& constraint : protoConstraints_) {
+ ObjectGroup* protoGroup = constraint.proto->group();
+
+ // Note: we rely on the group's type information being unchanged since
+ // AddClearDefiniteGetterSetterForPrototypeChain.
+
+ bool unknownProperties = protoGroup->unknownProperties();
+ MOZ_RELEASE_ASSERT(!unknownProperties);
+
+ HeapTypeSet* protoTypes =
+ protoGroup->getProperty(cx, constraint.proto, constraint.id);
+ MOZ_RELEASE_ASSERT(protoTypes);
+
+ MOZ_ASSERT(!protoTypes->nonDataProperty());
+ MOZ_ASSERT(!protoTypes->nonWritableProperty());
+
+ if (!protoTypes->addConstraint(
+ cx,
+ cx->typeLifoAlloc().new_<TypeConstraintClearDefiniteGetterSetter>(
+ group))) {
+ ReportOutOfMemory(cx);
+ return false;
+ }
+ }
+
+ for (const InliningConstraint& constraint : inliningConstraints_) {
+ if (!AddClearDefiniteFunctionUsesInScript(cx, group, constraint.caller,
+ constraint.callee)) {
+ ReportOutOfMemory(cx);
+ return false;
+ }
+ }
+
+ return true;
+}
+
bool
TypeNewScript::maybeAnalyze(JSContext* cx, ObjectGroup* group, bool* regenerate, bool force)
{
@@ -3715,10 +3762,17 @@ TypeNewScript::maybeAnalyze(JSContext* cx, ObjectGroup* group, bool* regenerate,
return false;
Vector<Initializer> initializerVector(cx);
+
+ DPAConstraintInfo constraintInfo(cx);
RootedPlainObject templateRoot(cx, templateObject());
RootedFunction fun(cx, function());
- if (!jit::AnalyzeNewScriptDefiniteProperties(cx, fun, group, templateRoot, &initializerVector))
+ if (!jit::AnalyzeNewScriptDefiniteProperties(cx,
+ constraintInfo,
+ fun,
+ group,
+ templateRoot,
+ &initializerVector))
return false;
if (!group->newScript())
@@ -3772,6 +3826,14 @@ TypeNewScript::maybeAnalyze(JSContext* cx, ObjectGroup* group, bool* regenerate,
// The definite properties analysis found exactly the properties that
// are held in common by the preliminary objects. No further analysis
// is needed.
+
+ if (!constraintInfo.finishConstraints(cx, group)) {
+ return false;
+ }
+ if (!group->newScript()) {
+ return true;
+ }
+
group->addDefiniteProperties(cx, templateObject()->lastProperty());
destroyNewScript.group = nullptr;
@@ -3792,6 +3854,16 @@ TypeNewScript::maybeAnalyze(JSContext* cx, ObjectGroup* group, bool* regenerate,
initialFlags);
if (!initialGroup)
return false;
+
+ // Add the constraints. Use the initialGroup as group referenced by the
+ // constraints because that's the group that will have the TypeNewScript
+ // associated with it. See the detachNewScript and setNewScript calls below.
+ if (!constraintInfo.finishConstraints(cx, initialGroup)) {
+ return false;
+ }
+ if (!group->newScript()) {
+ return true;
+ }
initialGroup->addDefiniteProperties(cx, templateObject()->lastProperty());
group->addDefiniteProperties(cx, prefixShape);
diff --git a/js/src/vm/TypeInference.h b/js/src/vm/TypeInference.h
index 94ce7e871..fd021fc96 100644
--- a/js/src/vm/TypeInference.h
+++ b/js/src/vm/TypeInference.h
@@ -789,8 +789,65 @@ class TemporaryTypeSet : public TypeSet
TypedArraySharedness* sharedness);
};
+// Stack class to record information about constraints that need to be added
+// after finishing the Definite Properties Analysis. When the analysis succeeds,
+// the |finishConstraints| method must be called to add the constraints to the
+// TypeSets.
+//
+// There are two constraint types managed here:
+//
+// 1. Proto constraints for HeapTypeSets, to guard against things like getters
+// and setters on the proto chain.
+//
+// 2. Inlining constraints for StackTypeSets, to invalidate when additional
+// functions could be called at call sites where we inlined a function.
+//
+// This class uses bare GC-thing pointers because GC is suppressed when the
+// analysis runs.
+class MOZ_RAII DPAConstraintInfo {
+ struct ProtoConstraint {
+ JSObject* proto;
+ jsid id;
+ ProtoConstraint(JSObject* proto, jsid id) : proto(proto), id(id) {}
+ };
+ struct InliningConstraint {
+ JSScript* caller;
+ JSScript* callee;
+ InliningConstraint(JSScript* caller, JSScript* callee)
+ : caller(caller), callee(callee) {}
+ };
+
+ JS::AutoCheckCannotGC nogc_;
+ Vector<ProtoConstraint, 8> protoConstraints_;
+ Vector<InliningConstraint, 4> inliningConstraints_;
+
+public:
+ explicit DPAConstraintInfo(JSContext* cx)
+ : nogc_(cx)
+ , protoConstraints_(cx)
+ , inliningConstraints_(cx)
+ {
+ }
+
+ DPAConstraintInfo(const DPAConstraintInfo&) = delete;
+ void operator=(const DPAConstraintInfo&) = delete;
+
+ MOZ_MUST_USE bool addProtoConstraint(JSObject* proto, jsid id) {
+ return protoConstraints_.emplaceBack(proto, id);
+ }
+ MOZ_MUST_USE bool addInliningConstraint(JSScript* caller, JSScript* callee) {
+ return inliningConstraints_.emplaceBack(caller, callee);
+ }
+
+ MOZ_MUST_USE bool finishConstraints(JSContext* cx, ObjectGroup* group);
+};
+
bool
-AddClearDefiniteGetterSetterForPrototypeChain(JSContext* cx, ObjectGroup* group, HandleId id);
+AddClearDefiniteGetterSetterForPrototypeChain(JSContext* cx,
+ DPAConstraintInfo& constraintInfo,
+ ObjectGroup* group,
+ HandleId id,
+ bool* added);
bool
AddClearDefiniteFunctionUsesInScript(JSContext* cx, ObjectGroup* group,
diff --git a/parser/html/jArray.h b/parser/html/jArray.h
index 45548a077..98889059c 100644
--- a/parser/html/jArray.h
+++ b/parser/html/jArray.h
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2008-2015 Mozilla Foundation
+ * Copyright (c) 2019 Moonchild Productions
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -44,32 +45,66 @@ struct staticJArray {
}
};
-template<class T, class L>
-struct jArray {
+template <class T, class L>
+class autoJArray;
+
+template <class T, class L>
+class jArray {
+ friend class autoJArray<T, L>;
+
+private:
T* arr;
+
+public:
L length;
+
static jArray<T,L> newJArray(L const len) {
MOZ_ASSERT(len >= 0, "Negative length.");
jArray<T,L> newArray = { new T[size_t(len)], len };
return newArray;
}
+
static jArray<T,L> newFallibleJArray(L const len) {
MOZ_ASSERT(len >= 0, "Negative length.");
T* a = new (mozilla::fallible) T[size_t(len)];
jArray<T,L> newArray = { a, a ? len : 0 };
return newArray;
}
- operator T*() { return arr; }
+
+ operator T*() {
+ return arr;
+ }
+
T& operator[] (L const index) {
MOZ_ASSERT(index >= 0, "Array access with negative index.");
MOZ_ASSERT(index < length, "Array index out of bounds.");
return arr[index];
}
+
void operator=(staticJArray<T,L>& other) {
arr = (T*)other.arr;
length = other.length;
}
-};
+
+ MOZ_IMPLICIT jArray(decltype(nullptr))
+ : arr(nullptr)
+ , length(0)
+ {
+ }
+
+ jArray()
+ : arr(nullptr)
+ , length(0)
+ {
+ }
+
+private:
+ jArray(T* aArr, L aLength)
+ : arr(aArr)
+ , length(aLength)
+ {
+ }
+}; // class jArray
template<class T, class L>
class autoJArray {
diff --git a/parser/html/java/Makefile b/parser/html/java/Makefile
deleted file mode 100644
index b43523e03..000000000
--- a/parser/html/java/Makefile
+++ /dev/null
@@ -1,59 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-libs:: translator
-
-translator:: javaparser \
-; mkdir -p htmlparser/bin && \
- find htmlparser/translator-src/nu/validator/htmlparser -name "*.java" | \
- xargs javac -cp javaparser.jar -g -d htmlparser/bin && \
- jar cfm translator.jar manifest.txt -C htmlparser/bin .
-
-javaparser:: \
-; mkdir -p javaparser/bin && \
- find javaparser/src -name "*.java" | \
- xargs javac -encoding ISO-8859-1 -g -d javaparser/bin && \
- jar cf javaparser.jar -C javaparser/bin .
-
-sync_javaparser:: \
-; if [ ! -d javaparser/.git ] ; \
- then rm -rf javaparser ; \
- git clone https://github.com/javaparser/javaparser.git ; \
- fi ; \
- cd javaparser ; git checkout javaparser-1.0.6 ; cd ..
-
-sync_htmlparser:: \
-; if [ -d htmlparser/.hg ] ; \
- then cd htmlparser ; hg pull --rebase ; cd .. ; \
- else \
- rm -rf htmlparser ; \
- hg clone https://hg.mozilla.org/projects/htmlparser ; \
- fi
-
-sync:: sync_javaparser sync_htmlparser
-
-translate:: translator \
-; mkdir -p ../javasrc ; \
- java -jar translator.jar \
- htmlparser/src/nu/validator/htmlparser/impl \
- .. ../nsHtml5AtomList.h
-
-translate_from_snapshot:: translator \
-; mkdir -p ../javasrc ; \
- java -jar translator.jar \
- ../javasrc \
- .. ../nsHtml5AtomList.h
-
-named_characters:: translator \
-; java -cp translator.jar \
- nu.validator.htmlparser.generator.GenerateNamedCharactersCpp \
- named-character-references.html ../
-
-clean_javaparser:: \
-; rm -rf javaparser/bin javaparser.jar
-
-clean_htmlparser:: \
-; rm -rf htmlparser/bin translator.jar
-
-clean:: clean_javaparser clean_htmlparser
diff --git a/parser/html/java/README.txt b/parser/html/java/README.txt
deleted file mode 100644
index df1bfcd4c..000000000
--- a/parser/html/java/README.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-If this is your first time building the HTML5 parser, you need to execute the
-following commands (from this directory) to bootstrap the translation:
-
- make sync # fetch remote source files and licenses
- make translate # perform the Java-to-C++ translation from the remote
- # sources
- make named_characters # Generate tables for named character tokenization
-
-If you make changes to the translator or the javaparser, you can rebuild by
-retyping 'make' in this directory. If you make changes to the HTML5 Java
-implementation, you can retranslate the Java sources from the htmlparser
-repository by retyping 'make translate' in this directory.
-
-The makefile supports the following targets:
-
-sync_htmlparser:
- Retrieves the HTML parser and Java to C++ translator sources from Mozilla's
- htmlparser repository.
-sync_javaparser:
- Retrieves the javaparser sources from GitHub.
-sync:
- Runs both sync_javaparser and sync_htmlparser.
-javaparser:
- Builds the javaparser library retrieved earlier by sync_javaparser.
-translator:
- Runs the javaparser target and then builds the Java to C++ translator from
- sources retrieved earlier by sync_htmlparser.
-libs:
- The default target. Alias for translator
-translate:
- Runs the translator target and then translates the HTML parser sources
- retrieved by sync_htmlparser copying the Java sources to ../javasrc.
-translate_from_snapshot:
- Runs the translator target and then translates the HTML parser sources
- stored in ../javasrc.
-named_characters:
- Generates data tables for named character tokenization.
-clean_javaparser:
- Removes the build products of the javaparser target.
-clean_htmlparser:
- Removes the build products of the translator target.
-clean:
- Runs both clean_javaparser and clean_htmlparser.
-
-Ben Newman (23 September 2009)
-Henri Sivonen (11 August 2016)
diff --git a/parser/html/java/manifest.txt b/parser/html/java/manifest.txt
deleted file mode 100644
index 14cd9d081..000000000
--- a/parser/html/java/manifest.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Main-Class: nu.validator.htmlparser.cpptranslate.Main
-Class-Path: javaparser.jar
diff --git a/parser/html/java/named-character-references.html b/parser/html/java/named-character-references.html
deleted file mode 100644
index c8d1e08da..000000000
--- a/parser/html/java/named-character-references.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<!--
-Spec rev 4381
--->
-
- <table><thead><tr><th> Name </th> <th> Character </th> <tbody><tr><td> <code title="">AElig;</code> </td> <td> U+000C6 </td> <tr><td> <code title="">AElig</code> </td> <td> U+000C6 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">AMP;</code> </td> <td> U+00026 </td> <tr><td> <code title="">AMP</code> </td> <td> U+00026 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Aacute;</code> </td> <td> U+000C1 </td> <tr><td> <code title="">Aacute</code> </td> <td> U+000C1 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Abreve;</code> </td> <td> U+00102 </td> <tr><td> <code title="">Acirc;</code> </td> <td> U+000C2 </td> <tr><td> <code title="">Acirc</code> </td> <td> U+000C2 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Acy;</code> </td> <td> U+00410 </td> <tr><td> <code title="">Afr;</code> </td> <td> U+1D504 </td> <tr><td> <code title="">Agrave;</code> </td> <td> U+000C0 </td> <tr><td> <code title="">Agrave</code> </td> <td> U+000C0 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Alpha;</code> </td> <td> U+00391 </td> <tr><td> <code title="">Amacr;</code> </td> <td> U+00100 </td> <tr><td> <code title="">And;</code> </td> <td> U+02A53 </td> <tr><td> <code title="">Aogon;</code> </td> <td> U+00104 </td> <tr><td> <code title="">Aopf;</code> </td> <td> U+1D538 </td> <tr><td> <code title="">ApplyFunction;</code> </td> <td> U+02061 </td> <tr><td> <code title="">Aring;</code> </td> <td> U+000C5 </td> <tr><td> <code title="">Aring</code> </td> <td> U+000C5 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Ascr;</code> </td> <td> U+1D49C </td> <tr><td> <code title="">Assign;</code> </td> <td> U+02254 </td> <tr><td> <code title="">Atilde;</code> </td> <td> U+000C3 </td> <tr><td> <code title="">Atilde</code> </td> <td> U+000C3 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Auml;</code> </td> <td> U+000C4 </td> <tr><td> <code title="">Auml</code> </td> <td> U+000C4 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Backslash;</code> </td> <td> U+02216 </td> <tr><td> <code title="">Barv;</code> </td> <td> U+02AE7 </td> <tr><td> <code title="">Barwed;</code> </td> <td> U+02306 </td> <tr><td> <code title="">Bcy;</code> </td> <td> U+00411 </td> <tr><td> <code title="">Because;</code> </td> <td> U+02235 </td> <tr><td> <code title="">Bernoullis;</code> </td> <td> U+0212C </td> <tr><td> <code title="">Beta;</code> </td> <td> U+00392 </td> <tr><td> <code title="">Bfr;</code> </td> <td> U+1D505 </td> <tr><td> <code title="">Bopf;</code> </td> <td> U+1D539 </td> <tr><td> <code title="">Breve;</code> </td> <td> U+002D8 </td> <tr><td> <code title="">Bscr;</code> </td> <td> U+0212C </td> <tr><td> <code title="">Bumpeq;</code> </td> <td> U+0224E </td> <tr><td> <code title="">CHcy;</code> </td> <td> U+00427 </td> <tr><td> <code title="">COPY;</code> </td> <td> U+000A9 </td> <tr><td> <code title="">COPY</code> </td> <td> U+000A9 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Cacute;</code> </td> <td> U+00106 </td> <tr><td> <code title="">Cap;</code> </td> <td> U+022D2 </td> <tr><td> <code title="">CapitalDifferentialD;</code> </td> <td> U+02145 </td> <tr><td> <code title="">Cayleys;</code> </td> <td> U+0212D </td> <tr><td> <code title="">Ccaron;</code> </td> <td> U+0010C </td> <tr><td> <code title="">Ccedil;</code> </td> <td> U+000C7 </td> <tr><td> <code title="">Ccedil</code> </td> <td> U+000C7 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Ccirc;</code> </td> <td> U+00108 </td> <tr><td> <code title="">Cconint;</code> </td> <td> U+02230 </td> <tr><td> <code title="">Cdot;</code> </td> <td> U+0010A </td> <tr><td> <code title="">Cedilla;</code> </td> <td> U+000B8 </td> <tr><td> <code title="">CenterDot;</code> </td> <td> U+000B7 </td> <tr><td> <code title="">Cfr;</code> </td> <td> U+0212D </td> <tr><td> <code title="">Chi;</code> </td> <td> U+003A7 </td> <tr><td> <code title="">CircleDot;</code> </td> <td> U+02299 </td> <tr><td> <code title="">CircleMinus;</code> </td> <td> U+02296 </td> <tr><td> <code title="">CirclePlus;</code> </td> <td> U+02295 </td> <tr><td> <code title="">CircleTimes;</code> </td> <td> U+02297 </td> <tr><td> <code title="">ClockwiseContourIntegral;</code> </td> <td> U+02232 </td> <tr><td> <code title="">CloseCurlyDoubleQuote;</code> </td> <td> U+0201D </td> <tr><td> <code title="">CloseCurlyQuote;</code> </td> <td> U+02019 </td> <tr><td> <code title="">Colon;</code> </td> <td> U+02237 </td> <tr><td> <code title="">Colone;</code> </td> <td> U+02A74 </td> <tr><td> <code title="">Congruent;</code> </td> <td> U+02261 </td> <tr><td> <code title="">Conint;</code> </td> <td> U+0222F </td> <tr><td> <code title="">ContourIntegral;</code> </td> <td> U+0222E </td> <tr><td> <code title="">Copf;</code> </td> <td> U+02102 </td> <tr><td> <code title="">Coproduct;</code> </td> <td> U+02210 </td> <tr><td> <code title="">CounterClockwiseContourIntegral;</code> </td> <td> U+02233 </td> <tr><td> <code title="">Cross;</code> </td> <td> U+02A2F </td> <tr><td> <code title="">Cscr;</code> </td> <td> U+1D49E </td> <tr><td> <code title="">Cup;</code> </td> <td> U+022D3 </td> <tr><td> <code title="">CupCap;</code> </td> <td> U+0224D </td> <tr><td> <code title="">DD;</code> </td> <td> U+02145 </td> <tr><td> <code title="">DDotrahd;</code> </td> <td> U+02911 </td> <tr><td> <code title="">DJcy;</code> </td> <td> U+00402 </td> <tr><td> <code title="">DScy;</code> </td> <td> U+00405 </td> <tr><td> <code title="">DZcy;</code> </td> <td> U+0040F </td> <tr><td> <code title="">Dagger;</code> </td> <td> U+02021 </td> <tr><td> <code title="">Darr;</code> </td> <td> U+021A1 </td> <tr><td> <code title="">Dashv;</code> </td> <td> U+02AE4 </td> <tr><td> <code title="">Dcaron;</code> </td> <td> U+0010E </td> <tr><td> <code title="">Dcy;</code> </td> <td> U+00414 </td> <tr><td> <code title="">Del;</code> </td> <td> U+02207 </td> <tr><td> <code title="">Delta;</code> </td> <td> U+00394 </td> <tr><td> <code title="">Dfr;</code> </td> <td> U+1D507 </td> <tr><td> <code title="">DiacriticalAcute;</code> </td> <td> U+000B4 </td> <tr><td> <code title="">DiacriticalDot;</code> </td> <td> U+002D9 </td> <tr><td> <code title="">DiacriticalDoubleAcute;</code> </td> <td> U+002DD </td> <tr><td> <code title="">DiacriticalGrave;</code> </td> <td> U+00060 </td> <tr><td> <code title="">DiacriticalTilde;</code> </td> <td> U+002DC </td> <tr><td> <code title="">Diamond;</code> </td> <td> U+022C4 </td> <tr><td> <code title="">DifferentialD;</code> </td> <td> U+02146 </td> <tr><td> <code title="">Dopf;</code> </td> <td> U+1D53B </td> <tr><td> <code title="">Dot;</code> </td> <td> U+000A8 </td> <tr><td> <code title="">DotDot;</code> </td> <td> U+020DC </td> <tr><td> <code title="">DotEqual;</code> </td> <td> U+02250 </td> <tr><td> <code title="">DoubleContourIntegral;</code> </td> <td> U+0222F </td> <tr><td> <code title="">DoubleDot;</code> </td> <td> U+000A8 </td> <tr><td> <code title="">DoubleDownArrow;</code> </td> <td> U+021D3 </td> <tr><td> <code title="">DoubleLeftArrow;</code> </td> <td> U+021D0 </td> <tr><td> <code title="">DoubleLeftRightArrow;</code> </td> <td> U+021D4 </td> <tr><td> <code title="">DoubleLeftTee;</code> </td> <td> U+02AE4 </td> <tr><td> <code title="">DoubleLongLeftArrow;</code> </td> <td> U+027F8 </td> <tr><td> <code title="">DoubleLongLeftRightArrow;</code> </td> <td> U+027FA </td> <tr><td> <code title="">DoubleLongRightArrow;</code> </td> <td> U+027F9 </td> <tr><td> <code title="">DoubleRightArrow;</code> </td> <td> U+021D2 </td> <tr><td> <code title="">DoubleRightTee;</code> </td> <td> U+022A8 </td> <tr><td> <code title="">DoubleUpArrow;</code> </td> <td> U+021D1 </td> <tr><td> <code title="">DoubleUpDownArrow;</code> </td> <td> U+021D5 </td> <tr><td> <code title="">DoubleVerticalBar;</code> </td> <td> U+02225 </td> <tr><td> <code title="">DownArrow;</code> </td> <td> U+02193 </td> <tr><td> <code title="">DownArrowBar;</code> </td> <td> U+02913 </td> <tr><td> <code title="">DownArrowUpArrow;</code> </td> <td> U+021F5 </td> <tr><td> <code title="">DownBreve;</code> </td> <td> U+00311 </td> <tr><td> <code title="">DownLeftRightVector;</code> </td> <td> U+02950 </td> <tr><td> <code title="">DownLeftTeeVector;</code> </td> <td> U+0295E </td> <tr><td> <code title="">DownLeftVector;</code> </td> <td> U+021BD </td> <tr><td> <code title="">DownLeftVectorBar;</code> </td> <td> U+02956 </td> <tr><td> <code title="">DownRightTeeVector;</code> </td> <td> U+0295F </td> <tr><td> <code title="">DownRightVector;</code> </td> <td> U+021C1 </td> <tr><td> <code title="">DownRightVectorBar;</code> </td> <td> U+02957 </td> <tr><td> <code title="">DownTee;</code> </td> <td> U+022A4 </td> <tr><td> <code title="">DownTeeArrow;</code> </td> <td> U+021A7 </td> <tr><td> <code title="">Downarrow;</code> </td> <td> U+021D3 </td> <tr><td> <code title="">Dscr;</code> </td> <td> U+1D49F </td> <tr><td> <code title="">Dstrok;</code> </td> <td> U+00110 </td> <tr><td> <code title="">ENG;</code> </td> <td> U+0014A </td> <tr><td> <code title="">ETH;</code> </td> <td> U+000D0 </td> <tr><td> <code title="">ETH</code> </td> <td> U+000D0 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Eacute;</code> </td> <td> U+000C9 </td> <tr><td> <code title="">Eacute</code> </td> <td> U+000C9 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Ecaron;</code> </td> <td> U+0011A </td> <tr><td> <code title="">Ecirc;</code> </td> <td> U+000CA </td> <tr><td> <code title="">Ecirc</code> </td> <td> U+000CA </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Ecy;</code> </td> <td> U+0042D </td> <tr><td> <code title="">Edot;</code> </td> <td> U+00116 </td> <tr><td> <code title="">Efr;</code> </td> <td> U+1D508 </td> <tr><td> <code title="">Egrave;</code> </td> <td> U+000C8 </td> <tr><td> <code title="">Egrave</code> </td> <td> U+000C8 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Element;</code> </td> <td> U+02208 </td> <tr><td> <code title="">Emacr;</code> </td> <td> U+00112 </td> <tr><td> <code title="">EmptySmallSquare;</code> </td> <td> U+025FB </td> <tr><td> <code title="">EmptyVerySmallSquare;</code> </td> <td> U+025AB </td> <tr><td> <code title="">Eogon;</code> </td> <td> U+00118 </td> <tr><td> <code title="">Eopf;</code> </td> <td> U+1D53C </td> <tr><td> <code title="">Epsilon;</code> </td> <td> U+00395 </td> <tr><td> <code title="">Equal;</code> </td> <td> U+02A75 </td> <tr><td> <code title="">EqualTilde;</code> </td> <td> U+02242 </td> <tr><td> <code title="">Equilibrium;</code> </td> <td> U+021CC </td> <tr><td> <code title="">Escr;</code> </td> <td> U+02130 </td> <tr><td> <code title="">Esim;</code> </td> <td> U+02A73 </td> <tr><td> <code title="">Eta;</code> </td> <td> U+00397 </td> <tr><td> <code title="">Euml;</code> </td> <td> U+000CB </td> <tr><td> <code title="">Euml</code> </td> <td> U+000CB </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Exists;</code> </td> <td> U+02203 </td> <tr><td> <code title="">ExponentialE;</code> </td> <td> U+02147 </td> <tr><td> <code title="">Fcy;</code> </td> <td> U+00424 </td> <tr><td> <code title="">Ffr;</code> </td> <td> U+1D509 </td> <tr><td> <code title="">FilledSmallSquare;</code> </td> <td> U+025FC </td> <tr><td> <code title="">FilledVerySmallSquare;</code> </td> <td> U+025AA </td> <tr><td> <code title="">Fopf;</code> </td> <td> U+1D53D </td> <tr><td> <code title="">ForAll;</code> </td> <td> U+02200 </td> <tr><td> <code title="">Fouriertrf;</code> </td> <td> U+02131 </td> <tr><td> <code title="">Fscr;</code> </td> <td> U+02131 </td> <tr><td> <code title="">GJcy;</code> </td> <td> U+00403 </td> <tr><td> <code title="">GT;</code> </td> <td> U+0003E </td> <tr><td> <code title="">GT</code> </td> <td> U+0003E </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Gamma;</code> </td> <td> U+00393 </td> <tr><td> <code title="">Gammad;</code> </td> <td> U+003DC </td> <tr><td> <code title="">Gbreve;</code> </td> <td> U+0011E </td> <tr><td> <code title="">Gcedil;</code> </td> <td> U+00122 </td> <tr><td> <code title="">Gcirc;</code> </td> <td> U+0011C </td> <tr><td> <code title="">Gcy;</code> </td> <td> U+00413 </td> <tr><td> <code title="">Gdot;</code> </td> <td> U+00120 </td> <tr><td> <code title="">Gfr;</code> </td> <td> U+1D50A </td> <tr><td> <code title="">Gg;</code> </td> <td> U+022D9 </td> <tr><td> <code title="">Gopf;</code> </td> <td> U+1D53E </td> <tr><td> <code title="">GreaterEqual;</code> </td> <td> U+02265 </td> <tr><td> <code title="">GreaterEqualLess;</code> </td> <td> U+022DB </td> <tr><td> <code title="">GreaterFullEqual;</code> </td> <td> U+02267 </td> <tr><td> <code title="">GreaterGreater;</code> </td> <td> U+02AA2 </td> <tr><td> <code title="">GreaterLess;</code> </td> <td> U+02277 </td> <tr><td> <code title="">GreaterSlantEqual;</code> </td> <td> U+02A7E </td> <tr><td> <code title="">GreaterTilde;</code> </td> <td> U+02273 </td> <tr><td> <code title="">Gscr;</code> </td> <td> U+1D4A2 </td> <tr><td> <code title="">Gt;</code> </td> <td> U+0226B </td> <tr><td> <code title="">HARDcy;</code> </td> <td> U+0042A </td> <tr><td> <code title="">Hacek;</code> </td> <td> U+002C7 </td> <tr><td> <code title="">Hat;</code> </td> <td> U+0005E </td> <tr><td> <code title="">Hcirc;</code> </td> <td> U+00124 </td> <tr><td> <code title="">Hfr;</code> </td> <td> U+0210C </td> <tr><td> <code title="">HilbertSpace;</code> </td> <td> U+0210B </td> <tr><td> <code title="">Hopf;</code> </td> <td> U+0210D </td> <tr><td> <code title="">HorizontalLine;</code> </td> <td> U+02500 </td> <tr><td> <code title="">Hscr;</code> </td> <td> U+0210B </td> <tr><td> <code title="">Hstrok;</code> </td> <td> U+00126 </td> <tr><td> <code title="">HumpDownHump;</code> </td> <td> U+0224E </td> <tr><td> <code title="">HumpEqual;</code> </td> <td> U+0224F </td> <tr><td> <code title="">IEcy;</code> </td> <td> U+00415 </td> <tr><td> <code title="">IJlig;</code> </td> <td> U+00132 </td> <tr><td> <code title="">IOcy;</code> </td> <td> U+00401 </td> <tr><td> <code title="">Iacute;</code> </td> <td> U+000CD </td> <tr><td> <code title="">Iacute</code> </td> <td> U+000CD </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Icirc;</code> </td> <td> U+000CE </td> <tr><td> <code title="">Icirc</code> </td> <td> U+000CE </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Icy;</code> </td> <td> U+00418 </td> <tr><td> <code title="">Idot;</code> </td> <td> U+00130 </td> <tr><td> <code title="">Ifr;</code> </td> <td> U+02111 </td> <tr><td> <code title="">Igrave;</code> </td> <td> U+000CC </td> <tr><td> <code title="">Igrave</code> </td> <td> U+000CC </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Im;</code> </td> <td> U+02111 </td> <tr><td> <code title="">Imacr;</code> </td> <td> U+0012A </td> <tr><td> <code title="">ImaginaryI;</code> </td> <td> U+02148 </td> <tr><td> <code title="">Implies;</code> </td> <td> U+021D2 </td> <tr><td> <code title="">Int;</code> </td> <td> U+0222C </td> <tr><td> <code title="">Integral;</code> </td> <td> U+0222B </td> <tr><td> <code title="">Intersection;</code> </td> <td> U+022C2 </td> <tr><td> <code title="">InvisibleComma;</code> </td> <td> U+02063 </td> <tr><td> <code title="">InvisibleTimes;</code> </td> <td> U+02062 </td> <tr><td> <code title="">Iogon;</code> </td> <td> U+0012E </td> <tr><td> <code title="">Iopf;</code> </td> <td> U+1D540 </td> <tr><td> <code title="">Iota;</code> </td> <td> U+00399 </td> <tr><td> <code title="">Iscr;</code> </td> <td> U+02110 </td> <tr><td> <code title="">Itilde;</code> </td> <td> U+00128 </td> <tr><td> <code title="">Iukcy;</code> </td> <td> U+00406 </td> <tr><td> <code title="">Iuml;</code> </td> <td> U+000CF </td> <tr><td> <code title="">Iuml</code> </td> <td> U+000CF </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Jcirc;</code> </td> <td> U+00134 </td> <tr><td> <code title="">Jcy;</code> </td> <td> U+00419 </td> <tr><td> <code title="">Jfr;</code> </td> <td> U+1D50D </td> <tr><td> <code title="">Jopf;</code> </td> <td> U+1D541 </td> <tr><td> <code title="">Jscr;</code> </td> <td> U+1D4A5 </td> <tr><td> <code title="">Jsercy;</code> </td> <td> U+00408 </td> <tr><td> <code title="">Jukcy;</code> </td> <td> U+00404 </td> <tr><td> <code title="">KHcy;</code> </td> <td> U+00425 </td> <tr><td> <code title="">KJcy;</code> </td> <td> U+0040C </td> <tr><td> <code title="">Kappa;</code> </td> <td> U+0039A </td> <tr><td> <code title="">Kcedil;</code> </td> <td> U+00136 </td> <tr><td> <code title="">Kcy;</code> </td> <td> U+0041A </td> <tr><td> <code title="">Kfr;</code> </td> <td> U+1D50E </td> <tr><td> <code title="">Kopf;</code> </td> <td> U+1D542 </td> <tr><td> <code title="">Kscr;</code> </td> <td> U+1D4A6 </td> <tr><td> <code title="">LJcy;</code> </td> <td> U+00409 </td> <tr><td> <code title="">LT;</code> </td> <td> U+0003C </td> <tr><td> <code title="">LT</code> </td> <td> U+0003C </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Lacute;</code> </td> <td> U+00139 </td> <tr><td> <code title="">Lambda;</code> </td> <td> U+0039B </td> <tr><td> <code title="">Lang;</code> </td> <td> U+027EA </td> <tr><td> <code title="">Laplacetrf;</code> </td> <td> U+02112 </td> <tr><td> <code title="">Larr;</code> </td> <td> U+0219E </td> <tr><td> <code title="">Lcaron;</code> </td> <td> U+0013D </td> <tr><td> <code title="">Lcedil;</code> </td> <td> U+0013B </td> <tr><td> <code title="">Lcy;</code> </td> <td> U+0041B </td> <tr><td> <code title="">LeftAngleBracket;</code> </td> <td> U+027E8 </td> <tr><td> <code title="">LeftArrow;</code> </td> <td> U+02190 </td> <tr><td> <code title="">LeftArrowBar;</code> </td> <td> U+021E4 </td> <tr><td> <code title="">LeftArrowRightArrow;</code> </td> <td> U+021C6 </td> <tr><td> <code title="">LeftCeiling;</code> </td> <td> U+02308 </td> <tr><td> <code title="">LeftDoubleBracket;</code> </td> <td> U+027E6 </td> <tr><td> <code title="">LeftDownTeeVector;</code> </td> <td> U+02961 </td> <tr><td> <code title="">LeftDownVector;</code> </td> <td> U+021C3 </td> <tr><td> <code title="">LeftDownVectorBar;</code> </td> <td> U+02959 </td> <tr><td> <code title="">LeftFloor;</code> </td> <td> U+0230A </td> <tr><td> <code title="">LeftRightArrow;</code> </td> <td> U+02194 </td> <tr><td> <code title="">LeftRightVector;</code> </td> <td> U+0294E </td> <tr><td> <code title="">LeftTee;</code> </td> <td> U+022A3 </td> <tr><td> <code title="">LeftTeeArrow;</code> </td> <td> U+021A4 </td> <tr><td> <code title="">LeftTeeVector;</code> </td> <td> U+0295A </td> <tr><td> <code title="">LeftTriangle;</code> </td> <td> U+022B2 </td> <tr><td> <code title="">LeftTriangleBar;</code> </td> <td> U+029CF </td> <tr><td> <code title="">LeftTriangleEqual;</code> </td> <td> U+022B4 </td> <tr><td> <code title="">LeftUpDownVector;</code> </td> <td> U+02951 </td> <tr><td> <code title="">LeftUpTeeVector;</code> </td> <td> U+02960 </td> <tr><td> <code title="">LeftUpVector;</code> </td> <td> U+021BF </td> <tr><td> <code title="">LeftUpVectorBar;</code> </td> <td> U+02958 </td> <tr><td> <code title="">LeftVector;</code> </td> <td> U+021BC </td> <tr><td> <code title="">LeftVectorBar;</code> </td> <td> U+02952 </td> <tr><td> <code title="">Leftarrow;</code> </td> <td> U+021D0 </td> <tr><td> <code title="">Leftrightarrow;</code> </td> <td> U+021D4 </td> <tr><td> <code title="">LessEqualGreater;</code> </td> <td> U+022DA </td> <tr><td> <code title="">LessFullEqual;</code> </td> <td> U+02266 </td> <tr><td> <code title="">LessGreater;</code> </td> <td> U+02276 </td> <tr><td> <code title="">LessLess;</code> </td> <td> U+02AA1 </td> <tr><td> <code title="">LessSlantEqual;</code> </td> <td> U+02A7D </td> <tr><td> <code title="">LessTilde;</code> </td> <td> U+02272 </td> <tr><td> <code title="">Lfr;</code> </td> <td> U+1D50F </td> <tr><td> <code title="">Ll;</code> </td> <td> U+022D8 </td> <tr><td> <code title="">Lleftarrow;</code> </td> <td> U+021DA </td> <tr><td> <code title="">Lmidot;</code> </td> <td> U+0013F </td> <tr><td> <code title="">LongLeftArrow;</code> </td> <td> U+027F5 </td> <tr><td> <code title="">LongLeftRightArrow;</code> </td> <td> U+027F7 </td> <tr><td> <code title="">LongRightArrow;</code> </td> <td> U+027F6 </td> <tr><td> <code title="">Longleftarrow;</code> </td> <td> U+027F8 </td> <tr><td> <code title="">Longleftrightarrow;</code> </td> <td> U+027FA </td> <tr><td> <code title="">Longrightarrow;</code> </td> <td> U+027F9 </td> <tr><td> <code title="">Lopf;</code> </td> <td> U+1D543 </td> <tr><td> <code title="">LowerLeftArrow;</code> </td> <td> U+02199 </td> <tr><td> <code title="">LowerRightArrow;</code> </td> <td> U+02198 </td> <tr><td> <code title="">Lscr;</code> </td> <td> U+02112 </td> <tr><td> <code title="">Lsh;</code> </td> <td> U+021B0 </td> <tr><td> <code title="">Lstrok;</code> </td> <td> U+00141 </td> <tr><td> <code title="">Lt;</code> </td> <td> U+0226A </td> <tr><td> <code title="">Map;</code> </td> <td> U+02905 </td> <tr><td> <code title="">Mcy;</code> </td> <td> U+0041C </td> <tr><td> <code title="">MediumSpace;</code> </td> <td> U+0205F </td> <tr><td> <code title="">Mellintrf;</code> </td> <td> U+02133 </td> <tr><td> <code title="">Mfr;</code> </td> <td> U+1D510 </td> <tr><td> <code title="">MinusPlus;</code> </td> <td> U+02213 </td> <tr><td> <code title="">Mopf;</code> </td> <td> U+1D544 </td> <tr><td> <code title="">Mscr;</code> </td> <td> U+02133 </td> <tr><td> <code title="">Mu;</code> </td> <td> U+0039C </td> <tr><td> <code title="">NJcy;</code> </td> <td> U+0040A </td> <tr><td> <code title="">Nacute;</code> </td> <td> U+00143 </td> <tr><td> <code title="">Ncaron;</code> </td> <td> U+00147 </td> <tr><td> <code title="">Ncedil;</code> </td> <td> U+00145 </td> <tr><td> <code title="">Ncy;</code> </td> <td> U+0041D </td> <tr><td> <code title="">NegativeMediumSpace;</code> </td> <td> U+0200B </td> <tr><td> <code title="">NegativeThickSpace;</code> </td> <td> U+0200B </td> <tr><td> <code title="">NegativeThinSpace;</code> </td> <td> U+0200B </td> <tr><td> <code title="">NegativeVeryThinSpace;</code> </td> <td> U+0200B </td> <tr><td> <code title="">NestedGreaterGreater;</code> </td> <td> U+0226B </td> <tr><td> <code title="">NestedLessLess;</code> </td> <td> U+0226A </td> <tr><td> <code title="">NewLine;</code> </td> <td> U+0000A </td> <tr><td> <code title="">Nfr;</code> </td> <td> U+1D511 </td> <tr><td> <code title="">NoBreak;</code> </td> <td> U+02060 </td> <tr><td> <code title="">NonBreakingSpace;</code> </td> <td> U+000A0 </td> <tr><td> <code title="">Nopf;</code> </td> <td> U+02115 </td> <tr><td> <code title="">Not;</code> </td> <td> U+02AEC </td> <tr><td> <code title="">NotCongruent;</code> </td> <td> U+02262 </td> <tr><td> <code title="">NotCupCap;</code> </td> <td> U+0226D </td> <tr><td> <code title="">NotDoubleVerticalBar;</code> </td> <td> U+02226 </td> <tr><td> <code title="">NotElement;</code> </td> <td> U+02209 </td> <tr><td> <code title="">NotEqual;</code> </td> <td> U+02260 </td> <tr><td> <code title="">NotExists;</code> </td> <td> U+02204 </td> <tr><td> <code title="">NotGreater;</code> </td> <td> U+0226F </td> <tr><td> <code title="">NotGreaterEqual;</code> </td> <td> U+02271 </td> <tr><td> <code title="">NotGreaterLess;</code> </td> <td> U+02279 </td> <tr><td> <code title="">NotGreaterTilde;</code> </td> <td> U+02275 </td> <tr><td> <code title="">NotLeftTriangle;</code> </td> <td> U+022EA </td> <tr><td> <code title="">NotLeftTriangleEqual;</code> </td> <td> U+022EC </td> <tr><td> <code title="">NotLess;</code> </td> <td> U+0226E </td> <tr><td> <code title="">NotLessEqual;</code> </td> <td> U+02270 </td> <tr><td> <code title="">NotLessGreater;</code> </td> <td> U+02278 </td> <tr><td> <code title="">NotLessTilde;</code> </td> <td> U+02274 </td> <tr><td> <code title="">NotPrecedes;</code> </td> <td> U+02280 </td> <tr><td> <code title="">NotPrecedesSlantEqual;</code> </td> <td> U+022E0 </td> <tr><td> <code title="">NotReverseElement;</code> </td> <td> U+0220C </td> <tr><td> <code title="">NotRightTriangle;</code> </td> <td> U+022EB </td> <tr><td> <code title="">NotRightTriangleEqual;</code> </td> <td> U+022ED </td> <tr><td> <code title="">NotSquareSubsetEqual;</code> </td> <td> U+022E2 </td> <tr><td> <code title="">NotSquareSupersetEqual;</code> </td> <td> U+022E3 </td> <tr><td> <code title="">NotSubsetEqual;</code> </td> <td> U+02288 </td> <tr><td> <code title="">NotSucceeds;</code> </td> <td> U+02281 </td> <tr><td> <code title="">NotSucceedsSlantEqual;</code> </td> <td> U+022E1 </td> <tr><td> <code title="">NotSupersetEqual;</code> </td> <td> U+02289 </td> <tr><td> <code title="">NotTilde;</code> </td> <td> U+02241 </td> <tr><td> <code title="">NotTildeEqual;</code> </td> <td> U+02244 </td> <tr><td> <code title="">NotTildeFullEqual;</code> </td> <td> U+02247 </td> <tr><td> <code title="">NotTildeTilde;</code> </td> <td> U+02249 </td> <tr><td> <code title="">NotVerticalBar;</code> </td> <td> U+02224 </td> <tr><td> <code title="">Nscr;</code> </td> <td> U+1D4A9 </td> <tr><td> <code title="">Ntilde;</code> </td> <td> U+000D1 </td> <tr><td> <code title="">Ntilde</code> </td> <td> U+000D1 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Nu;</code> </td> <td> U+0039D </td> <tr><td> <code title="">OElig;</code> </td> <td> U+00152 </td> <tr><td> <code title="">Oacute;</code> </td> <td> U+000D3 </td> <tr><td> <code title="">Oacute</code> </td> <td> U+000D3 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Ocirc;</code> </td> <td> U+000D4 </td> <tr><td> <code title="">Ocirc</code> </td> <td> U+000D4 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Ocy;</code> </td> <td> U+0041E </td> <tr><td> <code title="">Odblac;</code> </td> <td> U+00150 </td> <tr><td> <code title="">Ofr;</code> </td> <td> U+1D512 </td> <tr><td> <code title="">Ograve;</code> </td> <td> U+000D2 </td> <tr><td> <code title="">Ograve</code> </td> <td> U+000D2 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Omacr;</code> </td> <td> U+0014C </td> <tr><td> <code title="">Omega;</code> </td> <td> U+003A9 </td> <tr><td> <code title="">Omicron;</code> </td> <td> U+0039F </td> <tr><td> <code title="">Oopf;</code> </td> <td> U+1D546 </td> <tr><td> <code title="">OpenCurlyDoubleQuote;</code> </td> <td> U+0201C </td> <tr><td> <code title="">OpenCurlyQuote;</code> </td> <td> U+02018 </td> <tr><td> <code title="">Or;</code> </td> <td> U+02A54 </td> <tr><td> <code title="">Oscr;</code> </td> <td> U+1D4AA </td> <tr><td> <code title="">Oslash;</code> </td> <td> U+000D8 </td> <tr><td> <code title="">Oslash</code> </td> <td> U+000D8 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Otilde;</code> </td> <td> U+000D5 </td> <tr><td> <code title="">Otilde</code> </td> <td> U+000D5 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Otimes;</code> </td> <td> U+02A37 </td> <tr><td> <code title="">Ouml;</code> </td> <td> U+000D6 </td> <tr><td> <code title="">Ouml</code> </td> <td> U+000D6 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">OverBar;</code> </td> <td> U+0203E </td> <tr><td> <code title="">OverBrace;</code> </td> <td> U+023DE </td> <tr><td> <code title="">OverBracket;</code> </td> <td> U+023B4 </td> <tr><td> <code title="">OverParenthesis;</code> </td> <td> U+023DC </td> <tr><td> <code title="">PartialD;</code> </td> <td> U+02202 </td> <tr><td> <code title="">Pcy;</code> </td> <td> U+0041F </td> <tr><td> <code title="">Pfr;</code> </td> <td> U+1D513 </td> <tr><td> <code title="">Phi;</code> </td> <td> U+003A6 </td> <tr><td> <code title="">Pi;</code> </td> <td> U+003A0 </td> <tr><td> <code title="">PlusMinus;</code> </td> <td> U+000B1 </td> <tr><td> <code title="">Poincareplane;</code> </td> <td> U+0210C </td> <tr><td> <code title="">Popf;</code> </td> <td> U+02119 </td> <tr><td> <code title="">Pr;</code> </td> <td> U+02ABB </td> <tr><td> <code title="">Precedes;</code> </td> <td> U+0227A </td> <tr><td> <code title="">PrecedesEqual;</code> </td> <td> U+02AAF </td> <tr><td> <code title="">PrecedesSlantEqual;</code> </td> <td> U+0227C </td> <tr><td> <code title="">PrecedesTilde;</code> </td> <td> U+0227E </td> <tr><td> <code title="">Prime;</code> </td> <td> U+02033 </td> <tr><td> <code title="">Product;</code> </td> <td> U+0220F </td> <tr><td> <code title="">Proportion;</code> </td> <td> U+02237 </td> <tr><td> <code title="">Proportional;</code> </td> <td> U+0221D </td> <tr><td> <code title="">Pscr;</code> </td> <td> U+1D4AB </td> <tr><td> <code title="">Psi;</code> </td> <td> U+003A8 </td> <tr><td> <code title="">QUOT;</code> </td> <td> U+00022 </td> <tr><td> <code title="">QUOT</code> </td> <td> U+00022 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Qfr;</code> </td> <td> U+1D514 </td> <tr><td> <code title="">Qopf;</code> </td> <td> U+0211A </td> <tr><td> <code title="">Qscr;</code> </td> <td> U+1D4AC </td> <tr><td> <code title="">RBarr;</code> </td> <td> U+02910 </td> <tr><td> <code title="">REG;</code> </td> <td> U+000AE </td> <tr><td> <code title="">REG</code> </td> <td> U+000AE </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Racute;</code> </td> <td> U+00154 </td> <tr><td> <code title="">Rang;</code> </td> <td> U+027EB </td> <tr><td> <code title="">Rarr;</code> </td> <td> U+021A0 </td> <tr><td> <code title="">Rarrtl;</code> </td> <td> U+02916 </td> <tr><td> <code title="">Rcaron;</code> </td> <td> U+00158 </td> <tr><td> <code title="">Rcedil;</code> </td> <td> U+00156 </td> <tr><td> <code title="">Rcy;</code> </td> <td> U+00420 </td> <tr><td> <code title="">Re;</code> </td> <td> U+0211C </td> <tr><td> <code title="">ReverseElement;</code> </td> <td> U+0220B </td> <tr><td> <code title="">ReverseEquilibrium;</code> </td> <td> U+021CB </td> <tr><td> <code title="">ReverseUpEquilibrium;</code> </td> <td> U+0296F </td> <tr><td> <code title="">Rfr;</code> </td> <td> U+0211C </td> <tr><td> <code title="">Rho;</code> </td> <td> U+003A1 </td> <tr><td> <code title="">RightAngleBracket;</code> </td> <td> U+027E9 </td> <tr><td> <code title="">RightArrow;</code> </td> <td> U+02192 </td> <tr><td> <code title="">RightArrowBar;</code> </td> <td> U+021E5 </td> <tr><td> <code title="">RightArrowLeftArrow;</code> </td> <td> U+021C4 </td> <tr><td> <code title="">RightCeiling;</code> </td> <td> U+02309 </td> <tr><td> <code title="">RightDoubleBracket;</code> </td> <td> U+027E7 </td> <tr><td> <code title="">RightDownTeeVector;</code> </td> <td> U+0295D </td> <tr><td> <code title="">RightDownVector;</code> </td> <td> U+021C2 </td> <tr><td> <code title="">RightDownVectorBar;</code> </td> <td> U+02955 </td> <tr><td> <code title="">RightFloor;</code> </td> <td> U+0230B </td> <tr><td> <code title="">RightTee;</code> </td> <td> U+022A2 </td> <tr><td> <code title="">RightTeeArrow;</code> </td> <td> U+021A6 </td> <tr><td> <code title="">RightTeeVector;</code> </td> <td> U+0295B </td> <tr><td> <code title="">RightTriangle;</code> </td> <td> U+022B3 </td> <tr><td> <code title="">RightTriangleBar;</code> </td> <td> U+029D0 </td> <tr><td> <code title="">RightTriangleEqual;</code> </td> <td> U+022B5 </td> <tr><td> <code title="">RightUpDownVector;</code> </td> <td> U+0294F </td> <tr><td> <code title="">RightUpTeeVector;</code> </td> <td> U+0295C </td> <tr><td> <code title="">RightUpVector;</code> </td> <td> U+021BE </td> <tr><td> <code title="">RightUpVectorBar;</code> </td> <td> U+02954 </td> <tr><td> <code title="">RightVector;</code> </td> <td> U+021C0 </td> <tr><td> <code title="">RightVectorBar;</code> </td> <td> U+02953 </td> <tr><td> <code title="">Rightarrow;</code> </td> <td> U+021D2 </td> <tr><td> <code title="">Ropf;</code> </td> <td> U+0211D </td> <tr><td> <code title="">RoundImplies;</code> </td> <td> U+02970 </td> <tr><td> <code title="">Rrightarrow;</code> </td> <td> U+021DB </td> <tr><td> <code title="">Rscr;</code> </td> <td> U+0211B </td> <tr><td> <code title="">Rsh;</code> </td> <td> U+021B1 </td> <tr><td> <code title="">RuleDelayed;</code> </td> <td> U+029F4 </td> <tr><td> <code title="">SHCHcy;</code> </td> <td> U+00429 </td> <tr><td> <code title="">SHcy;</code> </td> <td> U+00428 </td> <tr><td> <code title="">SOFTcy;</code> </td> <td> U+0042C </td> <tr><td> <code title="">Sacute;</code> </td> <td> U+0015A </td> <tr><td> <code title="">Sc;</code> </td> <td> U+02ABC </td> <tr><td> <code title="">Scaron;</code> </td> <td> U+00160 </td> <tr><td> <code title="">Scedil;</code> </td> <td> U+0015E </td> <tr><td> <code title="">Scirc;</code> </td> <td> U+0015C </td> <tr><td> <code title="">Scy;</code> </td> <td> U+00421 </td> <tr><td> <code title="">Sfr;</code> </td> <td> U+1D516 </td> <tr><td> <code title="">ShortDownArrow;</code> </td> <td> U+02193 </td> <tr><td> <code title="">ShortLeftArrow;</code> </td> <td> U+02190 </td> <tr><td> <code title="">ShortRightArrow;</code> </td> <td> U+02192 </td> <tr><td> <code title="">ShortUpArrow;</code> </td> <td> U+02191 </td> <tr><td> <code title="">Sigma;</code> </td> <td> U+003A3 </td> <tr><td> <code title="">SmallCircle;</code> </td> <td> U+02218 </td> <tr><td> <code title="">Sopf;</code> </td> <td> U+1D54A </td> <tr><td> <code title="">Sqrt;</code> </td> <td> U+0221A </td> <tr><td> <code title="">Square;</code> </td> <td> U+025A1 </td> <tr><td> <code title="">SquareIntersection;</code> </td> <td> U+02293 </td> <tr><td> <code title="">SquareSubset;</code> </td> <td> U+0228F </td> <tr><td> <code title="">SquareSubsetEqual;</code> </td> <td> U+02291 </td> <tr><td> <code title="">SquareSuperset;</code> </td> <td> U+02290 </td> <tr><td> <code title="">SquareSupersetEqual;</code> </td> <td> U+02292 </td> <tr><td> <code title="">SquareUnion;</code> </td> <td> U+02294 </td> <tr><td> <code title="">Sscr;</code> </td> <td> U+1D4AE </td> <tr><td> <code title="">Star;</code> </td> <td> U+022C6 </td> <tr><td> <code title="">Sub;</code> </td> <td> U+022D0 </td> <tr><td> <code title="">Subset;</code> </td> <td> U+022D0 </td> <tr><td> <code title="">SubsetEqual;</code> </td> <td> U+02286 </td> <tr><td> <code title="">Succeeds;</code> </td> <td> U+0227B </td> <tr><td> <code title="">SucceedsEqual;</code> </td> <td> U+02AB0 </td> <tr><td> <code title="">SucceedsSlantEqual;</code> </td> <td> U+0227D </td> <tr><td> <code title="">SucceedsTilde;</code> </td> <td> U+0227F </td> <tr><td> <code title="">SuchThat;</code> </td> <td> U+0220B </td> <tr><td> <code title="">Sum;</code> </td> <td> U+02211 </td> <tr><td> <code title="">Sup;</code> </td> <td> U+022D1 </td> <tr><td> <code title="">Superset;</code> </td> <td> U+02283 </td> <tr><td> <code title="">SupersetEqual;</code> </td> <td> U+02287 </td> <tr><td> <code title="">Supset;</code> </td> <td> U+022D1 </td> <tr><td> <code title="">THORN;</code> </td> <td> U+000DE </td> <tr><td> <code title="">THORN</code> </td> <td> U+000DE </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">TRADE;</code> </td> <td> U+02122 </td> <tr><td> <code title="">TSHcy;</code> </td> <td> U+0040B </td> <tr><td> <code title="">TScy;</code> </td> <td> U+00426 </td> <tr><td> <code title="">Tab;</code> </td> <td> U+00009 </td> <tr><td> <code title="">Tau;</code> </td> <td> U+003A4 </td> <tr><td> <code title="">Tcaron;</code> </td> <td> U+00164 </td> <tr><td> <code title="">Tcedil;</code> </td> <td> U+00162 </td> <tr><td> <code title="">Tcy;</code> </td> <td> U+00422 </td> <tr><td> <code title="">Tfr;</code> </td> <td> U+1D517 </td> <tr><td> <code title="">Therefore;</code> </td> <td> U+02234 </td> <tr><td> <code title="">Theta;</code> </td> <td> U+00398 </td> <tr><td> <code title="">ThinSpace;</code> </td> <td> U+02009 </td> <tr><td> <code title="">Tilde;</code> </td> <td> U+0223C </td> <tr><td> <code title="">TildeEqual;</code> </td> <td> U+02243 </td> <tr><td> <code title="">TildeFullEqual;</code> </td> <td> U+02245 </td> <tr><td> <code title="">TildeTilde;</code> </td> <td> U+02248 </td> <tr><td> <code title="">Topf;</code> </td> <td> U+1D54B </td> <tr><td> <code title="">TripleDot;</code> </td> <td> U+020DB </td> <tr><td> <code title="">Tscr;</code> </td> <td> U+1D4AF </td> <tr><td> <code title="">Tstrok;</code> </td> <td> U+00166 </td> <tr><td> <code title="">Uacute;</code> </td> <td> U+000DA </td> <tr><td> <code title="">Uacute</code> </td> <td> U+000DA </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Uarr;</code> </td> <td> U+0219F </td> <tr><td> <code title="">Uarrocir;</code> </td> <td> U+02949 </td> <tr><td> <code title="">Ubrcy;</code> </td> <td> U+0040E </td> <tr><td> <code title="">Ubreve;</code> </td> <td> U+0016C </td> <tr><td> <code title="">Ucirc;</code> </td> <td> U+000DB </td> <tr><td> <code title="">Ucirc</code> </td> <td> U+000DB </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Ucy;</code> </td> <td> U+00423 </td> <tr><td> <code title="">Udblac;</code> </td> <td> U+00170 </td> <tr><td> <code title="">Ufr;</code> </td> <td> U+1D518 </td> <tr><td> <code title="">Ugrave;</code> </td> <td> U+000D9 </td> <tr><td> <code title="">Ugrave</code> </td> <td> U+000D9 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Umacr;</code> </td> <td> U+0016A </td> <tr><td> <code title="">UnderBar;</code> </td> <td> U+0005F </td> <tr><td> <code title="">UnderBrace;</code> </td> <td> U+023DF </td> <tr><td> <code title="">UnderBracket;</code> </td> <td> U+023B5 </td> <tr><td> <code title="">UnderParenthesis;</code> </td> <td> U+023DD </td> <tr><td> <code title="">Union;</code> </td> <td> U+022C3 </td> <tr><td> <code title="">UnionPlus;</code> </td> <td> U+0228E </td> <tr><td> <code title="">Uogon;</code> </td> <td> U+00172 </td> <tr><td> <code title="">Uopf;</code> </td> <td> U+1D54C </td> <tr><td> <code title="">UpArrow;</code> </td> <td> U+02191 </td> <tr><td> <code title="">UpArrowBar;</code> </td> <td> U+02912 </td> <tr><td> <code title="">UpArrowDownArrow;</code> </td> <td> U+021C5 </td> <tr><td> <code title="">UpDownArrow;</code> </td> <td> U+02195 </td> <tr><td> <code title="">UpEquilibrium;</code> </td> <td> U+0296E </td> <tr><td> <code title="">UpTee;</code> </td> <td> U+022A5 </td> <tr><td> <code title="">UpTeeArrow;</code> </td> <td> U+021A5 </td> <tr><td> <code title="">Uparrow;</code> </td> <td> U+021D1 </td> <tr><td> <code title="">Updownarrow;</code> </td> <td> U+021D5 </td> <tr><td> <code title="">UpperLeftArrow;</code> </td> <td> U+02196 </td> <tr><td> <code title="">UpperRightArrow;</code> </td> <td> U+02197 </td> <tr><td> <code title="">Upsi;</code> </td> <td> U+003D2 </td> <tr><td> <code title="">Upsilon;</code> </td> <td> U+003A5 </td> <tr><td> <code title="">Uring;</code> </td> <td> U+0016E </td> <tr><td> <code title="">Uscr;</code> </td> <td> U+1D4B0 </td> <tr><td> <code title="">Utilde;</code> </td> <td> U+00168 </td> <tr><td> <code title="">Uuml;</code> </td> <td> U+000DC </td> <tr><td> <code title="">Uuml</code> </td> <td> U+000DC </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">VDash;</code> </td> <td> U+022AB </td> <tr><td> <code title="">Vbar;</code> </td> <td> U+02AEB </td> <tr><td> <code title="">Vcy;</code> </td> <td> U+00412 </td> <tr><td> <code title="">Vdash;</code> </td> <td> U+022A9 </td> <tr><td> <code title="">Vdashl;</code> </td> <td> U+02AE6 </td> <tr><td> <code title="">Vee;</code> </td> <td> U+022C1 </td> <tr><td> <code title="">Verbar;</code> </td> <td> U+02016 </td> <tr><td> <code title="">Vert;</code> </td> <td> U+02016 </td> <tr><td> <code title="">VerticalBar;</code> </td> <td> U+02223 </td> <tr><td> <code title="">VerticalLine;</code> </td> <td> U+0007C </td> <tr><td> <code title="">VerticalSeparator;</code> </td> <td> U+02758 </td> <tr><td> <code title="">VerticalTilde;</code> </td> <td> U+02240 </td> <tr><td> <code title="">VeryThinSpace;</code> </td> <td> U+0200A </td> <tr><td> <code title="">Vfr;</code> </td> <td> U+1D519 </td> <tr><td> <code title="">Vopf;</code> </td> <td> U+1D54D </td> <tr><td> <code title="">Vscr;</code> </td> <td> U+1D4B1 </td> <tr><td> <code title="">Vvdash;</code> </td> <td> U+022AA </td> <tr><td> <code title="">Wcirc;</code> </td> <td> U+00174 </td> <tr><td> <code title="">Wedge;</code> </td> <td> U+022C0 </td> <tr><td> <code title="">Wfr;</code> </td> <td> U+1D51A </td> <tr><td> <code title="">Wopf;</code> </td> <td> U+1D54E </td> <tr><td> <code title="">Wscr;</code> </td> <td> U+1D4B2 </td> <tr><td> <code title="">Xfr;</code> </td> <td> U+1D51B </td> <tr><td> <code title="">Xi;</code> </td> <td> U+0039E </td> <tr><td> <code title="">Xopf;</code> </td> <td> U+1D54F </td> <tr><td> <code title="">Xscr;</code> </td> <td> U+1D4B3 </td> <tr><td> <code title="">YAcy;</code> </td> <td> U+0042F </td> <tr><td> <code title="">YIcy;</code> </td> <td> U+00407 </td> <tr><td> <code title="">YUcy;</code> </td> <td> U+0042E </td> <tr><td> <code title="">Yacute;</code> </td> <td> U+000DD </td> <tr><td> <code title="">Yacute</code> </td> <td> U+000DD </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">Ycirc;</code> </td> <td> U+00176 </td> <tr><td> <code title="">Ycy;</code> </td> <td> U+0042B </td> <tr><td> <code title="">Yfr;</code> </td> <td> U+1D51C </td> <tr><td> <code title="">Yopf;</code> </td> <td> U+1D550 </td> <tr><td> <code title="">Yscr;</code> </td> <td> U+1D4B4 </td> <tr><td> <code title="">Yuml;</code> </td> <td> U+00178 </td> <tr><td> <code title="">ZHcy;</code> </td> <td> U+00416 </td> <tr><td> <code title="">Zacute;</code> </td> <td> U+00179 </td> <tr><td> <code title="">Zcaron;</code> </td> <td> U+0017D </td> <tr><td> <code title="">Zcy;</code> </td> <td> U+00417 </td> <tr><td> <code title="">Zdot;</code> </td> <td> U+0017B </td> <tr><td> <code title="">ZeroWidthSpace;</code> </td> <td> U+0200B </td> <tr><td> <code title="">Zeta;</code> </td> <td> U+00396 </td> <tr><td> <code title="">Zfr;</code> </td> <td> U+02128 </td> <tr><td> <code title="">Zopf;</code> </td> <td> U+02124 </td> <tr><td> <code title="">Zscr;</code> </td> <td> U+1D4B5 </td> <tr><td> <code title="">aacute;</code> </td> <td> U+000E1 </td> <tr><td> <code title="">aacute</code> </td> <td> U+000E1 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">abreve;</code> </td> <td> U+00103 </td> <tr><td> <code title="">ac;</code> </td> <td> U+0223E </td> <tr><td> <code title="">acd;</code> </td> <td> U+0223F </td> <tr><td> <code title="">acirc;</code> </td> <td> U+000E2 </td> <tr><td> <code title="">acirc</code> </td> <td> U+000E2 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">acute;</code> </td> <td> U+000B4 </td> <tr><td> <code title="">acute</code> </td> <td> U+000B4 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">acy;</code> </td> <td> U+00430 </td> <tr><td> <code title="">aelig;</code> </td> <td> U+000E6 </td> <tr><td> <code title="">aelig</code> </td> <td> U+000E6 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">af;</code> </td> <td> U+02061 </td> <tr><td> <code title="">afr;</code> </td> <td> U+1D51E </td> <tr><td> <code title="">agrave;</code> </td> <td> U+000E0 </td> <tr><td> <code title="">agrave</code> </td> <td> U+000E0 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">alefsym;</code> </td> <td> U+02135 </td> <tr><td> <code title="">aleph;</code> </td> <td> U+02135 </td> <tr><td> <code title="">alpha;</code> </td> <td> U+003B1 </td> <tr><td> <code title="">amacr;</code> </td> <td> U+00101 </td> <tr><td> <code title="">amalg;</code> </td> <td> U+02A3F </td> <tr><td> <code title="">amp;</code> </td> <td> U+00026 </td> <tr><td> <code title="">amp</code> </td> <td> U+00026 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">and;</code> </td> <td> U+02227 </td> <tr><td> <code title="">andand;</code> </td> <td> U+02A55 </td> <tr><td> <code title="">andd;</code> </td> <td> U+02A5C </td> <tr><td> <code title="">andslope;</code> </td> <td> U+02A58 </td> <tr><td> <code title="">andv;</code> </td> <td> U+02A5A </td> <tr><td> <code title="">ang;</code> </td> <td> U+02220 </td> <tr><td> <code title="">ange;</code> </td> <td> U+029A4 </td> <tr><td> <code title="">angle;</code> </td> <td> U+02220 </td> <tr><td> <code title="">angmsd;</code> </td> <td> U+02221 </td> <tr><td> <code title="">angmsdaa;</code> </td> <td> U+029A8 </td> <tr><td> <code title="">angmsdab;</code> </td> <td> U+029A9 </td> <tr><td> <code title="">angmsdac;</code> </td> <td> U+029AA </td> <tr><td> <code title="">angmsdad;</code> </td> <td> U+029AB </td> <tr><td> <code title="">angmsdae;</code> </td> <td> U+029AC </td> <tr><td> <code title="">angmsdaf;</code> </td> <td> U+029AD </td> <tr><td> <code title="">angmsdag;</code> </td> <td> U+029AE </td> <tr><td> <code title="">angmsdah;</code> </td> <td> U+029AF </td> <tr><td> <code title="">angrt;</code> </td> <td> U+0221F </td> <tr><td> <code title="">angrtvb;</code> </td> <td> U+022BE </td> <tr><td> <code title="">angrtvbd;</code> </td> <td> U+0299D </td> <tr><td> <code title="">angsph;</code> </td> <td> U+02222 </td> <tr><td> <code title="">angst;</code> </td> <td> U+000C5 </td> <tr><td> <code title="">angzarr;</code> </td> <td> U+0237C </td> <tr><td> <code title="">aogon;</code> </td> <td> U+00105 </td> <tr><td> <code title="">aopf;</code> </td> <td> U+1D552 </td> <tr><td> <code title="">ap;</code> </td> <td> U+02248 </td> <tr><td> <code title="">apE;</code> </td> <td> U+02A70 </td> <tr><td> <code title="">apacir;</code> </td> <td> U+02A6F </td> <tr><td> <code title="">ape;</code> </td> <td> U+0224A </td> <tr><td> <code title="">apid;</code> </td> <td> U+0224B </td> <tr><td> <code title="">apos;</code> </td> <td> U+00027 </td> <tr><td> <code title="">approx;</code> </td> <td> U+02248 </td> <tr><td> <code title="">approxeq;</code> </td> <td> U+0224A </td> <tr><td> <code title="">aring;</code> </td> <td> U+000E5 </td> <tr><td> <code title="">aring</code> </td> <td> U+000E5 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">ascr;</code> </td> <td> U+1D4B6 </td> <tr><td> <code title="">ast;</code> </td> <td> U+0002A </td> <tr><td> <code title="">asymp;</code> </td> <td> U+02248 </td> <tr><td> <code title="">asympeq;</code> </td> <td> U+0224D </td> <tr><td> <code title="">atilde;</code> </td> <td> U+000E3 </td> <tr><td> <code title="">atilde</code> </td> <td> U+000E3 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">auml;</code> </td> <td> U+000E4 </td> <tr><td> <code title="">auml</code> </td> <td> U+000E4 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">awconint;</code> </td> <td> U+02233 </td> <tr><td> <code title="">awint;</code> </td> <td> U+02A11 </td> <tr><td> <code title="">bNot;</code> </td> <td> U+02AED </td> <tr><td> <code title="">backcong;</code> </td> <td> U+0224C </td> <tr><td> <code title="">backepsilon;</code> </td> <td> U+003F6 </td> <tr><td> <code title="">backprime;</code> </td> <td> U+02035 </td> <tr><td> <code title="">backsim;</code> </td> <td> U+0223D </td> <tr><td> <code title="">backsimeq;</code> </td> <td> U+022CD </td> <tr><td> <code title="">barvee;</code> </td> <td> U+022BD </td> <tr><td> <code title="">barwed;</code> </td> <td> U+02305 </td> <tr><td> <code title="">barwedge;</code> </td> <td> U+02305 </td> <tr><td> <code title="">bbrk;</code> </td> <td> U+023B5 </td> <tr><td> <code title="">bbrktbrk;</code> </td> <td> U+023B6 </td> <tr><td> <code title="">bcong;</code> </td> <td> U+0224C </td> <tr><td> <code title="">bcy;</code> </td> <td> U+00431 </td> <tr><td> <code title="">bdquo;</code> </td> <td> U+0201E </td> <tr><td> <code title="">becaus;</code> </td> <td> U+02235 </td> <tr><td> <code title="">because;</code> </td> <td> U+02235 </td> <tr><td> <code title="">bemptyv;</code> </td> <td> U+029B0 </td> <tr><td> <code title="">bepsi;</code> </td> <td> U+003F6 </td> <tr><td> <code title="">bernou;</code> </td> <td> U+0212C </td> <tr><td> <code title="">beta;</code> </td> <td> U+003B2 </td> <tr><td> <code title="">beth;</code> </td> <td> U+02136 </td> <tr><td> <code title="">between;</code> </td> <td> U+0226C </td> <tr><td> <code title="">bfr;</code> </td> <td> U+1D51F </td> <tr><td> <code title="">bigcap;</code> </td> <td> U+022C2 </td> <tr><td> <code title="">bigcirc;</code> </td> <td> U+025EF </td> <tr><td> <code title="">bigcup;</code> </td> <td> U+022C3 </td> <tr><td> <code title="">bigodot;</code> </td> <td> U+02A00 </td> <tr><td> <code title="">bigoplus;</code> </td> <td> U+02A01 </td> <tr><td> <code title="">bigotimes;</code> </td> <td> U+02A02 </td> <tr><td> <code title="">bigsqcup;</code> </td> <td> U+02A06 </td> <tr><td> <code title="">bigstar;</code> </td> <td> U+02605 </td> <tr><td> <code title="">bigtriangledown;</code> </td> <td> U+025BD </td> <tr><td> <code title="">bigtriangleup;</code> </td> <td> U+025B3 </td> <tr><td> <code title="">biguplus;</code> </td> <td> U+02A04 </td> <tr><td> <code title="">bigvee;</code> </td> <td> U+022C1 </td> <tr><td> <code title="">bigwedge;</code> </td> <td> U+022C0 </td> <tr><td> <code title="">bkarow;</code> </td> <td> U+0290D </td> <tr><td> <code title="">blacklozenge;</code> </td> <td> U+029EB </td> <tr><td> <code title="">blacksquare;</code> </td> <td> U+025AA </td> <tr><td> <code title="">blacktriangle;</code> </td> <td> U+025B4 </td> <tr><td> <code title="">blacktriangledown;</code> </td> <td> U+025BE </td> <tr><td> <code title="">blacktriangleleft;</code> </td> <td> U+025C2 </td> <tr><td> <code title="">blacktriangleright;</code> </td> <td> U+025B8 </td> <tr><td> <code title="">blank;</code> </td> <td> U+02423 </td> <tr><td> <code title="">blk12;</code> </td> <td> U+02592 </td> <tr><td> <code title="">blk14;</code> </td> <td> U+02591 </td> <tr><td> <code title="">blk34;</code> </td> <td> U+02593 </td> <tr><td> <code title="">block;</code> </td> <td> U+02588 </td> <tr><td> <code title="">bnot;</code> </td> <td> U+02310 </td> <tr><td> <code title="">bopf;</code> </td> <td> U+1D553 </td> <tr><td> <code title="">bot;</code> </td> <td> U+022A5 </td> <tr><td> <code title="">bottom;</code> </td> <td> U+022A5 </td> <tr><td> <code title="">bowtie;</code> </td> <td> U+022C8 </td> <tr><td> <code title="">boxDL;</code> </td> <td> U+02557 </td> <tr><td> <code title="">boxDR;</code> </td> <td> U+02554 </td> <tr><td> <code title="">boxDl;</code> </td> <td> U+02556 </td> <tr><td> <code title="">boxDr;</code> </td> <td> U+02553 </td> <tr><td> <code title="">boxH;</code> </td> <td> U+02550 </td> <tr><td> <code title="">boxHD;</code> </td> <td> U+02566 </td> <tr><td> <code title="">boxHU;</code> </td> <td> U+02569 </td> <tr><td> <code title="">boxHd;</code> </td> <td> U+02564 </td> <tr><td> <code title="">boxHu;</code> </td> <td> U+02567 </td> <tr><td> <code title="">boxUL;</code> </td> <td> U+0255D </td> <tr><td> <code title="">boxUR;</code> </td> <td> U+0255A </td> <tr><td> <code title="">boxUl;</code> </td> <td> U+0255C </td> <tr><td> <code title="">boxUr;</code> </td> <td> U+02559 </td> <tr><td> <code title="">boxV;</code> </td> <td> U+02551 </td> <tr><td> <code title="">boxVH;</code> </td> <td> U+0256C </td> <tr><td> <code title="">boxVL;</code> </td> <td> U+02563 </td> <tr><td> <code title="">boxVR;</code> </td> <td> U+02560 </td> <tr><td> <code title="">boxVh;</code> </td> <td> U+0256B </td> <tr><td> <code title="">boxVl;</code> </td> <td> U+02562 </td> <tr><td> <code title="">boxVr;</code> </td> <td> U+0255F </td> <tr><td> <code title="">boxbox;</code> </td> <td> U+029C9 </td> <tr><td> <code title="">boxdL;</code> </td> <td> U+02555 </td> <tr><td> <code title="">boxdR;</code> </td> <td> U+02552 </td> <tr><td> <code title="">boxdl;</code> </td> <td> U+02510 </td> <tr><td> <code title="">boxdr;</code> </td> <td> U+0250C </td> <tr><td> <code title="">boxh;</code> </td> <td> U+02500 </td> <tr><td> <code title="">boxhD;</code> </td> <td> U+02565 </td> <tr><td> <code title="">boxhU;</code> </td> <td> U+02568 </td> <tr><td> <code title="">boxhd;</code> </td> <td> U+0252C </td> <tr><td> <code title="">boxhu;</code> </td> <td> U+02534 </td> <tr><td> <code title="">boxminus;</code> </td> <td> U+0229F </td> <tr><td> <code title="">boxplus;</code> </td> <td> U+0229E </td> <tr><td> <code title="">boxtimes;</code> </td> <td> U+022A0 </td> <tr><td> <code title="">boxuL;</code> </td> <td> U+0255B </td> <tr><td> <code title="">boxuR;</code> </td> <td> U+02558 </td> <tr><td> <code title="">boxul;</code> </td> <td> U+02518 </td> <tr><td> <code title="">boxur;</code> </td> <td> U+02514 </td> <tr><td> <code title="">boxv;</code> </td> <td> U+02502 </td> <tr><td> <code title="">boxvH;</code> </td> <td> U+0256A </td> <tr><td> <code title="">boxvL;</code> </td> <td> U+02561 </td> <tr><td> <code title="">boxvR;</code> </td> <td> U+0255E </td> <tr><td> <code title="">boxvh;</code> </td> <td> U+0253C </td> <tr><td> <code title="">boxvl;</code> </td> <td> U+02524 </td> <tr><td> <code title="">boxvr;</code> </td> <td> U+0251C </td> <tr><td> <code title="">bprime;</code> </td> <td> U+02035 </td> <tr><td> <code title="">breve;</code> </td> <td> U+002D8 </td> <tr><td> <code title="">brvbar;</code> </td> <td> U+000A6 </td> <tr><td> <code title="">brvbar</code> </td> <td> U+000A6 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">bscr;</code> </td> <td> U+1D4B7 </td> <tr><td> <code title="">bsemi;</code> </td> <td> U+0204F </td> <tr><td> <code title="">bsim;</code> </td> <td> U+0223D </td> <tr><td> <code title="">bsime;</code> </td> <td> U+022CD </td> <tr><td> <code title="">bsol;</code> </td> <td> U+0005C </td> <tr><td> <code title="">bsolb;</code> </td> <td> U+029C5 </td> <tr><td> <code title="">bsolhsub;</code> </td> <td> U+027C8 </td> <tr><td> <code title="">bull;</code> </td> <td> U+02022 </td> <tr><td> <code title="">bullet;</code> </td> <td> U+02022 </td> <tr><td> <code title="">bump;</code> </td> <td> U+0224E </td> <tr><td> <code title="">bumpE;</code> </td> <td> U+02AAE </td> <tr><td> <code title="">bumpe;</code> </td> <td> U+0224F </td> <tr><td> <code title="">bumpeq;</code> </td> <td> U+0224F </td> <tr><td> <code title="">cacute;</code> </td> <td> U+00107 </td> <tr><td> <code title="">cap;</code> </td> <td> U+02229 </td> <tr><td> <code title="">capand;</code> </td> <td> U+02A44 </td> <tr><td> <code title="">capbrcup;</code> </td> <td> U+02A49 </td> <tr><td> <code title="">capcap;</code> </td> <td> U+02A4B </td> <tr><td> <code title="">capcup;</code> </td> <td> U+02A47 </td> <tr><td> <code title="">capdot;</code> </td> <td> U+02A40 </td> <tr><td> <code title="">caret;</code> </td> <td> U+02041 </td> <tr><td> <code title="">caron;</code> </td> <td> U+002C7 </td> <tr><td> <code title="">ccaps;</code> </td> <td> U+02A4D </td> <tr><td> <code title="">ccaron;</code> </td> <td> U+0010D </td> <tr><td> <code title="">ccedil;</code> </td> <td> U+000E7 </td> <tr><td> <code title="">ccedil</code> </td> <td> U+000E7 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">ccirc;</code> </td> <td> U+00109 </td> <tr><td> <code title="">ccups;</code> </td> <td> U+02A4C </td> <tr><td> <code title="">ccupssm;</code> </td> <td> U+02A50 </td> <tr><td> <code title="">cdot;</code> </td> <td> U+0010B </td> <tr><td> <code title="">cedil;</code> </td> <td> U+000B8 </td> <tr><td> <code title="">cedil</code> </td> <td> U+000B8 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">cemptyv;</code> </td> <td> U+029B2 </td> <tr><td> <code title="">cent;</code> </td> <td> U+000A2 </td> <tr><td> <code title="">cent</code> </td> <td> U+000A2 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">centerdot;</code> </td> <td> U+000B7 </td> <tr><td> <code title="">cfr;</code> </td> <td> U+1D520 </td> <tr><td> <code title="">chcy;</code> </td> <td> U+00447 </td> <tr><td> <code title="">check;</code> </td> <td> U+02713 </td> <tr><td> <code title="">checkmark;</code> </td> <td> U+02713 </td> <tr><td> <code title="">chi;</code> </td> <td> U+003C7 </td> <tr><td> <code title="">cir;</code> </td> <td> U+025CB </td> <tr><td> <code title="">cirE;</code> </td> <td> U+029C3 </td> <tr><td> <code title="">circ;</code> </td> <td> U+002C6 </td> <tr><td> <code title="">circeq;</code> </td> <td> U+02257 </td> <tr><td> <code title="">circlearrowleft;</code> </td> <td> U+021BA </td> <tr><td> <code title="">circlearrowright;</code> </td> <td> U+021BB </td> <tr><td> <code title="">circledR;</code> </td> <td> U+000AE </td> <tr><td> <code title="">circledS;</code> </td> <td> U+024C8 </td> <tr><td> <code title="">circledast;</code> </td> <td> U+0229B </td> <tr><td> <code title="">circledcirc;</code> </td> <td> U+0229A </td> <tr><td> <code title="">circleddash;</code> </td> <td> U+0229D </td> <tr><td> <code title="">cire;</code> </td> <td> U+02257 </td> <tr><td> <code title="">cirfnint;</code> </td> <td> U+02A10 </td> <tr><td> <code title="">cirmid;</code> </td> <td> U+02AEF </td> <tr><td> <code title="">cirscir;</code> </td> <td> U+029C2 </td> <tr><td> <code title="">clubs;</code> </td> <td> U+02663 </td> <tr><td> <code title="">clubsuit;</code> </td> <td> U+02663 </td> <tr><td> <code title="">colon;</code> </td> <td> U+0003A </td> <tr><td> <code title="">colone;</code> </td> <td> U+02254 </td> <tr><td> <code title="">coloneq;</code> </td> <td> U+02254 </td> <tr><td> <code title="">comma;</code> </td> <td> U+0002C </td> <tr><td> <code title="">commat;</code> </td> <td> U+00040 </td> <tr><td> <code title="">comp;</code> </td> <td> U+02201 </td> <tr><td> <code title="">compfn;</code> </td> <td> U+02218 </td> <tr><td> <code title="">complement;</code> </td> <td> U+02201 </td> <tr><td> <code title="">complexes;</code> </td> <td> U+02102 </td> <tr><td> <code title="">cong;</code> </td> <td> U+02245 </td> <tr><td> <code title="">congdot;</code> </td> <td> U+02A6D </td> <tr><td> <code title="">conint;</code> </td> <td> U+0222E </td> <tr><td> <code title="">copf;</code> </td> <td> U+1D554 </td> <tr><td> <code title="">coprod;</code> </td> <td> U+02210 </td> <tr><td> <code title="">copy;</code> </td> <td> U+000A9 </td> <tr><td> <code title="">copy</code> </td> <td> U+000A9 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">copysr;</code> </td> <td> U+02117 </td> <tr><td> <code title="">crarr;</code> </td> <td> U+021B5 </td> <tr><td> <code title="">cross;</code> </td> <td> U+02717 </td> <tr><td> <code title="">cscr;</code> </td> <td> U+1D4B8 </td> <tr><td> <code title="">csub;</code> </td> <td> U+02ACF </td> <tr><td> <code title="">csube;</code> </td> <td> U+02AD1 </td> <tr><td> <code title="">csup;</code> </td> <td> U+02AD0 </td> <tr><td> <code title="">csupe;</code> </td> <td> U+02AD2 </td> <tr><td> <code title="">ctdot;</code> </td> <td> U+022EF </td> <tr><td> <code title="">cudarrl;</code> </td> <td> U+02938 </td> <tr><td> <code title="">cudarrr;</code> </td> <td> U+02935 </td> <tr><td> <code title="">cuepr;</code> </td> <td> U+022DE </td> <tr><td> <code title="">cuesc;</code> </td> <td> U+022DF </td> <tr><td> <code title="">cularr;</code> </td> <td> U+021B6 </td> <tr><td> <code title="">cularrp;</code> </td> <td> U+0293D </td> <tr><td> <code title="">cup;</code> </td> <td> U+0222A </td> <tr><td> <code title="">cupbrcap;</code> </td> <td> U+02A48 </td> <tr><td> <code title="">cupcap;</code> </td> <td> U+02A46 </td> <tr><td> <code title="">cupcup;</code> </td> <td> U+02A4A </td> <tr><td> <code title="">cupdot;</code> </td> <td> U+0228D </td> <tr><td> <code title="">cupor;</code> </td> <td> U+02A45 </td> <tr><td> <code title="">curarr;</code> </td> <td> U+021B7 </td> <tr><td> <code title="">curarrm;</code> </td> <td> U+0293C </td> <tr><td> <code title="">curlyeqprec;</code> </td> <td> U+022DE </td> <tr><td> <code title="">curlyeqsucc;</code> </td> <td> U+022DF </td> <tr><td> <code title="">curlyvee;</code> </td> <td> U+022CE </td> <tr><td> <code title="">curlywedge;</code> </td> <td> U+022CF </td> <tr><td> <code title="">curren;</code> </td> <td> U+000A4 </td> <tr><td> <code title="">curren</code> </td> <td> U+000A4 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">curvearrowleft;</code> </td> <td> U+021B6 </td> <tr><td> <code title="">curvearrowright;</code> </td> <td> U+021B7 </td> <tr><td> <code title="">cuvee;</code> </td> <td> U+022CE </td> <tr><td> <code title="">cuwed;</code> </td> <td> U+022CF </td> <tr><td> <code title="">cwconint;</code> </td> <td> U+02232 </td> <tr><td> <code title="">cwint;</code> </td> <td> U+02231 </td> <tr><td> <code title="">cylcty;</code> </td> <td> U+0232D </td> <tr><td> <code title="">dArr;</code> </td> <td> U+021D3 </td> <tr><td> <code title="">dHar;</code> </td> <td> U+02965 </td> <tr><td> <code title="">dagger;</code> </td> <td> U+02020 </td> <tr><td> <code title="">daleth;</code> </td> <td> U+02138 </td> <tr><td> <code title="">darr;</code> </td> <td> U+02193 </td> <tr><td> <code title="">dash;</code> </td> <td> U+02010 </td> <tr><td> <code title="">dashv;</code> </td> <td> U+022A3 </td> <tr><td> <code title="">dbkarow;</code> </td> <td> U+0290F </td> <tr><td> <code title="">dblac;</code> </td> <td> U+002DD </td> <tr><td> <code title="">dcaron;</code> </td> <td> U+0010F </td> <tr><td> <code title="">dcy;</code> </td> <td> U+00434 </td> <tr><td> <code title="">dd;</code> </td> <td> U+02146 </td> <tr><td> <code title="">ddagger;</code> </td> <td> U+02021 </td> <tr><td> <code title="">ddarr;</code> </td> <td> U+021CA </td> <tr><td> <code title="">ddotseq;</code> </td> <td> U+02A77 </td> <tr><td> <code title="">deg;</code> </td> <td> U+000B0 </td> <tr><td> <code title="">deg</code> </td> <td> U+000B0 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">delta;</code> </td> <td> U+003B4 </td> <tr><td> <code title="">demptyv;</code> </td> <td> U+029B1 </td> <tr><td> <code title="">dfisht;</code> </td> <td> U+0297F </td> <tr><td> <code title="">dfr;</code> </td> <td> U+1D521 </td> <tr><td> <code title="">dharl;</code> </td> <td> U+021C3 </td> <tr><td> <code title="">dharr;</code> </td> <td> U+021C2 </td> <tr><td> <code title="">diam;</code> </td> <td> U+022C4 </td> <tr><td> <code title="">diamond;</code> </td> <td> U+022C4 </td> <tr><td> <code title="">diamondsuit;</code> </td> <td> U+02666 </td> <tr><td> <code title="">diams;</code> </td> <td> U+02666 </td> <tr><td> <code title="">die;</code> </td> <td> U+000A8 </td> <tr><td> <code title="">digamma;</code> </td> <td> U+003DD </td> <tr><td> <code title="">disin;</code> </td> <td> U+022F2 </td> <tr><td> <code title="">div;</code> </td> <td> U+000F7 </td> <tr><td> <code title="">divide;</code> </td> <td> U+000F7 </td> <tr><td> <code title="">divide</code> </td> <td> U+000F7 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">divideontimes;</code> </td> <td> U+022C7 </td> <tr><td> <code title="">divonx;</code> </td> <td> U+022C7 </td> <tr><td> <code title="">djcy;</code> </td> <td> U+00452 </td> <tr><td> <code title="">dlcorn;</code> </td> <td> U+0231E </td> <tr><td> <code title="">dlcrop;</code> </td> <td> U+0230D </td> <tr><td> <code title="">dollar;</code> </td> <td> U+00024 </td> <tr><td> <code title="">dopf;</code> </td> <td> U+1D555 </td> <tr><td> <code title="">dot;</code> </td> <td> U+002D9 </td> <tr><td> <code title="">doteq;</code> </td> <td> U+02250 </td> <tr><td> <code title="">doteqdot;</code> </td> <td> U+02251 </td> <tr><td> <code title="">dotminus;</code> </td> <td> U+02238 </td> <tr><td> <code title="">dotplus;</code> </td> <td> U+02214 </td> <tr><td> <code title="">dotsquare;</code> </td> <td> U+022A1 </td> <tr><td> <code title="">doublebarwedge;</code> </td> <td> U+02306 </td> <tr><td> <code title="">downarrow;</code> </td> <td> U+02193 </td> <tr><td> <code title="">downdownarrows;</code> </td> <td> U+021CA </td> <tr><td> <code title="">downharpoonleft;</code> </td> <td> U+021C3 </td> <tr><td> <code title="">downharpoonright;</code> </td> <td> U+021C2 </td> <tr><td> <code title="">drbkarow;</code> </td> <td> U+02910 </td> <tr><td> <code title="">drcorn;</code> </td> <td> U+0231F </td> <tr><td> <code title="">drcrop;</code> </td> <td> U+0230C </td> <tr><td> <code title="">dscr;</code> </td> <td> U+1D4B9 </td> <tr><td> <code title="">dscy;</code> </td> <td> U+00455 </td> <tr><td> <code title="">dsol;</code> </td> <td> U+029F6 </td> <tr><td> <code title="">dstrok;</code> </td> <td> U+00111 </td> <tr><td> <code title="">dtdot;</code> </td> <td> U+022F1 </td> <tr><td> <code title="">dtri;</code> </td> <td> U+025BF </td> <tr><td> <code title="">dtrif;</code> </td> <td> U+025BE </td> <tr><td> <code title="">duarr;</code> </td> <td> U+021F5 </td> <tr><td> <code title="">duhar;</code> </td> <td> U+0296F </td> <tr><td> <code title="">dwangle;</code> </td> <td> U+029A6 </td> <tr><td> <code title="">dzcy;</code> </td> <td> U+0045F </td> <tr><td> <code title="">dzigrarr;</code> </td> <td> U+027FF </td> <tr><td> <code title="">eDDot;</code> </td> <td> U+02A77 </td> <tr><td> <code title="">eDot;</code> </td> <td> U+02251 </td> <tr><td> <code title="">eacute;</code> </td> <td> U+000E9 </td> <tr><td> <code title="">eacute</code> </td> <td> U+000E9 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">easter;</code> </td> <td> U+02A6E </td> <tr><td> <code title="">ecaron;</code> </td> <td> U+0011B </td> <tr><td> <code title="">ecir;</code> </td> <td> U+02256 </td> <tr><td> <code title="">ecirc;</code> </td> <td> U+000EA </td> <tr><td> <code title="">ecirc</code> </td> <td> U+000EA </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">ecolon;</code> </td> <td> U+02255 </td> <tr><td> <code title="">ecy;</code> </td> <td> U+0044D </td> <tr><td> <code title="">edot;</code> </td> <td> U+00117 </td> <tr><td> <code title="">ee;</code> </td> <td> U+02147 </td> <tr><td> <code title="">efDot;</code> </td> <td> U+02252 </td> <tr><td> <code title="">efr;</code> </td> <td> U+1D522 </td> <tr><td> <code title="">eg;</code> </td> <td> U+02A9A </td> <tr><td> <code title="">egrave;</code> </td> <td> U+000E8 </td> <tr><td> <code title="">egrave</code> </td> <td> U+000E8 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">egs;</code> </td> <td> U+02A96 </td> <tr><td> <code title="">egsdot;</code> </td> <td> U+02A98 </td> <tr><td> <code title="">el;</code> </td> <td> U+02A99 </td> <tr><td> <code title="">elinters;</code> </td> <td> U+023E7 </td> <tr><td> <code title="">ell;</code> </td> <td> U+02113 </td> <tr><td> <code title="">els;</code> </td> <td> U+02A95 </td> <tr><td> <code title="">elsdot;</code> </td> <td> U+02A97 </td> <tr><td> <code title="">emacr;</code> </td> <td> U+00113 </td> <tr><td> <code title="">empty;</code> </td> <td> U+02205 </td> <tr><td> <code title="">emptyset;</code> </td> <td> U+02205 </td> <tr><td> <code title="">emptyv;</code> </td> <td> U+02205 </td> <tr><td> <code title="">emsp13;</code> </td> <td> U+02004 </td> <tr><td> <code title="">emsp14;</code> </td> <td> U+02005 </td> <tr><td> <code title="">emsp;</code> </td> <td> U+02003 </td> <tr><td> <code title="">eng;</code> </td> <td> U+0014B </td> <tr><td> <code title="">ensp;</code> </td> <td> U+02002 </td> <tr><td> <code title="">eogon;</code> </td> <td> U+00119 </td> <tr><td> <code title="">eopf;</code> </td> <td> U+1D556 </td> <tr><td> <code title="">epar;</code> </td> <td> U+022D5 </td> <tr><td> <code title="">eparsl;</code> </td> <td> U+029E3 </td> <tr><td> <code title="">eplus;</code> </td> <td> U+02A71 </td> <tr><td> <code title="">epsi;</code> </td> <td> U+003B5 </td> <tr><td> <code title="">epsilon;</code> </td> <td> U+003B5 </td> <tr><td> <code title="">epsiv;</code> </td> <td> U+003F5 </td> <tr><td> <code title="">eqcirc;</code> </td> <td> U+02256 </td> <tr><td> <code title="">eqcolon;</code> </td> <td> U+02255 </td> <tr><td> <code title="">eqsim;</code> </td> <td> U+02242 </td> <tr><td> <code title="">eqslantgtr;</code> </td> <td> U+02A96 </td> <tr><td> <code title="">eqslantless;</code> </td> <td> U+02A95 </td> <tr><td> <code title="">equals;</code> </td> <td> U+0003D </td> <tr><td> <code title="">equest;</code> </td> <td> U+0225F </td> <tr><td> <code title="">equiv;</code> </td> <td> U+02261 </td> <tr><td> <code title="">equivDD;</code> </td> <td> U+02A78 </td> <tr><td> <code title="">eqvparsl;</code> </td> <td> U+029E5 </td> <tr><td> <code title="">erDot;</code> </td> <td> U+02253 </td> <tr><td> <code title="">erarr;</code> </td> <td> U+02971 </td> <tr><td> <code title="">escr;</code> </td> <td> U+0212F </td> <tr><td> <code title="">esdot;</code> </td> <td> U+02250 </td> <tr><td> <code title="">esim;</code> </td> <td> U+02242 </td> <tr><td> <code title="">eta;</code> </td> <td> U+003B7 </td> <tr><td> <code title="">eth;</code> </td> <td> U+000F0 </td> <tr><td> <code title="">eth</code> </td> <td> U+000F0 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">euml;</code> </td> <td> U+000EB </td> <tr><td> <code title="">euml</code> </td> <td> U+000EB </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">euro;</code> </td> <td> U+020AC </td> <tr><td> <code title="">excl;</code> </td> <td> U+00021 </td> <tr><td> <code title="">exist;</code> </td> <td> U+02203 </td> <tr><td> <code title="">expectation;</code> </td> <td> U+02130 </td> <tr><td> <code title="">exponentiale;</code> </td> <td> U+02147 </td> <tr><td> <code title="">fallingdotseq;</code> </td> <td> U+02252 </td> <tr><td> <code title="">fcy;</code> </td> <td> U+00444 </td> <tr><td> <code title="">female;</code> </td> <td> U+02640 </td> <tr><td> <code title="">ffilig;</code> </td> <td> U+0FB03 </td> <tr><td> <code title="">fflig;</code> </td> <td> U+0FB00 </td> <tr><td> <code title="">ffllig;</code> </td> <td> U+0FB04 </td> <tr><td> <code title="">ffr;</code> </td> <td> U+1D523 </td> <tr><td> <code title="">filig;</code> </td> <td> U+0FB01 </td> <tr><td> <code title="">flat;</code> </td> <td> U+0266D </td> <tr><td> <code title="">fllig;</code> </td> <td> U+0FB02 </td> <tr><td> <code title="">fltns;</code> </td> <td> U+025B1 </td> <tr><td> <code title="">fnof;</code> </td> <td> U+00192 </td> <tr><td> <code title="">fopf;</code> </td> <td> U+1D557 </td> <tr><td> <code title="">forall;</code> </td> <td> U+02200 </td> <tr><td> <code title="">fork;</code> </td> <td> U+022D4 </td> <tr><td> <code title="">forkv;</code> </td> <td> U+02AD9 </td> <tr><td> <code title="">fpartint;</code> </td> <td> U+02A0D </td> <tr><td> <code title="">frac12;</code> </td> <td> U+000BD </td> <tr><td> <code title="">frac12</code> </td> <td> U+000BD </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">frac13;</code> </td> <td> U+02153 </td> <tr><td> <code title="">frac14;</code> </td> <td> U+000BC </td> <tr><td> <code title="">frac14</code> </td> <td> U+000BC </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">frac15;</code> </td> <td> U+02155 </td> <tr><td> <code title="">frac16;</code> </td> <td> U+02159 </td> <tr><td> <code title="">frac18;</code> </td> <td> U+0215B </td> <tr><td> <code title="">frac23;</code> </td> <td> U+02154 </td> <tr><td> <code title="">frac25;</code> </td> <td> U+02156 </td> <tr><td> <code title="">frac34;</code> </td> <td> U+000BE </td> <tr><td> <code title="">frac34</code> </td> <td> U+000BE </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">frac35;</code> </td> <td> U+02157 </td> <tr><td> <code title="">frac38;</code> </td> <td> U+0215C </td> <tr><td> <code title="">frac45;</code> </td> <td> U+02158 </td> <tr><td> <code title="">frac56;</code> </td> <td> U+0215A </td> <tr><td> <code title="">frac58;</code> </td> <td> U+0215D </td> <tr><td> <code title="">frac78;</code> </td> <td> U+0215E </td> <tr><td> <code title="">frasl;</code> </td> <td> U+02044 </td> <tr><td> <code title="">frown;</code> </td> <td> U+02322 </td> <tr><td> <code title="">fscr;</code> </td> <td> U+1D4BB </td> <tr><td> <code title="">gE;</code> </td> <td> U+02267 </td> <tr><td> <code title="">gEl;</code> </td> <td> U+02A8C </td> <tr><td> <code title="">gacute;</code> </td> <td> U+001F5 </td> <tr><td> <code title="">gamma;</code> </td> <td> U+003B3 </td> <tr><td> <code title="">gammad;</code> </td> <td> U+003DD </td> <tr><td> <code title="">gap;</code> </td> <td> U+02A86 </td> <tr><td> <code title="">gbreve;</code> </td> <td> U+0011F </td> <tr><td> <code title="">gcirc;</code> </td> <td> U+0011D </td> <tr><td> <code title="">gcy;</code> </td> <td> U+00433 </td> <tr><td> <code title="">gdot;</code> </td> <td> U+00121 </td> <tr><td> <code title="">ge;</code> </td> <td> U+02265 </td> <tr><td> <code title="">gel;</code> </td> <td> U+022DB </td> <tr><td> <code title="">geq;</code> </td> <td> U+02265 </td> <tr><td> <code title="">geqq;</code> </td> <td> U+02267 </td> <tr><td> <code title="">geqslant;</code> </td> <td> U+02A7E </td> <tr><td> <code title="">ges;</code> </td> <td> U+02A7E </td> <tr><td> <code title="">gescc;</code> </td> <td> U+02AA9 </td> <tr><td> <code title="">gesdot;</code> </td> <td> U+02A80 </td> <tr><td> <code title="">gesdoto;</code> </td> <td> U+02A82 </td> <tr><td> <code title="">gesdotol;</code> </td> <td> U+02A84 </td> <tr><td> <code title="">gesles;</code> </td> <td> U+02A94 </td> <tr><td> <code title="">gfr;</code> </td> <td> U+1D524 </td> <tr><td> <code title="">gg;</code> </td> <td> U+0226B </td> <tr><td> <code title="">ggg;</code> </td> <td> U+022D9 </td> <tr><td> <code title="">gimel;</code> </td> <td> U+02137 </td> <tr><td> <code title="">gjcy;</code> </td> <td> U+00453 </td> <tr><td> <code title="">gl;</code> </td> <td> U+02277 </td> <tr><td> <code title="">glE;</code> </td> <td> U+02A92 </td> <tr><td> <code title="">gla;</code> </td> <td> U+02AA5 </td> <tr><td> <code title="">glj;</code> </td> <td> U+02AA4 </td> <tr><td> <code title="">gnE;</code> </td> <td> U+02269 </td> <tr><td> <code title="">gnap;</code> </td> <td> U+02A8A </td> <tr><td> <code title="">gnapprox;</code> </td> <td> U+02A8A </td> <tr><td> <code title="">gne;</code> </td> <td> U+02A88 </td> <tr><td> <code title="">gneq;</code> </td> <td> U+02A88 </td> <tr><td> <code title="">gneqq;</code> </td> <td> U+02269 </td> <tr><td> <code title="">gnsim;</code> </td> <td> U+022E7 </td> <tr><td> <code title="">gopf;</code> </td> <td> U+1D558 </td> <tr><td> <code title="">grave;</code> </td> <td> U+00060 </td> <tr><td> <code title="">gscr;</code> </td> <td> U+0210A </td> <tr><td> <code title="">gsim;</code> </td> <td> U+02273 </td> <tr><td> <code title="">gsime;</code> </td> <td> U+02A8E </td> <tr><td> <code title="">gsiml;</code> </td> <td> U+02A90 </td> <tr><td> <code title="">gt;</code> </td> <td> U+0003E </td> <tr><td> <code title="">gt</code> </td> <td> U+0003E </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">gtcc;</code> </td> <td> U+02AA7 </td> <tr><td> <code title="">gtcir;</code> </td> <td> U+02A7A </td> <tr><td> <code title="">gtdot;</code> </td> <td> U+022D7 </td> <tr><td> <code title="">gtlPar;</code> </td> <td> U+02995 </td> <tr><td> <code title="">gtquest;</code> </td> <td> U+02A7C </td> <tr><td> <code title="">gtrapprox;</code> </td> <td> U+02A86 </td> <tr><td> <code title="">gtrarr;</code> </td> <td> U+02978 </td> <tr><td> <code title="">gtrdot;</code> </td> <td> U+022D7 </td> <tr><td> <code title="">gtreqless;</code> </td> <td> U+022DB </td> <tr><td> <code title="">gtreqqless;</code> </td> <td> U+02A8C </td> <tr><td> <code title="">gtrless;</code> </td> <td> U+02277 </td> <tr><td> <code title="">gtrsim;</code> </td> <td> U+02273 </td> <tr><td> <code title="">hArr;</code> </td> <td> U+021D4 </td> <tr><td> <code title="">hairsp;</code> </td> <td> U+0200A </td> <tr><td> <code title="">half;</code> </td> <td> U+000BD </td> <tr><td> <code title="">hamilt;</code> </td> <td> U+0210B </td> <tr><td> <code title="">hardcy;</code> </td> <td> U+0044A </td> <tr><td> <code title="">harr;</code> </td> <td> U+02194 </td> <tr><td> <code title="">harrcir;</code> </td> <td> U+02948 </td> <tr><td> <code title="">harrw;</code> </td> <td> U+021AD </td> <tr><td> <code title="">hbar;</code> </td> <td> U+0210F </td> <tr><td> <code title="">hcirc;</code> </td> <td> U+00125 </td> <tr><td> <code title="">hearts;</code> </td> <td> U+02665 </td> <tr><td> <code title="">heartsuit;</code> </td> <td> U+02665 </td> <tr><td> <code title="">hellip;</code> </td> <td> U+02026 </td> <tr><td> <code title="">hercon;</code> </td> <td> U+022B9 </td> <tr><td> <code title="">hfr;</code> </td> <td> U+1D525 </td> <tr><td> <code title="">hksearow;</code> </td> <td> U+02925 </td> <tr><td> <code title="">hkswarow;</code> </td> <td> U+02926 </td> <tr><td> <code title="">hoarr;</code> </td> <td> U+021FF </td> <tr><td> <code title="">homtht;</code> </td> <td> U+0223B </td> <tr><td> <code title="">hookleftarrow;</code> </td> <td> U+021A9 </td> <tr><td> <code title="">hookrightarrow;</code> </td> <td> U+021AA </td> <tr><td> <code title="">hopf;</code> </td> <td> U+1D559 </td> <tr><td> <code title="">horbar;</code> </td> <td> U+02015 </td> <tr><td> <code title="">hscr;</code> </td> <td> U+1D4BD </td> <tr><td> <code title="">hslash;</code> </td> <td> U+0210F </td> <tr><td> <code title="">hstrok;</code> </td> <td> U+00127 </td> <tr><td> <code title="">hybull;</code> </td> <td> U+02043 </td> <tr><td> <code title="">hyphen;</code> </td> <td> U+02010 </td> <tr><td> <code title="">iacute;</code> </td> <td> U+000ED </td> <tr><td> <code title="">iacute</code> </td> <td> U+000ED </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">ic;</code> </td> <td> U+02063 </td> <tr><td> <code title="">icirc;</code> </td> <td> U+000EE </td> <tr><td> <code title="">icirc</code> </td> <td> U+000EE </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">icy;</code> </td> <td> U+00438 </td> <tr><td> <code title="">iecy;</code> </td> <td> U+00435 </td> <tr><td> <code title="">iexcl;</code> </td> <td> U+000A1 </td> <tr><td> <code title="">iexcl</code> </td> <td> U+000A1 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">iff;</code> </td> <td> U+021D4 </td> <tr><td> <code title="">ifr;</code> </td> <td> U+1D526 </td> <tr><td> <code title="">igrave;</code> </td> <td> U+000EC </td> <tr><td> <code title="">igrave</code> </td> <td> U+000EC </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">ii;</code> </td> <td> U+02148 </td> <tr><td> <code title="">iiiint;</code> </td> <td> U+02A0C </td> <tr><td> <code title="">iiint;</code> </td> <td> U+0222D </td> <tr><td> <code title="">iinfin;</code> </td> <td> U+029DC </td> <tr><td> <code title="">iiota;</code> </td> <td> U+02129 </td> <tr><td> <code title="">ijlig;</code> </td> <td> U+00133 </td> <tr><td> <code title="">imacr;</code> </td> <td> U+0012B </td> <tr><td> <code title="">image;</code> </td> <td> U+02111 </td> <tr><td> <code title="">imagline;</code> </td> <td> U+02110 </td> <tr><td> <code title="">imagpart;</code> </td> <td> U+02111 </td> <tr><td> <code title="">imath;</code> </td> <td> U+00131 </td> <tr><td> <code title="">imof;</code> </td> <td> U+022B7 </td> <tr><td> <code title="">imped;</code> </td> <td> U+001B5 </td> <tr><td> <code title="">in;</code> </td> <td> U+02208 </td> <tr><td> <code title="">incare;</code> </td> <td> U+02105 </td> <tr><td> <code title="">infin;</code> </td> <td> U+0221E </td> <tr><td> <code title="">infintie;</code> </td> <td> U+029DD </td> <tr><td> <code title="">inodot;</code> </td> <td> U+00131 </td> <tr><td> <code title="">int;</code> </td> <td> U+0222B </td> <tr><td> <code title="">intcal;</code> </td> <td> U+022BA </td> <tr><td> <code title="">integers;</code> </td> <td> U+02124 </td> <tr><td> <code title="">intercal;</code> </td> <td> U+022BA </td> <tr><td> <code title="">intlarhk;</code> </td> <td> U+02A17 </td> <tr><td> <code title="">intprod;</code> </td> <td> U+02A3C </td> <tr><td> <code title="">iocy;</code> </td> <td> U+00451 </td> <tr><td> <code title="">iogon;</code> </td> <td> U+0012F </td> <tr><td> <code title="">iopf;</code> </td> <td> U+1D55A </td> <tr><td> <code title="">iota;</code> </td> <td> U+003B9 </td> <tr><td> <code title="">iprod;</code> </td> <td> U+02A3C </td> <tr><td> <code title="">iquest;</code> </td> <td> U+000BF </td> <tr><td> <code title="">iquest</code> </td> <td> U+000BF </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">iscr;</code> </td> <td> U+1D4BE </td> <tr><td> <code title="">isin;</code> </td> <td> U+02208 </td> <tr><td> <code title="">isinE;</code> </td> <td> U+022F9 </td> <tr><td> <code title="">isindot;</code> </td> <td> U+022F5 </td> <tr><td> <code title="">isins;</code> </td> <td> U+022F4 </td> <tr><td> <code title="">isinsv;</code> </td> <td> U+022F3 </td> <tr><td> <code title="">isinv;</code> </td> <td> U+02208 </td> <tr><td> <code title="">it;</code> </td> <td> U+02062 </td> <tr><td> <code title="">itilde;</code> </td> <td> U+00129 </td> <tr><td> <code title="">iukcy;</code> </td> <td> U+00456 </td> <tr><td> <code title="">iuml;</code> </td> <td> U+000EF </td> <tr><td> <code title="">iuml</code> </td> <td> U+000EF </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">jcirc;</code> </td> <td> U+00135 </td> <tr><td> <code title="">jcy;</code> </td> <td> U+00439 </td> <tr><td> <code title="">jfr;</code> </td> <td> U+1D527 </td> <tr><td> <code title="">jmath;</code> </td> <td> U+00237 </td> <tr><td> <code title="">jopf;</code> </td> <td> U+1D55B </td> <tr><td> <code title="">jscr;</code> </td> <td> U+1D4BF </td> <tr><td> <code title="">jsercy;</code> </td> <td> U+00458 </td> <tr><td> <code title="">jukcy;</code> </td> <td> U+00454 </td> <tr><td> <code title="">kappa;</code> </td> <td> U+003BA </td> <tr><td> <code title="">kappav;</code> </td> <td> U+003F0 </td> <tr><td> <code title="">kcedil;</code> </td> <td> U+00137 </td> <tr><td> <code title="">kcy;</code> </td> <td> U+0043A </td> <tr><td> <code title="">kfr;</code> </td> <td> U+1D528 </td> <tr><td> <code title="">kgreen;</code> </td> <td> U+00138 </td> <tr><td> <code title="">khcy;</code> </td> <td> U+00445 </td> <tr><td> <code title="">kjcy;</code> </td> <td> U+0045C </td> <tr><td> <code title="">kopf;</code> </td> <td> U+1D55C </td> <tr><td> <code title="">kscr;</code> </td> <td> U+1D4C0 </td> <tr><td> <code title="">lAarr;</code> </td> <td> U+021DA </td> <tr><td> <code title="">lArr;</code> </td> <td> U+021D0 </td> <tr><td> <code title="">lAtail;</code> </td> <td> U+0291B </td> <tr><td> <code title="">lBarr;</code> </td> <td> U+0290E </td> <tr><td> <code title="">lE;</code> </td> <td> U+02266 </td> <tr><td> <code title="">lEg;</code> </td> <td> U+02A8B </td> <tr><td> <code title="">lHar;</code> </td> <td> U+02962 </td> <tr><td> <code title="">lacute;</code> </td> <td> U+0013A </td> <tr><td> <code title="">laemptyv;</code> </td> <td> U+029B4 </td> <tr><td> <code title="">lagran;</code> </td> <td> U+02112 </td> <tr><td> <code title="">lambda;</code> </td> <td> U+003BB </td> <tr><td> <code title="">lang;</code> </td> <td> U+027E8 </td> <tr><td> <code title="">langd;</code> </td> <td> U+02991 </td> <tr><td> <code title="">langle;</code> </td> <td> U+027E8 </td> <tr><td> <code title="">lap;</code> </td> <td> U+02A85 </td> <tr><td> <code title="">laquo;</code> </td> <td> U+000AB </td> <tr><td> <code title="">laquo</code> </td> <td> U+000AB </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">larr;</code> </td> <td> U+02190 </td> <tr><td> <code title="">larrb;</code> </td> <td> U+021E4 </td> <tr><td> <code title="">larrbfs;</code> </td> <td> U+0291F </td> <tr><td> <code title="">larrfs;</code> </td> <td> U+0291D </td> <tr><td> <code title="">larrhk;</code> </td> <td> U+021A9 </td> <tr><td> <code title="">larrlp;</code> </td> <td> U+021AB </td> <tr><td> <code title="">larrpl;</code> </td> <td> U+02939 </td> <tr><td> <code title="">larrsim;</code> </td> <td> U+02973 </td> <tr><td> <code title="">larrtl;</code> </td> <td> U+021A2 </td> <tr><td> <code title="">lat;</code> </td> <td> U+02AAB </td> <tr><td> <code title="">latail;</code> </td> <td> U+02919 </td> <tr><td> <code title="">late;</code> </td> <td> U+02AAD </td> <tr><td> <code title="">lbarr;</code> </td> <td> U+0290C </td> <tr><td> <code title="">lbbrk;</code> </td> <td> U+02772 </td> <tr><td> <code title="">lbrace;</code> </td> <td> U+0007B </td> <tr><td> <code title="">lbrack;</code> </td> <td> U+0005B </td> <tr><td> <code title="">lbrke;</code> </td> <td> U+0298B </td> <tr><td> <code title="">lbrksld;</code> </td> <td> U+0298F </td> <tr><td> <code title="">lbrkslu;</code> </td> <td> U+0298D </td> <tr><td> <code title="">lcaron;</code> </td> <td> U+0013E </td> <tr><td> <code title="">lcedil;</code> </td> <td> U+0013C </td> <tr><td> <code title="">lceil;</code> </td> <td> U+02308 </td> <tr><td> <code title="">lcub;</code> </td> <td> U+0007B </td> <tr><td> <code title="">lcy;</code> </td> <td> U+0043B </td> <tr><td> <code title="">ldca;</code> </td> <td> U+02936 </td> <tr><td> <code title="">ldquo;</code> </td> <td> U+0201C </td> <tr><td> <code title="">ldquor;</code> </td> <td> U+0201E </td> <tr><td> <code title="">ldrdhar;</code> </td> <td> U+02967 </td> <tr><td> <code title="">ldrushar;</code> </td> <td> U+0294B </td> <tr><td> <code title="">ldsh;</code> </td> <td> U+021B2 </td> <tr><td> <code title="">le;</code> </td> <td> U+02264 </td> <tr><td> <code title="">leftarrow;</code> </td> <td> U+02190 </td> <tr><td> <code title="">leftarrowtail;</code> </td> <td> U+021A2 </td> <tr><td> <code title="">leftharpoondown;</code> </td> <td> U+021BD </td> <tr><td> <code title="">leftharpoonup;</code> </td> <td> U+021BC </td> <tr><td> <code title="">leftleftarrows;</code> </td> <td> U+021C7 </td> <tr><td> <code title="">leftrightarrow;</code> </td> <td> U+02194 </td> <tr><td> <code title="">leftrightarrows;</code> </td> <td> U+021C6 </td> <tr><td> <code title="">leftrightharpoons;</code> </td> <td> U+021CB </td> <tr><td> <code title="">leftrightsquigarrow;</code> </td> <td> U+021AD </td> <tr><td> <code title="">leftthreetimes;</code> </td> <td> U+022CB </td> <tr><td> <code title="">leg;</code> </td> <td> U+022DA </td> <tr><td> <code title="">leq;</code> </td> <td> U+02264 </td> <tr><td> <code title="">leqq;</code> </td> <td> U+02266 </td> <tr><td> <code title="">leqslant;</code> </td> <td> U+02A7D </td> <tr><td> <code title="">les;</code> </td> <td> U+02A7D </td> <tr><td> <code title="">lescc;</code> </td> <td> U+02AA8 </td> <tr><td> <code title="">lesdot;</code> </td> <td> U+02A7F </td> <tr><td> <code title="">lesdoto;</code> </td> <td> U+02A81 </td> <tr><td> <code title="">lesdotor;</code> </td> <td> U+02A83 </td> <tr><td> <code title="">lesges;</code> </td> <td> U+02A93 </td> <tr><td> <code title="">lessapprox;</code> </td> <td> U+02A85 </td> <tr><td> <code title="">lessdot;</code> </td> <td> U+022D6 </td> <tr><td> <code title="">lesseqgtr;</code> </td> <td> U+022DA </td> <tr><td> <code title="">lesseqqgtr;</code> </td> <td> U+02A8B </td> <tr><td> <code title="">lessgtr;</code> </td> <td> U+02276 </td> <tr><td> <code title="">lesssim;</code> </td> <td> U+02272 </td> <tr><td> <code title="">lfisht;</code> </td> <td> U+0297C </td> <tr><td> <code title="">lfloor;</code> </td> <td> U+0230A </td> <tr><td> <code title="">lfr;</code> </td> <td> U+1D529 </td> <tr><td> <code title="">lg;</code> </td> <td> U+02276 </td> <tr><td> <code title="">lgE;</code> </td> <td> U+02A91 </td> <tr><td> <code title="">lhard;</code> </td> <td> U+021BD </td> <tr><td> <code title="">lharu;</code> </td> <td> U+021BC </td> <tr><td> <code title="">lharul;</code> </td> <td> U+0296A </td> <tr><td> <code title="">lhblk;</code> </td> <td> U+02584 </td> <tr><td> <code title="">ljcy;</code> </td> <td> U+00459 </td> <tr><td> <code title="">ll;</code> </td> <td> U+0226A </td> <tr><td> <code title="">llarr;</code> </td> <td> U+021C7 </td> <tr><td> <code title="">llcorner;</code> </td> <td> U+0231E </td> <tr><td> <code title="">llhard;</code> </td> <td> U+0296B </td> <tr><td> <code title="">lltri;</code> </td> <td> U+025FA </td> <tr><td> <code title="">lmidot;</code> </td> <td> U+00140 </td> <tr><td> <code title="">lmoust;</code> </td> <td> U+023B0 </td> <tr><td> <code title="">lmoustache;</code> </td> <td> U+023B0 </td> <tr><td> <code title="">lnE;</code> </td> <td> U+02268 </td> <tr><td> <code title="">lnap;</code> </td> <td> U+02A89 </td> <tr><td> <code title="">lnapprox;</code> </td> <td> U+02A89 </td> <tr><td> <code title="">lne;</code> </td> <td> U+02A87 </td> <tr><td> <code title="">lneq;</code> </td> <td> U+02A87 </td> <tr><td> <code title="">lneqq;</code> </td> <td> U+02268 </td> <tr><td> <code title="">lnsim;</code> </td> <td> U+022E6 </td> <tr><td> <code title="">loang;</code> </td> <td> U+027EC </td> <tr><td> <code title="">loarr;</code> </td> <td> U+021FD </td> <tr><td> <code title="">lobrk;</code> </td> <td> U+027E6 </td> <tr><td> <code title="">longleftarrow;</code> </td> <td> U+027F5 </td> <tr><td> <code title="">longleftrightarrow;</code> </td> <td> U+027F7 </td> <tr><td> <code title="">longmapsto;</code> </td> <td> U+027FC </td> <tr><td> <code title="">longrightarrow;</code> </td> <td> U+027F6 </td> <tr><td> <code title="">looparrowleft;</code> </td> <td> U+021AB </td> <tr><td> <code title="">looparrowright;</code> </td> <td> U+021AC </td> <tr><td> <code title="">lopar;</code> </td> <td> U+02985 </td> <tr><td> <code title="">lopf;</code> </td> <td> U+1D55D </td> <tr><td> <code title="">loplus;</code> </td> <td> U+02A2D </td> <tr><td> <code title="">lotimes;</code> </td> <td> U+02A34 </td> <tr><td> <code title="">lowast;</code> </td> <td> U+02217 </td> <tr><td> <code title="">lowbar;</code> </td> <td> U+0005F </td> <tr><td> <code title="">loz;</code> </td> <td> U+025CA </td> <tr><td> <code title="">lozenge;</code> </td> <td> U+025CA </td> <tr><td> <code title="">lozf;</code> </td> <td> U+029EB </td> <tr><td> <code title="">lpar;</code> </td> <td> U+00028 </td> <tr><td> <code title="">lparlt;</code> </td> <td> U+02993 </td> <tr><td> <code title="">lrarr;</code> </td> <td> U+021C6 </td> <tr><td> <code title="">lrcorner;</code> </td> <td> U+0231F </td> <tr><td> <code title="">lrhar;</code> </td> <td> U+021CB </td> <tr><td> <code title="">lrhard;</code> </td> <td> U+0296D </td> <tr><td> <code title="">lrm;</code> </td> <td> U+0200E </td> <tr><td> <code title="">lrtri;</code> </td> <td> U+022BF </td> <tr><td> <code title="">lsaquo;</code> </td> <td> U+02039 </td> <tr><td> <code title="">lscr;</code> </td> <td> U+1D4C1 </td> <tr><td> <code title="">lsh;</code> </td> <td> U+021B0 </td> <tr><td> <code title="">lsim;</code> </td> <td> U+02272 </td> <tr><td> <code title="">lsime;</code> </td> <td> U+02A8D </td> <tr><td> <code title="">lsimg;</code> </td> <td> U+02A8F </td> <tr><td> <code title="">lsqb;</code> </td> <td> U+0005B </td> <tr><td> <code title="">lsquo;</code> </td> <td> U+02018 </td> <tr><td> <code title="">lsquor;</code> </td> <td> U+0201A </td> <tr><td> <code title="">lstrok;</code> </td> <td> U+00142 </td> <tr><td> <code title="">lt;</code> </td> <td> U+0003C </td> <tr><td> <code title="">lt</code> </td> <td> U+0003C </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">ltcc;</code> </td> <td> U+02AA6 </td> <tr><td> <code title="">ltcir;</code> </td> <td> U+02A79 </td> <tr><td> <code title="">ltdot;</code> </td> <td> U+022D6 </td> <tr><td> <code title="">lthree;</code> </td> <td> U+022CB </td> <tr><td> <code title="">ltimes;</code> </td> <td> U+022C9 </td> <tr><td> <code title="">ltlarr;</code> </td> <td> U+02976 </td> <tr><td> <code title="">ltquest;</code> </td> <td> U+02A7B </td> <tr><td> <code title="">ltrPar;</code> </td> <td> U+02996 </td> <tr><td> <code title="">ltri;</code> </td> <td> U+025C3 </td> <tr><td> <code title="">ltrie;</code> </td> <td> U+022B4 </td> <tr><td> <code title="">ltrif;</code> </td> <td> U+025C2 </td> <tr><td> <code title="">lurdshar;</code> </td> <td> U+0294A </td> <tr><td> <code title="">luruhar;</code> </td> <td> U+02966 </td> <tr><td> <code title="">mDDot;</code> </td> <td> U+0223A </td> <tr><td> <code title="">macr;</code> </td> <td> U+000AF </td> <tr><td> <code title="">macr</code> </td> <td> U+000AF </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">male;</code> </td> <td> U+02642 </td> <tr><td> <code title="">malt;</code> </td> <td> U+02720 </td> <tr><td> <code title="">maltese;</code> </td> <td> U+02720 </td> <tr><td> <code title="">map;</code> </td> <td> U+021A6 </td> <tr><td> <code title="">mapsto;</code> </td> <td> U+021A6 </td> <tr><td> <code title="">mapstodown;</code> </td> <td> U+021A7 </td> <tr><td> <code title="">mapstoleft;</code> </td> <td> U+021A4 </td> <tr><td> <code title="">mapstoup;</code> </td> <td> U+021A5 </td> <tr><td> <code title="">marker;</code> </td> <td> U+025AE </td> <tr><td> <code title="">mcomma;</code> </td> <td> U+02A29 </td> <tr><td> <code title="">mcy;</code> </td> <td> U+0043C </td> <tr><td> <code title="">mdash;</code> </td> <td> U+02014 </td> <tr><td> <code title="">measuredangle;</code> </td> <td> U+02221 </td> <tr><td> <code title="">mfr;</code> </td> <td> U+1D52A </td> <tr><td> <code title="">mho;</code> </td> <td> U+02127 </td> <tr><td> <code title="">micro;</code> </td> <td> U+000B5 </td> <tr><td> <code title="">micro</code> </td> <td> U+000B5 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">mid;</code> </td> <td> U+02223 </td> <tr><td> <code title="">midast;</code> </td> <td> U+0002A </td> <tr><td> <code title="">midcir;</code> </td> <td> U+02AF0 </td> <tr><td> <code title="">middot;</code> </td> <td> U+000B7 </td> <tr><td> <code title="">middot</code> </td> <td> U+000B7 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">minus;</code> </td> <td> U+02212 </td> <tr><td> <code title="">minusb;</code> </td> <td> U+0229F </td> <tr><td> <code title="">minusd;</code> </td> <td> U+02238 </td> <tr><td> <code title="">minusdu;</code> </td> <td> U+02A2A </td> <tr><td> <code title="">mlcp;</code> </td> <td> U+02ADB </td> <tr><td> <code title="">mldr;</code> </td> <td> U+02026 </td> <tr><td> <code title="">mnplus;</code> </td> <td> U+02213 </td> <tr><td> <code title="">models;</code> </td> <td> U+022A7 </td> <tr><td> <code title="">mopf;</code> </td> <td> U+1D55E </td> <tr><td> <code title="">mp;</code> </td> <td> U+02213 </td> <tr><td> <code title="">mscr;</code> </td> <td> U+1D4C2 </td> <tr><td> <code title="">mstpos;</code> </td> <td> U+0223E </td> <tr><td> <code title="">mu;</code> </td> <td> U+003BC </td> <tr><td> <code title="">multimap;</code> </td> <td> U+022B8 </td> <tr><td> <code title="">mumap;</code> </td> <td> U+022B8 </td> <tr><td> <code title="">nLeftarrow;</code> </td> <td> U+021CD </td> <tr><td> <code title="">nLeftrightarrow;</code> </td> <td> U+021CE </td> <tr><td> <code title="">nRightarrow;</code> </td> <td> U+021CF </td> <tr><td> <code title="">nVDash;</code> </td> <td> U+022AF </td> <tr><td> <code title="">nVdash;</code> </td> <td> U+022AE </td> <tr><td> <code title="">nabla;</code> </td> <td> U+02207 </td> <tr><td> <code title="">nacute;</code> </td> <td> U+00144 </td> <tr><td> <code title="">nap;</code> </td> <td> U+02249 </td> <tr><td> <code title="">napos;</code> </td> <td> U+00149 </td> <tr><td> <code title="">napprox;</code> </td> <td> U+02249 </td> <tr><td> <code title="">natur;</code> </td> <td> U+0266E </td> <tr><td> <code title="">natural;</code> </td> <td> U+0266E </td> <tr><td> <code title="">naturals;</code> </td> <td> U+02115 </td> <tr><td> <code title="">nbsp;</code> </td> <td> U+000A0 </td> <tr><td> <code title="">nbsp</code> </td> <td> U+000A0 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">ncap;</code> </td> <td> U+02A43 </td> <tr><td> <code title="">ncaron;</code> </td> <td> U+00148 </td> <tr><td> <code title="">ncedil;</code> </td> <td> U+00146 </td> <tr><td> <code title="">ncong;</code> </td> <td> U+02247 </td> <tr><td> <code title="">ncup;</code> </td> <td> U+02A42 </td> <tr><td> <code title="">ncy;</code> </td> <td> U+0043D </td> <tr><td> <code title="">ndash;</code> </td> <td> U+02013 </td> <tr><td> <code title="">ne;</code> </td> <td> U+02260 </td> <tr><td> <code title="">neArr;</code> </td> <td> U+021D7 </td> <tr><td> <code title="">nearhk;</code> </td> <td> U+02924 </td> <tr><td> <code title="">nearr;</code> </td> <td> U+02197 </td> <tr><td> <code title="">nearrow;</code> </td> <td> U+02197 </td> <tr><td> <code title="">nequiv;</code> </td> <td> U+02262 </td> <tr><td> <code title="">nesear;</code> </td> <td> U+02928 </td> <tr><td> <code title="">nexist;</code> </td> <td> U+02204 </td> <tr><td> <code title="">nexists;</code> </td> <td> U+02204 </td> <tr><td> <code title="">nfr;</code> </td> <td> U+1D52B </td> <tr><td> <code title="">nge;</code> </td> <td> U+02271 </td> <tr><td> <code title="">ngeq;</code> </td> <td> U+02271 </td> <tr><td> <code title="">ngsim;</code> </td> <td> U+02275 </td> <tr><td> <code title="">ngt;</code> </td> <td> U+0226F </td> <tr><td> <code title="">ngtr;</code> </td> <td> U+0226F </td> <tr><td> <code title="">nhArr;</code> </td> <td> U+021CE </td> <tr><td> <code title="">nharr;</code> </td> <td> U+021AE </td> <tr><td> <code title="">nhpar;</code> </td> <td> U+02AF2 </td> <tr><td> <code title="">ni;</code> </td> <td> U+0220B </td> <tr><td> <code title="">nis;</code> </td> <td> U+022FC </td> <tr><td> <code title="">nisd;</code> </td> <td> U+022FA </td> <tr><td> <code title="">niv;</code> </td> <td> U+0220B </td> <tr><td> <code title="">njcy;</code> </td> <td> U+0045A </td> <tr><td> <code title="">nlArr;</code> </td> <td> U+021CD </td> <tr><td> <code title="">nlarr;</code> </td> <td> U+0219A </td> <tr><td> <code title="">nldr;</code> </td> <td> U+02025 </td> <tr><td> <code title="">nle;</code> </td> <td> U+02270 </td> <tr><td> <code title="">nleftarrow;</code> </td> <td> U+0219A </td> <tr><td> <code title="">nleftrightarrow;</code> </td> <td> U+021AE </td> <tr><td> <code title="">nleq;</code> </td> <td> U+02270 </td> <tr><td> <code title="">nless;</code> </td> <td> U+0226E </td> <tr><td> <code title="">nlsim;</code> </td> <td> U+02274 </td> <tr><td> <code title="">nlt;</code> </td> <td> U+0226E </td> <tr><td> <code title="">nltri;</code> </td> <td> U+022EA </td> <tr><td> <code title="">nltrie;</code> </td> <td> U+022EC </td> <tr><td> <code title="">nmid;</code> </td> <td> U+02224 </td> <tr><td> <code title="">nopf;</code> </td> <td> U+1D55F </td> <tr><td> <code title="">not;</code> </td> <td> U+000AC </td> <tr><td> <code title="">not</code> </td> <td> U+000AC </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">notin;</code> </td> <td> U+02209 </td> <tr><td> <code title="">notinva;</code> </td> <td> U+02209 </td> <tr><td> <code title="">notinvb;</code> </td> <td> U+022F7 </td> <tr><td> <code title="">notinvc;</code> </td> <td> U+022F6 </td> <tr><td> <code title="">notni;</code> </td> <td> U+0220C </td> <tr><td> <code title="">notniva;</code> </td> <td> U+0220C </td> <tr><td> <code title="">notnivb;</code> </td> <td> U+022FE </td> <tr><td> <code title="">notnivc;</code> </td> <td> U+022FD </td> <tr><td> <code title="">npar;</code> </td> <td> U+02226 </td> <tr><td> <code title="">nparallel;</code> </td> <td> U+02226 </td> <tr><td> <code title="">npolint;</code> </td> <td> U+02A14 </td> <tr><td> <code title="">npr;</code> </td> <td> U+02280 </td> <tr><td> <code title="">nprcue;</code> </td> <td> U+022E0 </td> <tr><td> <code title="">nprec;</code> </td> <td> U+02280 </td> <tr><td> <code title="">nrArr;</code> </td> <td> U+021CF </td> <tr><td> <code title="">nrarr;</code> </td> <td> U+0219B </td> <tr><td> <code title="">nrightarrow;</code> </td> <td> U+0219B </td> <tr><td> <code title="">nrtri;</code> </td> <td> U+022EB </td> <tr><td> <code title="">nrtrie;</code> </td> <td> U+022ED </td> <tr><td> <code title="">nsc;</code> </td> <td> U+02281 </td> <tr><td> <code title="">nsccue;</code> </td> <td> U+022E1 </td> <tr><td> <code title="">nscr;</code> </td> <td> U+1D4C3 </td> <tr><td> <code title="">nshortmid;</code> </td> <td> U+02224 </td> <tr><td> <code title="">nshortparallel;</code> </td> <td> U+02226 </td> <tr><td> <code title="">nsim;</code> </td> <td> U+02241 </td> <tr><td> <code title="">nsime;</code> </td> <td> U+02244 </td> <tr><td> <code title="">nsimeq;</code> </td> <td> U+02244 </td> <tr><td> <code title="">nsmid;</code> </td> <td> U+02224 </td> <tr><td> <code title="">nspar;</code> </td> <td> U+02226 </td> <tr><td> <code title="">nsqsube;</code> </td> <td> U+022E2 </td> <tr><td> <code title="">nsqsupe;</code> </td> <td> U+022E3 </td> <tr><td> <code title="">nsub;</code> </td> <td> U+02284 </td> <tr><td> <code title="">nsube;</code> </td> <td> U+02288 </td> <tr><td> <code title="">nsubseteq;</code> </td> <td> U+02288 </td> <tr><td> <code title="">nsucc;</code> </td> <td> U+02281 </td> <tr><td> <code title="">nsup;</code> </td> <td> U+02285 </td> <tr><td> <code title="">nsupe;</code> </td> <td> U+02289 </td> <tr><td> <code title="">nsupseteq;</code> </td> <td> U+02289 </td> <tr><td> <code title="">ntgl;</code> </td> <td> U+02279 </td> <tr><td> <code title="">ntilde;</code> </td> <td> U+000F1 </td> <tr><td> <code title="">ntilde</code> </td> <td> U+000F1 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">ntlg;</code> </td> <td> U+02278 </td> <tr><td> <code title="">ntriangleleft;</code> </td> <td> U+022EA </td> <tr><td> <code title="">ntrianglelefteq;</code> </td> <td> U+022EC </td> <tr><td> <code title="">ntriangleright;</code> </td> <td> U+022EB </td> <tr><td> <code title="">ntrianglerighteq;</code> </td> <td> U+022ED </td> <tr><td> <code title="">nu;</code> </td> <td> U+003BD </td> <tr><td> <code title="">num;</code> </td> <td> U+00023 </td> <tr><td> <code title="">numero;</code> </td> <td> U+02116 </td> <tr><td> <code title="">numsp;</code> </td> <td> U+02007 </td> <tr><td> <code title="">nvDash;</code> </td> <td> U+022AD </td> <tr><td> <code title="">nvHarr;</code> </td> <td> U+02904 </td> <tr><td> <code title="">nvdash;</code> </td> <td> U+022AC </td> <tr><td> <code title="">nvinfin;</code> </td> <td> U+029DE </td> <tr><td> <code title="">nvlArr;</code> </td> <td> U+02902 </td> <tr><td> <code title="">nvrArr;</code> </td> <td> U+02903 </td> <tr><td> <code title="">nwArr;</code> </td> <td> U+021D6 </td> <tr><td> <code title="">nwarhk;</code> </td> <td> U+02923 </td> <tr><td> <code title="">nwarr;</code> </td> <td> U+02196 </td> <tr><td> <code title="">nwarrow;</code> </td> <td> U+02196 </td> <tr><td> <code title="">nwnear;</code> </td> <td> U+02927 </td> <tr><td> <code title="">oS;</code> </td> <td> U+024C8 </td> <tr><td> <code title="">oacute;</code> </td> <td> U+000F3 </td> <tr><td> <code title="">oacute</code> </td> <td> U+000F3 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">oast;</code> </td> <td> U+0229B </td> <tr><td> <code title="">ocir;</code> </td> <td> U+0229A </td> <tr><td> <code title="">ocirc;</code> </td> <td> U+000F4 </td> <tr><td> <code title="">ocirc</code> </td> <td> U+000F4 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">ocy;</code> </td> <td> U+0043E </td> <tr><td> <code title="">odash;</code> </td> <td> U+0229D </td> <tr><td> <code title="">odblac;</code> </td> <td> U+00151 </td> <tr><td> <code title="">odiv;</code> </td> <td> U+02A38 </td> <tr><td> <code title="">odot;</code> </td> <td> U+02299 </td> <tr><td> <code title="">odsold;</code> </td> <td> U+029BC </td> <tr><td> <code title="">oelig;</code> </td> <td> U+00153 </td> <tr><td> <code title="">ofcir;</code> </td> <td> U+029BF </td> <tr><td> <code title="">ofr;</code> </td> <td> U+1D52C </td> <tr><td> <code title="">ogon;</code> </td> <td> U+002DB </td> <tr><td> <code title="">ograve;</code> </td> <td> U+000F2 </td> <tr><td> <code title="">ograve</code> </td> <td> U+000F2 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">ogt;</code> </td> <td> U+029C1 </td> <tr><td> <code title="">ohbar;</code> </td> <td> U+029B5 </td> <tr><td> <code title="">ohm;</code> </td> <td> U+003A9 </td> <tr><td> <code title="">oint;</code> </td> <td> U+0222E </td> <tr><td> <code title="">olarr;</code> </td> <td> U+021BA </td> <tr><td> <code title="">olcir;</code> </td> <td> U+029BE </td> <tr><td> <code title="">olcross;</code> </td> <td> U+029BB </td> <tr><td> <code title="">oline;</code> </td> <td> U+0203E </td> <tr><td> <code title="">olt;</code> </td> <td> U+029C0 </td> <tr><td> <code title="">omacr;</code> </td> <td> U+0014D </td> <tr><td> <code title="">omega;</code> </td> <td> U+003C9 </td> <tr><td> <code title="">omicron;</code> </td> <td> U+003BF </td> <tr><td> <code title="">omid;</code> </td> <td> U+029B6 </td> <tr><td> <code title="">ominus;</code> </td> <td> U+02296 </td> <tr><td> <code title="">oopf;</code> </td> <td> U+1D560 </td> <tr><td> <code title="">opar;</code> </td> <td> U+029B7 </td> <tr><td> <code title="">operp;</code> </td> <td> U+029B9 </td> <tr><td> <code title="">oplus;</code> </td> <td> U+02295 </td> <tr><td> <code title="">or;</code> </td> <td> U+02228 </td> <tr><td> <code title="">orarr;</code> </td> <td> U+021BB </td> <tr><td> <code title="">ord;</code> </td> <td> U+02A5D </td> <tr><td> <code title="">order;</code> </td> <td> U+02134 </td> <tr><td> <code title="">orderof;</code> </td> <td> U+02134 </td> <tr><td> <code title="">ordf;</code> </td> <td> U+000AA </td> <tr><td> <code title="">ordf</code> </td> <td> U+000AA </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">ordm;</code> </td> <td> U+000BA </td> <tr><td> <code title="">ordm</code> </td> <td> U+000BA </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">origof;</code> </td> <td> U+022B6 </td> <tr><td> <code title="">oror;</code> </td> <td> U+02A56 </td> <tr><td> <code title="">orslope;</code> </td> <td> U+02A57 </td> <tr><td> <code title="">orv;</code> </td> <td> U+02A5B </td> <tr><td> <code title="">oscr;</code> </td> <td> U+02134 </td> <tr><td> <code title="">oslash;</code> </td> <td> U+000F8 </td> <tr><td> <code title="">oslash</code> </td> <td> U+000F8 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">osol;</code> </td> <td> U+02298 </td> <tr><td> <code title="">otilde;</code> </td> <td> U+000F5 </td> <tr><td> <code title="">otilde</code> </td> <td> U+000F5 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">otimes;</code> </td> <td> U+02297 </td> <tr><td> <code title="">otimesas;</code> </td> <td> U+02A36 </td> <tr><td> <code title="">ouml;</code> </td> <td> U+000F6 </td> <tr><td> <code title="">ouml</code> </td> <td> U+000F6 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">ovbar;</code> </td> <td> U+0233D </td> <tr><td> <code title="">par;</code> </td> <td> U+02225 </td> <tr><td> <code title="">para;</code> </td> <td> U+000B6 </td> <tr><td> <code title="">para</code> </td> <td> U+000B6 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">parallel;</code> </td> <td> U+02225 </td> <tr><td> <code title="">parsim;</code> </td> <td> U+02AF3 </td> <tr><td> <code title="">parsl;</code> </td> <td> U+02AFD </td> <tr><td> <code title="">part;</code> </td> <td> U+02202 </td> <tr><td> <code title="">pcy;</code> </td> <td> U+0043F </td> <tr><td> <code title="">percnt;</code> </td> <td> U+00025 </td> <tr><td> <code title="">period;</code> </td> <td> U+0002E </td> <tr><td> <code title="">permil;</code> </td> <td> U+02030 </td> <tr><td> <code title="">perp;</code> </td> <td> U+022A5 </td> <tr><td> <code title="">pertenk;</code> </td> <td> U+02031 </td> <tr><td> <code title="">pfr;</code> </td> <td> U+1D52D </td> <tr><td> <code title="">phi;</code> </td> <td> U+003C6 </td> <tr><td> <code title="">phiv;</code> </td> <td> U+003D5 </td> <tr><td> <code title="">phmmat;</code> </td> <td> U+02133 </td> <tr><td> <code title="">phone;</code> </td> <td> U+0260E </td> <tr><td> <code title="">pi;</code> </td> <td> U+003C0 </td> <tr><td> <code title="">pitchfork;</code> </td> <td> U+022D4 </td> <tr><td> <code title="">piv;</code> </td> <td> U+003D6 </td> <tr><td> <code title="">planck;</code> </td> <td> U+0210F </td> <tr><td> <code title="">planckh;</code> </td> <td> U+0210E </td> <tr><td> <code title="">plankv;</code> </td> <td> U+0210F </td> <tr><td> <code title="">plus;</code> </td> <td> U+0002B </td> <tr><td> <code title="">plusacir;</code> </td> <td> U+02A23 </td> <tr><td> <code title="">plusb;</code> </td> <td> U+0229E </td> <tr><td> <code title="">pluscir;</code> </td> <td> U+02A22 </td> <tr><td> <code title="">plusdo;</code> </td> <td> U+02214 </td> <tr><td> <code title="">plusdu;</code> </td> <td> U+02A25 </td> <tr><td> <code title="">pluse;</code> </td> <td> U+02A72 </td> <tr><td> <code title="">plusmn;</code> </td> <td> U+000B1 </td> <tr><td> <code title="">plusmn</code> </td> <td> U+000B1 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">plussim;</code> </td> <td> U+02A26 </td> <tr><td> <code title="">plustwo;</code> </td> <td> U+02A27 </td> <tr><td> <code title="">pm;</code> </td> <td> U+000B1 </td> <tr><td> <code title="">pointint;</code> </td> <td> U+02A15 </td> <tr><td> <code title="">popf;</code> </td> <td> U+1D561 </td> <tr><td> <code title="">pound;</code> </td> <td> U+000A3 </td> <tr><td> <code title="">pound</code> </td> <td> U+000A3 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">pr;</code> </td> <td> U+0227A </td> <tr><td> <code title="">prE;</code> </td> <td> U+02AB3 </td> <tr><td> <code title="">prap;</code> </td> <td> U+02AB7 </td> <tr><td> <code title="">prcue;</code> </td> <td> U+0227C </td> <tr><td> <code title="">pre;</code> </td> <td> U+02AAF </td> <tr><td> <code title="">prec;</code> </td> <td> U+0227A </td> <tr><td> <code title="">precapprox;</code> </td> <td> U+02AB7 </td> <tr><td> <code title="">preccurlyeq;</code> </td> <td> U+0227C </td> <tr><td> <code title="">preceq;</code> </td> <td> U+02AAF </td> <tr><td> <code title="">precnapprox;</code> </td> <td> U+02AB9 </td> <tr><td> <code title="">precneqq;</code> </td> <td> U+02AB5 </td> <tr><td> <code title="">precnsim;</code> </td> <td> U+022E8 </td> <tr><td> <code title="">precsim;</code> </td> <td> U+0227E </td> <tr><td> <code title="">prime;</code> </td> <td> U+02032 </td> <tr><td> <code title="">primes;</code> </td> <td> U+02119 </td> <tr><td> <code title="">prnE;</code> </td> <td> U+02AB5 </td> <tr><td> <code title="">prnap;</code> </td> <td> U+02AB9 </td> <tr><td> <code title="">prnsim;</code> </td> <td> U+022E8 </td> <tr><td> <code title="">prod;</code> </td> <td> U+0220F </td> <tr><td> <code title="">profalar;</code> </td> <td> U+0232E </td> <tr><td> <code title="">profline;</code> </td> <td> U+02312 </td> <tr><td> <code title="">profsurf;</code> </td> <td> U+02313 </td> <tr><td> <code title="">prop;</code> </td> <td> U+0221D </td> <tr><td> <code title="">propto;</code> </td> <td> U+0221D </td> <tr><td> <code title="">prsim;</code> </td> <td> U+0227E </td> <tr><td> <code title="">prurel;</code> </td> <td> U+022B0 </td> <tr><td> <code title="">pscr;</code> </td> <td> U+1D4C5 </td> <tr><td> <code title="">psi;</code> </td> <td> U+003C8 </td> <tr><td> <code title="">puncsp;</code> </td> <td> U+02008 </td> <tr><td> <code title="">qfr;</code> </td> <td> U+1D52E </td> <tr><td> <code title="">qint;</code> </td> <td> U+02A0C </td> <tr><td> <code title="">qopf;</code> </td> <td> U+1D562 </td> <tr><td> <code title="">qprime;</code> </td> <td> U+02057 </td> <tr><td> <code title="">qscr;</code> </td> <td> U+1D4C6 </td> <tr><td> <code title="">quaternions;</code> </td> <td> U+0210D </td> <tr><td> <code title="">quatint;</code> </td> <td> U+02A16 </td> <tr><td> <code title="">quest;</code> </td> <td> U+0003F </td> <tr><td> <code title="">questeq;</code> </td> <td> U+0225F </td> <tr><td> <code title="">quot;</code> </td> <td> U+00022 </td> <tr><td> <code title="">quot</code> </td> <td> U+00022 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">rAarr;</code> </td> <td> U+021DB </td> <tr><td> <code title="">rArr;</code> </td> <td> U+021D2 </td> <tr><td> <code title="">rAtail;</code> </td> <td> U+0291C </td> <tr><td> <code title="">rBarr;</code> </td> <td> U+0290F </td> <tr><td> <code title="">rHar;</code> </td> <td> U+02964 </td> <tr><td> <code title="">racute;</code> </td> <td> U+00155 </td> <tr><td> <code title="">radic;</code> </td> <td> U+0221A </td> <tr><td> <code title="">raemptyv;</code> </td> <td> U+029B3 </td> <tr><td> <code title="">rang;</code> </td> <td> U+027E9 </td> <tr><td> <code title="">rangd;</code> </td> <td> U+02992 </td> <tr><td> <code title="">range;</code> </td> <td> U+029A5 </td> <tr><td> <code title="">rangle;</code> </td> <td> U+027E9 </td> <tr><td> <code title="">raquo;</code> </td> <td> U+000BB </td> <tr><td> <code title="">raquo</code> </td> <td> U+000BB </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">rarr;</code> </td> <td> U+02192 </td> <tr><td> <code title="">rarrap;</code> </td> <td> U+02975 </td> <tr><td> <code title="">rarrb;</code> </td> <td> U+021E5 </td> <tr><td> <code title="">rarrbfs;</code> </td> <td> U+02920 </td> <tr><td> <code title="">rarrc;</code> </td> <td> U+02933 </td> <tr><td> <code title="">rarrfs;</code> </td> <td> U+0291E </td> <tr><td> <code title="">rarrhk;</code> </td> <td> U+021AA </td> <tr><td> <code title="">rarrlp;</code> </td> <td> U+021AC </td> <tr><td> <code title="">rarrpl;</code> </td> <td> U+02945 </td> <tr><td> <code title="">rarrsim;</code> </td> <td> U+02974 </td> <tr><td> <code title="">rarrtl;</code> </td> <td> U+021A3 </td> <tr><td> <code title="">rarrw;</code> </td> <td> U+0219D </td> <tr><td> <code title="">ratail;</code> </td> <td> U+0291A </td> <tr><td> <code title="">ratio;</code> </td> <td> U+02236 </td> <tr><td> <code title="">rationals;</code> </td> <td> U+0211A </td> <tr><td> <code title="">rbarr;</code> </td> <td> U+0290D </td> <tr><td> <code title="">rbbrk;</code> </td> <td> U+02773 </td> <tr><td> <code title="">rbrace;</code> </td> <td> U+0007D </td> <tr><td> <code title="">rbrack;</code> </td> <td> U+0005D </td> <tr><td> <code title="">rbrke;</code> </td> <td> U+0298C </td> <tr><td> <code title="">rbrksld;</code> </td> <td> U+0298E </td> <tr><td> <code title="">rbrkslu;</code> </td> <td> U+02990 </td> <tr><td> <code title="">rcaron;</code> </td> <td> U+00159 </td> <tr><td> <code title="">rcedil;</code> </td> <td> U+00157 </td> <tr><td> <code title="">rceil;</code> </td> <td> U+02309 </td> <tr><td> <code title="">rcub;</code> </td> <td> U+0007D </td> <tr><td> <code title="">rcy;</code> </td> <td> U+00440 </td> <tr><td> <code title="">rdca;</code> </td> <td> U+02937 </td> <tr><td> <code title="">rdldhar;</code> </td> <td> U+02969 </td> <tr><td> <code title="">rdquo;</code> </td> <td> U+0201D </td> <tr><td> <code title="">rdquor;</code> </td> <td> U+0201D </td> <tr><td> <code title="">rdsh;</code> </td> <td> U+021B3 </td> <tr><td> <code title="">real;</code> </td> <td> U+0211C </td> <tr><td> <code title="">realine;</code> </td> <td> U+0211B </td> <tr><td> <code title="">realpart;</code> </td> <td> U+0211C </td> <tr><td> <code title="">reals;</code> </td> <td> U+0211D </td> <tr><td> <code title="">rect;</code> </td> <td> U+025AD </td> <tr><td> <code title="">reg;</code> </td> <td> U+000AE </td> <tr><td> <code title="">reg</code> </td> <td> U+000AE </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">rfisht;</code> </td> <td> U+0297D </td> <tr><td> <code title="">rfloor;</code> </td> <td> U+0230B </td> <tr><td> <code title="">rfr;</code> </td> <td> U+1D52F </td> <tr><td> <code title="">rhard;</code> </td> <td> U+021C1 </td> <tr><td> <code title="">rharu;</code> </td> <td> U+021C0 </td> <tr><td> <code title="">rharul;</code> </td> <td> U+0296C </td> <tr><td> <code title="">rho;</code> </td> <td> U+003C1 </td> <tr><td> <code title="">rhov;</code> </td> <td> U+003F1 </td> <tr><td> <code title="">rightarrow;</code> </td> <td> U+02192 </td> <tr><td> <code title="">rightarrowtail;</code> </td> <td> U+021A3 </td> <tr><td> <code title="">rightharpoondown;</code> </td> <td> U+021C1 </td> <tr><td> <code title="">rightharpoonup;</code> </td> <td> U+021C0 </td> <tr><td> <code title="">rightleftarrows;</code> </td> <td> U+021C4 </td> <tr><td> <code title="">rightleftharpoons;</code> </td> <td> U+021CC </td> <tr><td> <code title="">rightrightarrows;</code> </td> <td> U+021C9 </td> <tr><td> <code title="">rightsquigarrow;</code> </td> <td> U+0219D </td> <tr><td> <code title="">rightthreetimes;</code> </td> <td> U+022CC </td> <tr><td> <code title="">ring;</code> </td> <td> U+002DA </td> <tr><td> <code title="">risingdotseq;</code> </td> <td> U+02253 </td> <tr><td> <code title="">rlarr;</code> </td> <td> U+021C4 </td> <tr><td> <code title="">rlhar;</code> </td> <td> U+021CC </td> <tr><td> <code title="">rlm;</code> </td> <td> U+0200F </td> <tr><td> <code title="">rmoust;</code> </td> <td> U+023B1 </td> <tr><td> <code title="">rmoustache;</code> </td> <td> U+023B1 </td> <tr><td> <code title="">rnmid;</code> </td> <td> U+02AEE </td> <tr><td> <code title="">roang;</code> </td> <td> U+027ED </td> <tr><td> <code title="">roarr;</code> </td> <td> U+021FE </td> <tr><td> <code title="">robrk;</code> </td> <td> U+027E7 </td> <tr><td> <code title="">ropar;</code> </td> <td> U+02986 </td> <tr><td> <code title="">ropf;</code> </td> <td> U+1D563 </td> <tr><td> <code title="">roplus;</code> </td> <td> U+02A2E </td> <tr><td> <code title="">rotimes;</code> </td> <td> U+02A35 </td> <tr><td> <code title="">rpar;</code> </td> <td> U+00029 </td> <tr><td> <code title="">rpargt;</code> </td> <td> U+02994 </td> <tr><td> <code title="">rppolint;</code> </td> <td> U+02A12 </td> <tr><td> <code title="">rrarr;</code> </td> <td> U+021C9 </td> <tr><td> <code title="">rsaquo;</code> </td> <td> U+0203A </td> <tr><td> <code title="">rscr;</code> </td> <td> U+1D4C7 </td> <tr><td> <code title="">rsh;</code> </td> <td> U+021B1 </td> <tr><td> <code title="">rsqb;</code> </td> <td> U+0005D </td> <tr><td> <code title="">rsquo;</code> </td> <td> U+02019 </td> <tr><td> <code title="">rsquor;</code> </td> <td> U+02019 </td> <tr><td> <code title="">rthree;</code> </td> <td> U+022CC </td> <tr><td> <code title="">rtimes;</code> </td> <td> U+022CA </td> <tr><td> <code title="">rtri;</code> </td> <td> U+025B9 </td> <tr><td> <code title="">rtrie;</code> </td> <td> U+022B5 </td> <tr><td> <code title="">rtrif;</code> </td> <td> U+025B8 </td> <tr><td> <code title="">rtriltri;</code> </td> <td> U+029CE </td> <tr><td> <code title="">ruluhar;</code> </td> <td> U+02968 </td> <tr><td> <code title="">rx;</code> </td> <td> U+0211E </td> <tr><td> <code title="">sacute;</code> </td> <td> U+0015B </td> <tr><td> <code title="">sbquo;</code> </td> <td> U+0201A </td> <tr><td> <code title="">sc;</code> </td> <td> U+0227B </td> <tr><td> <code title="">scE;</code> </td> <td> U+02AB4 </td> <tr><td> <code title="">scap;</code> </td> <td> U+02AB8 </td> <tr><td> <code title="">scaron;</code> </td> <td> U+00161 </td> <tr><td> <code title="">sccue;</code> </td> <td> U+0227D </td> <tr><td> <code title="">sce;</code> </td> <td> U+02AB0 </td> <tr><td> <code title="">scedil;</code> </td> <td> U+0015F </td> <tr><td> <code title="">scirc;</code> </td> <td> U+0015D </td> <tr><td> <code title="">scnE;</code> </td> <td> U+02AB6 </td> <tr><td> <code title="">scnap;</code> </td> <td> U+02ABA </td> <tr><td> <code title="">scnsim;</code> </td> <td> U+022E9 </td> <tr><td> <code title="">scpolint;</code> </td> <td> U+02A13 </td> <tr><td> <code title="">scsim;</code> </td> <td> U+0227F </td> <tr><td> <code title="">scy;</code> </td> <td> U+00441 </td> <tr><td> <code title="">sdot;</code> </td> <td> U+022C5 </td> <tr><td> <code title="">sdotb;</code> </td> <td> U+022A1 </td> <tr><td> <code title="">sdote;</code> </td> <td> U+02A66 </td> <tr><td> <code title="">seArr;</code> </td> <td> U+021D8 </td> <tr><td> <code title="">searhk;</code> </td> <td> U+02925 </td> <tr><td> <code title="">searr;</code> </td> <td> U+02198 </td> <tr><td> <code title="">searrow;</code> </td> <td> U+02198 </td> <tr><td> <code title="">sect;</code> </td> <td> U+000A7 </td> <tr><td> <code title="">sect</code> </td> <td> U+000A7 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">semi;</code> </td> <td> U+0003B </td> <tr><td> <code title="">seswar;</code> </td> <td> U+02929 </td> <tr><td> <code title="">setminus;</code> </td> <td> U+02216 </td> <tr><td> <code title="">setmn;</code> </td> <td> U+02216 </td> <tr><td> <code title="">sext;</code> </td> <td> U+02736 </td> <tr><td> <code title="">sfr;</code> </td> <td> U+1D530 </td> <tr><td> <code title="">sfrown;</code> </td> <td> U+02322 </td> <tr><td> <code title="">sharp;</code> </td> <td> U+0266F </td> <tr><td> <code title="">shchcy;</code> </td> <td> U+00449 </td> <tr><td> <code title="">shcy;</code> </td> <td> U+00448 </td> <tr><td> <code title="">shortmid;</code> </td> <td> U+02223 </td> <tr><td> <code title="">shortparallel;</code> </td> <td> U+02225 </td> <tr><td> <code title="">shy;</code> </td> <td> U+000AD </td> <tr><td> <code title="">shy</code> </td> <td> U+000AD </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">sigma;</code> </td> <td> U+003C3 </td> <tr><td> <code title="">sigmaf;</code> </td> <td> U+003C2 </td> <tr><td> <code title="">sigmav;</code> </td> <td> U+003C2 </td> <tr><td> <code title="">sim;</code> </td> <td> U+0223C </td> <tr><td> <code title="">simdot;</code> </td> <td> U+02A6A </td> <tr><td> <code title="">sime;</code> </td> <td> U+02243 </td> <tr><td> <code title="">simeq;</code> </td> <td> U+02243 </td> <tr><td> <code title="">simg;</code> </td> <td> U+02A9E </td> <tr><td> <code title="">simgE;</code> </td> <td> U+02AA0 </td> <tr><td> <code title="">siml;</code> </td> <td> U+02A9D </td> <tr><td> <code title="">simlE;</code> </td> <td> U+02A9F </td> <tr><td> <code title="">simne;</code> </td> <td> U+02246 </td> <tr><td> <code title="">simplus;</code> </td> <td> U+02A24 </td> <tr><td> <code title="">simrarr;</code> </td> <td> U+02972 </td> <tr><td> <code title="">slarr;</code> </td> <td> U+02190 </td> <tr><td> <code title="">smallsetminus;</code> </td> <td> U+02216 </td> <tr><td> <code title="">smashp;</code> </td> <td> U+02A33 </td> <tr><td> <code title="">smeparsl;</code> </td> <td> U+029E4 </td> <tr><td> <code title="">smid;</code> </td> <td> U+02223 </td> <tr><td> <code title="">smile;</code> </td> <td> U+02323 </td> <tr><td> <code title="">smt;</code> </td> <td> U+02AAA </td> <tr><td> <code title="">smte;</code> </td> <td> U+02AAC </td> <tr><td> <code title="">softcy;</code> </td> <td> U+0044C </td> <tr><td> <code title="">sol;</code> </td> <td> U+0002F </td> <tr><td> <code title="">solb;</code> </td> <td> U+029C4 </td> <tr><td> <code title="">solbar;</code> </td> <td> U+0233F </td> <tr><td> <code title="">sopf;</code> </td> <td> U+1D564 </td> <tr><td> <code title="">spades;</code> </td> <td> U+02660 </td> <tr><td> <code title="">spadesuit;</code> </td> <td> U+02660 </td> <tr><td> <code title="">spar;</code> </td> <td> U+02225 </td> <tr><td> <code title="">sqcap;</code> </td> <td> U+02293 </td> <tr><td> <code title="">sqcup;</code> </td> <td> U+02294 </td> <tr><td> <code title="">sqsub;</code> </td> <td> U+0228F </td> <tr><td> <code title="">sqsube;</code> </td> <td> U+02291 </td> <tr><td> <code title="">sqsubset;</code> </td> <td> U+0228F </td> <tr><td> <code title="">sqsubseteq;</code> </td> <td> U+02291 </td> <tr><td> <code title="">sqsup;</code> </td> <td> U+02290 </td> <tr><td> <code title="">sqsupe;</code> </td> <td> U+02292 </td> <tr><td> <code title="">sqsupset;</code> </td> <td> U+02290 </td> <tr><td> <code title="">sqsupseteq;</code> </td> <td> U+02292 </td> <tr><td> <code title="">squ;</code> </td> <td> U+025A1 </td> <tr><td> <code title="">square;</code> </td> <td> U+025A1 </td> <tr><td> <code title="">squarf;</code> </td> <td> U+025AA </td> <tr><td> <code title="">squf;</code> </td> <td> U+025AA </td> <tr><td> <code title="">srarr;</code> </td> <td> U+02192 </td> <tr><td> <code title="">sscr;</code> </td> <td> U+1D4C8 </td> <tr><td> <code title="">ssetmn;</code> </td> <td> U+02216 </td> <tr><td> <code title="">ssmile;</code> </td> <td> U+02323 </td> <tr><td> <code title="">sstarf;</code> </td> <td> U+022C6 </td> <tr><td> <code title="">star;</code> </td> <td> U+02606 </td> <tr><td> <code title="">starf;</code> </td> <td> U+02605 </td> <tr><td> <code title="">straightepsilon;</code> </td> <td> U+003F5 </td> <tr><td> <code title="">straightphi;</code> </td> <td> U+003D5 </td> <tr><td> <code title="">strns;</code> </td> <td> U+000AF </td> <tr><td> <code title="">sub;</code> </td> <td> U+02282 </td> <tr><td> <code title="">subE;</code> </td> <td> U+02AC5 </td> <tr><td> <code title="">subdot;</code> </td> <td> U+02ABD </td> <tr><td> <code title="">sube;</code> </td> <td> U+02286 </td> <tr><td> <code title="">subedot;</code> </td> <td> U+02AC3 </td> <tr><td> <code title="">submult;</code> </td> <td> U+02AC1 </td> <tr><td> <code title="">subnE;</code> </td> <td> U+02ACB </td> <tr><td> <code title="">subne;</code> </td> <td> U+0228A </td> <tr><td> <code title="">subplus;</code> </td> <td> U+02ABF </td> <tr><td> <code title="">subrarr;</code> </td> <td> U+02979 </td> <tr><td> <code title="">subset;</code> </td> <td> U+02282 </td> <tr><td> <code title="">subseteq;</code> </td> <td> U+02286 </td> <tr><td> <code title="">subseteqq;</code> </td> <td> U+02AC5 </td> <tr><td> <code title="">subsetneq;</code> </td> <td> U+0228A </td> <tr><td> <code title="">subsetneqq;</code> </td> <td> U+02ACB </td> <tr><td> <code title="">subsim;</code> </td> <td> U+02AC7 </td> <tr><td> <code title="">subsub;</code> </td> <td> U+02AD5 </td> <tr><td> <code title="">subsup;</code> </td> <td> U+02AD3 </td> <tr><td> <code title="">succ;</code> </td> <td> U+0227B </td> <tr><td> <code title="">succapprox;</code> </td> <td> U+02AB8 </td> <tr><td> <code title="">succcurlyeq;</code> </td> <td> U+0227D </td> <tr><td> <code title="">succeq;</code> </td> <td> U+02AB0 </td> <tr><td> <code title="">succnapprox;</code> </td> <td> U+02ABA </td> <tr><td> <code title="">succneqq;</code> </td> <td> U+02AB6 </td> <tr><td> <code title="">succnsim;</code> </td> <td> U+022E9 </td> <tr><td> <code title="">succsim;</code> </td> <td> U+0227F </td> <tr><td> <code title="">sum;</code> </td> <td> U+02211 </td> <tr><td> <code title="">sung;</code> </td> <td> U+0266A </td> <tr><td> <code title="">sup1;</code> </td> <td> U+000B9 </td> <tr><td> <code title="">sup1</code> </td> <td> U+000B9 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">sup2;</code> </td> <td> U+000B2 </td> <tr><td> <code title="">sup2</code> </td> <td> U+000B2 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">sup3;</code> </td> <td> U+000B3 </td> <tr><td> <code title="">sup3</code> </td> <td> U+000B3 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">sup;</code> </td> <td> U+02283 </td> <tr><td> <code title="">supE;</code> </td> <td> U+02AC6 </td> <tr><td> <code title="">supdot;</code> </td> <td> U+02ABE </td> <tr><td> <code title="">supdsub;</code> </td> <td> U+02AD8 </td> <tr><td> <code title="">supe;</code> </td> <td> U+02287 </td> <tr><td> <code title="">supedot;</code> </td> <td> U+02AC4 </td> <tr><td> <code title="">suphsol;</code> </td> <td> U+027C9 </td> <tr><td> <code title="">suphsub;</code> </td> <td> U+02AD7 </td> <tr><td> <code title="">suplarr;</code> </td> <td> U+0297B </td> <tr><td> <code title="">supmult;</code> </td> <td> U+02AC2 </td> <tr><td> <code title="">supnE;</code> </td> <td> U+02ACC </td> <tr><td> <code title="">supne;</code> </td> <td> U+0228B </td> <tr><td> <code title="">supplus;</code> </td> <td> U+02AC0 </td> <tr><td> <code title="">supset;</code> </td> <td> U+02283 </td> <tr><td> <code title="">supseteq;</code> </td> <td> U+02287 </td> <tr><td> <code title="">supseteqq;</code> </td> <td> U+02AC6 </td> <tr><td> <code title="">supsetneq;</code> </td> <td> U+0228B </td> <tr><td> <code title="">supsetneqq;</code> </td> <td> U+02ACC </td> <tr><td> <code title="">supsim;</code> </td> <td> U+02AC8 </td> <tr><td> <code title="">supsub;</code> </td> <td> U+02AD4 </td> <tr><td> <code title="">supsup;</code> </td> <td> U+02AD6 </td> <tr><td> <code title="">swArr;</code> </td> <td> U+021D9 </td> <tr><td> <code title="">swarhk;</code> </td> <td> U+02926 </td> <tr><td> <code title="">swarr;</code> </td> <td> U+02199 </td> <tr><td> <code title="">swarrow;</code> </td> <td> U+02199 </td> <tr><td> <code title="">swnwar;</code> </td> <td> U+0292A </td> <tr><td> <code title="">szlig;</code> </td> <td> U+000DF </td> <tr><td> <code title="">szlig</code> </td> <td> U+000DF </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">target;</code> </td> <td> U+02316 </td> <tr><td> <code title="">tau;</code> </td> <td> U+003C4 </td> <tr><td> <code title="">tbrk;</code> </td> <td> U+023B4 </td> <tr><td> <code title="">tcaron;</code> </td> <td> U+00165 </td> <tr><td> <code title="">tcedil;</code> </td> <td> U+00163 </td> <tr><td> <code title="">tcy;</code> </td> <td> U+00442 </td> <tr><td> <code title="">tdot;</code> </td> <td> U+020DB </td> <tr><td> <code title="">telrec;</code> </td> <td> U+02315 </td> <tr><td> <code title="">tfr;</code> </td> <td> U+1D531 </td> <tr><td> <code title="">there4;</code> </td> <td> U+02234 </td> <tr><td> <code title="">therefore;</code> </td> <td> U+02234 </td> <tr><td> <code title="">theta;</code> </td> <td> U+003B8 </td> <tr><td> <code title="">thetasym;</code> </td> <td> U+003D1 </td> <tr><td> <code title="">thetav;</code> </td> <td> U+003D1 </td> <tr><td> <code title="">thickapprox;</code> </td> <td> U+02248 </td> <tr><td> <code title="">thicksim;</code> </td> <td> U+0223C </td> <tr><td> <code title="">thinsp;</code> </td> <td> U+02009 </td> <tr><td> <code title="">thkap;</code> </td> <td> U+02248 </td> <tr><td> <code title="">thksim;</code> </td> <td> U+0223C </td> <tr><td> <code title="">thorn;</code> </td> <td> U+000FE </td> <tr><td> <code title="">thorn</code> </td> <td> U+000FE </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">tilde;</code> </td> <td> U+002DC </td> <tr><td> <code title="">times;</code> </td> <td> U+000D7 </td> <tr><td> <code title="">times</code> </td> <td> U+000D7 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">timesb;</code> </td> <td> U+022A0 </td> <tr><td> <code title="">timesbar;</code> </td> <td> U+02A31 </td> <tr><td> <code title="">timesd;</code> </td> <td> U+02A30 </td> <tr><td> <code title="">tint;</code> </td> <td> U+0222D </td> <tr><td> <code title="">toea;</code> </td> <td> U+02928 </td> <tr><td> <code title="">top;</code> </td> <td> U+022A4 </td> <tr><td> <code title="">topbot;</code> </td> <td> U+02336 </td> <tr><td> <code title="">topcir;</code> </td> <td> U+02AF1 </td> <tr><td> <code title="">topf;</code> </td> <td> U+1D565 </td> <tr><td> <code title="">topfork;</code> </td> <td> U+02ADA </td> <tr><td> <code title="">tosa;</code> </td> <td> U+02929 </td> <tr><td> <code title="">tprime;</code> </td> <td> U+02034 </td> <tr><td> <code title="">trade;</code> </td> <td> U+02122 </td> <tr><td> <code title="">triangle;</code> </td> <td> U+025B5 </td> <tr><td> <code title="">triangledown;</code> </td> <td> U+025BF </td> <tr><td> <code title="">triangleleft;</code> </td> <td> U+025C3 </td> <tr><td> <code title="">trianglelefteq;</code> </td> <td> U+022B4 </td> <tr><td> <code title="">triangleq;</code> </td> <td> U+0225C </td> <tr><td> <code title="">triangleright;</code> </td> <td> U+025B9 </td> <tr><td> <code title="">trianglerighteq;</code> </td> <td> U+022B5 </td> <tr><td> <code title="">tridot;</code> </td> <td> U+025EC </td> <tr><td> <code title="">trie;</code> </td> <td> U+0225C </td> <tr><td> <code title="">triminus;</code> </td> <td> U+02A3A </td> <tr><td> <code title="">triplus;</code> </td> <td> U+02A39 </td> <tr><td> <code title="">trisb;</code> </td> <td> U+029CD </td> <tr><td> <code title="">tritime;</code> </td> <td> U+02A3B </td> <tr><td> <code title="">trpezium;</code> </td> <td> U+023E2 </td> <tr><td> <code title="">tscr;</code> </td> <td> U+1D4C9 </td> <tr><td> <code title="">tscy;</code> </td> <td> U+00446 </td> <tr><td> <code title="">tshcy;</code> </td> <td> U+0045B </td> <tr><td> <code title="">tstrok;</code> </td> <td> U+00167 </td> <tr><td> <code title="">twixt;</code> </td> <td> U+0226C </td> <tr><td> <code title="">twoheadleftarrow;</code> </td> <td> U+0219E </td> <tr><td> <code title="">twoheadrightarrow;</code> </td> <td> U+021A0 </td> <tr><td> <code title="">uArr;</code> </td> <td> U+021D1 </td> <tr><td> <code title="">uHar;</code> </td> <td> U+02963 </td> <tr><td> <code title="">uacute;</code> </td> <td> U+000FA </td> <tr><td> <code title="">uacute</code> </td> <td> U+000FA </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">uarr;</code> </td> <td> U+02191 </td> <tr><td> <code title="">ubrcy;</code> </td> <td> U+0045E </td> <tr><td> <code title="">ubreve;</code> </td> <td> U+0016D </td> <tr><td> <code title="">ucirc;</code> </td> <td> U+000FB </td> <tr><td> <code title="">ucirc</code> </td> <td> U+000FB </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">ucy;</code> </td> <td> U+00443 </td> <tr><td> <code title="">udarr;</code> </td> <td> U+021C5 </td> <tr><td> <code title="">udblac;</code> </td> <td> U+00171 </td> <tr><td> <code title="">udhar;</code> </td> <td> U+0296E </td> <tr><td> <code title="">ufisht;</code> </td> <td> U+0297E </td> <tr><td> <code title="">ufr;</code> </td> <td> U+1D532 </td> <tr><td> <code title="">ugrave;</code> </td> <td> U+000F9 </td> <tr><td> <code title="">ugrave</code> </td> <td> U+000F9 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">uharl;</code> </td> <td> U+021BF </td> <tr><td> <code title="">uharr;</code> </td> <td> U+021BE </td> <tr><td> <code title="">uhblk;</code> </td> <td> U+02580 </td> <tr><td> <code title="">ulcorn;</code> </td> <td> U+0231C </td> <tr><td> <code title="">ulcorner;</code> </td> <td> U+0231C </td> <tr><td> <code title="">ulcrop;</code> </td> <td> U+0230F </td> <tr><td> <code title="">ultri;</code> </td> <td> U+025F8 </td> <tr><td> <code title="">umacr;</code> </td> <td> U+0016B </td> <tr><td> <code title="">uml;</code> </td> <td> U+000A8 </td> <tr><td> <code title="">uml</code> </td> <td> U+000A8 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">uogon;</code> </td> <td> U+00173 </td> <tr><td> <code title="">uopf;</code> </td> <td> U+1D566 </td> <tr><td> <code title="">uparrow;</code> </td> <td> U+02191 </td> <tr><td> <code title="">updownarrow;</code> </td> <td> U+02195 </td> <tr><td> <code title="">upharpoonleft;</code> </td> <td> U+021BF </td> <tr><td> <code title="">upharpoonright;</code> </td> <td> U+021BE </td> <tr><td> <code title="">uplus;</code> </td> <td> U+0228E </td> <tr><td> <code title="">upsi;</code> </td> <td> U+003C5 </td> <tr><td> <code title="">upsih;</code> </td> <td> U+003D2 </td> <tr><td> <code title="">upsilon;</code> </td> <td> U+003C5 </td> <tr><td> <code title="">upuparrows;</code> </td> <td> U+021C8 </td> <tr><td> <code title="">urcorn;</code> </td> <td> U+0231D </td> <tr><td> <code title="">urcorner;</code> </td> <td> U+0231D </td> <tr><td> <code title="">urcrop;</code> </td> <td> U+0230E </td> <tr><td> <code title="">uring;</code> </td> <td> U+0016F </td> <tr><td> <code title="">urtri;</code> </td> <td> U+025F9 </td> <tr><td> <code title="">uscr;</code> </td> <td> U+1D4CA </td> <tr><td> <code title="">utdot;</code> </td> <td> U+022F0 </td> <tr><td> <code title="">utilde;</code> </td> <td> U+00169 </td> <tr><td> <code title="">utri;</code> </td> <td> U+025B5 </td> <tr><td> <code title="">utrif;</code> </td> <td> U+025B4 </td> <tr><td> <code title="">uuarr;</code> </td> <td> U+021C8 </td> <tr><td> <code title="">uuml;</code> </td> <td> U+000FC </td> <tr><td> <code title="">uuml</code> </td> <td> U+000FC </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">uwangle;</code> </td> <td> U+029A7 </td> <tr><td> <code title="">vArr;</code> </td> <td> U+021D5 </td> <tr><td> <code title="">vBar;</code> </td> <td> U+02AE8 </td> <tr><td> <code title="">vBarv;</code> </td> <td> U+02AE9 </td> <tr><td> <code title="">vDash;</code> </td> <td> U+022A8 </td> <tr><td> <code title="">vangrt;</code> </td> <td> U+0299C </td> <tr><td> <code title="">varepsilon;</code> </td> <td> U+003F5 </td> <tr><td> <code title="">varkappa;</code> </td> <td> U+003F0 </td> <tr><td> <code title="">varnothing;</code> </td> <td> U+02205 </td> <tr><td> <code title="">varphi;</code> </td> <td> U+003D5 </td> <tr><td> <code title="">varpi;</code> </td> <td> U+003D6 </td> <tr><td> <code title="">varpropto;</code> </td> <td> U+0221D </td> <tr><td> <code title="">varr;</code> </td> <td> U+02195 </td> <tr><td> <code title="">varrho;</code> </td> <td> U+003F1 </td> <tr><td> <code title="">varsigma;</code> </td> <td> U+003C2 </td> <tr><td> <code title="">vartheta;</code> </td> <td> U+003D1 </td> <tr><td> <code title="">vartriangleleft;</code> </td> <td> U+022B2 </td> <tr><td> <code title="">vartriangleright;</code> </td> <td> U+022B3 </td> <tr><td> <code title="">vcy;</code> </td> <td> U+00432 </td> <tr><td> <code title="">vdash;</code> </td> <td> U+022A2 </td> <tr><td> <code title="">vee;</code> </td> <td> U+02228 </td> <tr><td> <code title="">veebar;</code> </td> <td> U+022BB </td> <tr><td> <code title="">veeeq;</code> </td> <td> U+0225A </td> <tr><td> <code title="">vellip;</code> </td> <td> U+022EE </td> <tr><td> <code title="">verbar;</code> </td> <td> U+0007C </td> <tr><td> <code title="">vert;</code> </td> <td> U+0007C </td> <tr><td> <code title="">vfr;</code> </td> <td> U+1D533 </td> <tr><td> <code title="">vltri;</code> </td> <td> U+022B2 </td> <tr><td> <code title="">vopf;</code> </td> <td> U+1D567 </td> <tr><td> <code title="">vprop;</code> </td> <td> U+0221D </td> <tr><td> <code title="">vrtri;</code> </td> <td> U+022B3 </td> <tr><td> <code title="">vscr;</code> </td> <td> U+1D4CB </td> <tr><td> <code title="">vzigzag;</code> </td> <td> U+0299A </td> <tr><td> <code title="">wcirc;</code> </td> <td> U+00175 </td> <tr><td> <code title="">wedbar;</code> </td> <td> U+02A5F </td> <tr><td> <code title="">wedge;</code> </td> <td> U+02227 </td> <tr><td> <code title="">wedgeq;</code> </td> <td> U+02259 </td> <tr><td> <code title="">weierp;</code> </td> <td> U+02118 </td> <tr><td> <code title="">wfr;</code> </td> <td> U+1D534 </td> <tr><td> <code title="">wopf;</code> </td> <td> U+1D568 </td> <tr><td> <code title="">wp;</code> </td> <td> U+02118 </td> <tr><td> <code title="">wr;</code> </td> <td> U+02240 </td> <tr><td> <code title="">wreath;</code> </td> <td> U+02240 </td> <tr><td> <code title="">wscr;</code> </td> <td> U+1D4CC </td> <tr><td> <code title="">xcap;</code> </td> <td> U+022C2 </td> <tr><td> <code title="">xcirc;</code> </td> <td> U+025EF </td> <tr><td> <code title="">xcup;</code> </td> <td> U+022C3 </td> <tr><td> <code title="">xdtri;</code> </td> <td> U+025BD </td> <tr><td> <code title="">xfr;</code> </td> <td> U+1D535 </td> <tr><td> <code title="">xhArr;</code> </td> <td> U+027FA </td> <tr><td> <code title="">xharr;</code> </td> <td> U+027F7 </td> <tr><td> <code title="">xi;</code> </td> <td> U+003BE </td> <tr><td> <code title="">xlArr;</code> </td> <td> U+027F8 </td> <tr><td> <code title="">xlarr;</code> </td> <td> U+027F5 </td> <tr><td> <code title="">xmap;</code> </td> <td> U+027FC </td> <tr><td> <code title="">xnis;</code> </td> <td> U+022FB </td> <tr><td> <code title="">xodot;</code> </td> <td> U+02A00 </td> <tr><td> <code title="">xopf;</code> </td> <td> U+1D569 </td> <tr><td> <code title="">xoplus;</code> </td> <td> U+02A01 </td> <tr><td> <code title="">xotime;</code> </td> <td> U+02A02 </td> <tr><td> <code title="">xrArr;</code> </td> <td> U+027F9 </td> <tr><td> <code title="">xrarr;</code> </td> <td> U+027F6 </td> <tr><td> <code title="">xscr;</code> </td> <td> U+1D4CD </td> <tr><td> <code title="">xsqcup;</code> </td> <td> U+02A06 </td> <tr><td> <code title="">xuplus;</code> </td> <td> U+02A04 </td> <tr><td> <code title="">xutri;</code> </td> <td> U+025B3 </td> <tr><td> <code title="">xvee;</code> </td> <td> U+022C1 </td> <tr><td> <code title="">xwedge;</code> </td> <td> U+022C0 </td> <tr><td> <code title="">yacute;</code> </td> <td> U+000FD </td> <tr><td> <code title="">yacute</code> </td> <td> U+000FD </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">yacy;</code> </td> <td> U+0044F </td> <tr><td> <code title="">ycirc;</code> </td> <td> U+00177 </td> <tr><td> <code title="">ycy;</code> </td> <td> U+0044B </td> <tr><td> <code title="">yen;</code> </td> <td> U+000A5 </td> <tr><td> <code title="">yen</code> </td> <td> U+000A5 </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">yfr;</code> </td> <td> U+1D536 </td> <tr><td> <code title="">yicy;</code> </td> <td> U+00457 </td> <tr><td> <code title="">yopf;</code> </td> <td> U+1D56A </td> <tr><td> <code title="">yscr;</code> </td> <td> U+1D4CE </td> <tr><td> <code title="">yucy;</code> </td> <td> U+0044E </td> <tr><td> <code title="">yuml;</code> </td> <td> U+000FF </td> <tr><td> <code title="">yuml</code> </td> <td> U+000FF </td> </tr><!-- (invalid entity with missing semicolon for legacy support only) --><tr><td> <code title="">zacute;</code> </td> <td> U+0017A </td> <tr><td> <code title="">zcaron;</code> </td> <td> U+0017E </td> <tr><td> <code title="">zcy;</code> </td> <td> U+00437 </td> <tr><td> <code title="">zdot;</code> </td> <td> U+0017C </td> <tr><td> <code title="">zeetrf;</code> </td> <td> U+02128 </td> <tr><td> <code title="">zeta;</code> </td> <td> U+003B6 </td> <tr><td> <code title="">zfr;</code> </td> <td> U+1D537 </td> <tr><td> <code title="">zhcy;</code> </td> <td> U+00436 </td> <tr><td> <code title="">zigrarr;</code> </td> <td> U+021DD </td> <tr><td> <code title="">zopf;</code> </td> <td> U+1D56B </td> <tr><td> <code title="">zscr;</code> </td> <td> U+1D4CF </td> <tr><td> <code title="">zwj;</code> </td> <td> U+0200D </td> <tr><td> <code title="">zwnj;</code> </td> <td> U+0200C </td> </table>
-
- \ No newline at end of file
diff --git a/parser/html/javasrc/AttributeName.java b/parser/html/javasrc/AttributeName.java
deleted file mode 100644
index 7b889e71e..000000000
--- a/parser/html/javasrc/AttributeName.java
+++ /dev/null
@@ -1,2473 +0,0 @@
-/*
- * Copyright (c) 2008-2011 Mozilla Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.impl;
-
-import java.util.Arrays;
-
-import nu.validator.htmlparser.annotation.Local;
-import nu.validator.htmlparser.annotation.NoLength;
-import nu.validator.htmlparser.annotation.NsUri;
-import nu.validator.htmlparser.annotation.Prefix;
-import nu.validator.htmlparser.annotation.QName;
-import nu.validator.htmlparser.annotation.Virtual;
-import nu.validator.htmlparser.common.Interner;
-
-public final class AttributeName
-// Uncomment to regenerate
-// implements Comparable<AttributeName>
-{
- // [NOCPP[
-
- public static final int NCNAME_HTML = 1;
-
- public static final int NCNAME_FOREIGN = (1 << 1) | (1 << 2);
-
- public static final int NCNAME_LANG = (1 << 3);
-
- public static final int IS_XMLNS = (1 << 4);
-
- public static final int CASE_FOLDED = (1 << 5);
-
- public static final int BOOLEAN = (1 << 6);
-
- // ]NOCPP]
-
- /**
- * An array representing no namespace regardless of namespace mode (HTML,
- * SVG, MathML, lang-mapping HTML) used.
- */
- static final @NoLength @NsUri String[] ALL_NO_NS = { "", "", "",
- // [NOCPP[
- ""
- // ]NOCPP]
- };
-
- /**
- * An array that has no namespace for the HTML mode but the XMLNS namespace
- * for the SVG and MathML modes.
- */
- private static final @NoLength @NsUri String[] XMLNS_NS = { "",
- "http://www.w3.org/2000/xmlns/", "http://www.w3.org/2000/xmlns/",
- // [NOCPP[
- ""
- // ]NOCPP]
- };
-
- /**
- * An array that has no namespace for the HTML mode but the XML namespace
- * for the SVG and MathML modes.
- */
- private static final @NoLength @NsUri String[] XML_NS = { "",
- "http://www.w3.org/XML/1998/namespace",
- "http://www.w3.org/XML/1998/namespace",
- // [NOCPP[
- ""
- // ]NOCPP]
- };
-
- /**
- * An array that has no namespace for the HTML mode but the XLink namespace
- * for the SVG and MathML modes.
- */
- private static final @NoLength @NsUri String[] XLINK_NS = { "",
- "http://www.w3.org/1999/xlink", "http://www.w3.org/1999/xlink",
- // [NOCPP[
- ""
- // ]NOCPP]
- };
-
- // [NOCPP[
- /**
- * An array that has no namespace for the HTML, SVG and MathML modes but has
- * the XML namespace for the lang-mapping HTML mode.
- */
- private static final @NoLength @NsUri String[] LANG_NS = { "", "", "",
- "http://www.w3.org/XML/1998/namespace" };
-
- // ]NOCPP]
-
- /**
- * An array for no prefixes in any mode.
- */
- static final @NoLength @Prefix String[] ALL_NO_PREFIX = { null, null, null,
- // [NOCPP[
- null
- // ]NOCPP]
- };
-
- /**
- * An array for no prefixe in the HTML mode and the <code>xmlns</code>
- * prefix in the SVG and MathML modes.
- */
- private static final @NoLength @Prefix String[] XMLNS_PREFIX = { null,
- "xmlns", "xmlns",
- // [NOCPP[
- null
- // ]NOCPP]
- };
-
- /**
- * An array for no prefixe in the HTML mode and the <code>xlink</code>
- * prefix in the SVG and MathML modes.
- */
- private static final @NoLength @Prefix String[] XLINK_PREFIX = { null,
- "xlink", "xlink",
- // [NOCPP[
- null
- // ]NOCPP]
- };
-
- /**
- * An array for no prefixe in the HTML mode and the <code>xml</code> prefix
- * in the SVG and MathML modes.
- */
- private static final @NoLength @Prefix String[] XML_PREFIX = { null, "xml",
- "xml",
- // [NOCPP[
- null
- // ]NOCPP]
- };
-
- // [NOCPP[
-
- private static final @NoLength @Prefix String[] LANG_PREFIX = { null, null,
- null, "xml" };
-
- private static @QName String[] COMPUTE_QNAME(String[] local, String[] prefix) {
- @QName String[] arr = new String[4];
- for (int i = 0; i < arr.length; i++) {
- if (prefix[i] == null) {
- arr[i] = local[i];
- } else {
- arr[i] = (prefix[i] + ':' + local[i]).intern();
- }
- }
- return arr;
- }
-
- // ]NOCPP]
-
- /**
- * An initialization helper for having a one name in the SVG mode and
- * another name in the other modes.
- *
- * @param name
- * the name for the non-SVG modes
- * @param camel
- * the name for the SVG mode
- * @return the initialized name array
- */
- private static @NoLength @Local String[] SVG_DIFFERENT(@Local String name,
- @Local String camel) {
- @NoLength @Local String[] arr = new String[4];
- arr[0] = name;
- arr[1] = name;
- arr[2] = camel;
- // [NOCPP[
- arr[3] = name;
- // ]NOCPP]
- return arr;
- }
-
- /**
- * An initialization helper for having a one name in the MathML mode and
- * another name in the other modes.
- *
- * @param name
- * the name for the non-MathML modes
- * @param camel
- * the name for the MathML mode
- * @return the initialized name array
- */
- private static @NoLength @Local String[] MATH_DIFFERENT(@Local String name,
- @Local String camel) {
- @NoLength @Local String[] arr = new String[4];
- arr[0] = name;
- arr[1] = camel;
- arr[2] = name;
- // [NOCPP[
- arr[3] = name;
- // ]NOCPP]
- return arr;
- }
-
- /**
- * An initialization helper for having a different local name in the HTML
- * mode and the SVG and MathML modes.
- *
- * @param name
- * the name for the HTML mode
- * @param suffix
- * the name for the SVG and MathML modes
- * @return the initialized name array
- */
- private static @NoLength @Local String[] COLONIFIED_LOCAL(
- @Local String name, @Local String suffix) {
- @NoLength @Local String[] arr = new String[4];
- arr[0] = name;
- arr[1] = suffix;
- arr[2] = suffix;
- // [NOCPP[
- arr[3] = name;
- // ]NOCPP]
- return arr;
- }
-
- /**
- * An initialization helper for having the same local name in all modes.
- *
- * @param name
- * the name
- * @return the initialized name array
- */
- static @NoLength @Local String[] SAME_LOCAL(@Local String name) {
- @NoLength @Local String[] arr = new String[4];
- arr[0] = name;
- arr[1] = name;
- arr[2] = name;
- // [NOCPP[
- arr[3] = name;
- // ]NOCPP]
- return arr;
- }
-
- /**
- * Returns an attribute name by buffer.
- *
- * <p>
- * C++ ownership: The return value is either released by the caller if the
- * attribute is a duplicate or the ownership is transferred to
- * HtmlAttributes and released upon clearing or destroying that object.
- *
- * @param buf
- * the buffer
- * @param offset
- * ignored
- * @param length
- * length of data
- * @param checkNcName
- * whether to check ncnameness
- * @return an <code>AttributeName</code> corresponding to the argument data
- */
- static AttributeName nameByBuffer(@NoLength char[] buf, int offset,
- int length
- // [NOCPP[
- , boolean checkNcName
- // ]NOCPP]
- , Interner interner) {
- // XXX deal with offset
- int hash = AttributeName.bufToHash(buf, length);
- int index = Arrays.binarySearch(AttributeName.ATTRIBUTE_HASHES, hash);
- if (index < 0) {
- return AttributeName.createAttributeName(
- Portability.newLocalNameFromBuffer(buf, offset, length,
- interner)
- // [NOCPP[
- , checkNcName
- // ]NOCPP]
- );
- } else {
- AttributeName attributeName = AttributeName.ATTRIBUTE_NAMES[index];
- @Local String name = attributeName.getLocal(AttributeName.HTML);
- if (!Portability.localEqualsBuffer(name, buf, offset, length)) {
- return AttributeName.createAttributeName(
- Portability.newLocalNameFromBuffer(buf, offset, length,
- interner)
- // [NOCPP[
- , checkNcName
- // ]NOCPP]
- );
- }
- return attributeName;
- }
- }
-
- /**
- * This method has to return a unique integer for each well-known
- * lower-cased attribute name.
- *
- * @param buf
- * @param len
- * @return
- */
- private static int bufToHash(@NoLength char[] buf, int len) {
- int hash2 = 0;
- int hash = len;
- hash <<= 5;
- hash += buf[0] - 0x60;
- int j = len;
- for (int i = 0; i < 4 && j > 0; i++) {
- j--;
- hash <<= 5;
- hash += buf[j] - 0x60;
- hash2 <<= 6;
- hash2 += buf[i] - 0x5F;
- }
- return hash ^ hash2;
- }
-
- /**
- * The mode value for HTML.
- */
- public static final int HTML = 0;
-
- /**
- * The mode value for MathML.
- */
- public static final int MATHML = 1;
-
- /**
- * The mode value for SVG.
- */
- public static final int SVG = 2;
-
- // [NOCPP[
-
- /**
- * The mode value for lang-mapping HTML.
- */
- public static final int HTML_LANG = 3;
-
- // ]NOCPP]
-
- /**
- * The namespaces indexable by mode.
- */
- private final @NsUri @NoLength String[] uri;
-
- /**
- * The local names indexable by mode.
- */
- private final @Local @NoLength String[] local;
-
- /**
- * The prefixes indexably by mode.
- */
- private final @Prefix @NoLength String[] prefix;
-
- // [NOCPP[
-
- private final int flags;
-
- /**
- * The qnames indexable by mode.
- */
- private final @QName @NoLength String[] qName;
-
- // ]NOCPP]
-
- /**
- * The startup-time constructor.
- *
- * @param uri
- * the namespace
- * @param local
- * the local name
- * @param prefix
- * the prefix
- * @param ncname
- * the ncnameness
- * @param xmlns
- * whether this is an xmlns attribute
- */
- protected AttributeName(@NsUri @NoLength String[] uri,
- @Local @NoLength String[] local, @Prefix @NoLength String[] prefix
- // [NOCPP[
- , int flags
- // ]NOCPP]
- ) {
- this.uri = uri;
- this.local = local;
- this.prefix = prefix;
- // [NOCPP[
- this.qName = COMPUTE_QNAME(local, prefix);
- this.flags = flags;
- // ]NOCPP]
- }
-
- /**
- * Creates an <code>AttributeName</code> for a local name.
- *
- * @param name
- * the name
- * @param checkNcName
- * whether to check ncnameness
- * @return an <code>AttributeName</code>
- */
- private static AttributeName createAttributeName(@Local String name
- // [NOCPP[
- , boolean checkNcName
- // ]NOCPP]
- ) {
- // [NOCPP[
- int flags = NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG;
- if (name.startsWith("xmlns:")) {
- flags = IS_XMLNS;
- } else if (checkNcName && !NCName.isNCName(name)) {
- flags = 0;
- }
- // ]NOCPP]
- return new AttributeName(AttributeName.ALL_NO_NS,
- AttributeName.SAME_LOCAL(name), ALL_NO_PREFIX, flags);
- }
-
- /**
- * Deletes runtime-allocated instances in C++.
- */
- @Virtual void release() {
- // No-op in Java.
- // Implement as |delete this;| in subclass.
- }
-
- /**
- * The C++ destructor.
- */
- @SuppressWarnings("unused") @Virtual private void destructor() {
- Portability.deleteArray(local);
- }
-
- /**
- * Clones the attribute using an interner. Returns <code>this</code> in Java
- * and for non-dynamic instances in C++.
- *
- * @param interner
- * an interner
- * @return a clone
- */
- @Virtual public AttributeName cloneAttributeName(Interner interner) {
- return this;
- }
-
- // [NOCPP[
- /**
- * Creator for use when the XML violation policy requires an attribute name
- * to be changed.
- *
- * @param name
- * the name of the attribute to create
- */
- static AttributeName create(@Local String name) {
- return new AttributeName(AttributeName.ALL_NO_NS,
- AttributeName.SAME_LOCAL(name), ALL_NO_PREFIX,
- NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- }
-
- /**
- * Queries whether this name is an XML 1.0 4th ed. NCName.
- *
- * @param mode
- * the SVG/MathML/HTML mode
- * @return <code>true</code> if this is an NCName in the given mode
- */
- public boolean isNcName(int mode) {
- return (flags & (1 << mode)) != 0;
- }
-
- /**
- * Queries whether this is an <code>xmlns</code> attribute.
- *
- * @return <code>true</code> if this is an <code>xmlns</code> attribute
- */
- public boolean isXmlns() {
- return (flags & IS_XMLNS) != 0;
- }
-
- /**
- * Queries whether this attribute has a case-folded value in the HTML4 mode
- * of the parser.
- *
- * @return <code>true</code> if the value is case-folded
- */
- boolean isCaseFolded() {
- return (flags & CASE_FOLDED) != 0;
- }
-
- boolean isBoolean() {
- return (flags & BOOLEAN) != 0;
- }
-
- public @QName String getQName(int mode) {
- return qName[mode];
- }
-
- // ]NOCPP]
-
- public @NsUri String getUri(int mode) {
- return uri[mode];
- }
-
- public @Local String getLocal(int mode) {
- return local[mode];
- }
-
- public @Prefix String getPrefix(int mode) {
- return prefix[mode];
- }
-
- boolean equalsAnother(AttributeName another) {
- return this.getLocal(AttributeName.HTML) == another.getLocal(AttributeName.HTML);
- }
-
- // START CODE ONLY USED FOR GENERATING CODE uncomment to regenerate
-
-// /**
-// * @see java.lang.Object#toString()
-// */
-// @Override public String toString() {
-// return "(" + formatNs() + ", " + formatLocal() + ", " + formatPrefix()
-// + ", " + formatFlags() + ")";
-// }
-//
-// private String formatFlags() {
-// StringBuilder builder = new StringBuilder();
-// if ((flags & NCNAME_HTML) != 0) {
-// if (builder.length() != 0) {
-// builder.append(" | ");
-// }
-// builder.append("NCNAME_HTML");
-// }
-// if ((flags & NCNAME_FOREIGN) != 0) {
-// if (builder.length() != 0) {
-// builder.append(" | ");
-// }
-// builder.append("NCNAME_FOREIGN");
-// }
-// if ((flags & NCNAME_LANG) != 0) {
-// if (builder.length() != 0) {
-// builder.append(" | ");
-// }
-// builder.append("NCNAME_LANG");
-// }
-// if (isXmlns()) {
-// if (builder.length() != 0) {
-// builder.append(" | ");
-// }
-// builder.append("IS_XMLNS");
-// }
-// if (isCaseFolded()) {
-// if (builder.length() != 0) {
-// builder.append(" | ");
-// }
-// builder.append("CASE_FOLDED");
-// }
-// if (isBoolean()) {
-// if (builder.length() != 0) {
-// builder.append(" | ");
-// }
-// builder.append("BOOLEAN");
-// }
-// if (builder.length() == 0) {
-// return "0";
-// }
-// return builder.toString();
-// }
-//
-// public int compareTo(AttributeName other) {
-// int thisHash = this.hash();
-// int otherHash = other.hash();
-// if (thisHash < otherHash) {
-// return -1;
-// } else if (thisHash == otherHash) {
-// return 0;
-// } else {
-// return 1;
-// }
-// }
-//
-// private String formatPrefix() {
-// if (prefix[0] == null && prefix[1] == null && prefix[2] == null
-// && prefix[3] == null) {
-// return "ALL_NO_PREFIX";
-// } else if (prefix[0] == null && prefix[1] == prefix[2]
-// && prefix[3] == null) {
-// if ("xmlns".equals(prefix[1])) {
-// return "XMLNS_PREFIX";
-// } else if ("xml".equals(prefix[1])) {
-// return "XML_PREFIX";
-// } else if ("xlink".equals(prefix[1])) {
-// return "XLINK_PREFIX";
-// } else {
-// throw new IllegalStateException();
-// }
-// } else if (prefix[0] == null && prefix[1] == null && prefix[2] == null
-// && prefix[3] == "xml") {
-// return "LANG_PREFIX";
-// } else {
-// throw new IllegalStateException();
-// }
-// }
-//
-// private String formatLocal() {
-// if (local[0] == local[1] && local[0] == local[3]
-// && local[0] != local[2]) {
-// return "SVG_DIFFERENT(\"" + local[0] + "\", \"" + local[2] + "\")";
-// }
-// if (local[0] == local[2] && local[0] == local[3]
-// && local[0] != local[1]) {
-// return "MATH_DIFFERENT(\"" + local[0] + "\", \"" + local[1] + "\")";
-// }
-// if (local[0] == local[3] && local[1] == local[2]
-// && local[0] != local[1]) {
-// return "COLONIFIED_LOCAL(\"" + local[0] + "\", \"" + local[1]
-// + "\")";
-// }
-// for (int i = 1; i < local.length; i++) {
-// if (local[0] != local[i]) {
-// throw new IllegalStateException();
-// }
-// }
-// return "SAME_LOCAL(\"" + local[0] + "\")";
-// }
-//
-// private String formatNs() {
-// if (uri[0] == "" && uri[1] == "" && uri[2] == "" && uri[3] == "") {
-// return "ALL_NO_NS";
-// } else if (uri[0] == "" && uri[1] == uri[2] && uri[3] == "") {
-// if ("http://www.w3.org/2000/xmlns/".equals(uri[1])) {
-// return "XMLNS_NS";
-// } else if ("http://www.w3.org/XML/1998/namespace".equals(uri[1])) {
-// return "XML_NS";
-// } else if ("http://www.w3.org/1999/xlink".equals(uri[1])) {
-// return "XLINK_NS";
-// } else {
-// throw new IllegalStateException();
-// }
-// } else if (uri[0] == "" && uri[1] == "" && uri[2] == ""
-// && uri[3] == "http://www.w3.org/XML/1998/namespace") {
-// return "LANG_NS";
-// } else {
-// throw new IllegalStateException();
-// }
-// }
-//
-// private String constName() {
-// String name = getLocal(HTML);
-// char[] buf = new char[name.length()];
-// for (int i = 0; i < name.length(); i++) {
-// char c = name.charAt(i);
-// if (c == '-' || c == ':') {
-// buf[i] = '_';
-// } else if (c >= 'a' && c <= 'z') {
-// buf[i] = (char) (c - 0x20);
-// } else {
-// buf[i] = c;
-// }
-// }
-// return new String(buf);
-// }
-//
-// private int hash() {
-// String name = getLocal(HTML);
-// return bufToHash(name.toCharArray(), name.length());
-// }
-//
-// /**
-// * Regenerate self
-// *
-// * @param args
-// */
-// public static void main(String[] args) {
-// Arrays.sort(ATTRIBUTE_NAMES);
-// for (int i = 1; i < ATTRIBUTE_NAMES.length; i++) {
-// if (ATTRIBUTE_NAMES[i].hash() == ATTRIBUTE_NAMES[i - 1].hash()) {
-// System.err.println("Hash collision: "
-// + ATTRIBUTE_NAMES[i].getLocal(HTML) + ", "
-// + ATTRIBUTE_NAMES[i - 1].getLocal(HTML));
-// return;
-// }
-// }
-// for (int i = 0; i < ATTRIBUTE_NAMES.length; i++) {
-// AttributeName att = ATTRIBUTE_NAMES[i];
-// System.out.println("public static final AttributeName "
-// + att.constName() + " = new AttributeName" + att.toString()
-// + ";");
-// }
-// System.out.println("private final static @NoLength AttributeName[] ATTRIBUTE_NAMES = {");
-// for (int i = 0; i < ATTRIBUTE_NAMES.length; i++) {
-// AttributeName att = ATTRIBUTE_NAMES[i];
-// System.out.println(att.constName() + ",");
-// }
-// System.out.println("};");
-// System.out.println("private final static int[] ATTRIBUTE_HASHES = {");
-// for (int i = 0; i < ATTRIBUTE_NAMES.length; i++) {
-// AttributeName att = ATTRIBUTE_NAMES[i];
-// System.out.println(Integer.toString(att.hash()) + ",");
-// }
-// System.out.println("};");
-// }
-
- // START GENERATED CODE
- public static final AttributeName D = new AttributeName(ALL_NO_NS, SAME_LOCAL("d"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName K = new AttributeName(ALL_NO_NS, SAME_LOCAL("k"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName R = new AttributeName(ALL_NO_NS, SAME_LOCAL("r"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName X = new AttributeName(ALL_NO_NS, SAME_LOCAL("x"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName Y = new AttributeName(ALL_NO_NS, SAME_LOCAL("y"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName Z = new AttributeName(ALL_NO_NS, SAME_LOCAL("z"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName BY = new AttributeName(ALL_NO_NS, SAME_LOCAL("by"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CX = new AttributeName(ALL_NO_NS, SAME_LOCAL("cx"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CY = new AttributeName(ALL_NO_NS, SAME_LOCAL("cy"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName DX = new AttributeName(ALL_NO_NS, SAME_LOCAL("dx"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName DY = new AttributeName(ALL_NO_NS, SAME_LOCAL("dy"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName G2 = new AttributeName(ALL_NO_NS, SAME_LOCAL("g2"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName G1 = new AttributeName(ALL_NO_NS, SAME_LOCAL("g1"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FX = new AttributeName(ALL_NO_NS, SAME_LOCAL("fx"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FY = new AttributeName(ALL_NO_NS, SAME_LOCAL("fy"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName K4 = new AttributeName(ALL_NO_NS, SAME_LOCAL("k4"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName K2 = new AttributeName(ALL_NO_NS, SAME_LOCAL("k2"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName K3 = new AttributeName(ALL_NO_NS, SAME_LOCAL("k3"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName K1 = new AttributeName(ALL_NO_NS, SAME_LOCAL("k1"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ID = new AttributeName(ALL_NO_NS, SAME_LOCAL("id"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName IN = new AttributeName(ALL_NO_NS, SAME_LOCAL("in"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName U2 = new AttributeName(ALL_NO_NS, SAME_LOCAL("u2"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName U1 = new AttributeName(ALL_NO_NS, SAME_LOCAL("u1"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName RT = new AttributeName(ALL_NO_NS, SAME_LOCAL("rt"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName RX = new AttributeName(ALL_NO_NS, SAME_LOCAL("rx"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName RY = new AttributeName(ALL_NO_NS, SAME_LOCAL("ry"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName TO = new AttributeName(ALL_NO_NS, SAME_LOCAL("to"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName Y2 = new AttributeName(ALL_NO_NS, SAME_LOCAL("y2"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName Y1 = new AttributeName(ALL_NO_NS, SAME_LOCAL("y1"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName X1 = new AttributeName(ALL_NO_NS, SAME_LOCAL("x1"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName X2 = new AttributeName(ALL_NO_NS, SAME_LOCAL("x2"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ALT = new AttributeName(ALL_NO_NS, SAME_LOCAL("alt"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName DIR = new AttributeName(ALL_NO_NS, SAME_LOCAL("dir"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED);
- public static final AttributeName DUR = new AttributeName(ALL_NO_NS, SAME_LOCAL("dur"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName END = new AttributeName(ALL_NO_NS, SAME_LOCAL("end"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FOR = new AttributeName(ALL_NO_NS, SAME_LOCAL("for"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName IN2 = new AttributeName(ALL_NO_NS, SAME_LOCAL("in2"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MAX = new AttributeName(ALL_NO_NS, SAME_LOCAL("max"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MIN = new AttributeName(ALL_NO_NS, SAME_LOCAL("min"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName LOW = new AttributeName(ALL_NO_NS, SAME_LOCAL("low"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName REL = new AttributeName(ALL_NO_NS, SAME_LOCAL("rel"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName REV = new AttributeName(ALL_NO_NS, SAME_LOCAL("rev"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SRC = new AttributeName(ALL_NO_NS, SAME_LOCAL("src"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName AXIS = new AttributeName(ALL_NO_NS, SAME_LOCAL("axis"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ABBR = new AttributeName(ALL_NO_NS, SAME_LOCAL("abbr"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName BBOX = new AttributeName(ALL_NO_NS, SAME_LOCAL("bbox"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CITE = new AttributeName(ALL_NO_NS, SAME_LOCAL("cite"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CODE = new AttributeName(ALL_NO_NS, SAME_LOCAL("code"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName BIAS = new AttributeName(ALL_NO_NS, SAME_LOCAL("bias"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName COLS = new AttributeName(ALL_NO_NS, SAME_LOCAL("cols"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CLIP = new AttributeName(ALL_NO_NS, SAME_LOCAL("clip"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CHAR = new AttributeName(ALL_NO_NS, SAME_LOCAL("char"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName BASE = new AttributeName(ALL_NO_NS, SAME_LOCAL("base"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName EDGE = new AttributeName(ALL_NO_NS, SAME_LOCAL("edge"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName DATA = new AttributeName(ALL_NO_NS, SAME_LOCAL("data"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FILL = new AttributeName(ALL_NO_NS, SAME_LOCAL("fill"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FROM = new AttributeName(ALL_NO_NS, SAME_LOCAL("from"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FORM = new AttributeName(ALL_NO_NS, SAME_LOCAL("form"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FACE = new AttributeName(ALL_NO_NS, SAME_LOCAL("face"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName HIGH = new AttributeName(ALL_NO_NS, SAME_LOCAL("high"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName HREF = new AttributeName(ALL_NO_NS, SAME_LOCAL("href"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName OPEN = new AttributeName(ALL_NO_NS, SAME_LOCAL("open"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ICON = new AttributeName(ALL_NO_NS, SAME_LOCAL("icon"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName NAME = new AttributeName(ALL_NO_NS, SAME_LOCAL("name"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MODE = new AttributeName(ALL_NO_NS, SAME_LOCAL("mode"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MASK = new AttributeName(ALL_NO_NS, SAME_LOCAL("mask"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName LINK = new AttributeName(ALL_NO_NS, SAME_LOCAL("link"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName LANG = new AttributeName(LANG_NS, SAME_LOCAL("lang"), LANG_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName LOOP = new AttributeName(ALL_NO_NS, SAME_LOCAL("loop"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName LIST = new AttributeName(ALL_NO_NS, SAME_LOCAL("list"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName TYPE = new AttributeName(ALL_NO_NS, SAME_LOCAL("type"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED);
- public static final AttributeName WHEN = new AttributeName(ALL_NO_NS, SAME_LOCAL("when"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName WRAP = new AttributeName(ALL_NO_NS, SAME_LOCAL("wrap"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName TEXT = new AttributeName(ALL_NO_NS, SAME_LOCAL("text"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName PATH = new AttributeName(ALL_NO_NS, SAME_LOCAL("path"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName PING = new AttributeName(ALL_NO_NS, SAME_LOCAL("ping"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName REFX = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("refx", "refX"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName REFY = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("refy", "refY"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SIZE = new AttributeName(ALL_NO_NS, SAME_LOCAL("size"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SEED = new AttributeName(ALL_NO_NS, SAME_LOCAL("seed"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ROWS = new AttributeName(ALL_NO_NS, SAME_LOCAL("rows"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SPAN = new AttributeName(ALL_NO_NS, SAME_LOCAL("span"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName STEP = new AttributeName(ALL_NO_NS, SAME_LOCAL("step"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED);
- public static final AttributeName ROLE = new AttributeName(ALL_NO_NS, SAME_LOCAL("role"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName XREF = new AttributeName(ALL_NO_NS, SAME_LOCAL("xref"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ASYNC = new AttributeName(ALL_NO_NS, SAME_LOCAL("async"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED | BOOLEAN);
- public static final AttributeName ALINK = new AttributeName(ALL_NO_NS, SAME_LOCAL("alink"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ALIGN = new AttributeName(ALL_NO_NS, SAME_LOCAL("align"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED);
- public static final AttributeName CLOSE = new AttributeName(ALL_NO_NS, SAME_LOCAL("close"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName COLOR = new AttributeName(ALL_NO_NS, SAME_LOCAL("color"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CLASS = new AttributeName(ALL_NO_NS, SAME_LOCAL("class"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CLEAR = new AttributeName(ALL_NO_NS, SAME_LOCAL("clear"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED);
- public static final AttributeName BEGIN = new AttributeName(ALL_NO_NS, SAME_LOCAL("begin"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName DEPTH = new AttributeName(ALL_NO_NS, SAME_LOCAL("depth"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName DEFER = new AttributeName(ALL_NO_NS, SAME_LOCAL("defer"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED | BOOLEAN);
- public static final AttributeName FENCE = new AttributeName(ALL_NO_NS, SAME_LOCAL("fence"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FRAME = new AttributeName(ALL_NO_NS, SAME_LOCAL("frame"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED);
- public static final AttributeName ISMAP = new AttributeName(ALL_NO_NS, SAME_LOCAL("ismap"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED | BOOLEAN);
- public static final AttributeName ONEND = new AttributeName(ALL_NO_NS, SAME_LOCAL("onend"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName INDEX = new AttributeName(ALL_NO_NS, SAME_LOCAL("index"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ORDER = new AttributeName(ALL_NO_NS, SAME_LOCAL("order"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName OTHER = new AttributeName(ALL_NO_NS, SAME_LOCAL("other"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONCUT = new AttributeName(ALL_NO_NS, SAME_LOCAL("oncut"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName NARGS = new AttributeName(ALL_NO_NS, SAME_LOCAL("nargs"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MEDIA = new AttributeName(ALL_NO_NS, SAME_LOCAL("media"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName LABEL = new AttributeName(ALL_NO_NS, SAME_LOCAL("label"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName LOCAL = new AttributeName(ALL_NO_NS, SAME_LOCAL("local"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName WIDTH = new AttributeName(ALL_NO_NS, SAME_LOCAL("width"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName TITLE = new AttributeName(ALL_NO_NS, SAME_LOCAL("title"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName VLINK = new AttributeName(ALL_NO_NS, SAME_LOCAL("vlink"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName VALUE = new AttributeName(ALL_NO_NS, SAME_LOCAL("value"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SLOPE = new AttributeName(ALL_NO_NS, SAME_LOCAL("slope"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SHAPE = new AttributeName(ALL_NO_NS, SAME_LOCAL("shape"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED);
- public static final AttributeName SCOPE = new AttributeName(ALL_NO_NS, SAME_LOCAL("scope"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED);
- public static final AttributeName SCALE = new AttributeName(ALL_NO_NS, SAME_LOCAL("scale"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SPEED = new AttributeName(ALL_NO_NS, SAME_LOCAL("speed"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName STYLE = new AttributeName(ALL_NO_NS, SAME_LOCAL("style"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName RULES = new AttributeName(ALL_NO_NS, SAME_LOCAL("rules"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED);
- public static final AttributeName STEMH = new AttributeName(ALL_NO_NS, SAME_LOCAL("stemh"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SIZES = new AttributeName(ALL_NO_NS, SAME_LOCAL("sizes"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName STEMV = new AttributeName(ALL_NO_NS, SAME_LOCAL("stemv"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName START = new AttributeName(ALL_NO_NS, SAME_LOCAL("start"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName XMLNS = new AttributeName(XMLNS_NS, SAME_LOCAL("xmlns"), ALL_NO_PREFIX, IS_XMLNS);
- public static final AttributeName ACCEPT = new AttributeName(ALL_NO_NS, SAME_LOCAL("accept"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ACCENT = new AttributeName(ALL_NO_NS, SAME_LOCAL("accent"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ASCENT = new AttributeName(ALL_NO_NS, SAME_LOCAL("ascent"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ACTIVE = new AttributeName(ALL_NO_NS, SAME_LOCAL("active"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED | BOOLEAN);
- public static final AttributeName ALTIMG = new AttributeName(ALL_NO_NS, SAME_LOCAL("altimg"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ACTION = new AttributeName(ALL_NO_NS, SAME_LOCAL("action"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName BORDER = new AttributeName(ALL_NO_NS, SAME_LOCAL("border"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CURSOR = new AttributeName(ALL_NO_NS, SAME_LOCAL("cursor"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName COORDS = new AttributeName(ALL_NO_NS, SAME_LOCAL("coords"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FILTER = new AttributeName(ALL_NO_NS, SAME_LOCAL("filter"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FORMAT = new AttributeName(ALL_NO_NS, SAME_LOCAL("format"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName HIDDEN = new AttributeName(ALL_NO_NS, SAME_LOCAL("hidden"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName HSPACE = new AttributeName(ALL_NO_NS, SAME_LOCAL("hspace"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName HEIGHT = new AttributeName(ALL_NO_NS, SAME_LOCAL("height"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONMOVE = new AttributeName(ALL_NO_NS, SAME_LOCAL("onmove"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONLOAD = new AttributeName(ALL_NO_NS, SAME_LOCAL("onload"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONDRAG = new AttributeName(ALL_NO_NS, SAME_LOCAL("ondrag"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ORIGIN = new AttributeName(ALL_NO_NS, SAME_LOCAL("origin"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONZOOM = new AttributeName(ALL_NO_NS, SAME_LOCAL("onzoom"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONHELP = new AttributeName(ALL_NO_NS, SAME_LOCAL("onhelp"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONSTOP = new AttributeName(ALL_NO_NS, SAME_LOCAL("onstop"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONDROP = new AttributeName(ALL_NO_NS, SAME_LOCAL("ondrop"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONBLUR = new AttributeName(ALL_NO_NS, SAME_LOCAL("onblur"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName OBJECT = new AttributeName(ALL_NO_NS, SAME_LOCAL("object"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName OFFSET = new AttributeName(ALL_NO_NS, SAME_LOCAL("offset"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ORIENT = new AttributeName(ALL_NO_NS, SAME_LOCAL("orient"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONCOPY = new AttributeName(ALL_NO_NS, SAME_LOCAL("oncopy"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName NOWRAP = new AttributeName(ALL_NO_NS, SAME_LOCAL("nowrap"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED | BOOLEAN);
- public static final AttributeName NOHREF = new AttributeName(ALL_NO_NS, SAME_LOCAL("nohref"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED | BOOLEAN);
- public static final AttributeName MACROS = new AttributeName(ALL_NO_NS, SAME_LOCAL("macros"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName METHOD = new AttributeName(ALL_NO_NS, SAME_LOCAL("method"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED);
- public static final AttributeName LOWSRC = new AttributeName(ALL_NO_NS, SAME_LOCAL("lowsrc"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName LSPACE = new AttributeName(ALL_NO_NS, SAME_LOCAL("lspace"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName LQUOTE = new AttributeName(ALL_NO_NS, SAME_LOCAL("lquote"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName USEMAP = new AttributeName(ALL_NO_NS, SAME_LOCAL("usemap"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName WIDTHS = new AttributeName(ALL_NO_NS, SAME_LOCAL("widths"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName TARGET = new AttributeName(ALL_NO_NS, SAME_LOCAL("target"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName VALUES = new AttributeName(ALL_NO_NS, SAME_LOCAL("values"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName VALIGN = new AttributeName(ALL_NO_NS, SAME_LOCAL("valign"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED);
- public static final AttributeName VSPACE = new AttributeName(ALL_NO_NS, SAME_LOCAL("vspace"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName POSTER = new AttributeName(ALL_NO_NS, SAME_LOCAL("poster"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName POINTS = new AttributeName(ALL_NO_NS, SAME_LOCAL("points"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName PROMPT = new AttributeName(ALL_NO_NS, SAME_LOCAL("prompt"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SRCDOC = new AttributeName(ALL_NO_NS, SAME_LOCAL("srcdoc"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SCOPED = new AttributeName(ALL_NO_NS, SAME_LOCAL("scoped"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName STRING = new AttributeName(ALL_NO_NS, SAME_LOCAL("string"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SCHEME = new AttributeName(ALL_NO_NS, SAME_LOCAL("scheme"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName STROKE = new AttributeName(ALL_NO_NS, SAME_LOCAL("stroke"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName RADIUS = new AttributeName(ALL_NO_NS, SAME_LOCAL("radius"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName RESULT = new AttributeName(ALL_NO_NS, SAME_LOCAL("result"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName REPEAT = new AttributeName(ALL_NO_NS, SAME_LOCAL("repeat"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SRCSET = new AttributeName(ALL_NO_NS, SAME_LOCAL("srcset"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName RSPACE = new AttributeName(ALL_NO_NS, SAME_LOCAL("rspace"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ROTATE = new AttributeName(ALL_NO_NS, SAME_LOCAL("rotate"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName RQUOTE = new AttributeName(ALL_NO_NS, SAME_LOCAL("rquote"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ALTTEXT = new AttributeName(ALL_NO_NS, SAME_LOCAL("alttext"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARCHIVE = new AttributeName(ALL_NO_NS, SAME_LOCAL("archive"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName AZIMUTH = new AttributeName(ALL_NO_NS, SAME_LOCAL("azimuth"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CLOSURE = new AttributeName(ALL_NO_NS, SAME_LOCAL("closure"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CHECKED = new AttributeName(ALL_NO_NS, SAME_LOCAL("checked"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED | BOOLEAN);
- public static final AttributeName CLASSID = new AttributeName(ALL_NO_NS, SAME_LOCAL("classid"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CHAROFF = new AttributeName(ALL_NO_NS, SAME_LOCAL("charoff"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName BGCOLOR = new AttributeName(ALL_NO_NS, SAME_LOCAL("bgcolor"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName COLSPAN = new AttributeName(ALL_NO_NS, SAME_LOCAL("colspan"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CHARSET = new AttributeName(ALL_NO_NS, SAME_LOCAL("charset"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName COMPACT = new AttributeName(ALL_NO_NS, SAME_LOCAL("compact"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED | BOOLEAN);
- public static final AttributeName CONTENT = new AttributeName(ALL_NO_NS, SAME_LOCAL("content"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ENCTYPE = new AttributeName(ALL_NO_NS, SAME_LOCAL("enctype"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED);
- public static final AttributeName DATASRC = new AttributeName(ALL_NO_NS, SAME_LOCAL("datasrc"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName DATAFLD = new AttributeName(ALL_NO_NS, SAME_LOCAL("datafld"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName DECLARE = new AttributeName(ALL_NO_NS, SAME_LOCAL("declare"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED | BOOLEAN);
- public static final AttributeName DISPLAY = new AttributeName(ALL_NO_NS, SAME_LOCAL("display"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName DIVISOR = new AttributeName(ALL_NO_NS, SAME_LOCAL("divisor"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName DEFAULT = new AttributeName(ALL_NO_NS, SAME_LOCAL("default"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED | BOOLEAN);
- public static final AttributeName DESCENT = new AttributeName(ALL_NO_NS, SAME_LOCAL("descent"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName KERNING = new AttributeName(ALL_NO_NS, SAME_LOCAL("kerning"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName HANGING = new AttributeName(ALL_NO_NS, SAME_LOCAL("hanging"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName HEADERS = new AttributeName(ALL_NO_NS, SAME_LOCAL("headers"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONPASTE = new AttributeName(ALL_NO_NS, SAME_LOCAL("onpaste"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONCLICK = new AttributeName(ALL_NO_NS, SAME_LOCAL("onclick"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName OPTIMUM = new AttributeName(ALL_NO_NS, SAME_LOCAL("optimum"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONBEGIN = new AttributeName(ALL_NO_NS, SAME_LOCAL("onbegin"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONKEYUP = new AttributeName(ALL_NO_NS, SAME_LOCAL("onkeyup"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONFOCUS = new AttributeName(ALL_NO_NS, SAME_LOCAL("onfocus"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONERROR = new AttributeName(ALL_NO_NS, SAME_LOCAL("onerror"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONINPUT = new AttributeName(ALL_NO_NS, SAME_LOCAL("oninput"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONABORT = new AttributeName(ALL_NO_NS, SAME_LOCAL("onabort"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONSTART = new AttributeName(ALL_NO_NS, SAME_LOCAL("onstart"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONRESET = new AttributeName(ALL_NO_NS, SAME_LOCAL("onreset"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName OPACITY = new AttributeName(ALL_NO_NS, SAME_LOCAL("opacity"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName NOSHADE = new AttributeName(ALL_NO_NS, SAME_LOCAL("noshade"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED | BOOLEAN);
- public static final AttributeName MINSIZE = new AttributeName(ALL_NO_NS, SAME_LOCAL("minsize"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MAXSIZE = new AttributeName(ALL_NO_NS, SAME_LOCAL("maxsize"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName LARGEOP = new AttributeName(ALL_NO_NS, SAME_LOCAL("largeop"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName UNICODE = new AttributeName(ALL_NO_NS, SAME_LOCAL("unicode"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName TARGETX = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("targetx", "targetX"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName TARGETY = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("targety", "targetY"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName VIEWBOX = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("viewbox", "viewBox"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName VERSION = new AttributeName(ALL_NO_NS, SAME_LOCAL("version"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName PATTERN = new AttributeName(ALL_NO_NS, SAME_LOCAL("pattern"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName PROFILE = new AttributeName(ALL_NO_NS, SAME_LOCAL("profile"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SPACING = new AttributeName(ALL_NO_NS, SAME_LOCAL("spacing"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName RESTART = new AttributeName(ALL_NO_NS, SAME_LOCAL("restart"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ROWSPAN = new AttributeName(ALL_NO_NS, SAME_LOCAL("rowspan"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SANDBOX = new AttributeName(ALL_NO_NS, SAME_LOCAL("sandbox"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SUMMARY = new AttributeName(ALL_NO_NS, SAME_LOCAL("summary"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName STANDBY = new AttributeName(ALL_NO_NS, SAME_LOCAL("standby"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName REPLACE = new AttributeName(ALL_NO_NS, SAME_LOCAL("replace"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED);
- public static final AttributeName AUTOPLAY = new AttributeName(ALL_NO_NS, SAME_LOCAL("autoplay"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ADDITIVE = new AttributeName(ALL_NO_NS, SAME_LOCAL("additive"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CALCMODE = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("calcmode", "calcMode"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CODETYPE = new AttributeName(ALL_NO_NS, SAME_LOCAL("codetype"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CODEBASE = new AttributeName(ALL_NO_NS, SAME_LOCAL("codebase"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CONTROLS = new AttributeName(ALL_NO_NS, SAME_LOCAL("controls"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName BEVELLED = new AttributeName(ALL_NO_NS, SAME_LOCAL("bevelled"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName BASELINE = new AttributeName(ALL_NO_NS, SAME_LOCAL("baseline"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName EXPONENT = new AttributeName(ALL_NO_NS, SAME_LOCAL("exponent"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName EDGEMODE = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("edgemode", "edgeMode"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ENCODING = new AttributeName(ALL_NO_NS, SAME_LOCAL("encoding"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName GLYPHREF = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("glyphref", "glyphRef"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName DATETIME = new AttributeName(ALL_NO_NS, SAME_LOCAL("datetime"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName DISABLED = new AttributeName(ALL_NO_NS, SAME_LOCAL("disabled"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED | BOOLEAN);
- public static final AttributeName FONTSIZE = new AttributeName(ALL_NO_NS, SAME_LOCAL("fontsize"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName KEYTIMES = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("keytimes", "keyTimes"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName PANOSE_1 = new AttributeName(ALL_NO_NS, SAME_LOCAL("panose-1"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName HREFLANG = new AttributeName(ALL_NO_NS, SAME_LOCAL("hreflang"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONRESIZE = new AttributeName(ALL_NO_NS, SAME_LOCAL("onresize"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONCHANGE = new AttributeName(ALL_NO_NS, SAME_LOCAL("onchange"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONBOUNCE = new AttributeName(ALL_NO_NS, SAME_LOCAL("onbounce"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONUNLOAD = new AttributeName(ALL_NO_NS, SAME_LOCAL("onunload"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONFINISH = new AttributeName(ALL_NO_NS, SAME_LOCAL("onfinish"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONSCROLL = new AttributeName(ALL_NO_NS, SAME_LOCAL("onscroll"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName OPERATOR = new AttributeName(ALL_NO_NS, SAME_LOCAL("operator"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName OVERFLOW = new AttributeName(ALL_NO_NS, SAME_LOCAL("overflow"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONSUBMIT = new AttributeName(ALL_NO_NS, SAME_LOCAL("onsubmit"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONREPEAT = new AttributeName(ALL_NO_NS, SAME_LOCAL("onrepeat"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONSELECT = new AttributeName(ALL_NO_NS, SAME_LOCAL("onselect"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName NOTATION = new AttributeName(ALL_NO_NS, SAME_LOCAL("notation"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName NORESIZE = new AttributeName(ALL_NO_NS, SAME_LOCAL("noresize"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED | BOOLEAN);
- public static final AttributeName MANIFEST = new AttributeName(ALL_NO_NS, SAME_LOCAL("manifest"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MATHSIZE = new AttributeName(ALL_NO_NS, SAME_LOCAL("mathsize"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MULTIPLE = new AttributeName(ALL_NO_NS, SAME_LOCAL("multiple"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED | BOOLEAN);
- public static final AttributeName LONGDESC = new AttributeName(ALL_NO_NS, SAME_LOCAL("longdesc"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName LANGUAGE = new AttributeName(ALL_NO_NS, SAME_LOCAL("language"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName TEMPLATE = new AttributeName(ALL_NO_NS, SAME_LOCAL("template"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName TABINDEX = new AttributeName(ALL_NO_NS, SAME_LOCAL("tabindex"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName PROPERTY = new AttributeName(ALL_NO_NS, SAME_LOCAL("property"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName READONLY = new AttributeName(ALL_NO_NS, SAME_LOCAL("readonly"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED | BOOLEAN);
- public static final AttributeName SELECTED = new AttributeName(ALL_NO_NS, SAME_LOCAL("selected"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED | BOOLEAN);
- public static final AttributeName ROWLINES = new AttributeName(ALL_NO_NS, SAME_LOCAL("rowlines"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SEAMLESS = new AttributeName(ALL_NO_NS, SAME_LOCAL("seamless"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ROWALIGN = new AttributeName(ALL_NO_NS, SAME_LOCAL("rowalign"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName STRETCHY = new AttributeName(ALL_NO_NS, SAME_LOCAL("stretchy"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName REQUIRED = new AttributeName(ALL_NO_NS, SAME_LOCAL("required"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED | BOOLEAN);
- public static final AttributeName XML_BASE = new AttributeName(XML_NS, COLONIFIED_LOCAL("xml:base", "base"), XML_PREFIX, NCNAME_FOREIGN);
- public static final AttributeName XML_LANG = new AttributeName(XML_NS, COLONIFIED_LOCAL("xml:lang", "lang"), XML_PREFIX, NCNAME_FOREIGN);
- public static final AttributeName X_HEIGHT = new AttributeName(ALL_NO_NS, SAME_LOCAL("x-height"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_OWNS = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-owns"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName AUTOFOCUS = new AttributeName(ALL_NO_NS, SAME_LOCAL("autofocus"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED | BOOLEAN);
- public static final AttributeName ARIA_SORT = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-sort"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ACCESSKEY = new AttributeName(ALL_NO_NS, SAME_LOCAL("accesskey"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_BUSY = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-busy"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_GRAB = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-grab"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName AMPLITUDE = new AttributeName(ALL_NO_NS, SAME_LOCAL("amplitude"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_LIVE = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-live"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CLIP_RULE = new AttributeName(ALL_NO_NS, SAME_LOCAL("clip-rule"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CLIP_PATH = new AttributeName(ALL_NO_NS, SAME_LOCAL("clip-path"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName EQUALROWS = new AttributeName(ALL_NO_NS, SAME_LOCAL("equalrows"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ELEVATION = new AttributeName(ALL_NO_NS, SAME_LOCAL("elevation"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName DIRECTION = new AttributeName(ALL_NO_NS, SAME_LOCAL("direction"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName DRAGGABLE = new AttributeName(ALL_NO_NS, SAME_LOCAL("draggable"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FILL_RULE = new AttributeName(ALL_NO_NS, SAME_LOCAL("fill-rule"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FONTSTYLE = new AttributeName(ALL_NO_NS, SAME_LOCAL("fontstyle"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FONT_SIZE = new AttributeName(ALL_NO_NS, SAME_LOCAL("font-size"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName KEYSYSTEM = new AttributeName(ALL_NO_NS, SAME_LOCAL("keysystem"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName KEYPOINTS = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("keypoints", "keyPoints"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName HIDEFOCUS = new AttributeName(ALL_NO_NS, SAME_LOCAL("hidefocus"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONMESSAGE = new AttributeName(ALL_NO_NS, SAME_LOCAL("onmessage"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName INTERCEPT = new AttributeName(ALL_NO_NS, SAME_LOCAL("intercept"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONDRAGEND = new AttributeName(ALL_NO_NS, SAME_LOCAL("ondragend"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONMOVEEND = new AttributeName(ALL_NO_NS, SAME_LOCAL("onmoveend"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONINVALID = new AttributeName(ALL_NO_NS, SAME_LOCAL("oninvalid"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName INTEGRITY = new AttributeName(ALL_NO_NS, SAME_LOCAL("integrity"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONKEYDOWN = new AttributeName(ALL_NO_NS, SAME_LOCAL("onkeydown"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONFOCUSIN = new AttributeName(ALL_NO_NS, SAME_LOCAL("onfocusin"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONMOUSEUP = new AttributeName(ALL_NO_NS, SAME_LOCAL("onmouseup"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName INPUTMODE = new AttributeName(ALL_NO_NS, SAME_LOCAL("inputmode"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONROWEXIT = new AttributeName(ALL_NO_NS, SAME_LOCAL("onrowexit"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MATHCOLOR = new AttributeName(ALL_NO_NS, SAME_LOCAL("mathcolor"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MASKUNITS = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("maskunits", "maskUnits"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MAXLENGTH = new AttributeName(ALL_NO_NS, SAME_LOCAL("maxlength"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName LINEBREAK = new AttributeName(ALL_NO_NS, SAME_LOCAL("linebreak"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName TRANSFORM = new AttributeName(ALL_NO_NS, SAME_LOCAL("transform"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName V_HANGING = new AttributeName(ALL_NO_NS, SAME_LOCAL("v-hanging"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName VALUETYPE = new AttributeName(ALL_NO_NS, SAME_LOCAL("valuetype"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED);
- public static final AttributeName POINTSATZ = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("pointsatz", "pointsAtZ"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName POINTSATX = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("pointsatx", "pointsAtX"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName POINTSATY = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("pointsaty", "pointsAtY"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SYMMETRIC = new AttributeName(ALL_NO_NS, SAME_LOCAL("symmetric"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SCROLLING = new AttributeName(ALL_NO_NS, SAME_LOCAL("scrolling"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED);
- public static final AttributeName REPEATDUR = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("repeatdur", "repeatDur"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SELECTION = new AttributeName(ALL_NO_NS, SAME_LOCAL("selection"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SEPARATOR = new AttributeName(ALL_NO_NS, SAME_LOCAL("separator"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName XML_SPACE = new AttributeName(XML_NS, COLONIFIED_LOCAL("xml:space", "space"), XML_PREFIX, NCNAME_FOREIGN);
- public static final AttributeName AUTOSUBMIT = new AttributeName(ALL_NO_NS, SAME_LOCAL("autosubmit"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED | BOOLEAN);
- public static final AttributeName ALPHABETIC = new AttributeName(ALL_NO_NS, SAME_LOCAL("alphabetic"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ACTIONTYPE = new AttributeName(ALL_NO_NS, SAME_LOCAL("actiontype"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ACCUMULATE = new AttributeName(ALL_NO_NS, SAME_LOCAL("accumulate"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_LEVEL = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-level"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName COLUMNSPAN = new AttributeName(ALL_NO_NS, SAME_LOCAL("columnspan"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CAP_HEIGHT = new AttributeName(ALL_NO_NS, SAME_LOCAL("cap-height"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName BACKGROUND = new AttributeName(ALL_NO_NS, SAME_LOCAL("background"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName GLYPH_NAME = new AttributeName(ALL_NO_NS, SAME_LOCAL("glyph-name"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName GROUPALIGN = new AttributeName(ALL_NO_NS, SAME_LOCAL("groupalign"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FONTFAMILY = new AttributeName(ALL_NO_NS, SAME_LOCAL("fontfamily"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FONTWEIGHT = new AttributeName(ALL_NO_NS, SAME_LOCAL("fontweight"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FONT_STYLE = new AttributeName(ALL_NO_NS, SAME_LOCAL("font-style"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName KEYSPLINES = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("keysplines", "keySplines"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName HTTP_EQUIV = new AttributeName(ALL_NO_NS, SAME_LOCAL("http-equiv"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONACTIVATE = new AttributeName(ALL_NO_NS, SAME_LOCAL("onactivate"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName OCCURRENCE = new AttributeName(ALL_NO_NS, SAME_LOCAL("occurrence"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName IRRELEVANT = new AttributeName(ALL_NO_NS, SAME_LOCAL("irrelevant"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONDBLCLICK = new AttributeName(ALL_NO_NS, SAME_LOCAL("ondblclick"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONDRAGDROP = new AttributeName(ALL_NO_NS, SAME_LOCAL("ondragdrop"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONKEYPRESS = new AttributeName(ALL_NO_NS, SAME_LOCAL("onkeypress"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONROWENTER = new AttributeName(ALL_NO_NS, SAME_LOCAL("onrowenter"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONDRAGOVER = new AttributeName(ALL_NO_NS, SAME_LOCAL("ondragover"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONFOCUSOUT = new AttributeName(ALL_NO_NS, SAME_LOCAL("onfocusout"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONMOUSEOUT = new AttributeName(ALL_NO_NS, SAME_LOCAL("onmouseout"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName NUMOCTAVES = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("numoctaves", "numOctaves"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MARKER_MID = new AttributeName(ALL_NO_NS, SAME_LOCAL("marker-mid"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MARKER_END = new AttributeName(ALL_NO_NS, SAME_LOCAL("marker-end"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName TEXTLENGTH = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("textlength", "textLength"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName VISIBILITY = new AttributeName(ALL_NO_NS, SAME_LOCAL("visibility"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName VIEWTARGET = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("viewtarget", "viewTarget"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName VERT_ADV_Y = new AttributeName(ALL_NO_NS, SAME_LOCAL("vert-adv-y"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName PATHLENGTH = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("pathlength", "pathLength"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName REPEAT_MAX = new AttributeName(ALL_NO_NS, SAME_LOCAL("repeat-max"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName RADIOGROUP = new AttributeName(ALL_NO_NS, SAME_LOCAL("radiogroup"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName STOP_COLOR = new AttributeName(ALL_NO_NS, SAME_LOCAL("stop-color"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SEPARATORS = new AttributeName(ALL_NO_NS, SAME_LOCAL("separators"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName REPEAT_MIN = new AttributeName(ALL_NO_NS, SAME_LOCAL("repeat-min"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ROWSPACING = new AttributeName(ALL_NO_NS, SAME_LOCAL("rowspacing"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ZOOMANDPAN = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("zoomandpan", "zoomAndPan"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName XLINK_TYPE = new AttributeName(XLINK_NS, COLONIFIED_LOCAL("xlink:type", "type"), XLINK_PREFIX, NCNAME_FOREIGN);
- public static final AttributeName XLINK_ROLE = new AttributeName(XLINK_NS, COLONIFIED_LOCAL("xlink:role", "role"), XLINK_PREFIX, NCNAME_FOREIGN);
- public static final AttributeName XLINK_HREF = new AttributeName(XLINK_NS, COLONIFIED_LOCAL("xlink:href", "href"), XLINK_PREFIX, NCNAME_FOREIGN);
- public static final AttributeName XLINK_SHOW = new AttributeName(XLINK_NS, COLONIFIED_LOCAL("xlink:show", "show"), XLINK_PREFIX, NCNAME_FOREIGN);
- public static final AttributeName ACCENTUNDER = new AttributeName(ALL_NO_NS, SAME_LOCAL("accentunder"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_SECRET = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-secret"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_ATOMIC = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-atomic"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_HIDDEN = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-hidden"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_FLOWTO = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-flowto"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARABIC_FORM = new AttributeName(ALL_NO_NS, SAME_LOCAL("arabic-form"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CELLPADDING = new AttributeName(ALL_NO_NS, SAME_LOCAL("cellpadding"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CELLSPACING = new AttributeName(ALL_NO_NS, SAME_LOCAL("cellspacing"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName COLUMNWIDTH = new AttributeName(ALL_NO_NS, SAME_LOCAL("columnwidth"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CROSSORIGIN = new AttributeName(ALL_NO_NS, SAME_LOCAL("crossorigin"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName COLUMNALIGN = new AttributeName(ALL_NO_NS, SAME_LOCAL("columnalign"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName COLUMNLINES = new AttributeName(ALL_NO_NS, SAME_LOCAL("columnlines"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CONTEXTMENU = new AttributeName(ALL_NO_NS, SAME_LOCAL("contextmenu"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName BASEPROFILE = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("baseprofile", "baseProfile"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FONT_FAMILY = new AttributeName(ALL_NO_NS, SAME_LOCAL("font-family"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FRAMEBORDER = new AttributeName(ALL_NO_NS, SAME_LOCAL("frameborder"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FILTERUNITS = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("filterunits", "filterUnits"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FLOOD_COLOR = new AttributeName(ALL_NO_NS, SAME_LOCAL("flood-color"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FONT_WEIGHT = new AttributeName(ALL_NO_NS, SAME_LOCAL("font-weight"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName HORIZ_ADV_X = new AttributeName(ALL_NO_NS, SAME_LOCAL("horiz-adv-x"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONDRAGLEAVE = new AttributeName(ALL_NO_NS, SAME_LOCAL("ondragleave"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONMOUSEMOVE = new AttributeName(ALL_NO_NS, SAME_LOCAL("onmousemove"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ORIENTATION = new AttributeName(ALL_NO_NS, SAME_LOCAL("orientation"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONMOUSEDOWN = new AttributeName(ALL_NO_NS, SAME_LOCAL("onmousedown"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONMOUSEOVER = new AttributeName(ALL_NO_NS, SAME_LOCAL("onmouseover"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONDRAGENTER = new AttributeName(ALL_NO_NS, SAME_LOCAL("ondragenter"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName IDEOGRAPHIC = new AttributeName(ALL_NO_NS, SAME_LOCAL("ideographic"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONBEFORECUT = new AttributeName(ALL_NO_NS, SAME_LOCAL("onbeforecut"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONFORMINPUT = new AttributeName(ALL_NO_NS, SAME_LOCAL("onforminput"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONDRAGSTART = new AttributeName(ALL_NO_NS, SAME_LOCAL("ondragstart"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONMOVESTART = new AttributeName(ALL_NO_NS, SAME_LOCAL("onmovestart"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MARKERUNITS = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("markerunits", "markerUnits"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MATHVARIANT = new AttributeName(ALL_NO_NS, SAME_LOCAL("mathvariant"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MARGINWIDTH = new AttributeName(ALL_NO_NS, SAME_LOCAL("marginwidth"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MARKERWIDTH = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("markerwidth", "markerWidth"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName TEXT_ANCHOR = new AttributeName(ALL_NO_NS, SAME_LOCAL("text-anchor"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName TABLEVALUES = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("tablevalues", "tableValues"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SCRIPTLEVEL = new AttributeName(ALL_NO_NS, SAME_LOCAL("scriptlevel"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName REPEATCOUNT = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("repeatcount", "repeatCount"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName STITCHTILES = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("stitchtiles", "stitchTiles"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName STARTOFFSET = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("startoffset", "startOffset"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SCROLLDELAY = new AttributeName(ALL_NO_NS, SAME_LOCAL("scrolldelay"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName XMLNS_XLINK = new AttributeName(XMLNS_NS, COLONIFIED_LOCAL("xmlns:xlink", "xlink"), XMLNS_PREFIX, IS_XMLNS);
- public static final AttributeName XLINK_TITLE = new AttributeName(XLINK_NS, COLONIFIED_LOCAL("xlink:title", "title"), XLINK_PREFIX, NCNAME_FOREIGN);
- public static final AttributeName ARIA_INVALID = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-invalid"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_PRESSED = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-pressed"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_CHECKED = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-checked"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName AUTOCOMPLETE = new AttributeName(ALL_NO_NS, SAME_LOCAL("autocomplete"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED);
- public static final AttributeName ARIA_SETSIZE = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-setsize"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_CHANNEL = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-channel"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName EQUALCOLUMNS = new AttributeName(ALL_NO_NS, SAME_LOCAL("equalcolumns"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName DISPLAYSTYLE = new AttributeName(ALL_NO_NS, SAME_LOCAL("displaystyle"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName DATAFORMATAS = new AttributeName(ALL_NO_NS, SAME_LOCAL("dataformatas"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG | CASE_FOLDED);
- public static final AttributeName FILL_OPACITY = new AttributeName(ALL_NO_NS, SAME_LOCAL("fill-opacity"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FONT_VARIANT = new AttributeName(ALL_NO_NS, SAME_LOCAL("font-variant"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FONT_STRETCH = new AttributeName(ALL_NO_NS, SAME_LOCAL("font-stretch"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FRAMESPACING = new AttributeName(ALL_NO_NS, SAME_LOCAL("framespacing"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName KERNELMATRIX = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("kernelmatrix", "kernelMatrix"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONDEACTIVATE = new AttributeName(ALL_NO_NS, SAME_LOCAL("ondeactivate"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONROWSDELETE = new AttributeName(ALL_NO_NS, SAME_LOCAL("onrowsdelete"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONMOUSELEAVE = new AttributeName(ALL_NO_NS, SAME_LOCAL("onmouseleave"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONFORMCHANGE = new AttributeName(ALL_NO_NS, SAME_LOCAL("onformchange"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONCELLCHANGE = new AttributeName(ALL_NO_NS, SAME_LOCAL("oncellchange"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONMOUSEWHEEL = new AttributeName(ALL_NO_NS, SAME_LOCAL("onmousewheel"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONMOUSEENTER = new AttributeName(ALL_NO_NS, SAME_LOCAL("onmouseenter"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONAFTERPRINT = new AttributeName(ALL_NO_NS, SAME_LOCAL("onafterprint"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONBEFORECOPY = new AttributeName(ALL_NO_NS, SAME_LOCAL("onbeforecopy"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MARGINHEIGHT = new AttributeName(ALL_NO_NS, SAME_LOCAL("marginheight"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MARKERHEIGHT = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("markerheight", "markerHeight"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MARKER_START = new AttributeName(ALL_NO_NS, SAME_LOCAL("marker-start"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MATHEMATICAL = new AttributeName(ALL_NO_NS, SAME_LOCAL("mathematical"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName LENGTHADJUST = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("lengthadjust", "lengthAdjust"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName UNSELECTABLE = new AttributeName(ALL_NO_NS, SAME_LOCAL("unselectable"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName UNICODE_BIDI = new AttributeName(ALL_NO_NS, SAME_LOCAL("unicode-bidi"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName UNITS_PER_EM = new AttributeName(ALL_NO_NS, SAME_LOCAL("units-per-em"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName WORD_SPACING = new AttributeName(ALL_NO_NS, SAME_LOCAL("word-spacing"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName WRITING_MODE = new AttributeName(ALL_NO_NS, SAME_LOCAL("writing-mode"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName V_ALPHABETIC = new AttributeName(ALL_NO_NS, SAME_LOCAL("v-alphabetic"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName PATTERNUNITS = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("patternunits", "patternUnits"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SPREADMETHOD = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("spreadmethod", "spreadMethod"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SURFACESCALE = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("surfacescale", "surfaceScale"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName STROKE_WIDTH = new AttributeName(ALL_NO_NS, SAME_LOCAL("stroke-width"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName REPEAT_START = new AttributeName(ALL_NO_NS, SAME_LOCAL("repeat-start"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName STDDEVIATION = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("stddeviation", "stdDeviation"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName STOP_OPACITY = new AttributeName(ALL_NO_NS, SAME_LOCAL("stop-opacity"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_CONTROLS = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-controls"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_HASPOPUP = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-haspopup"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ACCENT_HEIGHT = new AttributeName(ALL_NO_NS, SAME_LOCAL("accent-height"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_VALUENOW = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-valuenow"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_RELEVANT = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-relevant"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_POSINSET = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-posinset"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_VALUEMAX = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-valuemax"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_READONLY = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-readonly"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_SELECTED = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-selected"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_REQUIRED = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-required"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_EXPANDED = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-expanded"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_DISABLED = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-disabled"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ATTRIBUTETYPE = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("attributetype", "attributeType"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ATTRIBUTENAME = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("attributename", "attributeName"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_DATATYPE = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-datatype"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_VALUEMIN = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-valuemin"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName BASEFREQUENCY = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("basefrequency", "baseFrequency"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName COLUMNSPACING = new AttributeName(ALL_NO_NS, SAME_LOCAL("columnspacing"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName COLOR_PROFILE = new AttributeName(ALL_NO_NS, SAME_LOCAL("color-profile"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CLIPPATHUNITS = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("clippathunits", "clipPathUnits"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName DEFINITIONURL = new AttributeName(ALL_NO_NS, MATH_DIFFERENT("definitionurl", "definitionURL"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName GRADIENTUNITS = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("gradientunits", "gradientUnits"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FLOOD_OPACITY = new AttributeName(ALL_NO_NS, SAME_LOCAL("flood-opacity"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONAFTERUPDATE = new AttributeName(ALL_NO_NS, SAME_LOCAL("onafterupdate"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONERRORUPDATE = new AttributeName(ALL_NO_NS, SAME_LOCAL("onerrorupdate"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONBEFOREPASTE = new AttributeName(ALL_NO_NS, SAME_LOCAL("onbeforepaste"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONLOSECAPTURE = new AttributeName(ALL_NO_NS, SAME_LOCAL("onlosecapture"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONCONTEXTMENU = new AttributeName(ALL_NO_NS, SAME_LOCAL("oncontextmenu"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONSELECTSTART = new AttributeName(ALL_NO_NS, SAME_LOCAL("onselectstart"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONBEFOREPRINT = new AttributeName(ALL_NO_NS, SAME_LOCAL("onbeforeprint"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MOVABLELIMITS = new AttributeName(ALL_NO_NS, SAME_LOCAL("movablelimits"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName LINETHICKNESS = new AttributeName(ALL_NO_NS, SAME_LOCAL("linethickness"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName UNICODE_RANGE = new AttributeName(ALL_NO_NS, SAME_LOCAL("unicode-range"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName THINMATHSPACE = new AttributeName(ALL_NO_NS, SAME_LOCAL("thinmathspace"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName VERT_ORIGIN_X = new AttributeName(ALL_NO_NS, SAME_LOCAL("vert-origin-x"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName VERT_ORIGIN_Y = new AttributeName(ALL_NO_NS, SAME_LOCAL("vert-origin-y"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName V_IDEOGRAPHIC = new AttributeName(ALL_NO_NS, SAME_LOCAL("v-ideographic"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName PRESERVEALPHA = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("preservealpha", "preserveAlpha"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SCRIPTMINSIZE = new AttributeName(ALL_NO_NS, SAME_LOCAL("scriptminsize"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SPECIFICATION = new AttributeName(ALL_NO_NS, SAME_LOCAL("specification"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName XLINK_ACTUATE = new AttributeName(XLINK_NS, COLONIFIED_LOCAL("xlink:actuate", "actuate"), XLINK_PREFIX, NCNAME_FOREIGN);
- public static final AttributeName XLINK_ARCROLE = new AttributeName(XLINK_NS, COLONIFIED_LOCAL("xlink:arcrole", "arcrole"), XLINK_PREFIX, NCNAME_FOREIGN);
- public static final AttributeName ACCEPT_CHARSET = new AttributeName(ALL_NO_NS, SAME_LOCAL("accept-charset"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ALIGNMENTSCOPE = new AttributeName(ALL_NO_NS, SAME_LOCAL("alignmentscope"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_MULTILINE = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-multiline"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName BASELINE_SHIFT = new AttributeName(ALL_NO_NS, SAME_LOCAL("baseline-shift"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName HORIZ_ORIGIN_X = new AttributeName(ALL_NO_NS, SAME_LOCAL("horiz-origin-x"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName HORIZ_ORIGIN_Y = new AttributeName(ALL_NO_NS, SAME_LOCAL("horiz-origin-y"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONBEFOREUPDATE = new AttributeName(ALL_NO_NS, SAME_LOCAL("onbeforeupdate"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONFILTERCHANGE = new AttributeName(ALL_NO_NS, SAME_LOCAL("onfilterchange"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONROWSINSERTED = new AttributeName(ALL_NO_NS, SAME_LOCAL("onrowsinserted"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONBEFOREUNLOAD = new AttributeName(ALL_NO_NS, SAME_LOCAL("onbeforeunload"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MATHBACKGROUND = new AttributeName(ALL_NO_NS, SAME_LOCAL("mathbackground"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName LETTER_SPACING = new AttributeName(ALL_NO_NS, SAME_LOCAL("letter-spacing"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName LIGHTING_COLOR = new AttributeName(ALL_NO_NS, SAME_LOCAL("lighting-color"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName THICKMATHSPACE = new AttributeName(ALL_NO_NS, SAME_LOCAL("thickmathspace"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName TEXT_RENDERING = new AttributeName(ALL_NO_NS, SAME_LOCAL("text-rendering"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName V_MATHEMATICAL = new AttributeName(ALL_NO_NS, SAME_LOCAL("v-mathematical"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName POINTER_EVENTS = new AttributeName(ALL_NO_NS, SAME_LOCAL("pointer-events"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName PRIMITIVEUNITS = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("primitiveunits", "primitiveUnits"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName REFERRERPOLICY = new AttributeName(ALL_NO_NS, SAME_LOCAL("referrerpolicy"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SYSTEMLANGUAGE = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("systemlanguage", "systemLanguage"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName STROKE_LINECAP = new AttributeName(ALL_NO_NS, SAME_LOCAL("stroke-linecap"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SUBSCRIPTSHIFT = new AttributeName(ALL_NO_NS, SAME_LOCAL("subscriptshift"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName STROKE_OPACITY = new AttributeName(ALL_NO_NS, SAME_LOCAL("stroke-opacity"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_DROPEFFECT = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-dropeffect"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_LABELLEDBY = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-labelledby"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_TEMPLATEID = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-templateid"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName COLOR_RENDERING = new AttributeName(ALL_NO_NS, SAME_LOCAL("color-rendering"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName CONTENTEDITABLE = new AttributeName(ALL_NO_NS, SAME_LOCAL("contenteditable"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName DIFFUSECONSTANT = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("diffuseconstant", "diffuseConstant"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONDATAAVAILABLE = new AttributeName(ALL_NO_NS, SAME_LOCAL("ondataavailable"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONCONTROLSELECT = new AttributeName(ALL_NO_NS, SAME_LOCAL("oncontrolselect"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName IMAGE_RENDERING = new AttributeName(ALL_NO_NS, SAME_LOCAL("image-rendering"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MEDIUMMATHSPACE = new AttributeName(ALL_NO_NS, SAME_LOCAL("mediummathspace"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName TEXT_DECORATION = new AttributeName(ALL_NO_NS, SAME_LOCAL("text-decoration"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SHAPE_RENDERING = new AttributeName(ALL_NO_NS, SAME_LOCAL("shape-rendering"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName STROKE_LINEJOIN = new AttributeName(ALL_NO_NS, SAME_LOCAL("stroke-linejoin"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName REPEAT_TEMPLATE = new AttributeName(ALL_NO_NS, SAME_LOCAL("repeat-template"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_DESCRIBEDBY = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-describedby"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName FONT_SIZE_ADJUST = new AttributeName(ALL_NO_NS, SAME_LOCAL("font-size-adjust"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName KERNELUNITLENGTH = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("kernelunitlength", "kernelUnitLength"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONBEFOREACTIVATE = new AttributeName(ALL_NO_NS, SAME_LOCAL("onbeforeactivate"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONPROPERTYCHANGE = new AttributeName(ALL_NO_NS, SAME_LOCAL("onpropertychange"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONDATASETCHANGED = new AttributeName(ALL_NO_NS, SAME_LOCAL("ondatasetchanged"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName MASKCONTENTUNITS = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("maskcontentunits", "maskContentUnits"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName PATTERNTRANSFORM = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("patterntransform", "patternTransform"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName REQUIREDFEATURES = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("requiredfeatures", "requiredFeatures"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName RENDERING_INTENT = new AttributeName(ALL_NO_NS, SAME_LOCAL("rendering-intent"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SPECULAREXPONENT = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("specularexponent", "specularExponent"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SPECULARCONSTANT = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("specularconstant", "specularConstant"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SUPERSCRIPTSHIFT = new AttributeName(ALL_NO_NS, SAME_LOCAL("superscriptshift"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName STROKE_DASHARRAY = new AttributeName(ALL_NO_NS, SAME_LOCAL("stroke-dasharray"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName XCHANNELSELECTOR = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("xchannelselector", "xChannelSelector"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName YCHANNELSELECTOR = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("ychannelselector", "yChannelSelector"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_AUTOCOMPLETE = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-autocomplete"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ENABLE_BACKGROUND = new AttributeName(ALL_NO_NS, SAME_LOCAL("enable-background"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName DOMINANT_BASELINE = new AttributeName(ALL_NO_NS, SAME_LOCAL("dominant-baseline"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName GRADIENTTRANSFORM = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("gradienttransform", "gradientTransform"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONBEFORDEACTIVATE = new AttributeName(ALL_NO_NS, SAME_LOCAL("onbefordeactivate"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONDATASETCOMPLETE = new AttributeName(ALL_NO_NS, SAME_LOCAL("ondatasetcomplete"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName OVERLINE_POSITION = new AttributeName(ALL_NO_NS, SAME_LOCAL("overline-position"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONBEFOREEDITFOCUS = new AttributeName(ALL_NO_NS, SAME_LOCAL("onbeforeeditfocus"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName LIMITINGCONEANGLE = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("limitingconeangle", "limitingConeAngle"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName VERYTHINMATHSPACE = new AttributeName(ALL_NO_NS, SAME_LOCAL("verythinmathspace"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName STROKE_DASHOFFSET = new AttributeName(ALL_NO_NS, SAME_LOCAL("stroke-dashoffset"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName STROKE_MITERLIMIT = new AttributeName(ALL_NO_NS, SAME_LOCAL("stroke-miterlimit"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ALIGNMENT_BASELINE = new AttributeName(ALL_NO_NS, SAME_LOCAL("alignment-baseline"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ONREADYSTATECHANGE = new AttributeName(ALL_NO_NS, SAME_LOCAL("onreadystatechange"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName OVERLINE_THICKNESS = new AttributeName(ALL_NO_NS, SAME_LOCAL("overline-thickness"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName UNDERLINE_POSITION = new AttributeName(ALL_NO_NS, SAME_LOCAL("underline-position"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName VERYTHICKMATHSPACE = new AttributeName(ALL_NO_NS, SAME_LOCAL("verythickmathspace"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName REQUIREDEXTENSIONS = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("requiredextensions", "requiredExtensions"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName COLOR_INTERPOLATION = new AttributeName(ALL_NO_NS, SAME_LOCAL("color-interpolation"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName UNDERLINE_THICKNESS = new AttributeName(ALL_NO_NS, SAME_LOCAL("underline-thickness"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName PRESERVEASPECTRATIO = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("preserveaspectratio", "preserveAspectRatio"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName PATTERNCONTENTUNITS = new AttributeName(ALL_NO_NS, SVG_DIFFERENT("patterncontentunits", "patternContentUnits"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_MULTISELECTABLE = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-multiselectable"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName SCRIPTSIZEMULTIPLIER = new AttributeName(ALL_NO_NS, SAME_LOCAL("scriptsizemultiplier"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName ARIA_ACTIVEDESCENDANT = new AttributeName(ALL_NO_NS, SAME_LOCAL("aria-activedescendant"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName VERYVERYTHINMATHSPACE = new AttributeName(ALL_NO_NS, SAME_LOCAL("veryverythinmathspace"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName VERYVERYTHICKMATHSPACE = new AttributeName(ALL_NO_NS, SAME_LOCAL("veryverythickmathspace"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName STRIKETHROUGH_POSITION = new AttributeName(ALL_NO_NS, SAME_LOCAL("strikethrough-position"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName STRIKETHROUGH_THICKNESS = new AttributeName(ALL_NO_NS, SAME_LOCAL("strikethrough-thickness"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName GLYPH_ORIENTATION_VERTICAL = new AttributeName(ALL_NO_NS, SAME_LOCAL("glyph-orientation-vertical"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName COLOR_INTERPOLATION_FILTERS = new AttributeName(ALL_NO_NS, SAME_LOCAL("color-interpolation-filters"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- public static final AttributeName GLYPH_ORIENTATION_HORIZONTAL = new AttributeName(ALL_NO_NS, SAME_LOCAL("glyph-orientation-horizontal"), ALL_NO_PREFIX, NCNAME_HTML | NCNAME_FOREIGN | NCNAME_LANG);
- private final static @NoLength AttributeName[] ATTRIBUTE_NAMES = {
- D,
- K,
- R,
- X,
- Y,
- Z,
- BY,
- CX,
- CY,
- DX,
- DY,
- G2,
- G1,
- FX,
- FY,
- K4,
- K2,
- K3,
- K1,
- ID,
- IN,
- U2,
- U1,
- RT,
- RX,
- RY,
- TO,
- Y2,
- Y1,
- X1,
- X2,
- ALT,
- DIR,
- DUR,
- END,
- FOR,
- IN2,
- MAX,
- MIN,
- LOW,
- REL,
- REV,
- SRC,
- AXIS,
- ABBR,
- BBOX,
- CITE,
- CODE,
- BIAS,
- COLS,
- CLIP,
- CHAR,
- BASE,
- EDGE,
- DATA,
- FILL,
- FROM,
- FORM,
- FACE,
- HIGH,
- HREF,
- OPEN,
- ICON,
- NAME,
- MODE,
- MASK,
- LINK,
- LANG,
- LOOP,
- LIST,
- TYPE,
- WHEN,
- WRAP,
- TEXT,
- PATH,
- PING,
- REFX,
- REFY,
- SIZE,
- SEED,
- ROWS,
- SPAN,
- STEP,
- ROLE,
- XREF,
- ASYNC,
- ALINK,
- ALIGN,
- CLOSE,
- COLOR,
- CLASS,
- CLEAR,
- BEGIN,
- DEPTH,
- DEFER,
- FENCE,
- FRAME,
- ISMAP,
- ONEND,
- INDEX,
- ORDER,
- OTHER,
- ONCUT,
- NARGS,
- MEDIA,
- LABEL,
- LOCAL,
- WIDTH,
- TITLE,
- VLINK,
- VALUE,
- SLOPE,
- SHAPE,
- SCOPE,
- SCALE,
- SPEED,
- STYLE,
- RULES,
- STEMH,
- SIZES,
- STEMV,
- START,
- XMLNS,
- ACCEPT,
- ACCENT,
- ASCENT,
- ACTIVE,
- ALTIMG,
- ACTION,
- BORDER,
- CURSOR,
- COORDS,
- FILTER,
- FORMAT,
- HIDDEN,
- HSPACE,
- HEIGHT,
- ONMOVE,
- ONLOAD,
- ONDRAG,
- ORIGIN,
- ONZOOM,
- ONHELP,
- ONSTOP,
- ONDROP,
- ONBLUR,
- OBJECT,
- OFFSET,
- ORIENT,
- ONCOPY,
- NOWRAP,
- NOHREF,
- MACROS,
- METHOD,
- LOWSRC,
- LSPACE,
- LQUOTE,
- USEMAP,
- WIDTHS,
- TARGET,
- VALUES,
- VALIGN,
- VSPACE,
- POSTER,
- POINTS,
- PROMPT,
- SRCDOC,
- SCOPED,
- STRING,
- SCHEME,
- STROKE,
- RADIUS,
- RESULT,
- REPEAT,
- SRCSET,
- RSPACE,
- ROTATE,
- RQUOTE,
- ALTTEXT,
- ARCHIVE,
- AZIMUTH,
- CLOSURE,
- CHECKED,
- CLASSID,
- CHAROFF,
- BGCOLOR,
- COLSPAN,
- CHARSET,
- COMPACT,
- CONTENT,
- ENCTYPE,
- DATASRC,
- DATAFLD,
- DECLARE,
- DISPLAY,
- DIVISOR,
- DEFAULT,
- DESCENT,
- KERNING,
- HANGING,
- HEADERS,
- ONPASTE,
- ONCLICK,
- OPTIMUM,
- ONBEGIN,
- ONKEYUP,
- ONFOCUS,
- ONERROR,
- ONINPUT,
- ONABORT,
- ONSTART,
- ONRESET,
- OPACITY,
- NOSHADE,
- MINSIZE,
- MAXSIZE,
- LARGEOP,
- UNICODE,
- TARGETX,
- TARGETY,
- VIEWBOX,
- VERSION,
- PATTERN,
- PROFILE,
- SPACING,
- RESTART,
- ROWSPAN,
- SANDBOX,
- SUMMARY,
- STANDBY,
- REPLACE,
- AUTOPLAY,
- ADDITIVE,
- CALCMODE,
- CODETYPE,
- CODEBASE,
- CONTROLS,
- BEVELLED,
- BASELINE,
- EXPONENT,
- EDGEMODE,
- ENCODING,
- GLYPHREF,
- DATETIME,
- DISABLED,
- FONTSIZE,
- KEYTIMES,
- PANOSE_1,
- HREFLANG,
- ONRESIZE,
- ONCHANGE,
- ONBOUNCE,
- ONUNLOAD,
- ONFINISH,
- ONSCROLL,
- OPERATOR,
- OVERFLOW,
- ONSUBMIT,
- ONREPEAT,
- ONSELECT,
- NOTATION,
- NORESIZE,
- MANIFEST,
- MATHSIZE,
- MULTIPLE,
- LONGDESC,
- LANGUAGE,
- TEMPLATE,
- TABINDEX,
- PROPERTY,
- READONLY,
- SELECTED,
- ROWLINES,
- SEAMLESS,
- ROWALIGN,
- STRETCHY,
- REQUIRED,
- XML_BASE,
- XML_LANG,
- X_HEIGHT,
- ARIA_OWNS,
- AUTOFOCUS,
- ARIA_SORT,
- ACCESSKEY,
- ARIA_BUSY,
- ARIA_GRAB,
- AMPLITUDE,
- ARIA_LIVE,
- CLIP_RULE,
- CLIP_PATH,
- EQUALROWS,
- ELEVATION,
- DIRECTION,
- DRAGGABLE,
- FILL_RULE,
- FONTSTYLE,
- FONT_SIZE,
- KEYSYSTEM,
- KEYPOINTS,
- HIDEFOCUS,
- ONMESSAGE,
- INTERCEPT,
- ONDRAGEND,
- ONMOVEEND,
- ONINVALID,
- INTEGRITY,
- ONKEYDOWN,
- ONFOCUSIN,
- ONMOUSEUP,
- INPUTMODE,
- ONROWEXIT,
- MATHCOLOR,
- MASKUNITS,
- MAXLENGTH,
- LINEBREAK,
- TRANSFORM,
- V_HANGING,
- VALUETYPE,
- POINTSATZ,
- POINTSATX,
- POINTSATY,
- SYMMETRIC,
- SCROLLING,
- REPEATDUR,
- SELECTION,
- SEPARATOR,
- XML_SPACE,
- AUTOSUBMIT,
- ALPHABETIC,
- ACTIONTYPE,
- ACCUMULATE,
- ARIA_LEVEL,
- COLUMNSPAN,
- CAP_HEIGHT,
- BACKGROUND,
- GLYPH_NAME,
- GROUPALIGN,
- FONTFAMILY,
- FONTWEIGHT,
- FONT_STYLE,
- KEYSPLINES,
- HTTP_EQUIV,
- ONACTIVATE,
- OCCURRENCE,
- IRRELEVANT,
- ONDBLCLICK,
- ONDRAGDROP,
- ONKEYPRESS,
- ONROWENTER,
- ONDRAGOVER,
- ONFOCUSOUT,
- ONMOUSEOUT,
- NUMOCTAVES,
- MARKER_MID,
- MARKER_END,
- TEXTLENGTH,
- VISIBILITY,
- VIEWTARGET,
- VERT_ADV_Y,
- PATHLENGTH,
- REPEAT_MAX,
- RADIOGROUP,
- STOP_COLOR,
- SEPARATORS,
- REPEAT_MIN,
- ROWSPACING,
- ZOOMANDPAN,
- XLINK_TYPE,
- XLINK_ROLE,
- XLINK_HREF,
- XLINK_SHOW,
- ACCENTUNDER,
- ARIA_SECRET,
- ARIA_ATOMIC,
- ARIA_HIDDEN,
- ARIA_FLOWTO,
- ARABIC_FORM,
- CELLPADDING,
- CELLSPACING,
- COLUMNWIDTH,
- CROSSORIGIN,
- COLUMNALIGN,
- COLUMNLINES,
- CONTEXTMENU,
- BASEPROFILE,
- FONT_FAMILY,
- FRAMEBORDER,
- FILTERUNITS,
- FLOOD_COLOR,
- FONT_WEIGHT,
- HORIZ_ADV_X,
- ONDRAGLEAVE,
- ONMOUSEMOVE,
- ORIENTATION,
- ONMOUSEDOWN,
- ONMOUSEOVER,
- ONDRAGENTER,
- IDEOGRAPHIC,
- ONBEFORECUT,
- ONFORMINPUT,
- ONDRAGSTART,
- ONMOVESTART,
- MARKERUNITS,
- MATHVARIANT,
- MARGINWIDTH,
- MARKERWIDTH,
- TEXT_ANCHOR,
- TABLEVALUES,
- SCRIPTLEVEL,
- REPEATCOUNT,
- STITCHTILES,
- STARTOFFSET,
- SCROLLDELAY,
- XMLNS_XLINK,
- XLINK_TITLE,
- ARIA_INVALID,
- ARIA_PRESSED,
- ARIA_CHECKED,
- AUTOCOMPLETE,
- ARIA_SETSIZE,
- ARIA_CHANNEL,
- EQUALCOLUMNS,
- DISPLAYSTYLE,
- DATAFORMATAS,
- FILL_OPACITY,
- FONT_VARIANT,
- FONT_STRETCH,
- FRAMESPACING,
- KERNELMATRIX,
- ONDEACTIVATE,
- ONROWSDELETE,
- ONMOUSELEAVE,
- ONFORMCHANGE,
- ONCELLCHANGE,
- ONMOUSEWHEEL,
- ONMOUSEENTER,
- ONAFTERPRINT,
- ONBEFORECOPY,
- MARGINHEIGHT,
- MARKERHEIGHT,
- MARKER_START,
- MATHEMATICAL,
- LENGTHADJUST,
- UNSELECTABLE,
- UNICODE_BIDI,
- UNITS_PER_EM,
- WORD_SPACING,
- WRITING_MODE,
- V_ALPHABETIC,
- PATTERNUNITS,
- SPREADMETHOD,
- SURFACESCALE,
- STROKE_WIDTH,
- REPEAT_START,
- STDDEVIATION,
- STOP_OPACITY,
- ARIA_CONTROLS,
- ARIA_HASPOPUP,
- ACCENT_HEIGHT,
- ARIA_VALUENOW,
- ARIA_RELEVANT,
- ARIA_POSINSET,
- ARIA_VALUEMAX,
- ARIA_READONLY,
- ARIA_SELECTED,
- ARIA_REQUIRED,
- ARIA_EXPANDED,
- ARIA_DISABLED,
- ATTRIBUTETYPE,
- ATTRIBUTENAME,
- ARIA_DATATYPE,
- ARIA_VALUEMIN,
- BASEFREQUENCY,
- COLUMNSPACING,
- COLOR_PROFILE,
- CLIPPATHUNITS,
- DEFINITIONURL,
- GRADIENTUNITS,
- FLOOD_OPACITY,
- ONAFTERUPDATE,
- ONERRORUPDATE,
- ONBEFOREPASTE,
- ONLOSECAPTURE,
- ONCONTEXTMENU,
- ONSELECTSTART,
- ONBEFOREPRINT,
- MOVABLELIMITS,
- LINETHICKNESS,
- UNICODE_RANGE,
- THINMATHSPACE,
- VERT_ORIGIN_X,
- VERT_ORIGIN_Y,
- V_IDEOGRAPHIC,
- PRESERVEALPHA,
- SCRIPTMINSIZE,
- SPECIFICATION,
- XLINK_ACTUATE,
- XLINK_ARCROLE,
- ACCEPT_CHARSET,
- ALIGNMENTSCOPE,
- ARIA_MULTILINE,
- BASELINE_SHIFT,
- HORIZ_ORIGIN_X,
- HORIZ_ORIGIN_Y,
- ONBEFOREUPDATE,
- ONFILTERCHANGE,
- ONROWSINSERTED,
- ONBEFOREUNLOAD,
- MATHBACKGROUND,
- LETTER_SPACING,
- LIGHTING_COLOR,
- THICKMATHSPACE,
- TEXT_RENDERING,
- V_MATHEMATICAL,
- POINTER_EVENTS,
- PRIMITIVEUNITS,
- REFERRERPOLICY,
- SYSTEMLANGUAGE,
- STROKE_LINECAP,
- SUBSCRIPTSHIFT,
- STROKE_OPACITY,
- ARIA_DROPEFFECT,
- ARIA_LABELLEDBY,
- ARIA_TEMPLATEID,
- COLOR_RENDERING,
- CONTENTEDITABLE,
- DIFFUSECONSTANT,
- ONDATAAVAILABLE,
- ONCONTROLSELECT,
- IMAGE_RENDERING,
- MEDIUMMATHSPACE,
- TEXT_DECORATION,
- SHAPE_RENDERING,
- STROKE_LINEJOIN,
- REPEAT_TEMPLATE,
- ARIA_DESCRIBEDBY,
- FONT_SIZE_ADJUST,
- KERNELUNITLENGTH,
- ONBEFOREACTIVATE,
- ONPROPERTYCHANGE,
- ONDATASETCHANGED,
- MASKCONTENTUNITS,
- PATTERNTRANSFORM,
- REQUIREDFEATURES,
- RENDERING_INTENT,
- SPECULAREXPONENT,
- SPECULARCONSTANT,
- SUPERSCRIPTSHIFT,
- STROKE_DASHARRAY,
- XCHANNELSELECTOR,
- YCHANNELSELECTOR,
- ARIA_AUTOCOMPLETE,
- ENABLE_BACKGROUND,
- DOMINANT_BASELINE,
- GRADIENTTRANSFORM,
- ONBEFORDEACTIVATE,
- ONDATASETCOMPLETE,
- OVERLINE_POSITION,
- ONBEFOREEDITFOCUS,
- LIMITINGCONEANGLE,
- VERYTHINMATHSPACE,
- STROKE_DASHOFFSET,
- STROKE_MITERLIMIT,
- ALIGNMENT_BASELINE,
- ONREADYSTATECHANGE,
- OVERLINE_THICKNESS,
- UNDERLINE_POSITION,
- VERYTHICKMATHSPACE,
- REQUIREDEXTENSIONS,
- COLOR_INTERPOLATION,
- UNDERLINE_THICKNESS,
- PRESERVEASPECTRATIO,
- PATTERNCONTENTUNITS,
- ARIA_MULTISELECTABLE,
- SCRIPTSIZEMULTIPLIER,
- ARIA_ACTIVEDESCENDANT,
- VERYVERYTHINMATHSPACE,
- VERYVERYTHICKMATHSPACE,
- STRIKETHROUGH_POSITION,
- STRIKETHROUGH_THICKNESS,
- GLYPH_ORIENTATION_VERTICAL,
- COLOR_INTERPOLATION_FILTERS,
- GLYPH_ORIENTATION_HORIZONTAL,
- };
- private final static int[] ATTRIBUTE_HASHES = {
- 1153,
- 1383,
- 1601,
- 1793,
- 1827,
- 1857,
- 68600,
- 69146,
- 69177,
- 70237,
- 70270,
- 71572,
- 71669,
- 72415,
- 72444,
- 74846,
- 74904,
- 74943,
- 75001,
- 75276,
- 75590,
- 84742,
- 84839,
- 85575,
- 85963,
- 85992,
- 87204,
- 88074,
- 88171,
- 89130,
- 89163,
- 3207892,
- 3283895,
- 3284791,
- 3338752,
- 3358197,
- 3369562,
- 3539124,
- 3562402,
- 3574260,
- 3670335,
- 3696933,
- 3721879,
- 135280021,
- 135346322,
- 136317019,
- 136475749,
- 136548517,
- 136652214,
- 136884919,
- 136902418,
- 136942992,
- 137292068,
- 139120259,
- 139785574,
- 142250603,
- 142314056,
- 142331176,
- 142519584,
- 144752417,
- 145106895,
- 146147200,
- 146765926,
- 148805544,
- 149655723,
- 149809441,
- 150018784,
- 150445028,
- 150813181,
- 150923321,
- 152528754,
- 152536216,
- 152647366,
- 152962785,
- 155219321,
- 155654904,
- 157317483,
- 157350248,
- 157437941,
- 157447478,
- 157604838,
- 157685404,
- 157894402,
- 158315188,
- 166078431,
- 169409980,
- 169700259,
- 169856932,
- 170007032,
- 170409695,
- 170466488,
- 170513710,
- 170608367,
- 173028944,
- 173896963,
- 176090625,
- 176129212,
- 179390001,
- 179489057,
- 179627464,
- 179840468,
- 179849042,
- 180004216,
- 181779081,
- 183027151,
- 183645319,
- 183698797,
- 185922012,
- 185997252,
- 188312483,
- 188675799,
- 190977533,
- 190992569,
- 191006194,
- 191033518,
- 191038774,
- 191096249,
- 191166163,
- 191194426,
- 191443343,
- 191522106,
- 191568039,
- 200104642,
- 202506661,
- 202537381,
- 202602917,
- 203070590,
- 203120766,
- 203389054,
- 203690071,
- 203971238,
- 203986524,
- 209040857,
- 209125756,
- 212055489,
- 212322418,
- 212746849,
- 213002877,
- 213055164,
- 213088023,
- 213259873,
- 213273386,
- 213435118,
- 213437318,
- 213438231,
- 213493071,
- 213532268,
- 213542834,
- 213584431,
- 213659891,
- 215285828,
- 215880731,
- 216112976,
- 216684637,
- 217369699,
- 217565298,
- 217576549,
- 218186795,
- 219743185,
- 220082234,
- 221623802,
- 221986406,
- 222283890,
- 223089542,
- 223138630,
- 223311265,
- 224431494,
- 224547358,
- 224587256,
- 224589550,
- 224655650,
- 224785518,
- 224810917,
- 224813302,
- 225126263,
- 225429618,
- 225432950,
- 225440869,
- 236107233,
- 236709921,
- 236838947,
- 237117095,
- 237143271,
- 237172455,
- 237209953,
- 237354143,
- 237372743,
- 237668065,
- 237703073,
- 237714273,
- 239743521,
- 240512803,
- 240522627,
- 240560417,
- 240656513,
- 241015715,
- 241062755,
- 241065383,
- 243523041,
- 245865199,
- 246261793,
- 246556195,
- 246774817,
- 246923491,
- 246928419,
- 246981667,
- 247014847,
- 247058369,
- 247112833,
- 247118177,
- 247119137,
- 247128739,
- 247316903,
- 249533729,
- 250235623,
- 250269543,
- 251402351,
- 252339047,
- 253260911,
- 253293679,
- 254844367,
- 255547879,
- 256077281,
- 256345377,
- 258124199,
- 258354465,
- 258605063,
- 258744193,
- 258845603,
- 258856961,
- 258926689,
- 269869248,
- 270174334,
- 270709417,
- 270778994,
- 270781796,
- 271102503,
- 271478858,
- 271490090,
- 272870654,
- 273335275,
- 273369140,
- 273924313,
- 274108530,
- 274116736,
- 276818662,
- 277476156,
- 279156579,
- 279349675,
- 280108533,
- 280128712,
- 280132869,
- 280162403,
- 280280292,
- 280413430,
- 280506130,
- 280677397,
- 280678580,
- 280686710,
- 280689066,
- 282736758,
- 283110901,
- 283275116,
- 283823226,
- 283890012,
- 284479340,
- 284606461,
- 286700477,
- 286798916,
- 290055764,
- 291557706,
- 291665349,
- 291804100,
- 292138018,
- 292166446,
- 292418738,
- 292451039,
- 300298041,
- 300374839,
- 300597935,
- 303073389,
- 303083839,
- 303266673,
- 303354997,
- 303430688,
- 303576261,
- 303724281,
- 303819694,
- 304242723,
- 304382625,
- 306247792,
- 307227811,
- 307468786,
- 307724489,
- 310252031,
- 310358241,
- 310373094,
- 310833159,
- 311015256,
- 313357609,
- 313683893,
- 313701861,
- 313706996,
- 313707317,
- 313710350,
- 313795700,
- 314027746,
- 314038181,
- 314091299,
- 314205627,
- 314233813,
- 316741830,
- 316797986,
- 317486755,
- 317794164,
- 320076137,
- 322657125,
- 322887778,
- 323506876,
- 323572412,
- 323605180,
- 325060058,
- 325320188,
- 325398738,
- 325541490,
- 325671619,
- 333868843,
- 336806130,
- 337212108,
- 337282686,
- 337285434,
- 337585223,
- 338036037,
- 338298087,
- 338566051,
- 340943551,
- 341190970,
- 342995704,
- 343352124,
- 343912673,
- 344585053,
- 346977248,
- 347218098,
- 347262163,
- 347278576,
- 347438191,
- 347655959,
- 347684788,
- 347726430,
- 347727772,
- 347776035,
- 347776629,
- 349500753,
- 350880161,
- 350887073,
- 353384123,
- 355496998,
- 355906922,
- 355979793,
- 356545959,
- 358637867,
- 358905016,
- 359164318,
- 359247286,
- 359350571,
- 359579447,
- 365560330,
- 367399355,
- 367420285,
- 367510727,
- 368013212,
- 370234760,
- 370353345,
- 370710317,
- 371074566,
- 371122285,
- 371194213,
- 371448425,
- 371448430,
- 371545055,
- 371593469,
- 371596922,
- 371758751,
- 371964792,
- 372151328,
- 376550136,
- 376710172,
- 376795771,
- 376826271,
- 376906556,
- 380514830,
- 380774774,
- 380775037,
- 381030322,
- 381136500,
- 381281631,
- 381282269,
- 381285504,
- 381330595,
- 381331422,
- 381335911,
- 381336484,
- 383907298,
- 383917408,
- 384595009,
- 384595013,
- 387799894,
- 387823201,
- 392581647,
- 392584937,
- 392742684,
- 392906485,
- 393003349,
- 400644707,
- 400973830,
- 404428547,
- 404432113,
- 404432865,
- 404469244,
- 404478897,
- 404694860,
- 406887479,
- 408294949,
- 408789955,
- 410022510,
- 410467324,
- 410586448,
- 410945965,
- 411845275,
- 414327152,
- 414327932,
- 414329781,
- 414346257,
- 414346439,
- 414639928,
- 414835998,
- 414894517,
- 414986533,
- 417465377,
- 417465381,
- 417492216,
- 418259232,
- 419310946,
- 420103495,
- 420242342,
- 420380455,
- 420658662,
- 420717432,
- 423183880,
- 424539259,
- 425929170,
- 425972964,
- 426050649,
- 426126450,
- 426142833,
- 426607922,
- 437289840,
- 437347469,
- 437412335,
- 437423943,
- 437455540,
- 437462252,
- 437597991,
- 437617485,
- 437986305,
- 437986507,
- 437986828,
- 437987072,
- 438015591,
- 438034813,
- 438038966,
- 438179623,
- 438347971,
- 438483573,
- 438547062,
- 438895551,
- 441592676,
- 442032555,
- 443548979,
- 447881379,
- 447881655,
- 447881895,
- 447887844,
- 448416189,
- 448445746,
- 448449012,
- 450942191,
- 452816744,
- 453668677,
- 454434495,
- 456610076,
- 456642844,
- 456738709,
- 457544600,
- 459451897,
- 459680944,
- 468058810,
- 468083581,
- 470964084,
- 471470955,
- 471567278,
- 472267822,
- 481177859,
- 481210627,
- 481435874,
- 481455115,
- 481485378,
- 481490218,
- 485105638,
- 486005878,
- 486383494,
- 487988916,
- 488103783,
- 490661867,
- 491574090,
- 491578272,
- 492891370,
- 493041952,
- 493441205,
- 493582844,
- 493716979,
- 504577572,
- 504740359,
- 505091638,
- 505592418,
- 505656212,
- 509516275,
- 514998531,
- 515571132,
- 515594682,
- 518712698,
- 521362273,
- 526592419,
- 526807354,
- 527348842,
- 538294791,
- 544689535,
- 545535009,
- 548544752,
- 548563346,
- 548595116,
- 551679010,
- 558034099,
- 560329411,
- 560356209,
- 560671018,
- 560671152,
- 560692590,
- 560845442,
- 569212097,
- 569474241,
- 572252718,
- 575326764,
- 576174758,
- 576190819,
- 582099184,
- 582099438,
- 582372519,
- 582558889,
- 586552164,
- 591325418,
- 594231990,
- 594243961,
- 605711268,
- 615672071,
- 616086845,
- 621792370,
- 624879850,
- 627432831,
- 640040548,
- 654392808,
- 658675477,
- 659420283,
- 672891587,
- 694768102,
- 705890982,
- 725543146,
- 759097578,
- 761686526,
- 795383908,
- 878105336,
- 908643300,
- 945213471,
- };
-}
diff --git a/parser/html/javasrc/ElementName.java b/parser/html/javasrc/ElementName.java
deleted file mode 100644
index ee551a737..000000000
--- a/parser/html/javasrc/ElementName.java
+++ /dev/null
@@ -1,1609 +0,0 @@
-/*
- * Copyright (c) 2008-2014 Mozilla Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.impl;
-
-import java.util.Arrays;
-
-import nu.validator.htmlparser.annotation.Inline;
-import nu.validator.htmlparser.annotation.Local;
-import nu.validator.htmlparser.annotation.NoLength;
-import nu.validator.htmlparser.annotation.Virtual;
-import nu.validator.htmlparser.common.Interner;
-
-public final class ElementName
-// uncomment when regenerating self
-// implements Comparable<ElementName>
-{
-
- /**
- * The mask for extracting the dispatch group.
- */
- public static final int GROUP_MASK = 127;
-
- /**
- * Indicates that the element is not a pre-interned element. Forbidden
- * on preinterned elements.
- */
- public static final int CUSTOM = (1 << 30);
-
- /**
- * Indicates that the element is in the "special" category. This bit
- * should not be pre-set on MathML or SVG specials--only on HTML specials.
- */
- public static final int SPECIAL = (1 << 29);
-
- /**
- * The element is foster-parenting. This bit should be pre-set on elements
- * that are foster-parenting as HTML.
- */
- public static final int FOSTER_PARENTING = (1 << 28);
-
- /**
- * The element is scoping. This bit should be pre-set on elements
- * that are scoping as HTML.
- */
- public static final int SCOPING = (1 << 27);
-
- /**
- * The element is scoping as SVG.
- */
- public static final int SCOPING_AS_SVG = (1 << 26);
-
- /**
- * The element is scoping as MathML.
- */
- public static final int SCOPING_AS_MATHML = (1 << 25);
-
- /**
- * The element is an HTML integration point.
- */
- public static final int HTML_INTEGRATION_POINT = (1 << 24);
-
- /**
- * The element has an optional end tag.
- */
- public static final int OPTIONAL_END_TAG = (1 << 23);
-
- public static final ElementName NULL_ELEMENT_NAME = new ElementName(null);
-
- public final @Local String name;
-
- public final @Local String camelCaseName;
-
- /**
- * The lowest 7 bits are the dispatch group. The high bits are flags.
- */
- public final int flags;
-
- @Inline public int getFlags() {
- return flags;
- }
-
- public int getGroup() {
- return flags & GROUP_MASK;
- }
-
- public boolean isCustom() {
- return (flags & CUSTOM) != 0;
- }
-
- static ElementName elementNameByBuffer(@NoLength char[] buf, int offset, int length, Interner interner) {
- int hash = ElementName.bufToHash(buf, length);
- int index = Arrays.binarySearch(ElementName.ELEMENT_HASHES, hash);
- if (index < 0) {
- return new ElementName(Portability.newLocalNameFromBuffer(buf, offset, length, interner));
- } else {
- ElementName elementName = ElementName.ELEMENT_NAMES[index];
- @Local String name = elementName.name;
- if (!Portability.localEqualsBuffer(name, buf, offset, length)) {
- return new ElementName(Portability.newLocalNameFromBuffer(buf,
- offset, length, interner));
- }
- return elementName;
- }
- }
-
- /**
- * This method has to return a unique integer for each well-known
- * lower-cased element name.
- *
- * @param buf
- * @param len
- * @return
- */
- private static int bufToHash(@NoLength char[] buf, int len) {
- int hash = len;
- hash <<= 5;
- hash += buf[0] - 0x60;
- int j = len;
- for (int i = 0; i < 4 && j > 0; i++) {
- j--;
- hash <<= 5;
- hash += buf[j] - 0x60;
- }
- return hash;
- }
-
- private ElementName(@Local String name, @Local String camelCaseName,
- int flags) {
- this.name = name;
- this.camelCaseName = camelCaseName;
- this.flags = flags;
- }
-
- protected ElementName(@Local String name) {
- this.name = name;
- this.camelCaseName = name;
- this.flags = TreeBuilder.OTHER | CUSTOM;
- }
-
- @Virtual void release() {
- // No-op in Java.
- // Implement as delete this in subclass.
- // Be sure to release the local name
- }
-
- @SuppressWarnings("unused") @Virtual private void destructor() {
- }
-
- @Virtual public ElementName cloneElementName(Interner interner) {
- return this;
- }
-
- // START CODE ONLY USED FOR GENERATING CODE uncomment and run to regenerate
-
-// /**
-// * @see java.lang.Object#toString()
-// */
-// @Override public String toString() {
-// return "(\"" + name + "\", \"" + camelCaseName + "\", " + decomposedFlags() + ")";
-// }
-//
-// private String decomposedFlags() {
-// StringBuilder buf = new StringBuilder("TreeBuilder.");
-// buf.append(treeBuilderGroupToName());
-// if ((flags & SPECIAL) != 0) {
-// buf.append(" | SPECIAL");
-// }
-// if ((flags & FOSTER_PARENTING) != 0) {
-// buf.append(" | FOSTER_PARENTING");
-// }
-// if ((flags & SCOPING) != 0) {
-// buf.append(" | SCOPING");
-// }
-// if ((flags & SCOPING_AS_MATHML) != 0) {
-// buf.append(" | SCOPING_AS_MATHML");
-// }
-// if ((flags & SCOPING_AS_SVG) != 0) {
-// buf.append(" | SCOPING_AS_SVG");
-// }
-// if ((flags & OPTIONAL_END_TAG) != 0) {
-// buf.append(" | OPTIONAL_END_TAG");
-// }
-// return buf.toString();
-// }
-//
-// private String constName() {
-// char[] buf = new char[name.length()];
-// for (int i = 0; i < name.length(); i++) {
-// char c = name.charAt(i);
-// if (c == '-') {
-// buf[i] = '_';
-// } else if (c >= '0' && c <= '9') {
-// buf[i] = c;
-// } else {
-// buf[i] = (char) (c - 0x20);
-// }
-// }
-// return new String(buf);
-// }
-//
-// private int hash() {
-// return bufToHash(name.toCharArray(), name.length());
-// }
-//
-// public int compareTo(ElementName other) {
-// int thisHash = this.hash();
-// int otherHash = other.hash();
-// if (thisHash < otherHash) {
-// return -1;
-// } else if (thisHash == otherHash) {
-// return 0;
-// } else {
-// return 1;
-// }
-// }
-//
-// private String treeBuilderGroupToName() {
-// switch (getGroup()) {
-// case TreeBuilder.OTHER:
-// return "OTHER";
-// case TreeBuilder.A:
-// return "A";
-// case TreeBuilder.BASE:
-// return "BASE";
-// case TreeBuilder.BODY:
-// return "BODY";
-// case TreeBuilder.BR:
-// return "BR";
-// case TreeBuilder.BUTTON:
-// return "BUTTON";
-// case TreeBuilder.CAPTION:
-// return "CAPTION";
-// case TreeBuilder.COL:
-// return "COL";
-// case TreeBuilder.COLGROUP:
-// return "COLGROUP";
-// case TreeBuilder.FONT:
-// return "FONT";
-// case TreeBuilder.FORM:
-// return "FORM";
-// case TreeBuilder.FRAME:
-// return "FRAME";
-// case TreeBuilder.FRAMESET:
-// return "FRAMESET";
-// case TreeBuilder.IMAGE:
-// return "IMAGE";
-// case TreeBuilder.INPUT:
-// return "INPUT";
-// case TreeBuilder.ISINDEX:
-// return "ISINDEX";
-// case TreeBuilder.LI:
-// return "LI";
-// case TreeBuilder.LINK_OR_BASEFONT_OR_BGSOUND:
-// return "LINK_OR_BASEFONT_OR_BGSOUND";
-// case TreeBuilder.MATH:
-// return "MATH";
-// case TreeBuilder.META:
-// return "META";
-// case TreeBuilder.SVG:
-// return "SVG";
-// case TreeBuilder.HEAD:
-// return "HEAD";
-// case TreeBuilder.HR:
-// return "HR";
-// case TreeBuilder.HTML:
-// return "HTML";
-// case TreeBuilder.KEYGEN:
-// return "KEYGEN";
-// case TreeBuilder.NOBR:
-// return "NOBR";
-// case TreeBuilder.NOFRAMES:
-// return "NOFRAMES";
-// case TreeBuilder.NOSCRIPT:
-// return "NOSCRIPT";
-// case TreeBuilder.OPTGROUP:
-// return "OPTGROUP";
-// case TreeBuilder.OPTION:
-// return "OPTION";
-// case TreeBuilder.P:
-// return "P";
-// case TreeBuilder.PLAINTEXT:
-// return "PLAINTEXT";
-// case TreeBuilder.SCRIPT:
-// return "SCRIPT";
-// case TreeBuilder.SELECT:
-// return "SELECT";
-// case TreeBuilder.STYLE:
-// return "STYLE";
-// case TreeBuilder.TABLE:
-// return "TABLE";
-// case TreeBuilder.TEXTAREA:
-// return "TEXTAREA";
-// case TreeBuilder.TITLE:
-// return "TITLE";
-// case TreeBuilder.TEMPLATE:
-// return "TEMPLATE";
-// case TreeBuilder.TR:
-// return "TR";
-// case TreeBuilder.XMP:
-// return "XMP";
-// case TreeBuilder.TBODY_OR_THEAD_OR_TFOOT:
-// return "TBODY_OR_THEAD_OR_TFOOT";
-// case TreeBuilder.TD_OR_TH:
-// return "TD_OR_TH";
-// case TreeBuilder.DD_OR_DT:
-// return "DD_OR_DT";
-// case TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6:
-// return "H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6";
-// case TreeBuilder.OBJECT:
-// return "OBJECT";
-// case TreeBuilder.OUTPUT:
-// return "OUTPUT";
-// case TreeBuilder.MARQUEE_OR_APPLET:
-// return "MARQUEE_OR_APPLET";
-// case TreeBuilder.PRE_OR_LISTING:
-// return "PRE_OR_LISTING";
-// case TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U:
-// return "B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U";
-// case TreeBuilder.UL_OR_OL_OR_DL:
-// return "UL_OR_OL_OR_DL";
-// case TreeBuilder.IFRAME:
-// return "IFRAME";
-// case TreeBuilder.NOEMBED:
-// return "NOEMBED";
-// case TreeBuilder.EMBED:
-// return "EMBED";
-// case TreeBuilder.IMG:
-// return "IMG";
-// case TreeBuilder.AREA_OR_WBR:
-// return "AREA_OR_WBR";
-// case TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU:
-// return "DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU";
-// case TreeBuilder.FIELDSET:
-// return "FIELDSET";
-// case TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY:
-// return "ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY";
-// case TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR:
-// return "RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR";
-// case TreeBuilder.RB_OR_RTC:
-// return "RB_OR_RTC";
-// case TreeBuilder.RT_OR_RP:
-// return "RT_OR_RP";
-// case TreeBuilder.PARAM_OR_SOURCE_OR_TRACK:
-// return "PARAM_OR_SOURCE_OR_TRACK";
-// case TreeBuilder.MGLYPH_OR_MALIGNMARK:
-// return "MGLYPH_OR_MALIGNMARK";
-// case TreeBuilder.MI_MO_MN_MS_MTEXT:
-// return "MI_MO_MN_MS_MTEXT";
-// case TreeBuilder.ANNOTATION_XML:
-// return "ANNOTATION_XML";
-// case TreeBuilder.FOREIGNOBJECT_OR_DESC:
-// return "FOREIGNOBJECT_OR_DESC";
-// case TreeBuilder.MENUITEM:
-// return "MENUITEM";
-// }
-// return null;
-// }
-//
-// /**
-// * Regenerate self
-// *
-// * @param args
-// */
-// public static void main(String[] args) {
-// Arrays.sort(ELEMENT_NAMES);
-// for (int i = 1; i < ELEMENT_NAMES.length; i++) {
-// if (ELEMENT_NAMES[i].hash() == ELEMENT_NAMES[i - 1].hash()) {
-// System.err.println("Hash collision: " + ELEMENT_NAMES[i].name
-// + ", " + ELEMENT_NAMES[i - 1].name);
-// return;
-// }
-// }
-// for (int i = 0; i < ELEMENT_NAMES.length; i++) {
-// ElementName el = ELEMENT_NAMES[i];
-// System.out.println("public static final ElementName "
-// + el.constName() + " = new ElementName" + el.toString()
-// + ";");
-// }
-// System.out.println("private final static @NoLength ElementName[] ELEMENT_NAMES = {");
-// for (int i = 0; i < ELEMENT_NAMES.length; i++) {
-// ElementName el = ELEMENT_NAMES[i];
-// System.out.println(el.constName() + ",");
-// }
-// System.out.println("};");
-// System.out.println("private final static int[] ELEMENT_HASHES = {");
-// for (int i = 0; i < ELEMENT_NAMES.length; i++) {
-// ElementName el = ELEMENT_NAMES[i];
-// System.out.println(Integer.toString(el.hash()) + ",");
-// }
-// System.out.println("};");
-// }
-
- // START GENERATED CODE
- public static final ElementName A = new ElementName("a", "a", TreeBuilder.A);
- public static final ElementName B = new ElementName("b", "b", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
- public static final ElementName G = new ElementName("g", "g", TreeBuilder.OTHER);
- public static final ElementName I = new ElementName("i", "i", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
- public static final ElementName P = new ElementName("p", "p", TreeBuilder.P | SPECIAL | OPTIONAL_END_TAG);
- public static final ElementName Q = new ElementName("q", "q", TreeBuilder.OTHER);
- public static final ElementName S = new ElementName("s", "s", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
- public static final ElementName U = new ElementName("u", "u", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
- public static final ElementName BR = new ElementName("br", "br", TreeBuilder.BR | SPECIAL);
- public static final ElementName CI = new ElementName("ci", "ci", TreeBuilder.OTHER);
- public static final ElementName CN = new ElementName("cn", "cn", TreeBuilder.OTHER);
- public static final ElementName DD = new ElementName("dd", "dd", TreeBuilder.DD_OR_DT | SPECIAL | OPTIONAL_END_TAG);
- public static final ElementName DL = new ElementName("dl", "dl", TreeBuilder.UL_OR_OL_OR_DL | SPECIAL);
- public static final ElementName DT = new ElementName("dt", "dt", TreeBuilder.DD_OR_DT | SPECIAL | OPTIONAL_END_TAG);
- public static final ElementName EM = new ElementName("em", "em", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
- public static final ElementName EQ = new ElementName("eq", "eq", TreeBuilder.OTHER);
- public static final ElementName FN = new ElementName("fn", "fn", TreeBuilder.OTHER);
- public static final ElementName H1 = new ElementName("h1", "h1", TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
- public static final ElementName H2 = new ElementName("h2", "h2", TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
- public static final ElementName H3 = new ElementName("h3", "h3", TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
- public static final ElementName H4 = new ElementName("h4", "h4", TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
- public static final ElementName H5 = new ElementName("h5", "h5", TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
- public static final ElementName H6 = new ElementName("h6", "h6", TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 | SPECIAL);
- public static final ElementName GT = new ElementName("gt", "gt", TreeBuilder.OTHER);
- public static final ElementName HR = new ElementName("hr", "hr", TreeBuilder.HR | SPECIAL);
- public static final ElementName IN = new ElementName("in", "in", TreeBuilder.OTHER);
- public static final ElementName LI = new ElementName("li", "li", TreeBuilder.LI | SPECIAL | OPTIONAL_END_TAG);
- public static final ElementName LN = new ElementName("ln", "ln", TreeBuilder.OTHER);
- public static final ElementName LT = new ElementName("lt", "lt", TreeBuilder.OTHER);
- public static final ElementName MI = new ElementName("mi", "mi", TreeBuilder.MI_MO_MN_MS_MTEXT | SCOPING_AS_MATHML);
- public static final ElementName MN = new ElementName("mn", "mn", TreeBuilder.MI_MO_MN_MS_MTEXT | SCOPING_AS_MATHML);
- public static final ElementName MO = new ElementName("mo", "mo", TreeBuilder.MI_MO_MN_MS_MTEXT | SCOPING_AS_MATHML);
- public static final ElementName MS = new ElementName("ms", "ms", TreeBuilder.MI_MO_MN_MS_MTEXT | SCOPING_AS_MATHML);
- public static final ElementName OL = new ElementName("ol", "ol", TreeBuilder.UL_OR_OL_OR_DL | SPECIAL);
- public static final ElementName OR = new ElementName("or", "or", TreeBuilder.OTHER);
- public static final ElementName PI = new ElementName("pi", "pi", TreeBuilder.OTHER);
- public static final ElementName RB = new ElementName("rb", "rb", TreeBuilder.RB_OR_RTC | OPTIONAL_END_TAG);
- public static final ElementName RP = new ElementName("rp", "rp", TreeBuilder.RT_OR_RP | OPTIONAL_END_TAG);
- public static final ElementName RT = new ElementName("rt", "rt", TreeBuilder.RT_OR_RP | OPTIONAL_END_TAG);
- public static final ElementName TD = new ElementName("td", "td", TreeBuilder.TD_OR_TH | SPECIAL | SCOPING | OPTIONAL_END_TAG);
- public static final ElementName TH = new ElementName("th", "th", TreeBuilder.TD_OR_TH | SPECIAL | SCOPING | OPTIONAL_END_TAG);
- public static final ElementName TR = new ElementName("tr", "tr", TreeBuilder.TR | SPECIAL | FOSTER_PARENTING | OPTIONAL_END_TAG);
- public static final ElementName TT = new ElementName("tt", "tt", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
- public static final ElementName UL = new ElementName("ul", "ul", TreeBuilder.UL_OR_OL_OR_DL | SPECIAL);
- public static final ElementName AND = new ElementName("and", "and", TreeBuilder.OTHER);
- public static final ElementName ARG = new ElementName("arg", "arg", TreeBuilder.OTHER);
- public static final ElementName ABS = new ElementName("abs", "abs", TreeBuilder.OTHER);
- public static final ElementName BIG = new ElementName("big", "big", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
- public static final ElementName BDO = new ElementName("bdo", "bdo", TreeBuilder.OTHER);
- public static final ElementName CSC = new ElementName("csc", "csc", TreeBuilder.OTHER);
- public static final ElementName COL = new ElementName("col", "col", TreeBuilder.COL | SPECIAL);
- public static final ElementName COS = new ElementName("cos", "cos", TreeBuilder.OTHER);
- public static final ElementName COT = new ElementName("cot", "cot", TreeBuilder.OTHER);
- public static final ElementName DEL = new ElementName("del", "del", TreeBuilder.OTHER);
- public static final ElementName DFN = new ElementName("dfn", "dfn", TreeBuilder.OTHER);
- public static final ElementName DIR = new ElementName("dir", "dir", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
- public static final ElementName DIV = new ElementName("div", "div", TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
- public static final ElementName EXP = new ElementName("exp", "exp", TreeBuilder.OTHER);
- public static final ElementName GCD = new ElementName("gcd", "gcd", TreeBuilder.OTHER);
- public static final ElementName GEQ = new ElementName("geq", "geq", TreeBuilder.OTHER);
- public static final ElementName IMG = new ElementName("img", "img", TreeBuilder.IMG | SPECIAL);
- public static final ElementName INS = new ElementName("ins", "ins", TreeBuilder.OTHER);
- public static final ElementName INT = new ElementName("int", "int", TreeBuilder.OTHER);
- public static final ElementName KBD = new ElementName("kbd", "kbd", TreeBuilder.OTHER);
- public static final ElementName LOG = new ElementName("log", "log", TreeBuilder.OTHER);
- public static final ElementName LCM = new ElementName("lcm", "lcm", TreeBuilder.OTHER);
- public static final ElementName LEQ = new ElementName("leq", "leq", TreeBuilder.OTHER);
- public static final ElementName MTD = new ElementName("mtd", "mtd", TreeBuilder.OTHER);
- public static final ElementName MIN = new ElementName("min", "min", TreeBuilder.OTHER);
- public static final ElementName MAP = new ElementName("map", "map", TreeBuilder.OTHER);
- public static final ElementName MTR = new ElementName("mtr", "mtr", TreeBuilder.OTHER);
- public static final ElementName MAX = new ElementName("max", "max", TreeBuilder.OTHER);
- public static final ElementName NEQ = new ElementName("neq", "neq", TreeBuilder.OTHER);
- public static final ElementName NOT = new ElementName("not", "not", TreeBuilder.OTHER);
- public static final ElementName NAV = new ElementName("nav", "nav", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
- public static final ElementName PRE = new ElementName("pre", "pre", TreeBuilder.PRE_OR_LISTING | SPECIAL);
- public static final ElementName RTC = new ElementName("rtc", "rtc", TreeBuilder.RB_OR_RTC | OPTIONAL_END_TAG);
- public static final ElementName REM = new ElementName("rem", "rem", TreeBuilder.OTHER);
- public static final ElementName SUB = new ElementName("sub", "sub", TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
- public static final ElementName SEC = new ElementName("sec", "sec", TreeBuilder.OTHER);
- public static final ElementName SVG = new ElementName("svg", "svg", TreeBuilder.SVG);
- public static final ElementName SUM = new ElementName("sum", "sum", TreeBuilder.OTHER);
- public static final ElementName SIN = new ElementName("sin", "sin", TreeBuilder.OTHER);
- public static final ElementName SEP = new ElementName("sep", "sep", TreeBuilder.OTHER);
- public static final ElementName SUP = new ElementName("sup", "sup", TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
- public static final ElementName SET = new ElementName("set", "set", TreeBuilder.OTHER);
- public static final ElementName TAN = new ElementName("tan", "tan", TreeBuilder.OTHER);
- public static final ElementName USE = new ElementName("use", "use", TreeBuilder.OTHER);
- public static final ElementName VAR = new ElementName("var", "var", TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
- public static final ElementName WBR = new ElementName("wbr", "wbr", TreeBuilder.AREA_OR_WBR | SPECIAL);
- public static final ElementName XMP = new ElementName("xmp", "xmp", TreeBuilder.XMP | SPECIAL);
- public static final ElementName XOR = new ElementName("xor", "xor", TreeBuilder.OTHER);
- public static final ElementName AREA = new ElementName("area", "area", TreeBuilder.AREA_OR_WBR | SPECIAL);
- public static final ElementName ABBR = new ElementName("abbr", "abbr", TreeBuilder.OTHER);
- public static final ElementName BASE = new ElementName("base", "base", TreeBuilder.BASE | SPECIAL);
- public static final ElementName BVAR = new ElementName("bvar", "bvar", TreeBuilder.OTHER);
- public static final ElementName BODY = new ElementName("body", "body", TreeBuilder.BODY | SPECIAL | OPTIONAL_END_TAG);
- public static final ElementName CARD = new ElementName("card", "card", TreeBuilder.OTHER);
- public static final ElementName CODE = new ElementName("code", "code", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
- public static final ElementName CITE = new ElementName("cite", "cite", TreeBuilder.OTHER);
- public static final ElementName CSCH = new ElementName("csch", "csch", TreeBuilder.OTHER);
- public static final ElementName COSH = new ElementName("cosh", "cosh", TreeBuilder.OTHER);
- public static final ElementName COTH = new ElementName("coth", "coth", TreeBuilder.OTHER);
- public static final ElementName CURL = new ElementName("curl", "curl", TreeBuilder.OTHER);
- public static final ElementName DESC = new ElementName("desc", "desc", TreeBuilder.FOREIGNOBJECT_OR_DESC | SCOPING_AS_SVG);
- public static final ElementName DIFF = new ElementName("diff", "diff", TreeBuilder.OTHER);
- public static final ElementName DEFS = new ElementName("defs", "defs", TreeBuilder.OTHER);
- public static final ElementName FORM = new ElementName("form", "form", TreeBuilder.FORM | SPECIAL);
- public static final ElementName FONT = new ElementName("font", "font", TreeBuilder.FONT);
- public static final ElementName GRAD = new ElementName("grad", "grad", TreeBuilder.OTHER);
- public static final ElementName HEAD = new ElementName("head", "head", TreeBuilder.HEAD | SPECIAL | OPTIONAL_END_TAG);
- public static final ElementName HTML = new ElementName("html", "html", TreeBuilder.HTML | SPECIAL | SCOPING | OPTIONAL_END_TAG);
- public static final ElementName LINE = new ElementName("line", "line", TreeBuilder.OTHER);
- public static final ElementName LINK = new ElementName("link", "link", TreeBuilder.LINK_OR_BASEFONT_OR_BGSOUND | SPECIAL);
- public static final ElementName LIST = new ElementName("list", "list", TreeBuilder.OTHER);
- public static final ElementName META = new ElementName("meta", "meta", TreeBuilder.META | SPECIAL);
- public static final ElementName MSUB = new ElementName("msub", "msub", TreeBuilder.OTHER);
- public static final ElementName MODE = new ElementName("mode", "mode", TreeBuilder.OTHER);
- public static final ElementName MATH = new ElementName("math", "math", TreeBuilder.MATH);
- public static final ElementName MARK = new ElementName("mark", "mark", TreeBuilder.OTHER);
- public static final ElementName MASK = new ElementName("mask", "mask", TreeBuilder.OTHER);
- public static final ElementName MEAN = new ElementName("mean", "mean", TreeBuilder.OTHER);
- public static final ElementName MAIN = new ElementName("main", "main", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
- public static final ElementName MSUP = new ElementName("msup", "msup", TreeBuilder.OTHER);
- public static final ElementName MENU = new ElementName("menu", "menu", TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
- public static final ElementName MROW = new ElementName("mrow", "mrow", TreeBuilder.OTHER);
- public static final ElementName NONE = new ElementName("none", "none", TreeBuilder.OTHER);
- public static final ElementName NOBR = new ElementName("nobr", "nobr", TreeBuilder.NOBR);
- public static final ElementName NEST = new ElementName("nest", "nest", TreeBuilder.OTHER);
- public static final ElementName PATH = new ElementName("path", "path", TreeBuilder.OTHER);
- public static final ElementName PLUS = new ElementName("plus", "plus", TreeBuilder.OTHER);
- public static final ElementName RULE = new ElementName("rule", "rule", TreeBuilder.OTHER);
- public static final ElementName REAL = new ElementName("real", "real", TreeBuilder.OTHER);
- public static final ElementName RELN = new ElementName("reln", "reln", TreeBuilder.OTHER);
- public static final ElementName RECT = new ElementName("rect", "rect", TreeBuilder.OTHER);
- public static final ElementName ROOT = new ElementName("root", "root", TreeBuilder.OTHER);
- public static final ElementName RUBY = new ElementName("ruby", "ruby", TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
- public static final ElementName SECH = new ElementName("sech", "sech", TreeBuilder.OTHER);
- public static final ElementName SINH = new ElementName("sinh", "sinh", TreeBuilder.OTHER);
- public static final ElementName SPAN = new ElementName("span", "span", TreeBuilder.RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR);
- public static final ElementName SAMP = new ElementName("samp", "samp", TreeBuilder.OTHER);
- public static final ElementName STOP = new ElementName("stop", "stop", TreeBuilder.OTHER);
- public static final ElementName SDEV = new ElementName("sdev", "sdev", TreeBuilder.OTHER);
- public static final ElementName TIME = new ElementName("time", "time", TreeBuilder.OTHER);
- public static final ElementName TRUE = new ElementName("true", "true", TreeBuilder.OTHER);
- public static final ElementName TREF = new ElementName("tref", "tref", TreeBuilder.OTHER);
- public static final ElementName TANH = new ElementName("tanh", "tanh", TreeBuilder.OTHER);
- public static final ElementName TEXT = new ElementName("text", "text", TreeBuilder.OTHER);
- public static final ElementName VIEW = new ElementName("view", "view", TreeBuilder.OTHER);
- public static final ElementName ASIDE = new ElementName("aside", "aside", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
- public static final ElementName AUDIO = new ElementName("audio", "audio", TreeBuilder.OTHER);
- public static final ElementName APPLY = new ElementName("apply", "apply", TreeBuilder.OTHER);
- public static final ElementName EMBED = new ElementName("embed", "embed", TreeBuilder.EMBED | SPECIAL);
- public static final ElementName FRAME = new ElementName("frame", "frame", TreeBuilder.FRAME | SPECIAL);
- public static final ElementName FALSE = new ElementName("false", "false", TreeBuilder.OTHER);
- public static final ElementName FLOOR = new ElementName("floor", "floor", TreeBuilder.OTHER);
- public static final ElementName GLYPH = new ElementName("glyph", "glyph", TreeBuilder.OTHER);
- public static final ElementName HKERN = new ElementName("hkern", "hkern", TreeBuilder.OTHER);
- public static final ElementName IMAGE = new ElementName("image", "image", TreeBuilder.IMAGE);
- public static final ElementName IDENT = new ElementName("ident", "ident", TreeBuilder.OTHER);
- public static final ElementName INPUT = new ElementName("input", "input", TreeBuilder.INPUT | SPECIAL);
- public static final ElementName LABEL = new ElementName("label", "label", TreeBuilder.OTHER);
- public static final ElementName LIMIT = new ElementName("limit", "limit", TreeBuilder.OTHER);
- public static final ElementName MFRAC = new ElementName("mfrac", "mfrac", TreeBuilder.OTHER);
- public static final ElementName MPATH = new ElementName("mpath", "mpath", TreeBuilder.OTHER);
- public static final ElementName METER = new ElementName("meter", "meter", TreeBuilder.OTHER);
- public static final ElementName MOVER = new ElementName("mover", "mover", TreeBuilder.OTHER);
- public static final ElementName MINUS = new ElementName("minus", "minus", TreeBuilder.OTHER);
- public static final ElementName MROOT = new ElementName("mroot", "mroot", TreeBuilder.OTHER);
- public static final ElementName MSQRT = new ElementName("msqrt", "msqrt", TreeBuilder.OTHER);
- public static final ElementName MTEXT = new ElementName("mtext", "mtext", TreeBuilder.MI_MO_MN_MS_MTEXT | SCOPING_AS_MATHML);
- public static final ElementName NOTIN = new ElementName("notin", "notin", TreeBuilder.OTHER);
- public static final ElementName PIECE = new ElementName("piece", "piece", TreeBuilder.OTHER);
- public static final ElementName PARAM = new ElementName("param", "param", TreeBuilder.PARAM_OR_SOURCE_OR_TRACK | SPECIAL);
- public static final ElementName POWER = new ElementName("power", "power", TreeBuilder.OTHER);
- public static final ElementName REALS = new ElementName("reals", "reals", TreeBuilder.OTHER);
- public static final ElementName STYLE = new ElementName("style", "style", TreeBuilder.STYLE | SPECIAL);
- public static final ElementName SMALL = new ElementName("small", "small", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
- public static final ElementName THEAD = new ElementName("thead", "thead", TreeBuilder.TBODY_OR_THEAD_OR_TFOOT | SPECIAL | FOSTER_PARENTING | OPTIONAL_END_TAG);
- public static final ElementName TABLE = new ElementName("table", "table", TreeBuilder.TABLE | SPECIAL | FOSTER_PARENTING | SCOPING);
- public static final ElementName TITLE = new ElementName("title", "title", TreeBuilder.TITLE | SPECIAL | SCOPING_AS_SVG);
- public static final ElementName TRACK = new ElementName("track", "track", TreeBuilder.PARAM_OR_SOURCE_OR_TRACK | SPECIAL);
- public static final ElementName TSPAN = new ElementName("tspan", "tspan", TreeBuilder.OTHER);
- public static final ElementName TIMES = new ElementName("times", "times", TreeBuilder.OTHER);
- public static final ElementName TFOOT = new ElementName("tfoot", "tfoot", TreeBuilder.TBODY_OR_THEAD_OR_TFOOT | SPECIAL | FOSTER_PARENTING | OPTIONAL_END_TAG);
- public static final ElementName TBODY = new ElementName("tbody", "tbody", TreeBuilder.TBODY_OR_THEAD_OR_TFOOT | SPECIAL | FOSTER_PARENTING | OPTIONAL_END_TAG);
- public static final ElementName UNION = new ElementName("union", "union", TreeBuilder.OTHER);
- public static final ElementName VKERN = new ElementName("vkern", "vkern", TreeBuilder.OTHER);
- public static final ElementName VIDEO = new ElementName("video", "video", TreeBuilder.OTHER);
- public static final ElementName ARCSEC = new ElementName("arcsec", "arcsec", TreeBuilder.OTHER);
- public static final ElementName ARCCSC = new ElementName("arccsc", "arccsc", TreeBuilder.OTHER);
- public static final ElementName ARCTAN = new ElementName("arctan", "arctan", TreeBuilder.OTHER);
- public static final ElementName ARCSIN = new ElementName("arcsin", "arcsin", TreeBuilder.OTHER);
- public static final ElementName ARCCOS = new ElementName("arccos", "arccos", TreeBuilder.OTHER);
- public static final ElementName APPLET = new ElementName("applet", "applet", TreeBuilder.MARQUEE_OR_APPLET | SPECIAL | SCOPING);
- public static final ElementName ARCCOT = new ElementName("arccot", "arccot", TreeBuilder.OTHER);
- public static final ElementName APPROX = new ElementName("approx", "approx", TreeBuilder.OTHER);
- public static final ElementName BUTTON = new ElementName("button", "button", TreeBuilder.BUTTON | SPECIAL);
- public static final ElementName CIRCLE = new ElementName("circle", "circle", TreeBuilder.OTHER);
- public static final ElementName CENTER = new ElementName("center", "center", TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
- public static final ElementName CURSOR = new ElementName("cursor", "cursor", TreeBuilder.OTHER);
- public static final ElementName CANVAS = new ElementName("canvas", "canvas", TreeBuilder.OTHER);
- public static final ElementName DIVIDE = new ElementName("divide", "divide", TreeBuilder.OTHER);
- public static final ElementName DEGREE = new ElementName("degree", "degree", TreeBuilder.OTHER);
- public static final ElementName DOMAIN = new ElementName("domain", "domain", TreeBuilder.OTHER);
- public static final ElementName EXISTS = new ElementName("exists", "exists", TreeBuilder.OTHER);
- public static final ElementName FETILE = new ElementName("fetile", "feTile", TreeBuilder.OTHER);
- public static final ElementName FIGURE = new ElementName("figure", "figure", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
- public static final ElementName FORALL = new ElementName("forall", "forall", TreeBuilder.OTHER);
- public static final ElementName FILTER = new ElementName("filter", "filter", TreeBuilder.OTHER);
- public static final ElementName FOOTER = new ElementName("footer", "footer", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
- public static final ElementName HGROUP = new ElementName("hgroup", "hgroup", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
- public static final ElementName HEADER = new ElementName("header", "header", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
- public static final ElementName IFRAME = new ElementName("iframe", "iframe", TreeBuilder.IFRAME | SPECIAL);
- public static final ElementName KEYGEN = new ElementName("keygen", "keygen", TreeBuilder.KEYGEN);
- public static final ElementName LAMBDA = new ElementName("lambda", "lambda", TreeBuilder.OTHER);
- public static final ElementName LEGEND = new ElementName("legend", "legend", TreeBuilder.OTHER);
- public static final ElementName MSPACE = new ElementName("mspace", "mspace", TreeBuilder.OTHER);
- public static final ElementName MTABLE = new ElementName("mtable", "mtable", TreeBuilder.OTHER);
- public static final ElementName MSTYLE = new ElementName("mstyle", "mstyle", TreeBuilder.OTHER);
- public static final ElementName MGLYPH = new ElementName("mglyph", "mglyph", TreeBuilder.MGLYPH_OR_MALIGNMARK);
- public static final ElementName MEDIAN = new ElementName("median", "median", TreeBuilder.OTHER);
- public static final ElementName MUNDER = new ElementName("munder", "munder", TreeBuilder.OTHER);
- public static final ElementName MARKER = new ElementName("marker", "marker", TreeBuilder.OTHER);
- public static final ElementName MERROR = new ElementName("merror", "merror", TreeBuilder.OTHER);
- public static final ElementName MOMENT = new ElementName("moment", "moment", TreeBuilder.OTHER);
- public static final ElementName MATRIX = new ElementName("matrix", "matrix", TreeBuilder.OTHER);
- public static final ElementName OPTION = new ElementName("option", "option", TreeBuilder.OPTION | OPTIONAL_END_TAG);
- public static final ElementName OBJECT = new ElementName("object", "object", TreeBuilder.OBJECT | SPECIAL | SCOPING);
- public static final ElementName OUTPUT = new ElementName("output", "output", TreeBuilder.OUTPUT);
- public static final ElementName PRIMES = new ElementName("primes", "primes", TreeBuilder.OTHER);
- public static final ElementName SOURCE = new ElementName("source", "source", TreeBuilder.PARAM_OR_SOURCE_OR_TRACK);
- public static final ElementName STRIKE = new ElementName("strike", "strike", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
- public static final ElementName STRONG = new ElementName("strong", "strong", TreeBuilder.B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U);
- public static final ElementName SWITCH = new ElementName("switch", "switch", TreeBuilder.OTHER);
- public static final ElementName SYMBOL = new ElementName("symbol", "symbol", TreeBuilder.OTHER);
- public static final ElementName SELECT = new ElementName("select", "select", TreeBuilder.SELECT | SPECIAL);
- public static final ElementName SUBSET = new ElementName("subset", "subset", TreeBuilder.OTHER);
- public static final ElementName SCRIPT = new ElementName("script", "script", TreeBuilder.SCRIPT | SPECIAL);
- public static final ElementName TBREAK = new ElementName("tbreak", "tbreak", TreeBuilder.OTHER);
- public static final ElementName VECTOR = new ElementName("vector", "vector", TreeBuilder.OTHER);
- public static final ElementName ARTICLE = new ElementName("article", "article", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
- public static final ElementName ANIMATE = new ElementName("animate", "animate", TreeBuilder.OTHER);
- public static final ElementName ARCSECH = new ElementName("arcsech", "arcsech", TreeBuilder.OTHER);
- public static final ElementName ARCCSCH = new ElementName("arccsch", "arccsch", TreeBuilder.OTHER);
- public static final ElementName ARCTANH = new ElementName("arctanh", "arctanh", TreeBuilder.OTHER);
- public static final ElementName ARCSINH = new ElementName("arcsinh", "arcsinh", TreeBuilder.OTHER);
- public static final ElementName ARCCOSH = new ElementName("arccosh", "arccosh", TreeBuilder.OTHER);
- public static final ElementName ARCCOTH = new ElementName("arccoth", "arccoth", TreeBuilder.OTHER);
- public static final ElementName ACRONYM = new ElementName("acronym", "acronym", TreeBuilder.OTHER);
- public static final ElementName ADDRESS = new ElementName("address", "address", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
- public static final ElementName BGSOUND = new ElementName("bgsound", "bgsound", TreeBuilder.LINK_OR_BASEFONT_OR_BGSOUND | SPECIAL);
- public static final ElementName COMPOSE = new ElementName("compose", "compose", TreeBuilder.OTHER);
- public static final ElementName CEILING = new ElementName("ceiling", "ceiling", TreeBuilder.OTHER);
- public static final ElementName CSYMBOL = new ElementName("csymbol", "csymbol", TreeBuilder.OTHER);
- public static final ElementName CAPTION = new ElementName("caption", "caption", TreeBuilder.CAPTION | SPECIAL | SCOPING);
- public static final ElementName DISCARD = new ElementName("discard", "discard", TreeBuilder.OTHER);
- public static final ElementName DECLARE = new ElementName("declare", "declare", TreeBuilder.OTHER);
- public static final ElementName DETAILS = new ElementName("details", "details", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
- public static final ElementName ELLIPSE = new ElementName("ellipse", "ellipse", TreeBuilder.OTHER);
- public static final ElementName FEFUNCA = new ElementName("fefunca", "feFuncA", TreeBuilder.OTHER);
- public static final ElementName FEFUNCB = new ElementName("fefuncb", "feFuncB", TreeBuilder.OTHER);
- public static final ElementName FEBLEND = new ElementName("feblend", "feBlend", TreeBuilder.OTHER);
- public static final ElementName FEFLOOD = new ElementName("feflood", "feFlood", TreeBuilder.OTHER);
- public static final ElementName FEIMAGE = new ElementName("feimage", "feImage", TreeBuilder.OTHER);
- public static final ElementName FEMERGE = new ElementName("femerge", "feMerge", TreeBuilder.OTHER);
- public static final ElementName FEFUNCG = new ElementName("fefuncg", "feFuncG", TreeBuilder.OTHER);
- public static final ElementName FEFUNCR = new ElementName("fefuncr", "feFuncR", TreeBuilder.OTHER);
- public static final ElementName HANDLER = new ElementName("handler", "handler", TreeBuilder.OTHER);
- public static final ElementName INVERSE = new ElementName("inverse", "inverse", TreeBuilder.OTHER);
- public static final ElementName IMPLIES = new ElementName("implies", "implies", TreeBuilder.OTHER);
- public static final ElementName ISINDEX = new ElementName("isindex", "isindex", TreeBuilder.ISINDEX | SPECIAL);
- public static final ElementName LOGBASE = new ElementName("logbase", "logbase", TreeBuilder.OTHER);
- public static final ElementName LISTING = new ElementName("listing", "listing", TreeBuilder.PRE_OR_LISTING | SPECIAL);
- public static final ElementName MFENCED = new ElementName("mfenced", "mfenced", TreeBuilder.OTHER);
- public static final ElementName MPADDED = new ElementName("mpadded", "mpadded", TreeBuilder.OTHER);
- public static final ElementName MARQUEE = new ElementName("marquee", "marquee", TreeBuilder.MARQUEE_OR_APPLET | SPECIAL | SCOPING);
- public static final ElementName MACTION = new ElementName("maction", "maction", TreeBuilder.OTHER);
- public static final ElementName MSUBSUP = new ElementName("msubsup", "msubsup", TreeBuilder.OTHER);
- public static final ElementName NOEMBED = new ElementName("noembed", "noembed", TreeBuilder.NOEMBED | SPECIAL);
- public static final ElementName POLYGON = new ElementName("polygon", "polygon", TreeBuilder.OTHER);
- public static final ElementName PATTERN = new ElementName("pattern", "pattern", TreeBuilder.OTHER);
- public static final ElementName PICTURE = new ElementName("picture", "picture", TreeBuilder.OTHER);
- public static final ElementName PRODUCT = new ElementName("product", "product", TreeBuilder.OTHER);
- public static final ElementName SETDIFF = new ElementName("setdiff", "setdiff", TreeBuilder.OTHER);
- public static final ElementName SECTION = new ElementName("section", "section", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
- public static final ElementName SUMMARY = new ElementName("summary", "summary", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
- public static final ElementName TENDSTO = new ElementName("tendsto", "tendsto", TreeBuilder.OTHER);
- public static final ElementName UPLIMIT = new ElementName("uplimit", "uplimit", TreeBuilder.OTHER);
- public static final ElementName ALTGLYPH = new ElementName("altglyph", "altGlyph", TreeBuilder.OTHER);
- public static final ElementName BASEFONT = new ElementName("basefont", "basefont", TreeBuilder.LINK_OR_BASEFONT_OR_BGSOUND | SPECIAL);
- public static final ElementName CLIPPATH = new ElementName("clippath", "clipPath", TreeBuilder.OTHER);
- public static final ElementName CODOMAIN = new ElementName("codomain", "codomain", TreeBuilder.OTHER);
- public static final ElementName COLGROUP = new ElementName("colgroup", "colgroup", TreeBuilder.COLGROUP | SPECIAL | OPTIONAL_END_TAG);
- public static final ElementName EMPTYSET = new ElementName("emptyset", "emptyset", TreeBuilder.OTHER);
- public static final ElementName FACTOROF = new ElementName("factorof", "factorof", TreeBuilder.OTHER);
- public static final ElementName FIELDSET = new ElementName("fieldset", "fieldset", TreeBuilder.FIELDSET | SPECIAL);
- public static final ElementName FRAMESET = new ElementName("frameset", "frameset", TreeBuilder.FRAMESET | SPECIAL);
- public static final ElementName FEOFFSET = new ElementName("feoffset", "feOffset", TreeBuilder.OTHER);
- public static final ElementName GLYPHREF = new ElementName("glyphref", "glyphRef", TreeBuilder.OTHER);
- public static final ElementName INTERVAL = new ElementName("interval", "interval", TreeBuilder.OTHER);
- public static final ElementName INTEGERS = new ElementName("integers", "integers", TreeBuilder.OTHER);
- public static final ElementName INFINITY = new ElementName("infinity", "infinity", TreeBuilder.OTHER);
- public static final ElementName LISTENER = new ElementName("listener", "listener", TreeBuilder.OTHER);
- public static final ElementName LOWLIMIT = new ElementName("lowlimit", "lowlimit", TreeBuilder.OTHER);
- public static final ElementName METADATA = new ElementName("metadata", "metadata", TreeBuilder.OTHER);
- public static final ElementName MENCLOSE = new ElementName("menclose", "menclose", TreeBuilder.OTHER);
- public static final ElementName MENUITEM = new ElementName("menuitem", "menuitem", TreeBuilder.MENUITEM);
- public static final ElementName MPHANTOM = new ElementName("mphantom", "mphantom", TreeBuilder.OTHER);
- public static final ElementName NOFRAMES = new ElementName("noframes", "noframes", TreeBuilder.NOFRAMES | SPECIAL);
- public static final ElementName NOSCRIPT = new ElementName("noscript", "noscript", TreeBuilder.NOSCRIPT | SPECIAL);
- public static final ElementName OPTGROUP = new ElementName("optgroup", "optgroup", TreeBuilder.OPTGROUP | OPTIONAL_END_TAG);
- public static final ElementName POLYLINE = new ElementName("polyline", "polyline", TreeBuilder.OTHER);
- public static final ElementName PREFETCH = new ElementName("prefetch", "prefetch", TreeBuilder.OTHER);
- public static final ElementName PROGRESS = new ElementName("progress", "progress", TreeBuilder.OTHER);
- public static final ElementName PRSUBSET = new ElementName("prsubset", "prsubset", TreeBuilder.OTHER);
- public static final ElementName QUOTIENT = new ElementName("quotient", "quotient", TreeBuilder.OTHER);
- public static final ElementName SELECTOR = new ElementName("selector", "selector", TreeBuilder.OTHER);
- public static final ElementName TEXTAREA = new ElementName("textarea", "textarea", TreeBuilder.TEXTAREA | SPECIAL);
- public static final ElementName TEMPLATE = new ElementName("template", "template", TreeBuilder.TEMPLATE | SPECIAL | SCOPING);
- public static final ElementName TEXTPATH = new ElementName("textpath", "textPath", TreeBuilder.OTHER);
- public static final ElementName VARIANCE = new ElementName("variance", "variance", TreeBuilder.OTHER);
- public static final ElementName ANIMATION = new ElementName("animation", "animation", TreeBuilder.OTHER);
- public static final ElementName CONJUGATE = new ElementName("conjugate", "conjugate", TreeBuilder.OTHER);
- public static final ElementName CONDITION = new ElementName("condition", "condition", TreeBuilder.OTHER);
- public static final ElementName COMPLEXES = new ElementName("complexes", "complexes", TreeBuilder.OTHER);
- public static final ElementName FONT_FACE = new ElementName("font-face", "font-face", TreeBuilder.OTHER);
- public static final ElementName FACTORIAL = new ElementName("factorial", "factorial", TreeBuilder.OTHER);
- public static final ElementName INTERSECT = new ElementName("intersect", "intersect", TreeBuilder.OTHER);
- public static final ElementName IMAGINARY = new ElementName("imaginary", "imaginary", TreeBuilder.OTHER);
- public static final ElementName LAPLACIAN = new ElementName("laplacian", "laplacian", TreeBuilder.OTHER);
- public static final ElementName MATRIXROW = new ElementName("matrixrow", "matrixrow", TreeBuilder.OTHER);
- public static final ElementName NOTSUBSET = new ElementName("notsubset", "notsubset", TreeBuilder.OTHER);
- public static final ElementName OTHERWISE = new ElementName("otherwise", "otherwise", TreeBuilder.OTHER);
- public static final ElementName PIECEWISE = new ElementName("piecewise", "piecewise", TreeBuilder.OTHER);
- public static final ElementName PLAINTEXT = new ElementName("plaintext", "plaintext", TreeBuilder.PLAINTEXT | SPECIAL);
- public static final ElementName RATIONALS = new ElementName("rationals", "rationals", TreeBuilder.OTHER);
- public static final ElementName SEMANTICS = new ElementName("semantics", "semantics", TreeBuilder.OTHER);
- public static final ElementName TRANSPOSE = new ElementName("transpose", "transpose", TreeBuilder.OTHER);
- public static final ElementName ANNOTATION = new ElementName("annotation", "annotation", TreeBuilder.OTHER);
- public static final ElementName BLOCKQUOTE = new ElementName("blockquote", "blockquote", TreeBuilder.DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU | SPECIAL);
- public static final ElementName DIVERGENCE = new ElementName("divergence", "divergence", TreeBuilder.OTHER);
- public static final ElementName EULERGAMMA = new ElementName("eulergamma", "eulergamma", TreeBuilder.OTHER);
- public static final ElementName EQUIVALENT = new ElementName("equivalent", "equivalent", TreeBuilder.OTHER);
- public static final ElementName FIGCAPTION = new ElementName("figcaption", "figcaption", TreeBuilder.ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY | SPECIAL);
- public static final ElementName IMAGINARYI = new ElementName("imaginaryi", "imaginaryi", TreeBuilder.OTHER);
- public static final ElementName MALIGNMARK = new ElementName("malignmark", "malignmark", TreeBuilder.MGLYPH_OR_MALIGNMARK);
- public static final ElementName MUNDEROVER = new ElementName("munderover", "munderover", TreeBuilder.OTHER);
- public static final ElementName MLABELEDTR = new ElementName("mlabeledtr", "mlabeledtr", TreeBuilder.OTHER);
- public static final ElementName NOTANUMBER = new ElementName("notanumber", "notanumber", TreeBuilder.OTHER);
- public static final ElementName SOLIDCOLOR = new ElementName("solidcolor", "solidcolor", TreeBuilder.OTHER);
- public static final ElementName ALTGLYPHDEF = new ElementName("altglyphdef", "altGlyphDef", TreeBuilder.OTHER);
- public static final ElementName DETERMINANT = new ElementName("determinant", "determinant", TreeBuilder.OTHER);
- public static final ElementName FEMERGENODE = new ElementName("femergenode", "feMergeNode", TreeBuilder.OTHER);
- public static final ElementName FECOMPOSITE = new ElementName("fecomposite", "feComposite", TreeBuilder.OTHER);
- public static final ElementName FESPOTLIGHT = new ElementName("fespotlight", "feSpotLight", TreeBuilder.OTHER);
- public static final ElementName MALIGNGROUP = new ElementName("maligngroup", "maligngroup", TreeBuilder.OTHER);
- public static final ElementName MPRESCRIPTS = new ElementName("mprescripts", "mprescripts", TreeBuilder.OTHER);
- public static final ElementName MOMENTABOUT = new ElementName("momentabout", "momentabout", TreeBuilder.OTHER);
- public static final ElementName NOTPRSUBSET = new ElementName("notprsubset", "notprsubset", TreeBuilder.OTHER);
- public static final ElementName PARTIALDIFF = new ElementName("partialdiff", "partialdiff", TreeBuilder.OTHER);
- public static final ElementName ALTGLYPHITEM = new ElementName("altglyphitem", "altGlyphItem", TreeBuilder.OTHER);
- public static final ElementName ANIMATECOLOR = new ElementName("animatecolor", "animateColor", TreeBuilder.OTHER);
- public static final ElementName DATATEMPLATE = new ElementName("datatemplate", "datatemplate", TreeBuilder.OTHER);
- public static final ElementName EXPONENTIALE = new ElementName("exponentiale", "exponentiale", TreeBuilder.OTHER);
- public static final ElementName FETURBULENCE = new ElementName("feturbulence", "feTurbulence", TreeBuilder.OTHER);
- public static final ElementName FEPOINTLIGHT = new ElementName("fepointlight", "fePointLight", TreeBuilder.OTHER);
- public static final ElementName FEDROPSHADOW = new ElementName("fedropshadow", "feDropShadow", TreeBuilder.OTHER);
- public static final ElementName FEMORPHOLOGY = new ElementName("femorphology", "feMorphology", TreeBuilder.OTHER);
- public static final ElementName OUTERPRODUCT = new ElementName("outerproduct", "outerproduct", TreeBuilder.OTHER);
- public static final ElementName ANIMATEMOTION = new ElementName("animatemotion", "animateMotion", TreeBuilder.OTHER);
- public static final ElementName COLOR_PROFILE = new ElementName("color-profile", "color-profile", TreeBuilder.OTHER);
- public static final ElementName FONT_FACE_SRC = new ElementName("font-face-src", "font-face-src", TreeBuilder.OTHER);
- public static final ElementName FONT_FACE_URI = new ElementName("font-face-uri", "font-face-uri", TreeBuilder.OTHER);
- public static final ElementName FOREIGNOBJECT = new ElementName("foreignobject", "foreignObject", TreeBuilder.FOREIGNOBJECT_OR_DESC | SCOPING_AS_SVG);
- public static final ElementName FECOLORMATRIX = new ElementName("fecolormatrix", "feColorMatrix", TreeBuilder.OTHER);
- public static final ElementName MISSING_GLYPH = new ElementName("missing-glyph", "missing-glyph", TreeBuilder.OTHER);
- public static final ElementName MMULTISCRIPTS = new ElementName("mmultiscripts", "mmultiscripts", TreeBuilder.OTHER);
- public static final ElementName SCALARPRODUCT = new ElementName("scalarproduct", "scalarproduct", TreeBuilder.OTHER);
- public static final ElementName VECTORPRODUCT = new ElementName("vectorproduct", "vectorproduct", TreeBuilder.OTHER);
- public static final ElementName ANNOTATION_XML = new ElementName("annotation-xml", "annotation-xml", TreeBuilder.ANNOTATION_XML | SCOPING_AS_MATHML);
- public static final ElementName DEFINITION_SRC = new ElementName("definition-src", "definition-src", TreeBuilder.OTHER);
- public static final ElementName FONT_FACE_NAME = new ElementName("font-face-name", "font-face-name", TreeBuilder.OTHER);
- public static final ElementName FEGAUSSIANBLUR = new ElementName("fegaussianblur", "feGaussianBlur", TreeBuilder.OTHER);
- public static final ElementName FEDISTANTLIGHT = new ElementName("fedistantlight", "feDistantLight", TreeBuilder.OTHER);
- public static final ElementName LINEARGRADIENT = new ElementName("lineargradient", "linearGradient", TreeBuilder.OTHER);
- public static final ElementName NATURALNUMBERS = new ElementName("naturalnumbers", "naturalnumbers", TreeBuilder.OTHER);
- public static final ElementName RADIALGRADIENT = new ElementName("radialgradient", "radialGradient", TreeBuilder.OTHER);
- public static final ElementName ANIMATETRANSFORM = new ElementName("animatetransform", "animateTransform", TreeBuilder.OTHER);
- public static final ElementName CARTESIANPRODUCT = new ElementName("cartesianproduct", "cartesianproduct", TreeBuilder.OTHER);
- public static final ElementName FONT_FACE_FORMAT = new ElementName("font-face-format", "font-face-format", TreeBuilder.OTHER);
- public static final ElementName FECONVOLVEMATRIX = new ElementName("feconvolvematrix", "feConvolveMatrix", TreeBuilder.OTHER);
- public static final ElementName FEDIFFUSELIGHTING = new ElementName("fediffuselighting", "feDiffuseLighting", TreeBuilder.OTHER);
- public static final ElementName FEDISPLACEMENTMAP = new ElementName("fedisplacementmap", "feDisplacementMap", TreeBuilder.OTHER);
- public static final ElementName FESPECULARLIGHTING = new ElementName("fespecularlighting", "feSpecularLighting", TreeBuilder.OTHER);
- public static final ElementName DOMAINOFAPPLICATION = new ElementName("domainofapplication", "domainofapplication", TreeBuilder.OTHER);
- public static final ElementName FECOMPONENTTRANSFER = new ElementName("fecomponenttransfer", "feComponentTransfer", TreeBuilder.OTHER);
- private final static @NoLength ElementName[] ELEMENT_NAMES = {
- A,
- B,
- G,
- I,
- P,
- Q,
- S,
- U,
- BR,
- CI,
- CN,
- DD,
- DL,
- DT,
- EM,
- EQ,
- FN,
- H1,
- H2,
- H3,
- H4,
- H5,
- H6,
- GT,
- HR,
- IN,
- LI,
- LN,
- LT,
- MI,
- MN,
- MO,
- MS,
- OL,
- OR,
- PI,
- RB,
- RP,
- RT,
- TD,
- TH,
- TR,
- TT,
- UL,
- AND,
- ARG,
- ABS,
- BIG,
- BDO,
- CSC,
- COL,
- COS,
- COT,
- DEL,
- DFN,
- DIR,
- DIV,
- EXP,
- GCD,
- GEQ,
- IMG,
- INS,
- INT,
- KBD,
- LOG,
- LCM,
- LEQ,
- MTD,
- MIN,
- MAP,
- MTR,
- MAX,
- NEQ,
- NOT,
- NAV,
- PRE,
- RTC,
- REM,
- SUB,
- SEC,
- SVG,
- SUM,
- SIN,
- SEP,
- SUP,
- SET,
- TAN,
- USE,
- VAR,
- WBR,
- XMP,
- XOR,
- AREA,
- ABBR,
- BASE,
- BVAR,
- BODY,
- CARD,
- CODE,
- CITE,
- CSCH,
- COSH,
- COTH,
- CURL,
- DESC,
- DIFF,
- DEFS,
- FORM,
- FONT,
- GRAD,
- HEAD,
- HTML,
- LINE,
- LINK,
- LIST,
- META,
- MSUB,
- MODE,
- MATH,
- MARK,
- MASK,
- MEAN,
- MAIN,
- MSUP,
- MENU,
- MROW,
- NONE,
- NOBR,
- NEST,
- PATH,
- PLUS,
- RULE,
- REAL,
- RELN,
- RECT,
- ROOT,
- RUBY,
- SECH,
- SINH,
- SPAN,
- SAMP,
- STOP,
- SDEV,
- TIME,
- TRUE,
- TREF,
- TANH,
- TEXT,
- VIEW,
- ASIDE,
- AUDIO,
- APPLY,
- EMBED,
- FRAME,
- FALSE,
- FLOOR,
- GLYPH,
- HKERN,
- IMAGE,
- IDENT,
- INPUT,
- LABEL,
- LIMIT,
- MFRAC,
- MPATH,
- METER,
- MOVER,
- MINUS,
- MROOT,
- MSQRT,
- MTEXT,
- NOTIN,
- PIECE,
- PARAM,
- POWER,
- REALS,
- STYLE,
- SMALL,
- THEAD,
- TABLE,
- TITLE,
- TRACK,
- TSPAN,
- TIMES,
- TFOOT,
- TBODY,
- UNION,
- VKERN,
- VIDEO,
- ARCSEC,
- ARCCSC,
- ARCTAN,
- ARCSIN,
- ARCCOS,
- APPLET,
- ARCCOT,
- APPROX,
- BUTTON,
- CIRCLE,
- CENTER,
- CURSOR,
- CANVAS,
- DIVIDE,
- DEGREE,
- DOMAIN,
- EXISTS,
- FETILE,
- FIGURE,
- FORALL,
- FILTER,
- FOOTER,
- HGROUP,
- HEADER,
- IFRAME,
- KEYGEN,
- LAMBDA,
- LEGEND,
- MSPACE,
- MTABLE,
- MSTYLE,
- MGLYPH,
- MEDIAN,
- MUNDER,
- MARKER,
- MERROR,
- MOMENT,
- MATRIX,
- OPTION,
- OBJECT,
- OUTPUT,
- PRIMES,
- SOURCE,
- STRIKE,
- STRONG,
- SWITCH,
- SYMBOL,
- SELECT,
- SUBSET,
- SCRIPT,
- TBREAK,
- VECTOR,
- ARTICLE,
- ANIMATE,
- ARCSECH,
- ARCCSCH,
- ARCTANH,
- ARCSINH,
- ARCCOSH,
- ARCCOTH,
- ACRONYM,
- ADDRESS,
- BGSOUND,
- COMPOSE,
- CEILING,
- CSYMBOL,
- CAPTION,
- DISCARD,
- DECLARE,
- DETAILS,
- ELLIPSE,
- FEFUNCA,
- FEFUNCB,
- FEBLEND,
- FEFLOOD,
- FEIMAGE,
- FEMERGE,
- FEFUNCG,
- FEFUNCR,
- HANDLER,
- INVERSE,
- IMPLIES,
- ISINDEX,
- LOGBASE,
- LISTING,
- MFENCED,
- MPADDED,
- MARQUEE,
- MACTION,
- MSUBSUP,
- NOEMBED,
- POLYGON,
- PATTERN,
- PICTURE,
- PRODUCT,
- SETDIFF,
- SECTION,
- SUMMARY,
- TENDSTO,
- UPLIMIT,
- ALTGLYPH,
- BASEFONT,
- CLIPPATH,
- CODOMAIN,
- COLGROUP,
- EMPTYSET,
- FACTOROF,
- FIELDSET,
- FRAMESET,
- FEOFFSET,
- GLYPHREF,
- INTERVAL,
- INTEGERS,
- INFINITY,
- LISTENER,
- LOWLIMIT,
- METADATA,
- MENCLOSE,
- MENUITEM,
- MPHANTOM,
- NOFRAMES,
- NOSCRIPT,
- OPTGROUP,
- POLYLINE,
- PREFETCH,
- PROGRESS,
- PRSUBSET,
- QUOTIENT,
- SELECTOR,
- TEXTAREA,
- TEMPLATE,
- TEXTPATH,
- VARIANCE,
- ANIMATION,
- CONJUGATE,
- CONDITION,
- COMPLEXES,
- FONT_FACE,
- FACTORIAL,
- INTERSECT,
- IMAGINARY,
- LAPLACIAN,
- MATRIXROW,
- NOTSUBSET,
- OTHERWISE,
- PIECEWISE,
- PLAINTEXT,
- RATIONALS,
- SEMANTICS,
- TRANSPOSE,
- ANNOTATION,
- BLOCKQUOTE,
- DIVERGENCE,
- EULERGAMMA,
- EQUIVALENT,
- FIGCAPTION,
- IMAGINARYI,
- MALIGNMARK,
- MUNDEROVER,
- MLABELEDTR,
- NOTANUMBER,
- SOLIDCOLOR,
- ALTGLYPHDEF,
- DETERMINANT,
- FEMERGENODE,
- FECOMPOSITE,
- FESPOTLIGHT,
- MALIGNGROUP,
- MPRESCRIPTS,
- MOMENTABOUT,
- NOTPRSUBSET,
- PARTIALDIFF,
- ALTGLYPHITEM,
- ANIMATECOLOR,
- DATATEMPLATE,
- EXPONENTIALE,
- FETURBULENCE,
- FEPOINTLIGHT,
- FEDROPSHADOW,
- FEMORPHOLOGY,
- OUTERPRODUCT,
- ANIMATEMOTION,
- COLOR_PROFILE,
- FONT_FACE_SRC,
- FONT_FACE_URI,
- FOREIGNOBJECT,
- FECOLORMATRIX,
- MISSING_GLYPH,
- MMULTISCRIPTS,
- SCALARPRODUCT,
- VECTORPRODUCT,
- ANNOTATION_XML,
- DEFINITION_SRC,
- FONT_FACE_NAME,
- FEGAUSSIANBLUR,
- FEDISTANTLIGHT,
- LINEARGRADIENT,
- NATURALNUMBERS,
- RADIALGRADIENT,
- ANIMATETRANSFORM,
- CARTESIANPRODUCT,
- FONT_FACE_FORMAT,
- FECONVOLVEMATRIX,
- FEDIFFUSELIGHTING,
- FEDISPLACEMENTMAP,
- FESPECULARLIGHTING,
- DOMAINOFAPPLICATION,
- FECOMPONENTTRANSFER,
- };
- private final static int[] ELEMENT_HASHES = {
- 1057,
- 1090,
- 1255,
- 1321,
- 1552,
- 1585,
- 1651,
- 1717,
- 68162,
- 68899,
- 69059,
- 69764,
- 70020,
- 70276,
- 71077,
- 71205,
- 72134,
- 72232,
- 72264,
- 72296,
- 72328,
- 72360,
- 72392,
- 73351,
- 74312,
- 75209,
- 78124,
- 78284,
- 78476,
- 79149,
- 79309,
- 79341,
- 79469,
- 81295,
- 81487,
- 82224,
- 84050,
- 84498,
- 84626,
- 86164,
- 86292,
- 86612,
- 86676,
- 87445,
- 3183041,
- 3186241,
- 3198017,
- 3218722,
- 3226754,
- 3247715,
- 3256803,
- 3263971,
- 3264995,
- 3289252,
- 3291332,
- 3295524,
- 3299620,
- 3326725,
- 3379303,
- 3392679,
- 3448233,
- 3460553,
- 3461577,
- 3510347,
- 3546604,
- 3552364,
- 3556524,
- 3576461,
- 3586349,
- 3588141,
- 3590797,
- 3596333,
- 3622062,
- 3625454,
- 3627054,
- 3675728,
- 3739282,
- 3749042,
- 3771059,
- 3771571,
- 3776211,
- 3782323,
- 3782963,
- 3784883,
- 3785395,
- 3788979,
- 3815476,
- 3839605,
- 3885110,
- 3917911,
- 3948984,
- 3951096,
- 135304769,
- 135858241,
- 136498210,
- 136906434,
- 137138658,
- 137512995,
- 137531875,
- 137548067,
- 137629283,
- 137645539,
- 137646563,
- 137775779,
- 138529956,
- 138615076,
- 139040932,
- 140954086,
- 141179366,
- 141690439,
- 142738600,
- 143013512,
- 146979116,
- 147175724,
- 147475756,
- 147902637,
- 147936877,
- 148017645,
- 148131885,
- 148228141,
- 148229165,
- 148309165,
- 148317229,
- 148395629,
- 148551853,
- 148618829,
- 149076462,
- 149490158,
- 149572782,
- 151277616,
- 151639440,
- 153268914,
- 153486514,
- 153563314,
- 153750706,
- 153763314,
- 153914034,
- 154406067,
- 154417459,
- 154600979,
- 154678323,
- 154680979,
- 154866835,
- 155366708,
- 155375188,
- 155391572,
- 155465780,
- 155869364,
- 158045494,
- 168988979,
- 169321621,
- 169652752,
- 173151309,
- 174240818,
- 174247297,
- 174669292,
- 175391532,
- 176638123,
- 177380397,
- 177879204,
- 177886734,
- 180753473,
- 181020073,
- 181503558,
- 181686320,
- 181999237,
- 181999311,
- 182048201,
- 182074866,
- 182078003,
- 182083764,
- 182920847,
- 184716457,
- 184976961,
- 185145071,
- 187281445,
- 187872052,
- 188100653,
- 188875944,
- 188919873,
- 188920457,
- 189107250,
- 189203987,
- 189371817,
- 189414886,
- 189567458,
- 190266670,
- 191318187,
- 191337609,
- 202479203,
- 202493027,
- 202835587,
- 202843747,
- 203013219,
- 203036048,
- 203045987,
- 203177552,
- 203898516,
- 204648562,
- 205067918,
- 205078130,
- 205096654,
- 205689142,
- 205690439,
- 205988909,
- 207213161,
- 207794484,
- 207800999,
- 208023602,
- 208213644,
- 208213647,
- 210261490,
- 210310273,
- 210940978,
- 213325049,
- 213946445,
- 214055079,
- 215125040,
- 215134273,
- 215135028,
- 215237420,
- 215418148,
- 215553166,
- 215553394,
- 215563858,
- 215627949,
- 215754324,
- 217529652,
- 217713834,
- 217732628,
- 218731945,
- 221417045,
- 221424946,
- 221493746,
- 221515401,
- 221658189,
- 221908140,
- 221910626,
- 221921586,
- 222659762,
- 225001091,
- 236105833,
- 236113965,
- 236194995,
- 236195427,
- 236206132,
- 236206387,
- 236211683,
- 236212707,
- 236381647,
- 236571826,
- 237124271,
- 238210544,
- 238270764,
- 238435405,
- 238501172,
- 239224867,
- 239257644,
- 239710497,
- 240307721,
- 241208789,
- 241241557,
- 241318060,
- 241319404,
- 241343533,
- 241344069,
- 241405397,
- 241765845,
- 243864964,
- 244502085,
- 244946220,
- 245109902,
- 247647266,
- 247707956,
- 248648814,
- 248648836,
- 248682161,
- 248986932,
- 249058914,
- 249697357,
- 252132601,
- 252135604,
- 251841204,
- 252317348,
- 255007012,
- 255278388,
- 255641645,
- 256365156,
- 257566121,
- 269763372,
- 271202790,
- 271863856,
- 272049197,
- 272127474,
- 274339449,
- 274939471,
- 275388004,
- 275388005,
- 275388006,
- 275977800,
- 278267602,
- 278513831,
- 278712622,
- 281613765,
- 281683369,
- 282120228,
- 282250732,
- 282498697,
- 282508942,
- 283743649,
- 283787570,
- 284710386,
- 285391148,
- 285478533,
- 285854898,
- 285873762,
- 286931113,
- 288964227,
- 289445441,
- 289591340,
- 289689648,
- 291671489,
- 303512884,
- 305319975,
- 305610036,
- 305764101,
- 308448294,
- 308675890,
- 312085683,
- 312264750,
- 315032867,
- 316391000,
- 317331042,
- 317902135,
- 318950711,
- 319447220,
- 321499182,
- 322538804,
- 323145200,
- 337067316,
- 337826293,
- 339905989,
- 340833697,
- 341457068,
- 342310196,
- 345302593,
- 349554733,
- 349771471,
- 349786245,
- 350819405,
- 356072847,
- 370349192,
- 373962798,
- 375558638,
- 375574835,
- 376053993,
- 383276530,
- 383373833,
- 383407586,
- 384439906,
- 386079012,
- 404133513,
- 404307343,
- 407031852,
- 408072233,
- 409112005,
- 409608425,
- 409713793,
- 409771500,
- 419040932,
- 437730612,
- 439529766,
- 442616365,
- 442813037,
- 443157674,
- 443295316,
- 450118444,
- 450482697,
- 456789668,
- 459935396,
- 471217869,
- 474073645,
- 476230702,
- 476665218,
- 476717289,
- 483014825,
- 485083298,
- 489306281,
- 538364390,
- 540675748,
- 543819186,
- 543958612,
- 576960820,
- 577242548,
- 610515252,
- 642202932,
- 644420819,
- };
-}
diff --git a/parser/html/javasrc/HtmlAttributes.java b/parser/html/javasrc/HtmlAttributes.java
deleted file mode 100644
index 0ec25f96f..000000000
--- a/parser/html/javasrc/HtmlAttributes.java
+++ /dev/null
@@ -1,618 +0,0 @@
-/*
- * Copyright (c) 2007 Henri Sivonen
- * Copyright (c) 2008-2011 Mozilla Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.impl;
-
-import nu.validator.htmlparser.annotation.Auto;
-import nu.validator.htmlparser.annotation.IdType;
-import nu.validator.htmlparser.annotation.Local;
-import nu.validator.htmlparser.annotation.NsUri;
-import nu.validator.htmlparser.annotation.Prefix;
-import nu.validator.htmlparser.annotation.QName;
-import nu.validator.htmlparser.common.Interner;
-import nu.validator.htmlparser.common.XmlViolationPolicy;
-
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-
-/**
- * Be careful with this class. QName is the name in from HTML tokenization.
- * Otherwise, please refer to the interface doc.
- *
- * @version $Id: AttributesImpl.java 206 2008-03-20 14:09:29Z hsivonen $
- * @author hsivonen
- */
-public final class HtmlAttributes implements Attributes {
-
- // [NOCPP[
-
- private static final AttributeName[] EMPTY_ATTRIBUTENAMES = new AttributeName[0];
-
- private static final String[] EMPTY_STRINGS = new String[0];
-
- // ]NOCPP]
-
- public static final HtmlAttributes EMPTY_ATTRIBUTES = new HtmlAttributes(
- AttributeName.HTML);
-
- private int mode;
-
- private int length;
-
- private @Auto AttributeName[] names;
-
- private @Auto String[] values; // XXX perhaps make this @NoLength?
-
- // CPPONLY: private @Auto int[] lines; // XXX perhaps make this @NoLength?
-
- // [NOCPP[
-
- private String idValue;
-
- private int xmlnsLength;
-
- private AttributeName[] xmlnsNames;
-
- private String[] xmlnsValues;
-
- // ]NOCPP]
-
- public HtmlAttributes(int mode) {
- this.mode = mode;
- this.length = 0;
- /*
- * The length of 5 covers covers 98.3% of elements
- * according to Hixie, but lets round to the next power of two for
- * jemalloc.
- */
- this.names = new AttributeName[8];
- this.values = new String[8];
- // CPPONLY: this.lines = new int[8];
-
- // [NOCPP[
-
- this.idValue = null;
-
- this.xmlnsLength = 0;
-
- this.xmlnsNames = HtmlAttributes.EMPTY_ATTRIBUTENAMES;
-
- this.xmlnsValues = HtmlAttributes.EMPTY_STRINGS;
-
- // ]NOCPP]
- }
- /*
- public HtmlAttributes(HtmlAttributes other) {
- this.mode = other.mode;
- this.length = other.length;
- this.names = new AttributeName[other.length];
- this.values = new String[other.length];
- // [NOCPP[
- this.idValue = other.idValue;
- this.xmlnsLength = other.xmlnsLength;
- this.xmlnsNames = new AttributeName[other.xmlnsLength];
- this.xmlnsValues = new String[other.xmlnsLength];
- // ]NOCPP]
- }
- */
-
- void destructor() {
- clear(0);
- }
-
- /**
- * Only use with a static argument
- *
- * @param name
- * @return
- */
- public int getIndex(AttributeName name) {
- for (int i = 0; i < length; i++) {
- if (names[i] == name) {
- return i;
- }
- }
- return -1;
- }
-
- /**
- * Only use with static argument.
- *
- * @see org.xml.sax.Attributes#getValue(java.lang.String)
- */
- public String getValue(AttributeName name) {
- int index = getIndex(name);
- if (index == -1) {
- return null;
- } else {
- return getValueNoBoundsCheck(index);
- }
- }
-
- public int getLength() {
- return length;
- }
-
- /**
- * Variant of <code>getLocalName(int index)</code> without bounds check.
- * @param index a valid attribute index
- * @return the local name at index
- */
- public @Local String getLocalNameNoBoundsCheck(int index) {
- // CPPONLY: assert index < length && index >= 0: "Index out of bounds";
- return names[index].getLocal(mode);
- }
-
- /**
- * Variant of <code>getURI(int index)</code> without bounds check.
- * @param index a valid attribute index
- * @return the namespace URI at index
- */
- public @NsUri String getURINoBoundsCheck(int index) {
- // CPPONLY: assert index < length && index >= 0: "Index out of bounds";
- return names[index].getUri(mode);
- }
-
- /**
- * Variant of <code>getPrefix(int index)</code> without bounds check.
- * @param index a valid attribute index
- * @return the namespace prefix at index
- */
- public @Prefix String getPrefixNoBoundsCheck(int index) {
- // CPPONLY: assert index < length && index >= 0: "Index out of bounds";
- return names[index].getPrefix(mode);
- }
-
- /**
- * Variant of <code>getValue(int index)</code> without bounds check.
- * @param index a valid attribute index
- * @return the attribute value at index
- */
- public String getValueNoBoundsCheck(int index) {
- // CPPONLY: assert index < length && index >= 0: "Index out of bounds";
- return values[index];
- }
-
- /**
- * Variant of <code>getAttributeName(int index)</code> without bounds check.
- * @param index a valid attribute index
- * @return the attribute name at index
- */
- public AttributeName getAttributeNameNoBoundsCheck(int index) {
- // CPPONLY: assert index < length && index >= 0: "Index out of bounds";
- return names[index];
- }
-
- // CPPONLY: /**
- // CPPONLY: * Obtains a line number without bounds check.
- // CPPONLY: * @param index a valid attribute index
- // CPPONLY: * @return the line number at index or -1 if unknown
- // CPPONLY: */
- // CPPONLY: public int getLineNoBoundsCheck(int index) {
- // CPPONLY: assert index < length && index >= 0: "Index out of bounds";
- // CPPONLY: return lines[index];
- // CPPONLY: }
-
- // [NOCPP[
-
- /**
- * Variant of <code>getQName(int index)</code> without bounds check.
- * @param index a valid attribute index
- * @return the QName at index
- */
- public @QName String getQNameNoBoundsCheck(int index) {
- return names[index].getQName(mode);
- }
-
- /**
- * Variant of <code>getType(int index)</code> without bounds check.
- * @param index a valid attribute index
- * @return the attribute type at index
- */
- public @IdType String getTypeNoBoundsCheck(int index) {
- return (names[index] == AttributeName.ID) ? "ID" : "CDATA";
- }
-
- public int getIndex(String qName) {
- for (int i = 0; i < length; i++) {
- if (names[i].getQName(mode).equals(qName)) {
- return i;
- }
- }
- return -1;
- }
-
- public int getIndex(String uri, String localName) {
- for (int i = 0; i < length; i++) {
- if (names[i].getLocal(mode).equals(localName)
- && names[i].getUri(mode).equals(uri)) {
- return i;
- }
- }
- return -1;
- }
-
- public @IdType String getType(String qName) {
- int index = getIndex(qName);
- if (index == -1) {
- return null;
- } else {
- return getType(index);
- }
- }
-
- public @IdType String getType(String uri, String localName) {
- int index = getIndex(uri, localName);
- if (index == -1) {
- return null;
- } else {
- return getType(index);
- }
- }
-
- public String getValue(String qName) {
- int index = getIndex(qName);
- if (index == -1) {
- return null;
- } else {
- return getValue(index);
- }
- }
-
- public String getValue(String uri, String localName) {
- int index = getIndex(uri, localName);
- if (index == -1) {
- return null;
- } else {
- return getValue(index);
- }
- }
-
- public @Local String getLocalName(int index) {
- if (index < length && index >= 0) {
- return names[index].getLocal(mode);
- } else {
- return null;
- }
- }
-
- public @QName String getQName(int index) {
- if (index < length && index >= 0) {
- return names[index].getQName(mode);
- } else {
- return null;
- }
- }
-
- public @IdType String getType(int index) {
- if (index < length && index >= 0) {
- return (names[index] == AttributeName.ID) ? "ID" : "CDATA";
- } else {
- return null;
- }
- }
-
- public AttributeName getAttributeName(int index) {
- if (index < length && index >= 0) {
- return names[index];
- } else {
- return null;
- }
- }
-
- public @NsUri String getURI(int index) {
- if (index < length && index >= 0) {
- return names[index].getUri(mode);
- } else {
- return null;
- }
- }
-
- public @Prefix String getPrefix(int index) {
- if (index < length && index >= 0) {
- return names[index].getPrefix(mode);
- } else {
- return null;
- }
- }
-
- public String getValue(int index) {
- if (index < length && index >= 0) {
- return values[index];
- } else {
- return null;
- }
- }
-
- public String getId() {
- return idValue;
- }
-
- public int getXmlnsLength() {
- return xmlnsLength;
- }
-
- public @Local String getXmlnsLocalName(int index) {
- if (index < xmlnsLength && index >= 0) {
- return xmlnsNames[index].getLocal(mode);
- } else {
- return null;
- }
- }
-
- public @NsUri String getXmlnsURI(int index) {
- if (index < xmlnsLength && index >= 0) {
- return xmlnsNames[index].getUri(mode);
- } else {
- return null;
- }
- }
-
- public String getXmlnsValue(int index) {
- if (index < xmlnsLength && index >= 0) {
- return xmlnsValues[index];
- } else {
- return null;
- }
- }
-
- public int getXmlnsIndex(AttributeName name) {
- for (int i = 0; i < xmlnsLength; i++) {
- if (xmlnsNames[i] == name) {
- return i;
- }
- }
- return -1;
- }
-
- public String getXmlnsValue(AttributeName name) {
- int index = getXmlnsIndex(name);
- if (index == -1) {
- return null;
- } else {
- return getXmlnsValue(index);
- }
- }
-
- public AttributeName getXmlnsAttributeName(int index) {
- if (index < xmlnsLength && index >= 0) {
- return xmlnsNames[index];
- } else {
- return null;
- }
- }
-
- // ]NOCPP]
-
- void addAttribute(AttributeName name, String value
- // [NOCPP[
- , XmlViolationPolicy xmlnsPolicy
- // ]NOCPP]
- // CPPONLY: , int line
- ) throws SAXException {
- // [NOCPP[
- if (name == AttributeName.ID) {
- idValue = value;
- }
-
- if (name.isXmlns()) {
- if (xmlnsNames.length == xmlnsLength) {
- int newLen = xmlnsLength == 0 ? 2 : xmlnsLength << 1;
- AttributeName[] newNames = new AttributeName[newLen];
- System.arraycopy(xmlnsNames, 0, newNames, 0, xmlnsNames.length);
- xmlnsNames = newNames;
- String[] newValues = new String[newLen];
- System.arraycopy(xmlnsValues, 0, newValues, 0, xmlnsValues.length);
- xmlnsValues = newValues;
- }
- xmlnsNames[xmlnsLength] = name;
- xmlnsValues[xmlnsLength] = value;
- xmlnsLength++;
- switch (xmlnsPolicy) {
- case FATAL:
- // this is ugly
- throw new SAXException("Saw an xmlns attribute.");
- case ALTER_INFOSET:
- return;
- case ALLOW:
- // fall through
- }
- }
-
- // ]NOCPP]
-
- if (names.length == length) {
- int newLen = length << 1; // The first growth covers virtually
- // 100% of elements according to
- // Hixie
- AttributeName[] newNames = new AttributeName[newLen];
- System.arraycopy(names, 0, newNames, 0, names.length);
- names = newNames;
- String[] newValues = new String[newLen];
- System.arraycopy(values, 0, newValues, 0, values.length);
- values = newValues;
- // CPPONLY: int[] newLines = new int[newLen];
- // CPPONLY: System.arraycopy(lines, 0, newLines, 0, lines.length);
- // CPPONLY: lines = newLines;
- }
- names[length] = name;
- values[length] = value;
- // CPPONLY: lines[length] = line;
- length++;
- }
-
- void clear(int m) {
- for (int i = 0; i < length; i++) {
- names[i].release();
- names[i] = null;
- Portability.releaseString(values[i]);
- values[i] = null;
- }
- length = 0;
- mode = m;
- // [NOCPP[
- idValue = null;
- for (int i = 0; i < xmlnsLength; i++) {
- xmlnsNames[i] = null;
- xmlnsValues[i] = null;
- }
- xmlnsLength = 0;
- // ]NOCPP]
- }
-
- /**
- * This is used in C++ to release special <code>isindex</code>
- * attribute values whose ownership is not transferred.
- */
- void releaseValue(int i) {
- Portability.releaseString(values[i]);
- }
-
- /**
- * This is only used for <code>AttributeName</code> ownership transfer
- * in the isindex case to avoid freeing custom names twice in C++.
- */
- void clearWithoutReleasingContents() {
- for (int i = 0; i < length; i++) {
- names[i] = null;
- values[i] = null;
- }
- length = 0;
- }
-
- boolean contains(AttributeName name) {
- for (int i = 0; i < length; i++) {
- if (name.equalsAnother(names[i])) {
- return true;
- }
- }
- // [NOCPP[
- for (int i = 0; i < xmlnsLength; i++) {
- if (name.equalsAnother(xmlnsNames[i])) {
- return true;
- }
- }
- // ]NOCPP]
- return false;
- }
-
- public void adjustForMath() {
- mode = AttributeName.MATHML;
- }
-
- public void adjustForSvg() {
- mode = AttributeName.SVG;
- }
-
- public HtmlAttributes cloneAttributes(Interner interner)
- throws SAXException {
- assert (length == 0
- // [NOCPP[
- && xmlnsLength == 0
- // ]NOCPP]
- )
- || mode == 0 || mode == 3;
- HtmlAttributes clone = new HtmlAttributes(0);
- for (int i = 0; i < length; i++) {
- clone.addAttribute(names[i].cloneAttributeName(interner),
- Portability.newStringFromString(values[i])
- // [NOCPP[
- , XmlViolationPolicy.ALLOW
- // ]NOCPP]
- // CPPONLY: , lines[i]
- );
- }
- // [NOCPP[
- for (int i = 0; i < xmlnsLength; i++) {
- clone.addAttribute(xmlnsNames[i], xmlnsValues[i],
- XmlViolationPolicy.ALLOW);
- }
- // ]NOCPP]
- return clone; // XXX!!!
- }
-
- public boolean equalsAnother(HtmlAttributes other) {
- assert mode == 0 || mode == 3 : "Trying to compare attributes in foreign content.";
- int otherLength = other.getLength();
- if (length != otherLength) {
- return false;
- }
- for (int i = 0; i < length; i++) {
- // Work around the limitations of C++
- boolean found = false;
- // The comparing just the local names is OK, since these attribute
- // holders are both supposed to belong to HTML formatting elements
- @Local String ownLocal = names[i].getLocal(AttributeName.HTML);
- for (int j = 0; j < otherLength; j++) {
- if (ownLocal == other.names[j].getLocal(AttributeName.HTML)) {
- found = true;
- if (!Portability.stringEqualsString(values[i], other.values[j])) {
- return false;
- }
- }
- }
- if (!found) {
- return false;
- }
- }
- return true;
- }
-
- // [NOCPP[
-
- void processNonNcNames(TreeBuilder<?> treeBuilder, XmlViolationPolicy namePolicy) throws SAXException {
- for (int i = 0; i < length; i++) {
- AttributeName attName = names[i];
- if (!attName.isNcName(mode)) {
- String name = attName.getLocal(mode);
- switch (namePolicy) {
- case ALTER_INFOSET:
- names[i] = AttributeName.create(NCName.escapeName(name));
- // fall through
- case ALLOW:
- if (attName != AttributeName.XML_LANG) {
- treeBuilder.warn("Attribute \u201C" + name + "\u201D is not serializable as XML 1.0.");
- }
- break;
- case FATAL:
- treeBuilder.fatal("Attribute \u201C" + name + "\u201D is not serializable as XML 1.0.");
- break;
- }
- }
- }
- }
-
- public void merge(HtmlAttributes attributes) throws SAXException {
- int len = attributes.getLength();
- for (int i = 0; i < len; i++) {
- AttributeName name = attributes.getAttributeNameNoBoundsCheck(i);
- if (!contains(name)) {
- addAttribute(name, attributes.getValueNoBoundsCheck(i), XmlViolationPolicy.ALLOW);
- }
- }
- }
-
-
- // ]NOCPP]
-
-}
diff --git a/parser/html/javasrc/MetaScanner.java b/parser/html/javasrc/MetaScanner.java
deleted file mode 100644
index be9aabfe3..000000000
--- a/parser/html/javasrc/MetaScanner.java
+++ /dev/null
@@ -1,854 +0,0 @@
-/*
- * Copyright (c) 2007 Henri Sivonen
- * Copyright (c) 2008-2015 Mozilla Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.impl;
-
-import java.io.IOException;
-
-import nu.validator.htmlparser.annotation.Auto;
-import nu.validator.htmlparser.annotation.Inline;
-import nu.validator.htmlparser.common.ByteReadable;
-
-import org.xml.sax.SAXException;
-
-public abstract class MetaScanner {
-
- /**
- * Constant for "charset".
- */
- private static final char[] CHARSET = { 'h', 'a', 'r', 's', 'e', 't' };
-
- /**
- * Constant for "content".
- */
- private static final char[] CONTENT = { 'o', 'n', 't', 'e', 'n', 't' };
-
- /**
- * Constant for "http-equiv".
- */
- private static final char[] HTTP_EQUIV = { 't', 't', 'p', '-', 'e', 'q',
- 'u', 'i', 'v' };
-
- /**
- * Constant for "content-type".
- */
- private static final char[] CONTENT_TYPE = { 'c', 'o', 'n', 't', 'e', 'n',
- 't', '-', 't', 'y', 'p', 'e' };
-
- private static final int NO = 0;
-
- private static final int M = 1;
-
- private static final int E = 2;
-
- private static final int T = 3;
-
- private static final int A = 4;
-
- private static final int DATA = 0;
-
- private static final int TAG_OPEN = 1;
-
- private static final int SCAN_UNTIL_GT = 2;
-
- private static final int TAG_NAME = 3;
-
- private static final int BEFORE_ATTRIBUTE_NAME = 4;
-
- private static final int ATTRIBUTE_NAME = 5;
-
- private static final int AFTER_ATTRIBUTE_NAME = 6;
-
- private static final int BEFORE_ATTRIBUTE_VALUE = 7;
-
- private static final int ATTRIBUTE_VALUE_DOUBLE_QUOTED = 8;
-
- private static final int ATTRIBUTE_VALUE_SINGLE_QUOTED = 9;
-
- private static final int ATTRIBUTE_VALUE_UNQUOTED = 10;
-
- private static final int AFTER_ATTRIBUTE_VALUE_QUOTED = 11;
-
- private static final int MARKUP_DECLARATION_OPEN = 13;
-
- private static final int MARKUP_DECLARATION_HYPHEN = 14;
-
- private static final int COMMENT_START = 15;
-
- private static final int COMMENT_START_DASH = 16;
-
- private static final int COMMENT = 17;
-
- private static final int COMMENT_END_DASH = 18;
-
- private static final int COMMENT_END = 19;
-
- private static final int SELF_CLOSING_START_TAG = 20;
-
- private static final int HTTP_EQUIV_NOT_SEEN = 0;
-
- private static final int HTTP_EQUIV_CONTENT_TYPE = 1;
-
- private static final int HTTP_EQUIV_OTHER = 2;
-
- /**
- * The data source.
- */
- protected ByteReadable readable;
-
- /**
- * The state of the state machine that recognizes the tag name "meta".
- */
- private int metaState = NO;
-
- /**
- * The current position in recognizing the attribute name "content".
- */
- private int contentIndex = Integer.MAX_VALUE;
-
- /**
- * The current position in recognizing the attribute name "charset".
- */
- private int charsetIndex = Integer.MAX_VALUE;
-
- /**
- * The current position in recognizing the attribute name "http-equive".
- */
- private int httpEquivIndex = Integer.MAX_VALUE;
-
- /**
- * The current position in recognizing the attribute value "content-type".
- */
- private int contentTypeIndex = Integer.MAX_VALUE;
-
- /**
- * The tokenizer state.
- */
- protected int stateSave = DATA;
-
- /**
- * The currently filled length of strBuf.
- */
- private int strBufLen;
-
- /**
- * Accumulation buffer for attribute values.
- */
- private @Auto char[] strBuf;
-
- private String content;
-
- private String charset;
-
- private int httpEquivState;
-
- // CPPONLY: private TreeBuilder treeBuilder;
-
- public MetaScanner(
- // CPPONLY: TreeBuilder tb
- ) {
- this.readable = null;
- this.metaState = NO;
- this.contentIndex = Integer.MAX_VALUE;
- this.charsetIndex = Integer.MAX_VALUE;
- this.httpEquivIndex = Integer.MAX_VALUE;
- this.contentTypeIndex = Integer.MAX_VALUE;
- this.stateSave = DATA;
- this.strBufLen = 0;
- this.strBuf = new char[36];
- this.content = null;
- this.charset = null;
- this.httpEquivState = HTTP_EQUIV_NOT_SEEN;
- // CPPONLY: this.treeBuilder = tb;
- }
-
- @SuppressWarnings("unused") private void destructor() {
- Portability.releaseString(content);
- Portability.releaseString(charset);
- }
-
- // [NOCPP[
-
- /**
- * Reads a byte from the data source.
- *
- * -1 means end.
- * @return
- * @throws IOException
- */
- protected int read() throws IOException {
- return readable.readByte();
- }
-
- // ]NOCPP]
-
- // WARNING When editing this, makes sure the bytecode length shown by javap
- // stays under 8000 bytes!
- /**
- * The runs the meta scanning algorithm.
- */
- protected final void stateLoop(int state)
- throws SAXException, IOException {
- int c = -1;
- boolean reconsume = false;
- stateloop: for (;;) {
- switch (state) {
- case DATA:
- dataloop: for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- c = read();
- }
- switch (c) {
- case -1:
- break stateloop;
- case '<':
- state = MetaScanner.TAG_OPEN;
- break dataloop; // FALL THROUGH continue
- // stateloop;
- default:
- continue;
- }
- }
- // WARNING FALLTHRU CASE TRANSITION: DON'T REORDER
- case TAG_OPEN:
- tagopenloop: for (;;) {
- c = read();
- switch (c) {
- case -1:
- break stateloop;
- case 'm':
- case 'M':
- metaState = M;
- state = MetaScanner.TAG_NAME;
- break tagopenloop;
- // continue stateloop;
- case '!':
- state = MetaScanner.MARKUP_DECLARATION_OPEN;
- continue stateloop;
- case '?':
- case '/':
- state = MetaScanner.SCAN_UNTIL_GT;
- continue stateloop;
- case '>':
- state = MetaScanner.DATA;
- continue stateloop;
- default:
- if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) {
- metaState = NO;
- state = MetaScanner.TAG_NAME;
- break tagopenloop;
- // continue stateloop;
- }
- state = MetaScanner.DATA;
- reconsume = true;
- continue stateloop;
- }
- }
- // FALL THROUGH DON'T REORDER
- case TAG_NAME:
- tagnameloop: for (;;) {
- c = read();
- switch (c) {
- case -1:
- break stateloop;
- case ' ':
- case '\t':
- case '\n':
- case '\u000C':
- state = MetaScanner.BEFORE_ATTRIBUTE_NAME;
- break tagnameloop;
- // continue stateloop;
- case '/':
- state = MetaScanner.SELF_CLOSING_START_TAG;
- continue stateloop;
- case '>':
- state = MetaScanner.DATA;
- continue stateloop;
- case 'e':
- case 'E':
- if (metaState == M) {
- metaState = E;
- } else {
- metaState = NO;
- }
- continue;
- case 't':
- case 'T':
- if (metaState == E) {
- metaState = T;
- } else {
- metaState = NO;
- }
- continue;
- case 'a':
- case 'A':
- if (metaState == T) {
- metaState = A;
- } else {
- metaState = NO;
- }
- continue;
- default:
- metaState = NO;
- continue;
- }
- }
- // FALLTHRU DON'T REORDER
- case BEFORE_ATTRIBUTE_NAME:
- beforeattributenameloop: for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- c = read();
- }
- /*
- * Consume the next input character:
- */
- switch (c) {
- case -1:
- break stateloop;
- case ' ':
- case '\t':
- case '\n':
- case '\u000C':
- continue;
- case '/':
- state = MetaScanner.SELF_CLOSING_START_TAG;
- continue stateloop;
- case '>':
- if (handleTag()) {
- break stateloop;
- }
- state = DATA;
- continue stateloop;
- case 'c':
- case 'C':
- contentIndex = 0;
- charsetIndex = 0;
- httpEquivIndex = Integer.MAX_VALUE;
- contentTypeIndex = Integer.MAX_VALUE;
- state = MetaScanner.ATTRIBUTE_NAME;
- break beforeattributenameloop;
- case 'h':
- case 'H':
- contentIndex = Integer.MAX_VALUE;
- charsetIndex = Integer.MAX_VALUE;
- httpEquivIndex = 0;
- contentTypeIndex = Integer.MAX_VALUE;
- state = MetaScanner.ATTRIBUTE_NAME;
- break beforeattributenameloop;
- default:
- contentIndex = Integer.MAX_VALUE;
- charsetIndex = Integer.MAX_VALUE;
- httpEquivIndex = Integer.MAX_VALUE;
- contentTypeIndex = Integer.MAX_VALUE;
- state = MetaScanner.ATTRIBUTE_NAME;
- break beforeattributenameloop;
- // continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case ATTRIBUTE_NAME:
- attributenameloop: for (;;) {
- c = read();
- switch (c) {
- case -1:
- break stateloop;
- case ' ':
- case '\t':
- case '\n':
- case '\u000C':
- state = MetaScanner.AFTER_ATTRIBUTE_NAME;
- continue stateloop;
- case '/':
- state = MetaScanner.SELF_CLOSING_START_TAG;
- continue stateloop;
- case '=':
- strBufLen = 0;
- contentTypeIndex = 0;
- state = MetaScanner.BEFORE_ATTRIBUTE_VALUE;
- break attributenameloop;
- // continue stateloop;
- case '>':
- if (handleTag()) {
- break stateloop;
- }
- state = MetaScanner.DATA;
- continue stateloop;
- default:
- if (metaState == A) {
- if (c >= 'A' && c <= 'Z') {
- c += 0x20;
- }
- if (contentIndex < CONTENT.length && c == CONTENT[contentIndex]) {
- ++contentIndex;
- } else {
- contentIndex = Integer.MAX_VALUE;
- }
- if (charsetIndex < CHARSET.length && c == CHARSET[charsetIndex]) {
- ++charsetIndex;
- } else {
- charsetIndex = Integer.MAX_VALUE;
- }
- if (httpEquivIndex < HTTP_EQUIV.length && c == HTTP_EQUIV[httpEquivIndex]) {
- ++httpEquivIndex;
- } else {
- httpEquivIndex = Integer.MAX_VALUE;
- }
- }
- continue;
- }
- }
- // FALLTHRU DON'T REORDER
- case BEFORE_ATTRIBUTE_VALUE:
- beforeattributevalueloop: for (;;) {
- c = read();
- switch (c) {
- case -1:
- break stateloop;
- case ' ':
- case '\t':
- case '\n':
- case '\u000C':
- continue;
- case '"':
- state = MetaScanner.ATTRIBUTE_VALUE_DOUBLE_QUOTED;
- break beforeattributevalueloop;
- // continue stateloop;
- case '\'':
- state = MetaScanner.ATTRIBUTE_VALUE_SINGLE_QUOTED;
- continue stateloop;
- case '>':
- if (handleTag()) {
- break stateloop;
- }
- state = MetaScanner.DATA;
- continue stateloop;
- default:
- handleCharInAttributeValue(c);
- state = MetaScanner.ATTRIBUTE_VALUE_UNQUOTED;
- continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case ATTRIBUTE_VALUE_DOUBLE_QUOTED:
- attributevaluedoublequotedloop: for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- c = read();
- }
- switch (c) {
- case -1:
- break stateloop;
- case '"':
- handleAttributeValue();
- state = MetaScanner.AFTER_ATTRIBUTE_VALUE_QUOTED;
- break attributevaluedoublequotedloop;
- // continue stateloop;
- default:
- handleCharInAttributeValue(c);
- continue;
- }
- }
- // FALLTHRU DON'T REORDER
- case AFTER_ATTRIBUTE_VALUE_QUOTED:
- afterattributevaluequotedloop: for (;;) {
- c = read();
- switch (c) {
- case -1:
- break stateloop;
- case ' ':
- case '\t':
- case '\n':
- case '\u000C':
- state = MetaScanner.BEFORE_ATTRIBUTE_NAME;
- continue stateloop;
- case '/':
- state = MetaScanner.SELF_CLOSING_START_TAG;
- break afterattributevaluequotedloop;
- // continue stateloop;
- case '>':
- if (handleTag()) {
- break stateloop;
- }
- state = MetaScanner.DATA;
- continue stateloop;
- default:
- state = MetaScanner.BEFORE_ATTRIBUTE_NAME;
- reconsume = true;
- continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case SELF_CLOSING_START_TAG:
- c = read();
- switch (c) {
- case -1:
- break stateloop;
- case '>':
- if (handleTag()) {
- break stateloop;
- }
- state = MetaScanner.DATA;
- continue stateloop;
- default:
- state = MetaScanner.BEFORE_ATTRIBUTE_NAME;
- reconsume = true;
- continue stateloop;
- }
- // XXX reorder point
- case ATTRIBUTE_VALUE_UNQUOTED:
- for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- c = read();
- }
- switch (c) {
- case -1:
- break stateloop;
- case ' ':
- case '\t':
- case '\n':
-
- case '\u000C':
- handleAttributeValue();
- state = MetaScanner.BEFORE_ATTRIBUTE_NAME;
- continue stateloop;
- case '>':
- handleAttributeValue();
- if (handleTag()) {
- break stateloop;
- }
- state = MetaScanner.DATA;
- continue stateloop;
- default:
- handleCharInAttributeValue(c);
- continue;
- }
- }
- // XXX reorder point
- case AFTER_ATTRIBUTE_NAME:
- for (;;) {
- c = read();
- switch (c) {
- case -1:
- break stateloop;
- case ' ':
- case '\t':
- case '\n':
- case '\u000C':
- continue;
- case '/':
- handleAttributeValue();
- state = MetaScanner.SELF_CLOSING_START_TAG;
- continue stateloop;
- case '=':
- strBufLen = 0;
- contentTypeIndex = 0;
- state = MetaScanner.BEFORE_ATTRIBUTE_VALUE;
- continue stateloop;
- case '>':
- handleAttributeValue();
- if (handleTag()) {
- break stateloop;
- }
- state = MetaScanner.DATA;
- continue stateloop;
- case 'c':
- case 'C':
- contentIndex = 0;
- charsetIndex = 0;
- state = MetaScanner.ATTRIBUTE_NAME;
- continue stateloop;
- default:
- contentIndex = Integer.MAX_VALUE;
- charsetIndex = Integer.MAX_VALUE;
- state = MetaScanner.ATTRIBUTE_NAME;
- continue stateloop;
- }
- }
- // XXX reorder point
- case MARKUP_DECLARATION_OPEN:
- markupdeclarationopenloop: for (;;) {
- c = read();
- switch (c) {
- case -1:
- break stateloop;
- case '-':
- state = MetaScanner.MARKUP_DECLARATION_HYPHEN;
- break markupdeclarationopenloop;
- // continue stateloop;
- default:
- state = MetaScanner.SCAN_UNTIL_GT;
- reconsume = true;
- continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case MARKUP_DECLARATION_HYPHEN:
- markupdeclarationhyphenloop: for (;;) {
- c = read();
- switch (c) {
- case -1:
- break stateloop;
- case '-':
- state = MetaScanner.COMMENT_START;
- break markupdeclarationhyphenloop;
- // continue stateloop;
- default:
- state = MetaScanner.SCAN_UNTIL_GT;
- reconsume = true;
- continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case COMMENT_START:
- commentstartloop: for (;;) {
- c = read();
- switch (c) {
- case -1:
- break stateloop;
- case '-':
- state = MetaScanner.COMMENT_START_DASH;
- continue stateloop;
- case '>':
- state = MetaScanner.DATA;
- continue stateloop;
- default:
- state = MetaScanner.COMMENT;
- break commentstartloop;
- // continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case COMMENT:
- commentloop: for (;;) {
- c = read();
- switch (c) {
- case -1:
- break stateloop;
- case '-':
- state = MetaScanner.COMMENT_END_DASH;
- break commentloop;
- // continue stateloop;
- default:
- continue;
- }
- }
- // FALLTHRU DON'T REORDER
- case COMMENT_END_DASH:
- commentenddashloop: for (;;) {
- c = read();
- switch (c) {
- case -1:
- break stateloop;
- case '-':
- state = MetaScanner.COMMENT_END;
- break commentenddashloop;
- // continue stateloop;
- default:
- state = MetaScanner.COMMENT;
- continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case COMMENT_END:
- for (;;) {
- c = read();
- switch (c) {
- case -1:
- break stateloop;
- case '>':
- state = MetaScanner.DATA;
- continue stateloop;
- case '-':
- continue;
- default:
- state = MetaScanner.COMMENT;
- continue stateloop;
- }
- }
- // XXX reorder point
- case COMMENT_START_DASH:
- c = read();
- switch (c) {
- case -1:
- break stateloop;
- case '-':
- state = MetaScanner.COMMENT_END;
- continue stateloop;
- case '>':
- state = MetaScanner.DATA;
- continue stateloop;
- default:
- state = MetaScanner.COMMENT;
- continue stateloop;
- }
- // XXX reorder point
- case ATTRIBUTE_VALUE_SINGLE_QUOTED:
- for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- c = read();
- }
- switch (c) {
- case -1:
- break stateloop;
- case '\'':
- handleAttributeValue();
- state = MetaScanner.AFTER_ATTRIBUTE_VALUE_QUOTED;
- continue stateloop;
- default:
- handleCharInAttributeValue(c);
- continue;
- }
- }
- // XXX reorder point
- case SCAN_UNTIL_GT:
- for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- c = read();
- }
- switch (c) {
- case -1:
- break stateloop;
- case '>':
- state = MetaScanner.DATA;
- continue stateloop;
- default:
- continue;
- }
- }
- }
- }
- stateSave = state;
- }
-
- private void handleCharInAttributeValue(int c) {
- if (metaState == A) {
- if (contentIndex == CONTENT.length || charsetIndex == CHARSET.length) {
- addToBuffer(c);
- } else if (httpEquivIndex == HTTP_EQUIV.length) {
- if (contentTypeIndex < CONTENT_TYPE.length && toAsciiLowerCase(c) == CONTENT_TYPE[contentTypeIndex]) {
- ++contentTypeIndex;
- } else {
- contentTypeIndex = Integer.MAX_VALUE;
- }
- }
- }
- }
-
- @Inline private int toAsciiLowerCase(int c) {
- if (c >= 'A' && c <= 'Z') {
- return c + 0x20;
- }
- return c;
- }
-
- /**
- * Adds a character to the accumulation buffer.
- * @param c the character to add
- */
- private void addToBuffer(int c) {
- if (strBufLen == strBuf.length) {
- char[] newBuf = new char[strBuf.length + (strBuf.length << 1)];
- System.arraycopy(strBuf, 0, newBuf, 0, strBuf.length);
- strBuf = newBuf;
- }
- strBuf[strBufLen++] = (char)c;
- }
-
- /**
- * Attempts to extract a charset name from the accumulation buffer.
- * @return <code>true</code> if successful
- * @throws SAXException
- */
- private void handleAttributeValue() throws SAXException {
- if (metaState != A) {
- return;
- }
- if (contentIndex == CONTENT.length && content == null) {
- content = Portability.newStringFromBuffer(strBuf, 0, strBufLen
- // CPPONLY: , treeBuilder
- );
- return;
- }
- if (charsetIndex == CHARSET.length && charset == null) {
- charset = Portability.newStringFromBuffer(strBuf, 0, strBufLen
- // CPPONLY: , treeBuilder
- );
- return;
- }
- if (httpEquivIndex == HTTP_EQUIV.length
- && httpEquivState == HTTP_EQUIV_NOT_SEEN) {
- httpEquivState = (contentTypeIndex == CONTENT_TYPE.length) ? HTTP_EQUIV_CONTENT_TYPE
- : HTTP_EQUIV_OTHER;
- return;
- }
- }
-
- private boolean handleTag() throws SAXException {
- boolean stop = handleTagInner();
- Portability.releaseString(content);
- content = null;
- Portability.releaseString(charset);
- charset = null;
- httpEquivState = HTTP_EQUIV_NOT_SEEN;
- return stop;
- }
-
- private boolean handleTagInner() throws SAXException {
- if (charset != null && tryCharset(charset)) {
- return true;
- }
- if (content != null && httpEquivState == HTTP_EQUIV_CONTENT_TYPE) {
- String extract = TreeBuilder.extractCharsetFromContent(content
- // CPPONLY: , treeBuilder
- );
- if (extract == null) {
- return false;
- }
- boolean success = tryCharset(extract);
- Portability.releaseString(extract);
- return success;
- }
- return false;
- }
-
- /**
- * Tries to switch to an encoding.
- *
- * @param encoding
- * @return <code>true</code> if successful
- * @throws SAXException
- */
- protected abstract boolean tryCharset(String encoding) throws SAXException;
-
-}
diff --git a/parser/html/javasrc/Portability.java b/parser/html/javasrc/Portability.java
deleted file mode 100644
index 485684ea1..000000000
--- a/parser/html/javasrc/Portability.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (c) 2008-2015 Mozilla Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.impl;
-
-import nu.validator.htmlparser.annotation.Literal;
-import nu.validator.htmlparser.annotation.Local;
-import nu.validator.htmlparser.annotation.NoLength;
-import nu.validator.htmlparser.common.Interner;
-
-public final class Portability {
-
- // Allocating methods
-
- /**
- * Allocates a new local name object. In C++, the refcount must be set up in such a way that
- * calling <code>releaseLocal</code> on the return value balances the refcount set by this method.
- */
- public static @Local String newLocalNameFromBuffer(@NoLength char[] buf, int offset, int length, Interner interner) {
- return new String(buf, offset, length).intern();
- }
-
- public static String newStringFromBuffer(@NoLength char[] buf, int offset, int length
- // CPPONLY: , TreeBuilder treeBuilder
- ) {
- return new String(buf, offset, length);
- }
-
- public static String newEmptyString() {
- return "";
- }
-
- public static String newStringFromLiteral(@Literal String literal) {
- return literal;
- }
-
- public static String newStringFromString(String string) {
- return string;
- }
-
- // XXX get rid of this
- public static char[] newCharArrayFromLocal(@Local String local) {
- return local.toCharArray();
- }
-
- public static char[] newCharArrayFromString(String string) {
- return string.toCharArray();
- }
-
- public static @Local String newLocalFromLocal(@Local String local, Interner interner) {
- return local;
- }
-
- // Deallocation methods
-
- public static void releaseString(String str) {
- // No-op in Java
- }
-
- // Comparison methods
-
- public static boolean localEqualsBuffer(@Local String local, @NoLength char[] buf, int offset, int length) {
- if (local.length() != length) {
- return false;
- }
- for (int i = 0; i < length; i++) {
- if (local.charAt(i) != buf[offset + i]) {
- return false;
- }
- }
- return true;
- }
-
- public static boolean lowerCaseLiteralIsPrefixOfIgnoreAsciiCaseString(@Literal String lowerCaseLiteral,
- String string) {
- if (string == null) {
- return false;
- }
- if (lowerCaseLiteral.length() > string.length()) {
- return false;
- }
- for (int i = 0; i < lowerCaseLiteral.length(); i++) {
- char c0 = lowerCaseLiteral.charAt(i);
- char c1 = string.charAt(i);
- if (c1 >= 'A' && c1 <= 'Z') {
- c1 += 0x20;
- }
- if (c0 != c1) {
- return false;
- }
- }
- return true;
- }
-
- public static boolean lowerCaseLiteralEqualsIgnoreAsciiCaseString(@Literal String lowerCaseLiteral,
- String string) {
- if (string == null) {
- return false;
- }
- if (lowerCaseLiteral.length() != string.length()) {
- return false;
- }
- for (int i = 0; i < lowerCaseLiteral.length(); i++) {
- char c0 = lowerCaseLiteral.charAt(i);
- char c1 = string.charAt(i);
- if (c1 >= 'A' && c1 <= 'Z') {
- c1 += 0x20;
- }
- if (c0 != c1) {
- return false;
- }
- }
- return true;
- }
-
- public static boolean literalEqualsString(@Literal String literal, String string) {
- return literal.equals(string);
- }
-
- public static boolean stringEqualsString(String one, String other) {
- return one.equals(other);
- }
-
- public static void delete(Object o) {
-
- }
-
- public static void deleteArray(Object o) {
-
- }
-}
diff --git a/parser/html/javasrc/README.txt b/parser/html/javasrc/README.txt
deleted file mode 100644
index 4555969ca..000000000
--- a/parser/html/javasrc/README.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-The .java files in this directory were placed here by the Java-to-C++
-translator that lives in parser/html/java/translator. Together they represent
-a snapshot of the Java code that was translated to produce the corresponding
-.h and .cpp files in the parent directory. Changing these .java files is not
-worthwhile, as they will just be overwritten by the next translation. See
-parser/html/java/README.txt for information about performing the translation.
diff --git a/parser/html/javasrc/StackNode.java b/parser/html/javasrc/StackNode.java
deleted file mode 100644
index 9aeaba0be..000000000
--- a/parser/html/javasrc/StackNode.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * Copyright (c) 2007 Henri Sivonen
- * Copyright (c) 2007-2011 Mozilla Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.impl;
-
-import nu.validator.htmlparser.annotation.Inline;
-import nu.validator.htmlparser.annotation.Local;
-import nu.validator.htmlparser.annotation.NsUri;
-
-final class StackNode<T> {
- final int flags;
-
- final @Local String name;
-
- final @Local String popName;
-
- final @NsUri String ns;
-
- final T node;
-
- // Only used on the list of formatting elements
- HtmlAttributes attributes;
-
- private int refcount = 1;
-
- // [NOCPP[
-
- private final TaintableLocatorImpl locator;
-
- public TaintableLocatorImpl getLocator() {
- return locator;
- }
-
- // ]NOCPP]
-
- @Inline public int getFlags() {
- return flags;
- }
-
- public int getGroup() {
- return flags & ElementName.GROUP_MASK;
- }
-
- public boolean isScoping() {
- return (flags & ElementName.SCOPING) != 0;
- }
-
- public boolean isSpecial() {
- return (flags & ElementName.SPECIAL) != 0;
- }
-
- public boolean isFosterParenting() {
- return (flags & ElementName.FOSTER_PARENTING) != 0;
- }
-
- public boolean isHtmlIntegrationPoint() {
- return (flags & ElementName.HTML_INTEGRATION_POINT) != 0;
- }
-
- // [NOCPP[
-
- public boolean isOptionalEndTag() {
- return (flags & ElementName.OPTIONAL_END_TAG) != 0;
- }
-
- // ]NOCPP]
-
- /**
- * Constructor for copying. This doesn't take another <code>StackNode</code>
- * because in C++ the caller is reponsible for reobtaining the local names
- * from another interner.
- *
- * @param flags
- * @param ns
- * @param name
- * @param node
- * @param popName
- * @param attributes
- */
- StackNode(int flags, @NsUri String ns, @Local String name, T node,
- @Local String popName, HtmlAttributes attributes
- // [NOCPP[
- , TaintableLocatorImpl locator
- // ]NOCPP]
- ) {
- this.flags = flags;
- this.name = name;
- this.popName = popName;
- this.ns = ns;
- this.node = node;
- this.attributes = attributes;
- this.refcount = 1;
- // [NOCPP[
- this.locator = locator;
- // ]NOCPP]
- }
-
- /**
- * Short hand for well-known HTML elements.
- *
- * @param elementName
- * @param node
- */
- StackNode(ElementName elementName, T node
- // [NOCPP[
- , TaintableLocatorImpl locator
- // ]NOCPP]
- ) {
- this.flags = elementName.getFlags();
- this.name = elementName.name;
- this.popName = elementName.name;
- this.ns = "http://www.w3.org/1999/xhtml";
- this.node = node;
- this.attributes = null;
- this.refcount = 1;
- assert !elementName.isCustom() : "Don't use this constructor for custom elements.";
- // [NOCPP[
- this.locator = locator;
- // ]NOCPP]
- }
-
- /**
- * Constructor for HTML formatting elements.
- *
- * @param elementName
- * @param node
- * @param attributes
- */
- StackNode(ElementName elementName, T node, HtmlAttributes attributes
- // [NOCPP[
- , TaintableLocatorImpl locator
- // ]NOCPP]
- ) {
- this.flags = elementName.getFlags();
- this.name = elementName.name;
- this.popName = elementName.name;
- this.ns = "http://www.w3.org/1999/xhtml";
- this.node = node;
- this.attributes = attributes;
- this.refcount = 1;
- assert !elementName.isCustom() : "Don't use this constructor for custom elements.";
- // [NOCPP[
- this.locator = locator;
- // ]NOCPP]
- }
-
- /**
- * The common-case HTML constructor.
- *
- * @param elementName
- * @param node
- * @param popName
- */
- StackNode(ElementName elementName, T node, @Local String popName
- // [NOCPP[
- , TaintableLocatorImpl locator
- // ]NOCPP]
- ) {
- this.flags = elementName.getFlags();
- this.name = elementName.name;
- this.popName = popName;
- this.ns = "http://www.w3.org/1999/xhtml";
- this.node = node;
- this.attributes = null;
- this.refcount = 1;
- // [NOCPP[
- this.locator = locator;
- // ]NOCPP]
- }
-
- /**
- * Constructor for SVG elements. Note that the order of the arguments is
- * what distinguishes this from the HTML constructor. This is ugly, but
- * AFAICT the least disruptive way to make this work with Java's generics
- * and without unnecessary branches. :-(
- *
- * @param elementName
- * @param popName
- * @param node
- */
- StackNode(ElementName elementName, @Local String popName, T node
- // [NOCPP[
- , TaintableLocatorImpl locator
- // ]NOCPP]
- ) {
- this.flags = prepareSvgFlags(elementName.getFlags());
- this.name = elementName.name;
- this.popName = popName;
- this.ns = "http://www.w3.org/2000/svg";
- this.node = node;
- this.attributes = null;
- this.refcount = 1;
- // [NOCPP[
- this.locator = locator;
- // ]NOCPP]
- }
-
- /**
- * Constructor for MathML.
- *
- * @param elementName
- * @param node
- * @param popName
- * @param markAsIntegrationPoint
- */
- StackNode(ElementName elementName, T node, @Local String popName,
- boolean markAsIntegrationPoint
- // [NOCPP[
- , TaintableLocatorImpl locator
- // ]NOCPP]
- ) {
- this.flags = prepareMathFlags(elementName.getFlags(),
- markAsIntegrationPoint);
- this.name = elementName.name;
- this.popName = popName;
- this.ns = "http://www.w3.org/1998/Math/MathML";
- this.node = node;
- this.attributes = null;
- this.refcount = 1;
- // [NOCPP[
- this.locator = locator;
- // ]NOCPP]
- }
-
- private static int prepareSvgFlags(int flags) {
- flags &= ~(ElementName.FOSTER_PARENTING | ElementName.SCOPING
- | ElementName.SPECIAL | ElementName.OPTIONAL_END_TAG);
- if ((flags & ElementName.SCOPING_AS_SVG) != 0) {
- flags |= (ElementName.SCOPING | ElementName.SPECIAL | ElementName.HTML_INTEGRATION_POINT);
- }
- return flags;
- }
-
- private static int prepareMathFlags(int flags,
- boolean markAsIntegrationPoint) {
- flags &= ~(ElementName.FOSTER_PARENTING | ElementName.SCOPING
- | ElementName.SPECIAL | ElementName.OPTIONAL_END_TAG);
- if ((flags & ElementName.SCOPING_AS_MATHML) != 0) {
- flags |= (ElementName.SCOPING | ElementName.SPECIAL);
- }
- if (markAsIntegrationPoint) {
- flags |= ElementName.HTML_INTEGRATION_POINT;
- }
- return flags;
- }
-
- @SuppressWarnings("unused") private void destructor() {
- Portability.delete(attributes);
- }
-
- public void dropAttributes() {
- attributes = null;
- }
-
- // [NOCPP[
- /**
- * @see java.lang.Object#toString()
- */
- @Override public @Local String toString() {
- return name;
- }
-
- // ]NOCPP]
-
- public void retain() {
- refcount++;
- }
-
- public void release() {
- refcount--;
- if (refcount == 0) {
- Portability.delete(this);
- }
- }
-}
diff --git a/parser/html/javasrc/StateSnapshot.java b/parser/html/javasrc/StateSnapshot.java
deleted file mode 100644
index ff89e0443..000000000
--- a/parser/html/javasrc/StateSnapshot.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright (c) 2009-2010 Mozilla Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.impl;
-
-import nu.validator.htmlparser.annotation.Auto;
-
-
-public class StateSnapshot<T> implements TreeBuilderState<T> {
-
- private final @Auto StackNode<T>[] stack;
-
- private final @Auto StackNode<T>[] listOfActiveFormattingElements;
-
- private final @Auto int[] templateModeStack;
-
- private final T formPointer;
-
- private final T headPointer;
-
- private final T deepTreeSurrogateParent;
-
- private final int mode;
-
- private final int originalMode;
-
- private final boolean framesetOk;
-
- private final boolean needToDropLF;
-
- private final boolean quirks;
-
- /**
- * @param stack
- * @param listOfActiveFormattingElements
- * @param templateModeStack
- * @param formPointer
- * @param headPointer
- * @param deepTreeSurrogateParent
- * @param mode
- * @param originalMode
- * @param framesetOk
- * @param needToDropLF
- * @param quirks
- */
- StateSnapshot(StackNode<T>[] stack,
- StackNode<T>[] listOfActiveFormattingElements, int[] templateModeStack, T formPointer,
- T headPointer, T deepTreeSurrogateParent, int mode, int originalMode,
- boolean framesetOk, boolean needToDropLF, boolean quirks) {
- this.stack = stack;
- this.listOfActiveFormattingElements = listOfActiveFormattingElements;
- this.templateModeStack = templateModeStack;
- this.formPointer = formPointer;
- this.headPointer = headPointer;
- this.deepTreeSurrogateParent = deepTreeSurrogateParent;
- this.mode = mode;
- this.originalMode = originalMode;
- this.framesetOk = framesetOk;
- this.needToDropLF = needToDropLF;
- this.quirks = quirks;
- }
-
- /**
- * @see nu.validator.htmlparser.impl.TreeBuilderState#getStack()
- */
- public StackNode<T>[] getStack() {
- return stack;
- }
-
- /**
- * @see nu.validator.htmlparser.impl.TreeBuilderState#getTemplateModeStack()
- */
- public int[] getTemplateModeStack() {
- return templateModeStack;
- }
-
- /**
- * @see nu.validator.htmlparser.impl.TreeBuilderState#getListOfActiveFormattingElements()
- */
- public StackNode<T>[] getListOfActiveFormattingElements() {
- return listOfActiveFormattingElements;
- }
-
- /**
- * @see nu.validator.htmlparser.impl.TreeBuilderState#getFormPointer()
- */
- public T getFormPointer() {
- return formPointer;
- }
-
- /**
- * Returns the headPointer.
- *
- * @return the headPointer
- */
- public T getHeadPointer() {
- return headPointer;
- }
-
- /**
- * Returns the deepTreeSurrogateParent.
- *
- * @return the deepTreeSurrogateParent
- */
- public T getDeepTreeSurrogateParent() {
- return deepTreeSurrogateParent;
- }
-
- /**
- * Returns the mode.
- *
- * @return the mode
- */
- public int getMode() {
- return mode;
- }
-
- /**
- * Returns the originalMode.
- *
- * @return the originalMode
- */
- public int getOriginalMode() {
- return originalMode;
- }
-
- /**
- * Returns the framesetOk.
- *
- * @return the framesetOk
- */
- public boolean isFramesetOk() {
- return framesetOk;
- }
-
- /**
- * Returns the needToDropLF.
- *
- * @return the needToDropLF
- */
- public boolean isNeedToDropLF() {
- return needToDropLF;
- }
-
- /**
- * Returns the quirks.
- *
- * @return the quirks
- */
- public boolean isQuirks() {
- return quirks;
- }
-
- /**
- * @see nu.validator.htmlparser.impl.TreeBuilderState#getListOfActiveFormattingElementsLength()
- */
- public int getListOfActiveFormattingElementsLength() {
- return listOfActiveFormattingElements.length;
- }
-
- /**
- * @see nu.validator.htmlparser.impl.TreeBuilderState#getStackLength()
- */
- public int getStackLength() {
- return stack.length;
- }
-
- /**
- * @see nu.validator.htmlparser.impl.TreeBuilderState#getTemplateModeStackLength()
- */
- public int getTemplateModeStackLength() {
- return templateModeStack.length;
- }
-
- @SuppressWarnings("unused") private void destructor() {
- for (int i = 0; i < stack.length; i++) {
- stack[i].release();
- }
- for (int i = 0; i < listOfActiveFormattingElements.length; i++) {
- if (listOfActiveFormattingElements[i] != null) {
- listOfActiveFormattingElements[i].release();
- }
- }
- }
-}
diff --git a/parser/html/javasrc/Tokenizer.java b/parser/html/javasrc/Tokenizer.java
deleted file mode 100644
index 70e1df75c..000000000
--- a/parser/html/javasrc/Tokenizer.java
+++ /dev/null
@@ -1,7064 +0,0 @@
-/*
- * Copyright (c) 2005-2007 Henri Sivonen
- * Copyright (c) 2007-2015 Mozilla Foundation
- * Portions of comments Copyright 2004-2010 Apple Computer, Inc., Mozilla
- * Foundation, and Opera Software ASA.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * The comments following this one that use the same comment syntax as this
- * comment are quotes from the WHATWG HTML 5 spec as of 2 June 2007
- * amended as of June 18 2008 and May 31 2010.
- * That document came with this statement:
- * "© Copyright 2004-2010 Apple Computer, Inc., Mozilla Foundation, and
- * Opera Software ASA. You are granted a license to use, reproduce and
- * create derivative works of this document."
- */
-
-package nu.validator.htmlparser.impl;
-
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-import nu.validator.htmlparser.annotation.Auto;
-import nu.validator.htmlparser.annotation.CharacterName;
-import nu.validator.htmlparser.annotation.Const;
-import nu.validator.htmlparser.annotation.Inline;
-import nu.validator.htmlparser.annotation.Local;
-import nu.validator.htmlparser.annotation.NoLength;
-import nu.validator.htmlparser.common.EncodingDeclarationHandler;
-import nu.validator.htmlparser.common.Interner;
-import nu.validator.htmlparser.common.TokenHandler;
-import nu.validator.htmlparser.common.XmlViolationPolicy;
-
-/**
- * An implementation of
- * https://html.spec.whatwg.org/multipage/syntax.html#tokenization
- *
- * This class implements the <code>Locator</code> interface. This is not an
- * incidental implementation detail: Users of this class are encouraged to make
- * use of the <code>Locator</code> nature.
- *
- * By default, the tokenizer may report data that XML 1.0 bans. The tokenizer
- * can be configured to treat these conditions as fatal or to coerce the infoset
- * to something that XML 1.0 allows.
- *
- * @version $Id$
- * @author hsivonen
- */
-public class Tokenizer implements Locator {
-
- private static final int DATA_AND_RCDATA_MASK = ~1;
-
- public static final int DATA = 0;
-
- public static final int RCDATA = 1;
-
- public static final int SCRIPT_DATA = 2;
-
- public static final int RAWTEXT = 3;
-
- public static final int SCRIPT_DATA_ESCAPED = 4;
-
- public static final int ATTRIBUTE_VALUE_DOUBLE_QUOTED = 5;
-
- public static final int ATTRIBUTE_VALUE_SINGLE_QUOTED = 6;
-
- public static final int ATTRIBUTE_VALUE_UNQUOTED = 7;
-
- public static final int PLAINTEXT = 8;
-
- public static final int TAG_OPEN = 9;
-
- public static final int CLOSE_TAG_OPEN = 10;
-
- public static final int TAG_NAME = 11;
-
- public static final int BEFORE_ATTRIBUTE_NAME = 12;
-
- public static final int ATTRIBUTE_NAME = 13;
-
- public static final int AFTER_ATTRIBUTE_NAME = 14;
-
- public static final int BEFORE_ATTRIBUTE_VALUE = 15;
-
- public static final int AFTER_ATTRIBUTE_VALUE_QUOTED = 16;
-
- public static final int BOGUS_COMMENT = 17;
-
- public static final int MARKUP_DECLARATION_OPEN = 18;
-
- public static final int DOCTYPE = 19;
-
- public static final int BEFORE_DOCTYPE_NAME = 20;
-
- public static final int DOCTYPE_NAME = 21;
-
- public static final int AFTER_DOCTYPE_NAME = 22;
-
- public static final int BEFORE_DOCTYPE_PUBLIC_IDENTIFIER = 23;
-
- public static final int DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED = 24;
-
- public static final int DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED = 25;
-
- public static final int AFTER_DOCTYPE_PUBLIC_IDENTIFIER = 26;
-
- public static final int BEFORE_DOCTYPE_SYSTEM_IDENTIFIER = 27;
-
- public static final int DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED = 28;
-
- public static final int DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED = 29;
-
- public static final int AFTER_DOCTYPE_SYSTEM_IDENTIFIER = 30;
-
- public static final int BOGUS_DOCTYPE = 31;
-
- public static final int COMMENT_START = 32;
-
- public static final int COMMENT_START_DASH = 33;
-
- public static final int COMMENT = 34;
-
- public static final int COMMENT_END_DASH = 35;
-
- public static final int COMMENT_END = 36;
-
- public static final int COMMENT_END_BANG = 37;
-
- public static final int NON_DATA_END_TAG_NAME = 38;
-
- public static final int MARKUP_DECLARATION_HYPHEN = 39;
-
- public static final int MARKUP_DECLARATION_OCTYPE = 40;
-
- public static final int DOCTYPE_UBLIC = 41;
-
- public static final int DOCTYPE_YSTEM = 42;
-
- public static final int AFTER_DOCTYPE_PUBLIC_KEYWORD = 43;
-
- public static final int BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS = 44;
-
- public static final int AFTER_DOCTYPE_SYSTEM_KEYWORD = 45;
-
- public static final int CONSUME_CHARACTER_REFERENCE = 46;
-
- public static final int CONSUME_NCR = 47;
-
- public static final int CHARACTER_REFERENCE_TAIL = 48;
-
- public static final int HEX_NCR_LOOP = 49;
-
- public static final int DECIMAL_NRC_LOOP = 50;
-
- public static final int HANDLE_NCR_VALUE = 51;
-
- public static final int HANDLE_NCR_VALUE_RECONSUME = 52;
-
- public static final int CHARACTER_REFERENCE_HILO_LOOKUP = 53;
-
- public static final int SELF_CLOSING_START_TAG = 54;
-
- public static final int CDATA_START = 55;
-
- public static final int CDATA_SECTION = 56;
-
- public static final int CDATA_RSQB = 57;
-
- public static final int CDATA_RSQB_RSQB = 58;
-
- public static final int SCRIPT_DATA_LESS_THAN_SIGN = 59;
-
- public static final int SCRIPT_DATA_ESCAPE_START = 60;
-
- public static final int SCRIPT_DATA_ESCAPE_START_DASH = 61;
-
- public static final int SCRIPT_DATA_ESCAPED_DASH = 62;
-
- public static final int SCRIPT_DATA_ESCAPED_DASH_DASH = 63;
-
- public static final int BOGUS_COMMENT_HYPHEN = 64;
-
- public static final int RAWTEXT_RCDATA_LESS_THAN_SIGN = 65;
-
- public static final int SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN = 66;
-
- public static final int SCRIPT_DATA_DOUBLE_ESCAPE_START = 67;
-
- public static final int SCRIPT_DATA_DOUBLE_ESCAPED = 68;
-
- public static final int SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN = 69;
-
- public static final int SCRIPT_DATA_DOUBLE_ESCAPED_DASH = 70;
-
- public static final int SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH = 71;
-
- public static final int SCRIPT_DATA_DOUBLE_ESCAPE_END = 72;
-
- public static final int PROCESSING_INSTRUCTION = 73;
-
- public static final int PROCESSING_INSTRUCTION_QUESTION_MARK = 74;
-
- /**
- * Magic value for UTF-16 operations.
- */
- private static final int LEAD_OFFSET = (0xD800 - (0x10000 >> 10));
-
- /**
- * UTF-16 code unit array containing less than and greater than for emitting
- * those characters on certain parse errors.
- */
- private static final @NoLength char[] LT_GT = { '<', '>' };
-
- /**
- * UTF-16 code unit array containing less than and solidus for emitting
- * those characters on certain parse errors.
- */
- private static final @NoLength char[] LT_SOLIDUS = { '<', '/' };
-
- /**
- * UTF-16 code unit array containing ]] for emitting those characters on
- * state transitions.
- */
- private static final @NoLength char[] RSQB_RSQB = { ']', ']' };
-
- /**
- * Array version of U+FFFD.
- */
- private static final @NoLength char[] REPLACEMENT_CHARACTER = { '\uFFFD' };
-
- // [NOCPP[
-
- /**
- * Array version of space.
- */
- private static final @NoLength char[] SPACE = { ' ' };
-
- // ]NOCPP]
-
- /**
- * Array version of line feed.
- */
- private static final @NoLength char[] LF = { '\n' };
-
- /**
- * "CDATA[" as <code>char[]</code>
- */
- private static final @NoLength char[] CDATA_LSQB = { 'C', 'D', 'A', 'T',
- 'A', '[' };
-
- /**
- * "octype" as <code>char[]</code>
- */
- private static final @NoLength char[] OCTYPE = { 'o', 'c', 't', 'y', 'p',
- 'e' };
-
- /**
- * "ublic" as <code>char[]</code>
- */
- private static final @NoLength char[] UBLIC = { 'u', 'b', 'l', 'i', 'c' };
-
- /**
- * "ystem" as <code>char[]</code>
- */
- private static final @NoLength char[] YSTEM = { 'y', 's', 't', 'e', 'm' };
-
- private static final char[] TITLE_ARR = { 't', 'i', 't', 'l', 'e' };
-
- private static final char[] SCRIPT_ARR = { 's', 'c', 'r', 'i', 'p', 't' };
-
- private static final char[] STYLE_ARR = { 's', 't', 'y', 'l', 'e' };
-
- private static final char[] PLAINTEXT_ARR = { 'p', 'l', 'a', 'i', 'n', 't',
- 'e', 'x', 't' };
-
- private static final char[] XMP_ARR = { 'x', 'm', 'p' };
-
- private static final char[] TEXTAREA_ARR = { 't', 'e', 'x', 't', 'a', 'r',
- 'e', 'a' };
-
- private static final char[] IFRAME_ARR = { 'i', 'f', 'r', 'a', 'm', 'e' };
-
- private static final char[] NOEMBED_ARR = { 'n', 'o', 'e', 'm', 'b', 'e',
- 'd' };
-
- private static final char[] NOSCRIPT_ARR = { 'n', 'o', 's', 'c', 'r', 'i',
- 'p', 't' };
-
- private static final char[] NOFRAMES_ARR = { 'n', 'o', 'f', 'r', 'a', 'm',
- 'e', 's' };
-
- /**
- * The token handler.
- */
- protected final TokenHandler tokenHandler;
-
- protected EncodingDeclarationHandler encodingDeclarationHandler;
-
- // [NOCPP[
-
- /**
- * The error handler.
- */
- protected ErrorHandler errorHandler;
-
- // ]NOCPP]
-
- /**
- * Whether the previous char read was CR.
- */
- protected boolean lastCR;
-
- protected int stateSave;
-
- private int returnStateSave;
-
- protected int index;
-
- private boolean forceQuirks;
-
- private char additional;
-
- private int entCol;
-
- private int firstCharKey;
-
- private int lo;
-
- private int hi;
-
- private int candidate;
-
- private int charRefBufMark;
-
- protected int value;
-
- private boolean seenDigits;
-
- protected int cstart;
-
- /**
- * The SAX public id for the resource being tokenized. (Only passed to back
- * as part of locator data.)
- */
- private String publicId;
-
- /**
- * The SAX system id for the resource being tokenized. (Only passed to back
- * as part of locator data.)
- */
- private String systemId;
-
- /**
- * Buffer for bufferable things other than those that fit the description
- * of <code>charRefBuf</code>.
- */
- private @Auto char[] strBuf;
-
- /**
- * Number of significant <code>char</code>s in <code>strBuf</code>.
- */
- private int strBufLen;
-
- /**
- * Buffer for characters that might form a character reference but may
- * end up not forming one.
- */
- private final @Auto char[] charRefBuf;
-
- /**
- * Number of significant <code>char</code>s in <code>charRefBuf</code>.
- */
- private int charRefBufLen;
-
- /**
- * Buffer for expanding NCRs falling into the Basic Multilingual Plane.
- */
- private final @Auto char[] bmpChar;
-
- /**
- * Buffer for expanding astral NCRs.
- */
- private final @Auto char[] astralChar;
-
- /**
- * The element whose end tag closes the current CDATA or RCDATA element.
- */
- protected ElementName endTagExpectation = null;
-
- private char[] endTagExpectationAsArray; // not @Auto!
-
- /**
- * <code>true</code> if tokenizing an end tag
- */
- protected boolean endTag;
-
- /**
- * The current tag token name.
- */
- private ElementName tagName = null;
-
- /**
- * The current attribute name.
- */
- protected AttributeName attributeName = null;
-
- // [NOCPP[
-
- /**
- * Whether comment tokens are emitted.
- */
- private boolean wantsComments = false;
-
- /**
- * <code>true</code> when HTML4-specific additional errors are requested.
- */
- protected boolean html4;
-
- /**
- * Whether the stream is past the first 1024 bytes.
- */
- private boolean metaBoundaryPassed;
-
- // ]NOCPP]
-
- /**
- * The name of the current doctype token.
- */
- private @Local String doctypeName;
-
- /**
- * The public id of the current doctype token.
- */
- private String publicIdentifier;
-
- /**
- * The system id of the current doctype token.
- */
- private String systemIdentifier;
-
- /**
- * The attribute holder.
- */
- private HtmlAttributes attributes;
-
- // [NOCPP[
-
- /**
- * The policy for vertical tab and form feed.
- */
- private XmlViolationPolicy contentSpacePolicy = XmlViolationPolicy.ALTER_INFOSET;
-
- /**
- * The policy for comments.
- */
- private XmlViolationPolicy commentPolicy = XmlViolationPolicy.ALTER_INFOSET;
-
- private XmlViolationPolicy xmlnsPolicy = XmlViolationPolicy.ALTER_INFOSET;
-
- private XmlViolationPolicy namePolicy = XmlViolationPolicy.ALTER_INFOSET;
-
- private boolean html4ModeCompatibleWithXhtml1Schemata;
-
- private int mappingLangToXmlLang;
-
- // ]NOCPP]
-
- private final boolean newAttributesEachTime;
-
- private boolean shouldSuspend;
-
- protected boolean confident;
-
- private int line;
-
- /*
- * The line number of the current attribute. First set to the line of the
- * attribute name and if there is a value, set to the line the value
- * started on.
- */
- // CPPONLY: private int attributeLine;
-
- private Interner interner;
-
- // CPPONLY: private boolean viewingXmlSource;
-
- // [NOCPP[
-
- protected LocatorImpl ampersandLocation;
-
- public Tokenizer(TokenHandler tokenHandler, boolean newAttributesEachTime) {
- this.tokenHandler = tokenHandler;
- this.encodingDeclarationHandler = null;
- this.newAttributesEachTime = newAttributesEachTime;
- // &CounterClockwiseContourIntegral; is the longest valid char ref and
- // the semicolon never gets appended to the buffer.
- this.charRefBuf = new char[32];
- this.bmpChar = new char[1];
- this.astralChar = new char[2];
- this.tagName = null;
- this.attributeName = null;
- this.doctypeName = null;
- this.publicIdentifier = null;
- this.systemIdentifier = null;
- this.attributes = null;
- }
-
- // ]NOCPP]
-
- /**
- * The constructor.
- *
- * @param tokenHandler
- * the handler for receiving tokens
- */
- public Tokenizer(TokenHandler tokenHandler
- // CPPONLY: , boolean viewingXmlSource
- ) {
- this.tokenHandler = tokenHandler;
- this.encodingDeclarationHandler = null;
- // [NOCPP[
- this.newAttributesEachTime = false;
- // ]NOCPP]
- // &CounterClockwiseContourIntegral; is the longest valid char ref and
- // the semicolon never gets appended to the buffer.
- this.charRefBuf = new char[32];
- this.bmpChar = new char[1];
- this.astralChar = new char[2];
- this.tagName = null;
- this.attributeName = null;
- this.doctypeName = null;
- this.publicIdentifier = null;
- this.systemIdentifier = null;
- // [NOCPP[
- this.attributes = null;
- // ]NOCPP]
- // CPPONLY: this.attributes = tokenHandler.HasBuilder() ? new HtmlAttributes(mappingLangToXmlLang) : null;
- // CPPONLY: this.newAttributesEachTime = !tokenHandler.HasBuilder();
- // CPPONLY: this.viewingXmlSource = viewingXmlSource;
- }
-
- public void setInterner(Interner interner) {
- this.interner = interner;
- }
-
- public void initLocation(String newPublicId, String newSystemId) {
- this.systemId = newSystemId;
- this.publicId = newPublicId;
-
- }
-
- // CPPONLY: boolean isViewingXmlSource() {
- // CPPONLY: return viewingXmlSource;
- // CPPONLY: }
-
- // [NOCPP[
-
- /**
- * Returns the mappingLangToXmlLang.
- *
- * @return the mappingLangToXmlLang
- */
- public boolean isMappingLangToXmlLang() {
- return mappingLangToXmlLang == AttributeName.HTML_LANG;
- }
-
- /**
- * Sets the mappingLangToXmlLang.
- *
- * @param mappingLangToXmlLang
- * the mappingLangToXmlLang to set
- */
- public void setMappingLangToXmlLang(boolean mappingLangToXmlLang) {
- this.mappingLangToXmlLang = mappingLangToXmlLang ? AttributeName.HTML_LANG
- : AttributeName.HTML;
- }
-
- /**
- * Sets the error handler.
- *
- * @see org.xml.sax.XMLReader#setErrorHandler(org.xml.sax.ErrorHandler)
- */
- public void setErrorHandler(ErrorHandler eh) {
- this.errorHandler = eh;
- }
-
- public ErrorHandler getErrorHandler() {
- return this.errorHandler;
- }
-
- /**
- * Sets the commentPolicy.
- *
- * @param commentPolicy
- * the commentPolicy to set
- */
- public void setCommentPolicy(XmlViolationPolicy commentPolicy) {
- this.commentPolicy = commentPolicy;
- }
-
- /**
- * Sets the contentNonXmlCharPolicy.
- *
- * @param contentNonXmlCharPolicy
- * the contentNonXmlCharPolicy to set
- */
- public void setContentNonXmlCharPolicy(
- XmlViolationPolicy contentNonXmlCharPolicy) {
- if (contentNonXmlCharPolicy != XmlViolationPolicy.ALLOW) {
- throw new IllegalArgumentException(
- "Must use ErrorReportingTokenizer to set contentNonXmlCharPolicy to non-ALLOW.");
- }
- }
-
- /**
- * Sets the contentSpacePolicy.
- *
- * @param contentSpacePolicy
- * the contentSpacePolicy to set
- */
- public void setContentSpacePolicy(XmlViolationPolicy contentSpacePolicy) {
- this.contentSpacePolicy = contentSpacePolicy;
- }
-
- /**
- * Sets the xmlnsPolicy.
- *
- * @param xmlnsPolicy
- * the xmlnsPolicy to set
- */
- public void setXmlnsPolicy(XmlViolationPolicy xmlnsPolicy) {
- if (xmlnsPolicy == XmlViolationPolicy.FATAL) {
- throw new IllegalArgumentException("Can't use FATAL here.");
- }
- this.xmlnsPolicy = xmlnsPolicy;
- }
-
- public void setNamePolicy(XmlViolationPolicy namePolicy) {
- this.namePolicy = namePolicy;
- }
-
- /**
- * Sets the html4ModeCompatibleWithXhtml1Schemata.
- *
- * @param html4ModeCompatibleWithXhtml1Schemata
- * the html4ModeCompatibleWithXhtml1Schemata to set
- */
- public void setHtml4ModeCompatibleWithXhtml1Schemata(
- boolean html4ModeCompatibleWithXhtml1Schemata) {
- this.html4ModeCompatibleWithXhtml1Schemata = html4ModeCompatibleWithXhtml1Schemata;
- }
-
- // ]NOCPP]
-
- // For the token handler to call
- /**
- * Sets the tokenizer state and the associated element name. This should
- * only ever used to put the tokenizer into one of the states that have
- * a special end tag expectation.
- *
- * @param specialTokenizerState
- * the tokenizer state to set
- * @param endTagExpectation
- * the expected end tag for transitioning back to normal
- */
- public void setStateAndEndTagExpectation(int specialTokenizerState,
- @Local String endTagExpectation) {
- this.stateSave = specialTokenizerState;
- if (specialTokenizerState == Tokenizer.DATA) {
- return;
- }
- @Auto char[] asArray = Portability.newCharArrayFromLocal(endTagExpectation);
- this.endTagExpectation = ElementName.elementNameByBuffer(asArray, 0,
- asArray.length, interner);
- endTagExpectationToArray();
- }
-
- /**
- * Sets the tokenizer state and the associated element name. This should
- * only ever used to put the tokenizer into one of the states that have
- * a special end tag expectation.
- *
- * @param specialTokenizerState
- * the tokenizer state to set
- * @param endTagExpectation
- * the expected end tag for transitioning back to normal
- */
- public void setStateAndEndTagExpectation(int specialTokenizerState,
- ElementName endTagExpectation) {
- this.stateSave = specialTokenizerState;
- this.endTagExpectation = endTagExpectation;
- endTagExpectationToArray();
- }
-
- private void endTagExpectationToArray() {
- switch (endTagExpectation.getGroup()) {
- case TreeBuilder.TITLE:
- endTagExpectationAsArray = TITLE_ARR;
- return;
- case TreeBuilder.SCRIPT:
- endTagExpectationAsArray = SCRIPT_ARR;
- return;
- case TreeBuilder.STYLE:
- endTagExpectationAsArray = STYLE_ARR;
- return;
- case TreeBuilder.PLAINTEXT:
- endTagExpectationAsArray = PLAINTEXT_ARR;
- return;
- case TreeBuilder.XMP:
- endTagExpectationAsArray = XMP_ARR;
- return;
- case TreeBuilder.TEXTAREA:
- endTagExpectationAsArray = TEXTAREA_ARR;
- return;
- case TreeBuilder.IFRAME:
- endTagExpectationAsArray = IFRAME_ARR;
- return;
- case TreeBuilder.NOEMBED:
- endTagExpectationAsArray = NOEMBED_ARR;
- return;
- case TreeBuilder.NOSCRIPT:
- endTagExpectationAsArray = NOSCRIPT_ARR;
- return;
- case TreeBuilder.NOFRAMES:
- endTagExpectationAsArray = NOFRAMES_ARR;
- return;
- default:
- assert false: "Bad end tag expectation.";
- return;
- }
- }
-
- /**
- * For C++ use only.
- */
- public void setLineNumber(int line) {
- // CPPONLY: this.attributeLine = line; // XXX is this needed?
- this.line = line;
- }
-
- // start Locator impl
-
- /**
- * @see org.xml.sax.Locator#getLineNumber()
- */
- @Inline public int getLineNumber() {
- return line;
- }
-
- // [NOCPP[
-
- /**
- * @see org.xml.sax.Locator#getColumnNumber()
- */
- @Inline public int getColumnNumber() {
- return -1;
- }
-
- /**
- * @see org.xml.sax.Locator#getPublicId()
- */
- public String getPublicId() {
- return publicId;
- }
-
- /**
- * @see org.xml.sax.Locator#getSystemId()
- */
- public String getSystemId() {
- return systemId;
- }
-
- // end Locator impl
-
- // end public API
-
- public void notifyAboutMetaBoundary() {
- metaBoundaryPassed = true;
- }
-
- void turnOnAdditionalHtml4Errors() {
- html4 = true;
- }
-
- // ]NOCPP]
-
- HtmlAttributes emptyAttributes() {
- // [NOCPP[
- if (newAttributesEachTime) {
- return new HtmlAttributes(mappingLangToXmlLang);
- } else {
- // ]NOCPP]
- return HtmlAttributes.EMPTY_ATTRIBUTES;
- // [NOCPP[
- }
- // ]NOCPP]
- }
-
- @Inline private void appendCharRefBuf(char c) {
- // CPPONLY: assert charRefBufLen < charRefBuf.length:
- // CPPONLY: "RELEASE: Attempted to overrun charRefBuf!";
- charRefBuf[charRefBufLen++] = c;
- }
-
- private void emitOrAppendCharRefBuf(int returnState) throws SAXException {
- if ((returnState & DATA_AND_RCDATA_MASK) != 0) {
- appendCharRefBufToStrBuf();
- } else {
- if (charRefBufLen > 0) {
- tokenHandler.characters(charRefBuf, 0, charRefBufLen);
- charRefBufLen = 0;
- }
- }
- }
-
- @Inline private void clearStrBufAfterUse() {
- strBufLen = 0;
- }
-
- @Inline private void clearStrBufBeforeUse() {
- assert strBufLen == 0: "strBufLen not reset after previous use!";
- strBufLen = 0; // no-op in the absence of bugs
- }
-
- @Inline private void clearStrBufAfterOneHyphen() {
- assert strBufLen == 1: "strBufLen length not one!";
- assert strBuf[0] == '-': "strBuf does not start with a hyphen!";
- strBufLen = 0;
- }
-
- /**
- * Appends to the buffer.
- *
- * @param c
- * the UTF-16 code unit to append
- */
- @Inline private void appendStrBuf(char c) {
- // CPPONLY: assert strBufLen < strBuf.length: "Previous buffer length insufficient.";
- // CPPONLY: if (strBufLen == strBuf.length) {
- // CPPONLY: if (!EnsureBufferSpace(1)) {
- // CPPONLY: assert false: "RELEASE: Unable to recover from buffer reallocation failure";
- // CPPONLY: } // TODO: Add telemetry when outer if fires but inner does not
- // CPPONLY: }
- strBuf[strBufLen++] = c;
- }
-
- /**
- * The buffer as a String. Currently only used for error reporting.
- *
- * <p>
- * C++ memory note: The return value must be released.
- *
- * @return the buffer as a string
- */
- protected String strBufToString() {
- String str = Portability.newStringFromBuffer(strBuf, 0, strBufLen
- // CPPONLY: , tokenHandler
- );
- clearStrBufAfterUse();
- return str;
- }
-
- /**
- * Returns the buffer as a local name. The return value is released in
- * emitDoctypeToken().
- *
- * @return the buffer as local name
- */
- private void strBufToDoctypeName() {
- doctypeName = Portability.newLocalNameFromBuffer(strBuf, 0, strBufLen,
- interner);
- clearStrBufAfterUse();
- }
-
- /**
- * Emits the buffer as character tokens.
- *
- * @throws SAXException
- * if the token handler threw
- */
- private void emitStrBuf() throws SAXException {
- if (strBufLen > 0) {
- tokenHandler.characters(strBuf, 0, strBufLen);
- clearStrBufAfterUse();
- }
- }
-
- @Inline private void appendSecondHyphenToBogusComment() throws SAXException {
- // [NOCPP[
- switch (commentPolicy) {
- case ALTER_INFOSET:
- appendStrBuf(' ');
- // FALLTHROUGH
- case ALLOW:
- warn("The document is not mappable to XML 1.0 due to two consecutive hyphens in a comment.");
- // ]NOCPP]
- appendStrBuf('-');
- // [NOCPP[
- break;
- case FATAL:
- fatal("The document is not mappable to XML 1.0 due to two consecutive hyphens in a comment.");
- break;
- }
- // ]NOCPP]
- }
-
- // [NOCPP[
- private void maybeAppendSpaceToBogusComment() throws SAXException {
- switch (commentPolicy) {
- case ALTER_INFOSET:
- appendStrBuf(' ');
- // FALLTHROUGH
- case ALLOW:
- warn("The document is not mappable to XML 1.0 due to a trailing hyphen in a comment.");
- break;
- case FATAL:
- fatal("The document is not mappable to XML 1.0 due to a trailing hyphen in a comment.");
- break;
- }
- }
-
- // ]NOCPP]
-
- @Inline private void adjustDoubleHyphenAndAppendToStrBufAndErr(char c)
- throws SAXException {
- errConsecutiveHyphens();
- // [NOCPP[
- switch (commentPolicy) {
- case ALTER_INFOSET:
- strBufLen--;
- // WARNING!!! This expands the worst case of the buffer length
- // given the length of input!
- appendStrBuf(' ');
- appendStrBuf('-');
- // FALLTHROUGH
- case ALLOW:
- warn("The document is not mappable to XML 1.0 due to two consecutive hyphens in a comment.");
- // ]NOCPP]
- appendStrBuf(c);
- // [NOCPP[
- break;
- case FATAL:
- fatal("The document is not mappable to XML 1.0 due to two consecutive hyphens in a comment.");
- break;
- }
- // ]NOCPP]
- }
-
- private void appendStrBuf(@NoLength char[] buffer, int offset, int length) {
- int newLen = strBufLen + length;
- // CPPONLY: assert newLen <= strBuf.length: "Previous buffer length insufficient.";
- // CPPONLY: if (strBuf.length < newLen) {
- // CPPONLY: if (!EnsureBufferSpace(length)) {
- // CPPONLY: assert false: "RELEASE: Unable to recover from buffer reallocation failure";
- // CPPONLY: } // TODO: Add telemetry when outer if fires but inner does not
- // CPPONLY: }
- System.arraycopy(buffer, offset, strBuf, strBufLen, length);
- strBufLen = newLen;
- }
-
- /**
- * Append the contents of the char reference buffer to the main one.
- */
- @Inline private void appendCharRefBufToStrBuf() {
- appendStrBuf(charRefBuf, 0, charRefBufLen);
- charRefBufLen = 0;
- }
-
- /**
- * Emits the current comment token.
- *
- * @param pos
- * TODO
- *
- * @throws SAXException
- */
- private void emitComment(int provisionalHyphens, int pos)
- throws SAXException {
- // [NOCPP[
- if (wantsComments) {
- // ]NOCPP]
- tokenHandler.comment(strBuf, 0, strBufLen
- - provisionalHyphens);
- // [NOCPP[
- }
- // ]NOCPP]
- clearStrBufAfterUse();
- cstart = pos + 1;
- }
-
- /**
- * Flushes coalesced character tokens.
- *
- * @param buf
- * TODO
- * @param pos
- * TODO
- *
- * @throws SAXException
- */
- protected void flushChars(@NoLength char[] buf, int pos)
- throws SAXException {
- if (pos > cstart) {
- tokenHandler.characters(buf, cstart, pos - cstart);
- }
- cstart = Integer.MAX_VALUE;
- }
-
- /**
- * Reports an condition that would make the infoset incompatible with XML
- * 1.0 as fatal.
- *
- * @param message
- * the message
- * @throws SAXException
- * @throws SAXParseException
- */
- public void fatal(String message) throws SAXException {
- SAXParseException spe = new SAXParseException(message, this);
- if (errorHandler != null) {
- errorHandler.fatalError(spe);
- }
- throw spe;
- }
-
- /**
- * Reports a Parse Error.
- *
- * @param message
- * the message
- * @throws SAXException
- */
- public void err(String message) throws SAXException {
- if (errorHandler == null) {
- return;
- }
- SAXParseException spe = new SAXParseException(message, this);
- errorHandler.error(spe);
- }
-
- public void errTreeBuilder(String message) throws SAXException {
- ErrorHandler eh = null;
- if (tokenHandler instanceof TreeBuilder<?>) {
- TreeBuilder<?> treeBuilder = (TreeBuilder<?>) tokenHandler;
- eh = treeBuilder.getErrorHandler();
- }
- if (eh == null) {
- eh = errorHandler;
- }
- if (eh == null) {
- return;
- }
- SAXParseException spe = new SAXParseException(message, this);
- eh.error(spe);
- }
-
- /**
- * Reports a warning
- *
- * @param message
- * the message
- * @throws SAXException
- */
- public void warn(String message) throws SAXException {
- if (errorHandler == null) {
- return;
- }
- SAXParseException spe = new SAXParseException(message, this);
- errorHandler.warning(spe);
- }
-
- private void strBufToElementNameString() {
- tagName = ElementName.elementNameByBuffer(strBuf, 0, strBufLen,
- interner);
- clearStrBufAfterUse();
- }
-
- private int emitCurrentTagToken(boolean selfClosing, int pos)
- throws SAXException {
- cstart = pos + 1;
- maybeErrSlashInEndTag(selfClosing);
- stateSave = Tokenizer.DATA;
- HtmlAttributes attrs = (attributes == null ? HtmlAttributes.EMPTY_ATTRIBUTES
- : attributes);
- if (endTag) {
- /*
- * When an end tag token is emitted, the content model flag must be
- * switched to the PCDATA state.
- */
- maybeErrAttributesOnEndTag(attrs);
- // CPPONLY: if (!viewingXmlSource) {
- tokenHandler.endTag(tagName);
- // CPPONLY: }
- // CPPONLY: if (newAttributesEachTime) {
- // CPPONLY: Portability.delete(attributes);
- // CPPONLY: attributes = null;
- // CPPONLY: }
- } else {
- // CPPONLY: if (viewingXmlSource) {
- // CPPONLY: assert newAttributesEachTime;
- // CPPONLY: Portability.delete(attributes);
- // CPPONLY: attributes = null;
- // CPPONLY: } else {
- tokenHandler.startTag(tagName, attrs, selfClosing);
- // CPPONLY: }
- }
- tagName.release();
- tagName = null;
- if (newAttributesEachTime) {
- attributes = null;
- } else {
- attributes.clear(mappingLangToXmlLang);
- }
- /*
- * The token handler may have called setStateAndEndTagExpectation
- * and changed stateSave since the start of this method.
- */
- return stateSave;
- }
-
- private void attributeNameComplete() throws SAXException {
- attributeName = AttributeName.nameByBuffer(strBuf, 0, strBufLen
- // [NOCPP[
- , namePolicy != XmlViolationPolicy.ALLOW
- // ]NOCPP]
- , interner);
- clearStrBufAfterUse();
-
- if (attributes == null) {
- attributes = new HtmlAttributes(mappingLangToXmlLang);
- }
-
- /*
- * When the user agent leaves the attribute name state (and before
- * emitting the tag token, if appropriate), the complete attribute's
- * name must be compared to the other attributes on the same token; if
- * there is already an attribute on the token with the exact same name,
- * then this is a parse error and the new attribute must be dropped,
- * along with the value that gets associated with it (if any).
- */
- if (attributes.contains(attributeName)) {
- errDuplicateAttribute();
- attributeName.release();
- attributeName = null;
- }
- }
-
- private void addAttributeWithoutValue() throws SAXException {
- noteAttributeWithoutValue();
-
- // [NOCPP[
- if (metaBoundaryPassed && AttributeName.CHARSET == attributeName
- && ElementName.META == tagName) {
- err("A \u201Ccharset\u201D attribute on a \u201Cmeta\u201D element found after the first 512 bytes.");
- }
- // ]NOCPP]
- if (attributeName != null) {
- // [NOCPP[
- if (html4) {
- if (attributeName.isBoolean()) {
- if (html4ModeCompatibleWithXhtml1Schemata) {
- attributes.addAttribute(attributeName,
- attributeName.getLocal(AttributeName.HTML),
- xmlnsPolicy);
- } else {
- attributes.addAttribute(attributeName, "", xmlnsPolicy);
- }
- } else {
- if (AttributeName.BORDER != attributeName) {
- err("Attribute value omitted for a non-boolean attribute. (HTML4-only error.)");
- attributes.addAttribute(attributeName, "", xmlnsPolicy);
- }
- }
- } else {
- if (AttributeName.SRC == attributeName
- || AttributeName.HREF == attributeName) {
- warn("Attribute \u201C"
- + attributeName.getLocal(AttributeName.HTML)
- + "\u201D without an explicit value seen. The attribute may be dropped by IE7.");
- }
- // ]NOCPP]
- attributes.addAttribute(attributeName,
- Portability.newEmptyString()
- // [NOCPP[
- , xmlnsPolicy
- // ]NOCPP]
- // CPPONLY: , attributeLine
- );
- // [NOCPP[
- }
- // ]NOCPP]
- attributeName = null; // attributeName has been adopted by the
- // |attributes| object
- } else {
- clearStrBufAfterUse();
- }
- }
-
- private void addAttributeWithValue() throws SAXException {
- // [NOCPP[
- if (metaBoundaryPassed && ElementName.META == tagName
- && AttributeName.CHARSET == attributeName) {
- err("A \u201Ccharset\u201D attribute on a \u201Cmeta\u201D element found after the first 512 bytes.");
- }
- // ]NOCPP]
- if (attributeName != null) {
- String val = strBufToString(); // Ownership transferred to
- // HtmlAttributes
- // CPPONLY: if (mViewSource) {
- // CPPONLY: mViewSource.MaybeLinkifyAttributeValue(attributeName, val);
- // CPPONLY: }
- // [NOCPP[
- if (!endTag && html4 && html4ModeCompatibleWithXhtml1Schemata
- && attributeName.isCaseFolded()) {
- val = newAsciiLowerCaseStringFromString(val);
- }
- // ]NOCPP]
- attributes.addAttribute(attributeName, val
- // [NOCPP[
- , xmlnsPolicy
- // ]NOCPP]
- // CPPONLY: , attributeLine
- );
- attributeName = null; // attributeName has been adopted by the
- // |attributes| object
- } else {
- // We have a duplicate attribute. Explicitly discard its value.
- clearStrBufAfterUse();
- }
- }
-
- // [NOCPP[
-
- private static String newAsciiLowerCaseStringFromString(String str) {
- if (str == null) {
- return null;
- }
- char[] buf = new char[str.length()];
- for (int i = 0; i < str.length(); i++) {
- char c = str.charAt(i);
- if (c >= 'A' && c <= 'Z') {
- c += 0x20;
- }
- buf[i] = c;
- }
- return new String(buf);
- }
-
- protected void startErrorReporting() throws SAXException {
-
- }
-
- // ]NOCPP]
-
- public void start() throws SAXException {
- initializeWithoutStarting();
- tokenHandler.startTokenization(this);
- // [NOCPP[
- startErrorReporting();
- // ]NOCPP]
- }
-
- public boolean tokenizeBuffer(UTF16Buffer buffer) throws SAXException {
- int state = stateSave;
- int returnState = returnStateSave;
- char c = '\u0000';
- shouldSuspend = false;
- lastCR = false;
-
- int start = buffer.getStart();
- int end = buffer.getEnd();
-
- // In C++, the caller of tokenizeBuffer needs to do this explicitly.
- // [NOCPP[
- ensureBufferSpace(end - start);
- // ]NOCPP]
-
- /**
- * The index of the last <code>char</code> read from <code>buf</code>.
- */
- int pos = start - 1;
-
- /**
- * The index of the first <code>char</code> in <code>buf</code> that is
- * part of a coalesced run of character tokens or
- * <code>Integer.MAX_VALUE</code> if there is not a current run being
- * coalesced.
- */
- switch (state) {
- case DATA:
- case RCDATA:
- case SCRIPT_DATA:
- case PLAINTEXT:
- case RAWTEXT:
- case CDATA_SECTION:
- case SCRIPT_DATA_ESCAPED:
- case SCRIPT_DATA_ESCAPE_START:
- case SCRIPT_DATA_ESCAPE_START_DASH:
- case SCRIPT_DATA_ESCAPED_DASH:
- case SCRIPT_DATA_ESCAPED_DASH_DASH:
- case SCRIPT_DATA_DOUBLE_ESCAPE_START:
- case SCRIPT_DATA_DOUBLE_ESCAPED:
- case SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN:
- case SCRIPT_DATA_DOUBLE_ESCAPED_DASH:
- case SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH:
- case SCRIPT_DATA_DOUBLE_ESCAPE_END:
- cstart = start;
- break;
- default:
- cstart = Integer.MAX_VALUE;
- break;
- }
-
- /**
- * The number of <code>char</code>s in <code>buf</code> that have
- * meaning. (The rest of the array is garbage and should not be
- * examined.)
- */
- // CPPONLY: if (mViewSource) {
- // CPPONLY: mViewSource.SetBuffer(buffer);
- // CPPONLY: pos = stateLoop(state, c, pos, buffer.getBuffer(), false, returnState, buffer.getEnd());
- // CPPONLY: mViewSource.DropBuffer((pos == buffer.getEnd()) ? pos : pos + 1);
- // CPPONLY: } else {
- // CPPONLY: pos = stateLoop(state, c, pos, buffer.getBuffer(), false, returnState, buffer.getEnd());
- // CPPONLY: }
- // [NOCPP[
- pos = stateLoop(state, c, pos, buffer.getBuffer(), false, returnState,
- end);
- // ]NOCPP]
- if (pos == end) {
- // exiting due to end of buffer
- buffer.setStart(pos);
- } else {
- buffer.setStart(pos + 1);
- }
- return lastCR;
- }
-
- // [NOCPP[
- private void ensureBufferSpace(int inputLength) throws SAXException {
- // Add 2 to account for emissions of LT_GT, LT_SOLIDUS and RSQB_RSQB.
- // Adding to the general worst case instead of only the
- // TreeBuilder-exposed worst case to avoid re-introducing a bug when
- // unifying the tokenizer and tree builder buffers in the future.
- int worstCase = strBufLen + inputLength + charRefBufLen + 2;
- tokenHandler.ensureBufferSpace(worstCase);
- if (commentPolicy == XmlViolationPolicy.ALTER_INFOSET) {
- // When altering infoset, if the comment contents are consecutive
- // hyphens, each hyphen generates a space, too. These buffer
- // contents never get emitted as characters() to the tokenHandler,
- // which is why this calculation happens after the call to
- // ensureBufferSpace on tokenHandler.
- worstCase *= 2;
- }
- if (strBuf == null) {
- // Add an arbitrary small value to avoid immediate reallocation
- // once there are a few characters in the buffer.
- strBuf = new char[worstCase + 128];
- } else if (worstCase > strBuf.length) {
- // HotSpot reportedly allocates memory with 8-byte accuracy, so
- // there's no point in trying to do math here to avoid slop.
- // Maybe we should add some small constant to worstCase here
- // but not doing that without profiling. In C++ with jemalloc,
- // the corresponding method should do math to round up here
- // to avoid slop.
- char[] newBuf = new char[worstCase];
- System.arraycopy(strBuf, 0, newBuf, 0, strBufLen);
- strBuf = newBuf;
- }
- }
- // ]NOCPP]
-
- @SuppressWarnings("unused") private int stateLoop(int state, char c,
- int pos, @NoLength char[] buf, boolean reconsume, int returnState,
- int endPos) throws SAXException {
- /*
- * Idioms used in this code:
- *
- *
- * Consuming the next input character
- *
- * To consume the next input character, the code does this: if (++pos ==
- * endPos) { break stateloop; } c = checkChar(buf, pos);
- *
- *
- * Staying in a state
- *
- * When there's a state that the tokenizer may stay in over multiple
- * input characters, the state has a wrapper |for(;;)| loop and staying
- * in the state continues the loop.
- *
- *
- * Switching to another state
- *
- * To switch to another state, the code sets the state variable to the
- * magic number of the new state. Then it either continues stateloop or
- * breaks out of the state's own wrapper loop if the target state is
- * right after the current state in source order. (This is a partial
- * workaround for Java's lack of goto.)
- *
- *
- * Reconsume support
- *
- * The spec sometimes says that an input character is reconsumed in
- * another state. If a state can ever be entered so that an input
- * character can be reconsumed in it, the state's code starts with an
- * |if (reconsume)| that sets reconsume to false and skips over the
- * normal code for consuming a new character.
- *
- * To reconsume the current character in another state, the code sets
- * |reconsume| to true and then switches to the other state.
- *
- *
- * Emitting character tokens
- *
- * This method emits character tokens lazily. Whenever a new range of
- * character tokens starts, the field cstart must be set to the start
- * index of the range. The flushChars() method must be called at the end
- * of a range to flush it.
- *
- *
- * U+0000 handling
- *
- * The various states have to handle the replacement of U+0000 with
- * U+FFFD. However, if U+0000 would be reconsumed in another state, the
- * replacement doesn't need to happen, because it's handled by the
- * reconsuming state.
- *
- *
- * LF handling
- *
- * Every state needs to increment the line number upon LF unless the LF
- * gets reconsumed by another state which increments the line number.
- *
- *
- * CR handling
- *
- * Every state needs to handle CR unless the CR gets reconsumed and is
- * handled by the reconsuming state. The CR needs to be handled as if it
- * were and LF, the lastCR field must be set to true and then this
- * method must return. The IO driver will then swallow the next
- * character if it is an LF to coalesce CRLF.
- */
- stateloop: for (;;) {
- switch (state) {
- case DATA:
- dataloop: for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- }
- switch (c) {
- case '&':
- /*
- * U+0026 AMPERSAND (&) Switch to the character
- * reference in data state.
- */
- flushChars(buf, pos);
- assert charRefBufLen == 0: "charRefBufLen not reset after previous use!";
- appendCharRefBuf(c);
- setAdditionalAndRememberAmpersandLocation('\u0000');
- returnState = state;
- state = transition(state, Tokenizer.CONSUME_CHARACTER_REFERENCE, reconsume, pos);
- continue stateloop;
- case '<':
- /*
- * U+003C LESS-THAN SIGN (<) Switch to the tag
- * open state.
- */
- flushChars(buf, pos);
-
- state = transition(state, Tokenizer.TAG_OPEN, reconsume, pos);
- break dataloop; // FALL THROUGH continue
- // stateloop;
- case '\u0000':
- emitReplacementCharacter(buf, pos);
- continue;
- case '\r':
- emitCarriageReturn(buf, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- default:
- /*
- * Anything else Emit the input character as a
- * character token.
- *
- * Stay in the data state.
- */
- continue;
- }
- }
- // WARNING FALLTHRU CASE TRANSITION: DON'T REORDER
- case TAG_OPEN:
- tagopenloop: for (;;) {
- /*
- * The behavior of this state depends on the content
- * model flag.
- */
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * If the content model flag is set to the PCDATA state
- * Consume the next input character:
- */
- if (c >= 'A' && c <= 'Z') {
- /*
- * U+0041 LATIN CAPITAL LETTER A through to U+005A
- * LATIN CAPITAL LETTER Z Create a new start tag
- * token,
- */
- endTag = false;
- /*
- * set its tag name to the lowercase version of the
- * input character (add 0x0020 to the character's
- * code point),
- */
- clearStrBufBeforeUse();
- appendStrBuf((char) (c + 0x20));
- /* then switch to the tag name state. */
- state = transition(state, Tokenizer.TAG_NAME, reconsume, pos);
- /*
- * (Don't emit the token yet; further details will
- * be filled in before it is emitted.)
- */
- break tagopenloop;
- // continue stateloop;
- } else if (c >= 'a' && c <= 'z') {
- /*
- * U+0061 LATIN SMALL LETTER A through to U+007A
- * LATIN SMALL LETTER Z Create a new start tag
- * token,
- */
- endTag = false;
- /*
- * set its tag name to the input character,
- */
- clearStrBufBeforeUse();
- appendStrBuf(c);
- /* then switch to the tag name state. */
- state = transition(state, Tokenizer.TAG_NAME, reconsume, pos);
- /*
- * (Don't emit the token yet; further details will
- * be filled in before it is emitted.)
- */
- break tagopenloop;
- // continue stateloop;
- }
- switch (c) {
- case '!':
- /*
- * U+0021 EXCLAMATION MARK (!) Switch to the
- * markup declaration open state.
- */
- state = transition(state, Tokenizer.MARKUP_DECLARATION_OPEN, reconsume, pos);
- continue stateloop;
- case '/':
- /*
- * U+002F SOLIDUS (/) Switch to the close tag
- * open state.
- */
- state = transition(state, Tokenizer.CLOSE_TAG_OPEN, reconsume, pos);
- continue stateloop;
- case '?':
- // CPPONLY: if (viewingXmlSource) {
- // CPPONLY: state = transition(state,
- // CPPONLY: Tokenizer.PROCESSING_INSTRUCTION,
- // CPPONLY: reconsume,
- // CPPONLY: pos);
- // CPPONLY: continue stateloop;
- // CPPONLY: }
- /*
- * U+003F QUESTION MARK (?) Parse error.
- */
- errProcessingInstruction();
- /*
- * Switch to the bogus comment state.
- */
- clearStrBufBeforeUse();
- appendStrBuf(c);
- state = transition(state, Tokenizer.BOGUS_COMMENT, reconsume, pos);
- continue stateloop;
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Parse error.
- */
- errLtGt();
- /*
- * Emit a U+003C LESS-THAN SIGN character token
- * and a U+003E GREATER-THAN SIGN character
- * token.
- */
- tokenHandler.characters(Tokenizer.LT_GT, 0, 2);
- /* Switch to the data state. */
- cstart = pos + 1;
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- default:
- /*
- * Anything else Parse error.
- */
- errBadCharAfterLt(c);
- /*
- * Emit a U+003C LESS-THAN SIGN character token
- */
- tokenHandler.characters(Tokenizer.LT_GT, 0, 1);
- /*
- * and reconsume the current input character in
- * the data state.
- */
- cstart = pos;
- reconsume = true;
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- }
- }
- // FALL THROUGH DON'T REORDER
- case TAG_NAME:
- tagnameloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '\r':
- silentCarriageReturn();
- strBufToElementNameString();
- state = transition(state, Tokenizer.BEFORE_ATTRIBUTE_NAME, reconsume, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- case ' ':
- case '\t':
- case '\u000C':
- /*
- * U+0009 CHARACTER TABULATION U+000A LINE FEED
- * (LF) U+000C FORM FEED (FF) U+0020 SPACE
- * Switch to the before attribute name state.
- */
- strBufToElementNameString();
- state = transition(state, Tokenizer.BEFORE_ATTRIBUTE_NAME, reconsume, pos);
- break tagnameloop;
- // continue stateloop;
- case '/':
- /*
- * U+002F SOLIDUS (/) Switch to the self-closing
- * start tag state.
- */
- strBufToElementNameString();
- state = transition(state, Tokenizer.SELF_CLOSING_START_TAG, reconsume, pos);
- continue stateloop;
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Emit the current
- * tag token.
- */
- strBufToElementNameString();
- state = transition(state, emitCurrentTagToken(false, pos), reconsume, pos);
- if (shouldSuspend) {
- break stateloop;
- }
- /*
- * Switch to the data state.
- */
- continue stateloop;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- default:
- if (c >= 'A' && c <= 'Z') {
- /*
- * U+0041 LATIN CAPITAL LETTER A through to
- * U+005A LATIN CAPITAL LETTER Z Append the
- * lowercase version of the current input
- * character (add 0x0020 to the character's
- * code point) to the current tag token's
- * tag name.
- */
- c += 0x20;
- }
- /*
- * Anything else Append the current input
- * character to the current tag token's tag
- * name.
- */
- appendStrBuf(c);
- /*
- * Stay in the tag name state.
- */
- continue;
- }
- }
- // FALLTHRU DON'T REORDER
- case BEFORE_ATTRIBUTE_NAME:
- beforeattributenameloop: for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- }
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '\r':
- silentCarriageReturn();
- break stateloop;
- case '\n':
- silentLineFeed();
- // fall thru
- case ' ':
- case '\t':
- case '\u000C':
- /*
- * U+0009 CHARACTER TABULATION U+000A LINE FEED
- * (LF) U+000C FORM FEED (FF) U+0020 SPACE Stay
- * in the before attribute name state.
- */
- continue;
- case '/':
- /*
- * U+002F SOLIDUS (/) Switch to the self-closing
- * start tag state.
- */
- state = transition(state, Tokenizer.SELF_CLOSING_START_TAG, reconsume, pos);
- continue stateloop;
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Emit the current
- * tag token.
- */
- state = transition(state, emitCurrentTagToken(false, pos), reconsume, pos);
- if (shouldSuspend) {
- break stateloop;
- }
- /*
- * Switch to the data state.
- */
- continue stateloop;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- case '\"':
- case '\'':
- case '<':
- case '=':
- /*
- * U+0022 QUOTATION MARK (") U+0027 APOSTROPHE
- * (') U+003C LESS-THAN SIGN (<) U+003D EQUALS
- * SIGN (=) Parse error.
- */
- errBadCharBeforeAttributeNameOrNull(c);
- /*
- * Treat it as per the "anything else" entry
- * below.
- */
- default:
- /*
- * Anything else Start a new attribute in the
- * current tag token.
- */
- if (c >= 'A' && c <= 'Z') {
- /*
- * U+0041 LATIN CAPITAL LETTER A through to
- * U+005A LATIN CAPITAL LETTER Z Set that
- * attribute's name to the lowercase version
- * of the current input character (add
- * 0x0020 to the character's code point)
- */
- c += 0x20;
- }
- // CPPONLY: attributeLine = line;
- /*
- * Set that attribute's name to the current
- * input character,
- */
- clearStrBufBeforeUse();
- appendStrBuf(c);
- /*
- * and its value to the empty string.
- */
- // Will do later.
- /*
- * Switch to the attribute name state.
- */
- state = transition(state, Tokenizer.ATTRIBUTE_NAME, reconsume, pos);
- break beforeattributenameloop;
- // continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case ATTRIBUTE_NAME:
- attributenameloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '\r':
- silentCarriageReturn();
- attributeNameComplete();
- state = transition(state, Tokenizer.AFTER_ATTRIBUTE_NAME, reconsume, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- // fall thru
- case ' ':
- case '\t':
- case '\u000C':
- /*
- * U+0009 CHARACTER TABULATION U+000A LINE FEED
- * (LF) U+000C FORM FEED (FF) U+0020 SPACE
- * Switch to the after attribute name state.
- */
- attributeNameComplete();
- state = transition(state, Tokenizer.AFTER_ATTRIBUTE_NAME, reconsume, pos);
- continue stateloop;
- case '/':
- /*
- * U+002F SOLIDUS (/) Switch to the self-closing
- * start tag state.
- */
- attributeNameComplete();
- addAttributeWithoutValue();
- state = transition(state, Tokenizer.SELF_CLOSING_START_TAG, reconsume, pos);
- continue stateloop;
- case '=':
- /*
- * U+003D EQUALS SIGN (=) Switch to the before
- * attribute value state.
- */
- attributeNameComplete();
- state = transition(state, Tokenizer.BEFORE_ATTRIBUTE_VALUE, reconsume, pos);
- break attributenameloop;
- // continue stateloop;
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Emit the current
- * tag token.
- */
- attributeNameComplete();
- addAttributeWithoutValue();
- state = transition(state, emitCurrentTagToken(false, pos), reconsume, pos);
- if (shouldSuspend) {
- break stateloop;
- }
- /*
- * Switch to the data state.
- */
- continue stateloop;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- case '\"':
- case '\'':
- case '<':
- /*
- * U+0022 QUOTATION MARK (") U+0027 APOSTROPHE
- * (') U+003C LESS-THAN SIGN (<) Parse error.
- */
- errQuoteOrLtInAttributeNameOrNull(c);
- /*
- * Treat it as per the "anything else" entry
- * below.
- */
- default:
- if (c >= 'A' && c <= 'Z') {
- /*
- * U+0041 LATIN CAPITAL LETTER A through to
- * U+005A LATIN CAPITAL LETTER Z Append the
- * lowercase version of the current input
- * character (add 0x0020 to the character's
- * code point) to the current attribute's
- * name.
- */
- c += 0x20;
- }
- /*
- * Anything else Append the current input
- * character to the current attribute's name.
- */
- appendStrBuf(c);
- /*
- * Stay in the attribute name state.
- */
- continue;
- }
- }
- // FALLTHRU DON'T REORDER
- case BEFORE_ATTRIBUTE_VALUE:
- beforeattributevalueloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '\r':
- silentCarriageReturn();
- break stateloop;
- case '\n':
- silentLineFeed();
- // fall thru
- case ' ':
- case '\t':
- case '\u000C':
- /*
- * U+0009 CHARACTER TABULATION U+000A LINE FEED
- * (LF) U+000C FORM FEED (FF) U+0020 SPACE Stay
- * in the before attribute value state.
- */
- continue;
- case '"':
- /*
- * U+0022 QUOTATION MARK (") Switch to the
- * attribute value (double-quoted) state.
- */
- // CPPONLY: attributeLine = line;
- clearStrBufBeforeUse();
- state = transition(state, Tokenizer.ATTRIBUTE_VALUE_DOUBLE_QUOTED, reconsume, pos);
- break beforeattributevalueloop;
- // continue stateloop;
- case '&':
- /*
- * U+0026 AMPERSAND (&) Switch to the attribute
- * value (unquoted) state and reconsume this
- * input character.
- */
- // CPPONLY: attributeLine = line;
- clearStrBufBeforeUse();
- reconsume = true;
- state = transition(state, Tokenizer.ATTRIBUTE_VALUE_UNQUOTED, reconsume, pos);
- noteUnquotedAttributeValue();
- continue stateloop;
- case '\'':
- /*
- * U+0027 APOSTROPHE (') Switch to the attribute
- * value (single-quoted) state.
- */
- // CPPONLY: attributeLine = line;
- clearStrBufBeforeUse();
- state = transition(state, Tokenizer.ATTRIBUTE_VALUE_SINGLE_QUOTED, reconsume, pos);
- continue stateloop;
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Parse error.
- */
- errAttributeValueMissing();
- /*
- * Emit the current tag token.
- */
- addAttributeWithoutValue();
- state = transition(state, emitCurrentTagToken(false, pos), reconsume, pos);
- if (shouldSuspend) {
- break stateloop;
- }
- /*
- * Switch to the data state.
- */
- continue stateloop;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- case '<':
- case '=':
- case '`':
- /*
- * U+003C LESS-THAN SIGN (<) U+003D EQUALS SIGN
- * (=) U+0060 GRAVE ACCENT (`)
- */
- errLtOrEqualsOrGraveInUnquotedAttributeOrNull(c);
- /*
- * Treat it as per the "anything else" entry
- * below.
- */
- default:
- // [NOCPP[
- errHtml4NonNameInUnquotedAttribute(c);
- // ]NOCPP]
- /*
- * Anything else Append the current input
- * character to the current attribute's value.
- */
- // CPPONLY: attributeLine = line;
- clearStrBufBeforeUse();
- appendStrBuf(c);
- /*
- * Switch to the attribute value (unquoted)
- * state.
- */
-
- state = transition(state, Tokenizer.ATTRIBUTE_VALUE_UNQUOTED, reconsume, pos);
- noteUnquotedAttributeValue();
- continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case ATTRIBUTE_VALUE_DOUBLE_QUOTED:
- attributevaluedoublequotedloop: for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- }
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '"':
- /*
- * U+0022 QUOTATION MARK (") Switch to the after
- * attribute value (quoted) state.
- */
- addAttributeWithValue();
-
- state = transition(state, Tokenizer.AFTER_ATTRIBUTE_VALUE_QUOTED, reconsume, pos);
- break attributevaluedoublequotedloop;
- // continue stateloop;
- case '&':
- /*
- * U+0026 AMPERSAND (&) Switch to the character
- * reference in attribute value state, with the
- * additional allowed character being U+0022
- * QUOTATION MARK (").
- */
- assert charRefBufLen == 0: "charRefBufLen not reset after previous use!";
- appendCharRefBuf(c);
- setAdditionalAndRememberAmpersandLocation('\"');
- returnState = state;
- state = transition(state, Tokenizer.CONSUME_CHARACTER_REFERENCE, reconsume, pos);
- continue stateloop;
- case '\r':
- appendStrBufCarriageReturn();
- break stateloop;
- case '\n':
- appendStrBufLineFeed();
- continue;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- default:
- /*
- * Anything else Append the current input
- * character to the current attribute's value.
- */
- appendStrBuf(c);
- /*
- * Stay in the attribute value (double-quoted)
- * state.
- */
- continue;
- }
- }
- // FALLTHRU DON'T REORDER
- case AFTER_ATTRIBUTE_VALUE_QUOTED:
- afterattributevaluequotedloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '\r':
- silentCarriageReturn();
- state = transition(state, Tokenizer.BEFORE_ATTRIBUTE_NAME, reconsume, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- // fall thru
- case ' ':
- case '\t':
- case '\u000C':
- /*
- * U+0009 CHARACTER TABULATION U+000A LINE FEED
- * (LF) U+000C FORM FEED (FF) U+0020 SPACE
- * Switch to the before attribute name state.
- */
- state = transition(state, Tokenizer.BEFORE_ATTRIBUTE_NAME, reconsume, pos);
- continue stateloop;
- case '/':
- /*
- * U+002F SOLIDUS (/) Switch to the self-closing
- * start tag state.
- */
- state = transition(state, Tokenizer.SELF_CLOSING_START_TAG, reconsume, pos);
- break afterattributevaluequotedloop;
- // continue stateloop;
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Emit the current
- * tag token.
- */
- state = transition(state, emitCurrentTagToken(false, pos), reconsume, pos);
- if (shouldSuspend) {
- break stateloop;
- }
- /*
- * Switch to the data state.
- */
- continue stateloop;
- default:
- /*
- * Anything else Parse error.
- */
- errNoSpaceBetweenAttributes();
- /*
- * Reconsume the character in the before
- * attribute name state.
- */
- reconsume = true;
- state = transition(state, Tokenizer.BEFORE_ATTRIBUTE_NAME, reconsume, pos);
- continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case SELF_CLOSING_START_TAG:
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Set the self-closing
- * flag of the current tag token. Emit the current
- * tag token.
- */
- // [NOCPP[
- errHtml4XmlVoidSyntax();
- // ]NOCPP]
- state = transition(state, emitCurrentTagToken(true, pos), reconsume, pos);
- if (shouldSuspend) {
- break stateloop;
- }
- /*
- * Switch to the data state.
- */
- continue stateloop;
- default:
- /* Anything else Parse error. */
- errSlashNotFollowedByGt();
- /*
- * Reconsume the character in the before attribute
- * name state.
- */
- reconsume = true;
- state = transition(state, Tokenizer.BEFORE_ATTRIBUTE_NAME, reconsume, pos);
- continue stateloop;
- }
- // XXX reorder point
- case ATTRIBUTE_VALUE_UNQUOTED:
- for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- }
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '\r':
- silentCarriageReturn();
- addAttributeWithValue();
- state = transition(state, Tokenizer.BEFORE_ATTRIBUTE_NAME, reconsume, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- // fall thru
- case ' ':
- case '\t':
- case '\u000C':
- /*
- * U+0009 CHARACTER TABULATION U+000A LINE FEED
- * (LF) U+000C FORM FEED (FF) U+0020 SPACE
- * Switch to the before attribute name state.
- */
- addAttributeWithValue();
- state = transition(state, Tokenizer.BEFORE_ATTRIBUTE_NAME, reconsume, pos);
- continue stateloop;
- case '&':
- /*
- * U+0026 AMPERSAND (&) Switch to the character
- * reference in attribute value state, with the
- * additional allowed character being U+003E
- * GREATER-THAN SIGN (>)
- */
- assert charRefBufLen == 0: "charRefBufLen not reset after previous use!";
- appendCharRefBuf(c);
- setAdditionalAndRememberAmpersandLocation('>');
- returnState = state;
- state = transition(state, Tokenizer.CONSUME_CHARACTER_REFERENCE, reconsume, pos);
- continue stateloop;
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Emit the current
- * tag token.
- */
- addAttributeWithValue();
- state = transition(state, emitCurrentTagToken(false, pos), reconsume, pos);
- if (shouldSuspend) {
- break stateloop;
- }
- /*
- * Switch to the data state.
- */
- continue stateloop;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- case '<':
- case '\"':
- case '\'':
- case '=':
- case '`':
- /*
- * U+0022 QUOTATION MARK (") U+0027 APOSTROPHE
- * (') U+003C LESS-THAN SIGN (<) U+003D EQUALS
- * SIGN (=) U+0060 GRAVE ACCENT (`) Parse error.
- */
- errUnquotedAttributeValOrNull(c);
- /*
- * Treat it as per the "anything else" entry
- * below.
- */
- // fall through
- default:
- // [NOCPP]
- errHtml4NonNameInUnquotedAttribute(c);
- // ]NOCPP]
- /*
- * Anything else Append the current input
- * character to the current attribute's value.
- */
- appendStrBuf(c);
- /*
- * Stay in the attribute value (unquoted) state.
- */
- continue;
- }
- }
- // XXX reorder point
- case AFTER_ATTRIBUTE_NAME:
- for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '\r':
- silentCarriageReturn();
- break stateloop;
- case '\n':
- silentLineFeed();
- // fall thru
- case ' ':
- case '\t':
- case '\u000C':
- /*
- * U+0009 CHARACTER TABULATION U+000A LINE FEED
- * (LF) U+000C FORM FEED (FF) U+0020 SPACE Stay
- * in the after attribute name state.
- */
- continue;
- case '/':
- /*
- * U+002F SOLIDUS (/) Switch to the self-closing
- * start tag state.
- */
- addAttributeWithoutValue();
- state = transition(state, Tokenizer.SELF_CLOSING_START_TAG, reconsume, pos);
- continue stateloop;
- case '=':
- /*
- * U+003D EQUALS SIGN (=) Switch to the before
- * attribute value state.
- */
- state = transition(state, Tokenizer.BEFORE_ATTRIBUTE_VALUE, reconsume, pos);
- continue stateloop;
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Emit the current
- * tag token.
- */
- addAttributeWithoutValue();
- state = transition(state, emitCurrentTagToken(false, pos), reconsume, pos);
- if (shouldSuspend) {
- break stateloop;
- }
- /*
- * Switch to the data state.
- */
- continue stateloop;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- case '\"':
- case '\'':
- case '<':
- errQuoteOrLtInAttributeNameOrNull(c);
- /*
- * Treat it as per the "anything else" entry
- * below.
- */
- default:
- addAttributeWithoutValue();
- /*
- * Anything else Start a new attribute in the
- * current tag token.
- */
- if (c >= 'A' && c <= 'Z') {
- /*
- * U+0041 LATIN CAPITAL LETTER A through to
- * U+005A LATIN CAPITAL LETTER Z Set that
- * attribute's name to the lowercase version
- * of the current input character (add
- * 0x0020 to the character's code point)
- */
- c += 0x20;
- }
- /*
- * Set that attribute's name to the current
- * input character,
- */
- clearStrBufBeforeUse();
- appendStrBuf(c);
- /*
- * and its value to the empty string.
- */
- // Will do later.
- /*
- * Switch to the attribute name state.
- */
- state = transition(state, Tokenizer.ATTRIBUTE_NAME, reconsume, pos);
- continue stateloop;
- }
- }
- // XXX reorder point
- case MARKUP_DECLARATION_OPEN:
- markupdeclarationopenloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * If the next two characters are both U+002D
- * HYPHEN-MINUS characters (-), consume those two
- * characters, create a comment token whose data is the
- * empty string, and switch to the comment start state.
- *
- * Otherwise, if the next seven characters are an ASCII
- * case-insensitive match for the word "DOCTYPE", then
- * consume those characters and switch to the DOCTYPE
- * state.
- *
- * Otherwise, if the insertion mode is
- * "in foreign content" and the current node is not an
- * element in the HTML namespace and the next seven
- * characters are an case-sensitive match for the string
- * "[CDATA[" (the five uppercase letters "CDATA" with a
- * U+005B LEFT SQUARE BRACKET character before and
- * after), then consume those characters and switch to
- * the CDATA section state.
- *
- * Otherwise, is is a parse error. Switch to the bogus
- * comment state. The next character that is consumed,
- * if any, is the first character that will be in the
- * comment.
- */
- switch (c) {
- case '-':
- clearStrBufBeforeUse();
- appendStrBuf(c);
- state = transition(state, Tokenizer.MARKUP_DECLARATION_HYPHEN, reconsume, pos);
- break markupdeclarationopenloop;
- // continue stateloop;
- case 'd':
- case 'D':
- clearStrBufBeforeUse();
- appendStrBuf(c);
- index = 0;
- state = transition(state, Tokenizer.MARKUP_DECLARATION_OCTYPE, reconsume, pos);
- continue stateloop;
- case '[':
- if (tokenHandler.cdataSectionAllowed()) {
- clearStrBufBeforeUse();
- appendStrBuf(c);
- index = 0;
- state = transition(state, Tokenizer.CDATA_START, reconsume, pos);
- continue stateloop;
- }
- // else fall through
- default:
- errBogusComment();
- clearStrBufBeforeUse();
- reconsume = true;
- state = transition(state, Tokenizer.BOGUS_COMMENT, reconsume, pos);
- continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case MARKUP_DECLARATION_HYPHEN:
- markupdeclarationhyphenloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- switch (c) {
- case '\u0000':
- break stateloop;
- case '-':
- clearStrBufAfterOneHyphen();
- state = transition(state, Tokenizer.COMMENT_START, reconsume, pos);
- break markupdeclarationhyphenloop;
- // continue stateloop;
- default:
- errBogusComment();
- reconsume = true;
- state = transition(state, Tokenizer.BOGUS_COMMENT, reconsume, pos);
- continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case COMMENT_START:
- commentstartloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Comment start state
- *
- *
- * Consume the next input character:
- */
- switch (c) {
- case '-':
- /*
- * U+002D HYPHEN-MINUS (-) Switch to the comment
- * start dash state.
- */
- appendStrBuf(c);
- state = transition(state, Tokenizer.COMMENT_START_DASH, reconsume, pos);
- continue stateloop;
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Parse error.
- */
- errPrematureEndOfComment();
- /* Emit the comment token. */
- emitComment(0, pos);
- /*
- * Switch to the data state.
- */
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- case '\r':
- appendStrBufCarriageReturn();
- state = transition(state, Tokenizer.COMMENT, reconsume, pos);
- break stateloop;
- case '\n':
- appendStrBufLineFeed();
- state = transition(state, Tokenizer.COMMENT, reconsume, pos);
- break commentstartloop;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- default:
- /*
- * Anything else Append the input character to
- * the comment token's data.
- */
- appendStrBuf(c);
- /*
- * Switch to the comment state.
- */
- state = transition(state, Tokenizer.COMMENT, reconsume, pos);
- break commentstartloop;
- // continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case COMMENT:
- commentloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Comment state Consume the next input character:
- */
- switch (c) {
- case '-':
- /*
- * U+002D HYPHEN-MINUS (-) Switch to the comment
- * end dash state
- */
- appendStrBuf(c);
- state = transition(state, Tokenizer.COMMENT_END_DASH, reconsume, pos);
- break commentloop;
- // continue stateloop;
- case '\r':
- appendStrBufCarriageReturn();
- break stateloop;
- case '\n':
- appendStrBufLineFeed();
- continue;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- default:
- /*
- * Anything else Append the input character to
- * the comment token's data.
- */
- appendStrBuf(c);
- /*
- * Stay in the comment state.
- */
- continue;
- }
- }
- // FALLTHRU DON'T REORDER
- case COMMENT_END_DASH:
- commentenddashloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Comment end dash state Consume the next input
- * character:
- */
- switch (c) {
- case '-':
- /*
- * U+002D HYPHEN-MINUS (-) Switch to the comment
- * end state
- */
- appendStrBuf(c);
- state = transition(state, Tokenizer.COMMENT_END, reconsume, pos);
- break commentenddashloop;
- // continue stateloop;
- case '\r':
- appendStrBufCarriageReturn();
- state = transition(state, Tokenizer.COMMENT, reconsume, pos);
- break stateloop;
- case '\n':
- appendStrBufLineFeed();
- state = transition(state, Tokenizer.COMMENT, reconsume, pos);
- continue stateloop;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- default:
- /*
- * Anything else Append a U+002D HYPHEN-MINUS
- * (-) character and the input character to the
- * comment token's data.
- */
- appendStrBuf(c);
- /*
- * Switch to the comment state.
- */
- state = transition(state, Tokenizer.COMMENT, reconsume, pos);
- continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case COMMENT_END:
- commentendloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Comment end dash state Consume the next input
- * character:
- */
- switch (c) {
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Emit the comment
- * token.
- */
- emitComment(2, pos);
- /*
- * Switch to the data state.
- */
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- case '-':
- /* U+002D HYPHEN-MINUS (-) Parse error. */
- /*
- * Append a U+002D HYPHEN-MINUS (-) character to
- * the comment token's data.
- */
- adjustDoubleHyphenAndAppendToStrBufAndErr(c);
- /*
- * Stay in the comment end state.
- */
- continue;
- case '\r':
- adjustDoubleHyphenAndAppendToStrBufCarriageReturn();
- state = transition(state, Tokenizer.COMMENT, reconsume, pos);
- break stateloop;
- case '\n':
- adjustDoubleHyphenAndAppendToStrBufLineFeed();
- state = transition(state, Tokenizer.COMMENT, reconsume, pos);
- continue stateloop;
- case '!':
- errHyphenHyphenBang();
- appendStrBuf(c);
- state = transition(state, Tokenizer.COMMENT_END_BANG, reconsume, pos);
- continue stateloop;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- default:
- /*
- * Append two U+002D HYPHEN-MINUS (-) characters
- * and the input character to the comment
- * token's data.
- */
- adjustDoubleHyphenAndAppendToStrBufAndErr(c);
- /*
- * Switch to the comment state.
- */
- state = transition(state, Tokenizer.COMMENT, reconsume, pos);
- continue stateloop;
- }
- }
- // XXX reorder point
- case COMMENT_END_BANG:
- for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Comment end bang state
- *
- * Consume the next input character:
- */
- switch (c) {
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Emit the comment
- * token.
- */
- emitComment(3, pos);
- /*
- * Switch to the data state.
- */
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- case '-':
- /*
- * Append two U+002D HYPHEN-MINUS (-) characters
- * and a U+0021 EXCLAMATION MARK (!) character
- * to the comment token's data.
- */
- appendStrBuf(c);
- /*
- * Switch to the comment end dash state.
- */
- state = transition(state, Tokenizer.COMMENT_END_DASH, reconsume, pos);
- continue stateloop;
- case '\r':
- appendStrBufCarriageReturn();
- break stateloop;
- case '\n':
- appendStrBufLineFeed();
- continue;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- default:
- /*
- * Anything else Append two U+002D HYPHEN-MINUS
- * (-) characters, a U+0021 EXCLAMATION MARK (!)
- * character, and the input character to the
- * comment token's data. Switch to the comment
- * state.
- */
- appendStrBuf(c);
- /*
- * Switch to the comment state.
- */
- state = transition(state, Tokenizer.COMMENT, reconsume, pos);
- continue stateloop;
- }
- }
- // XXX reorder point
- case COMMENT_START_DASH:
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Comment start dash state
- *
- * Consume the next input character:
- */
- switch (c) {
- case '-':
- /*
- * U+002D HYPHEN-MINUS (-) Switch to the comment end
- * state
- */
- appendStrBuf(c);
- state = transition(state, Tokenizer.COMMENT_END, reconsume, pos);
- continue stateloop;
- case '>':
- errPrematureEndOfComment();
- /* Emit the comment token. */
- emitComment(1, pos);
- /*
- * Switch to the data state.
- */
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- case '\r':
- appendStrBufCarriageReturn();
- state = transition(state, Tokenizer.COMMENT, reconsume, pos);
- break stateloop;
- case '\n':
- appendStrBufLineFeed();
- state = transition(state, Tokenizer.COMMENT, reconsume, pos);
- continue stateloop;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- default:
- /*
- * Append a U+002D HYPHEN-MINUS character (-) and
- * the current input character to the comment
- * token's data.
- */
- appendStrBuf(c);
- /*
- * Switch to the comment state.
- */
- state = transition(state, Tokenizer.COMMENT, reconsume, pos);
- continue stateloop;
- }
- // XXX reorder point
- case CDATA_START:
- for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- if (index < 6) { // CDATA_LSQB.length
- if (c == Tokenizer.CDATA_LSQB[index]) {
- appendStrBuf(c);
- } else {
- errBogusComment();
- reconsume = true;
- state = transition(state, Tokenizer.BOGUS_COMMENT, reconsume, pos);
- continue stateloop;
- }
- index++;
- continue;
- } else {
- clearStrBufAfterUse();
- cstart = pos; // start coalescing
- reconsume = true;
- state = transition(state, Tokenizer.CDATA_SECTION, reconsume, pos);
- break; // FALL THROUGH continue stateloop;
- }
- }
- // WARNING FALLTHRU CASE TRANSITION: DON'T REORDER
- case CDATA_SECTION:
- cdatasectionloop: for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- }
- switch (c) {
- case ']':
- flushChars(buf, pos);
- state = transition(state, Tokenizer.CDATA_RSQB, reconsume, pos);
- break cdatasectionloop; // FALL THROUGH
- case '\u0000':
- emitReplacementCharacter(buf, pos);
- continue;
- case '\r':
- emitCarriageReturn(buf, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- // fall thru
- default:
- continue;
- }
- }
- // WARNING FALLTHRU CASE TRANSITION: DON'T REORDER
- case CDATA_RSQB:
- cdatarsqb: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- switch (c) {
- case ']':
- state = transition(state, Tokenizer.CDATA_RSQB_RSQB, reconsume, pos);
- break cdatarsqb;
- default:
- tokenHandler.characters(Tokenizer.RSQB_RSQB, 0,
- 1);
- cstart = pos;
- reconsume = true;
- state = transition(state, Tokenizer.CDATA_SECTION, reconsume, pos);
- continue stateloop;
- }
- }
- // WARNING FALLTHRU CASE TRANSITION: DON'T REORDER
- case CDATA_RSQB_RSQB:
- cdatarsqbrsqb: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- switch (c) {
- case ']':
- // Saw a third ]. Emit one ] (logically the
- // first one) and stay in this state to
- // remember that the last two characters seen
- // have been ]].
- tokenHandler.characters(Tokenizer.RSQB_RSQB, 0, 1);
- continue;
- case '>':
- cstart = pos + 1;
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- default:
- tokenHandler.characters(Tokenizer.RSQB_RSQB, 0, 2);
- cstart = pos;
- reconsume = true;
- state = transition(state, Tokenizer.CDATA_SECTION, reconsume, pos);
- continue stateloop;
- }
- }
- // XXX reorder point
- case ATTRIBUTE_VALUE_SINGLE_QUOTED:
- attributevaluesinglequotedloop: for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- }
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '\'':
- /*
- * U+0027 APOSTROPHE (') Switch to the after
- * attribute value (quoted) state.
- */
- addAttributeWithValue();
-
- state = transition(state, Tokenizer.AFTER_ATTRIBUTE_VALUE_QUOTED, reconsume, pos);
- continue stateloop;
- case '&':
- /*
- * U+0026 AMPERSAND (&) Switch to the character
- * reference in attribute value state, with the
- * + additional allowed character being U+0027
- * APOSTROPHE (').
- */
- assert charRefBufLen == 0: "charRefBufLen not reset after previous use!";
- appendCharRefBuf(c);
- setAdditionalAndRememberAmpersandLocation('\'');
- returnState = state;
- state = transition(state, Tokenizer.CONSUME_CHARACTER_REFERENCE, reconsume, pos);
- break attributevaluesinglequotedloop;
- // continue stateloop;
- case '\r':
- appendStrBufCarriageReturn();
- break stateloop;
- case '\n':
- appendStrBufLineFeed();
- continue;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- default:
- /*
- * Anything else Append the current input
- * character to the current attribute's value.
- */
- appendStrBuf(c);
- /*
- * Stay in the attribute value (double-quoted)
- * state.
- */
- continue;
- }
- }
- // FALLTHRU DON'T REORDER
- case CONSUME_CHARACTER_REFERENCE:
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- if (c == '\u0000') {
- break stateloop;
- }
- /*
- * Unlike the definition is the spec, this state does not
- * return a value and never requires the caller to
- * backtrack. This state takes care of emitting characters
- * or appending to the current attribute value. It also
- * takes care of that in the case when consuming the
- * character reference fails.
- */
- /*
- * This section defines how to consume a character
- * reference. This definition is used when parsing character
- * references in text and in attributes.
- *
- * The behavior depends on the identity of the next
- * character (the one immediately after the U+0026 AMPERSAND
- * character):
- */
- switch (c) {
- case ' ':
- case '\t':
- case '\n':
- case '\r': // we'll reconsume!
- case '\u000C':
- case '<':
- case '&':
- emitOrAppendCharRefBuf(returnState);
- if ((returnState & DATA_AND_RCDATA_MASK) == 0) {
- cstart = pos;
- }
- reconsume = true;
- state = transition(state, returnState, reconsume, pos);
- continue stateloop;
- case '#':
- /*
- * U+0023 NUMBER SIGN (#) Consume the U+0023 NUMBER
- * SIGN.
- */
- appendCharRefBuf('#');
- state = transition(state, Tokenizer.CONSUME_NCR, reconsume, pos);
- continue stateloop;
- default:
- if (c == additional) {
- emitOrAppendCharRefBuf(returnState);
- reconsume = true;
- state = transition(state, returnState, reconsume, pos);
- continue stateloop;
- }
- if (c >= 'a' && c <= 'z') {
- firstCharKey = c - 'a' + 26;
- } else if (c >= 'A' && c <= 'Z') {
- firstCharKey = c - 'A';
- } else {
- // No match
- /*
- * If no match can be made, then this is a parse
- * error.
- */
- errNoNamedCharacterMatch();
- emitOrAppendCharRefBuf(returnState);
- if ((returnState & DATA_AND_RCDATA_MASK) == 0) {
- cstart = pos;
- }
- reconsume = true;
- state = transition(state, returnState, reconsume, pos);
- continue stateloop;
- }
- // Didn't fail yet
- appendCharRefBuf(c);
- state = transition(state, Tokenizer.CHARACTER_REFERENCE_HILO_LOOKUP, reconsume, pos);
- // FALL THROUGH continue stateloop;
- }
- // WARNING FALLTHRU CASE TRANSITION: DON'T REORDER
- case CHARACTER_REFERENCE_HILO_LOOKUP:
- {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- if (c == '\u0000') {
- break stateloop;
- }
- /*
- * The data structure is as follows:
- *
- * HILO_ACCEL is a two-dimensional int array whose major
- * index corresponds to the second character of the
- * character reference (code point as index) and the
- * minor index corresponds to the first character of the
- * character reference (packed so that A-Z runs from 0
- * to 25 and a-z runs from 26 to 51). This layout makes
- * it easier to use the sparseness of the data structure
- * to omit parts of it: The second dimension of the
- * table is null when no character reference starts with
- * the character corresponding to that row.
- *
- * The int value HILO_ACCEL (by these indeces) is zero
- * if there exists no character reference starting with
- * that two-letter prefix. Otherwise, the value is an
- * int that packs two shorts so that the higher short is
- * the index of the highest character reference name
- * with that prefix in NAMES and the lower short
- * corresponds to the index of the lowest character
- * reference name with that prefix. (It happens that the
- * first two character reference names share their
- * prefix so the packed int cannot be 0 by packing the
- * two shorts.)
- *
- * NAMES is an array of byte arrays where each byte
- * array encodes the name of a character references as
- * ASCII. The names omit the first two letters of the
- * name. (Since storing the first two letters would be
- * redundant with the data contained in HILO_ACCEL.) The
- * entries are lexically sorted.
- *
- * For a given index in NAMES, the same index in VALUES
- * contains the corresponding expansion as an array of
- * two UTF-16 code units (either the character and
- * U+0000 or a suggogate pair).
- */
- int hilo = 0;
- if (c <= 'z') {
- @Const @NoLength int[] row = NamedCharactersAccel.HILO_ACCEL[c];
- if (row != null) {
- hilo = row[firstCharKey];
- }
- }
- if (hilo == 0) {
- /*
- * If no match can be made, then this is a parse
- * error.
- */
- errNoNamedCharacterMatch();
- emitOrAppendCharRefBuf(returnState);
- if ((returnState & DATA_AND_RCDATA_MASK) == 0) {
- cstart = pos;
- }
- reconsume = true;
- state = transition(state, returnState, reconsume, pos);
- continue stateloop;
- }
- // Didn't fail yet
- appendCharRefBuf(c);
- lo = hilo & 0xFFFF;
- hi = hilo >> 16;
- entCol = -1;
- candidate = -1;
- charRefBufMark = 0;
- state = transition(state, Tokenizer.CHARACTER_REFERENCE_TAIL, reconsume, pos);
- // FALL THROUGH continue stateloop;
- }
- case CHARACTER_REFERENCE_TAIL:
- outer: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- if (c == '\u0000') {
- break stateloop;
- }
- entCol++;
- /*
- * Consume the maximum number of characters possible,
- * with the consumed characters matching one of the
- * identifiers in the first column of the named
- * character references table (in a case-sensitive
- * manner).
- */
- loloop: for (;;) {
- if (hi < lo) {
- break outer;
- }
- if (entCol == NamedCharacters.NAMES[lo].length()) {
- candidate = lo;
- charRefBufMark = charRefBufLen;
- lo++;
- } else if (entCol > NamedCharacters.NAMES[lo].length()) {
- break outer;
- } else if (c > NamedCharacters.NAMES[lo].charAt(entCol)) {
- lo++;
- } else {
- break loloop;
- }
- }
-
- hiloop: for (;;) {
- if (hi < lo) {
- break outer;
- }
- if (entCol == NamedCharacters.NAMES[hi].length()) {
- break hiloop;
- }
- if (entCol > NamedCharacters.NAMES[hi].length()) {
- break outer;
- } else if (c < NamedCharacters.NAMES[hi].charAt(entCol)) {
- hi--;
- } else {
- break hiloop;
- }
- }
-
- if (c == ';') {
- // If we see a semicolon, there cannot be a
- // longer match. Break the loop. However, before
- // breaking, take the longest match so far as the
- // candidate, if we are just about to complete a
- // match.
- if (entCol + 1 == NamedCharacters.NAMES[lo].length()) {
- candidate = lo;
- charRefBufMark = charRefBufLen;
- }
- break outer;
- }
-
- if (hi < lo) {
- break outer;
- }
- appendCharRefBuf(c);
- continue;
- }
-
- if (candidate == -1) {
- // reconsume deals with CR, LF or nul
- /*
- * If no match can be made, then this is a parse error.
- */
- errNoNamedCharacterMatch();
- emitOrAppendCharRefBuf(returnState);
- if ((returnState & DATA_AND_RCDATA_MASK) == 0) {
- cstart = pos;
- }
- reconsume = true;
- state = transition(state, returnState, reconsume, pos);
- continue stateloop;
- } else {
- // c can't be CR, LF or nul if we got here
- @Const @CharacterName String candidateName = NamedCharacters.NAMES[candidate];
- if (candidateName.length() == 0
- || candidateName.charAt(candidateName.length() - 1) != ';') {
- /*
- * If the last character matched is not a U+003B
- * SEMICOLON (;), there is a parse error.
- */
- if ((returnState & DATA_AND_RCDATA_MASK) != 0) {
- /*
- * If the entity is being consumed as part of an
- * attribute, and the last character matched is
- * not a U+003B SEMICOLON (;),
- */
- char ch;
- if (charRefBufMark == charRefBufLen) {
- ch = c;
- } else {
- ch = charRefBuf[charRefBufMark];
- }
- if (ch == '=' || (ch >= '0' && ch <= '9')
- || (ch >= 'A' && ch <= 'Z')
- || (ch >= 'a' && ch <= 'z')) {
- /*
- * and the next character is either a U+003D
- * EQUALS SIGN character (=) or in the range
- * U+0030 DIGIT ZERO to U+0039 DIGIT NINE,
- * U+0041 LATIN CAPITAL LETTER A to U+005A
- * LATIN CAPITAL LETTER Z, or U+0061 LATIN
- * SMALL LETTER A to U+007A LATIN SMALL
- * LETTER Z, then, for historical reasons,
- * all the characters that were matched
- * after the U+0026 AMPERSAND (&) must be
- * unconsumed, and nothing is returned.
- */
- errNoNamedCharacterMatch();
- appendCharRefBufToStrBuf();
- reconsume = true;
- state = transition(state, returnState, reconsume, pos);
- continue stateloop;
- }
- }
- if ((returnState & DATA_AND_RCDATA_MASK) != 0) {
- errUnescapedAmpersandInterpretedAsCharacterReference();
- } else {
- errNotSemicolonTerminated();
- }
- }
-
- /*
- * Otherwise, return a character token for the character
- * corresponding to the entity name (as given by the
- * second column of the named character references
- * table).
- */
- // CPPONLY: completedNamedCharacterReference();
- @Const @NoLength char[] val = NamedCharacters.VALUES[candidate];
- if (
- // [NOCPP[
- val.length == 1
- // ]NOCPP]
- // CPPONLY: val[1] == 0
- ) {
- emitOrAppendOne(val, returnState);
- } else {
- emitOrAppendTwo(val, returnState);
- }
- // this is so complicated!
- if (charRefBufMark < charRefBufLen) {
- if ((returnState & DATA_AND_RCDATA_MASK) != 0) {
- appendStrBuf(charRefBuf, charRefBufMark,
- charRefBufLen - charRefBufMark);
- } else {
- tokenHandler.characters(charRefBuf, charRefBufMark,
- charRefBufLen - charRefBufMark);
- }
- }
- // charRefBufLen will be zeroed below!
-
- // Check if we broke out early with c being the last
- // character that matched as opposed to being the
- // first one that didn't match. In the case of an
- // early break, the next run on text should start
- // *after* the current character and the current
- // character shouldn't be reconsumed.
- boolean earlyBreak = (c == ';' && charRefBufMark == charRefBufLen);
- charRefBufLen = 0;
- if ((returnState & DATA_AND_RCDATA_MASK) == 0) {
- cstart = earlyBreak ? pos + 1 : pos;
- }
- reconsume = !earlyBreak;
- state = transition(state, returnState, reconsume, pos);
- continue stateloop;
- /*
- * If the markup contains I'm &notit; I tell you, the
- * entity is parsed as "not", as in, I'm ¬it; I tell
- * you. But if the markup was I'm &notin; I tell you,
- * the entity would be parsed as "notin;", resulting in
- * I'm ∉ I tell you.
- */
- }
- // XXX reorder point
- case CONSUME_NCR:
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- value = 0;
- seenDigits = false;
- /*
- * The behavior further depends on the character after the
- * U+0023 NUMBER SIGN:
- */
- switch (c) {
- case 'x':
- case 'X':
-
- /*
- * U+0078 LATIN SMALL LETTER X U+0058 LATIN CAPITAL
- * LETTER X Consume the X.
- *
- * Follow the steps below, but using the range of
- * characters U+0030 DIGIT ZERO through to U+0039
- * DIGIT NINE, U+0061 LATIN SMALL LETTER A through
- * to U+0066 LATIN SMALL LETTER F, and U+0041 LATIN
- * CAPITAL LETTER A, through to U+0046 LATIN CAPITAL
- * LETTER F (in other words, 0-9, A-F, a-f).
- *
- * When it comes to interpreting the number,
- * interpret it as a hexadecimal number.
- */
- appendCharRefBuf(c);
- state = transition(state, Tokenizer.HEX_NCR_LOOP, reconsume, pos);
- continue stateloop;
- default:
- /*
- * Anything else Follow the steps below, but using
- * the range of characters U+0030 DIGIT ZERO through
- * to U+0039 DIGIT NINE (i.e. just 0-9).
- *
- * When it comes to interpreting the number,
- * interpret it as a decimal number.
- */
- reconsume = true;
- state = transition(state, Tokenizer.DECIMAL_NRC_LOOP, reconsume, pos);
- // FALL THROUGH continue stateloop;
- }
- // WARNING FALLTHRU CASE TRANSITION: DON'T REORDER
- case DECIMAL_NRC_LOOP:
- decimalloop: for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- }
- /*
- * Consume as many characters as match the range of
- * characters given above.
- */
- assert value >= 0: "value must not become negative.";
- if (c >= '0' && c <= '9') {
- seenDigits = true;
- // Avoid overflow
- if (value <= 0x10FFFF) {
- value *= 10;
- value += c - '0';
- }
- continue;
- } else if (c == ';') {
- if (seenDigits) {
- if ((returnState & DATA_AND_RCDATA_MASK) == 0) {
- cstart = pos + 1;
- }
- state = transition(state, Tokenizer.HANDLE_NCR_VALUE, reconsume, pos);
- // FALL THROUGH continue stateloop;
- break decimalloop;
- } else {
- errNoDigitsInNCR();
- appendCharRefBuf(';');
- emitOrAppendCharRefBuf(returnState);
- if ((returnState & DATA_AND_RCDATA_MASK) == 0) {
- cstart = pos + 1;
- }
- state = transition(state, returnState, reconsume, pos);
- continue stateloop;
- }
- } else {
- /*
- * If no characters match the range, then don't
- * consume any characters (and unconsume the U+0023
- * NUMBER SIGN character and, if appropriate, the X
- * character). This is a parse error; nothing is
- * returned.
- *
- * Otherwise, if the next character is a U+003B
- * SEMICOLON, consume that too. If it isn't, there
- * is a parse error.
- */
- if (!seenDigits) {
- errNoDigitsInNCR();
- emitOrAppendCharRefBuf(returnState);
- if ((returnState & DATA_AND_RCDATA_MASK) == 0) {
- cstart = pos;
- }
- reconsume = true;
- state = transition(state, returnState, reconsume, pos);
- continue stateloop;
- } else {
- errCharRefLacksSemicolon();
- if ((returnState & DATA_AND_RCDATA_MASK) == 0) {
- cstart = pos;
- }
- reconsume = true;
- state = transition(state, Tokenizer.HANDLE_NCR_VALUE, reconsume, pos);
- // FALL THROUGH continue stateloop;
- break decimalloop;
- }
- }
- }
- // WARNING FALLTHRU CASE TRANSITION: DON'T REORDER
- case HANDLE_NCR_VALUE:
- // WARNING previous state sets reconsume
- // We are not going to emit the contents of charRefBuf.
- charRefBufLen = 0;
- // XXX inline this case if the method size can take it
- handleNcrValue(returnState);
- state = transition(state, returnState, reconsume, pos);
- continue stateloop;
- // XXX reorder point
- case HEX_NCR_LOOP:
- for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume as many characters as match the range of
- * characters given above.
- */
- assert value >= 0: "value must not become negative.";
- if (c >= '0' && c <= '9') {
- seenDigits = true;
- // Avoid overflow
- if (value <= 0x10FFFF) {
- value *= 16;
- value += c - '0';
- }
- continue;
- } else if (c >= 'A' && c <= 'F') {
- seenDigits = true;
- // Avoid overflow
- if (value <= 0x10FFFF) {
- value *= 16;
- value += c - 'A' + 10;
- }
- continue;
- } else if (c >= 'a' && c <= 'f') {
- seenDigits = true;
- // Avoid overflow
- if (value <= 0x10FFFF) {
- value *= 16;
- value += c - 'a' + 10;
- }
- continue;
- } else if (c == ';') {
- if (seenDigits) {
- if ((returnState & DATA_AND_RCDATA_MASK) == 0) {
- cstart = pos + 1;
- }
- state = transition(state, Tokenizer.HANDLE_NCR_VALUE, reconsume, pos);
- continue stateloop;
- } else {
- errNoDigitsInNCR();
- appendCharRefBuf(';');
- emitOrAppendCharRefBuf(returnState);
- if ((returnState & DATA_AND_RCDATA_MASK) == 0) {
- cstart = pos + 1;
- }
- state = transition(state, returnState, reconsume, pos);
- continue stateloop;
- }
- } else {
- /*
- * If no characters match the range, then don't
- * consume any characters (and unconsume the U+0023
- * NUMBER SIGN character and, if appropriate, the X
- * character). This is a parse error; nothing is
- * returned.
- *
- * Otherwise, if the next character is a U+003B
- * SEMICOLON, consume that too. If it isn't, there
- * is a parse error.
- */
- if (!seenDigits) {
- errNoDigitsInNCR();
- emitOrAppendCharRefBuf(returnState);
- if ((returnState & DATA_AND_RCDATA_MASK) == 0) {
- cstart = pos;
- }
- reconsume = true;
- state = transition(state, returnState, reconsume, pos);
- continue stateloop;
- } else {
- errCharRefLacksSemicolon();
- if ((returnState & DATA_AND_RCDATA_MASK) == 0) {
- cstart = pos;
- }
- reconsume = true;
- state = transition(state, Tokenizer.HANDLE_NCR_VALUE, reconsume, pos);
- continue stateloop;
- }
- }
- }
- // XXX reorder point
- case PLAINTEXT:
- plaintextloop: for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- }
- switch (c) {
- case '\u0000':
- emitPlaintextReplacementCharacter(buf, pos);
- continue;
- case '\r':
- emitCarriageReturn(buf, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- default:
- /*
- * Anything else Emit the current input
- * character as a character token. Stay in the
- * RAWTEXT state.
- */
- continue;
- }
- }
- // XXX reorder point
- case CLOSE_TAG_OPEN:
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Otherwise, if the content model flag is set to the PCDATA
- * state, or if the next few characters do match that tag
- * name, consume the next input character:
- */
- switch (c) {
- case '>':
- /* U+003E GREATER-THAN SIGN (>) Parse error. */
- errLtSlashGt();
- /*
- * Switch to the data state.
- */
- cstart = pos + 1;
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- case '\r':
- silentCarriageReturn();
- /* Anything else Parse error. */
- errGarbageAfterLtSlash();
- /*
- * Switch to the bogus comment state.
- */
- clearStrBufBeforeUse();
- appendStrBuf('\n');
- state = transition(state, Tokenizer.BOGUS_COMMENT, reconsume, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- /* Anything else Parse error. */
- errGarbageAfterLtSlash();
- /*
- * Switch to the bogus comment state.
- */
- clearStrBufBeforeUse();
- appendStrBuf(c);
- state = transition(state, Tokenizer.BOGUS_COMMENT, reconsume, pos);
- continue stateloop;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- default:
- if (c >= 'A' && c <= 'Z') {
- c += 0x20;
- }
- if (c >= 'a' && c <= 'z') {
- /*
- * U+0061 LATIN SMALL LETTER A through to U+007A
- * LATIN SMALL LETTER Z Create a new end tag
- * token,
- */
- endTag = true;
- /*
- * set its tag name to the input character,
- */
- clearStrBufBeforeUse();
- appendStrBuf(c);
- /*
- * then switch to the tag name state. (Don't
- * emit the token yet; further details will be
- * filled in before it is emitted.)
- */
- state = transition(state, Tokenizer.TAG_NAME, reconsume, pos);
- continue stateloop;
- } else {
- /* Anything else Parse error. */
- errGarbageAfterLtSlash();
- /*
- * Switch to the bogus comment state.
- */
- clearStrBufBeforeUse();
- appendStrBuf(c);
- state = transition(state, Tokenizer.BOGUS_COMMENT, reconsume, pos);
- continue stateloop;
- }
- }
- // XXX reorder point
- case RCDATA:
- rcdataloop: for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- }
- switch (c) {
- case '&':
- /*
- * U+0026 AMPERSAND (&) Switch to the character
- * reference in RCDATA state.
- */
- flushChars(buf, pos);
- assert charRefBufLen == 0: "charRefBufLen not reset after previous use!";
- appendCharRefBuf(c);
- setAdditionalAndRememberAmpersandLocation('\u0000');
- returnState = state;
- state = transition(state, Tokenizer.CONSUME_CHARACTER_REFERENCE, reconsume, pos);
- continue stateloop;
- case '<':
- /*
- * U+003C LESS-THAN SIGN (<) Switch to the
- * RCDATA less-than sign state.
- */
- flushChars(buf, pos);
-
- returnState = state;
- state = transition(state, Tokenizer.RAWTEXT_RCDATA_LESS_THAN_SIGN, reconsume, pos);
- continue stateloop;
- case '\u0000':
- emitReplacementCharacter(buf, pos);
- continue;
- case '\r':
- emitCarriageReturn(buf, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- default:
- /*
- * Emit the current input character as a
- * character token. Stay in the RCDATA state.
- */
- continue;
- }
- }
- // XXX reorder point
- case RAWTEXT:
- rawtextloop: for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- }
- switch (c) {
- case '<':
- /*
- * U+003C LESS-THAN SIGN (<) Switch to the
- * RAWTEXT less-than sign state.
- */
- flushChars(buf, pos);
-
- returnState = state;
- state = transition(state, Tokenizer.RAWTEXT_RCDATA_LESS_THAN_SIGN, reconsume, pos);
- break rawtextloop;
- // FALL THRU continue stateloop;
- case '\u0000':
- emitReplacementCharacter(buf, pos);
- continue;
- case '\r':
- emitCarriageReturn(buf, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- default:
- /*
- * Emit the current input character as a
- * character token. Stay in the RAWTEXT state.
- */
- continue;
- }
- }
- // XXX fallthru don't reorder
- case RAWTEXT_RCDATA_LESS_THAN_SIGN:
- rawtextrcdatalessthansignloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- switch (c) {
- case '/':
- /*
- * U+002F SOLIDUS (/) Set the temporary buffer
- * to the empty string. Switch to the script
- * data end tag open state.
- */
- index = 0;
- clearStrBufBeforeUse();
- state = transition(state, Tokenizer.NON_DATA_END_TAG_NAME, reconsume, pos);
- break rawtextrcdatalessthansignloop;
- // FALL THRU continue stateloop;
- default:
- /*
- * Otherwise, emit a U+003C LESS-THAN SIGN
- * character token
- */
- tokenHandler.characters(Tokenizer.LT_GT, 0, 1);
- /*
- * and reconsume the current input character in
- * the data state.
- */
- cstart = pos;
- reconsume = true;
- state = transition(state, returnState, reconsume, pos);
- continue stateloop;
- }
- }
- // XXX fall thru. don't reorder.
- case NON_DATA_END_TAG_NAME:
- for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * ASSERT! when entering this state, set index to 0 and
- * call clearStrBufBeforeUse() assert (contentModelElement !=
- * null); Let's implement the above without lookahead.
- * strBuf is the 'temporary buffer'.
- */
- if (index < endTagExpectationAsArray.length) {
- char e = endTagExpectationAsArray[index];
- char folded = c;
- if (c >= 'A' && c <= 'Z') {
- folded += 0x20;
- }
- if (folded != e) {
- // [NOCPP[
- errHtml4LtSlashInRcdata(folded);
- // ]NOCPP]
- tokenHandler.characters(Tokenizer.LT_SOLIDUS,
- 0, 2);
- emitStrBuf();
- cstart = pos;
- reconsume = true;
- state = transition(state, returnState, reconsume, pos);
- continue stateloop;
- }
- appendStrBuf(c);
- index++;
- continue;
- } else {
- endTag = true;
- // XXX replace contentModelElement with different
- // type
- tagName = endTagExpectation;
- switch (c) {
- case '\r':
- silentCarriageReturn();
- clearStrBufAfterUse(); // strBuf not used
- state = transition(state, Tokenizer.BEFORE_ATTRIBUTE_NAME, reconsume, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- // fall thru
- case ' ':
- case '\t':
- case '\u000C':
- /*
- * U+0009 CHARACTER TABULATION U+000A LINE
- * FEED (LF) U+000C FORM FEED (FF) U+0020
- * SPACE If the current end tag token is an
- * appropriate end tag token, then switch to
- * the before attribute name state.
- */
- clearStrBufAfterUse(); // strBuf not used
- state = transition(state, Tokenizer.BEFORE_ATTRIBUTE_NAME, reconsume, pos);
- continue stateloop;
- case '/':
- /*
- * U+002F SOLIDUS (/) If the current end tag
- * token is an appropriate end tag token,
- * then switch to the self-closing start tag
- * state.
- */
- clearStrBufAfterUse(); // strBuf not used
- state = transition(state, Tokenizer.SELF_CLOSING_START_TAG, reconsume, pos);
- continue stateloop;
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) If the
- * current end tag token is an appropriate
- * end tag token, then emit the current tag
- * token and switch to the data state.
- */
- clearStrBufAfterUse(); // strBuf not used
- state = transition(state, emitCurrentTagToken(false, pos), reconsume, pos);
- if (shouldSuspend) {
- break stateloop;
- }
- continue stateloop;
- default:
- /*
- * Emit a U+003C LESS-THAN SIGN character
- * token, a U+002F SOLIDUS character token,
- * a character token for each of the
- * characters in the temporary buffer (in
- * the order they were added to the buffer),
- * and reconsume the current input character
- * in the RAWTEXT state.
- */
- // [NOCPP[
- errWarnLtSlashInRcdata();
- // ]NOCPP]
- tokenHandler.characters(
- Tokenizer.LT_SOLIDUS, 0, 2);
- emitStrBuf();
- cstart = pos; // don't drop the
- // character
- reconsume = true;
- state = transition(state, returnState, reconsume, pos);
- continue stateloop;
- }
- }
- }
- // XXX reorder point
- // BEGIN HOTSPOT WORKAROUND
- case BOGUS_COMMENT:
- boguscommentloop: for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- }
- /*
- * Consume every character up to and including the first
- * U+003E GREATER-THAN SIGN character (>) or the end of
- * the file (EOF), whichever comes first. Emit a comment
- * token whose data is the concatenation of all the
- * characters starting from and including the character
- * that caused the state machine to switch into the
- * bogus comment state, up to and including the
- * character immediately before the last consumed
- * character (i.e. up to the character just before the
- * U+003E or EOF character). (If the comment was started
- * by the end of the file (EOF), the token is empty.)
- *
- * Switch to the data state.
- *
- * If the end of the file was reached, reconsume the EOF
- * character.
- */
- switch (c) {
- case '>':
- emitComment(0, pos);
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- case '-':
- appendStrBuf(c);
- state = transition(state, Tokenizer.BOGUS_COMMENT_HYPHEN, reconsume, pos);
- break boguscommentloop;
- case '\r':
- appendStrBufCarriageReturn();
- break stateloop;
- case '\n':
- appendStrBufLineFeed();
- continue;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- default:
- appendStrBuf(c);
- continue;
- }
- }
- // FALLTHRU DON'T REORDER
- case BOGUS_COMMENT_HYPHEN:
- boguscommenthyphenloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- switch (c) {
- case '>':
- // [NOCPP[
- maybeAppendSpaceToBogusComment();
- // ]NOCPP]
- emitComment(0, pos);
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- case '-':
- appendSecondHyphenToBogusComment();
- continue boguscommenthyphenloop;
- case '\r':
- appendStrBufCarriageReturn();
- state = transition(state, Tokenizer.BOGUS_COMMENT, reconsume, pos);
- break stateloop;
- case '\n':
- appendStrBufLineFeed();
- state = transition(state, Tokenizer.BOGUS_COMMENT, reconsume, pos);
- continue stateloop;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- default:
- appendStrBuf(c);
- state = transition(state, Tokenizer.BOGUS_COMMENT, reconsume, pos);
- continue stateloop;
- }
- }
- // XXX reorder point
- case SCRIPT_DATA:
- scriptdataloop: for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- }
- switch (c) {
- case '<':
- /*
- * U+003C LESS-THAN SIGN (<) Switch to the
- * script data less-than sign state.
- */
- flushChars(buf, pos);
- returnState = state;
- state = transition(state, Tokenizer.SCRIPT_DATA_LESS_THAN_SIGN, reconsume, pos);
- break scriptdataloop; // FALL THRU continue
- // stateloop;
- case '\u0000':
- emitReplacementCharacter(buf, pos);
- continue;
- case '\r':
- emitCarriageReturn(buf, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- default:
- /*
- * Anything else Emit the current input
- * character as a character token. Stay in the
- * script data state.
- */
- continue;
- }
- }
- // WARNING FALLTHRU CASE TRANSITION: DON'T REORDER
- case SCRIPT_DATA_LESS_THAN_SIGN:
- scriptdatalessthansignloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- switch (c) {
- case '/':
- /*
- * U+002F SOLIDUS (/) Set the temporary buffer
- * to the empty string. Switch to the script
- * data end tag open state.
- */
- index = 0;
- clearStrBufBeforeUse();
- state = transition(state, Tokenizer.NON_DATA_END_TAG_NAME, reconsume, pos);
- continue stateloop;
- case '!':
- tokenHandler.characters(Tokenizer.LT_GT, 0, 1);
- cstart = pos;
- state = transition(state, Tokenizer.SCRIPT_DATA_ESCAPE_START, reconsume, pos);
- break scriptdatalessthansignloop; // FALL THRU
- // continue
- // stateloop;
- default:
- /*
- * Otherwise, emit a U+003C LESS-THAN SIGN
- * character token
- */
- tokenHandler.characters(Tokenizer.LT_GT, 0, 1);
- /*
- * and reconsume the current input character in
- * the data state.
- */
- cstart = pos;
- reconsume = true;
- state = transition(state, Tokenizer.SCRIPT_DATA, reconsume, pos);
- continue stateloop;
- }
- }
- // WARNING FALLTHRU CASE TRANSITION: DON'T REORDER
- case SCRIPT_DATA_ESCAPE_START:
- scriptdataescapestartloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '-':
- /*
- * U+002D HYPHEN-MINUS (-) Emit a U+002D
- * HYPHEN-MINUS character token. Switch to the
- * script data escape start dash state.
- */
- state = transition(state, Tokenizer.SCRIPT_DATA_ESCAPE_START_DASH, reconsume, pos);
- break scriptdataescapestartloop; // FALL THRU
- // continue
- // stateloop;
- default:
- /*
- * Anything else Reconsume the current input
- * character in the script data state.
- */
- reconsume = true;
- state = transition(state, Tokenizer.SCRIPT_DATA, reconsume, pos);
- continue stateloop;
- }
- }
- // WARNING FALLTHRU CASE TRANSITION: DON'T REORDER
- case SCRIPT_DATA_ESCAPE_START_DASH:
- scriptdataescapestartdashloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '-':
- /*
- * U+002D HYPHEN-MINUS (-) Emit a U+002D
- * HYPHEN-MINUS character token. Switch to the
- * script data escaped dash dash state.
- */
- state = transition(state, Tokenizer.SCRIPT_DATA_ESCAPED_DASH_DASH, reconsume, pos);
- break scriptdataescapestartdashloop;
- // continue stateloop;
- default:
- /*
- * Anything else Reconsume the current input
- * character in the script data state.
- */
- reconsume = true;
- state = transition(state, Tokenizer.SCRIPT_DATA, reconsume, pos);
- continue stateloop;
- }
- }
- // WARNING FALLTHRU CASE TRANSITION: DON'T REORDER
- case SCRIPT_DATA_ESCAPED_DASH_DASH:
- scriptdataescapeddashdashloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '-':
- /*
- * U+002D HYPHEN-MINUS (-) Emit a U+002D
- * HYPHEN-MINUS character token. Stay in the
- * script data escaped dash dash state.
- */
- continue;
- case '<':
- /*
- * U+003C LESS-THAN SIGN (<) Switch to the
- * script data escaped less-than sign state.
- */
- flushChars(buf, pos);
- state = transition(state, Tokenizer.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN, reconsume, pos);
- continue stateloop;
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Emit a U+003E
- * GREATER-THAN SIGN character token. Switch to
- * the script data state.
- */
- state = transition(state, Tokenizer.SCRIPT_DATA, reconsume, pos);
- continue stateloop;
- case '\u0000':
- emitReplacementCharacter(buf, pos);
- state = transition(state, Tokenizer.SCRIPT_DATA_ESCAPED, reconsume, pos);
- break scriptdataescapeddashdashloop;
- case '\r':
- emitCarriageReturn(buf, pos);
- state = transition(state, Tokenizer.SCRIPT_DATA_ESCAPED, reconsume, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- default:
- /*
- * Anything else Emit the current input
- * character as a character token. Switch to the
- * script data escaped state.
- */
- state = transition(state, Tokenizer.SCRIPT_DATA_ESCAPED, reconsume, pos);
- break scriptdataescapeddashdashloop;
- // continue stateloop;
- }
- }
- // WARNING FALLTHRU CASE TRANSITION: DON'T REORDER
- case SCRIPT_DATA_ESCAPED:
- scriptdataescapedloop: for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- }
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '-':
- /*
- * U+002D HYPHEN-MINUS (-) Emit a U+002D
- * HYPHEN-MINUS character token. Switch to the
- * script data escaped dash state.
- */
- state = transition(state, Tokenizer.SCRIPT_DATA_ESCAPED_DASH, reconsume, pos);
- break scriptdataescapedloop; // FALL THRU
- // continue
- // stateloop;
- case '<':
- /*
- * U+003C LESS-THAN SIGN (<) Switch to the
- * script data escaped less-than sign state.
- */
- flushChars(buf, pos);
- state = transition(state, Tokenizer.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN, reconsume, pos);
- continue stateloop;
- case '\u0000':
- emitReplacementCharacter(buf, pos);
- continue;
- case '\r':
- emitCarriageReturn(buf, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- default:
- /*
- * Anything else Emit the current input
- * character as a character token. Stay in the
- * script data escaped state.
- */
- continue;
- }
- }
- // WARNING FALLTHRU CASE TRANSITION: DON'T REORDER
- case SCRIPT_DATA_ESCAPED_DASH:
- scriptdataescapeddashloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '-':
- /*
- * U+002D HYPHEN-MINUS (-) Emit a U+002D
- * HYPHEN-MINUS character token. Switch to the
- * script data escaped dash dash state.
- */
- state = transition(state, Tokenizer.SCRIPT_DATA_ESCAPED_DASH_DASH, reconsume, pos);
- continue stateloop;
- case '<':
- /*
- * U+003C LESS-THAN SIGN (<) Switch to the
- * script data escaped less-than sign state.
- */
- flushChars(buf, pos);
- state = transition(state, Tokenizer.SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN, reconsume, pos);
- break scriptdataescapeddashloop;
- // continue stateloop;
- case '\u0000':
- emitReplacementCharacter(buf, pos);
- state = transition(state, Tokenizer.SCRIPT_DATA_ESCAPED, reconsume, pos);
- continue stateloop;
- case '\r':
- emitCarriageReturn(buf, pos);
- state = transition(state, Tokenizer.SCRIPT_DATA_ESCAPED, reconsume, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- default:
- /*
- * Anything else Emit the current input
- * character as a character token. Switch to the
- * script data escaped state.
- */
- state = transition(state, Tokenizer.SCRIPT_DATA_ESCAPED, reconsume, pos);
- continue stateloop;
- }
- }
- // WARNING FALLTHRU CASE TRANSITION: DON'T REORDER
- case SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN:
- scriptdataescapedlessthanloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '/':
- /*
- * U+002F SOLIDUS (/) Set the temporary buffer
- * to the empty string. Switch to the script
- * data escaped end tag open state.
- */
- index = 0;
- clearStrBufBeforeUse();
- returnState = Tokenizer.SCRIPT_DATA_ESCAPED;
- state = transition(state, Tokenizer.NON_DATA_END_TAG_NAME, reconsume, pos);
- continue stateloop;
- case 'S':
- case 's':
- /*
- * U+0041 LATIN CAPITAL LETTER A through to
- * U+005A LATIN CAPITAL LETTER Z Emit a U+003C
- * LESS-THAN SIGN character token and the
- * current input character as a character token.
- */
- tokenHandler.characters(Tokenizer.LT_GT, 0, 1);
- cstart = pos;
- index = 1;
- /*
- * Set the temporary buffer to the empty string.
- * Append the lowercase version of the current
- * input character (add 0x0020 to the
- * character's code point) to the temporary
- * buffer. Switch to the script data double
- * escape start state.
- */
- state = transition(state, Tokenizer.SCRIPT_DATA_DOUBLE_ESCAPE_START, reconsume, pos);
- break scriptdataescapedlessthanloop;
- // continue stateloop;
- default:
- /*
- * Anything else Emit a U+003C LESS-THAN SIGN
- * character token and reconsume the current
- * input character in the script data escaped
- * state.
- */
- tokenHandler.characters(Tokenizer.LT_GT, 0, 1);
- cstart = pos;
- reconsume = true;
- state = transition(state, Tokenizer.SCRIPT_DATA_ESCAPED, reconsume, pos);
- continue stateloop;
- }
- }
- // WARNING FALLTHRU CASE TRANSITION: DON'T REORDER
- case SCRIPT_DATA_DOUBLE_ESCAPE_START:
- scriptdatadoubleescapestartloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- assert index > 0;
- if (index < 6) { // SCRIPT_ARR.length
- char folded = c;
- if (c >= 'A' && c <= 'Z') {
- folded += 0x20;
- }
- if (folded != Tokenizer.SCRIPT_ARR[index]) {
- reconsume = true;
- state = transition(state, Tokenizer.SCRIPT_DATA_ESCAPED, reconsume, pos);
- continue stateloop;
- }
- index++;
- continue;
- }
- switch (c) {
- case '\r':
- emitCarriageReturn(buf, pos);
- state = transition(state, Tokenizer.SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- case ' ':
- case '\t':
- case '\u000C':
- case '/':
- case '>':
- /*
- * U+0009 CHARACTER TABULATION U+000A LINE FEED
- * (LF) U+000C FORM FEED (FF) U+0020 SPACE
- * U+002F SOLIDUS (/) U+003E GREATER-THAN SIGN
- * (>) Emit the current input character as a
- * character token. If the temporary buffer is
- * the string "script", then switch to the
- * script data double escaped state.
- */
- state = transition(state, Tokenizer.SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
- break scriptdatadoubleescapestartloop;
- // continue stateloop;
- default:
- /*
- * Anything else Reconsume the current input
- * character in the script data escaped state.
- */
- reconsume = true;
- state = transition(state, Tokenizer.SCRIPT_DATA_ESCAPED, reconsume, pos);
- continue stateloop;
- }
- }
- // WARNING FALLTHRU CASE TRANSITION: DON'T REORDER
- case SCRIPT_DATA_DOUBLE_ESCAPED:
- scriptdatadoubleescapedloop: for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- }
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '-':
- /*
- * U+002D HYPHEN-MINUS (-) Emit a U+002D
- * HYPHEN-MINUS character token. Switch to the
- * script data double escaped dash state.
- */
- state = transition(state, Tokenizer.SCRIPT_DATA_DOUBLE_ESCAPED_DASH, reconsume, pos);
- break scriptdatadoubleescapedloop; // FALL THRU
- // continue
- // stateloop;
- case '<':
- /*
- * U+003C LESS-THAN SIGN (<) Emit a U+003C
- * LESS-THAN SIGN character token. Switch to the
- * script data double escaped less-than sign
- * state.
- */
- state = transition(state, Tokenizer.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN, reconsume, pos);
- continue stateloop;
- case '\u0000':
- emitReplacementCharacter(buf, pos);
- continue;
- case '\r':
- emitCarriageReturn(buf, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- default:
- /*
- * Anything else Emit the current input
- * character as a character token. Stay in the
- * script data double escaped state.
- */
- continue;
- }
- }
- // WARNING FALLTHRU CASE TRANSITION: DON'T REORDER
- case SCRIPT_DATA_DOUBLE_ESCAPED_DASH:
- scriptdatadoubleescapeddashloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '-':
- /*
- * U+002D HYPHEN-MINUS (-) Emit a U+002D
- * HYPHEN-MINUS character token. Switch to the
- * script data double escaped dash dash state.
- */
- state = transition(state, Tokenizer.SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH, reconsume, pos);
- break scriptdatadoubleescapeddashloop;
- // continue stateloop;
- case '<':
- /*
- * U+003C LESS-THAN SIGN (<) Emit a U+003C
- * LESS-THAN SIGN character token. Switch to the
- * script data double escaped less-than sign
- * state.
- */
- state = transition(state, Tokenizer.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN, reconsume, pos);
- continue stateloop;
- case '\u0000':
- emitReplacementCharacter(buf, pos);
- state = transition(state, Tokenizer.SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
- continue stateloop;
- case '\r':
- emitCarriageReturn(buf, pos);
- state = transition(state, Tokenizer.SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- default:
- /*
- * Anything else Emit the current input
- * character as a character token. Switch to the
- * script data double escaped state.
- */
- state = transition(state, Tokenizer.SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
- continue stateloop;
- }
- }
- // WARNING FALLTHRU CASE TRANSITION: DON'T REORDER
- case SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH:
- scriptdatadoubleescapeddashdashloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '-':
- /*
- * U+002D HYPHEN-MINUS (-) Emit a U+002D
- * HYPHEN-MINUS character token. Stay in the
- * script data double escaped dash dash state.
- */
- continue;
- case '<':
- /*
- * U+003C LESS-THAN SIGN (<) Emit a U+003C
- * LESS-THAN SIGN character token. Switch to the
- * script data double escaped less-than sign
- * state.
- */
- state = transition(state, Tokenizer.SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN, reconsume, pos);
- break scriptdatadoubleescapeddashdashloop;
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Emit a U+003E
- * GREATER-THAN SIGN character token. Switch to
- * the script data state.
- */
- state = transition(state, Tokenizer.SCRIPT_DATA, reconsume, pos);
- continue stateloop;
- case '\u0000':
- emitReplacementCharacter(buf, pos);
- state = transition(state, Tokenizer.SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
- continue stateloop;
- case '\r':
- emitCarriageReturn(buf, pos);
- state = transition(state, Tokenizer.SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- default:
- /*
- * Anything else Emit the current input
- * character as a character token. Switch to the
- * script data double escaped state.
- */
- state = transition(state, Tokenizer.SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
- continue stateloop;
- }
- }
- // WARNING FALLTHRU CASE TRANSITION: DON'T REORDER
- case SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN:
- scriptdatadoubleescapedlessthanloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '/':
- /*
- * U+002F SOLIDUS (/) Emit a U+002F SOLIDUS
- * character token. Set the temporary buffer to
- * the empty string. Switch to the script data
- * double escape end state.
- */
- index = 0;
- state = transition(state, Tokenizer.SCRIPT_DATA_DOUBLE_ESCAPE_END, reconsume, pos);
- break scriptdatadoubleescapedlessthanloop;
- default:
- /*
- * Anything else Reconsume the current input
- * character in the script data double escaped
- * state.
- */
- reconsume = true;
- state = transition(state, Tokenizer.SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
- continue stateloop;
- }
- }
- // WARNING FALLTHRU CASE TRANSITION: DON'T REORDER
- case SCRIPT_DATA_DOUBLE_ESCAPE_END:
- scriptdatadoubleescapeendloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- if (index < 6) { // SCRIPT_ARR.length
- char folded = c;
- if (c >= 'A' && c <= 'Z') {
- folded += 0x20;
- }
- if (folded != Tokenizer.SCRIPT_ARR[index]) {
- reconsume = true;
- state = transition(state, Tokenizer.SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
- continue stateloop;
- }
- index++;
- continue;
- }
- switch (c) {
- case '\r':
- emitCarriageReturn(buf, pos);
- state = transition(state, Tokenizer.SCRIPT_DATA_ESCAPED, reconsume, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- case ' ':
- case '\t':
- case '\u000C':
- case '/':
- case '>':
- /*
- * U+0009 CHARACTER TABULATION U+000A LINE FEED
- * (LF) U+000C FORM FEED (FF) U+0020 SPACE
- * U+002F SOLIDUS (/) U+003E GREATER-THAN SIGN
- * (>) Emit the current input character as a
- * character token. If the temporary buffer is
- * the string "script", then switch to the
- * script data escaped state.
- */
- state = transition(state, Tokenizer.SCRIPT_DATA_ESCAPED, reconsume, pos);
- continue stateloop;
- default:
- /*
- * Reconsume the current input character in the
- * script data double escaped state.
- */
- reconsume = true;
- state = transition(state, Tokenizer.SCRIPT_DATA_DOUBLE_ESCAPED, reconsume, pos);
- continue stateloop;
- }
- }
- // XXX reorder point
- case MARKUP_DECLARATION_OCTYPE:
- markupdeclarationdoctypeloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- if (index < 6) { // OCTYPE.length
- char folded = c;
- if (c >= 'A' && c <= 'Z') {
- folded += 0x20;
- }
- if (folded == Tokenizer.OCTYPE[index]) {
- appendStrBuf(c);
- } else {
- errBogusComment();
- reconsume = true;
- state = transition(state, Tokenizer.BOGUS_COMMENT, reconsume, pos);
- continue stateloop;
- }
- index++;
- continue;
- } else {
- reconsume = true;
- state = transition(state, Tokenizer.DOCTYPE, reconsume, pos);
- break markupdeclarationdoctypeloop;
- // continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case DOCTYPE:
- doctypeloop: for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- }
- initDoctypeFields();
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '\r':
- silentCarriageReturn();
- state = transition(state, Tokenizer.BEFORE_DOCTYPE_NAME, reconsume, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- // fall thru
- case ' ':
- case '\t':
- case '\u000C':
- /*
- * U+0009 CHARACTER TABULATION U+000A LINE FEED
- * (LF) U+000C FORM FEED (FF) U+0020 SPACE
- * Switch to the before DOCTYPE name state.
- */
- state = transition(state, Tokenizer.BEFORE_DOCTYPE_NAME, reconsume, pos);
- break doctypeloop;
- // continue stateloop;
- default:
- /*
- * Anything else Parse error.
- */
- errMissingSpaceBeforeDoctypeName();
- /*
- * Reconsume the current character in the before
- * DOCTYPE name state.
- */
- reconsume = true;
- state = transition(state, Tokenizer.BEFORE_DOCTYPE_NAME, reconsume, pos);
- break doctypeloop;
- // continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case BEFORE_DOCTYPE_NAME:
- beforedoctypenameloop: for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- }
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '\r':
- silentCarriageReturn();
- break stateloop;
- case '\n':
- silentLineFeed();
- // fall thru
- case ' ':
- case '\t':
- case '\u000C':
- /*
- * U+0009 CHARACTER TABULATION U+000A LINE FEED
- * (LF) U+000C FORM FEED (FF) U+0020 SPACE Stay
- * in the before DOCTYPE name state.
- */
- continue;
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Parse error.
- */
- errNamelessDoctype();
- /*
- * Create a new DOCTYPE token. Set its
- * force-quirks flag to on.
- */
- forceQuirks = true;
- /*
- * Emit the token.
- */
- emitDoctypeToken(pos);
- /*
- * Switch to the data state.
- */
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- default:
- if (c >= 'A' && c <= 'Z') {
- /*
- * U+0041 LATIN CAPITAL LETTER A through to
- * U+005A LATIN CAPITAL LETTER Z Create a
- * new DOCTYPE token. Set the token's name
- * to the lowercase version of the input
- * character (add 0x0020 to the character's
- * code point).
- */
- c += 0x20;
- }
- /* Anything else Create a new DOCTYPE token. */
- /*
- * Set the token's name name to the current
- * input character.
- */
- clearStrBufBeforeUse();
- appendStrBuf(c);
- /*
- * Switch to the DOCTYPE name state.
- */
- state = transition(state, Tokenizer.DOCTYPE_NAME, reconsume, pos);
- break beforedoctypenameloop;
- // continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case DOCTYPE_NAME:
- doctypenameloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '\r':
- silentCarriageReturn();
- strBufToDoctypeName();
- state = transition(state, Tokenizer.AFTER_DOCTYPE_NAME, reconsume, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- // fall thru
- case ' ':
- case '\t':
- case '\u000C':
- /*
- * U+0009 CHARACTER TABULATION U+000A LINE FEED
- * (LF) U+000C FORM FEED (FF) U+0020 SPACE
- * Switch to the after DOCTYPE name state.
- */
- strBufToDoctypeName();
- state = transition(state, Tokenizer.AFTER_DOCTYPE_NAME, reconsume, pos);
- break doctypenameloop;
- // continue stateloop;
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Emit the current
- * DOCTYPE token.
- */
- strBufToDoctypeName();
- emitDoctypeToken(pos);
- /*
- * Switch to the data state.
- */
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- default:
- /*
- * U+0041 LATIN CAPITAL LETTER A through to
- * U+005A LATIN CAPITAL LETTER Z Append the
- * lowercase version of the input character (add
- * 0x0020 to the character's code point) to the
- * current DOCTYPE token's name.
- */
- if (c >= 'A' && c <= 'Z') {
- c += 0x0020;
- }
- /*
- * Anything else Append the current input
- * character to the current DOCTYPE token's
- * name.
- */
- appendStrBuf(c);
- /*
- * Stay in the DOCTYPE name state.
- */
- continue;
- }
- }
- // FALLTHRU DON'T REORDER
- case AFTER_DOCTYPE_NAME:
- afterdoctypenameloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '\r':
- silentCarriageReturn();
- break stateloop;
- case '\n':
- silentLineFeed();
- // fall thru
- case ' ':
- case '\t':
- case '\u000C':
- /*
- * U+0009 CHARACTER TABULATION U+000A LINE FEED
- * (LF) U+000C FORM FEED (FF) U+0020 SPACE Stay
- * in the after DOCTYPE name state.
- */
- continue;
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Emit the current
- * DOCTYPE token.
- */
- emitDoctypeToken(pos);
- /*
- * Switch to the data state.
- */
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- case 'p':
- case 'P':
- index = 0;
- state = transition(state, Tokenizer.DOCTYPE_UBLIC, reconsume, pos);
- break afterdoctypenameloop;
- // continue stateloop;
- case 's':
- case 'S':
- index = 0;
- state = transition(state, Tokenizer.DOCTYPE_YSTEM, reconsume, pos);
- continue stateloop;
- default:
- /*
- * Otherwise, this is the parse error.
- */
- bogusDoctype();
-
- /*
- * Set the DOCTYPE token's force-quirks flag to
- * on.
- */
- // done by bogusDoctype();
- /*
- * Switch to the bogus DOCTYPE state.
- */
- state = transition(state, Tokenizer.BOGUS_DOCTYPE, reconsume, pos);
- continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case DOCTYPE_UBLIC:
- doctypeublicloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * If the six characters starting from the current input
- * character are an ASCII case-insensitive match for the
- * word "PUBLIC", then consume those characters and
- * switch to the before DOCTYPE public identifier state.
- */
- if (index < 5) { // UBLIC.length
- char folded = c;
- if (c >= 'A' && c <= 'Z') {
- folded += 0x20;
- }
- if (folded != Tokenizer.UBLIC[index]) {
- bogusDoctype();
- // forceQuirks = true;
- reconsume = true;
- state = transition(state, Tokenizer.BOGUS_DOCTYPE, reconsume, pos);
- continue stateloop;
- }
- index++;
- continue;
- } else {
- reconsume = true;
- state = transition(state, Tokenizer.AFTER_DOCTYPE_PUBLIC_KEYWORD, reconsume, pos);
- break doctypeublicloop;
- // continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case AFTER_DOCTYPE_PUBLIC_KEYWORD:
- afterdoctypepublickeywordloop: for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- }
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '\r':
- silentCarriageReturn();
- state = transition(state, Tokenizer.BEFORE_DOCTYPE_PUBLIC_IDENTIFIER, reconsume, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- // fall thru
- case ' ':
- case '\t':
- case '\u000C':
- /*
- * U+0009 CHARACTER TABULATION U+000A LINE FEED
- * (LF) U+000C FORM FEED (FF) U+0020 SPACE
- * Switch to the before DOCTYPE public
- * identifier state.
- */
- state = transition(state, Tokenizer.BEFORE_DOCTYPE_PUBLIC_IDENTIFIER, reconsume, pos);
- break afterdoctypepublickeywordloop;
- // FALL THROUGH continue stateloop
- case '"':
- /*
- * U+0022 QUOTATION MARK (") Parse Error.
- */
- errNoSpaceBetweenDoctypePublicKeywordAndQuote();
- /*
- * Set the DOCTYPE token's public identifier to
- * the empty string (not missing),
- */
- clearStrBufBeforeUse();
- /*
- * then switch to the DOCTYPE public identifier
- * (double-quoted) state.
- */
- state = transition(state, Tokenizer.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED, reconsume, pos);
- continue stateloop;
- case '\'':
- /*
- * U+0027 APOSTROPHE (') Parse Error.
- */
- errNoSpaceBetweenDoctypePublicKeywordAndQuote();
- /*
- * Set the DOCTYPE token's public identifier to
- * the empty string (not missing),
- */
- clearStrBufBeforeUse();
- /*
- * then switch to the DOCTYPE public identifier
- * (single-quoted) state.
- */
- state = transition(state, Tokenizer.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED, reconsume, pos);
- continue stateloop;
- case '>':
- /* U+003E GREATER-THAN SIGN (>) Parse error. */
- errExpectedPublicId();
- /*
- * Set the DOCTYPE token's force-quirks flag to
- * on.
- */
- forceQuirks = true;
- /*
- * Emit that DOCTYPE token.
- */
- emitDoctypeToken(pos);
- /*
- * Switch to the data state.
- */
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- default:
- bogusDoctype();
- /*
- * Set the DOCTYPE token's force-quirks flag to
- * on.
- */
- // done by bogusDoctype();
- /*
- * Switch to the bogus DOCTYPE state.
- */
- state = transition(state, Tokenizer.BOGUS_DOCTYPE, reconsume, pos);
- continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case BEFORE_DOCTYPE_PUBLIC_IDENTIFIER:
- beforedoctypepublicidentifierloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '\r':
- silentCarriageReturn();
- break stateloop;
- case '\n':
- silentLineFeed();
- // fall thru
- case ' ':
- case '\t':
- case '\u000C':
- /*
- * U+0009 CHARACTER TABULATION U+000A LINE FEED
- * (LF) U+000C FORM FEED (FF) U+0020 SPACE Stay
- * in the before DOCTYPE public identifier
- * state.
- */
- continue;
- case '"':
- /*
- * U+0022 QUOTATION MARK (") Set the DOCTYPE
- * token's public identifier to the empty string
- * (not missing),
- */
- clearStrBufBeforeUse();
- /*
- * then switch to the DOCTYPE public identifier
- * (double-quoted) state.
- */
- state = transition(state, Tokenizer.DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED, reconsume, pos);
- break beforedoctypepublicidentifierloop;
- // continue stateloop;
- case '\'':
- /*
- * U+0027 APOSTROPHE (') Set the DOCTYPE token's
- * public identifier to the empty string (not
- * missing),
- */
- clearStrBufBeforeUse();
- /*
- * then switch to the DOCTYPE public identifier
- * (single-quoted) state.
- */
- state = transition(state, Tokenizer.DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED, reconsume, pos);
- continue stateloop;
- case '>':
- /* U+003E GREATER-THAN SIGN (>) Parse error. */
- errExpectedPublicId();
- /*
- * Set the DOCTYPE token's force-quirks flag to
- * on.
- */
- forceQuirks = true;
- /*
- * Emit that DOCTYPE token.
- */
- emitDoctypeToken(pos);
- /*
- * Switch to the data state.
- */
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- default:
- bogusDoctype();
- /*
- * Set the DOCTYPE token's force-quirks flag to
- * on.
- */
- // done by bogusDoctype();
- /*
- * Switch to the bogus DOCTYPE state.
- */
- state = transition(state, Tokenizer.BOGUS_DOCTYPE, reconsume, pos);
- continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED:
- doctypepublicidentifierdoublequotedloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '"':
- /*
- * U+0022 QUOTATION MARK (") Switch to the after
- * DOCTYPE public identifier state.
- */
- publicIdentifier = strBufToString();
- state = transition(state, Tokenizer.AFTER_DOCTYPE_PUBLIC_IDENTIFIER, reconsume, pos);
- break doctypepublicidentifierdoublequotedloop;
- // continue stateloop;
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Parse error.
- */
- errGtInPublicId();
- /*
- * Set the DOCTYPE token's force-quirks flag to
- * on.
- */
- forceQuirks = true;
- /*
- * Emit that DOCTYPE token.
- */
- publicIdentifier = strBufToString();
- emitDoctypeToken(pos);
- /*
- * Switch to the data state.
- */
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- case '\r':
- appendStrBufCarriageReturn();
- break stateloop;
- case '\n':
- appendStrBufLineFeed();
- continue;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- default:
- /*
- * Anything else Append the current input
- * character to the current DOCTYPE token's
- * public identifier.
- */
- appendStrBuf(c);
- /*
- * Stay in the DOCTYPE public identifier
- * (double-quoted) state.
- */
- continue;
- }
- }
- // FALLTHRU DON'T REORDER
- case AFTER_DOCTYPE_PUBLIC_IDENTIFIER:
- afterdoctypepublicidentifierloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '\r':
- silentCarriageReturn();
- state = transition(state, Tokenizer.BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS, reconsume, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- // fall thru
- case ' ':
- case '\t':
- case '\u000C':
- /*
- * U+0009 CHARACTER TABULATION U+000A LINE FEED
- * (LF) U+000C FORM FEED (FF) U+0020 SPACE
- * Switch to the between DOCTYPE public and
- * system identifiers state.
- */
- state = transition(state, Tokenizer.BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS, reconsume, pos);
- break afterdoctypepublicidentifierloop;
- // continue stateloop;
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Emit the current
- * DOCTYPE token.
- */
- emitDoctypeToken(pos);
- /*
- * Switch to the data state.
- */
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- case '"':
- /*
- * U+0022 QUOTATION MARK (") Parse error.
- */
- errNoSpaceBetweenPublicAndSystemIds();
- /*
- * Set the DOCTYPE token's system identifier to
- * the empty string (not missing),
- */
- clearStrBufBeforeUse();
- /*
- * then switch to the DOCTYPE system identifier
- * (double-quoted) state.
- */
- state = transition(state, Tokenizer.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED, reconsume, pos);
- continue stateloop;
- case '\'':
- /*
- * U+0027 APOSTROPHE (') Parse error.
- */
- errNoSpaceBetweenPublicAndSystemIds();
- /*
- * Set the DOCTYPE token's system identifier to
- * the empty string (not missing),
- */
- clearStrBufBeforeUse();
- /*
- * then switch to the DOCTYPE system identifier
- * (single-quoted) state.
- */
- state = transition(state, Tokenizer.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED, reconsume, pos);
- continue stateloop;
- default:
- bogusDoctype();
- /*
- * Set the DOCTYPE token's force-quirks flag to
- * on.
- */
- // done by bogusDoctype();
- /*
- * Switch to the bogus DOCTYPE state.
- */
- state = transition(state, Tokenizer.BOGUS_DOCTYPE, reconsume, pos);
- continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS:
- betweendoctypepublicandsystemidentifiersloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '\r':
- silentCarriageReturn();
- break stateloop;
- case '\n':
- silentLineFeed();
- // fall thru
- case ' ':
- case '\t':
- case '\u000C':
- /*
- * U+0009 CHARACTER TABULATION U+000A LINE FEED
- * (LF) U+000C FORM FEED (FF) U+0020 SPACE Stay
- * in the between DOCTYPE public and system
- * identifiers state.
- */
- continue;
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Emit the current
- * DOCTYPE token.
- */
- emitDoctypeToken(pos);
- /*
- * Switch to the data state.
- */
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- case '"':
- /*
- * U+0022 QUOTATION MARK (") Set the DOCTYPE
- * token's system identifier to the empty string
- * (not missing),
- */
- clearStrBufBeforeUse();
- /*
- * then switch to the DOCTYPE system identifier
- * (double-quoted) state.
- */
- state = transition(state, Tokenizer.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED, reconsume, pos);
- break betweendoctypepublicandsystemidentifiersloop;
- // continue stateloop;
- case '\'':
- /*
- * U+0027 APOSTROPHE (') Set the DOCTYPE token's
- * system identifier to the empty string (not
- * missing),
- */
- clearStrBufBeforeUse();
- /*
- * then switch to the DOCTYPE system identifier
- * (single-quoted) state.
- */
- state = transition(state, Tokenizer.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED, reconsume, pos);
- continue stateloop;
- default:
- bogusDoctype();
- /*
- * Set the DOCTYPE token's force-quirks flag to
- * on.
- */
- // done by bogusDoctype();
- /*
- * Switch to the bogus DOCTYPE state.
- */
- state = transition(state, Tokenizer.BOGUS_DOCTYPE, reconsume, pos);
- continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED:
- doctypesystemidentifierdoublequotedloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '"':
- /*
- * U+0022 QUOTATION MARK (") Switch to the after
- * DOCTYPE system identifier state.
- */
- systemIdentifier = strBufToString();
- state = transition(state, Tokenizer.AFTER_DOCTYPE_SYSTEM_IDENTIFIER, reconsume, pos);
- continue stateloop;
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Parse error.
- */
- errGtInSystemId();
- /*
- * Set the DOCTYPE token's force-quirks flag to
- * on.
- */
- forceQuirks = true;
- /*
- * Emit that DOCTYPE token.
- */
- systemIdentifier = strBufToString();
- emitDoctypeToken(pos);
- /*
- * Switch to the data state.
- */
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- case '\r':
- appendStrBufCarriageReturn();
- break stateloop;
- case '\n':
- appendStrBufLineFeed();
- continue;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- default:
- /*
- * Anything else Append the current input
- * character to the current DOCTYPE token's
- * system identifier.
- */
- appendStrBuf(c);
- /*
- * Stay in the DOCTYPE system identifier
- * (double-quoted) state.
- */
- continue;
- }
- }
- // FALLTHRU DON'T REORDER
- case AFTER_DOCTYPE_SYSTEM_IDENTIFIER:
- afterdoctypesystemidentifierloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '\r':
- silentCarriageReturn();
- break stateloop;
- case '\n':
- silentLineFeed();
- // fall thru
- case ' ':
- case '\t':
- case '\u000C':
- /*
- * U+0009 CHARACTER TABULATION U+000A LINE FEED
- * (LF) U+000C FORM FEED (FF) U+0020 SPACE Stay
- * in the after DOCTYPE system identifier state.
- */
- continue;
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Emit the current
- * DOCTYPE token.
- */
- emitDoctypeToken(pos);
- /*
- * Switch to the data state.
- */
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- default:
- /*
- * Switch to the bogus DOCTYPE state. (This does
- * not set the DOCTYPE token's force-quirks flag
- * to on.)
- */
- bogusDoctypeWithoutQuirks();
- state = transition(state, Tokenizer.BOGUS_DOCTYPE, reconsume, pos);
- break afterdoctypesystemidentifierloop;
- // continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case BOGUS_DOCTYPE:
- for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- }
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '>':
- /*
- * U+003E GREATER-THAN SIGN (>) Emit that
- * DOCTYPE token.
- */
- emitDoctypeToken(pos);
- /*
- * Switch to the data state.
- */
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- case '\r':
- silentCarriageReturn();
- break stateloop;
- case '\n':
- silentLineFeed();
- // fall thru
- default:
- /*
- * Anything else Stay in the bogus DOCTYPE
- * state.
- */
- continue;
- }
- }
- // XXX reorder point
- case DOCTYPE_YSTEM:
- doctypeystemloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Otherwise, if the six characters starting from the
- * current input character are an ASCII case-insensitive
- * match for the word "SYSTEM", then consume those
- * characters and switch to the before DOCTYPE system
- * identifier state.
- */
- if (index < 5) { // YSTEM.length
- char folded = c;
- if (c >= 'A' && c <= 'Z') {
- folded += 0x20;
- }
- if (folded != Tokenizer.YSTEM[index]) {
- bogusDoctype();
- reconsume = true;
- state = transition(state, Tokenizer.BOGUS_DOCTYPE, reconsume, pos);
- continue stateloop;
- }
- index++;
- continue stateloop;
- } else {
- reconsume = true;
- state = transition(state, Tokenizer.AFTER_DOCTYPE_SYSTEM_KEYWORD, reconsume, pos);
- break doctypeystemloop;
- // continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case AFTER_DOCTYPE_SYSTEM_KEYWORD:
- afterdoctypesystemkeywordloop: for (;;) {
- if (reconsume) {
- reconsume = false;
- } else {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- }
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '\r':
- silentCarriageReturn();
- state = transition(state, Tokenizer.BEFORE_DOCTYPE_SYSTEM_IDENTIFIER, reconsume, pos);
- break stateloop;
- case '\n':
- silentLineFeed();
- // fall thru
- case ' ':
- case '\t':
- case '\u000C':
- /*
- * U+0009 CHARACTER TABULATION U+000A LINE FEED
- * (LF) U+000C FORM FEED (FF) U+0020 SPACE
- * Switch to the before DOCTYPE public
- * identifier state.
- */
- state = transition(state, Tokenizer.BEFORE_DOCTYPE_SYSTEM_IDENTIFIER, reconsume, pos);
- break afterdoctypesystemkeywordloop;
- // FALL THROUGH continue stateloop
- case '"':
- /*
- * U+0022 QUOTATION MARK (") Parse Error.
- */
- errNoSpaceBetweenDoctypeSystemKeywordAndQuote();
- /*
- * Set the DOCTYPE token's system identifier to
- * the empty string (not missing),
- */
- clearStrBufBeforeUse();
- /*
- * then switch to the DOCTYPE public identifier
- * (double-quoted) state.
- */
- state = transition(state, Tokenizer.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED, reconsume, pos);
- continue stateloop;
- case '\'':
- /*
- * U+0027 APOSTROPHE (') Parse Error.
- */
- errNoSpaceBetweenDoctypeSystemKeywordAndQuote();
- /*
- * Set the DOCTYPE token's public identifier to
- * the empty string (not missing),
- */
- clearStrBufBeforeUse();
- /*
- * then switch to the DOCTYPE public identifier
- * (single-quoted) state.
- */
- state = transition(state, Tokenizer.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED, reconsume, pos);
- continue stateloop;
- case '>':
- /* U+003E GREATER-THAN SIGN (>) Parse error. */
- errExpectedPublicId();
- /*
- * Set the DOCTYPE token's force-quirks flag to
- * on.
- */
- forceQuirks = true;
- /*
- * Emit that DOCTYPE token.
- */
- emitDoctypeToken(pos);
- /*
- * Switch to the data state.
- */
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- default:
- bogusDoctype();
- /*
- * Set the DOCTYPE token's force-quirks flag to
- * on.
- */
- // done by bogusDoctype();
- /*
- * Switch to the bogus DOCTYPE state.
- */
- state = transition(state, Tokenizer.BOGUS_DOCTYPE, reconsume, pos);
- continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case BEFORE_DOCTYPE_SYSTEM_IDENTIFIER:
- beforedoctypesystemidentifierloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '\r':
- silentCarriageReturn();
- break stateloop;
- case '\n':
- silentLineFeed();
- // fall thru
- case ' ':
- case '\t':
- case '\u000C':
- /*
- * U+0009 CHARACTER TABULATION U+000A LINE FEED
- * (LF) U+000C FORM FEED (FF) U+0020 SPACE Stay
- * in the before DOCTYPE system identifier
- * state.
- */
- continue;
- case '"':
- /*
- * U+0022 QUOTATION MARK (") Set the DOCTYPE
- * token's system identifier to the empty string
- * (not missing),
- */
- clearStrBufBeforeUse();
- /*
- * then switch to the DOCTYPE system identifier
- * (double-quoted) state.
- */
- state = transition(state, Tokenizer.DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED, reconsume, pos);
- continue stateloop;
- case '\'':
- /*
- * U+0027 APOSTROPHE (') Set the DOCTYPE token's
- * system identifier to the empty string (not
- * missing),
- */
- clearStrBufBeforeUse();
- /*
- * then switch to the DOCTYPE system identifier
- * (single-quoted) state.
- */
- state = transition(state, Tokenizer.DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED, reconsume, pos);
- break beforedoctypesystemidentifierloop;
- // continue stateloop;
- case '>':
- /* U+003E GREATER-THAN SIGN (>) Parse error. */
- errExpectedSystemId();
- /*
- * Set the DOCTYPE token's force-quirks flag to
- * on.
- */
- forceQuirks = true;
- /*
- * Emit that DOCTYPE token.
- */
- emitDoctypeToken(pos);
- /*
- * Switch to the data state.
- */
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- default:
- bogusDoctype();
- /*
- * Set the DOCTYPE token's force-quirks flag to
- * on.
- */
- // done by bogusDoctype();
- /*
- * Switch to the bogus DOCTYPE state.
- */
- state = transition(state, Tokenizer.BOGUS_DOCTYPE, reconsume, pos);
- continue stateloop;
- }
- }
- // FALLTHRU DON'T REORDER
- case DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED:
- for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '\'':
- /*
- * U+0027 APOSTROPHE (') Switch to the after
- * DOCTYPE system identifier state.
- */
- systemIdentifier = strBufToString();
- state = transition(state, Tokenizer.AFTER_DOCTYPE_SYSTEM_IDENTIFIER, reconsume, pos);
- continue stateloop;
- case '>':
- errGtInSystemId();
- /*
- * Set the DOCTYPE token's force-quirks flag to
- * on.
- */
- forceQuirks = true;
- /*
- * Emit that DOCTYPE token.
- */
- systemIdentifier = strBufToString();
- emitDoctypeToken(pos);
- /*
- * Switch to the data state.
- */
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- case '\r':
- appendStrBufCarriageReturn();
- break stateloop;
- case '\n':
- appendStrBufLineFeed();
- continue;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- default:
- /*
- * Anything else Append the current input
- * character to the current DOCTYPE token's
- * system identifier.
- */
- appendStrBuf(c);
- /*
- * Stay in the DOCTYPE system identifier
- * (double-quoted) state.
- */
- continue;
- }
- }
- // XXX reorder point
- case DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED:
- for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- /*
- * Consume the next input character:
- */
- switch (c) {
- case '\'':
- /*
- * U+0027 APOSTROPHE (') Switch to the after
- * DOCTYPE public identifier state.
- */
- publicIdentifier = strBufToString();
- state = transition(state, Tokenizer.AFTER_DOCTYPE_PUBLIC_IDENTIFIER, reconsume, pos);
- continue stateloop;
- case '>':
- errGtInPublicId();
- /*
- * Set the DOCTYPE token's force-quirks flag to
- * on.
- */
- forceQuirks = true;
- /*
- * Emit that DOCTYPE token.
- */
- publicIdentifier = strBufToString();
- emitDoctypeToken(pos);
- /*
- * Switch to the data state.
- */
- state = transition(state, Tokenizer.DATA, reconsume, pos);
- continue stateloop;
- case '\r':
- appendStrBufCarriageReturn();
- break stateloop;
- case '\n':
- appendStrBufLineFeed();
- continue;
- case '\u0000':
- c = '\uFFFD';
- // fall thru
- default:
- /*
- * Anything else Append the current input
- * character to the current DOCTYPE token's
- * public identifier.
- */
- appendStrBuf(c);
- /*
- * Stay in the DOCTYPE public identifier
- * (single-quoted) state.
- */
- continue;
- }
- }
- // XXX reorder point
- case PROCESSING_INSTRUCTION:
- processinginstructionloop: for (;;) {
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- switch (c) {
- case '?':
- state = transition(
- state,
- Tokenizer.PROCESSING_INSTRUCTION_QUESTION_MARK,
- reconsume, pos);
- break processinginstructionloop;
- // continue stateloop;
- default:
- continue;
- }
- }
- case PROCESSING_INSTRUCTION_QUESTION_MARK:
- if (++pos == endPos) {
- break stateloop;
- }
- c = checkChar(buf, pos);
- switch (c) {
- case '>':
- state = transition(state, Tokenizer.DATA,
- reconsume, pos);
- continue stateloop;
- default:
- state = transition(state,
- Tokenizer.PROCESSING_INSTRUCTION,
- reconsume, pos);
- continue stateloop;
- }
- // END HOTSPOT WORKAROUND
- }
- }
- flushChars(buf, pos);
- /*
- * if (prevCR && pos != endPos) { // why is this needed? pos--; col--; }
- */
- // Save locals
- stateSave = state;
- returnStateSave = returnState;
- return pos;
- }
-
- // HOTSPOT WORKAROUND INSERTION POINT
-
- // [NOCPP[
-
- protected int transition(int from, int to, boolean reconsume, int pos) throws SAXException {
- return to;
- }
-
- // ]NOCPP]
-
- private void initDoctypeFields() {
- // Discard the characters "DOCTYPE" accumulated as a potential bogus
- // comment into strBuf.
- clearStrBufAfterUse();
- doctypeName = "";
- if (systemIdentifier != null) {
- Portability.releaseString(systemIdentifier);
- systemIdentifier = null;
- }
- if (publicIdentifier != null) {
- Portability.releaseString(publicIdentifier);
- publicIdentifier = null;
- }
- forceQuirks = false;
- }
-
- @Inline private void adjustDoubleHyphenAndAppendToStrBufCarriageReturn()
- throws SAXException {
- silentCarriageReturn();
- adjustDoubleHyphenAndAppendToStrBufAndErr('\n');
- }
-
- @Inline private void adjustDoubleHyphenAndAppendToStrBufLineFeed()
- throws SAXException {
- silentLineFeed();
- adjustDoubleHyphenAndAppendToStrBufAndErr('\n');
- }
-
- @Inline private void appendStrBufLineFeed() {
- silentLineFeed();
- appendStrBuf('\n');
- }
-
- @Inline private void appendStrBufCarriageReturn() {
- silentCarriageReturn();
- appendStrBuf('\n');
- }
-
- @Inline protected void silentCarriageReturn() {
- ++line;
- lastCR = true;
- }
-
- @Inline protected void silentLineFeed() {
- ++line;
- }
-
- private void emitCarriageReturn(@NoLength char[] buf, int pos)
- throws SAXException {
- silentCarriageReturn();
- flushChars(buf, pos);
- tokenHandler.characters(Tokenizer.LF, 0, 1);
- cstart = Integer.MAX_VALUE;
- }
-
- private void emitReplacementCharacter(@NoLength char[] buf, int pos)
- throws SAXException {
- flushChars(buf, pos);
- tokenHandler.zeroOriginatingReplacementCharacter();
- cstart = pos + 1;
- }
-
- private void emitPlaintextReplacementCharacter(@NoLength char[] buf, int pos)
- throws SAXException {
- flushChars(buf, pos);
- tokenHandler.characters(REPLACEMENT_CHARACTER, 0, 1);
- cstart = pos + 1;
- }
-
- private void setAdditionalAndRememberAmpersandLocation(char add) {
- additional = add;
- // [NOCPP[
- ampersandLocation = new LocatorImpl(this);
- // ]NOCPP]
- }
-
- private void bogusDoctype() throws SAXException {
- errBogusDoctype();
- forceQuirks = true;
- }
-
- private void bogusDoctypeWithoutQuirks() throws SAXException {
- errBogusDoctype();
- forceQuirks = false;
- }
-
- private void handleNcrValue(int returnState) throws SAXException {
- /*
- * If one or more characters match the range, then take them all and
- * interpret the string of characters as a number (either hexadecimal or
- * decimal as appropriate).
- */
- if (value <= 0xFFFF) {
- if (value >= 0x80 && value <= 0x9f) {
- /*
- * If that number is one of the numbers in the first column of
- * the following table, then this is a parse error.
- */
- errNcrInC1Range();
- /*
- * Find the row with that number in the first column, and return
- * a character token for the Unicode character given in the
- * second column of that row.
- */
- @NoLength char[] val = NamedCharacters.WINDOWS_1252[value - 0x80];
- emitOrAppendOne(val, returnState);
- // [NOCPP[
- } else if (value == 0xC
- && contentSpacePolicy != XmlViolationPolicy.ALLOW) {
- if (contentSpacePolicy == XmlViolationPolicy.ALTER_INFOSET) {
- emitOrAppendOne(Tokenizer.SPACE, returnState);
- } else if (contentSpacePolicy == XmlViolationPolicy.FATAL) {
- fatal("A character reference expanded to a form feed which is not legal XML 1.0 white space.");
- }
- // ]NOCPP]
- } else if (value == 0x0) {
- errNcrZero();
- emitOrAppendOne(Tokenizer.REPLACEMENT_CHARACTER, returnState);
- } else if ((value & 0xF800) == 0xD800) {
- errNcrSurrogate();
- emitOrAppendOne(Tokenizer.REPLACEMENT_CHARACTER, returnState);
- } else {
- /*
- * Otherwise, return a character token for the Unicode character
- * whose code point is that number.
- */
- char ch = (char) value;
- // [NOCPP[
- if (value == 0x0D) {
- errNcrCr();
- } else if ((value <= 0x0008) || (value == 0x000B)
- || (value >= 0x000E && value <= 0x001F)) {
- ch = errNcrControlChar(ch);
- } else if (value >= 0xFDD0 && value <= 0xFDEF) {
- errNcrUnassigned();
- } else if ((value & 0xFFFE) == 0xFFFE) {
- ch = errNcrNonCharacter(ch);
- } else if (value >= 0x007F && value <= 0x009F) {
- errNcrControlChar();
- } else {
- maybeWarnPrivateUse(ch);
- }
- // ]NOCPP]
- bmpChar[0] = ch;
- emitOrAppendOne(bmpChar, returnState);
- }
- } else if (value <= 0x10FFFF) {
- // [NOCPP[
- maybeWarnPrivateUseAstral();
- if ((value & 0xFFFE) == 0xFFFE) {
- errAstralNonCharacter(value);
- }
- // ]NOCPP]
- astralChar[0] = (char) (Tokenizer.LEAD_OFFSET + (value >> 10));
- astralChar[1] = (char) (0xDC00 + (value & 0x3FF));
- emitOrAppendTwo(astralChar, returnState);
- } else {
- errNcrOutOfRange();
- emitOrAppendOne(Tokenizer.REPLACEMENT_CHARACTER, returnState);
- }
- }
-
- public void eof() throws SAXException {
- int state = stateSave;
- int returnState = returnStateSave;
-
- eofloop: for (;;) {
- switch (state) {
- case SCRIPT_DATA_LESS_THAN_SIGN:
- case SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN:
- /*
- * Otherwise, emit a U+003C LESS-THAN SIGN character token
- */
- tokenHandler.characters(Tokenizer.LT_GT, 0, 1);
- /*
- * and reconsume the current input character in the data
- * state.
- */
- break eofloop;
- case TAG_OPEN:
- /*
- * The behavior of this state depends on the content model
- * flag.
- */
- /*
- * Anything else Parse error.
- */
- errEofAfterLt();
- /*
- * Emit a U+003C LESS-THAN SIGN character token
- */
- tokenHandler.characters(Tokenizer.LT_GT, 0, 1);
- /*
- * and reconsume the current input character in the data
- * state.
- */
- break eofloop;
- case RAWTEXT_RCDATA_LESS_THAN_SIGN:
- /*
- * Emit a U+003C LESS-THAN SIGN character token
- */
- tokenHandler.characters(Tokenizer.LT_GT, 0, 1);
- /*
- * and reconsume the current input character in the RCDATA
- * state.
- */
- break eofloop;
- case NON_DATA_END_TAG_NAME:
- /*
- * Emit a U+003C LESS-THAN SIGN character token, a U+002F
- * SOLIDUS character token,
- */
- tokenHandler.characters(Tokenizer.LT_SOLIDUS, 0, 2);
- /*
- * a character token for each of the characters in the
- * temporary buffer (in the order they were added to the
- * buffer),
- */
- emitStrBuf();
- /*
- * and reconsume the current input character in the RCDATA
- * state.
- */
- break eofloop;
- case CLOSE_TAG_OPEN:
- /* EOF Parse error. */
- errEofAfterLt();
- /*
- * Emit a U+003C LESS-THAN SIGN character token and a U+002F
- * SOLIDUS character token.
- */
- tokenHandler.characters(Tokenizer.LT_SOLIDUS, 0, 2);
- /*
- * Reconsume the EOF character in the data state.
- */
- break eofloop;
- case TAG_NAME:
- /*
- * EOF Parse error.
- */
- errEofInTagName();
- /*
- * Reconsume the EOF character in the data state.
- */
- break eofloop;
- case BEFORE_ATTRIBUTE_NAME:
- case AFTER_ATTRIBUTE_VALUE_QUOTED:
- case SELF_CLOSING_START_TAG:
- /* EOF Parse error. */
- errEofWithoutGt();
- /*
- * Reconsume the EOF character in the data state.
- */
- break eofloop;
- case ATTRIBUTE_NAME:
- /*
- * EOF Parse error.
- */
- errEofInAttributeName();
- /*
- * Reconsume the EOF character in the data state.
- */
- break eofloop;
- case AFTER_ATTRIBUTE_NAME:
- case BEFORE_ATTRIBUTE_VALUE:
- /* EOF Parse error. */
- errEofWithoutGt();
- /*
- * Reconsume the EOF character in the data state.
- */
- break eofloop;
- case ATTRIBUTE_VALUE_DOUBLE_QUOTED:
- case ATTRIBUTE_VALUE_SINGLE_QUOTED:
- case ATTRIBUTE_VALUE_UNQUOTED:
- /* EOF Parse error. */
- errEofInAttributeValue();
- /*
- * Reconsume the EOF character in the data state.
- */
- break eofloop;
- case BOGUS_COMMENT:
- emitComment(0, 0);
- break eofloop;
- case BOGUS_COMMENT_HYPHEN:
- // [NOCPP[
- maybeAppendSpaceToBogusComment();
- // ]NOCPP]
- emitComment(0, 0);
- break eofloop;
- case MARKUP_DECLARATION_OPEN:
- errBogusComment();
- emitComment(0, 0);
- break eofloop;
- case MARKUP_DECLARATION_HYPHEN:
- errBogusComment();
- emitComment(0, 0);
- break eofloop;
- case MARKUP_DECLARATION_OCTYPE:
- if (index < 6) {
- errBogusComment();
- emitComment(0, 0);
- } else {
- /* EOF Parse error. */
- errEofInDoctype();
- /*
- * Create a new DOCTYPE token. Set its force-quirks flag
- * to on.
- */
- doctypeName = "";
- if (systemIdentifier != null) {
- Portability.releaseString(systemIdentifier);
- systemIdentifier = null;
- }
- if (publicIdentifier != null) {
- Portability.releaseString(publicIdentifier);
- publicIdentifier = null;
- }
- forceQuirks = true;
- /*
- * Emit the token.
- */
- emitDoctypeToken(0);
- /*
- * Reconsume the EOF character in the data state.
- */
- break eofloop;
- }
- break eofloop;
- case COMMENT_START:
- case COMMENT:
- /*
- * EOF Parse error.
- */
- errEofInComment();
- /* Emit the comment token. */
- emitComment(0, 0);
- /*
- * Reconsume the EOF character in the data state.
- */
- break eofloop;
- case COMMENT_END:
- errEofInComment();
- /* Emit the comment token. */
- emitComment(2, 0);
- /*
- * Reconsume the EOF character in the data state.
- */
- break eofloop;
- case COMMENT_END_DASH:
- case COMMENT_START_DASH:
- errEofInComment();
- /* Emit the comment token. */
- emitComment(1, 0);
- /*
- * Reconsume the EOF character in the data state.
- */
- break eofloop;
- case COMMENT_END_BANG:
- errEofInComment();
- /* Emit the comment token. */
- emitComment(3, 0);
- /*
- * Reconsume the EOF character in the data state.
- */
- break eofloop;
- case DOCTYPE:
- case BEFORE_DOCTYPE_NAME:
- errEofInDoctype();
- /*
- * Create a new DOCTYPE token. Set its force-quirks flag to
- * on.
- */
- forceQuirks = true;
- /*
- * Emit the token.
- */
- emitDoctypeToken(0);
- /*
- * Reconsume the EOF character in the data state.
- */
- break eofloop;
- case DOCTYPE_NAME:
- errEofInDoctype();
- strBufToDoctypeName();
- /*
- * Set the DOCTYPE token's force-quirks flag to on.
- */
- forceQuirks = true;
- /*
- * Emit that DOCTYPE token.
- */
- emitDoctypeToken(0);
- /*
- * Reconsume the EOF character in the data state.
- */
- break eofloop;
- case DOCTYPE_UBLIC:
- case DOCTYPE_YSTEM:
- case AFTER_DOCTYPE_NAME:
- case AFTER_DOCTYPE_PUBLIC_KEYWORD:
- case AFTER_DOCTYPE_SYSTEM_KEYWORD:
- case BEFORE_DOCTYPE_PUBLIC_IDENTIFIER:
- errEofInDoctype();
- /*
- * Set the DOCTYPE token's force-quirks flag to on.
- */
- forceQuirks = true;
- /*
- * Emit that DOCTYPE token.
- */
- emitDoctypeToken(0);
- /*
- * Reconsume the EOF character in the data state.
- */
- break eofloop;
- case DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED:
- case DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED:
- /* EOF Parse error. */
- errEofInPublicId();
- /*
- * Set the DOCTYPE token's force-quirks flag to on.
- */
- forceQuirks = true;
- /*
- * Emit that DOCTYPE token.
- */
- publicIdentifier = strBufToString();
- emitDoctypeToken(0);
- /*
- * Reconsume the EOF character in the data state.
- */
- break eofloop;
- case AFTER_DOCTYPE_PUBLIC_IDENTIFIER:
- case BEFORE_DOCTYPE_SYSTEM_IDENTIFIER:
- case BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS:
- errEofInDoctype();
- /*
- * Set the DOCTYPE token's force-quirks flag to on.
- */
- forceQuirks = true;
- /*
- * Emit that DOCTYPE token.
- */
- emitDoctypeToken(0);
- /*
- * Reconsume the EOF character in the data state.
- */
- break eofloop;
- case DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED:
- case DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED:
- /* EOF Parse error. */
- errEofInSystemId();
- /*
- * Set the DOCTYPE token's force-quirks flag to on.
- */
- forceQuirks = true;
- /*
- * Emit that DOCTYPE token.
- */
- systemIdentifier = strBufToString();
- emitDoctypeToken(0);
- /*
- * Reconsume the EOF character in the data state.
- */
- break eofloop;
- case AFTER_DOCTYPE_SYSTEM_IDENTIFIER:
- errEofInDoctype();
- /*
- * Set the DOCTYPE token's force-quirks flag to on.
- */
- forceQuirks = true;
- /*
- * Emit that DOCTYPE token.
- */
- emitDoctypeToken(0);
- /*
- * Reconsume the EOF character in the data state.
- */
- break eofloop;
- case BOGUS_DOCTYPE:
- /*
- * Emit that DOCTYPE token.
- */
- emitDoctypeToken(0);
- /*
- * Reconsume the EOF character in the data state.
- */
- break eofloop;
- case CONSUME_CHARACTER_REFERENCE:
- /*
- * Unlike the definition is the spec, this state does not
- * return a value and never requires the caller to
- * backtrack. This state takes care of emitting characters
- * or appending to the current attribute value. It also
- * takes care of that in the case when consuming the entity
- * fails.
- */
- /*
- * This section defines how to consume an entity. This
- * definition is used when parsing entities in text and in
- * attributes.
- *
- * The behavior depends on the identity of the next
- * character (the one immediately after the U+0026 AMPERSAND
- * character):
- */
-
- emitOrAppendCharRefBuf(returnState);
- state = returnState;
- continue;
- case CHARACTER_REFERENCE_HILO_LOOKUP:
- errNoNamedCharacterMatch();
- emitOrAppendCharRefBuf(returnState);
- state = returnState;
- continue;
- case CHARACTER_REFERENCE_TAIL:
- outer: for (;;) {
- char c = '\u0000';
- entCol++;
- /*
- * Consume the maximum number of characters possible,
- * with the consumed characters matching one of the
- * identifiers in the first column of the named
- * character references table (in a case-sensitive
- * manner).
- */
- hiloop: for (;;) {
- if (hi == -1) {
- break hiloop;
- }
- if (entCol == NamedCharacters.NAMES[hi].length()) {
- break hiloop;
- }
- if (entCol > NamedCharacters.NAMES[hi].length()) {
- break outer;
- } else if (c < NamedCharacters.NAMES[hi].charAt(entCol)) {
- hi--;
- } else {
- break hiloop;
- }
- }
-
- loloop: for (;;) {
- if (hi < lo) {
- break outer;
- }
- if (entCol == NamedCharacters.NAMES[lo].length()) {
- candidate = lo;
- charRefBufMark = charRefBufLen;
- lo++;
- } else if (entCol > NamedCharacters.NAMES[lo].length()) {
- break outer;
- } else if (c > NamedCharacters.NAMES[lo].charAt(entCol)) {
- lo++;
- } else {
- break loloop;
- }
- }
- if (hi < lo) {
- break outer;
- }
- continue;
- }
-
- if (candidate == -1) {
- /*
- * If no match can be made, then this is a parse error.
- */
- errNoNamedCharacterMatch();
- emitOrAppendCharRefBuf(returnState);
- state = returnState;
- continue eofloop;
- } else {
- @Const @CharacterName String candidateName = NamedCharacters.NAMES[candidate];
- if (candidateName.length() == 0
- || candidateName.charAt(candidateName.length() - 1) != ';') {
- /*
- * If the last character matched is not a U+003B
- * SEMICOLON (;), there is a parse error.
- */
- if ((returnState & DATA_AND_RCDATA_MASK) != 0) {
- /*
- * If the entity is being consumed as part of an
- * attribute, and the last character matched is
- * not a U+003B SEMICOLON (;),
- */
- char ch;
- if (charRefBufMark == charRefBufLen) {
- ch = '\u0000';
- } else {
- ch = charRefBuf[charRefBufMark];
- }
- if ((ch >= '0' && ch <= '9')
- || (ch >= 'A' && ch <= 'Z')
- || (ch >= 'a' && ch <= 'z')) {
- /*
- * and the next character is in the range
- * U+0030 DIGIT ZERO to U+0039 DIGIT NINE,
- * U+0041 LATIN CAPITAL LETTER A to U+005A
- * LATIN CAPITAL LETTER Z, or U+0061 LATIN
- * SMALL LETTER A to U+007A LATIN SMALL
- * LETTER Z, then, for historical reasons,
- * all the characters that were matched
- * after the U+0026 AMPERSAND (&) must be
- * unconsumed, and nothing is returned.
- */
- errNoNamedCharacterMatch();
- appendCharRefBufToStrBuf();
- state = returnState;
- continue eofloop;
- }
- }
- if ((returnState & DATA_AND_RCDATA_MASK) != 0) {
- errUnescapedAmpersandInterpretedAsCharacterReference();
- } else {
- errNotSemicolonTerminated();
- }
- }
-
- /*
- * Otherwise, return a character token for the character
- * corresponding to the entity name (as given by the
- * second column of the named character references
- * table).
- */
- @Const @NoLength char[] val = NamedCharacters.VALUES[candidate];
- if (
- // [NOCPP[
- val.length == 1
- // ]NOCPP]
- // CPPONLY: val[1] == 0
- ) {
- emitOrAppendOne(val, returnState);
- } else {
- emitOrAppendTwo(val, returnState);
- }
- // this is so complicated!
- if (charRefBufMark < charRefBufLen) {
- if ((returnState & DATA_AND_RCDATA_MASK) != 0) {
- appendStrBuf(charRefBuf, charRefBufMark,
- charRefBufLen - charRefBufMark);
- } else {
- tokenHandler.characters(charRefBuf, charRefBufMark,
- charRefBufLen - charRefBufMark);
- }
- }
- charRefBufLen = 0;
- state = returnState;
- continue eofloop;
- /*
- * If the markup contains I'm &notit; I tell you, the
- * entity is parsed as "not", as in, I'm ¬it; I tell
- * you. But if the markup was I'm &notin; I tell you,
- * the entity would be parsed as "notin;", resulting in
- * I'm ∉ I tell you.
- */
- }
- case CONSUME_NCR:
- case DECIMAL_NRC_LOOP:
- case HEX_NCR_LOOP:
- /*
- * If no characters match the range, then don't consume any
- * characters (and unconsume the U+0023 NUMBER SIGN
- * character and, if appropriate, the X character). This is
- * a parse error; nothing is returned.
- *
- * Otherwise, if the next character is a U+003B SEMICOLON,
- * consume that too. If it isn't, there is a parse error.
- */
- if (!seenDigits) {
- errNoDigitsInNCR();
- emitOrAppendCharRefBuf(returnState);
- state = returnState;
- continue;
- } else {
- errCharRefLacksSemicolon();
- }
- // WARNING previous state sets reconsume
- handleNcrValue(returnState);
- state = returnState;
- continue;
- case CDATA_RSQB:
- tokenHandler.characters(Tokenizer.RSQB_RSQB, 0, 1);
- break eofloop;
- case CDATA_RSQB_RSQB:
- tokenHandler.characters(Tokenizer.RSQB_RSQB, 0, 2);
- break eofloop;
- case DATA:
- default:
- break eofloop;
- }
- }
- // case DATA:
- /*
- * EOF Emit an end-of-file token.
- */
- tokenHandler.eof();
- return;
- }
-
- private void emitDoctypeToken(int pos) throws SAXException {
- cstart = pos + 1;
- tokenHandler.doctype(doctypeName, publicIdentifier, systemIdentifier,
- forceQuirks);
- // It is OK and sufficient to release these here, since
- // there's no way out of the doctype states than through paths
- // that call this method.
- doctypeName = null;
- Portability.releaseString(publicIdentifier);
- publicIdentifier = null;
- Portability.releaseString(systemIdentifier);
- systemIdentifier = null;
- }
-
- @Inline protected char checkChar(@NoLength char[] buf, int pos)
- throws SAXException {
- return buf[pos];
- }
-
- public boolean internalEncodingDeclaration(String internalCharset)
- throws SAXException {
- if (encodingDeclarationHandler != null) {
- return encodingDeclarationHandler.internalEncodingDeclaration(internalCharset);
- }
- return false;
- }
-
- /**
- * @param val
- * @throws SAXException
- */
- private void emitOrAppendTwo(@Const @NoLength char[] val, int returnState)
- throws SAXException {
- if ((returnState & DATA_AND_RCDATA_MASK) != 0) {
- appendStrBuf(val[0]);
- appendStrBuf(val[1]);
- } else {
- tokenHandler.characters(val, 0, 2);
- }
- }
-
- private void emitOrAppendOne(@Const @NoLength char[] val, int returnState)
- throws SAXException {
- if ((returnState & DATA_AND_RCDATA_MASK) != 0) {
- appendStrBuf(val[0]);
- } else {
- tokenHandler.characters(val, 0, 1);
- }
- }
-
- public void end() throws SAXException {
- strBuf = null;
- doctypeName = null;
- if (systemIdentifier != null) {
- Portability.releaseString(systemIdentifier);
- systemIdentifier = null;
- }
- if (publicIdentifier != null) {
- Portability.releaseString(publicIdentifier);
- publicIdentifier = null;
- }
- if (tagName != null) {
- tagName.release();
- tagName = null;
- }
- if (attributeName != null) {
- attributeName.release();
- attributeName = null;
- }
- tokenHandler.endTokenization();
- if (attributes != null) {
- // [NOCPP[
- attributes = null;
- // ]NOCPP]
- // CPPONLY: attributes.clear(mappingLangToXmlLang);
- }
- }
-
- public void requestSuspension() {
- shouldSuspend = true;
- }
-
- // [NOCPP[
-
- public void becomeConfident() {
- confident = true;
- }
-
- /**
- * Returns the nextCharOnNewLine.
- *
- * @return the nextCharOnNewLine
- */
- public boolean isNextCharOnNewLine() {
- return false;
- }
-
- public boolean isPrevCR() {
- return lastCR;
- }
-
- /**
- * Returns the line.
- *
- * @return the line
- */
- public int getLine() {
- return -1;
- }
-
- /**
- * Returns the col.
- *
- * @return the col
- */
- public int getCol() {
- return -1;
- }
-
- // ]NOCPP]
-
- public boolean isInDataState() {
- return (stateSave == DATA);
- }
-
- public void resetToDataState() {
- clearStrBufAfterUse();
- charRefBufLen = 0;
- stateSave = Tokenizer.DATA;
- // line = 1; XXX line numbers
- lastCR = false;
- index = 0;
- forceQuirks = false;
- additional = '\u0000';
- entCol = -1;
- firstCharKey = -1;
- lo = 0;
- hi = 0; // will always be overwritten before use anyway
- candidate = -1;
- charRefBufMark = 0;
- value = 0;
- seenDigits = false;
- endTag = false;
- shouldSuspend = false;
- initDoctypeFields();
- if (tagName != null) {
- tagName.release();
- tagName = null;
- }
- if (attributeName != null) {
- attributeName.release();
- attributeName = null;
- }
- if (newAttributesEachTime) {
- if (attributes != null) {
- Portability.delete(attributes);
- attributes = null;
- }
- }
- }
-
- public void loadState(Tokenizer other) throws SAXException {
- strBufLen = other.strBufLen;
- if (strBufLen > strBuf.length) {
- strBuf = new char[strBufLen];
- }
- System.arraycopy(other.strBuf, 0, strBuf, 0, strBufLen);
-
- charRefBufLen = other.charRefBufLen;
- System.arraycopy(other.charRefBuf, 0, charRefBuf, 0, charRefBufLen);
-
- stateSave = other.stateSave;
- returnStateSave = other.returnStateSave;
- endTagExpectation = other.endTagExpectation;
- endTagExpectationAsArray = other.endTagExpectationAsArray;
- // line = 1; XXX line numbers
- lastCR = other.lastCR;
- index = other.index;
- forceQuirks = other.forceQuirks;
- additional = other.additional;
- entCol = other.entCol;
- firstCharKey = other.firstCharKey;
- lo = other.lo;
- hi = other.hi;
- candidate = other.candidate;
- charRefBufMark = other.charRefBufMark;
- value = other.value;
- seenDigits = other.seenDigits;
- endTag = other.endTag;
- shouldSuspend = false;
-
- if (other.doctypeName == null) {
- doctypeName = null;
- } else {
- doctypeName = Portability.newLocalFromLocal(other.doctypeName,
- interner);
- }
-
- Portability.releaseString(systemIdentifier);
- if (other.systemIdentifier == null) {
- systemIdentifier = null;
- } else {
- systemIdentifier = Portability.newStringFromString(other.systemIdentifier);
- }
-
- Portability.releaseString(publicIdentifier);
- if (other.publicIdentifier == null) {
- publicIdentifier = null;
- } else {
- publicIdentifier = Portability.newStringFromString(other.publicIdentifier);
- }
-
- if (tagName != null) {
- tagName.release();
- }
- if (other.tagName == null) {
- tagName = null;
- } else {
- tagName = other.tagName.cloneElementName(interner);
- }
-
- if (attributeName != null) {
- attributeName.release();
- }
- if (other.attributeName == null) {
- attributeName = null;
- } else {
- attributeName = other.attributeName.cloneAttributeName(interner);
- }
-
- Portability.delete(attributes);
- if (other.attributes == null) {
- attributes = null;
- } else {
- attributes = other.attributes.cloneAttributes(interner);
- }
- }
-
- public void initializeWithoutStarting() throws SAXException {
- confident = false;
- strBuf = null;
- line = 1;
- // CPPONLY: attributeLine = 1;
- // [NOCPP[
- html4 = false;
- metaBoundaryPassed = false;
- wantsComments = tokenHandler.wantsComments();
- if (!newAttributesEachTime) {
- attributes = new HtmlAttributes(mappingLangToXmlLang);
- }
- // ]NOCPP]
- resetToDataState();
- }
-
- protected void errGarbageAfterLtSlash() throws SAXException {
- }
-
- protected void errLtSlashGt() throws SAXException {
- }
-
- protected void errWarnLtSlashInRcdata() throws SAXException {
- }
-
- protected void errHtml4LtSlashInRcdata(char folded) throws SAXException {
- }
-
- protected void errCharRefLacksSemicolon() throws SAXException {
- }
-
- protected void errNoDigitsInNCR() throws SAXException {
- }
-
- protected void errGtInSystemId() throws SAXException {
- }
-
- protected void errGtInPublicId() throws SAXException {
- }
-
- protected void errNamelessDoctype() throws SAXException {
- }
-
- protected void errConsecutiveHyphens() throws SAXException {
- }
-
- protected void errPrematureEndOfComment() throws SAXException {
- }
-
- protected void errBogusComment() throws SAXException {
- }
-
- protected void errUnquotedAttributeValOrNull(char c) throws SAXException {
- }
-
- protected void errSlashNotFollowedByGt() throws SAXException {
- }
-
- protected void errHtml4XmlVoidSyntax() throws SAXException {
- }
-
- protected void errNoSpaceBetweenAttributes() throws SAXException {
- }
-
- protected void errHtml4NonNameInUnquotedAttribute(char c)
- throws SAXException {
- }
-
- protected void errLtOrEqualsOrGraveInUnquotedAttributeOrNull(char c)
- throws SAXException {
- }
-
- protected void errAttributeValueMissing() throws SAXException {
- }
-
- protected void errBadCharBeforeAttributeNameOrNull(char c)
- throws SAXException {
- }
-
- protected void errEqualsSignBeforeAttributeName() throws SAXException {
- }
-
- protected void errBadCharAfterLt(char c) throws SAXException {
- }
-
- protected void errLtGt() throws SAXException {
- }
-
- protected void errProcessingInstruction() throws SAXException {
- }
-
- protected void errUnescapedAmpersandInterpretedAsCharacterReference()
- throws SAXException {
- }
-
- protected void errNotSemicolonTerminated() throws SAXException {
- }
-
- protected void errNoNamedCharacterMatch() throws SAXException {
- }
-
- protected void errQuoteBeforeAttributeName(char c) throws SAXException {
- }
-
- protected void errQuoteOrLtInAttributeNameOrNull(char c)
- throws SAXException {
- }
-
- protected void errExpectedPublicId() throws SAXException {
- }
-
- protected void errBogusDoctype() throws SAXException {
- }
-
- protected void maybeWarnPrivateUseAstral() throws SAXException {
- }
-
- protected void maybeWarnPrivateUse(char ch) throws SAXException {
- }
-
- protected void maybeErrAttributesOnEndTag(HtmlAttributes attrs)
- throws SAXException {
- }
-
- protected void maybeErrSlashInEndTag(boolean selfClosing)
- throws SAXException {
- }
-
- protected char errNcrNonCharacter(char ch) throws SAXException {
- return ch;
- }
-
- protected void errAstralNonCharacter(int ch) throws SAXException {
- }
-
- protected void errNcrSurrogate() throws SAXException {
- }
-
- protected char errNcrControlChar(char ch) throws SAXException {
- return ch;
- }
-
- protected void errNcrCr() throws SAXException {
- }
-
- protected void errNcrInC1Range() throws SAXException {
- }
-
- protected void errEofInPublicId() throws SAXException {
- }
-
- protected void errEofInComment() throws SAXException {
- }
-
- protected void errEofInDoctype() throws SAXException {
- }
-
- protected void errEofInAttributeValue() throws SAXException {
- }
-
- protected void errEofInAttributeName() throws SAXException {
- }
-
- protected void errEofWithoutGt() throws SAXException {
- }
-
- protected void errEofInTagName() throws SAXException {
- }
-
- protected void errEofInEndTag() throws SAXException {
- }
-
- protected void errEofAfterLt() throws SAXException {
- }
-
- protected void errNcrOutOfRange() throws SAXException {
- }
-
- protected void errNcrUnassigned() throws SAXException {
- }
-
- protected void errDuplicateAttribute() throws SAXException {
- }
-
- protected void errEofInSystemId() throws SAXException {
- }
-
- protected void errExpectedSystemId() throws SAXException {
- }
-
- protected void errMissingSpaceBeforeDoctypeName() throws SAXException {
- }
-
- protected void errHyphenHyphenBang() throws SAXException {
- }
-
- protected void errNcrControlChar() throws SAXException {
- }
-
- protected void errNcrZero() throws SAXException {
- }
-
- protected void errNoSpaceBetweenDoctypeSystemKeywordAndQuote()
- throws SAXException {
- }
-
- protected void errNoSpaceBetweenPublicAndSystemIds() throws SAXException {
- }
-
- protected void errNoSpaceBetweenDoctypePublicKeywordAndQuote()
- throws SAXException {
- }
-
- protected void noteAttributeWithoutValue() throws SAXException {
- }
-
- protected void noteUnquotedAttributeValue() throws SAXException {
- }
-
- /**
- * Sets the encodingDeclarationHandler.
- *
- * @param encodingDeclarationHandler
- * the encodingDeclarationHandler to set
- */
- public void setEncodingDeclarationHandler(
- EncodingDeclarationHandler encodingDeclarationHandler) {
- this.encodingDeclarationHandler = encodingDeclarationHandler;
- }
-
- void destructor() {
- // The translator will write refcount tracing stuff here
- Portability.delete(attributes);
- attributes = null;
- }
-
- // [NOCPP[
-
- /**
- * Sets an offset to be added to the position reported to
- * <code>TransitionHandler</code>.
- *
- * @param offset the offset
- */
- public void setTransitionBaseOffset(int offset) {
-
- }
-
- // ]NOCPP]
-
-}
diff --git a/parser/html/javasrc/TreeBuilder.java b/parser/html/javasrc/TreeBuilder.java
deleted file mode 100644
index 5e83d1847..000000000
--- a/parser/html/javasrc/TreeBuilder.java
+++ /dev/null
@@ -1,6558 +0,0 @@
-/*
- * Copyright (c) 2007 Henri Sivonen
- * Copyright (c) 2007-2015 Mozilla Foundation
- * Portions of comments Copyright 2004-2008 Apple Computer, Inc., Mozilla
- * Foundation, and Opera Software ASA.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * The comments following this one that use the same comment syntax as this
- * comment are quotes from the WHATWG HTML 5 spec as of 27 June 2007
- * amended as of June 28 2007.
- * That document came with this statement:
- * "© Copyright 2004-2007 Apple Computer, Inc., Mozilla Foundation, and
- * Opera Software ASA. You are granted a license to use, reproduce and
- * create derivative works of this document."
- */
-
-package nu.validator.htmlparser.impl;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-import nu.validator.htmlparser.annotation.Auto;
-import nu.validator.htmlparser.annotation.Const;
-import nu.validator.htmlparser.annotation.IdType;
-import nu.validator.htmlparser.annotation.Inline;
-import nu.validator.htmlparser.annotation.Literal;
-import nu.validator.htmlparser.annotation.Local;
-import nu.validator.htmlparser.annotation.NoLength;
-import nu.validator.htmlparser.annotation.NsUri;
-import nu.validator.htmlparser.common.DoctypeExpectation;
-import nu.validator.htmlparser.common.DocumentMode;
-import nu.validator.htmlparser.common.DocumentModeHandler;
-import nu.validator.htmlparser.common.Interner;
-import nu.validator.htmlparser.common.TokenHandler;
-import nu.validator.htmlparser.common.XmlViolationPolicy;
-
-public abstract class TreeBuilder<T> implements TokenHandler,
- TreeBuilderState<T> {
-
- /**
- * Array version of U+FFFD.
- */
- private static final @NoLength char[] REPLACEMENT_CHARACTER = { '\uFFFD' };
-
- // Start dispatch groups
-
- final static int OTHER = 0;
-
- final static int A = 1;
-
- final static int BASE = 2;
-
- final static int BODY = 3;
-
- final static int BR = 4;
-
- final static int BUTTON = 5;
-
- final static int CAPTION = 6;
-
- final static int COL = 7;
-
- final static int COLGROUP = 8;
-
- final static int FORM = 9;
-
- final static int FRAME = 10;
-
- final static int FRAMESET = 11;
-
- final static int IMAGE = 12;
-
- final static int INPUT = 13;
-
- final static int ISINDEX = 14;
-
- final static int LI = 15;
-
- final static int LINK_OR_BASEFONT_OR_BGSOUND = 16;
-
- final static int MATH = 17;
-
- final static int META = 18;
-
- final static int SVG = 19;
-
- final static int HEAD = 20;
-
- final static int HR = 22;
-
- final static int HTML = 23;
-
- final static int NOBR = 24;
-
- final static int NOFRAMES = 25;
-
- final static int NOSCRIPT = 26;
-
- final static int OPTGROUP = 27;
-
- final static int OPTION = 28;
-
- final static int P = 29;
-
- final static int PLAINTEXT = 30;
-
- final static int SCRIPT = 31;
-
- final static int SELECT = 32;
-
- final static int STYLE = 33;
-
- final static int TABLE = 34;
-
- final static int TEXTAREA = 35;
-
- final static int TITLE = 36;
-
- final static int TR = 37;
-
- final static int XMP = 38;
-
- final static int TBODY_OR_THEAD_OR_TFOOT = 39;
-
- final static int TD_OR_TH = 40;
-
- final static int DD_OR_DT = 41;
-
- final static int H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6 = 42;
-
- final static int MARQUEE_OR_APPLET = 43;
-
- final static int PRE_OR_LISTING = 44;
-
- final static int B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U = 45;
-
- final static int UL_OR_OL_OR_DL = 46;
-
- final static int IFRAME = 47;
-
- final static int EMBED = 48;
-
- final static int AREA_OR_WBR = 49;
-
- final static int DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU = 50;
-
- final static int ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY = 51;
-
- final static int RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR = 52;
-
- final static int RB_OR_RTC = 53;
-
- final static int PARAM_OR_SOURCE_OR_TRACK = 55;
-
- final static int MGLYPH_OR_MALIGNMARK = 56;
-
- final static int MI_MO_MN_MS_MTEXT = 57;
-
- final static int ANNOTATION_XML = 58;
-
- final static int FOREIGNOBJECT_OR_DESC = 59;
-
- final static int NOEMBED = 60;
-
- final static int FIELDSET = 61;
-
- final static int OUTPUT = 62;
-
- final static int OBJECT = 63;
-
- final static int FONT = 64;
-
- final static int KEYGEN = 65;
-
- final static int MENUITEM = 66;
-
- final static int TEMPLATE = 67;
-
- final static int IMG = 68;
-
- final static int RT_OR_RP = 69;
-
- // start insertion modes
-
- private static final int IN_ROW = 0;
-
- private static final int IN_TABLE_BODY = 1;
-
- private static final int IN_TABLE = 2;
-
- private static final int IN_CAPTION = 3;
-
- private static final int IN_CELL = 4;
-
- private static final int FRAMESET_OK = 5;
-
- private static final int IN_BODY = 6;
-
- private static final int IN_HEAD = 7;
-
- private static final int IN_HEAD_NOSCRIPT = 8;
-
- // no fall-through
-
- private static final int IN_COLUMN_GROUP = 9;
-
- // no fall-through
-
- private static final int IN_SELECT_IN_TABLE = 10;
-
- private static final int IN_SELECT = 11;
-
- // no fall-through
-
- private static final int AFTER_BODY = 12;
-
- // no fall-through
-
- private static final int IN_FRAMESET = 13;
-
- private static final int AFTER_FRAMESET = 14;
-
- // no fall-through
-
- private static final int INITIAL = 15;
-
- // could add fall-through
-
- private static final int BEFORE_HTML = 16;
-
- // could add fall-through
-
- private static final int BEFORE_HEAD = 17;
-
- // no fall-through
-
- private static final int AFTER_HEAD = 18;
-
- // no fall-through
-
- private static final int AFTER_AFTER_BODY = 19;
-
- // no fall-through
-
- private static final int AFTER_AFTER_FRAMESET = 20;
-
- // no fall-through
-
- private static final int TEXT = 21;
-
- private static final int IN_TEMPLATE = 22;
-
- // start charset states
-
- private static final int CHARSET_INITIAL = 0;
-
- private static final int CHARSET_C = 1;
-
- private static final int CHARSET_H = 2;
-
- private static final int CHARSET_A = 3;
-
- private static final int CHARSET_R = 4;
-
- private static final int CHARSET_S = 5;
-
- private static final int CHARSET_E = 6;
-
- private static final int CHARSET_T = 7;
-
- private static final int CHARSET_EQUALS = 8;
-
- private static final int CHARSET_SINGLE_QUOTED = 9;
-
- private static final int CHARSET_DOUBLE_QUOTED = 10;
-
- private static final int CHARSET_UNQUOTED = 11;
-
- // end pseudo enums
-
- // [NOCPP[
-
- private final static String[] HTML4_PUBLIC_IDS = {
- "-//W3C//DTD HTML 4.0 Frameset//EN",
- "-//W3C//DTD HTML 4.0 Transitional//EN",
- "-//W3C//DTD HTML 4.0//EN", "-//W3C//DTD HTML 4.01 Frameset//EN",
- "-//W3C//DTD HTML 4.01 Transitional//EN",
- "-//W3C//DTD HTML 4.01//EN" };
-
- // ]NOCPP]
-
- @Literal private final static String[] QUIRKY_PUBLIC_IDS = {
- "+//silmaril//dtd html pro v0r11 19970101//",
- "-//advasoft ltd//dtd html 3.0 aswedit + extensions//",
- "-//as//dtd html 3.0 aswedit + extensions//",
- "-//ietf//dtd html 2.0 level 1//",
- "-//ietf//dtd html 2.0 level 2//",
- "-//ietf//dtd html 2.0 strict level 1//",
- "-//ietf//dtd html 2.0 strict level 2//",
- "-//ietf//dtd html 2.0 strict//",
- "-//ietf//dtd html 2.0//",
- "-//ietf//dtd html 2.1e//",
- "-//ietf//dtd html 3.0//",
- "-//ietf//dtd html 3.2 final//",
- "-//ietf//dtd html 3.2//",
- "-//ietf//dtd html 3//",
- "-//ietf//dtd html level 0//",
- "-//ietf//dtd html level 1//",
- "-//ietf//dtd html level 2//",
- "-//ietf//dtd html level 3//",
- "-//ietf//dtd html strict level 0//",
- "-//ietf//dtd html strict level 1//",
- "-//ietf//dtd html strict level 2//",
- "-//ietf//dtd html strict level 3//",
- "-//ietf//dtd html strict//",
- "-//ietf//dtd html//",
- "-//metrius//dtd metrius presentational//",
- "-//microsoft//dtd internet explorer 2.0 html strict//",
- "-//microsoft//dtd internet explorer 2.0 html//",
- "-//microsoft//dtd internet explorer 2.0 tables//",
- "-//microsoft//dtd internet explorer 3.0 html strict//",
- "-//microsoft//dtd internet explorer 3.0 html//",
- "-//microsoft//dtd internet explorer 3.0 tables//",
- "-//netscape comm. corp.//dtd html//",
- "-//netscape comm. corp.//dtd strict html//",
- "-//o'reilly and associates//dtd html 2.0//",
- "-//o'reilly and associates//dtd html extended 1.0//",
- "-//o'reilly and associates//dtd html extended relaxed 1.0//",
- "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//",
- "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//",
- "-//spyglass//dtd html 2.0 extended//",
- "-//sq//dtd html 2.0 hotmetal + extensions//",
- "-//sun microsystems corp.//dtd hotjava html//",
- "-//sun microsystems corp.//dtd hotjava strict html//",
- "-//w3c//dtd html 3 1995-03-24//", "-//w3c//dtd html 3.2 draft//",
- "-//w3c//dtd html 3.2 final//", "-//w3c//dtd html 3.2//",
- "-//w3c//dtd html 3.2s draft//", "-//w3c//dtd html 4.0 frameset//",
- "-//w3c//dtd html 4.0 transitional//",
- "-//w3c//dtd html experimental 19960712//",
- "-//w3c//dtd html experimental 970421//", "-//w3c//dtd w3 html//",
- "-//w3o//dtd w3 html 3.0//", "-//webtechs//dtd mozilla html 2.0//",
- "-//webtechs//dtd mozilla html//" };
-
- private static final int NOT_FOUND_ON_STACK = Integer.MAX_VALUE;
-
- // [NOCPP[
-
- private static final @Local String HTML_LOCAL = "html";
-
- // ]NOCPP]
-
- private int mode = INITIAL;
-
- private int originalMode = INITIAL;
-
- /**
- * Used only when moving back to IN_BODY.
- */
- private boolean framesetOk = true;
-
- protected Tokenizer tokenizer;
-
- // [NOCPP[
-
- protected ErrorHandler errorHandler;
-
- private DocumentModeHandler documentModeHandler;
-
- private DoctypeExpectation doctypeExpectation = DoctypeExpectation.HTML;
-
- private LocatorImpl firstCommentLocation;
-
- // ]NOCPP]
-
- private boolean scriptingEnabled = false;
-
- private boolean needToDropLF;
-
- // [NOCPP[
-
- private boolean wantingComments;
-
- // ]NOCPP]
-
- private boolean fragment;
-
- private @Local String contextName;
-
- private @NsUri String contextNamespace;
-
- private T contextNode;
-
- /**
- * Stack of template insertion modes
- */
- private @Auto int[] templateModeStack;
-
- /**
- * Current template mode stack pointer.
- */
- private int templateModePtr = -1;
-
- private @Auto StackNode<T>[] stack;
-
- private int currentPtr = -1;
-
- private @Auto StackNode<T>[] listOfActiveFormattingElements;
-
- private int listPtr = -1;
-
- private T formPointer;
-
- private T headPointer;
-
- /**
- * Used to work around Gecko limitations. Not used in Java.
- */
- private T deepTreeSurrogateParent;
-
- protected @Auto char[] charBuffer;
-
- protected int charBufferLen = 0;
-
- private boolean quirks = false;
-
- private boolean isSrcdocDocument = false;
-
- // [NOCPP[
-
- private boolean reportingDoctype = true;
-
- private XmlViolationPolicy namePolicy = XmlViolationPolicy.ALTER_INFOSET;
-
- private final Map<String, LocatorImpl> idLocations = new HashMap<String, LocatorImpl>();
-
- private boolean html4;
-
- // ]NOCPP]
-
- protected TreeBuilder() {
- fragment = false;
- }
-
- /**
- * Reports an condition that would make the infoset incompatible with XML
- * 1.0 as fatal.
- *
- * @throws SAXException
- * @throws SAXParseException
- */
- protected void fatal() throws SAXException {
- }
-
- // [NOCPP[
-
- protected final void fatal(Exception e) throws SAXException {
- SAXParseException spe = new SAXParseException(e.getMessage(),
- tokenizer, e);
- if (errorHandler != null) {
- errorHandler.fatalError(spe);
- }
- throw spe;
- }
-
- final void fatal(String s) throws SAXException {
- SAXParseException spe = new SAXParseException(s, tokenizer);
- if (errorHandler != null) {
- errorHandler.fatalError(spe);
- }
- throw spe;
- }
-
- /**
- * Reports a Parse Error.
- *
- * @param message
- * the message
- * @throws SAXException
- */
- final void err(String message) throws SAXException {
- if (errorHandler == null) {
- return;
- }
- errNoCheck(message);
- }
-
- /**
- * Reports a Parse Error without checking if an error handler is present.
- *
- * @param message
- * the message
- * @throws SAXException
- */
- final void errNoCheck(String message) throws SAXException {
- SAXParseException spe = new SAXParseException(message, tokenizer);
- errorHandler.error(spe);
- }
-
- private void errListUnclosedStartTags(int eltPos) throws SAXException {
- if (currentPtr != -1) {
- for (int i = currentPtr; i > eltPos; i--) {
- reportUnclosedElementNameAndLocation(i);
- }
- }
- }
-
- /**
- * Reports the name and location of an unclosed element.
- *
- * @throws SAXException
- */
- private final void reportUnclosedElementNameAndLocation(int pos) throws SAXException {
- StackNode<T> node = stack[pos];
- if (node.isOptionalEndTag()) {
- return;
- }
- TaintableLocatorImpl locator = node.getLocator();
- if (locator.isTainted()) {
- return;
- }
- locator.markTainted();
- SAXParseException spe = new SAXParseException(
- "Unclosed element \u201C" + node.popName + "\u201D.", locator);
- errorHandler.error(spe);
- }
-
- /**
- * Reports a warning
- *
- * @param message
- * the message
- * @throws SAXException
- */
- final void warn(String message) throws SAXException {
- if (errorHandler == null) {
- return;
- }
- SAXParseException spe = new SAXParseException(message, tokenizer);
- errorHandler.warning(spe);
- }
-
- /**
- * Reports a warning with an explicit locator
- *
- * @param message
- * the message
- * @throws SAXException
- */
- final void warn(String message, Locator locator) throws SAXException {
- if (errorHandler == null) {
- return;
- }
- SAXParseException spe = new SAXParseException(message, locator);
- errorHandler.warning(spe);
- }
-
- // ]NOCPP]
-
- @SuppressWarnings("unchecked") public final void startTokenization(Tokenizer self) throws SAXException {
- tokenizer = self;
- stack = new StackNode[64];
- templateModeStack = new int[64];
- listOfActiveFormattingElements = new StackNode[64];
- needToDropLF = false;
- originalMode = INITIAL;
- templateModePtr = -1;
- currentPtr = -1;
- listPtr = -1;
- formPointer = null;
- headPointer = null;
- deepTreeSurrogateParent = null;
- // [NOCPP[
- html4 = false;
- idLocations.clear();
- wantingComments = wantsComments();
- firstCommentLocation = null;
- // ]NOCPP]
- start(fragment);
- charBufferLen = 0;
- charBuffer = null;
- framesetOk = true;
- if (fragment) {
- T elt;
- if (contextNode != null) {
- elt = contextNode;
- } else {
- elt = createHtmlElementSetAsRoot(tokenizer.emptyAttributes());
- }
- // When the context node is not in the HTML namespace, contrary
- // to the spec, the first node on the stack is not set to "html"
- // in the HTML namespace. Instead, it is set to a node that has
- // the characteristics of the appropriate "adjusted current node".
- // This way, there is no need to perform "adjusted current node"
- // checks during tree construction. Instead, it's sufficient to
- // just look at the current node. However, this also means that it
- // is not safe to treat "html" in the HTML namespace as a sentinel
- // that ends stack popping. Instead, stack popping loops that are
- // meant not to pop the first element on the stack need to check
- // for currentPos becoming zero.
- if (contextNamespace == "http://www.w3.org/2000/svg") {
- ElementName elementName = ElementName.SVG;
- if ("title" == contextName || "desc" == contextName
- || "foreignObject" == contextName) {
- // These elements are all alike and we don't care about
- // the exact name.
- elementName = ElementName.FOREIGNOBJECT;
- }
- // This is the SVG variant of the StackNode constructor.
- StackNode<T> node = new StackNode<T>(elementName,
- elementName.camelCaseName, elt
- // [NOCPP[
- , errorHandler == null ? null
- : new TaintableLocatorImpl(tokenizer)
- // ]NOCPP]
- );
- currentPtr++;
- stack[currentPtr] = node;
- tokenizer.setStateAndEndTagExpectation(Tokenizer.DATA,
- contextName);
- // The frameset-ok flag is set even though <frameset> never
- // ends up being allowed as HTML frameset in the fragment case.
- mode = FRAMESET_OK;
- } else if (contextNamespace == "http://www.w3.org/1998/Math/MathML") {
- ElementName elementName = ElementName.MATH;
- if ("mi" == contextName || "mo" == contextName
- || "mn" == contextName || "ms" == contextName
- || "mtext" == contextName) {
- // These elements are all alike and we don't care about
- // the exact name.
- elementName = ElementName.MTEXT;
- } else if ("annotation-xml" == contextName) {
- elementName = ElementName.ANNOTATION_XML;
- // Blink does not check the encoding attribute of the
- // annotation-xml element innerHTML is being set on.
- // Let's do the same at least until
- // https://www.w3.org/Bugs/Public/show_bug.cgi?id=26783
- // is resolved.
- }
- // This is the MathML variant of the StackNode constructor.
- StackNode<T> node = new StackNode<T>(elementName, elt,
- elementName.name, false
- // [NOCPP[
- , errorHandler == null ? null
- : new TaintableLocatorImpl(tokenizer)
- // ]NOCPP]
- );
- currentPtr++;
- stack[currentPtr] = node;
- tokenizer.setStateAndEndTagExpectation(Tokenizer.DATA,
- contextName);
- // The frameset-ok flag is set even though <frameset> never
- // ends up being allowed as HTML frameset in the fragment case.
- mode = FRAMESET_OK;
- } else { // html
- StackNode<T> node = new StackNode<T>(ElementName.HTML, elt
- // [NOCPP[
- , errorHandler == null ? null
- : new TaintableLocatorImpl(tokenizer)
- // ]NOCPP]
- );
- currentPtr++;
- stack[currentPtr] = node;
- if ("template" == contextName) {
- pushTemplateMode(IN_TEMPLATE);
- }
- resetTheInsertionMode();
- formPointer = getFormPointerForContext(contextNode);
- if ("title" == contextName || "textarea" == contextName) {
- tokenizer.setStateAndEndTagExpectation(Tokenizer.RCDATA,
- contextName);
- } else if ("style" == contextName || "xmp" == contextName
- || "iframe" == contextName || "noembed" == contextName
- || "noframes" == contextName
- || (scriptingEnabled && "noscript" == contextName)) {
- tokenizer.setStateAndEndTagExpectation(Tokenizer.RAWTEXT,
- contextName);
- } else if ("plaintext" == contextName) {
- tokenizer.setStateAndEndTagExpectation(Tokenizer.PLAINTEXT,
- contextName);
- } else if ("script" == contextName) {
- tokenizer.setStateAndEndTagExpectation(
- Tokenizer.SCRIPT_DATA, contextName);
- } else {
- tokenizer.setStateAndEndTagExpectation(Tokenizer.DATA,
- contextName);
- }
- }
- contextName = null;
- contextNode = null;
- } else {
- mode = INITIAL;
- // If we are viewing XML source, put a foreign element permanently
- // on the stack so that cdataSectionAllowed() returns true.
- // CPPONLY: if (tokenizer.isViewingXmlSource()) {
- // CPPONLY: T elt = createElement("http://www.w3.org/2000/svg",
- // CPPONLY: "svg",
- // CPPONLY: tokenizer.emptyAttributes(), null);
- // CPPONLY: StackNode<T> node = new StackNode<T>(ElementName.SVG,
- // CPPONLY: "svg",
- // CPPONLY: elt);
- // CPPONLY: currentPtr++;
- // CPPONLY: stack[currentPtr] = node;
- // CPPONLY: }
- }
- }
-
- public final void doctype(@Local String name, String publicIdentifier,
- String systemIdentifier, boolean forceQuirks) throws SAXException {
- needToDropLF = false;
- if (!isInForeign() && mode == INITIAL) {
- // [NOCPP[
- if (reportingDoctype) {
- // ]NOCPP]
- String emptyString = Portability.newEmptyString();
- appendDoctypeToDocument(name == null ? "" : name,
- publicIdentifier == null ? emptyString
- : publicIdentifier,
- systemIdentifier == null ? emptyString
- : systemIdentifier);
- Portability.releaseString(emptyString);
- // [NOCPP[
- }
- switch (doctypeExpectation) {
- case HTML:
- // ]NOCPP]
- if (isQuirky(name, publicIdentifier, systemIdentifier,
- forceQuirks)) {
- errQuirkyDoctype();
- documentModeInternal(DocumentMode.QUIRKS_MODE,
- publicIdentifier, systemIdentifier, false);
- } else if (isAlmostStandards(publicIdentifier,
- systemIdentifier)) {
- // [NOCPP[
- if (firstCommentLocation != null) {
- warn("Comments seen before doctype. Internet Explorer will go into the quirks mode.",
- firstCommentLocation);
- }
- // ]NOCPP]
- errAlmostStandardsDoctype();
- documentModeInternal(
- DocumentMode.ALMOST_STANDARDS_MODE,
- publicIdentifier, systemIdentifier, false);
- } else {
- // [NOCPP[
- if (firstCommentLocation != null) {
- warn("Comments seen before doctype. Internet Explorer will go into the quirks mode.",
- firstCommentLocation);
- }
- if ((Portability.literalEqualsString(
- "-//W3C//DTD HTML 4.0//EN", publicIdentifier) && (systemIdentifier == null || Portability.literalEqualsString(
- "http://www.w3.org/TR/REC-html40/strict.dtd",
- systemIdentifier)))
- || (Portability.literalEqualsString(
- "-//W3C//DTD HTML 4.01//EN",
- publicIdentifier) && (systemIdentifier == null || Portability.literalEqualsString(
- "http://www.w3.org/TR/html4/strict.dtd",
- systemIdentifier)))
- || (Portability.literalEqualsString(
- "-//W3C//DTD XHTML 1.0 Strict//EN",
- publicIdentifier) && Portability.literalEqualsString(
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd",
- systemIdentifier))
- || (Portability.literalEqualsString(
- "-//W3C//DTD XHTML 1.1//EN",
- publicIdentifier) && Portability.literalEqualsString(
- "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd",
- systemIdentifier))
-
- ) {
- warn("Obsolete doctype. Expected \u201C<!DOCTYPE html>\u201D.");
- } else if (!((systemIdentifier == null || Portability.literalEqualsString(
- "about:legacy-compat", systemIdentifier)) && publicIdentifier == null)) {
- err("Legacy doctype. Expected \u201C<!DOCTYPE html>\u201D.");
- }
- // ]NOCPP]
- documentModeInternal(DocumentMode.STANDARDS_MODE,
- publicIdentifier, systemIdentifier, false);
- }
- // [NOCPP[
- break;
- case HTML401_STRICT:
- html4 = true;
- tokenizer.turnOnAdditionalHtml4Errors();
- if (isQuirky(name, publicIdentifier, systemIdentifier,
- forceQuirks)) {
- err("Quirky doctype. Expected \u201C<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\u201D.");
- documentModeInternal(DocumentMode.QUIRKS_MODE,
- publicIdentifier, systemIdentifier, true);
- } else if (isAlmostStandards(publicIdentifier,
- systemIdentifier)) {
- if (firstCommentLocation != null) {
- warn("Comments seen before doctype. Internet Explorer will go into the quirks mode.",
- firstCommentLocation);
- }
- err("Almost standards mode doctype. Expected \u201C<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\u201D.");
- documentModeInternal(
- DocumentMode.ALMOST_STANDARDS_MODE,
- publicIdentifier, systemIdentifier, true);
- } else {
- if (firstCommentLocation != null) {
- warn("Comments seen before doctype. Internet Explorer will go into the quirks mode.",
- firstCommentLocation);
- }
- if ("-//W3C//DTD HTML 4.01//EN".equals(publicIdentifier)) {
- if (!"http://www.w3.org/TR/html4/strict.dtd".equals(systemIdentifier)) {
- warn("The doctype did not contain the system identifier prescribed by the HTML 4.01 specification. Expected \u201C<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\u201D.");
- }
- } else {
- err("The doctype was not the HTML 4.01 Strict doctype. Expected \u201C<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\u201D.");
- }
- documentModeInternal(DocumentMode.STANDARDS_MODE,
- publicIdentifier, systemIdentifier, true);
- }
- break;
- case HTML401_TRANSITIONAL:
- html4 = true;
- tokenizer.turnOnAdditionalHtml4Errors();
- if (isQuirky(name, publicIdentifier, systemIdentifier,
- forceQuirks)) {
- err("Quirky doctype. Expected \u201C<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\u201D.");
- documentModeInternal(DocumentMode.QUIRKS_MODE,
- publicIdentifier, systemIdentifier, true);
- } else if (isAlmostStandards(publicIdentifier,
- systemIdentifier)) {
- if (firstCommentLocation != null) {
- warn("Comments seen before doctype. Internet Explorer will go into the quirks mode.",
- firstCommentLocation);
- }
- if ("-//W3C//DTD HTML 4.01 Transitional//EN".equals(publicIdentifier)
- && systemIdentifier != null) {
- if (!"http://www.w3.org/TR/html4/loose.dtd".equals(systemIdentifier)) {
- warn("The doctype did not contain the system identifier prescribed by the HTML 4.01 specification. Expected \u201C<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\u201D.");
- }
- } else {
- err("The doctype was not a non-quirky HTML 4.01 Transitional doctype. Expected \u201C<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\u201D.");
- }
- documentModeInternal(
- DocumentMode.ALMOST_STANDARDS_MODE,
- publicIdentifier, systemIdentifier, true);
- } else {
- if (firstCommentLocation != null) {
- warn("Comments seen before doctype. Internet Explorer will go into the quirks mode.",
- firstCommentLocation);
- }
- err("The doctype was not the HTML 4.01 Transitional doctype. Expected \u201C<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\u201D.");
- documentModeInternal(DocumentMode.STANDARDS_MODE,
- publicIdentifier, systemIdentifier, true);
- }
- break;
- case AUTO:
- html4 = isHtml4Doctype(publicIdentifier);
- if (html4) {
- tokenizer.turnOnAdditionalHtml4Errors();
- }
- if (isQuirky(name, publicIdentifier, systemIdentifier,
- forceQuirks)) {
- err("Quirky doctype. Expected e.g. \u201C<!DOCTYPE html>\u201D.");
- documentModeInternal(DocumentMode.QUIRKS_MODE,
- publicIdentifier, systemIdentifier, html4);
- } else if (isAlmostStandards(publicIdentifier,
- systemIdentifier)) {
- if (firstCommentLocation != null) {
- warn("Comments seen before doctype. Internet Explorer will go into the quirks mode.",
- firstCommentLocation);
- }
- if ("-//W3C//DTD HTML 4.01 Transitional//EN".equals(publicIdentifier)) {
- if (!"http://www.w3.org/TR/html4/loose.dtd".equals(systemIdentifier)) {
- warn("The doctype did not contain the system identifier prescribed by the HTML 4.01 specification. Expected \u201C<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\u201D.");
- }
- } else {
- err("Almost standards mode doctype. Expected e.g. \u201C<!DOCTYPE html>\u201D.");
- }
- documentModeInternal(
- DocumentMode.ALMOST_STANDARDS_MODE,
- publicIdentifier, systemIdentifier, html4);
- } else {
- if (firstCommentLocation != null) {
- warn("Comments seen before doctype. Internet Explorer will go into the quirks mode.",
- firstCommentLocation);
- }
- if ("-//W3C//DTD HTML 4.01//EN".equals(publicIdentifier)) {
- if (!"http://www.w3.org/TR/html4/strict.dtd".equals(systemIdentifier)) {
- warn("The doctype did not contain the system identifier prescribed by the HTML 4.01 specification. Expected \u201C<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\u201D.");
- }
- } else if ("-//W3C//DTD XHTML 1.0 Strict//EN".equals(publicIdentifier)) {
- if (!"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd".equals(systemIdentifier)) {
- warn("The doctype did not contain the system identifier prescribed by the XHTML 1.0 specification. Expected \u201C<!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\u201D.");
- }
- } else if ("//W3C//DTD XHTML 1.1//EN".equals(publicIdentifier)) {
- if (!"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd".equals(systemIdentifier)) {
- warn("The doctype did not contain the system identifier prescribed by the XHTML 1.1 specification. Expected \u201C<!DOCTYPE HTML PUBLIC \"//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\u201D.");
- }
- } else if (!((systemIdentifier == null || Portability.literalEqualsString(
- "about:legacy-compat", systemIdentifier)) && publicIdentifier == null)) {
- err("Unexpected doctype. Expected, e.g., \u201C<!DOCTYPE html>\u201D.");
- }
- documentModeInternal(DocumentMode.STANDARDS_MODE,
- publicIdentifier, systemIdentifier, html4);
- }
- break;
- case NO_DOCTYPE_ERRORS:
- if (isQuirky(name, publicIdentifier, systemIdentifier,
- forceQuirks)) {
- documentModeInternal(DocumentMode.QUIRKS_MODE,
- publicIdentifier, systemIdentifier, false);
- } else if (isAlmostStandards(publicIdentifier,
- systemIdentifier)) {
- documentModeInternal(
- DocumentMode.ALMOST_STANDARDS_MODE,
- publicIdentifier, systemIdentifier, false);
- } else {
- documentModeInternal(DocumentMode.STANDARDS_MODE,
- publicIdentifier, systemIdentifier, false);
- }
- break;
- }
- // ]NOCPP]
-
- /*
- *
- * Then, switch to the root element mode of the tree construction
- * stage.
- */
- mode = BEFORE_HTML;
- return;
- }
- /*
- * A DOCTYPE token Parse error.
- */
- errStrayDoctype();
- /*
- * Ignore the token.
- */
- return;
- }
-
- // [NOCPP[
-
- private boolean isHtml4Doctype(String publicIdentifier) {
- if (publicIdentifier != null
- && (Arrays.binarySearch(TreeBuilder.HTML4_PUBLIC_IDS,
- publicIdentifier) > -1)) {
- return true;
- }
- return false;
- }
-
- // ]NOCPP]
-
- public final void comment(@NoLength char[] buf, int start, int length)
- throws SAXException {
- needToDropLF = false;
- // [NOCPP[
- if (firstCommentLocation == null) {
- firstCommentLocation = new LocatorImpl(tokenizer);
- }
- if (!wantingComments) {
- return;
- }
- // ]NOCPP]
- if (!isInForeign()) {
- switch (mode) {
- case INITIAL:
- case BEFORE_HTML:
- case AFTER_AFTER_BODY:
- case AFTER_AFTER_FRAMESET:
- /*
- * A comment token Append a Comment node to the Document
- * object with the data attribute set to the data given in
- * the comment token.
- */
- appendCommentToDocument(buf, start, length);
- return;
- case AFTER_BODY:
- /*
- * A comment token Append a Comment node to the first
- * element in the stack of open elements (the html element),
- * with the data attribute set to the data given in the
- * comment token.
- */
- flushCharacters();
- appendComment(stack[0].node, buf, start, length);
- return;
- default:
- break;
- }
- }
- /*
- * A comment token Append a Comment node to the current node with the
- * data attribute set to the data given in the comment token.
- */
- flushCharacters();
- appendComment(stack[currentPtr].node, buf, start, length);
- return;
- }
-
- /**
- * @see nu.validator.htmlparser.common.TokenHandler#characters(char[], int,
- * int)
- */
- public final void characters(@Const @NoLength char[] buf, int start, int length)
- throws SAXException {
- // Note: Can't attach error messages to EOF in C++ yet
-
- // CPPONLY: if (tokenizer.isViewingXmlSource()) {
- // CPPONLY: return;
- // CPPONLY: }
- if (needToDropLF) {
- needToDropLF = false;
- if (buf[start] == '\n') {
- start++;
- length--;
- if (length == 0) {
- return;
- }
- }
- }
-
- // optimize the most common case
- switch (mode) {
- case IN_BODY:
- case IN_CELL:
- case IN_CAPTION:
- if (!isInForeignButNotHtmlOrMathTextIntegrationPoint()) {
- reconstructTheActiveFormattingElements();
- }
- // fall through
- case TEXT:
- accumulateCharacters(buf, start, length);
- return;
- case IN_TABLE:
- case IN_TABLE_BODY:
- case IN_ROW:
- accumulateCharactersForced(buf, start, length);
- return;
- default:
- int end = start + length;
- charactersloop: for (int i = start; i < end; i++) {
- switch (buf[i]) {
- case ' ':
- case '\t':
- case '\n':
- case '\r':
- case '\u000C':
- /*
- * A character token that is one of one of U+0009
- * CHARACTER TABULATION, U+000A LINE FEED (LF),
- * U+000C FORM FEED (FF), or U+0020 SPACE
- */
- switch (mode) {
- case INITIAL:
- case BEFORE_HTML:
- case BEFORE_HEAD:
- /*
- * Ignore the token.
- */
- start = i + 1;
- continue;
- case IN_HEAD:
- case IN_HEAD_NOSCRIPT:
- case AFTER_HEAD:
- case IN_COLUMN_GROUP:
- case IN_FRAMESET:
- case AFTER_FRAMESET:
- /*
- * Append the character to the current node.
- */
- continue;
- case FRAMESET_OK:
- case IN_TEMPLATE:
- case IN_BODY:
- case IN_CELL:
- case IN_CAPTION:
- if (start < i) {
- accumulateCharacters(buf, start, i
- - start);
- start = i;
- }
-
- /*
- * Reconstruct the active formatting
- * elements, if any.
- */
- if (!isInForeignButNotHtmlOrMathTextIntegrationPoint()) {
- flushCharacters();
- reconstructTheActiveFormattingElements();
- }
- /*
- * Append the token's character to the
- * current node.
- */
- break charactersloop;
- case IN_SELECT:
- case IN_SELECT_IN_TABLE:
- break charactersloop;
- case IN_TABLE:
- case IN_TABLE_BODY:
- case IN_ROW:
- accumulateCharactersForced(buf, i, 1);
- start = i + 1;
- continue;
- case AFTER_BODY:
- case AFTER_AFTER_BODY:
- case AFTER_AFTER_FRAMESET:
- if (start < i) {
- accumulateCharacters(buf, start, i
- - start);
- start = i;
- }
- /*
- * Reconstruct the active formatting
- * elements, if any.
- */
- flushCharacters();
- reconstructTheActiveFormattingElements();
- /*
- * Append the token's character to the
- * current node.
- */
- continue;
- }
- default:
- /*
- * A character token that is not one of one of
- * U+0009 CHARACTER TABULATION, U+000A LINE FEED
- * (LF), U+000C FORM FEED (FF), or U+0020 SPACE
- */
- switch (mode) {
- case INITIAL:
- /*
- * Parse error.
- */
- // [NOCPP[
- switch (doctypeExpectation) {
- case AUTO:
- err("Non-space characters found without seeing a doctype first. Expected e.g. \u201C<!DOCTYPE html>\u201D.");
- break;
- case HTML:
- // XXX figure out a way to report this in the Gecko View Source case
- err("Non-space characters found without seeing a doctype first. Expected \u201C<!DOCTYPE html>\u201D.");
- break;
- case HTML401_STRICT:
- err("Non-space characters found without seeing a doctype first. Expected \u201C<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\u201D.");
- break;
- case HTML401_TRANSITIONAL:
- err("Non-space characters found without seeing a doctype first. Expected \u201C<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\u201D.");
- break;
- case NO_DOCTYPE_ERRORS:
- }
- // ]NOCPP]
- /*
- *
- * Set the document to quirks mode.
- */
- documentModeInternal(
- DocumentMode.QUIRKS_MODE, null,
- null, false);
- /*
- * Then, switch to the root element mode of
- * the tree construction stage
- */
- mode = BEFORE_HTML;
- /*
- * and reprocess the current token.
- */
- i--;
- continue;
- case BEFORE_HTML:
- /*
- * Create an HTMLElement node with the tag
- * name html, in the HTML namespace. Append
- * it to the Document object.
- */
- // No need to flush characters here,
- // because there's nothing to flush.
- appendHtmlElementToDocumentAndPush();
- /* Switch to the main mode */
- mode = BEFORE_HEAD;
- /*
- * reprocess the current token.
- */
- i--;
- continue;
- case BEFORE_HEAD:
- if (start < i) {
- accumulateCharacters(buf, start, i
- - start);
- start = i;
- }
- /*
- * /Act as if a start tag token with the tag
- * name "head" and no attributes had been
- * seen,
- */
- flushCharacters();
- appendToCurrentNodeAndPushHeadElement(HtmlAttributes.EMPTY_ATTRIBUTES);
- mode = IN_HEAD;
- /*
- * then reprocess the current token.
- *
- * This will result in an empty head element
- * being generated, with the current token
- * being reprocessed in the "after head"
- * insertion mode.
- */
- i--;
- continue;
- case IN_HEAD:
- if (start < i) {
- accumulateCharacters(buf, start, i
- - start);
- start = i;
- }
- /*
- * Act as if an end tag token with the tag
- * name "head" had been seen,
- */
- flushCharacters();
- pop();
- mode = AFTER_HEAD;
- /*
- * and reprocess the current token.
- */
- i--;
- continue;
- case IN_HEAD_NOSCRIPT:
- if (start < i) {
- accumulateCharacters(buf, start, i
- - start);
- start = i;
- }
- /*
- * Parse error. Act as if an end tag with
- * the tag name "noscript" had been seen
- */
- errNonSpaceInNoscriptInHead();
- flushCharacters();
- pop();
- mode = IN_HEAD;
- /*
- * and reprocess the current token.
- */
- i--;
- continue;
- case AFTER_HEAD:
- if (start < i) {
- accumulateCharacters(buf, start, i
- - start);
- start = i;
- }
- /*
- * Act as if a start tag token with the tag
- * name "body" and no attributes had been
- * seen,
- */
- flushCharacters();
- appendToCurrentNodeAndPushBodyElement();
- mode = FRAMESET_OK;
- /*
- * and then reprocess the current token.
- */
- i--;
- continue;
- case FRAMESET_OK:
- framesetOk = false;
- mode = IN_BODY;
- i--;
- continue;
- case IN_TEMPLATE:
- case IN_BODY:
- case IN_CELL:
- case IN_CAPTION:
- if (start < i) {
- accumulateCharacters(buf, start, i
- - start);
- start = i;
- }
- /*
- * Reconstruct the active formatting
- * elements, if any.
- */
- if (!isInForeignButNotHtmlOrMathTextIntegrationPoint()) {
- flushCharacters();
- reconstructTheActiveFormattingElements();
- }
- /*
- * Append the token's character to the
- * current node.
- */
- break charactersloop;
- case IN_TABLE:
- case IN_TABLE_BODY:
- case IN_ROW:
- accumulateCharactersForced(buf, i, 1);
- start = i + 1;
- continue;
- case IN_COLUMN_GROUP:
- if (start < i) {
- accumulateCharacters(buf, start, i
- - start);
- start = i;
- }
- /*
- * Act as if an end tag with the tag name
- * "colgroup" had been seen, and then, if
- * that token wasn't ignored, reprocess the
- * current token.
- */
- if (currentPtr == 0 || stack[currentPtr].getGroup() ==
- TreeBuilder.TEMPLATE) {
- errNonSpaceInColgroupInFragment();
- start = i + 1;
- continue;
- }
- flushCharacters();
- pop();
- mode = IN_TABLE;
- i--;
- continue;
- case IN_SELECT:
- case IN_SELECT_IN_TABLE:
- break charactersloop;
- case AFTER_BODY:
- errNonSpaceAfterBody();
- fatal();
- mode = framesetOk ? FRAMESET_OK : IN_BODY;
- i--;
- continue;
- case IN_FRAMESET:
- if (start < i) {
- accumulateCharacters(buf, start, i
- - start);
- // start index is adjusted below.
- }
- /*
- * Parse error.
- */
- errNonSpaceInFrameset();
- /*
- * Ignore the token.
- */
- start = i + 1;
- continue;
- case AFTER_FRAMESET:
- if (start < i) {
- accumulateCharacters(buf, start, i
- - start);
- // start index is adjusted below.
- }
- /*
- * Parse error.
- */
- errNonSpaceAfterFrameset();
- /*
- * Ignore the token.
- */
- start = i + 1;
- continue;
- case AFTER_AFTER_BODY:
- /*
- * Parse error.
- */
- errNonSpaceInTrailer();
- /*
- * Switch back to the main mode and
- * reprocess the token.
- */
- mode = framesetOk ? FRAMESET_OK : IN_BODY;
- i--;
- continue;
- case AFTER_AFTER_FRAMESET:
- if (start < i) {
- accumulateCharacters(buf, start, i
- - start);
- // start index is adjusted below.
- }
- /*
- * Parse error.
- */
- errNonSpaceInTrailer();
- /*
- * Ignore the token.
- */
- start = i + 1;
- continue;
- }
- }
- }
- if (start < end) {
- accumulateCharacters(buf, start, end - start);
- }
- }
- }
-
- /**
- * @see nu.validator.htmlparser.common.TokenHandler#zeroOriginatingReplacementCharacter()
- */
- public void zeroOriginatingReplacementCharacter() throws SAXException {
- if (mode == TEXT) {
- accumulateCharacters(REPLACEMENT_CHARACTER, 0, 1);
- return;
- }
- if (currentPtr >= 0) {
- if (isSpecialParentInForeign(stack[currentPtr])) {
- return;
- }
- accumulateCharacters(REPLACEMENT_CHARACTER, 0, 1);
- }
- }
-
- public final void eof() throws SAXException {
- flushCharacters();
- // Note: Can't attach error messages to EOF in C++ yet
- eofloop: for (;;) {
- switch (mode) {
- case INITIAL:
- /*
- * Parse error.
- */
- // [NOCPP[
- switch (doctypeExpectation) {
- case AUTO:
- err("End of file seen without seeing a doctype first. Expected e.g. \u201C<!DOCTYPE html>\u201D.");
- break;
- case HTML:
- err("End of file seen without seeing a doctype first. Expected \u201C<!DOCTYPE html>\u201D.");
- break;
- case HTML401_STRICT:
- err("End of file seen without seeing a doctype first. Expected \u201C<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\u201D.");
- break;
- case HTML401_TRANSITIONAL:
- err("End of file seen without seeing a doctype first. Expected \u201C<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\u201D.");
- break;
- case NO_DOCTYPE_ERRORS:
- }
- // ]NOCPP]
- /*
- *
- * Set the document to quirks mode.
- */
- documentModeInternal(DocumentMode.QUIRKS_MODE, null, null,
- false);
- /*
- * Then, switch to the root element mode of the tree
- * construction stage
- */
- mode = BEFORE_HTML;
- /*
- * and reprocess the current token.
- */
- continue;
- case BEFORE_HTML:
- /*
- * Create an HTMLElement node with the tag name html, in the
- * HTML namespace. Append it to the Document object.
- */
- appendHtmlElementToDocumentAndPush();
- // XXX application cache manifest
- /* Switch to the main mode */
- mode = BEFORE_HEAD;
- /*
- * reprocess the current token.
- */
- continue;
- case BEFORE_HEAD:
- appendToCurrentNodeAndPushHeadElement(HtmlAttributes.EMPTY_ATTRIBUTES);
- mode = IN_HEAD;
- continue;
- case IN_HEAD:
- // [NOCPP[
- if (errorHandler != null && currentPtr > 1) {
- errEofWithUnclosedElements();
- }
- // ]NOCPP]
- while (currentPtr > 0) {
- popOnEof();
- }
- mode = AFTER_HEAD;
- continue;
- case IN_HEAD_NOSCRIPT:
- // [NOCPP[
- errEofWithUnclosedElements();
- // ]NOCPP]
- while (currentPtr > 1) {
- popOnEof();
- }
- mode = IN_HEAD;
- continue;
- case AFTER_HEAD:
- appendToCurrentNodeAndPushBodyElement();
- mode = IN_BODY;
- continue;
- case IN_TABLE_BODY:
- case IN_ROW:
- case IN_TABLE:
- case IN_SELECT_IN_TABLE:
- case IN_SELECT:
- case IN_COLUMN_GROUP:
- case FRAMESET_OK:
- case IN_CAPTION:
- case IN_CELL:
- case IN_BODY:
- // [NOCPP[
- // i > 0 to stop in time in the foreign fragment case.
- openelementloop: for (int i = currentPtr; i > 0; i--) {
- int group = stack[i].getGroup();
- switch (group) {
- case DD_OR_DT:
- case LI:
- case P:
- case TBODY_OR_THEAD_OR_TFOOT:
- case TD_OR_TH:
- case BODY:
- case HTML:
- break;
- default:
- errEofWithUnclosedElements();
- break openelementloop;
- }
- }
- // ]NOCPP]
-
- if (isTemplateModeStackEmpty()) {
- break eofloop;
- }
-
- // fall through to IN_TEMPLATE
- case IN_TEMPLATE:
- int eltPos = findLast("template");
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- assert fragment;
- break eofloop;
- }
- if (errorHandler != null) {
- errUnclosedElements(eltPos, "template");
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- clearTheListOfActiveFormattingElementsUpToTheLastMarker();
- popTemplateMode();
- resetTheInsertionMode();
-
- // Reprocess token.
- continue;
- case TEXT:
- // [NOCPP[
- if (errorHandler != null) {
- errNoCheck("End of file seen when expecting text or an end tag.");
- errListUnclosedStartTags(0);
- }
- // ]NOCPP]
- // XXX mark script as already executed
- if (originalMode == AFTER_HEAD) {
- popOnEof();
- }
- popOnEof();
- mode = originalMode;
- continue;
- case IN_FRAMESET:
- // [NOCPP[
- if (errorHandler != null && currentPtr > 0) {
- errEofWithUnclosedElements();
- }
- // ]NOCPP]
- break eofloop;
- case AFTER_BODY:
- case AFTER_FRAMESET:
- case AFTER_AFTER_BODY:
- case AFTER_AFTER_FRAMESET:
- default:
- // [NOCPP[
- if (currentPtr == 0) { // This silliness is here to poison
- // buggy compiler optimizations in
- // GWT
- System.currentTimeMillis();
- }
- // ]NOCPP]
- break eofloop;
- }
- }
- while (currentPtr > 0) {
- popOnEof();
- }
- if (!fragment) {
- popOnEof();
- }
- /* Stop parsing. */
- }
-
- /**
- * @see nu.validator.htmlparser.common.TokenHandler#endTokenization()
- */
- public final void endTokenization() throws SAXException {
- formPointer = null;
- headPointer = null;
- deepTreeSurrogateParent = null;
- templateModeStack = null;
- if (stack != null) {
- while (currentPtr > -1) {
- stack[currentPtr].release();
- currentPtr--;
- }
- stack = null;
- }
- if (listOfActiveFormattingElements != null) {
- while (listPtr > -1) {
- if (listOfActiveFormattingElements[listPtr] != null) {
- listOfActiveFormattingElements[listPtr].release();
- }
- listPtr--;
- }
- listOfActiveFormattingElements = null;
- }
- // [NOCPP[
- idLocations.clear();
- // ]NOCPP]
- charBuffer = null;
- end();
- }
-
- public final void startTag(ElementName elementName,
- HtmlAttributes attributes, boolean selfClosing) throws SAXException {
- flushCharacters();
-
- // [NOCPP[
- if (errorHandler != null) {
- // ID uniqueness
- @IdType String id = attributes.getId();
- if (id != null) {
- LocatorImpl oldLoc = idLocations.get(id);
- if (oldLoc != null) {
- err("Duplicate ID \u201C" + id + "\u201D.");
- errorHandler.warning(new SAXParseException(
- "The first occurrence of ID \u201C" + id
- + "\u201D was here.", oldLoc));
- } else {
- idLocations.put(id, new LocatorImpl(tokenizer));
- }
- }
- }
- // ]NOCPP]
-
- int eltPos;
- needToDropLF = false;
- starttagloop: for (;;) {
- int group = elementName.getGroup();
- @Local String name = elementName.name;
- if (isInForeign()) {
- StackNode<T> currentNode = stack[currentPtr];
- @NsUri String currNs = currentNode.ns;
- if (!(currentNode.isHtmlIntegrationPoint() || (currNs == "http://www.w3.org/1998/Math/MathML" && ((currentNode.getGroup() == MI_MO_MN_MS_MTEXT && group != MGLYPH_OR_MALIGNMARK) || (currentNode.getGroup() == ANNOTATION_XML && group == SVG))))) {
- switch (group) {
- case B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U:
- case DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU:
- case BODY:
- case BR:
- case RUBY_OR_SPAN_OR_SUB_OR_SUP_OR_VAR:
- case DD_OR_DT:
- case UL_OR_OL_OR_DL:
- case EMBED:
- case IMG:
- case H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6:
- case HEAD:
- case HR:
- case LI:
- case META:
- case NOBR:
- case P:
- case PRE_OR_LISTING:
- case TABLE:
- case FONT:
- // re-check FONT to deal with the special case
- if (!(group == FONT && !(attributes.contains(AttributeName.COLOR)
- || attributes.contains(AttributeName.FACE) || attributes.contains(AttributeName.SIZE)))) {
- errHtmlStartTagInForeignContext(name);
- if (!fragment) {
- while (!isSpecialParentInForeign(stack[currentPtr])) {
- pop();
- }
- continue starttagloop;
- } // else fall thru
- }
- // else fall thru
- default:
- if ("http://www.w3.org/2000/svg" == currNs) {
- attributes.adjustForSvg();
- if (selfClosing) {
- appendVoidElementToCurrentMayFosterSVG(
- elementName, attributes);
- selfClosing = false;
- } else {
- appendToCurrentNodeAndPushElementMayFosterSVG(
- elementName, attributes);
- }
- attributes = null; // CPP
- break starttagloop;
- } else {
- attributes.adjustForMath();
- if (selfClosing) {
- appendVoidElementToCurrentMayFosterMathML(
- elementName, attributes);
- selfClosing = false;
- } else {
- appendToCurrentNodeAndPushElementMayFosterMathML(
- elementName, attributes);
- }
- attributes = null; // CPP
- break starttagloop;
- }
- } // switch
- } // foreignObject / annotation-xml
- }
- switch (mode) {
- case IN_TEMPLATE:
- switch (group) {
- case COL:
- popTemplateMode();
- pushTemplateMode(IN_COLUMN_GROUP);
- mode = IN_COLUMN_GROUP;
- // Reprocess token.
- continue;
- case CAPTION:
- case COLGROUP:
- case TBODY_OR_THEAD_OR_TFOOT:
- popTemplateMode();
- pushTemplateMode(IN_TABLE);
- mode = IN_TABLE;
- // Reprocess token.
- continue;
- case TR:
- popTemplateMode();
- pushTemplateMode(IN_TABLE_BODY);
- mode = IN_TABLE_BODY;
- // Reprocess token.
- continue;
- case TD_OR_TH:
- popTemplateMode();
- pushTemplateMode(IN_ROW);
- mode = IN_ROW;
- // Reprocess token.
- continue;
- case META:
- checkMetaCharset(attributes);
- appendVoidElementToCurrentMayFoster(
- elementName,
- attributes);
- selfClosing = false;
- attributes = null; // CPP
- break starttagloop;
- case TITLE:
- startTagTitleInHead(elementName, attributes);
- attributes = null; // CPP
- break starttagloop;
- case BASE:
- case LINK_OR_BASEFONT_OR_BGSOUND:
- appendVoidElementToCurrentMayFoster(
- elementName,
- attributes);
- selfClosing = false;
- attributes = null; // CPP
- break starttagloop;
- case SCRIPT:
- startTagScriptInHead(elementName, attributes);
- attributes = null; // CPP
- break starttagloop;
- case NOFRAMES:
- case STYLE:
- startTagGenericRawText(elementName, attributes);
- attributes = null; // CPP
- break starttagloop;
- case TEMPLATE:
- startTagTemplateInHead(elementName, attributes);
- attributes = null; // CPP
- break starttagloop;
- default:
- popTemplateMode();
- pushTemplateMode(IN_BODY);
- mode = IN_BODY;
- // Reprocess token.
- continue;
- }
- case IN_ROW:
- switch (group) {
- case TD_OR_TH:
- clearStackBackTo(findLastOrRoot(TreeBuilder.TR));
- appendToCurrentNodeAndPushElement(
- elementName,
- attributes);
- mode = IN_CELL;
- insertMarker();
- attributes = null; // CPP
- break starttagloop;
- case CAPTION:
- case COL:
- case COLGROUP:
- case TBODY_OR_THEAD_OR_TFOOT:
- case TR:
- eltPos = findLastOrRoot(TreeBuilder.TR);
- if (eltPos == 0) {
- assert fragment || isTemplateContents();
- errNoTableRowToClose();
- break starttagloop;
- }
- clearStackBackTo(eltPos);
- pop();
- mode = IN_TABLE_BODY;
- continue;
- default:
- // fall through to IN_TABLE
- }
- case IN_TABLE_BODY:
- switch (group) {
- case TR:
- clearStackBackTo(findLastInTableScopeOrRootTemplateTbodyTheadTfoot());
- appendToCurrentNodeAndPushElement(
- elementName,
- attributes);
- mode = IN_ROW;
- attributes = null; // CPP
- break starttagloop;
- case TD_OR_TH:
- errStartTagInTableBody(name);
- clearStackBackTo(findLastInTableScopeOrRootTemplateTbodyTheadTfoot());
- appendToCurrentNodeAndPushElement(
- ElementName.TR,
- HtmlAttributes.EMPTY_ATTRIBUTES);
- mode = IN_ROW;
- continue;
- case CAPTION:
- case COL:
- case COLGROUP:
- case TBODY_OR_THEAD_OR_TFOOT:
- eltPos = findLastInTableScopeOrRootTemplateTbodyTheadTfoot();
- if (eltPos == 0 || stack[eltPos].getGroup() == TEMPLATE) {
- assert fragment || isTemplateContents();
- errStrayStartTag(name);
- break starttagloop;
- } else {
- clearStackBackTo(eltPos);
- pop();
- mode = IN_TABLE;
- continue;
- }
- default:
- // fall through to IN_TABLE
- }
- case IN_TABLE:
- intableloop: for (;;) {
- switch (group) {
- case CAPTION:
- clearStackBackTo(findLastOrRoot(TreeBuilder.TABLE));
- insertMarker();
- appendToCurrentNodeAndPushElement(
- elementName,
- attributes);
- mode = IN_CAPTION;
- attributes = null; // CPP
- break starttagloop;
- case COLGROUP:
- clearStackBackTo(findLastOrRoot(TreeBuilder.TABLE));
- appendToCurrentNodeAndPushElement(
- elementName,
- attributes);
- mode = IN_COLUMN_GROUP;
- attributes = null; // CPP
- break starttagloop;
- case COL:
- clearStackBackTo(findLastOrRoot(TreeBuilder.TABLE));
- appendToCurrentNodeAndPushElement(
- ElementName.COLGROUP,
- HtmlAttributes.EMPTY_ATTRIBUTES);
- mode = IN_COLUMN_GROUP;
- continue starttagloop;
- case TBODY_OR_THEAD_OR_TFOOT:
- clearStackBackTo(findLastOrRoot(TreeBuilder.TABLE));
- appendToCurrentNodeAndPushElement(
- elementName,
- attributes);
- mode = IN_TABLE_BODY;
- attributes = null; // CPP
- break starttagloop;
- case TR:
- case TD_OR_TH:
- clearStackBackTo(findLastOrRoot(TreeBuilder.TABLE));
- appendToCurrentNodeAndPushElement(
- ElementName.TBODY,
- HtmlAttributes.EMPTY_ATTRIBUTES);
- mode = IN_TABLE_BODY;
- continue starttagloop;
- case TEMPLATE:
- // fall through to IN_HEAD
- break intableloop;
- case TABLE:
- errTableSeenWhileTableOpen();
- eltPos = findLastInTableScope(name);
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- assert fragment || isTemplateContents();
- break starttagloop;
- }
- generateImpliedEndTags();
- if (errorHandler != null && !isCurrent("table")) {
- errNoCheckUnclosedElementsOnStack();
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- resetTheInsertionMode();
- continue starttagloop;
- case SCRIPT:
- // XXX need to manage much more stuff
- // here if
- // supporting
- // document.write()
- appendToCurrentNodeAndPushElement(
- elementName,
- attributes);
- originalMode = mode;
- mode = TEXT;
- tokenizer.setStateAndEndTagExpectation(
- Tokenizer.SCRIPT_DATA, elementName);
- attributes = null; // CPP
- break starttagloop;
- case STYLE:
- appendToCurrentNodeAndPushElement(
- elementName,
- attributes);
- originalMode = mode;
- mode = TEXT;
- tokenizer.setStateAndEndTagExpectation(
- Tokenizer.RAWTEXT, elementName);
- attributes = null; // CPP
- break starttagloop;
- case INPUT:
- errStartTagInTable(name);
- if (!Portability.lowerCaseLiteralEqualsIgnoreAsciiCaseString(
- "hidden",
- attributes.getValue(AttributeName.TYPE))) {
- break intableloop;
- }
- appendVoidElementToCurrent(
- name, attributes,
- formPointer);
- selfClosing = false;
- attributes = null; // CPP
- break starttagloop;
- case FORM:
- if (formPointer != null || isTemplateContents()) {
- errFormWhenFormOpen();
- break starttagloop;
- } else {
- errStartTagInTable(name);
- appendVoidFormToCurrent(attributes);
- attributes = null; // CPP
- break starttagloop;
- }
- default:
- errStartTagInTable(name);
- // fall through to IN_BODY
- break intableloop;
- }
- }
- case IN_CAPTION:
- switch (group) {
- case CAPTION:
- case COL:
- case COLGROUP:
- case TBODY_OR_THEAD_OR_TFOOT:
- case TR:
- case TD_OR_TH:
- errStrayStartTag(name);
- eltPos = findLastInTableScope("caption");
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- break starttagloop;
- }
- generateImpliedEndTags();
- if (errorHandler != null && currentPtr != eltPos) {
- errNoCheckUnclosedElementsOnStack();
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- clearTheListOfActiveFormattingElementsUpToTheLastMarker();
- mode = IN_TABLE;
- continue;
- default:
- // fall through to IN_BODY
- }
- case IN_CELL:
- switch (group) {
- case CAPTION:
- case COL:
- case COLGROUP:
- case TBODY_OR_THEAD_OR_TFOOT:
- case TR:
- case TD_OR_TH:
- eltPos = findLastInTableScopeTdTh();
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- errNoCellToClose();
- break starttagloop;
- } else {
- closeTheCell(eltPos);
- continue;
- }
- default:
- // fall through to IN_BODY
- }
- case FRAMESET_OK:
- switch (group) {
- case FRAMESET:
- if (mode == FRAMESET_OK) {
- if (currentPtr == 0 || stack[1].getGroup() != BODY) {
- assert fragment || isTemplateContents();
- errStrayStartTag(name);
- break starttagloop;
- } else {
- errFramesetStart();
- detachFromParent(stack[1].node);
- while (currentPtr > 0) {
- pop();
- }
- appendToCurrentNodeAndPushElement(
- elementName,
- attributes);
- mode = IN_FRAMESET;
- attributes = null; // CPP
- break starttagloop;
- }
- } else {
- errStrayStartTag(name);
- break starttagloop;
- }
- // NOT falling through!
- case PRE_OR_LISTING:
- case LI:
- case DD_OR_DT:
- case BUTTON:
- case MARQUEE_OR_APPLET:
- case OBJECT:
- case TABLE:
- case AREA_OR_WBR:
- case BR:
- case EMBED:
- case IMG:
- case INPUT:
- case KEYGEN:
- case HR:
- case TEXTAREA:
- case XMP:
- case IFRAME:
- case SELECT:
- if (mode == FRAMESET_OK
- && !(group == INPUT && Portability.lowerCaseLiteralEqualsIgnoreAsciiCaseString(
- "hidden",
- attributes.getValue(AttributeName.TYPE)))) {
- framesetOk = false;
- mode = IN_BODY;
- }
- // fall through to IN_BODY
- default:
- // fall through to IN_BODY
- }
- case IN_BODY:
- inbodyloop: for (;;) {
- switch (group) {
- case HTML:
- errStrayStartTag(name);
- if (!fragment && !isTemplateContents()) {
- addAttributesToHtml(attributes);
- attributes = null; // CPP
- }
- break starttagloop;
- case BASE:
- case LINK_OR_BASEFONT_OR_BGSOUND:
- case META:
- case STYLE:
- case SCRIPT:
- case TITLE:
- case TEMPLATE:
- // Fall through to IN_HEAD
- break inbodyloop;
- case BODY:
- if (currentPtr == 0 || stack[1].getGroup() != BODY || isTemplateContents()) {
- assert fragment || isTemplateContents();
- errStrayStartTag(name);
- break starttagloop;
- }
- errFooSeenWhenFooOpen(name);
- framesetOk = false;
- if (mode == FRAMESET_OK) {
- mode = IN_BODY;
- }
- if (addAttributesToBody(attributes)) {
- attributes = null; // CPP
- }
- break starttagloop;
- case P:
- case DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU:
- case UL_OR_OL_OR_DL:
- case ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY:
- implicitlyCloseP();
- appendToCurrentNodeAndPushElementMayFoster(
- elementName,
- attributes);
- attributes = null; // CPP
- break starttagloop;
- case H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6:
- implicitlyCloseP();
- if (stack[currentPtr].getGroup() == H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6) {
- errHeadingWhenHeadingOpen();
- pop();
- }
- appendToCurrentNodeAndPushElementMayFoster(
- elementName,
- attributes);
- attributes = null; // CPP
- break starttagloop;
- case FIELDSET:
- implicitlyCloseP();
- appendToCurrentNodeAndPushElementMayFoster(
- elementName,
- attributes, formPointer);
- attributes = null; // CPP
- break starttagloop;
- case PRE_OR_LISTING:
- implicitlyCloseP();
- appendToCurrentNodeAndPushElementMayFoster(
- elementName,
- attributes);
- needToDropLF = true;
- attributes = null; // CPP
- break starttagloop;
- case FORM:
- if (formPointer != null && !isTemplateContents()) {
- errFormWhenFormOpen();
- break starttagloop;
- } else {
- implicitlyCloseP();
- appendToCurrentNodeAndPushFormElementMayFoster(attributes);
- attributes = null; // CPP
- break starttagloop;
- }
- case LI:
- case DD_OR_DT:
- eltPos = currentPtr;
- for (;;) {
- StackNode<T> node = stack[eltPos]; // weak
- // ref
- if (node.getGroup() == group) { // LI or
- // DD_OR_DT
- generateImpliedEndTagsExceptFor(node.name);
- if (errorHandler != null
- && eltPos != currentPtr) {
- errUnclosedElementsImplied(eltPos, name);
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- break;
- } else if (eltPos == 0 || (node.isSpecial()
- && (node.ns != "http://www.w3.org/1999/xhtml"
- || (node.name != "p"
- && node.name != "address"
- && node.name != "div")))) {
- break;
- }
- eltPos--;
- }
- implicitlyCloseP();
- appendToCurrentNodeAndPushElementMayFoster(
- elementName,
- attributes);
- attributes = null; // CPP
- break starttagloop;
- case PLAINTEXT:
- implicitlyCloseP();
- appendToCurrentNodeAndPushElementMayFoster(
- elementName,
- attributes);
- tokenizer.setStateAndEndTagExpectation(
- Tokenizer.PLAINTEXT, elementName);
- attributes = null; // CPP
- break starttagloop;
- case A:
- int activeAPos = findInListOfActiveFormattingElementsContainsBetweenEndAndLastMarker("a");
- if (activeAPos != -1) {
- errFooSeenWhenFooOpen(name);
- StackNode<T> activeA = listOfActiveFormattingElements[activeAPos];
- activeA.retain();
- adoptionAgencyEndTag("a");
- removeFromStack(activeA);
- activeAPos = findInListOfActiveFormattingElements(activeA);
- if (activeAPos != -1) {
- removeFromListOfActiveFormattingElements(activeAPos);
- }
- activeA.release();
- }
- reconstructTheActiveFormattingElements();
- appendToCurrentNodeAndPushFormattingElementMayFoster(
- elementName,
- attributes);
- attributes = null; // CPP
- break starttagloop;
- case B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U:
- case FONT:
- reconstructTheActiveFormattingElements();
- maybeForgetEarlierDuplicateFormattingElement(elementName.name, attributes);
- appendToCurrentNodeAndPushFormattingElementMayFoster(
- elementName,
- attributes);
- attributes = null; // CPP
- break starttagloop;
- case NOBR:
- reconstructTheActiveFormattingElements();
- if (TreeBuilder.NOT_FOUND_ON_STACK != findLastInScope("nobr")) {
- errFooSeenWhenFooOpen(name);
- adoptionAgencyEndTag("nobr");
- reconstructTheActiveFormattingElements();
- }
- appendToCurrentNodeAndPushFormattingElementMayFoster(
- elementName,
- attributes);
- attributes = null; // CPP
- break starttagloop;
- case BUTTON:
- eltPos = findLastInScope(name);
- if (eltPos != TreeBuilder.NOT_FOUND_ON_STACK) {
- errFooSeenWhenFooOpen(name);
- generateImpliedEndTags();
- if (errorHandler != null
- && !isCurrent(name)) {
- errUnclosedElementsImplied(eltPos, name);
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- continue starttagloop;
- } else {
- reconstructTheActiveFormattingElements();
- appendToCurrentNodeAndPushElementMayFoster(
- elementName,
- attributes, formPointer);
- attributes = null; // CPP
- break starttagloop;
- }
- case OBJECT:
- reconstructTheActiveFormattingElements();
- appendToCurrentNodeAndPushElementMayFoster(
- elementName,
- attributes, formPointer);
- insertMarker();
- attributes = null; // CPP
- break starttagloop;
- case MARQUEE_OR_APPLET:
- reconstructTheActiveFormattingElements();
- appendToCurrentNodeAndPushElementMayFoster(
- elementName,
- attributes);
- insertMarker();
- attributes = null; // CPP
- break starttagloop;
- case TABLE:
- // The only quirk. Blame Hixie and
- // Acid2.
- if (!quirks) {
- implicitlyCloseP();
- }
- appendToCurrentNodeAndPushElementMayFoster(
- elementName,
- attributes);
- mode = IN_TABLE;
- attributes = null; // CPP
- break starttagloop;
- case BR:
- case EMBED:
- case AREA_OR_WBR:
- reconstructTheActiveFormattingElements();
- // FALL THROUGH to PARAM_OR_SOURCE_OR_TRACK
- // CPPONLY: case MENUITEM:
- case PARAM_OR_SOURCE_OR_TRACK:
- appendVoidElementToCurrentMayFoster(
- elementName,
- attributes);
- selfClosing = false;
- attributes = null; // CPP
- break starttagloop;
- case HR:
- implicitlyCloseP();
- appendVoidElementToCurrentMayFoster(
- elementName,
- attributes);
- selfClosing = false;
- attributes = null; // CPP
- break starttagloop;
- case IMAGE:
- errImage();
- elementName = ElementName.IMG;
- continue starttagloop;
- case IMG:
- case KEYGEN:
- case INPUT:
- reconstructTheActiveFormattingElements();
- appendVoidElementToCurrentMayFoster(
- name, attributes,
- formPointer);
- selfClosing = false;
- attributes = null; // CPP
- break starttagloop;
- case ISINDEX:
- errIsindex();
- if (formPointer != null && !isTemplateContents()) {
- break starttagloop;
- }
- implicitlyCloseP();
- HtmlAttributes formAttrs = new HtmlAttributes(0);
- int actionIndex = attributes.getIndex(AttributeName.ACTION);
- if (actionIndex > -1) {
- formAttrs.addAttribute(
- AttributeName.ACTION,
- attributes.getValueNoBoundsCheck(actionIndex)
- // [NOCPP[
- , XmlViolationPolicy.ALLOW
- // ]NOCPP]
- // CPPONLY: , attributes.getLineNoBoundsCheck(actionIndex)
- );
- }
- appendToCurrentNodeAndPushFormElementMayFoster(formAttrs);
- appendVoidElementToCurrentMayFoster(
- ElementName.HR,
- HtmlAttributes.EMPTY_ATTRIBUTES);
- appendToCurrentNodeAndPushElementMayFoster(
- ElementName.LABEL,
- HtmlAttributes.EMPTY_ATTRIBUTES);
- int promptIndex = attributes.getIndex(AttributeName.PROMPT);
- if (promptIndex > -1) {
- @Auto char[] prompt = Portability.newCharArrayFromString(attributes.getValueNoBoundsCheck(promptIndex));
- appendCharacters(stack[currentPtr].node,
- prompt, 0, prompt.length);
- } else {
- appendIsindexPrompt(stack[currentPtr].node);
- }
- HtmlAttributes inputAttributes = new HtmlAttributes(
- 0);
- inputAttributes.addAttribute(
- AttributeName.NAME,
- Portability.newStringFromLiteral("isindex")
- // [NOCPP[
- , XmlViolationPolicy.ALLOW
- // ]NOCPP]
- // CPPONLY: , tokenizer.getLineNumber()
- );
- for (int i = 0; i < attributes.getLength(); i++) {
- AttributeName attributeQName = attributes.getAttributeNameNoBoundsCheck(i);
- if (AttributeName.NAME == attributeQName
- || AttributeName.PROMPT == attributeQName) {
- attributes.releaseValue(i);
- } else if (AttributeName.ACTION != attributeQName) {
- inputAttributes.addAttribute(
- attributeQName,
- attributes.getValueNoBoundsCheck(i)
- // [NOCPP[
- , XmlViolationPolicy.ALLOW
- // ]NOCPP]
- // CPPONLY: , attributes.getLineNoBoundsCheck(i)
- );
- }
- }
- attributes.clearWithoutReleasingContents();
- appendVoidElementToCurrentMayFoster(
- "input",
- inputAttributes, formPointer);
- pop(); // label
- appendVoidElementToCurrentMayFoster(
- ElementName.HR,
- HtmlAttributes.EMPTY_ATTRIBUTES);
- pop(); // form
-
- if (!isTemplateContents()) {
- formPointer = null;
- }
-
- selfClosing = false;
- // Portability.delete(formAttrs);
- // Portability.delete(inputAttributes);
- // Don't delete attributes, they are deleted
- // later
- break starttagloop;
- case TEXTAREA:
- appendToCurrentNodeAndPushElementMayFoster(
- elementName,
- attributes, formPointer);
- tokenizer.setStateAndEndTagExpectation(
- Tokenizer.RCDATA, elementName);
- originalMode = mode;
- mode = TEXT;
- needToDropLF = true;
- attributes = null; // CPP
- break starttagloop;
- case XMP:
- implicitlyCloseP();
- reconstructTheActiveFormattingElements();
- appendToCurrentNodeAndPushElementMayFoster(
- elementName,
- attributes);
- originalMode = mode;
- mode = TEXT;
- tokenizer.setStateAndEndTagExpectation(
- Tokenizer.RAWTEXT, elementName);
- attributes = null; // CPP
- break starttagloop;
- case NOSCRIPT:
- if (!scriptingEnabled) {
- reconstructTheActiveFormattingElements();
- appendToCurrentNodeAndPushElementMayFoster(
- elementName,
- attributes);
- attributes = null; // CPP
- break starttagloop;
- } else {
- // fall through
- }
- case NOFRAMES:
- case IFRAME:
- case NOEMBED:
- startTagGenericRawText(elementName, attributes);
- attributes = null; // CPP
- break starttagloop;
- case SELECT:
- reconstructTheActiveFormattingElements();
- appendToCurrentNodeAndPushElementMayFoster(
- elementName,
- attributes, formPointer);
- switch (mode) {
- case IN_TABLE:
- case IN_CAPTION:
- case IN_COLUMN_GROUP:
- case IN_TABLE_BODY:
- case IN_ROW:
- case IN_CELL:
- mode = IN_SELECT_IN_TABLE;
- break;
- default:
- mode = IN_SELECT;
- break;
- }
- attributes = null; // CPP
- break starttagloop;
- case OPTGROUP:
- case OPTION:
- if (isCurrent("option")) {
- pop();
- }
- reconstructTheActiveFormattingElements();
- appendToCurrentNodeAndPushElementMayFoster(
- elementName,
- attributes);
- attributes = null; // CPP
- break starttagloop;
- case RB_OR_RTC:
- eltPos = findLastInScope("ruby");
- if (eltPos != NOT_FOUND_ON_STACK) {
- generateImpliedEndTags();
- }
- if (eltPos != currentPtr) {
- if (eltPos == NOT_FOUND_ON_STACK) {
- errStartTagSeenWithoutRuby(name);
- } else {
- errUnclosedChildrenInRuby();
- }
- }
- appendToCurrentNodeAndPushElementMayFoster(
- elementName,
- attributes);
- attributes = null; // CPP
- break starttagloop;
- case RT_OR_RP:
- eltPos = findLastInScope("ruby");
- if (eltPos != NOT_FOUND_ON_STACK) {
- generateImpliedEndTagsExceptFor("rtc");
- }
- if (eltPos != currentPtr) {
- if (!isCurrent("rtc")) {
- if (eltPos == NOT_FOUND_ON_STACK) {
- errStartTagSeenWithoutRuby(name);
- } else {
- errUnclosedChildrenInRuby();
- }
- }
- }
- appendToCurrentNodeAndPushElementMayFoster(
- elementName,
- attributes);
- attributes = null; // CPP
- break starttagloop;
- case MATH:
- reconstructTheActiveFormattingElements();
- attributes.adjustForMath();
- if (selfClosing) {
- appendVoidElementToCurrentMayFosterMathML(
- elementName, attributes);
- selfClosing = false;
- } else {
- appendToCurrentNodeAndPushElementMayFosterMathML(
- elementName, attributes);
- }
- attributes = null; // CPP
- break starttagloop;
- case SVG:
- reconstructTheActiveFormattingElements();
- attributes.adjustForSvg();
- if (selfClosing) {
- appendVoidElementToCurrentMayFosterSVG(
- elementName,
- attributes);
- selfClosing = false;
- } else {
- appendToCurrentNodeAndPushElementMayFosterSVG(
- elementName, attributes);
- }
- attributes = null; // CPP
- break starttagloop;
- case CAPTION:
- case COL:
- case COLGROUP:
- case TBODY_OR_THEAD_OR_TFOOT:
- case TR:
- case TD_OR_TH:
- case FRAME:
- case FRAMESET:
- case HEAD:
- errStrayStartTag(name);
- break starttagloop;
- case OUTPUT:
- reconstructTheActiveFormattingElements();
- appendToCurrentNodeAndPushElementMayFoster(
- elementName,
- attributes, formPointer);
- attributes = null; // CPP
- break starttagloop;
- default:
- reconstructTheActiveFormattingElements();
- appendToCurrentNodeAndPushElementMayFoster(
- elementName,
- attributes);
- attributes = null; // CPP
- break starttagloop;
- }
- }
- case IN_HEAD:
- inheadloop: for (;;) {
- switch (group) {
- case HTML:
- errStrayStartTag(name);
- if (!fragment && !isTemplateContents()) {
- addAttributesToHtml(attributes);
- attributes = null; // CPP
- }
- break starttagloop;
- case BASE:
- case LINK_OR_BASEFONT_OR_BGSOUND:
- appendVoidElementToCurrentMayFoster(
- elementName,
- attributes);
- selfClosing = false;
- attributes = null; // CPP
- break starttagloop;
- case META:
- // Fall through to IN_HEAD_NOSCRIPT
- break inheadloop;
- case TITLE:
- startTagTitleInHead(elementName, attributes);
- attributes = null; // CPP
- break starttagloop;
- case NOSCRIPT:
- if (scriptingEnabled) {
- appendToCurrentNodeAndPushElement(
- elementName,
- attributes);
- originalMode = mode;
- mode = TEXT;
- tokenizer.setStateAndEndTagExpectation(
- Tokenizer.RAWTEXT, elementName);
- } else {
- appendToCurrentNodeAndPushElementMayFoster(
- elementName,
- attributes);
- mode = IN_HEAD_NOSCRIPT;
- }
- attributes = null; // CPP
- break starttagloop;
- case SCRIPT:
- startTagScriptInHead(elementName, attributes);
- attributes = null; // CPP
- break starttagloop;
- case STYLE:
- case NOFRAMES:
- startTagGenericRawText(elementName, attributes);
- attributes = null; // CPP
- break starttagloop;
- case HEAD:
- /* Parse error. */
- errFooSeenWhenFooOpen(name);
- /* Ignore the token. */
- break starttagloop;
- case TEMPLATE:
- startTagTemplateInHead(elementName, attributes);
- attributes = null; // CPP
- break starttagloop;
- default:
- pop();
- mode = AFTER_HEAD;
- continue starttagloop;
- }
- }
- case IN_HEAD_NOSCRIPT:
- switch (group) {
- case HTML:
- // XXX did Hixie really mean to omit "base"
- // here?
- errStrayStartTag(name);
- if (!fragment && !isTemplateContents()) {
- addAttributesToHtml(attributes);
- attributes = null; // CPP
- }
- break starttagloop;
- case LINK_OR_BASEFONT_OR_BGSOUND:
- appendVoidElementToCurrentMayFoster(
- elementName,
- attributes);
- selfClosing = false;
- attributes = null; // CPP
- break starttagloop;
- case META:
- checkMetaCharset(attributes);
- appendVoidElementToCurrentMayFoster(
- elementName,
- attributes);
- selfClosing = false;
- attributes = null; // CPP
- break starttagloop;
- case STYLE:
- case NOFRAMES:
- appendToCurrentNodeAndPushElement(
- elementName,
- attributes);
- originalMode = mode;
- mode = TEXT;
- tokenizer.setStateAndEndTagExpectation(
- Tokenizer.RAWTEXT, elementName);
- attributes = null; // CPP
- break starttagloop;
- case HEAD:
- errFooSeenWhenFooOpen(name);
- break starttagloop;
- case NOSCRIPT:
- errFooSeenWhenFooOpen(name);
- break starttagloop;
- default:
- errBadStartTagInHead(name);
- pop();
- mode = IN_HEAD;
- continue;
- }
- case IN_COLUMN_GROUP:
- switch (group) {
- case HTML:
- errStrayStartTag(name);
- if (!fragment && !isTemplateContents()) {
- addAttributesToHtml(attributes);
- attributes = null; // CPP
- }
- break starttagloop;
- case COL:
- appendVoidElementToCurrentMayFoster(
- elementName,
- attributes);
- selfClosing = false;
- attributes = null; // CPP
- break starttagloop;
- case TEMPLATE:
- startTagTemplateInHead(elementName, attributes);
- attributes = null; // CPP
- break starttagloop;
- default:
- if (currentPtr == 0 || stack[currentPtr].getGroup() == TEMPLATE) {
- assert fragment || isTemplateContents();
- errGarbageInColgroup();
- break starttagloop;
- }
- pop();
- mode = IN_TABLE;
- continue;
- }
- case IN_SELECT_IN_TABLE:
- switch (group) {
- case CAPTION:
- case TBODY_OR_THEAD_OR_TFOOT:
- case TR:
- case TD_OR_TH:
- case TABLE:
- errStartTagWithSelectOpen(name);
- eltPos = findLastInTableScope("select");
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- assert fragment;
- break starttagloop; // http://www.w3.org/Bugs/Public/show_bug.cgi?id=8375
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- resetTheInsertionMode();
- continue;
- default:
- // fall through to IN_SELECT
- }
- case IN_SELECT:
- switch (group) {
- case HTML:
- errStrayStartTag(name);
- if (!fragment) {
- addAttributesToHtml(attributes);
- attributes = null; // CPP
- }
- break starttagloop;
- case OPTION:
- if (isCurrent("option")) {
- pop();
- }
- appendToCurrentNodeAndPushElement(
- elementName,
- attributes);
- attributes = null; // CPP
- break starttagloop;
- case OPTGROUP:
- if (isCurrent("option")) {
- pop();
- }
- if (isCurrent("optgroup")) {
- pop();
- }
- appendToCurrentNodeAndPushElement(
- elementName,
- attributes);
- attributes = null; // CPP
- break starttagloop;
- case SELECT:
- errStartSelectWhereEndSelectExpected();
- eltPos = findLastInTableScope(name);
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- assert fragment;
- errNoSelectInTableScope();
- break starttagloop;
- } else {
- while (currentPtr >= eltPos) {
- pop();
- }
- resetTheInsertionMode();
- break starttagloop;
- }
- case INPUT:
- case TEXTAREA:
- case KEYGEN:
- errStartTagWithSelectOpen(name);
- eltPos = findLastInTableScope("select");
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- assert fragment;
- break starttagloop;
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- resetTheInsertionMode();
- continue;
- case SCRIPT:
- startTagScriptInHead(elementName, attributes);
- attributes = null; // CPP
- break starttagloop;
- case TEMPLATE:
- startTagTemplateInHead(elementName, attributes);
- attributes = null; // CPP
- break starttagloop;
- default:
- errStrayStartTag(name);
- break starttagloop;
- }
- case AFTER_BODY:
- switch (group) {
- case HTML:
- errStrayStartTag(name);
- if (!fragment && !isTemplateContents()) {
- addAttributesToHtml(attributes);
- attributes = null; // CPP
- }
- break starttagloop;
- default:
- errStrayStartTag(name);
- mode = framesetOk ? FRAMESET_OK : IN_BODY;
- continue;
- }
- case IN_FRAMESET:
- switch (group) {
- case FRAMESET:
- appendToCurrentNodeAndPushElement(
- elementName,
- attributes);
- attributes = null; // CPP
- break starttagloop;
- case FRAME:
- appendVoidElementToCurrentMayFoster(
- elementName,
- attributes);
- selfClosing = false;
- attributes = null; // CPP
- break starttagloop;
- default:
- // fall through to AFTER_FRAMESET
- }
- case AFTER_FRAMESET:
- switch (group) {
- case HTML:
- errStrayStartTag(name);
- if (!fragment && !isTemplateContents()) {
- addAttributesToHtml(attributes);
- attributes = null; // CPP
- }
- break starttagloop;
- case NOFRAMES:
- appendToCurrentNodeAndPushElement(
- elementName,
- attributes);
- originalMode = mode;
- mode = TEXT;
- tokenizer.setStateAndEndTagExpectation(
- Tokenizer.RAWTEXT, elementName);
- attributes = null; // CPP
- break starttagloop;
- default:
- errStrayStartTag(name);
- break starttagloop;
- }
- case INITIAL:
- /*
- * Parse error.
- */
- // [NOCPP[
- switch (doctypeExpectation) {
- case AUTO:
- err("Start tag seen without seeing a doctype first. Expected e.g. \u201C<!DOCTYPE html>\u201D.");
- break;
- case HTML:
- // ]NOCPP]
- errStartTagWithoutDoctype();
- // [NOCPP[
- break;
- case HTML401_STRICT:
- err("Start tag seen without seeing a doctype first. Expected \u201C<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\u201D.");
- break;
- case HTML401_TRANSITIONAL:
- err("Start tag seen without seeing a doctype first. Expected \u201C<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\u201D.");
- break;
- case NO_DOCTYPE_ERRORS:
- }
- // ]NOCPP]
- /*
- *
- * Set the document to quirks mode.
- */
- documentModeInternal(DocumentMode.QUIRKS_MODE, null, null,
- false);
- /*
- * Then, switch to the root element mode of the tree
- * construction stage
- */
- mode = BEFORE_HTML;
- /*
- * and reprocess the current token.
- */
- continue;
- case BEFORE_HTML:
- switch (group) {
- case HTML:
- // optimize error check and streaming SAX by
- // hoisting
- // "html" handling here.
- if (attributes == HtmlAttributes.EMPTY_ATTRIBUTES) {
- // This has the right magic side effect
- // that
- // it
- // makes attributes in SAX Tree mutable.
- appendHtmlElementToDocumentAndPush();
- } else {
- appendHtmlElementToDocumentAndPush(attributes);
- }
- // XXX application cache should fire here
- mode = BEFORE_HEAD;
- attributes = null; // CPP
- break starttagloop;
- default:
- /*
- * Create an HTMLElement node with the tag name
- * html, in the HTML namespace. Append it to the
- * Document object.
- */
- appendHtmlElementToDocumentAndPush();
- /* Switch to the main mode */
- mode = BEFORE_HEAD;
- /*
- * reprocess the current token.
- */
- continue;
- }
- case BEFORE_HEAD:
- switch (group) {
- case HTML:
- errStrayStartTag(name);
- if (!fragment && !isTemplateContents()) {
- addAttributesToHtml(attributes);
- attributes = null; // CPP
- }
- break starttagloop;
- case HEAD:
- /*
- * A start tag whose tag name is "head"
- *
- * Create an element for the token.
- *
- * Set the head element pointer to this new element
- * node.
- *
- * Append the new element to the current node and
- * push it onto the stack of open elements.
- */
- appendToCurrentNodeAndPushHeadElement(attributes);
- /*
- * Change the insertion mode to "in head".
- */
- mode = IN_HEAD;
- attributes = null; // CPP
- break starttagloop;
- default:
- /*
- * Any other start tag token
- *
- * Act as if a start tag token with the tag name
- * "head" and no attributes had been seen,
- */
- appendToCurrentNodeAndPushHeadElement(HtmlAttributes.EMPTY_ATTRIBUTES);
- mode = IN_HEAD;
- /*
- * then reprocess the current token.
- *
- * This will result in an empty head element being
- * generated, with the current token being
- * reprocessed in the "after head" insertion mode.
- */
- continue;
- }
- case AFTER_HEAD:
- switch (group) {
- case HTML:
- errStrayStartTag(name);
- if (!fragment && !isTemplateContents()) {
- addAttributesToHtml(attributes);
- attributes = null; // CPP
- }
- break starttagloop;
- case BODY:
- if (attributes.getLength() == 0) {
- // This has the right magic side effect
- // that
- // it
- // makes attributes in SAX Tree mutable.
- appendToCurrentNodeAndPushBodyElement();
- } else {
- appendToCurrentNodeAndPushBodyElement(attributes);
- }
- framesetOk = false;
- mode = IN_BODY;
- attributes = null; // CPP
- break starttagloop;
- case FRAMESET:
- appendToCurrentNodeAndPushElement(
- elementName,
- attributes);
- mode = IN_FRAMESET;
- attributes = null; // CPP
- break starttagloop;
- case TEMPLATE:
- errFooBetweenHeadAndBody(name);
- pushHeadPointerOntoStack();
- StackNode<T> headOnStack = stack[currentPtr];
- startTagTemplateInHead(elementName, attributes);
- removeFromStack(headOnStack);
- attributes = null; // CPP
- break starttagloop;
- case BASE:
- case LINK_OR_BASEFONT_OR_BGSOUND:
- errFooBetweenHeadAndBody(name);
- pushHeadPointerOntoStack();
- appendVoidElementToCurrentMayFoster(
- elementName,
- attributes);
- selfClosing = false;
- pop(); // head
- attributes = null; // CPP
- break starttagloop;
- case META:
- errFooBetweenHeadAndBody(name);
- checkMetaCharset(attributes);
- pushHeadPointerOntoStack();
- appendVoidElementToCurrentMayFoster(
- elementName,
- attributes);
- selfClosing = false;
- pop(); // head
- attributes = null; // CPP
- break starttagloop;
- case SCRIPT:
- errFooBetweenHeadAndBody(name);
- pushHeadPointerOntoStack();
- appendToCurrentNodeAndPushElement(
- elementName,
- attributes);
- originalMode = mode;
- mode = TEXT;
- tokenizer.setStateAndEndTagExpectation(
- Tokenizer.SCRIPT_DATA, elementName);
- attributes = null; // CPP
- break starttagloop;
- case STYLE:
- case NOFRAMES:
- errFooBetweenHeadAndBody(name);
- pushHeadPointerOntoStack();
- appendToCurrentNodeAndPushElement(
- elementName,
- attributes);
- originalMode = mode;
- mode = TEXT;
- tokenizer.setStateAndEndTagExpectation(
- Tokenizer.RAWTEXT, elementName);
- attributes = null; // CPP
- break starttagloop;
- case TITLE:
- errFooBetweenHeadAndBody(name);
- pushHeadPointerOntoStack();
- appendToCurrentNodeAndPushElement(
- elementName,
- attributes);
- originalMode = mode;
- mode = TEXT;
- tokenizer.setStateAndEndTagExpectation(
- Tokenizer.RCDATA, elementName);
- attributes = null; // CPP
- break starttagloop;
- case HEAD:
- errStrayStartTag(name);
- break starttagloop;
- default:
- appendToCurrentNodeAndPushBodyElement();
- mode = FRAMESET_OK;
- continue;
- }
- case AFTER_AFTER_BODY:
- switch (group) {
- case HTML:
- errStrayStartTag(name);
- if (!fragment && !isTemplateContents()) {
- addAttributesToHtml(attributes);
- attributes = null; // CPP
- }
- break starttagloop;
- default:
- errStrayStartTag(name);
- fatal();
- mode = framesetOk ? FRAMESET_OK : IN_BODY;
- continue;
- }
- case AFTER_AFTER_FRAMESET:
- switch (group) {
- case HTML:
- errStrayStartTag(name);
- if (!fragment && !isTemplateContents()) {
- addAttributesToHtml(attributes);
- attributes = null; // CPP
- }
- break starttagloop;
- case NOFRAMES:
- startTagGenericRawText(elementName, attributes);
- attributes = null; // CPP
- break starttagloop;
- default:
- errStrayStartTag(name);
- break starttagloop;
- }
- case TEXT:
- assert false;
- break starttagloop; // Avoid infinite loop if the assertion
- // fails
- }
- }
- if (selfClosing) {
- errSelfClosing();
- }
- // CPPONLY: if (mBuilder == null && attributes != HtmlAttributes.EMPTY_ATTRIBUTES) {
- // CPPONLY: Portability.delete(attributes);
- // CPPONLY: }
- }
-
- private void startTagTitleInHead(ElementName elementName, HtmlAttributes attributes) throws SAXException {
- appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
- originalMode = mode;
- mode = TEXT;
- tokenizer.setStateAndEndTagExpectation(Tokenizer.RCDATA, elementName);
- }
-
- private void startTagGenericRawText(ElementName elementName, HtmlAttributes attributes) throws SAXException {
- appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
- originalMode = mode;
- mode = TEXT;
- tokenizer.setStateAndEndTagExpectation(Tokenizer.RAWTEXT, elementName);
- }
-
- private void startTagScriptInHead(ElementName elementName, HtmlAttributes attributes) throws SAXException {
- // XXX need to manage much more stuff here if supporting document.write()
- appendToCurrentNodeAndPushElementMayFoster(elementName, attributes);
- originalMode = mode;
- mode = TEXT;
- tokenizer.setStateAndEndTagExpectation(Tokenizer.SCRIPT_DATA, elementName);
- }
-
- private void startTagTemplateInHead(ElementName elementName, HtmlAttributes attributes) throws SAXException {
- appendToCurrentNodeAndPushElement(elementName, attributes);
- insertMarker();
- framesetOk = false;
- originalMode = mode;
- mode = IN_TEMPLATE;
- pushTemplateMode(IN_TEMPLATE);
- }
-
- private boolean isTemplateContents() {
- return TreeBuilder.NOT_FOUND_ON_STACK != findLast("template");
- }
-
- private boolean isTemplateModeStackEmpty() {
- return templateModePtr == -1;
- }
-
- private boolean isSpecialParentInForeign(StackNode<T> stackNode) {
- @NsUri String ns = stackNode.ns;
- return ("http://www.w3.org/1999/xhtml" == ns)
- || (stackNode.isHtmlIntegrationPoint())
- || (("http://www.w3.org/1998/Math/MathML" == ns) && (stackNode.getGroup() == MI_MO_MN_MS_MTEXT));
- }
-
- /**
- *
- * <p>
- * C++ memory note: The return value must be released.
- *
- * @return
- * @throws SAXException
- * @throws StopSniffingException
- */
- public static String extractCharsetFromContent(String attributeValue
- // CPPONLY: , TreeBuilder tb
- ) {
- // This is a bit ugly. Converting the string to char array in order to
- // make the portability layer smaller.
- int charsetState = CHARSET_INITIAL;
- int start = -1;
- int end = -1;
- @Auto char[] buffer = Portability.newCharArrayFromString(attributeValue);
-
- charsetloop: for (int i = 0; i < buffer.length; i++) {
- char c = buffer[i];
- switch (charsetState) {
- case CHARSET_INITIAL:
- switch (c) {
- case 'c':
- case 'C':
- charsetState = CHARSET_C;
- continue;
- default:
- continue;
- }
- case CHARSET_C:
- switch (c) {
- case 'h':
- case 'H':
- charsetState = CHARSET_H;
- continue;
- default:
- charsetState = CHARSET_INITIAL;
- continue;
- }
- case CHARSET_H:
- switch (c) {
- case 'a':
- case 'A':
- charsetState = CHARSET_A;
- continue;
- default:
- charsetState = CHARSET_INITIAL;
- continue;
- }
- case CHARSET_A:
- switch (c) {
- case 'r':
- case 'R':
- charsetState = CHARSET_R;
- continue;
- default:
- charsetState = CHARSET_INITIAL;
- continue;
- }
- case CHARSET_R:
- switch (c) {
- case 's':
- case 'S':
- charsetState = CHARSET_S;
- continue;
- default:
- charsetState = CHARSET_INITIAL;
- continue;
- }
- case CHARSET_S:
- switch (c) {
- case 'e':
- case 'E':
- charsetState = CHARSET_E;
- continue;
- default:
- charsetState = CHARSET_INITIAL;
- continue;
- }
- case CHARSET_E:
- switch (c) {
- case 't':
- case 'T':
- charsetState = CHARSET_T;
- continue;
- default:
- charsetState = CHARSET_INITIAL;
- continue;
- }
- case CHARSET_T:
- switch (c) {
- case '\t':
- case '\n':
- case '\u000C':
- case '\r':
- case ' ':
- continue;
- case '=':
- charsetState = CHARSET_EQUALS;
- continue;
- default:
- return null;
- }
- case CHARSET_EQUALS:
- switch (c) {
- case '\t':
- case '\n':
- case '\u000C':
- case '\r':
- case ' ':
- continue;
- case '\'':
- start = i + 1;
- charsetState = CHARSET_SINGLE_QUOTED;
- continue;
- case '\"':
- start = i + 1;
- charsetState = CHARSET_DOUBLE_QUOTED;
- continue;
- default:
- start = i;
- charsetState = CHARSET_UNQUOTED;
- continue;
- }
- case CHARSET_SINGLE_QUOTED:
- switch (c) {
- case '\'':
- end = i;
- break charsetloop;
- default:
- continue;
- }
- case CHARSET_DOUBLE_QUOTED:
- switch (c) {
- case '\"':
- end = i;
- break charsetloop;
- default:
- continue;
- }
- case CHARSET_UNQUOTED:
- switch (c) {
- case '\t':
- case '\n':
- case '\u000C':
- case '\r':
- case ' ':
- case ';':
- end = i;
- break charsetloop;
- default:
- continue;
- }
- }
- }
- String charset = null;
- if (start != -1) {
- if (end == -1) {
- end = buffer.length;
- }
- charset = Portability.newStringFromBuffer(buffer, start, end
- - start
- // CPPONLY: , tb
- );
- }
- return charset;
- }
-
- private void checkMetaCharset(HtmlAttributes attributes)
- throws SAXException {
- String charset = attributes.getValue(AttributeName.CHARSET);
- if (charset != null) {
- if (tokenizer.internalEncodingDeclaration(charset)) {
- requestSuspension();
- return;
- }
- return;
- }
- if (!Portability.lowerCaseLiteralEqualsIgnoreAsciiCaseString(
- "content-type",
- attributes.getValue(AttributeName.HTTP_EQUIV))) {
- return;
- }
- String content = attributes.getValue(AttributeName.CONTENT);
- if (content != null) {
- String extract = TreeBuilder.extractCharsetFromContent(content
- // CPPONLY: , this
- );
- // remember not to return early without releasing the string
- if (extract != null) {
- if (tokenizer.internalEncodingDeclaration(extract)) {
- requestSuspension();
- }
- }
- Portability.releaseString(extract);
- }
- }
-
- public final void endTag(ElementName elementName) throws SAXException {
- flushCharacters();
- needToDropLF = false;
- int eltPos;
- int group = elementName.getGroup();
- @Local String name = elementName.name;
- endtagloop: for (;;) {
- if (isInForeign()) {
- if (stack[currentPtr].name != name) {
- if (currentPtr == 0) {
- errStrayEndTag(name);
- } else {
- errEndTagDidNotMatchCurrentOpenElement(name, stack[currentPtr].popName);
- }
- }
- eltPos = currentPtr;
- for (;;) {
- if (eltPos == 0) {
- assert fragment: "We can get this close to the root of the stack in foreign content only in the fragment case.";
- break endtagloop;
- }
- if (stack[eltPos].name == name) {
- while (currentPtr >= eltPos) {
- pop();
- }
- break endtagloop;
- }
- if (stack[--eltPos].ns == "http://www.w3.org/1999/xhtml") {
- break;
- }
- }
- }
- switch (mode) {
- case IN_TEMPLATE:
- switch (group) {
- case TEMPLATE:
- // fall through to IN_HEAD
- break;
- default:
- errStrayEndTag(name);
- break endtagloop;
- }
- case IN_ROW:
- switch (group) {
- case TR:
- eltPos = findLastOrRoot(TreeBuilder.TR);
- if (eltPos == 0) {
- assert fragment || isTemplateContents();
- errNoTableRowToClose();
- break endtagloop;
- }
- clearStackBackTo(eltPos);
- pop();
- mode = IN_TABLE_BODY;
- break endtagloop;
- case TABLE:
- eltPos = findLastOrRoot(TreeBuilder.TR);
- if (eltPos == 0) {
- assert fragment || isTemplateContents();
- errNoTableRowToClose();
- break endtagloop;
- }
- clearStackBackTo(eltPos);
- pop();
- mode = IN_TABLE_BODY;
- continue;
- case TBODY_OR_THEAD_OR_TFOOT:
- if (findLastInTableScope(name) == TreeBuilder.NOT_FOUND_ON_STACK) {
- errStrayEndTag(name);
- break endtagloop;
- }
- eltPos = findLastOrRoot(TreeBuilder.TR);
- if (eltPos == 0) {
- assert fragment || isTemplateContents();
- errNoTableRowToClose();
- break endtagloop;
- }
- clearStackBackTo(eltPos);
- pop();
- mode = IN_TABLE_BODY;
- continue;
- case BODY:
- case CAPTION:
- case COL:
- case COLGROUP:
- case HTML:
- case TD_OR_TH:
- errStrayEndTag(name);
- break endtagloop;
- default:
- // fall through to IN_TABLE
- }
- case IN_TABLE_BODY:
- switch (group) {
- case TBODY_OR_THEAD_OR_TFOOT:
- eltPos = findLastOrRoot(name);
- if (eltPos == 0) {
- errStrayEndTag(name);
- break endtagloop;
- }
- clearStackBackTo(eltPos);
- pop();
- mode = IN_TABLE;
- break endtagloop;
- case TABLE:
- eltPos = findLastInTableScopeOrRootTemplateTbodyTheadTfoot();
- if (eltPos == 0 || stack[eltPos].getGroup() == TEMPLATE) {
- assert fragment || isTemplateContents();
- errStrayEndTag(name);
- break endtagloop;
- }
- clearStackBackTo(eltPos);
- pop();
- mode = IN_TABLE;
- continue;
- case BODY:
- case CAPTION:
- case COL:
- case COLGROUP:
- case HTML:
- case TD_OR_TH:
- case TR:
- errStrayEndTag(name);
- break endtagloop;
- default:
- // fall through to IN_TABLE
- }
- case IN_TABLE:
- switch (group) {
- case TABLE:
- eltPos = findLast("table");
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- assert fragment || isTemplateContents();
- errStrayEndTag(name);
- break endtagloop;
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- resetTheInsertionMode();
- break endtagloop;
- case BODY:
- case CAPTION:
- case COL:
- case COLGROUP:
- case HTML:
- case TBODY_OR_THEAD_OR_TFOOT:
- case TD_OR_TH:
- case TR:
- errStrayEndTag(name);
- break endtagloop;
- case TEMPLATE:
- // fall through to IN_HEAD
- break;
- default:
- errStrayEndTag(name);
- // fall through to IN_BODY
- }
- case IN_CAPTION:
- switch (group) {
- case CAPTION:
- eltPos = findLastInTableScope("caption");
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- break endtagloop;
- }
- generateImpliedEndTags();
- if (errorHandler != null && currentPtr != eltPos) {
- errUnclosedElements(eltPos, name);
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- clearTheListOfActiveFormattingElementsUpToTheLastMarker();
- mode = IN_TABLE;
- break endtagloop;
- case TABLE:
- errTableClosedWhileCaptionOpen();
- eltPos = findLastInTableScope("caption");
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- break endtagloop;
- }
- generateImpliedEndTags();
- if (errorHandler != null && currentPtr != eltPos) {
- errUnclosedElements(eltPos, name);
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- clearTheListOfActiveFormattingElementsUpToTheLastMarker();
- mode = IN_TABLE;
- continue;
- case BODY:
- case COL:
- case COLGROUP:
- case HTML:
- case TBODY_OR_THEAD_OR_TFOOT:
- case TD_OR_TH:
- case TR:
- errStrayEndTag(name);
- break endtagloop;
- default:
- // fall through to IN_BODY
- }
- case IN_CELL:
- switch (group) {
- case TD_OR_TH:
- eltPos = findLastInTableScope(name);
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- errStrayEndTag(name);
- break endtagloop;
- }
- generateImpliedEndTags();
- if (errorHandler != null && !isCurrent(name)) {
- errUnclosedElements(eltPos, name);
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- clearTheListOfActiveFormattingElementsUpToTheLastMarker();
- mode = IN_ROW;
- break endtagloop;
- case TABLE:
- case TBODY_OR_THEAD_OR_TFOOT:
- case TR:
- if (findLastInTableScope(name) == TreeBuilder.NOT_FOUND_ON_STACK) {
- assert name == "tbody" || name == "tfoot" || name == "thead" || fragment || isTemplateContents();
- errStrayEndTag(name);
- break endtagloop;
- }
- closeTheCell(findLastInTableScopeTdTh());
- continue;
- case BODY:
- case CAPTION:
- case COL:
- case COLGROUP:
- case HTML:
- errStrayEndTag(name);
- break endtagloop;
- default:
- // fall through to IN_BODY
- }
- case FRAMESET_OK:
- case IN_BODY:
- switch (group) {
- case BODY:
- if (!isSecondOnStackBody()) {
- assert fragment || isTemplateContents();
- errStrayEndTag(name);
- break endtagloop;
- }
- assert currentPtr >= 1;
- if (errorHandler != null) {
- uncloseloop1: for (int i = 2; i <= currentPtr; i++) {
- switch (stack[i].getGroup()) {
- case DD_OR_DT:
- case LI:
- case OPTGROUP:
- case OPTION: // is this possible?
- case P:
- case RB_OR_RTC:
- case RT_OR_RP:
- case TD_OR_TH:
- case TBODY_OR_THEAD_OR_TFOOT:
- break;
- default:
- errEndWithUnclosedElements(name);
- break uncloseloop1;
- }
- }
- }
- mode = AFTER_BODY;
- break endtagloop;
- case HTML:
- if (!isSecondOnStackBody()) {
- assert fragment || isTemplateContents();
- errStrayEndTag(name);
- break endtagloop;
- }
- if (errorHandler != null) {
- uncloseloop2: for (int i = 0; i <= currentPtr; i++) {
- switch (stack[i].getGroup()) {
- case DD_OR_DT:
- case LI:
- case P:
- case RB_OR_RTC:
- case RT_OR_RP:
- case TBODY_OR_THEAD_OR_TFOOT:
- case TD_OR_TH:
- case BODY:
- case HTML:
- break;
- default:
- errEndWithUnclosedElements(name);
- break uncloseloop2;
- }
- }
- }
- mode = AFTER_BODY;
- continue;
- case DIV_OR_BLOCKQUOTE_OR_CENTER_OR_MENU:
- case UL_OR_OL_OR_DL:
- case PRE_OR_LISTING:
- case FIELDSET:
- case BUTTON:
- case ADDRESS_OR_ARTICLE_OR_ASIDE_OR_DETAILS_OR_DIR_OR_FIGCAPTION_OR_FIGURE_OR_FOOTER_OR_HEADER_OR_HGROUP_OR_MAIN_OR_NAV_OR_SECTION_OR_SUMMARY:
- eltPos = findLastInScope(name);
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- errStrayEndTag(name);
- } else {
- generateImpliedEndTags();
- if (errorHandler != null && !isCurrent(name)) {
- errUnclosedElements(eltPos, name);
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- }
- break endtagloop;
- case FORM:
- if (!isTemplateContents()) {
- if (formPointer == null) {
- errStrayEndTag(name);
- break endtagloop;
- }
- formPointer = null;
- eltPos = findLastInScope(name);
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- errStrayEndTag(name);
- break endtagloop;
- }
- generateImpliedEndTags();
- if (errorHandler != null && !isCurrent(name)) {
- errUnclosedElements(eltPos, name);
- }
- removeFromStack(eltPos);
- break endtagloop;
- } else {
- eltPos = findLastInScope(name);
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- errStrayEndTag(name);
- break endtagloop;
- }
- generateImpliedEndTags();
- if (errorHandler != null && !isCurrent(name)) {
- errUnclosedElements(eltPos, name);
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- break endtagloop;
- }
- case P:
- eltPos = findLastInButtonScope("p");
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- errNoElementToCloseButEndTagSeen("p");
- // XXX Can the 'in foreign' case happen anymore?
- if (isInForeign()) {
- errHtmlStartTagInForeignContext(name);
- // Check for currentPtr for the fragment
- // case.
- while (currentPtr >= 0 && stack[currentPtr].ns != "http://www.w3.org/1999/xhtml") {
- pop();
- }
- }
- appendVoidElementToCurrentMayFoster(
- elementName,
- HtmlAttributes.EMPTY_ATTRIBUTES);
- break endtagloop;
- }
- generateImpliedEndTagsExceptFor("p");
- assert eltPos != TreeBuilder.NOT_FOUND_ON_STACK;
- if (errorHandler != null && eltPos != currentPtr) {
- errUnclosedElements(eltPos, name);
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- break endtagloop;
- case LI:
- eltPos = findLastInListScope(name);
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- errNoElementToCloseButEndTagSeen(name);
- } else {
- generateImpliedEndTagsExceptFor(name);
- if (errorHandler != null
- && eltPos != currentPtr) {
- errUnclosedElements(eltPos, name);
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- }
- break endtagloop;
- case DD_OR_DT:
- eltPos = findLastInScope(name);
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- errNoElementToCloseButEndTagSeen(name);
- } else {
- generateImpliedEndTagsExceptFor(name);
- if (errorHandler != null
- && eltPos != currentPtr) {
- errUnclosedElements(eltPos, name);
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- }
- break endtagloop;
- case H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6:
- eltPos = findLastInScopeHn();
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- errStrayEndTag(name);
- } else {
- generateImpliedEndTags();
- if (errorHandler != null && !isCurrent(name)) {
- errUnclosedElements(eltPos, name);
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- }
- break endtagloop;
- case OBJECT:
- case MARQUEE_OR_APPLET:
- eltPos = findLastInScope(name);
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- errStrayEndTag(name);
- } else {
- generateImpliedEndTags();
- if (errorHandler != null && !isCurrent(name)) {
- errUnclosedElements(eltPos, name);
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- clearTheListOfActiveFormattingElementsUpToTheLastMarker();
- }
- break endtagloop;
- case BR:
- errEndTagBr();
- if (isInForeign()) {
- // XXX can this happen anymore?
- errHtmlStartTagInForeignContext(name);
- // Check for currentPtr for the fragment
- // case.
- while (currentPtr >= 0 && stack[currentPtr].ns != "http://www.w3.org/1999/xhtml") {
- pop();
- }
- }
- reconstructTheActiveFormattingElements();
- appendVoidElementToCurrentMayFoster(
- elementName,
- HtmlAttributes.EMPTY_ATTRIBUTES);
- break endtagloop;
- case TEMPLATE:
- // fall through to IN_HEAD;
- break;
- case AREA_OR_WBR:
- // CPPONLY: case MENUITEM:
- case PARAM_OR_SOURCE_OR_TRACK:
- case EMBED:
- case IMG:
- case IMAGE:
- case INPUT:
- case KEYGEN: // XXX??
- case HR:
- case ISINDEX:
- case IFRAME:
- case NOEMBED: // XXX???
- case NOFRAMES: // XXX??
- case SELECT:
- case TABLE:
- case TEXTAREA: // XXX??
- errStrayEndTag(name);
- break endtagloop;
- case NOSCRIPT:
- if (scriptingEnabled) {
- errStrayEndTag(name);
- break endtagloop;
- } else {
- // fall through
- }
- case A:
- case B_OR_BIG_OR_CODE_OR_EM_OR_I_OR_S_OR_SMALL_OR_STRIKE_OR_STRONG_OR_TT_OR_U:
- case FONT:
- case NOBR:
- if (adoptionAgencyEndTag(name)) {
- break endtagloop;
- }
- // else handle like any other tag
- default:
- if (isCurrent(name)) {
- pop();
- break endtagloop;
- }
-
- eltPos = currentPtr;
- for (;;) {
- StackNode<T> node = stack[eltPos];
- if (node.ns == "http://www.w3.org/1999/xhtml" && node.name == name) {
- generateImpliedEndTags();
- if (errorHandler != null
- && !isCurrent(name)) {
- errUnclosedElements(eltPos, name);
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- break endtagloop;
- } else if (eltPos == 0 || node.isSpecial()) {
- errStrayEndTag(name);
- break endtagloop;
- }
- eltPos--;
- }
- }
- case IN_HEAD:
- switch (group) {
- case HEAD:
- pop();
- mode = AFTER_HEAD;
- break endtagloop;
- case BR:
- case HTML:
- case BODY:
- pop();
- mode = AFTER_HEAD;
- continue;
- case TEMPLATE:
- endTagTemplateInHead();
- break endtagloop;
- default:
- errStrayEndTag(name);
- break endtagloop;
- }
- case IN_HEAD_NOSCRIPT:
- switch (group) {
- case NOSCRIPT:
- pop();
- mode = IN_HEAD;
- break endtagloop;
- case BR:
- errStrayEndTag(name);
- pop();
- mode = IN_HEAD;
- continue;
- default:
- errStrayEndTag(name);
- break endtagloop;
- }
- case IN_COLUMN_GROUP:
- switch (group) {
- case COLGROUP:
- if (currentPtr == 0 || stack[currentPtr].getGroup() ==
- TreeBuilder.TEMPLATE) {
- assert fragment || isTemplateContents();
- errGarbageInColgroup();
- break endtagloop;
- }
- pop();
- mode = IN_TABLE;
- break endtagloop;
- case COL:
- errStrayEndTag(name);
- break endtagloop;
- case TEMPLATE:
- endTagTemplateInHead();
- break endtagloop;
- default:
- if (currentPtr == 0 || stack[currentPtr].getGroup() ==
- TreeBuilder.TEMPLATE) {
- assert fragment || isTemplateContents();
- errGarbageInColgroup();
- break endtagloop;
- }
- pop();
- mode = IN_TABLE;
- continue;
- }
- case IN_SELECT_IN_TABLE:
- switch (group) {
- case CAPTION:
- case TABLE:
- case TBODY_OR_THEAD_OR_TFOOT:
- case TR:
- case TD_OR_TH:
- errEndTagSeenWithSelectOpen(name);
- if (findLastInTableScope(name) != TreeBuilder.NOT_FOUND_ON_STACK) {
- eltPos = findLastInTableScope("select");
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- assert fragment;
- break endtagloop; // http://www.w3.org/Bugs/Public/show_bug.cgi?id=8375
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- resetTheInsertionMode();
- continue;
- } else {
- break endtagloop;
- }
- default:
- // fall through to IN_SELECT
- }
- case IN_SELECT:
- switch (group) {
- case OPTION:
- if (isCurrent("option")) {
- pop();
- break endtagloop;
- } else {
- errStrayEndTag(name);
- break endtagloop;
- }
- case OPTGROUP:
- if (isCurrent("option")
- && "optgroup" == stack[currentPtr - 1].name) {
- pop();
- }
- if (isCurrent("optgroup")) {
- pop();
- } else {
- errStrayEndTag(name);
- }
- break endtagloop;
- case SELECT:
- eltPos = findLastInTableScope("select");
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- assert fragment;
- errStrayEndTag(name);
- break endtagloop;
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- resetTheInsertionMode();
- break endtagloop;
- case TEMPLATE:
- endTagTemplateInHead();
- break endtagloop;
- default:
- errStrayEndTag(name);
- break endtagloop;
- }
- case AFTER_BODY:
- switch (group) {
- case HTML:
- if (fragment) {
- errStrayEndTag(name);
- break endtagloop;
- } else {
- mode = AFTER_AFTER_BODY;
- break endtagloop;
- }
- default:
- errEndTagAfterBody();
- mode = framesetOk ? FRAMESET_OK : IN_BODY;
- continue;
- }
- case IN_FRAMESET:
- switch (group) {
- case FRAMESET:
- if (currentPtr == 0) {
- assert fragment;
- errStrayEndTag(name);
- break endtagloop;
- }
- pop();
- if ((!fragment) && !isCurrent("frameset")) {
- mode = AFTER_FRAMESET;
- }
- break endtagloop;
- default:
- errStrayEndTag(name);
- break endtagloop;
- }
- case AFTER_FRAMESET:
- switch (group) {
- case HTML:
- mode = AFTER_AFTER_FRAMESET;
- break endtagloop;
- default:
- errStrayEndTag(name);
- break endtagloop;
- }
- case INITIAL:
- /*
- * Parse error.
- */
- // [NOCPP[
- switch (doctypeExpectation) {
- case AUTO:
- err("End tag seen without seeing a doctype first. Expected e.g. \u201C<!DOCTYPE html>\u201D.");
- break;
- case HTML:
- // ]NOCPP]
- errEndTagSeenWithoutDoctype();
- // [NOCPP[
- break;
- case HTML401_STRICT:
- err("End tag seen without seeing a doctype first. Expected \u201C<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\u201D.");
- break;
- case HTML401_TRANSITIONAL:
- err("End tag seen without seeing a doctype first. Expected \u201C<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\u201D.");
- break;
- case NO_DOCTYPE_ERRORS:
- }
- // ]NOCPP]
- /*
- *
- * Set the document to quirks mode.
- */
- documentModeInternal(DocumentMode.QUIRKS_MODE, null, null,
- false);
- /*
- * Then, switch to the root element mode of the tree
- * construction stage
- */
- mode = BEFORE_HTML;
- /*
- * and reprocess the current token.
- */
- continue;
- case BEFORE_HTML:
- switch (group) {
- case HEAD:
- case BR:
- case HTML:
- case BODY:
- /*
- * Create an HTMLElement node with the tag name
- * html, in the HTML namespace. Append it to the
- * Document object.
- */
- appendHtmlElementToDocumentAndPush();
- /* Switch to the main mode */
- mode = BEFORE_HEAD;
- /*
- * reprocess the current token.
- */
- continue;
- default:
- errStrayEndTag(name);
- break endtagloop;
- }
- case BEFORE_HEAD:
- switch (group) {
- case HEAD:
- case BR:
- case HTML:
- case BODY:
- appendToCurrentNodeAndPushHeadElement(HtmlAttributes.EMPTY_ATTRIBUTES);
- mode = IN_HEAD;
- continue;
- default:
- errStrayEndTag(name);
- break endtagloop;
- }
- case AFTER_HEAD:
- switch (group) {
- case TEMPLATE:
- endTagTemplateInHead();
- break endtagloop;
- case HTML:
- case BODY:
- case BR:
- appendToCurrentNodeAndPushBodyElement();
- mode = FRAMESET_OK;
- continue;
- default:
- errStrayEndTag(name);
- break endtagloop;
- }
- case AFTER_AFTER_BODY:
- errStrayEndTag(name);
- mode = framesetOk ? FRAMESET_OK : IN_BODY;
- continue;
- case AFTER_AFTER_FRAMESET:
- errStrayEndTag(name);
- break endtagloop;
- case TEXT:
- // XXX need to manage insertion point here
- pop();
- if (originalMode == AFTER_HEAD) {
- silentPop();
- }
- mode = originalMode;
- break endtagloop;
- }
- } // endtagloop
- }
-
- private void endTagTemplateInHead() throws SAXException {
- int eltPos = findLast("template");
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- errStrayEndTag("template");
- return;
- }
- generateImpliedEndTags();
- if (errorHandler != null && !isCurrent("template")) {
- errUnclosedElements(eltPos, "template");
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- clearTheListOfActiveFormattingElementsUpToTheLastMarker();
- popTemplateMode();
- resetTheInsertionMode();
- }
-
- private int findLastInTableScopeOrRootTemplateTbodyTheadTfoot() {
- for (int i = currentPtr; i > 0; i--) {
- if (stack[i].getGroup() == TreeBuilder.TBODY_OR_THEAD_OR_TFOOT ||
- stack[i].getGroup() == TreeBuilder.TEMPLATE) {
- return i;
- }
- }
- return 0;
- }
-
- private int findLast(@Local String name) {
- for (int i = currentPtr; i > 0; i--) {
- if (stack[i].ns == "http://www.w3.org/1999/xhtml" && stack[i].name == name) {
- return i;
- }
- }
- return TreeBuilder.NOT_FOUND_ON_STACK;
- }
-
- private int findLastInTableScope(@Local String name) {
- for (int i = currentPtr; i > 0; i--) {
- if (stack[i].ns == "http://www.w3.org/1999/xhtml") {
- if (stack[i].name == name) {
- return i;
- } else if (stack[i].name == "table" || stack[i].name == "template") {
- return TreeBuilder.NOT_FOUND_ON_STACK;
- }
- }
- }
- return TreeBuilder.NOT_FOUND_ON_STACK;
- }
-
- private int findLastInButtonScope(@Local String name) {
- for (int i = currentPtr; i > 0; i--) {
- if (stack[i].ns == "http://www.w3.org/1999/xhtml") {
- if (stack[i].name == name) {
- return i;
- } else if (stack[i].name == "button") {
- return TreeBuilder.NOT_FOUND_ON_STACK;
- }
- }
-
- if (stack[i].isScoping()) {
- return TreeBuilder.NOT_FOUND_ON_STACK;
- }
- }
- return TreeBuilder.NOT_FOUND_ON_STACK;
- }
-
- private int findLastInScope(@Local String name) {
- for (int i = currentPtr; i > 0; i--) {
- if (stack[i].ns == "http://www.w3.org/1999/xhtml" && stack[i].name == name) {
- return i;
- } else if (stack[i].isScoping()) {
- return TreeBuilder.NOT_FOUND_ON_STACK;
- }
- }
- return TreeBuilder.NOT_FOUND_ON_STACK;
- }
-
- private int findLastInListScope(@Local String name) {
- for (int i = currentPtr; i > 0; i--) {
- if (stack[i].ns == "http://www.w3.org/1999/xhtml") {
- if (stack[i].name == name) {
- return i;
- } else if (stack[i].name == "ul" || stack[i].name == "ol") {
- return TreeBuilder.NOT_FOUND_ON_STACK;
- }
- }
-
- if (stack[i].isScoping()) {
- return TreeBuilder.NOT_FOUND_ON_STACK;
- }
- }
- return TreeBuilder.NOT_FOUND_ON_STACK;
- }
-
- private int findLastInScopeHn() {
- for (int i = currentPtr; i > 0; i--) {
- if (stack[i].getGroup() == TreeBuilder.H1_OR_H2_OR_H3_OR_H4_OR_H5_OR_H6) {
- return i;
- } else if (stack[i].isScoping()) {
- return TreeBuilder.NOT_FOUND_ON_STACK;
- }
- }
- return TreeBuilder.NOT_FOUND_ON_STACK;
- }
-
- private void generateImpliedEndTagsExceptFor(@Local String name)
- throws SAXException {
- for (;;) {
- StackNode<T> node = stack[currentPtr];
- switch (node.getGroup()) {
- case P:
- case LI:
- case DD_OR_DT:
- case OPTION:
- case OPTGROUP:
- case RB_OR_RTC:
- case RT_OR_RP:
- if (node.ns == "http://www.w3.org/1999/xhtml" && node.name == name) {
- return;
- }
- pop();
- continue;
- default:
- return;
- }
- }
- }
-
- private void generateImpliedEndTags() throws SAXException {
- for (;;) {
- switch (stack[currentPtr].getGroup()) {
- case P:
- case LI:
- case DD_OR_DT:
- case OPTION:
- case OPTGROUP:
- case RB_OR_RTC:
- case RT_OR_RP:
- pop();
- continue;
- default:
- return;
- }
- }
- }
-
- private boolean isSecondOnStackBody() {
- return currentPtr >= 1 && stack[1].getGroup() == TreeBuilder.BODY;
- }
-
- private void documentModeInternal(DocumentMode m, String publicIdentifier,
- String systemIdentifier, boolean html4SpecificAdditionalErrorChecks)
- throws SAXException {
-
- if (isSrcdocDocument) {
- // Srcdoc documents are always rendered in standards mode.
- quirks = false;
- if (documentModeHandler != null) {
- documentModeHandler.documentMode(
- DocumentMode.STANDARDS_MODE
- // [NOCPP[
- , null, null, false
- // ]NOCPP]
- );
- }
- return;
- }
-
- quirks = (m == DocumentMode.QUIRKS_MODE);
- if (documentModeHandler != null) {
- documentModeHandler.documentMode(
- m
- // [NOCPP[
- , publicIdentifier, systemIdentifier,
- html4SpecificAdditionalErrorChecks
- // ]NOCPP]
- );
- }
- // [NOCPP[
- documentMode(m, publicIdentifier, systemIdentifier,
- html4SpecificAdditionalErrorChecks);
- // ]NOCPP]
- }
-
- private boolean isAlmostStandards(String publicIdentifier,
- String systemIdentifier) {
- if (Portability.lowerCaseLiteralEqualsIgnoreAsciiCaseString(
- "-//w3c//dtd xhtml 1.0 transitional//en", publicIdentifier)) {
- return true;
- }
- if (Portability.lowerCaseLiteralEqualsIgnoreAsciiCaseString(
- "-//w3c//dtd xhtml 1.0 frameset//en", publicIdentifier)) {
- return true;
- }
- if (systemIdentifier != null) {
- if (Portability.lowerCaseLiteralEqualsIgnoreAsciiCaseString(
- "-//w3c//dtd html 4.01 transitional//en", publicIdentifier)) {
- return true;
- }
- if (Portability.lowerCaseLiteralEqualsIgnoreAsciiCaseString(
- "-//w3c//dtd html 4.01 frameset//en", publicIdentifier)) {
- return true;
- }
- }
- return false;
- }
-
- private boolean isQuirky(@Local String name, String publicIdentifier,
- String systemIdentifier, boolean forceQuirks) {
- if (forceQuirks) {
- return true;
- }
- if (name != HTML_LOCAL) {
- return true;
- }
- if (publicIdentifier != null) {
- for (int i = 0; i < TreeBuilder.QUIRKY_PUBLIC_IDS.length; i++) {
- if (Portability.lowerCaseLiteralIsPrefixOfIgnoreAsciiCaseString(
- TreeBuilder.QUIRKY_PUBLIC_IDS[i], publicIdentifier)) {
- return true;
- }
- }
- if (Portability.lowerCaseLiteralEqualsIgnoreAsciiCaseString(
- "-//w3o//dtd w3 html strict 3.0//en//", publicIdentifier)
- || Portability.lowerCaseLiteralEqualsIgnoreAsciiCaseString(
- "-/w3c/dtd html 4.0 transitional/en",
- publicIdentifier)
- || Portability.lowerCaseLiteralEqualsIgnoreAsciiCaseString(
- "html", publicIdentifier)) {
- return true;
- }
- }
- if (systemIdentifier == null) {
- if (Portability.lowerCaseLiteralEqualsIgnoreAsciiCaseString(
- "-//w3c//dtd html 4.01 transitional//en", publicIdentifier)) {
- return true;
- } else if (Portability.lowerCaseLiteralEqualsIgnoreAsciiCaseString(
- "-//w3c//dtd html 4.01 frameset//en", publicIdentifier)) {
- return true;
- }
- } else if (Portability.lowerCaseLiteralEqualsIgnoreAsciiCaseString(
- "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd",
- systemIdentifier)) {
- return true;
- }
- return false;
- }
-
- private void closeTheCell(int eltPos) throws SAXException {
- generateImpliedEndTags();
- if (errorHandler != null && eltPos != currentPtr) {
- errUnclosedElementsCell(eltPos);
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- clearTheListOfActiveFormattingElementsUpToTheLastMarker();
- mode = IN_ROW;
- return;
- }
-
- private int findLastInTableScopeTdTh() {
- for (int i = currentPtr; i > 0; i--) {
- @Local String name = stack[i].name;
- if (stack[i].ns == "http://www.w3.org/1999/xhtml") {
- if ("td" == name || "th" == name) {
- return i;
- } else if (name == "table" || name == "template") {
- return TreeBuilder.NOT_FOUND_ON_STACK;
- }
- }
- }
- return TreeBuilder.NOT_FOUND_ON_STACK;
- }
-
- private void clearStackBackTo(int eltPos) throws SAXException {
- int eltGroup = stack[eltPos].getGroup();
- while (currentPtr > eltPos) { // > not >= intentional
- if (stack[currentPtr].ns == "http://www.w3.org/1999/xhtml"
- && stack[currentPtr].getGroup() == TEMPLATE
- && (eltGroup == TABLE || eltGroup == TBODY_OR_THEAD_OR_TFOOT|| eltGroup == TR || eltPos == 0)) {
- return;
- }
- pop();
- }
- }
-
- private void resetTheInsertionMode() {
- StackNode<T> node;
- @Local String name;
- @NsUri String ns;
- for (int i = currentPtr; i >= 0; i--) {
- node = stack[i];
- name = node.name;
- ns = node.ns;
- if (i == 0) {
- if (!(contextNamespace == "http://www.w3.org/1999/xhtml" && (contextName == "td" || contextName == "th"))) {
- if (fragment) {
- // Make sure we are parsing a fragment otherwise the context element doesn't make sense.
- name = contextName;
- ns = contextNamespace;
- }
- } else {
- mode = framesetOk ? FRAMESET_OK : IN_BODY; // XXX from Hixie's email
- return;
- }
- }
- if ("select" == name) {
- int ancestorIndex = i;
- while (ancestorIndex > 0) {
- StackNode<T> ancestor = stack[ancestorIndex--];
- if ("http://www.w3.org/1999/xhtml" == ancestor.ns) {
- if ("template" == ancestor.name) {
- break;
- }
- if ("table" == ancestor.name) {
- mode = IN_SELECT_IN_TABLE;
- return;
- }
- }
- }
- mode = IN_SELECT;
- return;
- } else if ("td" == name || "th" == name) {
- mode = IN_CELL;
- return;
- } else if ("tr" == name) {
- mode = IN_ROW;
- return;
- } else if ("tbody" == name || "thead" == name || "tfoot" == name) {
- mode = IN_TABLE_BODY;
- return;
- } else if ("caption" == name) {
- mode = IN_CAPTION;
- return;
- } else if ("colgroup" == name) {
- mode = IN_COLUMN_GROUP;
- return;
- } else if ("table" == name) {
- mode = IN_TABLE;
- return;
- } else if ("http://www.w3.org/1999/xhtml" != ns) {
- mode = framesetOk ? FRAMESET_OK : IN_BODY;
- return;
- } else if ("template" == name) {
- assert templateModePtr >= 0;
- mode = templateModeStack[templateModePtr];
- return;
- } else if ("head" == name) {
- if (name == contextName) {
- mode = framesetOk ? FRAMESET_OK : IN_BODY; // really
- } else {
- mode = IN_HEAD;
- }
- return;
- } else if ("body" == name) {
- mode = framesetOk ? FRAMESET_OK : IN_BODY;
- return;
- } else if ("frameset" == name) {
- // TODO: Fragment case. Add error reporting.
- mode = IN_FRAMESET;
- return;
- } else if ("html" == name) {
- if (headPointer == null) {
- // TODO: Fragment case. Add error reporting.
- mode = BEFORE_HEAD;
- } else {
- mode = AFTER_HEAD;
- }
- return;
- } else if (i == 0) {
- mode = framesetOk ? FRAMESET_OK : IN_BODY;
- return;
- }
- }
- }
-
- /**
- * @throws SAXException
- *
- */
- private void implicitlyCloseP() throws SAXException {
- int eltPos = findLastInButtonScope("p");
- if (eltPos == TreeBuilder.NOT_FOUND_ON_STACK) {
- return;
- }
- generateImpliedEndTagsExceptFor("p");
- if (errorHandler != null && eltPos != currentPtr) {
- errUnclosedElementsImplied(eltPos, "p");
- }
- while (currentPtr >= eltPos) {
- pop();
- }
- }
-
- private boolean debugOnlyClearLastStackSlot() {
- stack[currentPtr] = null;
- return true;
- }
-
- private boolean debugOnlyClearLastListSlot() {
- listOfActiveFormattingElements[listPtr] = null;
- return true;
- }
-
- private void pushTemplateMode(int mode) {
- templateModePtr++;
- if (templateModePtr == templateModeStack.length) {
- int[] newStack = new int[templateModeStack.length + 64];
- System.arraycopy(templateModeStack, 0, newStack, 0, templateModeStack.length);
- templateModeStack = newStack;
- }
- templateModeStack[templateModePtr] = mode;
- }
-
- @SuppressWarnings("unchecked") private void push(StackNode<T> node) throws SAXException {
- currentPtr++;
- if (currentPtr == stack.length) {
- StackNode<T>[] newStack = new StackNode[stack.length + 64];
- System.arraycopy(stack, 0, newStack, 0, stack.length);
- stack = newStack;
- }
- stack[currentPtr] = node;
- elementPushed(node.ns, node.popName, node.node);
- }
-
- @SuppressWarnings("unchecked") private void silentPush(StackNode<T> node) throws SAXException {
- currentPtr++;
- if (currentPtr == stack.length) {
- StackNode<T>[] newStack = new StackNode[stack.length + 64];
- System.arraycopy(stack, 0, newStack, 0, stack.length);
- stack = newStack;
- }
- stack[currentPtr] = node;
- }
-
- @SuppressWarnings("unchecked") private void append(StackNode<T> node) {
- listPtr++;
- if (listPtr == listOfActiveFormattingElements.length) {
- StackNode<T>[] newList = new StackNode[listOfActiveFormattingElements.length + 64];
- System.arraycopy(listOfActiveFormattingElements, 0, newList, 0,
- listOfActiveFormattingElements.length);
- listOfActiveFormattingElements = newList;
- }
- listOfActiveFormattingElements[listPtr] = node;
- }
-
- @Inline private void insertMarker() {
- append(null);
- }
-
- private void clearTheListOfActiveFormattingElementsUpToTheLastMarker() {
- while (listPtr > -1) {
- if (listOfActiveFormattingElements[listPtr] == null) {
- --listPtr;
- return;
- }
- listOfActiveFormattingElements[listPtr].release();
- --listPtr;
- }
- }
-
- @Inline private boolean isCurrent(@Local String name) {
- return stack[currentPtr].ns == "http://www.w3.org/1999/xhtml" &&
- name == stack[currentPtr].name;
- }
-
- private void removeFromStack(int pos) throws SAXException {
- if (currentPtr == pos) {
- pop();
- } else {
- fatal();
- stack[pos].release();
- System.arraycopy(stack, pos + 1, stack, pos, currentPtr - pos);
- assert debugOnlyClearLastStackSlot();
- currentPtr--;
- }
- }
-
- private void removeFromStack(StackNode<T> node) throws SAXException {
- if (stack[currentPtr] == node) {
- pop();
- } else {
- int pos = currentPtr - 1;
- while (pos >= 0 && stack[pos] != node) {
- pos--;
- }
- if (pos == -1) {
- // dead code?
- return;
- }
- fatal();
- node.release();
- System.arraycopy(stack, pos + 1, stack, pos, currentPtr - pos);
- currentPtr--;
- }
- }
-
- private void removeFromListOfActiveFormattingElements(int pos) {
- assert listOfActiveFormattingElements[pos] != null;
- listOfActiveFormattingElements[pos].release();
- if (pos == listPtr) {
- assert debugOnlyClearLastListSlot();
- listPtr--;
- return;
- }
- assert pos < listPtr;
- System.arraycopy(listOfActiveFormattingElements, pos + 1,
- listOfActiveFormattingElements, pos, listPtr - pos);
- assert debugOnlyClearLastListSlot();
- listPtr--;
- }
-
- /**
- * Adoption agency algorithm.
- *
- * @param name subject as described in the specified algorithm.
- * @return Returns true if the algorithm has completed and there is nothing remaining to
- * be done. Returns false if the algorithm needs to "act as described in the 'any other
- * end tag' entry" as described in the specified algorithm.
- * @throws SAXException
- */
- private boolean adoptionAgencyEndTag(@Local String name) throws SAXException {
- // This check intends to ensure that for properly nested tags, closing tags will match
- // against the stack instead of the listOfActiveFormattingElements.
- if (stack[currentPtr].ns == "http://www.w3.org/1999/xhtml" &&
- stack[currentPtr].name == name &&
- findInListOfActiveFormattingElements(stack[currentPtr]) == -1) {
- // If the current element matches the name but isn't on the list of active
- // formatting elements, then it is possible that the list was mangled by the Noah's Ark
- // clause. In this case, we want to match the end tag against the stack instead of
- // proceeding with the AAA algorithm that may match against the list of
- // active formatting elements (and possibly mangle the tree in unexpected ways).
- pop();
- return true;
- }
-
- // If you crash around here, perhaps some stack node variable claimed to
- // be a weak ref isn't.
- for (int i = 0; i < 8; ++i) {
- int formattingEltListPos = listPtr;
- while (formattingEltListPos > -1) {
- StackNode<T> listNode = listOfActiveFormattingElements[formattingEltListPos]; // weak ref
- if (listNode == null) {
- formattingEltListPos = -1;
- break;
- } else if (listNode.name == name) {
- break;
- }
- formattingEltListPos--;
- }
- if (formattingEltListPos == -1) {
- return false;
- }
- // this *looks* like a weak ref to the list of formatting elements
- StackNode<T> formattingElt = listOfActiveFormattingElements[formattingEltListPos];
- int formattingEltStackPos = currentPtr;
- boolean inScope = true;
- while (formattingEltStackPos > -1) {
- StackNode<T> node = stack[formattingEltStackPos]; // weak ref
- if (node == formattingElt) {
- break;
- } else if (node.isScoping()) {
- inScope = false;
- }
- formattingEltStackPos--;
- }
- if (formattingEltStackPos == -1) {
- errNoElementToCloseButEndTagSeen(name);
- removeFromListOfActiveFormattingElements(formattingEltListPos);
- return true;
- }
- if (!inScope) {
- errNoElementToCloseButEndTagSeen(name);
- return true;
- }
- // stackPos now points to the formatting element and it is in scope
- if (formattingEltStackPos != currentPtr) {
- errEndTagViolatesNestingRules(name);
- }
- int furthestBlockPos = formattingEltStackPos + 1;
- while (furthestBlockPos <= currentPtr) {
- StackNode<T> node = stack[furthestBlockPos]; // weak ref
- assert furthestBlockPos > 0: "How is formattingEltStackPos + 1 not > 0?";
- if (node.isSpecial()) {
- break;
- }
- furthestBlockPos++;
- }
- if (furthestBlockPos > currentPtr) {
- // no furthest block
- while (currentPtr >= formattingEltStackPos) {
- pop();
- }
- removeFromListOfActiveFormattingElements(formattingEltListPos);
- return true;
- }
- StackNode<T> commonAncestor = stack[formattingEltStackPos - 1]; // weak ref
- StackNode<T> furthestBlock = stack[furthestBlockPos]; // weak ref
- // detachFromParent(furthestBlock.node); XXX AAA CHANGE
- int bookmark = formattingEltListPos;
- int nodePos = furthestBlockPos;
- StackNode<T> lastNode = furthestBlock; // weak ref
- int j = 0;
- for (;;) {
- ++j;
- nodePos--;
- if (nodePos == formattingEltStackPos) {
- break;
- }
- StackNode<T> node = stack[nodePos]; // weak ref
- int nodeListPos = findInListOfActiveFormattingElements(node);
-
- if (j > 3 && nodeListPos != -1) {
- removeFromListOfActiveFormattingElements(nodeListPos);
-
- // Adjust the indices into the list to account
- // for the removal of nodeListPos.
- if (nodeListPos <= formattingEltListPos) {
- formattingEltListPos--;
- }
- if (nodeListPos <= bookmark) {
- bookmark--;
- }
-
- // Update position to reflect removal from list.
- nodeListPos = -1;
- }
-
- if (nodeListPos == -1) {
- assert formattingEltStackPos < nodePos;
- assert bookmark < nodePos;
- assert furthestBlockPos > nodePos;
- removeFromStack(nodePos); // node is now a bad pointer in C++
- furthestBlockPos--;
- continue;
- }
- // now node is both on stack and in the list
- if (nodePos == furthestBlockPos) {
- bookmark = nodeListPos + 1;
- }
- // if (hasChildren(node.node)) { XXX AAA CHANGE
- assert node == listOfActiveFormattingElements[nodeListPos];
- assert node == stack[nodePos];
- T clone = createElement("http://www.w3.org/1999/xhtml",
- node.name, node.attributes.cloneAttributes(null), commonAncestor.node);
- StackNode<T> newNode = new StackNode<T>(node.getFlags(), node.ns,
- node.name, clone, node.popName, node.attributes
- // [NOCPP[
- , node.getLocator()
- // ]NOCPP]
- ); // creation ownership goes to stack
- node.dropAttributes(); // adopt ownership to newNode
- stack[nodePos] = newNode;
- newNode.retain(); // retain for list
- listOfActiveFormattingElements[nodeListPos] = newNode;
- node.release(); // release from stack
- node.release(); // release from list
- node = newNode;
- // } XXX AAA CHANGE
- detachFromParent(lastNode.node);
- appendElement(lastNode.node, node.node);
- lastNode = node;
- }
- if (commonAncestor.isFosterParenting()) {
- fatal();
- detachFromParent(lastNode.node);
- insertIntoFosterParent(lastNode.node);
- } else {
- detachFromParent(lastNode.node);
- appendElement(lastNode.node, commonAncestor.node);
- }
- T clone = createElement("http://www.w3.org/1999/xhtml",
- formattingElt.name,
- formattingElt.attributes.cloneAttributes(null), furthestBlock.node);
- StackNode<T> formattingClone = new StackNode<T>(
- formattingElt.getFlags(), formattingElt.ns,
- formattingElt.name, clone, formattingElt.popName,
- formattingElt.attributes
- // [NOCPP[
- , errorHandler == null ? null : new TaintableLocatorImpl(tokenizer)
- // ]NOCPP]
- ); // Ownership transfers to stack below
- formattingElt.dropAttributes(); // transfer ownership to
- // formattingClone
- appendChildrenToNewParent(furthestBlock.node, clone);
- appendElement(clone, furthestBlock.node);
- removeFromListOfActiveFormattingElements(formattingEltListPos);
- insertIntoListOfActiveFormattingElements(formattingClone, bookmark);
- assert formattingEltStackPos < furthestBlockPos;
- removeFromStack(formattingEltStackPos);
- // furthestBlockPos is now off by one and points to the slot after
- // it
- insertIntoStack(formattingClone, furthestBlockPos);
- }
- return true;
- }
-
- private void insertIntoStack(StackNode<T> node, int position)
- throws SAXException {
- assert currentPtr + 1 < stack.length;
- assert position <= currentPtr + 1;
- if (position == currentPtr + 1) {
- push(node);
- } else {
- System.arraycopy(stack, position, stack, position + 1,
- (currentPtr - position) + 1);
- currentPtr++;
- stack[position] = node;
- }
- }
-
- private void insertIntoListOfActiveFormattingElements(
- StackNode<T> formattingClone, int bookmark) {
- formattingClone.retain();
- assert listPtr + 1 < listOfActiveFormattingElements.length;
- if (bookmark <= listPtr) {
- System.arraycopy(listOfActiveFormattingElements, bookmark,
- listOfActiveFormattingElements, bookmark + 1,
- (listPtr - bookmark) + 1);
- }
- listPtr++;
- listOfActiveFormattingElements[bookmark] = formattingClone;
- }
-
- private int findInListOfActiveFormattingElements(StackNode<T> node) {
- for (int i = listPtr; i >= 0; i--) {
- if (node == listOfActiveFormattingElements[i]) {
- return i;
- }
- }
- return -1;
- }
-
- private int findInListOfActiveFormattingElementsContainsBetweenEndAndLastMarker(
- @Local String name) {
- for (int i = listPtr; i >= 0; i--) {
- StackNode<T> node = listOfActiveFormattingElements[i];
- if (node == null) {
- return -1;
- } else if (node.name == name) {
- return i;
- }
- }
- return -1;
- }
-
-
- private void maybeForgetEarlierDuplicateFormattingElement(
- @Local String name, HtmlAttributes attributes) throws SAXException {
- int candidate = -1;
- int count = 0;
- for (int i = listPtr; i >= 0; i--) {
- StackNode<T> node = listOfActiveFormattingElements[i];
- if (node == null) {
- break;
- }
- if (node.name == name && node.attributes.equalsAnother(attributes)) {
- candidate = i;
- ++count;
- }
- }
- if (count >= 3) {
- removeFromListOfActiveFormattingElements(candidate);
- }
- }
-
- private int findLastOrRoot(@Local String name) {
- for (int i = currentPtr; i > 0; i--) {
- if (stack[i].ns == "http://www.w3.org/1999/xhtml" && stack[i].name == name) {
- return i;
- }
- }
- return 0;
- }
-
- private int findLastOrRoot(int group) {
- for (int i = currentPtr; i > 0; i--) {
- if (stack[i].getGroup() == group) {
- return i;
- }
- }
- return 0;
- }
-
- /**
- * Attempt to add attribute to the body element.
- * @param attributes the attributes
- * @return <code>true</code> iff the attributes were added
- * @throws SAXException
- */
- private boolean addAttributesToBody(HtmlAttributes attributes)
- throws SAXException {
- // [NOCPP[
- checkAttributes(attributes, "http://www.w3.org/1999/xhtml");
- // ]NOCPP]
- if (currentPtr >= 1) {
- StackNode<T> body = stack[1];
- if (body.getGroup() == TreeBuilder.BODY) {
- addAttributesToElement(body.node, attributes);
- return true;
- }
- }
- return false;
- }
-
- private void addAttributesToHtml(HtmlAttributes attributes)
- throws SAXException {
- // [NOCPP[
- checkAttributes(attributes, "http://www.w3.org/1999/xhtml");
- // ]NOCPP]
- addAttributesToElement(stack[0].node, attributes);
- }
-
- private void pushHeadPointerOntoStack() throws SAXException {
- assert headPointer != null;
- assert mode == AFTER_HEAD;
- fatal();
- silentPush(new StackNode<T>(ElementName.HEAD, headPointer
- // [NOCPP[
- , errorHandler == null ? null : new TaintableLocatorImpl(tokenizer)
- // ]NOCPP]
- ));
- }
-
- /**
- * @throws SAXException
- *
- */
- private void reconstructTheActiveFormattingElements() throws SAXException {
- if (listPtr == -1) {
- return;
- }
- StackNode<T> mostRecent = listOfActiveFormattingElements[listPtr];
- if (mostRecent == null || isInStack(mostRecent)) {
- return;
- }
- int entryPos = listPtr;
- for (;;) {
- entryPos--;
- if (entryPos == -1) {
- break;
- }
- if (listOfActiveFormattingElements[entryPos] == null) {
- break;
- }
- if (isInStack(listOfActiveFormattingElements[entryPos])) {
- break;
- }
- }
- while (entryPos < listPtr) {
- entryPos++;
- StackNode<T> entry = listOfActiveFormattingElements[entryPos];
- StackNode<T> currentNode = stack[currentPtr];
-
- T clone;
- if (currentNode.isFosterParenting()) {
- clone = createAndInsertFosterParentedElement("http://www.w3.org/1999/xhtml", entry.name,
- entry.attributes.cloneAttributes(null));
- } else {
- clone = createElement("http://www.w3.org/1999/xhtml", entry.name,
- entry.attributes.cloneAttributes(null), currentNode.node);
- appendElement(clone, currentNode.node);
- }
-
- StackNode<T> entryClone = new StackNode<T>(entry.getFlags(),
- entry.ns, entry.name, clone, entry.popName,
- entry.attributes
- // [NOCPP[
- , entry.getLocator()
- // ]NOCPP]
- );
-
- entry.dropAttributes(); // transfer ownership to entryClone
-
- push(entryClone);
- // stack takes ownership of the local variable
- listOfActiveFormattingElements[entryPos] = entryClone;
- // overwriting the old entry on the list, so release & retain
- entry.release();
- entryClone.retain();
- }
- }
-
- private void insertIntoFosterParent(T child) throws SAXException {
- int tablePos = findLastOrRoot(TreeBuilder.TABLE);
- int templatePos = findLastOrRoot(TreeBuilder.TEMPLATE);
-
- if (templatePos >= tablePos) {
- appendElement(child, stack[templatePos].node);
- return;
- }
-
- StackNode<T> node = stack[tablePos];
- insertFosterParentedChild(child, node.node, stack[tablePos - 1].node);
- }
-
- private T createAndInsertFosterParentedElement(@NsUri String ns, @Local String name,
- HtmlAttributes attributes) throws SAXException {
- return createAndInsertFosterParentedElement(ns, name, attributes, null);
- }
-
- private T createAndInsertFosterParentedElement(@NsUri String ns, @Local String name,
- HtmlAttributes attributes, T form) throws SAXException {
- int tablePos = findLastOrRoot(TreeBuilder.TABLE);
- int templatePos = findLastOrRoot(TreeBuilder.TEMPLATE);
-
- if (templatePos >= tablePos) {
- T child = createElement(ns, name, attributes, form, stack[templatePos].node);
- appendElement(child, stack[templatePos].node);
- return child;
- }
-
- StackNode<T> node = stack[tablePos];
- return createAndInsertFosterParentedElement(ns, name, attributes, form, node.node, stack[tablePos - 1].node);
- }
-
- private boolean isInStack(StackNode<T> node) {
- for (int i = currentPtr; i >= 0; i--) {
- if (stack[i] == node) {
- return true;
- }
- }
- return false;
- }
-
- private void popTemplateMode() {
- templateModePtr--;
- }
-
- private void pop() throws SAXException {
- StackNode<T> node = stack[currentPtr];
- assert debugOnlyClearLastStackSlot();
- currentPtr--;
- elementPopped(node.ns, node.popName, node.node);
- node.release();
- }
-
- private void silentPop() throws SAXException {
- StackNode<T> node = stack[currentPtr];
- assert debugOnlyClearLastStackSlot();
- currentPtr--;
- node.release();
- }
-
- private void popOnEof() throws SAXException {
- StackNode<T> node = stack[currentPtr];
- assert debugOnlyClearLastStackSlot();
- currentPtr--;
- markMalformedIfScript(node.node);
- elementPopped(node.ns, node.popName, node.node);
- node.release();
- }
-
- // [NOCPP[
- private void checkAttributes(HtmlAttributes attributes, @NsUri String ns)
- throws SAXException {
- if (errorHandler != null) {
- int len = attributes.getXmlnsLength();
- for (int i = 0; i < len; i++) {
- AttributeName name = attributes.getXmlnsAttributeName(i);
- if (name == AttributeName.XMLNS) {
- if (html4) {
- err("Attribute \u201Cxmlns\u201D not allowed here. (HTML4-only error.)");
- } else {
- String xmlns = attributes.getXmlnsValue(i);
- if (!ns.equals(xmlns)) {
- err("Bad value \u201C"
- + xmlns
- + "\u201D for the attribute \u201Cxmlns\u201D (only \u201C"
- + ns + "\u201D permitted here).");
- switch (namePolicy) {
- case ALTER_INFOSET:
- // fall through
- case ALLOW:
- warn("Attribute \u201Cxmlns\u201D is not serializable as XML 1.0.");
- break;
- case FATAL:
- fatal("Attribute \u201Cxmlns\u201D is not serializable as XML 1.0.");
- break;
- }
- }
- }
- } else if (ns != "http://www.w3.org/1999/xhtml"
- && name == AttributeName.XMLNS_XLINK) {
- String xmlns = attributes.getXmlnsValue(i);
- if (!"http://www.w3.org/1999/xlink".equals(xmlns)) {
- err("Bad value \u201C"
- + xmlns
- + "\u201D for the attribute \u201Cxmlns:link\u201D (only \u201Chttp://www.w3.org/1999/xlink\u201D permitted here).");
- switch (namePolicy) {
- case ALTER_INFOSET:
- // fall through
- case ALLOW:
- warn("Attribute \u201Cxmlns:xlink\u201D with a value other than \u201Chttp://www.w3.org/1999/xlink\u201D is not serializable as XML 1.0 without changing document semantics.");
- break;
- case FATAL:
- fatal("Attribute \u201Cxmlns:xlink\u201D with a value other than \u201Chttp://www.w3.org/1999/xlink\u201D is not serializable as XML 1.0 without changing document semantics.");
- break;
- }
- }
- } else {
- err("Attribute \u201C" + attributes.getXmlnsLocalName(i)
- + "\u201D not allowed here.");
- switch (namePolicy) {
- case ALTER_INFOSET:
- // fall through
- case ALLOW:
- warn("Attribute with the local name \u201C"
- + attributes.getXmlnsLocalName(i)
- + "\u201D is not serializable as XML 1.0.");
- break;
- case FATAL:
- fatal("Attribute with the local name \u201C"
- + attributes.getXmlnsLocalName(i)
- + "\u201D is not serializable as XML 1.0.");
- break;
- }
- }
- }
- }
- attributes.processNonNcNames(this, namePolicy);
- }
-
- private String checkPopName(@Local String name) throws SAXException {
- if (NCName.isNCName(name)) {
- return name;
- } else {
- switch (namePolicy) {
- case ALLOW:
- warn("Element name \u201C" + name
- + "\u201D cannot be represented as XML 1.0.");
- return name;
- case ALTER_INFOSET:
- warn("Element name \u201C" + name
- + "\u201D cannot be represented as XML 1.0.");
- return NCName.escapeName(name);
- case FATAL:
- fatal("Element name \u201C" + name
- + "\u201D cannot be represented as XML 1.0.");
- }
- }
- return null; // keep compiler happy
- }
-
- // ]NOCPP]
-
- private void appendHtmlElementToDocumentAndPush(HtmlAttributes attributes)
- throws SAXException {
- // [NOCPP[
- checkAttributes(attributes, "http://www.w3.org/1999/xhtml");
- // ]NOCPP]
- T elt = createHtmlElementSetAsRoot(attributes);
- StackNode<T> node = new StackNode<T>(ElementName.HTML,
- elt
- // [NOCPP[
- , errorHandler == null ? null : new TaintableLocatorImpl(tokenizer)
- // ]NOCPP]
- );
- push(node);
- }
-
- private void appendHtmlElementToDocumentAndPush() throws SAXException {
- appendHtmlElementToDocumentAndPush(tokenizer.emptyAttributes());
- }
-
- private void appendToCurrentNodeAndPushHeadElement(HtmlAttributes attributes)
- throws SAXException {
- // [NOCPP[
- checkAttributes(attributes, "http://www.w3.org/1999/xhtml");
- // ]NOCPP]
- T currentNode = stack[currentPtr].node;
- T elt = createElement("http://www.w3.org/1999/xhtml", "head", attributes, currentNode);
- appendElement(elt, currentNode);
- headPointer = elt;
- StackNode<T> node = new StackNode<T>(ElementName.HEAD,
- elt
- // [NOCPP[
- , errorHandler == null ? null : new TaintableLocatorImpl(tokenizer)
- // ]NOCPP]
- );
- push(node);
- }
-
- private void appendToCurrentNodeAndPushBodyElement(HtmlAttributes attributes)
- throws SAXException {
- appendToCurrentNodeAndPushElement(ElementName.BODY,
- attributes);
- }
-
- private void appendToCurrentNodeAndPushBodyElement() throws SAXException {
- appendToCurrentNodeAndPushBodyElement(tokenizer.emptyAttributes());
- }
-
- private void appendToCurrentNodeAndPushFormElementMayFoster(
- HtmlAttributes attributes) throws SAXException {
- // [NOCPP[
- checkAttributes(attributes, "http://www.w3.org/1999/xhtml");
- // ]NOCPP]
-
- T elt;
- StackNode<T> current = stack[currentPtr];
- if (current.isFosterParenting()) {
- fatal();
- elt = createAndInsertFosterParentedElement("http://www.w3.org/1999/xhtml", "form", attributes);
- } else {
- elt = createElement("http://www.w3.org/1999/xhtml", "form", attributes, current.node);
- appendElement(elt, current.node);
- }
-
- if (!isTemplateContents()) {
- formPointer = elt;
- }
-
- StackNode<T> node = new StackNode<T>(ElementName.FORM,
- elt
- // [NOCPP[
- , errorHandler == null ? null : new TaintableLocatorImpl(tokenizer)
- // ]NOCPP]
- );
- push(node);
- }
-
- private void appendToCurrentNodeAndPushFormattingElementMayFoster(
- ElementName elementName, HtmlAttributes attributes)
- throws SAXException {
- // [NOCPP[
- checkAttributes(attributes, "http://www.w3.org/1999/xhtml");
- // ]NOCPP]
- // This method can't be called for custom elements
- HtmlAttributes clone = attributes.cloneAttributes(null);
- // Attributes must not be read after calling createElement, because
- // createElement may delete attributes in C++.
- T elt;
- StackNode<T> current = stack[currentPtr];
- if (current.isFosterParenting()) {
- fatal();
- elt = createAndInsertFosterParentedElement("http://www.w3.org/1999/xhtml", elementName.name, attributes);
- } else {
- elt = createElement("http://www.w3.org/1999/xhtml", elementName.name, attributes, current.node);
- appendElement(elt, current.node);
- }
- StackNode<T> node = new StackNode<T>(elementName, elt, clone
- // [NOCPP[
- , errorHandler == null ? null : new TaintableLocatorImpl(tokenizer)
- // ]NOCPP]
- );
- push(node);
- append(node);
- node.retain(); // append doesn't retain itself
- }
-
- private void appendToCurrentNodeAndPushElement(ElementName elementName,
- HtmlAttributes attributes)
- throws SAXException {
- // [NOCPP[
- checkAttributes(attributes, "http://www.w3.org/1999/xhtml");
- // ]NOCPP]
- // This method can't be called for custom elements
- T currentNode = stack[currentPtr].node;
- T elt = createElement("http://www.w3.org/1999/xhtml", elementName.name, attributes, currentNode);
- appendElement(elt, currentNode);
- if (ElementName.TEMPLATE == elementName) {
- elt = getDocumentFragmentForTemplate(elt);
- }
- StackNode<T> node = new StackNode<T>(elementName, elt
- // [NOCPP[
- , errorHandler == null ? null : new TaintableLocatorImpl(tokenizer)
- // ]NOCPP]
- );
- push(node);
- }
-
- private void appendToCurrentNodeAndPushElementMayFoster(ElementName elementName,
- HtmlAttributes attributes)
- throws SAXException {
- @Local String popName = elementName.name;
- // [NOCPP[
- checkAttributes(attributes, "http://www.w3.org/1999/xhtml");
- if (elementName.isCustom()) {
- popName = checkPopName(popName);
- }
- // ]NOCPP]
- T elt;
- StackNode<T> current = stack[currentPtr];
- if (current.isFosterParenting()) {
- fatal();
- elt = createAndInsertFosterParentedElement("http://www.w3.org/1999/xhtml", popName, attributes);
- } else {
- elt = createElement("http://www.w3.org/1999/xhtml", popName, attributes, current.node);
- appendElement(elt, current.node);
- }
- StackNode<T> node = new StackNode<T>(elementName, elt, popName
- // [NOCPP[
- , errorHandler == null ? null : new TaintableLocatorImpl(tokenizer)
- // ]NOCPP]
- );
- push(node);
- }
-
- private void appendToCurrentNodeAndPushElementMayFosterMathML(
- ElementName elementName, HtmlAttributes attributes)
- throws SAXException {
- @Local String popName = elementName.name;
- // [NOCPP[
- checkAttributes(attributes, "http://www.w3.org/1998/Math/MathML");
- if (elementName.isCustom()) {
- popName = checkPopName(popName);
- }
- // ]NOCPP]
- boolean markAsHtmlIntegrationPoint = false;
- if (ElementName.ANNOTATION_XML == elementName
- && annotationXmlEncodingPermitsHtml(attributes)) {
- markAsHtmlIntegrationPoint = true;
- }
- // Attributes must not be read after calling createElement(), since
- // createElement may delete the object in C++.
- T elt;
- StackNode<T> current = stack[currentPtr];
- if (current.isFosterParenting()) {
- fatal();
- elt = createAndInsertFosterParentedElement("http://www.w3.org/1998/Math/MathML", popName, attributes);
- } else {
- elt = createElement("http://www.w3.org/1998/Math/MathML", popName, attributes, current.node);
- appendElement(elt, current.node);
- }
- StackNode<T> node = new StackNode<T>(elementName, elt, popName,
- markAsHtmlIntegrationPoint
- // [NOCPP[
- , errorHandler == null ? null : new TaintableLocatorImpl(tokenizer)
- // ]NOCPP]
- );
- push(node);
- }
-
- // [NOCPP[
- T getDocumentFragmentForTemplate(T template) {
- return template;
- }
-
- T getFormPointerForContext(T context) {
- return null;
- }
- // ]NOCPP]
-
- private boolean annotationXmlEncodingPermitsHtml(HtmlAttributes attributes) {
- String encoding = attributes.getValue(AttributeName.ENCODING);
- if (encoding == null) {
- return false;
- }
- return Portability.lowerCaseLiteralEqualsIgnoreAsciiCaseString(
- "application/xhtml+xml", encoding)
- || Portability.lowerCaseLiteralEqualsIgnoreAsciiCaseString(
- "text/html", encoding);
- }
-
- private void appendToCurrentNodeAndPushElementMayFosterSVG(
- ElementName elementName, HtmlAttributes attributes)
- throws SAXException {
- @Local String popName = elementName.camelCaseName;
- // [NOCPP[
- checkAttributes(attributes, "http://www.w3.org/2000/svg");
- if (elementName.isCustom()) {
- popName = checkPopName(popName);
- }
- // ]NOCPP]
- T elt;
- StackNode<T> current = stack[currentPtr];
- if (current.isFosterParenting()) {
- fatal();
- elt = createAndInsertFosterParentedElement("http://www.w3.org/2000/svg", popName, attributes);
- } else {
- elt = createElement("http://www.w3.org/2000/svg", popName, attributes, current.node);
- appendElement(elt, current.node);
- }
- StackNode<T> node = new StackNode<T>(elementName, popName, elt
- // [NOCPP[
- , errorHandler == null ? null : new TaintableLocatorImpl(tokenizer)
- // ]NOCPP]
- );
- push(node);
- }
-
- private void appendToCurrentNodeAndPushElementMayFoster(ElementName elementName,
- HtmlAttributes attributes, T form)
- throws SAXException {
- // [NOCPP[
- checkAttributes(attributes, "http://www.w3.org/1999/xhtml");
- // ]NOCPP]
- // Can't be called for custom elements
- T elt;
- T formOwner = form == null || fragment || isTemplateContents() ? null : form;
- StackNode<T> current = stack[currentPtr];
- if (current.isFosterParenting()) {
- fatal();
- elt = createAndInsertFosterParentedElement("http://www.w3.org/1999/xhtml", elementName.name,
- attributes, formOwner);
- } else {
- elt = createElement("http://www.w3.org/1999/xhtml", elementName.name,
- attributes, formOwner, current.node);
- appendElement(elt, current.node);
- }
- StackNode<T> node = new StackNode<T>(elementName, elt
- // [NOCPP[
- , errorHandler == null ? null : new TaintableLocatorImpl(tokenizer)
- // ]NOCPP]
- );
- push(node);
- }
-
- private void appendVoidElementToCurrentMayFoster(
- @Local String name, HtmlAttributes attributes, T form) throws SAXException {
- // [NOCPP[
- checkAttributes(attributes, "http://www.w3.org/1999/xhtml");
- // ]NOCPP]
- // Can't be called for custom elements
- T elt;
- T formOwner = form == null || fragment || isTemplateContents() ? null : form;
- StackNode<T> current = stack[currentPtr];
- if (current.isFosterParenting()) {
- fatal();
- elt = createAndInsertFosterParentedElement("http://www.w3.org/1999/xhtml", name,
- attributes, formOwner);
- } else {
- elt = createElement("http://www.w3.org/1999/xhtml", name,
- attributes, formOwner, current.node);
- appendElement(elt, current.node);
- }
- elementPushed("http://www.w3.org/1999/xhtml", name, elt);
- elementPopped("http://www.w3.org/1999/xhtml", name, elt);
- }
-
- private void appendVoidElementToCurrentMayFoster(
- ElementName elementName, HtmlAttributes attributes)
- throws SAXException {
- @Local String popName = elementName.name;
- // [NOCPP[
- checkAttributes(attributes, "http://www.w3.org/1999/xhtml");
- if (elementName.isCustom()) {
- popName = checkPopName(popName);
- }
- // ]NOCPP]
- T elt;
- StackNode<T> current = stack[currentPtr];
- if (current.isFosterParenting()) {
- fatal();
- elt = createAndInsertFosterParentedElement("http://www.w3.org/1999/xhtml", popName, attributes);
- } else {
- elt = createElement("http://www.w3.org/1999/xhtml", popName, attributes, current.node);
- appendElement(elt, current.node);
- }
- elementPushed("http://www.w3.org/1999/xhtml", popName, elt);
- elementPopped("http://www.w3.org/1999/xhtml", popName, elt);
- }
-
- private void appendVoidElementToCurrentMayFosterSVG(
- ElementName elementName, HtmlAttributes attributes)
- throws SAXException {
- @Local String popName = elementName.camelCaseName;
- // [NOCPP[
- checkAttributes(attributes, "http://www.w3.org/2000/svg");
- if (elementName.isCustom()) {
- popName = checkPopName(popName);
- }
- // ]NOCPP]
- T elt;
- StackNode<T> current = stack[currentPtr];
- if (current.isFosterParenting()) {
- fatal();
- elt = createAndInsertFosterParentedElement("http://www.w3.org/2000/svg", popName, attributes);
- } else {
- elt = createElement("http://www.w3.org/2000/svg", popName, attributes, current.node);
- appendElement(elt, current.node);
- }
- elementPushed("http://www.w3.org/2000/svg", popName, elt);
- elementPopped("http://www.w3.org/2000/svg", popName, elt);
- }
-
- private void appendVoidElementToCurrentMayFosterMathML(
- ElementName elementName, HtmlAttributes attributes)
- throws SAXException {
- @Local String popName = elementName.name;
- // [NOCPP[
- checkAttributes(attributes, "http://www.w3.org/1998/Math/MathML");
- if (elementName.isCustom()) {
- popName = checkPopName(popName);
- }
- // ]NOCPP]
- T elt;
- StackNode<T> current = stack[currentPtr];
- if (current.isFosterParenting()) {
- fatal();
- elt = createAndInsertFosterParentedElement("http://www.w3.org/1998/Math/MathML", popName, attributes);
- } else {
- elt = createElement("http://www.w3.org/1998/Math/MathML", popName, attributes, current.node);
- appendElement(elt, current.node);
- }
- elementPushed("http://www.w3.org/1998/Math/MathML", popName, elt);
- elementPopped("http://www.w3.org/1998/Math/MathML", popName, elt);
- }
-
- private void appendVoidElementToCurrent(
- @Local String name, HtmlAttributes attributes, T form) throws SAXException {
- // [NOCPP[
- checkAttributes(attributes, "http://www.w3.org/1999/xhtml");
- // ]NOCPP]
- // Can't be called for custom elements
- T currentNode = stack[currentPtr].node;
- T elt = createElement("http://www.w3.org/1999/xhtml", name, attributes,
- form == null || fragment || isTemplateContents() ? null : form, currentNode);
- appendElement(elt, currentNode);
- elementPushed("http://www.w3.org/1999/xhtml", name, elt);
- elementPopped("http://www.w3.org/1999/xhtml", name, elt);
- }
-
- private void appendVoidFormToCurrent(HtmlAttributes attributes) throws SAXException {
- // [NOCPP[
- checkAttributes(attributes, "http://www.w3.org/1999/xhtml");
- // ]NOCPP]
- T currentNode = stack[currentPtr].node;
- T elt = createElement("http://www.w3.org/1999/xhtml", "form",
- attributes, currentNode);
- formPointer = elt;
- // ownership transferred to form pointer
- appendElement(elt, currentNode);
- elementPushed("http://www.w3.org/1999/xhtml", "form", elt);
- elementPopped("http://www.w3.org/1999/xhtml", "form", elt);
- }
-
- // [NOCPP[
-
- private final void accumulateCharactersForced(@Const @NoLength char[] buf,
- int start, int length) throws SAXException {
- System.arraycopy(buf, start, charBuffer, charBufferLen, length);
- charBufferLen += length;
- }
-
- @Override public void ensureBufferSpace(int inputLength)
- throws SAXException {
- // TODO: Unify Tokenizer.strBuf and TreeBuilder.charBuffer so that
- // this method becomes unnecessary.
- int worstCase = charBufferLen + inputLength;
- if (charBuffer == null) {
- // Add an arbitrary small value to avoid immediate reallocation
- // once there are a few characters in the buffer.
- charBuffer = new char[worstCase + 128];
- } else if (worstCase > charBuffer.length) {
- // HotSpot reportedly allocates memory with 8-byte accuracy, so
- // there's no point in trying to do math here to avoid slop.
- // Maybe we should add some small constant to worstCase here
- // but not doing that without profiling. In C++ with jemalloc,
- // the corresponding method should do math to round up here
- // to avoid slop.
- char[] newBuf = new char[worstCase];
- System.arraycopy(charBuffer, 0, newBuf, 0, charBufferLen);
- charBuffer = newBuf;
- }
- }
-
- // ]NOCPP]
-
- protected void accumulateCharacters(@Const @NoLength char[] buf, int start,
- int length) throws SAXException {
- appendCharacters(stack[currentPtr].node, buf, start, length);
- }
-
- // ------------------------------- //
-
- protected final void requestSuspension() {
- tokenizer.requestSuspension();
- }
-
- protected abstract T createElement(@NsUri String ns, @Local String name,
- HtmlAttributes attributes, T intendedParent) throws SAXException;
-
- protected T createElement(@NsUri String ns, @Local String name,
- HtmlAttributes attributes, T form, T intendedParent) throws SAXException {
- return createElement("http://www.w3.org/1999/xhtml", name, attributes, intendedParent);
- }
-
- protected abstract T createHtmlElementSetAsRoot(HtmlAttributes attributes)
- throws SAXException;
-
- protected abstract void detachFromParent(T element) throws SAXException;
-
- protected abstract boolean hasChildren(T element) throws SAXException;
-
- protected abstract void appendElement(T child, T newParent)
- throws SAXException;
-
- protected abstract void appendChildrenToNewParent(T oldParent, T newParent)
- throws SAXException;
-
- protected abstract void insertFosterParentedChild(T child, T table,
- T stackParent) throws SAXException;
-
- // We don't generate CPP code for this method because it is not used in generated CPP
- // code. Instead, the form owner version of this method is called with a null form owner.
- // [NOCPP[
-
- protected abstract T createAndInsertFosterParentedElement(@NsUri String ns, @Local String name,
- HtmlAttributes attributes, T table, T stackParent) throws SAXException;
-
- // ]NOCPP]
-
- protected T createAndInsertFosterParentedElement(@NsUri String ns, @Local String name,
- HtmlAttributes attributes, T form, T table, T stackParent) throws SAXException {
- return createAndInsertFosterParentedElement(ns, name, attributes, table, stackParent);
- };
-
- protected abstract void insertFosterParentedCharacters(
- @NoLength char[] buf, int start, int length, T table, T stackParent)
- throws SAXException;
-
- protected abstract void appendCharacters(T parent, @NoLength char[] buf,
- int start, int length) throws SAXException;
-
- protected abstract void appendIsindexPrompt(T parent) throws SAXException;
-
- protected abstract void appendComment(T parent, @NoLength char[] buf,
- int start, int length) throws SAXException;
-
- protected abstract void appendCommentToDocument(@NoLength char[] buf,
- int start, int length) throws SAXException;
-
- protected abstract void addAttributesToElement(T element,
- HtmlAttributes attributes) throws SAXException;
-
- protected void markMalformedIfScript(T elt) throws SAXException {
-
- }
-
- protected void start(boolean fragmentMode) throws SAXException {
-
- }
-
- protected void end() throws SAXException {
-
- }
-
- protected void appendDoctypeToDocument(@Local String name,
- String publicIdentifier, String systemIdentifier)
- throws SAXException {
-
- }
-
- protected void elementPushed(@NsUri String ns, @Local String name, T node)
- throws SAXException {
-
- }
-
- protected void elementPopped(@NsUri String ns, @Local String name, T node)
- throws SAXException {
-
- }
-
- // [NOCPP[
-
- protected void documentMode(DocumentMode m, String publicIdentifier,
- String systemIdentifier, boolean html4SpecificAdditionalErrorChecks)
- throws SAXException {
-
- }
-
- /**
- * @see nu.validator.htmlparser.common.TokenHandler#wantsComments()
- */
- public boolean wantsComments() {
- return wantingComments;
- }
-
- public void setIgnoringComments(boolean ignoreComments) {
- wantingComments = !ignoreComments;
- }
-
- /**
- * Sets the errorHandler.
- *
- * @param errorHandler
- * the errorHandler to set
- */
- public final void setErrorHandler(ErrorHandler errorHandler) {
- this.errorHandler = errorHandler;
- }
-
- /**
- * Returns the errorHandler.
- *
- * @return the errorHandler
- */
- public ErrorHandler getErrorHandler() {
- return errorHandler;
- }
-
- /**
- * The argument MUST be an interned string or <code>null</code>.
- *
- * @param context
- */
- public final void setFragmentContext(@Local String context) {
- this.contextName = context;
- this.contextNamespace = "http://www.w3.org/1999/xhtml";
- this.contextNode = null;
- this.fragment = (contextName != null);
- this.quirks = false;
- }
-
- // ]NOCPP]
-
- /**
- * @see nu.validator.htmlparser.common.TokenHandler#cdataSectionAllowed()
- */
- @Inline public boolean cdataSectionAllowed() throws SAXException {
- return isInForeign();
- }
-
- private boolean isInForeign() {
- return currentPtr >= 0
- && stack[currentPtr].ns != "http://www.w3.org/1999/xhtml";
- }
-
- private boolean isInForeignButNotHtmlOrMathTextIntegrationPoint() {
- if (currentPtr < 0) {
- return false;
- }
- return !isSpecialParentInForeign(stack[currentPtr]);
- }
-
- /**
- * The argument MUST be an interned string or <code>null</code>.
- *
- * @param context
- */
- public final void setFragmentContext(@Local String context,
- @NsUri String ns, T node, boolean quirks) {
- // [NOCPP[
- if (!((context == null && ns == null)
- || "http://www.w3.org/1999/xhtml" == ns
- || "http://www.w3.org/2000/svg" == ns || "http://www.w3.org/1998/Math/MathML" == ns)) {
- throw new IllegalArgumentException(
- "The namespace must be the HTML, SVG or MathML namespace (or null when the local name is null). Got: "
- + ns);
- }
- // ]NOCPP]
- this.contextName = context;
- this.contextNamespace = ns;
- this.contextNode = node;
- this.fragment = (contextName != null);
- this.quirks = quirks;
- }
-
- protected final T currentNode() {
- return stack[currentPtr].node;
- }
-
- /**
- * Returns the scriptingEnabled.
- *
- * @return the scriptingEnabled
- */
- public boolean isScriptingEnabled() {
- return scriptingEnabled;
- }
-
- /**
- * Sets the scriptingEnabled.
- *
- * @param scriptingEnabled
- * the scriptingEnabled to set
- */
- public void setScriptingEnabled(boolean scriptingEnabled) {
- this.scriptingEnabled = scriptingEnabled;
- }
-
- public void setIsSrcdocDocument(boolean isSrcdocDocument) {
- this.isSrcdocDocument = isSrcdocDocument;
- }
-
- // [NOCPP[
-
- /**
- * Sets the doctypeExpectation.
- *
- * @param doctypeExpectation
- * the doctypeExpectation to set
- */
- public void setDoctypeExpectation(DoctypeExpectation doctypeExpectation) {
- this.doctypeExpectation = doctypeExpectation;
- }
-
- public void setNamePolicy(XmlViolationPolicy namePolicy) {
- this.namePolicy = namePolicy;
- }
-
- /**
- * Sets the documentModeHandler.
- *
- * @param documentModeHandler
- * the documentModeHandler to set
- */
- public void setDocumentModeHandler(DocumentModeHandler documentModeHandler) {
- this.documentModeHandler = documentModeHandler;
- }
-
- /**
- * Sets the reportingDoctype.
- *
- * @param reportingDoctype
- * the reportingDoctype to set
- */
- public void setReportingDoctype(boolean reportingDoctype) {
- this.reportingDoctype = reportingDoctype;
- }
-
- // ]NOCPP]
-
- /**
- * Flushes the pending characters. Public for document.write use cases only.
- * @throws SAXException
- */
- public final void flushCharacters() throws SAXException {
- if (charBufferLen > 0) {
- if ((mode == IN_TABLE || mode == IN_TABLE_BODY || mode == IN_ROW)
- && charBufferContainsNonWhitespace()) {
- errNonSpaceInTable();
- reconstructTheActiveFormattingElements();
- if (!stack[currentPtr].isFosterParenting()) {
- // reconstructing gave us a new current node
- appendCharacters(currentNode(), charBuffer, 0,
- charBufferLen);
- charBufferLen = 0;
- return;
- }
-
- int tablePos = findLastOrRoot(TreeBuilder.TABLE);
- int templatePos = findLastOrRoot(TreeBuilder.TEMPLATE);
-
- if (templatePos >= tablePos) {
- appendCharacters(stack[templatePos].node, charBuffer, 0, charBufferLen);
- charBufferLen = 0;
- return;
- }
-
- StackNode<T> tableElt = stack[tablePos];
- insertFosterParentedCharacters(charBuffer, 0, charBufferLen,
- tableElt.node, stack[tablePos - 1].node);
- charBufferLen = 0;
- return;
- }
- appendCharacters(currentNode(), charBuffer, 0, charBufferLen);
- charBufferLen = 0;
- }
- }
-
- private boolean charBufferContainsNonWhitespace() {
- for (int i = 0; i < charBufferLen; i++) {
- switch (charBuffer[i]) {
- case ' ':
- case '\t':
- case '\n':
- case '\r':
- case '\u000C':
- continue;
- default:
- return true;
- }
- }
- return false;
- }
-
- /**
- * Creates a comparable snapshot of the tree builder state. Snapshot
- * creation is only supported immediately after a script end tag has been
- * processed. In C++ the caller is responsible for calling
- * <code>delete</code> on the returned object.
- *
- * @return a snapshot.
- * @throws SAXException
- */
- @SuppressWarnings("unchecked") public TreeBuilderState<T> newSnapshot()
- throws SAXException {
- StackNode<T>[] listCopy = new StackNode[listPtr + 1];
- for (int i = 0; i < listCopy.length; i++) {
- StackNode<T> node = listOfActiveFormattingElements[i];
- if (node != null) {
- StackNode<T> newNode = new StackNode<T>(node.getFlags(), node.ns,
- node.name, node.node, node.popName,
- node.attributes.cloneAttributes(null)
- // [NOCPP[
- , node.getLocator()
- // ]NOCPP]
- );
- listCopy[i] = newNode;
- } else {
- listCopy[i] = null;
- }
- }
- StackNode<T>[] stackCopy = new StackNode[currentPtr + 1];
- for (int i = 0; i < stackCopy.length; i++) {
- StackNode<T> node = stack[i];
- int listIndex = findInListOfActiveFormattingElements(node);
- if (listIndex == -1) {
- StackNode<T> newNode = new StackNode<T>(node.getFlags(), node.ns,
- node.name, node.node, node.popName,
- null
- // [NOCPP[
- , node.getLocator()
- // ]NOCPP]
- );
- stackCopy[i] = newNode;
- } else {
- stackCopy[i] = listCopy[listIndex];
- stackCopy[i].retain();
- }
- }
- int[] templateModeStackCopy = new int[templateModePtr + 1];
- System.arraycopy(templateModeStack, 0, templateModeStackCopy, 0,
- templateModeStackCopy.length);
- return new StateSnapshot<T>(stackCopy, listCopy, templateModeStackCopy, formPointer,
- headPointer, deepTreeSurrogateParent, mode, originalMode, framesetOk,
- needToDropLF, quirks);
- }
-
- public boolean snapshotMatches(TreeBuilderState<T> snapshot) {
- StackNode<T>[] stackCopy = snapshot.getStack();
- int stackLen = snapshot.getStackLength();
- StackNode<T>[] listCopy = snapshot.getListOfActiveFormattingElements();
- int listLen = snapshot.getListOfActiveFormattingElementsLength();
- int[] templateModeStackCopy = snapshot.getTemplateModeStack();
- int templateModeStackLen = snapshot.getTemplateModeStackLength();
-
- if (stackLen != currentPtr + 1
- || listLen != listPtr + 1
- || templateModeStackLen != templateModePtr + 1
- || formPointer != snapshot.getFormPointer()
- || headPointer != snapshot.getHeadPointer()
- || deepTreeSurrogateParent != snapshot.getDeepTreeSurrogateParent()
- || mode != snapshot.getMode()
- || originalMode != snapshot.getOriginalMode()
- || framesetOk != snapshot.isFramesetOk()
- || needToDropLF != snapshot.isNeedToDropLF()
- || quirks != snapshot.isQuirks()) { // maybe just assert quirks
- return false;
- }
- for (int i = listLen - 1; i >= 0; i--) {
- if (listCopy[i] == null
- && listOfActiveFormattingElements[i] == null) {
- continue;
- } else if (listCopy[i] == null
- || listOfActiveFormattingElements[i] == null) {
- return false;
- }
- if (listCopy[i].node != listOfActiveFormattingElements[i].node) {
- return false; // it's possible that this condition is overly
- // strict
- }
- }
- for (int i = stackLen - 1; i >= 0; i--) {
- if (stackCopy[i].node != stack[i].node) {
- return false;
- }
- }
- for (int i = templateModeStackLen - 1; i >=0; i--) {
- if (templateModeStackCopy[i] != templateModeStack[i]) {
- return false;
- }
- }
- return true;
- }
-
- @SuppressWarnings("unchecked") public void loadState(
- TreeBuilderState<T> snapshot, Interner interner)
- throws SAXException {
- StackNode<T>[] stackCopy = snapshot.getStack();
- int stackLen = snapshot.getStackLength();
- StackNode<T>[] listCopy = snapshot.getListOfActiveFormattingElements();
- int listLen = snapshot.getListOfActiveFormattingElementsLength();
- int[] templateModeStackCopy = snapshot.getTemplateModeStack();
- int templateModeStackLen = snapshot.getTemplateModeStackLength();
-
- for (int i = 0; i <= listPtr; i++) {
- if (listOfActiveFormattingElements[i] != null) {
- listOfActiveFormattingElements[i].release();
- }
- }
- if (listOfActiveFormattingElements.length < listLen) {
- listOfActiveFormattingElements = new StackNode[listLen];
- }
- listPtr = listLen - 1;
-
- for (int i = 0; i <= currentPtr; i++) {
- stack[i].release();
- }
- if (stack.length < stackLen) {
- stack = new StackNode[stackLen];
- }
- currentPtr = stackLen - 1;
-
- if (templateModeStack.length < templateModeStackLen) {
- templateModeStack = new int[templateModeStackLen];
- }
- templateModePtr = templateModeStackLen - 1;
-
- for (int i = 0; i < listLen; i++) {
- StackNode<T> node = listCopy[i];
- if (node != null) {
- StackNode<T> newNode = new StackNode<T>(node.getFlags(), node.ns,
- Portability.newLocalFromLocal(node.name, interner), node.node,
- Portability.newLocalFromLocal(node.popName, interner),
- node.attributes.cloneAttributes(null)
- // [NOCPP[
- , node.getLocator()
- // ]NOCPP]
- );
- listOfActiveFormattingElements[i] = newNode;
- } else {
- listOfActiveFormattingElements[i] = null;
- }
- }
- for (int i = 0; i < stackLen; i++) {
- StackNode<T> node = stackCopy[i];
- int listIndex = findInArray(node, listCopy);
- if (listIndex == -1) {
- StackNode<T> newNode = new StackNode<T>(node.getFlags(), node.ns,
- Portability.newLocalFromLocal(node.name, interner), node.node,
- Portability.newLocalFromLocal(node.popName, interner),
- null
- // [NOCPP[
- , node.getLocator()
- // ]NOCPP]
- );
- stack[i] = newNode;
- } else {
- stack[i] = listOfActiveFormattingElements[listIndex];
- stack[i].retain();
- }
- }
- System.arraycopy(templateModeStackCopy, 0, templateModeStack, 0, templateModeStackLen);
- formPointer = snapshot.getFormPointer();
- headPointer = snapshot.getHeadPointer();
- deepTreeSurrogateParent = snapshot.getDeepTreeSurrogateParent();
- mode = snapshot.getMode();
- originalMode = snapshot.getOriginalMode();
- framesetOk = snapshot.isFramesetOk();
- needToDropLF = snapshot.isNeedToDropLF();
- quirks = snapshot.isQuirks();
- }
-
- private int findInArray(StackNode<T> node, StackNode<T>[] arr) {
- for (int i = listPtr; i >= 0; i--) {
- if (node == arr[i]) {
- return i;
- }
- }
- return -1;
- }
-
- /**
- * @see nu.validator.htmlparser.impl.TreeBuilderState#getFormPointer()
- */
- public T getFormPointer() {
- return formPointer;
- }
-
- /**
- * Returns the headPointer.
- *
- * @return the headPointer
- */
- public T getHeadPointer() {
- return headPointer;
- }
-
- /**
- * Returns the deepTreeSurrogateParent.
- *
- * @return the deepTreeSurrogateParent
- */
- public T getDeepTreeSurrogateParent() {
- return deepTreeSurrogateParent;
- }
-
- /**
- * @see nu.validator.htmlparser.impl.TreeBuilderState#getListOfActiveFormattingElements()
- */
- public StackNode<T>[] getListOfActiveFormattingElements() {
- return listOfActiveFormattingElements;
- }
-
- /**
- * @see nu.validator.htmlparser.impl.TreeBuilderState#getStack()
- */
- public StackNode<T>[] getStack() {
- return stack;
- }
-
- /**
- * @see nu.validator.htmlparser.impl.TreeBuilderState#getTemplateModeStack()
- */
- public int[] getTemplateModeStack() {
- return templateModeStack;
- }
-
- /**
- * Returns the mode.
- *
- * @return the mode
- */
- public int getMode() {
- return mode;
- }
-
- /**
- * Returns the originalMode.
- *
- * @return the originalMode
- */
- public int getOriginalMode() {
- return originalMode;
- }
-
- /**
- * Returns the framesetOk.
- *
- * @return the framesetOk
- */
- public boolean isFramesetOk() {
- return framesetOk;
- }
-
- /**
- * Returns the needToDropLF.
- *
- * @return the needToDropLF
- */
- public boolean isNeedToDropLF() {
- return needToDropLF;
- }
-
- /**
- * Returns the quirks.
- *
- * @return the quirks
- */
- public boolean isQuirks() {
- return quirks;
- }
-
- /**
- * @see nu.validator.htmlparser.impl.TreeBuilderState#getListOfActiveFormattingElementsLength()
- */
- public int getListOfActiveFormattingElementsLength() {
- return listPtr + 1;
- }
-
- /**
- * @see nu.validator.htmlparser.impl.TreeBuilderState#getStackLength()
- */
- public int getStackLength() {
- return currentPtr + 1;
- }
-
- /**
- * @see nu.validator.htmlparser.impl.TreeBuilderState#getTemplateModeStackLength()
- */
- public int getTemplateModeStackLength() {
- return templateModePtr + 1;
- }
-
- /**
- * Reports a stray start tag.
- * @param name the name of the stray tag
- *
- * @throws SAXException
- */
- private void errStrayStartTag(@Local String name) throws SAXException {
- err("Stray start tag \u201C" + name + "\u201D.");
- }
-
- /**
- * Reports a stray end tag.
- * @param name the name of the stray tag
- *
- * @throws SAXException
- */
- private void errStrayEndTag(@Local String name) throws SAXException {
- err("Stray end tag \u201C" + name + "\u201D.");
- }
-
- /**
- * Reports a state when elements expected to be closed were not.
- *
- * @param eltPos the position of the start tag on the stack of the element
- * being closed.
- * @param name the name of the end tag
- *
- * @throws SAXException
- */
- private void errUnclosedElements(int eltPos, @Local String name) throws SAXException {
- errNoCheck("End tag \u201C" + name + "\u201D seen, but there were open elements.");
- errListUnclosedStartTags(eltPos);
- }
-
- /**
- * Reports a state when elements expected to be closed ahead of an implied
- * end tag but were not.
- *
- * @param eltPos the position of the start tag on the stack of the element
- * being closed.
- * @param name the name of the end tag
- *
- * @throws SAXException
- */
- private void errUnclosedElementsImplied(int eltPos, String name) throws SAXException {
- errNoCheck("End tag \u201C" + name + "\u201D implied, but there were open elements.");
- errListUnclosedStartTags(eltPos);
- }
-
- /**
- * Reports a state when elements expected to be closed ahead of an implied
- * table cell close.
- *
- * @param eltPos the position of the start tag on the stack of the element
- * being closed.
- * @throws SAXException
- */
- private void errUnclosedElementsCell(int eltPos) throws SAXException {
- errNoCheck("A table cell was implicitly closed, but there were open elements.");
- errListUnclosedStartTags(eltPos);
- }
-
- private void errStrayDoctype() throws SAXException {
- err("Stray doctype.");
- }
-
- private void errAlmostStandardsDoctype() throws SAXException {
- if (!isSrcdocDocument) {
- err("Almost standards mode doctype. Expected \u201C<!DOCTYPE html>\u201D.");
- }
- }
-
- private void errQuirkyDoctype() throws SAXException {
- if (!isSrcdocDocument) {
- err("Quirky doctype. Expected \u201C<!DOCTYPE html>\u201D.");
- }
- }
-
- private void errNonSpaceInTrailer() throws SAXException {
- err("Non-space character in page trailer.");
- }
-
- private void errNonSpaceAfterFrameset() throws SAXException {
- err("Non-space after \u201Cframeset\u201D.");
- }
-
- private void errNonSpaceInFrameset() throws SAXException {
- err("Non-space in \u201Cframeset\u201D.");
- }
-
- private void errNonSpaceAfterBody() throws SAXException {
- err("Non-space character after body.");
- }
-
- private void errNonSpaceInColgroupInFragment() throws SAXException {
- err("Non-space in \u201Ccolgroup\u201D when parsing fragment.");
- }
-
- private void errNonSpaceInNoscriptInHead() throws SAXException {
- err("Non-space character inside \u201Cnoscript\u201D inside \u201Chead\u201D.");
- }
-
- private void errFooBetweenHeadAndBody(@Local String name) throws SAXException {
- if (errorHandler == null) {
- return;
- }
- errNoCheck("\u201C" + name + "\u201D element between \u201Chead\u201D and \u201Cbody\u201D.");
- }
-
- private void errStartTagWithoutDoctype() throws SAXException {
- if (!isSrcdocDocument) {
- err("Start tag seen without seeing a doctype first. Expected \u201C<!DOCTYPE html>\u201D.");
- }
- }
-
- private void errNoSelectInTableScope() throws SAXException {
- err("No \u201Cselect\u201D in table scope.");
- }
-
- private void errStartSelectWhereEndSelectExpected() throws SAXException {
- err("\u201Cselect\u201D start tag where end tag expected.");
- }
-
- private void errStartTagWithSelectOpen(@Local String name)
- throws SAXException {
- if (errorHandler == null) {
- return;
- }
- errNoCheck("\u201C" + name
- + "\u201D start tag with \u201Cselect\u201D open.");
- }
-
- private void errBadStartTagInHead(@Local String name) throws SAXException {
- if (errorHandler == null) {
- return;
- }
- errNoCheck("Bad start tag in \u201C" + name
- + "\u201D in \u201Chead\u201D.");
- }
-
- private void errImage() throws SAXException {
- err("Saw a start tag \u201Cimage\u201D.");
- }
-
- private void errIsindex() throws SAXException {
- err("\u201Cisindex\u201D seen.");
- }
-
- private void errFooSeenWhenFooOpen(@Local String name) throws SAXException {
- if (errorHandler == null) {
- return;
- }
- errNoCheck("An \u201C" + name + "\u201D start tag seen but an element of the same type was already open.");
- }
-
- private void errHeadingWhenHeadingOpen() throws SAXException {
- err("Heading cannot be a child of another heading.");
- }
-
- private void errFramesetStart() throws SAXException {
- err("\u201Cframeset\u201D start tag seen.");
- }
-
- private void errNoCellToClose() throws SAXException {
- err("No cell to close.");
- }
-
- private void errStartTagInTable(@Local String name) throws SAXException {
- if (errorHandler == null) {
- return;
- }
- errNoCheck("Start tag \u201C" + name
- + "\u201D seen in \u201Ctable\u201D.");
- }
-
- private void errFormWhenFormOpen() throws SAXException {
- err("Saw a \u201Cform\u201D start tag, but there was already an active \u201Cform\u201D element. Nested forms are not allowed. Ignoring the tag.");
- }
-
- private void errTableSeenWhileTableOpen() throws SAXException {
- err("Start tag for \u201Ctable\u201D seen but the previous \u201Ctable\u201D is still open.");
- }
-
- private void errStartTagInTableBody(@Local String name) throws SAXException {
- if (errorHandler == null) {
- return;
- }
- errNoCheck("\u201C" + name + "\u201D start tag in table body.");
- }
-
- private void errEndTagSeenWithoutDoctype() throws SAXException {
- if (!isSrcdocDocument) {
- err("End tag seen without seeing a doctype first. Expected \u201C<!DOCTYPE html>\u201D.");
- }
- }
-
- private void errEndTagAfterBody() throws SAXException {
- err("Saw an end tag after \u201Cbody\u201D had been closed.");
- }
-
- private void errEndTagSeenWithSelectOpen(@Local String name) throws SAXException {
- if (errorHandler == null) {
- return;
- }
- errNoCheck("\u201C" + name
- + "\u201D end tag with \u201Cselect\u201D open.");
- }
-
- private void errGarbageInColgroup() throws SAXException {
- err("Garbage in \u201Ccolgroup\u201D fragment.");
- }
-
- private void errEndTagBr() throws SAXException {
- err("End tag \u201Cbr\u201D.");
- }
-
- private void errNoElementToCloseButEndTagSeen(@Local String name)
- throws SAXException {
- if (errorHandler == null) {
- return;
- }
- errNoCheck("No \u201C" + name + "\u201D element in scope but a \u201C"
- + name + "\u201D end tag seen.");
- }
-
- private void errHtmlStartTagInForeignContext(@Local String name)
- throws SAXException {
- if (errorHandler == null) {
- return;
- }
- errNoCheck("HTML start tag \u201C" + name
- + "\u201D in a foreign namespace context.");
- }
-
- private void errTableClosedWhileCaptionOpen() throws SAXException {
- err("\u201Ctable\u201D closed but \u201Ccaption\u201D was still open.");
- }
-
- private void errNoTableRowToClose() throws SAXException {
- err("No table row to close.");
- }
-
- private void errNonSpaceInTable() throws SAXException {
- err("Misplaced non-space characters insided a table.");
- }
-
- private void errUnclosedChildrenInRuby() throws SAXException {
- if (errorHandler == null) {
- return;
- }
- errNoCheck("Unclosed children in \u201Cruby\u201D.");
- }
-
- private void errStartTagSeenWithoutRuby(@Local String name) throws SAXException {
- if (errorHandler == null) {
- return;
- }
- errNoCheck("Start tag \u201C"
- + name
- + "\u201D seen without a \u201Cruby\u201D element being open.");
- }
-
- private void errSelfClosing() throws SAXException {
- if (errorHandler == null) {
- return;
- }
- errNoCheck("Self-closing syntax (\u201C/>\u201D) used on a non-void HTML element. Ignoring the slash and treating as a start tag.");
- }
-
- private void errNoCheckUnclosedElementsOnStack() throws SAXException {
- errNoCheck("Unclosed elements on stack.");
- }
-
- private void errEndTagDidNotMatchCurrentOpenElement(@Local String name,
- @Local String currOpenName) throws SAXException {
- if (errorHandler == null) {
- return;
- }
- errNoCheck("End tag \u201C"
- + name
- + "\u201D did not match the name of the current open element (\u201C"
- + currOpenName + "\u201D).");
- }
-
- private void errEndTagViolatesNestingRules(@Local String name) throws SAXException {
- if (errorHandler == null) {
- return;
- }
- errNoCheck("End tag \u201C" + name + "\u201D violates nesting rules.");
- }
-
- private void errEofWithUnclosedElements() throws SAXException {
- if (errorHandler == null) {
- return;
- }
- errNoCheck("End of file seen and there were open elements.");
- // just report all remaining unclosed elements
- errListUnclosedStartTags(0);
- }
-
- /**
- * Reports arriving at/near end of document with unclosed elements remaining.
- *
- * @param message
- * the message
- * @throws SAXException
- */
- private void errEndWithUnclosedElements(@Local String name) throws SAXException {
- if (errorHandler == null) {
- return;
- }
- errNoCheck("End tag for \u201C"
- + name
- + "\u201D seen, but there were unclosed elements.");
- // just report all remaining unclosed elements
- errListUnclosedStartTags(0);
- }
-}
diff --git a/parser/html/javasrc/UTF16Buffer.java b/parser/html/javasrc/UTF16Buffer.java
deleted file mode 100644
index ec79185ec..000000000
--- a/parser/html/javasrc/UTF16Buffer.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (c) 2008-2010 Mozilla Foundation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-package nu.validator.htmlparser.impl;
-
-import nu.validator.htmlparser.annotation.NoLength;
-
-/**
- * An UTF-16 buffer that knows the start and end indeces of its unconsumed
- * content.
- *
- * @version $Id$
- * @author hsivonen
- */
-public final class UTF16Buffer {
-
- /**
- * The backing store of the buffer. May be larger than the logical content
- * of this <code>UTF16Buffer</code>.
- */
- private final @NoLength char[] buffer;
-
- /**
- * The index of the first unconsumed character in the backing buffer.
- */
- private int start;
-
- /**
- * The index of the slot immediately after the last character in the backing
- * buffer that is part of the logical content of this
- * <code>UTF16Buffer</code>.
- */
- private int end;
-
- //[NOCPP[
-
- /**
- * Constructor for wrapping an existing UTF-16 code unit array.
- *
- * @param buffer
- * the backing buffer
- * @param start
- * the index of the first character to consume
- * @param end
- * the index immediately after the last character to consume
- */
- public UTF16Buffer(@NoLength char[] buffer, int start, int end) {
- this.buffer = buffer;
- this.start = start;
- this.end = end;
- }
-
- // ]NOCPP]
-
- /**
- * Returns the start index.
- *
- * @return the start index
- */
- public int getStart() {
- return start;
- }
-
- /**
- * Sets the start index.
- *
- * @param start
- * the start index
- */
- public void setStart(int start) {
- this.start = start;
- }
-
- /**
- * Returns the backing buffer.
- *
- * @return the backing buffer
- */
- public @NoLength char[] getBuffer() {
- return buffer;
- }
-
- /**
- * Returns the end index.
- *
- * @return the end index
- */
- public int getEnd() {
- return end;
- }
-
- /**
- * Checks if the buffer has data left.
- *
- * @return <code>true</code> if there's data left
- */
- public boolean hasMore() {
- return start < end;
- }
-
- /**
- * Returns <code>end - start</code>.
- *
- * @return <code>end - start</code>
- */
- public int getLength() {
- return end - start;
- }
-
- /**
- * Adjusts the start index to skip over the first character if it is a line
- * feed and the previous character was a carriage return.
- *
- * @param lastWasCR
- * whether the previous character was a carriage return
- */
- public void adjust(boolean lastWasCR) {
- if (lastWasCR && buffer[start] == '\n') {
- start++;
- }
- }
-
- /**
- * Sets the end index.
- *
- * @param end
- * the end index
- */
- public void setEnd(int end) {
- this.end = end;
- }
-}
diff --git a/parser/html/nsHtml5ArrayCopy.h b/parser/html/nsHtml5ArrayCopy.h
index 594a801ab..5e2b37858 100644
--- a/parser/html/nsHtml5ArrayCopy.h
+++ b/parser/html/nsHtml5ArrayCopy.h
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2008 Mozilla Foundation
+ * Copyright (c) 2019 Moonchild Productions
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
diff --git a/parser/html/nsHtml5AttributeName.cpp b/parser/html/nsHtml5AttributeName.cpp
index dc546c111..2dee33220 100644
--- a/parser/html/nsHtml5AttributeName.cpp
+++ b/parser/html/nsHtml5AttributeName.cpp
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2008-2011 Mozilla Foundation
+ * Copyright (c) 2019 Moonchild Productions
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -20,11 +21,6 @@
* DEALINGS IN THE SOFTWARE.
*/
-/*
- * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
- * Please edit AttributeName.java instead and regenerate.
- */
-
#define nsHtml5AttributeName_cpp__
#include "nsIAtom.h"
diff --git a/parser/html/nsHtml5AttributeName.h b/parser/html/nsHtml5AttributeName.h
index d0b93341b..12e4da3b2 100644
--- a/parser/html/nsHtml5AttributeName.h
+++ b/parser/html/nsHtml5AttributeName.h
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2008-2011 Mozilla Foundation
+ * Copyright (c) 2019 Moonchild Productions
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -20,11 +21,6 @@
* DEALINGS IN THE SOFTWARE.
*/
-/*
- * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
- * Please edit AttributeName.java instead and regenerate.
- */
-
#ifndef nsHtml5AttributeName_h
#define nsHtml5AttributeName_h
diff --git a/parser/html/nsHtml5ElementName.cpp b/parser/html/nsHtml5ElementName.cpp
index fb523e7ef..74b0450ee 100644
--- a/parser/html/nsHtml5ElementName.cpp
+++ b/parser/html/nsHtml5ElementName.cpp
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2008-2014 Mozilla Foundation
+ * Copyright (c) 2019 Moonchild Productions
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -20,11 +21,6 @@
* DEALINGS IN THE SOFTWARE.
*/
-/*
- * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
- * Please edit ElementName.java instead and regenerate.
- */
-
#define nsHtml5ElementName_cpp__
#include "nsIAtom.h"
diff --git a/parser/html/nsHtml5ElementName.h b/parser/html/nsHtml5ElementName.h
index b5f0e4b9b..252716990 100644
--- a/parser/html/nsHtml5ElementName.h
+++ b/parser/html/nsHtml5ElementName.h
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2008-2014 Mozilla Foundation
+ * Copyright (c) 2019 Moonchild Productions
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -20,11 +21,6 @@
* DEALINGS IN THE SOFTWARE.
*/
-/*
- * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
- * Please edit ElementName.java instead and regenerate.
- */
-
#ifndef nsHtml5ElementName_h
#define nsHtml5ElementName_h
diff --git a/parser/html/nsHtml5HtmlAttributes.cpp b/parser/html/nsHtml5HtmlAttributes.cpp
index 62b9ae2b2..fc4c33cde 100644
--- a/parser/html/nsHtml5HtmlAttributes.cpp
+++ b/parser/html/nsHtml5HtmlAttributes.cpp
@@ -1,6 +1,7 @@
/*
* Copyright (c) 2007 Henri Sivonen
* Copyright (c) 2008-2011 Mozilla Foundation
+ * Copyright (c) 2019 Moonchild Productions
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -21,11 +22,6 @@
* DEALINGS IN THE SOFTWARE.
*/
-/*
- * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
- * Please edit HtmlAttributes.java instead and regenerate.
- */
-
#define nsHtml5HtmlAttributes_cpp__
#include "nsIAtom.h"
diff --git a/parser/html/nsHtml5HtmlAttributes.h b/parser/html/nsHtml5HtmlAttributes.h
index 12149a0b5..e4423f152 100644
--- a/parser/html/nsHtml5HtmlAttributes.h
+++ b/parser/html/nsHtml5HtmlAttributes.h
@@ -1,6 +1,7 @@
/*
* Copyright (c) 2007 Henri Sivonen
* Copyright (c) 2008-2011 Mozilla Foundation
+ * Copyright (c) 2019 Moonchild Productions
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -21,11 +22,6 @@
* DEALINGS IN THE SOFTWARE.
*/
-/*
- * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
- * Please edit HtmlAttributes.java instead and regenerate.
- */
-
#ifndef nsHtml5HtmlAttributes_h
#define nsHtml5HtmlAttributes_h
diff --git a/parser/html/nsHtml5MetaScanner.cpp b/parser/html/nsHtml5MetaScanner.cpp
index 24f17b02b..b9c426c19 100644
--- a/parser/html/nsHtml5MetaScanner.cpp
+++ b/parser/html/nsHtml5MetaScanner.cpp
@@ -1,6 +1,7 @@
/*
* Copyright (c) 2007 Henri Sivonen
* Copyright (c) 2008-2015 Mozilla Foundation
+ * Copyright (c) 2019 Moonchild Productions
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -21,11 +22,6 @@
* DEALINGS IN THE SOFTWARE.
*/
-/*
- * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
- * Please edit MetaScanner.java instead and regenerate.
- */
-
#define nsHtml5MetaScanner_cpp__
#include "nsIAtom.h"
diff --git a/parser/html/nsHtml5MetaScanner.h b/parser/html/nsHtml5MetaScanner.h
index a4d308147..43f107454 100644
--- a/parser/html/nsHtml5MetaScanner.h
+++ b/parser/html/nsHtml5MetaScanner.h
@@ -1,6 +1,7 @@
/*
* Copyright (c) 2007 Henri Sivonen
* Copyright (c) 2008-2015 Mozilla Foundation
+ * Copyright (c) 2019 Moonchild Productions
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -21,11 +22,6 @@
* DEALINGS IN THE SOFTWARE.
*/
-/*
- * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
- * Please edit MetaScanner.java instead and regenerate.
- */
-
#ifndef nsHtml5MetaScanner_h
#define nsHtml5MetaScanner_h
diff --git a/parser/html/nsHtml5Portability.h b/parser/html/nsHtml5Portability.h
index a3214dd2f..a0143940b 100644
--- a/parser/html/nsHtml5Portability.h
+++ b/parser/html/nsHtml5Portability.h
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2008-2015 Mozilla Foundation
+ * Copyright (c) 2019 Moonchild Productions
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -20,11 +21,6 @@
* DEALINGS IN THE SOFTWARE.
*/
-/*
- * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
- * Please edit Portability.java instead and regenerate.
- */
-
#ifndef nsHtml5Portability_h
#define nsHtml5Portability_h
diff --git a/parser/html/nsHtml5StackNode.cpp b/parser/html/nsHtml5StackNode.cpp
index 41163ae40..3f527c656 100644
--- a/parser/html/nsHtml5StackNode.cpp
+++ b/parser/html/nsHtml5StackNode.cpp
@@ -1,6 +1,7 @@
/*
* Copyright (c) 2007 Henri Sivonen
* Copyright (c) 2007-2011 Mozilla Foundation
+ * Copyright (c) 2019 Moonchild Productions
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -21,11 +22,6 @@
* DEALINGS IN THE SOFTWARE.
*/
-/*
- * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
- * Please edit StackNode.java instead and regenerate.
- */
-
#define nsHtml5StackNode_cpp__
#include "nsIAtom.h"
diff --git a/parser/html/nsHtml5StackNode.h b/parser/html/nsHtml5StackNode.h
index 1677ec571..a2fb57911 100644
--- a/parser/html/nsHtml5StackNode.h
+++ b/parser/html/nsHtml5StackNode.h
@@ -1,6 +1,7 @@
/*
* Copyright (c) 2007 Henri Sivonen
* Copyright (c) 2007-2011 Mozilla Foundation
+ * Copyright (c) 2019 Moonchild Productions
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -21,11 +22,6 @@
* DEALINGS IN THE SOFTWARE.
*/
-/*
- * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
- * Please edit StackNode.java instead and regenerate.
- */
-
#ifndef nsHtml5StackNode_h
#define nsHtml5StackNode_h
diff --git a/parser/html/nsHtml5StateSnapshot.cpp b/parser/html/nsHtml5StateSnapshot.cpp
index 90780738b..a943503b0 100644
--- a/parser/html/nsHtml5StateSnapshot.cpp
+++ b/parser/html/nsHtml5StateSnapshot.cpp
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2009-2010 Mozilla Foundation
+ * Copyright (c) 2019 Moonchild Productions
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -20,11 +21,6 @@
* DEALINGS IN THE SOFTWARE.
*/
-/*
- * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
- * Please edit StateSnapshot.java instead and regenerate.
- */
-
#define nsHtml5StateSnapshot_cpp__
#include "nsIAtom.h"
diff --git a/parser/html/nsHtml5StateSnapshot.h b/parser/html/nsHtml5StateSnapshot.h
index 119570499..be2bce158 100644
--- a/parser/html/nsHtml5StateSnapshot.h
+++ b/parser/html/nsHtml5StateSnapshot.h
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2009-2010 Mozilla Foundation
+ * Copyright (c) 2019 Moonchild Productions
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -20,11 +21,6 @@
* DEALINGS IN THE SOFTWARE.
*/
-/*
- * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
- * Please edit StateSnapshot.java instead and regenerate.
- */
-
#ifndef nsHtml5StateSnapshot_h
#define nsHtml5StateSnapshot_h
diff --git a/parser/html/nsHtml5Tokenizer.cpp b/parser/html/nsHtml5Tokenizer.cpp
index e70c081bf..4c815b0c0 100644
--- a/parser/html/nsHtml5Tokenizer.cpp
+++ b/parser/html/nsHtml5Tokenizer.cpp
@@ -1,6 +1,7 @@
/*
* Copyright (c) 2005-2007 Henri Sivonen
* Copyright (c) 2007-2015 Mozilla Foundation
+ * Copyright (c) 2019 Moonchild Productions
* Portions of comments Copyright 2004-2010 Apple Computer, Inc., Mozilla
* Foundation, and Opera Software ASA.
*
@@ -23,11 +24,6 @@
* DEALINGS IN THE SOFTWARE.
*/
-/*
- * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
- * Please edit Tokenizer.java instead and regenerate.
- */
-
#define nsHtml5Tokenizer_cpp__
#include "nsIAtom.h"
@@ -127,15 +123,11 @@ nsHtml5Tokenizer::isViewingXmlSource()
}
void
-nsHtml5Tokenizer::setStateAndEndTagExpectation(int32_t specialTokenizerState, nsIAtom* endTagExpectation)
+nsHtml5Tokenizer::setState(int32_t specialTokenizerState)
{
this->stateSave = specialTokenizerState;
- if (specialTokenizerState == NS_HTML5TOKENIZER_DATA) {
- return;
- }
- autoJArray<char16_t,int32_t> asArray = nsHtml5Portability::newCharArrayFromLocal(endTagExpectation);
- this->endTagExpectation = nsHtml5ElementName::elementNameByBuffer(asArray, 0, asArray.length, interner);
- endTagExpectationToArray();
+ this->endTagExpectation = nullptr;
+ this->endTagExpectationAsArray = nullptr;
}
void
@@ -2040,7 +2032,13 @@ nsHtml5Tokenizer::stateLoop(int32_t state, char16_t c, int32_t pos, char16_t* bu
NS_HTML5_BREAK(stateloop);
}
c = checkChar(buf, pos);
- if (index < endTagExpectationAsArray.length) {
+ if (!endTagExpectationAsArray) {
+ tokenHandler->characters(nsHtml5Tokenizer::LT_SOLIDUS, 0, 2);
+ cstart = pos;
+ reconsume = true;
+ state = P::transition(mViewSource, returnState, reconsume, pos);
+ NS_HTML5_CONTINUE(stateloop);
+ } else if (index < endTagExpectationAsArray.length) {
char16_t e = endTagExpectationAsArray[index];
char16_t folded = c;
if (c >= 'A' && c <= 'Z') {
diff --git a/parser/html/nsHtml5Tokenizer.h b/parser/html/nsHtml5Tokenizer.h
index 00cca9a9c..37f0eae17 100644
--- a/parser/html/nsHtml5Tokenizer.h
+++ b/parser/html/nsHtml5Tokenizer.h
@@ -1,6 +1,7 @@
/*
* Copyright (c) 2005-2007 Henri Sivonen
* Copyright (c) 2007-2015 Mozilla Foundation
+ * Copyright (c) 2019 Moonchild Productions
* Portions of comments Copyright 2004-2010 Apple Computer, Inc., Mozilla
* Foundation, and Opera Software ASA.
*
@@ -23,11 +24,6 @@
* DEALINGS IN THE SOFTWARE.
*/
-/*
- * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
- * Please edit Tokenizer.java instead and regenerate.
- */
-
#ifndef nsHtml5Tokenizer_h
#define nsHtml5Tokenizer_h
@@ -143,7 +139,7 @@ class nsHtml5Tokenizer
void setInterner(nsHtml5AtomTable* interner);
void initLocation(nsHtml5String newPublicId, nsHtml5String newSystemId);
bool isViewingXmlSource();
- void setStateAndEndTagExpectation(int32_t specialTokenizerState, nsIAtom* endTagExpectation);
+ void setState(int32_t specialTokenizerState);
void setStateAndEndTagExpectation(int32_t specialTokenizerState, nsHtml5ElementName* endTagExpectation);
private:
void endTagExpectationToArray();
diff --git a/parser/html/nsHtml5TreeBuilder.cpp b/parser/html/nsHtml5TreeBuilder.cpp
index 457c7deb1..a02626e47 100644
--- a/parser/html/nsHtml5TreeBuilder.cpp
+++ b/parser/html/nsHtml5TreeBuilder.cpp
@@ -1,6 +1,7 @@
/*
* Copyright (c) 2007 Henri Sivonen
* Copyright (c) 2007-2015 Mozilla Foundation
+ * Copyright (c) 2019 Moonchild Productions
* Portions of comments Copyright 2004-2008 Apple Computer, Inc., Mozilla
* Foundation, and Opera Software ASA.
*
@@ -23,11 +24,6 @@
* DEALINGS IN THE SOFTWARE.
*/
-/*
- * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
- * Please edit TreeBuilder.java instead and regenerate.
- */
-
#define nsHtml5TreeBuilder_cpp__
#include "nsContentUtils.h"
@@ -105,7 +101,7 @@ nsHtml5TreeBuilder::startTokenization(nsHtml5Tokenizer* self)
nsHtml5StackNode* node = new nsHtml5StackNode(elementName, elementName->camelCaseName, elt);
currentPtr++;
stack[currentPtr] = node;
- tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_DATA, contextName);
+ tokenizer->setState(NS_HTML5TOKENIZER_DATA);
mode = NS_HTML5TREE_BUILDER_FRAMESET_OK;
} else if (contextNamespace == kNameSpaceID_MathML) {
nsHtml5ElementName* elementName = nsHtml5ElementName::ELT_MATH;
@@ -117,7 +113,7 @@ nsHtml5TreeBuilder::startTokenization(nsHtml5Tokenizer* self)
nsHtml5StackNode* node = new nsHtml5StackNode(elementName, elt, elementName->name, false);
currentPtr++;
stack[currentPtr] = node;
- tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_DATA, contextName);
+ tokenizer->setState(NS_HTML5TOKENIZER_DATA);
mode = NS_HTML5TREE_BUILDER_FRAMESET_OK;
} else {
nsHtml5StackNode* node = new nsHtml5StackNode(nsHtml5ElementName::ELT_HTML, elt);
@@ -129,15 +125,20 @@ nsHtml5TreeBuilder::startTokenization(nsHtml5Tokenizer* self)
resetTheInsertionMode();
formPointer = getFormPointerForContext(contextNode);
if (nsHtml5Atoms::title == contextName || nsHtml5Atoms::textarea == contextName) {
- tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RCDATA, contextName);
- } else if (nsHtml5Atoms::style == contextName || nsHtml5Atoms::xmp == contextName || nsHtml5Atoms::iframe == contextName || nsHtml5Atoms::noembed == contextName || nsHtml5Atoms::noframes == contextName || (scriptingEnabled && nsHtml5Atoms::noscript == contextName)) {
- tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_RAWTEXT, contextName);
+ tokenizer->setState(NS_HTML5TOKENIZER_RCDATA);
+ } else if (nsHtml5Atoms::style == contextName ||
+ nsHtml5Atoms::xmp == contextName ||
+ nsHtml5Atoms::iframe == contextName ||
+ nsHtml5Atoms::noembed == contextName ||
+ nsHtml5Atoms::noframes == contextName ||
+ (scriptingEnabled && nsHtml5Atoms::noscript == contextName)) {
+ tokenizer->setState(NS_HTML5TOKENIZER_RAWTEXT);
} else if (nsHtml5Atoms::plaintext == contextName) {
- tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_PLAINTEXT, contextName);
+ tokenizer->setState(NS_HTML5TOKENIZER_PLAINTEXT);
} else if (nsHtml5Atoms::script == contextName) {
- tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_SCRIPT_DATA, contextName);
+ tokenizer->setState(NS_HTML5TOKENIZER_SCRIPT_DATA);
} else {
- tokenizer->setStateAndEndTagExpectation(NS_HTML5TOKENIZER_DATA, contextName);
+ tokenizer->setState(NS_HTML5TOKENIZER_DATA);
}
}
contextName = nullptr;
diff --git a/parser/html/nsHtml5TreeBuilder.h b/parser/html/nsHtml5TreeBuilder.h
index 67f5010c5..208402d36 100644
--- a/parser/html/nsHtml5TreeBuilder.h
+++ b/parser/html/nsHtml5TreeBuilder.h
@@ -1,6 +1,7 @@
/*
* Copyright (c) 2007 Henri Sivonen
* Copyright (c) 2007-2015 Mozilla Foundation
+ * Copyright (c) 2019 Moonchild Productions
* Portions of comments Copyright 2004-2008 Apple Computer, Inc., Mozilla
* Foundation, and Opera Software ASA.
*
@@ -23,11 +24,6 @@
* DEALINGS IN THE SOFTWARE.
*/
-/*
- * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
- * Please edit TreeBuilder.java instead and regenerate.
- */
-
#ifndef nsHtml5TreeBuilder_h
#define nsHtml5TreeBuilder_h
diff --git a/parser/html/nsHtml5UTF16Buffer.cpp b/parser/html/nsHtml5UTF16Buffer.cpp
index 0d6870bc4..e829accb0 100644
--- a/parser/html/nsHtml5UTF16Buffer.cpp
+++ b/parser/html/nsHtml5UTF16Buffer.cpp
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2008-2010 Mozilla Foundation
+ * Copyright (c) 2019 Moonchild Productions
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -20,11 +21,6 @@
* DEALINGS IN THE SOFTWARE.
*/
-/*
- * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
- * Please edit UTF16Buffer.java instead and regenerate.
- */
-
#define nsHtml5UTF16Buffer_cpp__
#include "nsIAtom.h"
diff --git a/parser/html/nsHtml5UTF16Buffer.h b/parser/html/nsHtml5UTF16Buffer.h
index c94245f74..e783c28d3 100644
--- a/parser/html/nsHtml5UTF16Buffer.h
+++ b/parser/html/nsHtml5UTF16Buffer.h
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2008-2010 Mozilla Foundation
+ * Copyright (c) 2019 Moonchild Productions
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -20,11 +21,6 @@
* DEALINGS IN THE SOFTWARE.
*/
-/*
- * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
- * Please edit UTF16Buffer.java instead and regenerate.
- */
-
#ifndef nsHtml5UTF16Buffer_h
#define nsHtml5UTF16Buffer_h
diff --git a/security/manager/ssl/nsISiteSecurityService.idl b/security/manager/ssl/nsISiteSecurityService.idl
index 753f32b57..b61577152 100644
--- a/security/manager/ssl/nsISiteSecurityService.idl
+++ b/security/manager/ssl/nsISiteSecurityService.idl
@@ -23,7 +23,7 @@ namespace mozilla
[ref] native nsCStringTArrayRef(nsTArray<nsCString>);
[ref] native mozillaPkixTime(mozilla::pkix::Time);
-[scriptable, uuid(275127f8-dbd7-4681-afbf-6df0c6587a01)]
+[scriptable, uuid(233908bd-6741-4474-a6e1-f298c6ce9eaf)]
interface nsISiteSecurityService : nsISupports
{
const uint32_t HEADER_HSTS = 0;
@@ -98,15 +98,21 @@ interface nsISiteSecurityService : nsISupports
* Given a header type, removes state relating to that header of a host,
* including the includeSubdomains state that would affect subdomains.
* This essentially removes the state for the domain tree rooted at this
- * host.
+ * host. If any preloaded information is present for that host, that
+ * information will then be used instead of any other previously existing
+ * state, unless the force parameter is set.
+ *
* @param aType the type of security state in question
* @param aURI the URI of the target host
* @param aFlags options for this request as defined in nsISocketProvider:
* NO_PERMANENT_STORAGE
+ * @param force if set, forces no-HSTS state by writing a knockout value,
+ * overriding any preload list state
*/
void removeState(in uint32_t aType,
in nsIURI aURI,
- in uint32_t aFlags);
+ in uint32_t aFlags,
+ [optional] in boolean force);
/**
* See isSecureURI
diff --git a/security/manager/ssl/nsSiteSecurityService.cpp b/security/manager/ssl/nsSiteSecurityService.cpp
index cfee79d8d..44ee7dcc0 100644
--- a/security/manager/ssl/nsSiteSecurityService.cpp
+++ b/security/manager/ssl/nsSiteSecurityService.cpp
@@ -330,21 +330,22 @@ nsSiteSecurityService::SetHSTSState(uint32_t aType,
uint32_t flags,
SecurityPropertyState aHSTSState)
{
- // If max-age is zero, that's an indication to immediately remove the
- // security state, so here's a shortcut.
- if (!maxage) {
- return RemoveState(aType, aSourceURI, flags);
+ // Exit early if STS not enabled
+ if (!mUseStsService) {
+ return NS_OK;
+ }
+
+ // If max-age is zero, the host is no longer considered HSTS. If the host was
+ // preloaded, we store an entry indicating that this host is not HSTS, causing
+ // the preloaded information to be ignored.
+ if (maxage == 0) {
+ return RemoveState(aType, aSourceURI, flags, true);
}
MOZ_ASSERT((aHSTSState == SecurityPropertySet ||
aHSTSState == SecurityPropertyNegative),
"HSTS State must be SecurityPropertySet or SecurityPropertyNegative");
- // Exit early if STS not enabled
- if (!mUseStsService) {
- return NS_OK;
- }
-
int64_t expiretime = ExpireTimeFromMaxAge(maxage);
SiteHSTSState siteState(expiretime, aHSTSState, includeSubdomains);
nsAutoCString stateString;
@@ -367,7 +368,7 @@ nsSiteSecurityService::SetHSTSState(uint32_t aType,
NS_IMETHODIMP
nsSiteSecurityService::RemoveState(uint32_t aType, nsIURI* aURI,
- uint32_t aFlags)
+ uint32_t aFlags, bool force = false)
{
// Child processes are not allowed direct access to this.
if (!XRE_IsParentProcess()) {
@@ -387,8 +388,9 @@ nsSiteSecurityService::RemoveState(uint32_t aType, nsIURI* aURI,
mozilla::DataStorageType storageType = isPrivate
? mozilla::DataStorage_Private
: mozilla::DataStorage_Persistent;
- // If this host is in the preload list, we have to store a knockout entry.
- if (GetPreloadListEntry(hostname.get())) {
+ // If this host is in the preload list, we have to store a knockout entry
+ // if it's explicitly forced to not be HSTS anymore
+ if (force && GetPreloadListEntry(hostname.get())) {
SSSLOG(("SSS: storing knockout entry for %s", hostname.get()));
SiteHSTSState siteState(0, SecurityPropertyKnockout, false);
nsAutoCString stateString;
@@ -769,7 +771,10 @@ nsSiteSecurityService::ProcessPKPHeader(nsIURI* aSourceURI,
return NS_ERROR_FAILURE;
}
- // if maxAge == 0 we must delete all state, for now no hole-punching
+ // If maxAge == 0, we remove dynamic HPKP state for this host. Due to
+ // architectural constraints, if this host was preloaded, any future lookups
+ // will use the preloaded state (i.e. we can't store a "this host is not HPKP"
+ // entry like we can for HSTS).
if (maxAge == 0) {
return RemoveState(aType, aSourceURI, aFlags);
}
diff --git a/xpcom/threads/nsThreadPool.cpp b/xpcom/threads/nsThreadPool.cpp
index 241fad39d..eb967870a 100644
--- a/xpcom/threads/nsThreadPool.cpp
+++ b/xpcom/threads/nsThreadPool.cpp
@@ -112,7 +112,9 @@ nsThreadPool::PutEvent(already_AddRefed<nsIRunnable> aEvent, uint32_t aFlags)
bool killThread = false;
{
MutexAutoLock lock(mMutex);
- if (mThreads.Count() < (int32_t)mThreadLimit) {
+ if (mShutdown) {
+ killThread = true; // we're in shutdown, kill the thread
+ } else if (mThreads.Count() < (int32_t)mThreadLimit) {
mThreads.AppendObject(thread);
} else {
killThread = true; // okay, we don't need this thread anymore