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*
(.*?
?)^---s*$
?(.+)/sm',$event->data, $match)){
$event->data = preg_replace('/^---s*
(.*?
?)^---s*$
?/sm', "</markdown>
\1<markdown>
" ,$event->data, -1);
$event->data = "<markdown>
".$event->data."
</markdown>";
$event->data = preg_replace('/^<markdown>s*
*</markdown>s*$
?/sm', "" ,$event->data);
}else{
$event->data = "<markdown>
".$event->data."
</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;