Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(908)

Unified Diff: pkg/analysis_server/tool/spec/text_formatter.dart

Issue 1431683002: Refactor analysis server code generation to re-use logic from analyzer. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/analysis_server/tool/spec/implied_types.dart ('k') | pkg/analysis_server/tool/spec/to_html.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 '&lt;';
- case '>':
- return '&gt;';
- case '&':
- return '&amp;';
- }
- }
- 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 = '';
- }
- }
-}
« no previous file with comments | « pkg/analysis_server/tool/spec/implied_types.dart ('k') | pkg/analysis_server/tool/spec/to_html.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698