タグに挿入するファイル名
define("HEADER_FILE", "header.php");
// 文字コード
define("CHARSET", "UTF-8");
// CSSディレクトリ名
define("CSS_DIR", "css");
// CSS基本ファイル名
define("CSS_BASE", "default.css.php");
// CSSタグ
define("CSS_TAG", '');
// キャッシュ LifeTime 秒(ゼロならキャッシュは使わない)
define("CACHE_LIFE_TIME", 0);
// キャッシュディレクトリ名
define("CACHE_DIR", "tmp");
// キャッシュクラス PEAR Cache_Lite
require_once("layout/Cache_Lite/Lite.php");
// html 出力クラス
class Html {
/* ---------- 設定値(適時変更)---------- */
protected $topPage = TOP_PAGE;
protected $layoutDir = LAYOUT_DIR;
protected $layoutFile = LAYOUT_DEFAULT_FILE;
protected $cssDir = CSS_DIR;
protected $defaultCss = CSS_BASE;
protected $charset = CHARSET;
protected $index = array("index.html","index.php","index.htm"); // 省略時ファイル
protected $siteName = SITE_NAME;
protected $headerFile = HEADER_FILE;
protected $r2br = false; // 改行をbrタグに変換(default: false)
protected $cacheLifeTime = CACHE_LIFE_TIME;
protected $cacheDir = CACHE_DIR;
protected $title = "";
protected $contents = "";
protected $dir = "";
protected $file = "";
protected $base = "";
protected $running_timers = array();
protected $homeDir = "";
protected $homeUrl = "";
protected $css = "";
protected $pageUrl = "";
protected $header = "";
protected $layout = "";
protected $errorMessage = "";
protected $errorNumber = "";
protected $rendering = "";
protected $cache = false;
function __construct() {
// レンダリング時間用のタイマー開始
$this->start_timer();
// ホームURLをセット
$this->set_homedir(dirname($_SERVER["PHP_SELF"]));
// キャッシュ
$this->set_cache();
// 出力
$this->output();
}
/* ---------- setter & getter ----------- */
function set_dirname($dirname) {
$this->dir = $this->_adjust_dir($dirname);
}
function set_homedir($dirname) {
$this->homeDir = $this->_adjust_dir($dirname);
if ($this->homeDir) {
$this->homeUrl = $this->homeDir;
} else {
$this->homeUrl = DS;
}
}
function set_file($file) {
$this->file = $file;
$this->pageUrl = $this->homeDir . DS . $this->file;
}
function set_title($title) {
if ($this->siteName) $this->title = $this->siteName . " - ";
$this->title .= $title;
}
function set_cache() {
if ($this->cacheLifeTime == 0) {
$this->cache = false;
return false;
}
$options = array(
'cacheDir' => $this->cacheDir . DS,
'lifeTime' => $this->cacheLifeTime
);
$this->cache = new Cache_Lite($options);
return true;
}
/* ----------- method ----------- */
// 出力
function output() {
// リクエストファイルを受信
$this->receive_file();
// キャッシュ出力
if (($this->cache) and ($data = $this->cache->get($this->file))) {
echo $data;
return true;
}
// ファイルの読み込み
$this->read_file();
// レイアウトファイルを選択
if ($this->select_layout()) {
// レンダリング時間用のタイマー終了
$this->stop_timer();
// プロパティを展開
extract(get_object_vars($this));
// レイアウトを表示
ob_start();
include($this->layout);
$buffer = ob_get_contents();
@ob_end_flush();
// キャッシュに保存
if (($this->cache) and (!$this->errorNumber)) $this->cache->save($buffer);
return true;
} else {
// エラー表示
$this->outputError();
return false;
}
}
// リクエストファイルを受信
function receive_file() {
if (!($file = $this->_h("file"))) $file = $this->topPage;
$this->set_file($file);
}
// ファイルの読み込み
function read_file() {
// コンテンツ読み込み
$this->read_contents();
// ヘッダ読み込み
$this->read_header();
// 基本cssのタグをセット
$this->set_default_css();
}
// コンテンツの読み込み
function read_contents() {
if ($this->check_file($this->file)) {
// プロパティを展開
extract(get_object_vars($this));
ob_start();
include($this->file);
$this->contents = ob_get_contents();
@ob_end_clean();
// 設定値読み込み
$this->get_config($this->contents);
// 改行をbrに変換
if ($this->r2br) $this->contents = $this->_r2br($this->contents);
// カレントディレクトリのcssのタグをセット
$this->set_current_css();
} else {
$func = "error" . $this->errorNumber;
$this->$func();
}
}
// レイアウトのディレクトリを設定
function select_layout() {
// カレントディレクトリをチェック
if ($this->dir) {
$path = realpath($this->dir);
$layoutFile = $path;
if ($this->layoutDir) $layoutFile .= DS . $this->layoutDir;
$layoutFile .= DS . $this->layoutFile;
if (is_file($layoutFile)) {
$this->layout = $layoutFile;
return true;
}
}
// ルートディレクトリをチェック
$layoutFile = $this->layoutDir . DS . $this->layoutFile;
if (is_file($layoutFile)) {
$this->layout = $layoutFile;
return true;
}
$this->errorNumber = "404";
$this->errorMessage = "not found layout : " . $this->layoutFile;
return false;
}
// ファイルの存在チェック
function check_file($file) {
if (file_exists($file)) {
if (is_file($file)) {
$dirname = dirname($file);
} else {
$dirname = $file;
if (!$file = $this->check_index($dirname)) {
$this->errorNumber = "403";
return false;
}
}
$this->set_dirname($dirname);
$this->set_file($file);
$this->base = basename($file);
return true;
} else {
$this->errorNumber = "404";
return false;
}
}
// 省略時ファイルの存在チェック
function check_index($dirname) {
if (!(substr($dirname, -1) == DS)) $dirname .= DS;
foreach ($this->index as $value) {
$file = $dirname . $value;
if (file_exists($file)) return $file;
}
return false;
}
// GETデータをチェック
function _h($name) {
if (isset($_GET[$name]) and ($_GET[$name])) {
return htmlspecialchars($_GET[$name], ENT_QUOTES, $this->charset);
} else {
return false;
}
}
// コンテンツから設定値取得
function get_config($contents) {
// タイトル
if (preg_match('/config_title:"([^"]+)"/', $contents, $matches)) {
$this->set_title($matches[1]);
}
// レイアウト
if (preg_match('/config_layout:"([^"]+)"/', $contents, $matches)) {
$this->layoutFile = $matches[1];
}
// 改行変換フラグ
if (preg_match('/config_br:"([^"]+)"/', $contents, $matches)) {
if (strtolower($matches[1]) == "yes") $this->r2br = true;
}
}
// css関連のタグ出力
function set_default_css() {
// default css
if ($this->defaultCss) {
$css = $this->homeDir;
if ($this->cssDir) $css .= DS . $this->cssDir;
$css .= DS . $this->defaultCss;
$out = sprintf(CSS_TAG, $css) . "\n";
$this->css = $out . $this->css;
}
}
// カレントディレクトリのcss
function set_current_css() {
$out = "";
$path = realpath($this->dir);
if (is_dir($path . DS . $this->cssDir)) {
$d = dir($path . DS . $this->cssDir);
while (false !== ($entry = $d->read())) {
if ((!$this->dir) and ($entry == $this->defaultCss)) continue;
if (preg_match('/\.css/', $entry)) {
$css = $this->homeDir;
if ($this->dir) $css .= DS . $this->dir;
if ($this->cssDir) $css .= DS . $this->cssDir;
$css .= DS . $entry;
$out .= sprintf(CSS_TAG, $css) . "\n";
}
}
$d->close();
}
$this->css = $out . $this->css;
return $out;
}
//