using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using JSCompiler.Core; namespace JSCompiler.SyntaxHighlighter { public static class SyntaxHighlighter { private static readonly string HTML = @" {0} {1} {2} "; private static readonly string DEFAULT_CSS = @""; private static IEnumerable KEYWORDS = ReservedStrings.KeywordsAsMap().Values; private static IEnumerable OTHER_RESERVED = ReservedStrings.OthersAsMap().Values; private static IEnumerable ONE_SYMBOL_OPERATORS = new List { TokenType.Minus, // - TokenType.Plus, // + TokenType.Star, // * TokenType.Division, // / TokenType.Modulo, // % TokenType.BitwiseNot, // ~ TokenType.BitwiseAnd, // & TokenType.BitwiseXor, // ^ TokenType.BitwiseOr, // | TokenType.QuestionMark, // ? TokenType.Bang, // ! TokenType.Equal, // = TokenType.Greater, // > TokenType.Less, // < TokenType.Backslash, // \ }; private static IEnumerable MULT_SYMBOL_OPERATORS = new List { TokenType.NotEqual, // != TokenType.EqualEqual, // == TokenType.StrictEqual, // === TokenType.StrictNotEqual, // !== TokenType.GreaterEqual, // >= TokenType.LessEqual, // <= TokenType.MinusMinus, // -- TokenType.PlusPlus, // ++ TokenType.LeftShift, // << TokenType.RightShift, // >> TokenType.LogicalAnd, // && TokenType.LogicalOr, // || TokenType.StarEqual, // *= TokenType.DivideEqual, // /= TokenType.ModuloEqual, // %= TokenType.PlusEqual, // += TokenType.MinusEqual, // -= TokenType.LeftShiftEqual, // <<= TokenType.RightShiftEqual, // >>= TokenType.BitwiseAndEqual, // &= TokenType.BitwiseXorEqual, // ^= TokenType.BitwiseOrEqual, // |= }; public static void GenerateHtml(IEnumerable tokens, string fileName, string css = null) { if (css == null) css = DEFAULT_CSS; string code = ""; IEnumerator tokenEnum = tokens.GetEnumerator(); if (!tokenEnum.MoveNext()) return; Token cur; do { cur = tokenEnum.Current; TokenType type = cur.Type; switch (type) { case TokenType.Whitespace: code += " "; break; case TokenType.Tab: code += " " + " " + " " + " "; break; case TokenType.NewLine: code += "
"; break; case TokenType.Number: code += "" + ((NumToken)cur).Num + ""; break; case TokenType.String: code += "" + ((WordToken)cur).Lexeme + ""; break; case TokenType.Identifier: code += "" + ((WordToken)cur).Lexeme + ""; break; case TokenType.Comment: code += "" + ((WordToken)cur).Lexeme + ""; break; case TokenType.Error: code += "" + ((WordToken)cur).Lexeme + ""; break; default: if (KEYWORDS.Contains(type)) { code += "" + ((WordToken)cur).Lexeme + ""; } else if(OTHER_RESERVED.Contains(type)) { code += "" + ((WordToken)cur).Lexeme + ""; } else if (ONE_SYMBOL_OPERATORS.Contains(type)) { code += "" + cur.ToString() + ""; } else if (MULT_SYMBOL_OPERATORS.Contains(type)) { code += "" + ((WordToken)cur).Lexeme + ""; } else { code += "" + cur.ToString() + ""; break; } break; } } while (tokenEnum.MoveNext() && tokenEnum.Current.Type != TokenType.EOF); string shouldWrite = string.Format(HTML, css, fileName, code); using (StreamWriter writer = new StreamWriter(fileName)) { writer.Write(shouldWrite); } } } }