Vitaly Puzrin
10 years ago
5 changed files with 183 additions and 2 deletions
@ -0,0 +1,78 @@ |
|||
// Process ++inserted text++
|
|||
|
|||
'use strict'; |
|||
|
|||
module.exports = function mark(state, silent) { |
|||
var found, |
|||
pos, |
|||
max = state.posMax, |
|||
start = state.pos, |
|||
lastChar, |
|||
nextChar; |
|||
|
|||
if (state.src.charCodeAt(start) !== 0x3D/* = */) { return false; } |
|||
if (start + 4 >= max) { return false; } |
|||
if (state.src.charCodeAt(start + 1) !== 0x3D/* = */) { return false; } |
|||
|
|||
// make ins lower a priority tag with respect to links, same as <em>;
|
|||
// this code also prevents recursion
|
|||
if (silent && state.isInLabel) { return false; } |
|||
|
|||
if (state.level >= state.options.maxNesting) { return false; } |
|||
|
|||
lastChar = start > 0 ? state.src.charCodeAt(start - 1) : -1; |
|||
nextChar = state.src.charCodeAt(start + 2); |
|||
|
|||
if (lastChar === 0x3D/* = */) { return false; } |
|||
if (nextChar === 0x3D/* = */) { return false; } |
|||
if (nextChar === 0x20 || nextChar === 0x0A) { return false; } |
|||
|
|||
pos = start + 2; |
|||
while (pos < max && state.src.charCodeAt(pos) === 0x3D/* = */) { pos++; } |
|||
if (pos !== start + 2) { |
|||
// sequence of 3+ markers taking as literal, same as in a emphasis
|
|||
state.pos += pos - start; |
|||
if (!silent) { state.pending += state.src.slice(start, pos); } |
|||
return true; |
|||
} |
|||
|
|||
state.pos = start + 2; |
|||
|
|||
while (state.pos + 1 < max) { |
|||
if (state.src.charCodeAt(state.pos) === 0x3D/* = */) { |
|||
if (state.src.charCodeAt(state.pos + 1) === 0x3D/* = */) { |
|||
lastChar = state.src.charCodeAt(state.pos - 1); |
|||
nextChar = state.pos + 2 < max ? state.src.charCodeAt(state.pos + 2) : -1; |
|||
if (nextChar !== 0x3D/* = */ && lastChar !== 0x3D/* = */) { |
|||
if (lastChar !== 0x20 && lastChar !== 0x0A) { |
|||
// closing '++'
|
|||
found = true; |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
state.parser.skipToken(state); |
|||
} |
|||
|
|||
if (!found) { |
|||
// parser failed to find ending tag, so it's not valid emphasis
|
|||
state.pos = start; |
|||
return false; |
|||
} |
|||
|
|||
// found!
|
|||
state.posMax = state.pos; |
|||
state.pos = start + 2; |
|||
|
|||
if (!silent) { |
|||
state.push({ type: 'mark_open', level: state.level++ }); |
|||
state.parser.tokenize(state); |
|||
state.push({ type: 'mark_close', level: --state.level }); |
|||
} |
|||
|
|||
state.pos = state.posMax + 2; |
|||
state.posMax = max; |
|||
return true; |
|||
}; |
@ -0,0 +1,92 @@ |
|||
. |
|||
==Mark== |
|||
. |
|||
<p><mark>Mark</mark></p> |
|||
. |
|||
|
|||
|
|||
These are not marks, you have to use exactly two "==": |
|||
. |
|||
x ===foo=== |
|||
|
|||
x ==foo=== |
|||
|
|||
x ===foo== |
|||
. |
|||
<p>x ===foo===</p> |
|||
<p>x ==foo===</p> |
|||
<p>x ===foo==</p> |
|||
. |
|||
|
|||
Marks have the same priority as emphases: |
|||
|
|||
. |
|||
**==test**== |
|||
|
|||
==**test==** |
|||
. |
|||
<p>**<mark>test**</mark></p> |
|||
<p>==<strong>test==</strong></p> |
|||
. |
|||
|
|||
Marks have the same priority as emphases with respect to links: |
|||
. |
|||
[==link]()== |
|||
|
|||
==[link==]() |
|||
. |
|||
<p><a href="">==link</a>==</p> |
|||
<p>==<a href="">link==</a></p> |
|||
. |
|||
|
|||
Marks have the same priority as emphases with respect to backticks: |
|||
. |
|||
==`code==` |
|||
|
|||
`==code`== |
|||
. |
|||
<p>==<code>code==</code></p> |
|||
<p><code>==code</code>==</p> |
|||
. |
|||
|
|||
Nested marks: |
|||
. |
|||
==foo ==bar== baz== |
|||
. |
|||
<p><mark>foo <mark>bar</mark> baz</mark></p> |
|||
. |
|||
|
|||
. |
|||
==f **o ==o b== a** r== |
|||
. |
|||
<p><mark>f <strong>o <mark>o b</mark> a</strong> r</mark></p> |
|||
. |
|||
|
|||
Should not have a whitespace between text and "==": |
|||
. |
|||
foo == bar == baz |
|||
. |
|||
<p>foo == bar == baz</p> |
|||
. |
|||
|
|||
|
|||
Newline should be considered a whitespace: |
|||
|
|||
. |
|||
==test |
|||
== |
|||
|
|||
== |
|||
test== |
|||
|
|||
== |
|||
test |
|||
== |
|||
. |
|||
<h1>==test</h1> |
|||
<p>== |
|||
test==</p> |
|||
<p>== |
|||
test |
|||
==</p> |
|||
. |
Loading…
Reference in new issue