mirror of
https://github.com/TriliumNext/Notes.git
synced 2025-08-10 18:39:22 +08:00
Add gfm plugins
This commit is contained in:
parent
216791b9da
commit
42e4a09b57
50
README.md
Normal file
50
README.md
Normal file
@ -0,0 +1,50 @@
|
||||
# turndown-plugin-gfm
|
||||
|
||||
A [Turndown](https://github.com/domchristie/turndown) plugin which adds GitHub Flavored Markdown extensions.
|
||||
|
||||
## Installation
|
||||
|
||||
npm:
|
||||
|
||||
```
|
||||
npm install turndown-plugin-gfm
|
||||
```
|
||||
|
||||
Browser:
|
||||
|
||||
```html
|
||||
<script src="https://unpkg.com/turndown/dist/turndown.js"></script>
|
||||
<script src="https://unpkg.com/turndown/dist/turndown-plugin-gfm.js"></script>
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
// For Node.js
|
||||
var TurndownService = require('turndown')
|
||||
var turndownPluginGfm = require('turndown-plugin-gfm')
|
||||
|
||||
var gfm = turndownPluginGfm.gfm
|
||||
var turndownService = new TurndownService()
|
||||
turndownService.use(gfm)
|
||||
var markdown = turndownService.turndown('<strike>Hello world!</strike>')
|
||||
```
|
||||
|
||||
turndown-plugin-gfm is a suite of plugins which can be applied individually. The available plugins are as follows:
|
||||
|
||||
- `strikethrough` (for converting `<strike>`, `<s>`, and `<del>` elements)
|
||||
- `tables`
|
||||
- `taskListItems`
|
||||
- `gfm` (which applies all of the above)
|
||||
|
||||
So for example, if you only wish to convert tables:
|
||||
|
||||
```js
|
||||
var tables = require('turndown-plugin-gfm').tables
|
||||
var turndownService = new TurndownService()
|
||||
turndownService.use(tables)
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
turndown-plugin-gfm is copyright © 2017+ Dom Christie and released under the MIT license.
|
8
config/rollup.config.browser.cjs.js
Normal file
8
config/rollup.config.browser.cjs.js
Normal file
@ -0,0 +1,8 @@
|
||||
import config from './rollup.config'
|
||||
|
||||
export default config({
|
||||
output: {
|
||||
format: 'cjs',
|
||||
file: 'lib/turndown-plugin-gfm.browser.cjs.js'
|
||||
}
|
||||
})
|
8
config/rollup.config.browser.es.js
Normal file
8
config/rollup.config.browser.es.js
Normal file
@ -0,0 +1,8 @@
|
||||
import config from './rollup.config'
|
||||
|
||||
export default config({
|
||||
output: {
|
||||
format: 'es',
|
||||
file: 'lib/turndown-plugin-gfm.browser.es.js'
|
||||
}
|
||||
})
|
8
config/rollup.config.cjs.js
Normal file
8
config/rollup.config.cjs.js
Normal file
@ -0,0 +1,8 @@
|
||||
import config from './rollup.config'
|
||||
|
||||
export default config({
|
||||
output: {
|
||||
format: 'cjs',
|
||||
file: 'lib/turndown-plugin-gfm.cjs.js'
|
||||
}
|
||||
})
|
8
config/rollup.config.es.js
Normal file
8
config/rollup.config.es.js
Normal file
@ -0,0 +1,8 @@
|
||||
import config from './rollup.config'
|
||||
|
||||
export default config({
|
||||
output: {
|
||||
format: 'es',
|
||||
file: 'lib/turndown-plugin-gfm.es.js'
|
||||
}
|
||||
})
|
8
config/rollup.config.iife.js
Normal file
8
config/rollup.config.iife.js
Normal file
@ -0,0 +1,8 @@
|
||||
import config from './rollup.config'
|
||||
|
||||
export default config({
|
||||
output: {
|
||||
format: 'iife',
|
||||
file: 'dist/turndown-plugin-gfm.js'
|
||||
}
|
||||
})
|
7
config/rollup.config.js
Normal file
7
config/rollup.config.js
Normal file
@ -0,0 +1,7 @@
|
||||
export default function (config) {
|
||||
return {
|
||||
name: 'turndownPluginGfm',
|
||||
input: 'src/gfm.js',
|
||||
output: config.output
|
||||
}
|
||||
}
|
3576
package-lock.json
generated
Normal file
3576
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
39
package.json
Normal file
39
package.json
Normal file
@ -0,0 +1,39 @@
|
||||
{
|
||||
"name": "turndown-plugin-gfm",
|
||||
"description": "Turndown plugin to add GitHub Flavored Markdown extensions.",
|
||||
"version": "0.0.1",
|
||||
"author": "Dom Christie",
|
||||
"devDependencies": {
|
||||
"browserify": "^14.5.0",
|
||||
"rollup": "^0.50.0",
|
||||
"standard": "^10.0.3",
|
||||
"turndown": "0.0.8",
|
||||
"turndown-attendant": "0.0.2"
|
||||
},
|
||||
"files": [
|
||||
"lib",
|
||||
"dist"
|
||||
],
|
||||
"jsnext:main": "lib/turndown-plugin-gfm.es.js",
|
||||
"keywords": [
|
||||
"turndown",
|
||||
"turndown-plugin",
|
||||
"html-to-markdown",
|
||||
"html",
|
||||
"markdown",
|
||||
"github-flavored-markdown",
|
||||
"gfm"
|
||||
],
|
||||
"license": "MIT",
|
||||
"main": "lib/turndown-plugin-gfm.cjs.js",
|
||||
"module": "lib/turndown-plugin-gfm.es.js",
|
||||
"scripts": {
|
||||
"build": "npm run build-cjs && npm run build-es && npm run build-iife",
|
||||
"build-cjs": "rollup -c config/rollup.config.cjs.js && rollup -c config/rollup.config.browser.cjs.js",
|
||||
"build-es": "rollup -c config/rollup.config.es.js && rollup -c config/rollup.config.browser.es.js",
|
||||
"build-iife": "rollup -c config/rollup.config.iife.js",
|
||||
"build-test": "browserify test/turndown-plugin-gfm-test.js --outfile test/turndown-plugin-gfm-test.browser.js",
|
||||
"prepublish": "npm run build",
|
||||
"test": "npm run build && standard ./src/**/*.js && node test/turndown-plugin-gfm-test.js"
|
||||
}
|
||||
}
|
9
src/gfm.js
Normal file
9
src/gfm.js
Normal file
@ -0,0 +1,9 @@
|
||||
import strikethrough from './strikethrough'
|
||||
import tables from './tables'
|
||||
import taskListItems from './task-list-items'
|
||||
|
||||
function gfm (turndownService) {
|
||||
turndownService.use([strikethrough, tables, taskListItems])
|
||||
}
|
||||
|
||||
export { gfm, strikethrough, tables, taskListItems }
|
8
src/strikethrough.js
Normal file
8
src/strikethrough.js
Normal file
@ -0,0 +1,8 @@
|
||||
export default function strikethrough (turndownService) {
|
||||
turndownService.addRule('strikethrough', {
|
||||
filter: ['del', 's', 'strike'],
|
||||
replacement: function (content) {
|
||||
return '~' + content + '~'
|
||||
}
|
||||
})
|
||||
}
|
55
src/tables.js
Normal file
55
src/tables.js
Normal file
@ -0,0 +1,55 @@
|
||||
var rules = {}
|
||||
|
||||
rules.tableCell = {
|
||||
filter: ['th', 'td'],
|
||||
replacement: function (content, node) {
|
||||
return cell(content, node)
|
||||
}
|
||||
}
|
||||
|
||||
rules.tableRow = {
|
||||
filter: 'tr',
|
||||
replacement: function (content, node) {
|
||||
var borderCells = ''
|
||||
var alignMap = { left: ':--', right: '--:', center: ':-:' }
|
||||
|
||||
if (node.parentNode.nodeName === 'THEAD') {
|
||||
for (var i = 0; i < node.childNodes.length; i++) {
|
||||
var align = node.childNodes[i].attributes.align
|
||||
var border = '---'
|
||||
|
||||
if (align) border = alignMap[align.value] || border
|
||||
|
||||
borderCells += cell(border, node.childNodes[i])
|
||||
}
|
||||
}
|
||||
return '\n' + content + (borderCells ? '\n' + borderCells : '')
|
||||
}
|
||||
}
|
||||
|
||||
rules.table = {
|
||||
filter: 'table',
|
||||
replacement: function (content) {
|
||||
// Ensure there are no blank lines
|
||||
content = content.replace('\n\n', '\n')
|
||||
return '\n\n' + content + '\n\n'
|
||||
}
|
||||
}
|
||||
|
||||
rules.tableSection = {
|
||||
filter: ['thead', 'tbody', 'tfoot'],
|
||||
replacement: function (content) {
|
||||
return content
|
||||
}
|
||||
}
|
||||
|
||||
function cell (content, node) {
|
||||
var index = Array.prototype.indexOf.call(node.parentNode.childNodes, node)
|
||||
var prefix = ' '
|
||||
if (index === 0) prefix = '| '
|
||||
return prefix + content + ' |'
|
||||
}
|
||||
|
||||
export default function tables (turndownService) {
|
||||
for (var key in rules) turndownService.addRule(key, rules[key])
|
||||
}
|
10
src/task-list-items.js
Normal file
10
src/task-list-items.js
Normal file
@ -0,0 +1,10 @@
|
||||
export default function taskListItems (turndownService) {
|
||||
turndownService.addRule('taskListItems', {
|
||||
filter: function (node) {
|
||||
return node.type === 'checkbox' && node.parentNode.nodeName === 'LI'
|
||||
},
|
||||
replacement: function (content, node) {
|
||||
return (node.checked ? '[x]' : '[ ]') + ' '
|
||||
}
|
||||
})
|
||||
}
|
178
test/index.html
Normal file
178
test/index.html
Normal file
@ -0,0 +1,178 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>turndown test runner</title>
|
||||
<link rel="stylesheet" href="../node_modules/turndown-attendant/dist/styles.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- TEST CASES -->
|
||||
|
||||
<div class="case" data-name="strike">
|
||||
<div class="input"><strike>Lorem ipsum</strike></div>
|
||||
<pre class="expected">~Lorem ipsum~</pre>
|
||||
</div>
|
||||
|
||||
<div class="case" data-name="s">
|
||||
<div class="input"><s>Lorem ipsum</s></div>
|
||||
<pre class="expected">~Lorem ipsum~</pre>
|
||||
</div>
|
||||
|
||||
<div class="case" data-name="del">
|
||||
<div class="input"><del>Lorem ipsum</del></div>
|
||||
<pre class="expected">~Lorem ipsum~</pre>
|
||||
</div>
|
||||
|
||||
<div class="case" data-name="unchecked inputs">
|
||||
<div class="input"><ul><li><input type=checkbox>Check Me!</li></ul></div>
|
||||
<pre class="expected">* [ ] Check Me!</pre>
|
||||
</div>
|
||||
|
||||
<div class="case" data-name="checked inputs">
|
||||
<div class="input"><ul><li><input type=checkbox checked>Checked!</li></ul></div>
|
||||
<pre class="expected">* [x] Checked!</pre>
|
||||
</div>
|
||||
|
||||
<div class="case" data-name="basic table">
|
||||
<div class="input">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Column 1</th>
|
||||
<th>Column 2</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Row 1, Column 1</td>
|
||||
<td>Row 1, Column 2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Row 2, Column 1</td>
|
||||
<td>Row 2, Column 2</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<pre class="expected">| Column 1 | Column 2 |
|
||||
| --- | --- |
|
||||
| Row 1, Column 1 | Row 1, Column 2 |
|
||||
| Row 2, Column 1 | Row 2, Column 2 |</pre>
|
||||
</div>
|
||||
|
||||
<div class="case" data-name="cell alignment">
|
||||
<div class="input">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th align="left">Column 1</th>
|
||||
<th align="center">Column 2</th>
|
||||
<th align="right">Column 3</th>
|
||||
<th align="foo">Column 4</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Row 1, Column 1</td>
|
||||
<td>Row 1, Column 2</td>
|
||||
<td>Row 1, Column 3</td>
|
||||
<td>Row 1, Column 4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Row 2, Column 1</td>
|
||||
<td>Row 2, Column 2</td>
|
||||
<td>Row 2, Column 3</td>
|
||||
<td>Row 2, Column 4</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<pre class="expected">| Column 1 | Column 2 | Column 3 | Column 4 |
|
||||
| :-- | :-: | --: | --- |
|
||||
| Row 1, Column 1 | Row 1, Column 2 | Row 1, Column 3 | Row 1, Column 4 |
|
||||
| Row 2, Column 1 | Row 2, Column 2 | Row 2, Column 3 | Row 2, Column 4 |</pre>
|
||||
</div>
|
||||
|
||||
<div class="case" data-name="empty cells">
|
||||
<div class="input">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th align="left">Column 1</th>
|
||||
<th align="center">Column 2</th>
|
||||
<th align="right">Column 3</th>
|
||||
<th align="foo">Column 4</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>Row 1, Column 2</td>
|
||||
<td>Row 1, Column 3</td>
|
||||
<td>Row 1, Column 4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Row 2, Column 1</td>
|
||||
<td></td>
|
||||
<td>Row 2, Column 3</td>
|
||||
<td>Row 2, Column 4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Row 3, Column 1</td>
|
||||
<td>Row 3, Column 2</td>
|
||||
<td></td>
|
||||
<td>Row 3, Column 4</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Row 4, Column 1</td>
|
||||
<td>Row 4, Column 2</td>
|
||||
<td>Row 4, Column 3</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td>Row 5, Column 4</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<pre class="expected">| Column 1 | Column 2 | Column 3 | Column 4 |
|
||||
| :-- | :-: | --: | --- |
|
||||
| | Row 1, Column 2 | Row 1, Column 3 | Row 1, Column 4 |
|
||||
| Row 2, Column 1 | | Row 2, Column 3 | Row 2, Column 4 |
|
||||
| Row 3, Column 1 | Row 3, Column 2 | | Row 3, Column 4 |
|
||||
| Row 4, Column 1 | Row 4, Column 2 | Row 4, Column 3 | |
|
||||
| | | | Row 5, Column 4 |</pre>
|
||||
</div>
|
||||
|
||||
<div class="case" data-name="empty rows">
|
||||
<div class="input">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Row 1</td>
|
||||
<td>Row 1</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Row 3</td>
|
||||
<td>Row 3</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<pre class="expected">| Row 1 | Row 1 |
|
||||
| Row 3 | Row 3 |</pre>
|
||||
</div>
|
||||
|
||||
<!-- /TEST CASES -->
|
||||
|
||||
<script src="turndown-plugin-gfm-test.browser.js"></script>
|
||||
</body>
|
||||
</html>
|
176762
test/turndown-plugin-gfm-test.browser.js
Normal file
176762
test/turndown-plugin-gfm-test.browser.js
Normal file
File diff suppressed because one or more lines are too long
13
test/turndown-plugin-gfm-test.js
Normal file
13
test/turndown-plugin-gfm-test.js
Normal file
@ -0,0 +1,13 @@
|
||||
var Attendant = require('turndown-attendant')
|
||||
var TurndownService = require('../../to-markdown/lib/turndown.cjs')
|
||||
var gfm = require('../lib/turndown-plugin-gfm.cjs').gfm
|
||||
|
||||
var attendant = new Attendant({
|
||||
file: __dirname + '/index.html',
|
||||
TurndownService: TurndownService,
|
||||
beforeEach: function (turndownService) {
|
||||
turndownService.use(gfm)
|
||||
}
|
||||
})
|
||||
|
||||
attendant.run()
|
Loading…
x
Reference in New Issue
Block a user