feat: Provide code fragments feature (#748)
This commit is contained in:
parent
6ac7bace21
commit
1447c8a40a
4 changed files with 37 additions and 0 deletions
16
docs/_media/example.js
Normal file
16
docs/_media/example.js
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
import fetch from 'fetch'
|
||||||
|
|
||||||
|
const URL = 'https://example.com'
|
||||||
|
const PORT = 8080
|
||||||
|
|
||||||
|
/// [demo]
|
||||||
|
const result = fetch(`${URL}:${PORT}`)
|
||||||
|
.then(function(response) {
|
||||||
|
return response.json();
|
||||||
|
})
|
||||||
|
.then(function(myJson) {
|
||||||
|
console.log(JSON.stringify(myJson));
|
||||||
|
});
|
||||||
|
/// [demo]
|
||||||
|
|
||||||
|
result.then(console.log).catch(console.error)
|
||||||
|
|
@ -39,6 +39,21 @@ You will get it
|
||||||
|
|
||||||
[filename](_media/example.md ':include :type=code')
|
[filename](_media/example.md ':include :type=code')
|
||||||
|
|
||||||
|
## Embedded code fragments
|
||||||
|
Sometimes you don't want to embed a whole file. Maybe because you need just a few lines but you want to compile and test the file in CI.
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
[filename](_media/example.js ':include :type=code :fragment=demo')
|
||||||
|
```
|
||||||
|
|
||||||
|
In your code file you need to surround the fragment between `/// [demo]` lines (before and after the fragment).
|
||||||
|
Alternatively you can use `### [demo]`.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
[filename](_media/example.js ':include :type=code :fragment=demo')
|
||||||
|
|
||||||
|
|
||||||
## Tag attribute
|
## Tag attribute
|
||||||
|
|
||||||
If you embed the file as `iframe`, `audio` and `video`, then you may need to set the attributes of these tags.
|
If you embed the file as `iframe`, `audio` and `video`, then you may need to set the attributes of these tags.
|
||||||
|
|
|
||||||
|
|
@ -164,6 +164,7 @@ export class Compiler {
|
||||||
embed = compileMedia[type].call(this, href, title)
|
embed = compileMedia[type].call(this, href, title)
|
||||||
embed.type = type
|
embed.type = type
|
||||||
}
|
}
|
||||||
|
embed.fragment = config.fragment
|
||||||
|
|
||||||
return embed
|
return embed
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,11 @@ function walkFetchEmbed({embedTokens, compile, fetch}, cb) {
|
||||||
if (token.embed.type === 'markdown') {
|
if (token.embed.type === 'markdown') {
|
||||||
embedToken = compile.lexer(text)
|
embedToken = compile.lexer(text)
|
||||||
} else if (token.embed.type === 'code') {
|
} else if (token.embed.type === 'code') {
|
||||||
|
if (token.embed.fragment) {
|
||||||
|
const fragment = token.embed.fragment
|
||||||
|
const pattern = new RegExp(`(?:###|\\/\\/\\/)\\s*\\[${fragment}\\]([\\s\\S]*)(?:###|\\/\\/\\/)\\s*\\[${fragment}\\]`)
|
||||||
|
text = ((text.match(pattern) || [])[1] || '').trim()
|
||||||
|
}
|
||||||
embedToken = compile.lexer(
|
embedToken = compile.lexer(
|
||||||
'```' +
|
'```' +
|
||||||
token.embed.lang +
|
token.embed.lang +
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue