新浪 SAE 限制真多 郁闷
http://1.iwp001.sinaapp.com/iwp/public/?q=framework.doc.index
http://1.iwp001.sinaapp.com/iwp/public/?q=testcase.index
http://1.iwp001.sinaapp.com/iwp/public/?q=framework.doc.index
http://1.iwp001.sinaapp.com/iwp/public/?q=testcase.index
那就在 sae 上开发吧,暂时...
文档集成了一个 不到100行的 wiki引擎
单元测试是我之前自己写的 kencore-unit
<?php
Core_Autoloader::loadFile(COREPATH . '/vendor/WikiDoc.class.php');
Core_Autoloader::loadFile(COREPATH . '/vendor/TplEngine.class.php');
/**
* Iwp 文档查看器
*
*/
class Pkg_Iwp_Doc {
const queryHome = 'query-home';
const queryController = 'query-controller';
const queryAction = 'query-action';
const queryApiName = 'api-index';
static $pageTitle = '';
static $apiQueryHome = 'http://iwp.iamsese';
static $apiController = 'api';
static $apiAction = 'index';
static function lookup(array $vars){
static $tplEngine = null;
if (!$tplEngine){
$tplConfig = array(
'templateDir' => dirname(__FILE__) . '/_views',
'enableCache' => false,
);
$tplEngine = new TplEngine($tplConfig);
// 注入扩展开发
WikiDoc::addPlugin('title',"Pkg_Iwp_Doc::plugin_title");
WikiDoc::addPlugin('apilink',"Pkg_Iwp_Doc::plugin_apilink");
}
$apiName = Core_AppUtils::val($vars,Pkg_Iwp_Doc::queryApiName,'index');
self::$apiQueryHome = Core_AppUtils::val($vars,Pkg_Iwp_Doc::queryHome,'http://iwp.iamsese');
self::$apiController = Core_AppUtils::val($vars,Pkg_Iwp_Doc::queryController,'api');
self::$apiAction = Core_AppUtils::val($vars,Pkg_Iwp_Doc::queryAction,'index');
// 过滤特殊字符
$apiName = preg_replace('/[^a-z0-9_]+/i', '', $apiName);
$apiName = strtolower(trim($apiName));
$api_content = "{$apiName} 未找到";
$last_mod = FALSE;
do {
if (empty($apiName)) {
$api_content = "错误 500: 无效的 apiName ";
break;
}
$apiFile = Pkg_Iwp_Doc::getApiFile($apiName);
if ($apiFile){
$last_mod = filemtime($apiFile);
$api_content = WikiDoc::parse(file_get_contents($apiFile));
break;
}
} while(false);
$tplEngine->assign('page_title',Pkg_Iwp_Doc::$pageTitle);
$tplEngine->assign('api_content',$api_content);
$tplEngine->assign('last_mod',$last_mod ? date('y-m-d H:i:s',$last_mod) : '未知' );
$tplEngine->display('display.php');
}
static function getApiFile($apiName){
$apiFile = dirname(__FILE__) . '/api' . "/{$apiName}.txt";
if (is_readable($apiFile)){
return $apiFile;
}
return false;
}
/**
* 增加 title 标签
*
* <<title Felix Pleșoianu>>
*
* @param string $title
* @return string
*/
static function plugin_title($title){
Pkg_Iwp_Doc::$pageTitle = trim($title);
return '';
}
/**
* 增加 applnk 标签,用于内部api name链接
*
* <<applnk about , 关于>>
*
* @param string $apiName
* @return string
*/
static function plugin_apilink($apiName){
static $tpl = '[%s %s]';
$secs = explode(',',trim($apiName));
if (!empty($secs)){
$link = array_shift($secs);
if (empty($secs)) $text = $link;
else $text = implode(',',$secs);
$link = self::$apiQueryHome . Core_AppUtils::url(self::$apiController,self::$apiAction,array(
self::queryApiName => trim($link)
));
return sprintf($tpl,$link,$text);
}
return $apiName;
}
}
这个是帮助文档的生成类
index.txt 内容如下
写道
<<title 对 Iwp 的介绍>>
大多数PHPer都想写出运行状态良好的应用程序,而且希望尽可能做得简单且不费事。而Iwp就是一个达成以上目标的框架。
===== Iwp 是什么? 框架又是什么?
当发明计算机编程不久之后,便有人发现,这其中涉及到了太多的重复操作。之后,也许是 Ada Lovelace(人类历史上的首位程序员),又或许是 Alan Turning,决定将计算机程序模块化,从而使得片段程序代码可以重复使用。PHP 程序员们早已习惯了将需要重复使用的代码写在函数中,并将这些函数放在 include 文件里。
同样的,框架是为重用而发明的,存放在独立的文件中,用来简化重复操作的代码。
<<apilink about,关于作者 vb2005xu >>
{{http://1.iwp001.sinaapp.com/iwp/public/me.jpg}}
[http://vb2005xu.iteye.com/blog/1443451 关于这个文档的说明]
大多数PHPer都想写出运行状态良好的应用程序,而且希望尽可能做得简单且不费事。而Iwp就是一个达成以上目标的框架。
===== Iwp 是什么? 框架又是什么?
当发明计算机编程不久之后,便有人发现,这其中涉及到了太多的重复操作。之后,也许是 Ada Lovelace(人类历史上的首位程序员),又或许是 Alan Turning,决定将计算机程序模块化,从而使得片段程序代码可以重复使用。PHP 程序员们早已习惯了将需要重复使用的代码写在函数中,并将这些函数放在 include 文件里。
同样的,框架是为重用而发明的,存放在独立的文件中,用来简化重复操作的代码。
<<apilink about,关于作者 vb2005xu >>
{{http://1.iwp001.sinaapp.com/iwp/public/me.jpg}}
[http://vb2005xu.iteye.com/blog/1443451 关于这个文档的说明]