Commit 9acaaa15f861c38e50aad6a99ba52724b840857e

Andreas Rohner 2015-10-02T14:54:17

Remove Clike dependency from Bash The Bash language is actually very different from Clike. Only 'boolean', 'operator' and 'punctuation' are shared between them. 'operator' and 'punctuation' should be changed in the future, because Bash actually has slightly different operators. Since they share almost nothing, it makes sense to remove the dependency. This patch copies 'boolean', 'operator' and 'punctuation' from Clike, but doesn't change them. This patch also fixes a typo and adds the missing built-in keyword `let`. `let` is not in the POSIX-standard, but Bash and some other shells support it.

diff --git a/components.js b/components.js
index 39e5bdc..4a10f44 100644
--- a/components.js
+++ b/components.js
@@ -94,7 +94,6 @@ var components = {
 		},
 		"bash": {
 			"title": "Bash",
-			"require": "clike",
 			"owner": "zeitgeist87"
 		},
 		"basic": {
diff --git a/components/prism-bash.js b/components/prism-bash.js
index 1d99418..64b42f6 100644
--- a/components/prism-bash.js
+++ b/components/prism-bash.js
@@ -1,9 +1,12 @@
 (function(Prism) {
-	var bashVars = {
-		variable: /\$(?:[a-zA-Z0-9_#\?\-\*!@]+|\{[^}]+\})/
-	};
+	var varsRegex = /\$(?:[a-z0-9_#\?\-\*!@]+|\{[^}]+\})/i,
+	    bashVars = { variable: varsRegex };
 
-	Prism.languages.bash = Prism.languages.extend('clike', {
+	Prism.languages.bash = {
+		'shebang': {
+			pattern: /^#!\s*\/bin\/bash|^#!\s*\/bin\/sh/,
+			alias: 'important'
+		},
 		'comment': {
 			pattern: /(^|[^"{\\])#.*/,
 			lookbehind: true
@@ -15,7 +18,7 @@
 			},
 			// Single quote strings cannot have variables inside
 			/'(?:\\?[\s\S])*?'/g,
-			// Support for Here-Dokuments https://en.wikipedia.org/wiki/Here_document
+			// Support for Here-Documents https://en.wikipedia.org/wiki/Here_document
 			{
 				pattern: /(<<\s*)(\w+?)\s*\r?\n(?:[\s\S])*?\r?\n\2/g,
 				lookbehind: true,
@@ -27,17 +30,12 @@
 			pattern: /([^\w\.])-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?)\b/,
 			lookbehind: true
 		},
+		'variable': varsRegex,
 		// Originally based on http://ss64.com/bash/
 		'function': /\b(?:alias|apropos|apt-get|aptitude|aspell|awk|basename|bash|bc|bg|builtin|bzip2|cal|cat|cd|cfdisk|chgrp|chmod|chown|chroot|chkconfig|cksum|clear|cmp|comm|command|cp|cron|crontab|csplit|cut|date|dc|dd|ddrescue|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|enable|env|ethtool|eval|exec|expand|expect|export|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|getopts|git|grep|groupadd|groupdel|groupmod|groups|gzip|hash|head|help|hg|history|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|jobs|join|kill|killall|less|link|ln|locate|logname|logout|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|make|man|mkdir|mkfifo|mkisofs|mknod|more|most|mount|mtools|mtr|mv|mmv|nano|netstat|nice|nl|nohup|notify-send|nslookup|open|op|passwd|paste|pathchk|ping|pkill|popd|pr|printcap|printenv|printf|ps|pushd|pv|pwd|quota|quotacheck|quotactl|ram|rar|rcp|read|readarray|readonly|reboot|rename|renice|remsync|rev|rm|rmdir|rsync|screen|scp|sdiff|sed|seq|service|sftp|shift|shopt|shutdown|sleep|slocate|sort|source|split|ssh|stat|strace|su|sudo|sum|suspend|sync|tail|tar|tee|test|time|timeout|times|touch|top|traceroute|trap|tr|tsort|tty|type|ulimit|umask|umount|unalias|uname|unexpand|uniq|units|unrar|unshar|uptime|useradd|userdel|usermod|users|uuencode|uudecode|v|vdir|vi|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yes|zip)\b/,
-		'keyword': /\b(if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)\b/
-	});
-
-	Prism.languages.insertBefore('bash', 'keyword', bashVars);
-	Prism.languages.insertBefore('bash', 'comment', {
-		// Shebang must be before comment
-		shebang: {
-			pattern: /^#!\s*\/bin\/bash|^#!\s*\/bin\/sh/,
-			alias: 'important'
-		}
-	});
+		'keyword': /\b(let|if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)\b/,
+		'boolean': /\b(?:true|false)\b/,
+		'operator': /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,
+		'punctuation': /[{}[\];(),.:]/
+	};
 })(Prism);
\ No newline at end of file
diff --git a/components/prism-bash.min.js b/components/prism-bash.min.js
index 515dc97..f9902e0 100644
--- a/components/prism-bash.min.js
+++ b/components/prism-bash.min.js
@@ -1 +1 @@
-!function(e){var t={variable:/\$(?:[a-zA-Z0-9_#\?\-\*!@]+|\{[^}]+\})/};e.languages.bash=e.languages.extend("clike",{comment:{pattern:/(^|[^"{\\])#.*/,lookbehind:!0},string:[{pattern:/"(?:\\?[\s\S])*?"/g,inside:t},/'(?:\\?[\s\S])*?'/g,{pattern:/(<<\s*)(\w+?)\s*\r?\n(?:[\s\S])*?\r?\n\2/g,lookbehind:!0,inside:t}],number:{pattern:/([^\w\.])-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?)\b/,lookbehind:!0},"function":/\b(?:alias|apropos|apt-get|aptitude|aspell|awk|basename|bash|bc|bg|builtin|bzip2|cal|cat|cd|cfdisk|chgrp|chmod|chown|chroot|chkconfig|cksum|clear|cmp|comm|command|cp|cron|crontab|csplit|cut|date|dc|dd|ddrescue|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|enable|env|ethtool|eval|exec|expand|expect|export|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|getopts|git|grep|groupadd|groupdel|groupmod|groups|gzip|hash|head|help|hg|history|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|jobs|join|kill|killall|less|link|ln|locate|logname|logout|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|make|man|mkdir|mkfifo|mkisofs|mknod|more|most|mount|mtools|mtr|mv|mmv|nano|netstat|nice|nl|nohup|notify-send|nslookup|open|op|passwd|paste|pathchk|ping|pkill|popd|pr|printcap|printenv|printf|ps|pushd|pv|pwd|quota|quotacheck|quotactl|ram|rar|rcp|read|readarray|readonly|reboot|rename|renice|remsync|rev|rm|rmdir|rsync|screen|scp|sdiff|sed|seq|service|sftp|shift|shopt|shutdown|sleep|slocate|sort|source|split|ssh|stat|strace|su|sudo|sum|suspend|sync|tail|tar|tee|test|time|timeout|times|touch|top|traceroute|trap|tr|tsort|tty|type|ulimit|umask|umount|unalias|uname|unexpand|uniq|units|unrar|unshar|uptime|useradd|userdel|usermod|users|uuencode|uudecode|v|vdir|vi|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yes|zip)\b/,keyword:/\b(if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)\b/}),e.languages.insertBefore("bash","keyword",t),e.languages.insertBefore("bash","comment",{shebang:{pattern:/^#!\s*\/bin\/bash|^#!\s*\/bin\/sh/,alias:"important"}})}(Prism);
\ No newline at end of file
+!function(e){var t=/\$(?:[a-z0-9_#\?\-\*!@]+|\{[^}]+\})/i,o={variable:t};e.languages.bash={shebang:{pattern:/^#!\s*\/bin\/bash|^#!\s*\/bin\/sh/,alias:"important"},comment:{pattern:/(^|[^"{\\])#.*/,lookbehind:!0},string:[{pattern:/"(?:\\?[\s\S])*?"/g,inside:o},/'(?:\\?[\s\S])*?'/g,{pattern:/(<<\s*)(\w+?)\s*\r?\n(?:[\s\S])*?\r?\n\2/g,lookbehind:!0,inside:o}],number:{pattern:/([^\w\.])-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?)\b/,lookbehind:!0},variable:t,"function":/\b(?:alias|apropos|apt-get|aptitude|aspell|awk|basename|bash|bc|bg|builtin|bzip2|cal|cat|cd|cfdisk|chgrp|chmod|chown|chroot|chkconfig|cksum|clear|cmp|comm|command|cp|cron|crontab|csplit|cut|date|dc|dd|ddrescue|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|enable|env|ethtool|eval|exec|expand|expect|export|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|getopts|git|grep|groupadd|groupdel|groupmod|groups|gzip|hash|head|help|hg|history|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|jobs|join|kill|killall|less|link|ln|locate|logname|logout|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|make|man|mkdir|mkfifo|mkisofs|mknod|more|most|mount|mtools|mtr|mv|mmv|nano|netstat|nice|nl|nohup|notify-send|nslookup|open|op|passwd|paste|pathchk|ping|pkill|popd|pr|printcap|printenv|printf|ps|pushd|pv|pwd|quota|quotacheck|quotactl|ram|rar|rcp|read|readarray|readonly|reboot|rename|renice|remsync|rev|rm|rmdir|rsync|screen|scp|sdiff|sed|seq|service|sftp|shift|shopt|shutdown|sleep|slocate|sort|source|split|ssh|stat|strace|su|sudo|sum|suspend|sync|tail|tar|tee|test|time|timeout|times|touch|top|traceroute|trap|tr|tsort|tty|type|ulimit|umask|umount|unalias|uname|unexpand|uniq|units|unrar|unshar|uptime|useradd|userdel|usermod|users|uuencode|uudecode|v|vdir|vi|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yes|zip)\b/,keyword:/\b(let|if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)\b/,"boolean":/\b(?:true|false)\b/,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/}}(Prism);
\ No newline at end of file