1
1
mirror of https://github.com/primer/css.git synced 2024-12-01 04:21:12 +03:00
css/.storybook/story-loader.js
2019-03-07 14:41:36 -08:00

49 lines
1.7 KiB
JavaScript

/* eslint-disable no-console */
const {basename, dirname, join} = require('path')
const parseFromString = require('code-blocks/lib/fromString')
module.exports = function storyLoader(markdown) {
// resourcePath is the full path ("/Users/probot/primer/css/...") to the file being parsed
// rootContext is really just dirname(resourcePath)
const {resourcePath = '', rootContext} = this
// the sourcePath option provides a way to collapse the
// navigation hierarchy by trimming even more of the
// resourcePath's prefix; if it's not provided, use the
// rootContext
const {sourcePath = rootContext} = this.query || {}
// strip the sourcePath from the beginning of the resourcePath
const file = resourcePath.replace(`${sourcePath}/`, '')
const path = join(dirname(file), basename(file, '.md'))
const stories = storiesFromMarkdown(markdown, file)
if (stories.length) {
console.warn(`${stories.length} stories found in ${file}!`)
return `
const {storiesOf} = require('@storybook/react')
const htmlToReact = require('html-to-react')
const chapter = storiesOf(${JSON.stringify(path)}, module)
const stories = ${JSON.stringify(stories)}
const htmlParser = new htmlToReact.Parser()
for (const {title, value} of stories) {
chapter.add(title, () => htmlParser.parse(value))
}
`
} else {
return `module.exports = {markdown: ${JSON.stringify(markdown)}}`
}
}
function storiesFromMarkdown(markdown, file) {
const path = file.replace(/^\.\//, '')
return parseFromString(markdown, path).filter(block => {
// yes: ```html
// no: ```html dead
// no: ```html inert
return block.lang === 'html' && !block.info.dead && !block.info.inert
})
}