Fix newly enforced package:pedantic lints (#111)
- always_declare_return_types
- annotate_overrides
- omit_local_variable_types
- prefer_conditional_assignment
- prefer_if_null_operators
- prefer_single_quotes
- use_function_type_syntax_for_parameters
Ignore prefer_collection_literals lints since they would require
incorrect code where a `{}` (statically a `Map`) is assigned to a static
`LinkedHashMap`. See https://github.com/dart-lang/linter/issues/1649
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 2d3a54d..b8dcf93 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,6 +1,8 @@
include: package:pedantic/analysis_options.yaml
analyzer:
errors:
+ # https://github.com/dart-lang/linter/issues/1649
+ prefer_collection_literals: ignore
unused_element: error
unused_import: error
unused_local_variable: error
diff --git a/lib/dom.dart b/lib/dom.dart
index 08d1c12..835d8da 100644
--- a/lib/dom.dart
+++ b/lib/dom.dart
@@ -36,6 +36,7 @@
const AttributeName(this.prefix, this.name, this.namespace);
+ @override
String toString() {
// Implement:
// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#serializing-html-fragments
@@ -45,24 +46,26 @@
return prefix != null ? '$prefix:$name' : name;
}
+ @override
int get hashCode {
- int h = prefix.hashCode;
+ var h = prefix.hashCode;
h = 37 * (h & 0x1FFFFF) + name.hashCode;
h = 37 * (h & 0x1FFFFF) + namespace.hashCode;
return h & 0x3FFFFFFF;
}
+ @override
int compareTo(other) {
// Not sure about this sort order
if (other is! AttributeName) return 1;
- int cmp = (prefix != null ? prefix : "")
- .compareTo((other.prefix != null ? other.prefix : ""));
+ var cmp = (prefix ?? '').compareTo((other.prefix ?? ''));
if (cmp != 0) return cmp;
cmp = name.compareTo(other.name);
if (cmp != 0) return cmp;
return namespace.compareTo(other.namespace);
}
+ @override
bool operator ==(x) {
if (x is! AttributeName) return false;
return prefix == x.prefix && name == x.name && namespace == x.namespace;
@@ -184,12 +187,7 @@
return _attributeValueSpans;
}
- List<Element> get children {
- if (_elements == null) {
- _elements = FilteredElementList(this);
- }
- return _elements;
- }
+ List<Element> get children => _elements ??= FilteredElementList(this);
/// Returns a copy of this node.
///
@@ -223,7 +221,7 @@
void _addOuterHtml(StringBuffer str);
void _addInnerHtml(StringBuffer str) {
- for (Node child in nodes) {
+ for (var child in nodes) {
child._addOuterHtml(str);
}
}
@@ -301,7 +299,7 @@
}
}
- _clone(Node shallowClone, bool deep) {
+ Node _clone(Node shallowClone, bool deep) {
if (deep) {
for (var child in nodes) {
shallowClone.append(child.clone(true));
@@ -316,6 +314,7 @@
Document() : super._();
factory Document.html(String html) => parse(html);
+ @override
int get nodeType => Node.DOCUMENT_NODE;
// TODO(jmesserly): optmize this if needed
@@ -331,10 +330,13 @@
// to dom_parsing, where we keep other custom APIs?
String get outerHtml => _outerHtml;
- String toString() => "#document";
+ @override
+ String toString() => '#document';
+ @override
void _addOuterHtml(StringBuffer str) => _addInnerHtml(str);
+ @override
Document clone(bool deep) => _clone(Document(), deep);
Element createElement(String tag) => Element.tag(tag);
@@ -353,6 +355,7 @@
DocumentFragment() : super._();
factory DocumentFragment.html(String html) => parseFragment(html);
+ @override
int get nodeType => Node.DOCUMENT_FRAGMENT_NODE;
/// Returns a fragment of HTML or XML that represents the element and its
@@ -363,13 +366,18 @@
// to dom_parsing, where we keep other custom APIs?
String get outerHtml => _outerHtml;
- String toString() => "#document-fragment";
+ @override
+ String toString() => '#document-fragment';
+ @override
DocumentFragment clone(bool deep) => _clone(DocumentFragment(), deep);
+ @override
void _addOuterHtml(StringBuffer str) => _addInnerHtml(str);
+ @override
String get text => _getText(this);
+ @override
set text(String value) => _setText(this, value);
}
@@ -380,24 +388,28 @@
DocumentType(this.name, this.publicId, this.systemId) : super._();
+ @override
int get nodeType => Node.DOCUMENT_TYPE_NODE;
+ @override
String toString() {
if (publicId != null || systemId != null) {
// TODO(jmesserly): the html5 serialization spec does not add these. But
// it seems useful, and the parser can handle it, so for now keeping it.
- var pid = publicId != null ? publicId : '';
- var sid = systemId != null ? systemId : '';
+ var pid = publicId ?? '';
+ var sid = systemId ?? '';
return '<!DOCTYPE $name "$pid" "$sid">';
} else {
return '<!DOCTYPE $name>';
}
}
+ @override
void _addOuterHtml(StringBuffer str) {
str.write(toString());
}
+ @override
DocumentType clone(bool deep) => DocumentType(name, publicId, systemId);
}
@@ -408,20 +420,24 @@
dynamic _data;
Text(String data)
- : _data = data != null ? data : '',
+ : _data = data ?? '',
super._();
+ @override
int get nodeType => Node.TEXT_NODE;
String get data => _data = _data.toString();
set data(String value) {
- _data = value != null ? value : '';
+ _data = value ?? '';
}
+ @override
String toString() => '"$data"';
+ @override
void _addOuterHtml(StringBuffer str) => writeTextNodeAsHtml(str, this);
+ @override
Text clone(bool deep) => Text(data);
void appendData(String data) {
@@ -430,7 +446,9 @@
sb.write(data);
}
+ @override
String get text => data;
+ @override
set text(String value) {
data = value;
}
@@ -484,7 +502,7 @@
// 2) Verify that the html does not contain leading or trailing text nodes.
// 3) Verify that the html does not contain both <head> and <body> tags.
// 4) Detatch the created element from its dummy parent.
- String parentTag = 'div';
+ var parentTag = 'div';
String tag;
final match = _startTagRegexp.firstMatch(html);
if (match != null) {
@@ -509,13 +527,14 @@
return element;
}
+ @override
int get nodeType => Node.ELEMENT_NODE;
// TODO(jmesserly): we can make this faster
Element get previousElementSibling {
if (parentNode == null) return null;
var siblings = parentNode.nodes;
- for (int i = siblings.indexOf(this) - 1; i >= 0; i--) {
+ for (var i = siblings.indexOf(this) - 1; i >= 0; i--) {
var s = siblings[i];
if (s is Element) return s;
}
@@ -525,19 +544,22 @@
Element get nextElementSibling {
if (parentNode == null) return null;
var siblings = parentNode.nodes;
- for (int i = siblings.indexOf(this) + 1; i < siblings.length; i++) {
+ for (var i = siblings.indexOf(this) + 1; i < siblings.length; i++) {
var s = siblings[i];
if (s is Element) return s;
}
return null;
}
+ @override
String toString() {
var prefix = Namespaces.getPrefix(namespaceUri);
return "<${prefix == null ? '' : '$prefix '}$localName>";
}
+ @override
String get text => _getText(this);
+ @override
set text(String value) => _setText(this, value);
/// Returns a fragment of HTML or XML that represents the element and its
@@ -557,6 +579,7 @@
nodes.addAll(parseFragment(value, container: localName).nodes);
}
+ @override
void _addOuterHtml(StringBuffer str) {
// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#serializing-html-fragments
// Element is the most complicated one.
@@ -611,6 +634,7 @@
return prefix == null ? '' : '$prefix:';
}
+ @override
Element clone(bool deep) {
var result = Element._(localName, namespaceUri)
..attributes = LinkedHashMap.from(attributes);
@@ -620,7 +644,7 @@
// http://dom.spec.whatwg.org/#dom-element-id
String get id {
var result = attributes['id'];
- return result != null ? result : '';
+ return result ?? '';
}
set id(String value) {
@@ -630,7 +654,7 @@
// http://dom.spec.whatwg.org/#dom-element-classname
String get className {
var result = attributes['class'];
- return result != null ? result : '';
+ return result ?? '';
}
set className(String value) {
@@ -653,17 +677,23 @@
Comment(this.data) : super._();
+ @override
int get nodeType => Node.COMMENT_NODE;
- String toString() => "<!-- $data -->";
+ @override
+ String toString() => '<!-- $data -->';
+ @override
void _addOuterHtml(StringBuffer str) {
- str.write("<!--$data-->");
+ str.write('<!--$data-->');
}
+ @override
Comment clone(bool deep) => Comment(data);
+ @override
String get text => data;
+ @override
set text(String value) {
data = value;
}
@@ -687,6 +717,7 @@
return node;
}
+ @override
void add(Node value) {
if (value is DocumentFragment) {
addAll(value.nodes);
@@ -697,6 +728,7 @@
void addLast(Node value) => add(value);
+ @override
void addAll(Iterable<Node> collection) {
// Note: we need to be careful if collection is another NodeList.
// In particular:
@@ -712,6 +744,7 @@
super.addAll(list);
}
+ @override
void insert(int index, Node value) {
if (value is DocumentFragment) {
insertAll(index, value.nodes);
@@ -720,10 +753,13 @@
}
}
+ @override
Node removeLast() => super.removeLast()..parentNode = null;
+ @override
Node removeAt(int i) => super.removeAt(i)..parentNode = null;
+ @override
void clear() {
for (var node in this) {
node.parentNode = null;
@@ -731,6 +767,7 @@
super.clear();
}
+ @override
void operator []=(int index, Node value) {
if (value is DocumentFragment) {
removeAt(index);
@@ -743,46 +780,52 @@
// TODO(jmesserly): These aren't implemented in DOM _NodeListImpl, see
// http://code.google.com/p/dart/issues/detail?id=5371
+ @override
void setRange(int start, int rangeLength, Iterable<Node> from,
[int startFrom = 0]) {
- List<Node> fromVar = from as List<Node>;
+ var fromVar = from as List<Node>;
if (fromVar is NodeList) {
// Note: this is presumed to make a copy
fromVar = fromVar.sublist(startFrom, startFrom + rangeLength);
}
// Note: see comment in [addAll]. We need to be careful about the order of
// operations if [from] is also a NodeList.
- for (int i = rangeLength - 1; i >= 0; i--) {
+ for (var i = rangeLength - 1; i >= 0; i--) {
this[start + i] = fromVar[startFrom + i];
}
}
+ @override
void replaceRange(int start, int end, Iterable<Node> newContents) {
removeRange(start, end);
insertAll(start, newContents);
}
+ @override
void removeRange(int start, int rangeLength) {
- for (int i = start; i < rangeLength; i++) {
+ for (var i = start; i < rangeLength; i++) {
this[i].parentNode = null;
}
super.removeRange(start, rangeLength);
}
- void removeWhere(bool test(Node e)) {
+ @override
+ void removeWhere(bool Function(Node) test) {
for (var node in where(test)) {
node.parentNode = null;
}
super.removeWhere(test);
}
- void retainWhere(bool test(Node e)) {
+ @override
+ void retainWhere(bool Function(Node) test) {
for (var node in where((n) => !test(n))) {
node.parentNode = null;
}
super.retainWhere(test);
}
+ @override
void insertAll(int index, Iterable<Node> collection) {
// Note: we need to be careful how we copy nodes. See note in addAll.
var list = _flattenDocFragments(collection);
@@ -832,70 +875,85 @@
// forEach, every, any, ... could directly work on the _childNodes.
List<Element> get _filtered => _childNodes.whereType<Element>().toList();
- void forEach(void f(Element element)) {
+ @override
+ void forEach(void Function(Element) f) {
_filtered.forEach(f);
}
+ @override
void operator []=(int index, Element value) {
this[index].replaceWith(value);
}
+ @override
set length(int newLength) {
final len = length;
if (newLength >= len) {
return;
} else if (newLength < 0) {
- throw ArgumentError("Invalid list length");
+ throw ArgumentError('Invalid list length');
}
removeRange(newLength, len);
}
- String join([String separator = ""]) => _filtered.join(separator);
+ @override
+ String join([String separator = '']) => _filtered.join(separator);
+ @override
void add(Element value) {
_childNodes.add(value);
}
+ @override
void addAll(Iterable<Element> iterable) {
- for (Element element in iterable) {
+ for (var element in iterable) {
add(element);
}
}
+ @override
bool contains(Object element) {
return element is Element && _childNodes.contains(element);
}
+ @override
Iterable<Element> get reversed => _filtered.reversed;
- void sort([int compare(Element a, Element b)]) {
+ @override
+ void sort([int Function(Element, Element) compare]) {
throw UnsupportedError('TODO(jacobr): should we impl?');
}
+ @override
void setRange(int start, int end, Iterable<Element> iterable,
[int skipCount = 0]) {
throw UnimplementedError();
}
+ @override
void fillRange(int start, int end, [Element fillValue]) {
throw UnimplementedError();
}
+ @override
void replaceRange(int start, int end, Iterable<Element> iterable) {
throw UnimplementedError();
}
+ @override
void removeRange(int start, int end) {
_filtered.sublist(start, end).forEach((el) => el.remove());
}
+ @override
void clear() {
// Currently, ElementList#clear clears even non-element nodes, so we follow
// that behavior.
_childNodes.clear();
}
+ @override
Element removeLast() {
final result = last;
if (result != null) {
@@ -904,28 +962,35 @@
return result;
}
- Iterable<T> map<T>(T f(Element element)) => _filtered.map(f);
- Iterable<Element> where(bool f(Element element)) => _filtered.where(f);
- Iterable<T> expand<T>(Iterable<T> f(Element element)) => _filtered.expand(f);
+ @override
+ Iterable<T> map<T>(T Function(Element) f) => _filtered.map(f);
+ @override
+ Iterable<Element> where(bool Function(Element) f) => _filtered.where(f);
+ @override
+ Iterable<T> expand<T>(Iterable<T> Function(Element) f) => _filtered.expand(f);
+ @override
void insert(int index, Element value) {
_childNodes.insert(index, value);
}
+ @override
void insertAll(int index, Iterable<Element> iterable) {
_childNodes.insertAll(index, iterable);
}
+ @override
Element removeAt(int index) {
final result = this[index];
result.remove();
return result;
}
+ @override
bool remove(Object element) {
if (element is! Element) return false;
- for (int i = 0; i < length; i++) {
- Element indexElement = this[i];
+ for (var i = 0; i < length; i++) {
+ var indexElement = this[i];
if (identical(indexElement, element)) {
indexElement.remove();
return true;
@@ -934,59 +999,82 @@
return false;
}
- Element reduce(Element combine(Element value, Element element)) {
+ @override
+ Element reduce(Element Function(Element, Element) combine) {
return _filtered.reduce(combine);
}
- T fold<T>(T initialValue, T combine(T previousValue, Element element)) {
+ @override
+ T fold<T>(
+ T initialValue, T Function(T previousValue, Element element) combine) {
return _filtered.fold(initialValue, combine);
}
- bool every(bool f(Element element)) => _filtered.every(f);
- bool any(bool f(Element element)) => _filtered.any(f);
+ @override
+ bool every(bool Function(Element) f) => _filtered.every(f);
+ @override
+ bool any(bool Function(Element) f) => _filtered.any(f);
+ @override
List<Element> toList({bool growable = true}) =>
List<Element>.from(this, growable: growable);
+ @override
Set<Element> toSet() => Set<Element>.from(this);
- Element firstWhere(bool test(Element value), {Element orElse()}) {
+ @override
+ Element firstWhere(bool Function(Element) test, {Element Function() orElse}) {
return _filtered.firstWhere(test, orElse: orElse);
}
- Element lastWhere(bool test(Element value), {Element orElse()}) {
+ @override
+ Element lastWhere(bool Function(Element) test, {Element Function() orElse}) {
return _filtered.lastWhere(test, orElse: orElse);
}
- Element singleWhere(bool test(Element value), {Element orElse()}) {
+ @override
+ Element singleWhere(bool Function(Element) test,
+ {Element Function() orElse}) {
if (orElse != null) throw UnimplementedError('orElse');
return _filtered.singleWhere(test);
}
+ @override
Element elementAt(int index) {
return this[index];
}
+ @override
bool get isEmpty => _filtered.isEmpty;
+ @override
int get length => _filtered.length;
+ @override
Element operator [](int index) => _filtered[index];
+ @override
Iterator<Element> get iterator => _filtered.iterator;
+ @override
List<Element> sublist(int start, [int end]) => _filtered.sublist(start, end);
+ @override
Iterable<Element> getRange(int start, int end) =>
_filtered.getRange(start, end);
// TODO(sigmund): this should be typed Element, but we currently run into a
// bug where ListMixin<E>.indexOf() expects Object as the argument.
+ @override
int indexOf(Object element, [int start = 0]) =>
_filtered.indexOf(element, start);
// TODO(sigmund): this should be typed Element, but we currently run into a
// bug where ListMixin<E>.lastIndexOf() expects Object as the argument.
+ @override
int lastIndexOf(Object element, [int start]) {
- if (start == null) start = length - 1;
+ start ??= length - 1;
return _filtered.lastIndexOf(element, start);
}
+ @override
Element get first => _filtered.first;
+ @override
Element get last => _filtered.last;
+ @override
Element get single => _filtered.single;
}
@@ -1002,9 +1090,11 @@
class _ConcatTextVisitor extends TreeVisitor {
final _str = StringBuffer();
+ @override
String toString() => _str.toString();
- visitText(Text node) {
+ @override
+ void visitText(Text node) {
_str.write(node.data);
}
}
diff --git a/lib/dom_parsing.dart b/lib/dom_parsing.dart
index 27eedb3..f16018c 100644
--- a/lib/dom_parsing.dart
+++ b/lib/dom_parsing.dart
@@ -7,7 +7,7 @@
/// A simple tree visitor for the DOM nodes.
class TreeVisitor {
- visit(Node node) {
+ void visit(Node node) {
switch (node.nodeType) {
case Node.ELEMENT_NODE:
return visitElement(node);
@@ -26,7 +26,7 @@
}
}
- visitChildren(Node node) {
+ void visitChildren(Node node) {
// Allow for mutations (remove works) while iterating.
for (var child in node.nodes.toList()) {
visit(child);
@@ -36,20 +36,20 @@
/// The fallback handler if the more specific visit method hasn't been
/// overriden. Only use this from a subclass of [TreeVisitor], otherwise
/// call [visit] instead.
- visitNodeFallback(Node node) => visitChildren(node);
+ void visitNodeFallback(Node node) => visitChildren(node);
- visitDocument(Document node) => visitNodeFallback(node);
+ void visitDocument(Document node) => visitNodeFallback(node);
- visitDocumentType(DocumentType node) => visitNodeFallback(node);
+ void visitDocumentType(DocumentType node) => visitNodeFallback(node);
- visitText(Text node) => visitNodeFallback(node);
+ void visitText(Text node) => visitNodeFallback(node);
// TODO(jmesserly): visit attributes.
- visitElement(Element node) => visitNodeFallback(node);
+ void visitElement(Element node) => visitNodeFallback(node);
- visitComment(Comment node) => visitNodeFallback(node);
+ void visitComment(Comment node) => visitNodeFallback(node);
- visitDocumentFragment(DocumentFragment node) => visitNodeFallback(node);
+ void visitDocumentFragment(DocumentFragment node) => visitNodeFallback(node);
}
/// Converts the DOM tree into an HTML string with code markup suitable for
@@ -67,24 +67,29 @@
CodeMarkupVisitor() : _str = StringBuffer();
+ @override
String toString() => _str.toString();
- visitDocument(Document node) {
- _str.write("<pre>");
+ @override
+ void visitDocument(Document node) {
+ _str.write('<pre>');
visitChildren(node);
- _str.write("</pre>");
+ _str.write('</pre>');
}
- visitDocumentType(DocumentType node) {
+ @override
+ void visitDocumentType(DocumentType node) {
_str.write('<code class="markup doctype"><!DOCTYPE ${node.name}>'
'</code>');
}
- visitText(Text node) {
+ @override
+ void visitText(Text node) {
writeTextNodeAsHtml(_str, node);
}
- visitElement(Element node) {
+ @override
+ void visitElement(Element node) {
final tag = node.localName;
_str.write('<<code class="markup element-name">$tag</code>');
if (node.attributes.isNotEmpty) {
@@ -95,16 +100,17 @@
});
}
if (node.nodes.isNotEmpty) {
- _str.write(">");
+ _str.write('>');
visitChildren(node);
} else if (isVoidElement(tag)) {
- _str.write(">");
+ _str.write('>');
return;
}
_str.write('</<code class="markup element-name">$tag</code>>');
}
- visitComment(Comment node) {
+ @override
+ void visitComment(Comment node) {
var data = htmlSerializeEscape(node.data);
_str.write('<code class="markup comment"><!--$data--></code>');
}
@@ -131,7 +137,7 @@
// TODO(jmesserly): is it faster to build up a list of codepoints?
// StringBuffer seems cleaner assuming Dart can unbox 1-char strings.
StringBuffer result;
- for (int i = 0; i < text.length; i++) {
+ for (var i = 0; i < text.length; i++) {
var ch = text[i];
String replace;
switch (ch) {
@@ -152,7 +158,7 @@
break;
}
if (replace != null) {
- if (result == null) result = StringBuffer(text.substring(0, i));
+ result ??= StringBuffer(text.substring(0, i));
result.write(replace);
} else if (result != null) {
result.write(ch);
@@ -168,22 +174,22 @@
/// See also: <http://dev.w3.org/html5/markup/syntax.html#void-elements>.
bool isVoidElement(String tagName) {
switch (tagName) {
- case "area":
- case "base":
- case "br":
- case "col":
- case "command":
- case "embed":
- case "hr":
- case "img":
- case "input":
- case "keygen":
- case "link":
- case "meta":
- case "param":
- case "source":
- case "track":
- case "wbr":
+ case 'area':
+ case 'base':
+ case 'br':
+ case 'col':
+ case 'command':
+ case 'embed':
+ case 'hr':
+ case 'img':
+ case 'input':
+ case 'keygen':
+ case 'link':
+ case 'meta':
+ case 'param':
+ case 'source':
+ case 'track':
+ case 'wbr':
return true;
}
return false;
diff --git a/lib/parser.dart b/lib/parser.dart
index 58ae1c8..c4eafb6 100644
--- a/lib/parser.dart
+++ b/lib/parser.dart
@@ -56,7 +56,7 @@
/// additionally pass [sourceUrl] to indicate where the [input] was extracted
/// from.
DocumentFragment parseFragment(input,
- {String container = "div",
+ {String container = 'div',
String encoding,
bool generateSpans = false,
String sourceUrl}) {
@@ -86,7 +86,7 @@
// TODO(jmesserly): use enum?
/// "quirks" / "limited quirks" / "no quirks"
- String compatMode = "no quirks";
+ String compatMode = 'no quirks';
/// innerHTML container when parsing document fragment.
String innerHTML;
@@ -150,7 +150,7 @@
this.generateSpans = false,
String sourceUrl,
TreeBuilder tree})
- : tree = tree != null ? tree : TreeBuilder(true),
+ : tree = tree ?? TreeBuilder(true),
tokenizer = (input is HtmlTokenizer
? input
: HtmlTokenizer(input,
@@ -203,7 +203,7 @@
/// Parse an html5 document fragment into a tree.
/// Pass a [container] to change the type of the containing element.
/// After parsing, [errors] will be populated with parse errors, if any.
- DocumentFragment parseFragment([String container = "div"]) {
+ DocumentFragment parseFragment([String container = 'div']) {
if (container == null) throw ArgumentError('container');
innerHTML = container.toLowerCase();
_parse();
@@ -232,7 +232,7 @@
firstStartTag = false;
errors.clear();
// "quirks" / "limited quirks" / "no quirks"
- compatMode = "no quirks";
+ compatMode = 'no quirks';
if (innerHTMLMode) {
if (cdataElements.contains(innerHTML)) {
@@ -258,11 +258,11 @@
}
bool isHTMLIntegrationPoint(Element element) {
- if (element.localName == "annotation-xml" &&
+ if (element.localName == 'annotation-xml' &&
element.namespaceUri == Namespaces.mathml) {
- var enc = element.attributes["encoding"];
+ var enc = element.attributes['encoding'];
if (enc != null) enc = asciiUpper2Lower(enc);
- return enc == "text/html" || enc == "application/xhtml+xml";
+ return enc == 'text/html' || enc == 'application/xhtml+xml';
} else {
return htmlIntegrationPointElements
.contains(Pair(element.namespaceUri, element.localName));
@@ -282,8 +282,8 @@
if (isMathMLTextIntegrationPoint(node)) {
if (type == TokenKind.startTag &&
- (token as StartTagToken).name != "mglyph" &&
- (token as StartTagToken).name != "malignmark") {
+ (token as StartTagToken).name != 'mglyph' &&
+ (token as StartTagToken).name != 'malignmark') {
return false;
}
if (type == TokenKind.characters || type == TokenKind.spaceCharacters) {
@@ -291,9 +291,9 @@
}
}
- if (node.localName == "annotation-xml" &&
+ if (node.localName == 'annotation-xml' &&
type == TokenKind.startTag &&
- (token as StartTagToken).name == "svg") {
+ (token as StartTagToken).name == 'svg') {
return false;
}
@@ -322,7 +322,7 @@
parseError(error.span, error.data, error.messageParams);
newToken = null;
} else {
- Phase localPhase = phase;
+ var localPhase = phase;
if (inForeignContent(token, type)) {
localPhase = _inForeignContentPhase;
}
@@ -352,8 +352,8 @@
if (token is StartTagToken) {
if (token.selfClosing && !token.selfClosingAcknowledged) {
- parseError(token.span, "non-void-element-with-trailing-solidus",
- {"name": token.name});
+ parseError(token.span, 'non-void-element-with-trailing-solidus',
+ {'name': token.name});
}
}
}
@@ -390,76 +390,76 @@
}
void adjustMathMLAttributes(StartTagToken token) {
- var orig = token.data.remove("definitionurl");
+ var orig = token.data.remove('definitionurl');
if (orig != null) {
- token.data["definitionURL"] = orig;
+ token.data['definitionURL'] = orig;
}
}
void adjustSVGAttributes(StartTagToken token) {
final replacements = const {
- "attributename": "attributeName",
- "attributetype": "attributeType",
- "basefrequency": "baseFrequency",
- "baseprofile": "baseProfile",
- "calcmode": "calcMode",
- "clippathunits": "clipPathUnits",
- "contentscripttype": "contentScriptType",
- "contentstyletype": "contentStyleType",
- "diffuseconstant": "diffuseConstant",
- "edgemode": "edgeMode",
- "externalresourcesrequired": "externalResourcesRequired",
- "filterres": "filterRes",
- "filterunits": "filterUnits",
- "glyphref": "glyphRef",
- "gradienttransform": "gradientTransform",
- "gradientunits": "gradientUnits",
- "kernelmatrix": "kernelMatrix",
- "kernelunitlength": "kernelUnitLength",
- "keypoints": "keyPoints",
- "keysplines": "keySplines",
- "keytimes": "keyTimes",
- "lengthadjust": "lengthAdjust",
- "limitingconeangle": "limitingConeAngle",
- "markerheight": "markerHeight",
- "markerunits": "markerUnits",
- "markerwidth": "markerWidth",
- "maskcontentunits": "maskContentUnits",
- "maskunits": "maskUnits",
- "numoctaves": "numOctaves",
- "pathlength": "pathLength",
- "patterncontentunits": "patternContentUnits",
- "patterntransform": "patternTransform",
- "patternunits": "patternUnits",
- "pointsatx": "pointsAtX",
- "pointsaty": "pointsAtY",
- "pointsatz": "pointsAtZ",
- "preservealpha": "preserveAlpha",
- "preserveaspectratio": "preserveAspectRatio",
- "primitiveunits": "primitiveUnits",
- "refx": "refX",
- "refy": "refY",
- "repeatcount": "repeatCount",
- "repeatdur": "repeatDur",
- "requiredextensions": "requiredExtensions",
- "requiredfeatures": "requiredFeatures",
- "specularconstant": "specularConstant",
- "specularexponent": "specularExponent",
- "spreadmethod": "spreadMethod",
- "startoffset": "startOffset",
- "stddeviation": "stdDeviation",
- "stitchtiles": "stitchTiles",
- "surfacescale": "surfaceScale",
- "systemlanguage": "systemLanguage",
- "tablevalues": "tableValues",
- "targetx": "targetX",
- "targety": "targetY",
- "textlength": "textLength",
- "viewbox": "viewBox",
- "viewtarget": "viewTarget",
- "xchannelselector": "xChannelSelector",
- "ychannelselector": "yChannelSelector",
- "zoomandpan": "zoomAndPan"
+ 'attributename': 'attributeName',
+ 'attributetype': 'attributeType',
+ 'basefrequency': 'baseFrequency',
+ 'baseprofile': 'baseProfile',
+ 'calcmode': 'calcMode',
+ 'clippathunits': 'clipPathUnits',
+ 'contentscripttype': 'contentScriptType',
+ 'contentstyletype': 'contentStyleType',
+ 'diffuseconstant': 'diffuseConstant',
+ 'edgemode': 'edgeMode',
+ 'externalresourcesrequired': 'externalResourcesRequired',
+ 'filterres': 'filterRes',
+ 'filterunits': 'filterUnits',
+ 'glyphref': 'glyphRef',
+ 'gradienttransform': 'gradientTransform',
+ 'gradientunits': 'gradientUnits',
+ 'kernelmatrix': 'kernelMatrix',
+ 'kernelunitlength': 'kernelUnitLength',
+ 'keypoints': 'keyPoints',
+ 'keysplines': 'keySplines',
+ 'keytimes': 'keyTimes',
+ 'lengthadjust': 'lengthAdjust',
+ 'limitingconeangle': 'limitingConeAngle',
+ 'markerheight': 'markerHeight',
+ 'markerunits': 'markerUnits',
+ 'markerwidth': 'markerWidth',
+ 'maskcontentunits': 'maskContentUnits',
+ 'maskunits': 'maskUnits',
+ 'numoctaves': 'numOctaves',
+ 'pathlength': 'pathLength',
+ 'patterncontentunits': 'patternContentUnits',
+ 'patterntransform': 'patternTransform',
+ 'patternunits': 'patternUnits',
+ 'pointsatx': 'pointsAtX',
+ 'pointsaty': 'pointsAtY',
+ 'pointsatz': 'pointsAtZ',
+ 'preservealpha': 'preserveAlpha',
+ 'preserveaspectratio': 'preserveAspectRatio',
+ 'primitiveunits': 'primitiveUnits',
+ 'refx': 'refX',
+ 'refy': 'refY',
+ 'repeatcount': 'repeatCount',
+ 'repeatdur': 'repeatDur',
+ 'requiredextensions': 'requiredExtensions',
+ 'requiredfeatures': 'requiredFeatures',
+ 'specularconstant': 'specularConstant',
+ 'specularexponent': 'specularExponent',
+ 'spreadmethod': 'spreadMethod',
+ 'startoffset': 'startOffset',
+ 'stddeviation': 'stdDeviation',
+ 'stitchtiles': 'stitchTiles',
+ 'surfacescale': 'surfaceScale',
+ 'systemlanguage': 'systemLanguage',
+ 'tablevalues': 'tableValues',
+ 'targetx': 'targetX',
+ 'targety': 'targetY',
+ 'textlength': 'textLength',
+ 'viewbox': 'viewBox',
+ 'viewtarget': 'viewTarget',
+ 'xchannelselector': 'xChannelSelector',
+ 'ychannelselector': 'yChannelSelector',
+ 'zoomandpan': 'zoomAndPan'
};
for (var originalName in token.data.keys.toList()) {
var svgName = replacements[originalName];
@@ -473,18 +473,18 @@
// TODO(jmesserly): I don't like mixing non-string objects with strings in
// the Node.attributes Map. Is there another solution?
final replacements = const {
- "xlink:actuate": AttributeName("xlink", "actuate", Namespaces.xlink),
- "xlink:arcrole": AttributeName("xlink", "arcrole", Namespaces.xlink),
- "xlink:href": AttributeName("xlink", "href", Namespaces.xlink),
- "xlink:role": AttributeName("xlink", "role", Namespaces.xlink),
- "xlink:show": AttributeName("xlink", "show", Namespaces.xlink),
- "xlink:title": AttributeName("xlink", "title", Namespaces.xlink),
- "xlink:type": AttributeName("xlink", "type", Namespaces.xlink),
- "xml:base": AttributeName("xml", "base", Namespaces.xml),
- "xml:lang": AttributeName("xml", "lang", Namespaces.xml),
- "xml:space": AttributeName("xml", "space", Namespaces.xml),
- "xmlns": AttributeName(null, "xmlns", Namespaces.xmlns),
- "xmlns:xlink": AttributeName("xmlns", "xlink", Namespaces.xmlns)
+ 'xlink:actuate': AttributeName('xlink', 'actuate', Namespaces.xlink),
+ 'xlink:arcrole': AttributeName('xlink', 'arcrole', Namespaces.xlink),
+ 'xlink:href': AttributeName('xlink', 'href', Namespaces.xlink),
+ 'xlink:role': AttributeName('xlink', 'role', Namespaces.xlink),
+ 'xlink:show': AttributeName('xlink', 'show', Namespaces.xlink),
+ 'xlink:title': AttributeName('xlink', 'title', Namespaces.xlink),
+ 'xlink:type': AttributeName('xlink', 'type', Namespaces.xlink),
+ 'xml:base': AttributeName('xml', 'base', Namespaces.xml),
+ 'xml:lang': AttributeName('xml', 'lang', Namespaces.xml),
+ 'xml:space': AttributeName('xml', 'space', Namespaces.xml),
+ 'xmlns': AttributeName(null, 'xmlns', Namespaces.xmlns),
+ 'xmlns:xlink': AttributeName('xmlns', 'xlink', Namespaces.xmlns)
};
for (var originalName in token.data.keys.toList()) {
@@ -500,7 +500,7 @@
// specification.)
for (var node in tree.openElements.reversed) {
var nodeName = node.localName;
- bool last = node == tree.openElements[0];
+ var last = node == tree.openElements[0];
if (last) {
assert(innerHTMLMode);
nodeName = innerHTML;
@@ -508,10 +508,10 @@
// Check for conditions that should only happen in the innerHTML
// case
switch (nodeName) {
- case "select":
- case "colgroup":
- case "head":
- case "html":
+ case 'select':
+ case 'colgroup':
+ case 'head':
+ case 'html':
assert(innerHTMLMode);
break;
}
@@ -519,46 +519,46 @@
continue;
}
switch (nodeName) {
- case "select":
+ case 'select':
phase = _inSelectPhase;
return;
- case "td":
+ case 'td':
phase = _inCellPhase;
return;
- case "th":
+ case 'th':
phase = _inCellPhase;
return;
- case "tr":
+ case 'tr':
phase = _inRowPhase;
return;
- case "tbody":
+ case 'tbody':
phase = _inTableBodyPhase;
return;
- case "thead":
+ case 'thead':
phase = _inTableBodyPhase;
return;
- case "tfoot":
+ case 'tfoot':
phase = _inTableBodyPhase;
return;
- case "caption":
+ case 'caption':
phase = _inCaptionPhase;
return;
- case "colgroup":
+ case 'colgroup':
phase = _inColumnGroupPhase;
return;
- case "table":
+ case 'table':
phase = _inTablePhase;
return;
- case "head":
+ case 'head':
phase = _inBodyPhase;
return;
- case "body":
+ case 'body':
phase = _inBodyPhase;
return;
- case "frameset":
+ case 'frameset':
phase = _inFramesetPhase;
return;
- case "html":
+ case 'html':
phase = _beforeHeadPhase;
return;
}
@@ -569,11 +569,11 @@
/// Generic RCDATA/RAWTEXT Parsing algorithm
/// [contentType] - RCDATA or RAWTEXT
void parseRCDataRawtext(Token token, String contentType) {
- assert(contentType == "RAWTEXT" || contentType == "RCDATA");
+ assert(contentType == 'RAWTEXT' || contentType == 'RCDATA');
tree.insertElement(token);
- if (contentType == "RAWTEXT") {
+ if (contentType == 'RAWTEXT') {
tokenizer.state = tokenizer.rawtextState;
} else {
tokenizer.state = tokenizer.rcdataState;
@@ -615,7 +615,7 @@
}
Token processDoctype(DoctypeToken token) {
- parser.parseError(token.span, "unexpected-doctype");
+ parser.parseError(token.span, 'unexpected-doctype');
return null;
}
@@ -634,8 +634,8 @@
}
Token startTagHtml(StartTagToken token) {
- if (parser.firstStartTag == false && token.name == "html") {
- parser.parseError(token.span, "non-html-root");
+ if (parser.firstStartTag == false && token.name == 'html') {
+ parser.parseError(token.span, 'non-html-root');
}
// XXX Need a check here to see if the first start tag token emitted is
// this token... If it's not, invoke parser.parseError().
@@ -653,7 +653,7 @@
/// Helper method for popping openElements.
void popOpenElementsUntil(EndTagToken token) {
- String name = token.name;
+ var name = token.name;
var node = tree.openElements.removeLast();
while (node.localName != name) {
node = tree.openElements.removeLast();
@@ -667,152 +667,157 @@
class InitialPhase extends Phase {
InitialPhase(parser) : super(parser);
+ @override
Token processSpaceCharacters(SpaceCharactersToken token) {
return null;
}
+ @override
Token processComment(CommentToken token) {
tree.insertComment(token, tree.document);
return null;
}
+ @override
Token processDoctype(DoctypeToken token) {
var name = token.name;
- String publicId = token.publicId;
+ var publicId = token.publicId;
var systemId = token.systemId;
var correct = token.correct;
- if ((name != "html" ||
+ if ((name != 'html' ||
publicId != null ||
- systemId != null && systemId != "about:legacy-compat")) {
- parser.parseError(token.span, "unknown-doctype");
+ systemId != null && systemId != 'about:legacy-compat')) {
+ parser.parseError(token.span, 'unknown-doctype');
}
- if (publicId == null) {
- publicId = "";
- }
+ publicId ??= '';
tree.insertDoctype(token);
- if (publicId != "") {
+ if (publicId != '') {
publicId = asciiUpper2Lower(publicId);
}
if (!correct ||
- token.name != "html" ||
+ token.name != 'html' ||
startsWithAny(publicId, const [
- "+//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//",
+ '+//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//"
+ '-//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//'
]) ||
const [
- "-//w3o//dtd w3 html strict 3.0//en//",
- "-/w3c/dtd html 4.0 transitional/en",
- "html"
+ '-//w3o//dtd w3 html strict 3.0//en//',
+ '-/w3c/dtd html 4.0 transitional/en',
+ 'html'
].contains(publicId) ||
startsWithAny(publicId, const [
- "-//w3c//dtd html 4.01 frameset//",
- "-//w3c//dtd html 4.01 transitional//"
+ '-//w3c//dtd html 4.01 frameset//',
+ '-//w3c//dtd html 4.01 transitional//'
]) &&
systemId == null ||
systemId != null &&
systemId.toLowerCase() ==
- "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd") {
- parser.compatMode = "quirks";
+ 'http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd') {
+ parser.compatMode = 'quirks';
} else if (startsWithAny(publicId, const [
- "-//w3c//dtd xhtml 1.0 frameset//",
- "-//w3c//dtd xhtml 1.0 transitional//"
+ '-//w3c//dtd xhtml 1.0 frameset//',
+ '-//w3c//dtd xhtml 1.0 transitional//'
]) ||
startsWithAny(publicId, const [
- "-//w3c//dtd html 4.01 frameset//",
- "-//w3c//dtd html 4.01 transitional//"
+ '-//w3c//dtd html 4.01 frameset//',
+ '-//w3c//dtd html 4.01 transitional//'
]) &&
systemId != null) {
- parser.compatMode = "limited quirks";
+ parser.compatMode = 'limited quirks';
}
parser.phase = parser._beforeHtmlPhase;
return null;
}
void anythingElse() {
- parser.compatMode = "quirks";
+ parser.compatMode = 'quirks';
parser.phase = parser._beforeHtmlPhase;
}
+ @override
Token processCharacters(CharactersToken token) {
- parser.parseError(token.span, "expected-doctype-but-got-chars");
+ parser.parseError(token.span, 'expected-doctype-but-got-chars');
anythingElse();
return token;
}
+ @override
Token processStartTag(StartTagToken token) {
parser.parseError(
- token.span, "expected-doctype-but-got-start-tag", {"name": token.name});
+ token.span, 'expected-doctype-but-got-start-tag', {'name': token.name});
anythingElse();
return token;
}
+ @override
Token processEndTag(EndTagToken token) {
parser.parseError(
- token.span, "expected-doctype-but-got-end-tag", {"name": token.name});
+ token.span, 'expected-doctype-but-got-end-tag', {'name': token.name});
anythingElse();
return token;
}
+ @override
bool processEOF() {
- parser.parseError(parser._lastSpan, "expected-doctype-but-got-eof");
+ parser.parseError(parser._lastSpan, 'expected-doctype-but-got-eof');
anythingElse();
return true;
}
@@ -824,49 +829,56 @@
// helper methods
void insertHtmlElement() {
tree.insertRoot(
- StartTagToken("html", data: LinkedHashMap<dynamic, String>()));
+ StartTagToken('html', data: LinkedHashMap<dynamic, String>()));
parser.phase = parser._beforeHeadPhase;
}
// other
+ @override
bool processEOF() {
insertHtmlElement();
return true;
}
+ @override
Token processComment(CommentToken token) {
tree.insertComment(token, tree.document);
return null;
}
+ @override
Token processSpaceCharacters(SpaceCharactersToken token) {
return null;
}
+ @override
Token processCharacters(CharactersToken token) {
insertHtmlElement();
return token;
}
+ @override
+ @override
Token processStartTag(StartTagToken token) {
- if (token.name == "html") {
+ if (token.name == 'html') {
parser.firstStartTag = true;
}
insertHtmlElement();
return token;
}
+ @override
Token processEndTag(EndTagToken token) {
switch (token.name) {
- case "head":
- case "body":
- case "html":
- case "br":
+ case 'head':
+ case 'body':
+ case 'html':
+ case 'br':
insertHtmlElement();
return token;
default:
parser.parseError(
- token.span, "unexpected-end-tag-before-html", {"name": token.name});
+ token.span, 'unexpected-end-tag-before-html', {'name': token.name});
return null;
}
}
@@ -875,6 +887,7 @@
class BeforeHeadPhase extends Phase {
BeforeHeadPhase(parser) : super(parser);
+ @override
Token processStartTag(StartTagToken token) {
switch (token.name) {
case 'html':
@@ -887,12 +900,13 @@
}
}
+ @override
Token processEndTag(EndTagToken token) {
switch (token.name) {
- case "head":
- case "body":
- case "html":
- case "br":
+ case 'head':
+ case 'body':
+ case 'html':
+ case 'br':
return endTagImplyHead(token);
default:
endTagOther(token);
@@ -900,20 +914,24 @@
}
}
+ @override
bool processEOF() {
- startTagHead(StartTagToken("head", data: LinkedHashMap<dynamic, String>()));
+ startTagHead(StartTagToken('head', data: LinkedHashMap<dynamic, String>()));
return true;
}
+ @override
Token processSpaceCharacters(SpaceCharactersToken token) {
return null;
}
+ @override
Token processCharacters(CharactersToken token) {
- startTagHead(StartTagToken("head", data: LinkedHashMap<dynamic, String>()));
+ startTagHead(StartTagToken('head', data: LinkedHashMap<dynamic, String>()));
return token;
}
+ @override
Token startTagHtml(StartTagToken token) {
return parser._inBodyPhase.processStartTag(token);
}
@@ -925,50 +943,51 @@
}
Token startTagOther(StartTagToken token) {
- startTagHead(StartTagToken("head", data: LinkedHashMap<dynamic, String>()));
+ startTagHead(StartTagToken('head', data: LinkedHashMap<dynamic, String>()));
return token;
}
Token endTagImplyHead(EndTagToken token) {
- startTagHead(StartTagToken("head", data: LinkedHashMap<dynamic, String>()));
+ startTagHead(StartTagToken('head', data: LinkedHashMap<dynamic, String>()));
return token;
}
void endTagOther(EndTagToken token) {
parser.parseError(
- token.span, "end-tag-after-implied-root", {"name": token.name});
+ token.span, 'end-tag-after-implied-root', {'name': token.name});
}
}
class InHeadPhase extends Phase {
InHeadPhase(parser) : super(parser);
+ @override
Token processStartTag(StartTagToken token) {
switch (token.name) {
- case "html":
+ case 'html':
return startTagHtml(token);
- case "title":
+ case 'title':
startTagTitle(token);
return null;
- case "noscript":
- case "noframes":
- case "style":
+ case 'noscript':
+ case 'noframes':
+ case 'style':
startTagNoScriptNoFramesStyle(token);
return null;
- case "script":
+ case 'script':
startTagScript(token);
return null;
- case "base":
- case "basefont":
- case "bgsound":
- case "command":
- case "link":
+ case 'base':
+ case 'basefont':
+ case 'bgsound':
+ case 'command':
+ case 'link':
startTagBaseLinkCommand(token);
return null;
- case "meta":
+ case 'meta':
startTagMeta(token);
return null;
- case "head":
+ case 'head':
startTagHead(token);
return null;
default:
@@ -976,14 +995,15 @@
}
}
+ @override
Token processEndTag(EndTagToken token) {
switch (token.name) {
- case "head":
+ case 'head':
endTagHead(token);
return null;
- case "br":
- case "html":
- case "body":
+ case 'br':
+ case 'html':
+ case 'body':
return endTagHtmlBodyBr(token);
default:
endTagOther(token);
@@ -992,22 +1012,25 @@
}
// the real thing
+ @override
bool processEOF() {
anythingElse();
return true;
}
+ @override
Token processCharacters(CharactersToken token) {
anythingElse();
return token;
}
+ @override
Token startTagHtml(StartTagToken token) {
return parser._inBodyPhase.processStartTag(token);
}
void startTagHead(StartTagToken token) {
- parser.parseError(token.span, "two-heads-are-not-better-than-one");
+ parser.parseError(token.span, 'two-heads-are-not-better-than-one');
}
void startTagBaseLinkCommand(StartTagToken token) {
@@ -1023,8 +1046,8 @@
var attributes = token.data;
if (!parser.tokenizer.stream.charEncodingCertain) {
- var charset = attributes["charset"];
- var content = attributes["content"];
+ var charset = attributes['charset'];
+ var content = attributes['content'];
if (charset != null) {
parser.tokenizer.stream.changeEncoding(charset);
} else if (content != null) {
@@ -1036,12 +1059,12 @@
}
void startTagTitle(StartTagToken token) {
- parser.parseRCDataRawtext(token, "RCDATA");
+ parser.parseRCDataRawtext(token, 'RCDATA');
}
void startTagNoScriptNoFramesStyle(StartTagToken token) {
// Need to decide whether to implement the scripting-disabled case
- parser.parseRCDataRawtext(token, "RAWTEXT");
+ parser.parseRCDataRawtext(token, 'RAWTEXT');
}
void startTagScript(StartTagToken token) {
@@ -1058,7 +1081,7 @@
void endTagHead(EndTagToken token) {
var node = parser.tree.openElements.removeLast();
- assert(node.localName == "head");
+ assert(node.localName == 'head');
node.endSourceSpan = token.span;
parser.phase = parser._afterHeadPhase;
}
@@ -1069,11 +1092,11 @@
}
void endTagOther(EndTagToken token) {
- parser.parseError(token.span, "unexpected-end-tag", {"name": token.name});
+ parser.parseError(token.span, 'unexpected-end-tag', {'name': token.name});
}
void anythingElse() {
- endTagHead(EndTagToken("head"));
+ endTagHead(EndTagToken('head'));
}
}
@@ -1085,28 +1108,29 @@
class AfterHeadPhase extends Phase {
AfterHeadPhase(parser) : super(parser);
+ @override
Token processStartTag(StartTagToken token) {
switch (token.name) {
- case "html":
+ case 'html':
return startTagHtml(token);
- case "body":
+ case 'body':
startTagBody(token);
return null;
- case "frameset":
+ case 'frameset':
startTagFrameset(token);
return null;
- case "base":
- case "basefont":
- case "bgsound":
- case "link":
- case "meta":
- case "noframes":
- case "script":
- case "style":
- case "title":
+ case 'base':
+ case 'basefont':
+ case 'bgsound':
+ case 'link':
+ case 'meta':
+ case 'noframes':
+ case 'script':
+ case 'style':
+ case 'title':
startTagFromHead(token);
return null;
- case "head":
+ case 'head':
startTagHead(token);
return null;
default:
@@ -1114,11 +1138,12 @@
}
}
+ @override
Token processEndTag(EndTagToken token) {
switch (token.name) {
- case "body":
- case "html":
- case "br":
+ case 'body':
+ case 'html':
+ case 'br':
return endTagHtmlBodyBr(token);
default:
endTagOther(token);
@@ -1126,16 +1151,19 @@
}
}
+ @override
bool processEOF() {
anythingElse();
return true;
}
+ @override
Token processCharacters(CharactersToken token) {
anythingElse();
return token;
}
+ @override
Token startTagHtml(StartTagToken token) {
return parser._inBodyPhase.processStartTag(token);
}
@@ -1152,12 +1180,12 @@
}
void startTagFromHead(StartTagToken token) {
- parser.parseError(token.span, "unexpected-start-tag-out-of-my-head",
- {"name": token.name});
+ parser.parseError(token.span, 'unexpected-start-tag-out-of-my-head',
+ {'name': token.name});
tree.openElements.add(tree.headPointer);
parser._inHeadPhase.processStartTag(token);
for (var node in tree.openElements.reversed) {
- if (node.localName == "head") {
+ if (node.localName == 'head') {
tree.openElements.remove(node);
break;
}
@@ -1165,7 +1193,7 @@
}
void startTagHead(StartTagToken token) {
- parser.parseError(token.span, "unexpected-start-tag", {"name": token.name});
+ parser.parseError(token.span, 'unexpected-start-tag', {'name': token.name});
}
Token startTagOther(StartTagToken token) {
@@ -1179,12 +1207,12 @@
}
void endTagOther(EndTagToken token) {
- parser.parseError(token.span, "unexpected-end-tag", {"name": token.name});
+ parser.parseError(token.span, 'unexpected-end-tag', {'name': token.name});
}
void anythingElse() {
tree.insertElement(
- StartTagToken("body", data: LinkedHashMap<dynamic, String>()));
+ StartTagToken('body', data: LinkedHashMap<dynamic, String>()));
parser.phase = parser._inBodyPhase;
parser.framesetOK = true;
}
@@ -1199,171 +1227,172 @@
// the really-really-really-very crazy mode
InBodyPhase(parser) : super(parser);
+ @override
Token processStartTag(StartTagToken token) {
switch (token.name) {
- case "html":
+ case 'html':
return startTagHtml(token);
- case "base":
- case "basefont":
- case "bgsound":
- case "command":
- case "link":
- case "meta":
- case "noframes":
- case "script":
- case "style":
- case "title":
+ case 'base':
+ case 'basefont':
+ case 'bgsound':
+ case 'command':
+ case 'link':
+ case 'meta':
+ case 'noframes':
+ case 'script':
+ case 'style':
+ case 'title':
return startTagProcessInHead(token);
- case "body":
+ case 'body':
startTagBody(token);
return null;
- case "frameset":
+ case 'frameset':
startTagFrameset(token);
return null;
- case "address":
- case "article":
- case "aside":
- case "blockquote":
- case "center":
- case "details":
- case "dir":
- case "div":
- case "dl":
- case "fieldset":
- case "figcaption":
- case "figure":
- case "footer":
- case "header":
- case "hgroup":
- case "menu":
- case "nav":
- case "ol":
- case "p":
- case "section":
- case "summary":
- case "ul":
+ case 'address':
+ case 'article':
+ case 'aside':
+ case 'blockquote':
+ case 'center':
+ case 'details':
+ case 'dir':
+ case 'div':
+ case 'dl':
+ case 'fieldset':
+ case 'figcaption':
+ case 'figure':
+ case 'footer':
+ case 'header':
+ case 'hgroup':
+ case 'menu':
+ case 'nav':
+ case 'ol':
+ case 'p':
+ case 'section':
+ case 'summary':
+ case 'ul':
startTagCloseP(token);
return null;
// headingElements
- case "h1":
- case "h2":
- case "h3":
- case "h4":
- case "h5":
- case "h6":
+ case 'h1':
+ case 'h2':
+ case 'h3':
+ case 'h4':
+ case 'h5':
+ case 'h6':
startTagHeading(token);
return null;
- case "pre":
- case "listing":
+ case 'pre':
+ case 'listing':
startTagPreListing(token);
return null;
- case "form":
+ case 'form':
startTagForm(token);
return null;
- case "li":
- case "dd":
- case "dt":
+ case 'li':
+ case 'dd':
+ case 'dt':
startTagListItem(token);
return null;
- case "plaintext":
+ case 'plaintext':
startTagPlaintext(token);
return null;
- case "a":
+ case 'a':
startTagA(token);
return null;
- case "b":
- case "big":
- case "code":
- case "em":
- case "font":
- case "i":
- case "s":
- case "small":
- case "strike":
- case "strong":
- case "tt":
- case "u":
+ case 'b':
+ case 'big':
+ case 'code':
+ case 'em':
+ case 'font':
+ case 'i':
+ case 's':
+ case 'small':
+ case 'strike':
+ case 'strong':
+ case 'tt':
+ case 'u':
startTagFormatting(token);
return null;
- case "nobr":
+ case 'nobr':
startTagNobr(token);
return null;
- case "button":
+ case 'button':
return startTagButton(token);
- case "applet":
- case "marquee":
- case "object":
+ case 'applet':
+ case 'marquee':
+ case 'object':
startTagAppletMarqueeObject(token);
return null;
- case "xmp":
+ case 'xmp':
startTagXmp(token);
return null;
- case "table":
+ case 'table':
startTagTable(token);
return null;
- case "area":
- case "br":
- case "embed":
- case "img":
- case "keygen":
- case "wbr":
+ case 'area':
+ case 'br':
+ case 'embed':
+ case 'img':
+ case 'keygen':
+ case 'wbr':
startTagVoidFormatting(token);
return null;
- case "param":
- case "source":
- case "track":
+ case 'param':
+ case 'source':
+ case 'track':
startTagParamSource(token);
return null;
- case "input":
+ case 'input':
startTagInput(token);
return null;
- case "hr":
+ case 'hr':
startTagHr(token);
return null;
- case "image":
+ case 'image':
startTagImage(token);
return null;
- case "isindex":
+ case 'isindex':
startTagIsIndex(token);
return null;
- case "textarea":
+ case 'textarea':
startTagTextarea(token);
return null;
- case "iframe":
+ case 'iframe':
startTagIFrame(token);
return null;
- case "noembed":
- case "noscript":
+ case 'noembed':
+ case 'noscript':
startTagRawtext(token);
return null;
- case "select":
+ case 'select':
startTagSelect(token);
return null;
- case "rp":
- case "rt":
+ case 'rp':
+ case 'rt':
startTagRpRt(token);
return null;
- case "option":
- case "optgroup":
+ case 'option':
+ case 'optgroup':
startTagOpt(token);
return null;
- case "math":
+ case 'math':
startTagMath(token);
return null;
- case "svg":
+ case 'svg':
startTagSvg(token);
return null;
- case "caption":
- case "col":
- case "colgroup":
- case "frame":
- case "head":
- case "tbody":
- case "td":
- case "tfoot":
- case "th":
- case "thead":
- case "tr":
+ case 'caption':
+ case 'col':
+ case 'colgroup':
+ case 'frame':
+ case 'head':
+ case 'tbody':
+ case 'td':
+ case 'tfoot':
+ case 'th':
+ case 'thead':
+ case 'tr':
startTagMisplaced(token);
return null;
default:
@@ -1371,80 +1400,81 @@
}
}
+ @override
Token processEndTag(EndTagToken token) {
switch (token.name) {
- case "body":
+ case 'body':
endTagBody(token);
return null;
- case "html":
+ case 'html':
return endTagHtml(token);
- case "address":
- case "article":
- case "aside":
- case "blockquote":
- case "center":
- case "details":
- case "dir":
- case "div":
- case "dl":
- case "fieldset":
- case "figcaption":
- case "figure":
- case "footer":
- case "header":
- case "hgroup":
- case "listing":
- case "menu":
- case "nav":
- case "ol":
- case "pre":
- case "section":
- case "summary":
- case "ul":
+ case 'address':
+ case 'article':
+ case 'aside':
+ case 'blockquote':
+ case 'center':
+ case 'details':
+ case 'dir':
+ case 'div':
+ case 'dl':
+ case 'fieldset':
+ case 'figcaption':
+ case 'figure':
+ case 'footer':
+ case 'header':
+ case 'hgroup':
+ case 'listing':
+ case 'menu':
+ case 'nav':
+ case 'ol':
+ case 'pre':
+ case 'section':
+ case 'summary':
+ case 'ul':
endTagBlock(token);
return null;
- case "form":
+ case 'form':
endTagForm(token);
return null;
- case "p":
+ case 'p':
endTagP(token);
return null;
- case "dd":
- case "dt":
- case "li":
+ case 'dd':
+ case 'dt':
+ case 'li':
endTagListItem(token);
return null;
// headingElements
- case "h1":
- case "h2":
- case "h3":
- case "h4":
- case "h5":
- case "h6":
+ case 'h1':
+ case 'h2':
+ case 'h3':
+ case 'h4':
+ case 'h5':
+ case 'h6':
endTagHeading(token);
return null;
- case "a":
- case "b":
- case "big":
- case "code":
- case "em":
- case "font":
- case "i":
- case "nobr":
- case "s":
- case "small":
- case "strike":
- case "strong":
- case "tt":
- case "u":
+ case 'a':
+ case 'b':
+ case 'big':
+ case 'code':
+ case 'em':
+ case 'font':
+ case 'i':
+ case 'nobr':
+ case 's':
+ case 'small':
+ case 'strike':
+ case 'strong':
+ case 'tt':
+ case 'u':
endTagFormatting(token);
return null;
- case "applet":
- case "marquee":
- case "object":
+ case 'applet':
+ case 'marquee':
+ case 'object':
endTagAppletMarqueeObject(token);
return null;
- case "br":
+ case 'br':
endTagBr(token);
return null;
default:
@@ -1491,24 +1521,25 @@
}
// the real deal
+ @override
bool processEOF() {
for (var node in tree.openElements.reversed) {
switch (node.localName) {
- case "dd":
- case "dt":
- case "li":
- case "p":
- case "tbody":
- case "td":
- case "tfoot":
- case "th":
- case "thead":
- case "tr":
- case "body":
- case "html":
+ case 'dd':
+ case 'dt':
+ case 'li':
+ case 'p':
+ case 'tbody':
+ case 'td':
+ case 'tfoot':
+ case 'th':
+ case 'thead':
+ case 'tr':
+ case 'body':
+ case 'html':
continue;
}
- parser.parseError(node.sourceSpan, "expected-closing-tag-but-got-eof");
+ parser.parseError(node.sourceSpan, 'expected-closing-tag-but-got-eof');
break;
}
//Stop parsing
@@ -1520,9 +1551,9 @@
// want to drop leading newlines
var data = token.data;
dropNewline = false;
- if (data.startsWith("\n")) {
+ if (data.startsWith('\n')) {
var lastOpen = tree.openElements.last;
- if (const ["pre", "listing", "textarea"].contains(lastOpen.localName) &&
+ if (const ['pre', 'listing', 'textarea'].contains(lastOpen.localName) &&
!lastOpen.hasContent()) {
data = data.substring(1);
}
@@ -1533,8 +1564,9 @@
}
}
+ @override
Token processCharacters(CharactersToken token) {
- if (token.data == "\u0000") {
+ if (token.data == '\u0000') {
//The tokenizer should always emit null on its own
return null;
}
@@ -1546,6 +1578,7 @@
return null;
}
+ @override
Token processSpaceCharacters(SpaceCharactersToken token) {
if (dropNewline) {
processSpaceCharactersDropNewline(token);
@@ -1561,9 +1594,9 @@
}
void startTagBody(StartTagToken token) {
- parser.parseError(token.span, "unexpected-start-tag", {"name": "body"});
+ parser.parseError(token.span, 'unexpected-start-tag', {'name': 'body'});
if (tree.openElements.length == 1 ||
- tree.openElements[1].localName != "body") {
+ tree.openElements[1].localName != 'body') {
assert(parser.innerHTMLMode);
} else {
parser.framesetOK = false;
@@ -1574,15 +1607,15 @@
}
void startTagFrameset(StartTagToken token) {
- parser.parseError(token.span, "unexpected-start-tag", {"name": "frameset"});
+ parser.parseError(token.span, 'unexpected-start-tag', {'name': 'frameset'});
if ((tree.openElements.length == 1 ||
- tree.openElements[1].localName != "body")) {
+ tree.openElements[1].localName != 'body')) {
assert(parser.innerHTMLMode);
} else if (parser.framesetOK) {
if (tree.openElements[1].parentNode != null) {
tree.openElements[1].parentNode.nodes.remove(tree.openElements[1]);
}
- while (tree.openElements.last.localName != "html") {
+ while (tree.openElements.last.localName != 'html') {
tree.openElements.removeLast();
}
tree.insertElement(token);
@@ -1591,15 +1624,15 @@
}
void startTagCloseP(StartTagToken token) {
- if (tree.elementInScope("p", variant: "button")) {
- endTagP(EndTagToken("p"));
+ if (tree.elementInScope('p', variant: 'button')) {
+ endTagP(EndTagToken('p'));
}
tree.insertElement(token);
}
void startTagPreListing(StartTagToken token) {
- if (tree.elementInScope("p", variant: "button")) {
- endTagP(EndTagToken("p"));
+ if (tree.elementInScope('p', variant: 'button')) {
+ endTagP(EndTagToken('p'));
}
tree.insertElement(token);
parser.framesetOK = false;
@@ -1608,10 +1641,10 @@
void startTagForm(StartTagToken token) {
if (tree.formPointer != null) {
- parser.parseError(token.span, "unexpected-start-tag", {"name": "form"});
+ parser.parseError(token.span, 'unexpected-start-tag', {'name': 'form'});
} else {
- if (tree.elementInScope("p", variant: "button")) {
- endTagP(EndTagToken("p"));
+ if (tree.elementInScope('p', variant: 'button')) {
+ endTagP(EndTagToken('p'));
}
tree.insertElement(token);
tree.formPointer = tree.openElements.last;
@@ -1622,9 +1655,9 @@
parser.framesetOK = false;
final stopNamesMap = const {
- "li": ["li"],
- "dt": ["dt", "dd"],
- "dd": ["dt", "dd"]
+ 'li': ['li'],
+ 'dt': ['dt', 'dd'],
+ 'dd': ['dt', 'dd']
};
var stopNames = stopNamesMap[token.name];
for (var node in tree.openElements.reversed) {
@@ -1633,44 +1666,44 @@
break;
}
if (specialElements.contains(getElementNameTuple(node)) &&
- !const ["address", "div", "p"].contains(node.localName)) {
+ !const ['address', 'div', 'p'].contains(node.localName)) {
break;
}
}
- if (tree.elementInScope("p", variant: "button")) {
- parser.phase.processEndTag(EndTagToken("p"));
+ if (tree.elementInScope('p', variant: 'button')) {
+ parser.phase.processEndTag(EndTagToken('p'));
}
tree.insertElement(token);
}
void startTagPlaintext(StartTagToken token) {
- if (tree.elementInScope("p", variant: "button")) {
- endTagP(EndTagToken("p"));
+ if (tree.elementInScope('p', variant: 'button')) {
+ endTagP(EndTagToken('p'));
}
tree.insertElement(token);
parser.tokenizer.state = parser.tokenizer.plaintextState;
}
void startTagHeading(StartTagToken token) {
- if (tree.elementInScope("p", variant: "button")) {
- endTagP(EndTagToken("p"));
+ if (tree.elementInScope('p', variant: 'button')) {
+ endTagP(EndTagToken('p'));
}
if (headingElements.contains(tree.openElements.last.localName)) {
parser
- .parseError(token.span, "unexpected-start-tag", {"name": token.name});
+ .parseError(token.span, 'unexpected-start-tag', {'name': token.name});
tree.openElements.removeLast();
}
tree.insertElement(token);
}
void startTagA(StartTagToken token) {
- var afeAElement = tree.elementInActiveFormattingElements("a");
+ var afeAElement = tree.elementInActiveFormattingElements('a');
if (afeAElement != null) {
- parser.parseError(token.span, "unexpected-start-tag-implies-end-tag",
- {"startName": "a", "endName": "a"});
- endTagFormatting(EndTagToken("a"));
+ parser.parseError(token.span, 'unexpected-start-tag-implies-end-tag',
+ {'startName': 'a', 'endName': 'a'});
+ endTagFormatting(EndTagToken('a'));
tree.openElements.remove(afeAElement);
tree.activeFormattingElements.remove(afeAElement);
}
@@ -1685,10 +1718,10 @@
void startTagNobr(StartTagToken token) {
tree.reconstructActiveFormattingElements();
- if (tree.elementInScope("nobr")) {
- parser.parseError(token.span, "unexpected-start-tag-implies-end-tag",
- {"startName": "nobr", "endName": "nobr"});
- processEndTag(EndTagToken("nobr"));
+ if (tree.elementInScope('nobr')) {
+ parser.parseError(token.span, 'unexpected-start-tag-implies-end-tag',
+ {'startName': 'nobr', 'endName': 'nobr'});
+ processEndTag(EndTagToken('nobr'));
// XXX Need tests that trigger the following
tree.reconstructActiveFormattingElements();
}
@@ -1696,10 +1729,10 @@
}
Token startTagButton(StartTagToken token) {
- if (tree.elementInScope("button")) {
- parser.parseError(token.span, "unexpected-start-tag-implies-end-tag",
- {"startName": "button", "endName": "button"});
- processEndTag(EndTagToken("button"));
+ if (tree.elementInScope('button')) {
+ parser.parseError(token.span, 'unexpected-start-tag-implies-end-tag',
+ {'startName': 'button', 'endName': 'button'});
+ processEndTag(EndTagToken('button'));
return token;
} else {
tree.reconstructActiveFormattingElements();
@@ -1717,18 +1750,18 @@
}
void startTagXmp(StartTagToken token) {
- if (tree.elementInScope("p", variant: "button")) {
- endTagP(EndTagToken("p"));
+ if (tree.elementInScope('p', variant: 'button')) {
+ endTagP(EndTagToken('p'));
}
tree.reconstructActiveFormattingElements();
parser.framesetOK = false;
- parser.parseRCDataRawtext(token, "RAWTEXT");
+ parser.parseRCDataRawtext(token, 'RAWTEXT');
}
void startTagTable(StartTagToken token) {
- if (parser.compatMode != "quirks") {
- if (tree.elementInScope("p", variant: "button")) {
- processEndTag(EndTagToken("p"));
+ if (parser.compatMode != 'quirks') {
+ if (tree.elementInScope('p', variant: 'button')) {
+ processEndTag(EndTagToken('p'));
}
}
tree.insertElement(token);
@@ -1747,7 +1780,7 @@
void startTagInput(StartTagToken token) {
var savedFramesetOK = parser.framesetOK;
startTagVoidFormatting(token);
- if (asciiUpper2Lower(token.data["type"]) == "hidden") {
+ if (asciiUpper2Lower(token.data['type']) == 'hidden') {
//input type=hidden doesn't change framesetOK
parser.framesetOK = savedFramesetOK;
}
@@ -1760,8 +1793,8 @@
}
void startTagHr(StartTagToken token) {
- if (tree.elementInScope("p", variant: "button")) {
- endTagP(EndTagToken("p"));
+ if (tree.elementInScope('p', variant: 'button')) {
+ endTagP(EndTagToken('p'));
}
tree.insertElement(token);
tree.openElements.removeLast();
@@ -1771,43 +1804,41 @@
void startTagImage(StartTagToken token) {
// No really...
- parser.parseError(token.span, "unexpected-start-tag-treated-as",
- {"originalName": "image", "newName": "img"});
+ parser.parseError(token.span, 'unexpected-start-tag-treated-as',
+ {'originalName': 'image', 'newName': 'img'});
processStartTag(
- StartTagToken("img", data: token.data, selfClosing: token.selfClosing));
+ StartTagToken('img', data: token.data, selfClosing: token.selfClosing));
}
void startTagIsIndex(StartTagToken token) {
- parser.parseError(token.span, "deprecated-tag", {"name": "isindex"});
+ parser.parseError(token.span, 'deprecated-tag', {'name': 'isindex'});
if (tree.formPointer != null) {
return;
}
- var formAttrs = LinkedHashMap<dynamic, String>();
- var dataAction = token.data["action"];
+ var formAttrs = <dynamic, String>{};
+ var dataAction = token.data['action'];
if (dataAction != null) {
- formAttrs["action"] = dataAction;
+ formAttrs['action'] = dataAction;
}
- processStartTag(StartTagToken("form", data: formAttrs));
+ processStartTag(StartTagToken('form', data: formAttrs));
processStartTag(
- StartTagToken("hr", data: LinkedHashMap<dynamic, String>()));
+ StartTagToken('hr', data: LinkedHashMap<dynamic, String>()));
processStartTag(
- StartTagToken("label", data: LinkedHashMap<dynamic, String>()));
+ StartTagToken('label', data: LinkedHashMap<dynamic, String>()));
// XXX Localization ...
- var prompt = token.data["prompt"];
- if (prompt == null) {
- prompt = "This is a searchable index. Enter search keywords: ";
- }
+ var prompt = token.data['prompt'];
+ prompt ??= 'This is a searchable index. Enter search keywords: ';
processCharacters(CharactersToken(prompt));
var attributes = LinkedHashMap<dynamic, String>.from(token.data);
attributes.remove('action');
attributes.remove('prompt');
- attributes["name"] = "isindex";
- processStartTag(StartTagToken("input",
+ attributes['name'] = 'isindex';
+ processStartTag(StartTagToken('input',
data: attributes, selfClosing: token.selfClosing));
- processEndTag(EndTagToken("label"));
+ processEndTag(EndTagToken('label'));
processStartTag(
- StartTagToken("hr", data: LinkedHashMap<dynamic, String>()));
- processEndTag(EndTagToken("form"));
+ StartTagToken('hr', data: LinkedHashMap<dynamic, String>()));
+ processEndTag(EndTagToken('form'));
}
void startTagTextarea(StartTagToken token) {
@@ -1824,12 +1855,12 @@
/// iframe, noembed noframes, noscript(if scripting enabled).
void startTagRawtext(StartTagToken token) {
- parser.parseRCDataRawtext(token, "RAWTEXT");
+ parser.parseRCDataRawtext(token, 'RAWTEXT');
}
void startTagOpt(StartTagToken token) {
- if (tree.openElements.last.localName == "option") {
- parser.phase.processEndTag(EndTagToken("option"));
+ if (tree.openElements.last.localName == 'option') {
+ parser.phase.processEndTag(EndTagToken('option'));
}
tree.reconstructActiveFormattingElements();
parser.tree.insertElement(token);
@@ -1853,10 +1884,10 @@
}
void startTagRpRt(StartTagToken token) {
- if (tree.elementInScope("ruby")) {
+ if (tree.elementInScope('ruby')) {
tree.generateImpliedEndTags();
var last = tree.openElements.last;
- if (last.localName != "ruby") {
+ if (last.localName != 'ruby') {
parser.parseError(last.sourceSpan, 'undefined-error');
}
}
@@ -1898,7 +1929,7 @@
/// "tr", "noscript"
void startTagMisplaced(StartTagToken token) {
parser.parseError(
- token.span, "unexpected-start-tag-ignored", {"name": token.name});
+ token.span, 'unexpected-start-tag-ignored', {'name': token.name});
}
Token startTagOther(StartTagToken token) {
@@ -1908,50 +1939,50 @@
}
void endTagP(EndTagToken token) {
- if (!tree.elementInScope("p", variant: "button")) {
+ if (!tree.elementInScope('p', variant: 'button')) {
startTagCloseP(
- StartTagToken("p", data: LinkedHashMap<dynamic, String>()));
- parser.parseError(token.span, "unexpected-end-tag", {"name": "p"});
- endTagP(EndTagToken("p"));
+ StartTagToken('p', data: LinkedHashMap<dynamic, String>()));
+ parser.parseError(token.span, 'unexpected-end-tag', {'name': 'p'});
+ endTagP(EndTagToken('p'));
} else {
- tree.generateImpliedEndTags("p");
- if (tree.openElements.last.localName != "p") {
- parser.parseError(token.span, "unexpected-end-tag", {"name": "p"});
+ tree.generateImpliedEndTags('p');
+ if (tree.openElements.last.localName != 'p') {
+ parser.parseError(token.span, 'unexpected-end-tag', {'name': 'p'});
}
popOpenElementsUntil(token);
}
}
void endTagBody(EndTagToken token) {
- if (!tree.elementInScope("body")) {
+ if (!tree.elementInScope('body')) {
parser.parseError(token.span, 'undefined-error');
return;
- } else if (tree.openElements.last.localName == "body") {
+ } else if (tree.openElements.last.localName == 'body') {
tree.openElements.last.endSourceSpan = token.span;
} else {
- for (Element node in slice(tree.openElements, 2)) {
+ for (var node in slice(tree.openElements, 2)) {
switch (node.localName) {
- case "dd":
- case "dt":
- case "li":
- case "optgroup":
- case "option":
- case "p":
- case "rp":
- case "rt":
- case "tbody":
- case "td":
- case "tfoot":
- case "th":
- case "thead":
- case "tr":
- case "body":
- case "html":
+ case 'dd':
+ case 'dt':
+ case 'li':
+ case 'optgroup':
+ case 'option':
+ case 'p':
+ case 'rp':
+ case 'rt':
+ case 'tbody':
+ case 'td':
+ case 'tfoot':
+ case 'th':
+ case 'thead':
+ case 'tr':
+ case 'body':
+ case 'html':
continue;
}
// Not sure this is the correct name for the parse error
- parser.parseError(token.span, "expected-one-end-tag-but-got-another",
- {"gotName": "body", "expectedName": node.localName});
+ parser.parseError(token.span, 'expected-one-end-tag-but-got-another',
+ {'gotName': 'body', 'expectedName': node.localName});
break;
}
}
@@ -1960,8 +1991,8 @@
Token endTagHtml(EndTagToken token) {
//We repeat the test for the body end tag token being ignored here
- if (tree.elementInScope("body")) {
- endTagBody(EndTagToken("body"));
+ if (tree.elementInScope('body')) {
+ endTagBody(EndTagToken('body'));
return token;
}
return null;
@@ -1969,7 +2000,7 @@
void endTagBlock(EndTagToken token) {
//Put us back in the right whitespace handling mode
- if (token.name == "pre") {
+ if (token.name == 'pre') {
dropNewline = false;
}
var inScope = tree.elementInScope(token.name);
@@ -1977,7 +2008,7 @@
tree.generateImpliedEndTags();
}
if (tree.openElements.last.localName != token.name) {
- parser.parseError(token.span, "end-tag-too-early", {"name": token.name});
+ parser.parseError(token.span, 'end-tag-too-early', {'name': token.name});
}
if (inScope) {
popOpenElementsUntil(token);
@@ -1988,12 +2019,12 @@
var node = tree.formPointer;
tree.formPointer = null;
if (node == null || !tree.elementInScope(node)) {
- parser.parseError(token.span, "unexpected-end-tag", {"name": "form"});
+ parser.parseError(token.span, 'unexpected-end-tag', {'name': 'form'});
} else {
tree.generateImpliedEndTags();
if (tree.openElements.last != node) {
parser.parseError(
- token.span, "end-tag-too-early-ignored", {"name": "form"});
+ token.span, 'end-tag-too-early-ignored', {'name': 'form'});
}
tree.openElements.remove(node);
node.endSourceSpan = token.span;
@@ -2002,18 +2033,18 @@
void endTagListItem(EndTagToken token) {
String variant;
- if (token.name == "li") {
- variant = "list";
+ if (token.name == 'li') {
+ variant = 'list';
} else {
variant = null;
}
if (!tree.elementInScope(token.name, variant: variant)) {
- parser.parseError(token.span, "unexpected-end-tag", {"name": token.name});
+ parser.parseError(token.span, 'unexpected-end-tag', {'name': token.name});
} else {
tree.generateImpliedEndTags(token.name);
if (tree.openElements.last.localName != token.name) {
parser
- .parseError(token.span, "end-tag-too-early", {"name": token.name});
+ .parseError(token.span, 'end-tag-too-early', {'name': token.name});
}
popOpenElementsUntil(token);
}
@@ -2027,12 +2058,12 @@
}
}
if (tree.openElements.last.localName != token.name) {
- parser.parseError(token.span, "end-tag-too-early", {"name": token.name});
+ parser.parseError(token.span, 'end-tag-too-early', {'name': token.name});
}
for (var item in headingElements) {
if (tree.elementInScope(item)) {
- Element node = tree.openElements.removeLast();
+ var node = tree.openElements.removeLast();
while (!headingElements.contains(node.localName)) {
node = tree.openElements.removeLast();
}
@@ -2051,7 +2082,7 @@
// updated spec. This needs a pass over it to verify that it still matches.
// In particular the html5lib Python code skiped "step 4", I'm not sure why.
// XXX Better parseError messages appreciated.
- int outerLoopCounter = 0;
+ var outerLoopCounter = 0;
while (outerLoopCounter < 8) {
outerLoopCounter += 1;
@@ -2062,12 +2093,12 @@
(tree.openElements.contains(formattingElement) &&
!tree.elementInScope(formattingElement.localName))) {
parser.parseError(
- token.span, "adoption-agency-1.1", {"name": token.name});
+ token.span, 'adoption-agency-1.1', {'name': token.name});
return;
// Step 1 paragraph 2
} else if (!tree.openElements.contains(formattingElement)) {
parser.parseError(
- token.span, "adoption-agency-1.2", {"name": token.name});
+ token.span, 'adoption-agency-1.2', {'name': token.name});
tree.activeFormattingElements.remove(formattingElement);
return;
}
@@ -2075,14 +2106,14 @@
// Step 1 paragraph 3
if (formattingElement != tree.openElements.last) {
parser.parseError(
- token.span, "adoption-agency-1.3", {"name": token.name});
+ token.span, 'adoption-agency-1.3', {'name': token.name});
}
// Step 2
// Start of the adoption agency algorithm proper
var afeIndex = tree.openElements.indexOf(formattingElement);
Node furthestBlock;
- for (Node element in slice(tree.openElements, afeIndex)) {
+ for (var element in slice(tree.openElements, afeIndex)) {
if (specialElements.contains(getElementNameTuple(element))) {
furthestBlock = element;
break;
@@ -2090,7 +2121,7 @@
}
// Step 3
if (furthestBlock == null) {
- Element element = tree.openElements.removeLast();
+ var element = tree.openElements.removeLast();
while (element != formattingElement) {
element = tree.openElements.removeLast();
}
@@ -2111,9 +2142,9 @@
var bookmark = tree.activeFormattingElements.indexOf(formattingElement);
// Step 6
- Node lastNode = furthestBlock;
+ var lastNode = furthestBlock;
var node = furthestBlock;
- int innerLoopCounter = 0;
+ var innerLoopCounter = 0;
var index = tree.openElements.indexOf(node);
while (innerLoopCounter < 3) {
@@ -2162,7 +2193,7 @@
lastNode.parentNode.nodes.remove(lastNode);
}
- if (const ["table", "tbody", "tfoot", "thead", "tr"]
+ if (const ['table', 'tbody', 'tfoot', 'thead', 'tr']
.contains(commonAncestor.localName)) {
var nodePos = tree.getTableMisnestedNodePosition();
nodePos[0].insertBefore(lastNode, nodePos[1]);
@@ -2196,7 +2227,7 @@
tree.generateImpliedEndTags();
}
if (tree.openElements.last.localName != token.name) {
- parser.parseError(token.span, "end-tag-too-early", {"name": token.name});
+ parser.parseError(token.span, 'end-tag-too-early', {'name': token.name});
}
if (tree.elementInScope(token.name)) {
popOpenElementsUntil(token);
@@ -2205,11 +2236,11 @@
}
void endTagBr(EndTagToken token) {
- parser.parseError(token.span, "unexpected-end-tag-treated-as",
- {"originalName": "br", "newName": "br element"});
+ parser.parseError(token.span, 'unexpected-end-tag-treated-as',
+ {'originalName': 'br', 'newName': 'br element'});
tree.reconstructActiveFormattingElements();
tree.insertElement(
- StartTagToken("br", data: LinkedHashMap<dynamic, String>()));
+ StartTagToken('br', data: LinkedHashMap<dynamic, String>()));
tree.openElements.removeLast();
}
@@ -2219,7 +2250,7 @@
tree.generateImpliedEndTags(token.name);
if (tree.openElements.last.localName != token.name) {
parser.parseError(
- token.span, "unexpected-end-tag", {"name": token.name});
+ token.span, 'unexpected-end-tag', {'name': token.name});
}
while (tree.openElements.removeLast() != node) {
// noop
@@ -2229,7 +2260,7 @@
} else {
if (specialElements.contains(getElementNameTuple(node))) {
parser.parseError(
- token.span, "unexpected-end-tag", {"name": token.name});
+ token.span, 'unexpected-end-tag', {'name': token.name});
break;
}
}
@@ -2241,11 +2272,13 @@
TextPhase(parser) : super(parser);
// "Tried to process start tag %s in RCDATA/RAWTEXT mode"%token.name
+ @override
// ignore: missing_return
Token processStartTag(StartTagToken token) {
assert(false);
}
+ @override
Token processEndTag(EndTagToken token) {
if (token.name == 'script') {
endTagScript(token);
@@ -2255,14 +2288,16 @@
return null;
}
+ @override
Token processCharacters(CharactersToken token) {
tree.insertText(token.data, token.span);
return null;
}
+ @override
bool processEOF() {
var last = tree.openElements.last;
- parser.parseError(last.sourceSpan, "expected-named-closing-tag-but-got-eof",
+ parser.parseError(last.sourceSpan, 'expected-named-closing-tag-but-got-eof',
{'name': last.localName});
tree.openElements.removeLast();
parser.phase = parser.originalPhase;
@@ -2271,7 +2306,7 @@
void endTagScript(EndTagToken token) {
var node = tree.openElements.removeLast();
- assert(node.localName == "script");
+ assert(node.localName == 'script');
parser.phase = parser.originalPhase;
//The rest of this method is all stuff that only happens if
//document.write works
@@ -2287,36 +2322,37 @@
// http://www.whatwg.org/specs/web-apps/current-work///in-table
InTablePhase(parser) : super(parser);
+ @override
Token processStartTag(StartTagToken token) {
switch (token.name) {
- case "html":
+ case 'html':
return startTagHtml(token);
- case "caption":
+ case 'caption':
startTagCaption(token);
return null;
- case "colgroup":
+ case 'colgroup':
startTagColgroup(token);
return null;
- case "col":
+ case 'col':
return startTagCol(token);
- case "tbody":
- case "tfoot":
- case "thead":
+ case 'tbody':
+ case 'tfoot':
+ case 'thead':
startTagRowGroup(token);
return null;
- case "td":
- case "th":
- case "tr":
+ case 'td':
+ case 'th':
+ case 'tr':
return startTagImplyTbody(token);
- case "table":
+ case 'table':
return startTagTable(token);
- case "style":
- case "script":
+ case 'style':
+ case 'script':
return startTagStyleScript(token);
- case "input":
+ case 'input':
startTagInput(token);
return null;
- case "form":
+ case 'form':
startTagForm(token);
return null;
default:
@@ -2325,22 +2361,23 @@
}
}
+ @override
Token processEndTag(EndTagToken token) {
switch (token.name) {
- case "table":
+ case 'table':
endTagTable(token);
return null;
- case "body":
- case "caption":
- case "col":
- case "colgroup":
- case "html":
- case "tbody":
- case "td":
- case "tfoot":
- case "th":
- case "thead":
- case "tr":
+ case 'body':
+ case 'caption':
+ case 'col':
+ case 'colgroup':
+ case 'html':
+ case 'tbody':
+ case 'td':
+ case 'tfoot':
+ case 'th':
+ case 'thead':
+ case 'tr':
endTagIgnore(token);
return null;
default:
@@ -2351,9 +2388,9 @@
// helper methods
void clearStackToTableContext() {
- // "clear the stack back to a table context"
- while (tree.openElements.last.localName != "table" &&
- tree.openElements.last.localName != "html") {
+ // 'clear the stack back to a table context'
+ while (tree.openElements.last.localName != 'table' &&
+ tree.openElements.last.localName != 'html') {
//parser.parseError(token.span, "unexpected-implied-end-tag-in-table",
// {"name": tree.openElements.last.name})
tree.openElements.removeLast();
@@ -2362,10 +2399,11 @@
}
// processing methods
+ @override
bool processEOF() {
var last = tree.openElements.last;
- if (last.localName != "html") {
- parser.parseError(last.sourceSpan, "eof-in-table");
+ if (last.localName != 'html') {
+ parser.parseError(last.sourceSpan, 'eof-in-table');
} else {
assert(parser.innerHTMLMode);
}
@@ -2373,6 +2411,7 @@
return false;
}
+ @override
Token processSpaceCharacters(SpaceCharactersToken token) {
var originalPhase = parser.phase;
parser.phase = parser._inTableTextPhase;
@@ -2381,6 +2420,7 @@
return null;
}
+ @override
Token processCharacters(CharactersToken token) {
var originalPhase = parser.phase;
parser.phase = parser._inTableTextPhase;
@@ -2412,7 +2452,7 @@
Token startTagCol(StartTagToken token) {
startTagColgroup(
- StartTagToken("colgroup", data: LinkedHashMap<dynamic, String>()));
+ StartTagToken('colgroup', data: LinkedHashMap<dynamic, String>()));
return token;
}
@@ -2424,14 +2464,14 @@
Token startTagImplyTbody(StartTagToken token) {
startTagRowGroup(
- StartTagToken("tbody", data: LinkedHashMap<dynamic, String>()));
+ StartTagToken('tbody', data: LinkedHashMap<dynamic, String>()));
return token;
}
Token startTagTable(StartTagToken token) {
- parser.parseError(token.span, "unexpected-start-tag-implies-end-tag",
- {"startName": "table", "endName": "table"});
- parser.phase.processEndTag(EndTagToken("table"));
+ parser.parseError(token.span, 'unexpected-start-tag-implies-end-tag',
+ {'startName': 'table', 'endName': 'table'});
+ parser.phase.processEndTag(EndTagToken('table'));
if (!parser.innerHTMLMode) {
return token;
}
@@ -2443,8 +2483,8 @@
}
void startTagInput(StartTagToken token) {
- if (asciiUpper2Lower(token.data["type"]) == "hidden") {
- parser.parseError(token.span, "unexpected-hidden-input-in-table");
+ if (asciiUpper2Lower(token.data['type']) == 'hidden') {
+ parser.parseError(token.span, 'unexpected-hidden-input-in-table');
tree.insertElement(token);
// XXX associate with form
tree.openElements.removeLast();
@@ -2454,7 +2494,7 @@
}
void startTagForm(StartTagToken token) {
- parser.parseError(token.span, "unexpected-form-in-table");
+ parser.parseError(token.span, 'unexpected-form-in-table');
if (tree.formPointer == null) {
tree.insertElement(token);
tree.formPointer = tree.openElements.last;
@@ -2463,8 +2503,8 @@
}
void startTagOther(StartTagToken token) {
- parser.parseError(token.span, "unexpected-start-tag-implies-table-voodoo",
- {"name": token.name});
+ parser.parseError(token.span, 'unexpected-start-tag-implies-table-voodoo',
+ {'name': token.name});
// Do the table magic!
tree.insertFromTable = true;
parser._inBodyPhase.processStartTag(token);
@@ -2472,14 +2512,14 @@
}
void endTagTable(EndTagToken token) {
- if (tree.elementInScope("table", variant: "table")) {
+ if (tree.elementInScope('table', variant: 'table')) {
tree.generateImpliedEndTags();
var last = tree.openElements.last;
- if (last.localName != "table") {
- parser.parseError(token.span, "end-tag-too-early-named",
- {"gotName": "table", "expectedName": last.localName});
+ if (last.localName != 'table') {
+ parser.parseError(token.span, 'end-tag-too-early-named',
+ {'gotName': 'table', 'expectedName': last.localName});
}
- while (tree.openElements.last.localName != "table") {
+ while (tree.openElements.last.localName != 'table') {
tree.openElements.removeLast();
}
var node = tree.openElements.removeLast();
@@ -2488,17 +2528,17 @@
} else {
// innerHTML case
assert(parser.innerHTMLMode);
- parser.parseError(token.span, "undefined-error");
+ parser.parseError(token.span, 'undefined-error');
}
}
void endTagIgnore(EndTagToken token) {
- parser.parseError(token.span, "unexpected-end-tag", {"name": token.name});
+ parser.parseError(token.span, 'unexpected-end-tag', {'name': token.name});
}
void endTagOther(EndTagToken token) {
- parser.parseError(token.span, "unexpected-end-tag-implies-table-voodoo",
- {"name": token.name});
+ parser.parseError(token.span, 'unexpected-end-tag-implies-table-voodoo',
+ {'name': token.name});
// Do the table magic!
tree.insertFromTable = true;
parser._inBodyPhase.processEndTag(token);
@@ -2533,26 +2573,30 @@
characterTokens = <StringToken>[];
}
+ @override
Token processComment(CommentToken token) {
flushCharacters();
parser.phase = originalPhase;
return token;
}
+ @override
bool processEOF() {
flushCharacters();
parser.phase = originalPhase;
return true;
}
+ @override
Token processCharacters(CharactersToken token) {
- if (token.data == "\u0000") {
+ if (token.data == '\u0000') {
return null;
}
characterTokens.add(token);
return null;
}
+ @override
Token processSpaceCharacters(SpaceCharactersToken token) {
//pretty sure we should never reach here
characterTokens.add(token);
@@ -2560,12 +2604,14 @@
return null;
}
+ @override
Token processStartTag(StartTagToken token) {
flushCharacters();
parser.phase = originalPhase;
return token;
}
+ @override
Token processEndTag(EndTagToken token) {
flushCharacters();
parser.phase = originalPhase;
@@ -2577,42 +2623,44 @@
// http://www.whatwg.org/specs/web-apps/current-work///in-caption
InCaptionPhase(parser) : super(parser);
+ @override
Token processStartTag(StartTagToken token) {
switch (token.name) {
- case "html":
+ case 'html':
return startTagHtml(token);
- case "caption":
- case "col":
- case "colgroup":
- case "tbody":
- case "td":
- case "tfoot":
- case "th":
- case "thead":
- case "tr":
+ case 'caption':
+ case 'col':
+ case 'colgroup':
+ case 'tbody':
+ case 'td':
+ case 'tfoot':
+ case 'th':
+ case 'thead':
+ case 'tr':
return startTagTableElement(token);
default:
return startTagOther(token);
}
}
+ @override
Token processEndTag(EndTagToken token) {
switch (token.name) {
- case "caption":
+ case 'caption':
endTagCaption(token);
return null;
- case "table":
+ case 'table':
return endTagTable(token);
- case "body":
- case "col":
- case "colgroup":
- case "html":
- case "tbody":
- case "td":
- case "tfoot":
- case "th":
- case "thead":
- case "tr":
+ case 'body':
+ case 'col':
+ case 'colgroup':
+ case 'html':
+ case 'tbody':
+ case 'td':
+ case 'tfoot':
+ case 'th':
+ case 'thead':
+ case 'tr':
endTagIgnore(token);
return null;
default:
@@ -2621,23 +2669,25 @@
}
bool ignoreEndTagCaption() {
- return !tree.elementInScope("caption", variant: "table");
+ return !tree.elementInScope('caption', variant: 'table');
}
+ @override
bool processEOF() {
parser._inBodyPhase.processEOF();
return false;
}
+ @override
Token processCharacters(CharactersToken token) {
return parser._inBodyPhase.processCharacters(token);
}
Token startTagTableElement(StartTagToken token) {
- parser.parseError(token.span, "undefined-error");
+ parser.parseError(token.span, 'undefined-error');
//XXX Have to duplicate logic here to find out if the tag is ignored
var ignoreEndTag = ignoreEndTagCaption();
- parser.phase.processEndTag(EndTagToken("caption"));
+ parser.phase.processEndTag(EndTagToken('caption'));
if (!ignoreEndTag) {
return token;
}
@@ -2652,13 +2702,13 @@
if (!ignoreEndTagCaption()) {
// AT this code is quite similar to endTagTable in "InTable"
tree.generateImpliedEndTags();
- if (tree.openElements.last.localName != "caption") {
- parser.parseError(token.span, "expected-one-end-tag-but-got-another", {
- "gotName": "caption",
- "expectedName": tree.openElements.last.localName
+ if (tree.openElements.last.localName != 'caption') {
+ parser.parseError(token.span, 'expected-one-end-tag-but-got-another', {
+ 'gotName': 'caption',
+ 'expectedName': tree.openElements.last.localName
});
}
- while (tree.openElements.last.localName != "caption") {
+ while (tree.openElements.last.localName != 'caption') {
tree.openElements.removeLast();
}
var node = tree.openElements.removeLast();
@@ -2668,14 +2718,14 @@
} else {
// innerHTML case
assert(parser.innerHTMLMode);
- parser.parseError(token.span, "undefined-error");
+ parser.parseError(token.span, 'undefined-error');
}
}
Token endTagTable(EndTagToken token) {
- parser.parseError(token.span, "undefined-error");
+ parser.parseError(token.span, 'undefined-error');
var ignoreEndTag = ignoreEndTagCaption();
- parser.phase.processEndTag(EndTagToken("caption"));
+ parser.phase.processEndTag(EndTagToken('caption'));
if (!ignoreEndTag) {
return token;
}
@@ -2683,7 +2733,7 @@
}
void endTagIgnore(EndTagToken token) {
- parser.parseError(token.span, "unexpected-end-tag", {"name": token.name});
+ parser.parseError(token.span, 'unexpected-end-tag', {'name': token.name});
}
Token endTagOther(EndTagToken token) {
@@ -2695,11 +2745,12 @@
// http://www.whatwg.org/specs/web-apps/current-work///in-column
InColumnGroupPhase(parser) : super(parser);
+ @override
Token processStartTag(StartTagToken token) {
switch (token.name) {
- case "html":
+ case 'html':
return startTagHtml(token);
- case "col":
+ case 'col':
startTagCol(token);
return null;
default:
@@ -2707,12 +2758,13 @@
}
}
+ @override
Token processEndTag(EndTagToken token) {
switch (token.name) {
- case "colgroup":
+ case 'colgroup':
endTagColgroup(token);
return null;
- case "col":
+ case 'col':
endTagCol(token);
return null;
default:
@@ -2721,23 +2773,25 @@
}
bool ignoreEndTagColgroup() {
- return tree.openElements.last.localName == "html";
+ return tree.openElements.last.localName == 'html';
}
+ @override
bool processEOF() {
var ignoreEndTag = ignoreEndTagColgroup();
if (ignoreEndTag) {
assert(parser.innerHTMLMode);
return false;
} else {
- endTagColgroup(EndTagToken("colgroup"));
+ endTagColgroup(EndTagToken('colgroup'));
return true;
}
}
+ @override
Token processCharacters(CharactersToken token) {
var ignoreEndTag = ignoreEndTagColgroup();
- endTagColgroup(EndTagToken("colgroup"));
+ endTagColgroup(EndTagToken('colgroup'));
return ignoreEndTag ? null : token;
}
@@ -2748,7 +2802,7 @@
Token startTagOther(StartTagToken token) {
var ignoreEndTag = ignoreEndTagColgroup();
- endTagColgroup(EndTagToken("colgroup"));
+ endTagColgroup(EndTagToken('colgroup'));
return ignoreEndTag ? null : token;
}
@@ -2756,7 +2810,7 @@
if (ignoreEndTagColgroup()) {
// innerHTML case
assert(parser.innerHTMLMode);
- parser.parseError(token.span, "undefined-error");
+ parser.parseError(token.span, 'undefined-error');
} else {
var node = tree.openElements.removeLast();
node.endSourceSpan = token.span;
@@ -2765,12 +2819,12 @@
}
void endTagCol(EndTagToken token) {
- parser.parseError(token.span, "no-end-tag", {"name": "col"});
+ parser.parseError(token.span, 'no-end-tag', {'name': 'col'});
}
Token endTagOther(EndTagToken token) {
var ignoreEndTag = ignoreEndTagColgroup();
- endTagColgroup(EndTagToken("colgroup"));
+ endTagColgroup(EndTagToken('colgroup'));
return ignoreEndTag ? null : token;
}
}
@@ -2779,45 +2833,47 @@
// http://www.whatwg.org/specs/web-apps/current-work///in-table0
InTableBodyPhase(parser) : super(parser);
+ @override
Token processStartTag(StartTagToken token) {
switch (token.name) {
- case "html":
+ case 'html':
return startTagHtml(token);
- case "tr":
+ case 'tr':
startTagTr(token);
return null;
- case "td":
- case "th":
+ case 'td':
+ case 'th':
return startTagTableCell(token);
- case "caption":
- case "col":
- case "colgroup":
- case "tbody":
- case "tfoot":
- case "thead":
+ case 'caption':
+ case 'col':
+ case 'colgroup':
+ case 'tbody':
+ case 'tfoot':
+ case 'thead':
return startTagTableOther(token);
default:
return startTagOther(token);
}
}
+ @override
Token processEndTag(EndTagToken token) {
switch (token.name) {
- case "tbody":
- case "tfoot":
- case "thead":
+ case 'tbody':
+ case 'tfoot':
+ case 'thead':
endTagTableRowGroup(token);
return null;
- case "table":
+ case 'table':
return endTagTable(token);
- case "body":
- case "caption":
- case "col":
- case "colgroup":
- case "html":
- case "td":
- case "th":
- case "tr":
+ case 'body':
+ case 'caption':
+ case 'col':
+ case 'colgroup':
+ case 'html':
+ case 'td':
+ case 'th':
+ case 'tr':
endTagIgnore(token);
return null;
default:
@@ -2827,27 +2883,30 @@
// helper methods
void clearStackToTableBodyContext() {
- var tableTags = const ["tbody", "tfoot", "thead", "html"];
+ var tableTags = const ['tbody', 'tfoot', 'thead', 'html'];
while (!tableTags.contains(tree.openElements.last.localName)) {
//XXX parser.parseError(token.span, "unexpected-implied-end-tag-in-table",
// {"name": tree.openElements.last.name})
tree.openElements.removeLast();
}
- if (tree.openElements.last.localName == "html") {
+ if (tree.openElements.last.localName == 'html') {
assert(parser.innerHTMLMode);
}
}
// the rest
+ @override
bool processEOF() {
parser._inTablePhase.processEOF();
return false;
}
+ @override
Token processSpaceCharacters(SpaceCharactersToken token) {
return parser._inTablePhase.processSpaceCharacters(token);
}
+ @override
Token processCharacters(CharactersToken token) {
return parser._inTablePhase.processCharacters(token);
}
@@ -2860,8 +2919,8 @@
Token startTagTableCell(StartTagToken token) {
parser.parseError(
- token.span, "unexpected-cell-in-table-body", {"name": token.name});
- startTagTr(StartTagToken("tr", data: LinkedHashMap<dynamic, String>()));
+ token.span, 'unexpected-cell-in-table-body', {'name': token.name});
+ startTagTr(StartTagToken('tr', data: LinkedHashMap<dynamic, String>()));
return token;
}
@@ -2872,36 +2931,36 @@
}
void endTagTableRowGroup(EndTagToken token) {
- if (tree.elementInScope(token.name, variant: "table")) {
+ if (tree.elementInScope(token.name, variant: 'table')) {
clearStackToTableBodyContext();
var node = tree.openElements.removeLast();
node.endSourceSpan = token.span;
parser.phase = parser._inTablePhase;
} else {
parser.parseError(
- token.span, "unexpected-end-tag-in-table-body", {"name": token.name});
+ token.span, 'unexpected-end-tag-in-table-body', {'name': token.name});
}
}
Token endTagTable(TagToken token) {
// XXX AT Any ideas on how to share this with endTagTable?
- if (tree.elementInScope("tbody", variant: "table") ||
- tree.elementInScope("thead", variant: "table") ||
- tree.elementInScope("tfoot", variant: "table")) {
+ if (tree.elementInScope('tbody', variant: 'table') ||
+ tree.elementInScope('thead', variant: 'table') ||
+ tree.elementInScope('tfoot', variant: 'table')) {
clearStackToTableBodyContext();
endTagTableRowGroup(EndTagToken(tree.openElements.last.localName));
return token;
} else {
// innerHTML case
assert(parser.innerHTMLMode);
- parser.parseError(token.span, "undefined-error");
+ parser.parseError(token.span, 'undefined-error');
}
return null;
}
void endTagIgnore(EndTagToken token) {
parser.parseError(
- token.span, "unexpected-end-tag-in-table-body", {"name": token.name});
+ token.span, 'unexpected-end-tag-in-table-body', {'name': token.name});
}
Token endTagOther(EndTagToken token) {
@@ -2913,45 +2972,47 @@
// http://www.whatwg.org/specs/web-apps/current-work///in-row
InRowPhase(parser) : super(parser);
+ @override
Token processStartTag(StartTagToken token) {
switch (token.name) {
- case "html":
+ case 'html':
return startTagHtml(token);
- case "td":
- case "th":
+ case 'td':
+ case 'th':
startTagTableCell(token);
return null;
- case "caption":
- case "col":
- case "colgroup":
- case "tbody":
- case "tfoot":
- case "thead":
- case "tr":
+ case 'caption':
+ case 'col':
+ case 'colgroup':
+ case 'tbody':
+ case 'tfoot':
+ case 'thead':
+ case 'tr':
return startTagTableOther(token);
default:
return startTagOther(token);
}
}
+ @override
Token processEndTag(EndTagToken token) {
switch (token.name) {
- case "tr":
+ case 'tr':
endTagTr(token);
return null;
- case "table":
+ case 'table':
return endTagTable(token);
- case "tbody":
- case "tfoot":
- case "thead":
+ case 'tbody':
+ case 'tfoot':
+ case 'thead':
return endTagTableRowGroup(token);
- case "body":
- case "caption":
- case "col":
- case "colgroup":
- case "html":
- case "td":
- case "th":
+ case 'body':
+ case 'caption':
+ case 'col':
+ case 'colgroup':
+ case 'html':
+ case 'td':
+ case 'th':
endTagIgnore(token);
return null;
default:
@@ -2963,30 +3024,33 @@
void clearStackToTableRowContext() {
while (true) {
var last = tree.openElements.last;
- if (last.localName == "tr" || last.localName == "html") break;
+ if (last.localName == 'tr' || last.localName == 'html') break;
parser.parseError(
last.sourceSpan,
- "unexpected-implied-end-tag-in-table-row",
- {"name": tree.openElements.last.localName});
+ 'unexpected-implied-end-tag-in-table-row',
+ {'name': tree.openElements.last.localName});
tree.openElements.removeLast();
}
}
bool ignoreEndTagTr() {
- return !tree.elementInScope("tr", variant: "table");
+ return !tree.elementInScope('tr', variant: 'table');
}
// the rest
+ @override
bool processEOF() {
parser._inTablePhase.processEOF();
return false;
}
+ @override
Token processSpaceCharacters(SpaceCharactersToken token) {
return parser._inTablePhase.processSpaceCharacters(token);
}
+ @override
Token processCharacters(CharactersToken token) {
return parser._inTablePhase.processCharacters(token);
}
@@ -2999,8 +3063,8 @@
}
Token startTagTableOther(StartTagToken token) {
- bool ignoreEndTag = ignoreEndTagTr();
- endTagTr(EndTagToken("tr"));
+ var ignoreEndTag = ignoreEndTagTr();
+ endTagTr(EndTagToken('tr'));
// XXX how are we sure it's always ignored in the innerHTML case?
return ignoreEndTag ? null : token;
}
@@ -3018,31 +3082,31 @@
} else {
// innerHTML case
assert(parser.innerHTMLMode);
- parser.parseError(token.span, "undefined-error");
+ parser.parseError(token.span, 'undefined-error');
}
}
Token endTagTable(EndTagToken token) {
var ignoreEndTag = ignoreEndTagTr();
- endTagTr(EndTagToken("tr"));
+ endTagTr(EndTagToken('tr'));
// Reprocess the current tag if the tr end tag was not ignored
// XXX how are we sure it's always ignored in the innerHTML case?
return ignoreEndTag ? null : token;
}
Token endTagTableRowGroup(EndTagToken token) {
- if (tree.elementInScope(token.name, variant: "table")) {
- endTagTr(EndTagToken("tr"));
+ if (tree.elementInScope(token.name, variant: 'table')) {
+ endTagTr(EndTagToken('tr'));
return token;
} else {
- parser.parseError(token.span, "undefined-error");
+ parser.parseError(token.span, 'undefined-error');
return null;
}
}
void endTagIgnore(EndTagToken token) {
parser.parseError(
- token.span, "unexpected-end-tag-in-table-row", {"name": token.name});
+ token.span, 'unexpected-end-tag-in-table-row', {'name': token.name});
}
Token endTagOther(EndTagToken token) {
@@ -3054,43 +3118,45 @@
// http://www.whatwg.org/specs/web-apps/current-work///in-cell
InCellPhase(parser) : super(parser);
+ @override
Token processStartTag(StartTagToken token) {
switch (token.name) {
- case "html":
+ case 'html':
return startTagHtml(token);
- case "caption":
- case "col":
- case "colgroup":
- case "tbody":
- case "td":
- case "tfoot":
- case "th":
- case "thead":
- case "tr":
+ case 'caption':
+ case 'col':
+ case 'colgroup':
+ case 'tbody':
+ case 'td':
+ case 'tfoot':
+ case 'th':
+ case 'thead':
+ case 'tr':
return startTagTableOther(token);
default:
return startTagOther(token);
}
}
+ @override
Token processEndTag(EndTagToken token) {
switch (token.name) {
- case "td":
- case "th":
+ case 'td':
+ case 'th':
endTagTableCell(token);
return null;
- case "body":
- case "caption":
- case "col":
- case "colgroup":
- case "html":
+ case 'body':
+ case 'caption':
+ case 'col':
+ case 'colgroup':
+ case 'html':
endTagIgnore(token);
return null;
- case "table":
- case "tbody":
- case "tfoot":
- case "thead":
- case "tr":
+ case 'table':
+ case 'tbody':
+ case 'tfoot':
+ case 'thead':
+ case 'tr':
return endTagImply(token);
default:
return endTagOther(token);
@@ -3099,32 +3165,34 @@
// helper
void closeCell() {
- if (tree.elementInScope("td", variant: "table")) {
- endTagTableCell(EndTagToken("td"));
- } else if (tree.elementInScope("th", variant: "table")) {
- endTagTableCell(EndTagToken("th"));
+ if (tree.elementInScope('td', variant: 'table')) {
+ endTagTableCell(EndTagToken('td'));
+ } else if (tree.elementInScope('th', variant: 'table')) {
+ endTagTableCell(EndTagToken('th'));
}
}
// the rest
+ @override
bool processEOF() {
parser._inBodyPhase.processEOF();
return false;
}
+ @override
Token processCharacters(CharactersToken token) {
return parser._inBodyPhase.processCharacters(token);
}
Token startTagTableOther(StartTagToken token) {
- if (tree.elementInScope("td", variant: "table") ||
- tree.elementInScope("th", variant: "table")) {
+ if (tree.elementInScope('td', variant: 'table') ||
+ tree.elementInScope('th', variant: 'table')) {
closeCell();
return token;
} else {
// innerHTML case
assert(parser.innerHTMLMode);
- parser.parseError(token.span, "undefined-error");
+ parser.parseError(token.span, 'undefined-error');
return null;
}
}
@@ -3134,11 +3202,11 @@
}
void endTagTableCell(EndTagToken token) {
- if (tree.elementInScope(token.name, variant: "table")) {
+ if (tree.elementInScope(token.name, variant: 'table')) {
tree.generateImpliedEndTags(token.name);
if (tree.openElements.last.localName != token.name) {
parser.parseError(
- token.span, "unexpected-cell-end-tag", {"name": token.name});
+ token.span, 'unexpected-cell-end-tag', {'name': token.name});
popOpenElementsUntil(token);
} else {
var node = tree.openElements.removeLast();
@@ -3147,21 +3215,21 @@
tree.clearActiveFormattingElements();
parser.phase = parser._inRowPhase;
} else {
- parser.parseError(token.span, "unexpected-end-tag", {"name": token.name});
+ parser.parseError(token.span, 'unexpected-end-tag', {'name': token.name});
}
}
void endTagIgnore(EndTagToken token) {
- parser.parseError(token.span, "unexpected-end-tag", {"name": token.name});
+ parser.parseError(token.span, 'unexpected-end-tag', {'name': token.name});
}
Token endTagImply(EndTagToken token) {
- if (tree.elementInScope(token.name, variant: "table")) {
+ if (tree.elementInScope(token.name, variant: 'table')) {
closeCell();
return token;
} else {
// sometimes innerHTML case
- parser.parseError(token.span, "undefined-error");
+ parser.parseError(token.span, 'undefined-error');
}
return null;
}
@@ -3174,39 +3242,41 @@
class InSelectPhase extends Phase {
InSelectPhase(parser) : super(parser);
+ @override
Token processStartTag(StartTagToken token) {
switch (token.name) {
- case "html":
+ case 'html':
return startTagHtml(token);
- case "option":
+ case 'option':
startTagOption(token);
return null;
- case "optgroup":
+ case 'optgroup':
startTagOptgroup(token);
return null;
- case "select":
+ case 'select':
startTagSelect(token);
return null;
- case "input":
- case "keygen":
- case "textarea":
+ case 'input':
+ case 'keygen':
+ case 'textarea':
return startTagInput(token);
- case "script":
+ case 'script':
return startTagScript(token);
default:
return startTagOther(token);
}
}
+ @override
Token processEndTag(EndTagToken token) {
switch (token.name) {
- case "option":
+ case 'option':
endTagOption(token);
return null;
- case "optgroup":
+ case 'optgroup':
endTagOptgroup(token);
return null;
- case "select":
+ case 'select':
endTagSelect(token);
return null;
default:
@@ -3216,18 +3286,20 @@
}
// http://www.whatwg.org/specs/web-apps/current-work///in-select
+ @override
bool processEOF() {
var last = tree.openElements.last;
- if (last.localName != "html") {
- parser.parseError(last.sourceSpan, "eof-in-select");
+ if (last.localName != 'html') {
+ parser.parseError(last.sourceSpan, 'eof-in-select');
} else {
assert(parser.innerHTMLMode);
}
return false;
}
+ @override
Token processCharacters(CharactersToken token) {
- if (token.data == "\u0000") {
+ if (token.data == '\u0000') {
return null;
}
tree.insertText(token.data, token.span);
@@ -3236,31 +3308,31 @@
void startTagOption(StartTagToken token) {
// We need to imply </option> if <option> is the current node.
- if (tree.openElements.last.localName == "option") {
+ if (tree.openElements.last.localName == 'option') {
tree.openElements.removeLast();
}
tree.insertElement(token);
}
void startTagOptgroup(StartTagToken token) {
- if (tree.openElements.last.localName == "option") {
+ if (tree.openElements.last.localName == 'option') {
tree.openElements.removeLast();
}
- if (tree.openElements.last.localName == "optgroup") {
+ if (tree.openElements.last.localName == 'optgroup') {
tree.openElements.removeLast();
}
tree.insertElement(token);
}
void startTagSelect(StartTagToken token) {
- parser.parseError(token.span, "unexpected-select-in-select");
- endTagSelect(EndTagToken("select"));
+ parser.parseError(token.span, 'unexpected-select-in-select');
+ endTagSelect(EndTagToken('select'));
}
Token startTagInput(StartTagToken token) {
- parser.parseError(token.span, "unexpected-input-in-select");
- if (tree.elementInScope("select", variant: "select")) {
- endTagSelect(EndTagToken("select"));
+ parser.parseError(token.span, 'unexpected-input-in-select');
+ if (tree.elementInScope('select', variant: 'select')) {
+ endTagSelect(EndTagToken('select'));
return token;
} else {
assert(parser.innerHTMLMode);
@@ -3274,95 +3346,99 @@
Token startTagOther(StartTagToken token) {
parser.parseError(
- token.span, "unexpected-start-tag-in-select", {"name": token.name});
+ token.span, 'unexpected-start-tag-in-select', {'name': token.name});
return null;
}
void endTagOption(EndTagToken token) {
- if (tree.openElements.last.localName == "option") {
+ if (tree.openElements.last.localName == 'option') {
var node = tree.openElements.removeLast();
node.endSourceSpan = token.span;
} else {
parser.parseError(
- token.span, "unexpected-end-tag-in-select", {"name": "option"});
+ token.span, 'unexpected-end-tag-in-select', {'name': 'option'});
}
}
void endTagOptgroup(EndTagToken token) {
// </optgroup> implicitly closes <option>
- if (tree.openElements.last.localName == "option" &&
+ if (tree.openElements.last.localName == 'option' &&
tree.openElements[tree.openElements.length - 2].localName ==
- "optgroup") {
+ 'optgroup') {
tree.openElements.removeLast();
}
// It also closes </optgroup>
- if (tree.openElements.last.localName == "optgroup") {
+ if (tree.openElements.last.localName == 'optgroup') {
var node = tree.openElements.removeLast();
node.endSourceSpan = token.span;
// But nothing else
} else {
parser.parseError(
- token.span, "unexpected-end-tag-in-select", {"name": "optgroup"});
+ token.span, 'unexpected-end-tag-in-select', {'name': 'optgroup'});
}
}
void endTagSelect(EndTagToken token) {
- if (tree.elementInScope("select", variant: "select")) {
+ if (tree.elementInScope('select', variant: 'select')) {
popOpenElementsUntil(token);
parser.resetInsertionMode();
} else {
// innerHTML case
assert(parser.innerHTMLMode);
- parser.parseError(token.span, "undefined-error");
+ parser.parseError(token.span, 'undefined-error');
}
}
void endTagOther(EndTagToken token) {
parser.parseError(
- token.span, "unexpected-end-tag-in-select", {"name": token.name});
+ token.span, 'unexpected-end-tag-in-select', {'name': token.name});
}
}
class InSelectInTablePhase extends Phase {
InSelectInTablePhase(parser) : super(parser);
+ @override
Token processStartTag(StartTagToken token) {
switch (token.name) {
- case "caption":
- case "table":
- case "tbody":
- case "tfoot":
- case "thead":
- case "tr":
- case "td":
- case "th":
+ case 'caption':
+ case 'table':
+ case 'tbody':
+ case 'tfoot':
+ case 'thead':
+ case 'tr':
+ case 'td':
+ case 'th':
return startTagTable(token);
default:
return startTagOther(token);
}
}
+ @override
Token processEndTag(EndTagToken token) {
switch (token.name) {
- case "caption":
- case "table":
- case "tbody":
- case "tfoot":
- case "thead":
- case "tr":
- case "td":
- case "th":
+ case 'caption':
+ case 'table':
+ case 'tbody':
+ case 'tfoot':
+ case 'thead':
+ case 'tr':
+ case 'td':
+ case 'th':
return endTagTable(token);
default:
return endTagOther(token);
}
}
+ @override
bool processEOF() {
parser._inSelectPhase.processEOF();
return false;
}
+ @override
Token processCharacters(CharactersToken token) {
return parser._inSelectPhase.processCharacters(token);
}
@@ -3370,9 +3446,9 @@
Token startTagTable(StartTagToken token) {
parser.parseError(
token.span,
- "unexpected-table-element-start-tag-in-select-in-table",
- {"name": token.name});
- endTagOther(EndTagToken("select"));
+ 'unexpected-table-element-start-tag-in-select-in-table',
+ {'name': token.name});
+ endTagOther(EndTagToken('select'));
return token;
}
@@ -3383,10 +3459,10 @@
Token endTagTable(EndTagToken token) {
parser.parseError(
token.span,
- "unexpected-table-element-end-tag-in-select-in-table",
- {"name": token.name});
- if (tree.elementInScope(token.name, variant: "table")) {
- endTagOther(EndTagToken("select"));
+ 'unexpected-table-element-end-tag-in-select-in-table',
+ {'name': token.name});
+ if (tree.elementInScope(token.name, variant: 'table')) {
+ endTagOther(EndTagToken('select'));
return token;
}
return null;
@@ -3450,42 +3526,42 @@
void adjustSVGTagNames(token) {
final replacements = const {
- "altglyph": "altGlyph",
- "altglyphdef": "altGlyphDef",
- "altglyphitem": "altGlyphItem",
- "animatecolor": "animateColor",
- "animatemotion": "animateMotion",
- "animatetransform": "animateTransform",
- "clippath": "clipPath",
- "feblend": "feBlend",
- "fecolormatrix": "feColorMatrix",
- "fecomponenttransfer": "feComponentTransfer",
- "fecomposite": "feComposite",
- "feconvolvematrix": "feConvolveMatrix",
- "fediffuselighting": "feDiffuseLighting",
- "fedisplacementmap": "feDisplacementMap",
- "fedistantlight": "feDistantLight",
- "feflood": "feFlood",
- "fefunca": "feFuncA",
- "fefuncb": "feFuncB",
- "fefuncg": "feFuncG",
- "fefuncr": "feFuncR",
- "fegaussianblur": "feGaussianBlur",
- "feimage": "feImage",
- "femerge": "feMerge",
- "femergenode": "feMergeNode",
- "femorphology": "feMorphology",
- "feoffset": "feOffset",
- "fepointlight": "fePointLight",
- "fespecularlighting": "feSpecularLighting",
- "fespotlight": "feSpotLight",
- "fetile": "feTile",
- "feturbulence": "feTurbulence",
- "foreignobject": "foreignObject",
- "glyphref": "glyphRef",
- "lineargradient": "linearGradient",
- "radialgradient": "radialGradient",
- "textpath": "textPath"
+ 'altglyph': 'altGlyph',
+ 'altglyphdef': 'altGlyphDef',
+ 'altglyphitem': 'altGlyphItem',
+ 'animatecolor': 'animateColor',
+ 'animatemotion': 'animateMotion',
+ 'animatetransform': 'animateTransform',
+ 'clippath': 'clipPath',
+ 'feblend': 'feBlend',
+ 'fecolormatrix': 'feColorMatrix',
+ 'fecomponenttransfer': 'feComponentTransfer',
+ 'fecomposite': 'feComposite',
+ 'feconvolvematrix': 'feConvolveMatrix',
+ 'fediffuselighting': 'feDiffuseLighting',
+ 'fedisplacementmap': 'feDisplacementMap',
+ 'fedistantlight': 'feDistantLight',
+ 'feflood': 'feFlood',
+ 'fefunca': 'feFuncA',
+ 'fefuncb': 'feFuncB',
+ 'fefuncg': 'feFuncG',
+ 'fefuncr': 'feFuncR',
+ 'fegaussianblur': 'feGaussianBlur',
+ 'feimage': 'feImage',
+ 'femerge': 'feMerge',
+ 'femergenode': 'feMergeNode',
+ 'femorphology': 'feMorphology',
+ 'feoffset': 'feOffset',
+ 'fepointlight': 'fePointLight',
+ 'fespecularlighting': 'feSpecularLighting',
+ 'fespotlight': 'feSpotLight',
+ 'fetile': 'feTile',
+ 'feturbulence': 'feTurbulence',
+ 'foreignobject': 'foreignObject',
+ 'glyphref': 'glyphRef',
+ 'lineargradient': 'linearGradient',
+ 'radialgradient': 'radialGradient',
+ 'textpath': 'textPath'
};
var replace = replacements[token.name];
@@ -3494,24 +3570,26 @@
}
}
+ @override
Token processCharacters(CharactersToken token) {
- if (token.data == "\u0000") {
- token.replaceData("\uFFFD");
+ if (token.data == '\u0000') {
+ token.replaceData('\uFFFD');
} else if (parser.framesetOK && !allWhitespace(token.data)) {
parser.framesetOK = false;
}
return super.processCharacters(token);
}
+ @override
Token processStartTag(StartTagToken token) {
var currentNode = tree.openElements.last;
if (breakoutElements.contains(token.name) ||
- (token.name == "font" &&
- (token.data.containsKey("color") ||
- token.data.containsKey("face") ||
- token.data.containsKey("size")))) {
+ (token.name == 'font' &&
+ (token.data.containsKey('color') ||
+ token.data.containsKey('face') ||
+ token.data.containsKey('size')))) {
parser.parseError(token.span,
- "unexpected-html-element-in-foreign-content", {'name': token.name});
+ 'unexpected-html-element-in-foreign-content', {'name': token.name});
while (tree.openElements.last.namespaceUri != tree.defaultNamespace &&
!parser.isHTMLIntegrationPoint(tree.openElements.last) &&
!parser.isMathMLTextIntegrationPoint(tree.openElements.last)) {
@@ -3536,11 +3614,12 @@
}
}
+ @override
Token processEndTag(EndTagToken token) {
var nodeIndex = tree.openElements.length - 1;
var node = tree.openElements.last;
if (asciiUpper2Lower(node.localName) != token.name) {
- parser.parseError(token.span, "unexpected-end-tag", {"name": token.name});
+ parser.parseError(token.span, 'unexpected-end-tag', {'name': token.name});
}
Token newToken;
@@ -3575,13 +3654,15 @@
class AfterBodyPhase extends Phase {
AfterBodyPhase(parser) : super(parser);
+ @override
Token processStartTag(StartTagToken token) {
- if (token.name == "html") return startTagHtml(token);
+ if (token.name == 'html') return startTagHtml(token);
return startTagOther(token);
}
+ @override
Token processEndTag(EndTagToken token) {
- if (token.name == "html") {
+ if (token.name == 'html') {
endTagHtml(token);
return null;
}
@@ -3589,8 +3670,10 @@
}
//Stop parsing
+ @override
bool processEOF() => false;
+ @override
Token processComment(CommentToken token) {
// This is needed because data is to be appended to the <html> element
// here and not to whatever is currently open.
@@ -3598,19 +3681,21 @@
return null;
}
+ @override
Token processCharacters(CharactersToken token) {
- parser.parseError(token.span, "unexpected-char-after-body");
+ parser.parseError(token.span, 'unexpected-char-after-body');
parser.phase = parser._inBodyPhase;
return token;
}
+ @override
Token startTagHtml(StartTagToken token) {
return parser._inBodyPhase.processStartTag(token);
}
Token startTagOther(StartTagToken token) {
parser.parseError(
- token.span, "unexpected-start-tag-after-body", {"name": token.name});
+ token.span, 'unexpected-start-tag-after-body', {'name': token.name});
parser.phase = parser._inBodyPhase;
return token;
}
@@ -3623,7 +3708,7 @@
}
}
if (parser.innerHTMLMode) {
- parser.parseError(token.span, "unexpected-end-tag-after-body-innerhtml");
+ parser.parseError(token.span, 'unexpected-end-tag-after-body-innerhtml');
} else {
parser.phase = parser._afterAfterBodyPhase;
}
@@ -3631,7 +3716,7 @@
Token endTagOther(EndTagToken token) {
parser.parseError(
- token.span, "unexpected-end-tag-after-body", {"name": token.name});
+ token.span, 'unexpected-end-tag-after-body', {'name': token.name});
parser.phase = parser._inBodyPhase;
return token;
}
@@ -3641,26 +3726,28 @@
// http://www.whatwg.org/specs/web-apps/current-work///in-frameset
InFramesetPhase(parser) : super(parser);
+ @override
Token processStartTag(StartTagToken token) {
switch (token.name) {
- case "html":
+ case 'html':
return startTagHtml(token);
- case "frameset":
+ case 'frameset':
startTagFrameset(token);
return null;
- case "frame":
+ case 'frame':
startTagFrame(token);
return null;
- case "noframes":
+ case 'noframes':
return startTagNoframes(token);
default:
return startTagOther(token);
}
}
+ @override
Token processEndTag(EndTagToken token) {
switch (token.name) {
- case "frameset":
+ case 'frameset':
endTagFrameset(token);
return null;
default:
@@ -3669,18 +3756,20 @@
}
}
+ @override
bool processEOF() {
var last = tree.openElements.last;
- if (last.localName != "html") {
- parser.parseError(last.sourceSpan, "eof-in-frameset");
+ if (last.localName != 'html') {
+ parser.parseError(last.sourceSpan, 'eof-in-frameset');
} else {
assert(parser.innerHTMLMode);
}
return false;
}
+ @override
Token processCharacters(CharactersToken token) {
- parser.parseError(token.span, "unexpected-char-in-frameset");
+ parser.parseError(token.span, 'unexpected-char-in-frameset');
return null;
}
@@ -3699,21 +3788,21 @@
Token startTagOther(StartTagToken token) {
parser.parseError(
- token.span, "unexpected-start-tag-in-frameset", {"name": token.name});
+ token.span, 'unexpected-start-tag-in-frameset', {'name': token.name});
return null;
}
void endTagFrameset(EndTagToken token) {
- if (tree.openElements.last.localName == "html") {
+ if (tree.openElements.last.localName == 'html') {
// innerHTML case
parser.parseError(
- token.span, "unexpected-frameset-in-frameset-innerhtml");
+ token.span, 'unexpected-frameset-in-frameset-innerhtml');
} else {
var node = tree.openElements.removeLast();
node.endSourceSpan = token.span;
}
if (!parser.innerHTMLMode &&
- tree.openElements.last.localName != "frameset") {
+ tree.openElements.last.localName != 'frameset') {
// If we're not in innerHTML mode and the the current node is not a
// "frameset" element (anymore) then switch.
parser.phase = parser._afterFramesetPhase;
@@ -3722,7 +3811,7 @@
void endTagOther(EndTagToken token) {
parser.parseError(
- token.span, "unexpected-end-tag-in-frameset", {"name": token.name});
+ token.span, 'unexpected-end-tag-in-frameset', {'name': token.name});
}
}
@@ -3730,11 +3819,12 @@
// http://www.whatwg.org/specs/web-apps/current-work///after3
AfterFramesetPhase(parser) : super(parser);
+ @override
Token processStartTag(StartTagToken token) {
switch (token.name) {
- case "html":
+ case 'html':
return startTagHtml(token);
- case "noframes":
+ case 'noframes':
return startTagNoframes(token);
default:
startTagOther(token);
@@ -3742,9 +3832,10 @@
}
}
+ @override
Token processEndTag(EndTagToken token) {
switch (token.name) {
- case "html":
+ case 'html':
endTagHtml(token);
return null;
default:
@@ -3754,10 +3845,12 @@
}
// Stop parsing
+ @override
bool processEOF() => false;
+ @override
Token processCharacters(CharactersToken token) {
- parser.parseError(token.span, "unexpected-char-after-frameset");
+ parser.parseError(token.span, 'unexpected-char-after-frameset');
return null;
}
@@ -3766,8 +3859,8 @@
}
void startTagOther(StartTagToken token) {
- parser.parseError(token.span, "unexpected-start-tag-after-frameset",
- {"name": token.name});
+ parser.parseError(token.span, 'unexpected-start-tag-after-frameset',
+ {'name': token.name});
}
void endTagHtml(EndTagToken token) {
@@ -3776,49 +3869,56 @@
void endTagOther(EndTagToken token) {
parser.parseError(
- token.span, "unexpected-end-tag-after-frameset", {"name": token.name});
+ token.span, 'unexpected-end-tag-after-frameset', {'name': token.name});
}
}
class AfterAfterBodyPhase extends Phase {
AfterAfterBodyPhase(parser) : super(parser);
+ @override
Token processStartTag(StartTagToken token) {
if (token.name == 'html') return startTagHtml(token);
return startTagOther(token);
}
+ @override
bool processEOF() => false;
+ @override
Token processComment(CommentToken token) {
tree.insertComment(token, tree.document);
return null;
}
+ @override
Token processSpaceCharacters(SpaceCharactersToken token) {
return parser._inBodyPhase.processSpaceCharacters(token);
}
+ @override
Token processCharacters(CharactersToken token) {
- parser.parseError(token.span, "expected-eof-but-got-char");
+ parser.parseError(token.span, 'expected-eof-but-got-char');
parser.phase = parser._inBodyPhase;
return token;
}
+ @override
Token startTagHtml(StartTagToken token) {
return parser._inBodyPhase.processStartTag(token);
}
Token startTagOther(StartTagToken token) {
parser.parseError(
- token.span, "expected-eof-but-got-start-tag", {"name": token.name});
+ token.span, 'expected-eof-but-got-start-tag', {'name': token.name});
parser.phase = parser._inBodyPhase;
return token;
}
+ @override
Token processEndTag(EndTagToken token) {
parser.parseError(
- token.span, "expected-eof-but-got-end-tag", {"name": token.name});
+ token.span, 'expected-eof-but-got-end-tag', {'name': token.name});
parser.phase = parser._inBodyPhase;
return token;
}
@@ -3827,11 +3927,12 @@
class AfterAfterFramesetPhase extends Phase {
AfterAfterFramesetPhase(parser) : super(parser);
+ @override
Token processStartTag(StartTagToken token) {
switch (token.name) {
- case "html":
+ case 'html':
return startTagHtml(token);
- case "noframes":
+ case 'noframes':
return startTagNoFrames(token);
default:
startTagOther(token);
@@ -3839,22 +3940,27 @@
}
}
+ @override
bool processEOF() => false;
+ @override
Token processComment(CommentToken token) {
tree.insertComment(token, tree.document);
return null;
}
+ @override
Token processSpaceCharacters(SpaceCharactersToken token) {
return parser._inBodyPhase.processSpaceCharacters(token);
}
+ @override
Token processCharacters(CharactersToken token) {
- parser.parseError(token.span, "expected-eof-but-got-char");
+ parser.parseError(token.span, 'expected-eof-but-got-char');
return null;
}
+ @override
Token startTagHtml(StartTagToken token) {
return parser._inBodyPhase.processStartTag(token);
}
@@ -3865,12 +3971,13 @@
void startTagOther(StartTagToken token) {
parser.parseError(
- token.span, "expected-eof-but-got-start-tag", {"name": token.name});
+ token.span, 'expected-eof-but-got-start-tag', {'name': token.name});
}
+ @override
Token processEndTag(EndTagToken token) {
parser.parseError(
- token.span, "expected-eof-but-got-end-tag", {"name": token.name});
+ token.span, 'expected-eof-but-got-end-tag', {'name': token.name});
return null;
}
}
@@ -3878,6 +3985,7 @@
/// Error in parsed document.
class ParseError implements SourceSpanException {
final String errorCode;
+ @override
final SourceSpan span;
final Map data;
@@ -3893,8 +4001,10 @@
/// [span.getLocationMessage] and [toString] are equivalent. Otherwise,
/// [span.getLocationMessage] will not show any source url information, but
/// [toString] will include 'ParserError:' as a prefix.
+ @override
String get message => formatStr(errorMessages[errorCode], data);
+ @override
String toString({color}) {
var res = span.message(message, color: color);
return span.sourceUrl == null ? 'ParserError on $res' : 'On $res';
@@ -3903,7 +4013,6 @@
/// Convenience function to get the pair of namespace and localName.
Pair<String, String> getElementNameTuple(Element e) {
- var ns = e.namespaceUri;
- if (ns == null) ns = Namespaces.html;
+ var ns = e.namespaceUri ?? Namespaces.html;
return Pair(ns, e.localName);
}
diff --git a/lib/src/constants.dart b/lib/src/constants.dart
index 34addfc..e8d0f62 100644
--- a/lib/src/constants.dart
+++ b/lib/src/constants.dart
@@ -11,7 +11,8 @@
class ReparseException implements Exception {
final String message;
ReparseException(this.message);
- String toString() => "ReparseException: $message";
+ @override
+ String toString() => 'ReparseException: $message';
}
// TODO(jmesserly): assuming the programmatic name is not important, it would be
@@ -20,228 +21,228 @@
/// style string formatting, as implemented by [formatStr]. That function only
/// supports the subset of format functionality used here.
const Map<String, String> errorMessages = {
- "null-character": "Null character in input stream, replaced with U+FFFD.",
- "invalid-codepoint": "Invalid codepoint in stream.",
- "incorrectly-placed-solidus": "Solidus (/) incorrectly placed in tag.",
- "incorrect-cr-newline-entity":
- "Incorrect CR newline entity, replaced with LF.",
- "illegal-windows-1252-entity":
- "Entity used with illegal number (windows-1252 reference).",
- "cant-convert-numeric-entity":
+ 'null-character': 'Null character in input stream, replaced with U+FFFD.',
+ 'invalid-codepoint': 'Invalid codepoint in stream.',
+ 'incorrectly-placed-solidus': 'Solidus (/) incorrectly placed in tag.',
+ 'incorrect-cr-newline-entity':
+ 'Incorrect CR newline entity, replaced with LF.',
+ 'illegal-windows-1252-entity':
+ 'Entity used with illegal number (windows-1252 reference).',
+ 'cant-convert-numeric-entity':
"Numeric entity couldn't be converted to character "
- "(codepoint U+%(charAsInt)08x).",
- "illegal-codepoint-for-numeric-entity":
- "Numeric entity represents an illegal codepoint: "
- "U+%(charAsInt)08x.",
- "numeric-entity-without-semicolon": "Numeric entity didn't end with ';'.",
- "expected-numeric-entity-but-got-eof":
- "Numeric entity expected. Got end of file instead.",
- "expected-numeric-entity": "Numeric entity expected but none found.",
- "named-entity-without-semicolon": "Named entity didn't end with ';'.",
- "expected-named-entity": "Named entity expected. Got none.",
- "attributes-in-end-tag": "End tag contains unexpected attributes.",
+ '(codepoint U+%(charAsInt)08x).',
+ 'illegal-codepoint-for-numeric-entity':
+ 'Numeric entity represents an illegal codepoint: '
+ 'U+%(charAsInt)08x.',
+ 'numeric-entity-without-semicolon': "Numeric entity didn't end with ';'.",
+ 'expected-numeric-entity-but-got-eof':
+ 'Numeric entity expected. Got end of file instead.',
+ 'expected-numeric-entity': 'Numeric entity expected but none found.',
+ 'named-entity-without-semicolon': "Named entity didn't end with ';'.",
+ 'expected-named-entity': 'Named entity expected. Got none.',
+ 'attributes-in-end-tag': 'End tag contains unexpected attributes.',
'self-closing-flag-on-end-tag':
- "End tag contains unexpected self-closing flag.",
- "expected-tag-name-but-got-right-bracket":
+ 'End tag contains unexpected self-closing flag.',
+ 'expected-tag-name-but-got-right-bracket':
"Expected tag name. Got '>' instead.",
- "expected-tag-name-but-got-question-mark":
+ 'expected-tag-name-but-got-question-mark':
"Expected tag name. Got '?' instead. (HTML doesn't "
- "support processing instructions.)",
- "expected-tag-name": "Expected tag name. Got something else instead",
- "expected-closing-tag-but-got-right-bracket":
+ 'support processing instructions.)',
+ 'expected-tag-name': 'Expected tag name. Got something else instead',
+ 'expected-closing-tag-but-got-right-bracket':
"Expected closing tag. Got '>' instead. Ignoring '</>'.",
- "expected-closing-tag-but-got-eof":
- "Expected closing tag. Unexpected end of file.",
- "expected-closing-tag-but-got-char":
+ 'expected-closing-tag-but-got-eof':
+ 'Expected closing tag. Unexpected end of file.',
+ 'expected-closing-tag-but-got-char':
"Expected closing tag. Unexpected character '%(data)s' found.",
- "eof-in-tag-name": "Unexpected end of file in the tag name.",
- "expected-attribute-name-but-got-eof":
- "Unexpected end of file. Expected attribute name instead.",
- "eof-in-attribute-name": "Unexpected end of file in attribute name.",
- "invalid-character-in-attribute-name": "Invalid character in attribute name",
- "duplicate-attribute": "Dropped duplicate attribute on tag.",
- "expected-end-of-tag-name-but-got-eof":
- "Unexpected end of file. Expected = or end of tag.",
- "expected-attribute-value-but-got-eof":
- "Unexpected end of file. Expected attribute value.",
- "expected-attribute-value-but-got-right-bracket":
+ 'eof-in-tag-name': 'Unexpected end of file in the tag name.',
+ 'expected-attribute-name-but-got-eof':
+ 'Unexpected end of file. Expected attribute name instead.',
+ 'eof-in-attribute-name': 'Unexpected end of file in attribute name.',
+ 'invalid-character-in-attribute-name': 'Invalid character in attribute name',
+ 'duplicate-attribute': 'Dropped duplicate attribute on tag.',
+ 'expected-end-of-tag-name-but-got-eof':
+ 'Unexpected end of file. Expected = or end of tag.',
+ 'expected-attribute-value-but-got-eof':
+ 'Unexpected end of file. Expected attribute value.',
+ 'expected-attribute-value-but-got-right-bracket':
"Expected attribute value. Got '>' instead.",
- 'equals-in-unquoted-attribute-value': "Unexpected = in unquoted attribute",
+ 'equals-in-unquoted-attribute-value': 'Unexpected = in unquoted attribute',
'unexpected-character-in-unquoted-attribute-value':
- "Unexpected character in unquoted attribute",
- "invalid-character-after-attribute-name":
- "Unexpected character after attribute name.",
- "unexpected-character-after-attribute-value":
- "Unexpected character after attribute value.",
- "eof-in-attribute-value-double-quote":
- "Unexpected end of file in attribute value (\".",
- "eof-in-attribute-value-single-quote":
+ 'Unexpected character in unquoted attribute',
+ 'invalid-character-after-attribute-name':
+ 'Unexpected character after attribute name.',
+ 'unexpected-character-after-attribute-value':
+ 'Unexpected character after attribute value.',
+ 'eof-in-attribute-value-double-quote':
+ 'Unexpected end of file in attribute value (\".',
+ 'eof-in-attribute-value-single-quote':
"Unexpected end of file in attribute value (').",
- "eof-in-attribute-value-no-quotes":
- "Unexpected end of file in attribute value.",
- "unexpected-EOF-after-solidus-in-tag":
- "Unexpected end of file in tag. Expected >",
- "unexpected-character-after-soldius-in-tag":
- "Unexpected character after / in tag. Expected >",
- "expected-dashes-or-doctype": "Expected '--' or 'DOCTYPE'. Not found.",
- "unexpected-bang-after-double-dash-in-comment":
- "Unexpected ! after -- in comment",
- "unexpected-space-after-double-dash-in-comment":
- "Unexpected space after -- in comment",
- "incorrect-comment": "Incorrect comment.",
- "eof-in-comment": "Unexpected end of file in comment.",
- "eof-in-comment-end-dash": "Unexpected end of file in comment (-)",
- "unexpected-dash-after-double-dash-in-comment":
+ 'eof-in-attribute-value-no-quotes':
+ 'Unexpected end of file in attribute value.',
+ 'unexpected-EOF-after-solidus-in-tag':
+ 'Unexpected end of file in tag. Expected >',
+ 'unexpected-character-after-soldius-in-tag':
+ 'Unexpected character after / in tag. Expected >',
+ 'expected-dashes-or-doctype': "Expected '--' or 'DOCTYPE'. Not found.",
+ 'unexpected-bang-after-double-dash-in-comment':
+ 'Unexpected ! after -- in comment',
+ 'unexpected-space-after-double-dash-in-comment':
+ 'Unexpected space after -- in comment',
+ 'incorrect-comment': 'Incorrect comment.',
+ 'eof-in-comment': 'Unexpected end of file in comment.',
+ 'eof-in-comment-end-dash': 'Unexpected end of file in comment (-)',
+ 'unexpected-dash-after-double-dash-in-comment':
"Unexpected '-' after '--' found in comment.",
- "eof-in-comment-double-dash": "Unexpected end of file in comment (--).",
- "eof-in-comment-end-space-state": "Unexpected end of file in comment.",
- "eof-in-comment-end-bang-state": "Unexpected end of file in comment.",
- "unexpected-char-in-comment": "Unexpected character in comment found.",
- "need-space-after-doctype": "No space after literal string 'DOCTYPE'.",
- "expected-doctype-name-but-got-right-bracket":
- "Unexpected > character. Expected DOCTYPE name.",
- "expected-doctype-name-but-got-eof":
- "Unexpected end of file. Expected DOCTYPE name.",
- "eof-in-doctype-name": "Unexpected end of file in DOCTYPE name.",
- "eof-in-doctype": "Unexpected end of file in DOCTYPE.",
- "expected-space-or-right-bracket-in-doctype":
+ 'eof-in-comment-double-dash': 'Unexpected end of file in comment (--).',
+ 'eof-in-comment-end-space-state': 'Unexpected end of file in comment.',
+ 'eof-in-comment-end-bang-state': 'Unexpected end of file in comment.',
+ 'unexpected-char-in-comment': 'Unexpected character in comment found.',
+ 'need-space-after-doctype': "No space after literal string 'DOCTYPE'.",
+ 'expected-doctype-name-but-got-right-bracket':
+ 'Unexpected > character. Expected DOCTYPE name.',
+ 'expected-doctype-name-but-got-eof':
+ 'Unexpected end of file. Expected DOCTYPE name.',
+ 'eof-in-doctype-name': 'Unexpected end of file in DOCTYPE name.',
+ 'eof-in-doctype': 'Unexpected end of file in DOCTYPE.',
+ 'expected-space-or-right-bracket-in-doctype':
"Expected space or '>'. Got '%(data)s'",
- "unexpected-end-of-doctype": "Unexpected end of DOCTYPE.",
- "unexpected-char-in-doctype": "Unexpected character in DOCTYPE.",
- "eof-in-innerhtml": "XXX innerHTML EOF",
- "unexpected-doctype": "Unexpected DOCTYPE. Ignored.",
- "non-html-root": "html needs to be the first start tag.",
- "expected-doctype-but-got-eof": "Unexpected End of file. Expected DOCTYPE.",
- "unknown-doctype": "Erroneous DOCTYPE.",
- "expected-doctype-but-got-chars":
- "Unexpected non-space characters. Expected DOCTYPE.",
- "expected-doctype-but-got-start-tag":
- "Unexpected start tag (%(name)s). Expected DOCTYPE.",
- "expected-doctype-but-got-end-tag":
- "Unexpected end tag (%(name)s). Expected DOCTYPE.",
- "end-tag-after-implied-root":
- "Unexpected end tag (%(name)s) after the (implied) root element.",
- "expected-named-closing-tag-but-got-eof":
- "Unexpected end of file. Expected end tag (%(name)s).",
- "two-heads-are-not-better-than-one":
- "Unexpected start tag head in existing head. Ignored.",
- "unexpected-end-tag": "Unexpected end tag (%(name)s). Ignored.",
- "unexpected-start-tag-out-of-my-head":
- "Unexpected start tag (%(name)s) that can be in head. Moved.",
- "unexpected-start-tag": "Unexpected start tag (%(name)s).",
- "missing-end-tag": "Missing end tag (%(name)s).",
- "missing-end-tags": "Missing end tags (%(name)s).",
- "unexpected-start-tag-implies-end-tag":
- "Unexpected start tag (%(startName)s) "
- "implies end tag (%(endName)s).",
- "unexpected-start-tag-treated-as":
- "Unexpected start tag (%(originalName)s). Treated as %(newName)s.",
- "deprecated-tag": "Unexpected start tag %(name)s. Don't use it!",
- "unexpected-start-tag-ignored": "Unexpected start tag %(name)s. Ignored.",
- "expected-one-end-tag-but-got-another": "Unexpected end tag (%(gotName)s). "
- "Missing end tag (%(expectedName)s).",
- "end-tag-too-early":
- "End tag (%(name)s) seen too early. Expected other end tag.",
- "end-tag-too-early-named":
- "Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s).",
- "end-tag-too-early-ignored": "End tag (%(name)s) seen too early. Ignored.",
- "adoption-agency-1.1": "End tag (%(name)s) violates step 1, "
- "paragraph 1 of the adoption agency algorithm.",
- "adoption-agency-1.2": "End tag (%(name)s) violates step 1, "
- "paragraph 2 of the adoption agency algorithm.",
- "adoption-agency-1.3": "End tag (%(name)s) violates step 1, "
- "paragraph 3 of the adoption agency algorithm.",
- "unexpected-end-tag-treated-as":
- "Unexpected end tag (%(originalName)s). Treated as %(newName)s.",
- "no-end-tag": "This element (%(name)s) has no end tag.",
- "unexpected-implied-end-tag-in-table":
- "Unexpected implied end tag (%(name)s) in the table phase.",
- "unexpected-implied-end-tag-in-table-body":
- "Unexpected implied end tag (%(name)s) in the table body phase.",
- "unexpected-char-implies-table-voodoo": "Unexpected non-space characters in "
- "table context caused voodoo mode.",
- "unexpected-hidden-input-in-table":
- "Unexpected input with type hidden in table context.",
- "unexpected-form-in-table": "Unexpected form in table context.",
- "unexpected-start-tag-implies-table-voodoo":
- "Unexpected start tag (%(name)s) in "
- "table context caused voodoo mode.",
- "unexpected-end-tag-implies-table-voodoo": "Unexpected end tag (%(name)s) in "
- "table context caused voodoo mode.",
- "unexpected-cell-in-table-body": "Unexpected table cell start tag (%(name)s) "
- "in the table body phase.",
- "unexpected-cell-end-tag": "Got table cell end tag (%(name)s) "
- "while required end tags are missing.",
- "unexpected-end-tag-in-table-body":
- "Unexpected end tag (%(name)s) in the table body phase. Ignored.",
- "unexpected-implied-end-tag-in-table-row":
- "Unexpected implied end tag (%(name)s) in the table row phase.",
- "unexpected-end-tag-in-table-row":
- "Unexpected end tag (%(name)s) in the table row phase. Ignored.",
- "unexpected-select-in-select":
- "Unexpected select start tag in the select phase "
- "treated as select end tag.",
- "unexpected-input-in-select":
- "Unexpected input start tag in the select phase.",
- "unexpected-start-tag-in-select":
- "Unexpected start tag token (%(name)s in the select phase. "
- "Ignored.",
- "unexpected-end-tag-in-select":
- "Unexpected end tag (%(name)s) in the select phase. Ignored.",
- "unexpected-table-element-start-tag-in-select-in-table":
- "Unexpected table element start tag (%(name)s) in the select in table phase.",
- "unexpected-table-element-end-tag-in-select-in-table":
- "Unexpected table element end tag (%(name)s) in the select in table phase.",
- "unexpected-char-after-body":
- "Unexpected non-space characters in the after body phase.",
- "unexpected-start-tag-after-body": "Unexpected start tag token (%(name)s)"
- " in the after body phase.",
- "unexpected-end-tag-after-body": "Unexpected end tag token (%(name)s)"
- " in the after body phase.",
- "unexpected-char-in-frameset":
- "Unepxected characters in the frameset phase. Characters ignored.",
- "unexpected-start-tag-in-frameset": "Unexpected start tag token (%(name)s)"
- " in the frameset phase. Ignored.",
- "unexpected-frameset-in-frameset-innerhtml":
- "Unexpected end tag token (frameset) "
- "in the frameset phase (innerHTML).",
- "unexpected-end-tag-in-frameset": "Unexpected end tag token (%(name)s)"
- " in the frameset phase. Ignored.",
- "unexpected-char-after-frameset": "Unexpected non-space characters in the "
- "after frameset phase. Ignored.",
- "unexpected-start-tag-after-frameset": "Unexpected start tag (%(name)s)"
- " in the after frameset phase. Ignored.",
- "unexpected-end-tag-after-frameset": "Unexpected end tag (%(name)s)"
- " in the after frameset phase. Ignored.",
- "unexpected-end-tag-after-body-innerhtml":
- "Unexpected end tag after body(innerHtml)",
- "expected-eof-but-got-char":
- "Unexpected non-space characters. Expected end of file.",
- "expected-eof-but-got-start-tag": "Unexpected start tag (%(name)s)"
- ". Expected end of file.",
- "expected-eof-but-got-end-tag": "Unexpected end tag (%(name)s)"
- ". Expected end of file.",
- "eof-in-table": "Unexpected end of file. Expected table content.",
- "eof-in-select": "Unexpected end of file. Expected select content.",
- "eof-in-frameset": "Unexpected end of file. Expected frameset content.",
- "eof-in-script-in-script": "Unexpected end of file. Expected script content.",
- "eof-in-foreign-lands": "Unexpected end of file. Expected foreign content",
- "non-void-element-with-trailing-solidus":
- "Trailing solidus not allowed on element %(name)s",
- "unexpected-html-element-in-foreign-content":
- "Element %(name)s not allowed in a non-html context",
- "unexpected-end-tag-before-html":
- "Unexpected end tag (%(name)s) before html.",
- "undefined-error": "Undefined error (this sucks and should be fixed)",
+ 'unexpected-end-of-doctype': 'Unexpected end of DOCTYPE.',
+ 'unexpected-char-in-doctype': 'Unexpected character in DOCTYPE.',
+ 'eof-in-innerhtml': 'XXX innerHTML EOF',
+ 'unexpected-doctype': 'Unexpected DOCTYPE. Ignored.',
+ 'non-html-root': 'html needs to be the first start tag.',
+ 'expected-doctype-but-got-eof': 'Unexpected End of file. Expected DOCTYPE.',
+ 'unknown-doctype': 'Erroneous DOCTYPE.',
+ 'expected-doctype-but-got-chars':
+ 'Unexpected non-space characters. Expected DOCTYPE.',
+ 'expected-doctype-but-got-start-tag':
+ 'Unexpected start tag (%(name)s). Expected DOCTYPE.',
+ 'expected-doctype-but-got-end-tag':
+ 'Unexpected end tag (%(name)s). Expected DOCTYPE.',
+ 'end-tag-after-implied-root':
+ 'Unexpected end tag (%(name)s) after the (implied) root element.',
+ 'expected-named-closing-tag-but-got-eof':
+ 'Unexpected end of file. Expected end tag (%(name)s).',
+ 'two-heads-are-not-better-than-one':
+ 'Unexpected start tag head in existing head. Ignored.',
+ 'unexpected-end-tag': 'Unexpected end tag (%(name)s). Ignored.',
+ 'unexpected-start-tag-out-of-my-head':
+ 'Unexpected start tag (%(name)s) that can be in head. Moved.',
+ 'unexpected-start-tag': 'Unexpected start tag (%(name)s).',
+ 'missing-end-tag': 'Missing end tag (%(name)s).',
+ 'missing-end-tags': 'Missing end tags (%(name)s).',
+ 'unexpected-start-tag-implies-end-tag':
+ 'Unexpected start tag (%(startName)s) '
+ 'implies end tag (%(endName)s).',
+ 'unexpected-start-tag-treated-as':
+ 'Unexpected start tag (%(originalName)s). Treated as %(newName)s.',
+ 'deprecated-tag': "Unexpected start tag %(name)s. Don't use it!",
+ 'unexpected-start-tag-ignored': 'Unexpected start tag %(name)s. Ignored.',
+ 'expected-one-end-tag-but-got-another': 'Unexpected end tag (%(gotName)s). '
+ 'Missing end tag (%(expectedName)s).',
+ 'end-tag-too-early':
+ 'End tag (%(name)s) seen too early. Expected other end tag.',
+ 'end-tag-too-early-named':
+ 'Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s).',
+ 'end-tag-too-early-ignored': 'End tag (%(name)s) seen too early. Ignored.',
+ 'adoption-agency-1.1': 'End tag (%(name)s) violates step 1, '
+ 'paragraph 1 of the adoption agency algorithm.',
+ 'adoption-agency-1.2': 'End tag (%(name)s) violates step 1, '
+ 'paragraph 2 of the adoption agency algorithm.',
+ 'adoption-agency-1.3': 'End tag (%(name)s) violates step 1, '
+ 'paragraph 3 of the adoption agency algorithm.',
+ 'unexpected-end-tag-treated-as':
+ 'Unexpected end tag (%(originalName)s). Treated as %(newName)s.',
+ 'no-end-tag': 'This element (%(name)s) has no end tag.',
+ 'unexpected-implied-end-tag-in-table':
+ 'Unexpected implied end tag (%(name)s) in the table phase.',
+ 'unexpected-implied-end-tag-in-table-body':
+ 'Unexpected implied end tag (%(name)s) in the table body phase.',
+ 'unexpected-char-implies-table-voodoo': 'Unexpected non-space characters in '
+ 'table context caused voodoo mode.',
+ 'unexpected-hidden-input-in-table':
+ 'Unexpected input with type hidden in table context.',
+ 'unexpected-form-in-table': 'Unexpected form in table context.',
+ 'unexpected-start-tag-implies-table-voodoo':
+ 'Unexpected start tag (%(name)s) in '
+ 'table context caused voodoo mode.',
+ 'unexpected-end-tag-implies-table-voodoo': 'Unexpected end tag (%(name)s) in '
+ 'table context caused voodoo mode.',
+ 'unexpected-cell-in-table-body': 'Unexpected table cell start tag (%(name)s) '
+ 'in the table body phase.',
+ 'unexpected-cell-end-tag': 'Got table cell end tag (%(name)s) '
+ 'while required end tags are missing.',
+ 'unexpected-end-tag-in-table-body':
+ 'Unexpected end tag (%(name)s) in the table body phase. Ignored.',
+ 'unexpected-implied-end-tag-in-table-row':
+ 'Unexpected implied end tag (%(name)s) in the table row phase.',
+ 'unexpected-end-tag-in-table-row':
+ 'Unexpected end tag (%(name)s) in the table row phase. Ignored.',
+ 'unexpected-select-in-select':
+ 'Unexpected select start tag in the select phase '
+ 'treated as select end tag.',
+ 'unexpected-input-in-select':
+ 'Unexpected input start tag in the select phase.',
+ 'unexpected-start-tag-in-select':
+ 'Unexpected start tag token (%(name)s in the select phase. '
+ 'Ignored.',
+ 'unexpected-end-tag-in-select':
+ 'Unexpected end tag (%(name)s) in the select phase. Ignored.',
+ 'unexpected-table-element-start-tag-in-select-in-table':
+ 'Unexpected table element start tag (%(name)s) in the select in table phase.',
+ 'unexpected-table-element-end-tag-in-select-in-table':
+ 'Unexpected table element end tag (%(name)s) in the select in table phase.',
+ 'unexpected-char-after-body':
+ 'Unexpected non-space characters in the after body phase.',
+ 'unexpected-start-tag-after-body': 'Unexpected start tag token (%(name)s)'
+ ' in the after body phase.',
+ 'unexpected-end-tag-after-body': 'Unexpected end tag token (%(name)s)'
+ ' in the after body phase.',
+ 'unexpected-char-in-frameset':
+ 'Unepxected characters in the frameset phase. Characters ignored.',
+ 'unexpected-start-tag-in-frameset': 'Unexpected start tag token (%(name)s)'
+ ' in the frameset phase. Ignored.',
+ 'unexpected-frameset-in-frameset-innerhtml':
+ 'Unexpected end tag token (frameset) '
+ 'in the frameset phase (innerHTML).',
+ 'unexpected-end-tag-in-frameset': 'Unexpected end tag token (%(name)s)'
+ ' in the frameset phase. Ignored.',
+ 'unexpected-char-after-frameset': 'Unexpected non-space characters in the '
+ 'after frameset phase. Ignored.',
+ 'unexpected-start-tag-after-frameset': 'Unexpected start tag (%(name)s)'
+ ' in the after frameset phase. Ignored.',
+ 'unexpected-end-tag-after-frameset': 'Unexpected end tag (%(name)s)'
+ ' in the after frameset phase. Ignored.',
+ 'unexpected-end-tag-after-body-innerhtml':
+ 'Unexpected end tag after body(innerHtml)',
+ 'expected-eof-but-got-char':
+ 'Unexpected non-space characters. Expected end of file.',
+ 'expected-eof-but-got-start-tag': 'Unexpected start tag (%(name)s)'
+ '. Expected end of file.',
+ 'expected-eof-but-got-end-tag': 'Unexpected end tag (%(name)s)'
+ '. Expected end of file.',
+ 'eof-in-table': 'Unexpected end of file. Expected table content.',
+ 'eof-in-select': 'Unexpected end of file. Expected select content.',
+ 'eof-in-frameset': 'Unexpected end of file. Expected frameset content.',
+ 'eof-in-script-in-script': 'Unexpected end of file. Expected script content.',
+ 'eof-in-foreign-lands': 'Unexpected end of file. Expected foreign content',
+ 'non-void-element-with-trailing-solidus':
+ 'Trailing solidus not allowed on element %(name)s',
+ 'unexpected-html-element-in-foreign-content':
+ 'Element %(name)s not allowed in a non-html context',
+ 'unexpected-end-tag-before-html':
+ 'Unexpected end tag (%(name)s) before html.',
+ 'undefined-error': 'Undefined error (this sucks and should be fixed)',
};
class Namespaces {
- static const html = "http://www.w3.org/1999/xhtml";
- static const mathml = "http://www.w3.org/1998/Math/MathML";
- static const svg = "http://www.w3.org/2000/svg";
- static const xlink = "http://www.w3.org/1999/xlink";
- static const xml = "http://www.w3.org/XML/1998/namespace";
- static const xmlns = "http://www.w3.org/2000/xmlns/";
+ static const html = 'http://www.w3.org/1999/xhtml';
+ static const mathml = 'http://www.w3.org/1998/Math/MathML';
+ static const svg = 'http://www.w3.org/2000/svg';
+ static const xlink = 'http://www.w3.org/1999/xlink';
+ static const xml = 'http://www.w3.org/XML/1998/namespace';
+ static const xmlns = 'http://www.w3.org/2000/xmlns/';
Namespaces._();
static String getPrefix(String url) {
@@ -265,141 +266,141 @@
}
const List scopingElements = [
- Pair(Namespaces.html, "applet"),
- Pair(Namespaces.html, "caption"),
- Pair(Namespaces.html, "html"),
- Pair(Namespaces.html, "marquee"),
- Pair(Namespaces.html, "object"),
- Pair(Namespaces.html, "table"),
- Pair(Namespaces.html, "td"),
- Pair(Namespaces.html, "th"),
- Pair(Namespaces.mathml, "mi"),
- Pair(Namespaces.mathml, "mo"),
- Pair(Namespaces.mathml, "mn"),
- Pair(Namespaces.mathml, "ms"),
- Pair(Namespaces.mathml, "mtext"),
- Pair(Namespaces.mathml, "annotation-xml"),
- Pair(Namespaces.svg, "foreignObject"),
- Pair(Namespaces.svg, "desc"),
- Pair(Namespaces.svg, "title")
+ Pair(Namespaces.html, 'applet'),
+ Pair(Namespaces.html, 'caption'),
+ Pair(Namespaces.html, 'html'),
+ Pair(Namespaces.html, 'marquee'),
+ Pair(Namespaces.html, 'object'),
+ Pair(Namespaces.html, 'table'),
+ Pair(Namespaces.html, 'td'),
+ Pair(Namespaces.html, 'th'),
+ Pair(Namespaces.mathml, 'mi'),
+ Pair(Namespaces.mathml, 'mo'),
+ Pair(Namespaces.mathml, 'mn'),
+ Pair(Namespaces.mathml, 'ms'),
+ Pair(Namespaces.mathml, 'mtext'),
+ Pair(Namespaces.mathml, 'annotation-xml'),
+ Pair(Namespaces.svg, 'foreignObject'),
+ Pair(Namespaces.svg, 'desc'),
+ Pair(Namespaces.svg, 'title')
];
const formattingElements = [
- Pair(Namespaces.html, "a"),
- Pair(Namespaces.html, "b"),
- Pair(Namespaces.html, "big"),
- Pair(Namespaces.html, "code"),
- Pair(Namespaces.html, "em"),
- Pair(Namespaces.html, "font"),
- Pair(Namespaces.html, "i"),
- Pair(Namespaces.html, "nobr"),
- Pair(Namespaces.html, "s"),
- Pair(Namespaces.html, "small"),
- Pair(Namespaces.html, "strike"),
- Pair(Namespaces.html, "strong"),
- Pair(Namespaces.html, "tt"),
- Pair(Namespaces.html, "")
+ Pair(Namespaces.html, 'a'),
+ Pair(Namespaces.html, 'b'),
+ Pair(Namespaces.html, 'big'),
+ Pair(Namespaces.html, 'code'),
+ Pair(Namespaces.html, 'em'),
+ Pair(Namespaces.html, 'font'),
+ Pair(Namespaces.html, 'i'),
+ Pair(Namespaces.html, 'nobr'),
+ Pair(Namespaces.html, 's'),
+ Pair(Namespaces.html, 'small'),
+ Pair(Namespaces.html, 'strike'),
+ Pair(Namespaces.html, 'strong'),
+ Pair(Namespaces.html, 'tt'),
+ Pair(Namespaces.html, '')
];
const specialElements = [
- Pair(Namespaces.html, "address"),
- Pair(Namespaces.html, "applet"),
- Pair(Namespaces.html, "area"),
- Pair(Namespaces.html, "article"),
- Pair(Namespaces.html, "aside"),
- Pair(Namespaces.html, "base"),
- Pair(Namespaces.html, "basefont"),
- Pair(Namespaces.html, "bgsound"),
- Pair(Namespaces.html, "blockquote"),
- Pair(Namespaces.html, "body"),
- Pair(Namespaces.html, "br"),
- Pair(Namespaces.html, "button"),
- Pair(Namespaces.html, "caption"),
- Pair(Namespaces.html, "center"),
- Pair(Namespaces.html, "col"),
- Pair(Namespaces.html, "colgroup"),
- Pair(Namespaces.html, "command"),
- Pair(Namespaces.html, "dd"),
- Pair(Namespaces.html, "details"),
- Pair(Namespaces.html, "dir"),
- Pair(Namespaces.html, "div"),
- Pair(Namespaces.html, "dl"),
- Pair(Namespaces.html, "dt"),
- Pair(Namespaces.html, "embed"),
- Pair(Namespaces.html, "fieldset"),
- Pair(Namespaces.html, "figure"),
- Pair(Namespaces.html, "footer"),
- Pair(Namespaces.html, "form"),
- Pair(Namespaces.html, "frame"),
- Pair(Namespaces.html, "frameset"),
- Pair(Namespaces.html, "h1"),
- Pair(Namespaces.html, "h2"),
- Pair(Namespaces.html, "h3"),
- Pair(Namespaces.html, "h4"),
- Pair(Namespaces.html, "h5"),
- Pair(Namespaces.html, "h6"),
- Pair(Namespaces.html, "head"),
- Pair(Namespaces.html, "header"),
- Pair(Namespaces.html, "hr"),
- Pair(Namespaces.html, "html"),
- Pair(Namespaces.html, "iframe"),
+ Pair(Namespaces.html, 'address'),
+ Pair(Namespaces.html, 'applet'),
+ Pair(Namespaces.html, 'area'),
+ Pair(Namespaces.html, 'article'),
+ Pair(Namespaces.html, 'aside'),
+ Pair(Namespaces.html, 'base'),
+ Pair(Namespaces.html, 'basefont'),
+ Pair(Namespaces.html, 'bgsound'),
+ Pair(Namespaces.html, 'blockquote'),
+ Pair(Namespaces.html, 'body'),
+ Pair(Namespaces.html, 'br'),
+ Pair(Namespaces.html, 'button'),
+ Pair(Namespaces.html, 'caption'),
+ Pair(Namespaces.html, 'center'),
+ Pair(Namespaces.html, 'col'),
+ Pair(Namespaces.html, 'colgroup'),
+ Pair(Namespaces.html, 'command'),
+ Pair(Namespaces.html, 'dd'),
+ Pair(Namespaces.html, 'details'),
+ Pair(Namespaces.html, 'dir'),
+ Pair(Namespaces.html, 'div'),
+ Pair(Namespaces.html, 'dl'),
+ Pair(Namespaces.html, 'dt'),
+ Pair(Namespaces.html, 'embed'),
+ Pair(Namespaces.html, 'fieldset'),
+ Pair(Namespaces.html, 'figure'),
+ Pair(Namespaces.html, 'footer'),
+ Pair(Namespaces.html, 'form'),
+ Pair(Namespaces.html, 'frame'),
+ Pair(Namespaces.html, 'frameset'),
+ Pair(Namespaces.html, 'h1'),
+ Pair(Namespaces.html, 'h2'),
+ Pair(Namespaces.html, 'h3'),
+ Pair(Namespaces.html, 'h4'),
+ Pair(Namespaces.html, 'h5'),
+ Pair(Namespaces.html, 'h6'),
+ Pair(Namespaces.html, 'head'),
+ Pair(Namespaces.html, 'header'),
+ Pair(Namespaces.html, 'hr'),
+ Pair(Namespaces.html, 'html'),
+ Pair(Namespaces.html, 'iframe'),
// Note that image is commented out in the spec as "this isn't an
// element that can end up on the stack, so it doesn't matter,"
- Pair(Namespaces.html, "image"),
- Pair(Namespaces.html, "img"),
- Pair(Namespaces.html, "input"),
- Pair(Namespaces.html, "isindex"),
- Pair(Namespaces.html, "li"),
- Pair(Namespaces.html, "link"),
- Pair(Namespaces.html, "listing"),
- Pair(Namespaces.html, "marquee"),
- Pair(Namespaces.html, "men"),
- Pair(Namespaces.html, "meta"),
- Pair(Namespaces.html, "nav"),
- Pair(Namespaces.html, "noembed"),
- Pair(Namespaces.html, "noframes"),
- Pair(Namespaces.html, "noscript"),
- Pair(Namespaces.html, "object"),
- Pair(Namespaces.html, "ol"),
- Pair(Namespaces.html, "p"),
- Pair(Namespaces.html, "param"),
- Pair(Namespaces.html, "plaintext"),
- Pair(Namespaces.html, "pre"),
- Pair(Namespaces.html, "script"),
- Pair(Namespaces.html, "section"),
- Pair(Namespaces.html, "select"),
- Pair(Namespaces.html, "style"),
- Pair(Namespaces.html, "table"),
- Pair(Namespaces.html, "tbody"),
- Pair(Namespaces.html, "td"),
- Pair(Namespaces.html, "textarea"),
- Pair(Namespaces.html, "tfoot"),
- Pair(Namespaces.html, "th"),
- Pair(Namespaces.html, "thead"),
- Pair(Namespaces.html, "title"),
- Pair(Namespaces.html, "tr"),
- Pair(Namespaces.html, "ul"),
- Pair(Namespaces.html, "wbr"),
- Pair(Namespaces.html, "xmp"),
- Pair(Namespaces.svg, "foreignObject")
+ Pair(Namespaces.html, 'image'),
+ Pair(Namespaces.html, 'img'),
+ Pair(Namespaces.html, 'input'),
+ Pair(Namespaces.html, 'isindex'),
+ Pair(Namespaces.html, 'li'),
+ Pair(Namespaces.html, 'link'),
+ Pair(Namespaces.html, 'listing'),
+ Pair(Namespaces.html, 'marquee'),
+ Pair(Namespaces.html, 'men'),
+ Pair(Namespaces.html, 'meta'),
+ Pair(Namespaces.html, 'nav'),
+ Pair(Namespaces.html, 'noembed'),
+ Pair(Namespaces.html, 'noframes'),
+ Pair(Namespaces.html, 'noscript'),
+ Pair(Namespaces.html, 'object'),
+ Pair(Namespaces.html, 'ol'),
+ Pair(Namespaces.html, 'p'),
+ Pair(Namespaces.html, 'param'),
+ Pair(Namespaces.html, 'plaintext'),
+ Pair(Namespaces.html, 'pre'),
+ Pair(Namespaces.html, 'script'),
+ Pair(Namespaces.html, 'section'),
+ Pair(Namespaces.html, 'select'),
+ Pair(Namespaces.html, 'style'),
+ Pair(Namespaces.html, 'table'),
+ Pair(Namespaces.html, 'tbody'),
+ Pair(Namespaces.html, 'td'),
+ Pair(Namespaces.html, 'textarea'),
+ Pair(Namespaces.html, 'tfoot'),
+ Pair(Namespaces.html, 'th'),
+ Pair(Namespaces.html, 'thead'),
+ Pair(Namespaces.html, 'title'),
+ Pair(Namespaces.html, 'tr'),
+ Pair(Namespaces.html, 'ul'),
+ Pair(Namespaces.html, 'wbr'),
+ Pair(Namespaces.html, 'xmp'),
+ Pair(Namespaces.svg, 'foreignObject')
];
const htmlIntegrationPointElements = [
- Pair(Namespaces.mathml, "annotaion-xml"),
- Pair(Namespaces.svg, "foreignObject"),
- Pair(Namespaces.svg, "desc"),
- Pair(Namespaces.svg, "title")
+ Pair(Namespaces.mathml, 'annotaion-xml'),
+ Pair(Namespaces.svg, 'foreignObject'),
+ Pair(Namespaces.svg, 'desc'),
+ Pair(Namespaces.svg, 'title')
];
const mathmlTextIntegrationPointElements = [
- Pair(Namespaces.mathml, "mi"),
- Pair(Namespaces.mathml, "mo"),
- Pair(Namespaces.mathml, "mn"),
- Pair(Namespaces.mathml, "ms"),
- Pair(Namespaces.mathml, "mtext")
+ Pair(Namespaces.mathml, 'mi'),
+ Pair(Namespaces.mathml, 'mo'),
+ Pair(Namespaces.mathml, 'mn'),
+ Pair(Namespaces.mathml, 'ms'),
+ Pair(Namespaces.mathml, 'mtext')
];
-const spaceCharacters = " \n\r\t\u000C";
+const spaceCharacters = ' \n\r\t\u000C';
const int NEWLINE = 10;
const int RETURN = 13;
@@ -422,11 +423,11 @@
}
const List<String> tableInsertModeElements = [
- "table",
- "tbody",
- "tfoot",
- "thead",
- "tr"
+ 'table',
+ 'tbody',
+ 'tfoot',
+ 'thead',
+ 'tr'
];
// TODO(jmesserly): remove these in favor of the test functions
@@ -443,13 +444,13 @@
// Note: this is intentially ASCII only
bool isLetter(String char) {
if (char == null) return false;
- int cc = char.codeUnitAt(0);
+ var cc = char.codeUnitAt(0);
return cc >= LOWER_A && cc <= LOWER_Z || cc >= UPPER_A && cc <= UPPER_Z;
}
bool isDigit(String char) {
if (char == null) return false;
- int cc = char.codeUnitAt(0);
+ var cc = char.codeUnitAt(0);
return cc >= ZERO && cc < ZERO + 10;
}
@@ -488,7 +489,7 @@
String asciiUpper2Lower(String text) {
if (text == null) return null;
var result = List<int>(text.length);
- for (int i = 0; i < text.length; i++) {
+ for (var i = 0; i < text.length; i++) {
var c = text.codeUnitAt(i);
if (c >= UPPER_A && c <= UPPER_Z) {
c += LOWER_A - UPPER_A;
@@ -499,7 +500,7 @@
}
// Heading elements need to be ordered
-const headingElements = ["h1", "h2", "h3", "h4", "h5", "h6"];
+const headingElements = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
const cdataElements = ['title', 'textarea'];
@@ -514,41 +515,41 @@
];
const Map<String, List<String>> booleanAttributes = {
- "": [
- "irrelevant",
+ '': [
+ 'irrelevant',
],
- "style": [
- "scoped",
+ 'style': [
+ 'scoped',
],
- "img": [
- "ismap",
+ 'img': [
+ 'ismap',
],
- "audio": ["autoplay", "controls"],
- "video": ["autoplay", "controls"],
- "script": ["defer", "async"],
- "details": [
- "open",
+ 'audio': ['autoplay', 'controls'],
+ 'video': ['autoplay', 'controls'],
+ 'script': ['defer', 'async'],
+ 'details': [
+ 'open',
],
- "datagrid": ["multiple", "disabled"],
- "command": ["hidden", "disabled", "checked", "default"],
- "hr": ["noshade"],
- "men": [
- "autosubmit",
+ 'datagrid': ['multiple', 'disabled'],
+ 'command': ['hidden', 'disabled', 'checked', 'default'],
+ 'hr': ['noshade'],
+ 'men': [
+ 'autosubmit',
],
- "fieldset": ["disabled", "readonly"],
- "option": ["disabled", "readonly", "selected"],
- "optgroup": ["disabled", "readonly"],
- "button": ["disabled", "autofocus"],
- "input": [
- "disabled",
- "readonly",
- "required",
- "autofocus",
- "checked",
- "ismap"
+ 'fieldset': ['disabled', 'readonly'],
+ 'option': ['disabled', 'readonly', 'selected'],
+ 'optgroup': ['disabled', 'readonly'],
+ 'button': ['disabled', 'autofocus'],
+ 'input': [
+ 'disabled',
+ 'readonly',
+ 'required',
+ 'autofocus',
+ 'checked',
+ 'ismap'
],
- "select": ["disabled", "readonly", "autofocus", "multiple"],
- "output": ["disabled", "readonly"],
+ 'select': ['disabled', 'readonly', 'autofocus', 'multiple'],
+ 'output': ['disabled', 'readonly'],
};
// entitiesWindows1252 has to be _ordered_ and needs to have an index. It
@@ -591,2274 +592,2274 @@
const xmlEntities = ['lt;', 'gt;', 'amp;', 'apos;', 'quot;'];
const Map<String, String> entities = {
- "AElig": "\xc6",
- "AElig;": "\xc6",
- "AMP": "&",
- "AMP;": "&",
- "Aacute": "\xc1",
- "Aacute;": "\xc1",
- "Abreve;": "\u0102",
- "Acirc": "\xc2",
- "Acirc;": "\xc2",
- "Acy;": "\u0410",
- "Afr;": "\u{01d504}",
- "Agrave": "\xc0",
- "Agrave;": "\xc0",
- "Alpha;": "\u0391",
- "Amacr;": "\u0100",
- "And;": "\u2a53",
- "Aogon;": "\u0104",
- "Aopf;": "\u{01d538}",
- "ApplyFunction;": "\u2061",
- "Aring": "\xc5",
- "Aring;": "\xc5",
- "Ascr;": "\u{01d49c}",
- "Assign;": "\u2254",
- "Atilde": "\xc3",
- "Atilde;": "\xc3",
- "Auml": "\xc4",
- "Auml;": "\xc4",
- "Backslash;": "\u2216",
- "Barv;": "\u2ae7",
- "Barwed;": "\u2306",
- "Bcy;": "\u0411",
- "Because;": "\u2235",
- "Bernoullis;": "\u212c",
- "Beta;": "\u0392",
- "Bfr;": "\u{01d505}",
- "Bopf;": "\u{01d539}",
- "Breve;": "\u02d8",
- "Bscr;": "\u212c",
- "Bumpeq;": "\u224e",
- "CHcy;": "\u0427",
- "COPY": "\xa9",
- "COPY;": "\xa9",
- "Cacute;": "\u0106",
- "Cap;": "\u22d2",
- "CapitalDifferentialD;": "\u2145",
- "Cayleys;": "\u212d",
- "Ccaron;": "\u010c",
- "Ccedil": "\xc7",
- "Ccedil;": "\xc7",
- "Ccirc;": "\u0108",
- "Cconint;": "\u2230",
- "Cdot;": "\u010a",
- "Cedilla;": "\xb8",
- "CenterDot;": "\xb7",
- "Cfr;": "\u212d",
- "Chi;": "\u03a7",
- "CircleDot;": "\u2299",
- "CircleMinus;": "\u2296",
- "CirclePlus;": "\u2295",
- "CircleTimes;": "\u2297",
- "ClockwiseContourIntegral;": "\u2232",
- "CloseCurlyDoubleQuote;": "\u201d",
- "CloseCurlyQuote;": "\u2019",
- "Colon;": "\u2237",
- "Colone;": "\u2a74",
- "Congruent;": "\u2261",
- "Conint;": "\u222f",
- "ContourIntegral;": "\u222e",
- "Copf;": "\u2102",
- "Coproduct;": "\u2210",
- "CounterClockwiseContourIntegral;": "\u2233",
- "Cross;": "\u2a2f",
- "Cscr;": "\u{01d49e}",
- "Cup;": "\u22d3",
- "CupCap;": "\u224d",
- "DD;": "\u2145",
- "DDotrahd;": "\u2911",
- "DJcy;": "\u0402",
- "DScy;": "\u0405",
- "DZcy;": "\u040f",
- "Dagger;": "\u2021",
- "Darr;": "\u21a1",
- "Dashv;": "\u2ae4",
- "Dcaron;": "\u010e",
- "Dcy;": "\u0414",
- "Del;": "\u2207",
- "Delta;": "\u0394",
- "Dfr;": "\u{01d507}",
- "DiacriticalAcute;": "\xb4",
- "DiacriticalDot;": "\u02d9",
- "DiacriticalDoubleAcute;": "\u02dd",
- "DiacriticalGrave;": "`",
- "DiacriticalTilde;": "\u02dc",
- "Diamond;": "\u22c4",
- "DifferentialD;": "\u2146",
- "Dopf;": "\u{01d53b}",
- "Dot;": "\xa8",
- "DotDot;": "\u20dc",
- "DotEqual;": "\u2250",
- "DoubleContourIntegral;": "\u222f",
- "DoubleDot;": "\xa8",
- "DoubleDownArrow;": "\u21d3",
- "DoubleLeftArrow;": "\u21d0",
- "DoubleLeftRightArrow;": "\u21d4",
- "DoubleLeftTee;": "\u2ae4",
- "DoubleLongLeftArrow;": "\u27f8",
- "DoubleLongLeftRightArrow;": "\u27fa",
- "DoubleLongRightArrow;": "\u27f9",
- "DoubleRightArrow;": "\u21d2",
- "DoubleRightTee;": "\u22a8",
- "DoubleUpArrow;": "\u21d1",
- "DoubleUpDownArrow;": "\u21d5",
- "DoubleVerticalBar;": "\u2225",
- "DownArrow;": "\u2193",
- "DownArrowBar;": "\u2913",
- "DownArrowUpArrow;": "\u21f5",
- "DownBreve;": "\u0311",
- "DownLeftRightVector;": "\u2950",
- "DownLeftTeeVector;": "\u295e",
- "DownLeftVector;": "\u21bd",
- "DownLeftVectorBar;": "\u2956",
- "DownRightTeeVector;": "\u295f",
- "DownRightVector;": "\u21c1",
- "DownRightVectorBar;": "\u2957",
- "DownTee;": "\u22a4",
- "DownTeeArrow;": "\u21a7",
- "Downarrow;": "\u21d3",
- "Dscr;": "\u{01d49f}",
- "Dstrok;": "\u0110",
- "ENG;": "\u014a",
- "ETH": "\xd0",
- "ETH;": "\xd0",
- "Eacute": "\xc9",
- "Eacute;": "\xc9",
- "Ecaron;": "\u011a",
- "Ecirc": "\xca",
- "Ecirc;": "\xca",
- "Ecy;": "\u042d",
- "Edot;": "\u0116",
- "Efr;": "\u{01d508}",
- "Egrave": "\xc8",
- "Egrave;": "\xc8",
- "Element;": "\u2208",
- "Emacr;": "\u0112",
- "EmptySmallSquare;": "\u25fb",
- "EmptyVerySmallSquare;": "\u25ab",
- "Eogon;": "\u0118",
- "Eopf;": "\u{01d53c}",
- "Epsilon;": "\u0395",
- "Equal;": "\u2a75",
- "EqualTilde;": "\u2242",
- "Equilibrium;": "\u21cc",
- "Escr;": "\u2130",
- "Esim;": "\u2a73",
- "Eta;": "\u0397",
- "Euml": "\xcb",
- "Euml;": "\xcb",
- "Exists;": "\u2203",
- "ExponentialE;": "\u2147",
- "Fcy;": "\u0424",
- "Ffr;": "\u{01d509}",
- "FilledSmallSquare;": "\u25fc",
- "FilledVerySmallSquare;": "\u25aa",
- "Fopf;": "\u{01d53d}",
- "ForAll;": "\u2200",
- "Fouriertrf;": "\u2131",
- "Fscr;": "\u2131",
- "GJcy;": "\u0403",
- "GT": ">",
- "GT;": ">",
- "Gamma;": "\u0393",
- "Gammad;": "\u03dc",
- "Gbreve;": "\u011e",
- "Gcedil;": "\u0122",
- "Gcirc;": "\u011c",
- "Gcy;": "\u0413",
- "Gdot;": "\u0120",
- "Gfr;": "\u{01d50a}",
- "Gg;": "\u22d9",
- "Gopf;": "\u{01d53e}",
- "GreaterEqual;": "\u2265",
- "GreaterEqualLess;": "\u22db",
- "GreaterFullEqual;": "\u2267",
- "GreaterGreater;": "\u2aa2",
- "GreaterLess;": "\u2277",
- "GreaterSlantEqual;": "\u2a7e",
- "GreaterTilde;": "\u2273",
- "Gscr;": "\u{01d4a2}",
- "Gt;": "\u226b",
- "HARDcy;": "\u042a",
- "Hacek;": "\u02c7",
- "Hat;": "^",
- "Hcirc;": "\u0124",
- "Hfr;": "\u210c",
- "HilbertSpace;": "\u210b",
- "Hopf;": "\u210d",
- "HorizontalLine;": "\u2500",
- "Hscr;": "\u210b",
- "Hstrok;": "\u0126",
- "HumpDownHump;": "\u224e",
- "HumpEqual;": "\u224f",
- "IEcy;": "\u0415",
- "IJlig;": "\u0132",
- "IOcy;": "\u0401",
- "Iacute": "\xcd",
- "Iacute;": "\xcd",
- "Icirc": "\xce",
- "Icirc;": "\xce",
- "Icy;": "\u0418",
- "Idot;": "\u0130",
- "Ifr;": "\u2111",
- "Igrave": "\xcc",
- "Igrave;": "\xcc",
- "Im;": "\u2111",
- "Imacr;": "\u012a",
- "ImaginaryI;": "\u2148",
- "Implies;": "\u21d2",
- "Int;": "\u222c",
- "Integral;": "\u222b",
- "Intersection;": "\u22c2",
- "InvisibleComma;": "\u2063",
- "InvisibleTimes;": "\u2062",
- "Iogon;": "\u012e",
- "Iopf;": "\u{01d540}",
- "Iota;": "\u0399",
- "Iscr;": "\u2110",
- "Itilde;": "\u0128",
- "Iukcy;": "\u0406",
- "Iuml": "\xcf",
- "Iuml;": "\xcf",
- "Jcirc;": "\u0134",
- "Jcy;": "\u0419",
- "Jfr;": "\u{01d50d}",
- "Jopf;": "\u{01d541}",
- "Jscr;": "\u{01d4a5}",
- "Jsercy;": "\u0408",
- "Jukcy;": "\u0404",
- "KHcy;": "\u0425",
- "KJcy;": "\u040c",
- "Kappa;": "\u039a",
- "Kcedil;": "\u0136",
- "Kcy;": "\u041a",
- "Kfr;": "\u{01d50e}",
- "Kopf;": "\u{01d542}",
- "Kscr;": "\u{01d4a6}",
- "LJcy;": "\u0409",
- "LT": "<",
- "LT;": "<",
- "Lacute;": "\u0139",
- "Lambda;": "\u039b",
- "Lang;": "\u27ea",
- "Laplacetrf;": "\u2112",
- "Larr;": "\u219e",
- "Lcaron;": "\u013d",
- "Lcedil;": "\u013b",
- "Lcy;": "\u041b",
- "LeftAngleBracket;": "\u27e8",
- "LeftArrow;": "\u2190",
- "LeftArrowBar;": "\u21e4",
- "LeftArrowRightArrow;": "\u21c6",
- "LeftCeiling;": "\u2308",
- "LeftDoubleBracket;": "\u27e6",
- "LeftDownTeeVector;": "\u2961",
- "LeftDownVector;": "\u21c3",
- "LeftDownVectorBar;": "\u2959",
- "LeftFloor;": "\u230a",
- "LeftRightArrow;": "\u2194",
- "LeftRightVector;": "\u294e",
- "LeftTee;": "\u22a3",
- "LeftTeeArrow;": "\u21a4",
- "LeftTeeVector;": "\u295a",
- "LeftTriangle;": "\u22b2",
- "LeftTriangleBar;": "\u29cf",
- "LeftTriangleEqual;": "\u22b4",
- "LeftUpDownVector;": "\u2951",
- "LeftUpTeeVector;": "\u2960",
- "LeftUpVector;": "\u21bf",
- "LeftUpVectorBar;": "\u2958",
- "LeftVector;": "\u21bc",
- "LeftVectorBar;": "\u2952",
- "Leftarrow;": "\u21d0",
- "Leftrightarrow;": "\u21d4",
- "LessEqualGreater;": "\u22da",
- "LessFullEqual;": "\u2266",
- "LessGreater;": "\u2276",
- "LessLess;": "\u2aa1",
- "LessSlantEqual;": "\u2a7d",
- "LessTilde;": "\u2272",
- "Lfr;": "\u{01d50f}",
- "Ll;": "\u22d8",
- "Lleftarrow;": "\u21da",
- "Lmidot;": "\u013f",
- "LongLeftArrow;": "\u27f5",
- "LongLeftRightArrow;": "\u27f7",
- "LongRightArrow;": "\u27f6",
- "Longleftarrow;": "\u27f8",
- "Longleftrightarrow;": "\u27fa",
- "Longrightarrow;": "\u27f9",
- "Lopf;": "\u{01d543}",
- "LowerLeftArrow;": "\u2199",
- "LowerRightArrow;": "\u2198",
- "Lscr;": "\u2112",
- "Lsh;": "\u21b0",
- "Lstrok;": "\u0141",
- "Lt;": "\u226a",
- "Map;": "\u2905",
- "Mcy;": "\u041c",
- "MediumSpace;": "\u205f",
- "Mellintrf;": "\u2133",
- "Mfr;": "\u{01d510}",
- "MinusPlus;": "\u2213",
- "Mopf;": "\u{01d544}",
- "Mscr;": "\u2133",
- "Mu;": "\u039c",
- "NJcy;": "\u040a",
- "Nacute;": "\u0143",
- "Ncaron;": "\u0147",
- "Ncedil;": "\u0145",
- "Ncy;": "\u041d",
- "NegativeMediumSpace;": "\u200b",
- "NegativeThickSpace;": "\u200b",
- "NegativeThinSpace;": "\u200b",
- "NegativeVeryThinSpace;": "\u200b",
- "NestedGreaterGreater;": "\u226b",
- "NestedLessLess;": "\u226a",
- "NewLine;": "\n",
- "Nfr;": "\u{01d511}",
- "NoBreak;": "\u2060",
- "NonBreakingSpace;": "\xa0",
- "Nopf;": "\u2115",
- "Not;": "\u2aec",
- "NotCongruent;": "\u2262",
- "NotCupCap;": "\u226d",
- "NotDoubleVerticalBar;": "\u2226",
- "NotElement;": "\u2209",
- "NotEqual;": "\u2260",
- "NotEqualTilde;": "\u2242\u0338",
- "NotExists;": "\u2204",
- "NotGreater;": "\u226f",
- "NotGreaterEqual;": "\u2271",
- "NotGreaterFullEqual;": "\u2267\u0338",
- "NotGreaterGreater;": "\u226b\u0338",
- "NotGreaterLess;": "\u2279",
- "NotGreaterSlantEqual;": "\u2a7e\u0338",
- "NotGreaterTilde;": "\u2275",
- "NotHumpDownHump;": "\u224e\u0338",
- "NotHumpEqual;": "\u224f\u0338",
- "NotLeftTriangle;": "\u22ea",
- "NotLeftTriangleBar;": "\u29cf\u0338",
- "NotLeftTriangleEqual;": "\u22ec",
- "NotLess;": "\u226e",
- "NotLessEqual;": "\u2270",
- "NotLessGreater;": "\u2278",
- "NotLessLess;": "\u226a\u0338",
- "NotLessSlantEqual;": "\u2a7d\u0338",
- "NotLessTilde;": "\u2274",
- "NotNestedGreaterGreater;": "\u2aa2\u0338",
- "NotNestedLessLess;": "\u2aa1\u0338",
- "NotPrecedes;": "\u2280",
- "NotPrecedesEqual;": "\u2aaf\u0338",
- "NotPrecedesSlantEqual;": "\u22e0",
- "NotReverseElement;": "\u220c",
- "NotRightTriangle;": "\u22eb",
- "NotRightTriangleBar;": "\u29d0\u0338",
- "NotRightTriangleEqual;": "\u22ed",
- "NotSquareSubset;": "\u228f\u0338",
- "NotSquareSubsetEqual;": "\u22e2",
- "NotSquareSuperset;": "\u2290\u0338",
- "NotSquareSupersetEqual;": "\u22e3",
- "NotSubset;": "\u2282\u20d2",
- "NotSubsetEqual;": "\u2288",
- "NotSucceeds;": "\u2281",
- "NotSucceedsEqual;": "\u2ab0\u0338",
- "NotSucceedsSlantEqual;": "\u22e1",
- "NotSucceedsTilde;": "\u227f\u0338",
- "NotSuperset;": "\u2283\u20d2",
- "NotSupersetEqual;": "\u2289",
- "NotTilde;": "\u2241",
- "NotTildeEqual;": "\u2244",
- "NotTildeFullEqual;": "\u2247",
- "NotTildeTilde;": "\u2249",
- "NotVerticalBar;": "\u2224",
- "Nscr;": "\u{01d4a9}",
- "Ntilde": "\xd1",
- "Ntilde;": "\xd1",
- "Nu;": "\u039d",
- "OElig;": "\u0152",
- "Oacute": "\xd3",
- "Oacute;": "\xd3",
- "Ocirc": "\xd4",
- "Ocirc;": "\xd4",
- "Ocy;": "\u041e",
- "Odblac;": "\u0150",
- "Ofr;": "\u{01d512}",
- "Ograve": "\xd2",
- "Ograve;": "\xd2",
- "Omacr;": "\u014c",
- "Omega;": "\u03a9",
- "Omicron;": "\u039f",
- "Oopf;": "\u{01d546}",
- "OpenCurlyDoubleQuote;": "\u201c",
- "OpenCurlyQuote;": "\u2018",
- "Or;": "\u2a54",
- "Oscr;": "\u{01d4aa}",
- "Oslash": "\xd8",
- "Oslash;": "\xd8",
- "Otilde": "\xd5",
- "Otilde;": "\xd5",
- "Otimes;": "\u2a37",
- "Ouml": "\xd6",
- "Ouml;": "\xd6",
- "OverBar;": "\u203e",
- "OverBrace;": "\u23de",
- "OverBracket;": "\u23b4",
- "OverParenthesis;": "\u23dc",
- "PartialD;": "\u2202",
- "Pcy;": "\u041f",
- "Pfr;": "\u{01d513}",
- "Phi;": "\u03a6",
- "Pi;": "\u03a0",
- "PlusMinus;": "\xb1",
- "Poincareplane;": "\u210c",
- "Popf;": "\u2119",
- "Pr;": "\u2abb",
- "Precedes;": "\u227a",
- "PrecedesEqual;": "\u2aaf",
- "PrecedesSlantEqual;": "\u227c",
- "PrecedesTilde;": "\u227e",
- "Prime;": "\u2033",
- "Product;": "\u220f",
- "Proportion;": "\u2237",
- "Proportional;": "\u221d",
- "Pscr;": "\u{01d4ab}",
- "Psi;": "\u03a8",
- "QUOT": "\"",
- "QUOT;": "\"",
- "Qfr;": "\u{01d514}",
- "Qopf;": "\u211a",
- "Qscr;": "\u{01d4ac}",
- "RBarr;": "\u2910",
- "REG": "\xae",
- "REG;": "\xae",
- "Racute;": "\u0154",
- "Rang;": "\u27eb",
- "Rarr;": "\u21a0",
- "Rarrtl;": "\u2916",
- "Rcaron;": "\u0158",
- "Rcedil;": "\u0156",
- "Rcy;": "\u0420",
- "Re;": "\u211c",
- "ReverseElement;": "\u220b",
- "ReverseEquilibrium;": "\u21cb",
- "ReverseUpEquilibrium;": "\u296f",
- "Rfr;": "\u211c",
- "Rho;": "\u03a1",
- "RightAngleBracket;": "\u27e9",
- "RightArrow;": "\u2192",
- "RightArrowBar;": "\u21e5",
- "RightArrowLeftArrow;": "\u21c4",
- "RightCeiling;": "\u2309",
- "RightDoubleBracket;": "\u27e7",
- "RightDownTeeVector;": "\u295d",
- "RightDownVector;": "\u21c2",
- "RightDownVectorBar;": "\u2955",
- "RightFloor;": "\u230b",
- "RightTee;": "\u22a2",
- "RightTeeArrow;": "\u21a6",
- "RightTeeVector;": "\u295b",
- "RightTriangle;": "\u22b3",
- "RightTriangleBar;": "\u29d0",
- "RightTriangleEqual;": "\u22b5",
- "RightUpDownVector;": "\u294f",
- "RightUpTeeVector;": "\u295c",
- "RightUpVector;": "\u21be",
- "RightUpVectorBar;": "\u2954",
- "RightVector;": "\u21c0",
- "RightVectorBar;": "\u2953",
- "Rightarrow;": "\u21d2",
- "Ropf;": "\u211d",
- "RoundImplies;": "\u2970",
- "Rrightarrow;": "\u21db",
- "Rscr;": "\u211b",
- "Rsh;": "\u21b1",
- "RuleDelayed;": "\u29f4",
- "SHCHcy;": "\u0429",
- "SHcy;": "\u0428",
- "SOFTcy;": "\u042c",
- "Sacute;": "\u015a",
- "Sc;": "\u2abc",
- "Scaron;": "\u0160",
- "Scedil;": "\u015e",
- "Scirc;": "\u015c",
- "Scy;": "\u0421",
- "Sfr;": "\u{01d516}",
- "ShortDownArrow;": "\u2193",
- "ShortLeftArrow;": "\u2190",
- "ShortRightArrow;": "\u2192",
- "ShortUpArrow;": "\u2191",
- "Sigma;": "\u03a3",
- "SmallCircle;": "\u2218",
- "Sopf;": "\u{01d54a}",
- "Sqrt;": "\u221a",
- "Square;": "\u25a1",
- "SquareIntersection;": "\u2293",
- "SquareSubset;": "\u228f",
- "SquareSubsetEqual;": "\u2291",
- "SquareSuperset;": "\u2290",
- "SquareSupersetEqual;": "\u2292",
- "SquareUnion;": "\u2294",
- "Sscr;": "\u{01d4ae}",
- "Star;": "\u22c6",
- "Sub;": "\u22d0",
- "Subset;": "\u22d0",
- "SubsetEqual;": "\u2286",
- "Succeeds;": "\u227b",
- "SucceedsEqual;": "\u2ab0",
- "SucceedsSlantEqual;": "\u227d",
- "SucceedsTilde;": "\u227f",
- "SuchThat;": "\u220b",
- "Sum;": "\u2211",
- "Sup;": "\u22d1",
- "Superset;": "\u2283",
- "SupersetEqual;": "\u2287",
- "Supset;": "\u22d1",
- "THORN": "\xde",
- "THORN;": "\xde",
- "TRADE;": "\u2122",
- "TSHcy;": "\u040b",
- "TScy;": "\u0426",
- "Tab;": "\t",
- "Tau;": "\u03a4",
- "Tcaron;": "\u0164",
- "Tcedil;": "\u0162",
- "Tcy;": "\u0422",
- "Tfr;": "\u{01d517}",
- "Therefore;": "\u2234",
- "Theta;": "\u0398",
- "ThickSpace;": "\u205f\u200a",
- "ThinSpace;": "\u2009",
- "Tilde;": "\u223c",
- "TildeEqual;": "\u2243",
- "TildeFullEqual;": "\u2245",
- "TildeTilde;": "\u2248",
- "Topf;": "\u{01d54b}",
- "TripleDot;": "\u20db",
- "Tscr;": "\u{01d4af}",
- "Tstrok;": "\u0166",
- "Uacute": "\xda",
- "Uacute;": "\xda",
- "Uarr;": "\u219f",
- "Uarrocir;": "\u2949",
- "Ubrcy;": "\u040e",
- "Ubreve;": "\u016c",
- "Ucirc": "\xdb",
- "Ucirc;": "\xdb",
- "Ucy;": "\u0423",
- "Udblac;": "\u0170",
- "Ufr;": "\u{01d518}",
- "Ugrave": "\xd9",
- "Ugrave;": "\xd9",
- "Umacr;": "\u016a",
- "UnderBar;": "_",
- "UnderBrace;": "\u23df",
- "UnderBracket;": "\u23b5",
- "UnderParenthesis;": "\u23dd",
- "Union;": "\u22c3",
- "UnionPlus;": "\u228e",
- "Uogon;": "\u0172",
- "Uopf;": "\u{01d54c}",
- "UpArrow;": "\u2191",
- "UpArrowBar;": "\u2912",
- "UpArrowDownArrow;": "\u21c5",
- "UpDownArrow;": "\u2195",
- "UpEquilibrium;": "\u296e",
- "UpTee;": "\u22a5",
- "UpTeeArrow;": "\u21a5",
- "Uparrow;": "\u21d1",
- "Updownarrow;": "\u21d5",
- "UpperLeftArrow;": "\u2196",
- "UpperRightArrow;": "\u2197",
- "Upsi;": "\u03d2",
- "Upsilon;": "\u03a5",
- "Uring;": "\u016e",
- "Uscr;": "\u{01d4b0}",
- "Utilde;": "\u0168",
- "Uuml": "\xdc",
- "Uuml;": "\xdc",
- "VDash;": "\u22ab",
- "Vbar;": "\u2aeb",
- "Vcy;": "\u0412",
- "Vdash;": "\u22a9",
- "Vdashl;": "\u2ae6",
- "Vee;": "\u22c1",
- "Verbar;": "\u2016",
- "Vert;": "\u2016",
- "VerticalBar;": "\u2223",
- "VerticalLine;": "|",
- "VerticalSeparator;": "\u2758",
- "VerticalTilde;": "\u2240",
- "VeryThinSpace;": "\u200a",
- "Vfr;": "\u{01d519}",
- "Vopf;": "\u{01d54d}",
- "Vscr;": "\u{01d4b1}",
- "Vvdash;": "\u22aa",
- "Wcirc;": "\u0174",
- "Wedge;": "\u22c0",
- "Wfr;": "\u{01d51a}",
- "Wopf;": "\u{01d54e}",
- "Wscr;": "\u{01d4b2}",
- "Xfr;": "\u{01d51b}",
- "Xi;": "\u039e",
- "Xopf;": "\u{01d54f}",
- "Xscr;": "\u{01d4b3}",
- "YAcy;": "\u042f",
- "YIcy;": "\u0407",
- "YUcy;": "\u042e",
- "Yacute": "\xdd",
- "Yacute;": "\xdd",
- "Ycirc;": "\u0176",
- "Ycy;": "\u042b",
- "Yfr;": "\u{01d51c}",
- "Yopf;": "\u{01d550}",
- "Yscr;": "\u{01d4b4}",
- "Yuml;": "\u0178",
- "ZHcy;": "\u0416",
- "Zacute;": "\u0179",
- "Zcaron;": "\u017d",
- "Zcy;": "\u0417",
- "Zdot;": "\u017b",
- "ZeroWidthSpace;": "\u200b",
- "Zeta;": "\u0396",
- "Zfr;": "\u2128",
- "Zopf;": "\u2124",
- "Zscr;": "\u{01d4b5}",
- "aacute": "\xe1",
- "aacute;": "\xe1",
- "abreve;": "\u0103",
- "ac;": "\u223e",
- "acE;": "\u223e\u0333",
- "acd;": "\u223f",
- "acirc": "\xe2",
- "acirc;": "\xe2",
- "acute": "\xb4",
- "acute;": "\xb4",
- "acy;": "\u0430",
- "aelig": "\xe6",
- "aelig;": "\xe6",
- "af;": "\u2061",
- "afr;": "\u{01d51e}",
- "agrave": "\xe0",
- "agrave;": "\xe0",
- "alefsym;": "\u2135",
- "aleph;": "\u2135",
- "alpha;": "\u03b1",
- "amacr;": "\u0101",
- "amalg;": "\u2a3f",
- "amp": "&",
- "amp;": "&",
- "and;": "\u2227",
- "andand;": "\u2a55",
- "andd;": "\u2a5c",
- "andslope;": "\u2a58",
- "andv;": "\u2a5a",
- "ang;": "\u2220",
- "ange;": "\u29a4",
- "angle;": "\u2220",
- "angmsd;": "\u2221",
- "angmsdaa;": "\u29a8",
- "angmsdab;": "\u29a9",
- "angmsdac;": "\u29aa",
- "angmsdad;": "\u29ab",
- "angmsdae;": "\u29ac",
- "angmsdaf;": "\u29ad",
- "angmsdag;": "\u29ae",
- "angmsdah;": "\u29af",
- "angrt;": "\u221f",
- "angrtvb;": "\u22be",
- "angrtvbd;": "\u299d",
- "angsph;": "\u2222",
- "angst;": "\xc5",
- "angzarr;": "\u237c",
- "aogon;": "\u0105",
- "aopf;": "\u{01d552}",
- "ap;": "\u2248",
- "apE;": "\u2a70",
- "apacir;": "\u2a6f",
- "ape;": "\u224a",
- "apid;": "\u224b",
- "apos;": "'",
- "approx;": "\u2248",
- "approxeq;": "\u224a",
- "aring": "\xe5",
- "aring;": "\xe5",
- "ascr;": "\u{01d4b6}",
- "ast;": "*",
- "asymp;": "\u2248",
- "asympeq;": "\u224d",
- "atilde": "\xe3",
- "atilde;": "\xe3",
- "auml": "\xe4",
- "auml;": "\xe4",
- "awconint;": "\u2233",
- "awint;": "\u2a11",
- "bNot;": "\u2aed",
- "backcong;": "\u224c",
- "backepsilon;": "\u03f6",
- "backprime;": "\u2035",
- "backsim;": "\u223d",
- "backsimeq;": "\u22cd",
- "barvee;": "\u22bd",
- "barwed;": "\u2305",
- "barwedge;": "\u2305",
- "bbrk;": "\u23b5",
- "bbrktbrk;": "\u23b6",
- "bcong;": "\u224c",
- "bcy;": "\u0431",
- "bdquo;": "\u201e",
- "becaus;": "\u2235",
- "because;": "\u2235",
- "bemptyv;": "\u29b0",
- "bepsi;": "\u03f6",
- "bernou;": "\u212c",
- "beta;": "\u03b2",
- "beth;": "\u2136",
- "between;": "\u226c",
- "bfr;": "\u{01d51f}",
- "bigcap;": "\u22c2",
- "bigcirc;": "\u25ef",
- "bigcup;": "\u22c3",
- "bigodot;": "\u2a00",
- "bigoplus;": "\u2a01",
- "bigotimes;": "\u2a02",
- "bigsqcup;": "\u2a06",
- "bigstar;": "\u2605",
- "bigtriangledown;": "\u25bd",
- "bigtriangleup;": "\u25b3",
- "biguplus;": "\u2a04",
- "bigvee;": "\u22c1",
- "bigwedge;": "\u22c0",
- "bkarow;": "\u290d",
- "blacklozenge;": "\u29eb",
- "blacksquare;": "\u25aa",
- "blacktriangle;": "\u25b4",
- "blacktriangledown;": "\u25be",
- "blacktriangleleft;": "\u25c2",
- "blacktriangleright;": "\u25b8",
- "blank;": "\u2423",
- "blk12;": "\u2592",
- "blk14;": "\u2591",
- "blk34;": "\u2593",
- "block;": "\u2588",
- "bne;": "=\u20e5",
- "bnequiv;": "\u2261\u20e5",
- "bnot;": "\u2310",
- "bopf;": "\u{01d553}",
- "bot;": "\u22a5",
- "bottom;": "\u22a5",
- "bowtie;": "\u22c8",
- "boxDL;": "\u2557",
- "boxDR;": "\u2554",
- "boxDl;": "\u2556",
- "boxDr;": "\u2553",
- "boxH;": "\u2550",
- "boxHD;": "\u2566",
- "boxHU;": "\u2569",
- "boxHd;": "\u2564",
- "boxHu;": "\u2567",
- "boxUL;": "\u255d",
- "boxUR;": "\u255a",
- "boxUl;": "\u255c",
- "boxUr;": "\u2559",
- "boxV;": "\u2551",
- "boxVH;": "\u256c",
- "boxVL;": "\u2563",
- "boxVR;": "\u2560",
- "boxVh;": "\u256b",
- "boxVl;": "\u2562",
- "boxVr;": "\u255f",
- "boxbox;": "\u29c9",
- "boxdL;": "\u2555",
- "boxdR;": "\u2552",
- "boxdl;": "\u2510",
- "boxdr;": "\u250c",
- "boxh;": "\u2500",
- "boxhD;": "\u2565",
- "boxhU;": "\u2568",
- "boxhd;": "\u252c",
- "boxhu;": "\u2534",
- "boxminus;": "\u229f",
- "boxplus;": "\u229e",
- "boxtimes;": "\u22a0",
- "boxuL;": "\u255b",
- "boxuR;": "\u2558",
- "boxul;": "\u2518",
- "boxur;": "\u2514",
- "boxv;": "\u2502",
- "boxvH;": "\u256a",
- "boxvL;": "\u2561",
- "boxvR;": "\u255e",
- "boxvh;": "\u253c",
- "boxvl;": "\u2524",
- "boxvr;": "\u251c",
- "bprime;": "\u2035",
- "breve;": "\u02d8",
- "brvbar": "\xa6",
- "brvbar;": "\xa6",
- "bscr;": "\u{01d4b7}",
- "bsemi;": "\u204f",
- "bsim;": "\u223d",
- "bsime;": "\u22cd",
- "bsol;": "\\",
- "bsolb;": "\u29c5",
- "bsolhsub;": "\u27c8",
- "bull;": "\u2022",
- "bullet;": "\u2022",
- "bump;": "\u224e",
- "bumpE;": "\u2aae",
- "bumpe;": "\u224f",
- "bumpeq;": "\u224f",
- "cacute;": "\u0107",
- "cap;": "\u2229",
- "capand;": "\u2a44",
- "capbrcup;": "\u2a49",
- "capcap;": "\u2a4b",
- "capcup;": "\u2a47",
- "capdot;": "\u2a40",
- "caps;": "\u2229\ufe00",
- "caret;": "\u2041",
- "caron;": "\u02c7",
- "ccaps;": "\u2a4d",
- "ccaron;": "\u010d",
- "ccedil": "\xe7",
- "ccedil;": "\xe7",
- "ccirc;": "\u0109",
- "ccups;": "\u2a4c",
- "ccupssm;": "\u2a50",
- "cdot;": "\u010b",
- "cedil": "\xb8",
- "cedil;": "\xb8",
- "cemptyv;": "\u29b2",
- "cent": "\xa2",
- "cent;": "\xa2",
- "centerdot;": "\xb7",
- "cfr;": "\u{01d520}",
- "chcy;": "\u0447",
- "check;": "\u2713",
- "checkmark;": "\u2713",
- "chi;": "\u03c7",
- "cir;": "\u25cb",
- "cirE;": "\u29c3",
- "circ;": "\u02c6",
- "circeq;": "\u2257",
- "circlearrowleft;": "\u21ba",
- "circlearrowright;": "\u21bb",
- "circledR;": "\xae",
- "circledS;": "\u24c8",
- "circledast;": "\u229b",
- "circledcirc;": "\u229a",
- "circleddash;": "\u229d",
- "cire;": "\u2257",
- "cirfnint;": "\u2a10",
- "cirmid;": "\u2aef",
- "cirscir;": "\u29c2",
- "clubs;": "\u2663",
- "clubsuit;": "\u2663",
- "colon;": ":",
- "colone;": "\u2254",
- "coloneq;": "\u2254",
- "comma;": ",",
- "commat;": "@",
- "comp;": "\u2201",
- "compfn;": "\u2218",
- "complement;": "\u2201",
- "complexes;": "\u2102",
- "cong;": "\u2245",
- "congdot;": "\u2a6d",
- "conint;": "\u222e",
- "copf;": "\u{01d554}",
- "coprod;": "\u2210",
- "copy": "\xa9",
- "copy;": "\xa9",
- "copysr;": "\u2117",
- "crarr;": "\u21b5",
- "cross;": "\u2717",
- "cscr;": "\u{01d4b8}",
- "csub;": "\u2acf",
- "csube;": "\u2ad1",
- "csup;": "\u2ad0",
- "csupe;": "\u2ad2",
- "ctdot;": "\u22ef",
- "cudarrl;": "\u2938",
- "cudarrr;": "\u2935",
- "cuepr;": "\u22de",
- "cuesc;": "\u22df",
- "cularr;": "\u21b6",
- "cularrp;": "\u293d",
- "cup;": "\u222a",
- "cupbrcap;": "\u2a48",
- "cupcap;": "\u2a46",
- "cupcup;": "\u2a4a",
- "cupdot;": "\u228d",
- "cupor;": "\u2a45",
- "cups;": "\u222a\ufe00",
- "curarr;": "\u21b7",
- "curarrm;": "\u293c",
- "curlyeqprec;": "\u22de",
- "curlyeqsucc;": "\u22df",
- "curlyvee;": "\u22ce",
- "curlywedge;": "\u22cf",
- "curren": "\xa4",
- "curren;": "\xa4",
- "curvearrowleft;": "\u21b6",
- "curvearrowright;": "\u21b7",
- "cuvee;": "\u22ce",
- "cuwed;": "\u22cf",
- "cwconint;": "\u2232",
- "cwint;": "\u2231",
- "cylcty;": "\u232d",
- "dArr;": "\u21d3",
- "dHar;": "\u2965",
- "dagger;": "\u2020",
- "daleth;": "\u2138",
- "darr;": "\u2193",
- "dash;": "\u2010",
- "dashv;": "\u22a3",
- "dbkarow;": "\u290f",
- "dblac;": "\u02dd",
- "dcaron;": "\u010f",
- "dcy;": "\u0434",
- "dd;": "\u2146",
- "ddagger;": "\u2021",
- "ddarr;": "\u21ca",
- "ddotseq;": "\u2a77",
- "deg": "\xb0",
- "deg;": "\xb0",
- "delta;": "\u03b4",
- "demptyv;": "\u29b1",
- "dfisht;": "\u297f",
- "dfr;": "\u{01d521}",
- "dharl;": "\u21c3",
- "dharr;": "\u21c2",
- "diam;": "\u22c4",
- "diamond;": "\u22c4",
- "diamondsuit;": "\u2666",
- "diams;": "\u2666",
- "die;": "\xa8",
- "digamma;": "\u03dd",
- "disin;": "\u22f2",
- "div;": "\xf7",
- "divide": "\xf7",
- "divide;": "\xf7",
- "divideontimes;": "\u22c7",
- "divonx;": "\u22c7",
- "djcy;": "\u0452",
- "dlcorn;": "\u231e",
- "dlcrop;": "\u230d",
- "dollar;": "\$",
- "dopf;": "\u{01d555}",
- "dot;": "\u02d9",
- "doteq;": "\u2250",
- "doteqdot;": "\u2251",
- "dotminus;": "\u2238",
- "dotplus;": "\u2214",
- "dotsquare;": "\u22a1",
- "doublebarwedge;": "\u2306",
- "downarrow;": "\u2193",
- "downdownarrows;": "\u21ca",
- "downharpoonleft;": "\u21c3",
- "downharpoonright;": "\u21c2",
- "drbkarow;": "\u2910",
- "drcorn;": "\u231f",
- "drcrop;": "\u230c",
- "dscr;": "\u{01d4b9}",
- "dscy;": "\u0455",
- "dsol;": "\u29f6",
- "dstrok;": "\u0111",
- "dtdot;": "\u22f1",
- "dtri;": "\u25bf",
- "dtrif;": "\u25be",
- "duarr;": "\u21f5",
- "duhar;": "\u296f",
- "dwangle;": "\u29a6",
- "dzcy;": "\u045f",
- "dzigrarr;": "\u27ff",
- "eDDot;": "\u2a77",
- "eDot;": "\u2251",
- "eacute": "\xe9",
- "eacute;": "\xe9",
- "easter;": "\u2a6e",
- "ecaron;": "\u011b",
- "ecir;": "\u2256",
- "ecirc": "\xea",
- "ecirc;": "\xea",
- "ecolon;": "\u2255",
- "ecy;": "\u044d",
- "edot;": "\u0117",
- "ee;": "\u2147",
- "efDot;": "\u2252",
- "efr;": "\u{01d522}",
- "eg;": "\u2a9a",
- "egrave": "\xe8",
- "egrave;": "\xe8",
- "egs;": "\u2a96",
- "egsdot;": "\u2a98",
- "el;": "\u2a99",
- "elinters;": "\u23e7",
- "ell;": "\u2113",
- "els;": "\u2a95",
- "elsdot;": "\u2a97",
- "emacr;": "\u0113",
- "empty;": "\u2205",
- "emptyset;": "\u2205",
- "emptyv;": "\u2205",
- "emsp13;": "\u2004",
- "emsp14;": "\u2005",
- "emsp;": "\u2003",
- "eng;": "\u014b",
- "ensp;": "\u2002",
- "eogon;": "\u0119",
- "eopf;": "\u{01d556}",
- "epar;": "\u22d5",
- "eparsl;": "\u29e3",
- "eplus;": "\u2a71",
- "epsi;": "\u03b5",
- "epsilon;": "\u03b5",
- "epsiv;": "\u03f5",
- "eqcirc;": "\u2256",
- "eqcolon;": "\u2255",
- "eqsim;": "\u2242",
- "eqslantgtr;": "\u2a96",
- "eqslantless;": "\u2a95",
- "equals;": "=",
- "equest;": "\u225f",
- "equiv;": "\u2261",
- "equivDD;": "\u2a78",
- "eqvparsl;": "\u29e5",
- "erDot;": "\u2253",
- "erarr;": "\u2971",
- "escr;": "\u212f",
- "esdot;": "\u2250",
- "esim;": "\u2242",
- "eta;": "\u03b7",
- "eth": "\xf0",
- "eth;": "\xf0",
- "euml": "\xeb",
- "euml;": "\xeb",
- "euro;": "\u20ac",
- "excl;": "!",
- "exist;": "\u2203",
- "expectation;": "\u2130",
- "exponentiale;": "\u2147",
- "fallingdotseq;": "\u2252",
- "fcy;": "\u0444",
- "female;": "\u2640",
- "ffilig;": "\ufb03",
- "fflig;": "\ufb00",
- "ffllig;": "\ufb04",
- "ffr;": "\u{01d523}",
- "filig;": "\ufb01",
- "fjlig;": "fj",
- "flat;": "\u266d",
- "fllig;": "\ufb02",
- "fltns;": "\u25b1",
- "fnof;": "\u0192",
- "fopf;": "\u{01d557}",
- "forall;": "\u2200",
- "fork;": "\u22d4",
- "forkv;": "\u2ad9",
- "fpartint;": "\u2a0d",
- "frac12": "\xbd",
- "frac12;": "\xbd",
- "frac13;": "\u2153",
- "frac14": "\xbc",
- "frac14;": "\xbc",
- "frac15;": "\u2155",
- "frac16;": "\u2159",
- "frac18;": "\u215b",
- "frac23;": "\u2154",
- "frac25;": "\u2156",
- "frac34": "\xbe",
- "frac34;": "\xbe",
- "frac35;": "\u2157",
- "frac38;": "\u215c",
- "frac45;": "\u2158",
- "frac56;": "\u215a",
- "frac58;": "\u215d",
- "frac78;": "\u215e",
- "frasl;": "\u2044",
- "frown;": "\u2322",
- "fscr;": "\u{01d4bb}",
- "gE;": "\u2267",
- "gEl;": "\u2a8c",
- "gacute;": "\u01f5",
- "gamma;": "\u03b3",
- "gammad;": "\u03dd",
- "gap;": "\u2a86",
- "gbreve;": "\u011f",
- "gcirc;": "\u011d",
- "gcy;": "\u0433",
- "gdot;": "\u0121",
- "ge;": "\u2265",
- "gel;": "\u22db",
- "geq;": "\u2265",
- "geqq;": "\u2267",
- "geqslant;": "\u2a7e",
- "ges;": "\u2a7e",
- "gescc;": "\u2aa9",
- "gesdot;": "\u2a80",
- "gesdoto;": "\u2a82",
- "gesdotol;": "\u2a84",
- "gesl;": "\u22db\ufe00",
- "gesles;": "\u2a94",
- "gfr;": "\u{01d524}",
- "gg;": "\u226b",
- "ggg;": "\u22d9",
- "gimel;": "\u2137",
- "gjcy;": "\u0453",
- "gl;": "\u2277",
- "glE;": "\u2a92",
- "gla;": "\u2aa5",
- "glj;": "\u2aa4",
- "gnE;": "\u2269",
- "gnap;": "\u2a8a",
- "gnapprox;": "\u2a8a",
- "gne;": "\u2a88",
- "gneq;": "\u2a88",
- "gneqq;": "\u2269",
- "gnsim;": "\u22e7",
- "gopf;": "\u{01d558}",
- "grave;": "`",
- "gscr;": "\u210a",
- "gsim;": "\u2273",
- "gsime;": "\u2a8e",
- "gsiml;": "\u2a90",
- "gt": ">",
- "gt;": ">",
- "gtcc;": "\u2aa7",
- "gtcir;": "\u2a7a",
- "gtdot;": "\u22d7",
- "gtlPar;": "\u2995",
- "gtquest;": "\u2a7c",
- "gtrapprox;": "\u2a86",
- "gtrarr;": "\u2978",
- "gtrdot;": "\u22d7",
- "gtreqless;": "\u22db",
- "gtreqqless;": "\u2a8c",
- "gtrless;": "\u2277",
- "gtrsim;": "\u2273",
- "gvertneqq;": "\u2269\ufe00",
- "gvnE;": "\u2269\ufe00",
- "hArr;": "\u21d4",
- "hairsp;": "\u200a",
- "half;": "\xbd",
- "hamilt;": "\u210b",
- "hardcy;": "\u044a",
- "harr;": "\u2194",
- "harrcir;": "\u2948",
- "harrw;": "\u21ad",
- "hbar;": "\u210f",
- "hcirc;": "\u0125",
- "hearts;": "\u2665",
- "heartsuit;": "\u2665",
- "hellip;": "\u2026",
- "hercon;": "\u22b9",
- "hfr;": "\u{01d525}",
- "hksearow;": "\u2925",
- "hkswarow;": "\u2926",
- "hoarr;": "\u21ff",
- "homtht;": "\u223b",
- "hookleftarrow;": "\u21a9",
- "hookrightarrow;": "\u21aa",
- "hopf;": "\u{01d559}",
- "horbar;": "\u2015",
- "hscr;": "\u{01d4bd}",
- "hslash;": "\u210f",
- "hstrok;": "\u0127",
- "hybull;": "\u2043",
- "hyphen;": "\u2010",
- "iacute": "\xed",
- "iacute;": "\xed",
- "ic;": "\u2063",
- "icirc": "\xee",
- "icirc;": "\xee",
- "icy;": "\u0438",
- "iecy;": "\u0435",
- "iexcl": "\xa1",
- "iexcl;": "\xa1",
- "iff;": "\u21d4",
- "ifr;": "\u{01d526}",
- "igrave": "\xec",
- "igrave;": "\xec",
- "ii;": "\u2148",
- "iiiint;": "\u2a0c",
- "iiint;": "\u222d",
- "iinfin;": "\u29dc",
- "iiota;": "\u2129",
- "ijlig;": "\u0133",
- "imacr;": "\u012b",
- "image;": "\u2111",
- "imagline;": "\u2110",
- "imagpart;": "\u2111",
- "imath;": "\u0131",
- "imof;": "\u22b7",
- "imped;": "\u01b5",
- "in;": "\u2208",
- "incare;": "\u2105",
- "infin;": "\u221e",
- "infintie;": "\u29dd",
- "inodot;": "\u0131",
- "int;": "\u222b",
- "intcal;": "\u22ba",
- "integers;": "\u2124",
- "intercal;": "\u22ba",
- "intlarhk;": "\u2a17",
- "intprod;": "\u2a3c",
- "iocy;": "\u0451",
- "iogon;": "\u012f",
- "iopf;": "\u{01d55a}",
- "iota;": "\u03b9",
- "iprod;": "\u2a3c",
- "iquest": "\xbf",
- "iquest;": "\xbf",
- "iscr;": "\u{01d4be}",
- "isin;": "\u2208",
- "isinE;": "\u22f9",
- "isindot;": "\u22f5",
- "isins;": "\u22f4",
- "isinsv;": "\u22f3",
- "isinv;": "\u2208",
- "it;": "\u2062",
- "itilde;": "\u0129",
- "iukcy;": "\u0456",
- "iuml": "\xef",
- "iuml;": "\xef",
- "jcirc;": "\u0135",
- "jcy;": "\u0439",
- "jfr;": "\u{01d527}",
- "jmath;": "\u0237",
- "jopf;": "\u{01d55b}",
- "jscr;": "\u{01d4bf}",
- "jsercy;": "\u0458",
- "jukcy;": "\u0454",
- "kappa;": "\u03ba",
- "kappav;": "\u03f0",
- "kcedil;": "\u0137",
- "kcy;": "\u043a",
- "kfr;": "\u{01d528}",
- "kgreen;": "\u0138",
- "khcy;": "\u0445",
- "kjcy;": "\u045c",
- "kopf;": "\u{01d55c}",
- "kscr;": "\u{01d4c0}",
- "lAarr;": "\u21da",
- "lArr;": "\u21d0",
- "lAtail;": "\u291b",
- "lBarr;": "\u290e",
- "lE;": "\u2266",
- "lEg;": "\u2a8b",
- "lHar;": "\u2962",
- "lacute;": "\u013a",
- "laemptyv;": "\u29b4",
- "lagran;": "\u2112",
- "lambda;": "\u03bb",
- "lang;": "\u27e8",
- "langd;": "\u2991",
- "langle;": "\u27e8",
- "lap;": "\u2a85",
- "laquo": "\xab",
- "laquo;": "\xab",
- "larr;": "\u2190",
- "larrb;": "\u21e4",
- "larrbfs;": "\u291f",
- "larrfs;": "\u291d",
- "larrhk;": "\u21a9",
- "larrlp;": "\u21ab",
- "larrpl;": "\u2939",
- "larrsim;": "\u2973",
- "larrtl;": "\u21a2",
- "lat;": "\u2aab",
- "latail;": "\u2919",
- "late;": "\u2aad",
- "lates;": "\u2aad\ufe00",
- "lbarr;": "\u290c",
- "lbbrk;": "\u2772",
- "lbrace;": "{",
- "lbrack;": "[",
- "lbrke;": "\u298b",
- "lbrksld;": "\u298f",
- "lbrkslu;": "\u298d",
- "lcaron;": "\u013e",
- "lcedil;": "\u013c",
- "lceil;": "\u2308",
- "lcub;": "{",
- "lcy;": "\u043b",
- "ldca;": "\u2936",
- "ldquo;": "\u201c",
- "ldquor;": "\u201e",
- "ldrdhar;": "\u2967",
- "ldrushar;": "\u294b",
- "ldsh;": "\u21b2",
- "le;": "\u2264",
- "leftarrow;": "\u2190",
- "leftarrowtail;": "\u21a2",
- "leftharpoondown;": "\u21bd",
- "leftharpoonup;": "\u21bc",
- "leftleftarrows;": "\u21c7",
- "leftrightarrow;": "\u2194",
- "leftrightarrows;": "\u21c6",
- "leftrightharpoons;": "\u21cb",
- "leftrightsquigarrow;": "\u21ad",
- "leftthreetimes;": "\u22cb",
- "leg;": "\u22da",
- "leq;": "\u2264",
- "leqq;": "\u2266",
- "leqslant;": "\u2a7d",
- "les;": "\u2a7d",
- "lescc;": "\u2aa8",
- "lesdot;": "\u2a7f",
- "lesdoto;": "\u2a81",
- "lesdotor;": "\u2a83",
- "lesg;": "\u22da\ufe00",
- "lesges;": "\u2a93",
- "lessapprox;": "\u2a85",
- "lessdot;": "\u22d6",
- "lesseqgtr;": "\u22da",
- "lesseqqgtr;": "\u2a8b",
- "lessgtr;": "\u2276",
- "lesssim;": "\u2272",
- "lfisht;": "\u297c",
- "lfloor;": "\u230a",
- "lfr;": "\u{01d529}",
- "lg;": "\u2276",
- "lgE;": "\u2a91",
- "lhard;": "\u21bd",
- "lharu;": "\u21bc",
- "lharul;": "\u296a",
- "lhblk;": "\u2584",
- "ljcy;": "\u0459",
- "ll;": "\u226a",
- "llarr;": "\u21c7",
- "llcorner;": "\u231e",
- "llhard;": "\u296b",
- "lltri;": "\u25fa",
- "lmidot;": "\u0140",
- "lmoust;": "\u23b0",
- "lmoustache;": "\u23b0",
- "lnE;": "\u2268",
- "lnap;": "\u2a89",
- "lnapprox;": "\u2a89",
- "lne;": "\u2a87",
- "lneq;": "\u2a87",
- "lneqq;": "\u2268",
- "lnsim;": "\u22e6",
- "loang;": "\u27ec",
- "loarr;": "\u21fd",
- "lobrk;": "\u27e6",
- "longleftarrow;": "\u27f5",
- "longleftrightarrow;": "\u27f7",
- "longmapsto;": "\u27fc",
- "longrightarrow;": "\u27f6",
- "looparrowleft;": "\u21ab",
- "looparrowright;": "\u21ac",
- "lopar;": "\u2985",
- "lopf;": "\u{01d55d}",
- "loplus;": "\u2a2d",
- "lotimes;": "\u2a34",
- "lowast;": "\u2217",
- "lowbar;": "_",
- "loz;": "\u25ca",
- "lozenge;": "\u25ca",
- "lozf;": "\u29eb",
- "lpar;": "(",
- "lparlt;": "\u2993",
- "lrarr;": "\u21c6",
- "lrcorner;": "\u231f",
- "lrhar;": "\u21cb",
- "lrhard;": "\u296d",
- "lrm;": "\u200e",
- "lrtri;": "\u22bf",
- "lsaquo;": "\u2039",
- "lscr;": "\u{01d4c1}",
- "lsh;": "\u21b0",
- "lsim;": "\u2272",
- "lsime;": "\u2a8d",
- "lsimg;": "\u2a8f",
- "lsqb;": "[",
- "lsquo;": "\u2018",
- "lsquor;": "\u201a",
- "lstrok;": "\u0142",
- "lt": "<",
- "lt;": "<",
- "ltcc;": "\u2aa6",
- "ltcir;": "\u2a79",
- "ltdot;": "\u22d6",
- "lthree;": "\u22cb",
- "ltimes;": "\u22c9",
- "ltlarr;": "\u2976",
- "ltquest;": "\u2a7b",
- "ltrPar;": "\u2996",
- "ltri;": "\u25c3",
- "ltrie;": "\u22b4",
- "ltrif;": "\u25c2",
- "lurdshar;": "\u294a",
- "luruhar;": "\u2966",
- "lvertneqq;": "\u2268\ufe00",
- "lvnE;": "\u2268\ufe00",
- "mDDot;": "\u223a",
- "macr": "\xaf",
- "macr;": "\xaf",
- "male;": "\u2642",
- "malt;": "\u2720",
- "maltese;": "\u2720",
- "map;": "\u21a6",
- "mapsto;": "\u21a6",
- "mapstodown;": "\u21a7",
- "mapstoleft;": "\u21a4",
- "mapstoup;": "\u21a5",
- "marker;": "\u25ae",
- "mcomma;": "\u2a29",
- "mcy;": "\u043c",
- "mdash;": "\u2014",
- "measuredangle;": "\u2221",
- "mfr;": "\u{01d52a}",
- "mho;": "\u2127",
- "micro": "\xb5",
- "micro;": "\xb5",
- "mid;": "\u2223",
- "midast;": "*",
- "midcir;": "\u2af0",
- "middot": "\xb7",
- "middot;": "\xb7",
- "minus;": "\u2212",
- "minusb;": "\u229f",
- "minusd;": "\u2238",
- "minusdu;": "\u2a2a",
- "mlcp;": "\u2adb",
- "mldr;": "\u2026",
- "mnplus;": "\u2213",
- "models;": "\u22a7",
- "mopf;": "\u{01d55e}",
- "mp;": "\u2213",
- "mscr;": "\u{01d4c2}",
- "mstpos;": "\u223e",
- "mu;": "\u03bc",
- "multimap;": "\u22b8",
- "mumap;": "\u22b8",
- "nGg;": "\u22d9\u0338",
- "nGt;": "\u226b\u20d2",
- "nGtv;": "\u226b\u0338",
- "nLeftarrow;": "\u21cd",
- "nLeftrightarrow;": "\u21ce",
- "nLl;": "\u22d8\u0338",
- "nLt;": "\u226a\u20d2",
- "nLtv;": "\u226a\u0338",
- "nRightarrow;": "\u21cf",
- "nVDash;": "\u22af",
- "nVdash;": "\u22ae",
- "nabla;": "\u2207",
- "nacute;": "\u0144",
- "nang;": "\u2220\u20d2",
- "nap;": "\u2249",
- "napE;": "\u2a70\u0338",
- "napid;": "\u224b\u0338",
- "napos;": "\u0149",
- "napprox;": "\u2249",
- "natur;": "\u266e",
- "natural;": "\u266e",
- "naturals;": "\u2115",
- "nbsp": "\xa0",
- "nbsp;": "\xa0",
- "nbump;": "\u224e\u0338",
- "nbumpe;": "\u224f\u0338",
- "ncap;": "\u2a43",
- "ncaron;": "\u0148",
- "ncedil;": "\u0146",
- "ncong;": "\u2247",
- "ncongdot;": "\u2a6d\u0338",
- "ncup;": "\u2a42",
- "ncy;": "\u043d",
- "ndash;": "\u2013",
- "ne;": "\u2260",
- "neArr;": "\u21d7",
- "nearhk;": "\u2924",
- "nearr;": "\u2197",
- "nearrow;": "\u2197",
- "nedot;": "\u2250\u0338",
- "nequiv;": "\u2262",
- "nesear;": "\u2928",
- "nesim;": "\u2242\u0338",
- "nexist;": "\u2204",
- "nexists;": "\u2204",
- "nfr;": "\u{01d52b}",
- "ngE;": "\u2267\u0338",
- "nge;": "\u2271",
- "ngeq;": "\u2271",
- "ngeqq;": "\u2267\u0338",
- "ngeqslant;": "\u2a7e\u0338",
- "nges;": "\u2a7e\u0338",
- "ngsim;": "\u2275",
- "ngt;": "\u226f",
- "ngtr;": "\u226f",
- "nhArr;": "\u21ce",
- "nharr;": "\u21ae",
- "nhpar;": "\u2af2",
- "ni;": "\u220b",
- "nis;": "\u22fc",
- "nisd;": "\u22fa",
- "niv;": "\u220b",
- "njcy;": "\u045a",
- "nlArr;": "\u21cd",
- "nlE;": "\u2266\u0338",
- "nlarr;": "\u219a",
- "nldr;": "\u2025",
- "nle;": "\u2270",
- "nleftarrow;": "\u219a",
- "nleftrightarrow;": "\u21ae",
- "nleq;": "\u2270",
- "nleqq;": "\u2266\u0338",
- "nleqslant;": "\u2a7d\u0338",
- "nles;": "\u2a7d\u0338",
- "nless;": "\u226e",
- "nlsim;": "\u2274",
- "nlt;": "\u226e",
- "nltri;": "\u22ea",
- "nltrie;": "\u22ec",
- "nmid;": "\u2224",
- "nopf;": "\u{01d55f}",
- "not": "\xac",
- "not;": "\xac",
- "notin;": "\u2209",
- "notinE;": "\u22f9\u0338",
- "notindot;": "\u22f5\u0338",
- "notinva;": "\u2209",
- "notinvb;": "\u22f7",
- "notinvc;": "\u22f6",
- "notni;": "\u220c",
- "notniva;": "\u220c",
- "notnivb;": "\u22fe",
- "notnivc;": "\u22fd",
- "npar;": "\u2226",
- "nparallel;": "\u2226",
- "nparsl;": "\u2afd\u20e5",
- "npart;": "\u2202\u0338",
- "npolint;": "\u2a14",
- "npr;": "\u2280",
- "nprcue;": "\u22e0",
- "npre;": "\u2aaf\u0338",
- "nprec;": "\u2280",
- "npreceq;": "\u2aaf\u0338",
- "nrArr;": "\u21cf",
- "nrarr;": "\u219b",
- "nrarrc;": "\u2933\u0338",
- "nrarrw;": "\u219d\u0338",
- "nrightarrow;": "\u219b",
- "nrtri;": "\u22eb",
- "nrtrie;": "\u22ed",
- "nsc;": "\u2281",
- "nsccue;": "\u22e1",
- "nsce;": "\u2ab0\u0338",
- "nscr;": "\u{01d4c3}",
- "nshortmid;": "\u2224",
- "nshortparallel;": "\u2226",
- "nsim;": "\u2241",
- "nsime;": "\u2244",
- "nsimeq;": "\u2244",
- "nsmid;": "\u2224",
- "nspar;": "\u2226",
- "nsqsube;": "\u22e2",
- "nsqsupe;": "\u22e3",
- "nsub;": "\u2284",
- "nsubE;": "\u2ac5\u0338",
- "nsube;": "\u2288",
- "nsubset;": "\u2282\u20d2",
- "nsubseteq;": "\u2288",
- "nsubseteqq;": "\u2ac5\u0338",
- "nsucc;": "\u2281",
- "nsucceq;": "\u2ab0\u0338",
- "nsup;": "\u2285",
- "nsupE;": "\u2ac6\u0338",
- "nsupe;": "\u2289",
- "nsupset;": "\u2283\u20d2",
- "nsupseteq;": "\u2289",
- "nsupseteqq;": "\u2ac6\u0338",
- "ntgl;": "\u2279",
- "ntilde": "\xf1",
- "ntilde;": "\xf1",
- "ntlg;": "\u2278",
- "ntriangleleft;": "\u22ea",
- "ntrianglelefteq;": "\u22ec",
- "ntriangleright;": "\u22eb",
- "ntrianglerighteq;": "\u22ed",
- "nu;": "\u03bd",
- "num;": "#",
- "numero;": "\u2116",
- "numsp;": "\u2007",
- "nvDash;": "\u22ad",
- "nvHarr;": "\u2904",
- "nvap;": "\u224d\u20d2",
- "nvdash;": "\u22ac",
- "nvge;": "\u2265\u20d2",
- "nvgt;": ">\u20d2",
- "nvinfin;": "\u29de",
- "nvlArr;": "\u2902",
- "nvle;": "\u2264\u20d2",
- "nvlt;": "<\u20d2",
- "nvltrie;": "\u22b4\u20d2",
- "nvrArr;": "\u2903",
- "nvrtrie;": "\u22b5\u20d2",
- "nvsim;": "\u223c\u20d2",
- "nwArr;": "\u21d6",
- "nwarhk;": "\u2923",
- "nwarr;": "\u2196",
- "nwarrow;": "\u2196",
- "nwnear;": "\u2927",
- "oS;": "\u24c8",
- "oacute": "\xf3",
- "oacute;": "\xf3",
- "oast;": "\u229b",
- "ocir;": "\u229a",
- "ocirc": "\xf4",
- "ocirc;": "\xf4",
- "ocy;": "\u043e",
- "odash;": "\u229d",
- "odblac;": "\u0151",
- "odiv;": "\u2a38",
- "odot;": "\u2299",
- "odsold;": "\u29bc",
- "oelig;": "\u0153",
- "ofcir;": "\u29bf",
- "ofr;": "\u{01d52c}",
- "ogon;": "\u02db",
- "ograve": "\xf2",
- "ograve;": "\xf2",
- "ogt;": "\u29c1",
- "ohbar;": "\u29b5",
- "ohm;": "\u03a9",
- "oint;": "\u222e",
- "olarr;": "\u21ba",
- "olcir;": "\u29be",
- "olcross;": "\u29bb",
- "oline;": "\u203e",
- "olt;": "\u29c0",
- "omacr;": "\u014d",
- "omega;": "\u03c9",
- "omicron;": "\u03bf",
- "omid;": "\u29b6",
- "ominus;": "\u2296",
- "oopf;": "\u{01d560}",
- "opar;": "\u29b7",
- "operp;": "\u29b9",
- "oplus;": "\u2295",
- "or;": "\u2228",
- "orarr;": "\u21bb",
- "ord;": "\u2a5d",
- "order;": "\u2134",
- "orderof;": "\u2134",
- "ordf": "\xaa",
- "ordf;": "\xaa",
- "ordm": "\xba",
- "ordm;": "\xba",
- "origof;": "\u22b6",
- "oror;": "\u2a56",
- "orslope;": "\u2a57",
- "orv;": "\u2a5b",
- "oscr;": "\u2134",
- "oslash": "\xf8",
- "oslash;": "\xf8",
- "osol;": "\u2298",
- "otilde": "\xf5",
- "otilde;": "\xf5",
- "otimes;": "\u2297",
- "otimesas;": "\u2a36",
- "ouml": "\xf6",
- "ouml;": "\xf6",
- "ovbar;": "\u233d",
- "par;": "\u2225",
- "para": "\xb6",
- "para;": "\xb6",
- "parallel;": "\u2225",
- "parsim;": "\u2af3",
- "parsl;": "\u2afd",
- "part;": "\u2202",
- "pcy;": "\u043f",
- "percnt;": "%",
- "period;": ".",
- "permil;": "\u2030",
- "perp;": "\u22a5",
- "pertenk;": "\u2031",
- "pfr;": "\u{01d52d}",
- "phi;": "\u03c6",
- "phiv;": "\u03d5",
- "phmmat;": "\u2133",
- "phone;": "\u260e",
- "pi;": "\u03c0",
- "pitchfork;": "\u22d4",
- "piv;": "\u03d6",
- "planck;": "\u210f",
- "planckh;": "\u210e",
- "plankv;": "\u210f",
- "plus;": "+",
- "plusacir;": "\u2a23",
- "plusb;": "\u229e",
- "pluscir;": "\u2a22",
- "plusdo;": "\u2214",
- "plusdu;": "\u2a25",
- "pluse;": "\u2a72",
- "plusmn": "\xb1",
- "plusmn;": "\xb1",
- "plussim;": "\u2a26",
- "plustwo;": "\u2a27",
- "pm;": "\xb1",
- "pointint;": "\u2a15",
- "popf;": "\u{01d561}",
- "pound": "\xa3",
- "pound;": "\xa3",
- "pr;": "\u227a",
- "prE;": "\u2ab3",
- "prap;": "\u2ab7",
- "prcue;": "\u227c",
- "pre;": "\u2aaf",
- "prec;": "\u227a",
- "precapprox;": "\u2ab7",
- "preccurlyeq;": "\u227c",
- "preceq;": "\u2aaf",
- "precnapprox;": "\u2ab9",
- "precneqq;": "\u2ab5",
- "precnsim;": "\u22e8",
- "precsim;": "\u227e",
- "prime;": "\u2032",
- "primes;": "\u2119",
- "prnE;": "\u2ab5",
- "prnap;": "\u2ab9",
- "prnsim;": "\u22e8",
- "prod;": "\u220f",
- "profalar;": "\u232e",
- "profline;": "\u2312",
- "profsurf;": "\u2313",
- "prop;": "\u221d",
- "propto;": "\u221d",
- "prsim;": "\u227e",
- "prurel;": "\u22b0",
- "pscr;": "\u{01d4c5}",
- "psi;": "\u03c8",
- "puncsp;": "\u2008",
- "qfr;": "\u{01d52e}",
- "qint;": "\u2a0c",
- "qopf;": "\u{01d562}",
- "qprime;": "\u2057",
- "qscr;": "\u{01d4c6}",
- "quaternions;": "\u210d",
- "quatint;": "\u2a16",
- "quest;": "?",
- "questeq;": "\u225f",
- "quot": "\"",
- "quot;": "\"",
- "rAarr;": "\u21db",
- "rArr;": "\u21d2",
- "rAtail;": "\u291c",
- "rBarr;": "\u290f",
- "rHar;": "\u2964",
- "race;": "\u223d\u0331",
- "racute;": "\u0155",
- "radic;": "\u221a",
- "raemptyv;": "\u29b3",
- "rang;": "\u27e9",
- "rangd;": "\u2992",
- "range;": "\u29a5",
- "rangle;": "\u27e9",
- "raquo": "\xbb",
- "raquo;": "\xbb",
- "rarr;": "\u2192",
- "rarrap;": "\u2975",
- "rarrb;": "\u21e5",
- "rarrbfs;": "\u2920",
- "rarrc;": "\u2933",
- "rarrfs;": "\u291e",
- "rarrhk;": "\u21aa",
- "rarrlp;": "\u21ac",
- "rarrpl;": "\u2945",
- "rarrsim;": "\u2974",
- "rarrtl;": "\u21a3",
- "rarrw;": "\u219d",
- "ratail;": "\u291a",
- "ratio;": "\u2236",
- "rationals;": "\u211a",
- "rbarr;": "\u290d",
- "rbbrk;": "\u2773",
- "rbrace;": "}",
- "rbrack;": "]",
- "rbrke;": "\u298c",
- "rbrksld;": "\u298e",
- "rbrkslu;": "\u2990",
- "rcaron;": "\u0159",
- "rcedil;": "\u0157",
- "rceil;": "\u2309",
- "rcub;": "}",
- "rcy;": "\u0440",
- "rdca;": "\u2937",
- "rdldhar;": "\u2969",
- "rdquo;": "\u201d",
- "rdquor;": "\u201d",
- "rdsh;": "\u21b3",
- "real;": "\u211c",
- "realine;": "\u211b",
- "realpart;": "\u211c",
- "reals;": "\u211d",
- "rect;": "\u25ad",
- "reg": "\xae",
- "reg;": "\xae",
- "rfisht;": "\u297d",
- "rfloor;": "\u230b",
- "rfr;": "\u{01d52f}",
- "rhard;": "\u21c1",
- "rharu;": "\u21c0",
- "rharul;": "\u296c",
- "rho;": "\u03c1",
- "rhov;": "\u03f1",
- "rightarrow;": "\u2192",
- "rightarrowtail;": "\u21a3",
- "rightharpoondown;": "\u21c1",
- "rightharpoonup;": "\u21c0",
- "rightleftarrows;": "\u21c4",
- "rightleftharpoons;": "\u21cc",
- "rightrightarrows;": "\u21c9",
- "rightsquigarrow;": "\u219d",
- "rightthreetimes;": "\u22cc",
- "ring;": "\u02da",
- "risingdotseq;": "\u2253",
- "rlarr;": "\u21c4",
- "rlhar;": "\u21cc",
- "rlm;": "\u200f",
- "rmoust;": "\u23b1",
- "rmoustache;": "\u23b1",
- "rnmid;": "\u2aee",
- "roang;": "\u27ed",
- "roarr;": "\u21fe",
- "robrk;": "\u27e7",
- "ropar;": "\u2986",
- "ropf;": "\u{01d563}",
- "roplus;": "\u2a2e",
- "rotimes;": "\u2a35",
- "rpar;": ")",
- "rpargt;": "\u2994",
- "rppolint;": "\u2a12",
- "rrarr;": "\u21c9",
- "rsaquo;": "\u203a",
- "rscr;": "\u{01d4c7}",
- "rsh;": "\u21b1",
- "rsqb;": "]",
- "rsquo;": "\u2019",
- "rsquor;": "\u2019",
- "rthree;": "\u22cc",
- "rtimes;": "\u22ca",
- "rtri;": "\u25b9",
- "rtrie;": "\u22b5",
- "rtrif;": "\u25b8",
- "rtriltri;": "\u29ce",
- "ruluhar;": "\u2968",
- "rx;": "\u211e",
- "sacute;": "\u015b",
- "sbquo;": "\u201a",
- "sc;": "\u227b",
- "scE;": "\u2ab4",
- "scap;": "\u2ab8",
- "scaron;": "\u0161",
- "sccue;": "\u227d",
- "sce;": "\u2ab0",
- "scedil;": "\u015f",
- "scirc;": "\u015d",
- "scnE;": "\u2ab6",
- "scnap;": "\u2aba",
- "scnsim;": "\u22e9",
- "scpolint;": "\u2a13",
- "scsim;": "\u227f",
- "scy;": "\u0441",
- "sdot;": "\u22c5",
- "sdotb;": "\u22a1",
- "sdote;": "\u2a66",
- "seArr;": "\u21d8",
- "searhk;": "\u2925",
- "searr;": "\u2198",
- "searrow;": "\u2198",
- "sect": "\xa7",
- "sect;": "\xa7",
- "semi;": ";",
- "seswar;": "\u2929",
- "setminus;": "\u2216",
- "setmn;": "\u2216",
- "sext;": "\u2736",
- "sfr;": "\u{01d530}",
- "sfrown;": "\u2322",
- "sharp;": "\u266f",
- "shchcy;": "\u0449",
- "shcy;": "\u0448",
- "shortmid;": "\u2223",
- "shortparallel;": "\u2225",
- "shy": "\xad",
- "shy;": "\xad",
- "sigma;": "\u03c3",
- "sigmaf;": "\u03c2",
- "sigmav;": "\u03c2",
- "sim;": "\u223c",
- "simdot;": "\u2a6a",
- "sime;": "\u2243",
- "simeq;": "\u2243",
- "simg;": "\u2a9e",
- "simgE;": "\u2aa0",
- "siml;": "\u2a9d",
- "simlE;": "\u2a9f",
- "simne;": "\u2246",
- "simplus;": "\u2a24",
- "simrarr;": "\u2972",
- "slarr;": "\u2190",
- "smallsetminus;": "\u2216",
- "smashp;": "\u2a33",
- "smeparsl;": "\u29e4",
- "smid;": "\u2223",
- "smile;": "\u2323",
- "smt;": "\u2aaa",
- "smte;": "\u2aac",
- "smtes;": "\u2aac\ufe00",
- "softcy;": "\u044c",
- "sol;": "/",
- "solb;": "\u29c4",
- "solbar;": "\u233f",
- "sopf;": "\u{01d564}",
- "spades;": "\u2660",
- "spadesuit;": "\u2660",
- "spar;": "\u2225",
- "sqcap;": "\u2293",
- "sqcaps;": "\u2293\ufe00",
- "sqcup;": "\u2294",
- "sqcups;": "\u2294\ufe00",
- "sqsub;": "\u228f",
- "sqsube;": "\u2291",
- "sqsubset;": "\u228f",
- "sqsubseteq;": "\u2291",
- "sqsup;": "\u2290",
- "sqsupe;": "\u2292",
- "sqsupset;": "\u2290",
- "sqsupseteq;": "\u2292",
- "squ;": "\u25a1",
- "square;": "\u25a1",
- "squarf;": "\u25aa",
- "squf;": "\u25aa",
- "srarr;": "\u2192",
- "sscr;": "\u{01d4c8}",
- "ssetmn;": "\u2216",
- "ssmile;": "\u2323",
- "sstarf;": "\u22c6",
- "star;": "\u2606",
- "starf;": "\u2605",
- "straightepsilon;": "\u03f5",
- "straightphi;": "\u03d5",
- "strns;": "\xaf",
- "sub;": "\u2282",
- "subE;": "\u2ac5",
- "subdot;": "\u2abd",
- "sube;": "\u2286",
- "subedot;": "\u2ac3",
- "submult;": "\u2ac1",
- "subnE;": "\u2acb",
- "subne;": "\u228a",
- "subplus;": "\u2abf",
- "subrarr;": "\u2979",
- "subset;": "\u2282",
- "subseteq;": "\u2286",
- "subseteqq;": "\u2ac5",
- "subsetneq;": "\u228a",
- "subsetneqq;": "\u2acb",
- "subsim;": "\u2ac7",
- "subsub;": "\u2ad5",
- "subsup;": "\u2ad3",
- "succ;": "\u227b",
- "succapprox;": "\u2ab8",
- "succcurlyeq;": "\u227d",
- "succeq;": "\u2ab0",
- "succnapprox;": "\u2aba",
- "succneqq;": "\u2ab6",
- "succnsim;": "\u22e9",
- "succsim;": "\u227f",
- "sum;": "\u2211",
- "sung;": "\u266a",
- "sup1": "\xb9",
- "sup1;": "\xb9",
- "sup2": "\xb2",
- "sup2;": "\xb2",
- "sup3": "\xb3",
- "sup3;": "\xb3",
- "sup;": "\u2283",
- "supE;": "\u2ac6",
- "supdot;": "\u2abe",
- "supdsub;": "\u2ad8",
- "supe;": "\u2287",
- "supedot;": "\u2ac4",
- "suphsol;": "\u27c9",
- "suphsub;": "\u2ad7",
- "suplarr;": "\u297b",
- "supmult;": "\u2ac2",
- "supnE;": "\u2acc",
- "supne;": "\u228b",
- "supplus;": "\u2ac0",
- "supset;": "\u2283",
- "supseteq;": "\u2287",
- "supseteqq;": "\u2ac6",
- "supsetneq;": "\u228b",
- "supsetneqq;": "\u2acc",
- "supsim;": "\u2ac8",
- "supsub;": "\u2ad4",
- "supsup;": "\u2ad6",
- "swArr;": "\u21d9",
- "swarhk;": "\u2926",
- "swarr;": "\u2199",
- "swarrow;": "\u2199",
- "swnwar;": "\u292a",
- "szlig": "\xdf",
- "szlig;": "\xdf",
- "target;": "\u2316",
- "tau;": "\u03c4",
- "tbrk;": "\u23b4",
- "tcaron;": "\u0165",
- "tcedil;": "\u0163",
- "tcy;": "\u0442",
- "tdot;": "\u20db",
- "telrec;": "\u2315",
- "tfr;": "\u{01d531}",
- "there4;": "\u2234",
- "therefore;": "\u2234",
- "theta;": "\u03b8",
- "thetasym;": "\u03d1",
- "thetav;": "\u03d1",
- "thickapprox;": "\u2248",
- "thicksim;": "\u223c",
- "thinsp;": "\u2009",
- "thkap;": "\u2248",
- "thksim;": "\u223c",
- "thorn": "\xfe",
- "thorn;": "\xfe",
- "tilde;": "\u02dc",
- "times": "\xd7",
- "times;": "\xd7",
- "timesb;": "\u22a0",
- "timesbar;": "\u2a31",
- "timesd;": "\u2a30",
- "tint;": "\u222d",
- "toea;": "\u2928",
- "top;": "\u22a4",
- "topbot;": "\u2336",
- "topcir;": "\u2af1",
- "topf;": "\u{01d565}",
- "topfork;": "\u2ada",
- "tosa;": "\u2929",
- "tprime;": "\u2034",
- "trade;": "\u2122",
- "triangle;": "\u25b5",
- "triangledown;": "\u25bf",
- "triangleleft;": "\u25c3",
- "trianglelefteq;": "\u22b4",
- "triangleq;": "\u225c",
- "triangleright;": "\u25b9",
- "trianglerighteq;": "\u22b5",
- "tridot;": "\u25ec",
- "trie;": "\u225c",
- "triminus;": "\u2a3a",
- "triplus;": "\u2a39",
- "trisb;": "\u29cd",
- "tritime;": "\u2a3b",
- "trpezium;": "\u23e2",
- "tscr;": "\u{01d4c9}",
- "tscy;": "\u0446",
- "tshcy;": "\u045b",
- "tstrok;": "\u0167",
- "twixt;": "\u226c",
- "twoheadleftarrow;": "\u219e",
- "twoheadrightarrow;": "\u21a0",
- "uArr;": "\u21d1",
- "uHar;": "\u2963",
- "uacute": "\xfa",
- "uacute;": "\xfa",
- "uarr;": "\u2191",
- "ubrcy;": "\u045e",
- "ubreve;": "\u016d",
- "ucirc": "\xfb",
- "ucirc;": "\xfb",
- "ucy;": "\u0443",
- "udarr;": "\u21c5",
- "udblac;": "\u0171",
- "udhar;": "\u296e",
- "ufisht;": "\u297e",
- "ufr;": "\u{01d532}",
- "ugrave": "\xf9",
- "ugrave;": "\xf9",
- "uharl;": "\u21bf",
- "uharr;": "\u21be",
- "uhblk;": "\u2580",
- "ulcorn;": "\u231c",
- "ulcorner;": "\u231c",
- "ulcrop;": "\u230f",
- "ultri;": "\u25f8",
- "umacr;": "\u016b",
- "uml": "\xa8",
- "uml;": "\xa8",
- "uogon;": "\u0173",
- "uopf;": "\u{01d566}",
- "uparrow;": "\u2191",
- "updownarrow;": "\u2195",
- "upharpoonleft;": "\u21bf",
- "upharpoonright;": "\u21be",
- "uplus;": "\u228e",
- "upsi;": "\u03c5",
- "upsih;": "\u03d2",
- "upsilon;": "\u03c5",
- "upuparrows;": "\u21c8",
- "urcorn;": "\u231d",
- "urcorner;": "\u231d",
- "urcrop;": "\u230e",
- "uring;": "\u016f",
- "urtri;": "\u25f9",
- "uscr;": "\u{01d4ca}",
- "utdot;": "\u22f0",
- "utilde;": "\u0169",
- "utri;": "\u25b5",
- "utrif;": "\u25b4",
- "uuarr;": "\u21c8",
- "uuml": "\xfc",
- "uuml;": "\xfc",
- "uwangle;": "\u29a7",
- "vArr;": "\u21d5",
- "vBar;": "\u2ae8",
- "vBarv;": "\u2ae9",
- "vDash;": "\u22a8",
- "vangrt;": "\u299c",
- "varepsilon;": "\u03f5",
- "varkappa;": "\u03f0",
- "varnothing;": "\u2205",
- "varphi;": "\u03d5",
- "varpi;": "\u03d6",
- "varpropto;": "\u221d",
- "varr;": "\u2195",
- "varrho;": "\u03f1",
- "varsigma;": "\u03c2",
- "varsubsetneq;": "\u228a\ufe00",
- "varsubsetneqq;": "\u2acb\ufe00",
- "varsupsetneq;": "\u228b\ufe00",
- "varsupsetneqq;": "\u2acc\ufe00",
- "vartheta;": "\u03d1",
- "vartriangleleft;": "\u22b2",
- "vartriangleright;": "\u22b3",
- "vcy;": "\u0432",
- "vdash;": "\u22a2",
- "vee;": "\u2228",
- "veebar;": "\u22bb",
- "veeeq;": "\u225a",
- "vellip;": "\u22ee",
- "verbar;": "|",
- "vert;": "|",
- "vfr;": "\u{01d533}",
- "vltri;": "\u22b2",
- "vnsub;": "\u2282\u20d2",
- "vnsup;": "\u2283\u20d2",
- "vopf;": "\u{01d567}",
- "vprop;": "\u221d",
- "vrtri;": "\u22b3",
- "vscr;": "\u{01d4cb}",
- "vsubnE;": "\u2acb\ufe00",
- "vsubne;": "\u228a\ufe00",
- "vsupnE;": "\u2acc\ufe00",
- "vsupne;": "\u228b\ufe00",
- "vzigzag;": "\u299a",
- "wcirc;": "\u0175",
- "wedbar;": "\u2a5f",
- "wedge;": "\u2227",
- "wedgeq;": "\u2259",
- "weierp;": "\u2118",
- "wfr;": "\u{01d534}",
- "wopf;": "\u{01d568}",
- "wp;": "\u2118",
- "wr;": "\u2240",
- "wreath;": "\u2240",
- "wscr;": "\u{01d4cc}",
- "xcap;": "\u22c2",
- "xcirc;": "\u25ef",
- "xcup;": "\u22c3",
- "xdtri;": "\u25bd",
- "xfr;": "\u{01d535}",
- "xhArr;": "\u27fa",
- "xharr;": "\u27f7",
- "xi;": "\u03be",
- "xlArr;": "\u27f8",
- "xlarr;": "\u27f5",
- "xmap;": "\u27fc",
- "xnis;": "\u22fb",
- "xodot;": "\u2a00",
- "xopf;": "\u{01d569}",
- "xoplus;": "\u2a01",
- "xotime;": "\u2a02",
- "xrArr;": "\u27f9",
- "xrarr;": "\u27f6",
- "xscr;": "\u{01d4cd}",
- "xsqcup;": "\u2a06",
- "xuplus;": "\u2a04",
- "xutri;": "\u25b3",
- "xvee;": "\u22c1",
- "xwedge;": "\u22c0",
- "yacute": "\xfd",
- "yacute;": "\xfd",
- "yacy;": "\u044f",
- "ycirc;": "\u0177",
- "ycy;": "\u044b",
- "yen": "\xa5",
- "yen;": "\xa5",
- "yfr;": "\u{01d536}",
- "yicy;": "\u0457",
- "yopf;": "\u{01d56a}",
- "yscr;": "\u{01d4ce}",
- "yucy;": "\u044e",
- "yuml": "\xff",
- "yuml;": "\xff",
- "zacute;": "\u017a",
- "zcaron;": "\u017e",
- "zcy;": "\u0437",
- "zdot;": "\u017c",
- "zeetrf;": "\u2128",
- "zeta;": "\u03b6",
- "zfr;": "\u{01d537}",
- "zhcy;": "\u0436",
- "zigrarr;": "\u21dd",
- "zopf;": "\u{01d56b}",
- "zscr;": "\u{01d4cf}",
- "zwj;": "\u200d",
- "zwnj;": "\u200c",
+ 'AElig': '\xc6',
+ 'AElig;': '\xc6',
+ 'AMP': '&',
+ 'AMP;': '&',
+ 'Aacute': '\xc1',
+ 'Aacute;': '\xc1',
+ 'Abreve;': '\u0102',
+ 'Acirc': '\xc2',
+ 'Acirc;': '\xc2',
+ 'Acy;': '\u0410',
+ 'Afr;': '\u{01d504}',
+ 'Agrave': '\xc0',
+ 'Agrave;': '\xc0',
+ 'Alpha;': '\u0391',
+ 'Amacr;': '\u0100',
+ 'And;': '\u2a53',
+ 'Aogon;': '\u0104',
+ 'Aopf;': '\u{01d538}',
+ 'ApplyFunction;': '\u2061',
+ 'Aring': '\xc5',
+ 'Aring;': '\xc5',
+ 'Ascr;': '\u{01d49c}',
+ 'Assign;': '\u2254',
+ 'Atilde': '\xc3',
+ 'Atilde;': '\xc3',
+ 'Auml': '\xc4',
+ 'Auml;': '\xc4',
+ 'Backslash;': '\u2216',
+ 'Barv;': '\u2ae7',
+ 'Barwed;': '\u2306',
+ 'Bcy;': '\u0411',
+ 'Because;': '\u2235',
+ 'Bernoullis;': '\u212c',
+ 'Beta;': '\u0392',
+ 'Bfr;': '\u{01d505}',
+ 'Bopf;': '\u{01d539}',
+ 'Breve;': '\u02d8',
+ 'Bscr;': '\u212c',
+ 'Bumpeq;': '\u224e',
+ 'CHcy;': '\u0427',
+ 'COPY': '\xa9',
+ 'COPY;': '\xa9',
+ 'Cacute;': '\u0106',
+ 'Cap;': '\u22d2',
+ 'CapitalDifferentialD;': '\u2145',
+ 'Cayleys;': '\u212d',
+ 'Ccaron;': '\u010c',
+ 'Ccedil': '\xc7',
+ 'Ccedil;': '\xc7',
+ 'Ccirc;': '\u0108',
+ 'Cconint;': '\u2230',
+ 'Cdot;': '\u010a',
+ 'Cedilla;': '\xb8',
+ 'CenterDot;': '\xb7',
+ 'Cfr;': '\u212d',
+ 'Chi;': '\u03a7',
+ 'CircleDot;': '\u2299',
+ 'CircleMinus;': '\u2296',
+ 'CirclePlus;': '\u2295',
+ 'CircleTimes;': '\u2297',
+ 'ClockwiseContourIntegral;': '\u2232',
+ 'CloseCurlyDoubleQuote;': '\u201d',
+ 'CloseCurlyQuote;': '\u2019',
+ 'Colon;': '\u2237',
+ 'Colone;': '\u2a74',
+ 'Congruent;': '\u2261',
+ 'Conint;': '\u222f',
+ 'ContourIntegral;': '\u222e',
+ 'Copf;': '\u2102',
+ 'Coproduct;': '\u2210',
+ 'CounterClockwiseContourIntegral;': '\u2233',
+ 'Cross;': '\u2a2f',
+ 'Cscr;': '\u{01d49e}',
+ 'Cup;': '\u22d3',
+ 'CupCap;': '\u224d',
+ 'DD;': '\u2145',
+ 'DDotrahd;': '\u2911',
+ 'DJcy;': '\u0402',
+ 'DScy;': '\u0405',
+ 'DZcy;': '\u040f',
+ 'Dagger;': '\u2021',
+ 'Darr;': '\u21a1',
+ 'Dashv;': '\u2ae4',
+ 'Dcaron;': '\u010e',
+ 'Dcy;': '\u0414',
+ 'Del;': '\u2207',
+ 'Delta;': '\u0394',
+ 'Dfr;': '\u{01d507}',
+ 'DiacriticalAcute;': '\xb4',
+ 'DiacriticalDot;': '\u02d9',
+ 'DiacriticalDoubleAcute;': '\u02dd',
+ 'DiacriticalGrave;': '`',
+ 'DiacriticalTilde;': '\u02dc',
+ 'Diamond;': '\u22c4',
+ 'DifferentialD;': '\u2146',
+ 'Dopf;': '\u{01d53b}',
+ 'Dot;': '\xa8',
+ 'DotDot;': '\u20dc',
+ 'DotEqual;': '\u2250',
+ 'DoubleContourIntegral;': '\u222f',
+ 'DoubleDot;': '\xa8',
+ 'DoubleDownArrow;': '\u21d3',
+ 'DoubleLeftArrow;': '\u21d0',
+ 'DoubleLeftRightArrow;': '\u21d4',
+ 'DoubleLeftTee;': '\u2ae4',
+ 'DoubleLongLeftArrow;': '\u27f8',
+ 'DoubleLongLeftRightArrow;': '\u27fa',
+ 'DoubleLongRightArrow;': '\u27f9',
+ 'DoubleRightArrow;': '\u21d2',
+ 'DoubleRightTee;': '\u22a8',
+ 'DoubleUpArrow;': '\u21d1',
+ 'DoubleUpDownArrow;': '\u21d5',
+ 'DoubleVerticalBar;': '\u2225',
+ 'DownArrow;': '\u2193',
+ 'DownArrowBar;': '\u2913',
+ 'DownArrowUpArrow;': '\u21f5',
+ 'DownBreve;': '\u0311',
+ 'DownLeftRightVector;': '\u2950',
+ 'DownLeftTeeVector;': '\u295e',
+ 'DownLeftVector;': '\u21bd',
+ 'DownLeftVectorBar;': '\u2956',
+ 'DownRightTeeVector;': '\u295f',
+ 'DownRightVector;': '\u21c1',
+ 'DownRightVectorBar;': '\u2957',
+ 'DownTee;': '\u22a4',
+ 'DownTeeArrow;': '\u21a7',
+ 'Downarrow;': '\u21d3',
+ 'Dscr;': '\u{01d49f}',
+ 'Dstrok;': '\u0110',
+ 'ENG;': '\u014a',
+ 'ETH': '\xd0',
+ 'ETH;': '\xd0',
+ 'Eacute': '\xc9',
+ 'Eacute;': '\xc9',
+ 'Ecaron;': '\u011a',
+ 'Ecirc': '\xca',
+ 'Ecirc;': '\xca',
+ 'Ecy;': '\u042d',
+ 'Edot;': '\u0116',
+ 'Efr;': '\u{01d508}',
+ 'Egrave': '\xc8',
+ 'Egrave;': '\xc8',
+ 'Element;': '\u2208',
+ 'Emacr;': '\u0112',
+ 'EmptySmallSquare;': '\u25fb',
+ 'EmptyVerySmallSquare;': '\u25ab',
+ 'Eogon;': '\u0118',
+ 'Eopf;': '\u{01d53c}',
+ 'Epsilon;': '\u0395',
+ 'Equal;': '\u2a75',
+ 'EqualTilde;': '\u2242',
+ 'Equilibrium;': '\u21cc',
+ 'Escr;': '\u2130',
+ 'Esim;': '\u2a73',
+ 'Eta;': '\u0397',
+ 'Euml': '\xcb',
+ 'Euml;': '\xcb',
+ 'Exists;': '\u2203',
+ 'ExponentialE;': '\u2147',
+ 'Fcy;': '\u0424',
+ 'Ffr;': '\u{01d509}',
+ 'FilledSmallSquare;': '\u25fc',
+ 'FilledVerySmallSquare;': '\u25aa',
+ 'Fopf;': '\u{01d53d}',
+ 'ForAll;': '\u2200',
+ 'Fouriertrf;': '\u2131',
+ 'Fscr;': '\u2131',
+ 'GJcy;': '\u0403',
+ 'GT': '>',
+ 'GT;': '>',
+ 'Gamma;': '\u0393',
+ 'Gammad;': '\u03dc',
+ 'Gbreve;': '\u011e',
+ 'Gcedil;': '\u0122',
+ 'Gcirc;': '\u011c',
+ 'Gcy;': '\u0413',
+ 'Gdot;': '\u0120',
+ 'Gfr;': '\u{01d50a}',
+ 'Gg;': '\u22d9',
+ 'Gopf;': '\u{01d53e}',
+ 'GreaterEqual;': '\u2265',
+ 'GreaterEqualLess;': '\u22db',
+ 'GreaterFullEqual;': '\u2267',
+ 'GreaterGreater;': '\u2aa2',
+ 'GreaterLess;': '\u2277',
+ 'GreaterSlantEqual;': '\u2a7e',
+ 'GreaterTilde;': '\u2273',
+ 'Gscr;': '\u{01d4a2}',
+ 'Gt;': '\u226b',
+ 'HARDcy;': '\u042a',
+ 'Hacek;': '\u02c7',
+ 'Hat;': '^',
+ 'Hcirc;': '\u0124',
+ 'Hfr;': '\u210c',
+ 'HilbertSpace;': '\u210b',
+ 'Hopf;': '\u210d',
+ 'HorizontalLine;': '\u2500',
+ 'Hscr;': '\u210b',
+ 'Hstrok;': '\u0126',
+ 'HumpDownHump;': '\u224e',
+ 'HumpEqual;': '\u224f',
+ 'IEcy;': '\u0415',
+ 'IJlig;': '\u0132',
+ 'IOcy;': '\u0401',
+ 'Iacute': '\xcd',
+ 'Iacute;': '\xcd',
+ 'Icirc': '\xce',
+ 'Icirc;': '\xce',
+ 'Icy;': '\u0418',
+ 'Idot;': '\u0130',
+ 'Ifr;': '\u2111',
+ 'Igrave': '\xcc',
+ 'Igrave;': '\xcc',
+ 'Im;': '\u2111',
+ 'Imacr;': '\u012a',
+ 'ImaginaryI;': '\u2148',
+ 'Implies;': '\u21d2',
+ 'Int;': '\u222c',
+ 'Integral;': '\u222b',
+ 'Intersection;': '\u22c2',
+ 'InvisibleComma;': '\u2063',
+ 'InvisibleTimes;': '\u2062',
+ 'Iogon;': '\u012e',
+ 'Iopf;': '\u{01d540}',
+ 'Iota;': '\u0399',
+ 'Iscr;': '\u2110',
+ 'Itilde;': '\u0128',
+ 'Iukcy;': '\u0406',
+ 'Iuml': '\xcf',
+ 'Iuml;': '\xcf',
+ 'Jcirc;': '\u0134',
+ 'Jcy;': '\u0419',
+ 'Jfr;': '\u{01d50d}',
+ 'Jopf;': '\u{01d541}',
+ 'Jscr;': '\u{01d4a5}',
+ 'Jsercy;': '\u0408',
+ 'Jukcy;': '\u0404',
+ 'KHcy;': '\u0425',
+ 'KJcy;': '\u040c',
+ 'Kappa;': '\u039a',
+ 'Kcedil;': '\u0136',
+ 'Kcy;': '\u041a',
+ 'Kfr;': '\u{01d50e}',
+ 'Kopf;': '\u{01d542}',
+ 'Kscr;': '\u{01d4a6}',
+ 'LJcy;': '\u0409',
+ 'LT': '<',
+ 'LT;': '<',
+ 'Lacute;': '\u0139',
+ 'Lambda;': '\u039b',
+ 'Lang;': '\u27ea',
+ 'Laplacetrf;': '\u2112',
+ 'Larr;': '\u219e',
+ 'Lcaron;': '\u013d',
+ 'Lcedil;': '\u013b',
+ 'Lcy;': '\u041b',
+ 'LeftAngleBracket;': '\u27e8',
+ 'LeftArrow;': '\u2190',
+ 'LeftArrowBar;': '\u21e4',
+ 'LeftArrowRightArrow;': '\u21c6',
+ 'LeftCeiling;': '\u2308',
+ 'LeftDoubleBracket;': '\u27e6',
+ 'LeftDownTeeVector;': '\u2961',
+ 'LeftDownVector;': '\u21c3',
+ 'LeftDownVectorBar;': '\u2959',
+ 'LeftFloor;': '\u230a',
+ 'LeftRightArrow;': '\u2194',
+ 'LeftRightVector;': '\u294e',
+ 'LeftTee;': '\u22a3',
+ 'LeftTeeArrow;': '\u21a4',
+ 'LeftTeeVector;': '\u295a',
+ 'LeftTriangle;': '\u22b2',
+ 'LeftTriangleBar;': '\u29cf',
+ 'LeftTriangleEqual;': '\u22b4',
+ 'LeftUpDownVector;': '\u2951',
+ 'LeftUpTeeVector;': '\u2960',
+ 'LeftUpVector;': '\u21bf',
+ 'LeftUpVectorBar;': '\u2958',
+ 'LeftVector;': '\u21bc',
+ 'LeftVectorBar;': '\u2952',
+ 'Leftarrow;': '\u21d0',
+ 'Leftrightarrow;': '\u21d4',
+ 'LessEqualGreater;': '\u22da',
+ 'LessFullEqual;': '\u2266',
+ 'LessGreater;': '\u2276',
+ 'LessLess;': '\u2aa1',
+ 'LessSlantEqual;': '\u2a7d',
+ 'LessTilde;': '\u2272',
+ 'Lfr;': '\u{01d50f}',
+ 'Ll;': '\u22d8',
+ 'Lleftarrow;': '\u21da',
+ 'Lmidot;': '\u013f',
+ 'LongLeftArrow;': '\u27f5',
+ 'LongLeftRightArrow;': '\u27f7',
+ 'LongRightArrow;': '\u27f6',
+ 'Longleftarrow;': '\u27f8',
+ 'Longleftrightarrow;': '\u27fa',
+ 'Longrightarrow;': '\u27f9',
+ 'Lopf;': '\u{01d543}',
+ 'LowerLeftArrow;': '\u2199',
+ 'LowerRightArrow;': '\u2198',
+ 'Lscr;': '\u2112',
+ 'Lsh;': '\u21b0',
+ 'Lstrok;': '\u0141',
+ 'Lt;': '\u226a',
+ 'Map;': '\u2905',
+ 'Mcy;': '\u041c',
+ 'MediumSpace;': '\u205f',
+ 'Mellintrf;': '\u2133',
+ 'Mfr;': '\u{01d510}',
+ 'MinusPlus;': '\u2213',
+ 'Mopf;': '\u{01d544}',
+ 'Mscr;': '\u2133',
+ 'Mu;': '\u039c',
+ 'NJcy;': '\u040a',
+ 'Nacute;': '\u0143',
+ 'Ncaron;': '\u0147',
+ 'Ncedil;': '\u0145',
+ 'Ncy;': '\u041d',
+ 'NegativeMediumSpace;': '\u200b',
+ 'NegativeThickSpace;': '\u200b',
+ 'NegativeThinSpace;': '\u200b',
+ 'NegativeVeryThinSpace;': '\u200b',
+ 'NestedGreaterGreater;': '\u226b',
+ 'NestedLessLess;': '\u226a',
+ 'NewLine;': '\n',
+ 'Nfr;': '\u{01d511}',
+ 'NoBreak;': '\u2060',
+ 'NonBreakingSpace;': '\xa0',
+ 'Nopf;': '\u2115',
+ 'Not;': '\u2aec',
+ 'NotCongruent;': '\u2262',
+ 'NotCupCap;': '\u226d',
+ 'NotDoubleVerticalBar;': '\u2226',
+ 'NotElement;': '\u2209',
+ 'NotEqual;': '\u2260',
+ 'NotEqualTilde;': '\u2242\u0338',
+ 'NotExists;': '\u2204',
+ 'NotGreater;': '\u226f',
+ 'NotGreaterEqual;': '\u2271',
+ 'NotGreaterFullEqual;': '\u2267\u0338',
+ 'NotGreaterGreater;': '\u226b\u0338',
+ 'NotGreaterLess;': '\u2279',
+ 'NotGreaterSlantEqual;': '\u2a7e\u0338',
+ 'NotGreaterTilde;': '\u2275',
+ 'NotHumpDownHump;': '\u224e\u0338',
+ 'NotHumpEqual;': '\u224f\u0338',
+ 'NotLeftTriangle;': '\u22ea',
+ 'NotLeftTriangleBar;': '\u29cf\u0338',
+ 'NotLeftTriangleEqual;': '\u22ec',
+ 'NotLess;': '\u226e',
+ 'NotLessEqual;': '\u2270',
+ 'NotLessGreater;': '\u2278',
+ 'NotLessLess;': '\u226a\u0338',
+ 'NotLessSlantEqual;': '\u2a7d\u0338',
+ 'NotLessTilde;': '\u2274',
+ 'NotNestedGreaterGreater;': '\u2aa2\u0338',
+ 'NotNestedLessLess;': '\u2aa1\u0338',
+ 'NotPrecedes;': '\u2280',
+ 'NotPrecedesEqual;': '\u2aaf\u0338',
+ 'NotPrecedesSlantEqual;': '\u22e0',
+ 'NotReverseElement;': '\u220c',
+ 'NotRightTriangle;': '\u22eb',
+ 'NotRightTriangleBar;': '\u29d0\u0338',
+ 'NotRightTriangleEqual;': '\u22ed',
+ 'NotSquareSubset;': '\u228f\u0338',
+ 'NotSquareSubsetEqual;': '\u22e2',
+ 'NotSquareSuperset;': '\u2290\u0338',
+ 'NotSquareSupersetEqual;': '\u22e3',
+ 'NotSubset;': '\u2282\u20d2',
+ 'NotSubsetEqual;': '\u2288',
+ 'NotSucceeds;': '\u2281',
+ 'NotSucceedsEqual;': '\u2ab0\u0338',
+ 'NotSucceedsSlantEqual;': '\u22e1',
+ 'NotSucceedsTilde;': '\u227f\u0338',
+ 'NotSuperset;': '\u2283\u20d2',
+ 'NotSupersetEqual;': '\u2289',
+ 'NotTilde;': '\u2241',
+ 'NotTildeEqual;': '\u2244',
+ 'NotTildeFullEqual;': '\u2247',
+ 'NotTildeTilde;': '\u2249',
+ 'NotVerticalBar;': '\u2224',
+ 'Nscr;': '\u{01d4a9}',
+ 'Ntilde': '\xd1',
+ 'Ntilde;': '\xd1',
+ 'Nu;': '\u039d',
+ 'OElig;': '\u0152',
+ 'Oacute': '\xd3',
+ 'Oacute;': '\xd3',
+ 'Ocirc': '\xd4',
+ 'Ocirc;': '\xd4',
+ 'Ocy;': '\u041e',
+ 'Odblac;': '\u0150',
+ 'Ofr;': '\u{01d512}',
+ 'Ograve': '\xd2',
+ 'Ograve;': '\xd2',
+ 'Omacr;': '\u014c',
+ 'Omega;': '\u03a9',
+ 'Omicron;': '\u039f',
+ 'Oopf;': '\u{01d546}',
+ 'OpenCurlyDoubleQuote;': '\u201c',
+ 'OpenCurlyQuote;': '\u2018',
+ 'Or;': '\u2a54',
+ 'Oscr;': '\u{01d4aa}',
+ 'Oslash': '\xd8',
+ 'Oslash;': '\xd8',
+ 'Otilde': '\xd5',
+ 'Otilde;': '\xd5',
+ 'Otimes;': '\u2a37',
+ 'Ouml': '\xd6',
+ 'Ouml;': '\xd6',
+ 'OverBar;': '\u203e',
+ 'OverBrace;': '\u23de',
+ 'OverBracket;': '\u23b4',
+ 'OverParenthesis;': '\u23dc',
+ 'PartialD;': '\u2202',
+ 'Pcy;': '\u041f',
+ 'Pfr;': '\u{01d513}',
+ 'Phi;': '\u03a6',
+ 'Pi;': '\u03a0',
+ 'PlusMinus;': '\xb1',
+ 'Poincareplane;': '\u210c',
+ 'Popf;': '\u2119',
+ 'Pr;': '\u2abb',
+ 'Precedes;': '\u227a',
+ 'PrecedesEqual;': '\u2aaf',
+ 'PrecedesSlantEqual;': '\u227c',
+ 'PrecedesTilde;': '\u227e',
+ 'Prime;': '\u2033',
+ 'Product;': '\u220f',
+ 'Proportion;': '\u2237',
+ 'Proportional;': '\u221d',
+ 'Pscr;': '\u{01d4ab}',
+ 'Psi;': '\u03a8',
+ 'QUOT': '"',
+ 'QUOT;': '"',
+ 'Qfr;': '\u{01d514}',
+ 'Qopf;': '\u211a',
+ 'Qscr;': '\u{01d4ac}',
+ 'RBarr;': '\u2910',
+ 'REG': '\xae',
+ 'REG;': '\xae',
+ 'Racute;': '\u0154',
+ 'Rang;': '\u27eb',
+ 'Rarr;': '\u21a0',
+ 'Rarrtl;': '\u2916',
+ 'Rcaron;': '\u0158',
+ 'Rcedil;': '\u0156',
+ 'Rcy;': '\u0420',
+ 'Re;': '\u211c',
+ 'ReverseElement;': '\u220b',
+ 'ReverseEquilibrium;': '\u21cb',
+ 'ReverseUpEquilibrium;': '\u296f',
+ 'Rfr;': '\u211c',
+ 'Rho;': '\u03a1',
+ 'RightAngleBracket;': '\u27e9',
+ 'RightArrow;': '\u2192',
+ 'RightArrowBar;': '\u21e5',
+ 'RightArrowLeftArrow;': '\u21c4',
+ 'RightCeiling;': '\u2309',
+ 'RightDoubleBracket;': '\u27e7',
+ 'RightDownTeeVector;': '\u295d',
+ 'RightDownVector;': '\u21c2',
+ 'RightDownVectorBar;': '\u2955',
+ 'RightFloor;': '\u230b',
+ 'RightTee;': '\u22a2',
+ 'RightTeeArrow;': '\u21a6',
+ 'RightTeeVector;': '\u295b',
+ 'RightTriangle;': '\u22b3',
+ 'RightTriangleBar;': '\u29d0',
+ 'RightTriangleEqual;': '\u22b5',
+ 'RightUpDownVector;': '\u294f',
+ 'RightUpTeeVector;': '\u295c',
+ 'RightUpVector;': '\u21be',
+ 'RightUpVectorBar;': '\u2954',
+ 'RightVector;': '\u21c0',
+ 'RightVectorBar;': '\u2953',
+ 'Rightarrow;': '\u21d2',
+ 'Ropf;': '\u211d',
+ 'RoundImplies;': '\u2970',
+ 'Rrightarrow;': '\u21db',
+ 'Rscr;': '\u211b',
+ 'Rsh;': '\u21b1',
+ 'RuleDelayed;': '\u29f4',
+ 'SHCHcy;': '\u0429',
+ 'SHcy;': '\u0428',
+ 'SOFTcy;': '\u042c',
+ 'Sacute;': '\u015a',
+ 'Sc;': '\u2abc',
+ 'Scaron;': '\u0160',
+ 'Scedil;': '\u015e',
+ 'Scirc;': '\u015c',
+ 'Scy;': '\u0421',
+ 'Sfr;': '\u{01d516}',
+ 'ShortDownArrow;': '\u2193',
+ 'ShortLeftArrow;': '\u2190',
+ 'ShortRightArrow;': '\u2192',
+ 'ShortUpArrow;': '\u2191',
+ 'Sigma;': '\u03a3',
+ 'SmallCircle;': '\u2218',
+ 'Sopf;': '\u{01d54a}',
+ 'Sqrt;': '\u221a',
+ 'Square;': '\u25a1',
+ 'SquareIntersection;': '\u2293',
+ 'SquareSubset;': '\u228f',
+ 'SquareSubsetEqual;': '\u2291',
+ 'SquareSuperset;': '\u2290',
+ 'SquareSupersetEqual;': '\u2292',
+ 'SquareUnion;': '\u2294',
+ 'Sscr;': '\u{01d4ae}',
+ 'Star;': '\u22c6',
+ 'Sub;': '\u22d0',
+ 'Subset;': '\u22d0',
+ 'SubsetEqual;': '\u2286',
+ 'Succeeds;': '\u227b',
+ 'SucceedsEqual;': '\u2ab0',
+ 'SucceedsSlantEqual;': '\u227d',
+ 'SucceedsTilde;': '\u227f',
+ 'SuchThat;': '\u220b',
+ 'Sum;': '\u2211',
+ 'Sup;': '\u22d1',
+ 'Superset;': '\u2283',
+ 'SupersetEqual;': '\u2287',
+ 'Supset;': '\u22d1',
+ 'THORN': '\xde',
+ 'THORN;': '\xde',
+ 'TRADE;': '\u2122',
+ 'TSHcy;': '\u040b',
+ 'TScy;': '\u0426',
+ 'Tab;': '\t',
+ 'Tau;': '\u03a4',
+ 'Tcaron;': '\u0164',
+ 'Tcedil;': '\u0162',
+ 'Tcy;': '\u0422',
+ 'Tfr;': '\u{01d517}',
+ 'Therefore;': '\u2234',
+ 'Theta;': '\u0398',
+ 'ThickSpace;': '\u205f\u200a',
+ 'ThinSpace;': '\u2009',
+ 'Tilde;': '\u223c',
+ 'TildeEqual;': '\u2243',
+ 'TildeFullEqual;': '\u2245',
+ 'TildeTilde;': '\u2248',
+ 'Topf;': '\u{01d54b}',
+ 'TripleDot;': '\u20db',
+ 'Tscr;': '\u{01d4af}',
+ 'Tstrok;': '\u0166',
+ 'Uacute': '\xda',
+ 'Uacute;': '\xda',
+ 'Uarr;': '\u219f',
+ 'Uarrocir;': '\u2949',
+ 'Ubrcy;': '\u040e',
+ 'Ubreve;': '\u016c',
+ 'Ucirc': '\xdb',
+ 'Ucirc;': '\xdb',
+ 'Ucy;': '\u0423',
+ 'Udblac;': '\u0170',
+ 'Ufr;': '\u{01d518}',
+ 'Ugrave': '\xd9',
+ 'Ugrave;': '\xd9',
+ 'Umacr;': '\u016a',
+ 'UnderBar;': '_',
+ 'UnderBrace;': '\u23df',
+ 'UnderBracket;': '\u23b5',
+ 'UnderParenthesis;': '\u23dd',
+ 'Union;': '\u22c3',
+ 'UnionPlus;': '\u228e',
+ 'Uogon;': '\u0172',
+ 'Uopf;': '\u{01d54c}',
+ 'UpArrow;': '\u2191',
+ 'UpArrowBar;': '\u2912',
+ 'UpArrowDownArrow;': '\u21c5',
+ 'UpDownArrow;': '\u2195',
+ 'UpEquilibrium;': '\u296e',
+ 'UpTee;': '\u22a5',
+ 'UpTeeArrow;': '\u21a5',
+ 'Uparrow;': '\u21d1',
+ 'Updownarrow;': '\u21d5',
+ 'UpperLeftArrow;': '\u2196',
+ 'UpperRightArrow;': '\u2197',
+ 'Upsi;': '\u03d2',
+ 'Upsilon;': '\u03a5',
+ 'Uring;': '\u016e',
+ 'Uscr;': '\u{01d4b0}',
+ 'Utilde;': '\u0168',
+ 'Uuml': '\xdc',
+ 'Uuml;': '\xdc',
+ 'VDash;': '\u22ab',
+ 'Vbar;': '\u2aeb',
+ 'Vcy;': '\u0412',
+ 'Vdash;': '\u22a9',
+ 'Vdashl;': '\u2ae6',
+ 'Vee;': '\u22c1',
+ 'Verbar;': '\u2016',
+ 'Vert;': '\u2016',
+ 'VerticalBar;': '\u2223',
+ 'VerticalLine;': '|',
+ 'VerticalSeparator;': '\u2758',
+ 'VerticalTilde;': '\u2240',
+ 'VeryThinSpace;': '\u200a',
+ 'Vfr;': '\u{01d519}',
+ 'Vopf;': '\u{01d54d}',
+ 'Vscr;': '\u{01d4b1}',
+ 'Vvdash;': '\u22aa',
+ 'Wcirc;': '\u0174',
+ 'Wedge;': '\u22c0',
+ 'Wfr;': '\u{01d51a}',
+ 'Wopf;': '\u{01d54e}',
+ 'Wscr;': '\u{01d4b2}',
+ 'Xfr;': '\u{01d51b}',
+ 'Xi;': '\u039e',
+ 'Xopf;': '\u{01d54f}',
+ 'Xscr;': '\u{01d4b3}',
+ 'YAcy;': '\u042f',
+ 'YIcy;': '\u0407',
+ 'YUcy;': '\u042e',
+ 'Yacute': '\xdd',
+ 'Yacute;': '\xdd',
+ 'Ycirc;': '\u0176',
+ 'Ycy;': '\u042b',
+ 'Yfr;': '\u{01d51c}',
+ 'Yopf;': '\u{01d550}',
+ 'Yscr;': '\u{01d4b4}',
+ 'Yuml;': '\u0178',
+ 'ZHcy;': '\u0416',
+ 'Zacute;': '\u0179',
+ 'Zcaron;': '\u017d',
+ 'Zcy;': '\u0417',
+ 'Zdot;': '\u017b',
+ 'ZeroWidthSpace;': '\u200b',
+ 'Zeta;': '\u0396',
+ 'Zfr;': '\u2128',
+ 'Zopf;': '\u2124',
+ 'Zscr;': '\u{01d4b5}',
+ 'aacute': '\xe1',
+ 'aacute;': '\xe1',
+ 'abreve;': '\u0103',
+ 'ac;': '\u223e',
+ 'acE;': '\u223e\u0333',
+ 'acd;': '\u223f',
+ 'acirc': '\xe2',
+ 'acirc;': '\xe2',
+ 'acute': '\xb4',
+ 'acute;': '\xb4',
+ 'acy;': '\u0430',
+ 'aelig': '\xe6',
+ 'aelig;': '\xe6',
+ 'af;': '\u2061',
+ 'afr;': '\u{01d51e}',
+ 'agrave': '\xe0',
+ 'agrave;': '\xe0',
+ 'alefsym;': '\u2135',
+ 'aleph;': '\u2135',
+ 'alpha;': '\u03b1',
+ 'amacr;': '\u0101',
+ 'amalg;': '\u2a3f',
+ 'amp': '&',
+ 'amp;': '&',
+ 'and;': '\u2227',
+ 'andand;': '\u2a55',
+ 'andd;': '\u2a5c',
+ 'andslope;': '\u2a58',
+ 'andv;': '\u2a5a',
+ 'ang;': '\u2220',
+ 'ange;': '\u29a4',
+ 'angle;': '\u2220',
+ 'angmsd;': '\u2221',
+ 'angmsdaa;': '\u29a8',
+ 'angmsdab;': '\u29a9',
+ 'angmsdac;': '\u29aa',
+ 'angmsdad;': '\u29ab',
+ 'angmsdae;': '\u29ac',
+ 'angmsdaf;': '\u29ad',
+ 'angmsdag;': '\u29ae',
+ 'angmsdah;': '\u29af',
+ 'angrt;': '\u221f',
+ 'angrtvb;': '\u22be',
+ 'angrtvbd;': '\u299d',
+ 'angsph;': '\u2222',
+ 'angst;': '\xc5',
+ 'angzarr;': '\u237c',
+ 'aogon;': '\u0105',
+ 'aopf;': '\u{01d552}',
+ 'ap;': '\u2248',
+ 'apE;': '\u2a70',
+ 'apacir;': '\u2a6f',
+ 'ape;': '\u224a',
+ 'apid;': '\u224b',
+ 'apos;': "'",
+ 'approx;': '\u2248',
+ 'approxeq;': '\u224a',
+ 'aring': '\xe5',
+ 'aring;': '\xe5',
+ 'ascr;': '\u{01d4b6}',
+ 'ast;': '*',
+ 'asymp;': '\u2248',
+ 'asympeq;': '\u224d',
+ 'atilde': '\xe3',
+ 'atilde;': '\xe3',
+ 'auml': '\xe4',
+ 'auml;': '\xe4',
+ 'awconint;': '\u2233',
+ 'awint;': '\u2a11',
+ 'bNot;': '\u2aed',
+ 'backcong;': '\u224c',
+ 'backepsilon;': '\u03f6',
+ 'backprime;': '\u2035',
+ 'backsim;': '\u223d',
+ 'backsimeq;': '\u22cd',
+ 'barvee;': '\u22bd',
+ 'barwed;': '\u2305',
+ 'barwedge;': '\u2305',
+ 'bbrk;': '\u23b5',
+ 'bbrktbrk;': '\u23b6',
+ 'bcong;': '\u224c',
+ 'bcy;': '\u0431',
+ 'bdquo;': '\u201e',
+ 'becaus;': '\u2235',
+ 'because;': '\u2235',
+ 'bemptyv;': '\u29b0',
+ 'bepsi;': '\u03f6',
+ 'bernou;': '\u212c',
+ 'beta;': '\u03b2',
+ 'beth;': '\u2136',
+ 'between;': '\u226c',
+ 'bfr;': '\u{01d51f}',
+ 'bigcap;': '\u22c2',
+ 'bigcirc;': '\u25ef',
+ 'bigcup;': '\u22c3',
+ 'bigodot;': '\u2a00',
+ 'bigoplus;': '\u2a01',
+ 'bigotimes;': '\u2a02',
+ 'bigsqcup;': '\u2a06',
+ 'bigstar;': '\u2605',
+ 'bigtriangledown;': '\u25bd',
+ 'bigtriangleup;': '\u25b3',
+ 'biguplus;': '\u2a04',
+ 'bigvee;': '\u22c1',
+ 'bigwedge;': '\u22c0',
+ 'bkarow;': '\u290d',
+ 'blacklozenge;': '\u29eb',
+ 'blacksquare;': '\u25aa',
+ 'blacktriangle;': '\u25b4',
+ 'blacktriangledown;': '\u25be',
+ 'blacktriangleleft;': '\u25c2',
+ 'blacktriangleright;': '\u25b8',
+ 'blank;': '\u2423',
+ 'blk12;': '\u2592',
+ 'blk14;': '\u2591',
+ 'blk34;': '\u2593',
+ 'block;': '\u2588',
+ 'bne;': '=\u20e5',
+ 'bnequiv;': '\u2261\u20e5',
+ 'bnot;': '\u2310',
+ 'bopf;': '\u{01d553}',
+ 'bot;': '\u22a5',
+ 'bottom;': '\u22a5',
+ 'bowtie;': '\u22c8',
+ 'boxDL;': '\u2557',
+ 'boxDR;': '\u2554',
+ 'boxDl;': '\u2556',
+ 'boxDr;': '\u2553',
+ 'boxH;': '\u2550',
+ 'boxHD;': '\u2566',
+ 'boxHU;': '\u2569',
+ 'boxHd;': '\u2564',
+ 'boxHu;': '\u2567',
+ 'boxUL;': '\u255d',
+ 'boxUR;': '\u255a',
+ 'boxUl;': '\u255c',
+ 'boxUr;': '\u2559',
+ 'boxV;': '\u2551',
+ 'boxVH;': '\u256c',
+ 'boxVL;': '\u2563',
+ 'boxVR;': '\u2560',
+ 'boxVh;': '\u256b',
+ 'boxVl;': '\u2562',
+ 'boxVr;': '\u255f',
+ 'boxbox;': '\u29c9',
+ 'boxdL;': '\u2555',
+ 'boxdR;': '\u2552',
+ 'boxdl;': '\u2510',
+ 'boxdr;': '\u250c',
+ 'boxh;': '\u2500',
+ 'boxhD;': '\u2565',
+ 'boxhU;': '\u2568',
+ 'boxhd;': '\u252c',
+ 'boxhu;': '\u2534',
+ 'boxminus;': '\u229f',
+ 'boxplus;': '\u229e',
+ 'boxtimes;': '\u22a0',
+ 'boxuL;': '\u255b',
+ 'boxuR;': '\u2558',
+ 'boxul;': '\u2518',
+ 'boxur;': '\u2514',
+ 'boxv;': '\u2502',
+ 'boxvH;': '\u256a',
+ 'boxvL;': '\u2561',
+ 'boxvR;': '\u255e',
+ 'boxvh;': '\u253c',
+ 'boxvl;': '\u2524',
+ 'boxvr;': '\u251c',
+ 'bprime;': '\u2035',
+ 'breve;': '\u02d8',
+ 'brvbar': '\xa6',
+ 'brvbar;': '\xa6',
+ 'bscr;': '\u{01d4b7}',
+ 'bsemi;': '\u204f',
+ 'bsim;': '\u223d',
+ 'bsime;': '\u22cd',
+ 'bsol;': '\\',
+ 'bsolb;': '\u29c5',
+ 'bsolhsub;': '\u27c8',
+ 'bull;': '\u2022',
+ 'bullet;': '\u2022',
+ 'bump;': '\u224e',
+ 'bumpE;': '\u2aae',
+ 'bumpe;': '\u224f',
+ 'bumpeq;': '\u224f',
+ 'cacute;': '\u0107',
+ 'cap;': '\u2229',
+ 'capand;': '\u2a44',
+ 'capbrcup;': '\u2a49',
+ 'capcap;': '\u2a4b',
+ 'capcup;': '\u2a47',
+ 'capdot;': '\u2a40',
+ 'caps;': '\u2229\ufe00',
+ 'caret;': '\u2041',
+ 'caron;': '\u02c7',
+ 'ccaps;': '\u2a4d',
+ 'ccaron;': '\u010d',
+ 'ccedil': '\xe7',
+ 'ccedil;': '\xe7',
+ 'ccirc;': '\u0109',
+ 'ccups;': '\u2a4c',
+ 'ccupssm;': '\u2a50',
+ 'cdot;': '\u010b',
+ 'cedil': '\xb8',
+ 'cedil;': '\xb8',
+ 'cemptyv;': '\u29b2',
+ 'cent': '\xa2',
+ 'cent;': '\xa2',
+ 'centerdot;': '\xb7',
+ 'cfr;': '\u{01d520}',
+ 'chcy;': '\u0447',
+ 'check;': '\u2713',
+ 'checkmark;': '\u2713',
+ 'chi;': '\u03c7',
+ 'cir;': '\u25cb',
+ 'cirE;': '\u29c3',
+ 'circ;': '\u02c6',
+ 'circeq;': '\u2257',
+ 'circlearrowleft;': '\u21ba',
+ 'circlearrowright;': '\u21bb',
+ 'circledR;': '\xae',
+ 'circledS;': '\u24c8',
+ 'circledast;': '\u229b',
+ 'circledcirc;': '\u229a',
+ 'circleddash;': '\u229d',
+ 'cire;': '\u2257',
+ 'cirfnint;': '\u2a10',
+ 'cirmid;': '\u2aef',
+ 'cirscir;': '\u29c2',
+ 'clubs;': '\u2663',
+ 'clubsuit;': '\u2663',
+ 'colon;': ':',
+ 'colone;': '\u2254',
+ 'coloneq;': '\u2254',
+ 'comma;': ',',
+ 'commat;': '@',
+ 'comp;': '\u2201',
+ 'compfn;': '\u2218',
+ 'complement;': '\u2201',
+ 'complexes;': '\u2102',
+ 'cong;': '\u2245',
+ 'congdot;': '\u2a6d',
+ 'conint;': '\u222e',
+ 'copf;': '\u{01d554}',
+ 'coprod;': '\u2210',
+ 'copy': '\xa9',
+ 'copy;': '\xa9',
+ 'copysr;': '\u2117',
+ 'crarr;': '\u21b5',
+ 'cross;': '\u2717',
+ 'cscr;': '\u{01d4b8}',
+ 'csub;': '\u2acf',
+ 'csube;': '\u2ad1',
+ 'csup;': '\u2ad0',
+ 'csupe;': '\u2ad2',
+ 'ctdot;': '\u22ef',
+ 'cudarrl;': '\u2938',
+ 'cudarrr;': '\u2935',
+ 'cuepr;': '\u22de',
+ 'cuesc;': '\u22df',
+ 'cularr;': '\u21b6',
+ 'cularrp;': '\u293d',
+ 'cup;': '\u222a',
+ 'cupbrcap;': '\u2a48',
+ 'cupcap;': '\u2a46',
+ 'cupcup;': '\u2a4a',
+ 'cupdot;': '\u228d',
+ 'cupor;': '\u2a45',
+ 'cups;': '\u222a\ufe00',
+ 'curarr;': '\u21b7',
+ 'curarrm;': '\u293c',
+ 'curlyeqprec;': '\u22de',
+ 'curlyeqsucc;': '\u22df',
+ 'curlyvee;': '\u22ce',
+ 'curlywedge;': '\u22cf',
+ 'curren': '\xa4',
+ 'curren;': '\xa4',
+ 'curvearrowleft;': '\u21b6',
+ 'curvearrowright;': '\u21b7',
+ 'cuvee;': '\u22ce',
+ 'cuwed;': '\u22cf',
+ 'cwconint;': '\u2232',
+ 'cwint;': '\u2231',
+ 'cylcty;': '\u232d',
+ 'dArr;': '\u21d3',
+ 'dHar;': '\u2965',
+ 'dagger;': '\u2020',
+ 'daleth;': '\u2138',
+ 'darr;': '\u2193',
+ 'dash;': '\u2010',
+ 'dashv;': '\u22a3',
+ 'dbkarow;': '\u290f',
+ 'dblac;': '\u02dd',
+ 'dcaron;': '\u010f',
+ 'dcy;': '\u0434',
+ 'dd;': '\u2146',
+ 'ddagger;': '\u2021',
+ 'ddarr;': '\u21ca',
+ 'ddotseq;': '\u2a77',
+ 'deg': '\xb0',
+ 'deg;': '\xb0',
+ 'delta;': '\u03b4',
+ 'demptyv;': '\u29b1',
+ 'dfisht;': '\u297f',
+ 'dfr;': '\u{01d521}',
+ 'dharl;': '\u21c3',
+ 'dharr;': '\u21c2',
+ 'diam;': '\u22c4',
+ 'diamond;': '\u22c4',
+ 'diamondsuit;': '\u2666',
+ 'diams;': '\u2666',
+ 'die;': '\xa8',
+ 'digamma;': '\u03dd',
+ 'disin;': '\u22f2',
+ 'div;': '\xf7',
+ 'divide': '\xf7',
+ 'divide;': '\xf7',
+ 'divideontimes;': '\u22c7',
+ 'divonx;': '\u22c7',
+ 'djcy;': '\u0452',
+ 'dlcorn;': '\u231e',
+ 'dlcrop;': '\u230d',
+ 'dollar;': '\$',
+ 'dopf;': '\u{01d555}',
+ 'dot;': '\u02d9',
+ 'doteq;': '\u2250',
+ 'doteqdot;': '\u2251',
+ 'dotminus;': '\u2238',
+ 'dotplus;': '\u2214',
+ 'dotsquare;': '\u22a1',
+ 'doublebarwedge;': '\u2306',
+ 'downarrow;': '\u2193',
+ 'downdownarrows;': '\u21ca',
+ 'downharpoonleft;': '\u21c3',
+ 'downharpoonright;': '\u21c2',
+ 'drbkarow;': '\u2910',
+ 'drcorn;': '\u231f',
+ 'drcrop;': '\u230c',
+ 'dscr;': '\u{01d4b9}',
+ 'dscy;': '\u0455',
+ 'dsol;': '\u29f6',
+ 'dstrok;': '\u0111',
+ 'dtdot;': '\u22f1',
+ 'dtri;': '\u25bf',
+ 'dtrif;': '\u25be',
+ 'duarr;': '\u21f5',
+ 'duhar;': '\u296f',
+ 'dwangle;': '\u29a6',
+ 'dzcy;': '\u045f',
+ 'dzigrarr;': '\u27ff',
+ 'eDDot;': '\u2a77',
+ 'eDot;': '\u2251',
+ 'eacute': '\xe9',
+ 'eacute;': '\xe9',
+ 'easter;': '\u2a6e',
+ 'ecaron;': '\u011b',
+ 'ecir;': '\u2256',
+ 'ecirc': '\xea',
+ 'ecirc;': '\xea',
+ 'ecolon;': '\u2255',
+ 'ecy;': '\u044d',
+ 'edot;': '\u0117',
+ 'ee;': '\u2147',
+ 'efDot;': '\u2252',
+ 'efr;': '\u{01d522}',
+ 'eg;': '\u2a9a',
+ 'egrave': '\xe8',
+ 'egrave;': '\xe8',
+ 'egs;': '\u2a96',
+ 'egsdot;': '\u2a98',
+ 'el;': '\u2a99',
+ 'elinters;': '\u23e7',
+ 'ell;': '\u2113',
+ 'els;': '\u2a95',
+ 'elsdot;': '\u2a97',
+ 'emacr;': '\u0113',
+ 'empty;': '\u2205',
+ 'emptyset;': '\u2205',
+ 'emptyv;': '\u2205',
+ 'emsp13;': '\u2004',
+ 'emsp14;': '\u2005',
+ 'emsp;': '\u2003',
+ 'eng;': '\u014b',
+ 'ensp;': '\u2002',
+ 'eogon;': '\u0119',
+ 'eopf;': '\u{01d556}',
+ 'epar;': '\u22d5',
+ 'eparsl;': '\u29e3',
+ 'eplus;': '\u2a71',
+ 'epsi;': '\u03b5',
+ 'epsilon;': '\u03b5',
+ 'epsiv;': '\u03f5',
+ 'eqcirc;': '\u2256',
+ 'eqcolon;': '\u2255',
+ 'eqsim;': '\u2242',
+ 'eqslantgtr;': '\u2a96',
+ 'eqslantless;': '\u2a95',
+ 'equals;': '=',
+ 'equest;': '\u225f',
+ 'equiv;': '\u2261',
+ 'equivDD;': '\u2a78',
+ 'eqvparsl;': '\u29e5',
+ 'erDot;': '\u2253',
+ 'erarr;': '\u2971',
+ 'escr;': '\u212f',
+ 'esdot;': '\u2250',
+ 'esim;': '\u2242',
+ 'eta;': '\u03b7',
+ 'eth': '\xf0',
+ 'eth;': '\xf0',
+ 'euml': '\xeb',
+ 'euml;': '\xeb',
+ 'euro;': '\u20ac',
+ 'excl;': '!',
+ 'exist;': '\u2203',
+ 'expectation;': '\u2130',
+ 'exponentiale;': '\u2147',
+ 'fallingdotseq;': '\u2252',
+ 'fcy;': '\u0444',
+ 'female;': '\u2640',
+ 'ffilig;': '\ufb03',
+ 'fflig;': '\ufb00',
+ 'ffllig;': '\ufb04',
+ 'ffr;': '\u{01d523}',
+ 'filig;': '\ufb01',
+ 'fjlig;': 'fj',
+ 'flat;': '\u266d',
+ 'fllig;': '\ufb02',
+ 'fltns;': '\u25b1',
+ 'fnof;': '\u0192',
+ 'fopf;': '\u{01d557}',
+ 'forall;': '\u2200',
+ 'fork;': '\u22d4',
+ 'forkv;': '\u2ad9',
+ 'fpartint;': '\u2a0d',
+ 'frac12': '\xbd',
+ 'frac12;': '\xbd',
+ 'frac13;': '\u2153',
+ 'frac14': '\xbc',
+ 'frac14;': '\xbc',
+ 'frac15;': '\u2155',
+ 'frac16;': '\u2159',
+ 'frac18;': '\u215b',
+ 'frac23;': '\u2154',
+ 'frac25;': '\u2156',
+ 'frac34': '\xbe',
+ 'frac34;': '\xbe',
+ 'frac35;': '\u2157',
+ 'frac38;': '\u215c',
+ 'frac45;': '\u2158',
+ 'frac56;': '\u215a',
+ 'frac58;': '\u215d',
+ 'frac78;': '\u215e',
+ 'frasl;': '\u2044',
+ 'frown;': '\u2322',
+ 'fscr;': '\u{01d4bb}',
+ 'gE;': '\u2267',
+ 'gEl;': '\u2a8c',
+ 'gacute;': '\u01f5',
+ 'gamma;': '\u03b3',
+ 'gammad;': '\u03dd',
+ 'gap;': '\u2a86',
+ 'gbreve;': '\u011f',
+ 'gcirc;': '\u011d',
+ 'gcy;': '\u0433',
+ 'gdot;': '\u0121',
+ 'ge;': '\u2265',
+ 'gel;': '\u22db',
+ 'geq;': '\u2265',
+ 'geqq;': '\u2267',
+ 'geqslant;': '\u2a7e',
+ 'ges;': '\u2a7e',
+ 'gescc;': '\u2aa9',
+ 'gesdot;': '\u2a80',
+ 'gesdoto;': '\u2a82',
+ 'gesdotol;': '\u2a84',
+ 'gesl;': '\u22db\ufe00',
+ 'gesles;': '\u2a94',
+ 'gfr;': '\u{01d524}',
+ 'gg;': '\u226b',
+ 'ggg;': '\u22d9',
+ 'gimel;': '\u2137',
+ 'gjcy;': '\u0453',
+ 'gl;': '\u2277',
+ 'glE;': '\u2a92',
+ 'gla;': '\u2aa5',
+ 'glj;': '\u2aa4',
+ 'gnE;': '\u2269',
+ 'gnap;': '\u2a8a',
+ 'gnapprox;': '\u2a8a',
+ 'gne;': '\u2a88',
+ 'gneq;': '\u2a88',
+ 'gneqq;': '\u2269',
+ 'gnsim;': '\u22e7',
+ 'gopf;': '\u{01d558}',
+ 'grave;': '`',
+ 'gscr;': '\u210a',
+ 'gsim;': '\u2273',
+ 'gsime;': '\u2a8e',
+ 'gsiml;': '\u2a90',
+ 'gt': '>',
+ 'gt;': '>',
+ 'gtcc;': '\u2aa7',
+ 'gtcir;': '\u2a7a',
+ 'gtdot;': '\u22d7',
+ 'gtlPar;': '\u2995',
+ 'gtquest;': '\u2a7c',
+ 'gtrapprox;': '\u2a86',
+ 'gtrarr;': '\u2978',
+ 'gtrdot;': '\u22d7',
+ 'gtreqless;': '\u22db',
+ 'gtreqqless;': '\u2a8c',
+ 'gtrless;': '\u2277',
+ 'gtrsim;': '\u2273',
+ 'gvertneqq;': '\u2269\ufe00',
+ 'gvnE;': '\u2269\ufe00',
+ 'hArr;': '\u21d4',
+ 'hairsp;': '\u200a',
+ 'half;': '\xbd',
+ 'hamilt;': '\u210b',
+ 'hardcy;': '\u044a',
+ 'harr;': '\u2194',
+ 'harrcir;': '\u2948',
+ 'harrw;': '\u21ad',
+ 'hbar;': '\u210f',
+ 'hcirc;': '\u0125',
+ 'hearts;': '\u2665',
+ 'heartsuit;': '\u2665',
+ 'hellip;': '\u2026',
+ 'hercon;': '\u22b9',
+ 'hfr;': '\u{01d525}',
+ 'hksearow;': '\u2925',
+ 'hkswarow;': '\u2926',
+ 'hoarr;': '\u21ff',
+ 'homtht;': '\u223b',
+ 'hookleftarrow;': '\u21a9',
+ 'hookrightarrow;': '\u21aa',
+ 'hopf;': '\u{01d559}',
+ 'horbar;': '\u2015',
+ 'hscr;': '\u{01d4bd}',
+ 'hslash;': '\u210f',
+ 'hstrok;': '\u0127',
+ 'hybull;': '\u2043',
+ 'hyphen;': '\u2010',
+ 'iacute': '\xed',
+ 'iacute;': '\xed',
+ 'ic;': '\u2063',
+ 'icirc': '\xee',
+ 'icirc;': '\xee',
+ 'icy;': '\u0438',
+ 'iecy;': '\u0435',
+ 'iexcl': '\xa1',
+ 'iexcl;': '\xa1',
+ 'iff;': '\u21d4',
+ 'ifr;': '\u{01d526}',
+ 'igrave': '\xec',
+ 'igrave;': '\xec',
+ 'ii;': '\u2148',
+ 'iiiint;': '\u2a0c',
+ 'iiint;': '\u222d',
+ 'iinfin;': '\u29dc',
+ 'iiota;': '\u2129',
+ 'ijlig;': '\u0133',
+ 'imacr;': '\u012b',
+ 'image;': '\u2111',
+ 'imagline;': '\u2110',
+ 'imagpart;': '\u2111',
+ 'imath;': '\u0131',
+ 'imof;': '\u22b7',
+ 'imped;': '\u01b5',
+ 'in;': '\u2208',
+ 'incare;': '\u2105',
+ 'infin;': '\u221e',
+ 'infintie;': '\u29dd',
+ 'inodot;': '\u0131',
+ 'int;': '\u222b',
+ 'intcal;': '\u22ba',
+ 'integers;': '\u2124',
+ 'intercal;': '\u22ba',
+ 'intlarhk;': '\u2a17',
+ 'intprod;': '\u2a3c',
+ 'iocy;': '\u0451',
+ 'iogon;': '\u012f',
+ 'iopf;': '\u{01d55a}',
+ 'iota;': '\u03b9',
+ 'iprod;': '\u2a3c',
+ 'iquest': '\xbf',
+ 'iquest;': '\xbf',
+ 'iscr;': '\u{01d4be}',
+ 'isin;': '\u2208',
+ 'isinE;': '\u22f9',
+ 'isindot;': '\u22f5',
+ 'isins;': '\u22f4',
+ 'isinsv;': '\u22f3',
+ 'isinv;': '\u2208',
+ 'it;': '\u2062',
+ 'itilde;': '\u0129',
+ 'iukcy;': '\u0456',
+ 'iuml': '\xef',
+ 'iuml;': '\xef',
+ 'jcirc;': '\u0135',
+ 'jcy;': '\u0439',
+ 'jfr;': '\u{01d527}',
+ 'jmath;': '\u0237',
+ 'jopf;': '\u{01d55b}',
+ 'jscr;': '\u{01d4bf}',
+ 'jsercy;': '\u0458',
+ 'jukcy;': '\u0454',
+ 'kappa;': '\u03ba',
+ 'kappav;': '\u03f0',
+ 'kcedil;': '\u0137',
+ 'kcy;': '\u043a',
+ 'kfr;': '\u{01d528}',
+ 'kgreen;': '\u0138',
+ 'khcy;': '\u0445',
+ 'kjcy;': '\u045c',
+ 'kopf;': '\u{01d55c}',
+ 'kscr;': '\u{01d4c0}',
+ 'lAarr;': '\u21da',
+ 'lArr;': '\u21d0',
+ 'lAtail;': '\u291b',
+ 'lBarr;': '\u290e',
+ 'lE;': '\u2266',
+ 'lEg;': '\u2a8b',
+ 'lHar;': '\u2962',
+ 'lacute;': '\u013a',
+ 'laemptyv;': '\u29b4',
+ 'lagran;': '\u2112',
+ 'lambda;': '\u03bb',
+ 'lang;': '\u27e8',
+ 'langd;': '\u2991',
+ 'langle;': '\u27e8',
+ 'lap;': '\u2a85',
+ 'laquo': '\xab',
+ 'laquo;': '\xab',
+ 'larr;': '\u2190',
+ 'larrb;': '\u21e4',
+ 'larrbfs;': '\u291f',
+ 'larrfs;': '\u291d',
+ 'larrhk;': '\u21a9',
+ 'larrlp;': '\u21ab',
+ 'larrpl;': '\u2939',
+ 'larrsim;': '\u2973',
+ 'larrtl;': '\u21a2',
+ 'lat;': '\u2aab',
+ 'latail;': '\u2919',
+ 'late;': '\u2aad',
+ 'lates;': '\u2aad\ufe00',
+ 'lbarr;': '\u290c',
+ 'lbbrk;': '\u2772',
+ 'lbrace;': '{',
+ 'lbrack;': '[',
+ 'lbrke;': '\u298b',
+ 'lbrksld;': '\u298f',
+ 'lbrkslu;': '\u298d',
+ 'lcaron;': '\u013e',
+ 'lcedil;': '\u013c',
+ 'lceil;': '\u2308',
+ 'lcub;': '{',
+ 'lcy;': '\u043b',
+ 'ldca;': '\u2936',
+ 'ldquo;': '\u201c',
+ 'ldquor;': '\u201e',
+ 'ldrdhar;': '\u2967',
+ 'ldrushar;': '\u294b',
+ 'ldsh;': '\u21b2',
+ 'le;': '\u2264',
+ 'leftarrow;': '\u2190',
+ 'leftarrowtail;': '\u21a2',
+ 'leftharpoondown;': '\u21bd',
+ 'leftharpoonup;': '\u21bc',
+ 'leftleftarrows;': '\u21c7',
+ 'leftrightarrow;': '\u2194',
+ 'leftrightarrows;': '\u21c6',
+ 'leftrightharpoons;': '\u21cb',
+ 'leftrightsquigarrow;': '\u21ad',
+ 'leftthreetimes;': '\u22cb',
+ 'leg;': '\u22da',
+ 'leq;': '\u2264',
+ 'leqq;': '\u2266',
+ 'leqslant;': '\u2a7d',
+ 'les;': '\u2a7d',
+ 'lescc;': '\u2aa8',
+ 'lesdot;': '\u2a7f',
+ 'lesdoto;': '\u2a81',
+ 'lesdotor;': '\u2a83',
+ 'lesg;': '\u22da\ufe00',
+ 'lesges;': '\u2a93',
+ 'lessapprox;': '\u2a85',
+ 'lessdot;': '\u22d6',
+ 'lesseqgtr;': '\u22da',
+ 'lesseqqgtr;': '\u2a8b',
+ 'lessgtr;': '\u2276',
+ 'lesssim;': '\u2272',
+ 'lfisht;': '\u297c',
+ 'lfloor;': '\u230a',
+ 'lfr;': '\u{01d529}',
+ 'lg;': '\u2276',
+ 'lgE;': '\u2a91',
+ 'lhard;': '\u21bd',
+ 'lharu;': '\u21bc',
+ 'lharul;': '\u296a',
+ 'lhblk;': '\u2584',
+ 'ljcy;': '\u0459',
+ 'll;': '\u226a',
+ 'llarr;': '\u21c7',
+ 'llcorner;': '\u231e',
+ 'llhard;': '\u296b',
+ 'lltri;': '\u25fa',
+ 'lmidot;': '\u0140',
+ 'lmoust;': '\u23b0',
+ 'lmoustache;': '\u23b0',
+ 'lnE;': '\u2268',
+ 'lnap;': '\u2a89',
+ 'lnapprox;': '\u2a89',
+ 'lne;': '\u2a87',
+ 'lneq;': '\u2a87',
+ 'lneqq;': '\u2268',
+ 'lnsim;': '\u22e6',
+ 'loang;': '\u27ec',
+ 'loarr;': '\u21fd',
+ 'lobrk;': '\u27e6',
+ 'longleftarrow;': '\u27f5',
+ 'longleftrightarrow;': '\u27f7',
+ 'longmapsto;': '\u27fc',
+ 'longrightarrow;': '\u27f6',
+ 'looparrowleft;': '\u21ab',
+ 'looparrowright;': '\u21ac',
+ 'lopar;': '\u2985',
+ 'lopf;': '\u{01d55d}',
+ 'loplus;': '\u2a2d',
+ 'lotimes;': '\u2a34',
+ 'lowast;': '\u2217',
+ 'lowbar;': '_',
+ 'loz;': '\u25ca',
+ 'lozenge;': '\u25ca',
+ 'lozf;': '\u29eb',
+ 'lpar;': '(',
+ 'lparlt;': '\u2993',
+ 'lrarr;': '\u21c6',
+ 'lrcorner;': '\u231f',
+ 'lrhar;': '\u21cb',
+ 'lrhard;': '\u296d',
+ 'lrm;': '\u200e',
+ 'lrtri;': '\u22bf',
+ 'lsaquo;': '\u2039',
+ 'lscr;': '\u{01d4c1}',
+ 'lsh;': '\u21b0',
+ 'lsim;': '\u2272',
+ 'lsime;': '\u2a8d',
+ 'lsimg;': '\u2a8f',
+ 'lsqb;': '[',
+ 'lsquo;': '\u2018',
+ 'lsquor;': '\u201a',
+ 'lstrok;': '\u0142',
+ 'lt': '<',
+ 'lt;': '<',
+ 'ltcc;': '\u2aa6',
+ 'ltcir;': '\u2a79',
+ 'ltdot;': '\u22d6',
+ 'lthree;': '\u22cb',
+ 'ltimes;': '\u22c9',
+ 'ltlarr;': '\u2976',
+ 'ltquest;': '\u2a7b',
+ 'ltrPar;': '\u2996',
+ 'ltri;': '\u25c3',
+ 'ltrie;': '\u22b4',
+ 'ltrif;': '\u25c2',
+ 'lurdshar;': '\u294a',
+ 'luruhar;': '\u2966',
+ 'lvertneqq;': '\u2268\ufe00',
+ 'lvnE;': '\u2268\ufe00',
+ 'mDDot;': '\u223a',
+ 'macr': '\xaf',
+ 'macr;': '\xaf',
+ 'male;': '\u2642',
+ 'malt;': '\u2720',
+ 'maltese;': '\u2720',
+ 'map;': '\u21a6',
+ 'mapsto;': '\u21a6',
+ 'mapstodown;': '\u21a7',
+ 'mapstoleft;': '\u21a4',
+ 'mapstoup;': '\u21a5',
+ 'marker;': '\u25ae',
+ 'mcomma;': '\u2a29',
+ 'mcy;': '\u043c',
+ 'mdash;': '\u2014',
+ 'measuredangle;': '\u2221',
+ 'mfr;': '\u{01d52a}',
+ 'mho;': '\u2127',
+ 'micro': '\xb5',
+ 'micro;': '\xb5',
+ 'mid;': '\u2223',
+ 'midast;': '*',
+ 'midcir;': '\u2af0',
+ 'middot': '\xb7',
+ 'middot;': '\xb7',
+ 'minus;': '\u2212',
+ 'minusb;': '\u229f',
+ 'minusd;': '\u2238',
+ 'minusdu;': '\u2a2a',
+ 'mlcp;': '\u2adb',
+ 'mldr;': '\u2026',
+ 'mnplus;': '\u2213',
+ 'models;': '\u22a7',
+ 'mopf;': '\u{01d55e}',
+ 'mp;': '\u2213',
+ 'mscr;': '\u{01d4c2}',
+ 'mstpos;': '\u223e',
+ 'mu;': '\u03bc',
+ 'multimap;': '\u22b8',
+ 'mumap;': '\u22b8',
+ 'nGg;': '\u22d9\u0338',
+ 'nGt;': '\u226b\u20d2',
+ 'nGtv;': '\u226b\u0338',
+ 'nLeftarrow;': '\u21cd',
+ 'nLeftrightarrow;': '\u21ce',
+ 'nLl;': '\u22d8\u0338',
+ 'nLt;': '\u226a\u20d2',
+ 'nLtv;': '\u226a\u0338',
+ 'nRightarrow;': '\u21cf',
+ 'nVDash;': '\u22af',
+ 'nVdash;': '\u22ae',
+ 'nabla;': '\u2207',
+ 'nacute;': '\u0144',
+ 'nang;': '\u2220\u20d2',
+ 'nap;': '\u2249',
+ 'napE;': '\u2a70\u0338',
+ 'napid;': '\u224b\u0338',
+ 'napos;': '\u0149',
+ 'napprox;': '\u2249',
+ 'natur;': '\u266e',
+ 'natural;': '\u266e',
+ 'naturals;': '\u2115',
+ 'nbsp': '\xa0',
+ 'nbsp;': '\xa0',
+ 'nbump;': '\u224e\u0338',
+ 'nbumpe;': '\u224f\u0338',
+ 'ncap;': '\u2a43',
+ 'ncaron;': '\u0148',
+ 'ncedil;': '\u0146',
+ 'ncong;': '\u2247',
+ 'ncongdot;': '\u2a6d\u0338',
+ 'ncup;': '\u2a42',
+ 'ncy;': '\u043d',
+ 'ndash;': '\u2013',
+ 'ne;': '\u2260',
+ 'neArr;': '\u21d7',
+ 'nearhk;': '\u2924',
+ 'nearr;': '\u2197',
+ 'nearrow;': '\u2197',
+ 'nedot;': '\u2250\u0338',
+ 'nequiv;': '\u2262',
+ 'nesear;': '\u2928',
+ 'nesim;': '\u2242\u0338',
+ 'nexist;': '\u2204',
+ 'nexists;': '\u2204',
+ 'nfr;': '\u{01d52b}',
+ 'ngE;': '\u2267\u0338',
+ 'nge;': '\u2271',
+ 'ngeq;': '\u2271',
+ 'ngeqq;': '\u2267\u0338',
+ 'ngeqslant;': '\u2a7e\u0338',
+ 'nges;': '\u2a7e\u0338',
+ 'ngsim;': '\u2275',
+ 'ngt;': '\u226f',
+ 'ngtr;': '\u226f',
+ 'nhArr;': '\u21ce',
+ 'nharr;': '\u21ae',
+ 'nhpar;': '\u2af2',
+ 'ni;': '\u220b',
+ 'nis;': '\u22fc',
+ 'nisd;': '\u22fa',
+ 'niv;': '\u220b',
+ 'njcy;': '\u045a',
+ 'nlArr;': '\u21cd',
+ 'nlE;': '\u2266\u0338',
+ 'nlarr;': '\u219a',
+ 'nldr;': '\u2025',
+ 'nle;': '\u2270',
+ 'nleftarrow;': '\u219a',
+ 'nleftrightarrow;': '\u21ae',
+ 'nleq;': '\u2270',
+ 'nleqq;': '\u2266\u0338',
+ 'nleqslant;': '\u2a7d\u0338',
+ 'nles;': '\u2a7d\u0338',
+ 'nless;': '\u226e',
+ 'nlsim;': '\u2274',
+ 'nlt;': '\u226e',
+ 'nltri;': '\u22ea',
+ 'nltrie;': '\u22ec',
+ 'nmid;': '\u2224',
+ 'nopf;': '\u{01d55f}',
+ 'not': '\xac',
+ 'not;': '\xac',
+ 'notin;': '\u2209',
+ 'notinE;': '\u22f9\u0338',
+ 'notindot;': '\u22f5\u0338',
+ 'notinva;': '\u2209',
+ 'notinvb;': '\u22f7',
+ 'notinvc;': '\u22f6',
+ 'notni;': '\u220c',
+ 'notniva;': '\u220c',
+ 'notnivb;': '\u22fe',
+ 'notnivc;': '\u22fd',
+ 'npar;': '\u2226',
+ 'nparallel;': '\u2226',
+ 'nparsl;': '\u2afd\u20e5',
+ 'npart;': '\u2202\u0338',
+ 'npolint;': '\u2a14',
+ 'npr;': '\u2280',
+ 'nprcue;': '\u22e0',
+ 'npre;': '\u2aaf\u0338',
+ 'nprec;': '\u2280',
+ 'npreceq;': '\u2aaf\u0338',
+ 'nrArr;': '\u21cf',
+ 'nrarr;': '\u219b',
+ 'nrarrc;': '\u2933\u0338',
+ 'nrarrw;': '\u219d\u0338',
+ 'nrightarrow;': '\u219b',
+ 'nrtri;': '\u22eb',
+ 'nrtrie;': '\u22ed',
+ 'nsc;': '\u2281',
+ 'nsccue;': '\u22e1',
+ 'nsce;': '\u2ab0\u0338',
+ 'nscr;': '\u{01d4c3}',
+ 'nshortmid;': '\u2224',
+ 'nshortparallel;': '\u2226',
+ 'nsim;': '\u2241',
+ 'nsime;': '\u2244',
+ 'nsimeq;': '\u2244',
+ 'nsmid;': '\u2224',
+ 'nspar;': '\u2226',
+ 'nsqsube;': '\u22e2',
+ 'nsqsupe;': '\u22e3',
+ 'nsub;': '\u2284',
+ 'nsubE;': '\u2ac5\u0338',
+ 'nsube;': '\u2288',
+ 'nsubset;': '\u2282\u20d2',
+ 'nsubseteq;': '\u2288',
+ 'nsubseteqq;': '\u2ac5\u0338',
+ 'nsucc;': '\u2281',
+ 'nsucceq;': '\u2ab0\u0338',
+ 'nsup;': '\u2285',
+ 'nsupE;': '\u2ac6\u0338',
+ 'nsupe;': '\u2289',
+ 'nsupset;': '\u2283\u20d2',
+ 'nsupseteq;': '\u2289',
+ 'nsupseteqq;': '\u2ac6\u0338',
+ 'ntgl;': '\u2279',
+ 'ntilde': '\xf1',
+ 'ntilde;': '\xf1',
+ 'ntlg;': '\u2278',
+ 'ntriangleleft;': '\u22ea',
+ 'ntrianglelefteq;': '\u22ec',
+ 'ntriangleright;': '\u22eb',
+ 'ntrianglerighteq;': '\u22ed',
+ 'nu;': '\u03bd',
+ 'num;': '#',
+ 'numero;': '\u2116',
+ 'numsp;': '\u2007',
+ 'nvDash;': '\u22ad',
+ 'nvHarr;': '\u2904',
+ 'nvap;': '\u224d\u20d2',
+ 'nvdash;': '\u22ac',
+ 'nvge;': '\u2265\u20d2',
+ 'nvgt;': '>\u20d2',
+ 'nvinfin;': '\u29de',
+ 'nvlArr;': '\u2902',
+ 'nvle;': '\u2264\u20d2',
+ 'nvlt;': '<\u20d2',
+ 'nvltrie;': '\u22b4\u20d2',
+ 'nvrArr;': '\u2903',
+ 'nvrtrie;': '\u22b5\u20d2',
+ 'nvsim;': '\u223c\u20d2',
+ 'nwArr;': '\u21d6',
+ 'nwarhk;': '\u2923',
+ 'nwarr;': '\u2196',
+ 'nwarrow;': '\u2196',
+ 'nwnear;': '\u2927',
+ 'oS;': '\u24c8',
+ 'oacute': '\xf3',
+ 'oacute;': '\xf3',
+ 'oast;': '\u229b',
+ 'ocir;': '\u229a',
+ 'ocirc': '\xf4',
+ 'ocirc;': '\xf4',
+ 'ocy;': '\u043e',
+ 'odash;': '\u229d',
+ 'odblac;': '\u0151',
+ 'odiv;': '\u2a38',
+ 'odot;': '\u2299',
+ 'odsold;': '\u29bc',
+ 'oelig;': '\u0153',
+ 'ofcir;': '\u29bf',
+ 'ofr;': '\u{01d52c}',
+ 'ogon;': '\u02db',
+ 'ograve': '\xf2',
+ 'ograve;': '\xf2',
+ 'ogt;': '\u29c1',
+ 'ohbar;': '\u29b5',
+ 'ohm;': '\u03a9',
+ 'oint;': '\u222e',
+ 'olarr;': '\u21ba',
+ 'olcir;': '\u29be',
+ 'olcross;': '\u29bb',
+ 'oline;': '\u203e',
+ 'olt;': '\u29c0',
+ 'omacr;': '\u014d',
+ 'omega;': '\u03c9',
+ 'omicron;': '\u03bf',
+ 'omid;': '\u29b6',
+ 'ominus;': '\u2296',
+ 'oopf;': '\u{01d560}',
+ 'opar;': '\u29b7',
+ 'operp;': '\u29b9',
+ 'oplus;': '\u2295',
+ 'or;': '\u2228',
+ 'orarr;': '\u21bb',
+ 'ord;': '\u2a5d',
+ 'order;': '\u2134',
+ 'orderof;': '\u2134',
+ 'ordf': '\xaa',
+ 'ordf;': '\xaa',
+ 'ordm': '\xba',
+ 'ordm;': '\xba',
+ 'origof;': '\u22b6',
+ 'oror;': '\u2a56',
+ 'orslope;': '\u2a57',
+ 'orv;': '\u2a5b',
+ 'oscr;': '\u2134',
+ 'oslash': '\xf8',
+ 'oslash;': '\xf8',
+ 'osol;': '\u2298',
+ 'otilde': '\xf5',
+ 'otilde;': '\xf5',
+ 'otimes;': '\u2297',
+ 'otimesas;': '\u2a36',
+ 'ouml': '\xf6',
+ 'ouml;': '\xf6',
+ 'ovbar;': '\u233d',
+ 'par;': '\u2225',
+ 'para': '\xb6',
+ 'para;': '\xb6',
+ 'parallel;': '\u2225',
+ 'parsim;': '\u2af3',
+ 'parsl;': '\u2afd',
+ 'part;': '\u2202',
+ 'pcy;': '\u043f',
+ 'percnt;': '%',
+ 'period;': '.',
+ 'permil;': '\u2030',
+ 'perp;': '\u22a5',
+ 'pertenk;': '\u2031',
+ 'pfr;': '\u{01d52d}',
+ 'phi;': '\u03c6',
+ 'phiv;': '\u03d5',
+ 'phmmat;': '\u2133',
+ 'phone;': '\u260e',
+ 'pi;': '\u03c0',
+ 'pitchfork;': '\u22d4',
+ 'piv;': '\u03d6',
+ 'planck;': '\u210f',
+ 'planckh;': '\u210e',
+ 'plankv;': '\u210f',
+ 'plus;': '+',
+ 'plusacir;': '\u2a23',
+ 'plusb;': '\u229e',
+ 'pluscir;': '\u2a22',
+ 'plusdo;': '\u2214',
+ 'plusdu;': '\u2a25',
+ 'pluse;': '\u2a72',
+ 'plusmn': '\xb1',
+ 'plusmn;': '\xb1',
+ 'plussim;': '\u2a26',
+ 'plustwo;': '\u2a27',
+ 'pm;': '\xb1',
+ 'pointint;': '\u2a15',
+ 'popf;': '\u{01d561}',
+ 'pound': '\xa3',
+ 'pound;': '\xa3',
+ 'pr;': '\u227a',
+ 'prE;': '\u2ab3',
+ 'prap;': '\u2ab7',
+ 'prcue;': '\u227c',
+ 'pre;': '\u2aaf',
+ 'prec;': '\u227a',
+ 'precapprox;': '\u2ab7',
+ 'preccurlyeq;': '\u227c',
+ 'preceq;': '\u2aaf',
+ 'precnapprox;': '\u2ab9',
+ 'precneqq;': '\u2ab5',
+ 'precnsim;': '\u22e8',
+ 'precsim;': '\u227e',
+ 'prime;': '\u2032',
+ 'primes;': '\u2119',
+ 'prnE;': '\u2ab5',
+ 'prnap;': '\u2ab9',
+ 'prnsim;': '\u22e8',
+ 'prod;': '\u220f',
+ 'profalar;': '\u232e',
+ 'profline;': '\u2312',
+ 'profsurf;': '\u2313',
+ 'prop;': '\u221d',
+ 'propto;': '\u221d',
+ 'prsim;': '\u227e',
+ 'prurel;': '\u22b0',
+ 'pscr;': '\u{01d4c5}',
+ 'psi;': '\u03c8',
+ 'puncsp;': '\u2008',
+ 'qfr;': '\u{01d52e}',
+ 'qint;': '\u2a0c',
+ 'qopf;': '\u{01d562}',
+ 'qprime;': '\u2057',
+ 'qscr;': '\u{01d4c6}',
+ 'quaternions;': '\u210d',
+ 'quatint;': '\u2a16',
+ 'quest;': '?',
+ 'questeq;': '\u225f',
+ 'quot': '"',
+ 'quot;': '"',
+ 'rAarr;': '\u21db',
+ 'rArr;': '\u21d2',
+ 'rAtail;': '\u291c',
+ 'rBarr;': '\u290f',
+ 'rHar;': '\u2964',
+ 'race;': '\u223d\u0331',
+ 'racute;': '\u0155',
+ 'radic;': '\u221a',
+ 'raemptyv;': '\u29b3',
+ 'rang;': '\u27e9',
+ 'rangd;': '\u2992',
+ 'range;': '\u29a5',
+ 'rangle;': '\u27e9',
+ 'raquo': '\xbb',
+ 'raquo;': '\xbb',
+ 'rarr;': '\u2192',
+ 'rarrap;': '\u2975',
+ 'rarrb;': '\u21e5',
+ 'rarrbfs;': '\u2920',
+ 'rarrc;': '\u2933',
+ 'rarrfs;': '\u291e',
+ 'rarrhk;': '\u21aa',
+ 'rarrlp;': '\u21ac',
+ 'rarrpl;': '\u2945',
+ 'rarrsim;': '\u2974',
+ 'rarrtl;': '\u21a3',
+ 'rarrw;': '\u219d',
+ 'ratail;': '\u291a',
+ 'ratio;': '\u2236',
+ 'rationals;': '\u211a',
+ 'rbarr;': '\u290d',
+ 'rbbrk;': '\u2773',
+ 'rbrace;': '}',
+ 'rbrack;': ']',
+ 'rbrke;': '\u298c',
+ 'rbrksld;': '\u298e',
+ 'rbrkslu;': '\u2990',
+ 'rcaron;': '\u0159',
+ 'rcedil;': '\u0157',
+ 'rceil;': '\u2309',
+ 'rcub;': '}',
+ 'rcy;': '\u0440',
+ 'rdca;': '\u2937',
+ 'rdldhar;': '\u2969',
+ 'rdquo;': '\u201d',
+ 'rdquor;': '\u201d',
+ 'rdsh;': '\u21b3',
+ 'real;': '\u211c',
+ 'realine;': '\u211b',
+ 'realpart;': '\u211c',
+ 'reals;': '\u211d',
+ 'rect;': '\u25ad',
+ 'reg': '\xae',
+ 'reg;': '\xae',
+ 'rfisht;': '\u297d',
+ 'rfloor;': '\u230b',
+ 'rfr;': '\u{01d52f}',
+ 'rhard;': '\u21c1',
+ 'rharu;': '\u21c0',
+ 'rharul;': '\u296c',
+ 'rho;': '\u03c1',
+ 'rhov;': '\u03f1',
+ 'rightarrow;': '\u2192',
+ 'rightarrowtail;': '\u21a3',
+ 'rightharpoondown;': '\u21c1',
+ 'rightharpoonup;': '\u21c0',
+ 'rightleftarrows;': '\u21c4',
+ 'rightleftharpoons;': '\u21cc',
+ 'rightrightarrows;': '\u21c9',
+ 'rightsquigarrow;': '\u219d',
+ 'rightthreetimes;': '\u22cc',
+ 'ring;': '\u02da',
+ 'risingdotseq;': '\u2253',
+ 'rlarr;': '\u21c4',
+ 'rlhar;': '\u21cc',
+ 'rlm;': '\u200f',
+ 'rmoust;': '\u23b1',
+ 'rmoustache;': '\u23b1',
+ 'rnmid;': '\u2aee',
+ 'roang;': '\u27ed',
+ 'roarr;': '\u21fe',
+ 'robrk;': '\u27e7',
+ 'ropar;': '\u2986',
+ 'ropf;': '\u{01d563}',
+ 'roplus;': '\u2a2e',
+ 'rotimes;': '\u2a35',
+ 'rpar;': ')',
+ 'rpargt;': '\u2994',
+ 'rppolint;': '\u2a12',
+ 'rrarr;': '\u21c9',
+ 'rsaquo;': '\u203a',
+ 'rscr;': '\u{01d4c7}',
+ 'rsh;': '\u21b1',
+ 'rsqb;': ']',
+ 'rsquo;': '\u2019',
+ 'rsquor;': '\u2019',
+ 'rthree;': '\u22cc',
+ 'rtimes;': '\u22ca',
+ 'rtri;': '\u25b9',
+ 'rtrie;': '\u22b5',
+ 'rtrif;': '\u25b8',
+ 'rtriltri;': '\u29ce',
+ 'ruluhar;': '\u2968',
+ 'rx;': '\u211e',
+ 'sacute;': '\u015b',
+ 'sbquo;': '\u201a',
+ 'sc;': '\u227b',
+ 'scE;': '\u2ab4',
+ 'scap;': '\u2ab8',
+ 'scaron;': '\u0161',
+ 'sccue;': '\u227d',
+ 'sce;': '\u2ab0',
+ 'scedil;': '\u015f',
+ 'scirc;': '\u015d',
+ 'scnE;': '\u2ab6',
+ 'scnap;': '\u2aba',
+ 'scnsim;': '\u22e9',
+ 'scpolint;': '\u2a13',
+ 'scsim;': '\u227f',
+ 'scy;': '\u0441',
+ 'sdot;': '\u22c5',
+ 'sdotb;': '\u22a1',
+ 'sdote;': '\u2a66',
+ 'seArr;': '\u21d8',
+ 'searhk;': '\u2925',
+ 'searr;': '\u2198',
+ 'searrow;': '\u2198',
+ 'sect': '\xa7',
+ 'sect;': '\xa7',
+ 'semi;': ';',
+ 'seswar;': '\u2929',
+ 'setminus;': '\u2216',
+ 'setmn;': '\u2216',
+ 'sext;': '\u2736',
+ 'sfr;': '\u{01d530}',
+ 'sfrown;': '\u2322',
+ 'sharp;': '\u266f',
+ 'shchcy;': '\u0449',
+ 'shcy;': '\u0448',
+ 'shortmid;': '\u2223',
+ 'shortparallel;': '\u2225',
+ 'shy': '\xad',
+ 'shy;': '\xad',
+ 'sigma;': '\u03c3',
+ 'sigmaf;': '\u03c2',
+ 'sigmav;': '\u03c2',
+ 'sim;': '\u223c',
+ 'simdot;': '\u2a6a',
+ 'sime;': '\u2243',
+ 'simeq;': '\u2243',
+ 'simg;': '\u2a9e',
+ 'simgE;': '\u2aa0',
+ 'siml;': '\u2a9d',
+ 'simlE;': '\u2a9f',
+ 'simne;': '\u2246',
+ 'simplus;': '\u2a24',
+ 'simrarr;': '\u2972',
+ 'slarr;': '\u2190',
+ 'smallsetminus;': '\u2216',
+ 'smashp;': '\u2a33',
+ 'smeparsl;': '\u29e4',
+ 'smid;': '\u2223',
+ 'smile;': '\u2323',
+ 'smt;': '\u2aaa',
+ 'smte;': '\u2aac',
+ 'smtes;': '\u2aac\ufe00',
+ 'softcy;': '\u044c',
+ 'sol;': '/',
+ 'solb;': '\u29c4',
+ 'solbar;': '\u233f',
+ 'sopf;': '\u{01d564}',
+ 'spades;': '\u2660',
+ 'spadesuit;': '\u2660',
+ 'spar;': '\u2225',
+ 'sqcap;': '\u2293',
+ 'sqcaps;': '\u2293\ufe00',
+ 'sqcup;': '\u2294',
+ 'sqcups;': '\u2294\ufe00',
+ 'sqsub;': '\u228f',
+ 'sqsube;': '\u2291',
+ 'sqsubset;': '\u228f',
+ 'sqsubseteq;': '\u2291',
+ 'sqsup;': '\u2290',
+ 'sqsupe;': '\u2292',
+ 'sqsupset;': '\u2290',
+ 'sqsupseteq;': '\u2292',
+ 'squ;': '\u25a1',
+ 'square;': '\u25a1',
+ 'squarf;': '\u25aa',
+ 'squf;': '\u25aa',
+ 'srarr;': '\u2192',
+ 'sscr;': '\u{01d4c8}',
+ 'ssetmn;': '\u2216',
+ 'ssmile;': '\u2323',
+ 'sstarf;': '\u22c6',
+ 'star;': '\u2606',
+ 'starf;': '\u2605',
+ 'straightepsilon;': '\u03f5',
+ 'straightphi;': '\u03d5',
+ 'strns;': '\xaf',
+ 'sub;': '\u2282',
+ 'subE;': '\u2ac5',
+ 'subdot;': '\u2abd',
+ 'sube;': '\u2286',
+ 'subedot;': '\u2ac3',
+ 'submult;': '\u2ac1',
+ 'subnE;': '\u2acb',
+ 'subne;': '\u228a',
+ 'subplus;': '\u2abf',
+ 'subrarr;': '\u2979',
+ 'subset;': '\u2282',
+ 'subseteq;': '\u2286',
+ 'subseteqq;': '\u2ac5',
+ 'subsetneq;': '\u228a',
+ 'subsetneqq;': '\u2acb',
+ 'subsim;': '\u2ac7',
+ 'subsub;': '\u2ad5',
+ 'subsup;': '\u2ad3',
+ 'succ;': '\u227b',
+ 'succapprox;': '\u2ab8',
+ 'succcurlyeq;': '\u227d',
+ 'succeq;': '\u2ab0',
+ 'succnapprox;': '\u2aba',
+ 'succneqq;': '\u2ab6',
+ 'succnsim;': '\u22e9',
+ 'succsim;': '\u227f',
+ 'sum;': '\u2211',
+ 'sung;': '\u266a',
+ 'sup1': '\xb9',
+ 'sup1;': '\xb9',
+ 'sup2': '\xb2',
+ 'sup2;': '\xb2',
+ 'sup3': '\xb3',
+ 'sup3;': '\xb3',
+ 'sup;': '\u2283',
+ 'supE;': '\u2ac6',
+ 'supdot;': '\u2abe',
+ 'supdsub;': '\u2ad8',
+ 'supe;': '\u2287',
+ 'supedot;': '\u2ac4',
+ 'suphsol;': '\u27c9',
+ 'suphsub;': '\u2ad7',
+ 'suplarr;': '\u297b',
+ 'supmult;': '\u2ac2',
+ 'supnE;': '\u2acc',
+ 'supne;': '\u228b',
+ 'supplus;': '\u2ac0',
+ 'supset;': '\u2283',
+ 'supseteq;': '\u2287',
+ 'supseteqq;': '\u2ac6',
+ 'supsetneq;': '\u228b',
+ 'supsetneqq;': '\u2acc',
+ 'supsim;': '\u2ac8',
+ 'supsub;': '\u2ad4',
+ 'supsup;': '\u2ad6',
+ 'swArr;': '\u21d9',
+ 'swarhk;': '\u2926',
+ 'swarr;': '\u2199',
+ 'swarrow;': '\u2199',
+ 'swnwar;': '\u292a',
+ 'szlig': '\xdf',
+ 'szlig;': '\xdf',
+ 'target;': '\u2316',
+ 'tau;': '\u03c4',
+ 'tbrk;': '\u23b4',
+ 'tcaron;': '\u0165',
+ 'tcedil;': '\u0163',
+ 'tcy;': '\u0442',
+ 'tdot;': '\u20db',
+ 'telrec;': '\u2315',
+ 'tfr;': '\u{01d531}',
+ 'there4;': '\u2234',
+ 'therefore;': '\u2234',
+ 'theta;': '\u03b8',
+ 'thetasym;': '\u03d1',
+ 'thetav;': '\u03d1',
+ 'thickapprox;': '\u2248',
+ 'thicksim;': '\u223c',
+ 'thinsp;': '\u2009',
+ 'thkap;': '\u2248',
+ 'thksim;': '\u223c',
+ 'thorn': '\xfe',
+ 'thorn;': '\xfe',
+ 'tilde;': '\u02dc',
+ 'times': '\xd7',
+ 'times;': '\xd7',
+ 'timesb;': '\u22a0',
+ 'timesbar;': '\u2a31',
+ 'timesd;': '\u2a30',
+ 'tint;': '\u222d',
+ 'toea;': '\u2928',
+ 'top;': '\u22a4',
+ 'topbot;': '\u2336',
+ 'topcir;': '\u2af1',
+ 'topf;': '\u{01d565}',
+ 'topfork;': '\u2ada',
+ 'tosa;': '\u2929',
+ 'tprime;': '\u2034',
+ 'trade;': '\u2122',
+ 'triangle;': '\u25b5',
+ 'triangledown;': '\u25bf',
+ 'triangleleft;': '\u25c3',
+ 'trianglelefteq;': '\u22b4',
+ 'triangleq;': '\u225c',
+ 'triangleright;': '\u25b9',
+ 'trianglerighteq;': '\u22b5',
+ 'tridot;': '\u25ec',
+ 'trie;': '\u225c',
+ 'triminus;': '\u2a3a',
+ 'triplus;': '\u2a39',
+ 'trisb;': '\u29cd',
+ 'tritime;': '\u2a3b',
+ 'trpezium;': '\u23e2',
+ 'tscr;': '\u{01d4c9}',
+ 'tscy;': '\u0446',
+ 'tshcy;': '\u045b',
+ 'tstrok;': '\u0167',
+ 'twixt;': '\u226c',
+ 'twoheadleftarrow;': '\u219e',
+ 'twoheadrightarrow;': '\u21a0',
+ 'uArr;': '\u21d1',
+ 'uHar;': '\u2963',
+ 'uacute': '\xfa',
+ 'uacute;': '\xfa',
+ 'uarr;': '\u2191',
+ 'ubrcy;': '\u045e',
+ 'ubreve;': '\u016d',
+ 'ucirc': '\xfb',
+ 'ucirc;': '\xfb',
+ 'ucy;': '\u0443',
+ 'udarr;': '\u21c5',
+ 'udblac;': '\u0171',
+ 'udhar;': '\u296e',
+ 'ufisht;': '\u297e',
+ 'ufr;': '\u{01d532}',
+ 'ugrave': '\xf9',
+ 'ugrave;': '\xf9',
+ 'uharl;': '\u21bf',
+ 'uharr;': '\u21be',
+ 'uhblk;': '\u2580',
+ 'ulcorn;': '\u231c',
+ 'ulcorner;': '\u231c',
+ 'ulcrop;': '\u230f',
+ 'ultri;': '\u25f8',
+ 'umacr;': '\u016b',
+ 'uml': '\xa8',
+ 'uml;': '\xa8',
+ 'uogon;': '\u0173',
+ 'uopf;': '\u{01d566}',
+ 'uparrow;': '\u2191',
+ 'updownarrow;': '\u2195',
+ 'upharpoonleft;': '\u21bf',
+ 'upharpoonright;': '\u21be',
+ 'uplus;': '\u228e',
+ 'upsi;': '\u03c5',
+ 'upsih;': '\u03d2',
+ 'upsilon;': '\u03c5',
+ 'upuparrows;': '\u21c8',
+ 'urcorn;': '\u231d',
+ 'urcorner;': '\u231d',
+ 'urcrop;': '\u230e',
+ 'uring;': '\u016f',
+ 'urtri;': '\u25f9',
+ 'uscr;': '\u{01d4ca}',
+ 'utdot;': '\u22f0',
+ 'utilde;': '\u0169',
+ 'utri;': '\u25b5',
+ 'utrif;': '\u25b4',
+ 'uuarr;': '\u21c8',
+ 'uuml': '\xfc',
+ 'uuml;': '\xfc',
+ 'uwangle;': '\u29a7',
+ 'vArr;': '\u21d5',
+ 'vBar;': '\u2ae8',
+ 'vBarv;': '\u2ae9',
+ 'vDash;': '\u22a8',
+ 'vangrt;': '\u299c',
+ 'varepsilon;': '\u03f5',
+ 'varkappa;': '\u03f0',
+ 'varnothing;': '\u2205',
+ 'varphi;': '\u03d5',
+ 'varpi;': '\u03d6',
+ 'varpropto;': '\u221d',
+ 'varr;': '\u2195',
+ 'varrho;': '\u03f1',
+ 'varsigma;': '\u03c2',
+ 'varsubsetneq;': '\u228a\ufe00',
+ 'varsubsetneqq;': '\u2acb\ufe00',
+ 'varsupsetneq;': '\u228b\ufe00',
+ 'varsupsetneqq;': '\u2acc\ufe00',
+ 'vartheta;': '\u03d1',
+ 'vartriangleleft;': '\u22b2',
+ 'vartriangleright;': '\u22b3',
+ 'vcy;': '\u0432',
+ 'vdash;': '\u22a2',
+ 'vee;': '\u2228',
+ 'veebar;': '\u22bb',
+ 'veeeq;': '\u225a',
+ 'vellip;': '\u22ee',
+ 'verbar;': '|',
+ 'vert;': '|',
+ 'vfr;': '\u{01d533}',
+ 'vltri;': '\u22b2',
+ 'vnsub;': '\u2282\u20d2',
+ 'vnsup;': '\u2283\u20d2',
+ 'vopf;': '\u{01d567}',
+ 'vprop;': '\u221d',
+ 'vrtri;': '\u22b3',
+ 'vscr;': '\u{01d4cb}',
+ 'vsubnE;': '\u2acb\ufe00',
+ 'vsubne;': '\u228a\ufe00',
+ 'vsupnE;': '\u2acc\ufe00',
+ 'vsupne;': '\u228b\ufe00',
+ 'vzigzag;': '\u299a',
+ 'wcirc;': '\u0175',
+ 'wedbar;': '\u2a5f',
+ 'wedge;': '\u2227',
+ 'wedgeq;': '\u2259',
+ 'weierp;': '\u2118',
+ 'wfr;': '\u{01d534}',
+ 'wopf;': '\u{01d568}',
+ 'wp;': '\u2118',
+ 'wr;': '\u2240',
+ 'wreath;': '\u2240',
+ 'wscr;': '\u{01d4cc}',
+ 'xcap;': '\u22c2',
+ 'xcirc;': '\u25ef',
+ 'xcup;': '\u22c3',
+ 'xdtri;': '\u25bd',
+ 'xfr;': '\u{01d535}',
+ 'xhArr;': '\u27fa',
+ 'xharr;': '\u27f7',
+ 'xi;': '\u03be',
+ 'xlArr;': '\u27f8',
+ 'xlarr;': '\u27f5',
+ 'xmap;': '\u27fc',
+ 'xnis;': '\u22fb',
+ 'xodot;': '\u2a00',
+ 'xopf;': '\u{01d569}',
+ 'xoplus;': '\u2a01',
+ 'xotime;': '\u2a02',
+ 'xrArr;': '\u27f9',
+ 'xrarr;': '\u27f6',
+ 'xscr;': '\u{01d4cd}',
+ 'xsqcup;': '\u2a06',
+ 'xuplus;': '\u2a04',
+ 'xutri;': '\u25b3',
+ 'xvee;': '\u22c1',
+ 'xwedge;': '\u22c0',
+ 'yacute': '\xfd',
+ 'yacute;': '\xfd',
+ 'yacy;': '\u044f',
+ 'ycirc;': '\u0177',
+ 'ycy;': '\u044b',
+ 'yen': '\xa5',
+ 'yen;': '\xa5',
+ 'yfr;': '\u{01d536}',
+ 'yicy;': '\u0457',
+ 'yopf;': '\u{01d56a}',
+ 'yscr;': '\u{01d4ce}',
+ 'yucy;': '\u044e',
+ 'yuml': '\xff',
+ 'yuml;': '\xff',
+ 'zacute;': '\u017a',
+ 'zcaron;': '\u017e',
+ 'zcy;': '\u0437',
+ 'zdot;': '\u017c',
+ 'zeetrf;': '\u2128',
+ 'zeta;': '\u03b6',
+ 'zfr;': '\u{01d537}',
+ 'zhcy;': '\u0436',
+ 'zigrarr;': '\u21dd',
+ 'zopf;': '\u{01d56b}',
+ 'zscr;': '\u{01d4cf}',
+ 'zwj;': '\u200d',
+ 'zwnj;': '\u200c',
};
const Map<int, String> replacementCharacters = {
- 0x00: "\uFFFD",
- 0x0d: "\u000D",
- 0x80: "\u20AC",
- 0x81: "\u0081",
- 0x82: "\u201A",
- 0x83: "\u0192",
- 0x84: "\u201E",
- 0x85: "\u2026",
- 0x86: "\u2020",
- 0x87: "\u2021",
- 0x88: "\u02C6",
- 0x89: "\u2030",
- 0x8A: "\u0160",
- 0x8B: "\u2039",
- 0x8C: "\u0152",
- 0x8D: "\u008D",
- 0x8E: "\u017D",
- 0x8F: "\u008F",
- 0x90: "\u0090",
- 0x91: "\u2018",
- 0x92: "\u2019",
- 0x93: "\u201C",
- 0x94: "\u201D",
- 0x95: "\u2022",
- 0x96: "\u2013",
- 0x97: "\u2014",
- 0x98: "\u02DC",
- 0x99: "\u2122",
- 0x9A: "\u0161",
- 0x9B: "\u203A",
- 0x9C: "\u0153",
- 0x9D: "\u009D",
- 0x9E: "\u017E",
- 0x9F: "\u0178"
+ 0x00: '\uFFFD',
+ 0x0d: '\u000D',
+ 0x80: '\u20AC',
+ 0x81: '\u0081',
+ 0x82: '\u201A',
+ 0x83: '\u0192',
+ 0x84: '\u201E',
+ 0x85: '\u2026',
+ 0x86: '\u2020',
+ 0x87: '\u2021',
+ 0x88: '\u02C6',
+ 0x89: '\u2030',
+ 0x8A: '\u0160',
+ 0x8B: '\u2039',
+ 0x8C: '\u0152',
+ 0x8D: '\u008D',
+ 0x8E: '\u017D',
+ 0x8F: '\u008F',
+ 0x90: '\u0090',
+ 0x91: '\u2018',
+ 0x92: '\u2019',
+ 0x93: '\u201C',
+ 0x94: '\u201D',
+ 0x95: '\u2022',
+ 0x96: '\u2013',
+ 0x97: '\u2014',
+ 0x98: '\u02DC',
+ 0x99: '\u2122',
+ 0x9A: '\u0161',
+ 0x9B: '\u203A',
+ 0x9C: '\u0153',
+ 0x9D: '\u009D',
+ 0x9E: '\u017E',
+ 0x9F: '\u0178'
};
const Map<String, String> encodings = {
diff --git a/lib/src/css_class_set.dart b/lib/src/css_class_set.dart
index 939bf41..3fa49e0 100644
--- a/lib/src/css_class_set.dart
+++ b/lib/src/css_class_set.dart
@@ -14,12 +14,13 @@
ElementCssClassSet(this._element);
+ @override
Set<String> readClasses() {
var s = LinkedHashSet<String>();
var classname = _element.className;
- for (String name in classname.split(' ')) {
- String trimmed = name.trim();
+ for (var name in classname.split(' ')) {
+ var trimmed = name.trim();
if (trimmed.isNotEmpty) {
s.add(trimmed);
}
@@ -27,6 +28,7 @@
return s;
}
+ @override
void writeClasses(Set<String> s) {
_element.className = s.join(' ');
}
@@ -49,6 +51,7 @@
///
/// This is the Dart equivalent of jQuery's
/// [hasClass](http://api.jquery.com/hasClass/).
+ @override
bool contains(Object value);
/// Add the class [value] to element.
@@ -60,6 +63,7 @@
/// the set, otherwise false.
///
/// If this corresponds to many elements, null is always returned.
+ @override
bool add(String value);
/// Remove the class [value] from element, and return true on successful
@@ -67,18 +71,21 @@
///
/// This is the Dart equivalent of jQuery's
/// [removeClass](http://api.jquery.com/removeClass/).
+ @override
bool remove(Object value);
/// Add all classes specified in [iterable] to element.
///
/// This is the Dart equivalent of jQuery's
/// [addClass](http://api.jquery.com/addClass/).
+ @override
void addAll(Iterable<String> iterable);
/// Remove all classes specified in [iterable] from element.
///
/// This is the Dart equivalent of jQuery's
/// [removeClass](http://api.jquery.com/removeClass/).
+ @override
void removeAll(Iterable<Object> iterable);
/// Toggles all classes specified in [iterable] on element.
@@ -93,6 +100,7 @@
}
abstract class _CssClassSetImpl extends SetBase<String> implements CssClassSet {
+ @override
String toString() {
return readClasses().join(' ');
}
@@ -102,10 +110,11 @@
///
/// If [shouldAdd] is true, then we always add that [value] to the element. If
/// [shouldAdd] is false then we always remove [value] from the element.
+ @override
bool toggle(String value, [bool shouldAdd]) {
- Set<String> s = readClasses();
- bool result = false;
- if (shouldAdd == null) shouldAdd = !s.contains(value);
+ var s = readClasses();
+ var result = false;
+ shouldAdd ??= !s.contains(value);
if (shouldAdd) {
s.add(value);
result = true;
@@ -118,10 +127,13 @@
/// Returns [:true:] if classes cannot be added or removed from this
/// [:CssClassSet:].
+ @override
bool get frozen => false;
+ @override
Iterator<String> get iterator => readClasses().iterator;
+ @override
int get length => readClasses().length;
// interface Set - BEGIN
@@ -129,17 +141,21 @@
///
/// This is the Dart equivalent of jQuery's
/// [hasClass](http://api.jquery.com/hasClass/).
+ @override
bool contains(Object value) => readClasses().contains(value);
/// Lookup from the Set interface. Not interesting for a String set.
+ @override
String lookup(Object value) => contains(value) ? value as String : null;
+ @override
Set<String> toSet() => readClasses().toSet();
/// Add the class [value] to element.
///
/// This is the Dart equivalent of jQuery's
/// [addClass](http://api.jquery.com/addClass/).
+ @override
bool add(String value) {
// TODO - figure out if we need to do any validation here
// or if the browser natively does enough.
@@ -151,10 +167,11 @@
///
/// This is the Dart equivalent of jQuery's
/// [removeClass](http://api.jquery.com/removeClass/).
+ @override
bool remove(Object value) {
if (value is! String) return false;
- Set<String> s = readClasses();
- bool result = s.remove(value);
+ var s = readClasses();
+ var result = s.remove(value);
writeClasses(s);
return result;
}
@@ -167,6 +184,7 @@
/// If [shouldAdd] is true, then we always add all the classes in [iterable]
/// element. If [shouldAdd] is false then we always remove all the classes in
/// [iterable] from the element.
+ @override
void toggleAll(Iterable<String> iterable, [bool shouldAdd]) {
iterable.forEach((e) => toggle(e, shouldAdd));
}
@@ -178,8 +196,8 @@
///
/// After f returns, the modified set is written to the
/// className property of this element.
- bool _modify(bool f(Set<String> s)) {
- Set<String> s = readClasses();
+ bool _modify(bool Function(Set<String>) f) {
+ var s = readClasses();
var ret = f(s);
writeClasses(s);
return ret;
diff --git a/lib/src/encoding_parser.dart b/lib/src/encoding_parser.dart
index d0f40d6..51766a9 100644
--- a/lib/src/encoding_parser.dart
+++ b/lib/src/encoding_parser.dart
@@ -17,7 +17,7 @@
String _next() {
var p = __position = __position + 1;
if (p >= _length) {
- throw StateError("No more elements");
+ throw StateError('No more elements');
} else if (p < 0) {
throw RangeError(p);
}
@@ -27,7 +27,7 @@
String _previous() {
var p = __position;
if (p >= _length) {
- throw StateError("No more elements");
+ throw StateError('No more elements');
} else if (p < 0) {
throw RangeError(p);
}
@@ -37,14 +37,14 @@
set _position(int value) {
if (__position >= _length) {
- throw StateError("No more elements");
+ throw StateError('No more elements');
}
__position = value;
}
int get _position {
if (__position >= _length) {
- throw StateError("No more elements");
+ throw StateError('No more elements');
}
if (__position >= 0) {
return __position;
@@ -57,7 +57,7 @@
/// Skip past a list of characters. Defaults to skipping [isWhitespace].
String _skipChars([_CharPredicate skipChars]) {
- if (skipChars == null) skipChars = isWhitespace;
+ skipChars ??= isWhitespace;
var p = _position; // use property for the error-checking
while (p < _length) {
var c = _bytes[p];
@@ -108,12 +108,12 @@
__position = newPosition + bytes.length - 1;
return true;
} else {
- throw StateError("No more elements");
+ throw StateError('No more elements');
}
}
String _slice(int start, [int end]) {
- if (end == null) end = _length;
+ end ??= _length;
if (end < 0) end += _length;
return _bytes.substring(start, end);
}
@@ -140,12 +140,12 @@
String getEncoding() {
final methodDispatch = [
- _DispatchEntry("<!--", _handleComment),
- _DispatchEntry("<meta", _handleMeta),
- _DispatchEntry("</", _handlePossibleEndTag),
- _DispatchEntry("<!", _handleOther),
- _DispatchEntry("<?", _handleOther),
- _DispatchEntry("<", _handlePossibleStartTag),
+ _DispatchEntry('<!--', _handleComment),
+ _DispatchEntry('<meta', _handleMeta),
+ _DispatchEntry('</', _handlePossibleEndTag),
+ _DispatchEntry('<!', _handleOther),
+ _DispatchEntry('<?', _handleOther),
+ _DispatchEntry('<', _handlePossibleStartTag),
];
try {
@@ -169,7 +169,7 @@
}
/// Skip over comments.
- bool _handleComment() => _data._jumpTo("-->");
+ bool _handleComment() => _data._jumpTo('-->');
bool _handleMeta() {
if (!isWhitespace(_data._currentByte)) {
@@ -182,14 +182,14 @@
var attr = _getAttribute();
if (attr == null) return true;
- if (attr[0] == "charset") {
+ if (attr[0] == 'charset') {
var tentativeEncoding = attr[1];
var codec = codecName(tentativeEncoding);
if (codec != null) {
_encoding = codec;
return false;
}
- } else if (attr[0] == "content") {
+ } else if (attr[0] == 'content') {
var contentParser = ContentAttrParser(EncodingBytes(attr[1]));
var tentativeEncoding = contentParser.parse();
var codec = codecName(tentativeEncoding);
@@ -221,7 +221,7 @@
}
var c = _data._skipUntil(_isSpaceOrAngleBracket);
- if (c == "<") {
+ if (c == '<') {
// return to the first step in the overall "two step" algorithm
// reprocessing the < byte
_data._previous();
@@ -235,15 +235,15 @@
return true;
}
- bool _handleOther() => _data._jumpTo(">");
+ bool _handleOther() => _data._jumpTo('>');
/// Return a name,value pair for the next attribute in the stream,
/// if one is found, or null
List<String> _getAttribute() {
// Step 1 (skip chars)
- var c = _data._skipChars((x) => x == "/" || isWhitespace(x));
+ var c = _data._skipChars((x) => x == '/' || isWhitespace(x));
// Step 2
- if (c == ">" || c == null) {
+ if (c == '>' || c == null) {
return null;
}
// Step 3
@@ -253,15 +253,15 @@
while (true) {
if (c == null) {
return null;
- } else if (c == "=" && attrName.isNotEmpty) {
+ } else if (c == '=' && attrName.isNotEmpty) {
break;
} else if (isWhitespace(c)) {
// Step 6!
c = _data._skipChars();
c = _data._next();
break;
- } else if (c == "/" || c == ">") {
- return [attrName.join(), ""];
+ } else if (c == '/' || c == '>') {
+ return [attrName.join(), ''];
} else if (isLetter(c)) {
attrName.add(c.toLowerCase());
} else {
@@ -271,9 +271,9 @@
c = _data._next();
}
// Step 7
- if (c != "=") {
+ if (c != '=') {
_data._previous();
- return [attrName.join(), ""];
+ return [attrName.join(), ''];
}
// Step 8
_data._next();
@@ -298,8 +298,8 @@
attrValue.add(c);
}
}
- } else if (c == ">") {
- return [attrName.join(), ""];
+ } else if (c == '>') {
+ return [attrName.join(), ''];
} else if (c == null) {
return null;
} else if (isLetter(c)) {
@@ -332,10 +332,10 @@
try {
// Check if the attr name is charset
// otherwise return
- data._jumpTo("charset");
+ data._jumpTo('charset');
data._position += 1;
data._skipChars();
- if (data._currentByte != "=") {
+ if (data._currentByte != '=') {
// If there is no = sign keep looking for attrs
return null;
}
@@ -369,7 +369,7 @@
}
bool _isSpaceOrAngleBracket(String char) {
- return char == ">" || char == "<" || isWhitespace(char);
+ return char == '>' || char == '<' || isWhitespace(char);
}
typedef _CharPredicate = bool Function(String char);
diff --git a/lib/src/html_input_stream.dart b/lib/src/html_input_stream.dart
index 4590c5d..0b72da7 100644
--- a/lib/src/html_input_stream.dart
+++ b/lib/src/html_input_stream.dart
@@ -91,14 +91,12 @@
_lineStarts = <int>[0];
_chars = <int>[];
- if (_rawChars == null) {
- _rawChars = _decodeBytes(charEncodingName, _rawBytes);
- }
+ _rawChars ??= _decodeBytes(charEncodingName, _rawBytes);
- bool skipNewline = false;
- bool wasSurrogatePair = false;
- for (int i = 0; i < _rawChars.length; i++) {
- int c = _rawChars[i];
+ var skipNewline = false;
+ var wasSurrogatePair = false;
+ for (var i = 0; i < _rawChars.length; i++) {
+ var c = _rawChars[i];
if (skipNewline) {
skipNewline = false;
if (c == NEWLINE) continue;
@@ -241,7 +239,7 @@
/// Returns a string of characters from the stream up to but not
/// including any character in 'characters' or EOF.
String charsUntil(String characters, [bool opposite = false]) {
- int start = _offset;
+ var start = _offset;
String c;
while ((c = peekChar()) != null && characters.contains(c) == opposite) {
_offset += c.codeUnits.length;
@@ -313,7 +311,7 @@
/// string doesn't correspond to a valid encoding.
String codecName(String encoding) {
final asciiPunctuation = RegExp(
- "[\u0009-\u000D\u0020-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u007E]");
+ '[\u0009-\u000D\u0020-\u002F\u003A-\u0040\u005B-\u0060\u007B-\u007E]');
if (encoding == null) return null;
var canonicalName = encoding.replaceAll(asciiPunctuation, '').toLowerCase();
@@ -324,7 +322,7 @@
/// Since UTF-8 doesn't have byte order, it's somewhat of a misnomer, but it is
/// used in HTML to detect the UTF-
bool _hasUtf8Bom(List<int> bytes, [int offset = 0, int length]) {
- int end = length != null ? offset + length : bytes.length;
+ var end = length != null ? offset + length : bytes.length;
return (offset + 3) <= end &&
bytes[offset] == 0xEF &&
bytes[offset + 1] == 0xBB &&
diff --git a/lib/src/list_proxy.dart b/lib/src/list_proxy.dart
index 63aeea6..ef271ab 100644
--- a/lib/src/list_proxy.dart
+++ b/lib/src/list_proxy.dart
@@ -7,40 +7,52 @@
/// The inner [List<T>] with the actual storage.
final List<E> _list = <E>[];
+ @override
bool remove(Object item) => _list.remove(item);
+ @override
int get length => _list.length;
// From Iterable
+ @override
Iterator<E> get iterator => _list.iterator;
// From List
+ @override
E operator [](int index) => _list[index];
+ @override
operator []=(int index, E value) {
_list[index] = value;
}
+ @override
set length(int value) {
_list.length = value;
}
+ @override
void add(E value) {
_list.add(value);
}
+ @override
void insert(int index, E item) => _list.insert(index, item);
+ @override
void addAll(Iterable<E> collection) {
_list.addAll(collection);
}
+ @override
void insertAll(int index, Iterable<E> iterable) {
_list.insertAll(index, iterable);
}
+ @override
E removeAt(int index) => _list.removeAt(index);
+ @override
void removeRange(int start, int length) {
_list.removeRange(start, length);
}
diff --git a/lib/src/query_selector.dart b/lib/src/query_selector.dart
index 0503707..0c660b7 100644
--- a/lib/src/query_selector.dart
+++ b/lib/src/query_selector.dart
@@ -58,9 +58,11 @@
}
}
+ @override
bool visitSelectorGroup(SelectorGroup group) =>
group.selectors.any(visitSelector);
+ @override
bool visitSelector(Selector selector) {
var old = _element;
var result = true;
@@ -123,13 +125,14 @@
return result;
}
- _unimplemented(SimpleSelector selector) =>
+ UnimplementedError _unimplemented(SimpleSelector selector) =>
UnimplementedError("'$selector' selector of type "
- "${selector.runtimeType} is not implemented");
+ '${selector.runtimeType} is not implemented');
- _unsupported(selector) =>
+ FormatException _unsupported(selector) =>
FormatException("'$selector' is not a valid selector");
+ @override
bool visitPseudoClassSelector(PseudoClassSelector selector) {
switch (selector.name) {
// http://dev.w3.org/csswg/selectors-4/#structural-pseudos
@@ -179,6 +182,7 @@
throw _unimplemented(selector);
}
+ @override
bool visitPseudoElementSelector(PseudoElementSelector selector) {
// :before, :after, :first-letter/line can't match DOM elements.
if (_isLegacyPsuedoClass(selector.name)) return false;
@@ -198,9 +202,11 @@
}
}
+ @override
bool visitPseudoElementFunctionSelector(PseudoElementFunctionSelector s) =>
throw _unimplemented(s);
+ @override
bool visitPseudoClassFunctionSelector(PseudoClassFunctionSelector selector) {
switch (selector.name) {
// http://dev.w3.org/csswg/selectors-4/#child-index
@@ -239,6 +245,7 @@
return null;
}
+ @override
bool visitNamespaceSelector(NamespaceSelector selector) {
// Match element tag name
if (!selector.nameAsSimpleSelector.visit(this)) return false;
@@ -250,20 +257,25 @@
throw _unimplemented(selector);
}
+ @override
bool visitElementSelector(ElementSelector selector) =>
selector.isWildcard || _element.localName == selector.name.toLowerCase();
+ @override
bool visitIdSelector(IdSelector selector) => _element.id == selector.name;
+ @override
bool visitClassSelector(ClassSelector selector) =>
_element.classes.contains(selector.name);
// TODO(jmesserly): negation should support any selectors in level 4,
// not just simple selectors.
// http://dev.w3.org/csswg/selectors-4/#negation
+ @override
bool visitNegationSelector(NegationSelector selector) =>
!selector.negationArg.visit(this);
+ @override
bool visitAttributeSelector(AttributeSelector selector) {
// Match name first
var value = _element.attributes[selector.name.toLowerCase()];
diff --git a/lib/src/token.dart b/lib/src/token.dart
index ea0a855..e92ec8e 100644
--- a/lib/src/token.dart
+++ b/lib/src/token.dart
@@ -39,6 +39,7 @@
this.namespace})
: super(name, selfClosing);
+ @override
int get kind => TokenKind.startTag;
}
@@ -46,6 +47,7 @@
EndTagToken(String name, {bool selfClosing = false})
: super(name, selfClosing);
+ @override
int get kind => TokenKind.endTag;
}
@@ -77,12 +79,14 @@
ParseErrorToken(String data, {this.messageParams}) : super(data);
+ @override
int get kind => TokenKind.parseError;
}
class CharactersToken extends StringToken {
CharactersToken([String data]) : super(data);
+ @override
int get kind => TokenKind.characters;
/// Replaces the token's [data]. This should only be used to wholly replace
@@ -96,23 +100,26 @@
class SpaceCharactersToken extends StringToken {
SpaceCharactersToken([String data]) : super(data);
+ @override
int get kind => TokenKind.spaceCharacters;
}
class CommentToken extends StringToken {
CommentToken([String data]) : super(data);
+ @override
int get kind => TokenKind.comment;
}
class DoctypeToken extends Token {
String publicId;
String systemId;
- String name = "";
+ String name = '';
bool correct;
DoctypeToken({this.publicId, this.systemId, this.correct = false});
+ @override
int get kind => TokenKind.doctype;
}
diff --git a/lib/src/tokenizer.dart b/lib/src/tokenizer.dart
index 638663e..cf67744 100644
--- a/lib/src/tokenizer.dart
+++ b/lib/src/tokenizer.dart
@@ -84,6 +84,7 @@
StringToken get currentStringToken => currentToken;
Token _current;
+ @override
Token get current => _current;
final StringBuffer _attributeName = StringBuffer();
@@ -107,7 +108,7 @@
void _markAttributeNameEnd(int offset) => _markAttributeEnd(offset);
void _addAttribute(String name) {
- if (_attributes == null) _attributes = [];
+ _attributes ??= [];
_attributeName.clear();
_attributeName.write(name);
_attributeValue.clear();
@@ -121,6 +122,7 @@
/// We do our usually processing through the states and when we have a token
/// to return we yield the token which pauses processing until the next token
/// is requested.
+ @override
bool moveNext() {
// Start processing. When EOF is reached state will return false;
// instead of true and the loop will terminate.
@@ -154,7 +156,7 @@
/// Adds a token to the queue. Sets the span if needed.
void _addToken(Token token) {
if (generateSpans && token.span == null) {
- int offset = stream.position;
+ var offset = stream.position;
token.span = stream.fileInfo.span(_lastOffset, offset);
if (token is! ParseErrorToken) {
_lastOffset = offset;
@@ -190,13 +192,13 @@
// Certain characters get replaced with others
var char = replacementCharacters[charAsInt];
if (char != null) {
- _addToken(ParseErrorToken("illegal-codepoint-for-numeric-entity",
- messageParams: {"charAsInt": charAsInt}));
+ _addToken(ParseErrorToken('illegal-codepoint-for-numeric-entity',
+ messageParams: {'charAsInt': charAsInt}));
} else if ((0xD800 <= charAsInt && charAsInt <= 0xDFFF) ||
(charAsInt > 0x10FFFF)) {
- char = "\uFFFD";
- _addToken(ParseErrorToken("illegal-codepoint-for-numeric-entity",
- messageParams: {"charAsInt": charAsInt}));
+ char = '\uFFFD';
+ _addToken(ParseErrorToken('illegal-codepoint-for-numeric-entity',
+ messageParams: {'charAsInt': charAsInt}));
} else {
// Should speed up this check somehow (e.g. move the set to a constant)
if ((0x0001 <= charAsInt && charAsInt <= 0x0008) ||
@@ -240,16 +242,16 @@
0x10FFFE,
0x10FFFF
].contains(charAsInt)) {
- _addToken(ParseErrorToken("illegal-codepoint-for-numeric-entity",
- messageParams: {"charAsInt": charAsInt}));
+ _addToken(ParseErrorToken('illegal-codepoint-for-numeric-entity',
+ messageParams: {'charAsInt': charAsInt}));
}
char = String.fromCharCodes([charAsInt]);
}
// Discard the ; if present. Otherwise, put it back on the queue and
// invoke parseError on parser.
- if (c != ";") {
- _addToken(ParseErrorToken("numeric-entity-without-semicolon"));
+ if (c != ';') {
+ _addToken(ParseErrorToken('numeric-entity-without-semicolon'));
stream.unget(c);
}
return char;
@@ -257,7 +259,7 @@
void consumeEntity({String allowedChar, bool fromAttribute = false}) {
// Initialise to the default output for when no entity is matched
- var output = "&";
+ var output = '&';
var charStack = [stream.char()];
if (isWhitespace(charStack[0]) ||
@@ -266,9 +268,9 @@
charStack[0] == eof ||
allowedChar == charStack[0]) {
stream.unget(charStack[0]);
- } else if (charStack[0] == "#") {
+ } else if (charStack[0] == '#') {
// Read the next character to see if it's hex or decimal
- bool hex = false;
+ var hex = false;
charStack.add(stream.char());
if (charStack.last == 'x' || charStack.last == 'X') {
hex = true;
@@ -283,9 +285,9 @@
output = consumeNumberEntity(hex);
} else {
// No digits found
- _addToken(ParseErrorToken("expected-numeric-entity"));
+ _addToken(ParseErrorToken('expected-numeric-entity'));
stream.unget(charStack.removeLast());
- output = "&${charStack.join()}";
+ output = '&${charStack.join()}';
}
} else {
// At this point in the process might have named entity. Entities
@@ -293,8 +295,7 @@
//
// Consume characters and compare to these to a substring of the
// entity names in the list until the substring no longer matches.
- var filteredEntityList = entitiesByFirstChar[charStack[0]];
- if (filteredEntityList == null) filteredEntityList = const [];
+ var filteredEntityList = entitiesByFirstChar[charStack[0]] ?? const [];
while (charStack.last != eof) {
var name = charStack.join();
@@ -325,24 +326,24 @@
if (entityName != null) {
var lastChar = entityName[entityName.length - 1];
- if (lastChar != ";") {
- _addToken(ParseErrorToken("named-entity-without-semicolon"));
+ if (lastChar != ';') {
+ _addToken(ParseErrorToken('named-entity-without-semicolon'));
}
- if (lastChar != ";" &&
+ if (lastChar != ';' &&
fromAttribute &&
(isLetterOrDigit(charStack[entityLen]) ||
charStack[entityLen] == '=')) {
stream.unget(charStack.removeLast());
- output = "&${charStack.join()}";
+ output = '&${charStack.join()}';
} else {
output = entities[entityName];
stream.unget(charStack.removeLast());
output = '$output${slice(charStack, entityLen).join()}';
}
} else {
- _addToken(ParseErrorToken("expected-named-entity"));
+ _addToken(ParseErrorToken('expected-named-entity'));
stream.unget(charStack.removeLast());
- output = "&${charStack.join()}";
+ output = '&${charStack.join()}';
}
}
if (fromAttribute) {
@@ -375,10 +376,10 @@
}
if (token is EndTagToken) {
if (_attributes != null) {
- _addToken(ParseErrorToken("attributes-in-end-tag"));
+ _addToken(ParseErrorToken('attributes-in-end-tag'));
}
if (token.selfClosing) {
- _addToken(ParseErrorToken("this-closing-flag-on-end-tag"));
+ _addToken(ParseErrorToken('this-closing-flag-on-end-tag'));
}
} else if (token is StartTagToken) {
// HTML5 specific normalizations to the token stream.
@@ -402,13 +403,13 @@
bool dataState() {
var data = stream.char();
- if (data == "&") {
+ if (data == '&') {
state = entityDataState;
- } else if (data == "<") {
+ } else if (data == '<') {
state = tagOpenState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
- _addToken(CharactersToken("\u0000"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
+ _addToken(CharactersToken('\u0000'));
} else if (data == eof) {
// Tokenization ends.
return false;
@@ -422,7 +423,7 @@
// have already been appended to lastFourChars and will have broken
// any <!-- or --> sequences
} else {
- var chars = stream.charsUntil("&<\u0000");
+ var chars = stream.charsUntil('&<\u0000');
_addToken(CharactersToken('$data$chars'));
}
return true;
@@ -436,16 +437,16 @@
bool rcdataState() {
var data = stream.char();
- if (data == "&") {
+ if (data == '&') {
state = characterReferenceInRcdata;
- } else if (data == "<") {
+ } else if (data == '<') {
state = rcdataLessThanSignState;
} else if (data == eof) {
// Tokenization ends.
return false;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
- _addToken(CharactersToken("\uFFFD"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
+ _addToken(CharactersToken('\uFFFD'));
} else if (isWhitespace(data)) {
// Directly after emitting a token you switch back to the "data
// state". At that point spaceCharacters are important so they are
@@ -453,7 +454,7 @@
_addToken(SpaceCharactersToken(
'$data${stream.charsUntil(spaceCharacters, true)}'));
} else {
- var chars = stream.charsUntil("&<");
+ var chars = stream.charsUntil('&<');
_addToken(CharactersToken('$data$chars'));
}
return true;
@@ -467,34 +468,34 @@
bool rawtextState() {
var data = stream.char();
- if (data == "<") {
+ if (data == '<') {
state = rawtextLessThanSignState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
- _addToken(CharactersToken("\uFFFD"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
+ _addToken(CharactersToken('\uFFFD'));
} else if (data == eof) {
// Tokenization ends.
return false;
} else {
- var chars = stream.charsUntil("<\u0000");
- _addToken(CharactersToken("$data$chars"));
+ var chars = stream.charsUntil('<\u0000');
+ _addToken(CharactersToken('$data$chars'));
}
return true;
}
bool scriptDataState() {
var data = stream.char();
- if (data == "<") {
+ if (data == '<') {
state = scriptDataLessThanSignState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
- _addToken(CharactersToken("\uFFFD"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
+ _addToken(CharactersToken('\uFFFD'));
} else if (data == eof) {
// Tokenization ends.
return false;
} else {
- var chars = stream.charsUntil("<\u0000");
- _addToken(CharactersToken("$data$chars"));
+ var chars = stream.charsUntil('<\u0000');
+ _addToken(CharactersToken('$data$chars'));
}
return true;
}
@@ -504,9 +505,9 @@
if (data == eof) {
// Tokenization ends.
return false;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
- _addToken(CharactersToken("\uFFFD"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
+ _addToken(CharactersToken('\uFFFD'));
} else {
_addToken(CharactersToken('$data${stream.charsUntil("\u0000")}'));
}
@@ -515,29 +516,29 @@
bool tagOpenState() {
var data = stream.char();
- if (data == "!") {
+ if (data == '!') {
state = markupDeclarationOpenState;
- } else if (data == "/") {
+ } else if (data == '/') {
state = closeTagOpenState;
} else if (isLetter(data)) {
currentToken = StartTagToken(data);
state = tagNameState;
- } else if (data == ">") {
+ } else if (data == '>') {
// XXX In theory it could be something besides a tag name. But
// do we really care?
- _addToken(ParseErrorToken("expected-tag-name-but-got-right-bracket"));
- _addToken(CharactersToken("<>"));
+ _addToken(ParseErrorToken('expected-tag-name-but-got-right-bracket'));
+ _addToken(CharactersToken('<>'));
state = dataState;
- } else if (data == "?") {
+ } else if (data == '?') {
// XXX In theory it could be something besides a tag name. But
// do we really care?
- _addToken(ParseErrorToken("expected-tag-name-but-got-question-mark"));
+ _addToken(ParseErrorToken('expected-tag-name-but-got-question-mark'));
stream.unget(data);
state = bogusCommentState;
} else {
// XXX
- _addToken(ParseErrorToken("expected-tag-name"));
- _addToken(CharactersToken("<"));
+ _addToken(ParseErrorToken('expected-tag-name'));
+ _addToken(CharactersToken('<'));
stream.unget(data);
state = dataState;
}
@@ -549,17 +550,17 @@
if (isLetter(data)) {
currentToken = EndTagToken(data);
state = tagNameState;
- } else if (data == ">") {
- _addToken(ParseErrorToken("expected-closing-tag-but-got-right-bracket"));
+ } else if (data == '>') {
+ _addToken(ParseErrorToken('expected-closing-tag-but-got-right-bracket'));
state = dataState;
} else if (data == eof) {
- _addToken(ParseErrorToken("expected-closing-tag-but-got-eof"));
- _addToken(CharactersToken("</"));
+ _addToken(ParseErrorToken('expected-closing-tag-but-got-eof'));
+ _addToken(CharactersToken('</'));
state = dataState;
} else {
// XXX data can be _'_...
- _addToken(ParseErrorToken("expected-closing-tag-but-got-char",
- messageParams: {"data": data}));
+ _addToken(ParseErrorToken('expected-closing-tag-but-got-char',
+ messageParams: {'data': data}));
stream.unget(data);
state = bogusCommentState;
}
@@ -570,15 +571,15 @@
var data = stream.char();
if (isWhitespace(data)) {
state = beforeAttributeNameState;
- } else if (data == ">") {
+ } else if (data == '>') {
emitCurrentToken();
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-tag-name"));
+ _addToken(ParseErrorToken('eof-in-tag-name'));
state = dataState;
- } else if (data == "/") {
+ } else if (data == '/') {
state = selfClosingStartTagState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
currentTagToken.name = '${currentTagToken.name}\uFFFD';
} else {
currentTagToken.name = '${currentTagToken.name}$data';
@@ -590,11 +591,11 @@
bool rcdataLessThanSignState() {
var data = stream.char();
- if (data == "/") {
+ if (data == '/') {
_buffer.clear();
state = rcdataEndTagOpenState;
} else {
- _addToken(CharactersToken("<"));
+ _addToken(CharactersToken('<'));
stream.unget(data);
state = rcdataState;
}
@@ -607,7 +608,7 @@
_buffer.write(data);
state = rcdataEndTagNameState;
} else {
- _addToken(CharactersToken("</"));
+ _addToken(CharactersToken('</'));
stream.unget(data);
state = rcdataState;
}
@@ -626,17 +627,17 @@
if (isWhitespace(data) && appropriate) {
currentToken = EndTagToken('$_buffer');
state = beforeAttributeNameState;
- } else if (data == "/" && appropriate) {
+ } else if (data == '/' && appropriate) {
currentToken = EndTagToken('$_buffer');
state = selfClosingStartTagState;
- } else if (data == ">" && appropriate) {
+ } else if (data == '>' && appropriate) {
currentToken = EndTagToken('$_buffer');
emitCurrentToken();
state = dataState;
} else if (isLetter(data)) {
_buffer.write(data);
} else {
- _addToken(CharactersToken("</$_buffer"));
+ _addToken(CharactersToken('</$_buffer'));
stream.unget(data);
state = rcdataState;
}
@@ -645,11 +646,11 @@
bool rawtextLessThanSignState() {
var data = stream.char();
- if (data == "/") {
+ if (data == '/') {
_buffer.clear();
state = rawtextEndTagOpenState;
} else {
- _addToken(CharactersToken("<"));
+ _addToken(CharactersToken('<'));
stream.unget(data);
state = rawtextState;
}
@@ -662,7 +663,7 @@
_buffer.write(data);
state = rawtextEndTagNameState;
} else {
- _addToken(CharactersToken("</"));
+ _addToken(CharactersToken('</'));
stream.unget(data);
state = rawtextState;
}
@@ -675,17 +676,17 @@
if (isWhitespace(data) && appropriate) {
currentToken = EndTagToken('$_buffer');
state = beforeAttributeNameState;
- } else if (data == "/" && appropriate) {
+ } else if (data == '/' && appropriate) {
currentToken = EndTagToken('$_buffer');
state = selfClosingStartTagState;
- } else if (data == ">" && appropriate) {
+ } else if (data == '>' && appropriate) {
currentToken = EndTagToken('$_buffer');
emitCurrentToken();
state = dataState;
} else if (isLetter(data)) {
_buffer.write(data);
} else {
- _addToken(CharactersToken("</$_buffer"));
+ _addToken(CharactersToken('</$_buffer'));
stream.unget(data);
state = rawtextState;
}
@@ -694,14 +695,14 @@
bool scriptDataLessThanSignState() {
var data = stream.char();
- if (data == "/") {
+ if (data == '/') {
_buffer.clear();
state = scriptDataEndTagOpenState;
- } else if (data == "!") {
- _addToken(CharactersToken("<!"));
+ } else if (data == '!') {
+ _addToken(CharactersToken('<!'));
state = scriptDataEscapeStartState;
} else {
- _addToken(CharactersToken("<"));
+ _addToken(CharactersToken('<'));
stream.unget(data);
state = scriptDataState;
}
@@ -714,7 +715,7 @@
_buffer.write(data);
state = scriptDataEndTagNameState;
} else {
- _addToken(CharactersToken("</"));
+ _addToken(CharactersToken('</'));
stream.unget(data);
state = scriptDataState;
}
@@ -727,17 +728,17 @@
if (isWhitespace(data) && appropriate) {
currentToken = EndTagToken('$_buffer');
state = beforeAttributeNameState;
- } else if (data == "/" && appropriate) {
+ } else if (data == '/' && appropriate) {
currentToken = EndTagToken('$_buffer');
state = selfClosingStartTagState;
- } else if (data == ">" && appropriate) {
+ } else if (data == '>' && appropriate) {
currentToken = EndTagToken('$_buffer');
emitCurrentToken();
state = dataState;
} else if (isLetter(data)) {
_buffer.write(data);
} else {
- _addToken(CharactersToken("</$_buffer"));
+ _addToken(CharactersToken('</$_buffer'));
stream.unget(data);
state = scriptDataState;
}
@@ -746,8 +747,8 @@
bool scriptDataEscapeStartState() {
var data = stream.char();
- if (data == "-") {
- _addToken(CharactersToken("-"));
+ if (data == '-') {
+ _addToken(CharactersToken('-'));
state = scriptDataEscapeStartDashState;
} else {
stream.unget(data);
@@ -758,8 +759,8 @@
bool scriptDataEscapeStartDashState() {
var data = stream.char();
- if (data == "-") {
- _addToken(CharactersToken("-"));
+ if (data == '-') {
+ _addToken(CharactersToken('-'));
state = scriptDataEscapedDashDashState;
} else {
stream.unget(data);
@@ -770,33 +771,33 @@
bool scriptDataEscapedState() {
var data = stream.char();
- if (data == "-") {
- _addToken(CharactersToken("-"));
+ if (data == '-') {
+ _addToken(CharactersToken('-'));
state = scriptDataEscapedDashState;
- } else if (data == "<") {
+ } else if (data == '<') {
state = scriptDataEscapedLessThanSignState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
- _addToken(CharactersToken("\uFFFD"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
+ _addToken(CharactersToken('\uFFFD'));
} else if (data == eof) {
state = dataState;
} else {
- var chars = stream.charsUntil("<-\u0000");
- _addToken(CharactersToken("$data$chars"));
+ var chars = stream.charsUntil('<-\u0000');
+ _addToken(CharactersToken('$data$chars'));
}
return true;
}
bool scriptDataEscapedDashState() {
var data = stream.char();
- if (data == "-") {
- _addToken(CharactersToken("-"));
+ if (data == '-') {
+ _addToken(CharactersToken('-'));
state = scriptDataEscapedDashDashState;
- } else if (data == "<") {
+ } else if (data == '<') {
state = scriptDataEscapedLessThanSignState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
- _addToken(CharactersToken("\uFFFD"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
+ _addToken(CharactersToken('\uFFFD'));
state = scriptDataEscapedState;
} else if (data == eof) {
state = dataState;
@@ -809,16 +810,16 @@
bool scriptDataEscapedDashDashState() {
var data = stream.char();
- if (data == "-") {
- _addToken(CharactersToken("-"));
- } else if (data == "<") {
+ if (data == '-') {
+ _addToken(CharactersToken('-'));
+ } else if (data == '<') {
state = scriptDataEscapedLessThanSignState;
- } else if (data == ">") {
- _addToken(CharactersToken(">"));
+ } else if (data == '>') {
+ _addToken(CharactersToken('>'));
state = scriptDataState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
- _addToken(CharactersToken("\uFFFD"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
+ _addToken(CharactersToken('\uFFFD'));
state = scriptDataEscapedState;
} else if (data == eof) {
state = dataState;
@@ -831,16 +832,16 @@
bool scriptDataEscapedLessThanSignState() {
var data = stream.char();
- if (data == "/") {
+ if (data == '/') {
_buffer.clear();
state = scriptDataEscapedEndTagOpenState;
} else if (isLetter(data)) {
- _addToken(CharactersToken("<$data"));
+ _addToken(CharactersToken('<$data'));
_buffer.clear();
_buffer.write(data);
state = scriptDataDoubleEscapeStartState;
} else {
- _addToken(CharactersToken("<"));
+ _addToken(CharactersToken('<'));
stream.unget(data);
state = scriptDataEscapedState;
}
@@ -854,7 +855,7 @@
_buffer.write(data);
state = scriptDataEscapedEndTagNameState;
} else {
- _addToken(CharactersToken("</"));
+ _addToken(CharactersToken('</'));
stream.unget(data);
state = scriptDataEscapedState;
}
@@ -867,17 +868,17 @@
if (isWhitespace(data) && appropriate) {
currentToken = EndTagToken('$_buffer');
state = beforeAttributeNameState;
- } else if (data == "/" && appropriate) {
+ } else if (data == '/' && appropriate) {
currentToken = EndTagToken('$_buffer');
state = selfClosingStartTagState;
- } else if (data == ">" && appropriate) {
+ } else if (data == '>' && appropriate) {
currentToken = EndTagToken('$_buffer');
emitCurrentToken();
state = dataState;
} else if (isLetter(data)) {
_buffer.write(data);
} else {
- _addToken(CharactersToken("</$_buffer"));
+ _addToken(CharactersToken('</$_buffer'));
stream.unget(data);
state = scriptDataEscapedState;
}
@@ -886,9 +887,9 @@
bool scriptDataDoubleEscapeStartState() {
var data = stream.char();
- if (isWhitespace(data) || data == "/" || data == ">") {
+ if (isWhitespace(data) || data == '/' || data == '>') {
_addToken(CharactersToken(data));
- if ('$_buffer'.toLowerCase() == "script") {
+ if ('$_buffer'.toLowerCase() == 'script') {
state = scriptDataDoubleEscapedState;
} else {
state = scriptDataEscapedState;
@@ -905,17 +906,17 @@
bool scriptDataDoubleEscapedState() {
var data = stream.char();
- if (data == "-") {
- _addToken(CharactersToken("-"));
+ if (data == '-') {
+ _addToken(CharactersToken('-'));
state = scriptDataDoubleEscapedDashState;
- } else if (data == "<") {
- _addToken(CharactersToken("<"));
+ } else if (data == '<') {
+ _addToken(CharactersToken('<'));
state = scriptDataDoubleEscapedLessThanSignState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
- _addToken(CharactersToken("\uFFFD"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
+ _addToken(CharactersToken('\uFFFD'));
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-script-in-script"));
+ _addToken(ParseErrorToken('eof-in-script-in-script'));
state = dataState;
} else {
_addToken(CharactersToken(data));
@@ -925,18 +926,18 @@
bool scriptDataDoubleEscapedDashState() {
var data = stream.char();
- if (data == "-") {
- _addToken(CharactersToken("-"));
+ if (data == '-') {
+ _addToken(CharactersToken('-'));
state = scriptDataDoubleEscapedDashDashState;
- } else if (data == "<") {
- _addToken(CharactersToken("<"));
+ } else if (data == '<') {
+ _addToken(CharactersToken('<'));
state = scriptDataDoubleEscapedLessThanSignState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
- _addToken(CharactersToken("\uFFFD"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
+ _addToken(CharactersToken('\uFFFD'));
state = scriptDataDoubleEscapedState;
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-script-in-script"));
+ _addToken(ParseErrorToken('eof-in-script-in-script'));
state = dataState;
} else {
_addToken(CharactersToken(data));
@@ -949,20 +950,20 @@
// (was "Dash" instead of "DashDash")
bool scriptDataDoubleEscapedDashDashState() {
var data = stream.char();
- if (data == "-") {
- _addToken(CharactersToken("-"));
- } else if (data == "<") {
- _addToken(CharactersToken("<"));
+ if (data == '-') {
+ _addToken(CharactersToken('-'));
+ } else if (data == '<') {
+ _addToken(CharactersToken('<'));
state = scriptDataDoubleEscapedLessThanSignState;
- } else if (data == ">") {
- _addToken(CharactersToken(">"));
+ } else if (data == '>') {
+ _addToken(CharactersToken('>'));
state = scriptDataState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
- _addToken(CharactersToken("\uFFFD"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
+ _addToken(CharactersToken('\uFFFD'));
state = scriptDataDoubleEscapedState;
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-script-in-script"));
+ _addToken(ParseErrorToken('eof-in-script-in-script'));
state = dataState;
} else {
_addToken(CharactersToken(data));
@@ -973,8 +974,8 @@
bool scriptDataDoubleEscapedLessThanSignState() {
var data = stream.char();
- if (data == "/") {
- _addToken(CharactersToken("/"));
+ if (data == '/') {
+ _addToken(CharactersToken('/'));
_buffer.clear();
state = scriptDataDoubleEscapeEndState;
} else {
@@ -986,9 +987,9 @@
bool scriptDataDoubleEscapeEndState() {
var data = stream.char();
- if (isWhitespace(data) || data == "/" || data == ">") {
+ if (isWhitespace(data) || data == '/' || data == '>') {
_addToken(CharactersToken(data));
- if ('$_buffer'.toLowerCase() == "script") {
+ if ('$_buffer'.toLowerCase() == 'script') {
state = scriptDataEscapedState;
} else {
state = scriptDataDoubleEscapedState;
@@ -1010,20 +1011,20 @@
} else if (isLetter(data)) {
_addAttribute(data);
state = attributeNameState;
- } else if (data == ">") {
+ } else if (data == '>') {
emitCurrentToken();
- } else if (data == "/") {
+ } else if (data == '/') {
state = selfClosingStartTagState;
} else if (data == eof) {
- _addToken(ParseErrorToken("expected-attribute-name-but-got-eof"));
+ _addToken(ParseErrorToken('expected-attribute-name-but-got-eof'));
state = dataState;
} else if ("'\"=<".contains(data)) {
- _addToken(ParseErrorToken("invalid-character-in-attribute-name"));
+ _addToken(ParseErrorToken('invalid-character-in-attribute-name'));
_addAttribute(data);
state = attributeNameState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
- _addAttribute("\uFFFD");
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
+ _addAttribute('\uFFFD');
state = attributeNameState;
} else {
_addAttribute(data);
@@ -1034,32 +1035,32 @@
bool attributeNameState() {
var data = stream.char();
- bool leavingThisState = true;
- bool emitToken = false;
- if (data == "=") {
+ var leavingThisState = true;
+ var emitToken = false;
+ if (data == '=') {
state = beforeAttributeValueState;
} else if (isLetter(data)) {
_attributeName.write(data);
_attributeName.write(stream.charsUntil(asciiLetters, true));
leavingThisState = false;
- } else if (data == ">") {
+ } else if (data == '>') {
// XXX If we emit here the attributes are converted to a dict
// without being checked and when the code below runs we error
// because data is a dict not a list
emitToken = true;
} else if (isWhitespace(data)) {
state = afterAttributeNameState;
- } else if (data == "/") {
+ } else if (data == '/') {
state = selfClosingStartTagState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
_attributeName.write('\uFFFD');
leavingThisState = false;
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-attribute-name"));
+ _addToken(ParseErrorToken('eof-in-attribute-name'));
state = dataState;
} else if ("'\"<".contains(data)) {
- _addToken(ParseErrorToken("invalid-character-in-attribute-name"));
+ _addToken(ParseErrorToken('invalid-character-in-attribute-name'));
_attributeName.write(data);
leavingThisState = false;
} else {
@@ -1078,9 +1079,9 @@
attrName = asciiUpper2Lower(attrName);
}
_attributes.last.name = attrName;
- if (_attributeNames == null) _attributeNames = Set();
+ _attributeNames ??= {};
if (_attributeNames.contains(attrName)) {
- _addToken(ParseErrorToken("duplicate-attribute"));
+ _addToken(ParseErrorToken('duplicate-attribute'));
}
_attributeNames.add(attrName);
@@ -1096,24 +1097,24 @@
var data = stream.char();
if (isWhitespace(data)) {
stream.charsUntil(spaceCharacters, true);
- } else if (data == "=") {
+ } else if (data == '=') {
state = beforeAttributeValueState;
- } else if (data == ">") {
+ } else if (data == '>') {
emitCurrentToken();
} else if (isLetter(data)) {
_addAttribute(data);
state = attributeNameState;
- } else if (data == "/") {
+ } else if (data == '/') {
state = selfClosingStartTagState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
- _addAttribute("\uFFFD");
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
+ _addAttribute('\uFFFD');
state = attributeNameState;
} else if (data == eof) {
- _addToken(ParseErrorToken("expected-end-of-tag-but-got-eof"));
+ _addToken(ParseErrorToken('expected-end-of-tag-but-got-eof'));
state = dataState;
} else if ("'\"<".contains(data)) {
- _addToken(ParseErrorToken("invalid-character-after-attribute-name"));
+ _addToken(ParseErrorToken('invalid-character-after-attribute-name'));
_addAttribute(data);
state = attributeNameState;
} else {
@@ -1127,30 +1128,30 @@
var data = stream.char();
if (isWhitespace(data)) {
stream.charsUntil(spaceCharacters, true);
- } else if (data == "\"") {
+ } else if (data == '"') {
_markAttributeValueStart(0);
state = attributeValueDoubleQuotedState;
- } else if (data == "&") {
+ } else if (data == '&') {
state = attributeValueUnQuotedState;
stream.unget(data);
_markAttributeValueStart(0);
} else if (data == "'") {
_markAttributeValueStart(0);
state = attributeValueSingleQuotedState;
- } else if (data == ">") {
+ } else if (data == '>') {
_addToken(
- ParseErrorToken("expected-attribute-value-but-got-right-bracket"));
+ ParseErrorToken('expected-attribute-value-but-got-right-bracket'));
emitCurrentToken();
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
_markAttributeValueStart(-1);
_attributeValue.write('\uFFFD');
state = attributeValueUnQuotedState;
} else if (data == eof) {
- _addToken(ParseErrorToken("expected-attribute-value-but-got-eof"));
+ _addToken(ParseErrorToken('expected-attribute-value-but-got-eof'));
state = dataState;
- } else if ("=<`".contains(data)) {
- _addToken(ParseErrorToken("equals-in-unquoted-attribute-value"));
+ } else if ('=<`'.contains(data)) {
+ _addToken(ParseErrorToken('equals-in-unquoted-attribute-value'));
_markAttributeValueStart(-1);
_attributeValue.write(data);
state = attributeValueUnQuotedState;
@@ -1164,22 +1165,22 @@
bool attributeValueDoubleQuotedState() {
var data = stream.char();
- if (data == "\"") {
+ if (data == '"') {
_markAttributeValueEnd(-1);
_markAttributeEnd(0);
state = afterAttributeValueState;
- } else if (data == "&") {
+ } else if (data == '&') {
processEntityInAttribute('"');
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
_attributeValue.write('\uFFFD');
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-attribute-value-double-quote"));
+ _addToken(ParseErrorToken('eof-in-attribute-value-double-quote'));
_markAttributeValueEnd(-1);
state = dataState;
} else {
_attributeValue.write(data);
- _attributeValue.write(stream.charsUntil("\"&"));
+ _attributeValue.write(stream.charsUntil('"&'));
}
return true;
}
@@ -1190,13 +1191,13 @@
_markAttributeValueEnd(-1);
_markAttributeEnd(0);
state = afterAttributeValueState;
- } else if (data == "&") {
+ } else if (data == '&') {
processEntityInAttribute("'");
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
_attributeValue.write('\uFFFD');
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-attribute-value-single-quote"));
+ _addToken(ParseErrorToken('eof-in-attribute-value-single-quote'));
_markAttributeValueEnd(-1);
state = dataState;
} else {
@@ -1211,21 +1212,21 @@
if (isWhitespace(data)) {
_markAttributeValueEnd(-1);
state = beforeAttributeNameState;
- } else if (data == "&") {
- processEntityInAttribute(">");
- } else if (data == ">") {
+ } else if (data == '&') {
+ processEntityInAttribute('>');
+ } else if (data == '>') {
_markAttributeValueEnd(-1);
emitCurrentToken();
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-attribute-value-no-quotes"));
+ _addToken(ParseErrorToken('eof-in-attribute-value-no-quotes'));
_markAttributeValueEnd(-1);
state = dataState;
} else if ('"\'=<`'.contains(data)) {
_addToken(
- ParseErrorToken("unexpected-character-in-unquoted-attribute-value"));
+ ParseErrorToken('unexpected-character-in-unquoted-attribute-value'));
_attributeValue.write(data);
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
_attributeValue.write('\uFFFD');
} else {
_attributeValue.write(data);
@@ -1238,16 +1239,16 @@
var data = stream.char();
if (isWhitespace(data)) {
state = beforeAttributeNameState;
- } else if (data == ">") {
+ } else if (data == '>') {
emitCurrentToken();
- } else if (data == "/") {
+ } else if (data == '/') {
state = selfClosingStartTagState;
} else if (data == eof) {
- _addToken(ParseErrorToken("unexpected-EOF-after-attribute-value"));
+ _addToken(ParseErrorToken('unexpected-EOF-after-attribute-value'));
stream.unget(data);
state = dataState;
} else {
- _addToken(ParseErrorToken("unexpected-character-after-attribute-value"));
+ _addToken(ParseErrorToken('unexpected-character-after-attribute-value'));
stream.unget(data);
state = beforeAttributeNameState;
}
@@ -1256,15 +1257,15 @@
bool selfClosingStartTagState() {
var data = stream.char();
- if (data == ">") {
+ if (data == '>') {
currentTagToken.selfClosing = true;
emitCurrentToken();
} else if (data == eof) {
- _addToken(ParseErrorToken("unexpected-EOF-after-solidus-in-tag"));
+ _addToken(ParseErrorToken('unexpected-EOF-after-solidus-in-tag'));
stream.unget(data);
state = dataState;
} else {
- _addToken(ParseErrorToken("unexpected-character-after-soldius-in-tag"));
+ _addToken(ParseErrorToken('unexpected-character-after-soldius-in-tag'));
stream.unget(data);
state = beforeAttributeNameState;
}
@@ -1275,8 +1276,8 @@
// Make a new comment token and give it as value all the characters
// until the first > or EOF (charsUntil checks for EOF automatically)
// and emit it.
- var data = stream.charsUntil(">");
- data = data.replaceAll("\u0000", "\uFFFD");
+ var data = stream.charsUntil('>');
+ data = data.replaceAll('\u0000', '\uFFFD');
_addToken(CommentToken(data));
// Eat the character directly after the bogus comment which is either a
@@ -1288,9 +1289,9 @@
bool markupDeclarationOpenState() {
var charStack = [stream.char()];
- if (charStack.last == "-") {
+ if (charStack.last == '-') {
charStack.add(stream.char());
- if (charStack.last == "-") {
+ if (charStack.last == '-') {
currentToken = CommentToken();
state = commentStartState;
return true;
@@ -1310,13 +1311,13 @@
state = doctypeState;
return true;
}
- } else if (charStack.last == "[" &&
+ } else if (charStack.last == '[' &&
parser != null &&
parser.tree.openElements.isNotEmpty &&
parser.tree.openElements.last.namespaceUri !=
parser.tree.defaultNamespace) {
var matched = true;
- for (var expected in const ["C", "D", "A", "T", "A", "["]) {
+ for (var expected in const ['C', 'D', 'A', 'T', 'A', '[']) {
charStack.add(stream.char());
if (charStack.last != expected) {
matched = false;
@@ -1329,7 +1330,7 @@
}
}
- _addToken(ParseErrorToken("expected-dashes-or-doctype"));
+ _addToken(ParseErrorToken('expected-dashes-or-doctype'));
while (charStack.isNotEmpty) {
stream.unget(charStack.removeLast());
@@ -1340,17 +1341,17 @@
bool commentStartState() {
var data = stream.char();
- if (data == "-") {
+ if (data == '-') {
state = commentStartDashState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
currentStringToken.add('\uFFFD');
- } else if (data == ">") {
- _addToken(ParseErrorToken("incorrect-comment"));
+ } else if (data == '>') {
+ _addToken(ParseErrorToken('incorrect-comment'));
_addToken(currentToken);
state = dataState;
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-comment"));
+ _addToken(ParseErrorToken('eof-in-comment'));
_addToken(currentToken);
state = dataState;
} else {
@@ -1362,17 +1363,17 @@
bool commentStartDashState() {
var data = stream.char();
- if (data == "-") {
+ if (data == '-') {
state = commentEndState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
currentStringToken.add('-\uFFFD');
- } else if (data == ">") {
- _addToken(ParseErrorToken("incorrect-comment"));
+ } else if (data == '>') {
+ _addToken(ParseErrorToken('incorrect-comment'));
_addToken(currentToken);
state = dataState;
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-comment"));
+ _addToken(ParseErrorToken('eof-in-comment'));
_addToken(currentToken);
state = dataState;
} else {
@@ -1384,31 +1385,31 @@
bool commentState() {
var data = stream.char();
- if (data == "-") {
+ if (data == '-') {
state = commentEndDashState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
currentStringToken.add('\uFFFD');
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-comment"));
+ _addToken(ParseErrorToken('eof-in-comment'));
_addToken(currentToken);
state = dataState;
} else {
- currentStringToken.add(data).add(stream.charsUntil("-\u0000"));
+ currentStringToken.add(data).add(stream.charsUntil('-\u0000'));
}
return true;
}
bool commentEndDashState() {
var data = stream.char();
- if (data == "-") {
+ if (data == '-') {
state = commentEndState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
currentStringToken.add('-\uFFFD');
state = commentState;
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-comment-end-dash"));
+ _addToken(ParseErrorToken('eof-in-comment-end-dash'));
_addToken(currentToken);
state = dataState;
} else {
@@ -1420,28 +1421,28 @@
bool commentEndState() {
var data = stream.char();
- if (data == ">") {
+ if (data == '>') {
_addToken(currentToken);
state = dataState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
currentStringToken.add('--\uFFFD');
state = commentState;
- } else if (data == "!") {
+ } else if (data == '!') {
_addToken(
- ParseErrorToken("unexpected-bang-after-double-dash-in-comment"));
+ ParseErrorToken('unexpected-bang-after-double-dash-in-comment'));
state = commentEndBangState;
- } else if (data == "-") {
+ } else if (data == '-') {
_addToken(
- ParseErrorToken("unexpected-dash-after-double-dash-in-comment"));
+ ParseErrorToken('unexpected-dash-after-double-dash-in-comment'));
currentStringToken.add(data);
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-comment-double-dash"));
+ _addToken(ParseErrorToken('eof-in-comment-double-dash'));
_addToken(currentToken);
state = dataState;
} else {
// XXX
- _addToken(ParseErrorToken("unexpected-char-in-comment"));
+ _addToken(ParseErrorToken('unexpected-char-in-comment'));
currentStringToken.add('--').add(data);
state = commentState;
}
@@ -1450,18 +1451,18 @@
bool commentEndBangState() {
var data = stream.char();
- if (data == ">") {
+ if (data == '>') {
_addToken(currentToken);
state = dataState;
- } else if (data == "-") {
+ } else if (data == '-') {
currentStringToken.add('--!');
state = commentEndDashState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
currentStringToken.add('--!\uFFFD');
state = commentState;
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-comment-end-bang-state"));
+ _addToken(ParseErrorToken('eof-in-comment-end-bang-state'));
_addToken(currentToken);
state = dataState;
} else {
@@ -1476,12 +1477,12 @@
if (isWhitespace(data)) {
state = beforeDoctypeNameState;
} else if (data == eof) {
- _addToken(ParseErrorToken("expected-doctype-name-but-got-eof"));
+ _addToken(ParseErrorToken('expected-doctype-name-but-got-eof'));
currentDoctypeToken.correct = false;
_addToken(currentToken);
state = dataState;
} else {
- _addToken(ParseErrorToken("need-space-after-doctype"));
+ _addToken(ParseErrorToken('need-space-after-doctype'));
stream.unget(data);
state = beforeDoctypeNameState;
}
@@ -1492,17 +1493,17 @@
var data = stream.char();
if (isWhitespace(data)) {
return true;
- } else if (data == ">") {
- _addToken(ParseErrorToken("expected-doctype-name-but-got-right-bracket"));
+ } else if (data == '>') {
+ _addToken(ParseErrorToken('expected-doctype-name-but-got-right-bracket'));
currentDoctypeToken.correct = false;
_addToken(currentToken);
state = dataState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
- currentDoctypeToken.name = "\uFFFD";
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
+ currentDoctypeToken.name = '\uFFFD';
state = doctypeNameState;
} else if (data == eof) {
- _addToken(ParseErrorToken("expected-doctype-name-but-got-eof"));
+ _addToken(ParseErrorToken('expected-doctype-name-but-got-eof'));
currentDoctypeToken.correct = false;
_addToken(currentToken);
state = dataState;
@@ -1518,16 +1519,16 @@
if (isWhitespace(data)) {
currentDoctypeToken.name = asciiUpper2Lower(currentDoctypeToken.name);
state = afterDoctypeNameState;
- } else if (data == ">") {
+ } else if (data == '>') {
currentDoctypeToken.name = asciiUpper2Lower(currentDoctypeToken.name);
_addToken(currentToken);
state = dataState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
- currentDoctypeToken.name = "${currentDoctypeToken.name}\uFFFD";
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
+ currentDoctypeToken.name = '${currentDoctypeToken.name}\uFFFD';
state = doctypeNameState;
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-doctype-name"));
+ _addToken(ParseErrorToken('eof-in-doctype-name'));
currentDoctypeToken.correct = false;
currentDoctypeToken.name = asciiUpper2Lower(currentDoctypeToken.name);
_addToken(currentToken);
@@ -1542,20 +1543,20 @@
var data = stream.char();
if (isWhitespace(data)) {
return true;
- } else if (data == ">") {
+ } else if (data == '>') {
_addToken(currentToken);
state = dataState;
} else if (data == eof) {
currentDoctypeToken.correct = false;
stream.unget(data);
- _addToken(ParseErrorToken("eof-in-doctype"));
+ _addToken(ParseErrorToken('eof-in-doctype'));
_addToken(currentToken);
state = dataState;
} else {
- if (data == "p" || data == "P") {
+ if (data == 'p' || data == 'P') {
// TODO(jmesserly): would be nice to have a helper for this.
var matched = true;
- for (var expected in const ["uU", "bB", "lL", "iI", "cC"]) {
+ for (var expected in const ['uU', 'bB', 'lL', 'iI', 'cC']) {
data = stream.char();
if (data == eof || !expected.contains(data)) {
matched = false;
@@ -1566,9 +1567,9 @@
state = afterDoctypePublicKeywordState;
return true;
}
- } else if (data == "s" || data == "S") {
+ } else if (data == 's' || data == 'S') {
var matched = true;
- for (var expected in const ["yY", "sS", "tT", "eE", "mM"]) {
+ for (var expected in const ['yY', 'sS', 'tT', 'eE', 'mM']) {
data = stream.char();
if (data == eof || !expected.contains(data)) {
matched = false;
@@ -1586,8 +1587,8 @@
// discarded; only the latest character might be '>' or EOF
// and needs to be ungetted
stream.unget(data);
- _addToken(ParseErrorToken("expected-space-or-right-bracket-in-doctype",
- messageParams: {"data": data}));
+ _addToken(ParseErrorToken('expected-space-or-right-bracket-in-doctype',
+ messageParams: {'data': data}));
currentDoctypeToken.correct = false;
state = bogusDoctypeState;
}
@@ -1599,11 +1600,11 @@
if (isWhitespace(data)) {
state = beforeDoctypePublicIdentifierState;
} else if (data == "'" || data == '"') {
- _addToken(ParseErrorToken("unexpected-char-in-doctype"));
+ _addToken(ParseErrorToken('unexpected-char-in-doctype'));
stream.unget(data);
state = beforeDoctypePublicIdentifierState;
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-doctype"));
+ _addToken(ParseErrorToken('eof-in-doctype'));
currentDoctypeToken.correct = false;
_addToken(currentToken);
state = dataState;
@@ -1618,24 +1619,24 @@
var data = stream.char();
if (isWhitespace(data)) {
return true;
- } else if (data == "\"") {
- currentDoctypeToken.publicId = "";
+ } else if (data == '"') {
+ currentDoctypeToken.publicId = '';
state = doctypePublicIdentifierDoubleQuotedState;
} else if (data == "'") {
- currentDoctypeToken.publicId = "";
+ currentDoctypeToken.publicId = '';
state = doctypePublicIdentifierSingleQuotedState;
- } else if (data == ">") {
- _addToken(ParseErrorToken("unexpected-end-of-doctype"));
+ } else if (data == '>') {
+ _addToken(ParseErrorToken('unexpected-end-of-doctype'));
currentDoctypeToken.correct = false;
_addToken(currentToken);
state = dataState;
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-doctype"));
+ _addToken(ParseErrorToken('eof-in-doctype'));
currentDoctypeToken.correct = false;
_addToken(currentToken);
state = dataState;
} else {
- _addToken(ParseErrorToken("unexpected-char-in-doctype"));
+ _addToken(ParseErrorToken('unexpected-char-in-doctype'));
currentDoctypeToken.correct = false;
state = bogusDoctypeState;
}
@@ -1646,16 +1647,16 @@
var data = stream.char();
if (data == '"') {
state = afterDoctypePublicIdentifierState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
- currentDoctypeToken.publicId = "${currentDoctypeToken.publicId}\uFFFD";
- } else if (data == ">") {
- _addToken(ParseErrorToken("unexpected-end-of-doctype"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
+ currentDoctypeToken.publicId = '${currentDoctypeToken.publicId}\uFFFD';
+ } else if (data == '>') {
+ _addToken(ParseErrorToken('unexpected-end-of-doctype'));
currentDoctypeToken.correct = false;
_addToken(currentToken);
state = dataState;
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-doctype"));
+ _addToken(ParseErrorToken('eof-in-doctype'));
currentDoctypeToken.correct = false;
_addToken(currentToken);
state = dataState;
@@ -1669,16 +1670,16 @@
var data = stream.char();
if (data == "'") {
state = afterDoctypePublicIdentifierState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
- currentDoctypeToken.publicId = "${currentDoctypeToken.publicId}\uFFFD";
- } else if (data == ">") {
- _addToken(ParseErrorToken("unexpected-end-of-doctype"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
+ currentDoctypeToken.publicId = '${currentDoctypeToken.publicId}\uFFFD';
+ } else if (data == '>') {
+ _addToken(ParseErrorToken('unexpected-end-of-doctype'));
currentDoctypeToken.correct = false;
_addToken(currentToken);
state = dataState;
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-doctype"));
+ _addToken(ParseErrorToken('eof-in-doctype'));
currentDoctypeToken.correct = false;
_addToken(currentToken);
state = dataState;
@@ -1692,24 +1693,24 @@
var data = stream.char();
if (isWhitespace(data)) {
state = betweenDoctypePublicAndSystemIdentifiersState;
- } else if (data == ">") {
+ } else if (data == '>') {
_addToken(currentToken);
state = dataState;
} else if (data == '"') {
- _addToken(ParseErrorToken("unexpected-char-in-doctype"));
- currentDoctypeToken.systemId = "";
+ _addToken(ParseErrorToken('unexpected-char-in-doctype'));
+ currentDoctypeToken.systemId = '';
state = doctypeSystemIdentifierDoubleQuotedState;
} else if (data == "'") {
- _addToken(ParseErrorToken("unexpected-char-in-doctype"));
- currentDoctypeToken.systemId = "";
+ _addToken(ParseErrorToken('unexpected-char-in-doctype'));
+ currentDoctypeToken.systemId = '';
state = doctypeSystemIdentifierSingleQuotedState;
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-doctype"));
+ _addToken(ParseErrorToken('eof-in-doctype'));
currentDoctypeToken.correct = false;
_addToken(currentToken);
state = dataState;
} else {
- _addToken(ParseErrorToken("unexpected-char-in-doctype"));
+ _addToken(ParseErrorToken('unexpected-char-in-doctype'));
currentDoctypeToken.correct = false;
state = bogusDoctypeState;
}
@@ -1720,22 +1721,22 @@
var data = stream.char();
if (isWhitespace(data)) {
return true;
- } else if (data == ">") {
+ } else if (data == '>') {
_addToken(currentToken);
state = dataState;
} else if (data == '"') {
- currentDoctypeToken.systemId = "";
+ currentDoctypeToken.systemId = '';
state = doctypeSystemIdentifierDoubleQuotedState;
} else if (data == "'") {
- currentDoctypeToken.systemId = "";
+ currentDoctypeToken.systemId = '';
state = doctypeSystemIdentifierSingleQuotedState;
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-doctype"));
+ _addToken(ParseErrorToken('eof-in-doctype'));
currentDoctypeToken.correct = false;
_addToken(currentToken);
state = dataState;
} else {
- _addToken(ParseErrorToken("unexpected-char-in-doctype"));
+ _addToken(ParseErrorToken('unexpected-char-in-doctype'));
currentDoctypeToken.correct = false;
state = bogusDoctypeState;
}
@@ -1747,11 +1748,11 @@
if (isWhitespace(data)) {
state = beforeDoctypeSystemIdentifierState;
} else if (data == "'" || data == '"') {
- _addToken(ParseErrorToken("unexpected-char-in-doctype"));
+ _addToken(ParseErrorToken('unexpected-char-in-doctype'));
stream.unget(data);
state = beforeDoctypeSystemIdentifierState;
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-doctype"));
+ _addToken(ParseErrorToken('eof-in-doctype'));
currentDoctypeToken.correct = false;
_addToken(currentToken);
state = dataState;
@@ -1766,24 +1767,24 @@
var data = stream.char();
if (isWhitespace(data)) {
return true;
- } else if (data == "\"") {
- currentDoctypeToken.systemId = "";
+ } else if (data == '"') {
+ currentDoctypeToken.systemId = '';
state = doctypeSystemIdentifierDoubleQuotedState;
} else if (data == "'") {
- currentDoctypeToken.systemId = "";
+ currentDoctypeToken.systemId = '';
state = doctypeSystemIdentifierSingleQuotedState;
- } else if (data == ">") {
- _addToken(ParseErrorToken("unexpected-char-in-doctype"));
+ } else if (data == '>') {
+ _addToken(ParseErrorToken('unexpected-char-in-doctype'));
currentDoctypeToken.correct = false;
_addToken(currentToken);
state = dataState;
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-doctype"));
+ _addToken(ParseErrorToken('eof-in-doctype'));
currentDoctypeToken.correct = false;
_addToken(currentToken);
state = dataState;
} else {
- _addToken(ParseErrorToken("unexpected-char-in-doctype"));
+ _addToken(ParseErrorToken('unexpected-char-in-doctype'));
currentDoctypeToken.correct = false;
state = bogusDoctypeState;
}
@@ -1792,18 +1793,18 @@
bool doctypeSystemIdentifierDoubleQuotedState() {
var data = stream.char();
- if (data == "\"") {
+ if (data == '"') {
state = afterDoctypeSystemIdentifierState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
- currentDoctypeToken.systemId = "${currentDoctypeToken.systemId}\uFFFD";
- } else if (data == ">") {
- _addToken(ParseErrorToken("unexpected-end-of-doctype"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
+ currentDoctypeToken.systemId = '${currentDoctypeToken.systemId}\uFFFD';
+ } else if (data == '>') {
+ _addToken(ParseErrorToken('unexpected-end-of-doctype'));
currentDoctypeToken.correct = false;
_addToken(currentToken);
state = dataState;
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-doctype"));
+ _addToken(ParseErrorToken('eof-in-doctype'));
currentDoctypeToken.correct = false;
_addToken(currentToken);
state = dataState;
@@ -1817,16 +1818,16 @@
var data = stream.char();
if (data == "'") {
state = afterDoctypeSystemIdentifierState;
- } else if (data == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
- currentDoctypeToken.systemId = "${currentDoctypeToken.systemId}\uFFFD";
- } else if (data == ">") {
- _addToken(ParseErrorToken("unexpected-end-of-doctype"));
+ } else if (data == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
+ currentDoctypeToken.systemId = '${currentDoctypeToken.systemId}\uFFFD';
+ } else if (data == '>') {
+ _addToken(ParseErrorToken('unexpected-end-of-doctype'));
currentDoctypeToken.correct = false;
_addToken(currentToken);
state = dataState;
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-doctype"));
+ _addToken(ParseErrorToken('eof-in-doctype'));
currentDoctypeToken.correct = false;
_addToken(currentToken);
state = dataState;
@@ -1840,16 +1841,16 @@
var data = stream.char();
if (isWhitespace(data)) {
return true;
- } else if (data == ">") {
+ } else if (data == '>') {
_addToken(currentToken);
state = dataState;
} else if (data == eof) {
- _addToken(ParseErrorToken("eof-in-doctype"));
+ _addToken(ParseErrorToken('eof-in-doctype'));
currentDoctypeToken.correct = false;
_addToken(currentToken);
state = dataState;
} else {
- _addToken(ParseErrorToken("unexpected-char-in-doctype"));
+ _addToken(ParseErrorToken('unexpected-char-in-doctype'));
state = bogusDoctypeState;
}
return true;
@@ -1857,7 +1858,7 @@
bool bogusDoctypeState() {
var data = stream.char();
- if (data == ">") {
+ if (data == '>') {
_addToken(currentToken);
state = dataState;
} else if (data == eof) {
@@ -1870,24 +1871,24 @@
}
bool cdataSectionState() {
- var data = [];
- int matchedEnd = 0;
+ var data = <String>[];
+ var matchedEnd = 0;
while (true) {
var ch = stream.char();
if (ch == eof) {
break;
}
// Deal with null here rather than in the parser
- if (ch == "\u0000") {
- _addToken(ParseErrorToken("invalid-codepoint"));
- ch = "\uFFFD";
+ if (ch == '\u0000') {
+ _addToken(ParseErrorToken('invalid-codepoint'));
+ ch = '\uFFFD';
}
data.add(ch);
// TODO(jmesserly): it'd be nice if we had an easier way to match the end,
// perhaps with a "peek" API.
- if (ch == "]" && matchedEnd < 2) {
+ if (ch == ']' && matchedEnd < 2) {
matchedEnd++;
- } else if (ch == ">" && matchedEnd == 2) {
+ } else if (ch == '>' && matchedEnd == 2) {
// Remove "]]>" from the end.
data.removeLast();
data.removeLast();
diff --git a/lib/src/treebuilder.dart b/lib/src/treebuilder.dart
index f6db7ad..e096214 100644
--- a/lib/src/treebuilder.dart
+++ b/lib/src/treebuilder.dart
@@ -21,8 +21,9 @@
// Override the "add" method.
// TODO(jmesserly): I'd rather not override this; can we do this in the
// calling code instead?
+ @override
void add(Element node) {
- int equalCount = 0;
+ var equalCount = 0;
if (node != Marker) {
for (var element in reversed) {
if (element == Marker) {
@@ -103,32 +104,32 @@
bool elementInScope(target, {String variant}) {
//If we pass a node in we match that. if we pass a string
//match any node with that name
- bool exactNode = target is Node;
+ var exactNode = target is Node;
- List listElements1 = scopingElements;
- List listElements2 = const [];
- bool invert = false;
+ var listElements1 = scopingElements;
+ var listElements2 = const [];
+ var invert = false;
if (variant != null) {
switch (variant) {
- case "button":
- listElements2 = const [Pair(Namespaces.html, "button")];
+ case 'button':
+ listElements2 = const [Pair(Namespaces.html, 'button')];
break;
- case "list":
+ case 'list':
listElements2 = const [
- Pair(Namespaces.html, "ol"),
- Pair(Namespaces.html, "ul")
+ Pair(Namespaces.html, 'ol'),
+ Pair(Namespaces.html, 'ul')
];
break;
- case "table":
+ case 'table':
listElements1 = const [
- Pair(Namespaces.html, "html"),
- Pair(Namespaces.html, "table")
+ Pair(Namespaces.html, 'html'),
+ Pair(Namespaces.html, 'table')
];
break;
- case "select":
+ case 'select':
listElements1 = const [
- Pair(Namespaces.html, "optgroup"),
- Pair(Namespaces.html, "option")
+ Pair(Namespaces.html, 'optgroup'),
+ Pair(Namespaces.html, 'option')
];
invert = true;
break;
@@ -162,7 +163,7 @@
}
// Step 2 and step 3: we start with the last element. So i is -1.
- int i = activeFormattingElements.length - 1;
+ var i = activeFormattingElements.length - 1;
var entry = activeFormattingElements[i];
if (entry == Marker || openElements.contains(entry)) {
return;
@@ -242,17 +243,14 @@
}
void insertComment(StringToken token, [Node parent]) {
- if (parent == null) {
- parent = openElements.last;
- }
+ parent ??= openElements.last;
parent.nodes.add(Comment(token.data)..sourceSpan = token.span);
}
/// Create an element but don't insert it anywhere
Element createElement(StartTagToken token) {
var name = token.name;
- var namespace = token.namespace;
- if (namespace == null) namespace = defaultNamespace;
+ var namespace = token.namespace ?? defaultNamespace;
var element = document.createElementNS(namespace, name)
..attributes = token.data
..sourceSpan = token.span;
@@ -266,8 +264,7 @@
Element insertElementNormal(StartTagToken token) {
var name = token.name;
- var namespace = token.namespace;
- if (namespace == null) namespace = defaultNamespace;
+ var namespace = token.namespace ?? defaultNamespace;
var element = document.createElementNS(namespace, name)
..attributes = token.data
..sourceSpan = token.span;
@@ -332,7 +329,7 @@
nodes.add(Text(data)..sourceSpan = span);
}
} else {
- int index = nodes.indexOf(refNode);
+ var index = nodes.indexOf(refNode);
if (index > 0 && nodes[index - 1] is Text) {
Text last = nodes[index - 1];
last.appendData(data);
@@ -352,7 +349,7 @@
Node fosterParent;
Node insertBefore;
for (var elm in openElements.reversed) {
- if (elm.localName == "table") {
+ if (elm.localName == 'table') {
lastTable = elm;
break;
}
@@ -376,7 +373,7 @@
var name = openElements.last.localName;
// XXX td, th and tr are not actually needed
if (name != exclude &&
- const ["dd", "dt", "li", "option", "optgroup", "p", "rp", "rt"]
+ const ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt']
.contains(name)) {
openElements.removeLast();
// XXX This is not entirely what the specification says. We should
diff --git a/lib/src/utils.dart b/lib/src/utils.dart
index 54b578b..fec6870 100644
--- a/lib/src/utils.dart
+++ b/lib/src/utils.dart
@@ -11,14 +11,16 @@
const Pair(this.first, this.second);
+ @override
int get hashCode => 37 * first.hashCode + second.hashCode;
+ @override
bool operator ==(other) => other.first == first && other.second == second;
}
int parseIntRadix(String str, [int radix = 10]) {
- int val = 0;
- for (int i = 0; i < str.length; i++) {
+ var val = 0;
+ for (var i = 0; i < str.length; i++) {
var digit = str.codeUnitAt(i);
if (digit >= LOWER_A) {
digit += 10 - LOWER_A;
@@ -45,7 +47,7 @@
// Like the python [:] operator.
List<T> slice<T>(List<T> list, int start, [int end]) {
- if (end == null) end = list.length;
+ end ??= list.length;
if (end < 0) end += list.length;
// Ensure the indexes are in bounds.
@@ -55,7 +57,7 @@
}
bool allWhitespace(String str) {
- for (int i = 0; i < str.length; i++) {
+ for (var i = 0; i < str.length; i++) {
if (!isWhitespaceCC(str.codeUnitAt(i))) return false;
}
return true;
@@ -65,7 +67,7 @@
if (str.length == size) return str;
var result = StringBuffer();
size -= str.length;
- for (int i = 0; i < size; i++) {
+ for (var i = 0; i < size; i++) {
result.write('0');
}
result.write(str);
@@ -89,7 +91,7 @@
result.write(format.substring(last, match));
match += search.length;
- int digits = match;
+ var digits = match;
while (isDigit(format[digits])) {
digits++;
}
@@ -112,8 +114,8 @@
result.write(padWithZeros(number, numberSize));
break;
default:
- throw UnsupportedError("formatStr does not support format "
- "character ${format[match]}");
+ throw UnsupportedError('formatStr does not support format '
+ 'character ${format[match]}');
}
last = match + 1;
diff --git a/test/dom_test.dart b/test/dom_test.dart
index 1cf912e..078c3c7 100644
--- a/test/dom_test.dart
+++ b/test/dom_test.dart
@@ -5,7 +5,7 @@
import 'package:html/dom.dart';
import 'package:html/parser.dart';
-main() {
+void main() {
group('Element', () {
test('classes', () {
final barBaz = Element.html('<div class=" bar baz"></div>');
diff --git a/test/parser_feature_test.dart b/test/parser_feature_test.dart
index 0889f44..536f98f 100644
--- a/test/parser_feature_test.dart
+++ b/test/parser_feature_test.dart
@@ -9,7 +9,7 @@
import 'package:source_span/source_span.dart';
import 'package:test/test.dart';
-main() {
+void main() {
_testElementSpans();
test('doctype is cloneable', () {
var doc = parse('<!doctype HTML>');
@@ -19,8 +19,8 @@
test('line counter', () {
// http://groups.google.com/group/html5lib-discuss/browse_frm/thread/f4f00e4a2f26d5c0
- var doc = parse("<pre>\nx\n>\n</pre>");
- expect(doc.body.innerHtml, "<pre>x\n>\n</pre>");
+ var doc = parse('<pre>\nx\n>\n</pre>');
+ expect(doc.body.innerHtml, '<pre>x\n>\n</pre>');
});
test('namespace html elements on', () {
@@ -45,7 +45,7 @@
var doc = parser.parse();
expect(doc.body.outerHtml, '<body>\n \n \n\n</body>');
expect(parser.errors.length, 1);
- ParseError error = parser.errors[0];
+ var error = parser.errors[0];
expect(error.errorCode, 'unexpected-doctype');
// Note: these values are 0-based, but the printed format is 1-based.
@@ -75,7 +75,7 @@
var doc = parser.parse();
expect(doc.body.outerHtml, '<body>\n \n \n\n</body>');
expect(parser.errors.length, 1);
- ParseError error = parser.errors[0];
+ var error = parser.errors[0];
expect(error.errorCode, 'unexpected-doctype');
expect(error.span.start.line, 3);
// Note: error position is at the end, not the beginning
@@ -317,7 +317,7 @@
});
group('Encoding pre-parser', () {
- getEncoding(String s) => EncodingParser(s.codeUnits).getEncoding();
+ String getEncoding(String s) => EncodingParser(s.codeUnits).getEncoding();
test('gets encoding from meta charset', () {
expect(getEncoding('<meta charset="utf-16">'), 'utf-16');
@@ -349,8 +349,8 @@
});
}
-_testElementSpans() {
- assertSpan(SourceSpan span, int offset, int end, String text) {
+void _testElementSpans() {
+ void assertSpan(SourceSpan span, int offset, int end, String text) {
expect(span, isNotNull);
expect(span.start.offset, offset);
expect(span.end.offset, end);
diff --git a/test/parser_test.dart b/test/parser_test.dart
index 1db1586..21c54d2 100644
--- a/test/parser_test.dart
+++ b/test/parser_test.dart
@@ -19,15 +19,15 @@
// We can't do regex replace directly =\
// final namespaceExpected = new RegExp(@"^(\s*)<(\S+)>", multiLine: true);
// return expected.replaceAll(namespaceExpected, @"$1<html $2>");
- final namespaceExpected = RegExp(r"^(\|\s*)<(\S+)>");
- var lines = expected.split("\n");
- for (int i = 0; i < lines.length; i++) {
+ final namespaceExpected = RegExp(r'^(\|\s*)<(\S+)>');
+ var lines = expected.split('\n');
+ for (var i = 0; i < lines.length; i++) {
var match = namespaceExpected.firstMatch(lines[i]);
if (match != null) {
- lines[i] = "${match[1]}<html ${match[2]}>";
+ lines[i] = '${match[1]}<html ${match[2]}>';
}
}
- return lines.join("\n");
+ return lines.join('\n');
}
void runParserTest(
@@ -58,13 +58,13 @@
expect(output, equals(expected),
reason:
- "\n\nInput:\n$input\n\nExpected:\n$expected\n\nReceived:\n$output");
+ '\n\nInput:\n$input\n\nExpected:\n$expected\n\nReceived:\n$output');
if (checkParseErrors) {
expect(parser.errors.length, equals(errors.length),
- reason: "\n\nInput:\n$input\n\nExpected errors (${errors.length}):\n"
+ reason: '\n\nInput:\n$input\n\nExpected errors (${errors.length}):\n'
"${errors.join('\n')}\n\n"
- "Actual errors (${parser.errors.length}):\n"
+ 'Actual errors (${parser.errors.length}):\n'
"${parser.errors.map((e) => '$e').join('\n')}");
}
}
@@ -73,7 +73,7 @@
for (var path in getDataFiles('tree-construction')) {
if (!path.endsWith('.dat')) continue;
- var tests = TestData(path, "data");
+ var tests = TestData(path, 'data');
var testName = pathos.basenameWithoutExtension(path);
group(testName, () {
@@ -83,7 +83,7 @@
var innerHTML = testData['document-fragment'];
var expected = testData['document'];
if (errors != null) {
- errors = errors.split("\n");
+ errors = errors.split('\n');
}
for (var treeCtor in treeTypes.values) {
@@ -100,7 +100,7 @@
}
/// Extract the name for the test based on the test input data.
-_nameFor(String input) {
+dynamic _nameFor(String input) {
// Using jsonDecode to unescape other unicode characters
var escapeQuote = input
.replaceAll(RegExp('\\\\.'), '_')
diff --git a/test/selectors/level1_baseline_test.dart b/test/selectors/level1_baseline_test.dart
index 7ed1cc4..d5defb1 100644
--- a/test/selectors/level1_baseline_test.dart
+++ b/test/selectors/level1_baseline_test.dart
@@ -23,9 +23,9 @@
}
var testType = testQsaBaseline; // Only run baseline tests.
-var docType = "html"; // Only run tests suitable for HTML
+var docType = 'html'; // Only run tests suitable for HTML
-main() {
+void main() {
/*
* This test suite tests Selectors API methods in 4 different contexts:
* 1. Document node
@@ -64,7 +64,7 @@
//doc = frame.contentDocument; // Document Node tests
doc = getTestContentDocument();
- var element = doc.getElementById("root"); // In-document Element Node tests
+ var element = doc.getElementById('root'); // In-document Element Node tests
//Setup the namespace tests
setupSpecialElements(element);
@@ -77,8 +77,8 @@
traverse(outOfScope, (elem) {
// Annotate each element as being a clone; used for verifying
- elem.attributes["data-clone"] =
- ""; // that none of these elements ever match.
+ elem.attributes['data-clone'] =
+ ''; // that none of these elements ever match.
});
var detached = element.clone(true); // Detached Element Node tests
@@ -87,31 +87,31 @@
fragment.append(element.clone(true));
// Setup Tests
- interfaceCheck("Document", doc);
- interfaceCheck("Detached Element", detached);
- interfaceCheck("Fragment", fragment);
- interfaceCheck("In-document Element", element);
+ interfaceCheck('Document', doc);
+ interfaceCheck('Detached Element', detached);
+ interfaceCheck('Fragment', fragment);
+ interfaceCheck('In-document Element', element);
- runSpecialSelectorTests("Document", doc);
- runSpecialSelectorTests("Detached Element", detached);
- runSpecialSelectorTests("Fragment", fragment);
- runSpecialSelectorTests("In-document Element", element);
+ runSpecialSelectorTests('Document', doc);
+ runSpecialSelectorTests('Detached Element', detached);
+ runSpecialSelectorTests('Fragment', fragment);
+ runSpecialSelectorTests('In-document Element', element);
- verifyStaticList("Document", doc);
- verifyStaticList("Detached Element", detached);
- verifyStaticList("Fragment", fragment);
- verifyStaticList("In-document Element", element);
+ verifyStaticList('Document', doc);
+ verifyStaticList('Detached Element', detached);
+ verifyStaticList('Fragment', fragment);
+ verifyStaticList('In-document Element', element);
// TODO(jmesserly): fix negative tests
- //runInvalidSelectorTest("Document", doc, invalidSelectors);
- //runInvalidSelectorTest("Detached Element", detached, invalidSelectors);
- //runInvalidSelectorTest("Fragment", fragment, invalidSelectors);
- //runInvalidSelectorTest("In-document Element", element, invalidSelectors);
+ //runInvalidSelectorTest('Document', doc, invalidSelectors);
+ //runInvalidSelectorTest('Detached Element', detached, invalidSelectors);
+ //runInvalidSelectorTest('Fragment', fragment, invalidSelectors);
+ //runInvalidSelectorTest('In-document Element', element, invalidSelectors);
- runValidSelectorTest("Document", doc, validSelectors, testType, docType);
+ runValidSelectorTest('Document', doc, validSelectors, testType, docType);
runValidSelectorTest(
- "Detached Element", detached, validSelectors, testType, docType);
- runValidSelectorTest("Fragment", fragment, validSelectors, testType, docType);
+ 'Detached Element', detached, validSelectors, testType, docType);
+ runValidSelectorTest('Fragment', fragment, validSelectors, testType, docType);
group('out of scope', () {
setUp(() {
@@ -122,6 +122,6 @@
outOfScope.remove();
});
runValidSelectorTest(
- "In-document Element", element, validSelectors, testType, docType);
+ 'In-document Element', element, validSelectors, testType, docType);
});
}
diff --git a/test/selectors/level1_lib.dart b/test/selectors/level1_lib.dart
index d87c795..f97dafc 100644
--- a/test/selectors/level1_lib.dart
+++ b/test/selectors/level1_lib.dart
@@ -17,47 +17,47 @@
/*
* Create and append special elements that cannot be created correctly with HTML markup alone.
*/
-setupSpecialElements(parent) {
+void setupSpecialElements(parent) {
// Setup null and undefined tests
- parent.append(doc.createElement("null"));
- parent.append(doc.createElement("undefined"));
+ parent.append(doc.createElement('null'));
+ parent.append(doc.createElement('undefined'));
// Setup namespace tests
- var anyNS = doc.createElement("div");
- var noNS = doc.createElement("div");
- anyNS.id = "any-namespace";
- noNS.id = "no-namespace";
+ var anyNS = doc.createElement('div');
+ var noNS = doc.createElement('div');
+ anyNS.id = 'any-namespace';
+ noNS.id = 'no-namespace';
var div;
div = [
- doc.createElement("div"),
- doc.createElementNS("http://www.w3.org/1999/xhtml", "div"),
- doc.createElementNS("", "div"),
- doc.createElementNS("http://www.example.org/ns", "div")
+ doc.createElement('div'),
+ doc.createElementNS('http://www.w3.org/1999/xhtml', 'div'),
+ doc.createElementNS('', 'div'),
+ doc.createElementNS('http://www.example.org/ns', 'div')
];
- div[0].id = "any-namespace-div1";
- div[1].id = "any-namespace-div2";
- div[2].attributes["id"] =
- "any-namespace-div3"; // Non-HTML elements can't use .id property
- div[3].attributes["id"] = "any-namespace-div4";
+ div[0].id = 'any-namespace-div1';
+ div[1].id = 'any-namespace-div2';
+ div[2].attributes['id'] =
+ 'any-namespace-div3'; // Non-HTML elements can't use .id property
+ div[3].attributes['id'] = 'any-namespace-div4';
for (var i = 0; i < div.length; i++) {
anyNS.append(div[i]);
}
div = [
- doc.createElement("div"),
- doc.createElementNS("http://www.w3.org/1999/xhtml", "div"),
- doc.createElementNS("", "div"),
- doc.createElementNS("http://www.example.org/ns", "div")
+ doc.createElement('div'),
+ doc.createElementNS('http://www.w3.org/1999/xhtml', 'div'),
+ doc.createElementNS('', 'div'),
+ doc.createElementNS('http://www.example.org/ns', 'div')
];
- div[0].id = "no-namespace-div1";
- div[1].id = "no-namespace-div2";
- div[2].attributes["id"] =
- "no-namespace-div3"; // Non-HTML elements can't use .id property
- div[3].attributes["id"] = "no-namespace-div4";
+ div[0].id = 'no-namespace-div1';
+ div[1].id = 'no-namespace-div2';
+ div[2].attributes['id'] =
+ 'no-namespace-div3'; // Non-HTML elements can't use .id property
+ div[3].attributes['id'] = 'no-namespace-div4';
for (var i = 0; i < div.length; i++) {
noNS.append(div[i]);
@@ -70,114 +70,114 @@
/*
* Check that the querySelector and querySelectorAll methods exist on the given Node
*/
-interfaceCheck(type, obj) {
+void interfaceCheck(type, obj) {
runTest(() {
var q = obj.querySelector is Function;
- assertTrue(q, type + " supports querySelector.");
- }, type + " supports querySelector");
+ assertTrue(q, type + ' supports querySelector.');
+ }, type + ' supports querySelector');
runTest(() {
var qa = obj.querySelectorAll is Function;
- assertTrue(qa, type + " supports querySelectorAll.");
- }, type + " supports querySelectorAll");
+ assertTrue(qa, type + ' supports querySelectorAll.');
+ }, type + ' supports querySelectorAll');
runTest(() {
- var list = obj.querySelectorAll("div");
+ var list = obj.querySelectorAll('div');
// TODO(jmesserly): testing List<Element> for now. It should return an
// ElementList which has extra properties. Needed for dart:html compat.
assertTrue(list is List<Element>,
- "The result should be an instance of a NodeList");
- }, type + ".querySelectorAll returns NodeList instance");
+ 'The result should be an instance of a NodeList');
+ }, type + '.querySelectorAll returns NodeList instance');
}
/*
* Verify that the NodeList returned by querySelectorAll is static and and that a new list is created after
* each call. A static list should not be affected by subsequent changes to the DOM.
*/
-verifyStaticList(type, root) {
+void verifyStaticList(type, root) {
var pre, post, preLength;
runTest(() {
- pre = root.querySelectorAll("div");
+ pre = root.querySelectorAll('div');
preLength = pre.length;
- var div = doc.createElement("div");
+ var div = doc.createElement('div');
(root is Document ? root.body : root).append(div);
assertEquals(
- pre.length, preLength, "The length of the NodeList should not change.");
- }, type + ": static NodeList");
+ pre.length, preLength, 'The length of the NodeList should not change.');
+ }, type + ': static NodeList');
runTest(() {
- post = root.querySelectorAll("div");
+ post = root.querySelectorAll('div');
assertEquals(post.length, preLength + 1,
- "The length of the new NodeList should be 1 more than the previous list.");
- }, type + ": new NodeList");
+ 'The length of the new NodeList should be 1 more than the previous list.');
+ }, type + ': new NodeList');
}
/*
* Verify handling of special values for the selector parameter, including stringification of
* null and undefined, and the handling of the empty string.
*/
-runSpecialSelectorTests(type, root) {
+void runSpecialSelectorTests(type, root) {
// Dart note: changed these tests because we don't have auto conversion to
// String like JavaScript does.
runTest(() {
// 1
assertEquals(root.querySelectorAll('null').length, 1,
"This should find one element with the tag name 'NULL'.");
- }, type + ".querySelectorAll null");
+ }, type + '.querySelectorAll null');
runTest(() {
// 2
assertEquals(root.querySelectorAll('undefined').length, 1,
"This should find one element with the tag name 'UNDEFINED'.");
- }, type + ".querySelectorAll undefined");
+ }, type + '.querySelectorAll undefined');
runTest(() {
// 3
assertThrows((e) => e is NoSuchMethodError, () {
root.querySelectorAll();
- }, "This should throw a TypeError.");
- }, type + ".querySelectorAll no parameter");
+ }, 'This should throw a TypeError.');
+ }, type + '.querySelectorAll no parameter');
runTest(() {
// 4
var elm = root.querySelector('null');
- assertNotEquals(elm, null, "This should find an element.");
+ assertNotEquals(elm, null, 'This should find an element.');
// TODO(jmesserly): change "localName" back to "tagName" once implemented.
assertEquals(
- elm.localName.toUpperCase(), "NULL", "The tag name should be 'NULL'.");
- }, type + ".querySelector null");
+ elm.localName.toUpperCase(), 'NULL', "The tag name should be 'NULL'.");
+ }, type + '.querySelector null');
runTest(() {
// 5
var elm = root.querySelector('undefined');
- assertNotEquals(elm, 'undefined', "This should find an element.");
+ assertNotEquals(elm, 'undefined', 'This should find an element.');
// TODO(jmesserly): change "localName" back to "tagName" once implemented.
- assertEquals(elm.localName.toUpperCase(), "UNDEFINED",
+ assertEquals(elm.localName.toUpperCase(), 'UNDEFINED',
"The tag name should be 'UNDEFINED'.");
- }, type + ".querySelector undefined");
+ }, type + '.querySelector undefined');
runTest(() {
// 6
assertThrows((e) => e is NoSuchMethodError, () {
root.querySelector();
- }, "This should throw a TypeError.");
- }, type + ".querySelector no parameter");
+ }, 'This should throw a TypeError.');
+ }, type + '.querySelector no parameter');
runTest(() {
// 7
- var result = root.querySelectorAll("*");
+ var result = root.querySelectorAll('*');
var i = 0;
traverse(root, (elem) {
if (!identical(elem, root)) {
assertEquals(
- elem, result[i], "The result in index $i should be in tree order.");
+ elem, result[i], 'The result in index $i should be in tree order.');
i++;
}
});
- }, type + ".querySelectorAll tree order");
+ }, type + '.querySelectorAll tree order');
}
/// Tests containing this string fail for an unknown reason
@@ -194,68 +194,68 @@
* Execute queries with the specified valid selectors for both querySelector() and querySelectorAll()
* Only run these tests when results are expected. Don't run for syntax error tests.
*/
-runValidSelectorTest(String type, root, List<Map<String, dynamic>> selectors,
- testType, docType) {
- var nodeType = "";
+void runValidSelectorTest(String type, root,
+ List<Map<String, dynamic>> selectors, testType, docType) {
+ var nodeType = '';
switch (root.nodeType) {
case Node.DOCUMENT_NODE:
- nodeType = "document";
+ nodeType = 'document';
break;
case Node.ELEMENT_NODE:
- nodeType = root.parentNode != null ? "element" : "detached";
+ nodeType = root.parentNode != null ? 'element' : 'detached';
break;
case Node.DOCUMENT_FRAGMENT_NODE:
- nodeType = "fragment";
+ nodeType = 'fragment';
break;
default:
- throw StateError("Reached unreachable code path.");
+ throw StateError('Reached unreachable code path.');
}
for (var i = 0; i < selectors.length; i++) {
var s = selectors[i];
- var n = s["name"];
+ var n = s['name'];
var skip = _getSkip(n);
- var q = s["selector"];
- var e = s["expect"];
+ var q = s['selector'];
+ var e = s['expect'];
- if ((s["exclude"] is! List ||
- (s["exclude"].indexOf(nodeType) == -1 &&
- s["exclude"].indexOf(docType) == -1)) &&
- (s["testType"] & testType != 0)) {
+ if ((s['exclude'] is! List ||
+ (s['exclude'].indexOf(nodeType) == -1 &&
+ s['exclude'].indexOf(docType) == -1)) &&
+ (s['testType'] & testType != 0)) {
//console.log("Running tests " + nodeType + ": " + s["testType"] + "&" + testType + "=" + (s["testType"] & testType) + ": " + JSON.stringify(s))
var foundall, found;
runTest(() {
foundall = root.querySelectorAll(q);
- assertNotEquals(foundall, null, "The method should not return null.");
+ assertNotEquals(foundall, null, 'The method should not return null.');
assertEquals(foundall.length, e.length,
- "The method should return the expected number of matches.");
+ 'The method should return the expected number of matches.');
for (var i = 0; i < e.length; i++) {
assertNotEquals(
- foundall[i], null, "The item in index $i should not be null.");
- assertEquals(foundall[i].attributes["id"], e[i],
- "The item in index $i should have the expected ID.");
- assertFalse(foundall[i].attributes.containsKey("data-clone"),
- "This should not be a cloned element.");
+ foundall[i], null, 'The item in index $i should not be null.');
+ assertEquals(foundall[i].attributes['id'], e[i],
+ 'The item in index $i should have the expected ID.');
+ assertFalse(foundall[i].attributes.containsKey('data-clone'),
+ 'This should not be a cloned element.');
}
- }, type + ".querySelectorAll: " + n + ": " + q, skip: skip);
+ }, type + '.querySelectorAll: ' + n + ': ' + q, skip: skip);
runTest(() {
found = root.querySelector(q);
if (e.isNotEmpty) {
- assertNotEquals(found, null, "The method should return a match.");
- assertEquals(found.attributes["id"], e[0],
- "The method should return the first match.");
+ assertNotEquals(found, null, 'The method should return a match.');
+ assertEquals(found.attributes['id'], e[0],
+ 'The method should return the first match.');
assertEquals(found, foundall[0],
- "The result should match the first item from querySelectorAll.");
- assertFalse(found.attributes.containsKey("data-clone"),
- "This should not be annotated as a cloned element.");
+ 'The result should match the first item from querySelectorAll.');
+ assertFalse(found.attributes.containsKey('data-clone'),
+ 'This should not be annotated as a cloned element.');
} else {
- assertEquals(found, null, "The method should not match anything.");
+ assertEquals(found, null, 'The method should not match anything.');
}
- }, type + ".querySelector: " + n + ": " + q, skip: skip);
+ }, type + '.querySelector: ' + n + ': ' + q, skip: skip);
} else {
//console.log("Excluding for " + nodeType + ": " + s["testType"] + "&" + testType + "=" + (s["testType"] & testType) + ": " + JSON.stringify(s))
}
@@ -266,28 +266,28 @@
* Execute queries with the specified invalid selectors for both querySelector() and querySelectorAll()
* Only run these tests when errors are expected. Don't run for valid selector tests.
*/
-runInvalidSelectorTest(String type, root, List selectors) {
+void runInvalidSelectorTest(String type, root, List selectors) {
for (var i = 0; i < selectors.length; i++) {
var s = selectors[i];
- var n = s["name"];
- var q = s["selector"];
+ var n = s['name'];
+ var q = s['selector'];
// Dart note: FormatException seems a reasonable mapping of SyntaxError
runTest(() {
assertThrows((e) => e is FormatException, () {
root.querySelector(q);
});
- }, type + ".querySelector: " + n + ": " + q);
+ }, type + '.querySelector: ' + n + ': ' + q);
runTest(() {
assertThrows((e) => e is FormatException, () {
root.querySelectorAll(q);
});
- }, type + ".querySelectorAll: " + n + ": " + q);
+ }, type + '.querySelectorAll: ' + n + ': ' + q);
}
}
-traverse(Node elem, void fn(Node elem)) {
+void traverse(Node elem, void Function(Node) fn) {
if (elem.nodeType == Node.ELEMENT_NODE) {
fn(elem);
}
@@ -298,19 +298,19 @@
}
}
-runTest(Function body, String name, {String skip}) =>
+void runTest(Function body, String name, {String skip}) =>
unittest.test(name, body, skip: skip);
-assertTrue(bool value, String reason) =>
+void assertTrue(bool value, String reason) =>
unittest.expect(value, unittest.isTrue, reason: reason);
-assertFalse(bool value, String reason) =>
+void assertFalse(bool value, String reason) =>
unittest.expect(value, unittest.isFalse, reason: reason);
-assertEquals(x, y, String reason) => unittest.expect(x, y, reason: reason);
+void assertEquals(x, y, String reason) => unittest.expect(x, y, reason: reason);
-assertNotEquals(x, y, String reason) =>
+void assertNotEquals(x, y, String reason) =>
unittest.expect(x, unittest.isNot(y), reason: reason);
-assertThrows(exception, body(), [String reason]) =>
+void assertThrows(exception, void Function() body, [String reason]) =>
unittest.expect(body, unittest.throwsA(exception), reason: reason);
diff --git a/test/selectors/selectors.dart b/test/selectors/selectors.dart
index 9810f5f..e18f264 100644
--- a/test/selectors/selectors.dart
+++ b/test/selectors/selectors.dart
@@ -21,41 +21,41 @@
* selector: The selector to test
*/
final invalidSelectors = [
- {'name': "Empty String", 'selector': ""},
- {'name': "Invalid character", 'selector': "["},
- {'name': "Invalid character", 'selector': "]"},
- {'name': "Invalid character", 'selector': "("},
- {'name': "Invalid character", 'selector': ")"},
- {'name': "Invalid character", 'selector': "{"},
- {'name': "Invalid character", 'selector': "}"},
- {'name': "Invalid character", 'selector': "<"},
- {'name': "Invalid character", 'selector': ">"},
- {'name': "Invalid ID", 'selector': "#"},
- {'name': "Invalid group of selectors", 'selector': "div,"},
- {'name': "Invalid class", 'selector': "."},
- {'name': "Invalid class", 'selector': ".5cm"},
- {'name': "Invalid class", 'selector': "..test"},
- {'name': "Invalid class", 'selector': ".foo..quux"},
- {'name': "Invalid class", 'selector': ".bar."},
- {'name': "Invalid combinator", 'selector': "div & address, p"},
- {'name': "Invalid combinator", 'selector': "div >> address, p"},
- {'name': "Invalid combinator", 'selector': "div ++ address, p"},
- {'name': "Invalid combinator", 'selector': "div ~~ address, p"},
- {'name': "Invalid [att=value] selector", 'selector': "[*=test]"},
- {'name': "Invalid [att=value] selector", 'selector': "[*|*=test]"},
+ {'name': 'Empty String', 'selector': ''},
+ {'name': 'Invalid character', 'selector': '['},
+ {'name': 'Invalid character', 'selector': ']'},
+ {'name': 'Invalid character', 'selector': '('},
+ {'name': 'Invalid character', 'selector': ')'},
+ {'name': 'Invalid character', 'selector': '{'},
+ {'name': 'Invalid character', 'selector': '}'},
+ {'name': 'Invalid character', 'selector': '<'},
+ {'name': 'Invalid character', 'selector': '>'},
+ {'name': 'Invalid ID', 'selector': '#'},
+ {'name': 'Invalid group of selectors', 'selector': 'div,'},
+ {'name': 'Invalid class', 'selector': '.'},
+ {'name': 'Invalid class', 'selector': '.5cm'},
+ {'name': 'Invalid class', 'selector': '..test'},
+ {'name': 'Invalid class', 'selector': '.foo..quux'},
+ {'name': 'Invalid class', 'selector': '.bar.'},
+ {'name': 'Invalid combinator', 'selector': 'div & address, p'},
+ {'name': 'Invalid combinator', 'selector': 'div >> address, p'},
+ {'name': 'Invalid combinator', 'selector': 'div ++ address, p'},
+ {'name': 'Invalid combinator', 'selector': 'div ~~ address, p'},
+ {'name': 'Invalid [att=value] selector', 'selector': '[*=test]'},
+ {'name': 'Invalid [att=value] selector', 'selector': '[*|*=test]'},
{
- 'name': "Invalid [att=value] selector",
- 'selector': "[class= space unquoted ]"
+ 'name': 'Invalid [att=value] selector',
+ 'selector': '[class= space unquoted ]'
},
- {'name': "Unknown pseudo-class", 'selector': "div:example"},
- {'name': "Unknown pseudo-class", 'selector': ":example"},
- {'name': "Unknown pseudo-element", 'selector': "div::example"},
- {'name': "Unknown pseudo-element", 'selector': "::example"},
- {'name': "Invalid pseudo-element", 'selector': ":::before"},
- {'name': "Undeclared namespace", 'selector': "ns|div"},
- {'name': "Undeclared namespace", 'selector': ":not(ns|div)"},
- {'name': "Invalid namespace", 'selector': "^|div"},
- {'name': "Invalid namespace", 'selector': "\$|div"}
+ {'name': 'Unknown pseudo-class', 'selector': 'div:example'},
+ {'name': 'Unknown pseudo-class', 'selector': ':example'},
+ {'name': 'Unknown pseudo-element', 'selector': 'div::example'},
+ {'name': 'Unknown pseudo-element', 'selector': '::example'},
+ {'name': 'Invalid pseudo-element', 'selector': ':::before'},
+ {'name': 'Undeclared namespace', 'selector': 'ns|div'},
+ {'name': 'Undeclared namespace', 'selector': ':not(ns|div)'},
+ {'name': 'Invalid namespace', 'selector': '^|div'},
+ {'name': 'Invalid namespace', 'selector': '\$|div'}
];
/*
@@ -77,34 +77,34 @@
var validSelectors = [
// Type Selector
{
- 'name': "Type selector, matching html element",
- 'selector': "html",
- 'expect': ["html"],
- 'exclude': ["element", "fragment", "detached"],
+ 'name': 'Type selector, matching html element',
+ 'selector': 'html',
+ 'expect': ['html'],
+ 'exclude': ['element', 'fragment', 'detached'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
- 'name': "Type selector, matching html element",
- 'selector': "html",
+ 'name': 'Type selector, matching html element',
+ 'selector': 'html',
'expect': [] /*no matches*/,
- 'exclude': ["document"],
+ 'exclude': ['document'],
'level': 1,
'testType': testQsaBaseline
},
{
- 'name': "Type selector, matching body element",
- 'selector': "body",
- 'expect': ["body"],
- 'exclude': ["element", "fragment", "detached"],
+ 'name': 'Type selector, matching body element',
+ 'selector': 'body',
+ 'expect': ['body'],
+ 'exclude': ['element', 'fragment', 'detached'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
- 'name': "Type selector, matching body element",
- 'selector': "body",
+ 'name': 'Type selector, matching body element',
+ 'selector': 'body',
'expect': [] /*no matches*/,
- 'exclude': ["document"],
+ 'exclude': ['document'],
'level': 1,
'testType': testQsaBaseline
},
@@ -113,54 +113,54 @@
// Testing "*" for entire an entire context node is handled separately.
{
'name':
- "Universal selector, matching all children of element with specified ID",
- 'selector': "#universal>*",
+ 'Universal selector, matching all children of element with specified ID',
+ 'selector': '#universal>*',
'expect': [
- "universal-p1",
- "universal-hr1",
- "universal-pre1",
- "universal-p2",
- "universal-address1"
+ 'universal-p1',
+ 'universal-hr1',
+ 'universal-pre1',
+ 'universal-p2',
+ 'universal-address1'
],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Universal selector, matching all grandchildren of element with specified ID",
- 'selector': "#universal>*>*",
+ 'Universal selector, matching all grandchildren of element with specified ID',
+ 'selector': '#universal>*>*',
'expect': [
- "universal-code1",
- "universal-span1",
- "universal-a1",
- "universal-code2"
+ 'universal-code1',
+ 'universal-span1',
+ 'universal-a1',
+ 'universal-code2'
],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Universal selector, matching all children of empty element with specified ID",
- 'selector': "#empty>*",
+ 'Universal selector, matching all children of empty element with specified ID',
+ 'selector': '#empty>*',
'expect': [] /*no matches*/,
'level': 2,
'testType': testQsaBaseline
},
{
'name':
- "Universal selector, matching all descendants of element with specified ID",
- 'selector': "#universal *",
+ 'Universal selector, matching all descendants of element with specified ID',
+ 'selector': '#universal *',
'expect': [
- "universal-p1",
- "universal-code1",
- "universal-hr1",
- "universal-pre1",
- "universal-span1",
- "universal-p2",
- "universal-a1",
- "universal-address1",
- "universal-code2",
- "universal-a2"
+ 'universal-p1',
+ 'universal-code1',
+ 'universal-hr1',
+ 'universal-pre1',
+ 'universal-span1',
+ 'universal-p2',
+ 'universal-a1',
+ 'universal-address1',
+ 'universal-code2',
+ 'universal-a2'
],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
@@ -169,84 +169,84 @@
// Attribute Selectors
// - presence [att]
{
- 'name': "Attribute presence selector, matching align attribute with value",
- 'selector': ".attr-presence-div1[align]",
- 'expect': ["attr-presence-div1"],
+ 'name': 'Attribute presence selector, matching align attribute with value',
+ 'selector': '.attr-presence-div1[align]',
+ 'expect': ['attr-presence-div1'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Attribute presence selector, matching align attribute with empty value",
- 'selector': ".attr-presence-div2[align]",
- 'expect': ["attr-presence-div2"],
+ 'Attribute presence selector, matching align attribute with empty value',
+ 'selector': '.attr-presence-div2[align]',
+ 'expect': ['attr-presence-div2'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Attribute presence selector, matching title attribute, case insensitivity",
- 'selector': "#attr-presence [TiTlE]",
- 'expect': ["attr-presence-a1", "attr-presence-span1"],
- 'exclude': ["xhtml"],
+ 'Attribute presence selector, matching title attribute, case insensitivity',
+ 'selector': '#attr-presence [TiTlE]',
+ 'expect': ['attr-presence-a1', 'attr-presence-span1'],
+ 'exclude': ['xhtml'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Attribute presence selector, not matching title attribute, case sensitivity",
- 'selector': "#attr-presence [TiTlE]",
+ 'Attribute presence selector, not matching title attribute, case sensitivity',
+ 'selector': '#attr-presence [TiTlE]',
'expect': [],
- 'exclude': ["html"],
+ 'exclude': ['html'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
- 'name': "Attribute presence selector, matching custom data-* attribute",
- 'selector': "[data-attr-presence]",
- 'expect': ["attr-presence-pre1", "attr-presence-blockquote1"],
+ 'name': 'Attribute presence selector, matching custom data-* attribute',
+ 'selector': '[data-attr-presence]',
+ 'expect': ['attr-presence-pre1', 'attr-presence-blockquote1'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Attribute presence selector, not matching attribute with similar name",
- 'selector': ".attr-presence-div3[align], .attr-presence-div4[align]",
+ 'Attribute presence selector, not matching attribute with similar name',
+ 'selector': '.attr-presence-div3[align], .attr-presence-div4[align]',
'expect': [] /*no matches*/,
'level': 2,
'testType': testQsaBaseline
},
{
'name':
- "Attribute presence selector, matching attribute with non-ASCII characters",
- 'selector': "ul[data-中文]",
- 'expect': ["attr-presence-ul1"],
+ 'Attribute presence selector, matching attribute with non-ASCII characters',
+ 'selector': 'ul[data-中文]',
+ 'expect': ['attr-presence-ul1'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Attribute presence selector, not matching default option without selected attribute",
- 'selector': "#attr-presence-select1 option[selected]",
+ 'Attribute presence selector, not matching default option without selected attribute',
+ 'selector': '#attr-presence-select1 option[selected]',
'expect': [] /* no matches */,
'level': 2,
'testType': testQsaBaseline
},
{
'name':
- "Attribute presence selector, matching option with selected attribute",
- 'selector': "#attr-presence-select2 option[selected]",
- 'expect': ["attr-presence-select2-option4"],
+ 'Attribute presence selector, matching option with selected attribute',
+ 'selector': '#attr-presence-select2 option[selected]',
+ 'expect': ['attr-presence-select2-option4'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Attribute presence selector, matching multiple options with selected attributes",
- 'selector': "#attr-presence-select3 option[selected]",
+ 'Attribute presence selector, matching multiple options with selected attributes',
+ 'selector': '#attr-presence-select3 option[selected]',
'expect': [
- "attr-presence-select3-option2",
- "attr-presence-select3-option3"
+ 'attr-presence-select3-option2',
+ 'attr-presence-select3-option3'
],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
@@ -254,101 +254,101 @@
// - value [att=val]
{
- 'name': "Attribute value selector, matching align attribute with value",
- 'selector': "#attr-value [align=\"center\"]",
- 'expect': ["attr-value-div1"],
+ 'name': 'Attribute value selector, matching align attribute with value',
+ 'selector': '#attr-value [align=\"center\"]',
+ 'expect': ['attr-value-div1'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Attribute value selector, matching align attribute with empty value",
- 'selector': "#attr-value [align=\"\"]",
- 'expect': ["attr-value-div2"],
+ 'Attribute value selector, matching align attribute with empty value',
+ 'selector': '#attr-value [align=\"\"]',
+ 'expect': ['attr-value-div2'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Attribute value selector, not matching align attribute with partial value",
- 'selector': "#attr-value [align=\"c\"]",
+ 'Attribute value selector, not matching align attribute with partial value',
+ 'selector': '#attr-value [align=\"c\"]',
'expect': [] /*no matches*/,
'level': 2,
'testType': testQsaBaseline
},
{
'name':
- "Attribute value selector, not matching align attribute with incorrect value",
- 'selector': "#attr-value [align=\"centera\"]",
+ 'Attribute value selector, not matching align attribute with incorrect value',
+ 'selector': '#attr-value [align=\"centera\"]',
'expect': [] /*no matches*/,
'level': 2,
'testType': testQsaBaseline
},
{
'name':
- "Attribute value selector, matching custom data-* attribute with unicode escaped value",
- 'selector': "[data-attr-value=\"\\e9\"]",
- 'expect': ["attr-value-div3"],
+ 'Attribute value selector, matching custom data-* attribute with unicode escaped value',
+ 'selector': '[data-attr-value=\"\\e9\"]',
+ 'expect': ['attr-value-div3'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Attribute value selector, matching custom data-* attribute with escaped character",
- 'selector': "[data-attr-value\_foo=\"\\e9\"]",
- 'expect': ["attr-value-div4"],
+ 'Attribute value selector, matching custom data-* attribute with escaped character',
+ 'selector': '[data-attr-value\_foo=\"\\e9\"]',
+ 'expect': ['attr-value-div4'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Attribute value selector with single-quoted value, matching multiple inputs with type attributes",
+ 'Attribute value selector with single-quoted value, matching multiple inputs with type attributes',
'selector':
"#attr-value input[type='hidden'],#attr-value input[type='radio']",
'expect': [
- "attr-value-input3",
- "attr-value-input4",
- "attr-value-input6",
- "attr-value-input8",
- "attr-value-input9"
+ 'attr-value-input3',
+ 'attr-value-input4',
+ 'attr-value-input6',
+ 'attr-value-input8',
+ 'attr-value-input9'
],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Attribute value selector with double-quoted value, matching multiple inputs with type attributes",
+ 'Attribute value selector with double-quoted value, matching multiple inputs with type attributes',
'selector':
"#attr-value input[type=\"hidden\"],#attr-value input[type='radio']",
'expect': [
- "attr-value-input3",
- "attr-value-input4",
- "attr-value-input6",
- "attr-value-input8",
- "attr-value-input9"
+ 'attr-value-input3',
+ 'attr-value-input4',
+ 'attr-value-input6',
+ 'attr-value-input8',
+ 'attr-value-input9'
],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Attribute value selector with unquoted value, matching multiple inputs with type attributes",
- 'selector': "#attr-value input[type=hidden],#attr-value input[type=radio]",
+ 'Attribute value selector with unquoted value, matching multiple inputs with type attributes',
+ 'selector': '#attr-value input[type=hidden],#attr-value input[type=radio]',
'expect': [
- "attr-value-input3",
- "attr-value-input4",
- "attr-value-input6",
- "attr-value-input8",
- "attr-value-input9"
+ 'attr-value-input3',
+ 'attr-value-input4',
+ 'attr-value-input6',
+ 'attr-value-input8',
+ 'attr-value-input9'
],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Attribute value selector, matching attribute with value using non-ASCII characters",
- 'selector': "[data-attr-value=中文]",
- 'expect': ["attr-value-div5"],
+ 'Attribute value selector, matching attribute with value using non-ASCII characters',
+ 'selector': '[data-attr-value=中文]',
+ 'expect': ['attr-value-div5'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
@@ -356,102 +356,102 @@
// - whitespace-separated list [att~=val]
{
'name':
- "Attribute whitespace-separated list selector, matching class attribute with value",
- 'selector': "#attr-whitespace [class~=\"div1\"]",
- 'expect': ["attr-whitespace-div1"],
+ 'Attribute whitespace-separated list selector, matching class attribute with value',
+ 'selector': '#attr-whitespace [class~=\"div1\"]',
+ 'expect': ['attr-whitespace-div1'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Attribute whitespace-separated list selector, not matching class attribute with empty value",
- 'selector': "#attr-whitespace [class~=\"\"]",
+ 'Attribute whitespace-separated list selector, not matching class attribute with empty value',
+ 'selector': '#attr-whitespace [class~=\"\"]',
'expect': [] /*no matches*/,
'level': 2,
'testType': testQsaBaseline
},
{
'name':
- "Attribute whitespace-separated list selector, not matching class attribute with partial value",
- 'selector': "[data-attr-whitespace~=\"div\"]",
+ 'Attribute whitespace-separated list selector, not matching class attribute with partial value',
+ 'selector': '[data-attr-whitespace~=\"div\"]',
'expect': [] /*no matches*/,
'level': 2,
'testType': testQsaBaseline
},
{
'name':
- "Attribute whitespace-separated list selector, matching custom data-* attribute with unicode escaped value",
- 'selector': "[data-attr-whitespace~=\"\\0000e9\"]",
- 'expect': ["attr-whitespace-div4"],
+ 'Attribute whitespace-separated list selector, matching custom data-* attribute with unicode escaped value',
+ 'selector': '[data-attr-whitespace~=\"\\0000e9\"]',
+ 'expect': ['attr-whitespace-div4'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Attribute whitespace-separated list selector, matching custom data-* attribute with escaped character",
- 'selector': "[data-attr-whitespace\_foo~=\"\\e9\"]",
- 'expect': ["attr-whitespace-div5"],
+ 'Attribute whitespace-separated list selector, matching custom data-* attribute with escaped character',
+ 'selector': '[data-attr-whitespace\_foo~=\"\\e9\"]',
+ 'expect': ['attr-whitespace-div5'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Attribute whitespace-separated list selector with single-quoted value, matching multiple links with rel attributes",
+ 'Attribute whitespace-separated list selector with single-quoted value, matching multiple links with rel attributes',
'selector':
"#attr-whitespace a[rel~='bookmark'], #attr-whitespace a[rel~='nofollow']",
'expect': [
- "attr-whitespace-a1",
- "attr-whitespace-a2",
- "attr-whitespace-a3",
- "attr-whitespace-a5",
- "attr-whitespace-a7"
+ 'attr-whitespace-a1',
+ 'attr-whitespace-a2',
+ 'attr-whitespace-a3',
+ 'attr-whitespace-a5',
+ 'attr-whitespace-a7'
],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Attribute whitespace-separated list selector with double-quoted value, matching multiple links with rel attributes",
+ 'Attribute whitespace-separated list selector with double-quoted value, matching multiple links with rel attributes',
'selector':
"#attr-whitespace a[rel~=\"bookmark\"],#attr-whitespace a[rel~='nofollow']",
'expect': [
- "attr-whitespace-a1",
- "attr-whitespace-a2",
- "attr-whitespace-a3",
- "attr-whitespace-a5",
- "attr-whitespace-a7"
+ 'attr-whitespace-a1',
+ 'attr-whitespace-a2',
+ 'attr-whitespace-a3',
+ 'attr-whitespace-a5',
+ 'attr-whitespace-a7'
],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Attribute whitespace-separated list selector with unquoted value, matching multiple links with rel attributes",
+ 'Attribute whitespace-separated list selector with unquoted value, matching multiple links with rel attributes',
'selector':
- "#attr-whitespace a[rel~=bookmark], #attr-whitespace a[rel~=nofollow]",
+ '#attr-whitespace a[rel~=bookmark], #attr-whitespace a[rel~=nofollow]',
'expect': [
- "attr-whitespace-a1",
- "attr-whitespace-a2",
- "attr-whitespace-a3",
- "attr-whitespace-a5",
- "attr-whitespace-a7"
+ 'attr-whitespace-a1',
+ 'attr-whitespace-a2',
+ 'attr-whitespace-a3',
+ 'attr-whitespace-a5',
+ 'attr-whitespace-a7'
],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Attribute whitespace-separated list selector with double-quoted value, not matching value with space",
- 'selector': "#attr-whitespace a[rel~=\"book mark\"]",
+ 'Attribute whitespace-separated list selector with double-quoted value, not matching value with space',
+ 'selector': '#attr-whitespace a[rel~=\"book mark\"]',
'expect': [] /* no matches */,
'level': 2,
'testType': testQsaBaseline
},
{
'name':
- "Attribute whitespace-separated list selector, matching title attribute with value using non-ASCII characters",
- 'selector': "#attr-whitespace [title~=中文]",
- 'expect': ["attr-whitespace-p1"],
+ 'Attribute whitespace-separated list selector, matching title attribute with value using non-ASCII characters',
+ 'selector': '#attr-whitespace [title~=中文]',
+ 'expect': ['attr-whitespace-p1'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
@@ -459,32 +459,32 @@
// - hyphen-separated list [att|=val]
{
'name':
- "Attribute hyphen-separated list selector, not matching unspecified lang attribute",
- 'selector': "#attr-hyphen-div1[lang|=\"en\"]",
+ 'Attribute hyphen-separated list selector, not matching unspecified lang attribute',
+ 'selector': '#attr-hyphen-div1[lang|=\"en\"]',
'expect': [] /*no matches*/,
'level': 2,
'testType': testQsaBaseline
},
{
'name':
- "Attribute hyphen-separated list selector, matching lang attribute with exact value",
- 'selector': "#attr-hyphen-div2[lang|=\"fr\"]",
- 'expect': ["attr-hyphen-div2"],
+ 'Attribute hyphen-separated list selector, matching lang attribute with exact value',
+ 'selector': '#attr-hyphen-div2[lang|=\"fr\"]',
+ 'expect': ['attr-hyphen-div2'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Attribute hyphen-separated list selector, matching lang attribute with partial value",
- 'selector': "#attr-hyphen-div3[lang|=\"en\"]",
- 'expect': ["attr-hyphen-div3"],
+ 'Attribute hyphen-separated list selector, matching lang attribute with partial value',
+ 'selector': '#attr-hyphen-div3[lang|=\"en\"]',
+ 'expect': ['attr-hyphen-div3'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Attribute hyphen-separated list selector, not matching incorrect value",
- 'selector': "#attr-hyphen-div4[lang|=\"es-AR\"]",
+ 'Attribute hyphen-separated list selector, not matching incorrect value',
+ 'selector': '#attr-hyphen-div4[lang|=\"es-AR\"]',
'expect': [] /*no matches*/,
'level': 2,
'testType': testQsaBaseline
@@ -493,48 +493,48 @@
// - substring begins-with [att^=val] (Level 3)
{
'name':
- "Attribute begins with selector, matching href attributes beginning with specified substring",
- 'selector': "#attr-begins a[href^=\"http://www\"]",
- 'expect': ["attr-begins-a1", "attr-begins-a3"],
+ 'Attribute begins with selector, matching href attributes beginning with specified substring',
+ 'selector': '#attr-begins a[href^=\"http://www\"]',
+ 'expect': ['attr-begins-a1', 'attr-begins-a3'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "Attribute begins with selector, matching lang attributes beginning with specified substring, ",
- 'selector': "#attr-begins [lang^=\"en-\"]",
- 'expect': ["attr-begins-div2", "attr-begins-div4"],
+ 'Attribute begins with selector, matching lang attributes beginning with specified substring, ',
+ 'selector': '#attr-begins [lang^=\"en-\"]',
+ 'expect': ['attr-begins-div2', 'attr-begins-div4'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "Attribute begins with selector, not matching class attribute not beginning with specified substring",
- 'selector': "#attr-begins [class^=apple]",
+ 'Attribute begins with selector, not matching class attribute not beginning with specified substring',
+ 'selector': '#attr-begins [class^=apple]',
'expect': [] /*no matches*/,
'level': 3,
'testType': testQsaAdditional
},
{
'name':
- "Attribute begins with selector with single-quoted value, matching class attribute beginning with specified substring",
+ 'Attribute begins with selector with single-quoted value, matching class attribute beginning with specified substring',
'selector': "#attr-begins [class^=' apple']",
- 'expect': ["attr-begins-p1"],
+ 'expect': ['attr-begins-p1'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "Attribute begins with selector with double-quoted value, matching class attribute beginning with specified substring",
- 'selector': "#attr-begins [class^=\" apple\"]",
- 'expect': ["attr-begins-p1"],
+ 'Attribute begins with selector with double-quoted value, matching class attribute beginning with specified substring',
+ 'selector': '#attr-begins [class^=\" apple\"]',
+ 'expect': ['attr-begins-p1'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "Attribute begins with selector with unquoted value, not matching class attribute not beginning with specified substring",
- 'selector': "#attr-begins [class^= apple]",
+ 'Attribute begins with selector with unquoted value, not matching class attribute not beginning with specified substring',
+ 'selector': '#attr-begins [class^= apple]',
'expect': [] /*no matches*/,
'level': 3,
'testType': testQsaAdditional
@@ -543,48 +543,48 @@
// - substring ends-with [att\$=val] (Level 3)
{
'name':
- "Attribute ends with selector, matching href attributes ending with specified substring",
- 'selector': "#attr-ends a[href\$=\".org\"]",
- 'expect': ["attr-ends-a1", "attr-ends-a3"],
+ 'Attribute ends with selector, matching href attributes ending with specified substring',
+ 'selector': '#attr-ends a[href\$=\".org\"]',
+ 'expect': ['attr-ends-a1', 'attr-ends-a3'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "Attribute ends with selector, matching lang attributes ending with specified substring, ",
- 'selector': "#attr-ends [lang\$=\"-CH\"]",
- 'expect': ["attr-ends-div2", "attr-ends-div4"],
+ 'Attribute ends with selector, matching lang attributes ending with specified substring, ',
+ 'selector': '#attr-ends [lang\$=\"-CH\"]',
+ 'expect': ['attr-ends-div2', 'attr-ends-div4'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "Attribute ends with selector, not matching class attribute not ending with specified substring",
- 'selector': "#attr-ends [class\$=apple]",
+ 'Attribute ends with selector, not matching class attribute not ending with specified substring',
+ 'selector': '#attr-ends [class\$=apple]',
'expect': [] /*no matches*/,
'level': 3,
'testType': testQsaAdditional
},
{
'name':
- "Attribute ends with selector with single-quoted value, matching class attribute ending with specified substring",
+ 'Attribute ends with selector with single-quoted value, matching class attribute ending with specified substring',
'selector': "#attr-ends [class\$='apple ']",
- 'expect': ["attr-ends-p1"],
+ 'expect': ['attr-ends-p1'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "Attribute ends with selector with double-quoted value, matching class attribute ending with specified substring",
- 'selector': "#attr-ends [class\$=\"apple \"]",
- 'expect': ["attr-ends-p1"],
+ 'Attribute ends with selector with double-quoted value, matching class attribute ending with specified substring',
+ 'selector': '#attr-ends [class\$=\"apple \"]',
+ 'expect': ['attr-ends-p1'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "Attribute ends with selector with unquoted value, not matching class attribute not ending with specified substring",
- 'selector': "#attr-ends [class\$=apple ]",
+ 'Attribute ends with selector with unquoted value, not matching class attribute not ending with specified substring',
+ 'selector': '#attr-ends [class\$=apple ]',
'expect': [] /*no matches*/,
'level': 3,
'testType': testQsaAdditional
@@ -593,113 +593,113 @@
// - substring contains [att*=val] (Level 3)
{
'name':
- "Attribute contains selector, matching href attributes beginning with specified substring",
- 'selector': "#attr-contains a[href*=\"http://www\"]",
- 'expect': ["attr-contains-a1", "attr-contains-a3"],
+ 'Attribute contains selector, matching href attributes beginning with specified substring',
+ 'selector': '#attr-contains a[href*=\"http://www\"]',
+ 'expect': ['attr-contains-a1', 'attr-contains-a3'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "Attribute contains selector, matching href attributes ending with specified substring",
- 'selector': "#attr-contains a[href*=\".org\"]",
- 'expect': ["attr-contains-a1", "attr-contains-a2"],
+ 'Attribute contains selector, matching href attributes ending with specified substring',
+ 'selector': '#attr-contains a[href*=\".org\"]',
+ 'expect': ['attr-contains-a1', 'attr-contains-a2'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "Attribute contains selector, matching href attributes containing specified substring",
- 'selector': "#attr-contains a[href*=\".example.\"]",
- 'expect': ["attr-contains-a1", "attr-contains-a3"],
+ 'Attribute contains selector, matching href attributes containing specified substring',
+ 'selector': '#attr-contains a[href*=\".example.\"]',
+ 'expect': ['attr-contains-a1', 'attr-contains-a3'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "Attribute contains selector, matching lang attributes beginning with specified substring, ",
- 'selector': "#attr-contains [lang*=\"en-\"]",
- 'expect': ["attr-contains-div2", "attr-contains-div6"],
+ 'Attribute contains selector, matching lang attributes beginning with specified substring, ',
+ 'selector': '#attr-contains [lang*=\"en-\"]',
+ 'expect': ['attr-contains-div2', 'attr-contains-div6'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "Attribute contains selector, matching lang attributes ending with specified substring, ",
- 'selector': "#attr-contains [lang*=\"-CH\"]",
- 'expect': ["attr-contains-div3", "attr-contains-div5"],
+ 'Attribute contains selector, matching lang attributes ending with specified substring, ',
+ 'selector': '#attr-contains [lang*=\"-CH\"]',
+ 'expect': ['attr-contains-div3', 'attr-contains-div5'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "Attribute contains selector with single-quoted value, matching class attribute beginning with specified substring",
+ 'Attribute contains selector with single-quoted value, matching class attribute beginning with specified substring',
'selector': "#attr-contains [class*=' apple']",
- 'expect': ["attr-contains-p1"],
+ 'expect': ['attr-contains-p1'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "Attribute contains selector with single-quoted value, matching class attribute ending with specified substring",
+ 'Attribute contains selector with single-quoted value, matching class attribute ending with specified substring',
'selector': "#attr-contains [class*='orange ']",
- 'expect': ["attr-contains-p1"],
+ 'expect': ['attr-contains-p1'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "Attribute contains selector with single-quoted value, matching class attribute containing specified substring",
+ 'Attribute contains selector with single-quoted value, matching class attribute containing specified substring',
'selector': "#attr-contains [class*='ple banana ora']",
- 'expect': ["attr-contains-p1"],
+ 'expect': ['attr-contains-p1'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "Attribute contains selector with double-quoted value, matching class attribute beginning with specified substring",
- 'selector': "#attr-contains [class*=\" apple\"]",
- 'expect': ["attr-contains-p1"],
+ 'Attribute contains selector with double-quoted value, matching class attribute beginning with specified substring',
+ 'selector': '#attr-contains [class*=\" apple\"]',
+ 'expect': ['attr-contains-p1'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "Attribute contains selector with double-quoted value, matching class attribute ending with specified substring",
- 'selector': "#attr-contains [class*=\"orange \"]",
- 'expect': ["attr-contains-p1"],
+ 'Attribute contains selector with double-quoted value, matching class attribute ending with specified substring',
+ 'selector': '#attr-contains [class*=\"orange \"]',
+ 'expect': ['attr-contains-p1'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "Attribute contains selector with double-quoted value, matching class attribute containing specified substring",
- 'selector': "#attr-contains [class*=\"ple banana ora\"]",
- 'expect': ["attr-contains-p1"],
+ 'Attribute contains selector with double-quoted value, matching class attribute containing specified substring',
+ 'selector': '#attr-contains [class*=\"ple banana ora\"]',
+ 'expect': ['attr-contains-p1'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "Attribute contains selector with unquoted value, matching class attribute beginning with specified substring",
- 'selector': "#attr-contains [class*= apple]",
- 'expect': ["attr-contains-p1"],
+ 'Attribute contains selector with unquoted value, matching class attribute beginning with specified substring',
+ 'selector': '#attr-contains [class*= apple]',
+ 'expect': ['attr-contains-p1'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "Attribute contains selector with unquoted value, matching class attribute ending with specified substring",
- 'selector': "#attr-contains [class*=orange ]",
- 'expect': ["attr-contains-p1"],
+ 'Attribute contains selector with unquoted value, matching class attribute ending with specified substring',
+ 'selector': '#attr-contains [class*=orange ]',
+ 'expect': ['attr-contains-p1'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "Attribute contains selector with unquoted value, matching class attribute containing specified substring",
- 'selector': "#attr-contains [class*= banana ]",
- 'expect': ["attr-contains-p1"],
+ 'Attribute contains selector with unquoted value, matching class attribute containing specified substring',
+ 'selector': '#attr-contains [class*= banana ]',
+ 'expect': ['attr-contains-p1'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
@@ -707,227 +707,227 @@
// Pseudo-classes
// - :root (Level 3)
{
- 'name': ":root pseudo-class selector, matching document root element",
- 'selector': ":root",
- 'expect': ["html"],
- 'exclude': ["element", "fragment", "detached"],
+ 'name': ':root pseudo-class selector, matching document root element',
+ 'selector': ':root',
+ 'expect': ['html'],
+ 'exclude': ['element', 'fragment', 'detached'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
- 'name': ":root pseudo-class selector, not matching document root element",
- 'selector': ":root",
+ 'name': ':root pseudo-class selector, not matching document root element',
+ 'selector': ':root',
'expect': [] /*no matches*/,
- 'exclude': ["document"],
+ 'exclude': ['document'],
'level': 3,
'testType': testQsaAdditional
},
// - :nth-child(n) (Level 3)
{
- 'name': ":nth-child selector, matching the third child element",
- 'selector': "#pseudo-nth-table1 :nth-child(3)",
+ 'name': ':nth-child selector, matching the third child element',
+ 'selector': '#pseudo-nth-table1 :nth-child(3)',
'expect': [
- "pseudo-nth-td3",
- "pseudo-nth-td9",
- "pseudo-nth-tr3",
- "pseudo-nth-td15"
+ 'pseudo-nth-td3',
+ 'pseudo-nth-td9',
+ 'pseudo-nth-tr3',
+ 'pseudo-nth-td15'
],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
- 'name': ":nth-child selector, matching every third child element",
- 'selector': "#pseudo-nth li:nth-child(3n)",
+ 'name': ':nth-child selector, matching every third child element',
+ 'selector': '#pseudo-nth li:nth-child(3n)',
'expect': [
- "pseudo-nth-li3",
- "pseudo-nth-li6",
- "pseudo-nth-li9",
- "pseudo-nth-li12"
+ 'pseudo-nth-li3',
+ 'pseudo-nth-li6',
+ 'pseudo-nth-li9',
+ 'pseudo-nth-li12'
],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- ":nth-child selector, matching every second child element, starting from the fourth",
- 'selector': "#pseudo-nth li:nth-child(2n+4)",
+ ':nth-child selector, matching every second child element, starting from the fourth',
+ 'selector': '#pseudo-nth li:nth-child(2n+4)',
'expect': [
- "pseudo-nth-li4",
- "pseudo-nth-li6",
- "pseudo-nth-li8",
- "pseudo-nth-li10",
- "pseudo-nth-li12"
+ 'pseudo-nth-li4',
+ 'pseudo-nth-li6',
+ 'pseudo-nth-li8',
+ 'pseudo-nth-li10',
+ 'pseudo-nth-li12'
],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- ":nth-child selector, matching every fourth child element, starting from the third",
- 'selector': "#pseudo-nth-p1 :nth-child(4n-1)",
- 'expect': ["pseudo-nth-em2", "pseudo-nth-span3"],
+ ':nth-child selector, matching every fourth child element, starting from the third',
+ 'selector': '#pseudo-nth-p1 :nth-child(4n-1)',
+ 'expect': ['pseudo-nth-em2', 'pseudo-nth-span3'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
// - :nth-last-child (Level 3)
{
- 'name': ":nth-last-child selector, matching the third last child element",
- 'selector': "#pseudo-nth-table1 :nth-last-child(3)",
+ 'name': ':nth-last-child selector, matching the third last child element',
+ 'selector': '#pseudo-nth-table1 :nth-last-child(3)',
'expect': [
- "pseudo-nth-tr1",
- "pseudo-nth-td4",
- "pseudo-nth-td10",
- "pseudo-nth-td16"
+ 'pseudo-nth-tr1',
+ 'pseudo-nth-td4',
+ 'pseudo-nth-td10',
+ 'pseudo-nth-td16'
],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- ":nth-last-child selector, matching every third child element from the end",
- 'selector': "#pseudo-nth li:nth-last-child(3n)",
+ ':nth-last-child selector, matching every third child element from the end',
+ 'selector': '#pseudo-nth li:nth-last-child(3n)',
'expect': [
- "pseudo-nth-li1",
- "pseudo-nth-li4",
- "pseudo-nth-li7",
- "pseudo-nth-li10"
+ 'pseudo-nth-li1',
+ 'pseudo-nth-li4',
+ 'pseudo-nth-li7',
+ 'pseudo-nth-li10'
],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- ":nth-last-child selector, matching every second child element from the end, starting from the fourth last",
- 'selector': "#pseudo-nth li:nth-last-child(2n+4)",
+ ':nth-last-child selector, matching every second child element from the end, starting from the fourth last',
+ 'selector': '#pseudo-nth li:nth-last-child(2n+4)',
'expect': [
- "pseudo-nth-li1",
- "pseudo-nth-li3",
- "pseudo-nth-li5",
- "pseudo-nth-li7",
- "pseudo-nth-li9"
+ 'pseudo-nth-li1',
+ 'pseudo-nth-li3',
+ 'pseudo-nth-li5',
+ 'pseudo-nth-li7',
+ 'pseudo-nth-li9'
],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- ":nth-last-child selector, matching every fourth element from the end, starting from the third last",
- 'selector': "#pseudo-nth-p1 :nth-last-child(4n-1)",
- 'expect': ["pseudo-nth-span2", "pseudo-nth-span4"],
+ ':nth-last-child selector, matching every fourth element from the end, starting from the third last',
+ 'selector': '#pseudo-nth-p1 :nth-last-child(4n-1)',
+ 'expect': ['pseudo-nth-span2', 'pseudo-nth-span4'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
// - :nth-of-type(n) (Level 3)
{
- 'name': ":nth-of-type selector, matching the third em element",
- 'selector': "#pseudo-nth-p1 em:nth-of-type(3)",
- 'expect': ["pseudo-nth-em3"],
+ 'name': ':nth-of-type selector, matching the third em element',
+ 'selector': '#pseudo-nth-p1 em:nth-of-type(3)',
+ 'expect': ['pseudo-nth-em3'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- ":nth-of-type selector, matching every second element of their type",
- 'selector': "#pseudo-nth-p1 :nth-of-type(2n)",
+ ':nth-of-type selector, matching every second element of their type',
+ 'selector': '#pseudo-nth-p1 :nth-of-type(2n)',
'expect': [
- "pseudo-nth-em2",
- "pseudo-nth-span2",
- "pseudo-nth-span4",
- "pseudo-nth-strong2",
- "pseudo-nth-em4"
+ 'pseudo-nth-em2',
+ 'pseudo-nth-span2',
+ 'pseudo-nth-span4',
+ 'pseudo-nth-strong2',
+ 'pseudo-nth-em4'
],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- ":nth-of-type selector, matching every second elemetn of their type, starting from the first",
- 'selector': "#pseudo-nth-p1 span:nth-of-type(2n-1)",
- 'expect': ["pseudo-nth-span1", "pseudo-nth-span3"],
+ ':nth-of-type selector, matching every second elemetn of their type, starting from the first',
+ 'selector': '#pseudo-nth-p1 span:nth-of-type(2n-1)',
+ 'expect': ['pseudo-nth-span1', 'pseudo-nth-span3'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
// - :nth-last-of-type(n) (Level 3)
{
- 'name': ":nth-last-of-type selector, matching the thrid last em element",
- 'selector': "#pseudo-nth-p1 em:nth-last-of-type(3)",
- 'expect': ["pseudo-nth-em2"],
+ 'name': ':nth-last-of-type selector, matching the thrid last em element',
+ 'selector': '#pseudo-nth-p1 em:nth-last-of-type(3)',
+ 'expect': ['pseudo-nth-em2'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- ":nth-last-of-type selector, matching every second last element of their type",
- 'selector': "#pseudo-nth-p1 :nth-last-of-type(2n)",
+ ':nth-last-of-type selector, matching every second last element of their type',
+ 'selector': '#pseudo-nth-p1 :nth-last-of-type(2n)',
'expect': [
- "pseudo-nth-span1",
- "pseudo-nth-em1",
- "pseudo-nth-strong1",
- "pseudo-nth-em3",
- "pseudo-nth-span3"
+ 'pseudo-nth-span1',
+ 'pseudo-nth-em1',
+ 'pseudo-nth-strong1',
+ 'pseudo-nth-em3',
+ 'pseudo-nth-span3'
],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- ":nth-last-of-type selector, matching every second last element of their type, starting from the last",
- 'selector': "#pseudo-nth-p1 span:nth-last-of-type(2n-1)",
- 'expect': ["pseudo-nth-span2", "pseudo-nth-span4"],
+ ':nth-last-of-type selector, matching every second last element of their type, starting from the last',
+ 'selector': '#pseudo-nth-p1 span:nth-last-of-type(2n-1)',
+ 'expect': ['pseudo-nth-span2', 'pseudo-nth-span4'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
// - :first-of-type (Level 3)
{
- 'name': ":first-of-type selector, matching the first em element",
- 'selector': "#pseudo-nth-p1 em:first-of-type",
- 'expect': ["pseudo-nth-em1"],
+ 'name': ':first-of-type selector, matching the first em element',
+ 'selector': '#pseudo-nth-p1 em:first-of-type',
+ 'expect': ['pseudo-nth-em1'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- ":first-of-type selector, matching the first of every type of element",
- 'selector': "#pseudo-nth-p1 :first-of-type",
- 'expect': ["pseudo-nth-span1", "pseudo-nth-em1", "pseudo-nth-strong1"],
+ ':first-of-type selector, matching the first of every type of element',
+ 'selector': '#pseudo-nth-p1 :first-of-type',
+ 'expect': ['pseudo-nth-span1', 'pseudo-nth-em1', 'pseudo-nth-strong1'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- ":first-of-type selector, matching the first td element in each table row",
- 'selector': "#pseudo-nth-table1 tr :first-of-type",
- 'expect': ["pseudo-nth-td1", "pseudo-nth-td7", "pseudo-nth-td13"],
+ ':first-of-type selector, matching the first td element in each table row',
+ 'selector': '#pseudo-nth-table1 tr :first-of-type',
+ 'expect': ['pseudo-nth-td1', 'pseudo-nth-td7', 'pseudo-nth-td13'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
// - :last-of-type (Level 3)
{
- 'name': ":last-of-type selector, matching the last em elemnet",
- 'selector': "#pseudo-nth-p1 em:last-of-type",
- 'expect': ["pseudo-nth-em4"],
+ 'name': ':last-of-type selector, matching the last em elemnet',
+ 'selector': '#pseudo-nth-p1 em:last-of-type',
+ 'expect': ['pseudo-nth-em4'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- ":last-of-type selector, matching the last of every type of element",
- 'selector': "#pseudo-nth-p1 :last-of-type",
- 'expect': ["pseudo-nth-span4", "pseudo-nth-strong2", "pseudo-nth-em4"],
+ ':last-of-type selector, matching the last of every type of element',
+ 'selector': '#pseudo-nth-p1 :last-of-type',
+ 'expect': ['pseudo-nth-span4', 'pseudo-nth-strong2', 'pseudo-nth-em4'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- ":last-of-type selector, matching the last td element in each table row",
- 'selector': "#pseudo-nth-table1 tr :last-of-type",
- 'expect': ["pseudo-nth-td6", "pseudo-nth-td12", "pseudo-nth-td18"],
+ ':last-of-type selector, matching the last td element in each table row',
+ 'selector': '#pseudo-nth-table1 tr :last-of-type',
+ 'expect': ['pseudo-nth-td6', 'pseudo-nth-td12', 'pseudo-nth-td18'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
@@ -935,9 +935,9 @@
// - :first-child
{
'name':
- ":first-child pseudo-class selector, matching first child div element",
- 'selector': "#pseudo-first-child div:first-child",
- 'expect': ["pseudo-first-child-div1"],
+ ':first-child pseudo-class selector, matching first child div element',
+ 'selector': '#pseudo-first-child div:first-child',
+ 'expect': ['pseudo-first-child-div1'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
@@ -945,19 +945,19 @@
'name':
":first-child pseudo-class selector, doesn't match non-first-child elements",
'selector':
- ".pseudo-first-child-div2:first-child, .pseudo-first-child-div3:first-child",
+ '.pseudo-first-child-div2:first-child, .pseudo-first-child-div3:first-child',
'expect': [] /*no matches*/,
'level': 2,
'testType': testQsaBaseline
},
{
'name':
- ":first-child pseudo-class selector, matching first-child of multiple elements",
- 'selector': "#pseudo-first-child span:first-child",
+ ':first-child pseudo-class selector, matching first-child of multiple elements',
+ 'selector': '#pseudo-first-child span:first-child',
'expect': [
- "pseudo-first-child-span1",
- "pseudo-first-child-span3",
- "pseudo-first-child-span5"
+ 'pseudo-first-child-span1',
+ 'pseudo-first-child-span3',
+ 'pseudo-first-child-span5'
],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
@@ -966,9 +966,9 @@
// - :last-child (Level 3)
{
'name':
- ":last-child pseudo-class selector, matching last child div element",
- 'selector': "#pseudo-last-child div:last-child",
- 'expect': ["pseudo-last-child-div3"],
+ ':last-child pseudo-class selector, matching last child div element',
+ 'selector': '#pseudo-last-child div:last-child',
+ 'expect': ['pseudo-last-child-div3'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
@@ -976,19 +976,19 @@
'name':
":last-child pseudo-class selector, doesn't match non-last-child elements",
'selector':
- ".pseudo-last-child-div1:last-child, .pseudo-last-child-div2:first-child",
+ '.pseudo-last-child-div1:last-child, .pseudo-last-child-div2:first-child',
'expect': [] /*no matches*/,
'level': 3,
'testType': testQsaAdditional
},
{
'name':
- ":last-child pseudo-class selector, matching first-child of multiple elements",
- 'selector': "#pseudo-last-child span:last-child",
+ ':last-child pseudo-class selector, matching first-child of multiple elements',
+ 'selector': '#pseudo-last-child span:last-child',
'expect': [
- "pseudo-last-child-span2",
- "pseudo-last-child-span4",
- "pseudo-last-child-span6"
+ 'pseudo-last-child-span2',
+ 'pseudo-last-child-span4',
+ 'pseudo-last-child-span6'
],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
@@ -997,16 +997,16 @@
// - :only-child (Level 3)
{
'name':
- ":pseudo-only-child pseudo-class selector, matching all only-child elements",
- 'selector': "#pseudo-only :only-child",
- 'expect': ["pseudo-only-span1"],
+ ':pseudo-only-child pseudo-class selector, matching all only-child elements',
+ 'selector': '#pseudo-only :only-child',
+ 'expect': ['pseudo-only-span1'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- ":pseudo-only-child pseudo-class selector, matching only-child em elements",
- 'selector': "#pseudo-only em:only-child",
+ ':pseudo-only-child pseudo-class selector, matching only-child em elements',
+ 'selector': '#pseudo-only em:only-child',
'expect': [] /*no matches*/,
'level': 3,
'testType': testQsaAdditional
@@ -1015,33 +1015,33 @@
// - :only-of-type (Level 3)
{
'name':
- ":pseudo-only-of-type pseudo-class selector, matching all elements with no siblings of the same type",
- 'selector': "#pseudo-only :only-of-type",
- 'expect': ["pseudo-only-span1", "pseudo-only-em1"],
+ ':pseudo-only-of-type pseudo-class selector, matching all elements with no siblings of the same type',
+ 'selector': '#pseudo-only :only-of-type',
+ 'expect': ['pseudo-only-span1', 'pseudo-only-em1'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- ":pseudo-only-of-type pseudo-class selector, matching em elements with no siblings of the same type",
- 'selector': "#pseudo-only em:only-of-type",
- 'expect': ["pseudo-only-em1"],
+ ':pseudo-only-of-type pseudo-class selector, matching em elements with no siblings of the same type',
+ 'selector': '#pseudo-only em:only-of-type',
+ 'expect': ['pseudo-only-em1'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
// - :empty (Level 3)
{
- 'name': ":empty pseudo-class selector, matching empty p elements",
- 'selector': "#pseudo-empty p:empty",
- 'expect': ["pseudo-empty-p1", "pseudo-empty-p2"],
+ 'name': ':empty pseudo-class selector, matching empty p elements',
+ 'selector': '#pseudo-empty p:empty',
+ 'expect': ['pseudo-empty-p1', 'pseudo-empty-p2'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
- 'name': ":empty pseudo-class selector, matching all empty elements",
- 'selector': "#pseudo-empty :empty",
- 'expect': ["pseudo-empty-p1", "pseudo-empty-p2", "pseudo-empty-span1"],
+ 'name': ':empty pseudo-class selector, matching all empty elements',
+ 'selector': '#pseudo-empty :empty',
+ 'expect': ['pseudo-empty-p1', 'pseudo-empty-p2', 'pseudo-empty-span1'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
@@ -1051,36 +1051,36 @@
// The only guarantee is that ":link,:visited" matches the set of all visited and unvisited links and that they are individually mutually exclusive sets.
{
'name':
- ":link and :visited pseudo-class selectors, matching a and area elements with href attributes",
- 'selector': "#pseudo-link :link, #pseudo-link :visited",
- 'expect': ["pseudo-link-a1", "pseudo-link-a2", "pseudo-link-area1"],
+ ':link and :visited pseudo-class selectors, matching a and area elements with href attributes',
+ 'selector': '#pseudo-link :link, #pseudo-link :visited',
+ 'expect': ['pseudo-link-a1', 'pseudo-link-a2', 'pseudo-link-area1'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- ":link and :visited pseudo-class selectors, matching link elements with href attributes",
- 'selector': "#head :link, #head :visited",
- 'expect': ["pseudo-link-link1", "pseudo-link-link2"],
- 'exclude': ["element", "fragment", "detached"],
+ ':link and :visited pseudo-class selectors, matching link elements with href attributes',
+ 'selector': '#head :link, #head :visited',
+ 'expect': ['pseudo-link-link1', 'pseudo-link-link2'],
+ 'exclude': ['element', 'fragment', 'detached'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- ":link and :visited pseudo-class selectors, not matching link elements with href attributes",
- 'selector': "#head :link, #head :visited",
+ ':link and :visited pseudo-class selectors, not matching link elements with href attributes',
+ 'selector': '#head :link, #head :visited',
'expect': [] /*no matches*/,
- 'exclude': ["document"],
+ 'exclude': ['document'],
'level': 1,
'testType': testQsaBaseline
},
{
'name':
- ":link and :visited pseudo-class selectors, chained, mutually exclusive pseudo-classes match nothing",
- 'selector': ":link:visited",
+ ':link and :visited pseudo-class selectors, chained, mutually exclusive pseudo-classes match nothing',
+ 'selector': ':link:visited',
'expect': [] /*no matches*/,
- 'exclude': ["document"],
+ 'exclude': ['document'],
'level': 1,
'testType': testQsaBaseline
},
@@ -1088,60 +1088,60 @@
// - :target (Level 3)
{
'name':
- ":target pseudo-class selector, matching the element referenced by the URL fragment identifier",
- 'selector': ":target",
+ ':target pseudo-class selector, matching the element referenced by the URL fragment identifier',
+ 'selector': ':target',
'expect': [] /*no matches*/,
- 'exclude': ["document", "element"],
+ 'exclude': ['document', 'element'],
'level': 3,
'testType': testQsaAdditional
},
{
'name':
- ":target pseudo-class selector, matching the element referenced by the URL fragment identifier",
- 'selector': ":target",
- 'expect': ["target"],
- 'exclude': ["fragment", "detached"],
+ ':target pseudo-class selector, matching the element referenced by the URL fragment identifier',
+ 'selector': ':target',
+ 'expect': ['target'],
+ 'exclude': ['fragment', 'detached'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
// - :lang()
{
- 'name': ":lang pseudo-class selector, matching inherited language",
- 'selector': "#pseudo-lang-div1:lang(en)",
- 'expect': ["pseudo-lang-div1"],
- 'exclude': ["detached", "fragment"],
+ 'name': ':lang pseudo-class selector, matching inherited language',
+ 'selector': '#pseudo-lang-div1:lang(en)',
+ 'expect': ['pseudo-lang-div1'],
+ 'exclude': ['detached', 'fragment'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- ":lang pseudo-class selector, not matching element with no inherited language",
- 'selector': "#pseudo-lang-div1:lang(en)",
+ ':lang pseudo-class selector, not matching element with no inherited language',
+ 'selector': '#pseudo-lang-div1:lang(en)',
'expect': [] /*no matches*/,
- 'exclude': ["document", "element"],
+ 'exclude': ['document', 'element'],
'level': 2,
'testType': testQsaBaseline
},
{
'name':
- ":lang pseudo-class selector, matching specified language with exact value",
- 'selector': "#pseudo-lang-div2:lang(fr)",
- 'expect': ["pseudo-lang-div2"],
+ ':lang pseudo-class selector, matching specified language with exact value',
+ 'selector': '#pseudo-lang-div2:lang(fr)',
+ 'expect': ['pseudo-lang-div2'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- ":lang pseudo-class selector, matching specified language with partial value",
- 'selector': "#pseudo-lang-div3:lang(en)",
- 'expect': ["pseudo-lang-div3"],
+ ':lang pseudo-class selector, matching specified language with partial value',
+ 'selector': '#pseudo-lang-div3:lang(en)',
+ 'expect': ['pseudo-lang-div3'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
- 'name': ":lang pseudo-class selector, not matching incorrect language",
- 'selector': "#pseudo-lang-div4:lang(es-AR)",
+ 'name': ':lang pseudo-class selector, not matching incorrect language',
+ 'selector': '#pseudo-lang-div4:lang(es-AR)',
'expect': [] /*no matches*/,
'level': 2,
'testType': testQsaBaseline
@@ -1150,20 +1150,20 @@
// - :enabled (Level 3)
{
'name':
- ":enabled pseudo-class selector, matching all enabled form controls",
- 'selector': "#pseudo-ui :enabled",
+ ':enabled pseudo-class selector, matching all enabled form controls',
+ 'selector': '#pseudo-ui :enabled',
'expect': [
- "pseudo-ui-input1",
- "pseudo-ui-input2",
- "pseudo-ui-input3",
- "pseudo-ui-input4",
- "pseudo-ui-input5",
- "pseudo-ui-input6",
- "pseudo-ui-input7",
- "pseudo-ui-input8",
- "pseudo-ui-input9",
- "pseudo-ui-textarea1",
- "pseudo-ui-button1"
+ 'pseudo-ui-input1',
+ 'pseudo-ui-input2',
+ 'pseudo-ui-input3',
+ 'pseudo-ui-input4',
+ 'pseudo-ui-input5',
+ 'pseudo-ui-input6',
+ 'pseudo-ui-input7',
+ 'pseudo-ui-input8',
+ 'pseudo-ui-input9',
+ 'pseudo-ui-textarea1',
+ 'pseudo-ui-button1'
],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
@@ -1172,20 +1172,20 @@
// - :disabled (Level 3)
{
'name':
- ":enabled pseudo-class selector, matching all disabled form controls",
- 'selector': "#pseudo-ui :disabled",
+ ':enabled pseudo-class selector, matching all disabled form controls',
+ 'selector': '#pseudo-ui :disabled',
'expect': [
- "pseudo-ui-input10",
- "pseudo-ui-input11",
- "pseudo-ui-input12",
- "pseudo-ui-input13",
- "pseudo-ui-input14",
- "pseudo-ui-input15",
- "pseudo-ui-input16",
- "pseudo-ui-input17",
- "pseudo-ui-input18",
- "pseudo-ui-textarea2",
- "pseudo-ui-button2"
+ 'pseudo-ui-input10',
+ 'pseudo-ui-input11',
+ 'pseudo-ui-input12',
+ 'pseudo-ui-input13',
+ 'pseudo-ui-input14',
+ 'pseudo-ui-input15',
+ 'pseudo-ui-input16',
+ 'pseudo-ui-input17',
+ 'pseudo-ui-input18',
+ 'pseudo-ui-textarea2',
+ 'pseudo-ui-button2'
],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
@@ -1194,13 +1194,13 @@
// - :checked (Level 3)
{
'name':
- ":checked pseudo-class selector, matching checked radio buttons and checkboxes",
- 'selector': "#pseudo-ui :checked",
+ ':checked pseudo-class selector, matching checked radio buttons and checkboxes',
+ 'selector': '#pseudo-ui :checked',
'expect': [
- "pseudo-ui-input4",
- "pseudo-ui-input6",
- "pseudo-ui-input13",
- "pseudo-ui-input15"
+ 'pseudo-ui-input4',
+ 'pseudo-ui-input6',
+ 'pseudo-ui-input13',
+ 'pseudo-ui-input15'
],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
@@ -1208,29 +1208,29 @@
// - :not(s) (Level 3)
{
- 'name': ":not pseudo-class selector, matching ",
- 'selector': "#not>:not(div)",
- 'expect': ["not-p1", "not-p2", "not-p3"],
+ 'name': ':not pseudo-class selector, matching ',
+ 'selector': '#not>:not(div)',
+ 'expect': ['not-p1', 'not-p2', 'not-p3'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
- 'name': ":not pseudo-class selector, matching ",
- 'selector': "#not * :not(:first-child)",
- 'expect': ["not-em1", "not-em2", "not-em3"],
+ 'name': ':not pseudo-class selector, matching ',
+ 'selector': '#not * :not(:first-child)',
+ 'expect': ['not-em1', 'not-em2', 'not-em3'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
- 'name': ":not pseudo-class selector, matching nothing",
- 'selector': ":not(*)",
+ 'name': ':not pseudo-class selector, matching nothing',
+ 'selector': ':not(*)',
'expect': [] /* no matches */,
'level': 3,
'testType': testQsaAdditional
},
{
- 'name': ":not pseudo-class selector, matching nothing",
- 'selector': ":not(*|*)",
+ 'name': ':not pseudo-class selector, matching nothing',
+ 'selector': ':not(*|*)',
'expect': [] /* no matches */,
'level': 3,
'testType': testQsaAdditional
@@ -1240,16 +1240,16 @@
// - ::first-line
{
'name':
- ":first-line pseudo-element (one-colon syntax) selector, not matching any elements",
- 'selector': "#pseudo-element:first-line",
+ ':first-line pseudo-element (one-colon syntax) selector, not matching any elements',
+ 'selector': '#pseudo-element:first-line',
'expect': [] /*no matches*/,
'level': 2,
'testType': testQsaBaseline
},
{
'name':
- "::first-line pseudo-element (two-colon syntax) selector, not matching any elements",
- 'selector': "#pseudo-element::first-line",
+ '::first-line pseudo-element (two-colon syntax) selector, not matching any elements',
+ 'selector': '#pseudo-element::first-line',
'expect': [] /*no matches*/,
'level': 3,
'testType': testQsaAdditional
@@ -1258,16 +1258,16 @@
// - ::first-letter
{
'name':
- ":first-letter pseudo-element (one-colon syntax) selector, not matching any elements",
- 'selector': "#pseudo-element:first-letter",
+ ':first-letter pseudo-element (one-colon syntax) selector, not matching any elements',
+ 'selector': '#pseudo-element:first-letter',
'expect': [] /*no matches*/,
'level': 2,
'testType': testQsaBaseline
},
{
'name':
- "::first-letter pseudo-element (two-colon syntax) selector, not matching any elements",
- 'selector': "#pseudo-element::first-letter",
+ '::first-letter pseudo-element (two-colon syntax) selector, not matching any elements',
+ 'selector': '#pseudo-element::first-letter',
'expect': [] /*no matches*/,
'level': 3,
'testType': testQsaAdditional
@@ -1276,16 +1276,16 @@
// - ::before
{
'name':
- ":before pseudo-element (one-colon syntax) selector, not matching any elements",
- 'selector': "#pseudo-element:before",
+ ':before pseudo-element (one-colon syntax) selector, not matching any elements',
+ 'selector': '#pseudo-element:before',
'expect': [] /*no matches*/,
'level': 2,
'testType': testQsaBaseline
},
{
'name':
- "::before pseudo-element (two-colon syntax) selector, not matching any elements",
- 'selector': "#pseudo-element::before",
+ '::before pseudo-element (two-colon syntax) selector, not matching any elements',
+ 'selector': '#pseudo-element::before',
'expect': [] /*no matches*/,
'level': 3,
'testType': testQsaAdditional
@@ -1294,16 +1294,16 @@
// - ::after
{
'name':
- ":after pseudo-element (one-colon syntax) selector, not matching any elements",
- 'selector': "#pseudo-element:after",
+ ':after pseudo-element (one-colon syntax) selector, not matching any elements',
+ 'selector': '#pseudo-element:after',
'expect': [] /*no matches*/,
'level': 2,
'testType': testQsaBaseline
},
{
'name':
- "::after pseudo-element (two-colon syntax) selector, not matching any elements",
- 'selector': "#pseudo-element::after",
+ '::after pseudo-element (two-colon syntax) selector, not matching any elements',
+ 'selector': '#pseudo-element::after',
'expect': [] /*no matches*/,
'level': 3,
'testType': testQsaAdditional
@@ -1311,127 +1311,127 @@
// Class Selectors
{
- 'name': "Class selector, matching element with specified class",
- 'selector': ".class-p",
- 'expect': ["class-p1", "class-p2", "class-p3"],
+ 'name': 'Class selector, matching element with specified class',
+ 'selector': '.class-p',
+ 'expect': ['class-p1', 'class-p2', 'class-p3'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Class selector, chained, matching only elements with all specified classes",
- 'selector': "#class .apple.orange.banana",
+ 'Class selector, chained, matching only elements with all specified classes',
+ 'selector': '#class .apple.orange.banana',
'expect': [
- "class-div1",
- "class-div2",
- "class-p4",
- "class-div3",
- "class-p6",
- "class-div4"
+ 'class-div1',
+ 'class-div2',
+ 'class-p4',
+ 'class-div3',
+ 'class-p6',
+ 'class-div4'
],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
- 'name': "Class Selector, chained, with type selector",
- 'selector': "div.apple.banana.orange",
- 'expect': ["class-div1", "class-div2", "class-div3", "class-div4"],
+ 'name': 'Class Selector, chained, with type selector',
+ 'selector': 'div.apple.banana.orange',
+ 'expect': ['class-div1', 'class-div2', 'class-div3', 'class-div4'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
// Caution: If copying and pasting the folowing non-ASCII classes, ensure unicode normalisation is not performed in the process.
{
'name':
- "Class selector, matching element with class value using non-ASCII characters",
- 'selector': ".台北Táiběi",
- 'expect': ["class-span1"],
+ 'Class selector, matching element with class value using non-ASCII characters',
+ 'selector': '.台北Táiběi',
+ 'expect': ['class-span1'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Class selector, matching multiple elements with class value using non-ASCII characters",
- 'selector': ".台北",
- 'expect': ["class-span1", "class-span2"],
+ 'Class selector, matching multiple elements with class value using non-ASCII characters',
+ 'selector': '.台北',
+ 'expect': ['class-span1', 'class-span2'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Class selector, chained, matching element with multiple class values using non-ASCII characters",
- 'selector': ".台北Táiběi.台北",
- 'expect': ["class-span1"],
+ 'Class selector, chained, matching element with multiple class values using non-ASCII characters',
+ 'selector': '.台北Táiběi.台北',
+ 'expect': ['class-span1'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Class selector, matching element with class with escaped character",
- 'selector': ".foo\\:bar",
- 'expect': ["class-span3"],
+ 'Class selector, matching element with class with escaped character',
+ 'selector': '.foo\\:bar',
+ 'expect': ['class-span3'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Class selector, matching element with class with escaped character",
- 'selector': ".test\\.foo\\[5\\]bar",
- 'expect': ["class-span4"],
+ 'Class selector, matching element with class with escaped character',
+ 'selector': '.test\\.foo\\[5\\]bar',
+ 'expect': ['class-span4'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
// ID Selectors
{
- 'name': "ID selector, matching element with specified id",
- 'selector': "#id #id-div1",
- 'expect': ["id-div1"],
+ 'name': 'ID selector, matching element with specified id',
+ 'selector': '#id #id-div1',
+ 'expect': ['id-div1'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
- 'name': "ID selector, chained, matching element with specified id",
- 'selector': "#id-div1, #id-div1",
- 'expect': ["id-div1"],
+ 'name': 'ID selector, chained, matching element with specified id',
+ 'selector': '#id-div1, #id-div1',
+ 'expect': ['id-div1'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
- 'name': "ID selector, chained, matching element with specified id",
- 'selector': "#id-div1, #id-div2",
- 'expect': ["id-div1", "id-div2"],
+ 'name': 'ID selector, chained, matching element with specified id',
+ 'selector': '#id-div1, #id-div2',
+ 'expect': ['id-div1', 'id-div2'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
- 'name': "ID Selector, chained, with type selector",
- 'selector': "div#id-div1, div#id-div2",
- 'expect': ["id-div1", "id-div2"],
+ 'name': 'ID Selector, chained, with type selector',
+ 'selector': 'div#id-div1, div#id-div2',
+ 'expect': ['id-div1', 'id-div2'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
- 'name': "ID selector, not matching non-existent descendant",
- 'selector': "#id #none",
+ 'name': 'ID selector, not matching non-existent descendant',
+ 'selector': '#id #none',
'expect': [] /*no matches*/,
'level': 1,
'testType': testQsaBaseline
},
{
- 'name': "ID selector, not matching non-existent ancestor",
- 'selector': "#none #id-div1",
+ 'name': 'ID selector, not matching non-existent ancestor',
+ 'selector': '#none #id-div1',
'expect': [] /*no matches*/,
'level': 1,
'testType': testQsaBaseline
},
{
- 'name': "ID selector, matching multiple elements with duplicate id",
- 'selector': "#id-li-duplicate",
+ 'name': 'ID selector, matching multiple elements with duplicate id',
+ 'selector': '#id-li-duplicate',
'expect': [
- "id-li-duplicate",
- "id-li-duplicate",
- "id-li-duplicate",
- "id-li-duplicate"
+ 'id-li-duplicate',
+ 'id-li-duplicate',
+ 'id-li-duplicate',
+ 'id-li-duplicate'
],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
@@ -1439,39 +1439,39 @@
// Caution: If copying and pasting the folowing non-ASCII IDs, ensure unicode normalisation is not performed in the process.
{
- 'name': "ID selector, matching id value using non-ASCII characters",
- 'selector': "#台北Táiběi",
- 'expect': ["台北Táiběi"],
+ 'name': 'ID selector, matching id value using non-ASCII characters',
+ 'selector': '#台北Táiběi',
+ 'expect': ['台北Táiběi'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
- 'name': "ID selector, matching id value using non-ASCII characters",
- 'selector': "#台北",
- 'expect': ["台北"],
+ 'name': 'ID selector, matching id value using non-ASCII characters',
+ 'selector': '#台北',
+ 'expect': ['台北'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
- 'name': "ID selector, matching id values using non-ASCII characters",
- 'selector': "#台北Táiběi, #台北",
- 'expect': ["台北Táiběi", "台北"],
+ 'name': 'ID selector, matching id values using non-ASCII characters',
+ 'selector': '#台北Táiběi, #台北',
+ 'expect': ['台北Táiběi', '台北'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
// XXX runMatchesTest() in level2-lib.js can't handle this because obtaining the expected nodes requires escaping characters when generating the selector from 'expect' values
{
- 'name': "ID selector, matching element with id with escaped character",
- 'selector': "#\\#foo\\:bar",
- 'expect': ["#foo:bar"],
+ 'name': 'ID selector, matching element with id with escaped character',
+ 'selector': '#\\#foo\\:bar',
+ 'expect': ['#foo:bar'],
'level': 1,
'testType': testQsaBaseline
},
{
- 'name': "ID selector, matching element with id with escaped character",
- 'selector': "#test\\.foo\\[5\\]bar",
- 'expect': ["test.foo[5]bar"],
+ 'name': 'ID selector, matching element with id with escaped character',
+ 'selector': '#test\\.foo\\[5\\]bar',
+ 'expect': ['test.foo[5]bar'],
'level': 1,
'testType': testQsaBaseline
},
@@ -1479,28 +1479,28 @@
// Namespaces
// XXX runMatchesTest() in level2-lib.js can't handle these because non-HTML elements don't have a recognised id
{
- 'name': "Namespace selector, matching element with any namespace",
- 'selector': "#any-namespace *|div",
+ 'name': 'Namespace selector, matching element with any namespace',
+ 'selector': '#any-namespace *|div',
'expect': [
- "any-namespace-div1",
- "any-namespace-div2",
- "any-namespace-div3",
- "any-namespace-div4"
+ 'any-namespace-div1',
+ 'any-namespace-div2',
+ 'any-namespace-div3',
+ 'any-namespace-div4'
],
'level': 3,
'testType': testQsaBaseline
},
{
- 'name': "Namespace selector, matching div elements in no namespace only",
- 'selector': "#no-namespace |div",
- 'expect': ["no-namespace-div3"],
+ 'name': 'Namespace selector, matching div elements in no namespace only',
+ 'selector': '#no-namespace |div',
+ 'expect': ['no-namespace-div3'],
'level': 3,
'testType': testQsaBaseline
},
{
- 'name': "Namespace selector, matching any elements in no namespace only",
- 'selector': "#no-namespace |*",
- 'expect': ["no-namespace-div3"],
+ 'name': 'Namespace selector, matching any elements in no namespace only',
+ 'selector': '#no-namespace |*',
+ 'expect': ['no-namespace-div3'],
'level': 3,
'testType': testQsaBaseline
},
@@ -1509,70 +1509,70 @@
// - Descendant combinator ' '
{
'name':
- "Descendant combinator, matching element that is a descendant of an element with id",
- 'selector': "#descendant div",
+ 'Descendant combinator, matching element that is a descendant of an element with id',
+ 'selector': '#descendant div',
'expect': [
- "descendant-div1",
- "descendant-div2",
- "descendant-div3",
- "descendant-div4"
+ 'descendant-div1',
+ 'descendant-div2',
+ 'descendant-div3',
+ 'descendant-div4'
],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Descendant combinator, matching element with id that is a descendant of an element",
- 'selector': "body #descendant-div1",
- 'expect': ["descendant-div1"],
- 'exclude': ["detached", "fragment"],
+ 'Descendant combinator, matching element with id that is a descendant of an element',
+ 'selector': 'body #descendant-div1',
+ 'expect': ['descendant-div1'],
+ 'exclude': ['detached', 'fragment'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Descendant combinator, matching element with id that is a descendant of an element",
- 'selector': "div #descendant-div1",
- 'expect': ["descendant-div1"],
+ 'Descendant combinator, matching element with id that is a descendant of an element',
+ 'selector': 'div #descendant-div1',
+ 'expect': ['descendant-div1'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Descendant combinator, matching element with id that is a descendant of an element with id",
- 'selector': "#descendant #descendant-div2",
- 'expect': ["descendant-div2"],
+ 'Descendant combinator, matching element with id that is a descendant of an element with id',
+ 'selector': '#descendant #descendant-div2',
+ 'expect': ['descendant-div2'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Descendant combinator, matching element with class that is a descendant of an element with id",
- 'selector': "#descendant .descendant-div2",
- 'expect': ["descendant-div2"],
+ 'Descendant combinator, matching element with class that is a descendant of an element with id',
+ 'selector': '#descendant .descendant-div2',
+ 'expect': ['descendant-div2'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Descendant combinator, matching element with class that is a descendant of an element with class",
- 'selector': ".descendant-div1 .descendant-div3",
- 'expect': ["descendant-div3"],
+ 'Descendant combinator, matching element with class that is a descendant of an element with class',
+ 'selector': '.descendant-div1 .descendant-div3',
+ 'expect': ['descendant-div3'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Descendant combinator, not matching element with id that is not a descendant of an element with id",
- 'selector': "#descendant-div1 #descendant-div4",
+ 'Descendant combinator, not matching element with id that is not a descendant of an element with id',
+ 'selector': '#descendant-div1 #descendant-div4',
'expect': [] /*no matches*/,
'level': 1,
'testType': testQsaBaseline
},
{
- 'name': "Descendant combinator, whitespace characters",
- 'selector': "#descendant\t\r\n#descendant-div2",
- 'expect': ["descendant-div2"],
+ 'name': 'Descendant combinator, whitespace characters',
+ 'selector': '#descendant\t\r\n#descendant-div2',
+ 'expect': ['descendant-div2'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
@@ -1580,93 +1580,93 @@
// - Child combinator '>'
{
'name':
- "Child combinator, matching element that is a child of an element with id",
- 'selector': "#child>div",
- 'expect': ["child-div1", "child-div4"],
+ 'Child combinator, matching element that is a child of an element with id',
+ 'selector': '#child>div',
+ 'expect': ['child-div1', 'child-div4'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Child combinator, matching element with id that is a child of an element",
- 'selector': "div>#child-div1",
- 'expect': ["child-div1"],
+ 'Child combinator, matching element with id that is a child of an element',
+ 'selector': 'div>#child-div1',
+ 'expect': ['child-div1'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Child combinator, matching element with id that is a child of an element with id",
- 'selector': "#child>#child-div1",
- 'expect': ["child-div1"],
+ 'Child combinator, matching element with id that is a child of an element with id',
+ 'selector': '#child>#child-div1',
+ 'expect': ['child-div1'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Child combinator, matching element with id that is a child of an element with class",
- 'selector': "#child-div1>.child-div2",
- 'expect': ["child-div2"],
+ 'Child combinator, matching element with id that is a child of an element with class',
+ 'selector': '#child-div1>.child-div2',
+ 'expect': ['child-div2'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Child combinator, matching element with class that is a child of an element with class",
- 'selector': ".child-div1>.child-div2",
- 'expect': ["child-div2"],
+ 'Child combinator, matching element with class that is a child of an element with class',
+ 'selector': '.child-div1>.child-div2',
+ 'expect': ['child-div2'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Child combinator, not matching element with id that is not a child of an element with id",
- 'selector': "#child>#child-div3",
+ 'Child combinator, not matching element with id that is not a child of an element with id',
+ 'selector': '#child>#child-div3',
'expect': [] /*no matches*/,
'level': 2,
'testType': testQsaBaseline
},
{
'name':
- "Child combinator, not matching element with id that is not a child of an element with class",
- 'selector': "#child-div1>.child-div3",
+ 'Child combinator, not matching element with id that is not a child of an element with class',
+ 'selector': '#child-div1>.child-div3',
'expect': [] /*no matches*/,
'level': 2,
'testType': testQsaBaseline
},
{
'name':
- "Child combinator, not matching element with class that is not a child of an element with class",
- 'selector': ".child-div1>.child-div3",
+ 'Child combinator, not matching element with class that is not a child of an element with class',
+ 'selector': '.child-div1>.child-div3',
'expect': [] /*no matches*/,
'level': 2,
'testType': testQsaBaseline
},
{
- 'name': "Child combinator, surrounded by whitespace",
- 'selector': "#child-div1\t\r\n>\t\r\n#child-div2",
- 'expect': ["child-div2"],
+ 'name': 'Child combinator, surrounded by whitespace',
+ 'selector': '#child-div1\t\r\n>\t\r\n#child-div2',
+ 'expect': ['child-div2'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
- 'name': "Child combinator, whitespace after",
- 'selector': "#child-div1>\t\r\n#child-div2",
- 'expect': ["child-div2"],
+ 'name': 'Child combinator, whitespace after',
+ 'selector': '#child-div1>\t\r\n#child-div2',
+ 'expect': ['child-div2'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
- 'name': "Child combinator, whitespace before",
- 'selector': "#child-div1\t\r\n>#child-div2",
- 'expect': ["child-div2"],
+ 'name': 'Child combinator, whitespace before',
+ 'selector': '#child-div1\t\r\n>#child-div2',
+ 'expect': ['child-div2'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
- 'name': "Child combinator, no whitespace",
- 'selector': "#child-div1>#child-div2",
- 'expect': ["child-div2"],
+ 'name': 'Child combinator, no whitespace',
+ 'selector': '#child-div1>#child-div2',
+ 'expect': ['child-div2'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
@@ -1674,85 +1674,85 @@
// - Adjacent sibling combinator '+'
{
'name':
- "Adjacent sibling combinator, matching element that is an adjacent sibling of an element with id",
- 'selector': "#adjacent-div2+div",
- 'expect': ["adjacent-div4"],
+ 'Adjacent sibling combinator, matching element that is an adjacent sibling of an element with id',
+ 'selector': '#adjacent-div2+div',
+ 'expect': ['adjacent-div4'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Adjacent sibling combinator, matching element with id that is an adjacent sibling of an element",
- 'selector': "div+#adjacent-div4",
- 'expect': ["adjacent-div4"],
+ 'Adjacent sibling combinator, matching element with id that is an adjacent sibling of an element',
+ 'selector': 'div+#adjacent-div4',
+ 'expect': ['adjacent-div4'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Adjacent sibling combinator, matching element with id that is an adjacent sibling of an element with id",
- 'selector': "#adjacent-div2+#adjacent-div4",
- 'expect': ["adjacent-div4"],
+ 'Adjacent sibling combinator, matching element with id that is an adjacent sibling of an element with id',
+ 'selector': '#adjacent-div2+#adjacent-div4',
+ 'expect': ['adjacent-div4'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Adjacent sibling combinator, matching element with class that is an adjacent sibling of an element with id",
- 'selector': "#adjacent-div2+.adjacent-div4",
- 'expect': ["adjacent-div4"],
+ 'Adjacent sibling combinator, matching element with class that is an adjacent sibling of an element with id',
+ 'selector': '#adjacent-div2+.adjacent-div4',
+ 'expect': ['adjacent-div4'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Adjacent sibling combinator, matching element with class that is an adjacent sibling of an element with class",
- 'selector': ".adjacent-div2+.adjacent-div4",
- 'expect': ["adjacent-div4"],
+ 'Adjacent sibling combinator, matching element with class that is an adjacent sibling of an element with class',
+ 'selector': '.adjacent-div2+.adjacent-div4',
+ 'expect': ['adjacent-div4'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Adjacent sibling combinator, matching p element that is an adjacent sibling of a div element",
- 'selector': "#adjacent div+p",
- 'expect': ["adjacent-p2"],
+ 'Adjacent sibling combinator, matching p element that is an adjacent sibling of a div element',
+ 'selector': '#adjacent div+p',
+ 'expect': ['adjacent-p2'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
'name':
- "Adjacent sibling combinator, not matching element with id that is not an adjacent sibling of an element with id",
- 'selector': "#adjacent-div2+#adjacent-p2, #adjacent-div2+#adjacent-div1",
+ 'Adjacent sibling combinator, not matching element with id that is not an adjacent sibling of an element with id',
+ 'selector': '#adjacent-div2+#adjacent-p2, #adjacent-div2+#adjacent-div1',
'expect': [] /*no matches*/,
'level': 2,
'testType': testQsaBaseline
},
{
- 'name': "Adjacent sibling combinator, surrounded by whitespace",
- 'selector': "#adjacent-p2\t\r\n+\t\r\n#adjacent-p3",
- 'expect': ["adjacent-p3"],
+ 'name': 'Adjacent sibling combinator, surrounded by whitespace',
+ 'selector': '#adjacent-p2\t\r\n+\t\r\n#adjacent-p3',
+ 'expect': ['adjacent-p3'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
- 'name': "Adjacent sibling combinator, whitespace after",
- 'selector': "#adjacent-p2+\t\r\n#adjacent-p3",
- 'expect': ["adjacent-p3"],
+ 'name': 'Adjacent sibling combinator, whitespace after',
+ 'selector': '#adjacent-p2+\t\r\n#adjacent-p3',
+ 'expect': ['adjacent-p3'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
- 'name': "Adjacent sibling combinator, whitespace before",
- 'selector': "#adjacent-p2\t\r\n+#adjacent-p3",
- 'expect': ["adjacent-p3"],
+ 'name': 'Adjacent sibling combinator, whitespace before',
+ 'selector': '#adjacent-p2\t\r\n+#adjacent-p3',
+ 'expect': ['adjacent-p3'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
{
- 'name': "Adjacent sibling combinator, no whitespace",
- 'selector': "#adjacent-p2+#adjacent-p3",
- 'expect': ["adjacent-p3"],
+ 'name': 'Adjacent sibling combinator, no whitespace',
+ 'selector': '#adjacent-p2+#adjacent-p3',
+ 'expect': ['adjacent-p3'],
'level': 2,
'testType': testQsaBaseline | testMatchBaseline
},
@@ -1760,115 +1760,115 @@
// - General sibling combinator ~ (Level 3)
{
'name':
- "General sibling combinator, matching element that is a sibling of an element with id",
- 'selector': "#sibling-div2~div",
- 'expect': ["sibling-div4", "sibling-div6"],
+ 'General sibling combinator, matching element that is a sibling of an element with id',
+ 'selector': '#sibling-div2~div',
+ 'expect': ['sibling-div4', 'sibling-div6'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "General sibling combinator, matching element with id that is a sibling of an element",
- 'selector': "div~#sibling-div4",
- 'expect': ["sibling-div4"],
+ 'General sibling combinator, matching element with id that is a sibling of an element',
+ 'selector': 'div~#sibling-div4',
+ 'expect': ['sibling-div4'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "General sibling combinator, matching element with id that is a sibling of an element with id",
- 'selector': "#sibling-div2~#sibling-div4",
- 'expect': ["sibling-div4"],
+ 'General sibling combinator, matching element with id that is a sibling of an element with id',
+ 'selector': '#sibling-div2~#sibling-div4',
+ 'expect': ['sibling-div4'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "General sibling combinator, matching element with class that is a sibling of an element with id",
- 'selector': "#sibling-div2~.sibling-div",
- 'expect': ["sibling-div4", "sibling-div6"],
+ 'General sibling combinator, matching element with class that is a sibling of an element with id',
+ 'selector': '#sibling-div2~.sibling-div',
+ 'expect': ['sibling-div4', 'sibling-div6'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "General sibling combinator, matching p element that is a sibling of a div element",
- 'selector': "#sibling div~p",
- 'expect': ["sibling-p2", "sibling-p3"],
+ 'General sibling combinator, matching p element that is a sibling of a div element',
+ 'selector': '#sibling div~p',
+ 'expect': ['sibling-p2', 'sibling-p3'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
'name':
- "General sibling combinator, not matching element with id that is not a sibling after a p element",
- 'selector': "#sibling>p~div",
+ 'General sibling combinator, not matching element with id that is not a sibling after a p element',
+ 'selector': '#sibling>p~div',
'expect': [] /*no matches*/,
'level': 3,
'testType': testQsaAdditional
},
{
'name':
- "General sibling combinator, not matching element with id that is not a sibling after an element with id",
- 'selector': "#sibling-div2~#sibling-div3, #sibling-div2~#sibling-div1",
+ 'General sibling combinator, not matching element with id that is not a sibling after an element with id',
+ 'selector': '#sibling-div2~#sibling-div3, #sibling-div2~#sibling-div1',
'expect': [] /*no matches*/,
'level': 3,
'testType': testQsaAdditional
},
{
- 'name': "General sibling combinator, surrounded by whitespace",
- 'selector': "#sibling-p2\t\r\n~\t\r\n#sibling-p3",
- 'expect': ["sibling-p3"],
+ 'name': 'General sibling combinator, surrounded by whitespace',
+ 'selector': '#sibling-p2\t\r\n~\t\r\n#sibling-p3',
+ 'expect': ['sibling-p3'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
- 'name': "General sibling combinator, whitespace after",
- 'selector': "#sibling-p2~\t\r\n#sibling-p3",
- 'expect': ["sibling-p3"],
+ 'name': 'General sibling combinator, whitespace after',
+ 'selector': '#sibling-p2~\t\r\n#sibling-p3',
+ 'expect': ['sibling-p3'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
- 'name': "General sibling combinator, whitespace before",
- 'selector': "#sibling-p2\t\r\n~#sibling-p3",
- 'expect': ["sibling-p3"],
+ 'name': 'General sibling combinator, whitespace before',
+ 'selector': '#sibling-p2\t\r\n~#sibling-p3',
+ 'expect': ['sibling-p3'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
{
- 'name': "General sibling combinator, no whitespace",
- 'selector': "#sibling-p2~#sibling-p3",
- 'expect': ["sibling-p3"],
+ 'name': 'General sibling combinator, no whitespace',
+ 'selector': '#sibling-p2~#sibling-p3',
+ 'expect': ['sibling-p3'],
'level': 3,
'testType': testQsaAdditional | testMatchBaseline
},
// Group of selectors (comma)
{
- 'name': "Syntax, group of selectors separator, surrounded by whitespace",
- 'selector': "#group em\t\r \n,\t\r \n#group strong",
- 'expect': ["group-em1", "group-strong1"],
+ 'name': 'Syntax, group of selectors separator, surrounded by whitespace',
+ 'selector': '#group em\t\r \n,\t\r \n#group strong',
+ 'expect': ['group-em1', 'group-strong1'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
- 'name': "Syntax, group of selectors separator, whitespace after",
- 'selector': "#group em,\t\r\n#group strong",
- 'expect': ["group-em1", "group-strong1"],
+ 'name': 'Syntax, group of selectors separator, whitespace after',
+ 'selector': '#group em,\t\r\n#group strong',
+ 'expect': ['group-em1', 'group-strong1'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
- 'name': "Syntax, group of selectors separator, whitespace before",
- 'selector': "#group em\t\r\n,#group strong",
- 'expect': ["group-em1", "group-strong1"],
+ 'name': 'Syntax, group of selectors separator, whitespace before',
+ 'selector': '#group em\t\r\n,#group strong',
+ 'expect': ['group-em1', 'group-strong1'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
{
- 'name': "Syntax, group of selectors separator, no whitespace",
- 'selector': "#group em,#group strong",
- 'expect': ["group-em1", "group-strong1"],
+ 'name': 'Syntax, group of selectors separator, no whitespace',
+ 'selector': '#group em,#group strong',
+ 'expect': ['group-em1', 'group-strong1'],
'level': 1,
'testType': testQsaBaseline | testMatchBaseline
},
diff --git a/test/support.dart b/test/support.dart
index 83e137a..afcf952 100644
--- a/test/support.dart
+++ b/test/support.dart
@@ -13,10 +13,8 @@
Map<String, TreeBuilderFactory> _treeTypes;
Map<String, TreeBuilderFactory> get treeTypes {
- if (_treeTypes == null) {
- // TODO(jmesserly): add DOM here once it's implemented
- _treeTypes = {"simpletree": (useNs) => TreeBuilder(useNs)};
- }
+ // TODO(jmesserly): add DOM here once it's implemented
+ _treeTypes ??= {'simpletree': (useNs) => TreeBuilder(useNs)};
return _treeTypes;
}
@@ -35,12 +33,13 @@
final String _text;
final String newTestHeading;
- TestData(String filename, [this.newTestHeading = "data"])
+ TestData(String filename, [this.newTestHeading = 'data'])
// Note: can't use readAsLinesSync here because it splits on \r
: _text = File(filename).readAsStringSync();
// Note: in Python this was a generator, but since we can't do that in Dart,
// it's easier to convert it into an upfront computation.
+ @override
Iterator<Map> get iterator => _getData().iterator;
List<Map> _getData() {
@@ -62,7 +61,7 @@
data = <String, String>{};
}
key = heading;
- data[key] = "";
+ data[key] = '';
} else if (key != null) {
data[key] = '${data[key]}$line\n';
}
@@ -77,13 +76,13 @@
/// If the current heading is a test section heading return the heading,
/// otherwise return null.
static String sectionHeading(String line) {
- return line.startsWith("#") ? line.substring(1).trim() : null;
+ return line.startsWith('#') ? line.substring(1).trim() : null;
}
static Map normaliseOutput(Map data) {
// Remove trailing newlines
data.forEach((key, value) {
- if (value.endsWith("\n")) {
+ if (value.endsWith('\n')) {
data[key] = value.substring(0, value.length - 1);
}
});
@@ -92,7 +91,7 @@
}
/// Serialize the [document] into the html5 test data format.
-testSerializer(document) {
+String testSerializer(document) {
return (TestSerializer()..visit(document)).toString();
}
@@ -104,6 +103,7 @@
TestSerializer() : _str = StringBuffer();
+ @override
String toString() => _str.toString();
int get indent => _indent;
@@ -112,7 +112,7 @@
if (_indent == value) return;
var arr = List<int>(value);
- for (int i = 0; i < value; i++) {
+ for (var i = 0; i < value; i++) {
arr[i] = 32;
}
_spaces = String.fromCharCodes(arr);
@@ -124,13 +124,15 @@
_str.write('|$_spaces');
}
- visitNodeFallback(Node node) {
+ @override
+ void visitNodeFallback(Node node) {
_newline();
_str.write(node);
visitChildren(node);
}
- visitChildren(Node node) {
+ @override
+ void visitChildren(Node node) {
indent += 2;
for (var child in node.nodes) {
visit(child);
@@ -138,9 +140,10 @@
indent -= 2;
}
- visitDocument(node) => _visitDocumentOrFragment(node);
+ @override
+ void visitDocument(node) => _visitDocumentOrFragment(node);
- _visitDocumentOrFragment(node) {
+ void _visitDocumentOrFragment(node) {
indent += 1;
for (var child in node.nodes) {
visit(child);
@@ -148,10 +151,12 @@
indent -= 1;
}
- visitDocumentFragment(DocumentFragment node) =>
+ @override
+ void visitDocumentFragment(DocumentFragment node) =>
_visitDocumentOrFragment(node);
- visitElement(Element node) {
+ @override
+ void visitElement(Element node) {
_newline();
_str.write(node);
if (node.attributes.isNotEmpty) {
@@ -162,7 +167,7 @@
var v = node.attributes[key];
if (key is AttributeName) {
AttributeName attr = key;
- key = "${attr.prefix} ${attr.name}";
+ key = '${attr.prefix} ${attr.name}';
}
_newline();
_str.write('$key="$v"');
diff --git a/test/tokenizer_test.dart b/test/tokenizer_test.dart
index 3d2aeb3..62d5f8a 100644
--- a/test/tokenizer_test.dart
+++ b/test/tokenizer_test.dart
@@ -73,20 +73,20 @@
void processDoctype(DoctypeToken token) {
addOutputToken(token,
- ["DOCTYPE", token.name, token.publicId, token.systemId, token.correct]);
+ ['DOCTYPE', token.name, token.publicId, token.systemId, token.correct]);
}
void processStartTag(StartTagToken token) {
addOutputToken(
- token, ["StartTag", token.name, token.data, token.selfClosing]);
+ token, ['StartTag', token.name, token.data, token.selfClosing]);
}
void processEndTag(EndTagToken token) {
- addOutputToken(token, ["EndTag", token.name, token.selfClosing]);
+ addOutputToken(token, ['EndTag', token.name, token.selfClosing]);
}
void processComment(StringToken token) {
- addOutputToken(token, ["Comment", token.data]);
+ addOutputToken(token, ['Comment', token.data]);
}
void processSpaceCharacters(StringToken token) {
@@ -94,7 +94,7 @@
}
void processCharacters(StringToken token) {
- addOutputToken(token, ["Character", token.data]);
+ addOutputToken(token, ['Character', token.data]);
}
void processEOF(token) {}
@@ -103,7 +103,7 @@
// TODO(jmesserly): when debugging test failures it can be useful to add
// logging here like `print('ParseError $token');`. It would be nice to
// use the actual logging library.
- addOutputToken(token, ["ParseError", token.data]);
+ addOutputToken(token, ['ParseError', token.data]);
}
void addOutputToken(Token token, List array) {
@@ -118,10 +118,10 @@
List concatenateCharacterTokens(List tokens) {
var outputTokens = [];
for (var token in tokens) {
- if (token.indexOf("ParseError") == -1 && token[0] == "Character") {
+ if (token.indexOf('ParseError') == -1 && token[0] == 'Character') {
if (outputTokens.isNotEmpty &&
- outputTokens.last.indexOf("ParseError") == -1 &&
- outputTokens.last[0] == "Character") {
+ outputTokens.last.indexOf('ParseError') == -1 &&
+ outputTokens.last[0] == 'Character') {
outputTokens.last[1] = '${outputTokens.last[1]}${token[1]}';
} else {
outputTokens.add(token);
@@ -135,7 +135,7 @@
List normalizeTokens(List tokens) {
// TODO: convert tests to reflect arrays
- for (int i = 0; i < tokens.length; i++) {
+ for (var i = 0; i < tokens.length; i++) {
var token = tokens[i];
if (token[0] == 'ParseError') {
tokens[i] = token[0];
@@ -155,8 +155,8 @@
// remove it from the received token.
var removeSelfClosing = false;
for (var token in expectedTokens) {
- if (token[0] == "StartTag" && token.length == 3 ||
- token[0] == "EndTag" && token.length == 2) {
+ if (token[0] == 'StartTag' && token.length == 3 ||
+ token[0] == 'EndTag' && token.length == 2) {
removeSelfClosing = true;
break;
}
@@ -164,7 +164,7 @@
if (removeSelfClosing) {
for (var token in receivedTokens) {
- if (token[0] == "StartTag" || token[0] == "EndTag") {
+ if (token[0] == 'StartTag' || token[0] == 'EndTag') {
token.removeLast();
}
}
@@ -174,13 +174,13 @@
expect(receivedTokens, equals(expectedTokens), reason: message);
} else {
// Sort the tokens into two groups; non-parse errors and parse errors
- var expectedNonErrors = expectedTokens.where((t) => t != "ParseError");
- var receivedNonErrors = receivedTokens.where((t) => t != "ParseError");
+ var expectedNonErrors = expectedTokens.where((t) => t != 'ParseError');
+ var receivedNonErrors = receivedTokens.where((t) => t != 'ParseError');
expect(receivedNonErrors, equals(expectedNonErrors), reason: message);
if (!ignoreErrors) {
- var expectedParseErrors = expectedTokens.where((t) => t == "ParseError");
- var receivedParseErrors = receivedTokens.where((t) => t == "ParseError");
+ var expectedParseErrors = expectedTokens.where((t) => t == 'ParseError');
+ var receivedParseErrors = receivedTokens.where((t) => t == 'ParseError');
expect(receivedParseErrors, equals(expectedParseErrors), reason: message);
}
}
@@ -203,17 +203,16 @@
tokens = concatenateCharacterTokens(tokens);
var received = normalizeTokens(tokens);
var errorMsg = [
- "\n\nInitial state:",
+ '\n\nInitial state:',
testInfo['initialState'],
- "\nInput:",
+ '\nInput:',
testInfo['input'],
- "\nExpected:",
+ '\nExpected:',
expected,
- "\nreceived:",
+ '\nreceived:',
tokens
].map((s) => '$s').join('\n');
- var ignoreErrorOrder = testInfo['ignoreErrorOrder'];
- if (ignoreErrorOrder == null) ignoreErrorOrder = false;
+ var ignoreErrorOrder = testInfo['ignoreErrorOrder'] ?? false;
expectTokensMatch(expected, received, ignoreErrorOrder, true, errorMsg);
}
@@ -222,11 +221,11 @@
// TODO(sigmundch,jmesserly): we currently use jsonDecode to unescape the
// unicode characters in the string, we should use a decoding that works with
// any control characters.
- decode(inp) => inp == '\u0000' ? inp : jsonDecode('"$inp"');
+ dynamic decode(inp) => inp == '\u0000' ? inp : jsonDecode('"$inp"');
- testInfo["input"] = decode(testInfo["input"]);
- for (var token in testInfo["output"]) {
- if (token == "ParseError") {
+ testInfo['input'] = decode(testInfo['input']);
+ for (var token in testInfo['output']) {
+ if (token == 'ParseError') {
continue;
} else {
token[1] = decode(token[1]);
@@ -246,7 +245,7 @@
String camelCase(String s) {
s = s.toLowerCase();
var result = StringBuffer();
- for (var match in RegExp(r"\W+(\w)(\w+)").allMatches(s)) {
+ for (var match in RegExp(r'\W+(\w)(\w+)').allMatches(s)) {
if (result.length == 0) result.write(s.substring(0, match.start));
result.write(match.group(1).toUpperCase());
result.write(match.group(2));
@@ -265,13 +264,13 @@
if (testList == null) continue;
group(testName, () {
- for (int index = 0; index < testList.length; index++) {
+ for (var index = 0; index < testList.length; index++) {
final testInfo = testList[index];
- testInfo.putIfAbsent("initialStates", () => ["Data state"]);
- for (var initialState in testInfo["initialStates"]) {
- test(testInfo["description"], () {
- testInfo["initialState"] = camelCase(initialState);
+ testInfo.putIfAbsent('initialStates', () => ['Data state']);
+ for (var initialState in testInfo['initialStates']) {
+ test(testInfo['description'], () {
+ testInfo['initialState'] = camelCase(initialState);
runTokenizerTest(testInfo);
});
}