@peaceroad/markdown-it-renderer-fence 0.1.1 → 0.2.0

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.
package/README.md CHANGED
@@ -22,7 +22,7 @@ const md = mdit({
22
22
  return highlightjs.highlight(str, { language: lang }).value
23
23
  } catch (__) {}
24
24
  }
25
- return ''
25
+ return str
26
26
  }).use(mditAttrs).use(mditRendererFence)
27
27
 
28
28
 
@@ -68,12 +68,12 @@ $ pwd
68
68
  ~~~
69
69
 
70
70
 
71
- ## Add span elements to display line number, and style attribute.
71
+ ## Add span elements to display line number.
72
72
 
73
73
  Add `start` or `data-pre-start` attribute by adding attributes used markdown-it-attrs.
74
74
 
75
75
  ~~~md
76
- ```js {.style start="1"}
76
+ ```js {start="1"}
77
77
  import mdit from 'markdonw-it'
78
78
  const md = mdit()
79
79
  md.render('Nyaan')
@@ -81,10 +81,50 @@ md.render('Nyaan')
81
81
  ~~~
82
82
 
83
83
  ~~~html
84
- <pre><code class="language-js style" data-pre-start="1" style="counter-set:pre-line-number 1;"><span class="pre-line"><span class="hljs-keyword">import</span> mdit <span class="hljs-keyword">from</span> <span class="hljs-string">&#x27;markdonw-it&#x27;</span></span>
84
+ <pre><code class="language-js" data-pre-start="1" style="counter-set:pre-line-number 1;"><span class="pre-line"><span class="hljs-keyword">import</span> mdit <span class="hljs-keyword">from</span> <span class="hljs-string">&#x27;markdonw-it&#x27;</span></span>
85
85
  <span class="pre-line"><span class="hljs-keyword">const</span> md = <span class="hljs-title function_">mdit</span>()</span>
