diff --git a/components/prism-markup.js b/components/prism-markup.js index 56b43a18f0..1dafd24224 100644 --- a/components/prism-markup.js +++ b/components/prism-markup.js @@ -4,7 +4,7 @@ Prism.languages.markup = { 'doctype': //i, 'cdata': //i, 'tag': { - pattern: /<\/?(?!\d)[^\s>\/=$<]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\s\S])*\1|[^\s'">=]+))?)*\s*\/?>/i, + pattern: /<\/?(?!\d)[^\s>\/=$<]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i, inside: { 'tag': { pattern: /^<\/?[^\s>\/]+/i, @@ -14,9 +14,15 @@ Prism.languages.markup = { } }, 'attr-value': { - pattern: /=(?:('|")[\s\S]*?(\1)|[^\s>]+)/i, + pattern: /=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/i, inside: { - 'punctuation': /[=>"']/ + 'punctuation': [ + /^=/, + { + pattern: /(^|[^\\])["']/, + lookbehind: true + } + ] } }, 'punctuation': /\/?>/, diff --git a/components/prism-markup.min.js b/components/prism-markup.min.js index 6a751ec1ea..819b4720e7 100644 --- a/components/prism-markup.min.js +++ b/components/prism-markup.min.js @@ -1 +1 @@ -Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype://i,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\s\S])*\1|[^\s'">=]+))?)*\s*\/?>/i,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:('|")[\s\S]*?(\1)|[^\s>]+)/i,inside:{punctuation:/[=>"']/}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Prism.languages.xml=Prism.languages.markup,Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup; \ No newline at end of file +Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype://i,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/(^|[^\\])["']/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Prism.languages.xml=Prism.languages.markup,Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup; \ No newline at end of file diff --git a/prism.js b/prism.js index 2e1aac659d..4fd2123a8f 100644 --- a/prism.js +++ b/prism.js @@ -544,7 +544,7 @@ Prism.languages.markup = { 'doctype': //i, 'cdata': //i, 'tag': { - pattern: /<\/?(?!\d)[^\s>\/=$<]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\s\S])*\1|[^\s'">=]+))?)*\s*\/?>/i, + pattern: /<\/?(?!\d)[^\s>\/=$<]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i, inside: { 'tag': { pattern: /^<\/?[^\s>\/]+/i, @@ -554,9 +554,15 @@ Prism.languages.markup = { } }, 'attr-value': { - pattern: /=(?:('|")[\s\S]*?(\1)|[^\s>]+)/i, + pattern: /=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/i, inside: { - 'punctuation': /[=>"']/ + 'punctuation': [ + /^=/, + { + pattern: /(^|[^\\])["']/, + lookbehind: true + } + ] } }, 'punctuation': /\/?>/, diff --git a/tests/languages/csharp+aspnet/directive_feature.test b/tests/languages/csharp+aspnet/directive_feature.test index 9eaa0057ea..f19c2a82c2 100644 --- a/tests/languages/csharp+aspnet/directive_feature.test +++ b/tests/languages/csharp+aspnet/directive_feature.test @@ -35,8 +35,7 @@ ["attr-value", [ ["punctuation", "="], ["punctuation", "\""], - "ProductDetails.aspx?productID", - ["punctuation", "="], + "ProductDetails.aspx?productID=", ["directive tag", [ ["directive tag", "<%#:"], "Item", diff --git a/tests/languages/django/property_feature.test b/tests/languages/django/property_feature.test index 5369bba7f4..adbe3c4bdd 100644 --- a/tests/languages/django/property_feature.test +++ b/tests/languages/django/property_feature.test @@ -25,11 +25,7 @@ ["punctuation", "<"], "a" ]], - ["attr-name", ["href"]], - ["attr-value", [ - ["punctuation", "="], - ["punctuation", "\""] - ]], + ["attr-name", ["href=\""]], ["property", [ "{{ ", ["variable", "story"], diff --git a/tests/languages/markup/tag_attribute_feature.test b/tests/languages/markup/tag_attribute_feature.test index 986cca8251..69751b4edd 100644 --- a/tests/languages/markup/tag_attribute_feature.test +++ b/tests/languages/markup/tag_attribute_feature.test @@ -4,6 +4,7 @@ bar baz">
+
---------------------------------------------------- @@ -83,6 +84,23 @@ baz"> "42" ]], ["punctuation", ">"] + ]], + + ["tag", [ + ["tag", [ + ["punctuation", "<"], + "div" + ]], + ["attr-name", [ + "foo" + ]], + ["attr-value", [ + ["punctuation", "="], + ["punctuation", "\""], + "=\\\"=", + ["punctuation", "\""] + ]], + ["punctuation", ">"] ]] ]