diff --git a/plugins/gettext/src/META-INF/plugin.xml b/plugins/gettext/src/META-INF/plugin.xml index 3f91a8f5968a..79d3d137d04f 100644 --- a/plugins/gettext/src/META-INF/plugin.xml +++ b/plugins/gettext/src/META-INF/plugin.xml @@ -13,20 +13,11 @@ - - - - - - - - - - - - - + + + + \ No newline at end of file diff --git a/plugins/gettext/src/com/jetbrains/gettext/GetText.flex b/plugins/gettext/src/com/jetbrains/gettext/GetText.flex index d20b2d432ec2..da8fea52e09a 100644 --- a/plugins/gettext/src/com/jetbrains/gettext/GetText.flex +++ b/plugins/gettext/src/com/jetbrains/gettext/GetText.flex @@ -26,35 +26,26 @@ import com.jetbrains.gettext.GetTextElementType; %ignorecase EOL = (\r|\n|\r\n) -NO_EOL = !(\r|\n|\r\n) SPACE = [ \t\f] WHITE_SPACE = {EOL} | {SPACE} STRING_TAIL = [^\r\n]* QUOTED_STRING = ("\"")~(\r|\n|\r\n|"\"") -TMP_QUOTED_STRING = ("\"")~("\"") DOUBLEQUOTE = \" -DOUBLEQUOTED_STRING = ([^\"] | \"\" | \\\")+ LBRACE = "[" RBRACE = "]" NUMBER = [0-9]* +LETTERS = [a-zA-Z]* COMMENT_SYMBOL = "#" -COMMENT_TYPE_SYMBOLS = ("#."|"#:"|"#,"|"#|") -COMMENT = (" "|\t|\f)~{EOL} -EXTRACTED_COMMENT = (".")~{EOL} -REFERENCE_COMMENT = (":")~{EOL} -PREVIOUS_COMMENT = ("|")~{EOL} +EXTRACTED_COMMENT = ("."){STRING_TAIL} +REFERENCE_COMMENT = (":"){STRING_TAIL} +PREVIOUS_COMMENT = ("|"){STRING_TAIL} FLAG_GROUP = (",") -DOT = "." -COLON = ":" -LINE = "|" -COMMA = "," - MSGCTXT = "msgctxt" MSGID = "msgid" MSGID_PLURAL = "msgid_plural" @@ -62,43 +53,17 @@ MSGSTR = "msgstr" FUZZY_FLAG = "fuzzy" -NO = "no-" FORMAT = "-format" -C = "c" -OBJC = "objc" -SH = "sh" -PYTHON = "python" -LISP = "lisp" -ELISP = "elisp" -LIBREP = "librep" -SCHEME = "scheme" -SMALLTALK = "smalltalk" -JAVA = "java" -CSHARP = "csharp" -AWK = "awk" -YCP = "ycp" -TCL = "tcl" -PERL = "perl-brace" -PHP = "php" -GCC = "gcc-internal" -GFC = "gfc-internal" -QT = "qt" -KDE = "kde" -BOOST = "boost" -OBJECT_PASCAL = "object-pascal" -QT_PLURAL = "qt-plural" - -PASCAL_FORMAT_FLAG = "object-pascal-format" -NO_PASCAL_FORMAT_FLAG = "no-object-pascal-format" -QT_FORMAT_FLAG = "qt-plural-format" -NO_QT_FORMAT_FLAG = "no-qt-plural-format" -FORMAT_FLAG = (C|OBJC|SH|PYTHON|LISP|EISP|LIBREP|SCHEME|SMALLTALK|JAVA|SCHARP|AWK|OBJECT_PASCAL|YCP|TCL|PERL|PHP|GCC|GFC|QT|QT_PLURAL|KDE|BOOST) {FORMAT} +NO = "no-" +FORMAT_FLAG = ("c"|"objc"|"sh"|"python"|"lisp"|"elisp"|"librep"|"scheme"|"smalltalk"|"java"| +"csharp"|"awk"|"object-pascal"|"ycp"|"tcl"|"perl-brace"|"php"|"gcc-internal"|"gfc-internal"| +"qt"|"qt-plural"|"kde"|"boost") {FORMAT} NO_FORMAT_FLAG = {NO} {FORMAT_FLAG} - RANGE_FLAG = "range" DOTS = ".." FLAG_DELIVERY="," +COLON = ":" %state START_COMMENT %state COMMENT @@ -114,10 +79,10 @@ FLAG_DELIVERY="," {COMMENT_SYMBOL} { yybegin(START_COMMENT); return GetTextTokenTypes.COMMENT_SYMBOLS;} {SPACE} { yybegin(COMMENT); return GetTextTokenTypes.COMMENT_SYMBOLS;} - {DOT} { yybegin(EXTR_COMMENT); return GetTextTokenTypes.COMMENT_SYMBOLS;} - {COLON} { yybegin(REFERENCE_COMMENT); return GetTextTokenTypes.COMMENT_SYMBOLS;} - {LINE} { yybegin(PREVIOUS_COMMENT); return GetTextTokenTypes.COMMENT_SYMBOLS;} - {FLAG_GROUP} { yybegin(FLAG_COMMENT); return GetTextTokenTypes.COMMENT_SYMBOLS;} + {EXTRACTED_COMMENT} { yybegin(EXTR_COMMENT); return GetTextTokenTypes.EXTR_COMMENT;} + {REFERENCE_COMMENT} { yybegin(REFERENCE_COMMENT); return GetTextTokenTypes.REFERENCE;} + {PREVIOUS_COMMENT} { yybegin(PREVIOUS_COMMENT); return GetTextTokenTypes.PREVIOUS_COMMENT;} + {FLAG_GROUP} { yybegin(FLAG_COMMENT); return GetTextTokenTypes.FLAG_COMMENT;} {EOL} { yybegin(YYINITIAL); return GetTextTokenTypes.WHITE_SPACE;} {EOL} { yybegin(YYINITIAL); return GetTextTokenTypes.WHITE_SPACE;} @@ -132,29 +97,31 @@ FLAG_DELIVERY="," {STRING_TAIL} { return GetTextTokenTypes.REFERENCE;} {STRING_TAIL} { return GetTextTokenTypes.PREVIOUS_COMMENT;} - {PASCAL_FORMAT_FLAG} { yybegin(FLAG_DEL); return GetTextTokenTypes.FORMAT_FLAG;} - {NO_PASCAL_FORMAT_FLAG} { yybegin(FLAG_DEL); return GetTextTokenTypes.NO_FORMAT_FLAG;} - {QT_FORMAT_FLAG} { yybegin(FLAG_DEL); return GetTextTokenTypes.FORMAT_FLAG;} - {NO_QT_FORMAT_FLAG} { yybegin(FLAG_DEL); return GetTextTokenTypes.NO_FORMAT_FLAG;} {FORMAT_FLAG} { yybegin(FLAG_DEL); return GetTextTokenTypes.FORMAT_FLAG;} {NO_FORMAT_FLAG} { yybegin(FLAG_DEL); return GetTextTokenTypes.NO_FORMAT_FLAG;} {FUZZY_FLAG} { yybegin(FLAG_DEL); return GetTextTokenTypes.FUZZY_FLAG;} {RANGE_FLAG} { yybegin(FLAG_DEL); return GetTextTokenTypes.RANGE_FLAG;} {FLAG_DELIVERY} { yybegin(FLAG_COMMENT); return GetTextTokenTypes.FLAG_DELIVERY;} + {SPACE} { return GetTextTokenTypes.FLAG_DELIVERY;} + {NUMBER} { return GetTextTokenTypes.RANGE_NUMBER;} + {COLON} { return GetTextTokenTypes.COLON;} + {DOTS} { return GetTextTokenTypes.DOTS;} + [^] { return GetTextTokenTypes.BAD_FLAG_COMMENT; } +{MSGCTXT} { return GetTextTokenTypes.MSGCTXT;} {MSGCTXT} { return GetTextTokenTypes.MSGCTXT;} {MSGID} { return GetTextTokenTypes.MSGID;} {MSGID_PLURAL} { return GetTextTokenTypes.MSGID_PLURAL;} {MSGSTR} { return GetTextTokenTypes.MSGSTR;} + {LETTERS} { return GetTextTokenTypes.COMMAND;} {WHITE_SPACE} { return GetTextTokenTypes.WHITE_SPACE;} - {SPACE} { return GetTextTokenTypes.WHITE_SPACE;} + {NUMBER} { return GetTextTokenTypes.NUMBER;} {LBRACE} { return GetTextTokenTypes.LBRACE;} {RBRACE} { return GetTextTokenTypes.RBRACE;} -{COLON} { return GetTextTokenTypes.COLON;} -{DOTS} { return GetTextTokenTypes.DOTS;} +{DOUBLEQUOTE} { return GetTextTokenTypes.QUOTE;} {QUOTED_STRING} { return GetTextTokenTypes.STRING;} diff --git a/plugins/gettext/src/com/jetbrains/gettext/GetTextFileViewProvider.java b/plugins/gettext/src/com/jetbrains/gettext/GetTextFileViewProvider.java deleted file mode 100644 index 2b806f7e9875..000000000000 --- a/plugins/gettext/src/com/jetbrains/gettext/GetTextFileViewProvider.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.jetbrains.gettext; - -import com.intellij.lang.Language; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiManager; -import com.intellij.psi.SingleRootFileViewProvider; -import org.jetbrains.annotations.NotNull; - -/** - * @author Svetlana.Zemlyanskaya - */ -public class GetTextFileViewProvider extends SingleRootFileViewProvider { - - protected GetTextFileViewProvider(@NotNull PsiManager manager, @NotNull VirtualFile virtualFile, final boolean physical, @NotNull Language language) { - super(manager, virtualFile, physical, language); - } - - public boolean supportsIncrementalReparse(@NotNull final Language rootLanguage) { - return false; - } -} diff --git a/plugins/gettext/src/com/jetbrains/gettext/GetTextFileViewProviderFactory.java b/plugins/gettext/src/com/jetbrains/gettext/GetTextFileViewProviderFactory.java deleted file mode 100644 index 07d5914c3166..000000000000 --- a/plugins/gettext/src/com/jetbrains/gettext/GetTextFileViewProviderFactory.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.jetbrains.gettext; - -import com.intellij.lang.Language; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.FileViewProvider; -import com.intellij.psi.FileViewProviderFactory; -import com.intellij.psi.PsiManager; -import org.jetbrains.annotations.NotNull; - -/** - * @author Svetlana.Zemlyanskaya - */ -public class GetTextFileViewProviderFactory implements FileViewProviderFactory { - - public FileViewProvider createFileViewProvider(@NotNull VirtualFile file, Language language, @NotNull PsiManager manager, boolean physical) { - return new GetTextFileViewProvider(manager, file, physical, language); - } -} diff --git a/plugins/gettext/src/com/jetbrains/gettext/GetTextTokenTypes.java b/plugins/gettext/src/com/jetbrains/gettext/GetTextTokenTypes.java index fb32c5570c45..83f27856073e 100644 --- a/plugins/gettext/src/com/jetbrains/gettext/GetTextTokenTypes.java +++ b/plugins/gettext/src/com/jetbrains/gettext/GetTextTokenTypes.java @@ -24,9 +24,9 @@ public interface GetTextTokenTypes { IElementType FORMAT_FLAG = new GetTextElementType("FORMAT_FLAG"); IElementType NO_FORMAT_FLAG = new GetTextElementType("NO_FORMAT_FLAG"); IElementType FLAG_DELIVERY = new GetTextElementType("DELIVERY"); + IElementType BAD_FLAG_COMMENT = new GetTextElementType("BAD_FLAG_COMMENT"); - IElementType MSG = new GetTextElementType("MSG_START"); - + IElementType COMMAND = new GetTextElementType("COMMAND"); IElementType MSGCTXT = new GetTextElementType("MSGCTXT"); IElementType MSGID = new GetTextElementType("MSGID"); IElementType MSGID_PLURAL = new GetTextElementType("MSGID_PLURAL"); @@ -35,15 +35,20 @@ public interface GetTextTokenTypes { IElementType COLON = new GetTextElementType("COLON"); IElementType DOTS = new GetTextElementType("DOTS"); IElementType NUMBER = new GetTextElementType("NUMBER"); + IElementType RANGE_NUMBER = new GetTextElementType("RANGE_NUMBER"); IElementType LBRACE = new GetTextElementType("LBRACE"); IElementType RBRACE = new GetTextElementType("RBRACE"); + IElementType QUOTE = new GetTextElementType("QUOTE"); IElementType STRING = new GetTextElementType("STRING"); - TokenSet SYSTEM_COMMENTS = TokenSet.create(EXTR_COMMENT, REFERENCE, FLAG_COMMENT, PREVIOUS_COMMENT, FLAG_DELIVERY, COMMENT_SYMBOLS); + TokenSet SYSTEM_COMMENTS = TokenSet.create(EXTR_COMMENT, REFERENCE, FLAG_COMMENT, PREVIOUS_COMMENT, + FLAG_DELIVERY, COMMENT_SYMBOLS, BAD_FLAG_COMMENT); TokenSet COMMENTS = TokenSet.orSet(TokenSet.create(COMMENT), SYSTEM_COMMENTS); - TokenSet STRING_LITERALS = TokenSet.create(STRING); - TokenSet KEYWORDS = TokenSet.create(MSG, MSGCTXT, MSGID, MSGID_PLURAL, MSGSTR); + TokenSet STRING_LITERALS = TokenSet.create(STRING, QUOTE); + TokenSet KEYWORDS = TokenSet.create(MSGCTXT, MSGID, MSGID_PLURAL, MSGSTR, COMMAND); TokenSet FLAGS = TokenSet.create(FUZZY_FLAG, FORMAT_FLAG, NO_FORMAT_FLAG, RANGE_FLAG); + TokenSet FLAG_LINE = TokenSet.orSet(FLAGS, TokenSet.create(FLAG_COMMENT,FLAG_DELIVERY, BAD_FLAG_COMMENT, COLON, DOTS, RANGE_NUMBER)); TokenSet BRACES = TokenSet.create(LBRACE, RBRACE); + TokenSet NUMBERS = TokenSet.create(NUMBER, RANGE_NUMBER); } diff --git a/plugins/gettext/src/com/jetbrains/gettext/_GetTextLexer.java b/plugins/gettext/src/com/jetbrains/gettext/_GetTextLexer.java index 9b20ffd1d9cf..9919e79601f0 100644 --- a/plugins/gettext/src/com/jetbrains/gettext/_GetTextLexer.java +++ b/plugins/gettext/src/com/jetbrains/gettext/_GetTextLexer.java @@ -1,4 +1,4 @@ -/* The following code was generated by JFlex 1.4.3 on 7/10/12 5:05 PM */ +/* The following code was generated by JFlex 1.4.3 on 7/11/12 4:30 PM */ package com.jetbrains.gettext; @@ -9,7 +9,7 @@ import com.intellij.psi.tree.IElementType; /** * This class is a scanner generated by * JFlex 1.4.3 - * on 7/10/12 5:05 PM from the specification file + * on 7/11/12 4:30 PM from the specification file * /home/svetlana/git/idea/IDEA/tools/lexer/../../community/plugins/gettext/src/com/jetbrains/gettext/GetText.flex */ class _GetTextLexer implements FlexLexer { @@ -41,13 +41,13 @@ class _GetTextLexer implements FlexLexer { */ private static final String ZZ_CMAP_PACKED = "\11\0\1\3\1\2\1\0\1\3\1\1\22\0\1\3\1\0\1\4"+ - "\1\10\10\0\1\13\1\40\1\11\1\0\12\7\1\12\6\0\1\32"+ - "\1\41\1\20\1\24\1\44\1\33\1\17\1\43\1\23\1\42\1\45"+ - "\1\27\1\15\1\36\1\37\1\26\1\50\1\31\1\16\1\21\1\30"+ - "\1\46\1\47\1\22\1\35\1\34\1\5\1\0\1\6\1\0\1\25"+ - "\1\0\1\32\1\41\1\20\1\24\1\44\1\33\1\17\1\43\1\23"+ - "\1\42\1\45\1\27\1\15\1\36\1\37\1\26\1\50\1\31\1\16"+ - "\1\21\1\30\1\46\1\47\1\22\1\35\1\34\1\0\1\14\uff83\0"; + "\1\11\10\0\1\15\1\37\1\12\1\0\12\7\1\13\6\0\1\33"+ + "\1\42\1\21\1\25\1\45\1\34\1\20\1\44\1\24\1\43\1\46"+ + "\1\30\1\16\1\41\1\40\1\27\1\10\1\32\1\17\1\22\1\31"+ + "\1\47\1\50\1\23\1\36\1\35\1\5\1\0\1\6\1\0\1\26"+ + "\1\0\1\33\1\42\1\21\1\25\1\45\1\34\1\20\1\44\1\24"+ + "\1\43\1\46\1\30\1\16\1\41\1\40\1\27\1\10\1\32\1\17"+ + "\1\22\1\31\1\47\1\50\1\23\1\36\1\35\1\0\1\14\uff83\0"; /** * Translates characters to character classes @@ -60,15 +60,18 @@ class _GetTextLexer implements FlexLexer { private static final int [] ZZ_ACTION = zzUnpackAction(); private static final String ZZ_ACTION_PACKED_0 = - "\2\1\1\2\1\3\1\4\1\5\2\1\1\6\2\7"+ - "\1\6\1\10\1\11\1\1\1\12\1\6\1\13\1\6"+ - "\2\14\1\15\1\16\1\17\1\20\1\21\2\2\2\3"+ - "\2\4\2\5\21\6\1\22\1\0\2\23\1\24\101\0"+ - "\1\25\3\0\1\26\1\27\22\0\1\30\20\0\1\31"+ - "\17\0\1\32\23\0\1\33\1\0\1\34\2\0"; + "\1\1\1\2\1\3\1\4\1\5\1\6\2\7\1\10"+ + "\2\11\1\12\1\13\1\14\1\2\1\1\1\15\1\1"+ + "\2\16\1\17\1\20\1\21\1\22\1\23\1\10\2\3"+ + "\2\4\2\5\2\6\1\24\1\25\1\24\1\7\2\24"+ + "\1\26\21\24\1\27\1\0\2\30\1\1\2\0\1\31"+ + "\24\0\1\1\21\0\3\1\36\0\2\1\1\32\2\0"+ + "\1\32\6\0\1\33\1\34\23\0\1\35\1\1\1\0"+ + "\1\35\24\0\1\36\1\0\1\36\23\0\1\37\34\0"+ + "\1\40\2\0\1\41\3\0"; private static int [] zzUnpackAction() { - int [] result = new int[203]; + int [] result = new int[252]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -94,34 +97,40 @@ class _GetTextLexer implements FlexLexer { private static final String ZZ_ROWMAP_PACKED_0 = "\0\0\0\51\0\122\0\173\0\244\0\315\0\366\0\u011f"+ - "\0\u0148\0\u0171\0\u0148\0\u019a\0\u0148\0\u0148\0\u01c3\0\u0148"+ - "\0\u01ec\0\u0148\0\u0215\0\u023e\0\u0148\0\u0148\0\u01ec\0\u0148"+ - "\0\u0148\0\u0148\0\u0267\0\u0290\0\u02b9\0\u02e2\0\u030b\0\u0334"+ - "\0\u035d\0\u0386\0\u03af\0\u03d8\0\u0401\0\u042a\0\u0453\0\u047c"+ - "\0\u04a5\0\u04ce\0\u04f7\0\u0520\0\u0549\0\u0572\0\u059b\0\u05c4"+ - "\0\u05ed\0\u0616\0\u063f\0\u0148\0\u019a\0\u0668\0\u0148\0\u0148"+ - "\0\u0691\0\u06ba\0\u06e3\0\u0401\0\u070c\0\u0735\0\u075e\0\u0787"+ - "\0\u07b0\0\u07d9\0\u0802\0\u082b\0\u0854\0\u087d\0\u08a6\0\u08cf"+ + "\0\u0148\0\u0171\0\u0148\0\u019a\0\u0148\0\u0148\0\u01c3\0\u01ec"+ + "\0\u0148\0\u0215\0\u023e\0\u0148\0\u0148\0\u0267\0\u0290\0\u02b9"+ + "\0\u0148\0\u02e2\0\u030b\0\u0334\0\u035d\0\u0386\0\u03af\0\u03d8"+ + "\0\u0401\0\u042a\0\u0148\0\u0148\0\u019a\0\u0453\0\u047c\0\u04a5"+ + "\0\u0148\0\u02e2\0\u04ce\0\u04f7\0\u0520\0\u0549\0\u0572\0\u059b"+ + "\0\u05c4\0\u05ed\0\u0616\0\u063f\0\u0668\0\u0691\0\u06ba\0\u06e3"+ + "\0\u070c\0\u0735\0\u0148\0\u019a\0\u075e\0\u0148\0\u0787\0\u07b0"+ + "\0\u07d9\0\u0148\0\u0802\0\u082b\0\u0854\0\u087d\0\u08a6\0\u08cf"+ "\0\u08f8\0\u0921\0\u094a\0\u0973\0\u099c\0\u09c5\0\u09ee\0\u0a17"+ "\0\u0a40\0\u0a69\0\u0a92\0\u0abb\0\u0ae4\0\u0b0d\0\u0b36\0\u0b5f"+ "\0\u0b88\0\u0bb1\0\u0bda\0\u0c03\0\u0c2c\0\u0c55\0\u0c7e\0\u0ca7"+ "\0\u0cd0\0\u0cf9\0\u0d22\0\u0d4b\0\u0d74\0\u0d9d\0\u0dc6\0\u0def"+ "\0\u0e18\0\u0e41\0\u0e6a\0\u0e93\0\u0ebc\0\u0ee5\0\u0f0e\0\u0f37"+ "\0\u0f60\0\u0f89\0\u0fb2\0\u0fdb\0\u1004\0\u102d\0\u1056\0\u107f"+ - "\0\u10a8\0\u10d1\0\u10fa\0\u1123\0\u114c\0\u0148\0\u0148\0\u1175"+ - "\0\u119e\0\u11c7\0\u11f0\0\u1219\0\u1242\0\u126b\0\u1294\0\u12bd"+ - "\0\u12e6\0\u130f\0\u1338\0\u1361\0\u138a\0\u13b3\0\u13dc\0\u1405"+ - "\0\u142e\0\u0148\0\u1457\0\u1480\0\u14a9\0\u14d2\0\u14fb\0\u1524"+ - "\0\u154d\0\u1576\0\u159f\0\u15c8\0\u15f1\0\u161a\0\u1643\0\u166c"+ - "\0\u1695\0\u16be\0\u0148\0\u16e7\0\u1710\0\u1739\0\u1762\0\u178b"+ - "\0\u17b4\0\u17dd\0\u1806\0\u182f\0\u1858\0\u1881\0\u18aa\0\u18d3"+ - "\0\u18fc\0\u1925\0\u0148\0\u194e\0\u1977\0\u19a0\0\u19c9\0\u19f2"+ - "\0\u1a1b\0\u1a44\0\u1a6d\0\u1a96\0\u1abf\0\u1ae8\0\u1b11\0\u1b3a"+ - "\0\u1b63\0\u1b8c\0\u1bb5\0\u1bde\0\u1c07\0\u1c30\0\u0148\0\u1c59"+ - "\0\u0148\0\u1c82\0\u1cab"; + "\0\u10a8\0\u10d1\0\u10fa\0\u1123\0\u114c\0\u1175\0\u119e\0\u11c7"+ + "\0\u11f0\0\u1219\0\u1242\0\u126b\0\u1294\0\u12bd\0\u12e6\0\u130f"+ + "\0\u1338\0\u1361\0\u138a\0\u13b3\0\u13dc\0\u1405\0\u142e\0\u1457"+ + "\0\u1480\0\u14a9\0\u14d2\0\u14fb\0\u1524\0\u0148\0\u0148\0\u154d"+ + "\0\u1576\0\u159f\0\u15c8\0\u15f1\0\u161a\0\u1643\0\u166c\0\u1695"+ + "\0\u16be\0\u16e7\0\u1710\0\u1739\0\u1762\0\u178b\0\u17b4\0\u17dd"+ + "\0\u1806\0\u182f\0\u01ec\0\u1858\0\u1881\0\u0148\0\u18aa\0\u18d3"+ + "\0\u18fc\0\u1925\0\u194e\0\u1977\0\u19a0\0\u19c9\0\u19f2\0\u1a1b"+ + "\0\u1a44\0\u1a6d\0\u1a96\0\u1abf\0\u1ae8\0\u1b11\0\u1b3a\0\u1b63"+ + "\0\u1b8c\0\u1bb5\0\u01ec\0\u1bde\0\u0148\0\u1c07\0\u1c30\0\u1c59"+ + "\0\u1c82\0\u1cab\0\u1cd4\0\u1cfd\0\u1d26\0\u1d4f\0\u1d78\0\u1da1"+ + "\0\u1dca\0\u1df3\0\u1e1c\0\u1e45\0\u1e6e\0\u1e97\0\u1ec0\0\u1ee9"+ + "\0\u0148\0\u1f12\0\u1f3b\0\u1f64\0\u1f8d\0\u1fb6\0\u1fdf\0\u2008"+ + "\0\u2031\0\u205a\0\u2083\0\u20ac\0\u20d5\0\u20fe\0\u2127\0\u2150"+ + "\0\u2179\0\u21a2\0\u21cb\0\u21f4\0\u221d\0\u2246\0\u226f\0\u2298"+ + "\0\u22c1\0\u22ea\0\u2313\0\u233c\0\u2365\0\u0148\0\u238e\0\u23b7"+ + "\0\u0148\0\u23e0\0\u2409\0\u2432"; private static int [] zzUnpackRowMap() { - int [] result = new int[203]; + int [] result = new int[252]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -145,76 +154,98 @@ class _GetTextLexer implements FlexLexer { private static final String ZZ_TRANS_PACKED_0 = "\1\11\1\12\2\13\1\14\1\15\1\16\1\17\1\20"+ - "\1\21\1\22\2\11\1\23\34\11\1\24\1\25\1\26"+ - "\1\14\1\15\1\16\1\17\1\11\1\27\1\30\1\31"+ - "\1\32\1\23\33\11\1\33\1\24\1\25\1\33\1\34"+ - "\44\33\1\35\1\24\1\25\1\35\1\36\44\35\1\37"+ - "\1\24\1\25\1\37\1\40\44\37\1\41\1\24\1\25"+ - "\1\41\1\42\44\41\1\11\1\24\1\25\1\13\1\14"+ - "\1\15\1\16\1\17\1\11\1\21\1\22\2\11\1\23"+ - "\1\43\1\44\1\45\1\46\4\11\1\47\1\50\1\11"+ - "\1\51\1\52\1\53\1\11\1\54\1\55\1\56\1\11"+ - "\1\57\1\60\1\11\1\61\1\62\2\11\1\63\1\11"+ - "\1\24\1\25\1\13\1\14\1\15\1\16\1\17\1\11"+ - "\1\21\1\22\1\64\1\11\1\23\33\11\53\0\1\13"+ - "\46\0\1\65\1\66\1\67\1\65\1\67\44\65\7\0"+ - "\1\17\52\0\1\70\55\0\1\71\34\0\1\25\46\0"+ - "\1\33\2\0\46\33\1\34\1\66\1\67\1\34\1\33"+ - "\44\34\1\35\2\0\46\35\1\36\1\66\1\67\1\36"+ - "\1\35\44\36\1\37\2\0\46\37\1\40\1\66\1\67"+ - "\1\40\1\37\44\40\1\41\2\0\46\41\1\42\1\66"+ - "\1\67\1\42\1\41\44\42\15\0\1\72\2\0\1\73"+ - "\22\0\1\74\25\0\1\75\12\0\1\75\55\0\1\76"+ - "\30\0\1\77\65\0\1\100\5\0\1\101\1\102\27\0"+ - "\1\103\57\0\1\104\65\0\1\105\31\0\1\106\40\0"+ - "\1\101\67\0\1\107\52\0\1\110\46\0\1\111\43\0"+ - "\1\112\41\0\1\113\51\0\1\114\45\0\1\115\31\0"+ - "\1\67\65\0\1\116\63\0\1\117\61\0\1\120\25\0"+ - "\1\74\63\0\1\121\44\0\1\74\42\0\1\122\55\0"+ - "\1\74\53\0\1\77\35\0\1\101\22\0\1\123\45\0"+ - "\1\124\57\0\1\74\37\0\1\125\54\0\1\126\52\0"+ - "\1\127\45\0\1\130\57\0\1\131\20\0\1\101\76\0"+ - "\1\74\31\0\1\132\12\0\1\133\26\0\1\134\1\0"+ - "\1\135\2\0\1\136\54\0\1\137\53\0\1\140\11\0"+ - "\1\141\43\0\1\142\54\0\1\143\36\0\1\144\36\0"+ - "\1\145\65\0\1\146\32\0\1\147\1\150\1\151\1\152"+ - "\4\0\1\153\1\154\2\0\1\155\2\0\1\156\1\0"+ - "\1\157\1\0\1\160\1\161\1\0\1\162\1\163\2\0"+ - "\1\164\20\0\1\74\23\0\1\165\22\0\1\166\64\0"+ - "\1\74\44\0\1\167\50\0\1\167\4\0\1\121\36\0"+ - "\1\170\50\0\1\171\53\0\1\172\53\0\1\173\52\0"+ - "\1\101\34\0\1\114\64\0\1\174\56\0\1\175\55\0"+ - "\1\101\50\0\1\176\41\0\1\177\30\0\1\200\2\0"+ - "\1\201\22\0\1\151\25\0\1\202\12\0\1\202\55\0"+ - "\1\203\30\0\1\204\65\0\1\205\5\0\1\206\1\207"+ - "\27\0\1\210\74\0\1\211\21\0\1\206\71\0\1\212"+ - "\46\0\1\213\43\0\1\214\41\0\1\215\51\0\1\216"+ - "\45\0\1\217\47\0\1\220\51\0\1\74\56\0\1\221"+ - "\52\0\1\222\41\0\1\223\53\0\1\224\44\0\1\225"+ - "\44\0\1\226\71\0\1\74\44\0\1\227\61\0\1\230"+ - "\25\0\1\151\63\0\1\231\44\0\1\151\42\0\1\232"+ - "\55\0\1\151\53\0\1\204\35\0\1\206\22\0\1\233"+ - "\54\0\1\151\45\0\1\234\45\0\1\235\57\0\1\236"+ - "\20\0\1\206\76\0\1\151\31\0\1\237\12\0\1\240"+ - "\31\0\1\241\57\0\1\242\41\0\1\243\55\0\1\244"+ - "\54\0\1\245\50\0\1\246\45\0\1\247\53\0\1\250"+ - "\11\0\1\251\43\0\1\252\54\0\1\253\36\0\1\254"+ - "\37\0\1\151\23\0\1\255\22\0\1\256\64\0\1\151"+ - "\44\0\1\257\50\0\1\257\4\0\1\231\42\0\1\260"+ - "\12\0\1\260\41\0\1\261\46\0\1\262\50\0\1\105"+ - "\42\0\1\263\56\0\1\264\52\0\1\206\34\0\1\216"+ - "\64\0\1\265\56\0\1\266\55\0\1\206\24\0\1\267"+ - "\51\0\1\151\56\0\1\270\47\0\1\271\54\0\1\77"+ - "\46\0\1\272\41\0\1\273\44\0\1\274\71\0\1\151"+ - "\33\0\1\275\57\0\1\276\52\0\1\277\47\0\1\300"+ - "\51\0\1\301\50\0\1\302\43\0\1\303\12\0\1\303"+ - "\41\0\1\304\35\0\1\305\64\0\1\306\45\0\1\211"+ - "\42\0\1\307\55\0\1\310\54\0\1\204\36\0\1\261"+ - "\57\0\1\311\53\0\1\312\34\0\1\313\52\0\1\304"+ - "\30\0"; + "\1\21\4\11\1\22\7\20\1\11\10\20\1\11\11\20"+ + "\1\11\1\23\1\24\1\25\1\14\1\15\1\16\1\17"+ + "\2\11\1\26\1\27\1\30\1\31\1\32\32\11\1\33"+ + "\1\23\1\24\1\33\1\34\44\33\1\35\1\23\1\24"+ + "\1\35\1\36\44\35\1\37\1\23\1\24\1\37\1\40"+ + "\44\37\1\41\1\23\1\24\1\41\1\42\44\41\1\43"+ + "\1\23\1\24\1\44\1\45\2\43\1\46\1\47\1\43"+ + "\1\50\1\51\2\43\1\52\1\53\1\54\1\55\1\56"+ + "\4\43\1\57\1\60\1\43\1\61\1\62\1\63\1\43"+ + "\1\64\1\43\1\65\1\66\1\67\1\70\1\43\1\71"+ + "\1\72\3\43\1\23\1\24\1\44\1\45\2\43\1\46"+ + "\2\43\1\50\1\51\1\43\1\73\1\52\32\43\53\0"+ + "\1\13\46\0\1\74\1\75\1\76\1\74\1\76\44\74"+ + "\7\0\1\17\51\0\1\20\5\0\10\20\1\0\10\20"+ + "\1\0\11\20\10\0\1\20\5\0\1\20\1\77\6\20"+ + "\1\0\10\20\1\0\11\20\2\0\1\24\46\0\1\26"+ + "\2\0\46\26\1\27\2\0\46\27\1\30\2\0\46\30"+ + "\17\0\1\100\31\0\1\33\2\0\46\33\1\34\1\75"+ + "\1\76\1\34\1\33\44\34\1\35\2\0\46\35\1\36"+ + "\1\75\1\76\1\36\1\35\44\36\1\37\2\0\46\37"+ + "\1\40\1\75\1\76\1\40\1\37\44\40\1\41\2\0"+ + "\46\41\1\42\1\75\1\76\1\42\1\41\44\42\7\0"+ + "\1\46\63\0\1\101\40\0\1\102\54\0\1\103\2\0"+ + "\1\104\22\0\1\105\25\0\1\106\12\0\1\106\33\0"+ + "\1\107\17\0\1\110\32\0\1\111\65\0\1\112\5\0"+ + "\1\113\1\114\27\0\1\115\57\0\1\116\65\0\1\117"+ + "\31\0\1\120\40\0\1\113\71\0\1\121\46\0\1\122"+ + "\50\0\1\123\43\0\1\124\45\0\1\125\45\0\1\126"+ + "\25\0\1\76\56\0\1\20\5\0\2\20\1\127\5\20"+ + "\1\0\10\20\1\0\11\20\20\0\1\130\67\0\1\131"+ + "\44\0\1\132\61\0\1\133\43\0\1\110\32\0\1\134"+ + "\73\0\1\135\40\0\1\136\44\0\1\105\42\0\1\137"+ + "\55\0\1\105\53\0\1\140\35\0\1\113\22\0\1\141"+ + "\47\0\1\142\55\0\1\105\37\0\1\143\56\0\1\144"+ + "\44\0\1\145\51\0\1\146\57\0\1\147\25\0\1\150"+ + "\71\0\1\105\13\0\1\20\5\0\1\20\1\151\1\20"+ + "\1\152\2\20\1\153\1\20\1\0\10\20\1\0\11\20"+ + "\17\0\1\154\1\0\1\155\2\0\1\156\53\0\1\157"+ + "\4\0\1\136\44\0\1\160\65\0\1\161\42\0\1\162"+ + "\44\0\1\163\55\0\1\164\54\0\1\165\34\0\1\166"+ + "\52\0\1\167\36\0\1\170\65\0\1\171\34\0\1\105"+ + "\23\0\1\172\13\0\1\173\6\0\1\174\1\175\1\176"+ + "\1\177\4\0\1\200\1\201\2\0\1\202\2\0\1\203"+ + "\1\0\1\204\1\0\1\205\1\206\1\0\1\207\1\210"+ + "\21\0\1\211\64\0\1\105\34\0\1\113\41\0\1\20"+ + "\5\0\4\20\1\212\3\20\1\0\10\20\1\0\11\20"+ + "\10\0\1\20\5\0\4\20\1\213\3\20\1\0\10\20"+ + "\1\0\11\20\10\0\1\20\5\0\7\20\1\214\1\0"+ + "\10\20\1\0\11\20\22\0\1\215\50\0\1\216\53\0"+ + "\1\217\53\0\1\220\50\0\1\221\36\0\1\126\56\0"+ + "\1\222\56\0\1\113\50\0\1\223\56\0\1\224\47\0"+ + "\1\225\56\0\1\113\50\0\1\226\41\0\1\227\33\0"+ + "\1\230\51\0\1\231\44\0\1\232\2\0\1\233\22\0"+ + "\1\234\25\0\1\235\12\0\1\235\33\0\1\236\17\0"+ + "\1\237\32\0\1\240\65\0\1\241\5\0\1\242\1\243"+ + "\27\0\1\244\74\0\1\245\21\0\1\242\71\0\1\246"+ + "\46\0\1\247\43\0\1\250\45\0\1\251\45\0\1\252"+ + "\45\0\1\105\36\0\1\20\5\0\10\20\1\0\3\20"+ + "\1\253\4\20\1\0\11\20\10\0\1\20\5\0\5\20"+ + "\1\254\2\20\1\0\10\20\1\0\11\20\10\0\1\20"+ + "\5\0\10\20\1\255\10\20\1\0\11\20\32\0\1\256"+ + "\41\0\1\257\53\0\1\255\53\0\1\260\41\0\1\261"+ + "\67\0\1\262\25\0\1\263\73\0\1\105\51\0\1\264"+ + "\30\0\1\265\65\0\1\266\44\0\1\267\61\0\1\270"+ + "\43\0\1\237\32\0\1\271\73\0\1\272\40\0\1\273"+ + "\44\0\1\234\42\0\1\274\55\0\1\234\53\0\1\275"+ + "\35\0\1\242\22\0\1\276\54\0\1\234\45\0\1\277"+ + "\45\0\1\300\57\0\1\301\25\0\1\302\71\0\1\234"+ + "\13\0\1\20\5\0\4\20\1\303\3\20\1\0\10\20"+ + "\1\0\11\20\27\0\1\304\43\0\1\305\60\0\1\306"+ + "\51\0\1\307\37\0\1\310\61\0\1\311\47\0\1\312"+ + "\55\0\1\313\40\0\1\314\4\0\1\273\44\0\1\315"+ + "\65\0\1\316\42\0\1\317\44\0\1\320\55\0\1\321"+ + "\54\0\1\322\34\0\1\323\52\0\1\324\37\0\1\234"+ + "\23\0\1\325\22\0\1\326\64\0\1\234\34\0\1\242"+ + "\61\0\1\327\53\0\1\111\45\0\1\117\65\0\1\330"+ + "\25\0\1\331\61\0\1\332\44\0\1\333\51\0\1\334"+ + "\50\0\1\335\36\0\1\252\56\0\1\336\56\0\1\242"+ + "\50\0\1\337\56\0\1\340\47\0\1\341\56\0\1\242"+ + "\24\0\1\342\51\0\1\234\57\0\1\343\51\0\1\344"+ + "\37\0\1\126\62\0\1\345\46\0\1\346\41\0\1\347"+ + "\67\0\1\350\25\0\1\351\73\0\1\234\51\0\1\352"+ + "\30\0\1\353\60\0\1\354\57\0\1\306\26\0\1\355"+ + "\63\0\1\356\51\0\1\357\37\0\1\360\61\0\1\361"+ + "\47\0\1\362\55\0\1\363\44\0\1\364\36\0\1\306"+ + "\62\0\1\240\45\0\1\245\65\0\1\365\25\0\1\366"+ + "\61\0\1\367\44\0\1\370\51\0\1\371\52\0\1\372"+ + "\37\0\1\252\62\0\1\373\56\0\1\356\26\0\1\374"+ + "\52\0\1\356\27\0"; private static int [] zzUnpackTrans() { - int [] result = new int[7380]; + int [] result = new int[9307]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -255,14 +286,16 @@ class _GetTextLexer implements FlexLexer { private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); private static final String ZZ_ATTRIBUTE_PACKED_0 = - "\10\1\1\11\1\1\1\11\1\1\2\11\1\1\1\11"+ - "\1\1\1\11\2\1\2\11\1\1\3\11\31\1\1\11"+ - "\1\0\1\1\2\11\101\0\1\1\3\0\2\11\22\0"+ - "\1\11\20\0\1\11\17\0\1\11\23\0\1\11\1\0"+ - "\1\11\2\0"; + "\10\1\1\11\1\1\1\11\1\1\2\11\2\1\1\11"+ + "\2\1\2\11\3\1\1\11\11\1\2\11\4\1\1\11"+ + "\21\1\1\11\1\0\1\1\1\11\1\1\2\0\1\11"+ + "\24\0\1\1\21\0\3\1\36\0\3\1\2\0\1\1"+ + "\6\0\2\11\23\0\2\1\1\0\1\11\24\0\1\1"+ + "\1\0\1\11\23\0\1\11\34\0\1\11\2\0\1\11"+ + "\3\0"; private static int [] zzUnpackAttribute() { - int [] result = new int[203]; + int [] result = new int[252]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -574,118 +607,138 @@ class _GetTextLexer implements FlexLexer { zzMarkedPos = zzMarkedPosL; switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { - case 2: + case 3: { return GetTextTokenTypes.COMMENT; } - case 29: break; - case 27: + case 34: break; + case 32: { yybegin(FLAG_DEL); return GetTextTokenTypes.NO_FORMAT_FLAG; } - case 30: break; - case 25: + case 35: break; + case 30: { return GetTextTokenTypes.MSGCTXT; } - case 31: break; - case 14: - { yybegin(EXTR_COMMENT); return GetTextTokenTypes.COMMENT_SYMBOLS; - } - case 32: break; - case 7: - { return GetTextTokenTypes.WHITE_SPACE; - } - case 33: break; - case 8: - { return GetTextTokenTypes.LBRACE; - } - case 34: break; - case 10: - { yybegin(START_COMMENT); return GetTextTokenTypes.COMMENT_SYMBOLS; - } - case 35: break; - case 26: - { yybegin(FLAG_DEL); return GetTextTokenTypes.FORMAT_FLAG; - } case 36: break; - case 6: - { return GetTextTokenTypes.BAD_CHARACTER; + case 10: + { return GetTextTokenTypes.QUOTE; } case 37: break; case 9: - { return GetTextTokenTypes.RBRACE; + { return GetTextTokenTypes.WHITE_SPACE; } case 38: break; - case 12: - { yybegin(YYINITIAL); return GetTextTokenTypes.WHITE_SPACE; + case 11: + { return GetTextTokenTypes.LBRACE; } case 39: break; - case 16: - { yybegin(FLAG_COMMENT); return GetTextTokenTypes.COMMENT_SYMBOLS; + case 18: + { yybegin(PREVIOUS_COMMENT); return GetTextTokenTypes.PREVIOUS_COMMENT; } case 40: break; - case 17: - { yybegin(PREVIOUS_COMMENT); return GetTextTokenTypes.COMMENT_SYMBOLS; + case 13: + { yybegin(START_COMMENT); return GetTextTokenTypes.COMMENT_SYMBOLS; } case 41: break; - case 20: - { return GetTextTokenTypes.DOTS; + case 31: + { yybegin(FLAG_DEL); return GetTextTokenTypes.FORMAT_FLAG; } case 42: break; - case 4: - { return GetTextTokenTypes.REFERENCE; + case 8: + { return GetTextTokenTypes.BAD_CHARACTER; } case 43: break; - case 24: - { return GetTextTokenTypes.MSGSTR; + case 21: + { return GetTextTokenTypes.FLAG_DELIVERY; } case 44: break; - case 19: - { return GetTextTokenTypes.STRING; + case 12: + { return GetTextTokenTypes.RBRACE; } case 45: break; - case 15: - { yybegin(REFERENCE_COMMENT); return GetTextTokenTypes.COMMENT_SYMBOLS; + case 14: + { yybegin(YYINITIAL); return GetTextTokenTypes.WHITE_SPACE; } case 46: break; - case 22: - { yybegin(FLAG_DEL); return GetTextTokenTypes.RANGE_FLAG; + case 25: + { return GetTextTokenTypes.DOTS; } case 47: break; - case 11: - { return GetTextTokenTypes.COLON; + case 5: + { return GetTextTokenTypes.REFERENCE; } case 48: break; - case 1: - { return GetTextTokenTypes.NUMBER; + case 29: + { return GetTextTokenTypes.MSGSTR; } case 49: break; - case 18: - { yybegin(FLAG_COMMENT); return GetTextTokenTypes.FLAG_DELIVERY; + case 24: + { return GetTextTokenTypes.STRING; } case 50: break; - case 3: - { return GetTextTokenTypes.EXTR_COMMENT; + case 7: + { return GetTextTokenTypes.RANGE_NUMBER; } case 51: break; - case 21: - { return GetTextTokenTypes.MSGID; + case 27: + { yybegin(FLAG_DEL); return GetTextTokenTypes.RANGE_FLAG; } case 52: break; - case 5: - { return GetTextTokenTypes.PREVIOUS_COMMENT; + case 22: + { return GetTextTokenTypes.COLON; } case 53: break; - case 28: - { return GetTextTokenTypes.MSGID_PLURAL; + case 2: + { return GetTextTokenTypes.NUMBER; } case 54: break; - case 23: - { yybegin(FLAG_DEL); return GetTextTokenTypes.FUZZY_FLAG; + case 20: + { return GetTextTokenTypes.BAD_FLAG_COMMENT; } case 55: break; - case 13: - { yybegin(COMMENT); return GetTextTokenTypes.COMMENT_SYMBOLS; + case 23: + { yybegin(FLAG_COMMENT); return GetTextTokenTypes.FLAG_DELIVERY; } case 56: break; + case 4: + { return GetTextTokenTypes.EXTR_COMMENT; + } + case 57: break; + case 26: + { return GetTextTokenTypes.MSGID; + } + case 58: break; + case 17: + { yybegin(REFERENCE_COMMENT); return GetTextTokenTypes.REFERENCE; + } + case 59: break; + case 6: + { return GetTextTokenTypes.PREVIOUS_COMMENT; + } + case 60: break; + case 19: + { yybegin(FLAG_COMMENT); return GetTextTokenTypes.FLAG_COMMENT; + } + case 61: break; + case 33: + { return GetTextTokenTypes.MSGID_PLURAL; + } + case 62: break; + case 28: + { yybegin(FLAG_DEL); return GetTextTokenTypes.FUZZY_FLAG; + } + case 63: break; + case 15: + { yybegin(COMMENT); return GetTextTokenTypes.COMMENT_SYMBOLS; + } + case 64: break; + case 1: + { return GetTextTokenTypes.COMMAND; + } + case 65: break; + case 16: + { yybegin(EXTR_COMMENT); return GetTextTokenTypes.EXTR_COMMENT; + } + case 66: break; default: if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { zzAtEOF = true; diff --git a/plugins/gettext/src/com/jetbrains/gettext/completion/GetTextBraceMatcher.java b/plugins/gettext/src/com/jetbrains/gettext/completion/GetTextBraceMatcher.java new file mode 100644 index 000000000000..825b89ed451c --- /dev/null +++ b/plugins/gettext/src/com/jetbrains/gettext/completion/GetTextBraceMatcher.java @@ -0,0 +1,45 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jetbrains.gettext.completion; + +import com.intellij.lang.BracePair; +import com.intellij.lang.PairedBraceMatcher; +import com.intellij.psi.PsiFile; +import com.intellij.psi.tree.IElementType; +import com.jetbrains.gettext.GetTextTokenTypes; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author Svetlana.Zemlyanskaya + */ +public class GetTextBraceMatcher implements PairedBraceMatcher { + private static final BracePair[] PAIRS = new BracePair[]{ + new BracePair(GetTextTokenTypes.LBRACE, GetTextTokenTypes.RBRACE, false) + }; + + public BracePair[] getPairs() { + return PAIRS; + } + + public boolean isPairedBracesAllowedBeforeType(@NotNull final IElementType lbraceType, @Nullable final IElementType tokenType) { + return true; + } + + public int getCodeConstructStart(final PsiFile file, int openingBraceOffset) { + return openingBraceOffset; + } +} diff --git a/plugins/gettext/src/com/jetbrains/gettext/completion/GetTextCommenter.java b/plugins/gettext/src/com/jetbrains/gettext/completion/GetTextCommenter.java new file mode 100644 index 000000000000..d868db1802fd --- /dev/null +++ b/plugins/gettext/src/com/jetbrains/gettext/completion/GetTextCommenter.java @@ -0,0 +1,44 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jetbrains.gettext.completion; + +import com.intellij.lang.Commenter; + +/** + * @author Svetlana.Zemlyanskaya + */ +public class GetTextCommenter implements Commenter { + public String getLineCommentPrefix() { + return "# "; + } + + public String getBlockCommentPrefix() { + return null; + } + + public String getBlockCommentSuffix() { + return null; + } + + public String getCommentedBlockCommentPrefix() { + return null; + } + + public String getCommentedBlockCommentSuffix() { + return null; + } +} + diff --git a/plugins/gettext/src/com/jetbrains/gettext/completion/GetTextCompletitionContributor.java b/plugins/gettext/src/com/jetbrains/gettext/completion/GetTextCompletionContributor.java similarity index 56% rename from plugins/gettext/src/com/jetbrains/gettext/completion/GetTextCompletitionContributor.java rename to plugins/gettext/src/com/jetbrains/gettext/completion/GetTextCompletionContributor.java index de526dcbcb9b..209585726943 100644 --- a/plugins/gettext/src/com/jetbrains/gettext/completion/GetTextCompletitionContributor.java +++ b/plugins/gettext/src/com/jetbrains/gettext/completion/GetTextCompletionContributor.java @@ -3,9 +3,11 @@ package com.jetbrains.gettext.completion; import com.intellij.codeInsight.completion.*; import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiWhiteSpace; import com.intellij.util.ProcessingContext; import com.jetbrains.gettext.GetTextLanguage; import com.jetbrains.gettext.GetTextTokenTypes; +import com.jetbrains.gettext.lang.GetTextFlags; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -16,52 +18,28 @@ import static com.intellij.patterns.PlatformPatterns.psiElement; /** * @author Svetlana.Zemlyanskaya */ -public class GetTextCompletitionContributor extends CompletionContributor { +public class GetTextCompletionContributor extends CompletionContributor { private final static String[] KEYWORDS = { "msgid", "msgstr", "msgctxt", - "msgid_plural", - "fuzzy", - "c-format" + "msgid_plural" }; - //private final static String[] BUILT_IN_FILTERS = { - // "date", - // "format", - // "replace", - // "url_encode", - // "json_encode", - // "title", - // "capitalize", - // "upper", - // "lower", - // "striptags", - // "join", - // "reverse", - // "length", - // "sort", - // "default", - // "keys", - // "escape", - // "raw", - // "merge" - //}; - private final static List KEYWORD_LOOKUPS = new ArrayList(); - //private final static List BUILT_IN_FILTER_LOOKUPS = new ArrayList(); + private final static List FLAGS_LOOKUPS = new ArrayList(); static { for (String keyword : KEYWORDS) { KEYWORD_LOOKUPS.add(LookupElementBuilder.create(keyword)); } - //for (String filter : BUILT_IN_FILTERS) { - // BUILT_IN_FILTER_LOOKUPS.add(LookupElementBuilder.create(filter)); - //} + for (String flag : GetTextFlags.getAlFlags()) { + FLAGS_LOOKUPS.add(LookupElementBuilder.create(flag)); + } } - public GetTextCompletitionContributor() { + public GetTextCompletionContributor() { extend(CompletionType.BASIC, psiElement().withParent(psiElement().withLanguage(GetTextLanguage.INSTANCE)), new GetTextKeywordCompletionContributor()); } @@ -73,17 +51,18 @@ public class GetTextCompletitionContributor extends CompletionContributor { ProcessingContext context, @NotNull CompletionResultSet result) { final PsiElement currElement = parameters.getPosition().getOriginalElement(); - if (currElement.getNode().getElementType() == GetTextTokenTypes.BAD_CHARACTER) { + PsiElement prevElement = currElement.getPrevSibling(); + + if (currElement.getNode().getElementType() == GetTextTokenTypes.COMMAND || prevElement instanceof PsiWhiteSpace) { for (LookupElementBuilder builder : KEYWORD_LOOKUPS) result.addElement(builder); result.stopHere(); - //return; + return; + } + + if (prevElement != null && GetTextTokenTypes.FLAG_LINE.contains(prevElement.getNode().getElementType())) { + for (LookupElementBuilder builder : FLAGS_LOOKUPS) result.addElement(builder); + result.stopHere(); } - //PsiElement prevElement = currElement.getPrevSibling(); - //if (prevElement != null && prevElement instanceof PsiWhiteSpace) prevElement = prevElement.getPrevSibling(); - //if (prevElement != null && prevElement.getNode().getElementType() == TwigTokenTypes.FILTER) { - // for (LookupElementBuilder builder : BUILT_IN_FILTER_LOOKUPS) result.addElement(builder); - // result.stopHere(); - //} } } } diff --git a/plugins/gettext/src/com/jetbrains/gettext/completion/GetTextQuoteHandler.java b/plugins/gettext/src/com/jetbrains/gettext/completion/GetTextQuoteHandler.java new file mode 100644 index 000000000000..32bf2dbbb58e --- /dev/null +++ b/plugins/gettext/src/com/jetbrains/gettext/completion/GetTextQuoteHandler.java @@ -0,0 +1,28 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jetbrains.gettext.completion; + +import com.intellij.codeInsight.editorActions.SimpleTokenSetQuoteHandler; +import com.jetbrains.gettext.GetTextTokenTypes; + +/** + * @author Svetlana.Zemlyanskaya + */ +public class GetTextQuoteHandler extends SimpleTokenSetQuoteHandler { + public GetTextQuoteHandler() { + super(GetTextTokenTypes.QUOTE); + } +} diff --git a/plugins/gettext/src/com/jetbrains/gettext/highlighter/GetTextHighlighterData.java b/plugins/gettext/src/com/jetbrains/gettext/highlighter/GetTextHighlighterData.java index 1147e110535b..e7965e2554d0 100644 --- a/plugins/gettext/src/com/jetbrains/gettext/highlighter/GetTextHighlighterData.java +++ b/plugins/gettext/src/com/jetbrains/gettext/highlighter/GetTextHighlighterData.java @@ -1,6 +1,5 @@ package com.jetbrains.gettext.highlighter; -import com.intellij.openapi.editor.HighlighterColors; import com.intellij.openapi.editor.SyntaxHighlighterColors; import com.intellij.openapi.editor.colors.TextAttributesKey; @@ -25,9 +24,9 @@ public class GetTextHighlighterData { public static final TextAttributesKey FLAG = TextAttributesKey.createTextAttributesKey(FLAG_ID, SyntaxHighlighterColors.DOC_COMMENT_TAG.getDefaultAttributes().clone()); - public static final String TRANSLATED_NUMBER_ID = "GET_TEXT_TRANSLATED_NUMBER"; - public static final TextAttributesKey TRANSLATED_NUMBER = - TextAttributesKey.createTextAttributesKey(TRANSLATED_NUMBER_ID, SyntaxHighlighterColors.NUMBER.getDefaultAttributes().clone()); + public static final String NUMBER_ID = "GET_TEXT_TRANSLATED_NUMBER"; + public static final TextAttributesKey NUMBER = + TextAttributesKey.createTextAttributesKey(NUMBER_ID, SyntaxHighlighterColors.NUMBER.getDefaultAttributes().clone()); public static final String BRACES_ID = "GET_TEXT_BRACES"; public static final TextAttributesKey BRACES = @@ -36,7 +35,4 @@ public class GetTextHighlighterData { public static final String DOTS_ID = "GET_TEXT_DOTS"; public static final TextAttributesKey DOTS = TextAttributesKey.createTextAttributesKey(DOTS_ID, SyntaxHighlighterColors.DOT.getDefaultAttributes().clone()); - - public static final TextAttributesKey BAD_CHARACTER = - TextAttributesKey.createTextAttributesKey("TS_BAD_CHARACTER", HighlighterColors.BAD_CHARACTER.getDefaultAttributes()); } diff --git a/plugins/gettext/src/com/jetbrains/gettext/highlighter/GetTextSyntaxHighlighter.java b/plugins/gettext/src/com/jetbrains/gettext/highlighter/GetTextSyntaxHighlighter.java index 7719be7df13b..974120b311f2 100644 --- a/plugins/gettext/src/com/jetbrains/gettext/highlighter/GetTextSyntaxHighlighter.java +++ b/plugins/gettext/src/com/jetbrains/gettext/highlighter/GetTextSyntaxHighlighter.java @@ -3,7 +3,6 @@ package com.jetbrains.gettext.highlighter; import com.intellij.lexer.Lexer; import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.fileTypes.SyntaxHighlighterBase; -import com.intellij.psi.TokenType; import com.intellij.psi.tree.IElementType; import com.jetbrains.gettext.GetTextLexer; import com.jetbrains.gettext.GetTextTokenTypes; @@ -34,9 +33,9 @@ public class GetTextSyntaxHighlighter extends SyntaxHighlighterBase { fillMap(keys1, GetTextTokenTypes.KEYWORDS, GetTextHighlighterData.KEYWORD); fillMap(keys1, GetTextTokenTypes.STRING_LITERALS, GetTextHighlighterData.STRING); fillMap(keys1, GetTextTokenTypes.BRACES, GetTextHighlighterData.BRACES); - keys1.put(GetTextTokenTypes.NUMBER, GetTextHighlighterData.TRANSLATED_NUMBER); + fillMap(keys1, GetTextTokenTypes.NUMBERS, GetTextHighlighterData.NUMBER); keys1.put(GetTextTokenTypes.DOTS, GetTextHighlighterData.DOTS); - keys1.put(TokenType.BAD_CHARACTER, GetTextHighlighterData.BAD_CHARACTER); + keys1.put(GetTextTokenTypes.BAD_CHARACTER, GetTextHighlighterData.KEYWORD); } diff --git a/plugins/gettext/src/com/jetbrains/gettext/lang/CommandFormatException.java b/plugins/gettext/src/com/jetbrains/gettext/lang/CommandFormatException.java deleted file mode 100644 index 212465d09c2e..000000000000 --- a/plugins/gettext/src/com/jetbrains/gettext/lang/CommandFormatException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.jetbrains.gettext.lang; - -/** - * @author Svetlana.Zemlyanskaya - */ -public class CommandFormatException extends Exception { - - public CommandFormatException(String message) { - super(message); - } -} diff --git a/plugins/gettext/src/com/jetbrains/gettext/lang/GetTextFlags.java b/plugins/gettext/src/com/jetbrains/gettext/lang/GetTextFlags.java new file mode 100644 index 000000000000..0994018079f2 --- /dev/null +++ b/plugins/gettext/src/com/jetbrains/gettext/lang/GetTextFlags.java @@ -0,0 +1,86 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jetbrains.gettext.lang; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Svetlana.Zemlyanskaya + */ +public enum GetTextFlags { + + FUZZY("fuzzy", false), + RANGE("range", false), + C("c"), + OBJC("objc"), + SH("sh"), + PYTHON("python"), + LISP("lisp"), + ELISP("elisp"), + LIBREP("librep"), + SCHEME("scheme"), + SMALLTALK("smalltalk"), + JAVA("java"), + CSHARP("csharp"), + AWK("awk"), + YCP("ycp"), + TCL("tcl"), + PERL("perl-brace"), + PHP("php"), + GCC("gcc-internal"), + GFC("gfc-internal"), + QT("qt"), + KDE("kde"), + BOOST("boost"), + PASCAL("object-pascal"), + QT_PURAL("qt-plural"); + + + private String flagContent; + private boolean isFormatFlag; + + GetTextFlags(String flagContent, boolean formatFlag) { + this.flagContent = flagContent; + isFormatFlag = formatFlag; + } + + GetTextFlags(String flagContent) { + this.flagContent = flagContent; + this.isFormatFlag = true; + } + + public static List getAlFlags() { + List flags = new ArrayList(); + for (GetTextFlags flag : GetTextFlags.values()) { + if (flag.isFormatFlag) { + flags.add(constructFormatFlag(flag.flagContent)); + flags.add(constructNoFormatFlag(flag.flagContent)); + } else { + flags.add(flag.flagContent); + } + } + return flags; + } + + private static String constructFormatFlag(String formatContent) { + return formatContent + "-format"; + } + + private static String constructNoFormatFlag(String formatContent) { + return "no-" + constructFormatFlag(formatContent); + } +} diff --git a/plugins/gettext/src/com/jetbrains/gettext/lang/MsgCommand.java b/plugins/gettext/src/com/jetbrains/gettext/lang/MsgCommand.java index b85fd9d6dcec..c43876be33c6 100644 --- a/plugins/gettext/src/com/jetbrains/gettext/lang/MsgCommand.java +++ b/plugins/gettext/src/com/jetbrains/gettext/lang/MsgCommand.java @@ -13,16 +13,14 @@ public abstract class MsgCommand { public abstract IElementType getCompositeElement(); - public void parse(PsiBuilder builder) throws CommandFormatException { + public boolean parse(PsiBuilder builder) { builder.advanceLexer(); int count = 0; while (builder.getTokenType() == GetTextTokenTypes.STRING) { checkString(builder); count++; } - if (count == 0) { - throw new CommandFormatException("String for " + getName() + " is not specified"); - } + return count > 0; } private static void checkString(PsiBuilder builder) { @@ -54,15 +52,8 @@ public abstract class MsgCommand { exists = true; return true; } - else if (isMultiple()) { - return true; - } - return false; + return isMultiple(); } public abstract String getName(); - - public int getCount() { - return exists ? 1 : 0; - } } diff --git a/plugins/gettext/src/com/jetbrains/gettext/lang/MsgCommandContainer.java b/plugins/gettext/src/com/jetbrains/gettext/lang/MsgCommandContainer.java index 8305aa91bd90..a0f24f79c1b8 100644 --- a/plugins/gettext/src/com/jetbrains/gettext/lang/MsgCommandContainer.java +++ b/plugins/gettext/src/com/jetbrains/gettext/lang/MsgCommandContainer.java @@ -45,17 +45,16 @@ public class MsgCommandContainer { PsiBuilder.Marker marker = builder.mark(); try { MsgCommand command = getCommand(builder.getTokenType()); - command.parse(builder); - //if (result) { + boolean result = command.parse(builder); + if (result) { marker.done(command.getCompositeElement()); - //} - //else { - // marker.error("String for " + command.getName() + " is not specified"); - //} - //return result; - return true; + } + else { + marker.error("String for " + command.getName() + " is not specified"); + } + return result; } - catch (Exception e) { + catch (UnknownCommandException e) { marker.error(e.getMessage()); builder.advanceLexer(); return false; diff --git a/plugins/gettext/src/com/jetbrains/gettext/lang/MsgstrCommand.java b/plugins/gettext/src/com/jetbrains/gettext/lang/MsgstrCommand.java index 15afdcb08002..162313381fcf 100644 --- a/plugins/gettext/src/com/jetbrains/gettext/lang/MsgstrCommand.java +++ b/plugins/gettext/src/com/jetbrains/gettext/lang/MsgstrCommand.java @@ -10,10 +10,7 @@ import com.jetbrains.gettext.GetTextTokenTypes; */ public class MsgstrCommand extends MsgCommand { - private int count; - public MsgstrCommand() { - count = 0; } @Override @@ -22,29 +19,35 @@ public class MsgstrCommand extends MsgCommand { } @Override - public void parse(PsiBuilder builder) throws CommandFormatException { - try { - super.parse(builder); - } - catch (CommandFormatException e) { - parseBraces(builder); - } - //return super.parse(builder) || parseBraces(builder); + public boolean parse(PsiBuilder builder) { + return super.parse(builder) || parseBraces(builder); } - private boolean parseBraces(PsiBuilder builder) throws CommandFormatException { + private boolean parseBraces(PsiBuilder builder) { if (builder.getTokenType() == GetTextTokenTypes.LBRACE) { builder.advanceLexer(); if (builder.getTokenType() == GetTextTokenTypes.NUMBER) { - builder.advanceLexer(); + if (!checkNumber(builder)) { + PsiBuilder.Marker marker = builder.mark(); + builder.advanceLexer(); + marker.error("Wrong number format"); + } + else { + builder.advanceLexer(); + } if (builder.getTokenType() == GetTextTokenTypes.RBRACE) { - super.parse(builder); + return super.parse(builder); } } } return false; } + private static boolean checkNumber(PsiBuilder builder) { + String number = builder.getTokenText(); + return number != null && !number.isEmpty() && !(number.charAt(0) == '0' && !number.equals("0")); + } + @Override public boolean isNecessary() { return true; @@ -59,18 +62,4 @@ public class MsgstrCommand extends MsgCommand { public String getName() { return "msgstr"; } - - @Override - public int getCount() { - return count; - } - - @Override - public boolean register() { - boolean result = super.register(); - if (result) { - count++; - } - return result; - } } diff --git a/plugins/gettext/src/com/jetbrains/gettext/parser/GetTextParser.java b/plugins/gettext/src/com/jetbrains/gettext/parser/GetTextParser.java index c0b9a0242118..cb0e1e31a9e3 100644 --- a/plugins/gettext/src/com/jetbrains/gettext/parser/GetTextParser.java +++ b/plugins/gettext/src/com/jetbrains/gettext/parser/GetTextParser.java @@ -36,7 +36,7 @@ public class GetTextParser implements PsiParser { private static void parseCommentHeader(PsiBuilder builder) { PsiBuilder.Marker marker = builder.mark(); while (GetTextTokenTypes.COMMENTS.contains(builder.getTokenType()) || - GetTextTokenTypes.FLAGS.contains(builder.getTokenType())) { + GetTextTokenTypes.FLAG_LINE.contains(builder.getTokenType())) { builder.advanceLexer(); } marker.done(GetTextCompositeElementTypes.HEADER); @@ -48,8 +48,8 @@ public class GetTextParser implements PsiParser { while (!canTerminate(builder, container)) { try { IElementType token = builder.getTokenType(); - if (container.parse(builder)) { - container.addCommand(token); + if (container.parse(builder) && !container.addCommand(token)) { + break; } } catch (UnknownCommandException e) { diff --git a/plugins/gettext/test/com/jetbrains/gettext/GetTextLexerTest.java b/plugins/gettext/test/com/jetbrains/gettext/GetTextLexerTest.java index 666bbcd73d34..27c7eb608718 100644 --- a/plugins/gettext/test/com/jetbrains/gettext/GetTextLexerTest.java +++ b/plugins/gettext/test/com/jetbrains/gettext/GetTextLexerTest.java @@ -35,10 +35,9 @@ public class GetTextLexerTest extends UsefulTestCase { } private static void doTest(String fileName) throws IOException { - final String fullPath = GetTextUtils.getFullPath(fileName); final Lexer lexer = new GetTextLexer(); - final String testText = getFileText(fullPath + ".po"); - final String expected = fullPath + ".txt"; + final String testText = getFileText(GetTextUtils.getFullSourcePath(fileName)); + final String expected = GetTextUtils.getFullLexerPath(fileName); doFileLexerTest(lexer, testText, expected); } @@ -53,7 +52,7 @@ public class GetTextLexerTest extends UsefulTestCase { } public void testLexer() throws Throwable { - doTest("string"); + doTest("command_format"); } public void testAllFiles() throws Throwable { diff --git a/plugins/gettext/test/com/jetbrains/gettext/GetTextParserTest.java b/plugins/gettext/test/com/jetbrains/gettext/GetTextParserTest.java index 6e574abfe2d7..0432a15f85cc 100644 --- a/plugins/gettext/test/com/jetbrains/gettext/GetTextParserTest.java +++ b/plugins/gettext/test/com/jetbrains/gettext/GetTextParserTest.java @@ -16,7 +16,7 @@ import java.io.IOException; public class GetTextParserTest extends LightCodeInsightFixtureTestCase { private void doTest(String fileName) throws IOException { - final String filePath = GetTextUtils.getFullPath(fileName) + ".po"; + final String filePath = GetTextUtils.getFullSourcePath(fileName); try { final String fileText = FileUtil.loadFile(new File(filePath)); @@ -30,17 +30,16 @@ public class GetTextParserTest extends LightCodeInsightFixtureTestCase { private void doTest(@NonNls final String code, final String fileName) { final PsiFile psiFile = createLightFile(fileName, GetTextLanguage.INSTANCE, code); final String tree = DebugUtil.psiTreeToString(psiFile, false); - final String path = GetTextUtils.getFullParserResultPath(fileName); + final String path = GetTextUtils.getFullParserPath(fileName); assertSameLinesWithFile(path, tree); } public void testSimple() throws IOException { - doTest("string"); + doTest("command"); } public void testAllFiles() throws Throwable { for(final String file : GetTextUtils.getAllTestedFiles()) { - System.out.println("Start: " + file); doTest(file); } } diff --git a/plugins/gettext/test/com/jetbrains/gettext/GetTextUtils.java b/plugins/gettext/test/com/jetbrains/gettext/GetTextUtils.java index d0099f4d0837..3a9ce71af357 100644 --- a/plugins/gettext/test/com/jetbrains/gettext/GetTextUtils.java +++ b/plugins/gettext/test/com/jetbrains/gettext/GetTextUtils.java @@ -6,6 +6,7 @@ import com.intellij.openapi.application.PathManager; * @author Svetlana.Zemlyanskaya */ public class GetTextUtils { + private static final String path = "community/plugins/gettext/test/com/jetbrains/gettext/"; public static String[] getAllTestedFiles() { return new String[]{ @@ -15,18 +16,25 @@ public class GetTextUtils { "complex_flags", "msg_plural", "range_flag", - "string"}; + "string", + "command_format", + "multi_id", + "command"}; } - protected static String getDataSubpath() { - return "community/plugins/gettext/test/com/jetbrains/gettext/lexer"; + private static String getFullPath() { + return PathManager.getHomePath() + "/" + path; } - public static String getFullPath(final String fileName) { - return PathManager.getHomePath() + "/" + getDataSubpath() + "/" + fileName; + public static String getFullSourcePath(final String fileName) { + return getFullPath() + "lexer/" + fileName + ".po"; } - public static String getFullParserResultPath(final String fileName) { - return getFullPath(fileName) + "_parser.txt"; + public static String getFullLexerPath(final String fileName) { + return getFullPath() + "lexer/" + fileName + ".txt"; + } + + public static String getFullParserPath(final String fileName) { + return getFullPath() + "parser/" + fileName + ".txt"; } } \ No newline at end of file diff --git a/plugins/gettext/test/com/jetbrains/gettext/lexer/command.po b/plugins/gettext/test/com/jetbrains/gettext/lexer/command.po new file mode 100644 index 000000000000..a173b05f51cc --- /dev/null +++ b/plugins/gettext/test/com/jetbrains/gettext/lexer/command.po @@ -0,0 +1 @@ +msg \ No newline at end of file diff --git a/plugins/gettext/test/com/jetbrains/gettext/lexer/command.txt b/plugins/gettext/test/com/jetbrains/gettext/lexer/command.txt new file mode 100644 index 000000000000..d845fd46f730 --- /dev/null +++ b/plugins/gettext/test/com/jetbrains/gettext/lexer/command.txt @@ -0,0 +1 @@ +COMMAND ('msg') \ No newline at end of file diff --git a/plugins/gettext/test/com/jetbrains/gettext/lexer/command_format.po b/plugins/gettext/test/com/jetbrains/gettext/lexer/command_format.po new file mode 100644 index 000000000000..a46f082513b6 --- /dev/null +++ b/plugins/gettext/test/com/jetbrains/gettext/lexer/command_format.po @@ -0,0 +1,2 @@ +msgid "" +msgstr \ No newline at end of file diff --git a/plugins/gettext/test/com/jetbrains/gettext/lexer/command_format.txt b/plugins/gettext/test/com/jetbrains/gettext/lexer/command_format.txt new file mode 100644 index 000000000000..94128e89b9aa --- /dev/null +++ b/plugins/gettext/test/com/jetbrains/gettext/lexer/command_format.txt @@ -0,0 +1,6 @@ +MSGID ('msgid') +WHITE_SPACE (' ') +STRING ('""') +WHITE_SPACE (' +') +MSGSTR ('msgstr') \ No newline at end of file diff --git a/plugins/gettext/test/com/jetbrains/gettext/lexer/complex_flags.txt b/plugins/gettext/test/com/jetbrains/gettext/lexer/complex_flags.txt index 6cb191ceaf80..cde9a830533e 100644 --- a/plugins/gettext/test/com/jetbrains/gettext/lexer/complex_flags.txt +++ b/plugins/gettext/test/com/jetbrains/gettext/lexer/complex_flags.txt @@ -4,24 +4,22 @@ COMMENT ('test') WHITE_SPACE (' ') COMMENT_SYMBOLS ('#') -COMMENT_SYMBOLS ('.') -EXTR_COMMENT (' another') +EXTR_COMMENT ('. another') WHITE_SPACE (' ') COMMENT_SYMBOLS ('#') -COMMENT_SYMBOLS (':') -REFERENCE (' ref') +REFERENCE (': ref') WHITE_SPACE (' ') COMMENT_SYMBOLS ('#') -COMMENT_SYMBOLS (',') -WHITE_SPACE (' ') +FLAG_COMMENT (',') +DELIVERY (' ') FUZZY_FLAG ('fuzzy') DELIVERY (',') -WHITE_SPACE (' ') +DELIVERY (' ') FORMAT_FLAG ('c-format') DELIVERY (',') -WHITE_SPACE (' ') +DELIVERY (' ') NO_FORMAT_FLAG ('no-objc-format') WHITE_SPACE (' ') diff --git a/plugins/gettext/test/com/jetbrains/gettext/lexer/flags.txt b/plugins/gettext/test/com/jetbrains/gettext/lexer/flags.txt index 33db8a1dae30..766778232810 100644 --- a/plugins/gettext/test/com/jetbrains/gettext/lexer/flags.txt +++ b/plugins/gettext/test/com/jetbrains/gettext/lexer/flags.txt @@ -4,18 +4,16 @@ COMMENT ('test') WHITE_SPACE (' ') COMMENT_SYMBOLS ('#') -COMMENT_SYMBOLS ('.') -EXTR_COMMENT (' another') +EXTR_COMMENT ('. another') WHITE_SPACE (' ') COMMENT_SYMBOLS ('#') -COMMENT_SYMBOLS (':') -REFERENCE (' ref') +REFERENCE (': ref') WHITE_SPACE (' ') COMMENT_SYMBOLS ('#') -COMMENT_SYMBOLS (',') -WHITE_SPACE (' ') +FLAG_COMMENT (',') +DELIVERY (' ') FUZZY_FLAG ('fuzzy') DELIVERY (',') WHITE_SPACE (' diff --git a/plugins/gettext/test/com/jetbrains/gettext/lexer/msg_plural.txt b/plugins/gettext/test/com/jetbrains/gettext/lexer/msg_plural.txt index 4cc17e19bbd6..fcc8aa935583 100644 --- a/plugins/gettext/test/com/jetbrains/gettext/lexer/msg_plural.txt +++ b/plugins/gettext/test/com/jetbrains/gettext/lexer/msg_plural.txt @@ -4,18 +4,15 @@ COMMENT ('test') WHITE_SPACE (' ') COMMENT_SYMBOLS ('#') -COMMENT_SYMBOLS ('.') -EXTR_COMMENT (' another') +EXTR_COMMENT ('. another') WHITE_SPACE (' ') COMMENT_SYMBOLS ('#') -COMMENT_SYMBOLS (':') -REFERENCE (' ref') +REFERENCE (': ref') WHITE_SPACE (' ') COMMENT_SYMBOLS ('#') -COMMENT_SYMBOLS ('|') -PREVIOUS_TRANSLATE_COMMENT (' msgid test') +PREVIOUS_TRANSLATE_COMMENT ('| msgid test') WHITE_SPACE (' ') MSGID_PLURAL ('msgid_plural') diff --git a/plugins/gettext/test/com/jetbrains/gettext/lexer/multi_id.po b/plugins/gettext/test/com/jetbrains/gettext/lexer/multi_id.po new file mode 100644 index 000000000000..ed344f6586ec --- /dev/null +++ b/plugins/gettext/test/com/jetbrains/gettext/lexer/multi_id.po @@ -0,0 +1,7 @@ +msgid "" +msgstr "" + +msgid "" + +msgid "" +msgstr "" \ No newline at end of file diff --git a/plugins/gettext/test/com/jetbrains/gettext/lexer/multi_id.txt b/plugins/gettext/test/com/jetbrains/gettext/lexer/multi_id.txt new file mode 100644 index 000000000000..40719f5ddd62 --- /dev/null +++ b/plugins/gettext/test/com/jetbrains/gettext/lexer/multi_id.txt @@ -0,0 +1,27 @@ +MSGID ('msgid') +WHITE_SPACE (' ') +STRING ('""') +WHITE_SPACE (' +') +MSGSTR ('msgstr') +WHITE_SPACE (' ') +STRING ('""') +WHITE_SPACE (' +') +WHITE_SPACE (' +') +MSGID ('msgid') +WHITE_SPACE (' ') +STRING ('""') +WHITE_SPACE (' +') +WHITE_SPACE (' +') +MSGID ('msgid') +WHITE_SPACE (' ') +STRING ('""') +WHITE_SPACE (' +') +MSGSTR ('msgstr') +WHITE_SPACE (' ') +STRING ('""') \ No newline at end of file diff --git a/plugins/gettext/test/com/jetbrains/gettext/lexer/range_flag.txt b/plugins/gettext/test/com/jetbrains/gettext/lexer/range_flag.txt index 60d2ec2e176a..51eed6d2ff54 100644 --- a/plugins/gettext/test/com/jetbrains/gettext/lexer/range_flag.txt +++ b/plugins/gettext/test/com/jetbrains/gettext/lexer/range_flag.txt @@ -4,27 +4,25 @@ COMMENT ('test') WHITE_SPACE (' ') COMMENT_SYMBOLS ('#') -COMMENT_SYMBOLS ('.') -EXTR_COMMENT (' another') +EXTR_COMMENT ('. another') WHITE_SPACE (' ') COMMENT_SYMBOLS ('#') -COMMENT_SYMBOLS (':') -REFERENCE (' ref') +REFERENCE (': ref') WHITE_SPACE (' ') COMMENT_SYMBOLS ('#') -COMMENT_SYMBOLS (',') -WHITE_SPACE (' ') +FLAG_COMMENT (',') +DELIVERY (' ') FUZZY_FLAG ('fuzzy') DELIVERY (',') -WHITE_SPACE (' ') +DELIVERY (' ') RANGE_FLAG ('range') COLON (':') -WHITE_SPACE (' ') -NUMBER ('0') +DELIVERY (' ') +RANGE_NUMBER ('0') DOTS ('..') -NUMBER ('10') +RANGE_NUMBER ('10') WHITE_SPACE (' ') MSGID ('msgid') diff --git a/plugins/gettext/test/com/jetbrains/gettext/lexer/simple.txt b/plugins/gettext/test/com/jetbrains/gettext/lexer/simple.txt index ba45c1662815..6b18526dab75 100644 --- a/plugins/gettext/test/com/jetbrains/gettext/lexer/simple.txt +++ b/plugins/gettext/test/com/jetbrains/gettext/lexer/simple.txt @@ -4,18 +4,15 @@ COMMENT ('test') WHITE_SPACE (' ') COMMENT_SYMBOLS ('#') -COMMENT_SYMBOLS ('.') -EXTR_COMMENT (' another') +EXTR_COMMENT ('. another') WHITE_SPACE (' ') COMMENT_SYMBOLS ('#') -COMMENT_SYMBOLS (':') -REFERENCE (' ref') +REFERENCE (': ref') WHITE_SPACE (' ') COMMENT_SYMBOLS ('#') -COMMENT_SYMBOLS ('|') -PREVIOUS_TRANSLATE_COMMENT (' msgid test') +PREVIOUS_TRANSLATE_COMMENT ('| msgid test') WHITE_SPACE (' ') MSGID ('msgid') @@ -36,18 +33,15 @@ COMMENT ('t') WHITE_SPACE (' ') COMMENT_SYMBOLS ('#') -COMMENT_SYMBOLS ('.') -EXTR_COMMENT (' another') +EXTR_COMMENT ('. another') WHITE_SPACE (' ') COMMENT_SYMBOLS ('#') -COMMENT_SYMBOLS (':') -REFERENCE (' ref') +REFERENCE (': ref') WHITE_SPACE (' ') COMMENT_SYMBOLS ('#') -COMMENT_SYMBOLS ('|') -PREVIOUS_TRANSLATE_COMMENT (' msgid test') +PREVIOUS_TRANSLATE_COMMENT ('| msgid test') WHITE_SPACE (' ') MSGID ('msgid') diff --git a/plugins/gettext/test/com/jetbrains/gettext/parser/command.txt b/plugins/gettext/test/com/jetbrains/gettext/parser/command.txt new file mode 100644 index 000000000000..762a4108700e --- /dev/null +++ b/plugins/gettext/test/com/jetbrains/gettext/parser/command.txt @@ -0,0 +1,8 @@ +GNU GetText File + MSG_BLOCK + HEADER + + PsiErrorElement:Not enough commands + PsiErrorElement:Unexpected token + + PsiElement(COMMAND)('msg') \ No newline at end of file diff --git a/plugins/gettext/test/com/jetbrains/gettext/parser/command_format.txt b/plugins/gettext/test/com/jetbrains/gettext/parser/command_format.txt new file mode 100644 index 000000000000..9d3f738d9b6e --- /dev/null +++ b/plugins/gettext/test/com/jetbrains/gettext/parser/command_format.txt @@ -0,0 +1,12 @@ +GNU GetText File + MSG_BLOCK + HEADER + + PsiErrorElement:Not enough commands + MSGID + PsiElement(MSGID)('msgid') + PsiWhiteSpace(' ') + PsiElement(STRING)('""') + PsiWhiteSpace('\n') + PsiErrorElement:String for msgstr is not specified + PsiElement(MSGSTR)('msgstr') \ No newline at end of file diff --git a/plugins/gettext/test/com/jetbrains/gettext/lexer/complex_flags_parser.txt b/plugins/gettext/test/com/jetbrains/gettext/parser/complex_flags.txt similarity index 75% rename from plugins/gettext/test/com/jetbrains/gettext/lexer/complex_flags_parser.txt rename to plugins/gettext/test/com/jetbrains/gettext/parser/complex_flags.txt index 84ee7f7463e1..6a14a16a7bf8 100644 --- a/plugins/gettext/test/com/jetbrains/gettext/lexer/complex_flags_parser.txt +++ b/plugins/gettext/test/com/jetbrains/gettext/parser/complex_flags.txt @@ -4,24 +4,22 @@ GNU GetText File PsiComment(COMMENT)('test') PsiWhiteSpace('\n') PsiComment(COMMENT_SYMBOLS)('#') - PsiComment(COMMENT_SYMBOLS)('.') MSG_BLOCK HEADER - PsiElement(EXTR_COMMENT)(' another') + PsiElement(EXTR_COMMENT)('. another') PsiWhiteSpace('\n') PsiComment(COMMENT_SYMBOLS)('#') - PsiComment(COMMENT_SYMBOLS)(':') - PsiElement(REFERENCE)(' ref') + PsiElement(REFERENCE)(': ref') PsiWhiteSpace('\n') PsiComment(COMMENT_SYMBOLS)('#') - PsiComment(COMMENT_SYMBOLS)(',') - PsiWhiteSpace(' ') + PsiElement(FLAG_COMMENT)(',') + PsiElement(DELIVERY)(' ') PsiElement(FUZZY_FLAG)('fuzzy') PsiElement(DELIVERY)(',') - PsiWhiteSpace(' ') + PsiElement(DELIVERY)(' ') PsiElement(FORMAT_FLAG)('c-format') PsiElement(DELIVERY)(',') - PsiWhiteSpace(' ') + PsiElement(DELIVERY)(' ') PsiElement(NO_FORMAT_FLAG)('no-objc-format') PsiWhiteSpace('\n') MSG_CONTENT diff --git a/plugins/gettext/test/com/jetbrains/gettext/lexer/flags_parser.txt b/plugins/gettext/test/com/jetbrains/gettext/parser/flags.txt similarity index 76% rename from plugins/gettext/test/com/jetbrains/gettext/lexer/flags_parser.txt rename to plugins/gettext/test/com/jetbrains/gettext/parser/flags.txt index 039070d56e50..f605b0127a93 100644 --- a/plugins/gettext/test/com/jetbrains/gettext/lexer/flags_parser.txt +++ b/plugins/gettext/test/com/jetbrains/gettext/parser/flags.txt @@ -4,18 +4,16 @@ GNU GetText File PsiComment(COMMENT)('test') PsiWhiteSpace('\n') PsiComment(COMMENT_SYMBOLS)('#') - PsiComment(COMMENT_SYMBOLS)('.') MSG_BLOCK HEADER - PsiElement(EXTR_COMMENT)(' another') + PsiElement(EXTR_COMMENT)('. another') PsiWhiteSpace('\n') PsiComment(COMMENT_SYMBOLS)('#') - PsiComment(COMMENT_SYMBOLS)(':') - PsiElement(REFERENCE)(' ref') + PsiElement(REFERENCE)(': ref') PsiWhiteSpace('\n') PsiComment(COMMENT_SYMBOLS)('#') - PsiComment(COMMENT_SYMBOLS)(',') - PsiWhiteSpace(' ') + PsiElement(FLAG_COMMENT)(',') + PsiElement(DELIVERY)(' ') PsiElement(FUZZY_FLAG)('fuzzy') PsiElement(DELIVERY)(',') PsiWhiteSpace('\n') diff --git a/plugins/gettext/test/com/jetbrains/gettext/lexer/msg_plural_parser.txt b/plugins/gettext/test/com/jetbrains/gettext/parser/msg_plural.txt similarity index 79% rename from plugins/gettext/test/com/jetbrains/gettext/lexer/msg_plural_parser.txt rename to plugins/gettext/test/com/jetbrains/gettext/parser/msg_plural.txt index d9707ff13dc7..b4b8f9df72b2 100644 --- a/plugins/gettext/test/com/jetbrains/gettext/lexer/msg_plural_parser.txt +++ b/plugins/gettext/test/com/jetbrains/gettext/parser/msg_plural.txt @@ -4,18 +4,15 @@ GNU GetText File PsiComment(COMMENT)('test') PsiWhiteSpace('\n') PsiComment(COMMENT_SYMBOLS)('#') - PsiComment(COMMENT_SYMBOLS)('.') MSG_BLOCK HEADER - PsiElement(EXTR_COMMENT)(' another') + PsiElement(EXTR_COMMENT)('. another') PsiWhiteSpace('\n') PsiComment(COMMENT_SYMBOLS)('#') - PsiComment(COMMENT_SYMBOLS)(':') - PsiElement(REFERENCE)(' ref') + PsiElement(REFERENCE)(': ref') PsiWhiteSpace('\n') PsiComment(COMMENT_SYMBOLS)('#') - PsiComment(COMMENT_SYMBOLS)('|') - PsiElement(PREVIOUS_TRANSLATE_COMMENT)(' msgid test') + PsiElement(PREVIOUS_TRANSLATE_COMMENT)('| msgid test') PsiWhiteSpace('\n') MSG_CONTENT MSGID_PLURAL @@ -39,7 +36,8 @@ GNU GetText File MSGSTR PsiElement(MSGSTR)('msgstr') PsiElement(LBRACE)('[') - PsiElement(NUMBER)('01') + PsiErrorElement:Wrong number format + PsiElement(NUMBER)('01') PsiElement(RBRACE)(']') PsiWhiteSpace(' ') PsiElement(STRING)('"translated string"') \ No newline at end of file diff --git a/plugins/gettext/test/com/jetbrains/gettext/parser/multi_id.txt b/plugins/gettext/test/com/jetbrains/gettext/parser/multi_id.txt new file mode 100644 index 000000000000..5c3b1c6a3bd1 --- /dev/null +++ b/plugins/gettext/test/com/jetbrains/gettext/parser/multi_id.txt @@ -0,0 +1,39 @@ +GNU GetText File + MSG_BLOCK + HEADER + + MSG_CONTENT + MSGID + PsiElement(MSGID)('msgid') + PsiWhiteSpace(' ') + PsiElement(STRING)('""') + PsiWhiteSpace('\n') + MSGSTR + PsiElement(MSGSTR)('msgstr') + PsiWhiteSpace(' ') + PsiElement(STRING)('""') + PsiWhiteSpace('\n') + PsiWhiteSpace('\n') + MSG_BLOCK + HEADER + + PsiErrorElement:Not enough commands + MSGID + PsiElement(MSGID)('msgid') + PsiWhiteSpace(' ') + PsiElement(STRING)('""') + PsiWhiteSpace('\n') + PsiWhiteSpace('\n') + MSGID + PsiElement(MSGID)('msgid') + PsiWhiteSpace(' ') + PsiElement(STRING)('""') + PsiWhiteSpace('\n') + MSG_BLOCK + HEADER + + PsiErrorElement:Not enough commands + MSGSTR + PsiElement(MSGSTR)('msgstr') + PsiWhiteSpace(' ') + PsiElement(STRING)('""') \ No newline at end of file diff --git a/plugins/gettext/test/com/jetbrains/gettext/lexer/parser_parser.txt b/plugins/gettext/test/com/jetbrains/gettext/parser/parser.txt similarity index 100% rename from plugins/gettext/test/com/jetbrains/gettext/lexer/parser_parser.txt rename to plugins/gettext/test/com/jetbrains/gettext/parser/parser.txt diff --git a/plugins/gettext/test/com/jetbrains/gettext/lexer/range_flag_parser.txt b/plugins/gettext/test/com/jetbrains/gettext/parser/range_flag.txt similarity index 57% rename from plugins/gettext/test/com/jetbrains/gettext/lexer/range_flag_parser.txt rename to plugins/gettext/test/com/jetbrains/gettext/parser/range_flag.txt index 46048336c942..4fdb2678507f 100644 --- a/plugins/gettext/test/com/jetbrains/gettext/lexer/range_flag_parser.txt +++ b/plugins/gettext/test/com/jetbrains/gettext/parser/range_flag.txt @@ -4,37 +4,27 @@ GNU GetText File PsiComment(COMMENT)('test') PsiWhiteSpace('\n') PsiComment(COMMENT_SYMBOLS)('#') - PsiComment(COMMENT_SYMBOLS)('.') MSG_BLOCK HEADER - PsiElement(EXTR_COMMENT)(' another') + PsiElement(EXTR_COMMENT)('. another') PsiWhiteSpace('\n') PsiComment(COMMENT_SYMBOLS)('#') - PsiComment(COMMENT_SYMBOLS)(':') - PsiElement(REFERENCE)(' ref') + PsiElement(REFERENCE)(': ref') PsiWhiteSpace('\n') PsiComment(COMMENT_SYMBOLS)('#') - PsiComment(COMMENT_SYMBOLS)(',') - PsiWhiteSpace(' ') + PsiElement(FLAG_COMMENT)(',') + PsiElement(DELIVERY)(' ') PsiElement(FUZZY_FLAG)('fuzzy') PsiElement(DELIVERY)(',') - PsiWhiteSpace(' ') + PsiElement(DELIVERY)(' ') PsiElement(RANGE_FLAG)('range') - MSG_CONTENT - PsiErrorElement:Unexpected token - PsiElement(COLON)(':') - PsiErrorElement:Unexpected token - - PsiWhiteSpace(' ') - PsiElement(NUMBER)('0') - PsiErrorElement:Unexpected token - + PsiElement(DELIVERY)(' ') + PsiElement(RANGE_NUMBER)('0') PsiElement(DOTS)('..') - PsiErrorElement:Unexpected token - - PsiElement(NUMBER)('10') - PsiWhiteSpace('\n') + PsiElement(RANGE_NUMBER)('10') + PsiWhiteSpace('\n') + MSG_CONTENT MSGID PsiElement(MSGID)('msgid') PsiWhiteSpace(' ') diff --git a/plugins/gettext/test/com/jetbrains/gettext/lexer/simple_parser.txt b/plugins/gettext/test/com/jetbrains/gettext/parser/simple.txt similarity index 72% rename from plugins/gettext/test/com/jetbrains/gettext/lexer/simple_parser.txt rename to plugins/gettext/test/com/jetbrains/gettext/parser/simple.txt index 5250fbc94eb3..8b1fc6b4856d 100644 --- a/plugins/gettext/test/com/jetbrains/gettext/lexer/simple_parser.txt +++ b/plugins/gettext/test/com/jetbrains/gettext/parser/simple.txt @@ -4,18 +4,15 @@ GNU GetText File PsiComment(COMMENT)('test') PsiWhiteSpace('\n') PsiComment(COMMENT_SYMBOLS)('#') - PsiComment(COMMENT_SYMBOLS)('.') MSG_BLOCK HEADER - PsiElement(EXTR_COMMENT)(' another') + PsiElement(EXTR_COMMENT)('. another') PsiWhiteSpace('\n') PsiComment(COMMENT_SYMBOLS)('#') - PsiComment(COMMENT_SYMBOLS)(':') - PsiElement(REFERENCE)(' ref') + PsiElement(REFERENCE)(': ref') PsiWhiteSpace('\n') PsiComment(COMMENT_SYMBOLS)('#') - PsiComment(COMMENT_SYMBOLS)('|') - PsiElement(PREVIOUS_TRANSLATE_COMMENT)(' msgid test') + PsiElement(PREVIOUS_TRANSLATE_COMMENT)('| msgid test') PsiWhiteSpace('\n') MSG_CONTENT MSGID @@ -34,18 +31,15 @@ GNU GetText File PsiComment(COMMENT)('t') PsiWhiteSpace('\n') PsiComment(COMMENT_SYMBOLS)('#') - PsiComment(COMMENT_SYMBOLS)('.') MSG_BLOCK HEADER - PsiElement(EXTR_COMMENT)(' another') + PsiElement(EXTR_COMMENT)('. another') PsiWhiteSpace('\n') PsiComment(COMMENT_SYMBOLS)('#') - PsiComment(COMMENT_SYMBOLS)(':') - PsiElement(REFERENCE)(' ref') + PsiElement(REFERENCE)(': ref') PsiWhiteSpace('\n') PsiComment(COMMENT_SYMBOLS)('#') - PsiComment(COMMENT_SYMBOLS)('|') - PsiElement(PREVIOUS_TRANSLATE_COMMENT)(' msgid test') + PsiElement(PREVIOUS_TRANSLATE_COMMENT)('| msgid test') PsiWhiteSpace('\n') MSG_CONTENT MSGID diff --git a/plugins/gettext/test/com/jetbrains/gettext/lexer/string_parser.txt b/plugins/gettext/test/com/jetbrains/gettext/parser/string.txt similarity index 100% rename from plugins/gettext/test/com/jetbrains/gettext/lexer/string_parser.txt rename to plugins/gettext/test/com/jetbrains/gettext/parser/string.txt diff --git a/plugins/gettext/test/com/jetbrains/gettext/lexer/without_comments_parser.txt b/plugins/gettext/test/com/jetbrains/gettext/parser/without_comments.txt similarity index 100% rename from plugins/gettext/test/com/jetbrains/gettext/lexer/without_comments_parser.txt rename to plugins/gettext/test/com/jetbrains/gettext/parser/without_comments.txt