HDwiki 源代码 - 互动百科开源

昨日3.15,在曝光的企业中出现了一家让我好奇的企业(互动百科),一直不敢想百科能独立出来做成一家公司。出于对网站的好奇,今日进入该网站,惊讶的是此公司已经上市(股票代码:835799),在网站的底部看到 “Powered by HDwiki”。进入HDwiki,赫然写着合作用户“移动”、“华为”。。。而且 “免费开源”。故此下载下来看一下 HDwiki 里面的源代码。很简陋的架构,有 MVC 的样子。几分钟看完,虽然谈不上很有吸引力的项目,也在此留一段里面的代码做个脚印。

 

<?php

class template{
    
    var $tplname;
    var $tpldir;
    var $objdir;
    var $tplfile;
    var $objfile;
    var $vars=array();
    var $force =0;
    var $var_regexp = "\@?\\\$[a-z_][\\\$\w]*(?:\[[\w\-\.\"\'\[\]\$]+\])*";
    var $vtag_regexp = "\<\?php echo (\@?\\\$[a-zA-Z_][\\\$\w]*(?:\[[\w\-\.\"\'\[\]\$]+\])*)\?\>";
    var $const_regexp = "\{([\w]+)\}";
    var $lang = array();

    function template($tplname='default') {
        
        $this->tplname = ($tplname!=='default'&&is_dir(HDWIKI_ROOT.'/view/'.$tplname))?$tplname:'default';
        $this->tpldir = HDWIKI_ROOT.'/view/'.$this->tplname;
        $this->objdir = HDWIKI_ROOT.'/data/view';
    }

    function assign($k, $v) {
        $this->vars[$k] = $v;
    }

    function setlang($langtype='zh',$filename){
        include HDWIKI_ROOT.'/lang/'.$langtype.'/'.$filename.'.php';
        $this->lang = &$lang;
    }

 
    
    function display($file){
        GLOBAL $starttime,$mquerynum;
        $mtime = explode(' ', microtime());
        $this->assign('runtime', number_format($mtime[1] + $mtime[0] - $starttime,6));
        $this->assign('querynum',$mquerynum);
        extract($this->vars, EXTR_SKIP);
        include $this->gettpl($file);
    }

    function gettpl($file){
        if(substr($file,0,7)=="file://"){
            $ppos=strrpos($file,"/");
            $dir_name=explode('/',substr($file,7));
            $this->tplfile = HDWIKI_ROOT."/".substr($file,7).'.htm';
            $this->objfile = $this->objdir.'/'.$dir_name[1].'_'.substr($file,$ppos+1).'.tpl.php';
        }else{
            if($this->tplname!=='default'&&is_file($this->tpldir.'/'.$file.'.htm')){
                $this->tplfile = $this->tpldir.'/'.$file.'.htm';
                $this->objfile = $this->objdir.'/'.$this->tplname."_".$file.'.tpl.php';
            }else{
                $this->tplfile = HDWIKI_ROOT.'/view/default/'.$file.'.htm';
                $this->objfile = $this->objdir.'/'.$file.'.tpl.php';
            }
        }
        if(!file_exists($this->tplfile)){
            exit;
        }
        if($this->force || @filemtime($this->objfile) < @filemtime($this->tplfile)){
            $this->compile();
        }
        return $this->objfile;
    }

