技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> PHP --> Mediawiki扩展编写实战

Mediawiki扩展编写实战

浏览:3053次  出处信息

Wikipedia大家都很熟悉,而Mediawiki则是Wikipedia背后的功臣,整个Wikipedia都构建在mediawiki之上,mediawiki的稳定性和高效性值得信赖,同时Mediawiki非常易于扩展,可以通过Extension的方式添加非常多的功能,而且Mediawiki的Extension社区也非常活跃,大家可以到Mediawiki Extension目录下去下载自己需要的扩展程序。

上周末,帮朋友写了一些Mediawiki的扩展,立即被Mediawiki的强大扩展性折服,主要实现的功能有:增加Google Analytics统计、自定义标题、增加Google Adsense广告之类,写Mediawiki的扩展,最好的参考是Mediawiki扩展手册:http://www.mediawiki.org/wiki/Manual:Extensions

Mediawiki的扩展主要有Tag Extension、Parser Functions、Hooks、Special Pages、Skins、Magic Words,对应的中文是:标签扩展(自定义wiki标签,比如xxxx)、解析扩展(和标签类似,不过呈现方式稍有不通,为{{#foo : bar}})、钩子、特殊页面、皮肤、魔术关键字,我这里演示的是Parser Functions和Hooks,其他的差不多类似。

一、增加Google Analytics统计和Google Adsense广告

原理很简单,我们在页面显示之前,把Google Analytics和Google Adsense的代码append到要显示的内容即可,代码:

<?php
/**
 * 安全设置,防止恶意调用
 */
if (!defined('MEDIAWIKI')) {
	die( 'This file is a MediaWiki extension, it is not a valid entry point' );
}
 
/**
 * 扩展的基本信息
 */
$wgExtensionCredits['other'][] = array(
	'path'           => __FILE__,
	'name'           => '插件名称',
	'version'        => '1.0',
	'author'         => '作者',
	'descriptionmsg' => '简要说明',
	'url'            => '作者地址',
);
 
/**
 * 注册一个钩子,在页面显示之前,处理页面显示内容
 * 
 * 全部钩子列表:http://www.mediawiki.org/wiki/Manual:Hooks
 * 
 */
$wgHooks['BeforePageDisplay'][] = 'dzBeforePageDisplay';
function dzBeforePageDisplay(&$out, &$skin) {
    /**
     * 在LocalSettings.php定义$wgDangZhiAppendHtml
     * 把要添加的Google Analytics和Google Adsense代码放里面
     */
    global $wgDangZhiAppendHtml;
 
    // 页面添加HTML
    $out->addHTML($wgDangZhiAppendHtml);
 
    // 记得返回true,收工
    return true;
}

短短几行代码,完成添加Google Analytics统计和Google Adsense广告代码,当然,你还可以添加任意你想添加到网页最后的代码,可以查看示例网站的源代码,Google Analytics的代码布在每个页面上。

二、自定义文章标题

自定义文章标题对搜索引擎来说非常重要,Mediawiki默认的标题只能和内容条目一样,缺乏灵活性,这里的原理是增加一个{{#title: 标题内容}}的标签,在页面显示之前替换成网页标题,示例网站的首页就自定了HTML标题。

 
/**
 * 还是第一示例中的显示前处理函数,这里是部分内容
 */
function dzBeforePageDisplay(&$out, &$skin) {
 
    // 如果页面中存在{{#title: 标题内容}},那么指定文章标题
    preg_match('/\{\{#title: ?(.*)\}\}/U', $out->mBodytext, $matches);
    if ($matches) {
        $out->mBodytext = str_replace($matches[0], '', $out->mBodytext);
        $out->mHTMLtitle = $matches[1];
    }
 
    return true;
}

三、文章在新窗口打开

Mediawiki是外国人做的东西,国外少有默认新窗口打开链接的习惯,国人的习惯可不是这样,让Mediawiki默认新窗口打开的做法非常的简单。

/**
 * 还记得这个函数吧
 */
function dzBeforePageDisplay(&$out, &$skin) {
    // 新窗口打开链接
    $p = array('/(<a href=\"\/index.php\?title=.+\")/U', '/(<a href=\"\/wiki\/.+\")/U');
    $r = '$1 target="_blank"';
    $out->mBodytext = preg_replace($p, $r, $out->mBodytext);
 
    return true;
}

在页面输出之前,给需要的a标签加个target=”_blank”的属性即可。

四、解析HTML标签

Mediawiki为了安全考虑,不允许在内容中使用非安全HTML标签,我们可以使用一种加密HTML的方法来达到安全性和易用性的平衡。在内容中增加{{#html: 加密码 | html内容}},其中加密码是系统密钥和html内容的md5值,如果符合则显示。

/**
 * 初始化Parser Functions
 */
$wgHooks['ParserFirstCallInit'][] = 'dzParserSetup';
$wgHooks['LanguageGetMagic'][] = 'dzMagicSetup';
 
/**
 * 设置解析函数
 */
function dzParserSetup(&$parser) {
    $parser->setFunctionHook('html', 'dzParseHtml');
    // 可以设置多个,$parser->setFunctionHook('foo', 'dzParseFoo');
	return true;
}
 
/**
 * 初始化Parser关键字
 */
function dzMagicSetup(&$magicWords, $langCode) {
    $magicWords['html'] = array(0, 'html');
    // 可以设置多个,$magicWords['foo'] = array(0, 'foo');
    return true;
}
 
/**
 * 解析HTML
 */
function dzParseHtml($parser, $param1 = '', $param2 = '') {
    // 在LocalSettings.php定义HTML加密密钥
    global $wgHtmlSalt;
 
    $key = md5($wgHtmlSalt . $param2);
 
    if ($key == $param1) {
        return array($param2, 'noparse' => true, 'isHTML' => true);;
    }
 
    return 'bad html';
}

Mediawiki的扩展写起来还是相当容易,文中提到的效果可以在这里体验,老外写的东西对Extension都很重视,wordpress也是这样,不似国内的某些项目,稍做修改都得hack代码,hack的坏处是升级的时候容易悲剧。

建议继续学习:

  1. chrome扩展应用开发教程之开发chrome应用基础    (阅读:4443)
  2. PHP内核介绍及扩展开发指南―高级主题    (阅读:3384)
  3. 深入理解PHP原理之扩展载入过程    (阅读:3342)
  4. chrome扩展应用开发教程之调试和打包上线    (阅读:3316)
  5. 编写python的C语言扩展    (阅读:3270)
  6. PHP内核介绍及扩展开发指南―类和对象    (阅读:2762)
  7. 用C/C++扩展你的PHP    (阅读:2524)
  8. 检测文本正文是否包含有特定词的PHP扩展    (阅读:2335)
  9. PHP扩展开发:第一个扩展    (阅读:2158)
  10. 保证PHP扩展的依赖关系    (阅读:2064)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1