DokuWiki 具有丰富的插件,如Markdown、sidebar、流程图、时序图、svg、数学公式、ToDo等等这些实用的插件。

但由于直接安装 DokuWiki 和使用她的插件,对有些地方和样式不是很满意。如 Markdown 插件存在 bug,样式风格过于传统,登录方式需要自定义等。由于这些问题的存在,也就需要在源码的基础上做些配置和二次开发。

下载安装Dokuwiki

https://www.dokuwiki.org/

安装插件

  1. SVG-Edit plugin
  2. DokuWiki Upgrade
  3. Wrap Plugin
  4. Sequencediagram plugin
  5. Plugin: Numbered Headings
  6. Note Plugin
  7. Move plugin
  8. MathJax plugin
  9. PHP Markdown Extra plugin
  10. Indexmenu Plugin
  11. imgpaste plugin
  12. Gallery Plugin
  13. Flowchartjs Plugin
  14. S5 Slideshow Plugin
  15. edittable plugin
  16. color syntax plugin
  17. ToDo
  18. Copy Page Plugin
  19. Page Redirect
  20. Remove irrelevant entries from the change history
  21. Searchindex Manager
  22. CSV Plugin
  23. ShortURL Plugin

data目录名支持中文

inc/pageutils.php

# utf8_encodeFN()
// $file = urlencode($file);
// $file = str_replace('%2F','/',$file); return $file; # utf8_decodeFN() // return urldecode($file); return $file;

配置管理器

DokuWiki 设置
  1. title: 聚美wiki
  2. 语言:zh
  3. 高级设置:自动检查更新关闭
显示设置
toptoclevel -> 1
tocminheads -> 1
maxtoclevel -> 3
maxseclevel -> 3
Mathjax配置

plugin»mathjax»url

// 先从网上下载MathJax到指定目录.
/lib/plugins/mathjax/2.7.1/MathJax.js?config=TeX-AMS_CHTML.js

plugin»mathjax»config

MathJax.Hub.Config({
    tex2jax: {
        inlineMath: [ ["\\$","\\$"] ],
        displayMath: [ ["\\$\\$","\\$\\$"] ],
        processEscapes: true } });

Indexmenu

生成管理左侧目录树。

添加sidebar页面,内容为:

{{indexmenu>..#1|js navbar}}

Markdownextra

lib/plugins/markdownextra/action.php

if (preg_match('/^---\s*\n(.*?\n?)^---\s*$\n?(.+)/sm',$event->data, $match)){
   $event->data = preg_replace('/^---\s*\n(.*?\n?)^---\s*$\n?/sm', "</markdown>\n\\1<markdown>\n" ,$event->data, -1); $event->data = "<markdown>\n".$event->data."\n</markdown>"; $event->data = preg_replace('/^<markdown>\s*\n*<\/markdown>\s*$\n?/sm', "" ,$event->data); }else{ $event->data = "<markdown>\n".$event->data."\n</markdown>"; }

lib/plugins/markdownextra/syntax.php

Warning: DOMDocument::loadHTML(),加上 @ 屏蔽报错
解决解析md时概率性出错问题

1)inc/parserutils.php -> p_cached_instructions():

$isMD = strtolower(substr($file, -7)) === '.md.txt';
if (!$isMD && ($cacheonly || $cache->useCache() || (isset($run[$file]) && !defined('DOKU_UNITTEST')))) { return $cache->retrieveCache(); } else { if (file_exists($file)) { // no cache - do some work $ins = p_get_instructions(io_readWikiPage($file, $id)); if (!$isMD) { if ($cache->storeCache($ins)) { $run[$file] = true; // we won't rebuild these instructions in the same run again } else { msg('Unable to save cache file. Hint: disk full; file permissions; safe_mode setting.', -1); } } return $ins; } }

2)inc/parserutils.php -> p_cached_output():

# 130
+ $isMD = strtolower(substr($file, -7)) === '.md.txt';
* if (!$isMD && $cache->useCache()) {
其他修改文件
  1. lib/plugins/markdownextra/lib/meltdown/js/jquery.meltdown.js
  2. lib/plugins/markdownextra/lib/meltdown/css/meltdown.css
  3. lib/plugins/markdownextra/lib/meltdown-tweaks/meltdown-tweaks.js
  4. lib/plugins/markdownextra/lib/meltdown-tweaks/meltdown-tweaks.css
  5. lib/scripts/editor.js

svgedit

lib/plugins/svgedit/script.js

* var svgeditor_path = DOKU_BASE+'lib/plugins/svgedit/svg-edit/'; //offline

网上下载embedapi.js文件放到 lib/plugins/svgedit/svg-edit/ 目录下。

外部链接新tab打开

在conf/local.php加上:

$conf['target']['extern'] = '_black';

copypage

修改图片顺序

修改右侧“页面复制”按钮的顺序由默认的倒数第一变为倒数第二。

lib/plugins/copypage/action.php

public function add_tool_button(Doku_Event &$event, $param) { $newitem = '<li>' . '<a href="#" class="action copypage copypageplugin__copy" rel="nofollow">' . '<span>' . $this->getLang('copypage') . '</span>' . '</a>' . '</li>'; $offset = count($event->data['items']) - 1; $event->data['items'] = array_slice($event->data['items'], 0, $offset, true) + array('copypage' => $newitem) + array_slice($event->data['items'], $offset, null, true); }
添加中文翻译

进入 lib/plugins/copypage/lang

cp -r en zh

修改lang.php

<?php
$lang['copypage'] = '页面复制';
$lang['js']['enter_page_id'] = "输入新文档地址"; $lang['js']['different_id_required'] = '不能和当前文档重名.';

S5

可添加一个自定义的模板,自定义样式。

imgpaste

图片粘贴后默认是wiki语法,如果是Markdown类型的文档则需要做兼容性支持:

lib/plugins/imgpaste/script.js

// insert syntax and close dialog
success: function (data) {
    $box.find('.content').addClass('success').text(data.message); var _id = getUrlParam('id'); if (_id == null || _id.substr(-3, 3).toLowerCase() != '.md') { insertAtCarret('wiki__text', '{{ :' + data.id + ' |}}'); } else { insertAtCarret('wiki__text', '![Title](/lib/exe/fetch.php?media=' + data.id + ')'); } $box.delay(500).fadeOut(500, function () { $box.dialog('destroy').remove() }); },

配置设置

管理 -> 模板样式设置

  1. 全站的宽度 :100em
  2. 侧边栏的宽度 :18em

修改样式

1、lib/scripts/editor.js

300px -> 550px;

2、conf目录下添加userstyle.css文件:

.dokuwiki div.page, .dokuwiki .pageId span, pre.code, pre, code { box-shadow: none; } .dokuwiki .group p, .dokuwiki li, .dokuwiki dd { line-height: 1.7; } .dokuwiki div.page { border: 1px solid #a7d7f9; font-size: 15px; padding: 1.556em 1.5em 1.5em; } #dokuwiki__pagetools { top: 2.5em; } div.mode_edit #dokuwiki__header, div.mode_preview #dokuwiki__header, div.mode_draft #dokuwiki__header, div.mode_recover #dokuwiki__header { display: none; } div.mode_edit #dokuwiki__content div.page, div.mode_preview #dokuwiki__content div.page, div.mode_draft #dokuwiki__content div.page, div.mode_recover #dokuwiki__content div.page { padding: 10px 0px 0px 0px; background: inherit; border: 0px; } div.mode_edit #dokuwiki__footer, div.mode_preview #dokuwiki__footer, div.mode_draft #dokuwiki__footer, div.mode_recover #dokuwiki__footer { display: none; } div.mode_edit .dokuwiki.hasSidebar div.preview, div.mode_preview div.preview, div.mode_draft div.preview, div.mode_recover div.preview { border-right: 0px; background: #fff; } div.mode_edit .dokuwiki.hasSidebar div.preview, div.mode_preview div.preview .pad, div.mode_draft div.preview .pad, div.mode_recover div.preview .pad { padding-left: 5px; padding-right: 5px; } div.mode_edit textarea, div.mode_preview textarea, div.mode_draft textarea, div.mode_recover textarea { padding-left: 5px; padding-right: 5px; } div.mode_edit #edbtn__save, div.mode_preview #edbtn__save, div.mode_draft #edbtn__save, div.mode_recover #edbtn__save { background: #4285f4; border: 1px solid #4285f4; color: #fff; } div.mode_edit div.docInfo, div.mode_preview div.docInfo, div.mode_draft div.docInfo, div.mode_recover div.docInfo { display: none; } div.mode_edit button, div.mode_preview button, div.mode_draft button, div.mode_recover button { padding: .1em 1.5em; } div.mode_edit #dokuwiki__pagetools, div.mode_preview #dokuwiki__pagetools, div.mode_draft #dokuwiki__pagetools, div.mode_recover #dokuwiki__pagetools { top: 6em; } html, body { background: #fbfaf9; -webkit-font-smoothing: antialiased; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } a:link, a:visited, a:hover, a:active { color: #4183c4 } form.search { display: inline-block; /*float: left;*/ } #dokuwiki__header .tools li#site_home_l { float: left;