如果发现广告等破坏行为,请尽量将条目恢复到较早的版本而不是把相应内容直接删除,谢谢合作。

NOCOW:MediaWiki程序修改

来自"NOCOW"

跳转到: 导航, 搜索

现在MediaWiki的程序很多地方需要修改,以适应NOCOW的需要。

一些内容如下,按重要性排序:

  • 在全部页面中隐藏子页面,并把子页面数量注在主页面后面。另外左边的工具箱应该有一个查看自页面的链接,没有被主页面或其他子页面链接的子页面也应该注在主页面下面(链接可以用特殊方式隐藏)。这个功能应当设成可选的。
  • 将分类用于所有的条目,或者说所有的条目都可以作为分类,不管名字空间是什么。这个一可以快速解决Article:的整理问题(归类到其所讲的内容),二是可以增加个人页面的私人分类,而不污染主要的分类空间,不过这个说不定可以用User开头的分类解决(既然可以有用户分类)。
  • 给予个人保护自己个人页面的权力。这主要是为了避免一些不必要的检查,还有对重要言论的误会。保护不是强制的。另外也应该可以将一个页面的子页面(包括任何新建的子页面,不包括特殊解保护的)递归保护。另外也应该能查看一个页面及其所有子页面的修改。
  • 重写showhide插件。
  • 增加insert插件,把插入的内容直接转移到自己的个人页,并保护。要考虑到权限和编辑冲突等问题。
  • 个人身份验证,可以用一些不可直接实现的javascript效果实现,或者把这些信息显示在工具箱的下面。
  • rss导出,包括分类、链出更改等页面的。
  • 修改页面css的支持,注意避免一些hack,最好支持这样:{a {xxx:xxx} li a {xxx:yyy}}!important。
  • 通过名字空间:直接搜索或者列出名字空间的内容。
  • 引用特殊页面。

要是还有什么需要的,欢迎大家在这里添加。

如果谁比较熟悉php或者mediawiki的结构,或者对此有兴趣,欢迎加入,请在这里留言。 --Cosechy 07:09 2007年6月25日 (CST)

关于这件事的问题,可以在这里回复,对mediawiki程序的讨论去这里吧。 --Cosechy 07:09 2007年6月25日 (CST)

[编辑] 搜索框修改

11:26 2008年3月9日 (CST)

简单的修改了一下左边搜索框的“进入”功能,如下:

  1. 查找当前页面的子页面,如果存在则直接进入(下同),比如在USACO/nuggets输入Pascal进入USACO/nuggets/Pascal,可以在前面加./忽略下面的条件,比如./Pascal。
  2. 如果最后一个字符是冒号,查找所输入的名字空间中和当前页面同名的页面,比如在USACO/nuggets输入Translate:进入Translate:USACO/nuggets
  3. 查找和当前页面同一级(路径和名字空间)的页面,比如在USACO/nuggets输入ride进入USACO/ride,可以在前面加冒号跳过查找子页面和条件,比如:ride。
  4. 如果第一个字符是点,用类似路径的方法处理,但是分隔符将是点(还有点问题)。
  5. 如果输入的内容以/开头,或者在除了首尾的地方有冒号而且开头不是./或者:,忽略以上几条。
  6. 为了安全考虑,特殊页面暂时没有打开这些功能,但是在Logout输入Special:还是会有效果,请尽量不要这么用。
  7. 本功能只适用于“进入”功能,对搜索、内链和地址栏直接输入没有效果。
  8. 本功能目前只在默认的MonoBook界面里有效。

代码:

  • include/SpecialSearch.php SpecialSearch::goResult 第六行开始加入:
if(substr($term,0,1)=='/')
                        $term=substr($term,1);
                else if(!array_key_exists('ref',$_GET));
                else if(substr($term,0,2)=='./')
                        if(!is_null($t=SearchEngine::getNearMatch($_GET['ref'].substr($term,1)))){$wgOut->redirect($t->getFullURL());return;}
                        else;
                else if(substr($term,-1,1)==':')
                        if(!is_null($t=SearchEngine::getNearMatch($term.$_GET['ref']))){$wgOut->redirect($t->getFullURL());return;}
                        else;
                else if(strpos($term,':'));
                else if(substr($term,0,1)=='.'&&!is_null($t=SearchEngine::getNearMatch($_GET['ref'].$term))){$wgOut->redirect($t->getFullURL());return;}
                else if(substr($term,0,1)!=':'||($term=substr($term,1)and false)and!is_null($t=SearchEngine::getNearMatch($_GET['ref'].'/'.$term))){$wgOut->redirect($t->getFullURL());return;}
                else if(is_int($t=strpos($_GET['ref'],'/'))and!is_null($t=SearchEngine::getNearMatch(substr($_GET['ref'],0,$t+1).$term))){$wgOut->redirect($t->getFullURL());return;}
                else if(is_int($t=strpos($_GET['ref'],':'))and!is_null($t=SearchEngine::getNearMatch(substr($_GET['ref'],0,$t+1).$term))){$wgOut->redirect($t->getFullURL());return;}
  • include/Skin.php Skin::makeGlobalVariablesScript 修改一行:
