motion-markdown-it 4.4.0 → 8.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +69 -16
- data/lib/motion-markdown-it.rb +7 -5
- data/lib/motion-markdown-it/common/html_blocks.rb +6 -2
- data/lib/motion-markdown-it/common/utils.rb +19 -4
- data/lib/motion-markdown-it/helpers/helper_wrapper.rb +9 -0
- data/lib/motion-markdown-it/helpers/parse_link_destination.rb +8 -7
- data/lib/motion-markdown-it/index.rb +60 -18
- data/lib/motion-markdown-it/parser_block.rb +7 -10
- data/lib/motion-markdown-it/parser_inline.rb +50 -14
- data/lib/motion-markdown-it/presets/commonmark.rb +7 -1
- data/lib/motion-markdown-it/presets/default.rb +4 -3
- data/lib/motion-markdown-it/presets/zero.rb +6 -1
- data/lib/motion-markdown-it/renderer.rb +46 -14
- data/lib/motion-markdown-it/rules_block/blockquote.rb +167 -31
- data/lib/motion-markdown-it/rules_block/code.rb +4 -3
- data/lib/motion-markdown-it/rules_block/fence.rb +9 -4
- data/lib/motion-markdown-it/rules_block/heading.rb +8 -3
- data/lib/motion-markdown-it/rules_block/hr.rb +10 -5
- data/lib/motion-markdown-it/rules_block/html_block.rb +6 -3
- data/lib/motion-markdown-it/rules_block/lheading.rb +64 -26
- data/lib/motion-markdown-it/rules_block/list.rb +91 -22
- data/lib/motion-markdown-it/rules_block/paragraph.rb +14 -9
- data/lib/motion-markdown-it/rules_block/reference.rb +24 -14
- data/lib/motion-markdown-it/rules_block/state_block.rb +79 -24
- data/lib/motion-markdown-it/rules_block/table.rb +52 -26
- data/lib/motion-markdown-it/rules_core/normalize.rb +1 -23
- data/lib/motion-markdown-it/rules_core/replacements.rb +22 -2
- data/lib/motion-markdown-it/rules_core/smartquotes.rb +41 -12
- data/lib/motion-markdown-it/rules_inline/autolink.rb +5 -4
- data/lib/motion-markdown-it/rules_inline/balance_pairs.rb +48 -0
- data/lib/motion-markdown-it/rules_inline/emphasis.rb +104 -149
- data/lib/motion-markdown-it/rules_inline/entity.rb +2 -2
- data/lib/motion-markdown-it/rules_inline/escape.rb +5 -3
- data/lib/motion-markdown-it/rules_inline/image.rb +12 -23
- data/lib/motion-markdown-it/rules_inline/link.rb +20 -25
- data/lib/motion-markdown-it/rules_inline/newline.rb +2 -1
- data/lib/motion-markdown-it/rules_inline/state_inline.rb +60 -1
- data/lib/motion-markdown-it/rules_inline/strikethrough.rb +81 -97
- data/lib/motion-markdown-it/rules_inline/text_collapse.rb +40 -0
- data/lib/motion-markdown-it/token.rb +46 -1
- data/lib/motion-markdown-it/version.rb +1 -1
- data/spec/motion-markdown-it/markdown_it_spec.rb +2 -2
- data/spec/motion-markdown-it/misc_spec.rb +90 -14
- data/spec/motion-markdown-it/testgen_helper.rb +1 -1
- data/spec/spec_helper.rb +2 -3
- metadata +13 -13
- data/lib/motion-markdown-it/common/url_schemas.rb +0 -173
- data/spec/motion-markdown-it/bench_mark_spec.rb +0 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e01060bf95d44944bd2081ba624c238497dfc66b
|
4
|
+
data.tar.gz: 8fdb0bc2d0b0d45dd2912af9541a34dba71776a2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e8e57f8c16c37aa08854257b56caf0a40428d8bce50c5b2ce7ad1d59ff724029fc97c59b152bd63e196b200da7ad7ef2a56132622c6e54279830b233e1baf398
|
7
|
+
data.tar.gz: 0adebed4df5b22d1f51c1204bea082074631d190705cc53056ddb7a0e2079aa8d3900fa71d8dd876852c113e45d07b3fcffb1b7325c35fe4a2690ca63f9d5bfc
|
data/README.md
CHANGED
@@ -3,17 +3,17 @@
|
|
3
3
|
[](http://badge.fury.io/rb/motion-markdown-it)
|
4
4
|
[](https://travis-ci.org/digitalmoksha/motion-markdown-it)
|
5
5
|
|
6
|
-
https://travis-ci.org/digitalmoksha/motion-markdown-it.svg?branch=master
|
7
6
|
Ruby/RubyMotion version of Markdown-it (CommonMark compliant and extendable)
|
8
7
|
|
9
|
-
This gem is a port of the [markdown-it Javascript package](https://github.com/markdown-it/markdown-it) by Vitaly Puzrin and Alex Kocharin. Currently synced with markdown-it
|
8
|
+
This gem is a port of the [markdown-it Javascript package](https://github.com/markdown-it/markdown-it) by Vitaly Puzrin and Alex Kocharin. Currently synced with markdown-it 8.4.1
|
9
|
+
|
10
|
+
---
|
10
11
|
|
11
12
|
__[Javascript Live demo](https://markdown-it.github.io)__
|
12
13
|
|
13
14
|
Follows the __[CommonMark spec](http://spec.commonmark.org/)__ + adds syntax extensions & sugar (URL autolinking, typographer).
|
14
15
|
- Configurable syntax. You can add new rules and even replace existing ones.
|
15
16
|
- [Safe](https://github.com/markdown-it/markdown-it/tree/master/docs/security.md) by default.
|
16
|
-
- Community-written plugins
|
17
17
|
- Community-written plugins
|
18
18
|
* [Ruby/RubyMotion](https://github.com/digitalmoksha/motion-markdown-it-plugins)
|
19
19
|
* [original javascript plugins](https://www.npmjs.org/browse/keyword/markdown-it-plugin) and [other packages](https://www.npmjs.org/browse/keyword/markdown-it) on npm.
|
@@ -24,7 +24,31 @@ The benefit of this project, for me at least, is to have a standardized CommonMa
|
|
24
24
|
|
25
25
|
## Performance
|
26
26
|
|
27
|
-
Performance is
|
27
|
+
Performance is slower than, say, `kramdown`, but for most uses, is pretty fast. Here are some non-scientific benchmarks. Note that `kramdown` and `redcarpet` are not CommonMark compliant.
|
28
|
+
|
29
|
+
```
|
30
|
+
Running tests on 2018-04-04 under ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin16]
|
31
|
+
|
32
|
+
==> Test using file mdsyntax.text and 500 runs
|
33
|
+
Rehearsal -------------------------------------------------------------
|
34
|
+
motion-markdown-it 8.4.1 17.940000 0.710000 18.650000 ( 18.721629)
|
35
|
+
kramdown 1.16.2 14.720000 0.180000 14.900000 ( 15.015840)
|
36
|
+
commonmarker 0.17.9 0.220000 0.000000 0.220000 ( 0.222098)
|
37
|
+
redcarpet 3.4.0 0.140000 0.010000 0.150000 ( 0.145821)
|
38
|
+
--------------------------------------------------- total: 33.920000sec
|
39
|
+
|
40
|
+
user system total real
|
41
|
+
motion-markdown-it 8.4.1 18.290000 0.720000 19.010000 ( 19.113943)
|
42
|
+
kramdown 1.16.2 13.320000 0.110000 13.430000 ( 13.459096)
|
43
|
+
commonmarker 0.17.9 0.190000 0.000000 0.190000 ( 0.187104)
|
44
|
+
redcarpet 3.4.0 0.120000 0.000000 0.120000 ( 0.123931)
|
45
|
+
|
46
|
+
Real time as a factor of motion-markdown-it
|
47
|
+
motion-markdown-it 8.4.1 1.0
|
48
|
+
kramdown 1.16.2 0.7042
|
49
|
+
commonmarker 0.17.9 0.0098
|
50
|
+
redcarpet 3.4.0 0.0065
|
51
|
+
````
|
28
52
|
|
29
53
|
## Table of content
|
30
54
|
|
@@ -114,7 +138,7 @@ parser = MarkdownIt::Parser.new({
|
|
114
138
|
quotes: '“”‘’',
|
115
139
|
|
116
140
|
# Highlighter function. Should return escaped HTML,
|
117
|
-
# or nil if the source string is not changed and should be escaped
|
141
|
+
# or nil if the source string is not changed and should be escaped externally.
|
118
142
|
highlight: lambda {|str, lang| return nil}
|
119
143
|
})
|
120
144
|
```
|
@@ -148,7 +172,7 @@ var md = require('markdown-it')()
|
|
148
172
|
Apply syntax highlighting to fenced code blocks with the `highlight` option:
|
149
173
|
|
150
174
|
```js
|
151
|
-
var hljs = require('highlight.js') // https://highlightjs.org/
|
175
|
+
var hljs = require('highlight.js'); // https://highlightjs.org/
|
152
176
|
|
153
177
|
// Actual default values
|
154
178
|
var md = require('markdown-it')({
|
@@ -159,15 +183,41 @@ var md = require('markdown-it')({
|
|
159
183
|
} catch (__) {}
|
160
184
|
}
|
161
185
|
|
162
|
-
try {
|
163
|
-
return hljs.highlightAuto(str).value;
|
164
|
-
} catch (__) {}
|
165
|
-
|
166
186
|
return ''; // use external default escaping
|
167
187
|
}
|
168
188
|
});
|
169
189
|
```
|
170
190
|
|
191
|
+
Or with full wrapper override (if you need assign class to `<pre>`):
|
192
|
+
|
193
|
+
```js
|
194
|
+
var hljs = require('highlight.js'); // https://highlightjs.org/
|
195
|
+
|
196
|
+
// Actual default values
|
197
|
+
var md = require('markdown-it')({
|
198
|
+
highlight: function (str, lang) {
|
199
|
+
if (lang && hljs.getLanguage(lang)) {
|
200
|
+
try {
|
201
|
+
return '<pre class="hljs"><code>' +
|
202
|
+
hljs.highlight(lang, str, true).value +
|
203
|
+
'</code></pre>';
|
204
|
+
} catch (__) {}
|
205
|
+
}
|
206
|
+
|
207
|
+
return '<pre class="hljs"><code>' + md.utils.escapeHtml(str) + '</code></pre>';
|
208
|
+
}
|
209
|
+
});
|
210
|
+
```
|
211
|
+
|
212
|
+
### Linkify
|
213
|
+
|
214
|
+
`linkify: true` uses [linkify-it](https://github.com/markdown-it/linkify-it). To
|
215
|
+
configure linkify-it, access the linkify instance through `md.linkify`:
|
216
|
+
|
217
|
+
```js
|
218
|
+
md.linkify.tlds('.py', false); // disables .py as top level domain
|
219
|
+
```
|
220
|
+
|
171
221
|
|
172
222
|
## API
|
173
223
|
|
@@ -181,8 +231,8 @@ If you are going to write plugins - take a look at
|
|
181
231
|
|
182
232
|
Embedded (enabled by default):
|
183
233
|
|
184
|
-
- [Tables](https://help.github.com/articles/
|
185
|
-
- [Strikethrough](https://help.github.com/articles/
|
234
|
+
- [Tables](https://help.github.com/articles/organizing-information-with-tables/) (GFM)
|
235
|
+
- [Strikethrough](https://help.github.com/articles/basic-writing-and-formatting-syntax/#styling-text) (GFM)
|
186
236
|
|
187
237
|
Via plugins:
|
188
238
|
|
@@ -211,7 +261,7 @@ var md = require('markdown-it')()
|
|
211
261
|
.enable('image');
|
212
262
|
|
213
263
|
// Enable everything
|
214
|
-
md = require('markdown-it')(
|
264
|
+
md = require('markdown-it')({
|
215
265
|
html: true,
|
216
266
|
linkify: true,
|
217
267
|
typographer: true,
|
@@ -219,12 +269,14 @@ md = require('markdown-it')('full', {
|
|
219
269
|
```
|
220
270
|
|
221
271
|
|
222
|
-
## Benchmark
|
272
|
+
## Benchmark
|
223
273
|
|
224
274
|
Here is the result of readme parse at MB Pro Retina 2013 (2.4 GHz):
|
225
275
|
|
226
276
|
```bash
|
227
|
-
|
277
|
+
make benchmark-deps
|
278
|
+
benchmark/benchmark.js readme
|
279
|
+
|
228
280
|
Selected samples: (1 of 28)
|
229
281
|
> README
|
230
282
|
|
@@ -232,7 +284,7 @@ Sample: README.md (7774 bytes)
|
|
232
284
|
> commonmark-reference x 1,222 ops/sec ±0.96% (97 runs sampled)
|
233
285
|
> current x 743 ops/sec ±0.84% (97 runs sampled)
|
234
286
|
> current-commonmark x 1,568 ops/sec ±0.84% (98 runs sampled)
|
235
|
-
> marked
|
287
|
+
> marked x 1,587 ops/sec ±4.31% (93 runs sampled)
|
236
288
|
```
|
237
289
|
|
238
290
|
__Note.__ CommonMark version runs with [simplified link normalizers](https://github.com/markdown-it/markdown-it/blob/master/benchmark/implementations/current-commonmark/index.js)
|
@@ -242,6 +294,7 @@ As you can see, `markdown-it` doesn't pay with speed for it's flexibility.
|
|
242
294
|
Slowdown of "full" version caused by additional features not available in
|
243
295
|
other implementations.
|
244
296
|
|
297
|
+
|
245
298
|
-->
|
246
299
|
|
247
300
|
## References / Thanks
|
data/lib/motion-markdown-it.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
if defined?(Motion::Project::Config)
|
4
|
-
|
4
|
+
|
5
5
|
lib_dir_path = File.dirname(File.expand_path(__FILE__))
|
6
6
|
Motion::Project::App.setup do |app|
|
7
7
|
app.files.unshift(Dir.glob(File.join(lib_dir_path, "motion-markdown-it/**/*.rb")))
|
@@ -12,7 +12,7 @@ if defined?(Motion::Project::Config)
|
|
12
12
|
require 'uc.micro-rb'
|
13
13
|
|
14
14
|
else
|
15
|
-
|
15
|
+
|
16
16
|
require 'mdurl-rb'
|
17
17
|
require 'uc.micro-rb'
|
18
18
|
require 'linkify-it-rb'
|
@@ -23,13 +23,13 @@ else
|
|
23
23
|
require 'motion-markdown-it/common/entities'
|
24
24
|
require 'motion-markdown-it/common/utils'
|
25
25
|
require 'motion-markdown-it/common/html_blocks'
|
26
|
-
require 'motion-markdown-it/common/url_schemas'
|
27
26
|
require 'motion-markdown-it/common/html_re'
|
28
27
|
require 'motion-markdown-it/common/string'
|
29
28
|
require 'motion-markdown-it/common/simpleidn'
|
30
29
|
require 'motion-markdown-it/helpers/parse_link_destination'
|
31
30
|
require 'motion-markdown-it/helpers/parse_link_label'
|
32
31
|
require 'motion-markdown-it/helpers/parse_link_title'
|
32
|
+
require 'motion-markdown-it/helpers/helper_wrapper'
|
33
33
|
require 'motion-markdown-it/parser_inline'
|
34
34
|
require 'motion-markdown-it/parser_block'
|
35
35
|
require 'motion-markdown-it/parser_core'
|
@@ -55,6 +55,7 @@ else
|
|
55
55
|
require 'motion-markdown-it/rules_block/table'
|
56
56
|
require 'motion-markdown-it/rules_inline/autolink'
|
57
57
|
require 'motion-markdown-it/rules_inline/backticks'
|
58
|
+
require 'motion-markdown-it/rules_inline/balance_pairs'
|
58
59
|
require 'motion-markdown-it/rules_inline/emphasis'
|
59
60
|
require 'motion-markdown-it/rules_inline/entity'
|
60
61
|
require 'motion-markdown-it/rules_inline/escape'
|
@@ -64,10 +65,11 @@ else
|
|
64
65
|
require 'motion-markdown-it/rules_inline/newline'
|
65
66
|
require 'motion-markdown-it/rules_inline/state_inline'
|
66
67
|
require 'motion-markdown-it/rules_inline/strikethrough'
|
68
|
+
require 'motion-markdown-it/rules_inline/text_collapse'
|
67
69
|
require 'motion-markdown-it/rules_inline/text'
|
68
|
-
|
70
|
+
|
69
71
|
require 'motion-markdown-it/ruler'
|
70
72
|
require 'motion-markdown-it/token'
|
71
73
|
require 'motion-markdown-it/index'
|
72
|
-
|
74
|
+
|
73
75
|
end
|
@@ -29,10 +29,16 @@ module MarkdownIt
|
|
29
29
|
'frame',
|
30
30
|
'frameset',
|
31
31
|
'h1',
|
32
|
+
'h2',
|
33
|
+
'h3',
|
34
|
+
'h4',
|
35
|
+
'h5',
|
36
|
+
'h6',
|
32
37
|
'head',
|
33
38
|
'header',
|
34
39
|
'hr',
|
35
40
|
'html',
|
41
|
+
'iframe',
|
36
42
|
'legend',
|
37
43
|
'li',
|
38
44
|
'link',
|
@@ -47,10 +53,8 @@ module MarkdownIt
|
|
47
53
|
'option',
|
48
54
|
'p',
|
49
55
|
'param',
|
50
|
-
'pre',
|
51
56
|
'section',
|
52
57
|
'source',
|
53
|
-
'title',
|
54
58
|
'summary',
|
55
59
|
'table',
|
56
60
|
'tbody',
|
@@ -51,6 +51,11 @@ module MarkdownIt
|
|
51
51
|
c.chr(Encoding::UTF_8)
|
52
52
|
end
|
53
53
|
|
54
|
+
#------------------------------------------------------------------------------
|
55
|
+
def fromCharCode(c)
|
56
|
+
c.chr
|
57
|
+
end
|
58
|
+
|
54
59
|
|
55
60
|
UNESCAPE_MD_RE = /\\([\!\"\#\$\%\&\'\(\)\*\+\,\-.\/:;<=>?@\[\\\]^_`{|}~])/
|
56
61
|
|
@@ -63,7 +68,7 @@ module MarkdownIt
|
|
63
68
|
def replaceEntityPattern(match, name)
|
64
69
|
code = 0
|
65
70
|
|
66
|
-
return HTMLEntities::MAPPINGS[name]
|
71
|
+
return fromCodePoint(HTMLEntities::MAPPINGS[name]) if HTMLEntities::MAPPINGS[name]
|
67
72
|
|
68
73
|
if (name.charCodeAt(0) == 0x23 && DIGITAL_ENTITY_TEST_RE =~ name) # '#'
|
69
74
|
code = name[1].downcase == 'x' ? name.slice_to_end(2).to_i(16) : name.slice_to_end(1).to_i
|
@@ -116,6 +121,16 @@ module MarkdownIt
|
|
116
121
|
str.gsub(REGEXP_ESCAPE_RE) {|s| '\\' + s}
|
117
122
|
end
|
118
123
|
|
124
|
+
#------------------------------------------------------------------------------
|
125
|
+
def isSpace(code)
|
126
|
+
case code
|
127
|
+
when 0x09,
|
128
|
+
0x20
|
129
|
+
return true
|
130
|
+
end
|
131
|
+
|
132
|
+
return false
|
133
|
+
end
|
119
134
|
|
120
135
|
# Zs (unicode class) || [\t\f\v\r\n]
|
121
136
|
#------------------------------------------------------------------------------
|
@@ -142,13 +157,13 @@ module MarkdownIt
|
|
142
157
|
|
143
158
|
# Currently without astral characters support.
|
144
159
|
#------------------------------------------------------------------------------
|
145
|
-
def isPunctChar(
|
146
|
-
return UNICODE_PUNCT_RE =~
|
160
|
+
def isPunctChar(ch)
|
161
|
+
return UNICODE_PUNCT_RE =~ ch
|
147
162
|
end
|
148
163
|
|
149
164
|
|
150
165
|
# Markdown ASCII punctuation characters.
|
151
|
-
#
|
166
|
+
#
|
152
167
|
# !, ", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \, ], ^, _, `, {, |, }, or ~
|
153
168
|
# http://spec.commonmark.org/0.15/#ascii-punctuation-character
|
154
169
|
#
|
@@ -3,18 +3,19 @@
|
|
3
3
|
module MarkdownIt
|
4
4
|
module Helpers
|
5
5
|
module ParseLinkDestination
|
6
|
-
|
6
|
+
include Common::Utils
|
7
|
+
|
7
8
|
#------------------------------------------------------------------------------
|
8
9
|
def parseLinkDestination(str, pos, max)
|
9
10
|
lines = 0
|
10
11
|
start = pos
|
11
12
|
result = {ok: false, pos: 0, lines: 0, str: ''}
|
12
13
|
|
13
|
-
if (str.charCodeAt(pos) == 0x3C ) # <
|
14
|
+
if (str.charCodeAt(pos) == 0x3C ) # <
|
14
15
|
pos += 1
|
15
16
|
while (pos < max)
|
16
17
|
code = str.charCodeAt(pos)
|
17
|
-
return result if (code == 0x0A ) # \n
|
18
|
+
return result if (code == 0x0A || isSpace(code)) # \n
|
18
19
|
if (code == 0x3E) # >
|
19
20
|
result[:pos] = pos + 1
|
20
21
|
result[:str] = unescapeAll(str.slice((start + 1)...pos))
|
@@ -36,7 +37,7 @@ module MarkdownIt
|
|
36
37
|
# this should be ... } else { ... branch
|
37
38
|
|
38
39
|
level = 0
|
39
|
-
while (pos < max)
|
40
|
+
while (pos < max)
|
40
41
|
code = str.charCodeAt(pos)
|
41
42
|
|
42
43
|
break if (code == 0x20)
|
@@ -51,18 +52,18 @@ module MarkdownIt
|
|
51
52
|
|
52
53
|
if (code == 0x28) # (
|
53
54
|
level += 1
|
54
|
-
break if (level > 1)
|
55
55
|
end
|
56
56
|
|
57
57
|
if (code == 0x29) # )
|
58
|
+
break if (level == 0)
|
58
59
|
level -= 1
|
59
|
-
break if (level < 0)
|
60
60
|
end
|
61
61
|
|
62
62
|
pos += 1
|
63
63
|
end
|
64
64
|
|
65
|
-
return result if
|
65
|
+
return result if start == pos
|
66
|
+
return result if level != 0
|
66
67
|
|
67
68
|
result[:str] = unescapeAll(str.slice(start...pos))
|
68
69
|
result[:lines] = lines
|
@@ -46,7 +46,7 @@ NORMALIZE_LINK = lambda do |url|
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
return MDUrl::Encode.encode(MDUrl::Format.format(parsed))
|
51
51
|
end
|
52
52
|
|
@@ -75,29 +75,29 @@ end
|
|
75
75
|
|
76
76
|
#------------------------------------------------------------------------------
|
77
77
|
# class MarkdownIt
|
78
|
-
#
|
78
|
+
#
|
79
79
|
# Main parser/renderer class.
|
80
|
-
#
|
80
|
+
#
|
81
81
|
# ##### Usage
|
82
|
-
#
|
82
|
+
#
|
83
83
|
# ```javascript
|
84
84
|
# // node.js, "classic" way:
|
85
85
|
# var MarkdownIt = require('markdown-it'),
|
86
86
|
# md = new MarkdownIt();
|
87
87
|
# var result = md.render('# markdown-it rulezz!');
|
88
|
-
#
|
88
|
+
#
|
89
89
|
# // node.js, the same, but with sugar:
|
90
90
|
# var md = require('markdown-it')();
|
91
91
|
# var result = md.render('# markdown-it rulezz!');
|
92
|
-
#
|
92
|
+
#
|
93
93
|
# // browser without AMD, added to "window" on script load
|
94
94
|
# // Note, there are no dash.
|
95
95
|
# var md = window.markdownit();
|
96
96
|
# var result = md.render('# markdown-it rulezz!');
|
97
97
|
# ```
|
98
|
-
#
|
98
|
+
#
|
99
99
|
# Single line rendering, without paragraph wrap:
|
100
|
-
#
|
100
|
+
#
|
101
101
|
# ```javascript
|
102
102
|
# var md = require('markdown-it')();
|
103
103
|
# var result = md.renderInline('__markdown-it__ rulezz!');
|
@@ -106,6 +106,7 @@ end
|
|
106
106
|
module MarkdownIt
|
107
107
|
class Parser
|
108
108
|
include MarkdownIt::Common::Utils
|
109
|
+
include MarkdownIt::Helpers
|
109
110
|
|
110
111
|
attr_accessor :inline
|
111
112
|
attr_accessor :block
|
@@ -116,7 +117,8 @@ module MarkdownIt
|
|
116
117
|
attr_accessor :normalizeLink
|
117
118
|
attr_accessor :normalizeLinkText
|
118
119
|
attr_accessor :linkify
|
119
|
-
|
120
|
+
attr_accessor :helpers
|
121
|
+
|
120
122
|
# new MarkdownIt([presetName, options])
|
121
123
|
# - presetName (String): optional, `commonmark` / `zero`
|
122
124
|
# - options (Object)
|
@@ -158,7 +160,8 @@ module MarkdownIt
|
|
158
160
|
# `['«\xA0', '\xA0»', '‹\xA0', '\xA0›']` for French (including nbsp).
|
159
161
|
# - __highlight__ - `nil`. Highlighter function for fenced code blocks.
|
160
162
|
# Highlighter `function (str, lang)` should return escaped HTML. It can also
|
161
|
-
# return nil if the source was not changed and should be escaped
|
163
|
+
# return nil if the source was not changed and should be escaped
|
164
|
+
# externaly. If result starts with <pre... internal wrapper is skipped.
|
162
165
|
#
|
163
166
|
# ##### Example
|
164
167
|
#
|
@@ -186,18 +189,35 @@ module MarkdownIt
|
|
186
189
|
# highlight: function (str, lang) {
|
187
190
|
# if (lang && hljs.getLanguage(lang)) {
|
188
191
|
# try {
|
189
|
-
# return hljs.highlight(lang, str).value;
|
192
|
+
# return hljs.highlight(lang, str, true).value;
|
190
193
|
# } catch (__) {}
|
191
194
|
# }
|
192
195
|
#
|
193
|
-
# try {
|
194
|
-
# return hljs.highlightAuto(str).value;
|
195
|
-
# } catch (__) {}
|
196
|
-
#
|
197
196
|
# return ''; // use external default escaping
|
198
197
|
# }
|
199
198
|
# });
|
200
199
|
# ```
|
200
|
+
#
|
201
|
+
# Or with full wrapper override (if you need assign class to `<pre>`):
|
202
|
+
#
|
203
|
+
# ```javascript
|
204
|
+
# var hljs = require('highlight.js') // https://highlightjs.org/
|
205
|
+
#
|
206
|
+
# // Actual default values
|
207
|
+
# var md = require('markdown-it')({
|
208
|
+
# highlight: function (str, lang) {
|
209
|
+
# if (lang && hljs.getLanguage(lang)) {
|
210
|
+
# try {
|
211
|
+
# return '<pre class="hljs"><code>' +
|
212
|
+
# hljs.highlight(lang, str, true).value +
|
213
|
+
# '</code></pre>';
|
214
|
+
# } catch (__) {}
|
215
|
+
# }
|
216
|
+
#
|
217
|
+
# return '<pre class="hljs"><code>' + md.utils.escapeHtml(str) + '</code></pre>';
|
218
|
+
# }
|
219
|
+
# });
|
220
|
+
# ```
|
201
221
|
#-----------------------------------------------------------------------------
|
202
222
|
def initialize(presetName = :default, options = {})
|
203
223
|
if options.empty?
|
@@ -284,6 +304,19 @@ module MarkdownIt
|
|
284
304
|
|
285
305
|
# Expose utils & helpers for easy acces from plugins
|
286
306
|
|
307
|
+
# MarkdownIt#utils -> utils
|
308
|
+
#
|
309
|
+
# Assorted utility functions, useful to write plugins. See details
|
310
|
+
# [here](https://github.com/markdown-it/markdown-it/blob/master/lib/common/utils.js).
|
311
|
+
# this.utils = utils;
|
312
|
+
|
313
|
+
# MarkdownIt#helpers -> helpers
|
314
|
+
#
|
315
|
+
# Link components parser functions, useful to write plugins. See details
|
316
|
+
# [here](https://github.com/markdown-it/markdown-it/blob/master/lib/helpers).
|
317
|
+
# @helpers = assign({}, helpers);
|
318
|
+
@helpers = MarkdownIt::Helpers::HelperWrapper.new
|
319
|
+
|
287
320
|
@options = {}
|
288
321
|
configure(presetName)
|
289
322
|
set(options) if options
|
@@ -340,6 +373,9 @@ module MarkdownIt
|
|
340
373
|
if presets[:components][name][:rules]
|
341
374
|
self.send(name).ruler.enableOnly(presets[:components][name][:rules])
|
342
375
|
end
|
376
|
+
if presets[:components][name][:rules2]
|
377
|
+
self.send(name).ruler2.enableOnly(presets[:components][name][:rules2])
|
378
|
+
end
|
343
379
|
end
|
344
380
|
end
|
345
381
|
return self
|
@@ -371,8 +407,10 @@ module MarkdownIt
|
|
371
407
|
result << @core.ruler.enable(list, true)
|
372
408
|
result << @block.ruler.enable(list, true)
|
373
409
|
result << @inline.ruler.enable(list, true)
|
410
|
+
result << @inline.ruler2.enable(list, true)
|
374
411
|
result.flatten!
|
375
|
-
|
412
|
+
|
413
|
+
|
376
414
|
missed = list.select {|name| !result.include?(name) }
|
377
415
|
if !(missed.empty? || ignoreInvalid)
|
378
416
|
raise StandardError, "MarkdownIt. Failed to enable unknown rule(s): #{missed}"
|
@@ -397,6 +435,7 @@ module MarkdownIt
|
|
397
435
|
result << @core.ruler.disable(list, true)
|
398
436
|
result << @block.ruler.disable(list, true)
|
399
437
|
result << @inline.ruler.disable(list, true)
|
438
|
+
result << @inline.ruler2.disable(list, true)
|
400
439
|
result.flatten!
|
401
440
|
|
402
441
|
missed = list.select {|name| !result.include?(name) }
|
@@ -418,11 +457,12 @@ module MarkdownIt
|
|
418
457
|
#
|
419
458
|
# ```ruby
|
420
459
|
# md = MarkdownIt::Parser.new
|
421
|
-
# md.use(MDPlugin::Iterator, 'foo_replace', 'text',
|
460
|
+
# md.use(MDPlugin::Iterator, 'foo_replace', 'text',
|
422
461
|
# lambda {|tokens, idx|
|
423
462
|
# tokens[idx].content = tokens[idx].content.gsub(/foo/, 'bar')
|
424
463
|
# })
|
425
464
|
# ```
|
465
|
+
#------------------------------------------------------------------------------
|
426
466
|
def use(plugin, *args)
|
427
467
|
plugin.init_plugin(self, *args)
|
428
468
|
return self
|
@@ -440,11 +480,13 @@ module MarkdownIt
|
|
440
480
|
# AST).
|
441
481
|
#
|
442
482
|
# `env` is used to pass data between "distributed" rules and return additional
|
443
|
-
# metadata like reference info, needed for
|
483
|
+
# metadata like reference info, needed for the renderer. It also can be used to
|
444
484
|
# inject data in specific cases. Usually, you will be ok to pass `{}`,
|
445
485
|
# and then pass updated object to renderer.
|
446
486
|
#------------------------------------------------------------------------------
|
447
487
|
def parse(src, env)
|
488
|
+
raise ArgumentError.new('Input data should be a String') if !src.is_a?(String)
|
489
|
+
|
448
490
|
state = RulesCore::StateCore.new(src, self, env)
|
449
491
|
@core.process(state)
|
450
492
|
return state.tokens
|