Browse Source

Added inline html tags support

pull/14/head
Vitaly Puzrin 10 years ago
parent
commit
5d89fd85b0
  1. 5
      bin/remarkable.js
  2. 4
      lib/common/html_re.js
  3. 2
      lib/lexer_block/htmlblock.js
  4. 1
      lib/lexer_inline.js
  5. 2
      lib/lexer_inline/autolink.js
  6. 52
      lib/lexer_inline/htmltag.js
  7. 5
      lib/renderer.js
  8. 325
      test/fixtures/stmd/bad.txt
  9. 203
      test/fixtures/stmd/good.txt

5
bin/remarkable.js

@ -61,7 +61,10 @@ readFile(options.file, 'utf8', function (error, input) {
process.exit(1);
}
md = new Remarkable();
md = new Remarkable({
html: true,
xhtml: true
});
try {
output = md.render(input);

4
lib/common/html_re.js

@ -44,10 +44,10 @@ var open_tag = replace(/<[A-Za-z][A-Za-z0-9]*attribute*\s*\/?>/)
var close_tag = /<\/[A-Za-z][A-Za-z0-9]*\s*>/;
var comment = /<!--([^-]+|[-][^-]+)*-->/;
var processing = /<[?].*?[?]>/;
var declaration = /<![A-Z]\s+[^>]*>/;
var declaration = /<![A-Z]+\s+[^>]*>/;
var cdata = /<!\[CDATA\[([^\]]+|\][^\]]|\]\][^>])*\]\]>/;
var HTML_TAG_RE = replace(/^(?:open_tag|close_tag|comment|processing|declaration|cdata)/, 'i')
var HTML_TAG_RE = replace(/^(?:open_tag|close_tag|comment|processing|declaration|cdata)/)
('open_tag', open_tag)
('close_tag', close_tag)
('comment', comment)

2
lib/lexer_block/htmlblock.js

@ -66,7 +66,7 @@ module.exports = function htmlblock(state, startLine, endLine, silent) {
}
state.tokens.push({
type: 'html',
type: 'htmlblock',
content: getLines(state, startLine, nextLine, 0, true)
});

1
lib/lexer_inline.js

@ -19,6 +19,7 @@ rules.push(require('./lexer_inline/backticks'));
//
//
rules.push(require('./lexer_inline/autolink'));
rules.push(require('./lexer_inline/htmltag'));
rules.push(require('./lexer_inline/entity'));
rules.push(require('./lexer_inline/escape_html_char'));

2
lib/lexer_inline/autolink.js

