simonw代码@痕记

导航

雕虫小技之为Discuz论坛添加Wiki语法

目标是使在论坛中的特定语法能够被解析为Wiki实际的url, 如 http://wiki.cwowaddon.com/关键字

需要支持以下2种论坛语法:

  1. 使论坛支持 [wiki]关键字[/wiki] 这样的语法.
  2. 使论坛支持wiki特定的引用语法, 如在MoinMoin wiki下是 ["关键字"], 在MediaWiki下是 [[关键字]].

 

原理是使用语法扫描器在页面解析的时候扫描帖子内容, 对专门的语法实施特定文本替换.

实施:

viewthread.php文件

负责展现帖子的程序是viewthread.php这个文件, 打开并定位到大约330多行左右, 可以看到下面的代码, 这里正是对帖子内容进行语法替换的地方, 我们在这下面继续加入我们自己的语法解析器即可.

$post['message'] = discuzcode($post['message'], $post['smileyoff'], $post['bbcodeoff'], $post['htmlon'], $forum['allowsmilies'],$forum['allowbbcode'], ($forum['allowimgcode'] && $showimages ? 1 : 0),$forum['allowhtml'], ($forum['jammer'] && $post['authorid'] != $discuz_uid ? 1 : 0), 0, $post['authorid']);

这是我加入的自定义新增wiki语法解析函数, 为了管理方便将其独立置于addons/dz_moinwiki.php文件中, 当然名字任由您定.

$post['message'] = moinwiki_parse($post['message']);

别忘了在文件起始部分加入文件引用:

include_once(DISCUZ_ROOT.'./addons/dz_moinwiki.php');

dz_moinwiki.php文件

解析代码会循环匹配正则表达式所限定的格式然后将其替换为html, 如果需要mediawiki的语法可以将第二个正则表达式替换为 '#\[\[(.+?)\]\]#s' 需要注意的是第二种语法只能在支持html的论坛中使用, 第一种则不限.

<?php function moinwiki_parse($message) { while (preg_match('#\[wiki\](.+?)\[/wiki\]#s', $message, $match)) { $wiki_name = $match[1]; $wiki_html = '<b><a href="http://wiki.cwowaddon.com/'.$wiki_name.'" target="_blank">'.$wiki_name.'</a></b>'; $message = str_replace($match[0], $wiki_html, $message); } while (preg_match('#\[\"(.+?)\"\]#s', $message, $match)) { $wiki_name = $match[1]; $wiki_html = '<b><a href="http://wiki.cwowaddon.com/'.$wiki_name.'" target="_blank">'.$wiki_name.'</a></b>'; $message = str_replace($match[0], $wiki_html, $message); } return $message; } ?>

通过这个简单的例子我们也可以看到, 只需对现有html所见即所得技术加以小扩展即可支持核心的wiki语法, 而又能享受到排版的便利, 如果wiki也能使用论坛这样的语法技术, 写作门槛将大大降低.

posted on 2007-03-19 00:26  simonw  阅读(1916)  评论(1编辑  收藏  举报