雕虫小技之为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也能使用论坛这样的语法技术, 写作门槛将大大降低.

你可能感兴趣的:(雕虫小技之为Discuz论坛添加Wiki语法)