motion-markdown-it 0.4.0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +243 -0
- data/lib/motion-markdown-it.rb +71 -0
- data/lib/motion-markdown-it/common/entities.rb +1084 -0
- data/lib/motion-markdown-it/common/html_blocks.rb +60 -0
- data/lib/motion-markdown-it/common/html_re.rb +28 -0
- data/lib/motion-markdown-it/common/string.rb +14 -0
- data/lib/motion-markdown-it/common/url_schemas.rb +173 -0
- data/lib/motion-markdown-it/common/utils.rb +216 -0
- data/lib/motion-markdown-it/helpers/parse_link_destination.rb +75 -0
- data/lib/motion-markdown-it/helpers/parse_link_label.rb +51 -0
- data/lib/motion-markdown-it/helpers/parse_link_title.rb +48 -0
- data/lib/motion-markdown-it/index.rb +507 -0
- data/lib/motion-markdown-it/parser_block.rb +113 -0
- data/lib/motion-markdown-it/parser_core.rb +46 -0
- data/lib/motion-markdown-it/parser_inline.rb +121 -0
- data/lib/motion-markdown-it/presets/commonmark.rb +76 -0
- data/lib/motion-markdown-it/presets/default.rb +42 -0
- data/lib/motion-markdown-it/presets/zero.rb +59 -0
- data/lib/motion-markdown-it/renderer.rb +286 -0
- data/lib/motion-markdown-it/ruler.rb +327 -0
- data/lib/motion-markdown-it/rules_block/blockquote.rb +138 -0
- data/lib/motion-markdown-it/rules_block/code.rb +35 -0
- data/lib/motion-markdown-it/rules_block/fence.rb +94 -0
- data/lib/motion-markdown-it/rules_block/heading.rb +56 -0
- data/lib/motion-markdown-it/rules_block/hr.rb +45 -0
- data/lib/motion-markdown-it/rules_block/html_block.rb +73 -0
- data/lib/motion-markdown-it/rules_block/lheading.rb +54 -0
- data/lib/motion-markdown-it/rules_block/list.rb +242 -0
- data/lib/motion-markdown-it/rules_block/paragraph.rb +51 -0
- data/lib/motion-markdown-it/rules_block/reference.rb +161 -0
- data/lib/motion-markdown-it/rules_block/state_block.rb +184 -0
- data/lib/motion-markdown-it/rules_block/table.rb +161 -0
- data/lib/motion-markdown-it/rules_core/block.rb +20 -0
- data/lib/motion-markdown-it/rules_core/inline.rb +20 -0
- data/lib/motion-markdown-it/rules_core/linkify.rb +138 -0
- data/lib/motion-markdown-it/rules_core/normalize.rb +44 -0
- data/lib/motion-markdown-it/rules_core/replacements.rb +90 -0
- data/lib/motion-markdown-it/rules_core/smartquotes.rb +158 -0
- data/lib/motion-markdown-it/rules_core/state_core.rb +20 -0
- data/lib/motion-markdown-it/rules_inline/autolink.rb +74 -0
- data/lib/motion-markdown-it/rules_inline/backticks.rb +51 -0
- data/lib/motion-markdown-it/rules_inline/emphasis.rb +172 -0
- data/lib/motion-markdown-it/rules_inline/entity.rb +51 -0
- data/lib/motion-markdown-it/rules_inline/escape.rb +55 -0
- data/lib/motion-markdown-it/rules_inline/html_inline.rb +49 -0
- data/lib/motion-markdown-it/rules_inline/image.rb +158 -0
- data/lib/motion-markdown-it/rules_inline/link.rb +153 -0
- data/lib/motion-markdown-it/rules_inline/newline.rb +47 -0
- data/lib/motion-markdown-it/rules_inline/state_inline.rb +57 -0
- data/lib/motion-markdown-it/rules_inline/strikethrough.rb +130 -0
- data/lib/motion-markdown-it/rules_inline/text.rb +94 -0
- data/lib/motion-markdown-it/token.rb +134 -0
- data/lib/motion-markdown-it/version.rb +5 -0
- data/spec/motion-markdown-it/bench_mark_spec.rb +44 -0
- data/spec/motion-markdown-it/commonmark_spec.rb +16 -0
- data/spec/motion-markdown-it/markdown_it_spec.rb +18 -0
- data/spec/motion-markdown-it/misc_spec.rb +277 -0
- data/spec/motion-markdown-it/ruler_spec.rb +153 -0
- data/spec/motion-markdown-it/testgen_helper.rb +68 -0
- data/spec/motion-markdown-it/token_spec.rb +17 -0
- data/spec/motion-markdown-it/utils_spec.rb +82 -0
- data/spec/spec_helper.rb +6 -0
- metadata +158 -0
@@ -0,0 +1,60 @@
|
|
1
|
+
# List of valid html blocks names, accorting to commonmark spec
|
2
|
+
# http://jgm.github.io/CommonMark/spec.html#html-blocks
|
3
|
+
#------------------------------------------------------------------------------
|
4
|
+
module MarkdownIt
|
5
|
+
HTML_BLOCKS = {}
|
6
|
+
|
7
|
+
[
|
8
|
+
'article',
|
9
|
+
'aside',
|
10
|
+
'button',
|
11
|
+
'blockquote',
|
12
|
+
'body',
|
13
|
+
'canvas',
|
14
|
+
'caption',
|
15
|
+
'col',
|
16
|
+
'colgroup',
|
17
|
+
'dd',
|
18
|
+
'div',
|
19
|
+
'dl',
|
20
|
+
'dt',
|
21
|
+
'embed',
|
22
|
+
'fieldset',
|
23
|
+
'figcaption',
|
24
|
+
'figure',
|
25
|
+
'footer',
|
26
|
+
'form',
|
27
|
+
'h1',
|
28
|
+
'h2',
|
29
|
+
'h3',
|
30
|
+
'h4',
|
31
|
+
'h5',
|
32
|
+
'h6',
|
33
|
+
'header',
|
34
|
+
'hgroup',
|
35
|
+
'hr',
|
36
|
+
'iframe',
|
37
|
+
'li',
|
38
|
+
'map',
|
39
|
+
'object',
|
40
|
+
'ol',
|
41
|
+
'output',
|
42
|
+
'p',
|
43
|
+
'pre',
|
44
|
+
'progress',
|
45
|
+
'script',
|
46
|
+
'section',
|
47
|
+
'style',
|
48
|
+
'table',
|
49
|
+
'tbody',
|
50
|
+
'td',
|
51
|
+
'textarea',
|
52
|
+
'tfoot',
|
53
|
+
'th',
|
54
|
+
'tr',
|
55
|
+
'thead',
|
56
|
+
'ul',
|
57
|
+
'video'
|
58
|
+
].each { |name| HTML_BLOCKS[name] = true }
|
59
|
+
|
60
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Regexps to match html elements
|
2
|
+
#------------------------------------------------------------------------------
|
3
|
+
module MarkdownIt
|
4
|
+
module Common
|
5
|
+
module HtmlRe
|
6
|
+
ATTR_NAME = '[a-zA-Z_:][a-zA-Z0-9:._-]*'
|
7
|
+
|
8
|
+
UNQUOTED = '[^"\'=<>`\\x00-\\x20]+'
|
9
|
+
SINGLE_QUOTED = "'[^']*'"
|
10
|
+
DOUBLE_QUOTED = '"[^"]*"';
|
11
|
+
|
12
|
+
ATTR_VALUE = '(?:' + UNQUOTED + '|' + SINGLE_QUOTED + '|' + DOUBLE_QUOTED + ')'
|
13
|
+
|
14
|
+
ATTRIBUTE = '(?:\\s+' + ATTR_NAME + '(?:\\s*=\\s*' + ATTR_VALUE + ')?)'
|
15
|
+
|
16
|
+
OPEN_TAG = '<[A-Za-z][A-Za-z0-9\\-]*' + ATTRIBUTE + '*\\s*\\/?>'
|
17
|
+
|
18
|
+
CLOSE_TAG = '<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>'
|
19
|
+
COMMENT = '<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->'
|
20
|
+
PROCESSING = '<[?].*?[?]>'
|
21
|
+
DECLARATION = '<![A-Z]+\\s+[^>]*>'
|
22
|
+
CDATA = '<!\\[CDATA\\[[\\s\\S]*?\\]\\]>'
|
23
|
+
|
24
|
+
HTML_TAG_RE = Regexp.new('^(?:' + OPEN_TAG + '|' + CLOSE_TAG + '|' + COMMENT +
|
25
|
+
'|' + PROCESSING + '|' + DECLARATION + '|' + CDATA + ')')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class String
|
2
|
+
|
3
|
+
# grab the remainder of the string starting at 'start'
|
4
|
+
#------------------------------------------------------------------------------
|
5
|
+
def slice_to_end(start)
|
6
|
+
self.slice(start...self.length)
|
7
|
+
end
|
8
|
+
|
9
|
+
# port of Javascript function charCodeAt
|
10
|
+
#------------------------------------------------------------------------------
|
11
|
+
def charCodeAt(ch)
|
12
|
+
self[ch].ord unless self[ch].nil?
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,173 @@
|
|
1
|
+
# List of valid url schemas, accorting to commonmark spec
|
2
|
+
# http://jgm.github.io/CommonMark/spec.html#autolinks
|
3
|
+
#------------------------------------------------------------------------------
|
4
|
+
module MarkdownIt
|
5
|
+
|
6
|
+
URL_SCHEMAS = [
|
7
|
+
'coap',
|
8
|
+
'doi',
|
9
|
+
'javascript',
|
10
|
+
'aaa',
|
11
|
+
'aaas',
|
12
|
+
'about',
|
13
|
+
'acap',
|
14
|
+
'cap',
|
15
|
+
'cid',
|
16
|
+
'crid',
|
17
|
+
'data',
|
18
|
+
'dav',
|
19
|
+
'dict',
|
20
|
+
'dns',
|
21
|
+
'file',
|
22
|
+
'ftp',
|
23
|
+
'geo',
|
24
|
+
'go',
|
25
|
+
'gopher',
|
26
|
+
'h323',
|
27
|
+
'http',
|
28
|
+
'https',
|
29
|
+
'iax',
|
30
|
+
'icap',
|
31
|
+
'im',
|
32
|
+
'imap',
|
33
|
+
'info',
|
34
|
+
'ipp',
|
35
|
+
'iris',
|
36
|
+
'iris.beep',
|
37
|
+
'iris.xpc',
|
38
|
+
'iris.xpcs',
|
39
|
+
'iris.lwz',
|
40
|
+
'ldap',
|
41
|
+
'mailto',
|
42
|
+
'mid',
|
43
|
+
'msrp',
|
44
|
+
'msrps',
|
45
|
+
'mtqp',
|
46
|
+
'mupdate',
|
47
|
+
'news',
|
48
|
+
'nfs',
|
49
|
+
'ni',
|
50
|
+
'nih',
|
51
|
+
'nntp',
|
52
|
+
'opaquelocktoken',
|
53
|
+
'pop',
|
54
|
+
'pres',
|
55
|
+
'rtsp',
|
56
|
+
'service',
|
57
|
+
'session',
|
58
|
+
'shttp',
|
59
|
+
'sieve',
|
60
|
+
'sip',
|
61
|
+
'sips',
|
62
|
+
'sms',
|
63
|
+
'snmp',
|
64
|
+
'soap.beep',
|
65
|
+
'soap.beeps',
|
66
|
+
'tag',
|
67
|
+
'tel',
|
68
|
+
'telnet',
|
69
|
+
'tftp',
|
70
|
+
'thismessage',
|
71
|
+
'tn3270',
|
72
|
+
'tip',
|
73
|
+
'tv',
|
74
|
+
'urn',
|
75
|
+
'vemmi',
|
76
|
+
'ws',
|
77
|
+
'wss',
|
78
|
+
'xcon',
|
79
|
+
'xcon-userid',
|
80
|
+
'xmlrpc.beep',
|
81
|
+
'xmlrpc.beeps',
|
82
|
+
'xmpp',
|
83
|
+
'z39.50r',
|
84
|
+
'z39.50s',
|
85
|
+
'adiumxtra',
|
86
|
+
'afp',
|
87
|
+
'afs',
|
88
|
+
'aim',
|
89
|
+
'apt',
|
90
|
+
'attachment',
|
91
|
+
'aw',
|
92
|
+
'beshare',
|
93
|
+
'bitcoin',
|
94
|
+
'bolo',
|
95
|
+
'callto',
|
96
|
+
'chrome',
|
97
|
+
'chrome-extension',
|
98
|
+
'com-eventbrite-attendee',
|
99
|
+
'content',
|
100
|
+
'cvs',
|
101
|
+
'dlna-playsingle',
|
102
|
+
'dlna-playcontainer',
|
103
|
+
'dtn',
|
104
|
+
'dvb',
|
105
|
+
'ed2k',
|
106
|
+
'facetime',
|
107
|
+
'feed',
|
108
|
+
'finger',
|
109
|
+
'fish',
|
110
|
+
'gg',
|
111
|
+
'git',
|
112
|
+
'gizmoproject',
|
113
|
+
'gtalk',
|
114
|
+
'hcp',
|
115
|
+
'icon',
|
116
|
+
'ipn',
|
117
|
+
'irc',
|
118
|
+
'irc6',
|
119
|
+
'ircs',
|
120
|
+
'itms',
|
121
|
+
'jar',
|
122
|
+
'jms',
|
123
|
+
'keyparc',
|
124
|
+
'lastfm',
|
125
|
+
'ldaps',
|
126
|
+
'magnet',
|
127
|
+
'maps',
|
128
|
+
'market',
|
129
|
+
'message',
|
130
|
+
'mms',
|
131
|
+
'ms-help',
|
132
|
+
'msnim',
|
133
|
+
'mumble',
|
134
|
+
'mvn',
|
135
|
+
'notes',
|
136
|
+
'oid',
|
137
|
+
'palm',
|
138
|
+
'paparazzi',
|
139
|
+
'platform',
|
140
|
+
'proxy',
|
141
|
+
'psyc',
|
142
|
+
'query',
|
143
|
+
'res',
|
144
|
+
'resource',
|
145
|
+
'rmi',
|
146
|
+
'rsync',
|
147
|
+
'rtmp',
|
148
|
+
'secondlife',
|
149
|
+
'sftp',
|
150
|
+
'sgn',
|
151
|
+
'skype',
|
152
|
+
'smb',
|
153
|
+
'soldat',
|
154
|
+
'spotify',
|
155
|
+
'ssh',
|
156
|
+
'steam',
|
157
|
+
'svn',
|
158
|
+
'teamspeak',
|
159
|
+
'things',
|
160
|
+
'udp',
|
161
|
+
'unreal',
|
162
|
+
'ut2004',
|
163
|
+
'ventrilo',
|
164
|
+
'view-source',
|
165
|
+
'webcal',
|
166
|
+
'wtai',
|
167
|
+
'wyciwyg',
|
168
|
+
'xfire',
|
169
|
+
'xri',
|
170
|
+
'ymsgr'
|
171
|
+
]
|
172
|
+
|
173
|
+
end
|
@@ -0,0 +1,216 @@
|
|
1
|
+
module MarkdownIt
|
2
|
+
module Common
|
3
|
+
module Utils
|
4
|
+
|
5
|
+
# Merge multiple hashes
|
6
|
+
#------------------------------------------------------------------------------
|
7
|
+
def assign(obj, *args)
|
8
|
+
raise(ArgumentError, "#{obj} must be a Hash") if !obj.is_a?(Hash)
|
9
|
+
|
10
|
+
args.each do |source|
|
11
|
+
next if source.nil?
|
12
|
+
raise(ArgumentError, "#{source} must be a Hash") if !source.is_a?(Hash)
|
13
|
+
obj.merge!(source)
|
14
|
+
end
|
15
|
+
|
16
|
+
return obj
|
17
|
+
end
|
18
|
+
|
19
|
+
# Remove element from array and put another array at those position.
|
20
|
+
# Useful for some operations with tokens
|
21
|
+
#------------------------------------------------------------------------------
|
22
|
+
def arrayReplaceAt(src, pos, newElements)
|
23
|
+
return [].concat([src.slice(0...pos), newElements, src.slice_to_end(pos + 1)])
|
24
|
+
end
|
25
|
+
|
26
|
+
#------------------------------------------------------------------------------
|
27
|
+
def isValidEntityCode(c)
|
28
|
+
# broken sequence
|
29
|
+
return false if (c >= 0xD800 && c <= 0xDFFF)
|
30
|
+
|
31
|
+
# never used
|
32
|
+
return false if (c >= 0xFDD0 && c <= 0xFDEF)
|
33
|
+
return false if ((c & 0xFFFF) === 0xFFFF || (c & 0xFFFF) === 0xFFFE)
|
34
|
+
|
35
|
+
# control codes
|
36
|
+
return false if (c >= 0x00 && c <= 0x08)
|
37
|
+
return false if (c === 0x0B)
|
38
|
+
return false if (c >= 0x0E && c <= 0x1F)
|
39
|
+
return false if (c >= 0x7F && c <= 0x9F)
|
40
|
+
|
41
|
+
# out of range
|
42
|
+
return false if (c > 0x10FFFF)
|
43
|
+
|
44
|
+
return true
|
45
|
+
end
|
46
|
+
|
47
|
+
#------------------------------------------------------------------------------
|
48
|
+
def fromCodePoint(c)
|
49
|
+
c.chr(Encoding::UTF_8)
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
UNESCAPE_MD_RE = /\\([\!\"\#\$\%\&\'\(\)\*\+\,\-.\/:;<=>?@\[\\\]^_`{|}~])/
|
54
|
+
|
55
|
+
ENTITY_RE = /&([a-z#][a-z0-9]{1,31});/i
|
56
|
+
UNESCAPE_ALL_RE = Regexp.new(UNESCAPE_MD_RE.source + '|' + ENTITY_RE.source, 'i')
|
57
|
+
|
58
|
+
DIGITAL_ENTITY_TEST_RE = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i
|
59
|
+
|
60
|
+
#------------------------------------------------------------------------------
|
61
|
+
def replaceEntityPattern(match, name)
|
62
|
+
code = 0
|
63
|
+
|
64
|
+
return HTMLEntities::MAPPINGS[name].chr(Encoding::UTF_8) if HTMLEntities::MAPPINGS[name]
|
65
|
+
|
66
|
+
if (name.charCodeAt(0) == 0x23 && DIGITAL_ENTITY_TEST_RE =~ name) # '#'
|
67
|
+
code = name[1].downcase == 'x' ? name.slice_to_end(2).to_i(16) : name.slice_to_end(1).to_i
|
68
|
+
if (isValidEntityCode(code))
|
69
|
+
return fromCodePoint(code)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
return match
|
74
|
+
end
|
75
|
+
|
76
|
+
# not used
|
77
|
+
#------------------------------------------------------------------------------
|
78
|
+
# def replaceEntities(str)
|
79
|
+
# return str if str.index('&').nil?
|
80
|
+
# return str.gsub(ENTITY_RE, replaceEntityPattern)
|
81
|
+
# end
|
82
|
+
|
83
|
+
#------------------------------------------------------------------------------
|
84
|
+
def unescapeMd(str)
|
85
|
+
return str if !str.include?('\\')
|
86
|
+
return str.gsub(UNESCAPE_MD_RE, '\1')
|
87
|
+
end
|
88
|
+
|
89
|
+
#------------------------------------------------------------------------------
|
90
|
+
def unescapeAll(str)
|
91
|
+
return str if (str.index('\\').nil? && str.index('&').nil?)
|
92
|
+
|
93
|
+
return str.gsub(UNESCAPE_ALL_RE) do |match|
|
94
|
+
next $1 if ($1)
|
95
|
+
next replaceEntityPattern(match, $2)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
HTML_ESCAPE_TEST_RE = /[&<>"]/
|
101
|
+
HTML_ESCAPE_REPLACE_RE = /[&<>"]/
|
102
|
+
HTML_REPLACEMENTS = {
|
103
|
+
'&' => '&',
|
104
|
+
'<' => '<',
|
105
|
+
'>' => '>',
|
106
|
+
'"' => '"'
|
107
|
+
}
|
108
|
+
|
109
|
+
#------------------------------------------------------------------------------
|
110
|
+
def escapeHtml(str)
|
111
|
+
if HTML_ESCAPE_TEST_RE =~ str
|
112
|
+
return str.gsub(HTML_ESCAPE_REPLACE_RE, HTML_REPLACEMENTS)
|
113
|
+
end
|
114
|
+
return str
|
115
|
+
end
|
116
|
+
|
117
|
+
REGEXP_ESCAPE_RE = /[.?*+^$\[\]\\(){}|-]/
|
118
|
+
|
119
|
+
#------------------------------------------------------------------------------
|
120
|
+
def escapeRE(str)
|
121
|
+
str.gsub(REGEXP_ESCAPE_RE) {|s| '\\' + s}
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
# Zs (unicode class) || [\t\f\v\r\n]
|
126
|
+
#------------------------------------------------------------------------------
|
127
|
+
def isWhiteSpace(code)
|
128
|
+
return true if (code >= 0x2000 && code <= 0x200A)
|
129
|
+
case code
|
130
|
+
when 0x09, # \t
|
131
|
+
0x0A, # \n
|
132
|
+
0x0B, # \v
|
133
|
+
0x0C, # \f
|
134
|
+
0x0D, # \r
|
135
|
+
0x20,
|
136
|
+
0xA0,
|
137
|
+
0x1680,
|
138
|
+
0x202F,
|
139
|
+
0x205F,
|
140
|
+
0x3000
|
141
|
+
return true
|
142
|
+
end
|
143
|
+
return false
|
144
|
+
end
|
145
|
+
|
146
|
+
# from file uc.micro/categories/P/regex in github project
|
147
|
+
# https://github.com/markdown-it/uc.micro
|
148
|
+
# UNICODE_PUNCT_RE = /[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDE38-\uDE3D]|\uD805[\uDCC6\uDDC1-\uDDC9\uDE41-\uDE43]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F/
|
149
|
+
# was unable to get abouve to work TODO
|
150
|
+
UNICODE_PUNCT_RE = /[!-#%-\*,-\/:;\?@\[-\]_\{\}]/
|
151
|
+
|
152
|
+
# Currently without astral characters support.
|
153
|
+
#------------------------------------------------------------------------------
|
154
|
+
def isPunctChar(char)
|
155
|
+
return UNICODE_PUNCT_RE =~ char
|
156
|
+
end
|
157
|
+
|
158
|
+
|
159
|
+
# Markdown ASCII punctuation characters.
|
160
|
+
#
|
161
|
+
# !, ", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \, ], ^, _, `, {, |, }, or ~
|
162
|
+
# http://spec.commonmark.org/0.15/#ascii-punctuation-character
|
163
|
+
#
|
164
|
+
# Don't confuse with unicode punctuation !!! It lacks some chars in ascii range.
|
165
|
+
#------------------------------------------------------------------------------
|
166
|
+
def isMdAsciiPunct(ch)
|
167
|
+
case ch
|
168
|
+
when 0x21, # !
|
169
|
+
0x22, # "
|
170
|
+
0x23, # #
|
171
|
+
0x24, # $
|
172
|
+
0x25, # %
|
173
|
+
0x26, # &
|
174
|
+
0x27, # '
|
175
|
+
0x28, # (
|
176
|
+
0x29, # )
|
177
|
+
0x2A, # *
|
178
|
+
0x2B, # +
|
179
|
+
0x2C, # ,
|
180
|
+
0x2D, # -
|
181
|
+
0x2E, # .
|
182
|
+
0x2F, # /
|
183
|
+
0x3A, # :
|
184
|
+
0x3B, # ;
|
185
|
+
0x3C, # <
|
186
|
+
0x3D, # =
|
187
|
+
0x3E, # >
|
188
|
+
0x3F, # ?
|
189
|
+
0x40, # @
|
190
|
+
0x5B, # [
|
191
|
+
0x5C, # \
|
192
|
+
0x5D, # ]
|
193
|
+
0x5E, # ^
|
194
|
+
0x5F, # _
|
195
|
+
0x60, # `
|
196
|
+
0x7B, # {
|
197
|
+
0x7C, # |
|
198
|
+
0x7D, # }
|
199
|
+
0x7E # ~
|
200
|
+
return true
|
201
|
+
else
|
202
|
+
return false
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
# Hepler to unify [reference labels].
|
207
|
+
#------------------------------------------------------------------------------
|
208
|
+
def normalizeReference(str)
|
209
|
+
# use .toUpperCase() instead of .toLowerCase()
|
210
|
+
# here to avoid a conflict with Object.prototype
|
211
|
+
# members (most notably, `__proto__`)
|
212
|
+
return str.strip.gsub(/\s+/, ' ').upcase
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
216
|
+
end
|