Browse Source

Markdown metadata parser

pull/1/head
NGPixel 8 years ago
parent
commit
d49f56e022
3 changed files with 27 additions and 19 deletions
  1. 5
      controllers/pages.js
  2. 35
      models/markdown.js
  3. 6
      views/pages/view.pug

5
controllers/pages.js

@ -13,9 +13,8 @@ router.get('/', (req, res) => {
fs.readFileAsync("repo/Storage/Redis.md", "utf8").then(function(contents) { fs.readFileAsync("repo/Storage/Redis.md", "utf8").then(function(contents) {
let pageData = mark.parse(contents); let pageData = mark.parse(contents);
if(!pageData.title) {
pageData.title = 'Redis';
pageData.subtitle = 'An open source, in-memory data structure store, used as database, cache and message broker.';
if(!pageData.meta.title) {
pageData.meta.title = 'Redis.md';
} }
res.render('pages/view', { pageData }); res.render('pages/view', { pageData });
}); });

35
models/markdown.js

@ -52,13 +52,9 @@ var mkdown = md({
// Rendering rules // Rendering rules
mkdown.renderer.rules.emoji = function(token, idx) { mkdown.renderer.rules.emoji = function(token, idx) {
return '<i class="twa twa-' + token[idx].markup + '"></i>';
return '<i class="twa twa-' + token[idx].markup + '"></i>';
}; };
mkdown.inline.ruler.push('internal_link', (state) => {
});
/** /**
* Parse markdown content and build TOC tree * Parse markdown content and build TOC tree
* *
@ -74,28 +70,28 @@ const parseTree = (content) => {
for (let i = 0; i < tokens.length; i++) { for (let i = 0; i < tokens.length; i++) {
if (tokens[i].type !== "heading_close") { if (tokens[i].type !== "heading_close") {
continue;
continue;
} }
const heading = tokens[i - 1]; const heading = tokens[i - 1];
const heading_close = tokens[i]; const heading_close = tokens[i];
if (heading.type === "inline") { if (heading.type === "inline") {
let content = "";
let anchor = "";
if (heading.children && heading.children[0].type === "link_open") {
let content = "";
let anchor = "";
if (heading.children && heading.children[0].type === "link_open") {
content = heading.children[1].content; content = heading.children[1].content;
anchor = slug(content, {lower: true}); anchor = slug(content, {lower: true});
} else {
} else {
content = heading.content content = heading.content
anchor = slug(heading.children.reduce((acc, t) => acc + t.content, ""), {lower: true}); anchor = slug(heading.children.reduce((acc, t) => acc + t.content, ""), {lower: true});
}
}
tocArray.push({
tocArray.push({
content, content,
anchor, anchor,
level: +heading_close.tag.substr(1, 1) level: +heading_close.tag.substr(1, 1)
});
});
} }
} }
@ -159,10 +155,23 @@ const parseContent = (content) => {
}; };
const parseMeta = (content) => {
let commentMeta = new RegExp('<!-- ?([a-zA-Z]+):(.*)-->','g');
let results = {}, match;
while(match = commentMeta.exec(content)) {
results[_.toLower(match[1])] = _.trim(match[2]);
}
return results;
};
module.exports = { module.exports = {
parse(content) { parse(content) {
return { return {
meta: parseMeta(content),
html: parseContent(content), html: parseContent(content),
tree: parseTree(content) tree: parseTree(content)
}; };

6
views/pages/view.pug

@ -37,9 +37,9 @@ block content
.column .column
h1.title#title= pageData.title
if pageData.subtitle
h2.subtitle= pageData.subtitle
h1.title#title= pageData.meta.title
if pageData.meta.subtitle
h2.subtitle= pageData.meta.subtitle
.content.mkcontent .content.mkcontent
!= pageData.html != pageData.html

Loading…
Cancel
Save