"use strict"; const {Lexer, marked} = require("marked"); const util = require("util"); const tokenizer = { list : (source) => { console.log(source); return false; } }; marked.use({tokenizer}); class Slide { title; content; constructor(content = []) { this.title = false; this.content = content; } append(object) { this.content.push(object); } } const tokenize = string => { //console.log(util.inspect(marked.Lexer.rules.block.listItemStart, true, null, true)); return new Lexer({gfm : true}).lex(string); }; const injectTitle = (deck, meta) => { const title = []; if (meta?.title) title.push({ type : "heading", level : 1, tokens : [ { type : "text", text : meta.title } ] }); if (meta?.author) title.push({ type : "paragraph", tokens : [ { type : "text", text : `– ${meta.author} –` }, ] }); if (meta?.email) title.push({ type : "paragraph", tokens : [ { type : "text", text : `<${meta.email}>` }, ] }); if (title.length > 0) { const slide = new Slide(title); slide.title = true; deck.unshift(slide); } return deck; } const parser = string => { const tokenStream = tokenize(string); const slideDeck = []; let currentSlide = new Slide(); let metaData = null; for (const token of tokenStream) { if (token.type === "space" || (token.type === "heading" && token.depth === 1) || token.type === "html") { if (currentSlide.content.length > 0) { slideDeck.push(currentSlide); currentSlide = new Slide(); } if (!metaData && token.type === "html" && token.text.charAt(2) === '-') { const metaString = token.text.replace(/()/gi, ""); const meta = {}; for (const attribute of metaString.split(';')) { const [key, value] = attribute.split(':'); meta[key.trim()] = value.trim(); } metaData = meta; } if (token.type === "heading") slideDeck.push(new Slide([token])); continue; } currentSlide.append(token); } if (currentSlide.content.length > 0) slideDeck.push(currentSlide); return injectTitle(slideDeck, metaData); }; module.exports = { parser }