chunjiu 发表于 2022-11-11 11:22:10

发现一件好东西:docsify ~ 将 markdown 文档链转成网站服务

本帖最后由 chunjiu 于 2022-11-11 16:53 编辑

我一直用 markdown 写工作日志,也一直用 python 的 http.server 做 html 网页版的文件浏览、下载服务。

忽然发现 docsify 这个好东西 ~ 它真是个好东西:

    提供转译,动态将 markdown 文档转换成 web 页面,并同时提供网页浏览服务(docsify-cli)。

这下不仅可以将我的日志直接做成私人的博客网站,而且不必劳烦去搞什么 httpd 服务器了。

它支持 markdown 里面的热链接,所以可以在 markdown 文档里面直接跳转。

只要将自己众多的 markdown 文档分层次梳理一下,就成了一个简单的日志网站,不需要掌握网页维护的众多繁琐知识。

使用插件可以支持 “美人鱼 - mermaid” 图形渲染,但在我的 Pi 上有点慢。

默认代码高亮的类型较少,需要自己添加脚本插件的链接。

资源需求和安装:

1、一个 linux 服务器,我用的是香橙派 zero 2(全志 H616,1GB RAM);

2、插了一个 128GB 的凯侠 U 盘;

3、安装最新的 nodejs (v16+);

4、用阿里源提供软件包(境外的慢到超时、无法安装,可能有些包被墙了);

5、安装 docsify-cli 后初始化起始目录,并修改缺省的 README.md 文档作起始页面;

6、启动 docsify 服务,好了,可以看你的 markdown 网站了。

参考链接:

1. 官网,用来看介绍:https://docsify.js.org/#/

2. 安装最新的 nodejs: https://www.runoob.com/nodejs/nodejs-install-setup.html

3. 安装 docsify-cli:入坑 docsify,一款神奇的文档生成利器!

注意:阿里云的源今年换新了,旧地址已经作废,所以相关内容应该改成这样:

sudo npm install -g cnpm --registry=https://registry.npmmirror.com
# 然后安装
sudo cnpm i docsify-cli -g

4. 使用docsify 写开源文档+部署到云服务器

5. 官方插件和语法高亮部件介绍

6. 语法高亮可用的部件列表

PS:

参考 - 加快 js 加载的时间后,mermaid 渲染快多了!

PS 2:

最后不得已,还是把 js 文件全部搬回到本服务器上 ... 终于不卡了。

kyq_linux 发表于 2022-11-11 11:58:07

把所有文档写成md,然后用typora查看和编辑,最后统一在git上面管理,随时下载随时同步上去。简单明了啊。

chunjiu 发表于 2022-11-11 11:59:09

本帖最后由 chunjiu 于 2022-11-11 12:01 编辑

kyq_linux 发表于 2022-11-11 11:58
把所有文档写成md,然后用typora查看和编辑,最后统一在git上面管理,随时下载随时同步上去。简单明了啊。 ...
(引用自2楼)

某些条件下不能使用云,而且以后的环境会越来越糟 ...

自己整服务器只是应对的策略之一。

PS:

抱歉哈,没说清楚。

我的日志不仅仅是技术方面的,还有给非技术人士看的内容

kyq_linux 发表于 2022-11-11 12:00:55

chunjiu 发表于 2022-11-11 11:59
某些条件下不能使用云,而且以后的环境会越来越糟 ...

自己整服务器只是应对的策略之一。 ...
(引用自3楼)

git云都没了,服务器的环境。。。

chunjiu 发表于 2022-11-11 12:03:12

kyq_linux 发表于 2022-11-11 12:00
git云都没了,服务器的环境。。。
(引用自4楼)

只能靠自己架设了呀,各种 Pi 产品也真的很适时,便宜还蛮可靠。

chunjiu 发表于 2022-11-11 13:46:27

本帖最后由 chunjiu 于 2022-11-11 13:53 编辑

我的日志也整理好了:





mermaid (“美人鱼”) 的渲染效果:



