Toggle navigation
Toggle navigation
This project
Loading...
Sign in
Shenlin
/
markdown-view
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Snippets
Network
Create a new issue
Builds
Commits
Issue Boards
Authored by
lintry
2018-01-10 16:58:41 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
efc6340c5d9d76bb3d634db5154b815cd9cd12f5
efc6340c
1 parent
9d870f91
使用action处理markdown文件显示
调整md文档目录定义
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
128 additions
and
50 deletions
bin/mdview
index.js
init/config.js
lib/md-action.js
lib/mdview.js → lib/mdviewer.js
lib/view-markdown.js
server.js
themes/metro-lake/metro-lake.css
bin/mdview
View file @
efc6340
...
...
@@ -9,7 +9,7 @@ if (!target) {
process
.
exit
(
1
);
}
const
mdview
=
new
(
require
(
'../lib/mdview'
)),
const
mdview
=
new
(
require
(
'../lib/mdview
er
'
)),
path
=
require
(
'path'
);
const
filename
=
path
.
resolve
(
process
.
cwd
(),
target
);
...
...
index.js
View file @
efc6340
module
.
exports
=
require
(
'./lib/mdview'
);
module
.
exports
=
require
(
'./lib/mdview
er
'
);
...
...
init/config.js
View file @
efc6340
...
...
@@ -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
}
}
,
});
//绑定到全局变量
...
...
lib/md-action.js
0 → 100644
View file @
efc6340
/**
* 处理接口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
;
lib/mdview.js
→
lib/mdview
er
.js
View file @
efc6340
...
...
@@ -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
)
}
}
...
...
lib/view-markdown.js
View file @
efc6340
...
...
@@ -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
...
...
server.js
View file @
efc6340
...
...
@@ -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
);
...
...
themes/metro-lake/metro-lake.css
View file @
efc6340
...
...
@@ -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.
8
rem
;
/*line-height: 1.6rem;*/
padding-bottom
:
0.
5
rem
;
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
;
...
...
Please
register
or
login
to post a comment