MoinMoin 维基语法采用了较为通用的 Wiki 语法规范,您在其它维基学习到的语法,基本可以用在这里,尤其是和 Trac 的 Wiki 语法更为相近。
在这个帮助页面中汇总了 MoinMoin 的维基语法,采用表格形式,同时显示了代码和实际的输出,便于掌握和参考。
1. 基本Wiki语法
下表是基本语法参考,主要分为以下四个部分:1.字体相关的语法, 2.段落相关的语法, 3.链接相关的语法, 4.块语句
模拟输出 |
说明 |
|||||||
'''加粗''' |
加粗 |
|
||||||
''斜体字'' |
斜体字 |
|
||||||
'''''粗斜体''''' |
粗斜体 |
|
||||||
__下划线__ |
下划线 |
|
||||||
--(删除线)-- |
删除线 |
|||||||
~~删除线~~ |
删除线 |
|
||||||
~-字体变小-~ |
字体变小 |
|
||||||
~+字体变大+~ |
字体变大 |
|
||||||
a^2^+b^2^=c^2^ |
a2+b2=c2 |
上角标 |
||||||
2H,,2,,+O,,2,,=2H,,2,,O |
2H2+O2=2H2O |
下角标 |
||||||
模拟输出 |
说明 |
|||||||
= 标题1 = == 二级标题 ===== ===三级标题== |
|
|
||||||
强制换行<<BR>>另一行 |
强制换行 |
强制换行 |
||||||
一个换行符 不能分段,会续行。 两个连续的回车,实现换行。 |
一个换行符 不能分段,会续行。 两个连续的回车,实现换行。 |
段落 |
||||||
缩进也会完美呈现。
前面两个空格
前面四个空格
前面四个空格(同等缩进则续行)
连续的回车实现换行
|
缩进也会完美呈现。
|
缩进 |
||||||
---- ------ |
|
不同粗细的水平分隔线 |
||||||
* 无编号列表1(注意*号前后的空格!)
. 无标记列表1
. 无标记列表2
* 无编号列表2
1. 编号列表1
1.#5 缩进则成为下级编号,从 5开始编号
1. 编号列表2
a. 字母为编号
A. 大写字母为编号
1. 编号列表3
i. 罗马数字编号
I. 大写罗马数字编号 |
|
列表 |
||||||
名词1:: 相关解释 名词2:: 相关解释 |
|
注意:行首的前导空格以及双冒号后的空格 |
||||||
>> Someone's original text > Someone else's reply text My reply text |
My reply text
|
|
||||||
||Cell 1||Cell 2||Cell 3|| ||Cell 4||Cell 5||Cell 6|| |
|
表格 |
||||||
模拟输出 |
说明 |
|||||||
CamelCase 式的自动wiki页面链接 |
CamelCase 式的自动wiki页面链接
|
链接 |
||||||
* !CamelCase: 前面的叹号取消链接
* `CamelCase`: 也可以取消链接
* {{{CamelCase}}}: 同样不对其进行wiki语法解析 |
|
取消链接 |
||||||
* [[freelink]] * [[freelink|Freelink 页面]] * [[my freelink]] * [[..]] * [[../|父页面]] * [[../Sibling|兄弟页面]] * [[#anchor|指向页内链接]] * [[/SubPage|本页的子页面]] |
|
自由链接 |
||||||
这里插入一个 anchor--> <<Anchor(anchor1)>> [[#anchor1|点击这里跳转]] |
这里插入一个 anchor--> |
插入锚点 |
||||||
* http://www.ossxp.com * ftp://172.16.0.2/pub * tsvn://http://svn.ossxp.com/svn/pysvnmanager/trunk |
|
协议链接
|
||||||
* [[http://www.ossxp.com|群英汇网站]] * [[ftp://172.16.0.2/pub|ftp站点]] * [[tsvn://http://svn.ossxp.com/svn/pysvnmanager/trunk|检出代码]] |
|
自由链接
|
||||||
附件: * [[attachment:round.gif]] * [[attachment:noexist.txt]] |
附件:
|
|
||||||
* 嵌入本页面附件中图片
{{attachment:round.gif}}
* 嵌入其它页面附件中的图片
{{attachment:HelpCenter/00020_MoinMoin/bad_word.png|Bad Word|height=50}}
* 嵌入网站中图片
{{http://www.ossxp.com/m/monobook/img/star_on.png}} |
|
嵌入图片 |
||||||
模拟输出 |
说明 |
|||||||
在一行中用三个花括号括起来的嵌入文本,保持样式。可以用\n字符来换行。
{{{NoWiki text\n * another line}}} |
在一行中用三个花括号括起来的嵌入文本,保持样式。可以用\n字符来换行。 NoWiki text * another line
|
|
||||||
{{{
缺省的块语句(不加 processor)会保持其段落格式,抑制语法解析。
更上一层楼 _____
欲穷千里目 ________/
________/
_/
}}} |
缺省的块语句(不加 processor)会保持其段落格式,抑制语法解析。
更上一层楼 _____
欲穷千里目 ________/
________/
_/ |
相当于HTML的 <PRE> |
||||||
{{{
#!html
<div style="text-align: center; color: blue; background-color: yellow;">
HTML Test
</div>
}}} |
HTML Test
|
嵌入 HTML |
||||||
{{{
#!wiki caution
文字自动添加 caution 样式。
* list1
* list2
}}} |
文字自动添加 caution 样式。
|
设置DIV样式 |
||||||
{{{
#!cplusplus
int main(int argc, char *argv[])
{
printf("Hello World\n");
return 0;
}
}}} |
1 int main(int argc, char *argv[])
2 {
3 printf("Hello World
4 ");
5 return 0;
6 }
|
代码块 |
||||||
{{{#!python start=10 step=10
import sys
print sys.version}}} |
10 import sys
20 print sys.version
|
|||||||
{{{
#!comment
这是注释
}}} |
|
|
||||||
## 这是注释 /* 这也是注释 */ |
|
|
||||||
上面大部分语法,都可以在前面加上一个叹号 !,使之不按照维基语法解析。例如:
语法示例
模拟输出
!http://www.ossxp.com/
http://www.ossxp.com/
!{{attachment:noexist.txt}}
{{attachment:noexist.txt}}
这是!'''不加粗!'''字体
这是'''不加粗'''字体
这是 !<<MonthCalendar>> 宏
这是 <<MonthCalendar>> 宏
2. 表情符号
MoinMoin 维基的表情符,是把 ASCII 字符组成的一些约定俗成的表情用图片形式显示出来。
表情符号的后面需要有空格
如果表情符号不是在行首或者不是在表格标记(||)后,前面也需要添加空格
嵌入图片式语法 {{image...}} 中,也可以使用表情符号。主要用于在特定场合不能输入表情符号时,例如:
可以用宏 <<ShowSmileys>> 显示所有表情符号。下面的表情符号大全就是来自该宏的输出
3. 表格
下面是表格语法的简单示例,详细的语法参考,参见 MoinMoin 表格的中文帮助 或者 MoinMoin 表格的英文帮助
单元格合并和单元格风格设置
代码
表格示例:单元格合并与单元格风格的设置:: ||<|2> 跨两行 ||<style="width: 90%; text-align: center;"> 第一行 || || 第二行 || ||<-2> 行三跨两列 ||
输出:
- 表格示例:单元格合并与单元格风格的设置
跨两行
第一行
第二行
行三跨两列
单元格对齐
代码
单元格对齐的简洁写法:: ||<(> left ||<^|3> top ||<v|3> bottom || ||<:> centered || ||<)> right ||
输出:
- 单元格对齐的简洁写法
left
top
bottom
centered
right
4. 宏
宏是 Wiki 重要的功能扩展,相当于执行了一个外挂程序或函数,对相应的输入参数进行处理,输出各式各样的内容。
宏的常用调用语法有:
<<宏名>>
<<宏名(参数1,参数2,...)>>
下面重点介绍一些常见或者群英汇定制/增强的宏。MoinMoin 维基关于宏的帮助只作为参考,如果有差异以本文档为主。 MoinMoin 自带的宏帮助文档: 帮助-宏, HelpOnMacros
4.1. Include 宏
- Include 宏
此宏命令会把指定页面中格式化的内容包含进插入位置,并且会对指定的页面递归包含。系统将会自动探测并防止出现循环包含!
用法:
<<Include(pagename, heading, level, from="regex", to="regex", sort=ascending|descending, items=n, skipitems=n, titlesonly|titleonly, editlink|pagelink, filter|extra="opt1:value1;opt2:value2;...")>>
参数:
- pagename
需要包含的页面名。以 "/" 或者 "../" 开头的页面为相对页面,如果本参数以 "^" 开头,它将被作为正则表达式处理,并包含所有匹配的页面。
如果 pagename 是正则表达式,其中可以出现名为 sort 的具名匹配,形如 "(?P<sort>...)",则包含的页面不再按照页面标题排序,而是按照页面名称中的 sort 具名匹配来排序。
- heading
为引用部分增加一个标题(需要使用 "'" 包含,以防止其中的特殊字符过早被解释,本项为可选项)。如果使用空标题如 "",则自动使用页面名称为标题(优先使用页面中名为 page_title 的 pragma 内容作为页面标题)。(可选项)。
- level
为上一项所增加的标题定义标题级别(可用级别为1..5,本项为可选项)。如果是包含页面内容(非titleonly和titlesonly),页面内容的标题级别会自动设置为 level 之下的级别。(可选项)。
- from
需要包含页面中的部分内容时,选中内容的起始标志──可用正则表达式(可选项)。
- to
需要包含页面中的部分内容时,选中内容的结束标志──可用正则表达式(可选项)。
- sort
当 pagename 为正则表达式时,也就是以 "^" 开头时(即要包含多个页面),所包含的页面的排序方式(可选项)。
- items
当使用正则表达式匹配到多个页面时,可以用此参数限制最多能显示出的页面个数(可选项)。
- skipitems
当使用正则表达式匹配到多个页面时,可以使用此参数指定跳过前面的若干页面不显示(可选项)。
- titlesonly
包含一个指向页面的链接以及包含内容的标题形成的提纲,而不是页面的内容。以标题样式显示整个大纲(可选项)。
- titleonly
页面标题作为一个可点击的列表项显示。而 titlesonly 出了会显示包含页面内大纲外,还显示为标题样式(可选项)。
- editlink
在被包含页面的页脚增加链接,仅当页面允许编辑时显示指向被包含页面以及编辑被包含页面的链接,如果无权编辑页面,则不显示任何链接(可选项)。
- pagelink
在被包含页面的页脚增加链接,当页面允许编辑时显示指向被包含页面以及编辑被包含页面的链接,如果无权编辑页面,仅显示到被包含页面的链接(可选项)。
- filter 或者 extra
附加参数提供对 Include 宏更多的控制(可选项)。
user:anonymous ── 含义为仅对匿名(未登录状态)访问Web页面执行该 Include 宏,对于登录账号,不执行该宏。
user:known ── 含义为仅对登录账号执行该 Include 宏,对于匿名(未登录状态)访问 Web页面,则不执行 Include 语句。
subpages:yes|no ── 当被包含页面是一个分类页面,该 Include 宏包含或者不包含该分类下的子页面。
subcategories:yes|no ── 当被包含页面是一个分类页面,该 Include 宏包含或者不包含该分类的子分类。
recursive:yes|no ── 当使用了 subpages 或 subcategories 时,是否进行递归包含。
除了 pagename 以外的其他参数均为可选项,群英汇增强的 Include 宏,除了 heading 参数和 level 参数外,其它参数的顺序无须顾虑。level参数只有在提供 heading 参数(空标题亦可)时才能出现。heading 参数可以被省略而无须占位符。
示例:
<<Include(FooBar)>> -- 将页面 !FooBar 的内容包含入当前段落。
<<Include(FooBar,"Foo Bar")>> -- 为包含的内容增加一个内容为 'Foo Bar' 的H1标题, FooBar 内容如果包含标题,则自动在级别1下重排。
<<Include(FooBar,"", 2)>> -- 为包含的内容增加一个内容为 'Foo Bar' 的H2标题, FooBar 内容如果包含标题,则自动在级别2下重排。
<<Include(FooBar, 'All about Foo Bar', 2)>> -- 增加一个 'All about Foo Bar' 的H2标题
<<Include(FooBar, from="^----$")>> -- 仅包含第一条横线后的内容
<<Include(FooBar, to="^----$")>> -- 仅包含第一条横线以前的内容
<<Include(^FooBar/.*, sort=descending)>> -- 使包含的页按页面名称的字母顺序降序排列
<<Include(^FooBar/.*, items=3)>> -- 最多包含入3个页面
<<Include(^BlogBase/.*, to="^----$", sort=descending, items=7)>> -- 最多显示一个星期的blog项目
<<Include(^BlogBase/.*, to="^----$", sort=descending, items=7, skipitems=7, titlesonly)>> -- 仅显示上个星期的标题
您可以将本宏命令与 MonthCalendar宏 结合使用来实现 blogging 功能:
<<Include(^FirstnameLastname/20..-..-..,,to="^----",sort=descending,items=3)>> -- 显示月历中的最近的三个项目
<<Include(^FirstnameLastname/20..-..-..,,to="^----",sort=descending,items=4,skipitems=3,titlesonly)>> -- 只显示下面的4个标题
4.2. NewPage 宏
- NewPage 宏
提供一个创建页面的对话框,方便用户创建(子)页面, 使用 PageTemplate 作为新页面的模板, NameTemplate 用于名字模板和用户输入的页面名组合形成新页面的名称。
用法:
<<NewPage(PageTemplate,ButtonLabel,ParentPage[,NameTemplate])>>
<<NewPage(PageTemplate,ButtonLabel,parentPage[, NameTemplate] [, type="select"] [, layout=""] [, category=""] [, validate="")]>>
参数:
- PageTemplate
创建新页面的模板。
PageTemplate 为一个字符串,该字符串指定模板名称。新页面以该模板页面为原型创建。或者
PageTemplate 为 python 的 dict 类型,支持根据多个模板创建新页面。Dict 的索引为模板名称(或者逗号分隔的模板名称以及页面归属的分类),键值为显示在下拉列表或者radio 中的名称。示例:单一模板文件
代码:
<<NewPage(缺省权限页面模板)>>
示例输出:
多模板: 用户从下拉框中选择模板 AbcTemplate 还是 XyzTemplate。新页面创建在 Meetings 下面。新页面名称为 "年-月-日_用户输入的页面名称"。新页面被自动加入分类 CategoryX 和 CategoryY。
代码:
<<NewPage({"AbcTemplate":u"模板一","XyzTemplate":u"模板二"}, "创建新页面",会议,%Y-%m-%d_%s, category="会议纪要类,CategoryMeeting")>>
示例输出:
多模板: 用户从下拉框中选择模板。新页面创建在 "会议" 下面。新页面名称为 "年-月-日_用户输入的页面名称"。新页面根据模板的选择自动加入不同分类。
代码:
<<NewPage({"公司会议模板,公司会议纪要类":u"公司会议纪要","部门会议模板,部门会议纪要类":u"部门会议纪要"}, 创建新页面, @PAGE, %Y-%m-%d_%s, type=radio)>>
示例输出:
- ButtonLabel
对话框的提交按钮名称。
- ParentPage
指定父页面名称,即在此页面下创建新页面。可以使用参数 @SELF 或者 @PAGE。
@SELF : 当前页面(包含该 NewPage 宏的页面)名称。
@PAGE : 请求的页面名称。当包含 NewPage 宏的页面被"页面A"包含,访问“页面A” 时, @PAGE 设定为“页面A”。
- NameTemplate
页面名称。如果 NameTemplate 中包含 %s,则显示表单,用户可以自定义页面名称,页面名称会替换 NameTemplate 中的 %s 而组成页面名称。
- type
多分类模式下,分类选择的方式,缺省为 "select"
type=select : 下拉菜单选择模板
type=radio : radio 风格选择模板
- layout=
用于定制 HTML 提交表单,缺省为空,即使用预定义格式的表单。缺省表单如下:
<table class="borderless"> <tr> <td>""" + _("Input title: ") + """</td><td>%(input)s</td></tr> <tr> <td>""" + _("Select template: ") + """</td><td>%(select)s</td></tr> <tr><td colspan="2" align="right">%(button)s</td></tr> </table>
- category
逗号分隔的分类名称,该分类被自动添加到新页面中
- validate
根据参数确定验证用户输入的合法性。
validate=category : 页面名称必须是合法的分类名称
validate=nocategory : 页面名称不能是分类名
validate=template: 页面名是模板
validate=notemplate: 页面名不能是模板
validate=group: 页面名是组名
validate=nogroup: 页面名不能是组名
validate=dict: 页面名是词典
validate=nodict: 页面名不能是词典
示例:
4.3. ShowCategory 宏
- ShowCategory 宏
一般嵌入到分类页面中,提供更好的分类页面显示。过去分类页面为了显示子分类或者子页面,往往用 FullSearch 宏,效率低下而且界面难看。ShowCategory 宏读取分类索引缓存提高效率,而且采用 MediaWiki 页面样式展示分类。
分类页面的创建大大简化,一般仅在分类页面中只放入一条 <<ShowCategory>> 语句即可。
用法:
<<ShowCategory>>
<<ShowCategory(all)>>
<<ShowCategory(分类名,参数...)>>
参数
说明: 所有布尔值参数,例如 summary, 可以通过 summary=0 或者 summary=false 或者 nosummary 设置为 False,
可以通过 summary 或者 summary=1 或者 summary=yes 设置为 "真"。
参数也可以缩写,只要不合其它参数的缩写冲突即可。例如 summary 可以缩写为 su,nosummary 可以缩写为 nosu。
下面参数之外的关键字作为分类名称。
all 显示所有分类。
如果没有指定分类,使用当前页面名称作为分类。
- categories
是否显示子分类。缺省是
- pages
是否显示分类包含的页面。缺省是
- summary
是否显示分类说明等信息。缺省是
- capital
是否显示排序头文字。缺省是
- templates
是否显示模板文件。缺省否
- ascending|descending
排序方式是正序还是逆序。缺省为正序
- recursive
是否递归查找子分类或者分类包含的页面?。缺省否
- sort
排序方式。缺省为 "title" 即按照标题排序
title: 按照标题排序
timestamp: 按照时间绰排序
- column
缺省按照3列显示。
- items
显示的条目总数
- skipitems
跳过的条目数
示例:
Code
Description
<<ShowCategory(CategoryNews)>>
显示分类 CategoryNews 页面,其中包含 CategoryNews 的子分类和子页面列表。
<<ShowCategory>>
显示当前页面的分类说明页面,包含子分类和子页面索引。
当前页面应该为一个分类页面 <<ShowCategory(all)>>
显示所有分类。参见页面:IndexPage
<<ShowCategory(CategoryNews, nocategories)>>
仅显示分类 CategoryNews 的子页面,不显示子分类
<<ShowCategory(CategoryNews, nopages)>>
仅显示分类 CategoryNews 的子分类,不显示子页面
<<ShowCategory(CategoryNews, nocat, nosummary)>>
不显示子分类,也不显示分类说明,仅仅显示子页面列表
<<ShowCategory(CategoryNews, nocapital,nosum)>>
不显示分类说明,也不显示排序的题头字母
<<ShowCategory(CategoryNews, recursive, descending)>>
递归显示子分类以及子页面,逆序排列
<<ShowCategory(CategoryNews, rec, cat=0, items=20,skipitems=5,column=2,sort=timestamp)>>
不显示分类,仅显示子页面,按照页面修改时间排序,跳过前5条记录,总共显示20条,并分两列显示
参考:
4.4. jQuery 宏
- jQuery 宏
jQuery 是一个成熟和强大的 JavaScript 扩展框架,往往只需要向网页中添加一个简单的 JavaScript脚本,就可以为网页添加绚烂的特效。jQuery 宏 命令会根据不同的参数包含不同的 JavaScript 脚本到网页中。
用法:
<<jQuery>>
会在网页中嵌入 <script type="text/javascript" src="/m/common/js/jquery.js"></script>
<<jQuery(extension)>>
会执行名为 '<extension>' 的扩展,或者
简单的包含名为 jquery_<extension>.js 脚本到页面中。
<<jQuery(extension, args...)>>
提供使用参数 args,调用 extension.
4.4.1. jQuery(example)
该扩展简单的包含 jquery.js 和 jquery_example.js 到页面中。 凡是在 Example 样式的文字块中定义的附件或者外部图片,自动添加消隐功能
示例代码
<<jQuery(example)>> {{{#!wiki Example * [[attachment:jquery_example.js|Click to view code: jquery_example.js]] * [[attachment:no_lastchild_for_ie.png]] * [[http://www.ossxp.com/HelpCenter/00000_OSSXP/AboutUs_Slide?action=AttachFile&do=get&target=animate.gif|Click to display external image]] }}}
显示效果
4.4.2. jQuery(mark)
该扩展简单的包含 jquery.js 和 jquery_mark.js 到页面中。
为列表中最后一个 li 元素添加 'last-child' 样式;
目的是修正 IE 无法对列表的最后一个元素进行定制的缺陷;
在 "组织结构图" 等页面中,需要使用该扩展,以便在 IE 和 Firefox 中有一致的显示。
示例代码
<<jQuery(mark)>> {{{#!wiki tree {icon:building} Company * {icon:person} CEO: Name of CEO * {icon:building} R&D Dept * {icon:person} CTO - Name of CTO * {icon:persons} Devs - Dev1, Dev2, Dev3 }}}
演示效果
使用 <<jQuery(mark)>> 宏的效果:
-
Company
CEO: Name of CEO
R&D Dept
CTO - Name of CTO
Devs - Dev1, Dev2, Dev3
-
不使用 <<jQuery(mark)>> 宏,在 MicroSoft IE 中可能的显示效果:
4.4.3. jQuery(toggle)
参考了 jQuery plugin: Animated Collapsible DIV,增加文字块缩放的特效。
该 jQuery 插件的调用稍微复杂,需要针对每个显示区域进行设置,并设置按钮样式,因此需要多次用不同的参数调用该插件。
用法:
<<jQuery(toggle, set, #id|.class, fade=1,hide=1,group=demo,persist=1)>>
<<jQuery(toggle, show, #id|.class, type=radio|button|link, name=name, text=text)>>
<<jQuery(toggle, hide, #id|.class, type=radio|button|link, name=name, text=text)>>
<<jQuery(toggle, toggle, #id|.class, type=radio|button|link, name=name, text=text)>>
其中:
toggle 插件的第一个参数代表动作,其余参数用于对该动作进行设定。
set 动作是设定显示区域的属性
show/hide/toggle 显示按钮。其中 show 具有显示区域功能,hide具有隐藏功能,toggle是切换显示和隐藏
#<id> 或者 .<class> 用于指定区域
name 用于设定分组
type 用于设定显示的按钮的样式: radio 或者按钮,或者文字链接
text 用于设定按钮的文字
说明:
只要该插件被调用,就会一次性包含相关 JavaScript 脚本并做相应的初始化。
<script type="text/javascript" src="/m/common/js/jquery_3stateradiobutton.js"></script> <script type="text/javascript" src="/m/common/js/jquery_animatedcollapse.js"></script> <script type="text/javascript">animatedcollapse.init();</script>
调用该插件的 set 方法,设置各个显示区域的属性:相关区域的 id 或者 css_class,区域是否分组,初始是隐藏还是显示,是否需要淡入淡出效果等。
<<jQuery(toggle,set,.region1,hidden=1,group=demo,fade=1)>> <<jQuery(toggle,set,.region2,hidden=1,group=demo,fade=1)>> <<jQuery(toggle,set,.region3,hidden=1,fade=1)>>
调用该插件三个方法: show(显示区域), hide(隐藏区域), toggle(切换显示和隐藏状态),以显示按钮。相关的参数设置:按钮控制的区域(用相关区域的 id 或者 css_class 表示),按钮的类型(按钮或者radio),按钮文字等:
<<jQuery(toggle,show,.region1,.region2,.region3,type=button,text=显示所有)>> <<jQuery(toggle,hide,.region1,.region2,.region3,type=button,text=隐藏所有)>> <<jQuery(toggle,toggle,.region1,type=radio,name=grp1,text=显示1)>> <<jQuery(toggle,toggle,.region2,type=radio,name=grp1,text=显示2)>> <<jQuery(toggle,toggle,.region3,type=button,text=显示3)>>
在 Wiki 页面中定义 ID 或者 css_class 名称:
{{{#!wiki region1 hidden left ~+'''文字块1'''+~ 这是文字块 1 的内容... }}}
示例代码
<<jQuery(toggle)>> <<jQuery(toggle,set,.region1,hidden=1,group=demo,fade=1)>> <<jQuery(toggle,set,.region2,hidden=1,group=demo,fade=1)>> <<jQuery(toggle,set,.region3,hidden=1,fade=1)>> <<jQuery(toggle,show,.region1,.region2,.region3,type=button,text=显示所有)>> <<jQuery(toggle,hide,.region1,.region2,.region3,type=button,text=隐藏所有)>> <<jQuery(toggle,toggle,.region1,type=radio,name=grp1,text=显示1)>> <<jQuery(toggle,toggle,.region2,type=radio,name=grp1,text=显示2)>> <<jQuery(toggle,toggle,.region3,type=button,text=显示3)>> {{{#!wiki region1 hidden left ~+'''文字块1'''+~ 这是文字块 1 的内容... }}} {{{#!wiki region2 hidden left ~+'''文字块2'''+~ 这是文字块 2 的内容... }}} {{{#!wiki region3 hidden left ~+'''文字块3'''+~ 这是文字块 3 的内容... }}}
演示效果
-
显示1
显示2
4.5. MiniPage 宏
4.5.1. MiniPage 宏
- MiniPage 宏
MoinMoin 的表格语法功能不强,单元格难以嵌入多行文本。MiniPage 宏可以解决在表格中嵌入多行 wiki 格式化内容的难题。
MiniPage 把传递给它的参数作为一个字符串进行处理,无须在字符串两端添加引号
对其中的 \n 替换为换行符,这样单行文本转换为多行文本
将替换后的多行文本交由 Wiki 语法解析器处理,并将结果输出
用法:
<<MiniPage(...)>>
示例代码:
||cell 1 ||cell 2|| ||{{{line 1:\nline 2:}}} ||<<MiniPage(2H,,2,,+O,,2,,=2'''H,,2,,O'''\n\na^2^+b^2^=c^2^)>>||
显示效果:
cell 1
cell 2
line 1: line 2:
2H2+O2=2H2O
a2+b2=c2
4.5.2. ThisPage 和 OtherPage 宏
ThisPage 和 OtherPage 宏是 MiniPage 宏的两个变体。区别在于:
ThisPage 宏的内容只显示在本页面,当本页面被其它页面包含时不会被显示;
OtherPage 宏则正好相反。内容在本页面不显示,仅当本页面被其它页面包含时才会在其它页面中显示;
示例代码:
||cell 1 ||cell 2|| ||{{{line 1:\nline 2:}}} ||<<OtherPage(2H,,2,,+O,,2,,=2'''H,,2,,O'''\n\na^2^+b^2^=c^2^)>> <<ThisPage(Only display something when included by other page.)>> ||
显示效果:
cell 1
cell 2
line 1: line 2:
2H2+O2=2H2O
a2+b2=c2
4.6. StatsChart(contribute) 数据统计宏
- StatsChart(contribute)
是对宏 StatsChart 做的扩展,提供维基贡献率查询界面。关于宏 StatsChart 的其它用法,参见: EventStats
用法:
<<StatsChart(contribute)>>
示例:
参见页面: 排行榜
4.7. MonthCalendar 宏
- MonthCalendar 宏
可用于个人信息管理,整合日历功能。
用法:
<<MonthCalendar(BasePage, Year, Month, MonthOffset, MonthOffset2, Height6, Maniversary, Template)>>
参数:
- BasePage
新页面在此页面下创建,缺省为当前页面下创建。BasePage 可以是相对页面名
- height6
是否以6行显示月历。若为0,则根据情况显示4行到6行月历。若大于0,则始终显示6行(有的月份出现空行)
- Maniversary
为1,则创建子页面格式为 MM-DD(即没有年);若 Maniversary 为0,则子页面格式为 YYYY-MM-DD
- Template
是创建子页面的模板名称
示例:
当前月份月历: <<MonthCalendar>>
上一个月份月历: <<MonthCalendar(,,,-1)>>
下一个月份月历: <<MonthCalendar(,,,+1)>>
SampleUser 12月份月历: <<MonthCalendar(SampleUser,,12)>>
2001/12 + 2 个月后的月历: <<MonthCalendar(,2001,12,+2)>>
显示多个用户月历: <<MonthCalendar(MyPage*TestUserA*TestUserB)>>
新创建的日历条目以 MonthCalendarTemplate 为模板:
<<MonthCalendar(,,,,,,MonthCalendarTemplate)>>
显示 2002 年全年月历 (每个月历显示6行):
Calendar of year 2002 (every month padded to height of 6): ||||||Year 2002|| ||<<MonthCalendar(,2002,1,,,1)>>||<<MonthCalendar(,2002,2,,,1)>>||<<MonthCalendar(,2002,3,,,1)>>|| ||<<MonthCalendar(,2002,4,,,1)>>||<<MonthCalendar(,2002,5,,,1)>>||<<MonthCalendar(,2002,6,,,1)>>|| ||<<MonthCalendar(,2002,7,,,1)>>||<<MonthCalendar(,2002,8,,,1)>>||<<MonthCalendar(,2002,9,,,1)>>|| ||<<MonthCalendar(,2002,10,,,1)>>||<<MonthCalendar(,2002,11,,,1)>>||<<MonthCalendar(,2002,12,,,1)>>||
4.8. MailTo 宏
通过使用 MailTo 宏,您可以放心的将邮件地址写在wiki中,不必担心邮件地址被垃圾邮件程序收集(这种机器人程序专门收集电子邮件地址),或被垃圾邮件制造者非法使用。
用法:
<<MailTo(Firstname DOT Lastname AT example DOT net)>>
<<MailTo(Firstname DOT Lastname AT example DOT net, link text)>>
如果禁止了匿名查看页面维基源码,这样写也可以:
<<MailTo(Firstname.Lastname@example.net)>>即邮件地址在 Wiki 代码中即使没有换码也会在页面输出的时候加以保护。
这个宏应该做些什么?
我们需要区分已登录用户和匿名用户(其中包含了垃圾邮件机器人程序)。
已登录用户应该可以看到邮件地址,并且应该可以通过点击链接来使用该邮件地址。
匿名用户的情况比较棘手 — 他们可能是“普通”用户,也可能是一些专门收集邮件地址的人或者其他什么东西(比如,垃圾邮件机器人)。这些邮件地址可能被滥用于发送商业邮件,这也是因特网上普遍存在的问题。
对于已登录用户,他们将看到下面的结果:
对于匿名用户
MoinMoin原始的实现是对匿名用户,输出形如 Firstname DOT Lastname AT example DOT net 的地址。我们觉得并非最好的解决方案,因为对于商业网站,可能会导致部分用户无法和我们联系,或者需要无谓的说明和解释。 改进后,匿名用户(比如垃圾邮件机器人程序和其它用途的机器人程序)将会得到 JavaScript 编码或者 url-encode 编码的邮件地址。但在浏览器的输出中,将显示正常的邮件地址并且也可以点击。
因为人是通过浏览器访问网站,会自动对 JavaScript 或 url-encode 编码进行解析,但是对于一个自动化的机器人,会形成阻碍,不能从中提取出有用信息,因而忽略它。这个宏命令就达到了它的目的,防止垃圾邮件。
示例代码:
这是我的邮件地址 <<MailTo(worldhello DOT net AT gmail DOT com, 蒋鑫)>>
演示效果:
这是我的邮件地址
参考:
4.9. FreeMind 宏
- FreeMind 宏
可以在页面中嵌入 FreeMind 的 Flash 插件以显示嵌入式的脑图。
示例:
<<FreeMind( urlOfMindmap )>>
<<FreeMind( urlOfMindmap, width )>>
<<FreeMind( urlOfMindmap, width, height )>>
4.10. Hello 宏
- Hello 宏
您可以把 Hello 宏看作是 Hello world! 因为它是如此的简陋
主要对时间参数进行处理,以更好的显示
例如显示: 今天, 今年, 去年, ...
用法:
<<Hello(type, text)>>
参数:
- type
时间类型。可用的类型有: day, week, month, year
- text
时间字符串
示例:
<<Hello(day, 2009-01-31)>>
根据当前时间的不同,可能显示为: 昨天,今天,明天,或者原样显示 2009-01-31
<<Hello(week, 2009年第5周)>>
根据当前时间的不同,可能显示为: 上一周,本周,下一周,或原样显示 2009年第5周
<<Hello(year, 2005/8/31)>>
根据当前时间的不同,可能显示为: 去年,今年,明年,或原样显示 2005/8/31
4.11. 其它宏
- <<Anchor(anchorname)>>
定义锚点
- <<BR>>
换行符
- <<TableOfContents([maxdepth])>>
显示目录
- <<RecentChanges>>
显示最新改动
- <<AttachList(pagename,mimetype)>>
附件列表
- <<TitleIndex>>
页面列表
- <<WantedPages>>
未撰页面
- <<OrphanedPages>>
孤儿页面,未有其它页面链接到
- <<AbandonedPages>>
很长时间未编辑页面,疑似废弃页面
- <<RandomPage>>
随机页面
- <<EditedSystemPages>>
被更改了的系统页面
- <<Action(action [,text])>>
动作链接
- <<AdvancedSearch>>
搜索对话框
- <<SystemInfo>>
系统信息
参见:
5. 变量
变量由形如 @变量名@ 语法定义的变量,会以实际值输出。
有的变量会在页面预览时,就完成以实际内容替代变量
有的变量(例如和保存页面时间相关),在页面保存时才会以实际值正式替代变量输出
对于模板页面(页面名称为 XYZTemplate 或者 XYZ模板),页面保存变量保持不变。只有当依据该模板文件创建新的非模板页面时,完成变量到实际值的替换
5.1. 预定义的变量
下列变量在保存页面时或者在预览时,会被替换。
变量
描述
例子
@PAGE@
页面的名称
@ROOTPAGE@
根页面的名称
@SUBPAGE@
页面名称中除去父页面的剩余部分
变量
@TODAY@
今天的日期
2007-11-22
@PAGEDATE@
页面名称中如果出现日期,则提取出来作为日期,否则使用当前日期
2007-11-22
@YEAR@
从 @PAGEDATE@ 中提取出来的年份
2007
@MONTH@
从 @PAGEDATE@ 中提取出来的月份
11
@DAY@
从 @PAGEDATE@ 中提取出来的日期
22
@WEEK@
从 @PAGEDATE@ 中提取出来的星期(00 到 53),一年中第一个星期一为第 01 星期的开始
47
@ISOWEEK@
从 @PAGEDATE@ 中提取出来的星期(01 到 53),第 01 星期必须至少有4天在该年度内
2007 年第 #47 周
@MONDAY@
@PAGEDATE@ 所在的星期的星期一
2007-11-19
@TUESDAY@
@PAGEDATE@ 所在的星期的星期二
2007-11-20
@WEDNESDAY@
@PAGEDATE@ 所在的星期的星期三
2007-11-21
@THURSDAY@
@PAGEDATE@ 所在的星期的星期四
2007-11-22
@FRIDAY@
@PAGEDATE@ 所在的星期的星期五
2007-11-23
@SATURDAY@
@PAGEDATE@ 所在的星期的星期六
2007-11-24
@SUNDAY@
@PAGEDATE@ 所在的星期的星期日
2007-11-25
@ME@
我的登录名
jiangxin
@MYNAME@
我的姓名/别名或者登录名
蒋鑫
@USERNAME@
用户名 (或者他的IP/domain)
@USER@
签名,相当于在@USERNAME@ 前加上了两个减号 "-- "
-- 蒋鑫
@SIG@
相当于在签名 @USER@ 后又添加了日期: "-- loginname date time"
在预览时,替换为 -- loginname @TIME@ -- 蒋鑫 2007-11-22 08:53:13
@EMAIL@
我的邮件地址(经过 MailTo 宏处理)
下列变量在保存页面时,才会被替换。注意和上面的变量不同点在于,下面的变量在预览时不会被替换!
变量
描述
例子
@DATE@
以系统格式表示的当前日期
2007-11-22
@TIME@
以用户格式表示的单前日期和时间
2007-11-22 08:53:13
@SIG@
带有日期的签名 "-- loginname date time"
在预览时,替换为 -- loginname @TIME@ -- 蒋鑫 2007-11-22 08:53:13
5.2. 字典文件
可以使用字典页面定义扩展变量。字典页面 是以页面名称以 Dict 结尾的页面,如: GlobalDict 页面。
5.2.1. 在词典页面中自定义扩展变量
在字典页面中添加变量非常简单,只需加上一条名词解释记录(用双冒号分隔的关键字和取值)即可。示例:
CompanyName:: 我的公司名称 WikiSiteUrl:: http://www.moon.ossxp.com/wiki/ 行政部接口:: 邢政 (xingzheng)
条目开头的空格和 '::' 之后的空格必不可少。
5.2.2. 从字典中获取自定义变量
可以使用GetVal 宏获取变量值:
* <<GetVal(GlobalDict,CompanyName)>> * <<GetVal(GlobalDict,WikiSiteUrl)>> * <<GetVal(GlobalDict,行政部接口)>>
显示为(如果没有显示,检查 GlobalDict 文件是否存在,以及是否定义上述变量):
- 北京群英汇信息技术有限公司
- http://www.ossxp.com/
- 邢政 (xingzheng)
5.2.3. 特殊字典文件:用户字典文件和全局字典文件
- 用户字典文件
是用户自己的页面下创建的 MyDict 子页面。如 jiangxin/MyDict。当用户 jiangxin 登录后,凡是在 jiangxin/MyDict 中声明的变量,都可以用 @变量名@ 引用。并且在预览或者保存时完成变量替换。
- 全局字典文件
页面 GlobalDict 是全局字典页面。任何用户均可以使用 @变量名@ 语法引用 GlobalDict 中变量。并且在预览或者保存时完成变量替换。
示例:在页面中引用全局字典的变量如下
* @CompanyName@
* @WikiSiteUrl@
* @行政部接口@
输出如下:
我的公司名称
邢政 (xingzheng)
注意: 在特殊字典中的变量同样可以用 <<GetVal(字典名, 变量名)>> 来引用,和使用 @变量名@ 的不同点在于,使用宏可以随着字典文件中定义的改变而改变。而用变量方式,一次性完成替换,在字典条目改变甚至删除后,都不会受到影响。
6. 特殊页面
根据页面名称,有四类特殊页面:分类页,模板页,词典页,用户组页。
有的页面中的特定语法被提取出来(词典页,用户组页),处理后为其它语法所引用。
模板页提供其它页面创建的模板和基础。
分类页,提供一个显示页面分类(归类)信息的场所
四类页面之间以及和其它页面的区分,完全依靠的是文件名。
在配置文件中缺省定义了正则表达式,决定了什么样的页面是哪一种特殊页面:
page_category_regex = ur'(?P<all>(?P<prefix>Category)?(?P<key>(?!Template)\S+)(?(prefix)|类(/.*)?))' page_dict_regex = ur'(?P<all>(?P<key>\S+)Dict)' page_group_regex = ur'(?P<all>(?P<key>\S+)Group)' page_template_regex = ur'(?P<all>(?P<key>\S+)(Template|模板))'
分类页: 以 Category 开头或者以 类 结尾的页面是分类页面。分类页面的任何子页面也都是分类页面。CategoryTemplate 不是分类页面而是模板页面。CategoryCategory 默认应该是所有分类页面的祖宗,即所有分类页面都应该加入到该分类中。
模板页: 以 Template 或者以 模板 结尾的页面是模板页面。
词典页: 以 Dict 结尾的页面是词典页面。
用户组页: 以 Group 结尾的页面是用户组页面。
6.1. 分类页
- 分类页
以 Category 开头或者以 类 结尾的页面是分类页面。分类页面的任何子页面也都是分类页面。CategoryTemplate 不是分类页面而是模板页面。CategoryCategory 默认应该是所有分类页面的祖宗,即所有分类页面都应该加入到该分类中。
如何将一个页面添加到一个分类?
分类的名称必须和分类页面的命名规则相同,即: CategoryHomepage, 会议纪要类, 群英汇帮助类 等都是合法的分类名称。
在一个页面的最后,添加代码:四个横线 + 换行 + 空格分开的分类名称列表, 就将该页面添加到相应的分类中。
如下代码,即将该页面添加到两个分类: 人大常委会议纪要类 和 政协常委会议纪要类
---- [[人大常委会议纪要类]] [[政协常委会议纪要类]]
分类和分类页的关系:
分类的存在与否和是否存在分类页面,以及分类页面 的内容为何,没有关系。
只要页面的最后包含特定语法:四个横线 + 换行 + 空格分开的分类名称列表,相应的分类自然而然就形成了。
分类页面中也可以使用特定语法: 四个横线 + 换行 + 空格分开的分类名称列表,形成分类的层级关系,以及将所有分类都纳入到约定俗成的分类祖宗 CategoryCategory 中。
群英汇扩展的语法简化了分类页面的创建,例如: 群英汇帮助类 的主要内容如下:
<<ShowCategory>> ---- CategoryCategory
参见:
6.2. 模板页
- 模板页
以 Template 或者以 模板 结尾的页面是模板页面。如: HomepageTemplate, CategoryTemplate, 博客条目模板, 工作周报条目模板 等。
模板中的变量:
模板经常和变量伴生。即模板的内容中经常使用变量指代一些要替换的内容,如:时间,登录用户名等
写在一般页面中的变量在预览和保存时会被替换,而保存在模板中的变量不会被替换。只有由模板派生新页面时,在新页面(非模板页面)中相应变量才被替换
参见: 关于变量的帮助
何时会使用模板?
创建新页面:在 URL 中输入新页面地址,或者点击不存在页面的链接
在创建新页面时,模板列表提供给用户,用户可以选择以某个模板文件为原型创建新页面,这样达到了简化页面创建和减少重复输入的效果
NewPage 宏, MonthCalendar 宏中使用模板
NewPage 宏, MonthCalendar 宏提供了模板参数,用户可以传递模板页面名称到这些宏中,让这些宏创建的新页面更加规范和专业。参见:
6.3. 词典页
- 词典页
以 Dict 结尾的页面是词典页面。一般词典页面只出现名词解释语法。每一行是一个名词解释,即定义了一个词条,多个词条形成了一个词典。
例如 GlobalDict 词典中可能有如下内容:
CompanyName:: 北京群英汇信息技术有限公司 WikiSiteUrl:: http://www.moon.ossxp.com/wiki/ 行政部接口:: 邢政 (xingzheng)
于是词典 GlobalDict 就定义了关于 CompanyName, WikiSiteUrl, 行政部接口 等词条。可以通过下列方法在其它页面中引用。
GetVal 宏
可以使用GetVal 宏获取变量值:
* <<GetVal(GlobalDict,CompanyName)>> * <<GetVal(GlobalDict,WikiSiteUrl)>> * <<GetVal(GlobalDict,行政部接口)>>
显示为(如果没有显示,检查 GlobalDict 文件是否存在,以及是否定义上述变量):
- 北京群英汇信息技术有限公司
- http://www.ossxp.com/
- 邢政 (xingzheng)
- 北京群英汇信息技术有限公司
特殊的词典页面: GlobalDict, 用户主页的子页面 MyDict 中定义的词条,可以通过 @变量@ 直接引用,并在页面预览或者保存时完成替换。如
输入 ''@CompanyName@'' 替换为 北京群英汇信息技术有限公司
输入 ''@WikiSiteUrl@'' 替换为 http://www.moon.ossxp.com/wiki/
输入 ''@行政部接口@'' 替换为 邢政 (xingzheng)
参见:
6.4. 用户组页
- 用户组页
以 Group 结尾的页面是用户组页面。用户组页中的一级列表被提取出来作为该用户组包含的用户名。用户组主要用于 授权。
如何创建一个用户组?
创建一个新页面,页面名称要以 Group 结尾,于是就创建了一个新的用户组。用户组的名称即为新创建的页面名。
如何将一个用户添加到一个用户组?
编辑相应的用户组页面
将用户的 登录ID 以一级列表的形式添加。也可以用 [[登录ID|用户真名]] 的可点击的格式添加。
例如
用户组 acl/MeetingsGroup 内容如下:
acl/MeetingsGroup:: [[acl/MeetingsGroup|可以读取、编辑会议记录]]。 == 用户列表 == * JiangXin * [[wangqiang|王强]] * [[acl/ManagerGroup]]
则用户 JiangXin, wangqiang, acl/ManagerGroup 组的用户都属于用户组 acl/MeetingsGroup。
用户组中的特殊用户
用户组可以嵌套,即可以在一个用户组中包含其它用户组。只要在用户组的用户名单中,将以 Group 结尾的用户组加到列表中即可
Known: 代表全体注册用户
All: 所有用户包含匿名用户
参见:
7. PI:处理指令
- MoinMoin 维基的数据处理指令
在页面的头部定义的,由一些连续的以 "#" 字符开头的关键字加上一些可选的参数组成的行。
PI处理指令的特征
PI处理指令的关键字是大小写敏感的
由两个井字符号开头的行是注释行,将被忽略。注释语句可以出现在文档的任何地方
任何其它行包括空行都终止对 PI处理指令的解析。即只有文件头的特殊语句才被当做 PI 处理
指令名称 |
格式 |
说明 |
示例 |
## |
## comment |
注释。注释语句可以出现在文本的任何地方 |
## 注释 ## 这里的任何文字都会被忽略 |
#format |
#FORMAT parser options |
页面使用的语法解析器。
|
## 使用 zh 样式 ## 即段落首行缩进两个空格 #format wiki zh |
#redirect |
##REDIRECT PageName |
页面重定向,直接跳转到某页面 |
#redirect Main |
#refresh |
#REFRESH 延迟 目标 |
在指定的延迟时间到达时重定向到其他页面或外部URL链接。 需要在设置中激活,请看帮助-系统设置 |
#refresh 0 FrontPage #refresh 5 http://example.com/ |
#pragma |
#PRAGMA section-numbers 1|on #PRAGMA section-numbers 0|off #PRAGMA section-numbers 2-6 |
转换标题行自动编号功能。
|
#pragma section-numbers on #pragma section-numbers off #pragma section-numbers 3 |
#PRAGMA page_title text... |
设定页面的标题。
|
#pragma page_title PI 处理指令 |
|
#PRAGMA notify on|off |
允许或禁止变更的邮件通知
|
#pragma notify off |
|
#PRAGMA keywords kw1, kw2, ... |
在<meta> 标签中增加关键字,用于搜索引擎优化 |
#pragma keywords Cars, Vehicles, Foo |
|
#PRAGMA description text... |
在<meta> 标签中增加对当前页面的描述。 |
#pragma description Something about cars. |
|
#pragma supplementation-page on|off |
启用或者禁用讨论页 |
#pragma supplementation-page on |
|
#DEPRECATED |
将该页标记为不推荐使用的。 添加 #DEPRECATED 后,对该页的后续更改将不创建任何备份版本,并且在显示该页时将同时显示最新版本内容和最后一个备份版本的内容(未添加 #DEPRECATED 前的版本)。
|
#DEPRECATED |
|
#language |
#language language-name |
指定网页语言。语言名应符合iso-639-1规范。如果MoinMoin/i18n/中没有该语言的翻译文件,MoinMoin会忽略这个指令。 |
#language zh |
#acl |
#acl [+-]User[,SomeGroup,...]
:[right[,right,...]]
[[+-]OtherUser:...]
[[+-]Trusted:...]
[[+-]Known:...]
[[+-]All:...]
[Default] |
授权指令。详见: 关于授权的帮助 |
#acl SomeUser:read,write All:read |
参考:
8. 授权
- 文内链接
/变量 /基本语法 /处理指令 /宏 /宏/FreeMind /宏/Hello /宏/Include /宏/MailTo /宏/MiniPage /宏/MonthCalendar /宏/NewPage /宏/ShowCategory /宏/StatsChart /宏/jQuery /授权 /特殊页面 /表情符号 /表格