From 2f3c5b0912656dfa81e4c03feaa14223c694c9b6 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 12 Jul 2011 19:08:37 +0400 Subject: [PATCH] Confluence highlighter works --- .../org/jetbrains/jet/lexer/JetMacro.java | 45 +++++++++++++++---- .../org/jetbrains/jet/lexer/JetTokens.java | 4 +- .../org/jetbrains/jet/lexer/_JetLexer.java | 4 +- confluence/src/main/resources/jet.css | 33 +++++++++++++- .../org/jetbrains/jet/lexer/JetTokens.java | 4 +- idea/testData/psi/Precedence.txt | 12 ++--- 6 files changed, 81 insertions(+), 21 deletions(-) diff --git a/confluence/src/main/java/org/jetbrains/jet/lexer/JetMacro.java b/confluence/src/main/java/org/jetbrains/jet/lexer/JetMacro.java index 124be8a0220..21e93c4548c 100644 --- a/confluence/src/main/java/org/jetbrains/jet/lexer/JetMacro.java +++ b/confluence/src/main/java/org/jetbrains/jet/lexer/JetMacro.java @@ -6,11 +6,13 @@ import com.atlassian.renderer.RenderContext; import com.atlassian.renderer.v2.RenderMode; import com.atlassian.renderer.v2.macro.BaseMacro; import com.atlassian.renderer.v2.macro.MacroException; +import com.intellij.psi.TokenType; import com.intellij.psi.tree.IElementType; import org.apache.velocity.VelocityContext; import java.io.IOException; import java.io.StringReader; +import java.util.HashMap; import java.util.Map; /** @@ -29,6 +31,7 @@ public class JetMacro extends BaseMacro { @Override public String execute(Map map, String code, RenderContext renderContext) throws MacroException { + code = code.trim(); VelocityContext context = new VelocityContext(MacroUtils.defaultVelocityContext()); String renderedTemplate = VelocityUtils.getRenderedTemplate("template.velocity", context); @@ -39,23 +42,49 @@ public class JetMacro extends BaseMacro { "
" ); - _JetLexer jetLexer = new _JetLexer(new StringReader(code)); + _JetLexer jetLexer = new _JetLexer(new StringReader("")); jetLexer.reset(code, 0, code.length(), _JetLexer.YYINITIAL); + + Map styleMap = new HashMap(); + styleMap.put(JetTokens.BLOCK_COMMENT, "comment"); + styleMap.put(JetTokens.DOC_COMMENT, "comment"); + styleMap.put(JetTokens.EOL_COMMENT, "comment"); + styleMap.put(JetTokens.WHITE_SPACE, "whitespace"); + styleMap.put(JetTokens.INTEGER_LITERAL, "number"); + styleMap.put(JetTokens.FLOAT_LITERAL, "number"); + styleMap.put(JetTokens.OPEN_QUOTE, "string"); + styleMap.put(JetTokens.REGULAR_STRING_PART, "string"); + styleMap.put(JetTokens.ESCAPE_SEQUENCE, "escape"); + styleMap.put(JetTokens.LONG_TEMPLATE_ENTRY_START, "escape"); + styleMap.put(JetTokens.LONG_TEMPLATE_ENTRY_END, "escape"); + styleMap.put(JetTokens.SHORT_TEMPLATE_ENTRY_START, "escape"); + styleMap.put(JetTokens.ESCAPE_SEQUENCE, "escape"); + styleMap.put(JetTokens.CLOSING_QUOTE, "string"); + styleMap.put(JetTokens.CHARACTER_LITERAL, "string"); + styleMap.put(JetTokens.LABEL_IDENTIFIER, "label"); + styleMap.put(JetTokens.ATAT, "label"); + styleMap.put(JetTokens.FIELD_IDENTIFIER, "field"); + styleMap.put(JetTokens.RAW_STRING_LITERAL, "string"); + styleMap.put(TokenType.BAD_CHARACTER, "bad"); + while (true) { try { IElementType token = jetLexer.advance(); if (token == null) break; CharSequence yytext = jetLexer.yytext(); - String style; + String style = null; if (token instanceof JetKeywordToken) { style = "keyword"; - } else if (token == JetTokens.BLOCK_COMMENT || token == JetTokens.DOC_COMMENT || token == JetTokens.EOL_COMMENT) { - style = "comment"; } else if (token == JetTokens.IDENTIFIER) { - - style = "softkeyword"; - } else if (token == JetTokens.WHITE_SPACE) { - style = "whitespace"; + for (IElementType softKeyword : JetTokens.SOFT_KEYWORDS.asSet()) { + if (((JetKeywordToken) softKeyword).getValue().equals(yytext.toString())) { + style = "softkeyword"; + break; + } + } + style = style == null ? "plain" : style; + } else if (styleMap.containsKey(token)) { + style = styleMap.get(token); } else { style = "plain"; } diff --git a/confluence/src/main/java/org/jetbrains/jet/lexer/JetTokens.java b/confluence/src/main/java/org/jetbrains/jet/lexer/JetTokens.java index 07b418207bf..d50cc507f1a 100644 --- a/confluence/src/main/java/org/jetbrains/jet/lexer/JetTokens.java +++ b/confluence/src/main/java/org/jetbrains/jet/lexer/JetTokens.java @@ -62,7 +62,7 @@ public interface JetTokens { JetKeywordToken CAPITALIZED_THIS_KEYWORD = JetKeywordToken.keyword("This"); - JetToken AS_SAFE = new JetToken("as?"); + JetToken AS_SAFE = JetKeywordToken.keyword("AS_SAFE");//new JetToken("as?"); JetToken IDENTIFIER = new JetToken("IDENTIFIER"); JetToken LABEL_IDENTIFIER = new JetToken("LABEL_IDENTIFIER"); @@ -150,7 +150,7 @@ public interface JetTokens { TRUE_KEYWORD, FALSE_KEYWORD, IS_KEYWORD, IN_KEYWORD, THROW_KEYWORD, RETURN_KEYWORD, BREAK_KEYWORD, CONTINUE_KEYWORD, OBJECT_KEYWORD, IF_KEYWORD, ELSE_KEYWORD, WHILE_KEYWORD, DO_KEYWORD, TRY_KEYWORD, WHEN_KEYWORD, - NOT_IN, NOT_IS, CAPITALIZED_THIS_KEYWORD + NOT_IN, NOT_IS, CAPITALIZED_THIS_KEYWORD, AS_SAFE ); TokenSet SOFT_KEYWORDS = TokenSet.create(WRAPS_KEYWORD, IMPORT_KEYWORD, WHERE_KEYWORD, BY_KEYWORD, GET_KEYWORD, diff --git a/confluence/src/main/java/org/jetbrains/jet/lexer/_JetLexer.java b/confluence/src/main/java/org/jetbrains/jet/lexer/_JetLexer.java index 9cd77cca9cc..b2d384a2623 100644 --- a/confluence/src/main/java/org/jetbrains/jet/lexer/_JetLexer.java +++ b/confluence/src/main/java/org/jetbrains/jet/lexer/_JetLexer.java @@ -1,4 +1,4 @@ -/* The following code was generated by JFlex 1.4.3 on 7/12/11 5:50 PM */ +/* The following code was generated by JFlex 1.4.3 on 7/12/11 6:40 PM */ /* It's an automatically generated code. Do not modify it. */ package org.jetbrains.jet.lexer; @@ -14,7 +14,7 @@ import org.jetbrains.jet.lexer.JetTokens; /** * This class is a scanner generated by * JFlex 1.4.3 - * on 7/12/11 5:50 PM from the specification file + * on 7/12/11 6:40 PM from the specification file * /Users/abreslav/work/jet/confluence/../idea/src/org/jetbrains/jet/lexer/Jet.flex */ class _JetLexer implements FlexLexer { diff --git a/confluence/src/main/resources/jet.css b/confluence/src/main/resources/jet.css index 48a99ba0d84..ebdf70be7da 100644 --- a/confluence/src/main/resources/jet.css +++ b/confluence/src/main/resources/jet.css @@ -5,4 +5,35 @@ .jet.keyword { font-weight: bold; color: #369; -} \ No newline at end of file +} + +.jet.softkeyword { + color: #369; +} + +.jet.comment { + color : green; +} + +.jet.number { + color : blue; +} +.jet.string { + color : #000099; + font-weight: bold; +} +.jet.escape { + font-weight: bold; + color : black; +} +.jet.label { + color : blue; +} +.jet.field { + color : blue; + font-weight: bold; +} +.jet.bad { + background-color : #FF9999; + color:black; +} diff --git a/idea/src/org/jetbrains/jet/lexer/JetTokens.java b/idea/src/org/jetbrains/jet/lexer/JetTokens.java index 07b418207bf..d50cc507f1a 100644 --- a/idea/src/org/jetbrains/jet/lexer/JetTokens.java +++ b/idea/src/org/jetbrains/jet/lexer/JetTokens.java @@ -62,7 +62,7 @@ public interface JetTokens { JetKeywordToken CAPITALIZED_THIS_KEYWORD = JetKeywordToken.keyword("This"); - JetToken AS_SAFE = new JetToken("as?"); + JetToken AS_SAFE = JetKeywordToken.keyword("AS_SAFE");//new JetToken("as?"); JetToken IDENTIFIER = new JetToken("IDENTIFIER"); JetToken LABEL_IDENTIFIER = new JetToken("LABEL_IDENTIFIER"); @@ -150,7 +150,7 @@ public interface JetTokens { TRUE_KEYWORD, FALSE_KEYWORD, IS_KEYWORD, IN_KEYWORD, THROW_KEYWORD, RETURN_KEYWORD, BREAK_KEYWORD, CONTINUE_KEYWORD, OBJECT_KEYWORD, IF_KEYWORD, ELSE_KEYWORD, WHILE_KEYWORD, DO_KEYWORD, TRY_KEYWORD, WHEN_KEYWORD, - NOT_IN, NOT_IS, CAPITALIZED_THIS_KEYWORD + NOT_IN, NOT_IS, CAPITALIZED_THIS_KEYWORD, AS_SAFE ); TokenSet SOFT_KEYWORDS = TokenSet.create(WRAPS_KEYWORD, IMPORT_KEYWORD, WHERE_KEYWORD, BY_KEYWORD, GET_KEYWORD, diff --git a/idea/testData/psi/Precedence.txt b/idea/testData/psi/Precedence.txt index 578dcf46a8d..93567f53e3b 100644 --- a/idea/testData/psi/Precedence.txt +++ b/idea/testData/psi/Precedence.txt @@ -807,7 +807,7 @@ JetFile: Precedence.jet PsiElement(IDENTIFIER)('t') PsiWhiteSpace(' ') OPERATION_REFERENCE - PsiElement(as?)('as?') + PsiElement(AS_SAFE)('as?') PsiWhiteSpace(' ') TYPE_REFERENCE NULLABLE_TYPE @@ -829,7 +829,7 @@ JetFile: Precedence.jet PsiElement(IDENTIFIER)('t') PsiWhiteSpace(' ') OPERATION_REFERENCE - PsiElement(as?)('as?') + PsiElement(AS_SAFE)('as?') PsiWhiteSpace(' ') TYPE_REFERENCE USER_TYPE @@ -865,7 +865,7 @@ JetFile: Precedence.jet PsiElement(IDENTIFIER)('t') PsiWhiteSpace(' ') OPERATION_REFERENCE - PsiElement(as?)('as?') + PsiElement(AS_SAFE)('as?') PsiWhiteSpace(' ') TYPE_REFERENCE FUNCTION_TYPE @@ -1029,7 +1029,7 @@ JetFile: Precedence.jet PsiElement(IDENTIFIER)('t') PsiWhiteSpace(' ') OPERATION_REFERENCE - PsiElement(as?)('as?') + PsiElement(AS_SAFE)('as?') PsiWhiteSpace(' ') TYPE_REFERENCE NULLABLE_TYPE @@ -1058,7 +1058,7 @@ JetFile: Precedence.jet PsiElement(IDENTIFIER)('t') PsiWhiteSpace(' ') OPERATION_REFERENCE - PsiElement(as?)('as?') + PsiElement(AS_SAFE)('as?') PsiWhiteSpace(' ') TYPE_REFERENCE USER_TYPE @@ -1101,7 +1101,7 @@ JetFile: Precedence.jet PsiElement(IDENTIFIER)('t') PsiWhiteSpace(' ') OPERATION_REFERENCE - PsiElement(as?)('as?') + PsiElement(AS_SAFE)('as?') PsiWhiteSpace(' ') TYPE_REFERENCE FUNCTION_TYPE