aboutsummaryrefslogtreecommitdiff
path: root/node_modules/vuepress/lib/markdown/snippet.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/vuepress/lib/markdown/snippet.js')
-rw-r--r--node_modules/vuepress/lib/markdown/snippet.js43
1 files changed, 43 insertions, 0 deletions
diff --git a/node_modules/vuepress/lib/markdown/snippet.js b/node_modules/vuepress/lib/markdown/snippet.js
new file mode 100644
index 00000000..a677e12f
--- /dev/null
+++ b/node_modules/vuepress/lib/markdown/snippet.js
@@ -0,0 +1,43 @@
+const fs = require('fs')
+
+module.exports = function snippet (md, options = {}) {
+ const root = options.root || process.cwd()
+ function parser (state, startLine, endLine, silent) {
+ const CH = '<'.charCodeAt(0)
+ const pos = state.bMarks[startLine] + state.tShift[startLine]
+ const max = state.eMarks[startLine]
+
+ // if it's indented more than 3 spaces, it should be a code block
+ if (state.sCount[startLine] - state.blkIndent >= 4) {
+ return false
+ }
+
+ for (let i = 0; i < 3; ++i) {
+ const ch = state.src.charCodeAt(pos + i)
+ if (ch !== CH || pos + i >= max) return false
+ }
+
+ if (silent) {
+ return true
+ }
+
+ const start = pos + 3
+ const end = state.skipSpacesBack(max, pos)
+ const rawPath = state.src.slice(start, end).trim().replace(/^@/, root)
+ const filename = rawPath.split(/[{:\s]/).shift()
+ const content = fs.existsSync(filename) ? fs.readFileSync(filename).toString() : 'Not found: ' + filename
+ const meta = rawPath.replace(filename, '')
+
+ state.line = startLine + 1
+
+ const token = state.push('fence', 'code', 0)
+ token.info = filename.split('.').pop() + meta
+ token.content = content
+ token.markup = '```'
+ token.map = [startLine, startLine + 1]
+
+ return true
+ }
+
+ md.block.ruler.before('fence', 'snippet', parser)
+}