Index: pkg/analysis_server/tool/spec/text_formatter.dart |
diff --git a/pkg/analysis_server/tool/spec/text_formatter.dart b/pkg/analysis_server/tool/spec/text_formatter.dart |
deleted file mode 100644 |
index a4eb82c5caf325d3548637e833f7299d47007c35..0000000000000000000000000000000000000000 |
--- a/pkg/analysis_server/tool/spec/text_formatter.dart |
+++ /dev/null |
@@ -1,246 +0,0 @@ |
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-/** |
- * Code for converting HTML into text, for use in doc comments. |
- */ |
-library text.formatter; |
- |
-import 'package:html/dom.dart' as dom; |
- |
-import 'codegen_tools.dart'; |
- |
-final RegExp whitespace = new RegExp(r'\s'); |
- |
-/** |
- * Convert the HTML in [desc] into text, word wrapping at width [width]. |
- * |
- * If [javadocStyle] is true, then the output is compatable with Javadoc, |
- * which understands certain HTML constructs. |
- */ |
-String nodesToText(List<dom.Node> desc, int width, bool javadocStyle, |
- {bool removeTrailingNewLine: false}) { |
- _TextFormatter formatter = new _TextFormatter(width, javadocStyle); |
- return formatter.collectCode(() { |
- formatter.addAll(desc); |
- formatter.lineBreak(false); |
- }, removeTrailingNewLine: removeTrailingNewLine); |
-} |
- |
-/** |
- * Engine that transforms HTML to text. The input HTML is processed one |
- * character at a time, gathering characters into words and words into lines. |
- */ |
-class _TextFormatter extends CodeGenerator { |
- /** |
- * Word-wrapping width. |
- */ |
- final int width; |
- |
- /** |
- * The word currently being gathered. |
- */ |
- String word = ''; |
- |
- /** |
- * The line currently being gathered. |
- */ |
- String line = ''; |
- |
- /** |
- * True if a blank line should be inserted before the next word. |
- */ |
- bool verticalSpaceNeeded = false; |
- |
- /** |
- * True if no text has been output yet. This suppresses blank lines. |
- */ |
- bool atStart = true; |
- |
- /** |
- * True if we are processing a <pre> element, thus whitespace should be |
- * preserved. |
- */ |
- bool preserveSpaces = false; |
- |
- /** |
- * True if the output should be Javadoc compatible. |
- */ |
- final bool javadocStyle; |
- |
- _TextFormatter(this.width, this.javadocStyle); |
- |
- /** |
- * Process an HTML node. |
- */ |
- void add(dom.Node node) { |
- if (node is dom.Text) { |
- for (String char in node.text.split('')) { |
- if (preserveSpaces) { |
- wordBreak(); |
- write(escape(char)); |
- } else if (whitespace.hasMatch(char)) { |
- wordBreak(); |
- } else { |
- resolveVerticalSpace(); |
- word += escape(char); |
- } |
- } |
- } else if (node is dom.Element) { |
- switch (node.localName) { |
- case 'br': |
- lineBreak(false); |
- break; |
- case 'dl': |
- case 'dt': |
- case 'h1': |
- case 'h2': |
- case 'h3': |
- case 'h4': |
- case 'p': |
- lineBreak(true); |
- addAll(node.nodes); |
- lineBreak(true); |
- break; |
- case 'div': |
- lineBreak(false); |
- if (node.classes.contains('hangingIndent')) { |
- resolveVerticalSpace(); |
- indentSpecial('', ' ', () { |
- addAll(node.nodes); |
- lineBreak(false); |
- }); |
- } else { |
- addAll(node.nodes); |
- lineBreak(false); |
- } |
- break; |
- case 'ul': |
- lineBreak(false); |
- addAll(node.nodes); |
- lineBreak(false); |
- break; |
- case 'li': |
- lineBreak(false); |
- resolveVerticalSpace(); |
- indentSpecial('- ', ' ', () { |
- addAll(node.nodes); |
- lineBreak(false); |
- }); |
- break; |
- case 'dd': |
- lineBreak(true); |
- indent(() { |
- addAll(node.nodes); |
- lineBreak(true); |
- }); |
- break; |
- case 'pre': |
- lineBreak(false); |
- resolveVerticalSpace(); |
- if (javadocStyle) { |
- writeln('<pre>'); |
- } |
- bool oldPreserveSpaces = preserveSpaces; |
- try { |
- preserveSpaces = true; |
- addAll(node.nodes); |
- } finally { |
- preserveSpaces = oldPreserveSpaces; |
- } |
- writeln(); |
- if (javadocStyle) { |
- writeln('</pre>'); |
- } |
- lineBreak(false); |
- break; |
- case 'a': |
- case 'b': |
- case 'body': |
- case 'html': |
- case 'i': |
- case 'span': |
- case 'tt': |
- addAll(node.nodes); |
- break; |
- case 'head': |
- break; |
- default: |
- throw new Exception('Unexpected HTML element: ${node.localName}'); |
- } |
- } else { |
- throw new Exception('Unexpected HTML: $node'); |
- } |
- } |
- |
- /** |
- * Process a list of HTML nodes. |
- */ |
- void addAll(List<dom.Node> nodes) { |
- for (dom.Node node in nodes) { |
- add(node); |
- } |
- } |
- |
- /** |
- * Escape the given character for HTML. |
- */ |
- String escape(String char) { |
- if (javadocStyle) { |
- switch (char) { |
- case '<': |
- return '<'; |
- case '>': |
- return '>'; |
- case '&': |
- return '&'; |
- } |
- } |
- return char; |
- } |
- |
- /** |
- * Terminate the current word and/or line, if either is in progress. |
- */ |
- void lineBreak(bool gap) { |
- wordBreak(); |
- if (line.isNotEmpty) { |
- writeln(line); |
- line = ''; |
- } |
- if (gap && !atStart) { |
- verticalSpaceNeeded = true; |
- } |
- } |
- |
- /** |
- * Insert vertical space if necessary. |
- */ |
- void resolveVerticalSpace() { |
- if (verticalSpaceNeeded) { |
- writeln(); |
- verticalSpaceNeeded = false; |
- } |
- } |
- |
- /** |
- * Terminate the current word, if a word is in progress. |
- */ |
- void wordBreak() { |
- if (word.isNotEmpty) { |
- atStart = false; |
- if (line.isNotEmpty) { |
- if (indentWidth + line.length + 1 + word.length <= width) { |
- line += ' $word'; |
- } else { |
- writeln(line); |
- line = word; |
- } |
- } else { |
- line = word; |
- } |
- word = ''; |
- } |
- } |
-} |