added support for metadata and corresponding title slide

pull/2/head
Michael Ochmann 3 years ago
parent df6de5a32b
commit ed35abf4d2
  1. 57
      src/Parser.js
  2. 13
      src/ui/src/assets/css/_slide.scss

@ -3,9 +3,11 @@
const {lexer} = require("marked"); const {lexer} = require("marked");
class Slide { class Slide {
title;
content; content;
constructor(content = []) { constructor(content = []) {
this.title = false;
this.content = content; this.content = content;
} }
@ -18,17 +20,68 @@ const tokenize = string => {
return lexer(string); return lexer(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}>`
},
]
});
const slide = new Slide(title);
slide.title = true;
deck.unshift(slide);
return deck;
}
const parser = string => { const parser = string => {
const tokenStream = tokenize(string); const tokenStream = tokenize(string);
const slideDeck = []; const slideDeck = [];
let currentSlide = new Slide(); let currentSlide = new Slide();
let metaData = null;
for (const token of tokenStream) { for (const token of tokenStream) {
if ( token.type === "space" || token.type === "heading" && token.depth === 1) { if ( token.type === "space" || (token.type === "heading" && token.depth === 1) || token.type === "html") {
if (currentSlide.content.length > 0) { if (currentSlide.content.length > 0) {
slideDeck.push(currentSlide); slideDeck.push(currentSlide);
currentSlide = new Slide(); 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") if (token.type === "heading")
slideDeck.push(new Slide([token])); slideDeck.push(new Slide([token]));
@ -39,7 +92,7 @@ const parser = string => {
if (currentSlide.content.length > 0) if (currentSlide.content.length > 0)
slideDeck.push(currentSlide); slideDeck.push(currentSlide);
return slideDeck; return injectTitle(slideDeck, metaData);
}; };
module.exports = { module.exports = {

@ -2,6 +2,7 @@
font-family: "Iosevka", sans-serif; font-family: "Iosevka", sans-serif;
font-size: 2rem; font-size: 2rem;
display: flex; display: flex;
flex-direction: column;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
user-select: none; user-select: none;
@ -9,6 +10,18 @@
background: color(background); background: color(background);
color: color(foreground); color: color(foreground);
&.title {
p {
font-style: italic;
font-size: 1.8rem;
color: color(scrollbar);
&:nth-of-type(2) {
font-size: 1.2rem;
}
}
}
h1 { h1 {
font-size: 4rem; font-size: 4rem;
} }

Loading…
Cancel
Save