Vitaly Puzrin
10 years ago
10 changed files with 6 additions and 613 deletions
@ -1,101 +0,0 @@ |
|||
'use strict'; |
|||
|
|||
|
|||
// parse sequence of markers,
|
|||
// "start" should point at a valid marker
|
|||
function scanDelims(state, start) { |
|||
var pos = start, lastChar, nextChar, count, |
|||
can_open = true, |
|||
can_close = true, |
|||
max = state.posMax, |
|||
marker = state.src.charCodeAt(start); |
|||
|
|||
lastChar = start > 0 ? state.src.charCodeAt(start - 1) : -1; |
|||
|
|||
while (pos < max && state.src.charCodeAt(pos) === marker) { pos++; } |
|||
if (pos >= max) { can_open = false; } |
|||
count = pos - start; |
|||
|
|||
nextChar = pos < max ? state.src.charCodeAt(pos) : -1; |
|||
|
|||
// check whitespace conditions
|
|||
if (nextChar === 0x20 || nextChar === 0x0A) { can_open = false; } |
|||
if (lastChar === 0x20 || lastChar === 0x0A) { can_close = false; } |
|||
|
|||
return { |
|||
can_open: can_open, |
|||
can_close: can_close, |
|||
delims: count |
|||
}; |
|||
} |
|||
|
|||
module.exports = function(state, silent) { |
|||
var startCount, |
|||
count, |
|||
tagCount, |
|||
found, |
|||
stack, |
|||
res, |
|||
max = state.posMax, |
|||
start = state.pos, |
|||
marker = state.src.charCodeAt(start); |
|||
|
|||
if (marker !== 0x2B/* + */) { return false; } |
|||
if (silent) { return false; } // don't run any pairs in validation mode
|
|||
|
|||
res = scanDelims(state, start); |
|||
startCount = res.delims; |
|||
if (!res.can_open) { |
|||
state.pos += startCount; |
|||
if (!silent) { state.pending += state.src.slice(start, state.pos); } |
|||
return true; |
|||
} |
|||
|
|||
stack = Math.floor(startCount / 2); |
|||
if (stack <= 0) { return false; } |
|||
state.pos = start + startCount; |
|||
|
|||
while (state.pos < max) { |
|||
if (state.src.charCodeAt(state.pos) === marker) { |
|||
res = scanDelims(state, state.pos); |
|||
count = res.delims; |
|||
tagCount = Math.floor(count / 2); |
|||
if (res.can_close) { |
|||
if (tagCount >= stack) { |
|||
state.pos += count - 2; |
|||
found = true; |
|||
break; |
|||
} |
|||
stack -= tagCount; |
|||
state.pos += count; |
|||
continue; |
|||
} |
|||
|
|||
if (res.can_open) { stack += tagCount; } |
|||
state.pos += count; |
|||
continue; |
|||
} |
|||
|
|||
state.md.inline.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: 'ins_open', level: state.level++ }); |
|||
state.md.inline.tokenize(state); |
|||
state.push({ type: 'ins_close', level: --state.level }); |
|||
} |
|||
|
|||
state.pos = state.posMax + 2; |
|||
state.posMax = max; |
|||
return true; |
|||
}; |
@ -1,101 +0,0 @@ |
|||
'use strict'; |
|||
|
|||
|
|||
// parse sequence of markers,
|
|||
// "start" should point at a valid marker
|
|||
function scanDelims(state, start) { |
|||
var pos = start, lastChar, nextChar, count, |
|||
can_open = true, |
|||
can_close = true, |
|||
max = state.posMax, |
|||
marker = state.src.charCodeAt(start); |
|||
|
|||
lastChar = start > 0 ? state.src.charCodeAt(start - 1) : -1; |
|||
|
|||
while (pos < max && state.src.charCodeAt(pos) === marker) { pos++; } |
|||
if (pos >= max) { can_open = false; } |
|||
count = pos - start; |
|||
|
|||
nextChar = pos < max ? state.src.charCodeAt(pos) : -1; |
|||
|
|||
// check whitespace conditions
|
|||
if (nextChar === 0x20 || nextChar === 0x0A) { can_open = false; } |
|||
if (lastChar === 0x20 || lastChar === 0x0A) { can_close = false; } |
|||
|
|||
return { |
|||
can_open: can_open, |
|||
can_close: can_close, |
|||
delims: count |
|||
}; |
|||
} |
|||
|
|||
module.exports = function(state, silent) { |
|||
var startCount, |
|||
count, |
|||
tagCount, |
|||
found, |
|||
stack, |
|||
res, |
|||
max = state.posMax, |
|||
start = state.pos, |
|||
marker = state.src.charCodeAt(start); |
|||
|
|||
if (marker !== 0x3D/* = */) { return false; } |
|||
if (silent) { return false; } // don't run any pairs in validation mode
|
|||
|
|||
res = scanDelims(state, start); |
|||
startCount = res.delims; |
|||
if (!res.can_open) { |
|||
state.pos += startCount; |
|||
if (!silent) { state.pending += state.src.slice(start, state.pos); } |
|||
return true; |
|||
} |
|||
|
|||
stack = Math.floor(startCount / 2); |
|||
if (stack <= 0) { return false; } |
|||
state.pos = start + startCount; |
|||
|
|||
while (state.pos < max) { |
|||
if (state.src.charCodeAt(state.pos) === marker) { |
|||
res = scanDelims(state, state.pos); |
|||
count = res.delims; |
|||
tagCount = Math.floor(count / 2); |
|||
if (res.can_close) { |
|||
if (tagCount >= stack) { |
|||
state.pos += count - 2; |
|||
found = true; |
|||
break; |
|||
} |
|||
stack -= tagCount; |
|||
state.pos += count; |
|||
continue; |
|||
} |
|||
|
|||
if (res.can_open) { stack += tagCount; } |
|||
state.pos += count; |
|||
continue; |
|||
} |
|||
|
|||
state.md.inline.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.md.inline.tokenize(state); |
|||
state.push({ type: 'mark_close', level: --state.level }); |
|||
} |
|||
|
|||
state.pos = state.posMax + 2; |
|||
state.posMax = max; |
|||
return true; |
|||
}; |
@ -1,59 +0,0 @@ |
|||
// Process ~subscript~
|
|||
|
|||
'use strict'; |
|||
|
|||
// same as UNESCAPE_MD_RE plus a space
|
|||
var UNESCAPE_RE = /\\([ \\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g; |
|||
|
|||
module.exports = function sub(state, silent) { |
|||
var found, |
|||
content, |
|||
max = state.posMax, |
|||
start = state.pos; |
|||
|
|||
if (state.src.charCodeAt(start) !== 0x7E/* ~ */) { return false; } |
|||
if (silent) { return false; } // don't run any pairs in validation mode
|
|||
if (start + 2 >= max) { return false; } |
|||
|
|||
state.pos = start + 1; |
|||
|
|||
while (state.pos < max) { |
|||
if (state.src.charCodeAt(state.pos) === 0x7E/* ~ */) { |
|||
found = true; |
|||
break; |
|||
} |
|||
|
|||
state.md.inline.skipToken(state); |
|||
} |
|||
|
|||
if (!found || start + 1 === state.pos) { |
|||
state.pos = start; |
|||
return false; |
|||
} |
|||
|
|||
content = state.src.slice(start + 1, state.pos); |
|||
|
|||
// don't allow unescaped spaces/newlines inside
|
|||
if (content.match(/(^|[^\\])(\\\\)*\s/)) { |
|||
state.pos = start; |
|||
return false; |
|||
} |
|||
|
|||
// found!
|
|||
state.posMax = state.pos; |
|||
state.pos = start + 1; |
|||
|
|||
if (!silent) { |
|||
state.push({ type: 'sub_open', level: state.level++ }); |
|||
state.push({ |
|||
type: 'text', |
|||
level: state.level, |
|||
content: content.replace(UNESCAPE_RE, '$1') |
|||
}); |
|||
state.push({ type: 'sub_close', level: --state.level }); |
|||
} |
|||
|
|||
state.pos = state.posMax + 1; |
|||
state.posMax = max; |
|||
return true; |
|||
}; |
@ -1,59 +0,0 @@ |
|||
// Process ^superscript^
|
|||
|
|||
'use strict'; |
|||
|
|||
// same as UNESCAPE_MD_RE plus a space
|
|||
var UNESCAPE_RE = /\\([ \\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g; |
|||
|
|||
module.exports = function sup(state, silent) { |
|||
var found, |
|||
content, |
|||
max = state.posMax, |
|||
start = state.pos; |
|||
|
|||
if (state.src.charCodeAt(start) !== 0x5E/* ^ */) { return false; } |
|||
if (silent) { return false; } // don't run any pairs in validation mode
|
|||
if (start + 2 >= max) { return false; } |
|||
|
|||
state.pos = start + 1; |
|||
|
|||
while (state.pos < max) { |
|||
if (state.src.charCodeAt(state.pos) === 0x5E/* ^ */) { |
|||
found = true; |
|||
break; |
|||
} |
|||
|
|||
state.md.inline.skipToken(state); |
|||
} |
|||
|
|||
if (!found || start + 1 === state.pos) { |
|||
state.pos = start; |
|||
return false; |
|||
} |
|||
|
|||
content = state.src.slice(start + 1, state.pos); |
|||
|
|||
// don't allow unescaped spaces/newlines inside
|
|||
if (content.match(/(^|[^\\])(\\\\)*\s/)) { |
|||
state.pos = start; |
|||
return false; |
|||
} |
|||
|
|||
// found!
|
|||
state.posMax = state.pos; |
|||
state.pos = start + 1; |
|||
|
|||
if (!silent) { |
|||
state.push({ type: 'sup_open', level: state.level++ }); |
|||
state.push({ |
|||
type: 'text', |
|||
level: state.level, |
|||
content: content.replace(UNESCAPE_RE, '$1') |
|||
}); |
|||
state.push({ type: 'sup_close', level: --state.level }); |
|||
} |
|||
|
|||
state.pos = state.posMax + 1; |
|||
state.posMax = max; |
|||
return true; |
|||
}; |
@ -1,104 +0,0 @@ |
|||
. |
|||
++Insert++ |
|||
. |
|||
<p><ins>Insert</ins></p> |
|||
. |
|||
|
|||
|
|||
. |
|||
x ++++foo++ bar++ |
|||
. |
|||
<p>x <ins><ins>foo</ins> bar</ins></p> |
|||
. |
|||
|
|||
. |
|||
x ++foo ++bar++++ |
|||
. |
|||
<p>x <ins>foo <ins>bar</ins></ins></p> |
|||
. |
|||
|
|||
. |
|||
x ++++foo++++ |
|||
. |
|||
<p>x <ins><ins>foo</ins></ins></p> |
|||
. |
|||
|
|||
. |
|||
x +++foo+++ |
|||
. |
|||
<p>x <ins>+foo+</ins></p> |
|||
. |
|||
|
|||
Inserts have the same priority as emphases: |
|||
|
|||
. |
|||
**++test**++ |
|||
|
|||
++**test++** |
|||
. |
|||
<p><strong>++test</strong>++</p> |
|||
<p><ins>**test</ins>**</p> |
|||
. |
|||
|
|||
Inserts have the same priority as emphases with respect to links: |
|||
. |
|||
[++link]()++ |
|||
|
|||
++[link++]() |
|||
. |
|||
<p><a href="">++link</a>++</p> |
|||
<p>++<a href="">link++</a></p> |
|||
. |
|||
|
|||
Inserts have the same priority as emphases with respect to backticks: |
|||
. |
|||
++`code++` |
|||
|
|||
`++code`++ |
|||
. |
|||
<p>++<code>code++</code></p> |
|||
<p><code>++code</code>++</p> |
|||
. |
|||
|
|||
Nested inserts: |
|||
. |
|||
++foo ++bar++ baz++ |
|||
. |
|||
<p><ins>foo <ins>bar</ins> baz</ins></p> |
|||
. |
|||
|
|||
. |
|||
++f **o ++o b++ a** r++ |
|||
. |
|||
<p><ins>f <strong>o <ins>o b</ins> a</strong> r</ins></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 |
|||
++ |
|||
. |
|||
<p>++test |
|||
++</p> |
|||
<p>++ |
|||
test++</p> |
|||
<p>++ |
|||
test |
|||
++</p> |
|||
. |
@ -1,102 +0,0 @@ |
|||
. |
|||
==Mark== |
|||
. |
|||
<p><mark>Mark</mark></p> |
|||
. |
|||
|
|||
. |
|||
x ====foo== bar== |
|||
. |
|||
<p>x <mark><mark>foo</mark> bar</mark></p> |
|||
. |
|||
|
|||
. |
|||
x ==foo ==bar==== |
|||
. |
|||
<p>x <mark>foo <mark>bar</mark></mark></p> |
|||
. |
|||
|
|||
. |
|||
x ====foo==== |
|||
. |
|||
<p>x <mark><mark>foo</mark></mark></p> |
|||
. |
|||
|
|||
. |
|||
x ===foo=== |
|||
. |
|||
<p>x <mark>=foo=</mark></p> |
|||
. |
|||
|
|||
Marks have the same priority as emphases: |
|||
|
|||
. |
|||
**==test**== |
|||
|
|||
==**test==** |
|||
. |
|||
<p><strong>==test</strong>==</p> |
|||
<p><mark>**test</mark>**</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> |
|||
. |
@ -1,36 +0,0 @@ |
|||
|
|||
. |
|||
~foo\~ |
|||
. |
|||
<p>~foo~</p> |
|||
. |
|||
|
|||
. |
|||
~foo bar~ |
|||
. |
|||
<p>~foo bar~</p> |
|||
. |
|||
|
|||
. |
|||
~foo\ bar\ baz~ |
|||
. |
|||
<p><sub>foo bar baz</sub></p> |
|||
. |
|||
|
|||
. |
|||
~\ foo\ ~ |
|||
. |
|||
<p><sub> foo </sub></p> |
|||
. |
|||
|
|||
. |
|||
~foo\\\\\\\ bar~ |
|||
. |
|||
<p><sub>foo\\\ bar</sub></p> |
|||
. |
|||
|
|||
. |
|||
~foo\\\\\\ bar~ |
|||
. |
|||
<p>~foo\\\ bar~</p> |
|||
. |
@ -1,42 +0,0 @@ |
|||
|
|||
. |
|||
^test^ |
|||
. |
|||
<p><sup>test</sup></p> |
|||
. |
|||
|
|||
. |
|||
^foo\^ |
|||
. |
|||
<p>^foo^</p> |
|||
. |
|||
|
|||
. |
|||
2^4 + 3^5 |
|||
. |
|||
<p>2^4 + 3^5</p> |
|||
. |
|||
|
|||
. |
|||
^foo~bar^baz^bar~foo^ |
|||
. |
|||
<p><sup>foo~bar</sup>baz<sup>bar~foo</sup></p> |
|||
. |
|||
|
|||
. |
|||
^\ foo\ ^ |
|||
. |
|||
<p><sup> foo </sup></p> |
|||
. |
|||
|
|||
. |
|||
^foo\\\\\\\ bar^ |
|||
. |
|||
<p><sup>foo\\\ bar</sup></p> |
|||
. |
|||
|
|||
. |
|||
^foo\\\\\\ bar^ |
|||
. |
|||
<p>^foo\\\ bar^</p> |
|||
. |
Loading…
Reference in new issue