Website Summary Files Commits Branches @commit @diff @stats
path: root / homework / 81709 / JSCompiler.SyntaxHighlighter / SyntaxHighlighter.cs
diff options
context:
space:
mode:
Commit47e8c6f331525f01f150ba80a3557a18618b0cf5 (patch)
Author
 Georgi Barnev <gbarnev@gmail.com>
2018-11-07 13:05:43 +0200
Committer
 dtrendafilov <trendafilov.dn@gmail.com>
2018-11-07 13:05:43 +0200
Files3fde3f4fc002e4d10c49436d85188d4f3b02e33f /homework/81709/JSCompiler.SyntaxHighlighter/SyntaxHighlighter.cs
IPL-47e8c6f331525f01f150ba80a3557a18618b0cf5.tar
IPL-47e8c6f331525f01f150ba80a3557a18618b0cf5.tar.gz
IPL-47e8c6f331525f01f150ba80a3557a18618b0cf5.zip
Parent5a4403ef23e17a3da84f1ec9feb3ab294d23c198 (diff)
Homework 1 - C# Lexer and Syntax Highlighter for Javascript (#34)
* Initial lexer structure * Added IInputStream interface for the Lexer and its base implementation in FileInputStream not implemented yet. * Extend InputStream interface * Implement FileInputStream not tested * Lexer almost ready - comments need to be parsed. InputStream ready * Added some TODOs * Add error token type and almost parse comments * Parse multiline comments and fix string parsing to not include the quotes. * Added Syntax Highlighter, added support for more js reserved words, removed error tokens to not break the actual word tokens, fixed comments and string token representation to include its special characters * Initial lexer structure * Added IInputStream interface for the Lexer and its base implementation in FileInputStream not implemented yet. * Extend InputStream interface * Implement FileInputStream not tested * Lexer almost ready - comments need to be parsed. InputStream ready * Added some TODOs * Add error token type and almost parse comments * Parse multiline comments and fix string parsing to not include the quotes. * Added Syntax Highlighter, added support for more js reserved words, removed error tokens to not break the actual word tokens, fixed comments and string token representation to include its special characters * Improve project structure and add tests * Fix physical path structure of the projects * Write tests, fix tokenizer bugs * Fix README format, fix AssemblyInfo name * Escape slashes in readme
1 files changed, 187 insertions, 0 deletions
-rw-r--r--homework/81709/JSCompiler.SyntaxHighlighter/SyntaxHighlighter.cs187
diff --git a/homework/81709/JSCompiler.SyntaxHighlighter/SyntaxHighlighter.cs b/homework/81709/JSCompiler.SyntaxHighlighter/SyntaxHighlighter.cs
new file mode 100644
index 0000000..fd8572f
--- /dev/null
+++ b/homework/81709/JSCompiler.SyntaxHighlighter/SyntaxHighlighter.cs
@@ -0,0 +1,187 @@
+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 =
+ @"<!DOCTYPE html>
+<html>
+<head>
+{0}
+<title> {1} </title>
+</head>
+<body> {2} </body></html>";
+
+ private static readonly string DEFAULT_CSS =
+ @"<style>
+body {
+ font-size: 20px;
+ font-family: ""Verdana"";
+}
+.number {
+ color: Orange;
+}
+.string {
+ color: Gray;
+ white-space: pre-wrap;
+}
+.keyword {
+ color: Blue;
+}
+.identifier {
+ color: Black;
+}
+.operator {
+ color: DarkBlue;
+}
+.comment {
+ color: Green;
+ font-style: italic;
+ white-space: pre-wrap;
+}
+
+.reserved {
+ color: MediumVioletRed;
+}
+
+.undefined{
+ color: Black;
+}
+
+.default {
+ color: DarkBlue;
+}
+</style>";
+
+ private static IEnumerable<TokenType> KEYWORDS = ReservedStrings.KeywordsAsMap().Values;
+
+ private static IEnumerable<TokenType> OTHER_RESERVED = ReservedStrings.OthersAsMap().Values;
+
+ private static IEnumerable<TokenType> ONE_SYMBOL_OPERATORS = new List<TokenType>
+ {
+ 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<TokenType> MULT_SYMBOL_OPERATORS = new List<TokenType>
+ {
+ 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<Token> tokens, string fileName, string css = null)
+ {
+ if (css == null) css = DEFAULT_CSS;
+
+ string code = "";
+ IEnumerator<Token> tokenEnum = tokens.GetEnumerator();
+ if (!tokenEnum.MoveNext()) return;
+ Token cur;
+ do
+ {
+ cur = tokenEnum.Current;
+ TokenType type = cur.Type;
+
+ switch (type)
+ {
+ case TokenType.Whitespace:
+ code += "&nbsp";
+ break;
+ case TokenType.Tab:
+ code += "&nbsp" + "&nbsp" + "&nbsp" + "&nbsp";
+ break;
+ case TokenType.NewLine:
+ code += "<br>";
+ break;
+ case TokenType.Number:
+ code += "<span class=\"number\">" + ((NumToken)cur).Num + "</span>";
+ break;
+ case TokenType.String:
+ code += "<span class=\"string\">" + ((WordToken)cur).Lexeme + "</span>";
+ break;
+ case TokenType.Identifier:
+ code += "<span class=\"identifier\">" + ((WordToken)cur).Lexeme + "</span>";
+ break;
+ case TokenType.Comment:
+ code += "<span class=\"comment\">" + ((WordToken)cur).Lexeme + "</span>";
+ break;
+ case TokenType.Error:
+ code += "<span class=\"undefined\">" + ((WordToken)cur).Lexeme + "</span>";
+ break;
+
+ default:
+ if (KEYWORDS.Contains(type))
+ {
+ code += "<span class=\"keyword\">" + ((WordToken)cur).Lexeme + "</span>";
+ }
+ else if(OTHER_RESERVED.Contains(type))
+ {
+ code += "<span class=\"reserved\">" + ((WordToken)cur).Lexeme + "</span>";
+ }
+ else if (ONE_SYMBOL_OPERATORS.Contains(type))
+ {
+ code += "<span class=\"operator\">" + cur.ToString() + "</span>";
+ }
+ else if (MULT_SYMBOL_OPERATORS.Contains(type))
+ {
+ code += "<span class=\"operator\">" + ((WordToken)cur).Lexeme + "</span>";
+ }
+ else
+ {
+ code += "<span class=\"default\">" + cur.ToString() + "</span>";
+ 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);
+ }
+ }
+ }
+}