Index: sdk/lib/_internal/dartdoc/lib/classify.dart |
=================================================================== |
--- sdk/lib/_internal/dartdoc/lib/classify.dart (revision 32349) |
+++ sdk/lib/_internal/dartdoc/lib/classify.dart (working copy) |
@@ -1,206 +0,0 @@ |
-// Copyright (c) 2012, 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. |
- |
-library classify; |
- |
-import '../../compiler/implementation/scanner/scannerlib.dart'; |
-// TODO(rnystrom): Use "package:" URL (#4968). |
-import 'markdown.dart' as md; |
- |
-/** |
- * Kinds of tokens that we care to highlight differently. The values of the |
- * fields here will be used as CSS class names for the generated spans. |
- */ |
-class Classification { |
- static const NONE = null; |
- static const ERROR = "e"; |
- static const COMMENT = "c"; |
- static const IDENTIFIER = "i"; |
- static const KEYWORD = "k"; |
- static const OPERATOR = "o"; |
- static const STRING = "s"; |
- static const NUMBER = "n"; |
- static const PUNCTUATION = "p"; |
- |
- // A few things that are nice to make different: |
- static const TYPE_IDENTIFIER = "t"; |
- |
- // Between a keyword and an identifier |
- static const SPECIAL_IDENTIFIER = "r"; |
- |
- static const ARROW_OPERATOR = "a"; |
- |
- static const STRING_INTERPOLATION = 'si'; |
-} |
- |
-/// Returns a marked up HTML string. If the code does not appear to be valid |
-/// Dart code, returns the original [text]. |
-String classifySource(String text) { |
- try { |
- var html = new StringBuffer(); |
- var tokenizer = new StringScanner.fromString(text, includeComments: true); |
- |
- var whitespaceOffset = 0; |
- var token = tokenizer.tokenize(); |
- var inString = false; |
- while (token.kind != EOF_TOKEN) { |
- html.write(text.substring(whitespaceOffset, token.charOffset)); |
- whitespaceOffset = token.charOffset + token.slowCharCount; |
- |
- // Track whether or not we're in a string. |
- switch (token.kind) { |
- case STRING_TOKEN: |
- case STRING_INTERPOLATION_TOKEN: |
- inString = true; |
- break; |
- } |
- |
- final kind = classify(token); |
- final escapedText = md.escapeHtml(token.value); |
- if (kind != null) { |
- // Add a secondary class to tokens appearing within a string so that |
- // we can highlight tokens in an interpolation specially. |
- var stringClass = inString ? Classification.STRING_INTERPOLATION : ''; |
- html.write('<span class="$kind $stringClass">$escapedText</span>'); |
- } else { |
- html.write(escapedText); |
- } |
- |
- // Track whether or not we're in a string. |
- if (token.kind == STRING_TOKEN) { |
- inString = false; |
- } |
- token = token.next; |
- } |
- return html.toString(); |
- } catch (e) { |
- return text; |
- } |
-} |
- |
-bool _looksLikeType(String name) { |
- // If the name looks like an UppercaseName, assume it's a type. |
- return _looksLikePublicType(name) || _looksLikePrivateType(name); |
-} |
- |
-bool _looksLikePublicType(String name) { |
- // If the name looks like an UppercaseName, assume it's a type. |
- return name.length >= 2 && isUpper(name[0]) && isLower(name[1]); |
-} |
- |
-bool _looksLikePrivateType(String name) { |
- // If the name looks like an _UppercaseName, assume it's a type. |
- return (name.length >= 3 && name[0] == '_' && isUpper(name[1]) |
- && isLower(name[2])); |
-} |
- |
-// These ensure that they don't return "true" if the string only has symbols. |
-bool isUpper(String s) => s.toLowerCase() != s; |
-bool isLower(String s) => s.toUpperCase() != s; |
- |
-String classify(Token token) { |
- switch (token.kind) { |
- case IDENTIFIER_TOKEN: |
- // Special case for names that look like types. |
- final text = token.value; |
- if (_looksLikeType(text) |
- || text == 'num' |
- || text == 'bool' |
- || text == 'int' |
- || text == 'double') { |
- return Classification.TYPE_IDENTIFIER; |
- } |
- return Classification.IDENTIFIER; |
- |
- case STRING_TOKEN: |
- case STRING_INTERPOLATION_TOKEN: |
- return Classification.STRING; |
- |
- case INT_TOKEN: |
- case HEXADECIMAL_TOKEN: |
- case DOUBLE_TOKEN: |
- return Classification.NUMBER; |
- |
- case COMMENT_TOKEN: |
- return Classification.COMMENT; |
- |
- // => is so awesome it is in a class of its own. |
- case FUNCTION_TOKEN: |
- return Classification.ARROW_OPERATOR; |
- |
- case OPEN_PAREN_TOKEN: |
- case CLOSE_PAREN_TOKEN: |
- case OPEN_SQUARE_BRACKET_TOKEN: |
- case CLOSE_SQUARE_BRACKET_TOKEN: |
- case OPEN_CURLY_BRACKET_TOKEN: |
- case CLOSE_CURLY_BRACKET_TOKEN: |
- case COLON_TOKEN: |
- case SEMICOLON_TOKEN: |
- case COMMA_TOKEN: |
- case PERIOD_TOKEN: |
- case PERIOD_PERIOD_TOKEN: |
- return Classification.PUNCTUATION; |
- |
- case PLUS_PLUS_TOKEN: |
- case MINUS_MINUS_TOKEN: |
- case TILDE_TOKEN: |
- case BANG_TOKEN: |
- case EQ_TOKEN: |
- case BAR_EQ_TOKEN: |
- case CARET_EQ_TOKEN: |
- case AMPERSAND_EQ_TOKEN: |
- case LT_LT_EQ_TOKEN: |
- case GT_GT_EQ_TOKEN: |
- case PLUS_EQ_TOKEN: |
- case MINUS_EQ_TOKEN: |
- case STAR_EQ_TOKEN: |
- case SLASH_EQ_TOKEN: |
- case TILDE_SLASH_EQ_TOKEN: |
- case PERCENT_EQ_TOKEN: |
- case QUESTION_TOKEN: |
- case BAR_BAR_TOKEN: |
- case AMPERSAND_AMPERSAND_TOKEN: |
- case BAR_TOKEN: |
- case CARET_TOKEN: |
- case AMPERSAND_TOKEN: |
- case LT_LT_TOKEN: |
- case GT_GT_TOKEN: |
- case PLUS_TOKEN: |
- case MINUS_TOKEN: |
- case STAR_TOKEN: |
- case SLASH_TOKEN: |
- case TILDE_SLASH_TOKEN: |
- case PERCENT_TOKEN: |
- case EQ_EQ_TOKEN: |
- case BANG_EQ_TOKEN: |
- case EQ_EQ_EQ_TOKEN: |
- case BANG_EQ_EQ_TOKEN: |
- case LT_TOKEN: |
- case GT_TOKEN: |
- case LT_EQ_TOKEN: |
- case GT_EQ_TOKEN: |
- case INDEX_TOKEN: |
- case INDEX_EQ_TOKEN: |
- return Classification.OPERATOR; |
- |
- // Color keyword token. Most are colored as keywords. |
- case HASH_TOKEN: |
- case KEYWORD_TOKEN: |
- if (token.stringValue == 'void') { |
- // Color "void" as a type. |
- return Classification.TYPE_IDENTIFIER; |
- } |
- if (token.stringValue == 'this' || token.stringValue == 'super') { |
- // Color "this" and "super" as identifiers. |
- return Classification.SPECIAL_IDENTIFIER; |
- } |
- return Classification.KEYWORD; |
- |
- case EOF_TOKEN: |
- return Classification.NONE; |
- |
- default: |
- return Classification.NONE; |
- } |
-} |