yplin27 发表于 2022-11-11 16:15:25

这种工具挺多的吧,习惯用mkdocs或者hugo

chunjiu 发表于 2022-11-11 17:11:17

yplin27 发表于 2022-11-11 16:15
这种工具挺多的吧,习惯用mkdocs或者hugo
(引用自7楼)

就目前来说,这个似乎是最简单的,捣鼓几下网站就搞好了。

我是一个大白菜 发表于 2022-11-11 18:46:01

谢谢分享,学习一下怎么使用

duxingkei 发表于 2022-11-11 22:53:27

用notion写了好多些笔记,可以到处markdowna想做成网站分享,不知道这个可以支持不?

chunjiu 发表于 2022-11-11 23:27:24

duxingkei 发表于 2022-11-11 22:53
用notion写了好多些笔记,可以到处markdowna想做成网站分享,不知道这个可以支持不? ...
(引用自10楼)

只要是纯粹的 markdown 文本就没问题。

但如果有借 ``` 代码扩展的内容可能不支持,

例如,math 公式就暂时没支持。

yixin1851 发表于 2022-11-12 06:56:38

Md文本的好处,我始终体会不到。每次还要敲md语法,总感觉麻烦,就放弃了Md。

chunjiu 发表于 2022-11-12 07:14:27

yixin1851 发表于 2022-11-12 06:56
Md文本的好处,我始终体会不到。每次还要敲md语法,总感觉麻烦,就放弃了Md。 ...
(引用自12楼)

六楼的 pdf 就是 markdown 文档转来的。

好处是语法规则简单,内容层次清晰。

写日志的时候不影响思维过程,版面自动生成。

chunjiu 发表于 2022-11-12 09:41:12

再次更新一个问题的解决方案:



内容摘要:

yixin1851 发表于 2022-11-12 11:10:05

chunjiu 发表于 2022-11-12 07:14
六楼的 pdf 就是 markdown 文档转来的。

好处是语法规则简单,内容层次清晰。
(引用自13楼)

能否传几段你用MD写几句范文上来?

chunjiu 发表于 2022-11-12 12:39:41

yixin1851 发表于 2022-11-12 11:10
能否传几段你用MD写几句范文上来?
(引用自15楼)

这个就是你楼上 pdf 文件中的 markdown 部分。

[]

## 超链接中的解析错误

由于 **markdown** 文本的链接语法总是被 `docsify-cli` 在路径的 “根” 后面插入 **“#”** ,所以下面的描述会被解析成:

```xml
# ".md" 文件中被错误解析的超链接

[平安夜歌 MP3](/.resource/00001.mp3)

# 错误的解析成:
#
# http://root/#/.resource/00001.mp3
```

此路径中的 **“#”** 会导致浏览器 **404** 错误,因为无法找到该文件。

**解决方案** 是在 `.md` 文档中直接使用 **`HTML`** 的超链接标签 **`<a href="..."> 超链接说明文本 </a>`** 来代替。请看下面的例子:

```xml
# 在 md 的文档中,改成下面的格式来超链接一个文件:

<a href="/.resource/总谱.pdf">总谱</a>

# 它会被正确的解析为:

#http://root/.resource/总谱.pdf
```

**注1:** 不用担心路径中的 unicode 字符和空格,它们会自动转成合格的 URL 语法。

**注2:** markdown 对自己的 `.md` 文件解析同样在路径中插入了 “#” 符号,但不会发生错误。

## 在文件系统中使用软连接 `ln -s xxx ./xxx`

在 `docsify-cli` 管理的目录里,允许对它之外的其它目录中文件进行软连接。

只要在操作系统中的 文件/目录 访问权限被允许,就不会对其读取操作造成阻碍。例如:

```
<a href="/.resource/总 谱.pdf" target="_blank">总谱(pdf)</a>