'wgPageName' => $GLOBALS['yh_temp_ref']=$wgTitle->getPrefixedDBKey(),

不知道为什么在MonoBook.php里直接调用$GLOBALS['wgTitle']->getPrefixedDBKey()不管用

  • skin/MonoBook.php MonoBookTemplate::excute div#searchBody form#searchform
<?php if(substr($GLOBALS['yh_temp_ref'],0,8)!='Special:'){ ?><input name="ref" type="hidden" value="<?php echo $GLOBALS['yh_temp_ref']; ?>">
<?php } ?>

有什么问题和建议请与User:Cosechy联系,或者在这里提出。


21:13 2008年3月12日 (CST)

之前又修改了一下程序,没有马上帖出来

代码如下:

if(substr($term,0,1)=='/')
                        $term=substr($term,1);
                else if(!array_key_exists('ref',$_GET));
                else if(substr($term,0,2)=='./')
                        if(!is_null($t=SearchEngine::getNearMatch($_GET['ref'].substr($term,1)))){$wgOut->redirect($t->getFullURL());return;}
                        else;
                else if(substr($term,-1)==':')
                        if(!is_null($t=SearchEngine::getNearMatch($tt=substr($term,0,-1).(($t=strpos($_GET['ref'],':'))===false?':'.$_GET['ref']:substr($_GET['ref'],$t))))){$wgOut->redirect($t->getFullURL());return;}
                        else if(is_int($t=strrpos($tt,'.'))&&!is_null($t=SearchEngine::getNearMatch(substr($tt,0,$t)))){$wgOut->redirect($t->getFullURL());return;}
                        else if(is_int($t=strrpos($tt,'/'))&&!is_null($t=SearchEngine::getNearMatch(substr($tt,0,$t)))){$wgOut->redirect($t->getFullURL());return;}
                        else;
                else if(substr($term,0,2)==':/')
                        if(!is_null($t=SearchEngine::getNearMatch(substr($_GET['ref'],strpos($_GET['ref'],':')).substr($term,1)))){$wgOut->redirect($t->getFullURL());return;}
                        else;
                else if(substr($term,0,2)==':.')
                        if(!is_null($t=SearchEngine::getNearMatch(substr($_GET['ref'],strpos($_GET['ref'],'.')).substr($term,1)))){$wgOut->redirect($t->getFullURL());return;}
                        else;
                else if($t=strpos($term,':'))
                        if(substr($term,$t+1,1)=='/')
                                if(!is_null($t=SearchEngine::getNearMatch(substr($term,0,$t+1).substr($_GET['ref'],($tt=strpos($_GET['ref'],':'))+is_int($tt)).substr($term,$t+1)))){$wgOut->redirect($t->getFullURL());return;}
                                else;
                        else if(substr($term,$t+1,1)=='.')
                                if(!is_null($t=SearchEngine::getNearMatch(substr($term,0,$t+1).substr($_GET['ref'],($tt=strpos($_GET['ref'],'.'))+is_int($tt)).substr($term,$t+1)))){$wgOut->redirect($t->getFullURL());return;}
                                else;
                        else;
                else if(substr($term,0,1)=='.'&&!is_null($t=SearchEngine::getNearMatch($_GET['ref'].$term))){$wgOut->redirect($t->getFullURL());return;}
                else if(substr($term,0,1)!=':'||($term=substr($term,1)and false)and!is_null($t=SearchEngine::getNearMatch($_GET['ref'].'/'.$term))){$wgOut->redirect($t->getFullURL());return;}
                else if(is_int($t=strrpos($_GET['ref'],'/'))and!is_null($t=SearchEngine::getNearMatch(substr($_GET['ref'],0,$t+1).$term))){$wgOut->redirect($t->getFullURL());return;}
                else if(is_int($t=strrpos($_GET['ref'],':'))and!is_null($t=SearchEngine::getNearMatch(substr($_GET['ref'],0,$t+1).$term))){$wgOut->redirect($t->getFullURL());return;}

修正了一些bug,增加了前两条同时使用的功能。如果搜索内容中有:/,会查询前面的名字空间里以后面的内容为名字的子页面。含有:.的情况类似。

查了一下mediawiki的文档,在搜索功能修改之前,注册比较早的用户可以在Special:Preferences的搜索结果设定里选择默认的搜索名字空间,新注册用户自动使用一个修改好的设置。

如果有问题或者希望帮助进行修改可以联系User:Cosechy

个人工具