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
@@ -6,7 +6,7 @@ module MarkdownIt
|
|
6
6
|
|
7
7
|
#------------------------------------------------------------------------------
|
8
8
|
def self.code(state, startLine, endLine, silent = true)
|
9
|
-
return false if (state.
|
9
|
+
return false if (state.sCount[startLine] - state.blkIndent < 4)
|
10
10
|
|
11
11
|
last = nextLine = startLine + 1
|
12
12
|
while nextLine < endLine
|
@@ -14,7 +14,8 @@ module MarkdownIt
|
|
14
14
|
nextLine += 1
|
15
15
|
next
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
|
+
if (state.sCount[nextLine] - state.blkIndent >= 4)
|
18
19
|
nextLine += 1
|
19
20
|
last = nextLine
|
20
21
|
next
|
@@ -22,7 +23,7 @@ module MarkdownIt
|
|
22
23
|
break
|
23
24
|
end
|
24
25
|
|
25
|
-
state.line =
|
26
|
+
state.line = last
|
26
27
|
|
27
28
|
token = state.push('code_block', 'code', 0)
|
28
29
|
token.content = state.getLines(startLine, last, 4 + state.blkIndent, true)
|
@@ -3,6 +3,7 @@
|
|
3
3
|
module MarkdownIt
|
4
4
|
module RulesBlock
|
5
5
|
class Fence
|
6
|
+
extend Common::Utils
|
6
7
|
|
7
8
|
#------------------------------------------------------------------------------
|
8
9
|
def self.fence(state, startLine, endLine, silent)
|
@@ -10,6 +11,9 @@ module MarkdownIt
|
|
10
11
|
pos = state.bMarks[startLine] + state.tShift[startLine]
|
11
12
|
max = state.eMarks[startLine]
|
12
13
|
|
14
|
+
# if it's indented more than 3 spaces, it should be a code block
|
15
|
+
return false if state.sCount[startLine] - state.blkIndent >= 4
|
16
|
+
|
13
17
|
return false if pos + 3 > max
|
14
18
|
|
15
19
|
marker = state.src.charCodeAt(pos)
|
@@ -28,7 +32,7 @@ module MarkdownIt
|
|
28
32
|
markup = state.src.slice(mem...pos)
|
29
33
|
params = state.src.slice(pos...max)
|
30
34
|
|
31
|
-
return false if params.include?(
|
35
|
+
return false if params.include?(fromCharCode(marker))
|
32
36
|
|
33
37
|
# Since start is found, we can report success here in validation mode
|
34
38
|
return true if silent
|
@@ -47,7 +51,7 @@ module MarkdownIt
|
|
47
51
|
pos = mem = state.bMarks[nextLine] + state.tShift[nextLine]
|
48
52
|
max = state.eMarks[nextLine];
|
49
53
|
|
50
|
-
if pos < max && state.
|
54
|
+
if pos < max && state.sCount[nextLine] < state.blkIndent
|
51
55
|
# non-empty line with negative indent should stop the list:
|
52
56
|
# - ```
|
53
57
|
# test
|
@@ -56,7 +60,7 @@ module MarkdownIt
|
|
56
60
|
|
57
61
|
next if state.src.charCodeAt(pos) != marker
|
58
62
|
|
59
|
-
if state.
|
63
|
+
if state.sCount[nextLine] - state.blkIndent >= 4
|
60
64
|
# closing fence should be indented less than 4 spaces
|
61
65
|
next
|
62
66
|
end
|
@@ -77,7 +81,8 @@ module MarkdownIt
|
|
77
81
|
end
|
78
82
|
|
79
83
|
# If a fence has heading spaces, they should be removed from its inner block
|
80
|
-
len = state.
|
84
|
+
len = state.sCount[startLine]
|
85
|
+
|
81
86
|
state.line = nextLine + (haveEndMarker ? 1 : 0)
|
82
87
|
|
83
88
|
token = state.push('fence', 'code', 0)
|
@@ -3,11 +3,16 @@
|
|
3
3
|
module MarkdownIt
|
4
4
|
module RulesBlock
|
5
5
|
class Heading
|
6
|
+
extend Common::Utils
|
6
7
|
|
7
8
|
#------------------------------------------------------------------------------
|
8
9
|
def self.heading(state, startLine, endLine, silent)
|
9
10
|
pos = state.bMarks[startLine] + state.tShift[startLine]
|
10
11
|
max = state.eMarks[startLine]
|
12
|
+
|
13
|
+
# if it's indented more than 3 spaces, it should be a code block
|
14
|
+
return false if state.sCount[startLine] - state.blkIndent >= 4
|
15
|
+
|
11
16
|
ch = state.src.charCodeAt(pos)
|
12
17
|
|
13
18
|
return false if (ch != 0x23 || pos >= max)
|
@@ -22,15 +27,15 @@ module MarkdownIt
|
|
22
27
|
ch = state.src.charCodeAt(pos)
|
23
28
|
end
|
24
29
|
|
25
|
-
return false if (level > 6 || (pos < max && ch
|
30
|
+
return false if (level > 6 || (pos < max && !isSpace(ch)))
|
26
31
|
|
27
32
|
return true if (silent)
|
28
33
|
|
29
34
|
# Let's cut tails like ' ### ' from the end of string
|
30
35
|
|
31
|
-
max = state.
|
36
|
+
max = state.skipSpacesBack(max, pos)
|
32
37
|
tmp = state.skipCharsBack(max, 0x23, pos) # '#'
|
33
|
-
if (tmp > pos && state.src.charCodeAt(tmp - 1)
|
38
|
+
if (tmp > pos && isSpace(state.src.charCodeAt(tmp - 1)))
|
34
39
|
max = tmp
|
35
40
|
end
|
36
41
|
|
@@ -3,11 +3,16 @@
|
|
3
3
|
module MarkdownIt
|
4
4
|
module RulesBlock
|
5
5
|
class Hr
|
6
|
+
extend Common::Utils
|
6
7
|
|
7
8
|
#------------------------------------------------------------------------------
|
8
9
|
def self.hr(state, startLine, endLine, silent)
|
9
10
|
pos = state.bMarks[startLine] + state.tShift[startLine]
|
10
11
|
max = state.eMarks[startLine]
|
12
|
+
|
13
|
+
# if it's indented more than 3 spaces, it should be a code block
|
14
|
+
return false if (state.sCount[startLine] - state.blkIndent >= 4)
|
15
|
+
|
11
16
|
marker = state.src.charCodeAt(pos)
|
12
17
|
pos += 1
|
13
18
|
|
@@ -18,18 +23,18 @@ module MarkdownIt
|
|
18
23
|
return false
|
19
24
|
end
|
20
25
|
|
21
|
-
# markers can be mixed with spaces, but there should be at least 3
|
26
|
+
# markers can be mixed with spaces, but there should be at least 3 of them
|
22
27
|
|
23
28
|
cnt = 1
|
24
29
|
while (pos < max)
|
25
30
|
ch = state.src.charCodeAt(pos)
|
26
31
|
pos += 1
|
27
|
-
return false if
|
28
|
-
cnt += 1 if
|
32
|
+
return false if ch != marker && !isSpace(ch)
|
33
|
+
cnt += 1 if ch == marker
|
29
34
|
end
|
30
35
|
|
31
|
-
return false if
|
32
|
-
return true if
|
36
|
+
return false if cnt < 3
|
37
|
+
return true if silent
|
33
38
|
|
34
39
|
state.line = startLine + 1
|
35
40
|
|
@@ -24,8 +24,11 @@ module MarkdownIt
|
|
24
24
|
pos = state.bMarks[startLine] + state.tShift[startLine]
|
25
25
|
max = state.eMarks[startLine]
|
26
26
|
|
27
|
+
# if it's indented more than 3 spaces, it should be a code block
|
28
|
+
return false if state.sCount[startLine] - state.blkIndent >= 4
|
29
|
+
|
27
30
|
return false if !state.md.options[:html]
|
28
|
-
return false if state.src.charCodeAt(pos) != 0x3C # <
|
31
|
+
return false if state.src.charCodeAt(pos) != 0x3C # <
|
29
32
|
|
30
33
|
lineText = state.src.slice(pos...max)
|
31
34
|
|
@@ -34,7 +37,7 @@ module MarkdownIt
|
|
34
37
|
break if HTML_SEQUENCES[i][0].match(lineText)
|
35
38
|
i += 1
|
36
39
|
end
|
37
|
-
|
40
|
+
|
38
41
|
return false if i == HTML_SEQUENCES.length
|
39
42
|
|
40
43
|
if silent
|
@@ -48,7 +51,7 @@ module MarkdownIt
|
|
48
51
|
# Let's roll down till block end.
|
49
52
|
if !HTML_SEQUENCES[i][1].match(lineText)
|
50
53
|
while nextLine < endLine
|
51
|
-
break if state.
|
54
|
+
break if state.sCount[nextLine] < state.blkIndent
|
52
55
|
|
53
56
|
pos = state.bMarks[nextLine] + state.tShift[nextLine]
|
54
57
|
max = state.eMarks[nextLine]
|
@@ -6,46 +6,84 @@ module MarkdownIt
|
|
6
6
|
|
7
7
|
#------------------------------------------------------------------------------
|
8
8
|
def self.lheading(state, startLine, endLine, silent = true)
|
9
|
-
nextLine
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
9
|
+
nextLine = startLine + 1
|
10
|
+
terminatorRules = state.md.block.ruler.getRules('paragraph')
|
11
|
+
|
12
|
+
# if it's indented more than 3 spaces, it should be a code block
|
13
|
+
return false if state.sCount[startLine] - state.blkIndent >= 4
|
14
|
+
|
15
|
+
oldParentType = state.parentType
|
16
|
+
state.parentType = 'paragraph' # use paragraph to match terminatorRules
|
17
|
+
|
18
|
+
# jump line-by-line until empty one or EOF
|
19
|
+
while nextLine < endLine && !state.isEmpty(nextLine)
|
20
|
+
# this would be a code block normally, but after paragraph
|
21
|
+
# it's considered a lazy continuation regardless of what's there
|
22
|
+
(nextLine += 1) and next if (state.sCount[nextLine] - state.blkIndent > 3)
|
23
|
+
|
24
|
+
#
|
25
|
+
# Check for underline in setext header
|
26
|
+
#
|
27
|
+
if state.sCount[nextLine] >= state.blkIndent
|
28
|
+
pos = state.bMarks[nextLine] + state.tShift[nextLine]
|
29
|
+
max = state.eMarks[nextLine]
|
30
|
+
|
31
|
+
if pos < max
|
32
|
+
marker = state.src.charCodeAt(pos)
|
33
|
+
|
34
|
+
if marker == 0x2D || marker == 0x3D # - or =
|
35
|
+
pos = state.skipChars(pos, marker)
|
36
|
+
pos = state.skipSpaces(pos)
|
37
|
+
|
38
|
+
if pos >= max
|
39
|
+
level = (marker == 0x3D ? 1 : 2) # =
|
40
|
+
break
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# quirk for blockquotes, this line should already be checked by that rule
|
47
|
+
(nextLine += 1) and next if state.sCount[nextLine] < 0
|
48
|
+
|
49
|
+
# Some tags can terminate paragraph without empty line.
|
50
|
+
terminate = false
|
51
|
+
l = terminatorRules.length
|
52
|
+
0.upto(l - 1) do |i|
|
53
|
+
if terminatorRules[i].call(state, nextLine, endLine, true)
|
54
|
+
terminate = true
|
55
|
+
break
|
56
|
+
end
|
57
|
+
end
|
58
|
+
break if terminate
|
59
|
+
|
60
|
+
nextLine += 1
|
61
|
+
end
|
62
|
+
|
63
|
+
if !level
|
64
|
+
# Didn't find valid underline
|
65
|
+
return false
|
66
|
+
end
|
67
|
+
|
68
|
+
content = state.getLines(startLine, nextLine, state.blkIndent, false).strip
|
33
69
|
|
34
70
|
state.line = nextLine + 1
|
35
|
-
level = (marker == 0x3D ? 1 : 2) # =
|
36
71
|
|
37
72
|
token = state.push('heading_open', "h#{level.to_s}", 1)
|
38
73
|
token.markup = marker.chr
|
39
74
|
token.map = [ startLine, state.line ]
|
40
75
|
|
41
76
|
token = state.push('inline', '', 0)
|
42
|
-
token.content = state.src.slice(pos...state.eMarks[startLine]).strip
|
77
|
+
# token.content = state.src.slice(pos...state.eMarks[startLine]).strip
|
78
|
+
token.content = content
|
43
79
|
token.map = [ startLine, state.line - 1 ]
|
44
80
|
token.children = []
|
45
81
|
|
46
82
|
token = state.push('heading_close', "h#{level.to_s}", -1)
|
47
83
|
token.markup = marker.chr
|
48
84
|
|
85
|
+
state.parentType = oldParentType
|
86
|
+
|
49
87
|
return true
|
50
88
|
end
|
51
89
|
|
@@ -3,8 +3,9 @@
|
|
3
3
|
module MarkdownIt
|
4
4
|
module RulesBlock
|
5
5
|
class List
|
6
|
+
extend Common::Utils
|
6
7
|
|
7
|
-
# Search `[-+*][\n ]`, returns next pos
|
8
|
+
# Search `[-+*][\n ]`, returns next pos after marker on success
|
8
9
|
# or -1 on fail.
|
9
10
|
#------------------------------------------------------------------------------
|
10
11
|
def self.skipBulletListMarker(state, startLine)
|
@@ -20,9 +21,13 @@ module MarkdownIt
|
|
20
21
|
return -1
|
21
22
|
end
|
22
23
|
|
23
|
-
if
|
24
|
-
|
25
|
-
|
24
|
+
if pos < max
|
25
|
+
ch = state.src.charCodeAt(pos)
|
26
|
+
|
27
|
+
if !isSpace(ch)
|
28
|
+
# " -test " - is not a list item
|
29
|
+
return -1
|
30
|
+
end
|
26
31
|
end
|
27
32
|
|
28
33
|
return pos
|
@@ -69,10 +74,13 @@ module MarkdownIt
|
|
69
74
|
return -1
|
70
75
|
end
|
71
76
|
|
77
|
+
if pos < max
|
78
|
+
ch = state.src.charCodeAt(pos)
|
72
79
|
|
73
|
-
|
74
|
-
|
75
|
-
|
80
|
+
if !isSpace(ch)
|
81
|
+
# " 1.test " - is not a list item
|
82
|
+
return -1
|
83
|
+
end
|
76
84
|
end
|
77
85
|
return pos
|
78
86
|
end
|
@@ -80,7 +88,7 @@ module MarkdownIt
|
|
80
88
|
#------------------------------------------------------------------------------
|
81
89
|
def self.markTightParagraphs(state, idx)
|
82
90
|
level = state.level + 2
|
83
|
-
|
91
|
+
|
84
92
|
i = idx + 2
|
85
93
|
l = state.tokens.length
|
86
94
|
while i < l
|
@@ -93,20 +101,48 @@ module MarkdownIt
|
|
93
101
|
end
|
94
102
|
end
|
95
103
|
|
96
|
-
|
97
104
|
#------------------------------------------------------------------------------
|
98
105
|
def self.list(state, startLine, endLine, silent)
|
106
|
+
isTerminatingParagraph = false
|
99
107
|
tight = true
|
100
108
|
|
109
|
+
# if it's indented more than 3 spaces, it should be a code block
|
110
|
+
return false if (state.sCount[startLine] - state.blkIndent >= 4)
|
111
|
+
|
112
|
+
# limit conditions when list can interrupt
|
113
|
+
# a paragraph (validation mode only)
|
114
|
+
if silent && state.parentType == 'paragraph'
|
115
|
+
# Next list item should still terminate previous list item;
|
116
|
+
#
|
117
|
+
# This code can fail if plugins use blkIndent as well as lists,
|
118
|
+
# but I hope the spec gets fixed long before that happens.
|
119
|
+
#
|
120
|
+
if state.tShift[startLine] >= state.blkIndent
|
121
|
+
isTerminatingParagraph = true
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
101
125
|
# Detect list type and position after marker
|
102
126
|
if ((posAfterMarker = skipOrderedListMarker(state, startLine)) >= 0)
|
103
|
-
isOrdered
|
127
|
+
isOrdered = true
|
128
|
+
start = state.bMarks[startLine] + state.tShift[startLine]
|
129
|
+
markerValue = state.src[start, posAfterMarker - start - 1].to_i
|
130
|
+
|
131
|
+
# If we're starting a new ordered list right after
|
132
|
+
# a paragraph, it should start with 1.
|
133
|
+
return false if isTerminatingParagraph && markerValue != 1
|
104
134
|
elsif ((posAfterMarker = skipBulletListMarker(state, startLine)) >= 0)
|
105
135
|
isOrdered = false
|
106
136
|
else
|
107
137
|
return false
|
108
138
|
end
|
109
139
|
|
140
|
+
# If we're starting a new unordered list right after
|
141
|
+
# a paragraph, first line should not be empty.
|
142
|
+
if isTerminatingParagraph
|
143
|
+
return false if state.skipSpaces(posAfterMarker) >= state.eMarks[startLine]
|
144
|
+
end
|
145
|
+
|
110
146
|
# We should terminate list on style change. Remember first one to compare.
|
111
147
|
markerCharCode = state.src.charCodeAt(posAfterMarker - 1)
|
112
148
|
|
@@ -139,15 +175,36 @@ module MarkdownIt
|
|
139
175
|
prevEmptyEnd = false
|
140
176
|
terminatorRules = state.md.block.ruler.getRules('list')
|
141
177
|
|
178
|
+
oldParentType = state.parentType
|
179
|
+
state.parentType = 'list'
|
180
|
+
|
142
181
|
while (nextLine < endLine)
|
143
|
-
|
182
|
+
pos = posAfterMarker
|
144
183
|
max = state.eMarks[nextLine]
|
145
184
|
|
185
|
+
initial = offset = state.sCount[nextLine] + posAfterMarker - (state.bMarks[startLine] + state.tShift[startLine])
|
186
|
+
|
187
|
+
while pos < max
|
188
|
+
ch = state.src.charCodeAt(pos)
|
189
|
+
|
190
|
+
if ch == 0x09
|
191
|
+
offset += 4 - (offset + state.bsCount[nextLine]) % 4
|
192
|
+
elsif ch == 0x20
|
193
|
+
offset += 1
|
194
|
+
else
|
195
|
+
break
|
196
|
+
end
|
197
|
+
|
198
|
+
pos += 1
|
199
|
+
end
|
200
|
+
|
201
|
+
contentStart = pos
|
202
|
+
|
146
203
|
if (contentStart >= max)
|
147
204
|
# trimming space in "- \n 3" case, indent is 1 here
|
148
205
|
indentAfterMarker = 1
|
149
206
|
else
|
150
|
-
indentAfterMarker =
|
207
|
+
indentAfterMarker = offset - initial
|
151
208
|
end
|
152
209
|
|
153
210
|
# If we have more than 4 spaces, the indent is 1
|
@@ -156,7 +213,7 @@ module MarkdownIt
|
|
156
213
|
|
157
214
|
# " - test"
|
158
215
|
# ^^^^^ - calculating total length of this thing
|
159
|
-
indent =
|
216
|
+
indent = initial + indentAfterMarker
|
160
217
|
|
161
218
|
# Run subparser & write tokens
|
162
219
|
token = state.push('list_item_open', 'li', 1)
|
@@ -166,13 +223,24 @@ module MarkdownIt
|
|
166
223
|
oldIndent = state.blkIndent
|
167
224
|
oldTight = state.tight
|
168
225
|
oldTShift = state.tShift[startLine]
|
169
|
-
|
170
|
-
state.tShift[startLine] = contentStart - state.bMarks[startLine]
|
226
|
+
oldLIndent = state.sCount[startLine]
|
171
227
|
state.blkIndent = indent
|
172
228
|
state.tight = true
|
173
|
-
state.
|
174
|
-
|
175
|
-
|
229
|
+
state.tShift[startLine] = contentStart - state.bMarks[startLine]
|
230
|
+
state.sCount[startLine] = offset
|
231
|
+
|
232
|
+
if contentStart >= max && state.isEmpty(startLine + 1)
|
233
|
+
# workaround for this case
|
234
|
+
# (list item is empty, list terminates before "foo"):
|
235
|
+
# ~~~~~~~~
|
236
|
+
# -
|
237
|
+
#
|
238
|
+
# foo
|
239
|
+
# ~~~~~~~~
|
240
|
+
state.line = [state.line + 2, endLine].min
|
241
|
+
else
|
242
|
+
state.md.block.tokenize(state, startLine, endLine, true)
|
243
|
+
end
|
176
244
|
|
177
245
|
# If any of list item is tight, mark list as tight
|
178
246
|
if (!state.tight || prevEmptyEnd)
|
@@ -184,8 +252,8 @@ module MarkdownIt
|
|
184
252
|
|
185
253
|
state.blkIndent = oldIndent
|
186
254
|
state.tShift[startLine] = oldTShift
|
255
|
+
state.sCount[startLine] = oldLIndent
|
187
256
|
state.tight = oldTight
|
188
|
-
state.parentType = oldParentType
|
189
257
|
|
190
258
|
token = state.push('list_item_close', 'li', -1)
|
191
259
|
token.markup = markerCharCode.chr
|
@@ -195,12 +263,11 @@ module MarkdownIt
|
|
195
263
|
contentStart = state.bMarks[startLine]
|
196
264
|
|
197
265
|
break if (nextLine >= endLine)
|
198
|
-
break if (state.isEmpty(nextLine))
|
199
266
|
|
200
267
|
#
|
201
268
|
# Try to check if list is terminated or continued.
|
202
269
|
#
|
203
|
-
break if (state.
|
270
|
+
break if (state.sCount[nextLine] < state.blkIndent)
|
204
271
|
|
205
272
|
# fail if terminating block found
|
206
273
|
terminate = false
|
@@ -224,7 +291,7 @@ module MarkdownIt
|
|
224
291
|
break if (markerCharCode != state.src.charCodeAt(posAfterMarker - 1))
|
225
292
|
end
|
226
293
|
|
227
|
-
#
|
294
|
+
# Finalize list
|
228
295
|
if (isOrdered)
|
229
296
|
token = state.push('ordered_list_close', 'ol', -1)
|
230
297
|
else
|
@@ -235,6 +302,8 @@ module MarkdownIt
|
|
235
302
|
listLines[1] = nextLine
|
236
303
|
state.line = nextLine
|
237
304
|
|
305
|
+
state.parentType = oldParentType
|
306
|
+
|
238
307
|
# mark paragraphs tight if needed
|
239
308
|
if (tight)
|
240
309
|
markTightParagraphs(state, listTokIdx)
|