├── demo
├── level1-1.md
├── level2B
│ ├── README.md
│ └── levelB
│ │ └── readme.md
├── level1-hello.md
├── level2A
│ ├── abc.md
│ ├── efg.md
│ ├── README.md
│ └── assets
│ │ └── img.png
├── assets
│ ├── ranshu.png
│ └── baidu_tongji.js
├── level1-0.md
├── README.md
└── template
│ └── App.vue
├── src
├── menu
│ ├── __tests__
│ │ ├── test.md
│ │ └── index.spec.js
│ └── index.js
├── markdown
│ ├── provider
│ │ ├── __test_files__
│ │ │ ├── test.md
│ │ │ ├── abc
│ │ │ │ ├── 123
│ │ │ │ │ ├── test.md
│ │ │ │ │ └── README.md
│ │ │ │ ├── 456
│ │ │ │ │ └── README.md
│ │ │ │ └── README.md
│ │ │ ├── xyz
│ │ │ │ └── ad.md
│ │ │ ├── index.js
│ │ │ └── README.md
│ │ ├── index.js
│ │ ├── FileNode.js
│ │ ├── TreeNode.js
│ │ ├── Provider.js
│ │ └── __test__
│ │ │ └── index.spec.js
│ ├── title
│ │ ├── index.js
│ │ └── __test__
│ │ │ └── index.spec.js
│ ├── autoNumber
│ │ ├── __tests__
│ │ │ ├── convertBefore.md
│ │ │ ├── convertAfter.md
│ │ │ └── index.spec.js
│ │ └── index.js
│ ├── index.js
│ ├── prefix
│ │ ├── index.js
│ │ └── __test__
│ │ │ └── index.spec.js
│ ├── marked
│ │ ├── index.js
│ │ └── __tests__
│ │ │ └── index.spec.js
│ ├── themes
│ │ ├── index.js
│ │ └── __test__
│ │ │ └── index.spec.js
│ └── breadcrumb
│ │ ├── index.js
│ │ └── __test__
│ │ └── index.spec.js
├── assets
│ ├── logo.png
│ ├── responsive.css
│ ├── themes
│ │ ├── mark
│ │ │ └── style.css
│ │ └── techo
│ │ │ └── style.css
│ └── adminlte.min.js
├── template
│ ├── seed
│ │ ├── dist
│ │ │ ├── img
│ │ │ │ └── AdminLTELogo.png
│ │ │ └── js
│ │ │ │ ├── .eslintrc.json
│ │ │ │ ├── pages
│ │ │ │ ├── dashboard3.js
│ │ │ │ ├── dashboard2.js
│ │ │ │ └── dashboard.js
│ │ │ │ ├── demo.js
│ │ │ │ └── adminlte.min.js
│ │ └── index.html
│ └── App.vue
├── ssr
│ ├── App.vue
│ ├── HelloWorld.vue
│ ├── __tests__
│ │ └── index.spec.js
│ ├── index.html
│ ├── server.js
│ ├── index.js
│ └── list.js
├── components
│ └── HelloWorld.vue
├── util
│ ├── progress.js
│ └── available-port.js
├── devserver
│ └── index.js
├── index.js
└── index.html
├── .vscode
└── settings.json
├── index.js
├── .gitignore
├── publish.sh
├── package.json
├── bin
├── index.js
└── build.js
├── README.md
└── README.en-US.md
/demo/level1-1.md:
--------------------------------------------------------------------------------
1 | # 一级目录 1
--------------------------------------------------------------------------------
/src/menu/__tests__/test.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/demo/level2B/README.md:
--------------------------------------------------------------------------------
1 | # 二级目录 B
--------------------------------------------------------------------------------
/src/markdown/provider/__test_files__/test.md:
--------------------------------------------------------------------------------
1 | # Test
--------------------------------------------------------------------------------
/demo/level1-hello.md:
--------------------------------------------------------------------------------
1 | # 一级目录 Hello
2 |
3 | 本文件 根据排序规则排在二级目录 A上面
--------------------------------------------------------------------------------
/demo/level2A/abc.md:
--------------------------------------------------------------------------------
1 | # 三级目录1
2 | write your content detail here
--------------------------------------------------------------------------------
/demo/level2A/efg.md:
--------------------------------------------------------------------------------
1 | # 三级目录2
2 | write your content detail here
--------------------------------------------------------------------------------
/demo/level2B/levelB/readme.md:
--------------------------------------------------------------------------------
1 | # Cat Level3 title
2 |
3 | 三级目录文件内容
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "liveServer.settings.port": 5501
3 | }
--------------------------------------------------------------------------------
/src/markdown/provider/__test_files__/abc/456/README.md:
--------------------------------------------------------------------------------
1 | # ABC_456_README
--------------------------------------------------------------------------------
/demo/level2A/README.md:
--------------------------------------------------------------------------------
1 | # 二级目录
2 |
3 | 
--------------------------------------------------------------------------------
/src/markdown/provider/__test_files__/abc/123/test.md:
--------------------------------------------------------------------------------
1 | 不存在一级标题
2 |
3 | su37josephxia 是一个高手
--------------------------------------------------------------------------------
/src/markdown/provider/__test_files__/abc/README.md:
--------------------------------------------------------------------------------
1 | # ABC_README
2 |
3 | smarty-press 这个项目不错
--------------------------------------------------------------------------------
/src/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smarty-team/smarty-press/HEAD/src/assets/logo.png
--------------------------------------------------------------------------------
/demo/assets/ranshu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smarty-team/smarty-press/HEAD/demo/assets/ranshu.png
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | const {startDev} = require('./src/index')
2 |
3 | startDev({
4 | root : __dirname + '/demo'
5 | })
--------------------------------------------------------------------------------
/demo/level2A/assets/img.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smarty-team/smarty-press/HEAD/demo/level2A/assets/img.png
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | **/node_modules/
2 | package-lock.json
3 | .DS_Store
4 | .spress
5 | .vercel
6 | dist
7 | .idea
8 | /test
9 |
--------------------------------------------------------------------------------
/src/template/seed/dist/img/AdminLTELogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/smarty-team/smarty-press/HEAD/src/template/seed/dist/img/AdminLTELogo.png
--------------------------------------------------------------------------------
/src/markdown/provider/__test_files__/abc/123/README.md:
--------------------------------------------------------------------------------
1 | # ABC_123_README
2 |
3 | [compose-awesome竟然有这么多实现方式](https://github.com/su37josephxia/compose-awesome)
--------------------------------------------------------------------------------
/src/menu/__tests__/index.spec.js:
--------------------------------------------------------------------------------
1 | test ('menu getMdList',() => {
2 | const {getFolder} = require('../index')
3 | expect(getFolder(__dirname)).toContain(
4 | 'test.md'
5 | )
6 | })
--------------------------------------------------------------------------------
/src/ssr/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
--------------------------------------------------------------------------------
/src/markdown/title/index.js:
--------------------------------------------------------------------------------
1 | // 提取Markdown标题
2 | module.exports = async ({ fileNode }, next) => {
3 | const match = /^#\s?([^#\n\r]*)/.exec(fileNode.body)
4 | fileNode.title = match ? match[1].trim() : fileNode.path
5 | await next()
6 | }
--------------------------------------------------------------------------------
/src/markdown/autoNumber/__tests__/convertBefore.md:
--------------------------------------------------------------------------------
1 | ## 标题一
2 | #### 小标题一
3 | ### 小标题一
4 | ### 小标题二
5 | ### 小标题三
6 | #### 超小标题四
7 | ## 标题二
8 | ### 小标题一
9 | ### 小标题二
10 | ### 小标题三
11 | ## 标题三
12 | ### 小标题一
13 | ### 小标题二
14 | ### 小标题三
15 | ###### 超小标题四
--------------------------------------------------------------------------------
/demo/level1-0.md:
--------------------------------------------------------------------------------
1 | # 一级目录 0
2 |
3 | 根据排序规则,会排在二级目录 A上面
4 | ## aaa
5 | ### aaaaaa
6 | ### aaaaaa
7 | ### aaaaaa
8 | ### aaaaaa
9 | ## bbb
10 | ### aaaaaa
11 | ### aaaaaa
12 | ### aaaaaa
13 | ### aaaaaa
14 | ## ccc
15 | ### aaaaaa
16 | ### aaaaaa
17 | ### aaaaaa
18 | ### aaaaaa
19 | ## ddd
--------------------------------------------------------------------------------
/src/markdown/autoNumber/__tests__/convertAfter.md:
--------------------------------------------------------------------------------
1 | ## 一、标题一
2 | ### 1. 小标题一
3 | ### 2. 小标题一
4 | ### 3. 小标题二
5 | ### 4. 小标题三
6 | #### 1. 超小标题四
7 | ## 二、标题二
8 | ### 1. 小标题一
9 | ### 2. 小标题二
10 | ### 3. 小标题三
11 | ## 三、标题三
12 | ### 1. 小标题一
13 | ### 2. 小标题二
14 | ### 3. 小标题三
15 | #### 1. 超小标题四
--------------------------------------------------------------------------------
/demo/assets/baidu_tongji.js:
--------------------------------------------------------------------------------
1 | var _hmt = _hmt || [];
2 | (function () {
3 | var hm = document.createElement("script");
4 | hm.src = "https://hm.baidu.com/hm.js?83882d256e3353ab5f39c27a3fa50b23";
5 | var s = document.getElementsByTagName("script")[0];
6 | s.parentNode.insertBefore(hm, s);
7 | })();
8 |
--------------------------------------------------------------------------------
/src/markdown/index.js:
--------------------------------------------------------------------------------
1 | module.exports = require('./provider')(
2 | require('./title'), // 解析标题
3 | require('./prefix'), // 标题缩进
4 | require('./breadcrumb'), // 计算面包屑
5 | require('./autoNumber'), // 自动生成序号
6 | require('./marked'), // markdown转html
7 | require('./themes') // 添加样式
8 | )
--------------------------------------------------------------------------------
/publish.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | npm config get registry # 检查仓库镜像库
3 | npm config set registry=https://registry.npmjs.org
4 | echo '请进行登录相关操作:'
5 | npm login # 登陆
6 | echo "-------publishing-------"
7 | npm publish # 发布
8 | npm config set registry=https://registry.npm.taobao.org # 设置为淘宝镜像
9 | echo "发布完成"
10 | exit
--------------------------------------------------------------------------------
/src/markdown/provider/index.js:
--------------------------------------------------------------------------------
1 | const Provider = require('./Provider')
2 |
3 | module.exports = function(){
4 | const provider = new Provider()
5 | Array.from(arguments).forEach(middleware=>{
6 | provider.useMiddleware(middleware)
7 | })
8 | provider.useMiddleware(require('../title')) //解析标题
9 | return provider
10 | }
--------------------------------------------------------------------------------
/src/markdown/prefix/index.js:
--------------------------------------------------------------------------------
1 | // 标题缩进
2 | const prefixText = ' '
3 |
4 | module.exports = async ({ provider, fileNode }, next) => {
5 | fileNode.prefix = ''
6 | let parentNode = fileNode.parent
7 | while (parentNode && parentNode != provider.root) {
8 | fileNode.prefix += prefixText
9 | parentNode = parentNode.parent
10 | }
11 | await next()
12 | }
--------------------------------------------------------------------------------
/src/ssr/HelloWorld.vue:
--------------------------------------------------------------------------------
1 |
2 | {{ msg }}
3 |
4 | Edit components/HelloWorld.vue to test hot module replacement.
5 |
6 |
7 |
20 |
--------------------------------------------------------------------------------
/src/components/HelloWorld.vue:
--------------------------------------------------------------------------------
1 |
2 | {{ msg }}
3 |
4 | Edit components/HelloWorld.vue to test hot module replacement.
5 |
6 |
7 |
20 |
--------------------------------------------------------------------------------
/src/ssr/__tests__/index.spec.js:
--------------------------------------------------------------------------------
1 | const { assert } = require('@vue/compiler-dom')
2 | const path = require('path')
3 | it('sfc ssr render', async () => {
4 | const { createRender } = require('../index')
5 | const render = createRender(path.resolve(__dirname,'../App.vue'))
6 | const data = {
7 | todos: ['吃饭', '睡觉']
8 | }
9 | const html = await render(data)
10 | expect(html).toBe('
')
11 | })
--------------------------------------------------------------------------------
/src/menu/index.js:
--------------------------------------------------------------------------------
1 |
2 | const glob = require('glob')
3 | const path = require('path')
4 | function getFolder(scanPath) {
5 | return glob.sync(
6 | path.join(scanPath,'/**/*.md'),
7 | {
8 | absolute: false,
9 |
10 | }
11 | )
12 | .map(
13 | v => path.relative(scanPath, v)
14 | )
15 | .filter(v => !v.startsWith('node_modules'))
16 | }
17 | module.exports.getFolder = getFolder
18 | module.exports.createMiddleware = (option) => async (ctx,next) => {
19 | ctx.menu = getFolder(option.root)
20 | await next()
21 | }
--------------------------------------------------------------------------------
/src/util/progress.js:
--------------------------------------------------------------------------------
1 | const term = require('terminal-kit').terminal;
2 |
3 | // TODO: 强行退出程序 + 使用watch 会造成命令行出现莫名其妙的字符
4 | // const progressBar = term.progressBar({
5 | // width: 80,
6 | // title: '🚀 Reloading the page...',
7 | // percent: true,
8 | // barHeadChar: '█',
9 | // barChar: '█',
10 | // barStyle: term.green,
11 | // });
12 |
13 | let progress = 0
14 |
15 | function step() {
16 | // Add random progress
17 | progress += Math.random() / 5;
18 | // progressBar.update(progress);
19 |
20 | if (progress < 1) {
21 | setTimeout(step, 100 + Math.random() * 100);
22 | }
23 | }
24 |
25 | module.exports = {
26 | step,
27 | init: () => {
28 | progress = 0;
29 | }
30 | }
31 |
32 |
33 |
--------------------------------------------------------------------------------
/src/markdown/marked/index.js:
--------------------------------------------------------------------------------
1 | const marked = require('marked')
2 |
3 | let indexData = {}
4 |
5 | // Markdown 转 HTML
6 | module.exports = async ({ fileNode }, next) => {
7 |
8 | // 菜单处理
9 | if (fileNode.catalogs instanceof Array) {
10 | catelogs = {}
11 | setCatelogs(fileNode.catalogs)
12 | }
13 |
14 | // HTML处理
15 | fileNode.html = marked(fileNode.body)
16 |
17 | await next()
18 | }
19 |
20 | function setCatelogs(catelogs) {
21 | catelogs.forEach(item => {
22 | if (item.hash.indexOf('#') == 0) {
23 | const matched = marked(item.hash).match(/ 1) {
29 | item.hash += '-' + (index - 1)
30 | }
31 | }
32 | }
33 | item.children && setCatelogs(item.children)
34 | })
35 | }
--------------------------------------------------------------------------------
/src/markdown/themes/index.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs')
2 | const path = require('path')
3 |
4 | const styles = {} // 样式
5 |
6 | const themes = [ // 皮肤列表
7 | { name: '默认样式', file: 'mark' },
8 | { name: 'techo', file: 'techo' },
9 | ]
10 |
11 | // 样式常驻内存,只在第一次读取
12 | // TODO: 修改CSS后,重新读取样式并显示
13 | themes.forEach(theme => addTheme(theme))
14 |
15 | // Markdown 转 HTML
16 | module.exports = async ({ fileNode }, next) => {
17 | //只有不存在的时候才添加属性
18 | if (!fileNode.themes) {
19 | fileNode.themes = themes
20 | fileNode.getTheme = (name) => {
21 | return styles[name in styles ? name : themes[0].name]
22 | }
23 | }
24 | await next()
25 | }
26 |
27 | function addTheme(theme) {
28 | const linkPath = `/assets/themes/${theme.file}/style.css`;
29 | const css = fs.readFileSync(path.join(__dirname, '../..' + linkPath), {
30 | encoding: 'utf-8'
31 | })
32 | styles[theme.name] = {
33 | ...theme,
34 | css: css,
35 | html: ``,
36 | path: linkPath
37 | }
38 | }
--------------------------------------------------------------------------------
/demo/README.md:
--------------------------------------------------------------------------------
1 | # 欢迎使用 SMARTY-PRESS
2 |
3 |
4 | ## 简单说明
5 |
6 |
7 |
8 | ### 文件目录
9 | * demo 根目录下的.md文件为一级目录:
10 | * 如:level1-0.md、level1-1.md
11 | * demo 根目录下的文件夹为二级目录:
12 | * 如:文件夹level2A、文件夹level2B
13 | * 以此类推在二级目录下创建的文件夹为三级目录
14 |
15 | ### 实时预览
16 |
17 | * 添加、修改、删除 demo 目录的文件,将在浏览器中可以实时显示修改结果
18 |
19 | ### 支持链接
20 |
21 | * 链接到 [二级目录 A](/level2A/README.md)
22 |
23 | * ' /level2A/README.md ' 路径中的 README.md 可以省略
24 | * 链接到 [二级目录 A](/level2A)
25 |
26 | ### 自动识别标题
27 |
28 | * 自动识别 ”一级标题 # “ 为菜单中的链接
29 |
30 | * 如果文件中不存在标题,则会显示 文件路径
31 |
32 | ### 文档自动排序
33 |
34 | * 文档会按“路径”进行排序
35 |
36 | * **同级** 目录中," README.md " 会排在第一个
37 |
38 | ### 支持多级目录显示
39 |
40 |
41 | ### assets文件拷贝
42 | 自动拷贝assets文件中的图片内容
43 |
44 | ## 插件开发说明
45 |
46 | 查看[插件开发说明](https://github.com/su37josephxia/smarty-press/tree/master/src/markdown/provider/__test_files__/)
47 |
--------------------------------------------------------------------------------
/src/ssr/index.html:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
39 |