瀏覽代碼

Markdown metadata parser

NGPixel 8 年之前
父節點
當前提交
d49f56e022
共有 3 個文件被更改,包括 27 次插入19 次删除
  1. 2 3
      controllers/pages.js
  2. 22 13
      models/markdown.js
  3. 3 3
      views/pages/view.pug

+ 2 - 3
controllers/pages.js

@@ -13,9 +13,8 @@ router.get('/', (req, res) => {
 
 	fs.readFileAsync("repo/Storage/Redis.md", "utf8").then(function(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 });
  	});

+ 22 - 13
models/markdown.js

@@ -52,13 +52,9 @@ var mkdown = md({
 // Rendering rules
 
 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
  *
@@ -74,28 +70,28 @@ const parseTree = (content) => {
 
 	for (let i = 0; i < tokens.length; i++) {
 		if (tokens[i].type !== "heading_close") {
-		  continue;
+			continue;
 		}
 
 		const heading = tokens[i - 1];
 		const heading_close = tokens[i];
 
 		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;
 			 anchor = slug(content, {lower: true});
-		  } else {
+			} else {
 			 content = heading.content
 			 anchor = slug(heading.children.reduce((acc, t) => acc + t.content, ""), {lower: true});
-		  }
+			}
 
-		  tocArray.push({
+			tocArray.push({
 			 content,
 			 anchor,
 			 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 = {
 
 	parse(content) {
 		return {
+			meta: parseMeta(content),
 			html: parseContent(content),
 			tree: parseTree(content)
 		};

+ 3 - 3
views/pages/view.pug

@@ -37,9 +37,9 @@ block content
 
 				.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
 						!= pageData.html