toosolo
Version:
基于Node.js的静态博客程序
204 lines (136 loc) • 4.42 kB
JavaScript
var path = require('path'),
fs = require('fs'),
moment = require('moment'),
util = require('./util.js');
function parseBlogs(){
var blogFileListPath = global.tooSolo.config.blogPath,
blogFileList = util.readdirSyncRecursive(blogFileListPath);
blogFileList.forEach(function(blogFileName){
if(!/\.md$/.test(blogFileName)) return;
console.log(' ' + blogFileName);
var blogFileContent = fs.readFileSync(blogFileListPath + '/' + blogFileName,'utf-8'),
blogFileParseResult = _parseBlogContent(blogFileName,blogFileContent);
// 处理博客列表
global.tooSolo.blog.blogs.push(blogFileParseResult);
// 处理tags
_parseTags(blogFileParseResult);
// 处理archives
_parseArchives(blogFileParseResult);
// 处理分类
_parseCategory(blogFileParseResult);
});
// console.log(global.tooSolo.blog);
}
function parsePages(){
var pageFileListPath = global.tooSolo.config.sourcePath + '/pages',
pageFileList = util.readdirSyncRecursive(pageFileListPath);
pageFileList.forEach(function(pageFileName){
if(!/\.md$/.test(pageFileName)) return;
console.log(' ' + pageFileName);
var pageFileContent = fs.readFileSync(pageFileListPath + '/' + pageFileName,'utf-8'),
pageFileParseResult = _parseBlogContent(pageFileName,pageFileContent);
// 处理pages列表
global.tooSolo.blog.pages.push(pageFileParseResult);
});
// console.log(global.tooSolo.blog);
}
// 解析博客文件正文
function _parseBlogContent(fileName,fileContent){
var patterns = {
title:/(?:Title ?: ?|\# ?)(.*)\n/i,
date:/(?:Date ?: ?|_)(\d{4}-\d{1,2}-\d{1,2}.*?)_?\n/i,
status:/Status ?: ?(.*)\n/i,
tags:/Tags ?: ?(.*)\n/i,
category:/Category ?: ?(.*)\n/i,
url:/Url ?: ?(.*)\n/i,
tmpl:/Tmpl ?: ?(.*)\n/i
},
defaultValue = {
title:'',
date:new Date(),
status:'Public',
tags:'',
category:'',
url:fileName.replace(/\.md$/,'').replace(/.*\//,''),
tmpl:'article'
},
blog = {};
fileContent = fileContent.replace(/\r\n/g,'\n');
var fileHeader = fileContent.split('\n\n')[0] + '\n\n';
for(var item in patterns){
if(patterns.hasOwnProperty(item)){
var matchResult = fileHeader.match(patterns[item]);
blog[item] = matchResult && matchResult.length >=2 && matchResult[1] || defaultValue[item];
}
fileContent = fileContent.replace(fileHeader,'');
}
blog.date = moment(blog.date).toDate();
blog.content = fileContent.replace(/\n\n(?:<!--)? *\$\$solo_more\$\$ *(?:-->){0,1}/,'');
blog.summary = fileContent.split(/\n\n(?:<!--)? *\$\$solo_more\$\$ *(?:-->){0,1}/)[0];
blog.id = util.getRandomId();
var tagsArr = [],
tempBound,
tempTag='';
blog.tags.split(' ').forEach(function(tag){
if(/^['"]/.test(tag)){ //如果以引号开头
if(/['"]$/.test(tag)){ //如果以引号结尾,则直接push
tagsArr.push(tag.replace(/^['"]/,'').replace(/['"]$/,''));
}else{ //不以引号结尾,暂存
tempTag += tag.replace(/^['"]/,'');
}
}else{
if(/['"]$/.test(tag)){ //如果以引号结尾,则直接push
tagsArr.push(tempTag + ' ' + tag.replace(/^['"]/,'').replace(/['"]$/,''));
tempTag = '';
}else{
tempTag += ' ' + tag;
}
}
});
blog.tags = tagsArr;
return blog;
}
// 处理tags
function _parseTags(blog){
blog.tags.forEach(function(tag){
if(!global.tooSolo.blog.tags[tag]){
global.tooSolo.blog.tags[tag] = [];
}
global.tooSolo.blog.tags[tag].push(blog.id);
});
}
// 处理archives
function _parseArchives(blog){
var archiveMonth = moment(blog.date).format('YYYY-MM');
if(!global.tooSolo.blog.archives[archiveMonth]){
global.tooSolo.blog.archives[archiveMonth] = [];
}
global.tooSolo.blog.archives[archiveMonth].push({id:blog.id});
}
// 处理分类
function _parseCategory(blog){
var category = blog.category;
if(!category)return;
if(!global.tooSolo.blog.categories[category]){
global.tooSolo.blog.categories[category] = {
blogList:[]
};
}
global.tooSolo.blog.categories[category].blogList.push({id:blog.id});
}
exports.parse = function(callback){
global.tooSolo.blog = {
blogs:[],
pages:[],
tags:{},
archives:{},
categories:{}
};
console.log('\n 解析博客……');
parseBlogs();
if(!global.tooSolo.config.disabledParsePlugins || global.tooSolo.config.disabledParsePlugins.indexOf('parsePages')===-1){
console.log('\n 解析Pages……');
parsePages();
callback();
}
};