From ef8a1b0c0d9dd6068ce3ab5e623e8363bcdcaf9e Mon Sep 17 00:00:00 2001 From: Michael Ochmann Date: Wed, 25 Oct 2023 13:40:02 +0200 Subject: [PATCH] refactored meta data parsing now not requiring a `;` at the end of the lines --- src/Parser.js | 55 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/src/Parser.js b/src/Parser.js index 30f9782..39da8b1 100644 --- a/src/Parser.js +++ b/src/Parser.js @@ -28,13 +28,32 @@ class Slide { } } +class SlideDeck { + metaData; + slides; + + constructor() { + this.metaData = null; + this.slides = []; + } + + push(slide) { + this.slides.push(slide); + } + + unshift(slide) { + this.slides.unshift(slide); + } +} + 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 injectTitle = (deck) => { const title = []; + const meta = deck.metaData; if (meta?.icon) title.push({ @@ -93,11 +112,29 @@ const injectTitle = (deck, meta) => { return deck; } +const parseMetaData = source => { + const meta = {}; + + for (const attribute of source.split('\n')) { + const trimmed = attribute.trim(); + if (trimmed.length < 1 || (trimmed.charAt(0) === '/' && trimmed.charAt(1) === '/')) + continue; + + const [key, value] = trimmed.split(':'); + if (key.trim().length < 1 || value.trim().length < 1) + continue; + meta[key.trim()] = value.trim(); + } + + console.table(meta); + + return meta; +}; + const parser = string => { const tokenStream = tokenize(string); - const slideDeck = []; + const slideDeck = new 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") { @@ -105,14 +142,10 @@ const parser = string => { slideDeck.push(currentSlide); currentSlide = new Slide(); } - if (!metaData && token.type === "html" && token.text.charAt(2) === '-') { + // basically, if this is the forst comment, we expect meta data + if (!slideDeck.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; + slideDeck.metaData = parseMetaData(metaString); } if (token.type === "heading") @@ -124,7 +157,7 @@ const parser = string => { if (currentSlide.content.length > 0) slideDeck.push(currentSlide); - return injectTitle(slideDeck, metaData); + return injectTitle(slideDeck); }; module.exports = {