@ -22,7 +22,7 @@ module.exports = function autolink(state) {
linkMatch = tail.match(AUTOLINK_RE);
if (linkMatch) {
if (url_schemas.indexOf(linkMatch[1]) < 0) { return false; }
if (url_schemas.indexOf(linkMatch[1].toLowerCase()) < 0) { return false; }
state.push({
type: 'link_open',

52
lib/lexer_inline/htmltag.js

@ -0,0 +1,52 @@
// Process html tags
'use strict';
var HTML_TAG_RE = require('../common/html_re').HTML_TAG_RE;
function isLetter(ch) {
/*eslint no-bitwise:0*/
var lc = ch | 0x20; // to lower case
return (lc >= 0x61/* a */) && (lc <= 0x7a/* z */);
}
module.exports = function htmltag(state) {
var ch, match, max, pos = state.pos;
if (!state.options.html) { return false; }
// Check start
max = state.posMax;
if (state.src.charCodeAt(pos) !== 0x3C/* < */ ||
pos + 2 >= max) {
return false;
}
// Quick fail on second char
ch = state.src.charCodeAt(pos + 1);
if (ch !== 0x21/* ! */ &&
ch !== 0x3F/* ? */ &&
ch !== 0x2F/* / */ &&
!isLetter(ch)) {
return false;
}
// console.log(HTML_TAG_RE)
match = state.src.slice(pos).match(HTML_TAG_RE);
if (!match) { return false; }
// console.log('--------')
// console.log(state.src.slice(pos))
// console.log(match)
state.push({
type: 'htmltag',
content: state.src.slice(pos, pos + match[0].length)
});
//console.log(state.tokens)
state.pos += match[0].length;
return true;
};

5
lib/renderer.js

@ -149,7 +149,10 @@ rules.text = function (tokens, idx /*, options*/) {
};
rules.html = function (tokens, idx /*, options*/) {
rules.htmlblock = function (tokens, idx /*, options*/) {
return tokens[idx].content;
};
rules.htmltag = function (tokens, idx /*, options*/) {
return tokens[idx].content;
};

325
test/fixtures/stmd/bad.txt

@ -63,26 +63,9 @@ src line: 1406
error:
<DIV CLASS="foo">
<p><DIV CLASS="foo"></p>
<p>*Markdown*</p>
</DIV>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 1534
.
<div class
foo
.
<div class
foo
.
error:
<p>&lt;div class
foo</p>
<p></DIV></p>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -177,9 +160,9 @@ src line: 1678
error:
<p>[Foo bar]:</p>
<p>[Foo bar]:
<my url>
'title'
'title'</p>
<p>[Foo bar]</p>
@ -673,20 +656,6 @@ error:
<p>\*emphasis*</p>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 3694
.
<a href="/bar\/)">
.
<p><a href="/bar\/)"></p>
.
error:
<a href="/bar\/)">
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 3704
@ -718,20 +687,6 @@ error:
<p>[foo]: /bar* &quot;ti*tle&quot;</p>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 3791
.
<a href="&ouml;&ouml;.html">
.
<p><a href="&ouml;&ouml;.html"></p>
.
error:
<a href="&ouml;&ouml;.html">
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 3797
@ -763,20 +718,6 @@ error:
<p>[foo]: /f&ouml;&ouml; &quot;f&ouml;&ouml;&quot;</p>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 3954
.
<a href="`">`
.
<p><a href="`">`</p>
.
error:
<a href="`">`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 4095
@ -985,34 +926,6 @@ error:
<p>_foo [bar_](/url)</p>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 4196
.
**<a href="**">
.
<p>**<a href="**"></p>
.
error:
<p>**&lt;a href=&quot;**&quot;&gt;</p>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 4202
.
__<a href="__">
.
<p>__<a href="__"></p>
.
error:
<p>__&lt;a href=&quot;__&quot;&gt;</p>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 4208
@ -1841,20 +1754,6 @@ error:
&quot;title&quot; )</p>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 4898
.
[foo <bar attr="](baz)">
.
<p>[foo <bar attr="](baz)"></p>
.
error:
<p>[foo &lt;bar attr=&quot;](baz)&quot;&gt;</p>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 4927
@ -2435,7 +2334,7 @@ src line: 5271
error:
<p>![foo](&lt;url&gt;)</p>
<p>![foo](<url>)</p>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -2658,186 +2557,6 @@ error:
<p>[foo]: /url &quot;title&quot;</p>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5464
.
<MAILTO:FOO@BAR.BAZ>
.
<p><a href="MAILTO:FOO@BAR.BAZ">MAILTO:FOO@BAR.BAZ</a></p>
.
error:
<p>&lt;MAILTO:FOO@BAR.BAZ&gt;</p>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5627
.
<a><bab><c2c>
.
<p><a><bab><c2c></p>
.
error:
<a><bab><c2c>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5635
.
<a/><b2/>
.
<p><a/><b2/></p>
.
error:
<a/><b2/>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5643
.
<a /><b2
data="foo" >
.
<p><a /><b2
data="foo" ></p>
.
error:
<a /><b2
data="foo" >
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5653
.
<a foo="bar" bam = 'baz <em>"</em>'
_boolean zoop:33=zoop:33 />
.
<p><a foo="bar" bam = 'baz <em>"</em>'
_boolean zoop:33=zoop:33 /></p>
.
error:
<a foo="bar" bam = 'baz <em>"</em>'
_boolean zoop:33=zoop:33 />
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5705
.
</a>
</foo >
.
<p></a>
</foo ></p>
.
error:
</a>
</foo >
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5723
.
foo <!-- this is a
comment - with hyphen -->
.
<p>foo <!-- this is a
comment - with hyphen --></p>
.
error:
<p>foo &lt;!-- this is a
comment - with hyphen --&gt;</p>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5739
.
foo <?php echo $a; ?>
.
<p>foo <?php echo $a; ?></p>
.
error:
<p>foo &lt;?php echo $a; ?&gt;</p>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5747
.
foo <!ELEMENT br EMPTY>
.
<p>foo <!ELEMENT br EMPTY></p>
.
error:
<p>foo &lt;!ELEMENT br EMPTY&gt;</p>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5755
.
foo <![CDATA[>&<]]>
.
<p>foo <![CDATA[>&<]]></p>
.
error:
<p>foo &lt;![CDATA[&gt;&amp;&lt;]]&gt;</p>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5763
.
<a href="&ouml;">
.
<p><a href="&ouml;"></p>
.
error:
<a href="&ouml;">
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5771
.
<a href="\*">
.
<p><a href="\*"></p>
.
error:
<a href="\*">
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5839
@ -2872,37 +2591,3 @@ error:
bar*</p>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5873
.
<a href="foo
bar">
.
<p><a href="foo
bar"></p>
.
error:
<a href="foo
bar">
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5881
.
<a href="foo\
bar">
.
<p><a href="foo\
bar"></p>
.
error:
<a href="foo\
bar">

203
test/fixtures/stmd/good.txt

@ -1218,6 +1218,17 @@ bar
*foo*
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 1534
.
<div class
foo
.
<div class
foo
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 1584
@ -2668,6 +2679,15 @@ src line: 3688
<p><a href="http://google.com?find=\*">http://google.com?find=\*</a></p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 3694
.
<a href="/bar\/)">
.
<p><a href="/bar\/)"></p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 3718
@ -2734,6 +2754,15 @@ src line: 3781
<p>&MadeUpEntity;</p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 3791
.
<a href="&ouml;&ouml;.html">
.
<p><a href="&ouml;&ouml;.html"></p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 3811
@ -2858,6 +2887,15 @@ src line: 3946
<p><a href="http://foo.bar.`baz">http://foo.bar.`baz</a>`</p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 3954
.
<a href="`">`
.
<p><a href="`">`</p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 3963
@ -2876,6 +2914,24 @@ src line: 3969
<p>`foo</p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 4196
.
**<a href="**">
.
<p>**<a href="**"></p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 4202
.
__<a href="__">
.
<p>__<a href="__"></p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 4220
@ -3130,6 +3186,15 @@ src line: 4889
<p>[link] (/uri)</p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 4898
.
[foo <bar attr="](baz)">
.
<p>[foo <bar attr="](baz)"></p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5444
@ -3157,6 +3222,15 @@ src line: 5456
<p><a href="irc://foo.bar:2233/baz">irc://foo.bar:2233/baz</a></p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5464
.
<MAILTO:FOO@BAR.BAZ>
.
<p><a href="MAILTO:FOO@BAR.BAZ">MAILTO:FOO@BAR.BAZ</a></p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5472
@ -3247,6 +3321,46 @@ foo@bar.baz.com
<p>foo@bar.baz.com</p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5627
.
<a><bab><c2c>
.
<p><a><bab><c2c></p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5635
.
<a/><b2/>
.
<p><a/><b2/></p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5643
.
<a /><b2
data="foo" >
.
<p><a /><b2
data="foo" ></p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5653
.
<a foo="bar" bam = 'baz <em>"</em>'
_boolean zoop:33=zoop:33 />
.
<p><a foo="bar" bam = 'baz <em>"</em>'
_boolean zoop:33=zoop:33 /></p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5663
@ -3294,6 +3408,17 @@ src line: 5697
<p>&lt;a href='bar'title=title&gt;</p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5705
.
</a>
</foo >
.
<p></a>
</foo ></p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5715
@ -3303,6 +3428,17 @@ src line: 5715
<p>&lt;/a href=&quot;foo&quot;&gt;</p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5723
.
foo <!-- this is a
comment - with hyphen -->
.
<p>foo <!-- this is a
comment - with hyphen --></p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5731
@ -3312,6 +3448,51 @@ foo <!-- not a comment -- two hyphens -->
<p>foo &lt;!-- not a comment -- two hyphens --&gt;</p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5739
.
foo <?php echo $a; ?>
.
<p>foo <?php echo $a; ?></p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5747
.
foo <!ELEMENT br EMPTY>
.
<p>foo <!ELEMENT br EMPTY></p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5755
.
foo <![CDATA[>&<]]>
.
<p>foo <![CDATA[>&<]]></p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5763
.
<a href="&ouml;">
.
<p><a href="&ouml;"></p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5771
.
<a href="\*">
.
<p><a href="\*"></p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5777
@ -3396,6 +3577,28 @@ span`
<p><code>code\ span</code></p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5873
.
<a href="foo
bar">
.
<p><a href="foo
bar"></p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5881
.
<a href="foo\
bar">
.
<p><a href="foo\
bar"></p>
.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src line: 5897

Loading…
Cancel
Save