Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Keyman: Improved tokenization #3224

Merged
merged 1 commit into from Dec 5, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
54 changes: 42 additions & 12 deletions components/prism-keyman.js
@@ -1,14 +1,44 @@
Prism.languages.keyman = {
'comment': /\bc\s.*/i,
'function': /\[\s*(?:(?:ALT|CAPS|CTRL|LALT|LCTRL|NCAPS|RALT|RCTRL|SHIFT)\s+)*(?:[TKU]_[\w?]+|".+?"|'.+?')\s*\]/i, // virtual key
'string': /("|').*?\1/,
'bold': [ // header statements, system stores and variable system stores
/&(?:baselayout|bitmap|capsalwaysoff|capsononly|copyright|ethnologuecode|hotkey|includecodes|keyboardversion|kmw_embedcss|kmw_embedjs|kmw_helpfile|kmw_helptext|kmw_rtl|language|layer|layoutfile|message|mnemoniclayout|name|oldcharposmatching|platform|shiftfreescaps|targets|version|visualkeyboard|windowslanguages)\b/i,
/\b(?:bitmap|bitmaps|caps always off|caps on only|copyright|hotkey|language|layout|message|name|shift frees caps|version)\b/i
],
'keyword': /\b(?:any|baselayout|beep|call|context|deadkey|dk|if|index|layer|notany|nul|outs|platform|reset|return|save|set|store|use)\b/i, // rule keywords
'atrule': /\b(?:ansi|begin|group|match|nomatch|unicode|using keys)\b/i, // structural keywords
'number': /\b(?:U\+[\dA-F]+|d\d+|x[\da-f]+|\d+)\b/i, // U+####, x###, d### characters and numbers
'operator': /[+>\\,()]/,
'tag': /\$(?:keyman|keymanonly|keymanweb|kmfl|weaver):/i // prefixes
'comment': {
pattern: /\bc .*/i,
greedy: true
},
'string': {
pattern: /"[^"\r\n]*"|'[^'\r\n]*'/,
greedy: true
},
'virtual-key': {
pattern: /\[\s*(?:(?:ALT|CAPS|CTRL|LALT|LCTRL|NCAPS|RALT|RCTRL|SHIFT)\s+)*(?:[TKU]_[\w?]+|[A-E]\d\d?|"[^"\r\n]*"|'[^'\r\n]*')\s*\]/i,
greedy: true,
alias: 'function' // alias for styles
},

// https://help.keyman.com/developer/language/guide/headers
'header-keyword': {
pattern: /&\w+/,
alias: 'bold' // alias for styles
},
'header-statement': {
pattern: /\b(?:bitmap|bitmaps|caps always off|caps on only|copyright|hotkey|language|layout|message|name|shift frees caps|version)\b/i,
alias: 'bold' // alias for styles
},

'rule-keyword': {
pattern: /\b(?:any|baselayout|beep|call|context|deadkey|dk|if|index|layer|notany|nul|outs|platform|reset|return|save|set|store|use)\b/i,
alias: 'keyword'
},
'structural-keyword': {
pattern: /\b(?:ansi|begin|group|match|nomatch|unicode|using keys)\b/i,
alias: 'keyword'
},

'compile-target': {
pattern: /\$(?:keyman|keymanonly|keymanweb|kmfl|weaver):/i,
alias: 'property'
},

// U+####, x###, d### characters and numbers
'number': /\b(?:U\+[\dA-F]+|d\d+|x[\da-f]+|\d+)\b/i,
'operator': /[+>\\$]|\.\./,
'punctuation': /[()=,]/
};
2 changes: 1 addition & 1 deletion components/prism-keyman.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 0 additions & 15 deletions tests/languages/keyman/atrule_feature.test

This file was deleted.

59 changes: 0 additions & 59 deletions tests/languages/keyman/bold_feature.test

This file was deleted.

27 changes: 27 additions & 0 deletions tests/languages/keyman/compile-target_feature.test
@@ -0,0 +1,27 @@
$keyman:
$kmfl:
$weaver:
$keymanweb:
$keymanonly:

c Note: return statement is only supported in .kmx in Keyman 13
$keymanonly: + 'a' > 'a' return

----------------------------------------------------

[
["compile-target", "$keyman:"],
["compile-target", "$kmfl:"],
["compile-target", "$weaver:"],
["compile-target", "$keymanweb:"],
["compile-target", "$keymanonly:"],

["comment", "c Note: return statement is only supported in .kmx in Keyman 13"],

["compile-target", "$keymanonly:"],
["operator", "+"],
["string", "'a'"],
["operator", ">"],
["string", "'a'"],
["rule-keyword", "return"]
]
39 changes: 0 additions & 39 deletions tests/languages/keyman/function_feature.test

This file was deleted.

59 changes: 59 additions & 0 deletions tests/languages/keyman/header-keyword.test
@@ -0,0 +1,59 @@
&baselayout
&bitmap
&capsononly
&capsalwaysoff
&shiftfreescaps
&copyright
&ethnologuecode
&hotkey
&includecodes
&keyboardversion
&kmw_embedcss
&kmw_embedjs
&kmw_helpfile
&kmw_helptext
&kmw_rtl
&language
&layer
&layoutfile
&message
&mnemoniclayout
&name
&oldcharposmatching
&platform
&targets
&version
&visualkeyboard
&windowslanguages

----------------------------------------------------

[
["header-keyword", "&baselayout"],
["header-keyword", "&bitmap"],
["header-keyword", "&capsononly"],
["header-keyword", "&capsalwaysoff"],
["header-keyword", "&shiftfreescaps"],
["header-keyword", "&copyright"],
["header-keyword", "&ethnologuecode"],
["header-keyword", "&hotkey"],
["header-keyword", "&includecodes"],
["header-keyword", "&keyboardversion"],
["header-keyword", "&kmw_embedcss"],
["header-keyword", "&kmw_embedjs"],
["header-keyword", "&kmw_helpfile"],
["header-keyword", "&kmw_helptext"],
["header-keyword", "&kmw_rtl"],
["header-keyword", "&language"],
["header-keyword", "&layer"],
["header-keyword", "&layoutfile"],
["header-keyword", "&message"],
["header-keyword", "&mnemoniclayout"],
["header-keyword", "&name"],
["header-keyword", "&oldcharposmatching"],
["header-keyword", "&platform"],
["header-keyword", "&targets"],
["header-keyword", "&version"],
["header-keyword", "&visualkeyboard"],
["header-keyword", "&windowslanguages"]
]
29 changes: 29 additions & 0 deletions tests/languages/keyman/header-statement.test
@@ -0,0 +1,29 @@
bitmap
bitmaps
caps on only
caps always off
shift frees caps
copyright
hotkey
language
layout
message
name
version

----------------------------------------------------

[
["header-statement", "bitmap"],
["header-statement", "bitmaps"],
["header-statement", "caps on only"],
["header-statement", "caps always off"],
["header-statement", "shift frees caps"],
["header-statement", "copyright"],
["header-statement", "hotkey"],
["header-statement", "language"],
["header-statement", "layout"],
["header-statement", "message"],
["header-statement", "name"],
["header-statement", "version"]
]
21 changes: 0 additions & 21 deletions tests/languages/keyman/keyword_feature.test

This file was deleted.

16 changes: 9 additions & 7 deletions tests/languages/keyman/operator_feature.test
@@ -1,15 +1,17 @@
+ >
\ ,
( )
+ > \

$vowel_a
'a' .. 'z'

----------------------------------------------------

[
["operator", "+"], ["operator", ">"],
["operator", "\\"], ["operator", ","],
["operator", "("], ["operator", ")"]
["operator", "+"], ["operator", ">"], ["operator", "\\"],

["operator", "$"], "vowel_a\r\n",
["string", "'a'"], ["operator", ".."], ["string", "'z'"]
]

----------------------------------------------------

Checks for all operators.
Checks for all operators.
9 changes: 9 additions & 0 deletions tests/languages/keyman/punctuation_feature.test
@@ -0,0 +1,9 @@
( )
, =

----------------------------------------------------

[
["punctuation", "("], ["punctuation", ")"],
["punctuation", ","], ["punctuation", "="]
]