    function  compile() {
        $template = file::readfromfile($this->tplfile);
        $template = preg_replace("/\{block:([^\}]+?)\/\}/ies", "\$this->block('\\1')", $template);
        
        $template = preg_replace("/\<\!\-\-\{(.+?)\}\-\-\>/s", "{\\1}", $template);
        $template = preg_replace("/\{lang.(\w+?)\}/ise", "\$this->lang('\\1')", $template);
        if('1'==$this->vars['setting']['seo_type'] && '1'==$this->vars['setting']['seo_type_doc']){
            $template = preg_replace("/\{url.doc\-view\-(.+?)\['did'\]\}/ise", "\$this->stripvtag('{url doc-view-{eval echo rawurlencode(\\1[\'rawtitle\']);}}')", $template);
        }
        $template = preg_replace("/\{($this->var_regexp)\}/", "<?php echo \\1?>", $template);
        $template = preg_replace("/\{($this->const_regexp)\}/", "<?php echo \\1?>", $template);
        $template = preg_replace("/(?<!\<\?php echo |\\\\)$this->var_regexp/", "<?php echo \\0?>", $template);
        $template = preg_replace("/\{\{eval (.*?)\}\}/ies", "\$this->stripvtag('<?php \\1?>')", $template);
        $template = preg_replace("/\{eval (.*?)\}/ies", "\$this->stripvtag('<?php \\1?>')", $template);
        $template = preg_replace("/\{for (.*?)\}/ies", "\$this->stripvtag('<?php for(\\1) {?>')", $template);
        $template = preg_replace("/\{elseif\s+(.+?)\}/ies", "\$this->stripvtag('<?php } elseif(\\1) { ?>')", $template);
        
        $template = preg_replace("/\{hdwiki:([^\}]+?)\/\}/ies", "\$this->hdwiki('\\1')", $template);
        for($i=0; $i<2; $i++) {
            $template = preg_replace("/\{hdwiki:(.+?)\}(.+?)\{\/hdwiki\}/ies", "\$this->hdwiki('\\1', '\\2')", $template);
            $template = preg_replace("/\{loop\s+$this->vtag_regexp\s+$this->vtag_regexp\s+$this->vtag_regexp\}(.+?)\{\/loop\}/ies", "\$this->loopsection('\\1', '\\2', '\\3', '\\4')", $template);
            $template = preg_replace("/\{loop\s+$this->vtag_regexp\s+$this->vtag_regexp\}(.+?)\{\/loop\}/ies", "\$this->loopsection('\\1', '', '\\2', '\\3')", $template);
        }
        
        $template = preg_replace("/\{if\s+(.+?)\}/ies", "\$this->stripvtag('<?php if(\\1) { ?>')", $template);
        $template = preg_replace("/\{template\s+(\w+?)\}/is", "<?php include \$this->gettpl('\\1');?>", $template);
        $template = preg_replace("/\{template\s+(.+?)\}/ise", "\$this->stripvtag('<?php include \$this->gettpl(\\1); ?>')", $template);
        $template = preg_replace("/\{else\}/is", "<?php } else { ?>", $template);
        $template = preg_replace("/\{\/if\}/is", "<?php } ?>", $template);
        $template = preg_replace("/\{\/for\}/is", "<?php } ?>", $template);
        $template = preg_replace("/$this->const_regexp/", "<?php echo \\1?>", $template);
        $template = "<?php if(!defined('HDWIKI_ROOT')) exit('Access Denied');?>\r\n$template";
        $template = preg_replace("/(\\\$[a-zA-Z_]\w+\[)([a-zA-Z_]\w+)\]/i", "\\1'\\2']", $template);
        $template = preg_replace("/\{url.(.+?)\}/ise", "\$this->url('\\1')", $template);
        
        $template = preg_replace("/\{datacall:([^\}]+?)\/\}/ies", "\$this->datacall('\\1')", $template);
        $fp = fopen($this->objfile, 'w');
        fwrite($fp, $template);
        fclose($fp);
    }

    function stripvtag($s) {
        return preg_replace("/$this->vtag_regexp/is", "\\1", str_replace("\\\"", '"', $s));
    }

    function loopsection($arr, $k, $v, $statement){
        $arr = $this->stripvtag($arr);
        $k = $this->stripvtag($k);
        $v = $this->stripvtag($v);
        $statement = str_replace("\\\"", '"', $statement);
        return $k ? "<?php foreach((array)$arr as $k=>$v) {?>$statement<?php }?>" : "<?php foreach((array)$arr as $v) {?>$statement<?php } ?>";
    }