# 这儿的 '/.resource/总 谱.pdf' 是对一个其它目录下文件的软连接,例如:
#
# '总 谱.pdf' -> '../../Upload/Doc/分享类的资料(非系统化的文档)/新编赞美诗/71 -平安夜歌/71 平安夜-总谱.pdf'
```

## 附录 [《HTML超链接标签<a>》 ](http://m.biancheng.net/view/9387.html)

在 HTML 中,我们使用 `<a>` 标签来表示超链接。

超链接(Hyperlink)通常简称为链接(Link),是指从一个网页指向另一个目标的连接关系。

这个目标可以是另一个网页,也可以是当前网页中的其它位置,还可以是图片、文件、应用程序等。

链接的两端分别称为源锚点和目标锚点,通过点击源锚点即可以跳转到目标锚点。

超链接是网页中最常见的元素之一,整个互联网都是基于超链接而构建的。

网站由众多网页构成,超链接使得网页之间不再独立,它就像一根线,把网页连接在一起,形成一个网状结构。

互联网之所以能够称之为 “网”,就是因为有超链接的存在。

### `<a>` 标签的语法格式如下:

```xml
<a href="url"target="opentype">链接文本</a>
```

其中,**href** 属性用来指明要跳转到的 url,**target** 属性用来指明新页面的打开方式,链接文本需要写在 `<a>` 和 `</a>` 之间。

例如,链接到C语言中文网首页,并在浏览器新窗口中打开:

```xml
<a href="http://c.biancheng.net" target="_blank">C语言中文网</a>
```

它会链接到 HTML 教程的第一篇文章,并在当前窗口中打开:

```xml
<a href="http://c.biancheng.net/view/7410.html" target="_blank">网站到底是什么</a>
```

### href 属性

**href** 属性指定链接的目标,也就是要跳转到什么位置。href 可以有多种形式,例如:

- **href** 可以指向一个网页(.html、.php、.jsp、.asp 等格式),这也是最常见的形式,例如

`href="http://c.biancheng.net/view/1719.html"`

- **href** 可以指向图片(.jpg、.gif、.png 等格式)、音频(.mp3、.wav等格式)、视频(.mp4、.mkv格式)等媒体文件,例如

`href="/uploads/allimg/181221/134I32557-0.jpg"`

- **href** 可以指向压缩文件(.zip、.rar 等格式)、可执行程序(.exe)等,一些下载网站的链接就可以写成这种形式,例如

`href="./../uploads/data_package/ComputerFoundation.zip"`

- **href** 甚至还可以指向本机的文件,只是很少这样使用,例如
   
`href="D:/Program Files/360/360safe/360Safe.exe"`

所以 **href** 本质上就是指向一个文件,这个文件几乎可以是任意格式的。

如果浏览器支持这种格式,那么它就可以在浏览器上显示。比如常见的图片、音频、视频等,如果浏览器不支持这种格式,那么就提示用户下载。

另外,**href** 使用的路径可以是绝对路径,也可以是相对路径。

- 绝对路径往往以域名为起点,例如 `http://c.biancheng.net/view/1719.html`;

- 相对路径往往以当前文件或者当前域名为起点,例如`./../uploads/data_package/ComputerFoundation.zip`。

> 若对 URL 结构不了解的读者,请转到《绝对路径与相对路径》进行学习。

### target 属性

target 是可选属性,用来指明新页面的打开方式,默认情况下,新页面在当前浏览器窗口中打开。

但可以使用 **target** 属性来改变新页面的打开方式。常见的打开方式如下表所示:

| target | 属性值|
| ---- | ---- |
| 属性值       | 说明 |
| **_self** |        默认,在现有窗口中打开新页面,原窗口将被覆盖。 |
| **_blank** |        在新窗口中打开新页面,原窗口将被保留。 |
| **_parent** |        在当前框架的上一层打开新页面。 |
| **_top** |        在顶层框架中打开新页面。 |

绝大部分情况下,target 属性要么不写,保持默认的 _self,要么将它的值设置为 _blank,在新窗口中打开页面。例如:

```xml
<a href="http://c.biancheng.net/html/" target="_blank">HTML教程(新窗口打开)</a>
<a href="http://c.biancheng.net/css3/">CSS教程(当前窗口打开)</a>
```

