Commit 6763cd53f03332ac4bcc4b740cc74924f96806d2

Lea Verou 2012-07-26T18:48:34

Fixed bug where block code wasn’t styled properly

diff --git a/components/prism-core.js b/components/prism-core.js
index 99e92db..e55e007 100644
--- a/components/prism-core.js
+++ b/components/prism-core.js
@@ -33,7 +33,7 @@ var _ = self.Prism = {
 		}
 		
 		if (parent) {
-			language = (parent.className.match(lang) || [])[1];
+			language = (parent.className.match(lang) || [,''])[1];
 			grammar = _.languages[language];
 		}
 
@@ -41,15 +41,17 @@ var _ = self.Prism = {
 			return;
 		}
 		
+		// Set language on the element, if not present
+		element.className = element.className.replace(lang, '') + ' language-' + language;
+		
+		// Set language on the parent, for styling
 		parent = element.parentNode;
 		
-		if (/pre/i.test(parent.nodeName) && !lang.test(parent.className)) {
-			parent.className += ' language-*';
+		if (/pre/i.test(parent.nodeName)) {
+			var parentLanguage = (parent.className.match(lang) || [,''])[1];
+			parent.className = parent.className.replace(lang, '') + ' language-' + parentLanguage; 
 		}
 		
-		// Set language on the element, if not present
-		element.className = element.className.replace(lang, '') + ' language-' + language;
-		
 		var code = element.textContent.trim();
 		
 		if(!code) {
diff --git a/components/prism-core.min.js b/components/prism-core.min.js
index 88f7f67..1a7741f 100644
--- a/components/prism-core.min.js
+++ b/components/prism-core.min.js
@@ -2,4 +2,4 @@
  * Prism: Lightweight, robust, elegant syntax highlighting
  * MIT license http://www.opensource.org/licenses/mit-license.php/
  * @author Lea Verou http://lea.verou.me
- */(function(){var e=/\blang(?:uage)?-(?!\*)(\w+)\b/i,t=self.Prism={grammar:{url:/[a-z]{3,4}s?:\/\/\S+/g},languages:{},highlightAll:function(e,n){var r=document.querySelectorAll('code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code');for(var i=0,s;s=r[i++];)t.highlightElement(s,e===!0,n)},highlightElement:function(r,i,s){var o,u,a=r;while(a&&!e.test(a.className))a=a.parentNode;if(a){o=(a.className.match(e)||[])[1];u=t.languages[o]}if(!u)return;a=r.parentNode;/pre/i.test(a.nodeName)&&!e.test(a.className)&&(a.className+=" language-*");r.className=r.className.replace(e,"")+" language-"+o;var f=r.textContent.trim();if(!f)return;f=f.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\u00a0/g," ");var l={element:r,language:o,grammar:u,code:f};t.hooks.run("before-highlight",l);if(i&&self.Worker){var c=new Worker(t.filename);c.onmessage=function(e){l.highlightedCode=n.stringify(JSON.parse(e.data));l.element.innerHTML=l.highlightedCode;s&&s.call(l.element);t.hooks.run("after-highlight",l)};c.postMessage(JSON.stringify({language:l.language,code:l.code}))}else{l.highlightedCode=t.highlight(l.code,l.grammar);l.element.innerHTML=l.highlightedCode;s&&s.call(r);t.hooks.run("after-highlight",l)}},highlight:function(e,r){return n.stringify(t.tokenize(e,r))},tokenize:function(e,n){var r=t.Token,i=[e],s=n.rest;if(s){for(var o in s)n[o]=s[o];delete n.rest}e:for(var o in n){if(!n.hasOwnProperty(o)||!n[o])continue;var u=n[o],a=u.inside,f=!!u.lookbehind||0;u=u.pattern||u;for(var l=0;l<i.length;l++){var c=i[l];if(i.length>e.length)break e;if(c instanceof r)continue;u.lastIndex=0;var h=u.exec(c);if(h){f&&(f=h[1].length);var p=h.index-1+f,h=h[0].slice(f),d=h.length,v=p+d,m=c.slice(0,p+1),g=c.slice(v+1),y=[l,1];m&&y.push(m);var b=new r(o,a?t.tokenize(h,a):h);y.push(b);g&&y.push(g);Array.prototype.splice.apply(i,y)}}}return i},hooks:{all:{},add:function(e,n){var r=t.hooks.all;r[e]=r[e]||[];r[e].push(n)},run:function(e,n){var r=t.hooks.all[e];if(!r||!r.length)return;for(var i=0,s;s=r[i++];)s(n)}}},n=t.Token=function(e,t){this.type=e;this.content=t};n.stringify=function(e){if(typeof e=="string")return e;if(Object.prototype.toString.call(e)=="[object Array]"){for(var r=0;r<e.length;r++)e[r]=n.stringify(e[r]);return e.join("")}var i={type:e.type,content:n.stringify(e.content),tag:"span",classes:["token",e.type],attributes:{}};i.type=="comment"&&(i.attributes.spellcheck="true");t.hooks.run("wrap",i);var s="";for(var o in i.attributes)s+=o+'="'+(i.attributes[o]||"")+'"';return"<"+i.tag+' class="'+i.classes.join(" ")+'" '+s+">"+i.content+"</"+i.tag+">"};if(!self.document){self.addEventListener("message",function(e){var n=JSON.parse(e.data),r=n.language;code=n.code;self.postMessage(JSON.stringify(t.tokenize(code,t.languages[r])));self.close()},!1);return}var r=document.getElementsByTagName("script");r=r[r.length-1];if(r){t.filename=r.src;document.addEventListener&&!r.hasAttribute("data-manual")&&document.addEventListener("DOMContentLoaded",t.highlightAll)}})();
\ No newline at end of file
+ */(function(){var e=/\blang(?:uage)?-(?!\*)(\w+)\b/i,t=self.Prism={grammar:{url:/[a-z]{3,4}s?:\/\/\S+/g},languages:{},highlightAll:function(e,n){var r=document.querySelectorAll('code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code');for(var i=0,s;s=r[i++];)t.highlightElement(s,e===!0,n)},highlightElement:function(r,i,s){var o,u,a=r;while(a&&!e.test(a.className))a=a.parentNode;if(a){o=(a.className.match(e)||[,""])[1];u=t.languages[o]}if(!u)return;r.className=r.className.replace(e,"")+" language-"+o;a=r.parentNode;if(/pre/i.test(a.nodeName)){var f=(a.className.match(e)||[,""])[1];a.className=a.className.replace(e,"")+" language-"+f}var l=r.textContent.trim();if(!l)return;l=l.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\u00a0/g," ");var c={element:r,language:o,grammar:u,code:l};t.hooks.run("before-highlight",c);if(i&&self.Worker){var h=new Worker(t.filename);h.onmessage=function(e){c.highlightedCode=n.stringify(JSON.parse(e.data));c.element.innerHTML=c.highlightedCode;s&&s.call(c.element);t.hooks.run("after-highlight",c)};h.postMessage(JSON.stringify({language:c.language,code:c.code}))}else{c.highlightedCode=t.highlight(c.code,c.grammar);c.element.innerHTML=c.highlightedCode;s&&s.call(r);t.hooks.run("after-highlight",c)}},highlight:function(e,r){return n.stringify(t.tokenize(e,r))},tokenize:function(e,n){var r=t.Token,i=[e],s=n.rest;if(s){for(var o in s)n[o]=s[o];delete n.rest}e:for(var o in n){if(!n.hasOwnProperty(o)||!n[o])continue;var u=n[o],a=u.inside,f=!!u.lookbehind||0;u=u.pattern||u;for(var l=0;l<i.length;l++){var c=i[l];if(i.length>e.length)break e;if(c instanceof r)continue;u.lastIndex=0;var h=u.exec(c);if(h){f&&(f=h[1].length);var p=h.index-1+f,h=h[0].slice(f),d=h.length,v=p+d,m=c.slice(0,p+1),g=c.slice(v+1),y=[l,1];m&&y.push(m);var b=new r(o,a?t.tokenize(h,a):h);y.push(b);g&&y.push(g);Array.prototype.splice.apply(i,y)}}}return i},hooks:{all:{},add:function(e,n){var r=t.hooks.all;r[e]=r[e]||[];r[e].push(n)},run:function(e,n){var r=t.hooks.all[e];if(!r||!r.length)return;for(var i=0,s;s=r[i++];)s(n)}}},n=t.Token=function(e,t){this.type=e;this.content=t};n.stringify=function(e){if(typeof e=="string")return e;if(Object.prototype.toString.call(e)=="[object Array]"){for(var r=0;r<e.length;r++)e[r]=n.stringify(e[r]);return e.join("")}var i={type:e.type,content:n.stringify(e.content),tag:"span",classes:["token",e.type],attributes:{}};i.type=="comment"&&(i.attributes.spellcheck="true");t.hooks.run("wrap",i);var s="";for(var o in i.attributes)s+=o+'="'+(i.attributes[o]||"")+'"';return"<"+i.tag+' class="'+i.classes.join(" ")+'" '+s+">"+i.content+"</"+i.tag+">"};if(!self.document){self.addEventListener("message",function(e){var n=JSON.parse(e.data),r=n.language;code=n.code;self.postMessage(JSON.stringify(t.tokenize(code,t.languages[r])));self.close()},!1);return}var r=document.getElementsByTagName("script");r=r[r.length-1];if(r){t.filename=r.src;document.addEventListener&&!r.hasAttribute("data-manual")&&document.addEventListener("DOMContentLoaded",t.highlightAll)}})();
\ No newline at end of file
diff --git a/examples.html b/examples.html
index eee1e24..de942d9 100644
--- a/examples.html
+++ b/examples.html
@@ -30,17 +30,22 @@
 	<h2>pre.language-css > code.language-*</h2>
 	<pre class="language-css"><code class="language-*">p { color: red; }</code></pre>
 	
