Commit 0c139d1f5cf630fc3f90e851ca3ff8b0c57b0864

Golmote 2018-03-26T21:05:43

Puppet: Make heredoc, comments, regexps and strings greedy. Update known failures and tests.

diff --git a/components/prism-puppet.js b/components/prism-puppet.js
index 3cb50d3..246129c 100644
--- a/components/prism-puppet.js
+++ b/components/prism-puppet.js
@@ -16,6 +16,7 @@
 			{
 				pattern: /(@\(([^"\r\n\/):]+)(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r))*?[ \t]*\|?[ \t]*-?[ \t]*\2/,
 				lookbehind: true,
+				greedy: true,
 				alias: 'string',
 				inside: {
 					// Matches the end tag
@@ -37,12 +38,14 @@
 		'multiline-comment': {
 			pattern: /(^|[^\\])\/\*[\s\S]*?\*\//,
 			lookbehind: true,
+			greedy: true,
 			alias: 'comment'
 		},
 		'regex': {
 			// Must be prefixed with the keyword "node" or a non-word char
 			pattern: /((?:\bnode\s+|[~=\(\[\{,]\s*|[=+]>\s*|^\s*))\/(?:[^\/\\]|\\[\s\S])+\/(?:[imx]+\b|\B)/,
 			lookbehind: true,
+			greedy: true,
 			inside: {
 				// Extended regexes must have the x flag. They can contain single-line comments.
 				'extended-regex': {
@@ -55,11 +58,13 @@
 		},
 		'comment': {
 			pattern: /(^|[^\\])#.*/,
-			lookbehind: true
+			lookbehind: true,
+			greedy: true,
 		},
 		'string': {
 			// Allow for one nested level of double quotes inside interpolation
 			pattern: /(["'])(?:\$\{(?:[^'"}]|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}|(?!\1)[^\\]|\\[\s\S])*\1/,
+			greedy: true,
 			inside: {
 				'double-quoted': {
 					pattern: /^"[\s\S]*"$/,
diff --git a/components/prism-puppet.min.js b/components/prism-puppet.min.js
index 6cfcb77..fcb5aff 100644
--- a/components/prism-puppet.min.js
+++ b/components/prism-puppet.min.js
@@ -1 +1 @@
-!function(e){e.languages.puppet={heredoc:[{pattern:/(@\("([^"\r\n\/):]+)"(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r))*?[ \t]*\|?[ \t]*-?[ \t]*\2/,lookbehind:!0,alias:"string",inside:{punctuation:/(?=\S).*\S(?= *$)/}},{pattern:/(@\(([^"\r\n\/):]+)(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r))*?[ \t]*\|?[ \t]*-?[ \t]*\2/,lookbehind:!0,alias:"string",inside:{punctuation:/(?=\S).*\S(?= *$)/}},{pattern:/@\("?(?:[^"\r\n\/):]+)"?(?:\/[nrts$uL]*)?\)/,alias:"string",inside:{punctuation:{pattern:/(\().+?(?=\))/,lookbehind:!0}}}],"multiline-comment":{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0,alias:"comment"},regex:{pattern:/((?:\bnode\s+|[~=\(\[\{,]\s*|[=+]>\s*|^\s*))\/(?:[^\/\\]|\\[\s\S])+\/(?:[imx]+\b|\B)/,lookbehind:!0,inside:{"extended-regex":{pattern:/^\/(?:[^\/\\]|\\[\s\S])+\/[im]*x[im]*$/,inside:{comment:/#.*/}}}},comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},string:{pattern:/(["'])(?:\$\{(?:[^'"}]|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}|(?!\1)[^\\]|\\[\s\S])*\1/,inside:{"double-quoted":{pattern:/^"[\s\S]*"$/,inside:{}}}},variable:{pattern:/\$(?:::)?\w+(?:::\w+)*/,inside:{punctuation:/::/}},"attr-name":/(?:\w+|\*)(?=\s*=>)/,"function":[{pattern:/(\.)(?!\d)\w+/,lookbehind:!0},/\b(?:contain|debug|err|fail|include|info|notice|realize|require|tag|warning)\b|\b(?!\d)\w+(?=\()/],number:/\b(?:0x[a-f\d]+|\d+(?:\.\d+)?(?:e-?\d+)?)\b/i,"boolean":/\b(?:true|false)\b/,keyword:/\b(?:application|attr|case|class|consumes|default|define|else|elsif|function|if|import|inherits|node|private|produces|type|undef|unless)\b/,datatype:{pattern:/\b(?:Any|Array|Boolean|Callable|Catalogentry|Class|Collection|Data|Default|Enum|Float|Hash|Integer|NotUndef|Numeric|Optional|Pattern|Regexp|Resource|Runtime|Scalar|String|Struct|Tuple|Type|Undef|Variant)\b/,alias:"symbol"},operator:/=[=~>]?|![=~]?|<(?:<\|?|[=~|-])?|>[>=]?|->?|~>|\|>?>?|[*\/%+?]|\b(?:and|in|or)\b/,punctuation:/[\[\]{}().,;]|:+/};var n=[{pattern:/(^|[^\\])\$\{(?:[^'"{}]|\{[^}]*\}|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}/,lookbehind:!0,inside:{"short-variable":{pattern:/(^\$\{)(?!\w+\()(?:::)?\w+(?:::\w+)*/,lookbehind:!0,alias:"variable",inside:{punctuation:/::/}},delimiter:{pattern:/^\$/,alias:"variable"},rest:e.languages.puppet}},{pattern:/(^|[^\\])\$(?:::)?\w+(?:::\w+)*/,lookbehind:!0,alias:"variable",inside:{punctuation:/::/}}];e.languages.puppet.heredoc[0].inside.interpolation=n,e.languages.puppet.string.inside["double-quoted"].inside.interpolation=n}(Prism);
\ No newline at end of file
+!function(e){e.languages.puppet={heredoc:[{pattern:/(@\("([^"\r\n\/):]+)"(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r))*?[ \t]*\|?[ \t]*-?[ \t]*\2/,lookbehind:!0,alias:"string",inside:{punctuation:/(?=\S).*\S(?= *$)/}},{pattern:/(@\(([^"\r\n\/):]+)(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r))*?[ \t]*\|?[ \t]*-?[ \t]*\2/,lookbehind:!0,greedy:!0,alias:"string",inside:{punctuation:/(?=\S).*\S(?= *$)/}},{pattern:/@\("?(?:[^"\r\n\/):]+)"?(?:\/[nrts$uL]*)?\)/,alias:"string",inside:{punctuation:{pattern:/(\().+?(?=\))/,lookbehind:!0}}}],"multiline-comment":{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0,greedy:!0,alias:"comment"},regex:{pattern:/((?:\bnode\s+|[~=\(\[\{,]\s*|[=+]>\s*|^\s*))\/(?:[^\/\\]|\\[\s\S])+\/(?:[imx]+\b|\B)/,lookbehind:!0,greedy:!0,inside:{"extended-regex":{pattern:/^\/(?:[^\/\\]|\\[\s\S])+\/[im]*x[im]*$/,inside:{comment:/#.*/}}}},comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},string:{pattern:/(["'])(?:\$\{(?:[^'"}]|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}|(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0,inside:{"double-quoted":{pattern:/^"[\s\S]*"$/,inside:{}}}},variable:{pattern:/\$(?:::)?\w+(?:::\w+)*/,inside:{punctuation:/::/}},"attr-name":/(?:\w+|\*)(?=\s*=>)/,"function":[{pattern:/(\.)(?!\d)\w+/,lookbehind:!0},/\b(?:contain|debug|err|fail|include|info|notice|realize|require|tag|warning)\b|\b(?!\d)\w+(?=\()/],number:/\b(?:0x[a-f\d]+|\d+(?:\.\d+)?(?:e-?\d+)?)\b/i,"boolean":/\b(?:true|false)\b/,keyword:/\b(?:application|attr|case|class|consumes|default|define|else|elsif|function|if|import|inherits|node|private|produces|type|undef|unless)\b/,datatype:{pattern:/\b(?:Any|Array|Boolean|Callable|Catalogentry|Class|Collection|Data|Default|Enum|Float|Hash|Integer|NotUndef|Numeric|Optional|Pattern|Regexp|Resource|Runtime|Scalar|String|Struct|Tuple|Type|Undef|Variant)\b/,alias:"symbol"},operator:/=[=~>]?|![=~]?|<(?:<\|?|[=~|-])?|>[>=]?|->?|~>|\|>?>?|[*\/%+?]|\b(?:and|in|or)\b/,punctuation:/[\[\]{}().,;]|:+/};var n=[{pattern:/(^|[^\\])\$\{(?:[^'"{}]|\{[^}]*\}|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}/,lookbehind:!0,inside:{"short-variable":{pattern:/(^\$\{)(?!\w+\()(?:::)?\w+(?:::\w+)*/,lookbehind:!0,alias:"variable",inside:{punctuation:/::/}},delimiter:{pattern:/^\$/,alias:"variable"},rest:e.languages.puppet}},{pattern:/(^|[^\\])\$(?:::)?\w+(?:::\w+)*/,lookbehind:!0,alias:"variable",inside:{punctuation:/::/}}];e.languages.puppet.heredoc[0].inside.interpolation=n,e.languages.puppet.string.inside["double-quoted"].inside.interpolation=n}(Prism);
\ No newline at end of file
diff --git a/examples/prism-puppet.html b/examples/prism-puppet.html
index 963f95d..4892ab8 100644
--- a/examples/prism-puppet.html
+++ b/examples/prism-puppet.html
@@ -145,19 +145,6 @@ Exec <| title == 'update_migrations' |> {
 	If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug.
 </p>
 
-<h3>Comments, regular expressions or substrings that look like heredoc strings</h3>
-<pre><code>/* @(foo) */
-# @(foo)
-" @(foo) "
-$foo = /@(foo)/</code></pre>
-
-<h3>Single-line comments or substrings that look like multi-line comments</h3>
-<pre><code># foo /* bar */ baz
-"foo /* bar */ baz"</code></pre>
-
-<h3>Substrings that look like single-line comment</h3>
-<pre><code>"foo #bar baz"</code></pre>
-
 <h3>More than one level of nested braces inside interpolation</h3>
 <pre><code>"Foobar ${foo({
     bar => {baz => 42}
diff --git a/tests/languages/puppet/comment_feature.test b/tests/languages/puppet/comment_feature.test
index 584799e..add84b6 100644
--- a/tests/languages/puppet/comment_feature.test
+++ b/tests/languages/puppet/comment_feature.test
@@ -2,13 +2,19 @@
 # Foobar
 /* Foo
 bar */
+/* @(foo) */
+# @(foo)
+# foo /* bar */ baz
 
 ----------------------------------------------------
 
 [
 	["comment", "#"],
 	["comment", "# Foobar"],
-	["multiline-comment", "/* Foo\r\nbar */"]
+	["multiline-comment", "/* Foo\r\nbar */"],
+	["multiline-comment", "/* @(foo) */"],
+	["comment", "# @(foo)"],
+	["comment", "# foo /* bar */ baz"]
 ]
 
 ----------------------------------------------------
diff --git a/tests/languages/puppet/regex_feature.test b/tests/languages/puppet/regex_feature.test
index bc70349..c98c083 100644
--- a/tests/languages/puppet/regex_feature.test
+++ b/tests/languages/puppet/regex_feature.test
@@ -5,6 +5,7 @@ bar # baz
 $foo = /foo
 bar # baz
 /ixm
+$foo = /@(foo)/
 
 ----------------------------------------------------
 
@@ -20,7 +21,9 @@ bar # baz
 			["comment", "# baz"],
 			"\r\n/ixm"
 		]]
-	]]
+	]],
+	["variable", ["$foo"]], ["operator", "="],
+	["regex", ["/@(foo)/"]]
 ]
 
 ----------------------------------------------------
diff --git a/tests/languages/puppet/string_feature.test b/tests/languages/puppet/string_feature.test
index 8589104..584e2a7 100644
--- a/tests/languages/puppet/string_feature.test
+++ b/tests/languages/puppet/string_feature.test
@@ -8,6 +8,9 @@ baz'
 "foo
 $bar
 baz"
+" @(foo) "
+"foo /* bar */ baz"
+"foo #bar baz"
 
 ----------------------------------------------------
 
@@ -21,7 +24,10 @@ baz"
 		"\"foo\r\n",
 		["interpolation", ["$bar"]],
 		"\r\nbaz\""
-	]]]]
+	]]]],
+	["string", [["double-quoted", ["\" @(foo) \""]]]],
+	["string", [["double-quoted", ["\"foo /* bar */ baz\""]]]],
+	["string", [["double-quoted", ["\"foo #bar baz\""]]]]
 ]
 
 ----------------------------------------------------