| Index: pkg/third_party/html5lib/lib/dom_parsing.dart
|
| diff --git a/pkg/third_party/html5lib/lib/dom_parsing.dart b/pkg/third_party/html5lib/lib/dom_parsing.dart
|
| deleted file mode 100644
|
| index 527d9a6fa917cc0e8cef0f4afbd46679f58ce348..0000000000000000000000000000000000000000
|
| --- a/pkg/third_party/html5lib/lib/dom_parsing.dart
|
| +++ /dev/null
|
| @@ -1,177 +0,0 @@
|
| -/// This library contains extra APIs that aren't in the DOM, but are useful
|
| -/// when interacting with the parse tree.
|
| -library dom_parsing;
|
| -
|
| -import 'dom.dart';
|
| -import 'src/constants.dart' show rcdataElements;
|
| -
|
| -/// A simple tree visitor for the DOM nodes.
|
| -class TreeVisitor {
|
| - visit(Node node) {
|
| - switch (node.nodeType) {
|
| - case Node.ELEMENT_NODE: return visitElement(node);
|
| - case Node.TEXT_NODE: return visitText(node);
|
| - case Node.COMMENT_NODE: return visitComment(node);
|
| - case Node.DOCUMENT_FRAGMENT_NODE: return visitDocumentFragment(node);
|
| - case Node.DOCUMENT_NODE: return visitDocument(node);
|
| - case Node.DOCUMENT_TYPE_NODE: return visitDocumentType(node);
|
| - default: throw new UnsupportedError('DOM node type ${node.nodeType}');
|
| - }
|
| - }
|
| -
|
| - visitChildren(Node node) {
|
| - // Allow for mutations (remove works) while iterating.
|
| - for (var child in node.nodes.toList()) visit(child);
|
| - }
|
| -
|
| - /// 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);
|
| -
|
| - visitDocument(Document node) => visitNodeFallback(node);
|
| -
|
| - visitDocumentType(DocumentType node) => visitNodeFallback(node);
|
| -
|
| - visitText(Text node) => visitNodeFallback(node);
|
| -
|
| - // TODO(jmesserly): visit attributes.
|
| - visitElement(Element node) => visitNodeFallback(node);
|
| -
|
| - visitComment(Comment node) => visitNodeFallback(node);
|
| -
|
| - visitDocumentFragment(DocumentFragment node) => visitNodeFallback(node);
|
| -}
|
| -
|
| -/// Converts the DOM tree into an HTML string with code markup suitable for
|
| -/// displaying the HTML's source code with CSS colors for different parts of the
|
| -/// markup. See also [CodeMarkupVisitor].
|
| -String htmlToCodeMarkup(Node node) {
|
| - return (new CodeMarkupVisitor()..visit(node)).toString();
|
| -}
|
| -
|
| -/// Converts the DOM tree into an HTML string with code markup suitable for
|
| -/// displaying the HTML's source code with CSS colors for different parts of the
|
| -/// markup. See also [htmlToCodeMarkup].
|
| -class CodeMarkupVisitor extends TreeVisitor {
|
| - final StringBuffer _str;
|
| -
|
| - CodeMarkupVisitor() : _str = new StringBuffer();
|
| -
|
| - String toString() => _str.toString();
|
| -
|
| - visitDocument(Document node) {
|
| - _str.write("<pre>");
|
| - visitChildren(node);
|
| - _str.write("</pre>");
|
| - }
|
| -
|
| - visitDocumentType(DocumentType node) {
|
| - _str.write('<code class="markup doctype"><!DOCTYPE ${node.name}>'
|
| - '</code>');
|
| - }
|
| -
|
| - visitText(Text node) {
|
| - writeTextNodeAsHtml(_str, node);
|
| - }
|
| -
|
| - visitElement(Element node) {
|
| - final tag = node.localName;
|
| - _str.write('<<code class="markup element-name">$tag</code>');
|
| - if (node.attributes.length > 0) {
|
| - node.attributes.forEach((key, v) {
|
| - v = htmlSerializeEscape(v, attributeMode: true);
|
| - _str.write(' <code class="markup attribute-name">$key</code>'
|
| - '=<code class="markup attribute-value">"$v"</code>');
|
| - });
|
| - }
|
| - if (node.nodes.length > 0) {
|
| - _str.write(">");
|
| - visitChildren(node);
|
| - } else if (isVoidElement(tag)) {
|
| - _str.write(">");
|
| - return;
|
| - }
|
| - _str.write(
|
| - '</<code class="markup element-name">$tag</code>>');
|
| - }
|
| -
|
| - visitComment(Comment node) {
|
| - var data = htmlSerializeEscape(node.data);
|
| - _str.write('<code class="markup comment"><!--${data}--></code>');
|
| - }
|
| -}
|
| -
|
| -
|
| -// TODO(jmesserly): reconcile this with dart:web htmlEscape.
|
| -// This one might be more useful, as it is HTML5 spec compliant.
|
| -/// Escapes [text] for use in the
|
| -/// [HTML fragment serialization algorithm][1]. In particular, as described
|
| -/// in the [specification][2]:
|
| -///
|
| -/// - Replace any occurrence of the `&` character by the string `&`.
|
| -/// - Replace any occurrences of the U+00A0 NO-BREAK SPACE character by the
|
| -/// string ` `.
|
| -/// - If the algorithm was invoked in [attributeMode], replace any occurrences
|
| -/// of the `"` character by the string `"`.
|
| -/// - If the algorithm was not invoked in [attributeMode], replace any
|
| -/// occurrences of the `<` character by the string `<`, and any occurrences
|
| -/// of the `>` character by the string `>`.
|
| -///
|
| -/// [1]: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#serializing-html-fragments
|
| -/// [2]: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString
|
| -String htmlSerializeEscape(String text, {bool attributeMode: false}) {
|
| - // TODO(jmesserly): is it faster to build up a list of codepoints?
|
| - // StringBuffer seems cleaner assuming Dart can unbox 1-char strings.
|
| - StringBuffer result = null;
|
| - for (int i = 0; i < text.length; i++) {
|
| - var ch = text[i];
|
| - String replace = null;
|
| - switch (ch) {
|
| - case '&': replace = '&'; break;
|
| - case '\u00A0'/*NO-BREAK SPACE*/: replace = ' '; break;
|
| - case '"': if (attributeMode) replace = '"'; break;
|
| - case '<': if (!attributeMode) replace = '<'; break;
|
| - case '>': if (!attributeMode) replace = '>'; break;
|
| - }
|
| - if (replace != null) {
|
| - if (result == null) result = new StringBuffer(text.substring(0, i));
|
| - result.write(replace);
|
| - } else if (result != null) {
|
| - result.write(ch);
|
| - }
|
| - }
|
| -
|
| - return result != null ? result.toString() : text;
|
| -}
|
| -
|
| -
|
| -/// Returns true if this tag name is a void element.
|
| -/// This method is useful to a pretty printer, because void elements must not
|
| -/// have an end tag.
|
| -/// 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":
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -/// Serialize text node according to:
|
| -/// <http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#html-fragment-serialization-algorithm>
|
| -void writeTextNodeAsHtml(StringBuffer str, Text node) {
|
| - // Don't escape text for certain elements, notably <script>.
|
| - final parent = node.parentNode;
|
| - if (parent is Element) {
|
| - var tag = parent.localName;
|
| - if (rcdataElements.contains(tag) || tag == 'plaintext') {
|
| - str.write(node.data);
|
| - return;
|
| - }
|
| - }
|
| - str.write(htmlSerializeEscape(node.data));
|
| -}
|
|
|