<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Soul Of Free Loop &#187; Markdown</title>
	<atom:link href="https://zohead.com/archives/tag/markdown/feed" rel="self" type="application/rss+xml" />
	<link>https://zohead.com</link>
	<description>Uranus Zhou&#039;s Blog</description>
	<lastBuildDate>Sat, 19 Jul 2025 15:42:46 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.8</generator>
	<item>
		<title>Madoko Local本地使用的问题</title>
		<link>https://zohead.com/archives/madoko-local/</link>
		<comments>https://zohead.com/archives/madoko-local/#comments</comments>
		<pubDate>Mon, 27 Mar 2023 16:33:21 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[LaTeX]]></category>
		<category><![CDATA[Madoko]]></category>
		<category><![CDATA[Madoko Local]]></category>
		<category><![CDATA[Markdown]]></category>
		<category><![CDATA[编辑器]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1827</guid>
		<description><![CDATA[关于 Madoko Madoko 是微软研究院之前推出的一款在线 Markdown 编辑器，只不过更加偏向学术使用，主要亮点在于 Madoko 可以和 LaTeX 结合，支持 LaTeX 一些语法和功能。 LaTeX 是一种基于 TEX 的排版系统，功能非常强大，不少写学术论文的研究者们应该都用过，但其比较底层，学习曲线和难度也挺大。Madoko 可以将 LaTeX 与简单的 Markdown 语法相结合，大部分的文档格式和结构可以使用现有的 Markdown 语法，用户也可以使用 LaTeX 的语法和命令进行扩展，可以很轻松地生成 LaTeX 排版效果的文档，默认也支持输出 HTML 和 P [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2 id="about-madoko">关于 Madoko</h2>
<p><a href="https://github.com/koka-lang/madoko" target="_blank">Madoko</a> 是微软研究院之前推出的一款在线 Markdown 编辑器，只不过更加偏向学术使用，主要亮点在于 Madoko 可以和 LaTeX 结合，支持 LaTeX 一些语法和功能。</p>
<p>LaTeX 是一种基于 TEX 的排版系统，功能非常强大，不少写学术论文的研究者们应该都用过，但其比较底层，学习曲线和难度也挺大。Madoko 可以将 LaTeX 与简单的 Markdown 语法相结合，大部分的文档格式和结构可以使用现有的 Markdown 语法，用户也可以使用 LaTeX 的语法和命令进行扩展，可以很轻松地生成 LaTeX 排版效果的文档，默认也支持输出 HTML 和 PDF 文档。</p>
<p>Madoko 官方的在线编辑器 Madoko Editor 网站是：</p>
<p><a href="https://www.madoko.net/" target="_blank">https://www.madoko.net/</a></p>
<p>最近 Madoko Editor 网站访问有点问题，不过我之前也已经把 Madoko Editor 网站备份过了，能够自行部署运行，编辑器的界面和默认的示例文档如下：</p>
<p><img src="https://images.weserv.nl/?url=http://res.cloudinary.com/digwht2y0/image/upload/v1737372294/madoko-editor.png" alt="Madoko Editor"></p>
<p>可以看到 Madoko 文档的扩展名是 <code>mdk</code>，而且 mdk 文档基本都是使用现有的 Markdown 语法加上一点 LaTeX 语法，即使不使用 Madoko Editor，也可以用其它 Markdown 编辑器打开进行编辑。</p>
<h2 id="madoko-local">Madoko Local</h2>
<p>mdk 文档在 Madoko Editor 中编辑修改之后，支持保存到 Dropbox、GitHub、OneDrive 以及 Local Disk 本地：</p>
<p><img src="https://images.weserv.nl/?url=http://res.cloudinary.com/digwht2y0/image/upload/v1737442733/makodo-editor-save.png" alt="Madoko Local Disk 保存"></p>
<p>由于众所周知的原因，前面三个存储目标国内用起来都不太稳定，而且之前我使用 Madoko 的时候就发现用这些云存储进行文档编辑似乎也容易出问题，可能就用微软自己的 OneDrive 做存储稳定一些。</p>
<p>另外考虑到数据放在自己手里才是最安全的，因此我一般都是用 Local Disk 本地保存方式。</p>
<p>Madoko 的本地磁盘访问则需要 <a href="https://github.com/koka-lang/madoko/tree/master/support/madoko-local" target="_blank">Madoko Local</a> 这个程序的配合，另外如果想要本地生成 PDF 也需要使用 Madoko Local。</p>
<p>Madoko Local 是用 Node.js 编写的，本机安装完 Node.js 环境后，运行命令完成安装之后就可以使用 <code>madoko-local</code> 命令了：</p>
<pre class="brush: bash; title: ; notranslate">
~# npm install -g madoko-local
</pre>
<p><code>madoko-local</code> 命令使用起来也非常简单：</p>
<pre class="brush: bash; title: ; notranslate">
~# madoko-local -r -l .
listening on           : http://localhost:8080
connecting securely to : https://www.madoko.net
serving files under    : /home/zzm/Documents

---------------------------------------------------------------
access server at       : http://localhost:8080#secret=XXX
---------------------------------------------------------------
</pre>
<p>最后一个参数就是 Madoko 能够访问的本地目录，<code>.</code> 就表示只导出当前的目录。</p>
<p>Madoko Local 启动之后就会输出绑定的端口（默认为 <code>8080</code>）、导出的本地目录路径，最重要的是包含密码的访问地址，浏览器通过这个访问地址就可以打开 Madoko Editor 界面。</p>
<p>Madoko Local 程序的其它参数可以通过 <code>madoko-local -h</code> 命令来查询，另外也可以使用 <code>config.json</code> 配置文件来配置端口等参数，这里我把 Madoko Local 的监听端口改为了 <code>18080</code>，也可以使用 <code>mountdir</code> 来配置导出的本地目录：</p>
<pre class="brush: bash; title: ; notranslate">
~$ cat &gt; ~/.madoko/config.json
{
  &quot;port&quot;:18080,
  &quot;secret&quot;:&quot;XXX&quot;,
  &quot;origin&quot;:&quot;http://XXX&quot;,
  &quot;mountdir&quot;:&quot;/home/zzm/Documents&quot;
}
</pre>
<p>配置文件所在的 <code>.madoko</code> 目录默认位于当前用户的主目录下，这个主目录的路径也可以通过 <code>madoko-local</code> 命令的 <code>--homedir</code> 参数进行自定义。</p>
<p>如果对应目录下存在有效的 <code>config.json</code> 配置文件，后续就可以直接 <code>madoko-local</code> 命令启动程序而不需要加任何参数了。</p>
<h2 id="madoko-local-issue">Madoko Local 问题</h2>
<p>不过我在使用 Madoko Local 时也发现一些问题：</p>
<ol>
<li>通过 <code>madoko-local</code> 命令来指定端口、密码等各种参数可能存在问题；</li>
<li>如果 <code>madoko-local</code> 程序默认绑定了本地 IPv6 的 <code>::1</code> 地址（也就是 <code>localhost</code> 地址），会报 <code>only serving localhost</code> 错误。</li>
</ol>
<p>为此我稍微修改了一下 Madoko Local Node.js 程序源码，生成了 Madoko Local 最新 0.9.4 版本的 patch 文件，有需要的朋友可以从下面任选一个下载：</p>
<ol>
<li><a href="https://pastebin.com/raw/jcSFMVsH" target="_blank">Pastebin 分享链接</a></li>
<li><a href="https://github.com/zohead/madoko/commit/6fd522fca1f7b25bd51a1150ac988bb24d591636.patch" target="_blank">GitHub 提交</a></li>
</ol>
<p>下载了 patch 文件之后，就可以进入 Madoko Local 的安装目录运行命令进行合并了（假设下载保存的文件名是 <code>madoko-local-npm-v0.9.4.patch</code>）：</p>
<pre class="brush: bash; title: ; notranslate">
~# cd /usr/lib/node_modules/
~# patch -p2 madoko-local-npm-v0.9.4.patch
</pre>
<p>上面命令使用的是 Linux 系统下 <code>npm</code> 默认的全局安装路径 <code>/usr/lib/node_modules</code>，其他系统可以使用 <code>npm list -g | head -n 1</code> 命令来确认。</p>
<p>为了方便，我也直接 fork 了 Madoko 的源仓库，还把自己做的其它的一些修改也提交了：</p>
<p><a href="https://github.com/zohead/madoko" target="_blank">https://github.com/zohead/madoko</a></p>
<p>Madoko Local 程序的代码在 <code>support/madoko-local</code> 子目录下供大家参考。</p>
<p>最后祝跨过三年疫情的朋友们都能玩得开心 ^_^。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/madoko-local/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>适合Chromebook的Zed编辑器上手</title>
		<link>https://zohead.com/archives/chromebook-zed/</link>
		<comments>https://zohead.com/archives/chromebook-zed/#comments</comments>
		<pubDate>Sun, 19 Jun 2016 16:05:21 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Chrome]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[Chromebook]]></category>
		<category><![CDATA[Markdown]]></category>
		<category><![CDATA[Sublime Text]]></category>
		<category><![CDATA[Zed]]></category>
		<category><![CDATA[ZPM]]></category>
		<category><![CDATA[命令]]></category>
		<category><![CDATA[快捷键]]></category>
		<category><![CDATA[编辑器]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1242</guid>
		<description><![CDATA[Zed 编辑器 对于很多 Chromebook 用户来说，缺少比较好用的本地编辑器是一个比较普遍的困扰，特别是我这样的程序员用户对于编辑器的要求就更多一些了。有一些同学是直接通过 crouton 安装 Sublime Text、GitHub Atom 等编辑器或者各种 IDE 软件来解决。 之前我介绍过 Caret 这款 Chrome 应用商店里的文本编辑器 App，如果只是用来编辑纯文本之类的文件那 Caret 是能胜任的，如果你需要额外的一些扩展功能，那只能另寻他法了。我还尝试过第三方开发者移植的 Chrome 版 Adobe Brackets 编辑器（和 Atom 有点类似），不过使用起 [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2 id="zed-编辑器">Zed 编辑器</h2>
<p>对于很多 Chromebook 用户来说，缺少比较好用的本地编辑器是一个比较普遍的困扰，特别是我这样的程序员用户对于编辑器的要求就更多一些了。有一些同学是直接通过 crouton 安装 Sublime Text、GitHub Atom 等编辑器或者各种 IDE 软件来解决。</p>
<p>之前我介绍过 <a href="https://zohead.com/archives/chromebook-caret/">Caret</a> 这款 Chrome 应用商店里的文本编辑器 App，如果只是用来编辑纯文本之类的文件那 Caret 是能胜任的，如果你需要额外的一些扩展功能，那只能另寻他法了。我还尝试过第三方开发者移植的 Chrome 版 <a href="http://brackets.io/">Adobe Brackets</a> 编辑器（和 Atom 有点类似），不过使用起来还是存在各种问题就作罢了。</p>
<p>还好后来我还是在 Chrome 商店里找到了今天要介绍的 Zed 编辑器，Zed 的使用方式和 Sublime Text 比较类似，其主要功能可以参考官网：</p>
<p><a href="http://zedapp.org/">http://zedapp.org/</a></p>
<p>Zed 编辑器其实是有 Chrome App 版本和 Windows、Mac、Linux 等系统下的 Standalone 版本的，Standalone 版本的功能比 Chrome App 版本要更多（例如可以直接运行本地命令等）。</p>
<p>对于 Chromebook 用户来说虽然默认只能用功能相对少的 Chrome App 版本，但相应的也能得到 Chrome 版本的带来的好处：</p>
<ul>
<li>一处安装多处直接运行；</li>
<li>自动通过 Google Drive 同步 Zed Chrome App 配置；</li>
<li>Zed Chrome App 默认自动从 Chrome 商店更新。</li>
</ul>
<p>而且开发者考虑到日益增长的 Chromebook 用户的需求目前也在不断更新 Chrome App 版本，我们可以从 <a href="https://chrome.google.com/webstore/detail/pfmjnmeipppmcebplngmhfkleiinphhp">Chrome 商店</a> 直接安装。</p>
<h2 id="初步使用">初步使用</h2>
<p>Zed 编辑器启动时会提示你使用哪种界面风格，默认是不带目录树甚至隐藏了菜单栏的风格，打开编辑器会显示选择项目界面：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442978/zed-initial.png" alt="Zed选择项目界面" title="Zed选择项目界面"></p>
<p>点击“Local Folder” 或者“Local File(s)”就可以打开本地的文件夹或文件编辑了，“Zedd Folder”和“Remote Folder”是两种直接编辑远程文件的方式后面单独再做介绍，另外 Zed 还直接支持打开 GitHub 版本库和 Dropbox 这点也比较方便。</p>
<p>打开具体的文件会直接显示文件内容，第一次打开某个项目文件夹的话则默认显示只读的 <code>zed::start</code> 内置使用介绍文件以帮助用户熟悉编辑器的各种快捷键之类的。</p>
<p>Zed 的文件编辑和 Sublime Text 这种类似是直接实时保存用户输入的结果，不需要单独的关闭保存操作。</p>
<p>通常的文件操作可以使用键盘快捷键或者 File 菜单完成：</p>
<ul>
<li><kbd>Ctrl-N</kbd> 键新建文件；</li>
<li><kbd>Ctrl-E</kbd> 键打开文件；</li>
<li><kbd>Alt-T</kbd> 键显示目录树；</li>
<li><kbd>F5</kbd> 键刷新文件夹中的文件列表。</li>
</ul>
<p>新建文件或者打开文件时会显示命令窗口，输入不存在的文件名就可以实现新建文件（当然也就可以直接在命令窗口中输入子目录路径）。</p>
<p>如果你在编辑的过程中需要打开另一个项目文件夹或者文件，那可以按 <kbd>Ctrl-Shift-o</kbd> 键显示最开始的选择项目界面，这样就不用重启 Zed App 了。</p>
<h2 id="zed-配置文件">Zed 配置文件</h2>
<p>这里先说 Zed 的配置文件是因为最常用的调出 Zed 命令窗口的默认快捷键 <kbd>Ctrl-.</kbd> 或 <kbd>Ctrl-Shift-.</kbd> 在 Chromebook 上是不起作用的，当然你也可以鼠标点击 Tools 菜单下的 Run Command 菜单项来实现，不过为了使用方便，我们还是先修改 Zed 配置文件来定制命令快捷键。</p>
<p>打开 Zed 编辑器开始显示的选择项目界面里可以看到 <code>Configuration</code> 项，使用此项就可以打开 Zed 自带的配置项目目录，默认第一次打开还是会显示 <code>zed::start</code> 文件，使用 <kbd>Ctrl-E</kbd> 快捷键或者打开菜单选择 <code>user.json</code> 文件进行编辑，这个就是 Zed 的用户配置文件。</p>
<p>默认的 <code>user.json</code> 用户配置文件可能是这样的（仅供参考）：</p>
<pre class="brush: jscript; title: ; notranslate">
{
    imports: [
        &quot;/default.json&quot;
    ],
    preferences: {},
    modes: {},
    keys: {},
    commands: {},
    handlers: {},
    themes: {},
    packages: [    ]
}
</pre>
<p>我们可以在 <code>keys</code> 中新增一项来修改默认的运行命令快捷键：</p>
<pre class="brush: jscript; title: ; notranslate">
    keys: {
        &quot;Command:Enter Command&quot;: {
            win: &quot;Ctrl-Shift-C&quot;
        }
    },
</pre>
<p>例如改成上面的内容就可以使用 <kbd>Ctrl-Shift-C</kbd> 键调出运行 Zed 命令的窗口了。</p>
<p>当然对于修改主题之类的常用配置，你可以使用 <kbd>Ctrl-,</kbd> 快捷键或者 Configuration - Preferences 菜单项进行图形化的配置，这样也更加方便。</p>
<h2 id="zed-命令">Zed 命令</h2>
<p>Zed 命令的使用方式也是和 Sublime Text 比较相似，经过上面的步骤修改命令快捷键之后就可以体验 Zed 的各项命令了，Zed 的命令窗口支持模糊查找识别的功能。</p>
<p>Zed 相对 Chrome 商店里其它各种编辑器的一大优势就是其支持 Zed Package Manager（简称 ZPM）包管理特性，第三方开发者可以根据需要为 Zed 开发各种扩展功能包，ZPM 的介绍可以参考 Zed <a href="http://zedapp.org/2014/05/zed-package-manager/">官网文章</a>，常用 ZPM 包在这里：</p>
<p><a href="https://github.com/zedapp/zed/wiki/Packages">https://github.com/zedapp/zed/wiki/Packages</a></p>
<p>按快捷键调出运行命令的窗口后，输入 install 就可以看到默认匹配的安装 ZPM 包命令：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442973/zed-command.png" alt="Zed命令窗口" title="Zed命令窗口"></p>
<p>同样输入 installed 就可以看到默认匹配的列出已安装的 ZPM 包命令，还是比较方便的。</p>
<h2 id="markdown-编辑与预览">Markdown 编辑与预览</h2>
<p>Zed 虽然不像 Sublime Text 那样支持多标签页功能，但也可以在一个 Zed 窗口中显示最多 3 个编辑窗口，通过快捷键可以切换：</p>
<ul>
<li><kbd>Ctrl-2</kbd> 将窗口分割为两个编辑窗口；</li>
<li><kbd>Ctrl-3</kbd> 将窗口分割为三个编辑窗口（最好高分屏才这么干哈）；</li>
<li><kbd>Ctrl-1</kbd> 恢复为单编辑窗口；</li>
<li><kbd>Ctrl-0</kbd> 在多个编辑窗口之间切换焦点。</li>
</ul>
<p>Zed 自带 Markdown 预览功能，如果编辑的是 Markdown 文件则可以通过 <kbd>Ctrl-P</kbd> 快捷键显示预览窗口，开启预览之后还可以多次使用 <kbd>Ctrl-P</kbd> 快捷键切换源 Markdown 文件编辑窗口和预览窗口的大小，当然也可以按 <kbd>Ctrl-1</kbd> 键关闭预览窗口。</p>
<p>我使用的 <a href="http://wiki.zohead.com/">Wiki 系统</a> 中的 Markdown 文件预览效果如下：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442978/zed-markdown.png" alt="Zed自带Markdown预览效果" title="Zed自带Markdown预览效果"></p>
<p>你可能从上面的截图可以看出 Zed 的 Markdown 预览功能似乎效果一般，这是因为 Zed 自带的 Markdown 预览模块对 GitHub 格式的 Markdown 文件的支持是不太好的。</p>
<p>不过还好已经有人为 Zed 写了一个支持 GitHub Flavored Markdown 的 ZPM 包，其项目地址如下：</p>
<p><a href="https://github.com/akoenig/zed-gfm-preview">https://github.com/akoenig/zed-gfm-preview</a></p>
<p>按照该项目主页的介绍，调出运行命令窗口，选择 <code>Tools:Zpm:Installed Packages</code> 命令准备安装新的 ZPM 包，包地址中输入 <code>gh:akoenig/zed-gfm-preview</code> 就可以完成安装。</p>
<p>安装完成之后编辑 Markdown 文件时可以通过 <code>GitHub:Markdown:Preview</code> 命令使用 zed-gfm-preview 方式来预览 Markdown，当然还是建议修改 Zed 用户配置文件直接将 zed-gfm-preview 配置为 Zed 默认的 Markdown 预览方式：</p>
<pre class="brush: jscript; title: ; notranslate">
modes: {
    markdown: {
        handlers: {
            preview: [
                &quot;!Tools:Preview&quot;,
                &quot;GitHub:Markdown:Preview&quot;
            ]
        }
    }
}
</pre>
<p>这样还是可以按默认的 <kbd>Ctrl-P</kbd> 快捷键直接预览 Markdown 文件：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442979/zed-markdown-github.png" alt="GitHub Markdown预览效果" title="GitHub Markdown预览效果"></p>
<p>可以看到效果也比 Zed 自带的实现好多了哦，代码块的显示也正确了。</p>
<h2 id="后记">后记</h2>
<p>本文只是对 Zed 编辑器的初步介绍，另外一些 Zed 自带的比较好用的远程编辑文件、自带 Web 服务器等特性后面有空再来写了，大家也可以研究折腾甚至开发自己的 ZPM 包哦。文章中有任何问题还请提出指正，火热的六月仍然祝大家玩的开心呢 ^_^。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/chromebook-zed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>整合Wikitten和MDwiki搭建个人知识库</title>
		<link>https://zohead.com/archives/wikitten-mdwiki/</link>
		<comments>https://zohead.com/archives/wikitten-mdwiki/#comments</comments>
		<pubDate>Wed, 16 Mar 2016 08:43:49 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[学习感悟]]></category>
		<category><![CDATA[Evernote]]></category>
		<category><![CDATA[Front Matter]]></category>
		<category><![CDATA[Markdown]]></category>
		<category><![CDATA[MDwiki]]></category>
		<category><![CDATA[Wiki]]></category>
		<category><![CDATA[Wikitten]]></category>
		<category><![CDATA[知识管理]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1193</guid>
		<description><![CDATA[我的知识库管理现状 一段时间以来我都算是 Pocket 和 Evernote 的忠实用户，Pocket 用于采集网上看到的想要稍后预读的文章，遇到比较好的内容觉得该记录下来的就记录在 Evernote 里，这样 Evernote 基本被我用来做个人知识库了，平常比较零散的个人信息之类的则记录到 Google Keep 中。 最近在 Android 手机上碰到几次比较奇怪的 Evernote 数据库错误之后还是觉得 Evernote 虽然有相对还算好用的离线、同步、搜索等功能，但也有一些问题： 众所周知的编辑功能确实比较烂，不支持 Markdown，对于表格等稍微复杂点的内容那编辑效果简直惨不忍 [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2 id="我的知识库管理现状">我的知识库管理现状</h2>
<p>一段时间以来我都算是 <a href="https://getpocket.com/">Pocket</a> 和 <a href="https://www.evernote.com/">Evernote</a> 的忠实用户，Pocket 用于采集网上看到的想要稍后预读的文章，遇到比较好的内容觉得该记录下来的就记录在 Evernote 里，这样 Evernote 基本被我用来做个人知识库了，平常比较零散的个人信息之类的则记录到 <a href="https://keep.google.com/">Google Keep</a> 中。</p>
<p>最近在 Android 手机上碰到几次比较奇怪的 Evernote 数据库错误之后还是觉得 Evernote 虽然有相对还算好用的离线、同步、搜索等功能，但也有一些问题：</p>
<ul>
<li>众所周知的编辑功能确实比较烂，不支持 Markdown，对于表格等稍微复杂点的内容那编辑效果简直惨不忍睹；</li>
<li>只有笔记本组和笔记本这两层结构对于我来说始终还是觉得不够；</li>
<li>客户端里所有笔记数据都放在 SQLite 数据库文件感觉稳定性一般。</li>
</ul>
<p>再加上最近 Evernote 这头大象给人的前景似乎一直不太好，所以我就想找到一个相对比较简单优雅的个人知识库系统，最好是能直接支持 Markdown 格式，不需要复杂的搭建步骤，能方便的在我的 VPS 和本地跑起来，当然 Evernote 我暂时还是不会弃用的。</p>
<h2 id="mdwiki-和-wikitten-对比">MDwiki 和 Wikitten 对比</h2>
<p>我找了几个比较流行的 Wiki 系统，开始就跳过了 MediaWiki 这种看起来略复杂的系统，也简单看了看很多网友推荐的 DokuWiki，甚至还有 TiddlyWiki 这种直接单文件的 Wiki 方式，初步考虑后想用 MDwiki 这个基于 Markdown 而且超级简单的纯静态 Wiki 系统。</p>
<p>MDwiki 相对于其它 Wiki 系统的最大好处是其单纯使用浏览器就可以解析 Markdown 文档，部署可算是超级简单了，VPS 上只要有 Web 服务器就可以访问（纯静态不需要 PHP 支持），甚至在 PC 本地也可以直接打开（虽然 IE11 和 Chrome 浏览器上已经不支持请求本地文件了）。</p>
<p>按照 <a href="http://www.mdwiki.info/">MDwiki</a> 官网的介绍生成一个 Wiki 主页还是非常简单的，网上的说明也比较多这里就不介绍了，如果知识库内容比较少用 MDwiki 还是很方便的，但我想稍微增加一些内容时就发现了 MDwiki 一些明显的不足：</p>
<ul>
<li>导航菜单只支持两层，这个是 MDwiki 使用的 Bootstrap 的限制，而且如果有很多层目录，每个目录下又有不少 Markdown 文档，直接全部放在导航菜单里那体验也是比较糟糕的；</li>
<li>由于纯静态的限制，如果在某个目录下增加了 Markdown 文档，那就需要同步修改导航菜单，或者在其它页面里加上指向新文档的链接，这样如果需要动态修改更新实在有点麻烦；</li>
<li>同样由于纯静态的限制，基本没有办法实现搜索功能，如果后续知识库文章较多那还需要同步下来对文件夹进行搜索；</li>
<li>MDwiki 只有一个主 html 文件，切换文章是用 AJAX 异步加载 Markdown 文档然后解析显示的，这样就意味着 MDwiki 对于搜索引擎来说是非常不友好的，基本没有实际可用内容。</li>
</ul>
<p>因此我还是想实现既能兼顾 MDwiki 直接使用 Markdown 的方便之处又能解决上面列出的问题，最后还是找到了 <a href="http://wikitten.vizuina.com/">Wikitten</a> 这个用 PHP 实现的 Wiki 系统。</p>
<p>Wikitten 与 MDwiki 不同之处在于 Markdown 文档是由 PHP 程序解析并直接转换为 HTML 返回给浏览器的，而且配置好知识库目录之后访问就可以显示完整的目录树（有修改更新时也不用手工修改其它 Markdown 文件了），也有比较简单的搜索功能，可以直接把源代码文件以比较漂亮的形式显示出来。</p>
<p>我部署的 Wikitten 系统运行效果图如下：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442965/wikitten-ui.png" alt="Wikitten 界面" title="Wikitten 界面"></p>
<p>综合考虑之后我准备对 Wikitten 和 MDwiki 做出少量修改，以实现在我的 VPS 服务器上主要还是用 Wikitten 来动态展示，需要在本地直接查看修改时也可以用上 MDwiki，这样就能兼顾两者的优点了。</p>
<h2 id="mdwiki-的修改">MDwiki 的修改</h2>
<p>对 MDwiki 的修改主要考虑到要能方便的找到目录树的 Markdown 文档，修改如下：</p>
<ol>
<li>把 Markdown 文档放到单独的目录中，我是直接改成放到和 <code>mdwiki.html</code> 主文件相同路径的 <code>library</code> 目录，这与 Wikitten 的默认知识库目录是一致的，这样 Wikitten 和 MDwiki 就可以共用 Markdown 文档了；</li>
<li>
<p>支持识别 Markdown 文件开头添加的 <a href="http://jekyllrb.com/docs/frontmatter/">YAML front matter</a> 数据，front matter 可以用来表示 Markdown 文档的标题、作者、标签等信息；</p>
<blockquote>
<p><strong>提示</strong></p>
<p>MDwiki 新增加的 font matter 支持需要修改 <code>config.json</code> 配置文件增加 <code>"parseHeader": true</code> 进行开启。</p>
</blockquote>
<p>Wikitten 是直接支持 YAML front matter 的并能动态生成到 HTML 数据中的，常见的 front matter 数据格式是这样的：</p>
<pre class="brush: plain; title: ; notranslate">
---
&quot;title&quot;: &quot;Wiki site&quot;,
&quot;tags&quot;: [&quot;tag1&quot;, &quot;tag2&quot;, &quot;tag3&quot;],
&quot;author&quot;: &quot;xxx&quot;
---
</pre>
<blockquote>
<p><strong>注意</strong></p>
<p>上面的格式中开头和结束是 3 个横线，而且开头以及结束的横线和中间的实际 front matter（也就是 meta data）内容之间只有一个回车哦；下面修改后的格式也是类似的。</p>
</blockquote>
<p>不过上面这种格式很多 Markdown 编辑器却是不支持的显示有问题，这里我改成了和 MDwiki 暂未发布的开发版本中一致的形式：</p>
<pre class="brush: plain; title: ; notranslate">
```
&quot;title&quot;: &quot;Wiki site&quot;,
&quot;tags&quot;: [&quot;tag1&quot;, &quot;tag2&quot;, &quot;tag3&quot;],
&quot;author&quot;: &quot;xxx&quot;
```
</pre>
</li>
<li>
<p>我写了一个自动生成 Markdown 知识库目录下面所有子目录索引文件 <code>index.md</code> 的 shell 脚本 <strong><code>generate-index.sh</code></strong> 给 MDwiki 使用，使用起来也很简单：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/wiki$ ./generate-index.sh library
Generate index file: library/生活/index.md
Generate index file: library/阅读/index.md
Generate index file: library/技术/网络/index.md
Generate index file: library/技术/硬件/USB/index.md
Generate index file: library/技术/硬件/PCI-E/index.md
Generate index file: library/技术/硬件/index.md
Generate index file: library/技术/存储/index.md
Generate index file: library/技术/index.md
Generate index file: library/技术/音视频/index.md
Generate index file: library/技术/Linux/内存管理/index.md
Generate index file: library/技术/Linux/文件系统/index.md
Generate index file: library/技术/Linux/开发工具/index.md
Generate index file: library/技术/Linux/index.md
Generate index file: library/技术/Android/index.md
Generate index file: library/技术/Docker/index.md
</pre>
<p><strong><code>generate-index.sh</code></strong> 脚本会查找输入的 Markdown 知识库目录并判断是否需要生成子目录下的索引文件（如果用户自己单独写了 <code>index.md</code> 文档就不会直接覆盖）；</p>
<p>编写者在创建新的 Markdown 文档或者删除更新时，只需要再运行 <strong><code>generate-index.sh</code></strong> 脚本就可以自动更新知识库中所有目录的索引。</p>
<p>我修改的 <strong><code>generate-index.sh</code></strong> 自动生成脚本下载地址在这里（也可以从文章最后的版本库里检出）： <br />
<a href="http://mdwiki.zohead.com/generate-index.sh">http://mdwiki.zohead.com/generate-index.sh</a></p>
</li>
</ol>
<p>这样修改之后 MDwiki 里就可以通过指向目录的索引文件以间接实现目录树功能（只是需要像 Windows 资源管理器那样一层层往下），同时这种方式生成的每个子目录的 <code>index.md</code> 索引文件也可以给 Wikitten 使用（Wikitten 自带目录树功能基本很少会用到索引文件）。</p>
<p>MDwiki 下访问目录的效果（使用脚本自动生成的索引文件）：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442839/mdwiki-dirindex.png" alt="MDwiki 目录索引" title="MDwiki 目录索引"></p>
<h2 id="wikitten-的修改">Wikitten 的修改</h2>
<p>由于 Wikitten 的基本功能都算可以用了，故我对 Wikitten 只有一些小改动：</p>
<ol>
<li>同时兼容上面说明的 Markdown 文件开头的两种 YAML front matter 形式，可以实现和 MDwiki 下面基本相同的效果；</li>
<li>浏览具体目录页时 Wikitten 原有处理是直接提示用户从左边目录树中选择，这里我稍微修改为自动判断该目录下是否有 <code>index.md</code> 文件，存在则直接解释显示 Markdown 文档；</li>
<li>修正上面的 <strong><code>generate-index.sh</code></strong> 脚本生成的目录索引 Markdown 表格的显示效果。</li>
</ol>
<h2 id="同时部署-wikitten-和-mdwiki">同时部署 Wikitten 和 MDwiki</h2>
<h3 id="部署-wikitten">部署 Wikitten</h3>
<p>Wikitten 部署参照其官网的说明一般没什么问题，只是 Wikitten 需要至少 PHP 5.3 版本，为此我还专门对 VPS 上 LNMP 套件里的 PHP 进行了升级，同时 Wikitten 也需要开启 PHP 的 fileinfo 模块。</p>
<p>Wikitten 需要 Web 服务器支持 rewrite，其版本库中自带了 Apache 适用的 <code>.htaccess</code> 文件，这里贴下适用于 nginx 的我的 Wiki 主域名 <code>wiki.zohead.com</code> 的 vhost 配置给大家一个参考：</p>
<pre class="brush: plain; title: ; notranslate">
server
{
	listen 80;

	server_name wiki.zohead.com;
	index index.html index.htm index.php default.html default.htm default.php;
	root /home/wwwroot/wiki.zohead.com;

	location ~* ^/static/(css|js|img|fonts)/.+.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt|swf|pdf|txt|bmp|eot|svg|ttf|woff|woff2)$ {
		access_log off;
		expires max;
	}
	location / {
		rewrite ^(.*)$ /index.php last;
	}
	location ~ /index.php$ {
		try_files $uri =404;
		fastcgi_pass  unix:/tmp/php-cgi.sock;
		include fastcgi.conf;
	}
}
</pre>
<p>其实也是比较简单的，参考 Wikitten 自带的 <code>.htaccess</code> 就可以修改过来，主要是下面的 rewrite 规则配置正确就可以了。</p>
<h3 id="部署-mdwiki">部署 MDwiki</h3>
<p>这里为了和上面的 Wiki 主域名 <code>wiki.zohead.com</code> 区分，我为 MDwiki 站点单独搞了个 Wiki 备用域名 <code>mdwiki.zohead.com</code>，这个的配置就非常简单了，只要最基本的 vhost 配置就可以了：</p>
<pre class="brush: plain; title: ; notranslate">
server
{
	listen 80;

	server_name mdwiki.zohead.com;
	index index.html index.htm default.html default.htm;
	root /home/wwwroot/wiki.zohead.com;
}
</pre>
<p>可以看到这个 MDwiki 备用域名的主目录和上面的 Wikitten 是一样的，只是刚好把 <code>index.html</code> 给 MDwiki 使用，<code>index.php</code> 给 Wikitten 使用。</p>
<h2 id="综述">综述</h2>
<p>说了这么多，下面是我的初步 Wiki 知识库演示效果了。这样修改之后对于我来说最大的好处是当发现哪个用的不爽时可以无缝切换，毕竟现在这两个系统的目录结构和数据是完全共用的，哈哈。</p>
<p>Wikitten 动态主站请访问：</p>
<p><a href="http://wiki.zohead.com/">http://wiki.zohead.com/</a></p>
<p>备用 MDwiki 纯静态站点请访问：</p>
<p><a href="http://mdwiki.zohead.com/">http://mdwiki.zohead.com/</a></p>
<p>整个 Markdown 知识库目录我是使用 BitTorrent Sync 进行本机和 VPS 之间的同步，另外我把整合和修改过的 Wikitten 和 MDwiki 基础代码放到了一起，并在 GitHub 上建立了一个版本库：</p>
<p><a href="https://github.com/zohead/wikitten-and-mdwiki">https://github.com/zohead/wikitten-and-mdwiki</a></p>
<p>大家有兴趣的话可以检出这个版本库自行修改部署哦，项目主页上也有一些介绍说明，如果你不需要同时支持 Wikitten 和 MDwiki 的话也可以自己取舍的，毕竟这个版本库里 MDwiki 的代码只有根目录下的 <code>index.html</code> 这一个文件。</p>
<p>Wikitten 的配置文件为根目录下的 <code>config.php</code>，MDwiki 的配置文件为根目录下的 <code>config.json</code>，还是比较一致的哈。</p>
<p>如果你只想要 Wikitten 系统的话那删除 <code>index.html</code>、<code>config.json</code> 文件即可，如果你只需要 MDwiki 那也只用保留 <code>index.html</code>、<code>config.json</code> 和 <code>generate-index.sh</code> 这几个文件。</p>
<p>最后本文及对应版本库中有任何问题欢迎提出指正哦，祝大家玩的开心 ^_^。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/wikitten-mdwiki/feed/</wfw:commentRss>
		<slash:comments>52</slash:comments>
		</item>
	</channel>
</rss>
