| Index: lib/src/prism/prism.js
 | 
| diff --git a/lib/src/prism/prism.js b/lib/src/prism/prism.js
 | 
| index 8282b5719342deb6867ec8c6cb797ed545a7c9e0..f575db3ae87b1530b188fdbe7f600f3391dabd5d 100644
 | 
| --- a/lib/src/prism/prism.js
 | 
| +++ b/lib/src/prism/prism.js
 | 
| @@ -145,7 +145,8 @@ var _ = _self.Prism = {
 | 
|  			}
 | 
|  		}
 | 
|  	},
 | 
| -
 | 
| +	plugins: {},
 | 
| +	
 | 
|  	highlightAll: function(async, callback) {
 | 
|  		var elements = document.querySelectorAll('code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code');
 | 
|  
 | 
| @@ -177,18 +178,8 @@ var _ = _self.Prism = {
 | 
|  			parent.className = parent.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
 | 
|  		}
 | 
|  
 | 
| -		if (!grammar) {
 | 
| -			return;
 | 
| -		}
 | 
| -
 | 
|  		var code = element.textContent;
 | 
|  
 | 
| -		if(!code) {
 | 
| -			return;
 | 
| -		}
 | 
| -
 | 
| -		code = code.replace(/^(?:\r?\n|\r)/,'');
 | 
| -
 | 
|  		var env = {
 | 
|  			element: element,
 | 
|  			language: language,
 | 
| @@ -196,13 +187,18 @@ var _ = _self.Prism = {
 | 
|  			code: code
 | 
|  		};
 | 
|  
 | 
| +		if (!code || !grammar) {
 | 
| +			_.hooks.run('complete', env);
 | 
| +			return;
 | 
| +		}
 | 
| +
 | 
|  		_.hooks.run('before-highlight', env);
 | 
|  
 | 
|  		if (async && _self.Worker) {
 | 
|  			var worker = new Worker(_.filename);
 | 
|  
 | 
|  			worker.onmessage = function(evt) {
 | 
| -				env.highlightedCode = Token.stringify(JSON.parse(evt.data), language);
 | 
| +				env.highlightedCode = evt.data;
 | 
|  
 | 
|  				_.hooks.run('before-insert', env);
 | 
|  
 | 
| @@ -210,11 +206,13 @@ var _ = _self.Prism = {
 | 
|  
 | 
|  				callback && callback.call(env.element);
 | 
|  				_.hooks.run('after-highlight', env);
 | 
| +				_.hooks.run('complete', env);
 | 
|  			};
 | 
|  
 | 
|  			worker.postMessage(JSON.stringify({
 | 
|  				language: env.language,
 | 
| -				code: env.code
 | 
| +				code: env.code,
 | 
| +				immediateClose: true
 | 
|  			}));
 | 
|  		}
 | 
|  		else {
 | 
| @@ -227,6 +225,7 @@ var _ = _self.Prism = {
 | 
|  			callback && callback.call(element);
 | 
|  
 | 
|  			_.hooks.run('after-highlight', env);
 | 
| +			_.hooks.run('complete', env);
 | 
|  		}
 | 
|  	},
 | 
|  
 | 
| @@ -385,7 +384,7 @@ Token.stringify = function(o, language, parent) {
 | 
|  	var attributes = '';
 | 
|  
 | 
|  	for (var name in env.attributes) {
 | 
| -		attributes += name + '="' + (env.attributes[name] || '') + '"';
 | 
| +		attributes += (attributes ? ' ' : '') + name + '="' + (env.attributes[name] || '') + '"';
 | 
|  	}
 | 
|  
 | 
|  	return '<' + env.tag + ' class="' + env.classes.join(' ') + '" ' + attributes + '>' + env.content + '</' + env.tag + '>';
 | 
| @@ -401,10 +400,13 @@ if (!_self.document) {
 | 
|  	_self.addEventListener('message', function(evt) {
 | 
|  		var message = JSON.parse(evt.data),
 | 
|  		    lang = message.language,
 | 
| -		    code = message.code;
 | 
| +		    code = message.code,
 | 
| +		    immediateClose = message.immediateClose;
 | 
|  
 | 
| -		_self.postMessage(JSON.stringify(_.util.encode(_.tokenize(code, _.languages[lang]))));
 | 
| -		_self.close();
 | 
| +		_self.postMessage(_.highlight(code, _.languages[lang], lang));
 | 
| +		if (immediateClose) {
 | 
| +			_self.close();
 | 
| +		}
 | 
|  	}, false);
 | 
|  
 | 
|  	return _self.Prism;
 | 
| @@ -431,6 +433,11 @@ if (typeof module !== 'undefined' && module.exports) {
 | 
|  	module.exports = Prism;
 | 
|  }
 | 
|  
 | 
| +// hack for components to work correctly in node.js
 | 
| +if (typeof global !== 'undefined') {
 | 
| +	global.Prism = Prism;
 | 
| +}
 | 
| +
 | 
|  
 | 
|  /* **********************************************
 | 
|       Begin prism-markup.js
 | 
| @@ -442,7 +449,7 @@ Prism.languages.markup = {
 | 
|  	'doctype': /<!DOCTYPE[\w\W]+?>/,
 | 
|  	'cdata': /<!\[CDATA\[[\w\W]*?]]>/i,
 | 
|  	'tag': {
 | 
| -		pattern: /<\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,
 | 
| +		pattern: /<\/?[^\s>\/=.]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,
 | 
|  		inside: {
 | 
|  			'tag': {
 | 
|  				pattern: /^<\/?[^\s>\/]+/i,
 | 
| @@ -478,6 +485,11 @@ Prism.hooks.add('wrap', function(env) {
 | 
|  	}
 | 
|  });
 | 
|  
 | 
| +Prism.languages.xml = Prism.languages.markup;
 | 
| +Prism.languages.html = Prism.languages.markup;
 | 
| +Prism.languages.mathml = Prism.languages.markup;
 | 
| +Prism.languages.svg = Prism.languages.markup;
 | 
| +
 | 
|  
 | 
|  /* **********************************************
 | 
|       Begin prism-css.js
 | 
| @@ -506,14 +518,9 @@ Prism.languages.css['atrule'].inside.rest = Prism.util.clone(Prism.languages.css
 | 
|  if (Prism.languages.markup) {
 | 
|  	Prism.languages.insertBefore('markup', 'tag', {
 | 
|  		'style': {
 | 
| -			pattern: /<style[\w\W]*?>[\w\W]*?<\/style>/i,
 | 
| -			inside: {
 | 
| -				'tag': {
 | 
| -					pattern: /<style[\w\W]*?>|<\/style>/i,
 | 
| -					inside: Prism.languages.markup.tag.inside
 | 
| -				},
 | 
| -				rest: Prism.languages.css
 | 
| -			},
 | 
| +			pattern: /(<style[\w\W]*?>)[\w\W]*?(?=<\/style>)/i,
 | 
| +			lookbehind: true,
 | 
| +			inside: Prism.languages.css,
 | 
|  			alias: 'language-css'
 | 
|  		}
 | 
|  	});
 | 
| @@ -552,9 +559,9 @@ Prism.languages.clike = {
 | 
|  			lookbehind: true
 | 
|  		}
 | 
|  	],
 | 
| -	'string': /("|')(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
 | 
| +	'string': /(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
 | 
|  	'class-name': {
 | 
| -		pattern: /((?:(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i,
 | 
| +		pattern: /((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i,
 | 
|  		lookbehind: true,
 | 
|  		inside: {
 | 
|  			punctuation: /(\.|\\)/
 | 
| @@ -563,8 +570,8 @@ Prism.languages.clike = {
 | 
|  	'keyword': /\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,
 | 
|  	'boolean': /\b(true|false)\b/,
 | 
|  	'function': /[a-z0-9_]+(?=\()/i,
 | 
| -	'number': /\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?)\b/,
 | 
| -	'operator': /[-+]{1,2}|!|<=?|>=?|={1,3}|&{1,2}|\|?\||\?|\*|\/|~|\^|%/,
 | 
| +	'number': /\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,
 | 
| +	'operator': /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,
 | 
|  	'punctuation': /[{}[\];(),.:]/
 | 
|  };
 | 
|  
 | 
| @@ -576,7 +583,8 @@ Prism.languages.clike = {
 | 
|  Prism.languages.javascript = Prism.languages.extend('clike', {
 | 
|  	'keyword': /\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/,
 | 
|  	'number': /\b-?(0x[\dA-Fa-f]+|0b[01]+|0o[0-7]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|Infinity)\b/,
 | 
| -	'function': /(?!\d)[a-z0-9_$]+(?=\()/i
 | 
| +	// Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)
 | 
| +	'function': /[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*(?=\()/i
 | 
|  });
 | 
|  
 | 
|  Prism.languages.insertBefore('javascript', 'keyword', {
 | 
| @@ -608,26 +616,22 @@ Prism.languages.insertBefore('javascript', 'class-name', {
 | 
|  if (Prism.languages.markup) {
 | 
|  	Prism.languages.insertBefore('markup', 'tag', {
 | 
|  		'script': {
 | 
| -			pattern: /<script[\w\W]*?>[\w\W]*?<\/script>/i,
 | 
| -			inside: {
 | 
| -				'tag': {
 | 
| -					pattern: /<script[\w\W]*?>|<\/script>/i,
 | 
| -					inside: Prism.languages.markup.tag.inside
 | 
| -				},
 | 
| -				rest: Prism.languages.javascript
 | 
| -			},
 | 
| +			pattern: /(<script[\w\W]*?>)[\w\W]*?(?=<\/script>)/i,
 | 
| +			lookbehind: true,
 | 
| +			inside: Prism.languages.javascript,
 | 
|  			alias: 'language-javascript'
 | 
|  		}
 | 
|  	});
 | 
|  }
 | 
|  
 | 
| +Prism.languages.js = Prism.languages.javascript;
 | 
|  
 | 
|  /* **********************************************
 | 
|       Begin prism-file-highlight.js
 | 
|  ********************************************** */
 | 
|  
 | 
|  (function () {
 | 
| -	if (!self.Prism || !self.document || !document.querySelector) {
 | 
| +	if (typeof self === 'undefined' || !self.Prism || !self.document || !document.querySelector) {
 | 
|  		return;
 | 
|  	}
 | 
|  
 | 
| 
 |