motion-markdown-it 8.4.1.1 → 9.0.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 +5 -5
- data/README.md +43 -2
- data/lib/motion-markdown-it/common/entities.rb +3 -0
- data/lib/motion-markdown-it/common/simpleidn.rb +8 -9
- data/lib/motion-markdown-it/common/utils.rb +48 -8
- data/lib/motion-markdown-it/helpers/parse_link_destination.rb +5 -5
- data/lib/motion-markdown-it/helpers/parse_link_label.rb +1 -1
- data/lib/motion-markdown-it/helpers/parse_link_title.rb +3 -3
- data/lib/motion-markdown-it/parser_core.rb +3 -3
- data/lib/motion-markdown-it/ruler.rb +3 -3
- data/lib/motion-markdown-it/rules_block/blockquote.rb +8 -8
- data/lib/motion-markdown-it/rules_block/fence.rb +5 -3
- data/lib/motion-markdown-it/rules_block/heading.rb +4 -4
- data/lib/motion-markdown-it/rules_block/hr.rb +2 -2
- data/lib/motion-markdown-it/rules_block/html_block.rb +2 -1
- data/lib/motion-markdown-it/rules_block/lheading.rb +2 -1
- data/lib/motion-markdown-it/rules_block/list.rb +36 -12
- data/lib/motion-markdown-it/rules_block/reference.rb +13 -13
- data/lib/motion-markdown-it/rules_block/state_block.rb +13 -11
- data/lib/motion-markdown-it/rules_block/table.rb +8 -8
- data/lib/motion-markdown-it/rules_core/linkify.rb +1 -1
- data/lib/motion-markdown-it/rules_core/normalize.rb +2 -2
- data/lib/motion-markdown-it/rules_core/replacements.rb +1 -1
- data/lib/motion-markdown-it/rules_core/smartquotes.rb +5 -5
- data/lib/motion-markdown-it/rules_inline/autolink.rb +3 -2
- data/lib/motion-markdown-it/rules_inline/backticks.rb +8 -5
- data/lib/motion-markdown-it/rules_inline/balance_pairs.rb +13 -3
- data/lib/motion-markdown-it/rules_inline/emphasis.rb +1 -1
- data/lib/motion-markdown-it/rules_inline/entity.rb +6 -6
- data/lib/motion-markdown-it/rules_inline/escape.rb +3 -3
- data/lib/motion-markdown-it/rules_inline/html_inline.rb +5 -5
- data/lib/motion-markdown-it/rules_inline/image.rb +8 -8
- data/lib/motion-markdown-it/rules_inline/link.rb +7 -7
- data/lib/motion-markdown-it/rules_inline/newline.rb +4 -4
- data/lib/motion-markdown-it/rules_inline/state_inline.rb +7 -7
- data/lib/motion-markdown-it/rules_inline/strikethrough.rb +1 -1
- data/lib/motion-markdown-it/rules_inline/text.rb +2 -1
- data/lib/motion-markdown-it/rules_inline/text_collapse.rb +10 -2
- data/lib/motion-markdown-it/version.rb +1 -3
- data/lib/motion-markdown-it.rb +0 -1
- data/spec/spec_helper.rb +2 -1
- metadata +11 -13
- data/lib/motion-markdown-it/common/string.rb +0 -14
@@ -13,16 +13,16 @@ module MarkdownIt
|
|
13
13
|
# if it's indented more than 3 spaces, it should be a code block
|
14
14
|
return false if state.sCount[startLine] - state.blkIndent >= 4
|
15
15
|
|
16
|
-
return false if state.src
|
16
|
+
return false if charCodeAt(state.src, pos) != 0x5B # [
|
17
17
|
|
18
18
|
# Simple check to quickly interrupt scan on [link](url) at the start of line.
|
19
19
|
# Can be useful on practice: https://github.com/markdown-it/markdown-it/issues/54
|
20
20
|
pos += 1
|
21
21
|
while (pos < max)
|
22
|
-
if (state.src
|
23
|
-
state.src
|
22
|
+
if (charCodeAt(state.src, pos) == 0x5D && # ]
|
23
|
+
charCodeAt(state.src, pos - 1) != 0x5C) # \
|
24
24
|
return false if (pos + 1 === max)
|
25
|
-
return false if (state.src
|
25
|
+
return false if (charCodeAt(state.src, pos + 1) != 0x3A) # :
|
26
26
|
break
|
27
27
|
end
|
28
28
|
pos += 1
|
@@ -62,7 +62,7 @@ module MarkdownIt
|
|
62
62
|
|
63
63
|
pos = 1
|
64
64
|
while pos < max
|
65
|
-
ch =
|
65
|
+
ch = charCodeAt(str, pos)
|
66
66
|
if (ch == 0x5B ) # [
|
67
67
|
return false
|
68
68
|
elsif (ch == 0x5D) # ]
|
@@ -72,20 +72,20 @@ module MarkdownIt
|
|
72
72
|
lines += 1
|
73
73
|
elsif (ch == 0x5C) # \
|
74
74
|
pos += 1
|
75
|
-
if (pos < max &&
|
75
|
+
if (pos < max && charCodeAt(str, pos) == 0x0A)
|
76
76
|
lines += 1
|
77
77
|
end
|
78
78
|
end
|
79
79
|
pos += 1
|
80
80
|
end
|
81
81
|
|
82
|
-
return false if (labelEnd < 0 ||
|
82
|
+
return false if (labelEnd < 0 || charCodeAt(str, labelEnd + 1) != 0x3A) # :
|
83
83
|
|
84
84
|
# [label]: destination 'title'
|
85
85
|
# ^^^ skip optional whitespace here
|
86
86
|
pos = labelEnd + 2
|
87
87
|
while pos < max
|
88
|
-
ch =
|
88
|
+
ch = charCodeAt(str, pos)
|
89
89
|
if (ch == 0x0A)
|
90
90
|
lines += 1
|
91
91
|
elsif isSpace(ch)
|
@@ -114,7 +114,7 @@ module MarkdownIt
|
|
114
114
|
# ^^^ skipping those spaces
|
115
115
|
start = pos
|
116
116
|
while (pos < max)
|
117
|
-
ch =
|
117
|
+
ch = charCodeAt(str, pos)
|
118
118
|
if (ch == 0x0A)
|
119
119
|
lines += 1
|
120
120
|
elsif isSpace(ch)
|
@@ -139,12 +139,12 @@ module MarkdownIt
|
|
139
139
|
|
140
140
|
# skip trailing spaces until the rest of the line
|
141
141
|
while pos < max
|
142
|
-
ch =
|
142
|
+
ch = charCodeAt(str, pos)
|
143
143
|
break if !isSpace(ch)
|
144
144
|
pos += 1
|
145
145
|
end
|
146
146
|
|
147
|
-
if (pos < max &&
|
147
|
+
if (pos < max && charCodeAt(str, pos) != 0x0A)
|
148
148
|
if (title)
|
149
149
|
# garbage at the end of the line after title,
|
150
150
|
# but it could still be a valid reference if we roll back
|
@@ -152,14 +152,14 @@ module MarkdownIt
|
|
152
152
|
pos = destEndPos
|
153
153
|
lines = destEndLineNo
|
154
154
|
while pos < max
|
155
|
-
ch =
|
155
|
+
ch = charCodeAt(str, pos)
|
156
156
|
break if !isSpace(ch)
|
157
157
|
pos += 1
|
158
158
|
end
|
159
159
|
end
|
160
160
|
end
|
161
161
|
|
162
|
-
if (pos < max &&
|
162
|
+
if (pos < max && charCodeAt(str, pos) != 0x0A)
|
163
163
|
# garbage at the end of the line
|
164
164
|
return false
|
165
165
|
end
|
@@ -6,7 +6,7 @@ module MarkdownIt
|
|
6
6
|
include MarkdownIt::Common::Utils
|
7
7
|
|
8
8
|
attr_accessor :src, :md, :env, :tokens, :bMarks, :eMarks, :tShift, :sCount, :bsCount
|
9
|
-
attr_accessor :blkIndent, :line, :lineMax, :tight, :parentType, :ddIndent
|
9
|
+
attr_accessor :blkIndent, :line, :lineMax, :tight, :parentType, :ddIndent, :listIndent
|
10
10
|
attr_accessor :level, :result
|
11
11
|
|
12
12
|
#------------------------------------------------------------------------------
|
@@ -39,12 +39,14 @@ module MarkdownIt
|
|
39
39
|
@bsCount = []
|
40
40
|
|
41
41
|
# block parser variables
|
42
|
-
@blkIndent = 0 #
|
42
|
+
@blkIndent = 0 # equired block content indent (for example, if we are
|
43
|
+
# inside a list, it would be positioned after list marker)
|
43
44
|
@line = 0 # line index in src
|
44
45
|
@lineMax = 0 # lines count
|
45
46
|
@tight = false # loose/tight mode for lists
|
46
47
|
@parentType = 'root' # if `list`, block parser stops on two newlines
|
47
48
|
@ddIndent = -1 # indent of the current dd block (-1 if there isn't any)
|
49
|
+
@listIndent = -1 # indent of the current list block (-1 if there isn't any)
|
48
50
|
|
49
51
|
# can be 'blockquote', 'list', 'root', 'paragraph' or 'reference'
|
50
52
|
# used in lists to determine if they interrupt a paragraph
|
@@ -63,7 +65,7 @@ module MarkdownIt
|
|
63
65
|
start = pos = indent = offset = 0
|
64
66
|
len = s.length
|
65
67
|
while pos < len
|
66
|
-
ch =
|
68
|
+
ch = charCodeAt(s, pos)
|
67
69
|
|
68
70
|
if !indent_found
|
69
71
|
if isSpace(ch)
|
@@ -113,9 +115,9 @@ module MarkdownIt
|
|
113
115
|
token = Token.new(type, tag, nesting)
|
114
116
|
token.block = true
|
115
117
|
|
116
|
-
@level -= 1 if nesting < 0
|
118
|
+
@level -= 1 if nesting < 0 # closing tag
|
117
119
|
token.level = @level
|
118
|
-
@level += 1 if nesting > 0
|
120
|
+
@level += 1 if nesting > 0 # opening tag
|
119
121
|
|
120
122
|
@tokens.push(token)
|
121
123
|
return token
|
@@ -140,7 +142,7 @@ module MarkdownIt
|
|
140
142
|
def skipSpaces(pos)
|
141
143
|
max = @src.length
|
142
144
|
while pos < max
|
143
|
-
ch = @src
|
145
|
+
ch = charCodeAt(@src, pos)
|
144
146
|
break if !isSpace(ch)
|
145
147
|
pos += 1
|
146
148
|
end
|
@@ -153,7 +155,7 @@ module MarkdownIt
|
|
153
155
|
return pos if pos <= min
|
154
156
|
|
155
157
|
while (pos > min)
|
156
|
-
return pos + 1 if !isSpace(@src
|
158
|
+
return pos + 1 if !isSpace(charCodeAt(@src, pos -= 1))
|
157
159
|
end
|
158
160
|
return pos
|
159
161
|
end
|
@@ -163,7 +165,7 @@ module MarkdownIt
|
|
163
165
|
def skipChars(pos, code)
|
164
166
|
max = @src.length
|
165
167
|
while pos < max
|
166
|
-
break if (@src
|
168
|
+
break if (charCodeAt(@src, pos) != code)
|
167
169
|
pos += 1
|
168
170
|
end
|
169
171
|
return pos
|
@@ -175,7 +177,7 @@ module MarkdownIt
|
|
175
177
|
return pos if pos <= min
|
176
178
|
|
177
179
|
while (pos > min)
|
178
|
-
return (pos + 1) if code != @src
|
180
|
+
return (pos + 1) if code != charCodeAt(@src, pos -= 1)
|
179
181
|
end
|
180
182
|
return pos
|
181
183
|
end
|
@@ -202,7 +204,7 @@ module MarkdownIt
|
|
202
204
|
end
|
203
205
|
|
204
206
|
while first < last && lineIndent < indent
|
205
|
-
ch = @src
|
207
|
+
ch = charCodeAt(@src, first)
|
206
208
|
|
207
209
|
if isSpace(ch)
|
208
210
|
if ch === 0x09
|
@@ -236,4 +238,4 @@ module MarkdownIt
|
|
236
238
|
|
237
239
|
end
|
238
240
|
end
|
239
|
-
end
|
241
|
+
end
|
@@ -23,7 +23,7 @@ module MarkdownIt
|
|
23
23
|
backTicked = false
|
24
24
|
lastBackTick = 0
|
25
25
|
|
26
|
-
ch =
|
26
|
+
ch = charCodeAt(str, pos)
|
27
27
|
|
28
28
|
while (pos < max)
|
29
29
|
if ch == 0x60 # `
|
@@ -54,10 +54,10 @@ module MarkdownIt
|
|
54
54
|
backTicked = false
|
55
55
|
pos = lastBackTick + 1
|
56
56
|
end
|
57
|
-
ch =
|
57
|
+
ch = charCodeAt(str, pos)
|
58
58
|
end
|
59
59
|
|
60
|
-
result.push(str
|
60
|
+
result.push(str[lastPos..-1])
|
61
61
|
|
62
62
|
return result
|
63
63
|
end
|
@@ -82,12 +82,12 @@ module MarkdownIt
|
|
82
82
|
pos = state.bMarks[nextLine] + state.tShift[nextLine]
|
83
83
|
return false if (pos >= state.eMarks[nextLine])
|
84
84
|
|
85
|
-
ch = state.src
|
85
|
+
ch = charCodeAt(state.src, pos)
|
86
86
|
pos += 1
|
87
87
|
return false if (ch != 0x7C && ch != 0x2D && ch != 0x3A) # | or - or :
|
88
88
|
|
89
89
|
while pos < state.eMarks[nextLine]
|
90
|
-
ch = state.src
|
90
|
+
ch = charCodeAt(state.src, pos)
|
91
91
|
return false if (ch != 0x7C && ch != 0x2D && ch != 0x3A && !isSpace(ch)) # | or - or :
|
92
92
|
|
93
93
|
pos += 1
|
@@ -110,9 +110,9 @@ module MarkdownIt
|
|
110
110
|
end
|
111
111
|
|
112
112
|
return false if (/^:?-+:?$/ =~ t).nil?
|
113
|
-
if (
|
114
|
-
aligns.push(
|
115
|
-
elsif (
|
113
|
+
if (charCodeAt(t, t.length - 1) == 0x3A) # ':'
|
114
|
+
aligns.push(charCodeAt(t, 0) == 0x3A ? 'center' : 'right')
|
115
|
+
elsif (charCodeAt(t, 0) == 0x3A)
|
116
116
|
aligns.push('left')
|
117
117
|
else
|
118
118
|
aligns.push('')
|
@@ -8,7 +8,7 @@ module MarkdownIt
|
|
8
8
|
NULL_RE = /\u0000/
|
9
9
|
|
10
10
|
#------------------------------------------------------------------------------
|
11
|
-
def self.
|
11
|
+
def self.normalize(state)
|
12
12
|
# Normalize newlines
|
13
13
|
str = state.src.gsub(NEWLINES_RE, "\n")
|
14
14
|
|
@@ -19,4 +19,4 @@ module MarkdownIt
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
22
|
-
end
|
22
|
+
end
|
@@ -11,7 +11,7 @@ module MarkdownIt
|
|
11
11
|
|
12
12
|
#------------------------------------------------------------------------------
|
13
13
|
def self.replaceAt(str, index, ch)
|
14
|
-
return str[0, index] + ch + str
|
14
|
+
return str[0, index] + ch + str[(index + 1)..-1]
|
15
15
|
end
|
16
16
|
|
17
17
|
#------------------------------------------------------------------------------
|
@@ -55,13 +55,13 @@ module MarkdownIt
|
|
55
55
|
lastChar = 0x20
|
56
56
|
|
57
57
|
if t.begin(0) - 1 >= 0
|
58
|
-
lastChar =
|
58
|
+
lastChar = charCodeAt(text, t.begin(0) - 1)
|
59
59
|
else
|
60
60
|
(i - 1).downto(0) do |j|
|
61
61
|
break if tokens[j].type == 'softbreak' || tokens[j].type == 'hardbreak' # lastChar defaults to 0x20
|
62
62
|
next if tokens[j].type != 'text'
|
63
63
|
|
64
|
-
lastChar = tokens[j].content
|
64
|
+
lastChar = charCodeAt(tokens[j].content, tokens[j].content.length - 1)
|
65
65
|
break
|
66
66
|
end
|
67
67
|
end
|
@@ -72,13 +72,13 @@ module MarkdownIt
|
|
72
72
|
nextChar = 0x20
|
73
73
|
|
74
74
|
if pos < max
|
75
|
-
nextChar =
|
75
|
+
nextChar = charCodeAt(text, pos)
|
76
76
|
else
|
77
77
|
(i + 1).upto(tokens.length - 1) do |j|
|
78
78
|
break if tokens[j].type == 'softbreak' || tokens[j].type == 'hardbreak' # nextChar defaults to 0x20
|
79
79
|
next if tokens[j].type != 'text'
|
80
80
|
|
81
|
-
nextChar = tokens[j].content
|
81
|
+
nextChar = charCodeAt(tokens[j].content, 0)
|
82
82
|
break
|
83
83
|
end
|
84
84
|
end
|
@@ -3,6 +3,7 @@
|
|
3
3
|
module MarkdownIt
|
4
4
|
module RulesInline
|
5
5
|
class Autolink
|
6
|
+
extend Common::Utils
|
6
7
|
|
7
8
|
EMAIL_RE = /^<([a-zA-Z0-9.!#$\%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/
|
8
9
|
AUTOLINK_RE = /^<([a-zA-Z][a-zA-Z0-9+.\-]{1,31}):([^<>\x00-\x20]*)>/
|
@@ -11,9 +12,9 @@ module MarkdownIt
|
|
11
12
|
def self.autolink(state, silent)
|
12
13
|
pos = state.pos
|
13
14
|
|
14
|
-
return false if (state.src
|
15
|
+
return false if (charCodeAt(state.src, pos) != 0x3C) # <
|
15
16
|
|
16
|
-
tail = state.src
|
17
|
+
tail = state.src[pos..-1]
|
17
18
|
|
18
19
|
return false if !tail.include?('>')
|
19
20
|
|
@@ -3,19 +3,20 @@
|
|
3
3
|
module MarkdownIt
|
4
4
|
module RulesInline
|
5
5
|
class Backticks
|
6
|
+
extend Common::Utils
|
6
7
|
|
7
8
|
#------------------------------------------------------------------------------
|
8
9
|
def self.backtick(state, silent)
|
9
10
|
pos = state.pos
|
10
|
-
ch = state.src
|
11
|
+
ch = charCodeAt(state.src, pos)
|
11
12
|
|
12
|
-
return false if (ch != 0x60) # `
|
13
|
+
return false if (ch != 0x60) # `
|
13
14
|
|
14
15
|
start = pos
|
15
16
|
pos += 1
|
16
17
|
max = state.posMax
|
17
18
|
|
18
|
-
while (pos < max && state.src
|
19
|
+
while (pos < max && charCodeAt(state.src, pos) == 0x60) # `
|
19
20
|
pos += 1
|
20
21
|
end
|
21
22
|
|
@@ -26,7 +27,7 @@ module MarkdownIt
|
|
26
27
|
while ((matchStart = state.src.index('`', matchEnd)) != nil)
|
27
28
|
matchEnd = matchStart + 1
|
28
29
|
|
29
|
-
while (matchEnd < max && state.src
|
30
|
+
while (matchEnd < max && charCodeAt(state.src, matchEnd) == 0x60) # `
|
30
31
|
matchEnd += 1
|
31
32
|
end
|
32
33
|
|
@@ -34,7 +35,9 @@ module MarkdownIt
|
|
34
35
|
if (!silent)
|
35
36
|
token = state.push('code_inline', 'code', 0)
|
36
37
|
token.markup = marker
|
37
|
-
token.content = state.src.slice(pos...matchStart)
|
38
|
+
token.content = state.src.slice(pos...matchStart)
|
39
|
+
.gsub(/\n/, ' ')
|
40
|
+
.gsub(/^ (.+) $/, '\1')
|
38
41
|
end
|
39
42
|
state.pos = matchEnd
|
40
43
|
return true
|
@@ -24,11 +24,21 @@ module MarkdownIt
|
|
24
24
|
currDelim[:end] < 0 &&
|
25
25
|
currDelim[:level] == lastDelim[:level]
|
26
26
|
|
27
|
+
odd_match = false
|
28
|
+
|
27
29
|
# typeofs are for backward compatibility with plugins
|
28
30
|
# not needed: typeof currDelim.length !== 'undefined' &&
|
29
31
|
# typeof lastDelim.length !== 'undefined' &&
|
30
|
-
|
31
|
-
|
32
|
+
if (currDelim[:close] || lastDelim[:open])
|
33
|
+
# from spec:
|
34
|
+
# sum of the lengths [...] must not be a multiple of 3
|
35
|
+
# unless both lengths are multiples of 3
|
36
|
+
if ((currDelim[:length] + lastDelim[:length]) % 3) == 0
|
37
|
+
if (currDelim[:length] % 3 != 0 || lastDelim[:length] % 3 != 0)
|
38
|
+
odd_match = true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
32
42
|
|
33
43
|
if !odd_match
|
34
44
|
lastDelim[:jump] = i - j
|
@@ -45,4 +55,4 @@ module MarkdownIt
|
|
45
55
|
end
|
46
56
|
end
|
47
57
|
end
|
48
|
-
end
|
58
|
+
end
|
@@ -5,7 +5,7 @@ module MarkdownIt
|
|
5
5
|
class Entity
|
6
6
|
extend Common::Utils
|
7
7
|
|
8
|
-
DIGITAL_RE = /^&#((?:x[a-f0-9]{1,
|
8
|
+
DIGITAL_RE = /^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i
|
9
9
|
NAMED_RE = /^&([a-z][a-z0-9]{1,31});/i
|
10
10
|
|
11
11
|
|
@@ -14,23 +14,23 @@ module MarkdownIt
|
|
14
14
|
pos = state.pos
|
15
15
|
max = state.posMax
|
16
16
|
|
17
|
-
return false if state.src
|
17
|
+
return false if charCodeAt(state.src, pos) != 0x26 # &
|
18
18
|
|
19
19
|
if pos + 1 < max
|
20
|
-
ch = state.src
|
20
|
+
ch = charCodeAt(state.src, pos + 1)
|
21
21
|
|
22
22
|
if ch == 0x23 # '#'
|
23
|
-
match = state.src
|
23
|
+
match = state.src[pos..-1].match(DIGITAL_RE)
|
24
24
|
if match
|
25
25
|
if !silent
|
26
|
-
code = match[1][0].downcase == 'x' ? match[1]
|
26
|
+
code = match[1][0].downcase == 'x' ? match[1][1..-1].to_i(16) : match[1].to_i
|
27
27
|
state.pending += isValidEntityCode(code) ? fromCodePoint(code) : fromCodePoint(0xFFFD)
|
28
28
|
end
|
29
29
|
state.pos += match[0].length
|
30
30
|
return true
|
31
31
|
end
|
32
32
|
else
|
33
|
-
match = state.src
|
33
|
+
match = state.src[pos..-1].match(NAMED_RE)
|
34
34
|
if match
|
35
35
|
if MarkdownIt::HTMLEntities::MAPPINGS[match[1]]
|
36
36
|
state.pending += fromCodePoint(MarkdownIt::HTMLEntities::MAPPINGS[match[1]]) if !silent
|
@@ -17,12 +17,12 @@ module MarkdownIt
|
|
17
17
|
pos = state.pos
|
18
18
|
max = state.posMax
|
19
19
|
|
20
|
-
return false if state.src
|
20
|
+
return false if charCodeAt(state.src, pos) != 0x5C # \
|
21
21
|
|
22
22
|
pos += 1
|
23
23
|
|
24
24
|
if pos < max
|
25
|
-
ch = state.src
|
25
|
+
ch = charCodeAt(state.src, pos)
|
26
26
|
|
27
27
|
if ch < 256 && ESCAPED[ch] != 0
|
28
28
|
state.pending += state.src[pos] if !silent
|
@@ -38,7 +38,7 @@ module MarkdownIt
|
|
38
38
|
pos += 1
|
39
39
|
# skip leading whitespaces from next line
|
40
40
|
while pos < max
|
41
|
-
ch = state.src
|
41
|
+
ch = charCodeAt(state.src, pos)
|
42
42
|
break if !isSpace(ch)
|
43
43
|
pos += 1
|
44
44
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
# Process html tags
|
2
2
|
#------------------------------------------------------------------------------
|
3
3
|
module MarkdownIt
|
4
|
-
|
5
4
|
module RulesInline
|
6
5
|
class HtmlInline
|
6
|
+
extend Common::Utils
|
7
7
|
include MarkdownIt::Common::HtmlRe
|
8
|
-
|
8
|
+
|
9
9
|
#------------------------------------------------------------------------------
|
10
10
|
def self.isLetter(ch)
|
11
11
|
lc = ch | 0x20 # to lower case
|
@@ -20,12 +20,12 @@ module MarkdownIt
|
|
20
20
|
|
21
21
|
# Check start
|
22
22
|
max = state.posMax
|
23
|
-
if (state.src
|
23
|
+
if (charCodeAt(state.src, pos) != 0x3C || pos + 2 >= max) # <
|
24
24
|
return false
|
25
25
|
end
|
26
26
|
|
27
27
|
# Quick fail on second char
|
28
|
-
ch = state.src
|
28
|
+
ch = charCodeAt(state.src, pos + 1)
|
29
29
|
if (ch != 0x21 && # !
|
30
30
|
ch != 0x3F && # ?
|
31
31
|
ch != 0x2F && # /
|
@@ -33,7 +33,7 @@ module MarkdownIt
|
|
33
33
|
return false
|
34
34
|
end
|
35
35
|
|
36
|
-
match = state.src
|
36
|
+
match = state.src[pos..-1].match(HTML_TAG_RE)
|
37
37
|
return false if !match
|
38
38
|
|
39
39
|
if !silent
|
@@ -11,8 +11,8 @@ module MarkdownIt
|
|
11
11
|
oldPos = state.pos
|
12
12
|
max = state.posMax
|
13
13
|
|
14
|
-
return false if (state.src
|
15
|
-
return false if (state.src
|
14
|
+
return false if (charCodeAt(state.src, state.pos) != 0x21) # !
|
15
|
+
return false if (charCodeAt(state.src, state.pos + 1) != 0x5B) # [
|
16
16
|
|
17
17
|
labelStart = state.pos + 2
|
18
18
|
labelEnd = state.md.helpers.parseLinkLabel(state, state.pos + 1, false)
|
@@ -21,7 +21,7 @@ module MarkdownIt
|
|
21
21
|
return false if (labelEnd < 0)
|
22
22
|
|
23
23
|
pos = labelEnd + 1
|
24
|
-
if (pos < max && state.src
|
24
|
+
if (pos < max && charCodeAt(state.src, pos) == 0x28) # (
|
25
25
|
#
|
26
26
|
# Inline link
|
27
27
|
#
|
@@ -30,7 +30,7 @@ module MarkdownIt
|
|
30
30
|
# ^^ skipping these spaces
|
31
31
|
pos += 1
|
32
32
|
while pos < max
|
33
|
-
code = state.src
|
33
|
+
code = charCodeAt(state.src, pos)
|
34
34
|
break if (!isSpace(code) && code != 0x0A)
|
35
35
|
pos += 1
|
36
36
|
end
|
@@ -53,7 +53,7 @@ module MarkdownIt
|
|
53
53
|
# ^^ skipping these spaces
|
54
54
|
start = pos
|
55
55
|
while pos < max
|
56
|
-
code = state.src
|
56
|
+
code = charCodeAt(state.src, pos)
|
57
57
|
break if (!isSpace(code) && code != 0x0A)
|
58
58
|
pos += 1
|
59
59
|
end
|
@@ -68,7 +68,7 @@ module MarkdownIt
|
|
68
68
|
# [link]( <href> "title" )
|
69
69
|
# ^^ skipping these spaces
|
70
70
|
while pos < max
|
71
|
-
code = state.src
|
71
|
+
code = charCodeAt(state.src, pos);
|
72
72
|
break if (!isSpace(code) && code != 0x0A)
|
73
73
|
pos += 1
|
74
74
|
end
|
@@ -76,7 +76,7 @@ module MarkdownIt
|
|
76
76
|
title = ''
|
77
77
|
end
|
78
78
|
|
79
|
-
if (pos >= max || state.src
|
79
|
+
if (pos >= max || charCodeAt(state.src, pos) != 0x29) # )
|
80
80
|
state.pos = oldPos
|
81
81
|
return false
|
82
82
|
end
|
@@ -87,7 +87,7 @@ module MarkdownIt
|
|
87
87
|
#
|
88
88
|
return false if state.env[:references].nil?
|
89
89
|
|
90
|
-
if (pos < max && state.src
|
90
|
+
if (pos < max && charCodeAt(state.src, pos) == 0x5B) # [
|
91
91
|
start = pos + 1
|
92
92
|
pos = state.md.helpers.parseLinkLabel(state, pos)
|
93
93
|
if (pos >= 0)
|
@@ -13,7 +13,7 @@ module MarkdownIt
|
|
13
13
|
start = state.pos
|
14
14
|
parseReference = true
|
15
15
|
|
16
|
-
return false if (state.src
|
16
|
+
return false if (charCodeAt(state.src, state.pos) != 0x5B) # [
|
17
17
|
|
18
18
|
labelStart = state.pos + 1
|
19
19
|
labelEnd = state.md.helpers.parseLinkLabel(state, state.pos, true)
|
@@ -22,7 +22,7 @@ module MarkdownIt
|
|
22
22
|
return false if (labelEnd < 0)
|
23
23
|
|
24
24
|
pos = labelEnd + 1
|
25
|
-
if (pos < max && state.src
|
25
|
+
if (pos < max && charCodeAt(state.src, pos) == 0x28) # (
|
26
26
|
#
|
27
27
|
# Inline link
|
28
28
|
#
|
@@ -34,7 +34,7 @@ module MarkdownIt
|
|
34
34
|
# ^^ skipping these spaces
|
35
35
|
pos += 1
|
36
36
|
while pos < max
|
37
|
-
code = state.src
|
37
|
+
code = charCodeAt(state.src, pos)
|
38
38
|
break if (!isSpace(code) && code != 0x0A)
|
39
39
|
pos += 1
|
40
40
|
end
|
@@ -57,7 +57,7 @@ module MarkdownIt
|
|
57
57
|
# ^^ skipping these spaces
|
58
58
|
start = pos
|
59
59
|
while pos < max
|
60
|
-
code = state.src
|
60
|
+
code = charCodeAt(state.src, pos)
|
61
61
|
break if (!isSpace(code) && code != 0x0A)
|
62
62
|
pos += 1
|
63
63
|
end
|
@@ -72,7 +72,7 @@ module MarkdownIt
|
|
72
72
|
# [link]( <href> "title" )
|
73
73
|
# ^^ skipping these spaces
|
74
74
|
while pos < max
|
75
|
-
code = state.src
|
75
|
+
code = charCodeAt(state.src, pos)
|
76
76
|
break if (!isSpace(code) && code != 0x0A)
|
77
77
|
pos += 1
|
78
78
|
end
|
@@ -80,7 +80,7 @@ module MarkdownIt
|
|
80
80
|
title = ''
|
81
81
|
end
|
82
82
|
|
83
|
-
if (pos >= max || state.src
|
83
|
+
if (pos >= max || charCodeAt(state.src, pos) != 0x29) # )
|
84
84
|
# parsing a valid shortcut link failed, fallback to reference
|
85
85
|
parseReference = true
|
86
86
|
end
|
@@ -93,7 +93,7 @@ module MarkdownIt
|
|
93
93
|
#
|
94
94
|
return false if state.env[:references].nil?
|
95
95
|
|
96
|
-
if (pos < max && state.src
|
96
|
+
if (pos < max && charCodeAt(state.src, pos) == 0x5B) # [
|
97
97
|
start = pos + 1
|
98
98
|
pos = state.md.helpers.parseLinkLabel(state, pos)
|
99
99
|
if (pos >= 0)
|
@@ -8,7 +8,7 @@ module MarkdownIt
|
|
8
8
|
#------------------------------------------------------------------------------
|
9
9
|
def self.newline(state, silent)
|
10
10
|
pos = state.pos
|
11
|
-
return false if state.src
|
11
|
+
return false if charCodeAt(state.src, pos) != 0x0A # \n
|
12
12
|
|
13
13
|
pmax = state.pending.length - 1
|
14
14
|
max = state.posMax
|
@@ -18,8 +18,8 @@ module MarkdownIt
|
|
18
18
|
# Pending string is stored in concat mode, indexed lookups will cause
|
19
19
|
# convertion to flat mode.
|
20
20
|
if !silent
|
21
|
-
if pmax >= 0 && state.pending
|
22
|
-
if pmax >= 1 && state.pending
|
21
|
+
if pmax >= 0 && charCodeAt(state.pending, pmax) == 0x20
|
22
|
+
if pmax >= 1 && charCodeAt(state.pending, pmax - 1) == 0x20
|
23
23
|
state.pending = state.pending.sub(/ +$/, '')
|
24
24
|
state.push('hardbreak', 'br', 0)
|
25
25
|
else
|
@@ -35,7 +35,7 @@ module MarkdownIt
|
|
35
35
|
pos += 1
|
36
36
|
|
37
37
|
# skip heading spaces for next line
|
38
|
-
while pos < max && isSpace(state.src
|
38
|
+
while pos < max && isSpace(charCodeAt(state.src, pos))
|
39
39
|
pos += 1
|
40
40
|
end
|
41
41
|
|