    function lang($k){
        return !empty($this->lang[$k]) ? stripslashes($this->lang[$k]) : "{ $k }";
    }
    
    function url($u){
        if(substr($u,0,10)=='user-login'||substr($u,0,11)=='user-logout'||substr($u,0,13)=='user-register'||substr($u,0,9)=='user-code'
            || substr($u,0,10)=='pic-search'|| substr($u,0,7)=='search-'){
            return 'index.php?'.$u;
        }elseif('1'==$this->vars['setting']['seo_type'] &&'1'==$this->vars['setting']['seo_type_doc'] && 'doc-view-'==substr($u,0,9)){
            return "wiki/".substr($u,9);
        }else{
            return $this->vars['setting']['seo_prefix'].$u.$this->vars['setting']['seo_suffix'];
        }
    }
    
    function hdwiki($taglist, $statement=''){
        $tag=preg_split("/\s+/",trim($taglist));//接收到参数按空格分开。
        $taglist = str_replace("'", "\'", $taglist);
        if(''!=$statement){
            $statement = str_replace("\\\"", '"', $statement);
            $statement = preg_replace_callback("/\[field:([^\]]+?)\/\]/is", array($this,'callback'), $statement);
            
            return "<?php foreach((array)\$_ENV['tag']->$tag[0]('$taglist') as \$data) {?>$statement<?php } ?>" ;
        }else{
            return "<?php echo \$_ENV['tag']->$tag[0]('$taglist');?>" ;
        }
    }
    
    function callback($matches){
        $cmd=trim($matches[1]);
        
        $firstspace=strpos($cmd,' ');
        if(!$firstspace){
            return '<?php echo $data['.$cmd.']?>';
        }else{
            $field=substr($cmd,0,$firstspace);
            $func=substr($cmd,$firstspace);
            return '<?php echo '.str_replace('@me','$data['.$field.']',$func)." ?>";
        }
    }

    function datacall($datatag){
        $datatag = trim($datatag);
        return  "<?php \$_ENV['datacall']->call('$datatag');?>" ;
    }
    
    function block($area){
        $area = trim($area);
        $datastr='';
        if(!empty($GLOBALS['blocklist'][$area])) {
            foreach((array)$GLOBALS['blocklist'][$area] as $block){
                $datastr.='{eval $data= $GLOBALS[\'blockdata\']['.$block['id'].'];$bid="'.$block['id'].'"}';
                $tplfile=HDWIKI_ROOT.'/block/'.$block['theme'].'/'.$block['block'].'/'.$block['tpl'];
                if(!file_exists($tplfile)){
                    $tplfile=HDWIKI_ROOT.'/block/default/'.$block['block'].'/'.$block['tpl'];
                }
                $datastr.=file::readfromfile($tplfile);
            }
        }
        return $datastr;
    }
}
?>

 

