Skip to content

Commit 4ea3bbe

Browse files
authored
Merge pull request #66 from cpprefjp/hotfix/example-code-detection
Use brand new logic for Markdown example code detection
2 parents e64639b + 6b54aa9 commit 4ea3bbe

File tree

3 files changed

+56
-39
lines changed

3 files changed

+56
-39
lines changed

js/kunai/meta/meta.js

+26-36
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,9 @@ import * as Code from '../code'
77
import {Logger} from 'nagato'
88

99
import URL from 'url-parse'
10+
import * as CM from 'commonmark'
1011

1112

12-
let Marked = require('marked')
13-
const MarkedOpts = {
14-
gfm: true,
15-
tables: true,
16-
}
17-
1813
class Meta {
1914
static PageKey = PageKey
2015

@@ -119,15 +114,11 @@ class Meta {
119114

120115
parse_impl(content_type, data) {
121116
if (content_type === Net.ContentType.MARKDOWN) {
122-
let lexer = new Marked.Lexer(MarkedOpts)
123-
this.log.debug('lexer', lexer)
124-
125-
this.tokens = lexer.lex(data).map(e => {
126-
return new Map(Object.entries(e))
127-
})
128-
this.log.debug(`markdown (${this.tokens.length} tokens)`, this.tokens)
117+
let reader = new CM.Parser({})
118+
const parsed = reader.parse(data)
119+
this.log.debug('parsed', parsed)
129120

130-
this.process(this.tokens)
121+
this.process(parsed.walker())
131122
}
132123
}
133124

@@ -138,34 +129,35 @@ class Meta {
138129
return this.codes.get(id)
139130
}
140131

141-
process(tokens) {
132+
process(walker) {
142133
this.is_first_list = true
143134
this.single_bufs = []
144135

145136
const old_level = this.log.opts.data.ctx.level
146137
this.log.opts.data.ctx.level = Logger.Level.info
147138

148139
try {
149-
for (const token of tokens) {
150-
this.process_single(token)
140+
let ev = null
141+
while (ev = walker.next()) {
142+
this.process_single(ev)
151143
}
152144

153145
} finally {
154146
this.log.opts.data.ctx.level = old_level
155147
}
156148
}
157149

158-
static isSampleCode(lang, buf) {
159-
return lang === 'cpp' && buf.split(/\n+/).some((line) => line.trim().match(/^#include/))
150+
static isSampleCode(lang, info) {
151+
return info.includes('example')
160152
}
161153

162-
process_single(token) {
163-
this.log.debug(`processing token <${token.get('type')}>`, token)
154+
process_single(ev) {
155+
const node = ev.node
156+
this.log.debug(`[${ev.entering ? 'enter' : 'leave'}] ${node.type}`, ev)
164157

165-
switch (token.get('type')) {
158+
switch (node.type) {
166159
case 'heading': {
167-
this.heading_depth = token.depth
168-
this.heading = token.get('text').trim()
160+
this.heading_depth = node.level
169161
break
170162
}
171163

@@ -201,34 +193,32 @@ class Meta {
201193

202194
case 'text': {
203195
if (this.is_first_list) {
204-
this.single_bufs[this.single_bufs.length - 1] += token.get('text')
196+
this.single_bufs[this.single_bufs.length - 1] += node.literal
205197
}
206198
break
207199
}
208200

209-
case 'code': {
210-
const lang = token.get('lang')
211-
const buf = token.get('text')
212-
213-
this.log.info(`found a code section (#${this.last_key})`)
201+
case 'code_block': {
202+
const [lang, ...info] = node.info.split(/\s+/)
203+
this.log.info(`found a code block (#${this.last_key}, lang: '${lang}', info: ${info.length ? `[${info.join(', ')}]` : '(empty)'})`, node)
214204

215-
if (!Meta.isSampleCode(lang, buf)) {
216-
this.log.warn(`unsupported code snippet (lang: '${lang || '(empty)'}')`, buf)
217-
if (lang) ++this.last_key
205+
if (!Meta.isSampleCode(lang, info)) {
206+
this.log.warn(`unsupported code snippet`, node)
207+
++this.last_key
218208
break
219209
}
220210

221211
try {
222212
if (lang === 'cpp') {
223-
this.log.info(`got C++ code (#${this.last_key})`, buf)
213+
this.log.info(`got C++ code (#${this.last_key})`, node.literal)
224214

225215
const headers = [this.andareMetaInfo.get('header')].filter(Boolean)
226216
const id = new Code.ID('CPP', this.last_key)
227217
this.codes.add(
228218
new Code.CPP(
229219
this.log,
230220
id,
231-
buf,
221+
node.literal,
232222
{
233223
headers: headers,
234224
},
@@ -237,7 +227,7 @@ class Meta {
237227
this.onCodeFound(id)
238228

239229
} else {
240-
this.log.warn(`got code for unknown language '${lang}', skipping...`, buf)
230+
this.log.warn(`got code for unknown language '${lang}', skipping...`, node.literal)
241231
}
242232

243233
} finally {

package-lock.json

+29-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,10 @@
7373
"anser": "^1.4.4",
7474
"babel-runtime": "^6.26.0",
7575
"codemirror": "^5.31.0",
76+
"commonmark": "^0.28.1",
7677
"crsearch": "^2.7.2",
7778
"font-awesome": "^4.7.0",
7879
"jquery": "^3.2.1",
79-
"marked": "^0.3.6",
8080
"nagato": "^1.8.3",
8181
"normalize.css": "^7.0.0",
8282
"numeral": "^2.0.6"

0 commit comments

Comments
 (0)