7 changed files with 9 additions and 178 deletions
@ -1,68 +0,0 @@ |
|||||
const {existsSync, readFileSync} = require('fs'); |
|
||||
const LZString = require('lz-string'); |
|
||||
const {join} = require('path'); |
|
||||
const map = require('unist-util-map'); |
|
||||
|
|
||||
const PROTOCOL = 'babel-repl://'; |
|
||||
|
|
||||
// Matches compression used in Babel REPL
|
|
||||
// https://github.com/babel/website/blob/master/js/repl/UriUtils.js
|
|
||||
const compress = string => |
|
||||
LZString.compressToBase64(string) |
|
||||
.replace(/\+/g, '-') // Convert '+' to '-'
|
|
||||
.replace(/\//g, '_') // Convert '/' to '_'
|
|
||||
.replace(/=+$/, ''); // Remove ending '='
|
|
||||
|
|
||||
module.exports = ({markdownAST}, {directory}) => { |
|
||||
map(markdownAST, (node, index, parent) => { |
|
||||
if (!directory.endsWith('/')) { |
|
||||
directory += '/'; |
|
||||
} |
|
||||
|
|
||||
if (node.type === 'link' && node.url.startsWith(PROTOCOL)) { |
|
||||
let filePath = node.url.replace(PROTOCOL, directory); |
|
||||
if (!filePath.endsWith('.js')) { |
|
||||
filePath += '.js'; |
|
||||
} |
|
||||
filePath = join(__dirname, '../..', filePath); |
|
||||
|
|
||||
// Verify that the specified example file exists.
|
|
||||
if (!existsSync(filePath)) { |
|
||||
console.error( |
|
||||
`Invalid Babel REPL link specified; no such file "${filePath}"`, |
|
||||
); |
|
||||
process.exit(1); |
|
||||
} |
|
||||
|
|
||||
const code = compress(readFileSync(filePath, 'utf8')); |
|
||||
const href = `https://babeljs.io/repl/#?presets=react&code_lz=${code}`; |
|
||||
const text = node.children[0].value; |
|
||||
|
|
||||
const anchorOpenNode = { |
|
||||
type: 'html', |
|
||||
value: `<a href="${href}" target="_blank">`, |
|
||||
}; |
|
||||
|
|
||||
const textNode = { |
|
||||
type: 'text', |
|
||||
value: text, |
|
||||
}; |
|
||||
|
|
||||
const anchorCloseNode = { |
|
||||
type: 'html', |
|
||||
value: '</a>', |
|
||||
}; |
|
||||
|
|
||||
parent.children.splice( |
|
||||
index, |
|
||||
1, |
|
||||
anchorOpenNode, |
|
||||
textNode, |
|
||||
anchorCloseNode, |
|
||||
); |
|
||||
} |
|
||||
|
|
||||
// No change
|
|
||||
return node; |
|
||||
}); |
|
||||
}; |
|
@ -1,4 +0,0 @@ |
|||||
{ |
|
||||
"name": "gatsby-remark-babel-repl-link", |
|
||||
"version": "0.0.1" |
|
||||
} |
|
@ -1,64 +0,0 @@ |
|||||
const {existsSync} = require('fs'); |
|
||||
const {join} = require('path'); |
|
||||
const map = require('unist-util-map'); |
|
||||
|
|
||||
const CODEPEN_PROTOCOL = 'codepen://'; |
|
||||
const DEFAULT_LINK_TEXT = 'Try it on CodePen'; |
|
||||
|
|
||||
module.exports = ({markdownAST}, {directory}) => { |
|
||||
map(markdownAST, (node, index, parent) => { |
|
||||
if (!directory.startsWith('/')) { |
|
||||
directory = `/${directory}`; |
|
||||
} |
|
||||
|
|
||||
if (!directory.endsWith('/')) { |
|
||||
directory = `${directory}/`; |
|
||||
} |
|
||||
|
|
||||
// eg convert
|
|
||||
// from: [](codepen:introducing-jsx)
|
|
||||
// to: <a href="/<directory>/introducing-jsx" target="_blank">Try it on CodePen</a>
|
|
||||
// from: [Try the Hello World example on CodePen](codepen:hello-world)
|
|
||||
// to: <a href="/<directory>/hello-world" target="_blank">Try the Hello World example on CodePen</a>
|
|
||||
if (node.type === 'link' && node.url.startsWith(CODEPEN_PROTOCOL)) { |
|
||||
const href = node.url.replace(CODEPEN_PROTOCOL, directory); |
|
||||
const text = |
|
||||
node.children.length === 0 ? DEFAULT_LINK_TEXT : node.children[0].value; |
|
||||
|
|
||||
// Verify that the specified example file exists.
|
|
||||
const filePath = join(__dirname, `../../${href}.js`); |
|
||||
if (!existsSync(filePath)) { |
|
||||
console.error( |
|
||||
`Invalid Codepen link specified; no such file "${filePath}"`, |
|
||||
); |
|
||||
process.exit(1); |
|
||||
} |
|
||||
|
|
||||
const anchorOpenNode = { |
|
||||
type: 'html', |
|
||||
value: `<a href="${href}" target="_blank">`, |
|
||||
}; |
|
||||
|
|
||||
const textNode = { |
|
||||
type: 'text', |
|
||||
value: text, |
|
||||
}; |
|
||||
|
|
||||
const anchorCloseNode = { |
|
||||
type: 'html', |
|
||||
value: '</a>', |
|
||||
}; |
|
||||
|
|
||||
parent.children.splice( |
|
||||
index, |
|
||||
1, |
|
||||
anchorOpenNode, |
|
||||
textNode, |
|
||||
anchorCloseNode, |
|
||||
); |
|
||||
} |
|
||||
|
|
||||
// No change
|
|
||||
return node; |
|
||||
}); |
|
||||
}; |
|
@ -1,4 +0,0 @@ |
|||||
{ |
|
||||
"name": "gatsby-remark-codepen-examples", |
|
||||
"version": "0.0.1" |
|
||||
} |
|
Loading…
Reference in new issue