### `<a>` 标签的默认样式

浏览器会为 **`<a>`** 标签设置一些默认样式。

- 鼠标样式

当鼠标移入链接区域时,会变成一只小手;当鼠标移出链接区域时,会变回箭头形状。

- 颜色及下划线

超链接被点击之前为蓝色,超链接被点击之后变成紫色。超链接默认带有下划线,下划线颜色和文本颜色保持一致。

chunjiu 发表于 2022-11-12 12:44:50

本帖最后由 chunjiu 于 2022-11-12 12:46 编辑

yixin1851 发表于 2022-11-12 11:10
能否传几段你用MD写几句范文上来?
(引用自15楼)

这个是美人鱼的语法,它和 markdown 无关,只是在 md 文档中用扩展代码的形式交给 mermaid 引擎渲染的图形:

【参考 6 楼的图片】

```mermaid
flowchart TB
pps300a[]
pmcl[(<br/>PPS-300A<br/>项目管理处<br/>栏目)]
pmqa[(<br/>PPS-300A<br/>品质与工艺<br/>栏目)]
hwsp[(<br/>PPS-300A<br/>硬件子项目<br/>仓库)]
swsp[(<br/>PPS-300A<br/>软件子项目<br/>仓库)]
stsp[(<br/>PPS-300A<br/>结构子项目<br/>仓库)]
elsp[(<br/>PPS-300A<br/>电气子项目<br/>仓库)]
idsp[(<br/>PPS-300A<br/>工设子项目<br/>仓库)]
core[(<br/>PPS-300A<br/>核心资料中心<br/>仓库)]
coredocs>研发的非公开性<br/>资料存放在此处]
opendocs>项目的公开性资料<br/>与文档在此处查阅]

pps300a-->pmcl -.- opendocs
pps300a-->pmqa
pps300a-->core -.- coredocs
pps300a-->hwsp
pps300a-->swsp
pps300a-->stsp
pps300a-->elsp
pps300a-->idsp
```




```mermaid
stateDiagram-v2
state "从 Gitlab 服务器远程<br/>仓库中克隆所属子项目。" as gitlab
state "1、拉取远程的子项目内容来<br/>更新本地 Git 仓库。" as sp
state "2、日常对文档的编辑和更新,这是<br/>设计工作中需要的操作。" as edsp
state "3、当一个小阶段结束时,在提交之前先用 <br/>拉取操作 同步项目中其他成员编辑过的文档。" as pull
state "4、用 提交 和 提交日志 操作将自己编辑更<br/>新的文档内容存入本地 Git 仓库。" as submit
state "5、最后用 推送操作 将本地仓库中<br/>更新后的文档内容传输到 Gitlab <br/>服务器上的远程仓库中。" as push

state SubProject {
    [*]-->sp
    sp-->edsp
    edsp-->pull
    pull-->submit
    submit-->push
    push-->sp : 在第二天的工作开始<br/>前先来一次同步
}
gitlab-->SubProject

```

yixin1851 发表于 2022-11-12 19:55:02

看来我对MD还是爱不起来

chunjiu 发表于 2022-11-12 23:02:04

yixin1851 发表于 2022-11-12 19:55
看来我对MD还是爱不起来
(引用自18楼)

要能用上才能爱起来 {:lol:}

没啥帮助就自然不爱呀。

yplin27 发表于 2022-11-13 00:01:23

yixin1851 发表于 2022-11-12 06:56
Md文本的好处,我始终体会不到。每次还要敲md语法,总感觉麻烦,就放弃了Md。 ...
(引用自12楼)

可以简单地实现文档代码化,多人合作的文档,或者持续更新的文档用markdown可以很方便review与合并

yixin1851 发表于 2022-11-14 22:49:49

yplin27 发表于 2022-11-13 00:01
可以简单地实现文档代码化,多人合作的文档,或者持续更新的文档用markdown可以很方便review与合并 ...
(引用自20楼)

