@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 +44 -4
- package/index.js +158 -88
- package/package.json +4 -4
- package/test/example-line-end-span.txt +55 -0
- package/test/example-lines-emphasis.txt +93 -0
- package/test/examples-highlightjs.txt +10 -0
- package/test/examples.txt +1 -1
- package/test/test.js +8 -3
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
|
|
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 {
|
|
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
|
|
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">'markdonw-it'</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">'Nyaan'</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
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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 = (
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
23
|
-
|
|
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
|
|
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 =
|
|
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
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
|
61
|
-
|
|
62
|
-
|
|
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
|
|
67
|
-
|
|
68
|
-
|
|
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] === '
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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 (
|
|
96
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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
|
-
|
|
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,
|
|
135
|
-
|
|
136
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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">'A test.'</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
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
|
-
|
|
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.')
|