parse-slide-frontmatter.ts 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import remarkFrontmatter from 'remark-frontmatter';
  2. import remarkParse from 'remark-parse';
  3. import remarkStringify from 'remark-stringify';
  4. import { unified } from 'unified';
  5. export const parseSlideFrontmatter = (frontmatter: string): [boolean, boolean] => {
  6. let marp = false;
  7. let slide = false;
  8. const lines = frontmatter.split('\n');
  9. lines.forEach((line) => {
  10. const [key, value] = line.split(':').map(part => part.trim());
  11. if (key === 'marp' && value === 'true') {
  12. marp = true;
  13. }
  14. if (key === 'slide' && value === 'true') {
  15. slide = true;
  16. }
  17. });
  18. return [marp, slide];
  19. };
  20. export const parseSlideFrontmatterInMarkdown = (markdown?: string): [boolean, boolean] => {
  21. let marp = false;
  22. let slide = false;
  23. unified()
  24. .use(remarkParse)
  25. .use(remarkStringify)
  26. .use(remarkFrontmatter, ['yaml'])
  27. .use(() => ((obj) => {
  28. if (obj.children[0]?.type === 'yaml') {
  29. [marp, slide] = parseSlideFrontmatter(obj.children[0]?.value as string);
  30. }
  31. }))
  32. .process(markdown as string);
  33. return [marp, slide];
  34. };