|
1 # -*- coding: utf-8 -*- |
|
2 """ |
|
3 pygments.lexers.teraterm |
|
4 ~~~~~~~~~~~~~~~~~~~~~~~~ |
|
5 |
|
6 Lexer for Tera Term macro files. |
|
7 |
|
8 :copyright: Copyright 2006-2019 by the Pygments team, see AUTHORS. |
|
9 :license: BSD, see LICENSE for details. |
|
10 """ |
|
11 |
|
12 import re |
|
13 |
|
14 from pygments.lexer import RegexLexer, include, bygroups |
|
15 from pygments.token import Text, Comment, Operator, Name, String, \ |
|
16 Number, Keyword |
|
17 |
|
18 __all__ = ['TeraTermLexer'] |
|
19 |
|
20 |
|
21 class TeraTermLexer(RegexLexer): |
|
22 """ |
|
23 For `Tera Term <https://ttssh2.osdn.jp/>`_ macro source code. |
|
24 |
|
25 .. versionadded:: 2.4 |
|
26 """ |
|
27 name = 'Tera Term macro' |
|
28 aliases = ['ttl', 'teraterm', 'teratermmacro'] |
|
29 filenames = ['*.ttl'] |
|
30 mimetypes = ['text/x-teratermmacro'] |
|
31 |
|
32 tokens = { |
|
33 'root': [ |
|
34 include('comments'), |
|
35 include('labels'), |
|
36 include('commands'), |
|
37 include('builtin-variables'), |
|
38 include('user-variables'), |
|
39 include('operators'), |
|
40 include('numeric-literals'), |
|
41 include('string-literals'), |
|
42 include('all-whitespace'), |
|
43 (r'[^\s]', Text), |
|
44 ], |
|
45 'comments': [ |
|
46 (r';[^\r\n]*', Comment.Single), |
|
47 (r'/\*', Comment.Multiline, 'in-comment'), |
|
48 ], |
|
49 'in-comment': [ |
|
50 (r'\*/', Comment.Multiline, '#pop'), |
|
51 (r'[^*/]+', Comment.Multiline), |
|
52 (r'[*/]', Comment.Multiline) |
|
53 ], |
|
54 'labels': [ |
|
55 (r'(?i)^(\s*)(:[0-9a-z_]+)', bygroups(Text, Name.Label)), |
|
56 ], |
|
57 'commands': [ |
|
58 ( |
|
59 r'(?i)\b(' |
|
60 r'basename|beep|bplusrecv|bplussend|break|bringupbox|' |
|
61 r'callmenu|changedir|checksum16|checksum16file|' |
|
62 r'checksum32|checksum32file|checksum8|checksum8file|' |
|
63 r'clearscreen|clipb2var|closesbox|closett|code2str|' |
|
64 r'connect|continue|crc16|crc16file|crc32|crc32file|' |
|
65 r'cygconnect|delpassword|dirname|dirnamebox|disconnect|' |
|
66 r'dispstr|do|else|elseif|enablekeyb|end|endif|enduntil|' |
|
67 r'endwhile|exec|execcmnd|exit|expandenv|fileclose|' |
|
68 r'fileconcat|filecopy|filecreate|filedelete|filelock|' |
|
69 r'filemarkptr|filenamebox|fileopen|fileread|filereadln|' |
|
70 r'filerename|filesearch|fileseek|fileseekback|filestat|' |
|
71 r'filestrseek|filestrseek2|filetruncate|fileunlock|' |
|
72 r'filewrite|filewriteln|findclose|findfirst|findnext|' |
|
73 r'flushrecv|foldercreate|folderdelete|foldersearch|for|' |
|
74 r'getdate|getdir|getenv|getfileattr|gethostname|' |
|
75 r'getipv4addr|getipv6addr|getmodemstatus|getpassword|' |
|
76 r'getspecialfolder|gettime|gettitle|getttdir|getver|' |
|
77 r'if|ifdefined|include|inputbox|int2str|intdim|' |
|
78 r'ispassword|kmtfinish|kmtget|kmtrecv|kmtsend|listbox|' |
|
79 r'loadkeymap|logautoclosemode|logclose|loginfo|logopen|' |
|
80 r'logpause|logrotate|logstart|logwrite|loop|makepath|' |
|
81 r'messagebox|mpause|next|passwordbox|pause|quickvanrecv|' |
|
82 r'quickvansend|random|recvln|regexoption|restoresetup|' |
|
83 r'return|rotateleft|rotateright|scprecv|scpsend|send|' |
|
84 r'sendbreak|sendbroadcast|sendfile|sendkcode|sendln|' |
|
85 r'sendlnbroadcast|sendlnmulticast|sendmulticast|setbaud|' |
|
86 r'setdate|setdebug|setdir|setdlgpos|setdtr|setecho|' |
|
87 r'setenv|setexitcode|setfileattr|setflowctrl|' |
|
88 r'setmulticastname|setpassword|setrts|setsync|settime|' |
|
89 r'settitle|show|showtt|sprintf|sprintf2|statusbox|' |
|
90 r'str2code|str2int|strcompare|strconcat|strcopy|strdim|' |
|
91 r'strinsert|strjoin|strlen|strmatch|strremove|' |
|
92 r'strreplace|strscan|strspecial|strsplit|strtrim|' |
|
93 r'testlink|then|tolower|toupper|unlink|until|uptime|' |
|
94 r'var2clipb|wait|wait4all|waitevent|waitln|waitn|' |
|
95 r'waitrecv|waitregex|while|xmodemrecv|xmodemsend|' |
|
96 r'yesnobox|ymodemrecv|ymodemsend|zmodemrecv|zmodemsend' |
|
97 r')\b', |
|
98 Keyword, |
|
99 ), |
|
100 ( |
|
101 r'(?i)(call|goto)([ \t]+)([0-9a-z_]+)', |
|
102 bygroups(Keyword, Text, Name.Label), |
|
103 ) |
|
104 ], |
|
105 'builtin-variables': [ |
|
106 ( |
|
107 r'(?i)(' |
|
108 r'groupmatchstr1|groupmatchstr2|groupmatchstr3|' |
|
109 r'groupmatchstr4|groupmatchstr5|groupmatchstr6|' |
|
110 r'groupmatchstr7|groupmatchstr8|groupmatchstr9|' |
|
111 r'param1|param2|param3|param4|param5|param6|' |
|
112 r'param7|param8|param9|paramcnt|params|' |
|
113 r'inputstr|matchstr|mtimeout|result|timeout' |
|
114 r')\b', |
|
115 Name.Builtin |
|
116 ), |
|
117 ], |
|
118 'user-variables': [ |
|
119 (r'(?i)[A-Z_][A-Z0-9_]*', Name.Variable), |
|
120 ], |
|
121 'numeric-literals': [ |
|
122 (r'(-?)([0-9]+)', bygroups(Operator, Number.Integer)), |
|
123 (r'(?i)\$[0-9a-f]+', Number.Hex), |
|
124 ], |
|
125 'string-literals': [ |
|
126 (r'(?i)#(?:[0-9]+|\$[0-9a-f]+)', String.Char), |
|
127 (r"'", String.Single, 'in-single-string'), |
|
128 (r'"', String.Double, 'in-double-string'), |
|
129 ], |
|
130 'in-general-string': [ |
|
131 (r'[\\][\\nt]', String.Escape), # Only three escapes are supported. |
|
132 (r'.', String), |
|
133 ], |
|
134 'in-single-string': [ |
|
135 (r"'", String.Single, '#pop'), |
|
136 include('in-general-string'), |
|
137 ], |
|
138 'in-double-string': [ |
|
139 (r'"', String.Double, '#pop'), |
|
140 include('in-general-string'), |
|
141 ], |
|
142 'operators': [ |
|
143 (r'and|not|or|xor', Operator.Word), |
|
144 (r'[!%&*+<=>^~\|\/-]+', Operator), |
|
145 (r'[()]', String.Symbol), |
|
146 ], |
|
147 'all-whitespace': [ |
|
148 (r'[\s]+', Text), |
|
149 ], |
|
150 } |
|
151 |
|
152 # Turtle and Tera Term macro files share the same file extension |
|
153 # but each has a recognizable and distinct syntax. |
|
154 def analyse_text(text): |
|
155 result = 0.0 |
|
156 if re.search(TeraTermLexer.tokens['commands'][0][0], text): |
|
157 result += 0.01 |
|
158 return result |