Add support for some nesting, give priority to Markdown over Markup, fixed example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
diff --git a/components/prism-markdown.js b/components/prism-markdown.js
index f58bcc5..89ec0c2 100644
--- a/components/prism-markdown.js
+++ b/components/prism-markdown.js
@@ -1,4 +1,5 @@
-Prism.languages.markdown = Prism.languages.extend('markup', {
+Prism.languages.markdown = Prism.languages.extend('markup', {});
+Prism.languages.insertBefore('markdown', 'prolog', {
'blockquote': {
// > ...
pattern: /(^|\n)>(?:[\t ]*>)*/,
@@ -77,6 +78,28 @@ Prism.languages.markdown = Prism.languages.extend('markup', {
},
alias: 'url'
},
+ 'bold': {
+ // **strong**
+ // __strong__
+
+ // Allow only one line break
+ pattern: /(^|[^\\])(\*\*|__)(?:\n(?!\n)|.)+?\2/,
+ lookbehind: true,
+ inside: {
+ 'punctuation': /^\*\*|^__|\*\*\s*$|__\s*$/
+ }
+ },
+ 'italic': {
+ // *em*
+ // _em_
+
+ // Allow only one line break
+ pattern: /(^|[^\\])(?:\*(?:\n(?!\n)|.)+?\*|_(?:\n(?!\n)|.)+?_)/,
+ lookbehind: true,
+ inside: {
+ 'punctuation': /^[*_]|[*_]$/
+ }
+ },
'url': {
// [example](http://example.com "Optional title")
// [example] [id]
@@ -90,31 +113,10 @@ Prism.languages.markdown = Prism.languages.extend('markup', {
pattern: /"(?:[^"]|\\")*"(?=\)$)/
}
}
- },
- 'bold': [
- {
- // **strong**
- // __strong__
+ }
+});
- // Allow only one line break
- pattern: /(^|[^\\])(\*\*|__)(?:\n(?!\n)|.)+?\2/,
- lookbehind: true,
- inside: {
- 'punctuation': /^\*\*|^__|\*\*\s*$|__\s*$/
- }
- }
- ],
- 'italic': [
- {
- // *em*
- // _em_
-
- // Allow only one line break
- pattern: /(^|[^\\])(?:\*(?:\n(?!\n)|.)+?\*|_(?:\n(?!\n)|.)+?_)/,
- lookbehind: true,
- inside: {
- 'punctuation': /^[*_]|[*_]$/
- }
- }
- ]
-});
\ No newline at end of file
+Prism.languages.markdown['bold'].inside['url'] = Prism.languages.markdown['url'];
+Prism.languages.markdown['italic'].inside['url'] = Prism.languages.markdown['url'];
+Prism.languages.markdown['bold'].inside['italic'] = Prism.languages.markdown['italic'];
+Prism.languages.markdown['italic'].inside['bold'] = Prism.languages.markdown['bold'];
\ No newline at end of file
diff --git a/components/prism-markdown.min.js b/components/prism-markdown.min.js
index c0ea219..6842938 100644
--- a/components/prism-markdown.min.js
+++ b/components/prism-markdown.min.js
@@ -1 +1 @@
-Prism.languages.markdown=Prism.languages.extend("markup",{blockquote:{pattern:/(^|\n)>(?:[\t ]*>)*/,lookbehind:!0,alias:"punctuation"},code:[{pattern:/(^|\n)(?: {4}|\t).+/,lookbehind:!0,alias:"keyword"},{pattern:/``.+?``|`[^`\n]+`/,alias:"keyword"}],title:[{pattern:/\w+.*\n(?:==+|--+)/,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/((?:^|\n)\s*)#+.+/,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/((?:^|\n)\s*)([*-])([\t ]*\2){2,}(?=\s*(?:\n|$))/,lookbehind:!0,alias:"punctuation"},list:{pattern:/((?:^|\n)\s*)(?:[*+-]|\d+\.)(?=[\t ].)/,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:[^>]|\\>)+>)(?:[\t ]+(?:"(?:[^"]|\\")*"|'(?:[^']|\\')*'|\((?:[^)]|\\\))*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:[^"]|\\")*"|'(?:[^']|\\')*'|\((?:[^)]|\\\))*\))$/,punctuation:/[[\]\(\)<>:]/},alias:"url"},url:{pattern:/!?\[[^\]]+\](?:\([^\s)]+(?:[\t ]+"(?:[^"]|\\")*")?\)| ?\[[^\]\n]*\])/,inside:{variable:{pattern:/(!?\[)[^\]]+(?=\]$)/,lookbehind:!0},string:{pattern:/"(?:[^"]|\\")*"(?=\)$)/}}},bold:[{pattern:/(^|[^\\])(\*\*|__)(?:\n(?!\n)|.)+?\2/,lookbehind:!0,inside:{punctuation:/^\*\*|^__|\*\*\s*$|__\s*$/}}],italic:[{pattern:/(^|[^\\])(?:\*(?:\n(?!\n)|.)+?\*|_(?:\n(?!\n)|.)+?_)/,lookbehind:!0,inside:{punctuation:/^[*_]|[*_]$/}}]});
\ No newline at end of file
+Prism.languages.markdown=Prism.languages.extend("markup",{}),Prism.languages.insertBefore("markdown","prolog",{blockquote:{pattern:/(^|\n)>(?:[\t ]*>)*/,lookbehind:!0,alias:"punctuation"},code:[{pattern:/(^|\n)(?: {4}|\t).+/,lookbehind:!0,alias:"keyword"},{pattern:/``.+?``|`[^`\n]+`/,alias:"keyword"}],title:[{pattern:/\w+.*\n(?:==+|--+)/,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/((?:^|\n)\s*)#+.+/,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/((?:^|\n)\s*)([*-])([\t ]*\2){2,}(?=\s*(?:\n|$))/,lookbehind:!0,alias:"punctuation"},list:{pattern:/((?:^|\n)\s*)(?:[*+-]|\d+\.)(?=[\t ].)/,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:[^>]|\\>)+>)(?:[\t ]+(?:"(?:[^"]|\\")*"|'(?:[^']|\\')*'|\((?:[^)]|\\\))*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:[^"]|\\")*"|'(?:[^']|\\')*'|\((?:[^)]|\\\))*\))$/,punctuation:/[[\]\(\)<>:]/},alias:"url"},bold:{pattern:/(^|[^\\])(\*\*|__)(?:\n(?!\n)|.)+?\2/,lookbehind:!0,inside:{punctuation:/^\*\*|^__|\*\*\s*$|__\s*$/}},italic:{pattern:/(^|[^\\])(?:\*(?:\n(?!\n)|.)+?\*|_(?:\n(?!\n)|.)+?_)/,lookbehind:!0,inside:{punctuation:/^[*_]|[*_]$/}},url:{pattern:/!?\[[^\]]+\](?:\([^\s)]+(?:[\t ]+"(?:[^"]|\\")*")?\)| ?\[[^\]\n]*\])/,inside:{variable:{pattern:/(!?\[)[^\]]+(?=\]$)/,lookbehind:!0},string:{pattern:/"(?:[^"]|\\")*"(?=\)$)/}}}}),Prism.languages.markdown.bold.inside.url=Prism.languages.markdown.url,Prism.languages.markdown.italic.inside.url=Prism.languages.markdown.url,Prism.languages.markdown.bold.inside.italic=Prism.languages.markdown.italic,Prism.languages.markdown.italic.inside.bold=Prism.languages.markdown.bold;
\ No newline at end of file
diff --git a/examples/prism-markdown.html b/examples/prism-markdown.html
index 409df27..b000aef 100644
--- a/examples/prism-markdown.html
+++ b/examples/prism-markdown.html
@@ -56,7 +56,7 @@ is not allowed__
</code></pre>
<h2>Code</h2>
-<pre><code>Inline code between backticks `some_code()`
+<pre><code>Inline code between backticks `<p>Paragraph</p>`
some_code(); /* Indented
with four spaces */
@@ -78,17 +78,16 @@ is not allowed__
If a failure is listed here, it doesn’t mean it will never be fixed. This is more of a “known bugs” list, just with a certain type of bug.
</p>
-<h3>Nested elements are not supported</h3>
-<pre><code>_ **bold** inside italic _
+<h3>Nesting of elements is not fully supported</h3>
+<pre><code>_ **bold** inside italic does not work _
-__ *italic* inside bold __
+__ *italic* inside bold does work __
-__ [Bold link?](http://example.com) __
+_ [Italic link does work](http://example.com) _
+__ [Bold link does work](http://example.com) __
-[Link in *italic*](http://example.com)</code></pre>
+[Link partially *italic* does not work](http://example.com)
+[Link partially **bold** does not work](http://example.com)</code></pre>
-<h3>HTML inside code blocks is not highlighted as code</h3>
-<pre><code>Some `<html>`
-
- Block of <strong>HTML</strong>
- which is <em>not</em> highlighted as code.</code></pre>
\ No newline at end of file
+<h3>Markdown-like HTML attribute</h3>
+<pre><code><p class="_test_"></p></code></pre>
\ No newline at end of file