Dokuwiki 二次开发记录
【转】http://www.syyong.com/other/Dokuwiki-Secondary-Development-Record.html
DokuWiki 是一种在 GPLv2 下获得许可并以 PHP 编程语言编写的 wiki 应用程序。 它适用于纯文本文件,因此不需要数据库。它的语法与 MediaWiki 使用的语法类似。
DokuWiki 具有丰富的插件,如Markdown、sidebar、流程图、时序图、svg、数学公式、ToDo等等这些实用的插件。
但由于直接安装 DokuWiki 和使用她的插件,对有些地方和样式不是很满意。如 Markdown 插件存在 bug,样式风格过于传统,登录方式需要自定义等。由于这些问题的存在,也就需要在源码的基础上做些配置和二次开发。
下载安装Dokuwiki
安装插件
- SVG-Edit plugin
- DokuWiki Upgrade
- Wrap Plugin
- Sequencediagram plugin
- Plugin: Numbered Headings
- Note Plugin
- Move plugin
- MathJax plugin
- PHP Markdown Extra plugin
- Indexmenu Plugin
- imgpaste plugin
- Gallery Plugin
- Flowchartjs Plugin
- S5 Slideshow Plugin
- edittable plugin
- color syntax plugin
- ToDo
- Copy Page Plugin
- Page Redirect
- Remove irrelevant entries from the change history
- Searchindex Manager
- CSV Plugin
- 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 设置
- title: 聚美wiki
- 语言:zh
- 高级设置:自动检查更新关闭
显示设置
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()) {
其他修改文件
- lib/plugins/markdownextra/lib/meltdown/js/jquery.meltdown.js
- lib/plugins/markdownextra/lib/meltdown/css/meltdown.css
- lib/plugins/markdownextra/lib/meltdown-tweaks/meltdown-tweaks.js
- lib/plugins/markdownextra/lib/meltdown-tweaks/meltdown-tweaks.css
- 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() }); },
配置设置
管理 -> 模板样式设置
- 全站的宽度 :100em
- 侧边栏的宽度 :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; margin-left: 0px;