Commit a3905c045b338968edb477c35f72f30c5e855edb

Michael Schmidt 2021-12-10T14:29:08

OZ: Improved tokenization (#3240)

diff --git a/components/prism-oz.js b/components/prism-oz.js
index 61e1794..257fe3c 100644
--- a/components/prism-oz.js
+++ b/components/prism-oz.js
@@ -1,5 +1,8 @@
 Prism.languages.oz = {
-	'comment': /\/\*[\s\S]*?\*\/|%.*/,
+	'comment': {
+		pattern: /\/\*[\s\S]*?\*\/|%.*/,
+		greedy: true
+	},
 	'string': {
 		pattern: /"(?:[^"\\]|\\[\s\S])*"/,
 		greedy: true
@@ -18,8 +21,8 @@ Prism.languages.oz = {
 		}
 	],
 	'number': /\b(?:0[bx][\da-f]+|\d+(?:\.\d*)?(?:e~?\d+)?)\b|&(?:[^\\]|\\(?:\d{3}|.))/i,
-	'variable': /\b[A-Z][A-Za-z\d]*|`(?:[^`\\]|\\.)+`/,
-	'attr-name': /\b\w+(?=:)/,
+	'variable': /`(?:[^`\\]|\\.)+`/,
+	'attr-name': /\b\w+(?=[ \t]*:(?![:=]))/,
 	'operator': /:(?:=|::?)|<[-:=]?|=(?:=|<?:?)|>=?:?|\\=:?|!!?|[|#+\-*\/,~^@]|\b(?:andthen|div|mod|orelse)\b/,
 	'punctuation': /[\[\](){}.:;?]/
 };
diff --git a/components/prism-oz.min.js b/components/prism-oz.min.js
index e74c21c..45b826b 100644
--- a/components/prism-oz.min.js
+++ b/components/prism-oz.min.js
@@ -1 +1 @@
-Prism.languages.oz={comment:/\/\*[\s\S]*?\*\/|%.*/,string:{pattern:/"(?:[^"\\]|\\[\s\S])*"/,greedy:!0},atom:{pattern:/'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,alias:"builtin"},keyword:/\$|\[\]|\b(?:_|at|attr|case|catch|choice|class|cond|declare|define|dis|else(?:case|if)?|end|export|fail|false|feat|finally|from|fun|functor|if|import|in|local|lock|meth|nil|not|of|or|prepare|proc|prop|raise|require|self|skip|then|thread|true|try|unit)\b/,function:[/\b[a-z][A-Za-z\d]*(?=\()/,{pattern:/(\{)[A-Z][A-Za-z\d]*\b/,lookbehind:!0}],number:/\b(?:0[bx][\da-f]+|\d+(?:\.\d*)?(?:e~?\d+)?)\b|&(?:[^\\]|\\(?:\d{3}|.))/i,variable:/\b[A-Z][A-Za-z\d]*|`(?:[^`\\]|\\.)+`/,"attr-name":/\b\w+(?=:)/,operator:/:(?:=|::?)|<[-:=]?|=(?:=|<?:?)|>=?:?|\\=:?|!!?|[|#+\-*\/,~^@]|\b(?:andthen|div|mod|orelse)\b/,punctuation:/[\[\](){}.:;?]/};
\ No newline at end of file
+Prism.languages.oz={comment:{pattern:/\/\*[\s\S]*?\*\/|%.*/,greedy:!0},string:{pattern:/"(?:[^"\\]|\\[\s\S])*"/,greedy:!0},atom:{pattern:/'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,alias:"builtin"},keyword:/\$|\[\]|\b(?:_|at|attr|case|catch|choice|class|cond|declare|define|dis|else(?:case|if)?|end|export|fail|false|feat|finally|from|fun|functor|if|import|in|local|lock|meth|nil|not|of|or|prepare|proc|prop|raise|require|self|skip|then|thread|true|try|unit)\b/,function:[/\b[a-z][A-Za-z\d]*(?=\()/,{pattern:/(\{)[A-Z][A-Za-z\d]*\b/,lookbehind:!0}],number:/\b(?:0[bx][\da-f]+|\d+(?:\.\d*)?(?:e~?\d+)?)\b|&(?:[^\\]|\\(?:\d{3}|.))/i,variable:/`(?:[^`\\]|\\.)+`/,"attr-name":/\b\w+(?=[ \t]*:(?![:=]))/,operator:/:(?:=|::?)|<[-:=]?|=(?:=|<?:?)|>=?:?|\\=:?|!!?|[|#+\-*\/,~^@]|\b(?:andthen|div|mod|orelse)\b/,punctuation:/[\[\](){}.:;?]/};
\ No newline at end of file
diff --git a/tests/languages/oz/attr-name_feature.test b/tests/languages/oz/attr-name_feature.test
index 46dc222..80af8b7 100644
--- a/tests/languages/oz/attr-name_feature.test
+++ b/tests/languages/oz/attr-name_feature.test
@@ -1,14 +1,25 @@
 menubutton(text:'Test' underline:0)
 
+% negative example
+val:=Value
+
 ----------------------------------------------------
 
 [
-	["function", "menubutton"], ["punctuation", "("],
-	["attr-name", "text"], ["punctuation", ":"], ["atom", "'Test'"],
-	["attr-name", "underline"], ["punctuation", ":"], ["number", "0"],
-	["punctuation", ")"]
+	["function", "menubutton"],
+	["punctuation", "("],
+	["attr-name", "text"],
+	["punctuation", ":"],
+	["atom", "'Test'"],
+	["attr-name", "underline"],
+	["punctuation", ":"],
+	["number", "0"],
+	["punctuation", ")"],
+
+	["comment", "% negative example"],
+	"\r\nval", ["operator", ":="], "Value"
 ]
 
 ----------------------------------------------------
 
-Checks for parameter names.
\ No newline at end of file
+Checks for parameter names.
diff --git a/tests/languages/oz/variable_feature.test b/tests/languages/oz/variable_feature.test
index 51274d6..86b9108 100644
--- a/tests/languages/oz/variable_feature.test
+++ b/tests/languages/oz/variable_feature.test
@@ -1,15 +1,7 @@
-A
-Foobar
-Foo42
-
-----------------------------------------------------
-
-[
-	["variable", "A"],
-	["variable", "Foobar"],
-	["variable", "Foo42"]
-]
-
-----------------------------------------------------
-
-Checks for variables.
\ No newline at end of file
+`foo`
+
+----------------------------------------------------
+
+[
+	["variable", "`foo`"]
+]