Commit 64a48377d71a56e8dca69148a1a93f7539e31447

Rob Fletcher 2014-04-11T13:55:50

Supports "dollar-slashy" string syntax introduced in Groovy 1.8. Also some fixes for compatibility with latest version of Prism.

diff --git a/components/prism-groovy.js b/components/prism-groovy.js
index 61a6588..4b14e37 100644
--- a/components/prism-groovy.js
+++ b/components/prism-groovy.js
@@ -1,24 +1,37 @@
 Prism.languages.groovy = Prism.languages.extend('clike', {
 	'keyword': /\b(as|def|in|abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/g,
-	'string': /("""|''')[\W\w]*?\1|("|'|\/)[\W\w]*?\2/g,
+	'string': /("""|''')[\W\w]*?\1|("|'|\/)[\W\w]*?\2|(\$\/)(\$\/\$|[\W\w])*?\/\$/g,
 	'number': /\b0b[01_]+\b|\b0x[\da-f_]+(\.[\da-f_p\-]+)?\b|\b[\d_]+(\.[\d_]+[e]?[\d]*)?[glidf]\b|[\d_]+(\.[\d_]+)?\b/gi,
-	'operator': /={0,2}~|\?\.|\*?\.@|\.&|\.(?=\w)|\.{2}(<)?(?=\w)|->|\?:|[-+]{1,2}|!|<=>|(>){1,3}|(<){1,2}|={1,2}|(&){1,2}|\|{1,2}|\?|\*{1,2}|\/|\^|%/g,
-	'punctuation': /\.+|[{}[\];(),:$]/g,
-	'annotation': /@\w+/
+	'operator': {
+		pattern: /(^|[^.])(={0,2}~|\?\.|\*?\.@|\.&|\.{1,2}(?!\.)|\.{2}(<)?(?=\w)|->|\?:|[-+]{1,2}|!|<=>|>{1,3}|(<){1,2}|={1,2}|(&){1,2}|\|{1,2}|\?|\*{1,2}|\/|\^|%)/g,
+		lookbehind: true
+	},
+	'punctuation': /\.+|[{}[\];(),:$]/g
 });
 
 Prism.languages.insertBefore('groovy', 'punctuation', {
 	'spock-block': /\b(setup|given|when|then|and|cleanup|expect|where):/g
 });
 
+Prism.languages.insertBefore('groovy', 'function', {
+	'annotation': {
+		pattern: /(^|[^.])@\w+/,
+		lookbehind: true
+	}
+});
+
 Prism.hooks.add('wrap', function(env) {
 	if (env.language === 'groovy' && env.type === 'string') {
 		var delimiter = env.content[0];
 
 		if (delimiter != "'") {
+			var pattern = /([^\\])(\$(\{.*?\}|[\w\.]+))/;
+			if (delimiter === '$') {
+				pattern = /([^\$])(\$(\{.*?\}|[\w\.]+))/;
+			}
 			env.content = Prism.highlight(env.content, {
 				'expression': {
-					pattern: /([^\\])(\$(\{.*?\}|[\w\.]*))/,
+					pattern: pattern,
 					lookbehind: true,
 					inside: Prism.languages.groovy
 				}
diff --git a/components/prism-groovy.min.js b/components/prism-groovy.min.js
index 84c8e3c..3754dc1 100644
--- a/components/prism-groovy.min.js
+++ b/components/prism-groovy.min.js
@@ -1 +1 @@
-Prism.languages.groovy=Prism.languages.extend("clike",{keyword:/\b(as|def|in|abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/g,string:/("""|''')[\W\w]*?\1|("|'|\/)[\W\w]*?\2/g,number:/\b0b[01_]+\b|\b0x[\da-f_]+(\.[\da-f_p\-]+)?\b|\b[\d_]+(\.[\d_]+[e]?[\d]*)?[glidf]\b|[\d_]+(\.[\d_]+)?\b/gi,operator:/={0,2}~|\?\.|\*?\.@|\.&|\.(?=\w)|\.{2}(<)?(?=\w)|->|\?:|[-+]{1,2}|!|<=>|(>){1,3}|(<){1,2}|={1,2}|(&){1,2}|\|{1,2}|\?|\*{1,2}|\/|\^|%/g,punctuation:/\.+|[{}[\];(),:$]/g,annotation:/@\w+/});Prism.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(setup|given|when|then|and|cleanup|expect|where):/g});Prism.hooks.add("wrap",function(e){if(e.language==="groovy"&&e.type==="string"){var t=e.content[0];if(t!="'"){e.content=Prism.highlight(e.content,{expression:{pattern:/([^\\])(\$(\{.*?\}|[\w\.]*))/,lookbehind:!0,inside:Prism.languages.groovy}});e.classes.push(t==="/"?"regex":"gstring")}}});
+Prism.languages.groovy=Prism.languages.extend("clike",{keyword:/\b(as|def|in|abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/g,string:/("""|''')[\W\w]*?\1|("|'|\/)[\W\w]*?\2|(\$\/)(\$\/\$|[\W\w])*?\/\$/g,number:/\b0b[01_]+\b|\b0x[\da-f_]+(\.[\da-f_p\-]+)?\b|\b[\d_]+(\.[\d_]+[e]?[\d]*)?[glidf]\b|[\d_]+(\.[\d_]+)?\b/gi,operator:{pattern:/(^|[^.])(={0,2}~|\?\.|\*?\.@|\.&|\.{1,2}(?!\.)|\.{2}(<)?(?=\w)|->|\?:|[-+]{1,2}|!|<=>|>{1,3}|(<){1,2}|={1,2}|(&){1,2}|\|{1,2}|\?|\*{1,2}|\/|\^|%)/g,lookbehind:true},punctuation:/\.+|[{}[\];(),:$]/g});Prism.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(setup|given|when|then|and|cleanup|expect|where):/g});Prism.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:true}});Prism.hooks.add("wrap",function(e){if(e.language==="groovy"&&e.type==="string"){var t=e.content[0];if(t!="'"){var n=/([^\\])(\$(\{.*?\}|[\w\.]+))/;if(t==="$"){n=/([^\$])(\$(\{.*?\}|[\w\.]+))/}e.content=Prism.highlight(e.content,{expression:{pattern:n,lookbehind:true,inside:Prism.languages.groovy}});e.classes.push(t==="/"?"regex":"gstring")}}});