我有些疑问,MD语法和正文混在一起,不会影响撰写者的思路吗?
万一哪天不记得语法了,岂不是很混乱?或者说把文字copy到非MD文档中,有语法的干扰岂不是很麻烦?

zstu2012 发表于 2022-11-15 08:45:30

yixin1851 发表于 2022-11-12 06:56
Md文本的好处,我始终体会不到。每次还要敲md语法,总感觉麻烦,就放弃了Md。 ...
(引用自12楼)

你用typora所见就是所得,直接想写什么直接按快捷键就好,不需要理会语法;更关键得是可以导出其他各种格式文本,尤其是pdf,比其他开源类得md好多了

yplin27 发表于 2022-11-15 09:04:32

yixin1851 发表于 2022-11-14 22:49
我有些疑问,MD语法和正文混在一起,不会影响撰写者的思路吗?
万一哪天不记得语法了,岂不是很混乱?或 ...
(引用自21楼)

感觉不出来,常用就那几个标签,不行就用可视化工具

chunjiu 发表于 2022-11-15 09:56:54

本帖最后由 chunjiu 于 2022-11-15 10:09 编辑

yixin1851 发表于 2022-11-14 22:49
我有些疑问,MD语法和正文混在一起,不会影响撰写者的思路吗?
万一哪天不记得语法了,岂不是很混乱?或 ...
(引用自21楼)

因为阅读者不是直接看 md 的原生文本啊……

你上 Github 之类的网站看一下,

所有的 md 格式已经被服务器渲染好了。

PS:

我上面例子内容比较复杂是因为之前团队成员跨域的比较多,

指导性的文件尽量先写的详细一点,免得大家产生歧义,

不然到了研发后期合并时,就不好收拾了。

所以一直到了现在,就养成了一种工作习惯。

chunjiu 发表于 2022-11-27 08:03:06

本帖最后由 chunjiu 于 2022-11-27 08:12 编辑

在后续的测试中,发现 js 的加载时间比较影响页面的第一响应时间,所以准备将 js 库和字体库移到 ram 中。


昨天在查找 Linux 下的 RAM 虚拟盘工具时,发现 OrangePi 的 Ubuntu 版本已经内置了它,无需再装额外的软件。

系统使用 `/dev/shm` 作为对 RAM 盘(tmpfs)的引用,它的访问权限是 0777,意味着用户可以随意访问。

下面是针对此 RAM 盘的测试结果:

/dev/shm$ free
            total      used      free      sharedbuff/cache   available
Mem:         983268      130668      428252       10208      424348      826772
Swap:      491632         0      491632

/dev/shm$ ls -al
total 0
drwxrwxrwt2 root root   40 Sep8 17:58 .
drwxr-xr-x 15 root root 3840 Nov 26 09:59 ..

/dev/shm$ sudo dd if=/dev/zero of=testfile bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 0.5562 s, 377 MB/s

/dev/shm$ ls -al
total 204800
drwxrwxrwt2 root root      60 Nov 27 07:39 .
drwxr-xr-x 15 root root      3840 Nov 26 09:59 ..
-rw-r--r--1 root root 209715200 Nov 27 07:39 testfile

/dev/shm$ free
            total      used      free      sharedbuff/cache   available
Mem:         983268      130484      223332      215008      629452      622156
Swap:      491632         0      491632

经过测试,可以发现,此目录下的文件使用 RAM 中的 shared 空间,同时,访问速度是 377 MB/s,

而普通 U 盘经过测试只有 13 MB/s 左右,TF 卡也只有 18 MB/s 左右。

所以,将 docsify 网站的 js 和 字库挪到 `/dev/shm` 下应该可以大幅提升 docsify 的第一次页面加载速度。

但是它在每次关机和掉电后会丢失,所以需要做一个启动加载任务在系统每次启动时,从 U 盘复制到该目录下即可。
页: [1]
查看完整版本: 发现一件好东西:docsify ~ 将 markdown 文档链转成网站服务