| Index: frog/samples/classify.dart
|
| diff --git a/frog/samples/classify.dart b/frog/samples/classify.dart
|
| deleted file mode 100644
|
| index 417ebffefad3c8bb629a5523559ef1c38c0359b9..0000000000000000000000000000000000000000
|
| --- a/frog/samples/classify.dart
|
| +++ /dev/null
|
| @@ -1,251 +0,0 @@
|
| -// Copyright (c) 2011, 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.
|
| -#import('../lang.dart');
|
| -
|
| -/**
|
| - * 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 final NONE = null;
|
| - static final ERROR = "e";
|
| - static final COMMENT = "c";
|
| - static final IDENTIFIER = "i";
|
| - static final KEYWORD = "k";
|
| - static final OPERATOR = "o";
|
| - static final STRING = "s";
|
| - static final NUMBER = "n";
|
| - static final PUNCTUATION = "p";
|
| -
|
| - // A few things that are nice to make different:
|
| - static final TYPE_IDENTIFIER = "t";
|
| -
|
| - // Between a keyword and an identifier
|
| - static final SPECIAL_IDENTIFIER = "r";
|
| -
|
| - static final ARROW_OPERATOR = "a";
|
| -
|
| - static final STRING_INTERPOLATION = 'si';
|
| -}
|
| -
|
| -String classifySource(SourceFile src) {
|
| - var html = new StringBuffer();
|
| - var tokenizer = new Tokenizer(src, /*skipWhitespace:*/false);
|
| -
|
| - var token;
|
| - var inString = false;
|
| - while ((token = tokenizer.next()).kind != TokenKind.END_OF_FILE) {
|
| -
|
| - // Track whether or not we're in a string.
|
| - switch (token.kind) {
|
| - case TokenKind.STRING:
|
| - case TokenKind.STRING_PART:
|
| - case TokenKind.INCOMPLETE_STRING:
|
| - case TokenKind.INCOMPLETE_MULTILINE_STRING_DQ:
|
| - case TokenKind.INCOMPLETE_MULTILINE_STRING_SQ:
|
| - inString = true;
|
| - break;
|
| - }
|
| -
|
| - final kind = classify(token);
|
| - final text = htmlEscape(token.text);
|
| - 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.add('<span class="$kind $stringClass">$text</span>');
|
| - } else {
|
| - html.add('<span>$text</span>');
|
| - }
|
| -
|
| - // Track whether or not we're in a string.
|
| - if (token.kind == TokenKind.STRING) {
|
| - inString = false;
|
| - }
|
| - }
|
| - return html.toString();
|
| -}
|
| -
|
| -// TODO(rnystrom): should exist in standard lib somewhere
|
| -String htmlEscape(String text) {
|
| - return text.replaceAll('&', '&').replaceAll(
|
| - '>', '>').replaceAll('<', '<');
|
| -}
|
| -
|
| -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 TokenKind.ERROR:
|
| - return Classification.ERROR;
|
| -
|
| - case TokenKind.IDENTIFIER:
|
| - // Special case for names that look like types.
|
| - if (_looksLikeType(token.text)
|
| - || token.text == 'num'
|
| - || token.text == 'bool'
|
| - || token.text == 'int'
|
| - || token.text == 'double') {
|
| - return Classification.TYPE_IDENTIFIER;
|
| - }
|
| - return Classification.IDENTIFIER;
|
| -
|
| - // Even though it's a reserved word, let's try coloring it like a type.
|
| - case TokenKind.VOID:
|
| - return Classification.TYPE_IDENTIFIER;
|
| -
|
| - case TokenKind.THIS:
|
| - case TokenKind.SUPER:
|
| - return Classification.SPECIAL_IDENTIFIER;
|
| -
|
| - case TokenKind.STRING:
|
| - case TokenKind.STRING_PART:
|
| - case TokenKind.INCOMPLETE_STRING:
|
| - case TokenKind.INCOMPLETE_MULTILINE_STRING_DQ:
|
| - case TokenKind.INCOMPLETE_MULTILINE_STRING_SQ:
|
| - return Classification.STRING;
|
| -
|
| - case TokenKind.INTEGER:
|
| - case TokenKind.HEX_INTEGER:
|
| - case TokenKind.DOUBLE:
|
| - return Classification.NUMBER;
|
| -
|
| - case TokenKind.COMMENT:
|
| - case TokenKind.INCOMPLETE_COMMENT:
|
| - return Classification.COMMENT;
|
| -
|
| - // => is so awesome it is in a class of its own.
|
| - case TokenKind.ARROW:
|
| - return Classification.ARROW_OPERATOR;
|
| -
|
| - case TokenKind.HASHBANG:
|
| - case TokenKind.LPAREN:
|
| - case TokenKind.RPAREN:
|
| - case TokenKind.LBRACK:
|
| - case TokenKind.RBRACK:
|
| - case TokenKind.LBRACE:
|
| - case TokenKind.RBRACE:
|
| - case TokenKind.COLON:
|
| - case TokenKind.SEMICOLON:
|
| - case TokenKind.COMMA:
|
| - case TokenKind.DOT:
|
| - case TokenKind.ELLIPSIS:
|
| - return Classification.PUNCTUATION;
|
| -
|
| - case TokenKind.INCR:
|
| - case TokenKind.DECR:
|
| - case TokenKind.BIT_NOT:
|
| - case TokenKind.NOT:
|
| - case TokenKind.ASSIGN:
|
| - case TokenKind.ASSIGN_OR:
|
| - case TokenKind.ASSIGN_XOR:
|
| - case TokenKind.ASSIGN_AND:
|
| - case TokenKind.ASSIGN_SHL:
|
| - case TokenKind.ASSIGN_SAR:
|
| - case TokenKind.ASSIGN_SHR:
|
| - case TokenKind.ASSIGN_ADD:
|
| - case TokenKind.ASSIGN_SUB:
|
| - case TokenKind.ASSIGN_MUL:
|
| - case TokenKind.ASSIGN_DIV:
|
| - case TokenKind.ASSIGN_TRUNCDIV:
|
| - case TokenKind.ASSIGN_MOD:
|
| - case TokenKind.CONDITIONAL:
|
| - case TokenKind.OR:
|
| - case TokenKind.AND:
|
| - case TokenKind.BIT_OR:
|
| - case TokenKind.BIT_XOR:
|
| - case TokenKind.BIT_AND:
|
| - case TokenKind.SHL:
|
| - case TokenKind.SAR:
|
| - case TokenKind.SHR:
|
| - case TokenKind.ADD:
|
| - case TokenKind.SUB:
|
| - case TokenKind.MUL:
|
| - case TokenKind.DIV:
|
| - case TokenKind.TRUNCDIV:
|
| - case TokenKind.MOD:
|
| - case TokenKind.EQ:
|
| - case TokenKind.NE:
|
| - case TokenKind.EQ_STRICT:
|
| - case TokenKind.NE_STRICT:
|
| - case TokenKind.LT:
|
| - case TokenKind.GT:
|
| - case TokenKind.LTE:
|
| - case TokenKind.GTE:
|
| - case TokenKind.INDEX:
|
| - case TokenKind.SETINDEX:
|
| - return Classification.OPERATOR;
|
| -
|
| - // Color this like a keyword
|
| - case TokenKind.HASH:
|
| -
|
| - case TokenKind.ABSTRACT:
|
| - case TokenKind.ASSERT:
|
| - case TokenKind.CLASS:
|
| - case TokenKind.EXTENDS:
|
| - case TokenKind.FACTORY:
|
| - case TokenKind.GET:
|
| - case TokenKind.IMPLEMENTS:
|
| - case TokenKind.IMPORT:
|
| - case TokenKind.INTERFACE:
|
| - case TokenKind.LIBRARY:
|
| - case TokenKind.NATIVE:
|
| - case TokenKind.NEGATE:
|
| - case TokenKind.OPERATOR:
|
| - case TokenKind.SET:
|
| - case TokenKind.SOURCE:
|
| - case TokenKind.STATIC:
|
| - case TokenKind.TYPEDEF:
|
| - case TokenKind.BREAK:
|
| - case TokenKind.CASE:
|
| - case TokenKind.CATCH:
|
| - case TokenKind.CONST:
|
| - case TokenKind.CONTINUE:
|
| - case TokenKind.DEFAULT:
|
| - case TokenKind.DO:
|
| - case TokenKind.ELSE:
|
| - case TokenKind.FALSE:
|
| - case TokenKind.FINALLY:
|
| - case TokenKind.FOR:
|
| - case TokenKind.IF:
|
| - case TokenKind.IN:
|
| - case TokenKind.IS:
|
| - case TokenKind.NEW:
|
| - case TokenKind.NULL:
|
| - case TokenKind.RETURN:
|
| - case TokenKind.SWITCH:
|
| - case TokenKind.THROW:
|
| - case TokenKind.TRUE:
|
| - case TokenKind.TRY:
|
| - case TokenKind.WHILE:
|
| - case TokenKind.VAR:
|
| - case TokenKind.FINAL:
|
| - return Classification.KEYWORD;
|
| -
|
| - case TokenKind.WHITESPACE:
|
| - case TokenKind.END_OF_FILE:
|
| - return Classification.NONE;
|
| -
|
| - default:
|
| - return Classification.NONE;
|
| - }
|
| -}
|
|
|