#!/usr/bin/env php
[[-o|--output]
]
选项说明
--project=
-p 用于指定要搜索的项目名称或项目配置文件的路径,
如果指定的是名称,则使用 ../app/.ini 作为配置文件
--output=
-o 指定生成的骨架代码存储位置,默认为当前目录
-h|--help 显示帮助信息
EOF;
exit(0);
}
// output dir
$output = XSUtil::getOpt('o', 'output', true);
if ($output === null) {
$output = '.';
}
if (!is_dir($output)) {
echo "错误:输出目录 ($output) 不是一个有效的目录。\n";
exit(-1);
}
if (!is_writable($output)) {
echo "错误:输出目录 ($output) 不可写入,请注意检查权限。\n";
exit(-1);
}
// execute the search
try {
// create xs object
echo "初始化项目对象 ...\n";
$xs = new XS($project);
// generate varialbes
echo "解析字段,生成变量清单 ...\n";
$vars = array();
// timezone
if (!ini_get('date.timezone')) {
date_default_timezone_set('Asia/Chongqing');
}
// basic
$vars['@project@'] = is_file($project) ? realpath($project) : $project;
$vars['@charset@'] = $xs->getDefaultCharset();
if ($vars['@charset@'] !== 'GB2312' && $vars['@charset@'] !== 'GBK') {
$vars['@charset@'] = 'UTF-8';
}
$vars['@xs_lib_root@'] = XS_LIB_ROOT;
$vars['@date_time@'] = date('Y-m-d H:i:s');
$vars['@project_name@'] = ucfirst($xs->name);
$vars['@package_name@'] = PACKAGE_NAME;
$vars['@package_version@'] = PACKAGE_VERSION;
// fields
$vars['@set_filter@'] = '';
$vars['@set_sort@'] = '';
$vars['@field_id@'] = $xs->getFieldId()->name;
if (($field = $xs->getFieldTitle()) !== false) {
$vars['@field_title@'] = $field->name;
}
if (($field = $xs->getFieldBody()) !== false) {
$vars['@field_body@'] = $field->name;
}
$vars['@field_info@'] = '';
foreach ($xs->getAllFields() as $field) /* @var $field XSFieldMeta */ {
if ($field->hasIndexSelf() && $field->type != XSFieldMeta::TYPE_BODY && !$field->isBoolIndex()) {
$vars['@set_filter@'] .= "\t\t\t\n";
}
if ($field->isNumeric()) {
$vars['@set_sort@'] .= "\t\t\t\t\t\n";
$vars['@set_sort@'] .= "\t\t\t\t\t\n";
}
if ($field->isSpeical()) {
continue;
}
if ($field->type == XSFieldMeta::TYPE_STRING) {
if (!isset($vars['@field_title@'])) {
$vars['@field_title@'] = $field->name;
continue;
}
if (!isset($vars['@field_body@'])) {
$vars['@field_body@'] = $field->name;
continue;
}
}
$vars['@field_info@'] .= "\t\t\t\t" . ucfirst($field->name) . ":" . $field->name . "); ?>\n";
}
$vars['@set_filter@'] = trim($vars['@set_filter@']);
$vars['@set_sort@'] = trim($vars['@set_sort@']);
$vars['@field_info@'] = trim($vars['@field_info@']);
if (!isset($vars['@field_title@'])) {
$vars['@field_title@'] = 'title';
}
if (!isset($vars['@field_body@'])) {
$vars['@field_body@'] = 'body';
}
// output dir
echo "检测并创建输出目录 ...\n";
$output .= '/' . $xs->name;
if (!is_dir($output) && !mkdir($output)) {
throw new XSException('Failed to create output directory: ' . $output);
}
// loop to write-in files
$input = dirname(__FILE__) . '/skel';
$dir = dir($input);
while (($entry = $dir->read()) !== false) {
if ($entry === '.' || $entry === '..') {
continue;
}
if (substr($entry, -3) === '.in') {
echo "正在生成 " . substr($entry, 0, -3) . " ...\n";
$file = $output . '/' . substr($entry, 0, -3);
if (file_exists($file)) {
copy($file, $file . '.bak');
}
$content = file_get_contents($input . '/' . $entry);
$content = strtr($content, $vars);
if ($vars['@charset@'] !== 'UTF-8') {
$content = XS::convert($content, $vars['@charset@'], 'UTF-8');
}
file_put_contents($file, $content);
} else {
echo "正在复制 " . $entry . " ...\n";
$file = $output . '/' . $entry;
if (is_dir($input . '/' . $entry)) {
XSUtil::copyDir($input . '/' . $entry, $file);
} else {
if (file_exists($file)) {
copy($file, $file . '.bak');
}
copy($input . '/' . $entry, $file);
}
}
}
$dir->close();
echo "完成,请将 `$output` 目录转移到 web 可达目录,然后访问 search.php 即可。\n";
} catch (XSException $e) {
// Exception
$start = dirname(dirname(__FILE__)) . '/';
$relative = substr(XSException::getRelPath($start), 0, -1);
$traceString = $e->getTraceAsString();
$traceString = str_replace(dirname(__FILE__) . '/', '', $traceString);
$traceString = str_replace($start, $relative, $traceString);
echo $e . "\n" . $traceString . "\n";
}