86
86
  <span class="pre-line">md.<span class="hljs-title function_">render</span>(<span class="hljs-string">&#x27;Nyaan&#x27;</span>)</span>
87
87
  </code></pre>
88
88
  ~~~
89
89
 
90
90
  CSS example: <https://codepen.io/peaceroad/pen/qBGpYGK>
91
+
92
+ ## Add span elements to add background color to the row ranges.
93
+
94
+ Add `em-lines` or `emphasize-lines` attribute by by adding attributes used markdown-it-attrs.
95
+
96
+ ~~~md
97
+ ``` {em-lines="2,4-5"}
98
+ 1
99
+ 2
100
+ 3
101
+ 4
102
+ 5
103
+ 6
104
+ ```
105
+ ~~~
106
+
107
+ ~~~html
108
+ [HTML]
109
+ <pre><code data-pre-emphasis="2,4-5">1
110
+ <span class="pre-lines-emphasis">2
111
+ </span>3
112
+ <span class="pre-lines-emphasis">4
113
+ 5
114
+ </span>6
115
+ </code></pre>
116
+ ~~~
117
+
118
+
119
+ ## Options
120
+
121
+ The following options can be specified when initializing the plugin:
122
+
123
+ - attrsOrder: default ['class','id','data-*','style'] — order of attributes in output; wildcards supported.
124
+ - setHighlight: default true — enable calling highlight function (e.g., highlight.js).
125
+ - setLineNumber: default true — wrap lines in spans for line numbers.
126
+ - setEmphasizeLines: default true — enable emphasis based on emphasize-lines attribute.
127
+ - setLineEndSpan: default 0 — character count threshold to append end-of-line span (0 to disable).
128
+ - lineEndSpanClass: default 'pre-lineend-spacer' — CSS class for end-of-line span.
129
+ - sampLang: default 'shell,console' — comma-separated list of languages (in addition to 'samp') that will be rendered using `<samp>`.
130
+ - langPrefix: default md.options.langPrefix || 'language-' — prefix for language class on code blocks.
package/index.js CHANGED
@@ -1,38 +1,93 @@
1
- const fenceStartTag = (tagName, sAttr) => {
2
- let orderedAttrs = [...sAttr.id, ...sAttr.clas, ...sAttr.data, ...sAttr.style, ...sAttr.other]
3
- //console.log(orderedAttrs)
4
- let tag = '<' + tagName
5
- for (let attr of orderedAttrs) {
6
- if (attr[0]) tag += ' ' + attr[0] + '="' + attr[1] + '"'
7
- }
8
- return tag + '>'
1
+ const infoReg = /^([^{\s]*)(?:\s*\{(.*)\})?$/
2
+ const startReg = /^(?:(?:data-)?pre-)?start$/
3
+ const startFilterReg = /^(?:pre-)?start$/
4
+ const emphasisReg = /^em(?:phasize)?-lines$/
5
+
6
+ const attrReg = /^(?:([.#])(.+)|(.+?)(?:=(["'])?(.*?)\1)?)$/
7
+ const interAttrsSpaceReg = / +/
8
+ const tagReg = /<\/?([A-Za-z][A-Za-z0-9-]*)(?:\s+[^>]*?)?\/?\s*>/g
9
+ const preLineTag = '<span class="pre-line">'
10
+ const emphOpenTag = '<span class="pre-lines-emphasis">'
11
+ const closeTag = '</span>'
12
+ const closeTagLen = closeTag.length
13
+
14
+ const getEmphasizeLines = (attrVal) => {
15
+ const lines = []
16
+ let s, e
17
+ attrVal.split(',').forEach(range => {
18
+ if (range.indexOf('-') > -1) {
19
+ [s, e] = range.split('-').map(n => parseInt(n.trim(), 10))
20
+ lines.push([s, e])
21
+ } else {
22
+ s = parseInt(range.trim(), 10)
23
+ lines.push([s, s])
24
+ }
25
+ })
26
+ return lines
9
27
  }
10
28
 
11
- const splitFenceBlockToLines = (token, content) => {
12
- const br = content.match(/\r?\n/)
13
- const lines = content.split(/r?\n/)
14
- lines.map((line, n) => {
15
- const lastElementTag = line.match(/<(\w+)( +[^>]*?)>[^>]*?(<\/\1>)?[^>]*?$/)
16
- if (lastElementTag && !lastElementTag[3]) {
17
- line += '</span>'
18
- if (n < lines.length - 2) {
19
- lines[n + 1] = `<${lastElementTag[1]}${lastElementTag[2]}>` + lines[n + 1]
29
+ const splitFenceBlockToLines = (content, emphasizeLines, needLineNumber, needEmphasis, needEndSpan, threshold, lineEndSpanClass, br) => {
30
+ const lines = content.split(br)
31
+ const len = lines.length
32
+ const endSpanTag = `<span class="${lineEndSpanClass}"></span>`
33
+ let emIdx = 0
34
+ let [emStart, emEnd] = emphasizeLines[0] || []
35
+ for (let n = 0; n < len; n++) {
36
+ let line = lines[n]
37
+
38
+ if (needEndSpan) {
39
+ let lineLen = 0
40
+ for (let i = 0, L = line.length; i < L; i++) {
41
+ lineLen += line.charCodeAt(i) > 255 ? 2 : 1
42
+ }
43
+ if (lineLen >= threshold) {
44
+ if (line.slice(-closeTagLen) === closeTag) {
45
+ line = line.slice(0, -closeTagLen) + endSpanTag + closeTag
46
+ } else {
47
+ line = line + endSpanTag
48
+ }
20
49
  }
21
50
  }
22
- if (n < lines.length - 1) {
23
- lines[n] = '<span class="pre-line">' + line + '</span>'
51
+
52
+ if (needLineNumber && n !== len - 1) {
53
+ const tagStack = []
54
+ tagReg.lastIndex = 0
55
+ let match
56
+ while ((match = tagReg.exec(line)) !== null) {
57
+ const [fullMatch, tagName] = match
58
+ if (fullMatch.startsWith('</')) {
59
+ if (tagStack[tagStack.length-1] === tagName) tagStack.pop()
60
+ } else if (!fullMatch.endsWith('/>')) {
61
+ tagStack.push(tagName)
62
+ }
63
+ }
64
+ for (let i = tagStack.length-1; i >= 0; i--) {
65
+ const tagName = tagStack[i]
66
+ line += `</${tagName}>`
67
+ lines[n+1] = `<${tagName}>` + (lines[n+1]||'')
68
+ }
69
+ line = preLineTag + line + closeTag
24
70
  }
25
- })
71
+
72
+ if (needEmphasis) {
73
+ if (emStart === n + 1) line = emphOpenTag + line
74
+ if (emEnd === n) {
75
+ line = closeTag + line
76
+ emIdx++
77
+ [emStart, emEnd] = emphasizeLines[emIdx] || []
78
+ }
79
+ }
80
+ lines[n] = line
81
+ }
26
82
  return lines.join(br)
27
83
  }
28
84
 
29
- const setInfoAttr = (infoAttr) => {
85
+ const getInfoAttr = (infoAttr) => {
86
+ let attrSets = infoAttr.trim().split(interAttrsSpaceReg)
30
87
  let arr = []
31
- let attrSets = infoAttr.trim().split(/ +/)
32
88
  for (let attrSet of attrSets) {
33
- const str = attrSet.match(/^(?:([.#])(.+)|(.+?)(?:=("')?(.*?)\1?)?)$/)
89
+ const str = attrReg.exec(attrSet)
34
90
  if (str) {
35
- console.log(str)
36
91
  if (str[1] === '.') str[1] = 'class'
37
92
  if (str[1] === '#') str[1] = 'id'
38
93
  if (str[3]) {
@@ -45,95 +100,110 @@ const setInfoAttr = (infoAttr) => {
45
100
  return arr
46
101
  }
47
102
 
48
- const getFenceHtml = (tokens, idx, env, slf, md, options) => {
49
- const opt = {
50
- setHighlight: true,
51
- setLineNumber: true,
52
- langPrefix: 'language-',
53
- highlight: null,
54
- }
55
- if (options) Object.assign(opt, options)
103
+ const orderTokenAttrs = (token, opt) => {
104
+ if (!token.attrs) return
105
+ const order = opt.attrsOrder || []
106
+ token.attrs.sort((a, b) => {
107
+ const idx = (name) => {
108
+ for (let i = 0; i < order.length; i++) {
109
+ const key = order[i]
110
+ if (key.endsWith('*')) {
111
+ const prefix = key.slice(0, -1)
112
+ if (name.startsWith(prefix)) return i
113
+ } else if (name === key) {
114
+ return i
115
+ }
116
+ }
117
+ return order.length
118
+ }
119
+ return idx(a[0]) - idx(b[0])
120
+ })
121
+ }
56
122
 
123
+ const getFenceHtml = (tokens, idx, md, opt, slf) => {
57
124
  const token = tokens[idx]
58
- //console.log(token)
59
125
  let content = token.content
60
- const infoAttr = token.info.trim().match(/{(.*)}$/)
61
- if(infoAttr) {
62
- token.attrs = token.attrs ? [...token.attrs, ...setInfoAttr(infoAttr[1])] : setInfoAttr(infoAttr[1])
126
+ const match = token.info.trim().match(infoReg)
127
+ let lang = match ? match[1] : ''
128
+
129
+ if (match && match[2]) {
130
+ getInfoAttr(match[2]).forEach(([name, val]) => token.attrJoin(name, val))
131
+ }
132
+ let langClass = ''
133
+ if (lang && lang !== 'samp') {
134
+ langClass = opt.langPrefix + lang
135
+ token.attrSet('class', langClass + (token.attrGet('class') ? ' ' + token.attrGet('class') : ''))
63
136
  }
64
- //console.log(token.attrs)
65
137
 
66
- let lang = token.info.trim().replace(/ *({.*)?$/, '')
67
- const langClass = lang && token.info !== 'samp' ? opt.langPrefix + lang : ''
68
- let sAttr = {id: [], clas: [], data: [], style: [], other: []}
69
- let hasPreLineStart = false
70
- let preLineStart = -1
138
+ let startNumber = -1
139
+ let emphasizeLines = []
140
+
71
141
  if (token.attrs) {
72
- //console.log('start: ' +token.attrs)
73
142
  for (let attr of token.attrs) {
74
- if (attr[0] === 'id') {
75
- sAttr.id.push(attr)
76
- } else if (attr[0] === 'class') {
77
- const sAttrClass = langClass ? langClass + ' ' + attr[1] : attr[1]
78
- const hasLang = attr[1].match(new RegExp('(?:^| )' + opt.langPrefix + '(.*)(?: |$)'))
79
- if (hasLang) lang = hasLang[1]
80
- sAttr.clas.push([attr[0], sAttrClass])
81
- } else if (attr[0].startsWith('data-') || /^(?:pre-)?start$/.test(attr[0])) {
82
- if (/^(?:(?:data-)?pre-)?start$/.test(attr[0])) {
83
- hasPreLineStart = true
84
- preLineStart = attr[1]
85
- attr[0] = 'data-pre-start'
143
+ if (attr[0] === 'class') {
144
+ const hasClassLang = attr[1].match(opt._langReg)
145
+ if (hasClassLang) lang = hasClassLang[1]
146
+ }
147
+ if (startReg.test(attr[0])) {
148
+ startNumber = +attr[1]
149
+ if (attr[0] !== 'data-pre-start') {
150
+ token.attrSet('data-pre-start', attr[1])
151
+ token.attrs = token.attrs.filter(attr => !startFilterReg.test(attr[0]))
86
152
  }
87
- sAttr.data.push(attr)
88
- } else if (attr[0] === 'style') {
89
- sAttr.style.push(attr)
90
- } else {
91
- sAttr.other.push(attr)
153
+ }
154
+ if (emphasisReg.test(attr[0])) {
155
+ emphasizeLines = getEmphasizeLines(attr[1])
156
+ token.attrSet('data-pre-emphasis', attr[1])
157
+ token.attrs = token.attrs.filter(attr => !emphasisReg.test(attr[0]))
92
158
  }
93
159
  }
94
160
  }
95
- if (sAttr.clas.length === 0 && langClass !== '') sAttr.clas.push(['class', langClass])
96
- if (hasPreLineStart && preLineStart !== -1) {
97
- if (sAttr.style.length === 0) {
98
- sAttr.style.push(['style', 'counter-set:pre-line-number ' + preLineStart + ';'])
99
- } else {
100
- sAttr.style[0][1] = sAttr.style[0][1].replace(/;?$/, '; counter-set:pre-line-number ' + preLineStart + ';')
101
- }
161
+ if (startNumber !== -1) {
162
+ token.attrJoin('style', 'counter-set:pre-line-number ' + startNumber + ';')
102
163
  }
103
- //console.log(JSON.stringify(sAttr))
164
+ orderTokenAttrs(token, opt)
104
165
 
105
166
  if (opt.setHighlight && md.options.highlight) {
106
167
  if (lang && lang !== 'samp' ) {
107
- content = md.options.highlight(token.content, lang)
168
+ content = md.options.highlight(content, lang)
108
169
  } else {
109
170
  content = md.utils.escapeHtml(token.content)
110
171
  }
111
172
  } else {
112
173
  content = md.utils.escapeHtml(token.content)
113
174
  }
114
- if (opt.setLineNumber && hasPreLineStart) {
115
- content = splitFenceBlockToLines(token, content)
116
- }
117
175
 
118
- let fenceHtml = '<pre>'
119
- let isSamp = /^(?:samp|shell|console)$/.test(lang)
120
- if (isSamp) {
121
- fenceHtml += fenceStartTag('samp', sAttr)
122
- } else {
123
- fenceHtml += fenceStartTag('code', sAttr)
124
- }
125
- fenceHtml += content
126
- if (isSamp) {
127
- fenceHtml += '</samp>'
128
- } else {
129
- fenceHtml += '</code>'
176
+ const needLineNumber = opt.setLineNumber && startNumber >= 0
177
+ const needEmphasis = opt.setEmphasizeLines && emphasizeLines.length > 0
178
+ const needEndSpan = opt.setLineEndSpan > 0
179
+ if (needLineNumber || needEmphasis || needEndSpan) {
180
+ const brMatch = content.match(/\r?\n/)
181
+ const br = brMatch ? brMatch[0] : '\n'
182
+ content = splitFenceBlockToLines(content, emphasizeLines, needLineNumber, needEmphasis, needEndSpan, opt.setLineEndSpan, opt.lineEndSpanClass, br)
130
183
  }
131
- return fenceHtml + '</pre>\n'
184
+
185
+ const tag = opt._sampReg.test(lang) ? 'samp' : 'code'
186
+ return `<pre><${tag}${slf.renderAttrs(token)}>${content}</${tag}></pre>\n`
132
187
  }
133
188
 
134
- const mditRendererFence = (md, options) => {
135
- md.renderer.rules['fence'] = (tokens, idx, env, slf) => {
136
- return getFenceHtml(tokens, idx, env, slf, md, options)
189
+ const mditRendererFence = (md, option) => {
190
+ const opt = {
191
+ attrsOrder: ['class', 'id', 'data-*', 'style'],
192
+ setHighlight: true,
193
+ setLineNumber: true,
194
+ setEmphasizeLines: true,
195
+ setLineEndSpan: 0,
196
+ lineEndSpanClass: 'pre-lineend-spacer',
197
+ sampLang: 'shell,console',
198
+ langPrefix: md.options.langPrefix || 'language-',
199
+ }
200
+ if (option) Object.assign(opt, option)
201
+
202
+ opt._sampReg = new RegExp('^(?:samp|' + opt.sampLang.split(',').join('|') + ')$')
203
+ opt._langReg = new RegExp(opt.langPrefix + '([A-Za-z0-9-]+)')
204
+
205
+ md.renderer.rules['fence'] = (tokens, idx, options, env, slf) => {
206
+ return getFenceHtml(tokens, idx, md, opt, slf)
137
207
  }
138
208
  }
139
209
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@peaceroad/markdown-it-renderer-fence",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "In code blocks, the `<samp>` tag is used with the language keywords `samp`, `shell`, and `console`, and provides an option to display line numbers.",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -11,9 +11,9 @@
11
11
  "repository": "https://github.com/peaceroad/p7d-markdown-it-renderer-fence",
12
12
  "license": "MIT",
13
13
  "devDependencies": {
14
- "@peaceroad/markdown-it-figure-with-p-caption": "^0.6.1",
15
- "highlight.js": "^11.9.0",
14
+ "@peaceroad/markdown-it-figure-with-p-caption": "^0.10.1",
16
15
  "markdown-it": "^14.1.0",
17
- "markdown-it-attrs": "^4.1.6"
16
+ "markdown-it-attrs": "^4.2.0",
17
+ "highlight.js": "^11.10.0"
18
18
  }
19
19
  }
@@ -0,0 +1,55 @@
1
+ [Markdown]
2
+ ```
3
+ 1234567890
4
+ 2
5
+ 1234567890
6
+ 4
7
+ 1234567890
8
+ 6
9
+ ```
10
+ [HTML]
11
+ <pre><code>1234567890<span class="pre-lineend-spacer"></span>
12
+ 2
13
+ 1234567890<span class="pre-lineend-spacer"></span>
14
+ 4
15
+ 1234567890<span class="pre-lineend-spacer"></span>
16
+ 6
17
+ </code></pre>
18
+
19
+
20
+ [Markdown]
21
+ ``` {em-lines="3"}
22
+ 1234567890
23
+ 2
24
+ 1234567890
25
+ 4
26
+ 1234567890
27
+ 6
28
+ ```
29
+ [HTML]
30
+ <pre><code data-pre-emphasis="3">1234567890<span class="pre-lineend-spacer"></span>
31
+ 2
32
+ <span class="pre-lines-emphasis">1234567890<span class="pre-lineend-spacer"></span>
33
+ </span>4
34
+ 1234567890<span class="pre-lineend-spacer"></span>
35
+ 6
36
+ </code></pre>
37
+
38
+
39
+ [Markdown]
40
+ ``` {em-lines="3" start="4"}
41
+ 1234567890
42
+ 2
43
+ 1234567890
44
+ 4
45
+ 1234567890
46
+ 6
47
+ ```
48
+ [HTML]
49
+ <pre><code data-pre-emphasis="3" data-pre-start="4" style="counter-set:pre-line-number 4;"><span class="pre-line">1234567890<span class="pre-lineend-spacer"></span></span>
50
+ <span class="pre-line">2</span>
51
+ <span class="pre-lines-emphasis"><span class="pre-line">1234567890<span class="pre-lineend-spacer"></span></span>
52
+ </span><span class="pre-line">4</span>
53
+ <span class="pre-line">1234567890<span class="pre-lineend-spacer"></span></span>
54
+ <span class="pre-line">6</span>
55
+ </code></pre>
@@ -0,0 +1,93 @@
1
+ [Markdown]
2
+ ``` {em-lines="3-5"}
3
+ 1
4
+ 2
5
+ 3
6
+ 4
7
+ 5
8
+ 6
9
+ ```
10
+ [HTML]
11
+ <pre><code data-pre-emphasis="3-5">1
12
+ 2
13
+ <span class="pre-lines-emphasis">3
14
+ 4
15
+ 5
16
+ </span>6
17
+ </code></pre>
18
+
19
+
20
+ [Markdown]
21
+ ``` {em-lines="1"}
22
+ 1
23
+ 2
24
+ 3
25
+ 4
26
+ 5
27
+ 6
28
+ ```
29
+ [HTML]
30
+ <pre><code data-pre-emphasis="1"><span class="pre-lines-emphasis">1
31
+ </span>2
32
+ 3
33
+ 4
34
+ 5
35
+ 6
36
+ </code></pre>
37
+
38
+
39
+ [Markdown]
40
+ ``` {em-lines="1-3,5-6"}
41
+ 1
42
+ 2
43
+ 3
44
+ 4
45
+ 5
46
+ 6
47
+ ```
48
+ [HTML]
49
+ <pre><code data-pre-emphasis="1-3,5-6"><span class="pre-lines-emphasis">1
50
+ 2
51
+ 3
52
+ </span>4
53
+ <span class="pre-lines-emphasis">5
54
+ 6
55
+ </span></code></pre>
56
+
57
+
58
+ [Markdown]
59
+ ``` {em-lines="3-5" start="1"}
60
+ 1
61
+ 2
62
+ 3
63
+ 4
64
+ 5
65
+ 6
66
+ ```
67
+ [HTML]
68
+ <pre><code data-pre-emphasis="3-5" data-pre-start="1" style="counter-set:pre-line-number 1;"><span class="pre-line">1</span>
69
+ <span class="pre-line">2</span>
70
+ <span class="pre-lines-emphasis"><span class="pre-line">3</span>
71
+ <span class="pre-line">4</span>
72
+ <span class="pre-line">5</span>
73
+ </span><span class="pre-line">6</span>
74
+ </code></pre>
75
+
76
+
77
+ [Markdown]
78
+ ``` {em-lines="2,4-5"}
79
+ 1
80
+ 2
81
+ 3
82
+ 4
83
+ 5
84
+ 6
85
+ ```
86
+ [HTML]
87
+ <pre><code data-pre-emphasis="2,4-5">1
88
+ <span class="pre-lines-emphasis">2
89
+ </span>3
90
+ <span class="pre-lines-emphasis">4
91
+ 5
92
+ </span>6
93
+ </code></pre>
@@ -163,3 +163,13 @@ console.log('A test.')
163
163
  [HTML]
164
164
  <pre><code class="language-js"><span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">&#x27;A test.&#x27;</span>)
165
165
  </code></pre>
166
+
167
+ [Markdown]
168
+ ```conf
169
+ [Service]
170
+ Environment="OLLAMA_HOST=0.0.0.0"
171
+ ```
172
+ [HTML]
173
+ <pre><code class="language-conf">[Service]
174
+ Environment="OLLAMA_HOST=0.0.0.0"
175
+ </code></pre>
package/test/examples.txt CHANGED
@@ -81,7 +81,7 @@ console.log('A test.')
81
81
  console.log('A test.')
82
82
  ```
83
83
  [HTML]
84
- <pre><code id="id" class="language-js style">console.log('A test.')
84
+ <pre><code class="language-js style" id="id">console.log('A test.')
85
85
  </code></pre>
86
86
 
87
87
  [Markdown]
package/test/test.js CHANGED
@@ -22,10 +22,11 @@ const mdHighlightJs = mdit({
22
22
  return highlightjs.highlight(str, { language: lang }).value
23
23
  } catch (__) {}
24
24
  }
25
- return ''
25
+ return str
26
26
  }
27
27
  }).use(mditRendererFence, opt).use(mditAttrs)
28
-
28
+ const mdLinesEmphasis = mdit({ html: true }).use(mditRendererFence).use(mditAttrs)
29
+ const mdLIneEndSpan = mdit({ html: true }).use(mditRendererFence, {setLineEndSpan: 8}).use(mditAttrs)
29
30
 
30
31
  let __dirname = path.dirname(new URL(import.meta.url).pathname)
31
32
  const isWindows = (process.platform === 'win32')
@@ -36,6 +37,8 @@ if (isWindows) {
36
37
  const testData = {
37
38
  noOption: __dirname + path.sep + 'examples.txt',
38
39
  highlightjs: __dirname + path.sep + 'examples-highlightjs.txt',
40
+ linesEmphasis: __dirname + path.sep + 'example-lines-emphasis.txt',
41
+ lineEndSpan: __dirname + path.sep + 'example-line-end-span.txt',
39
42
  }
40
43
 
41
44
  const getTestData = (pat) => {
@@ -87,7 +90,7 @@ const runTest = (process, pat, pass, testId) => {
87
90
 
88
91
  while(n <= end) {
89
92
  if (!ms[n]
90
- // || n != 3
93
+ //|| n != 14
91
94
  ) {
92
95
  n++
93
96
  continue
@@ -114,5 +117,7 @@ const runTest = (process, pat, pass, testId) => {
114
117
  let pass = true
115
118
  pass = runTest(md, testData.noOption, pass)
116
119
  pass = runTest(mdHighlightJs, testData.highlightjs, pass)
120
+ pass = runTest(mdLinesEmphasis, testData.linesEmphasis, pass)
121
+ pass = runTest(mdLIneEndSpan, testData.lineEndSpan, pass)
117
122
 
118
123
  if (pass) console.log('Passed all test.')