转载于:https://www.cnblogs.com/xiaoyaogege/p/6560871.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
请参考document目录下install.html文件 HDWiki系统包括:百科功能、网站功能、插件功能 这些功能为WIKI必须具备的基础功能,更多建站常用的功能可以通过安装插件实现。 百科功能:为WIKI百科网站必备的功能,包括百科词条浏览、百科编辑器、版本管理、词条管理、分类管理、统计、搜索功能,版本对比,贡献者,简单个人空间等 网站功能包括:与用户相关的功能,包括注册登录、用户管理、数据库管理、网站管理,摸摸功能,首页推荐,用户管理,权限管理,文字过滤功能,积分功能等 插件功能包括:API功能,维吧功能,邀请注册功能,风格管理,高级个人空间功能,模板功能,专题管理,广告管理,公告管理,友情链接管理,UC整合,站内信系统等 列新列表 1、新增站内短信功能,百科用户之间可通过互发站内短信来沟通和联系。 2、词条重定向功能,用户可以将几个意思相同的词条定向到一个用户认为好合适的词条上。 3、增加用户组管理功能,新增用户等级头衔,星级体系,站长可以自定义用户头衔及星级,增加特殊用户组,激励站内用户百科词条创作。 4、增加后台操作日志,超级管理员可以在后台查看自己及词条管理员从登陆网站后台进行的所有操作。 5、新增统计功能,站长在后台就能方便地了解整个站点关于用户、积分、词条、分类等等最新情况,以方便站长根据数据对站点进行相应的改善。 6、新增简单的站点公告功能,默认显示站点用户及词条总数,站长也可以更改成自己的公告。 7、增加了RSS订阅功能,百科用户可以使用Google阅读器、抓虾等在线RSS工具订阅百科站点。 8、增加了词条页收藏功能。方便百科用户收藏对自己有用的好词条。 9、增加了对UC1.5、Discuz7.0的整合功能。 10、互动摸摸增加了对Discuz7.0的支持。 11、改善了用户登录体验,用户登录时不需要跳转了。 12、改善了后台权限管理操作。 13、改善了编辑实验功能,默认为最后一个词条,管理员也可以指定一个词条为编辑实验词条。 14、改善了系统的负载能力。 15、改进了评论中敏感词过滤功能,站长可在后台增加敏感词。 16、改进百科联盟插件。 17、修正了编辑器中上传PNG图片不能显示缩略图的错误。 18、修正了拥有删除词条权限的人,删除词条无提示的错误,防止用户不小心点击导致删除词条的错误。 19、更多的BUG修正与页面体验改进,具体细节不再一一描述。
请参考document目录下install.html文件 HDWiki系统包括:百科功能、网站功能、插件功能 这些功能为WIKI必须具备的基础功能,更多建站常用的功能可以通过安装插件实现。 百科功能:为WIKI百科网站必备的功能,包括百科词条浏览、百科编辑器、版本管理、词条管理、分类管理、统计、搜索功能,版本对比,贡献者,简单个人空间等 网站功能包括:与用户相关的功能,包括注册登录、用户管理、数据库管理、网站管理,摸摸功能,首页推荐,用户管理,权限管理,文字过滤功能,积分功能等 插件功能包括:API功能,维吧功能,邀请注册功能,风格管理,高级个人空间功能,模板功能,专题管理,广告管理,公告管理,友情链接管理,UC整合,站内信系统等 列新列表 1、新增站内短信功能,百科用户之间可通过互发站内短信来沟通和联系。 2、词条重定向功能,用户可以将几个意思相同的词条定向到一个用户认为好合适的词条上。 3、增加用户组管理功能,新增用户等级头衔,星级体系,站长可以自定义用户头衔及星级,增加特殊用户组,激励站内用户百科词条创作。 4、增加后台操作日志,超级管理员可以在后台查看自己及词条管理员从登陆网站后台进行的所有操作。 5、新增统计功能,站长在后台就能方便地了解整个站点关于用户、积分、词条、分类等等最新情况,以方便站长根据数据对站点进行相应的改善。 6、新增简单的站点公告功能,默认显示站点用户及词条总数,站长也可以更改成自己的公告。 7、增加了RSS订阅功能,百科用户可以使用Google阅读器、抓虾等在线RSS工具订阅百科站点。 8、增加了词条页收藏功能。方便百科用户收藏对自己有用的好词条。 9、增加了对UC1.5、Discuz7.0的整合功能。 10、互动摸摸增加了对Discuz7.0的支持。 11、改善了用户登录体验,用户登录时不需要跳转了。 12、改善了后台权限管理操作。 13、改善了编辑实验功能,默认为最后一个词条,管理员也可以指定一个词条为编辑实验词条。 14、改善了系统的负载能力。 15、改进了评论中敏感词过滤功能,站长可在后台增加敏感词。 16、改进百科联盟插件。 17、修正了编辑器中上传PNG图片不能显示缩略图的错误。 18、修正了拥有删除词条权限的人,删除词条无提示的错误,防止用户不小心点击导致删除词条的错误。 19、更多的BUG修正与页面体验改进,具体细节不再一一描述。
互动百科HDWiki是专为中文用户设计和开发,程序源代码100%完全开放的一个采用 PHP 和 MySQL 数据库构建的高效的中文百科建站解决方案,在尊重版权的前提下能极大的满足站长对于网站程序进行二次开发。HDwiki作为中国第一款拥有自主知识产权的中文Wiki系统,由互动在线(北京)科技有限公司(www.baike.com)于2006年11月28 日正式推出,力争为给众多的 Wiki 爱好者提供一个简单、易用、功能强大的 Wiki 建站系统(企事业单位、社会团体、其他用户及海外用户使用本系统需要获得正式授权,详见授权中心)。HDwiki的推出,HDwiki在易用性和功能可操控性等方面都获得了广大中小站长和 Wiki 爱好者的喜爱,目前数万家网站成功搭建 Wiki 站点及频道。 对于众多的中小站长而言,利用 HDwiki 均能够在最短的时间内,花费最低的费用,采用最少的人力,架设一个性能优异、功能全面、安全稳定的百科网站平台。更重要的是,互动百科还为中小站长们建立百科站点提供全方位的支持。 对于网民及百科爱好者而言,注册任何一个由 HDwiki 软件系统建立的网站/百科频道,将能方便、快捷地享受到百科带来的互动知识体验,可以进行创建/编辑词条、添加/修改资料、站内短信、百科搜索等众多的基本百科操作,以及与 Discuz! 等主流论坛程序无缝对接的高级社区应用。 HDWiki(互动百科)截图 相关阅读 同类推荐:站长常用源码
互动百科HDwiki是专为中文用户设计和开发,程序源代码100%完全开放的一个采用PHP和MySQL数据库构建的高效的中文百科建站解决方案,在尊重版权的前提下能极大的满足站长对于网站程序进行二次开发。 互动百科HDwiki 6.0 UTF8 更新日志: 2017-02-09 新增功能:1.全新UI,画风简洁,美观实用,带来全新的用户体验; 1.1全新的wiki网站设计风格; 1.2全新的词条编辑器UI; 1.3全新的首页、导航、个人中心UI。2.新增移动端浏览,实现PC与移动端全面联动,让你的Wiki触手可及; 2.1PC端内容自动识别适应至移动端; 2.2ios、安卓、win多机型适配; 2.3功能精简,让移动端更加轻量化。3.新增CSRF(Cross-site request forgery跨站请求伪造)防范; 3.1防范利用用户标识危害网站; 3.2防范欺骗用户的浏览器发送HTTP请求给目标站点; 3.3防范通过IMG标签触发GET请求并利用利用它来实现CSRF攻击。4.新增访问频率限制,可以根据IP或用户标识对某个功能进行在指定时间范围内的可访问次数限制; 4.1防范访问频率过高造成服务器负载异常; 4.2防范用户Web恶意采集; 4.3防范可能的恶意流量攻击。5.新增词条正文导航模块,可快速定位正文各部分; 5.1根据目录自动生成正文导航; 5.2点击快速跳转至正文各个目录或模块; 5.3随正文浏览进度实时定位。改进与优化:1.编辑器升级,整体UI重制,正文粘贴表格以及对齐方式选择优化; 1.1对齐方式新增了居中和右对齐; 1.2图片编辑新增了移动和替换图片; 1.3正文新增了对粘贴表格的支持。2.网络安全升级,为您的wiki提供企业级的信息安全保护; 2.1升级防火墙安全级别; 2.2新增服务器安全防护机制; 2.3针对潜在攻击威胁进行防护。3.后台管理逻辑优化,提高可操作性、界面友好性,去除冗余模块; 3.1优化后台管理服务,缩短响应时间; 3.2去除了新知社和下载词条模块; 3.3相关信息更新至6.0版本。4.改进分享功能,词条页面可一键分享至微信、QQ空间、新浪微博与印象笔记; 4.1新增分享词条至微信朋友圈及QQ空间; 4.2新增分享词条至印象笔记; 4.3新增分享词条至新浪微博。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值