lintry

使用action处理markdown文件显示

调整md文档目录定义
......@@ -9,7 +9,7 @@ if (!target) {
process.exit(1);
}
const mdview = new (require('../lib/mdview')),
const mdview = new (require('../lib/mdviewer')),
path = require('path');
const filename = path.resolve(process.cwd(), target);
......
module.exports = require('./lib/mdview');
module.exports = require('./lib/mdviewer');
......
......@@ -10,11 +10,11 @@ const configure = customize({
"bind_port": 8200,
},
"md": {
"base_path": "md",
"base_path": {},
"default_md": "readme.md",
"theme": "metro-lake",
"toc": true
}
},
});
//绑定到全局变量
......
/**
* 处理接口api的action路由
*/
/* global global */
/* global process */
"use strict";
const _ = require('lodash'),
path = require('path'),
express = require('express'),
router = express.Router(),
config = global.config
;
/**
* markdown文件查看
* @param alias_name 路由别名
* @param md_path markdown文档路径
* @return {*}
* @constructor
*/
function MdAction (alias_name, md_path) {
let alias;
switch (!!alias_name) {
case false: // 没有定义别名,默认为根
alias = '';
break;
case /\/.+/.test(alias_name): // 带根路径别名,直接用
alias = alias_name;
break;
case /[^\/].+/.test(alias_name): // 不带根路径别名,补充根路径
alias = '/' + alias_name;
break;
default: // 只传入根路径,和别名空一样处理
alias = ''
}
let doc_path = path.resolve(process.cwd(), md_path || '');
const MD_REGEXP = new RegExp(`^${alias}\\/([\\/\\w]*)`);
//根据别名处理文档目录所在的markdown文件
const viewer = new (require('./view-markdown'))(doc_path, config.md);
router.get(/(.*)/, function request (req, res, next) {
let url = req.url, urls = url.match(MD_REGEXP) || [], query = req.query;
if (!urls.length) {
return next();
}
let ext = path.parse(url).ext;
if (ext && ext !== '.md') {
return next();
}
res.send(viewer.render(urls[1], query.t));
});
//加载文档目录为静态页,别名为空时指向根路径
router.use(alias || '/', express.static(doc_path));
return router;
}
module.exports = MdAction;
......@@ -33,12 +33,10 @@ function MarkdownIt (opts) {
try {
content = fs.readFileSync(filename).toString();
result.html = md.render(content);
result.status = 200;
} catch (e) {
console.error('convert md to html error', e);
result.html = md.render(`
# 404
*文件找不到!*
`)
// console.error('convert md to html error', e);
result.status = 404;
}
try {
......@@ -46,10 +44,30 @@ function MarkdownIt (opts) {
result.tokens = md.parse(content, {});
}
} catch (e) {
console.error('parse md error', e)
// console.warn('parse md error', e)
}
return result;
};
/**
* 返回渲染文本
* @param src
* @param env
* @return {*}
*/
this.render = function (src, env) {
return md.render(src, env)
};
/**
* 返回解析文本
* @param src
* @param env
* @return {*}
*/
this.parse = function (src, env) {
return md.parse(src, env)
}
}
......
......@@ -5,29 +5,43 @@
const path = require('path');
class ViewMarkdown {
constructor (options) {
constructor (doc_path, options) {
this.options = options || {};
if (!this.options.base_path) {
throw new Error('no base path for markdown')
if (!doc_path) {
throw new Error('document path for markdown not found')
}
this.doc_path = doc_path;
this.mdviewer = new (require('./mdviewer'))({parseTokens: true, toc: this.options.toc});
}
/**
* 渲染文件
* @param filename 文件名,绝对路径
* @param theme 主题
* @return {string}
*/
render (filename, theme) {
const options = this.options;
//默认md
if (!filename || filename.match(/.+\/$/)) {
filename = (filename || '') + options.default_md || 'readme.md'
filename = (filename || '') + (options.default_md || 'readme.md')
}
let file = path.resolve(options.base_path, filename);
let file = path.resolve(this.doc_path, filename);
if (!path.parse(file).ext) {
//追加后缀
file += '.md'
}
const mdview = new (require('./mdview'))({parseTokens: true, toc: options.toc});
let result = mdview.renderFile(file);
let result = this.mdviewer.renderFile(file);
let tittle = result.tokens && result.tokens[1] && result.tokens[1].content || filename;
theme = theme || options.theme;
let content = result.status === 404 ? this.mdviewer.render(`
# 404
> **${filename}不存在**
`)
: result.html;
return `
<!DOCTYPE html>
<html>
......@@ -40,7 +54,7 @@ class ViewMarkdown {
</head>
<body>
<div class='markdown ${theme}'>
${result.html}
${content}
</div>
</body
</html>
......@@ -48,4 +62,4 @@ class ViewMarkdown {
}
}
module.exports = ViewMarkdown
\ No newline at end of file
module.exports = ViewMarkdown;
\ No newline at end of file
......
......@@ -3,24 +3,19 @@ const app = express();
const config = require('./init/config');
const path = require('path');
//markdown主题
app.use(express.static(__dirname + '/themes'));
const MARKDOWN_FILE_BASE = path.resolve(process.cwd(), config.md.base_path);
app.use(express.static(__dirname + '/themes'));
app.use(express.static(MARKDOWN_FILE_BASE));
const MdAction = require('./lib/md-action');
function viewMarkdown (req, res, next) {
let url = req.url, urls = url.match(/^\/([\/\w]+)/) || [], query = req.query;
let ext = path.parse(url).ext;
if (ext && ext !== 'md') {
return next();
}
const viewer = new (require('./lib/view-markdown'))(config.md);
res.send(viewer.render(urls[1], query.t));
}
let base_path = config.md.base_path || {};
Object.keys(base_path).forEach(p => {
app.use('/', new MdAction(p, base_path[p]))
});
app.get('/*', viewMarkdown);
//默认
app.use('/', new MdAction('/', 'md'));
const PORT = config.system.bind_port;
app.listen(PORT);
......
......@@ -60,28 +60,15 @@
}
.metro-lake h2 {
width: max-content;
margin: 0.8rem auto;
font-size: 1.4rem;
border-bottom: 1px solid #bbb;
line-height: 1.6rem;
padding-bottom: 0.8rem;
/*line-height: 1.6rem;*/
padding-bottom: 0.5rem;
text-align: center;
}
.metro-lake h2:before {
content: '══';
font-weight: 100;
letter-spacing: -1px;
padding-right: 1rem;
color: #888
}
.metro-lake h2:after {
content: '══';
font-weight: 100;
letter-spacing: -1px;
padding-left: 1rem;
color: #888
}
.metro-lake blockquote h2:before {
content: '';
padding-right: 0;
......