|
| 1 | +import fs from 'fs'; |
| 2 | +import path from 'path'; |
| 3 | +import { extract_frontmatter, link_renderer } from '@sveltejs/site-kit/utils/markdown.js'; |
| 4 | +import marked from 'marked'; |
| 5 | +import { makeSlugProcessor } from '../../utils/slug'; |
| 6 | +import { highlight } from '../../utils/highlight'; |
| 7 | +import { SLUG_PRESERVE_UNICODE } from '../../../config'; |
| 8 | + |
| 9 | +const makeSlug = makeSlugProcessor(SLUG_PRESERVE_UNICODE); |
| 10 | + |
| 11 | +export default function get_faqs() { |
| 12 | + return fs |
| 13 | + .readdirSync('content/faq') |
| 14 | + .map(file => { |
| 15 | + if (path.extname(file) !== '.md') return; |
| 16 | + |
| 17 | + const match = /^([0-9]+)-(.+)\.md$/.exec(file); |
| 18 | + if (!match) throw new Error(`Invalid filename '${file}'`); |
| 19 | + |
| 20 | + const [, order, slug] = match; |
| 21 | + |
| 22 | + const markdown = fs.readFileSync(`content/faq/${file}`, 'utf-8'); |
| 23 | + |
| 24 | + const { content, metadata } = extract_frontmatter(markdown); |
| 25 | + |
| 26 | + const renderer = new marked.Renderer(); |
| 27 | + |
| 28 | + renderer.link = link_renderer; |
| 29 | + |
| 30 | + renderer.code = highlight; |
| 31 | + |
| 32 | + renderer.heading = (text, level, rawtext) => { |
| 33 | + const fragment = makeSlug(rawtext); |
| 34 | + |
| 35 | + return ` |
| 36 | + <h${level}> |
| 37 | + <span id="${fragment}" class="offset-anchor"></span> |
| 38 | + <a href="faq#${fragment}" class="anchor" aria-hidden="true"></a> |
| 39 | + ${text} |
| 40 | + </h${level}>`; |
| 41 | + }; |
| 42 | + |
| 43 | + const answer = marked( |
| 44 | + content.replace(/^\t+/gm, match => match.split('\t').join(' ')), |
| 45 | + { renderer } |
| 46 | + ); |
| 47 | + |
| 48 | + const fragment = makeSlug(slug); |
| 49 | + |
| 50 | + return { |
| 51 | + fragment, |
| 52 | + order, |
| 53 | + answer, |
| 54 | + metadata |
| 55 | + }; |
| 56 | + }) |
| 57 | + .sort((a, b) => a.order - b.order); |
| 58 | +} |
0 commit comments