-
Notifications
You must be signed in to change notification settings - Fork 0
/
markdownBuilder.js
85 lines (82 loc) · 2.15 KB
/
markdownBuilder.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
const toMarkdown = require('@sanity/block-content-to-markdown')
const sanityClient = require('@sanity/client')
const imageUrlBuilder = require('@sanity/image-url')
const del = require('del')
const fs = require('fs')
const urlFor = source => imageUrlBuilder(sanityClient).image(source)
const { projectId, dataset, deckId } = require('./sanityConfig.json')
const { log } = console
if (!projectId || !dataset) {
console.log(`
# Missing Sanity configuration
projectID: ${projectId || 'No project id'}\n
dataset: ${dataset || 'No dataset name'}
`)
process.exit(0)
}
const client = sanityClient({
projectId,
dataset,
useCdn: false
})
const generateCodeSurfer = ({
title = ' ',
notes = '-',
_key,
numbers
}) => `
<CodeSurfer
title="${title}"
notes="${notes}"
code={require("!raw-loader!./tmp/${_key}.mdx-code")}
${numbers ? 'showNumbers' : 'showNumbers={false}'}
dark={false}
/>
`
const serializers = {
types: {
slide: () => 'Slide',
codesnippet: ({ node = {} }) => {
const { _key, code = {} } = node
fs.writeFileSync(`./tmp/${_key}.mdx-code`, code.code)
return generateCodeSurfer(node)
}
}
}
function getData () {
return client
.fetch('*[_id == $deckId][0]', { deckId })
.catch(error => log(`# ${error}`))
}
async function parseToMarkdown (data) {
const { title, slides, theme = 'default' } = data
log(`
import { Head, Notes } from 'mdx-deck'
import { CodeSurfer } from 'mdx-deck-code-surfer'
import { Invert, Split, FullScreenCode } from 'mdx-deck/layouts'
export { ${theme} as theme } from './theme'
\n
<Head>
<title>${title}</title>
</Head>
`)
slides.forEach((slide, i) => {
if (i > 0) log('\n---\n')
if (slide.invert) log('export default Invert\n')
if (slide.split) log('export default Split\n')
log(toMarkdown(slide.content, { serializers, projectId, dataset }))
if (slide.note) {
log('\n<Notes>')
log(toMarkdown(slide.note, { serializers, projectId, dataset }))
log('</Notes>\n')
}
})
}
function cleanup () {
del(['tmp/*.mdx-code', 'dist/*', '!dist/.gitkeep'])
}
;(async () => {
await cleanup()
const data = await getData()
await parseToMarkdown(data)
})()