-	<h2>.lang-css</h2>
+	<h2>code.lang-css</h2>
 	<code class="lang-css">p { color: red; }</code>
+	
+	<h2>pre.lang-css > code</h2>
 	<pre class="lang-css"><code>p { color: red; }</code></pre>
 	
-	<h2>pre > code (No language, should inherit .language-markup)</h2>
+	<h2>pre > code</h2>
+	<p>No language, should inherit .language-markup</p>
 	<pre><code>&lt;p>hi!&lt;/p></code></pre>
 	
-	<h2>code.language-* (No language, should inherit .language-markup)</h2>
+	<h2>code.language-*</h2>
+	<p>No language, should inherit .language-markup</p>
 	<code class="language-*">&lt;p>hi!&lt;/p></code>
 	
-	<h2>code.language-none (Should not be highlighted)</h2>
+	<h2>code.language-none</h2>
+	<p>Should not be highlighted.</p>
 	<code class="language-none">&lt;p>hi!&lt;/p></code>
 </section>
 
diff --git a/prism.js b/prism.js
index 8074129..6a347f8 100644
--- a/prism.js
+++ b/prism.js
@@ -39,7 +39,7 @@ var _ = self.Prism = {
 		}
 		
 		if (parent) {
-			language = (parent.className.match(lang) || [])[1];
+			language = (parent.className.match(lang) || [,''])[1];
 			grammar = _.languages[language];
 		}
 
@@ -47,15 +47,17 @@ var _ = self.Prism = {
 			return;
 		}
 		
+		// Set language on the element, if not present
+		element.className = element.className.replace(lang, '') + ' language-' + language;
+		
+		// Set language on the parent, for styling
 		parent = element.parentNode;
 		
-		if (/pre/i.test(parent.nodeName) && !lang.test(parent.className)) {
-			parent.className += ' language-*';
+		if (/pre/i.test(parent.nodeName)) {
+			var parentLanguage = (parent.className.match(lang) || [,''])[1];
+			parent.className = parent.className.replace(lang, '') + ' language-' + parentLanguage; 
 		}
 		
-		// Set language on the element, if not present
-		element.className = element.className.replace(lang, '') + ' language-' + language;
-		
 		var code = element.textContent.trim();
 		
 		if(!code) {