Meidawiki 配置
为coder建立了一个“编程百科”http://codingwiki.info,codingwiki采用mediawiki,这里记录详细的配置:
codingwiki编程百科站点是一个为Coder而建的关于编程(Coding)的wiki站点,我们期望“新人在这里可以学习提高,熟手在这里可以跨越瓶颈,迈向高手之路”。 codingwiki编程百科 的内容来自国外优秀的Coding博客或者 Coding技术站点。它属于非盈利性的,我们在这里创作、改进、收集和整理 编程(Coding)相关的中文文档,当然,我们热烈欢迎您也参与我们的翻译,您可以点击帮助了解相关信息。 如果想要与他人交流获得问题解答(多数情况作为最后选项,既然您已经来了这里:P),请参见建议的通讯方法。
1、首先,配置logo
# logo $wgLogo = "/logo.png";
2、配置时间
## Timezone Settings $wgLocaltimezone = "Asia/Shanghai"; $oldtz = getenv("TZ"); putenv("TZ=$wgLocaltimezone"); $wgLocalTZoffset = date("Z") / 3600; putenv("TZ=$oldtz");
3、配置上传
#开启图片上传 $wgEnableUploads= true;
#上传文件类型 $wgFileExtensions = array( 'png', 'gif', 'jpg', 'jpeg','doc','ppt','pdf' );
4、urlrewrite Url重写
#url REWRITE $wgScriptPath = ""; $wgArticlePath = "/$1"; $wgUsePathInfo = true; $wgScriptExtension = ".php";
服务器采用nginx,添加下面的配置
location / {
if (!-e $request_filename) {
rewrite ^/([^?]*)(?:?(.*))? /index.php?title=$1&$2 last;
}
}
5、添加常用扩展
#SyntaxHighlight require_once("$IP/extensions/SyntaxHighlight_GeSHi/SyntaxHighlight_GeSHi.php");
#ParserFunctions require_once( "$IP/extensions/ParserFunctions/ParserFunctions.php" );
6、实现自己的扩展——找出wiki最热条目和最新条目,以及热门分类,通过扩展tag实现
直接贴代码,详细效果见
http://codingwiki.info/%E9%A6%96%E9%A1%B5,
http://codingwiki.info/%E5%88%86%E7%B1%BB:.NET
<?php
$wgHooks['ParserFirstCallInit'][] = 'efCodingWikiTagParserInit';
function efCodingWikiTagParserInit( &$parser ) {
$parser->setHook( 'hotpages', 'efHotPageRender' );
$parser->setHook( 'hotcategories', 'efHotCategoryRender' );
$parser->setHook( 'newpage', 'efNewPageRender' );
return true;
}
function makePageListItem( $row ) {
global $wgUser;
$title = Title::makeTitleSafe( $row->page_namespace, $row->page_title );
if( !is_null( $title ) ) {
$skin = $wgUser->getSkin();
$link = $row->page_is_redirect
? '<span class="allpagesredirect">' . $skin->makeKnownLinkObj( $title ) . '</span>'
: $skin->makeKnownLinkObj( $title );
return( "<li>{$link}({$row->page_counter}次)</li>n" );
} else {
return( "<!-- Invalid title " . htmlspecialchars( $row->page_title ) . " in namespace " . htmlspecialchars( $row->page_namespace ) . " -->n" );
}
}
function efHotPageRender( $input, $args, $parser, $frame ) {
global $wgRequest, $wgOut, $wgContLang, $wgLang;
$dbr = wfGetDB( DB_SLAVE );
$limit = isset($args["count"])?$args["count"]:10;
$res = null;
if(isset($args["category"])){
$res = $dbr->select(
array('page','categorylinks'),
'*',
array('cl_to' => "{$args['category']}"),
__METHOD__,
array(
'ORDER BY' => 'page_counter DESC',
'LIMIT' => "$limit",
'OFFSET' => '0',
),
array( 'categorylinks' => array('JOIN','page_id=cl_from') )
);
}else{
$res = $dbr->select(
'page',
array(
'page_namespace',
'page_title',
'page_counter',
'page_is_redirect'
),
array('page_namespace'=>'0'),
__METHOD__,
array(
'ORDER BY' => 'page_counter DESC',
'LIMIT' => "$limit",
'OFFSET' => '0',
)
);
}
$result = "<ul>";
foreach ( $res as $row ) {
$result .= makePageListItem( $row );
}
$result .= "</ul>";
return $result;
}
function efHotCategoryRender( $input, $args, $parser, $frame ) {
global $wgRequest, $wgOut, $wgContLang, $wgLang;
$dbr = wfGetDB( DB_SLAVE );
$limit = isset($args["count"])?$args["count"]:10;
$res = $dbr->select(
'category',
'*',
array(),
__METHOD__,
array(
'ORDER BY' => 'cat_pages DESC',
'LIMIT' => "$limit",
'OFFSET' => '0',
)
);
$result = "<ul>";
foreach ( $res as $row ) {
$result.= "<li><a href='/分类:{$row->cat_title}'>{$row->cat_title}</a>(<a href='/分类:{$row->cat_title}'>{$row->cat_pages}</a>)</li>n" ;
}
$result .= "</ul>";
return $result;
}
function efNewPageRender( $input, $args, $parser, $frame ) {
global $wgRequest, $wgOut, $wgContLang, $wgLang;
$dbr = wfGetDB( DB_SLAVE );
$limit = isset($args["count"])?$args["count"]:10;
$res = null;
if(isset($args["category"])){
$res = $dbr->select(
array('page','categorylinks'),
'*',
array('cl_to' => "{$args['category']}"),
__METHOD__,
array(
'ORDER BY' => 'page_id DESC',
'LIMIT' => "$limit",
'OFFSET' => '0',
),
array( 'categorylinks' => array('JOIN','page_id=cl_from') )
);
}else{
$res = $dbr->select(
'page',
array(
'page_namespace',
'page_title',
'page_counter',
'page_is_redirect'
),
array(),
__METHOD__,
array(
'ORDER BY' => 'page_id DESC',
'LIMIT' => "$limit",
'OFFSET' => '0',
)
);
}
$result = "<ul>";
foreach ( $res as $row ) {
$result .= makePageListItem( $row );
}
$result .= "</ul>";
return $result;
}
- 远程协助解决异常宕库的问题(r11笔记第75天)
- Nginx-helper纯代码版,文章评论发布自动清理Fastcgi缓存
- MySQL和Oracle行值表达式对比(r11笔记第74天)
- 闪回数据库不是“万金油”(r11笔记第73天)
- 修改Apache的超时设置,解决长连接请求超时问题
- Oracle 12cR2初体验(r11笔记第91天)
- MySQL中的undo截断(r11笔记第89天)
- Linux系统 df 命令显示异常、分区丢失问题解决
- MySQL主从、字典死锁、连接数的Python监控脚本
- MySQL Online DDL(二)(r11笔记第88天)
- 转-Android上面运行golang
- Golang适合高并发场景的原因分析
- 浅谈MySQL中的事务隔离级别(r11笔记第86天)
- 巧用echo命令解决Samba批量添加用户难题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- mapreduce的二次排序-分区分组
- GATK RNA-Seq Snps Indel 分析
- 【技术创作101训练营】腾讯云主机上部署 FRP+Teamviewer 穿透内网进行远程运维
- 图像处理笔记(7)---- OpenCV 绘制无填充矩形
- 图像处理笔记(8)---- OpenCV 获取追踪对象的HSV值
- (数据科学学习手札95)elyra——jupyter lab平台最强插件集
- Python 序列化/反序列化自定义类型
- Windows10下使用VS2017编译和使用yaml-cpp库
- CentOS7下编译yaml-cpp库
- SAP Spartacus CurrentProductService返回的null对象
- SAP Spartacus产品明细页面用Observable显示产品名称
- 关于rxjs里operators filter和map的详细讨论
- 用代码查看SAP Spartacus购物车内的行项目
- rxjs的map和switchMap在SAP Spartacus中的应用
- 用代码查看SAP Spartacus购物车内的行项目