SYSTEM238 / PROG1 / PHP / web公開用ノート(s238Note.php)

NOTES1 PROG1
web公開用ノート(s238Note.php)
webに公開するためのノート、本サイトのNOTESやPROG等はこのプログラムを使って公開してます。

概要

webでノートを公開するためのプログラムです。

当初はWordPressとかのブログシステムで作業メモやノートを公開していたんだけど、ブログシステムのエディタで記事を編集するのが面倒なのとMarkdownで記述したくなったので作りました。

ブログシステムを使っていた頃は「PC上のテキストエディタで文章作成→ Web上のエディタに貼り付け→ ブラウザで確認しながらレイアウトを調整」の作業フローで記事を作成していました。

それよりPCのエディタで作成したものを直接アップロードした方が楽チンじゃないかな?と、思ったのがきっかけです。Codaとかのwebエディタなら編集〜アップロードがシームレスにできるしね。

それから、Markdown対応もWordPressに手を入れるのもそれなりの手間だし、それならいっそのこと自分用のwebノートを作った方がイイだろうと判断しました。

だいたいこんな方針で作成しています。

  • 記事の入力インターフェイスは作成しない。記事ファイルを直接アップロードする。
  • データベースは使わず記事ファイルをそのまま読み込む。
  • ファイル配置は簡単なルールに従う。
  • 個人使用を主目的とする。複数編集者、大量記事、大量アクセスなどは考慮しない。
  • とはいえ、一応、記事をキャッシュしてマシン負荷は軽減する。
  • 記事はMarkdown + αのルールで記述する。
  • 記事ファイルをデータ(PHPの配列)化する部分と表示する部分は切り離して作成する。

必要環境

MarkdownライブラリとZend_Cacheのバージョンは開発時のものです。マイナーアップデートなら動作すると思いますが未確認です。

MarkdownライブラリとZend_Cacheがなくても動作しますが機能が制限されます。
 * Markdownライブラリをインクルードしない場合はnl2brでパースされます。
 * Zend_Cacheが無い場合はキャッシュされません。

MarkdownライブラリとZend_Cacheはs238Note.phpのインスタンス生成する前にインクルードしてください。

説明

s238Note.phpのソース

下記リンクをクリックしてください新規Winで表示します。 http://www.sys238.jp/sample/s238note/source_s238Note.php

s238Note.phpの公開メソッド

[コンストラクタ]

function __construct($inputDir, $cacheConf=array(), $cacheRemove=false){}

//$inputDir     ノートを格納しているディレクトリ
//$cacheConf    キャッシュパラメタ
//    array('lifetime'=>保存期間(秒), 'cache_dir'=>保存先ディレクトリ, 'id'=>キャッシュID)
//$cacheRemove  ノートの読み込み前にキャッシュを削除する


// 使用例
$s238Note = new s238Note(
    'notes',
    array('lifetime'=>600, 'cache_dir'=>'cache', 'id'=>'sample'),
    s238Note::isCacheRemove(array('123.456.789.0/24'))
);

// cacheConf(キャッシュパラメタ)のidは、同一ディレクトリで複数ノートのキャッシュを管理する際の識別子です。
// cacheRemove(キャッシュ削除制御)はs238Note::isCacheRemove()を使用すると自動設定できます。
[概要を取得]

public function getSummary($gId=null, $nId=null){}

//$gId    グループID
//$nId    ノートID
//return  array       概要情報


// 使用例
$s238Note->getSummary();                  //全グループ・ノートの概要を取得
$s238Note->getSummary('group1');          //指定グループの概要とグループ内の全ノートの概要を取得
$s238Note->getSummary('group1', 'note1'); //特定ノートの概要を取得
[ノートの詳細を取得]

public function getNote($gId, $nId){}

//$gId    グループID
//$nId    ノートID
//return  array       ノート情報


// 使用例
$s238Note->getNote('group1', 'note1');    //特定ノートの詳細を取得
[ページの存在確認]

public function pageExists($file404, $gId=null, $nId=null){}

//$file404  404エラーページのファイルパス
//$gId      グループID
//$nId      ノートID


// 使用例
$s238Note->pageExists('.../404.php', 'group1', 'note1');    //指定したノートがなければ404エラー
[キャッシュ状況の取得]

public function getCacheState(){}

//return  string  'on'(キャッシュ中) or 'of-nc'(キャッシュ環境なし) or 'of-rm'(キャッシュ削除)


// 使用例
$s238Note->getCacheState();    //キャッシュの動作状況が文字列で返る
[キャッシュクリア判定]

public static function isCacheRemove($iplist=array()){}

//$iplist キャッシュを削除するIPアドレス ex) array('111.111.111.0/24', '222.222.222.222/0', ...)
//return  bool  true(キャッシュ削除)/ false(なにもしない)


// 使用例
$s238Note->isCacheRemove(array('123.456.789.0/24'));

//urlパラメタ"?nocache"がある場合はキャッシュクリア判定をします。
//普段編集に使う環境のIPアドレスを指定しておくとキャッシュが無効になるので編集確認が楽チンです。

ディレクトリ構成例

sample/
 └ s238note
    ├ index.php
    ├ contents/ (ノートディレクトリ)
    │ ├ _hide/ ('_'からはじまるグループ(ディレクトリ)は非表示)
    │ └ group1/
    │    ├ _contents.conf (ノートグループのタイトルと概要を記述)
    │    ├ note1a.md (ノート)
    │    ├ note1b.md ( 〃 )
    │    └ _hide.md ('_'からはじまるノート(ファイル)は非表示)
    ├ temp/ (キャッシュディレクトリ)
    └ libs/
       ├ Zend/
       │ ├ Cache.php
       │ ├ ...
       │
       ├ Markdown/
       │ ├ MarkdownExtra.inc.php
       │ ├ ...
       └ s238Note.php
       

PHPスクリプト例 [index.php]

<?php

require_once('libs/s238Note.php');                    //本体(ノートデータを作成する)
require_once('libs/Zend/Cache.php');                  //キャッシュ
require_once("libs/Markdown/MarkdownExtra.inc.php");  //Markdown

require_once 'libs/Zend/Debug.php';

//ノートオブジェクト
$s238Note   = new s238Note(
    'contents',                 //ノートディレクトリ
    array(                      //キャッシュのパラメタ
        'lifetime'  => 600,       //10分
        'cache_dir' => 'temp',    //キャッシュディレクトリ
        'id'        => 'sample'   //ID(複数ノートでキャッシュディレクトリを共用するために指定)
    ),
    s238Note::isCacheRemove(    //キャッシュの使用有無をtrue/falseで指定
        array('IP/MASK')        //指定IPアドレスからのアクセスはキャッシュを使用しない
    )
);

//全てのグループ・ノートの概要を取得
Zend_Debug::dump($s238Note->getSummary(), 'getSummary():');
//指定したグループの概要とグループ内の全ノートの概要を取得
Zend_Debug::dump($s238Note->getSummary('group1'), "getSummary('group1'):");
//特定ノートの概要を取得
Zend_Debug::dump($s238Note->getSummary('group1', 'note1a_md'), "getSummary('group1', 'note1a_md'):");
//特定ノートの詳細を取得
Zend_Debug::dump($s238Note->getNote('group1', 'note1a_md'), "getNote('group1', 'note1a_md'):");

/**
 * ノートIDはノートファイル名の'.'を'_'に置換したものです。
 */

ノートグループの設定

各グループ下の_contents.confに記述します。ディレクトリ構成例では下記のファイルです。

sample/
 └ s238note
    ├ contents/
    │ └ group1/
    │    ├ _contents.conf

記述内容は下記の通りです。

title:ノートグループのタイトル。
summary:ノートグループの説明。

ノートの記述方法

各グループ下に作成します。ディレクトリ構成例では下記のファイルです。ファイル名と拡張子は自由ですが複数ノートの概要情報を取得した際はファイル名順に取得されます。

sample/
 └ s238note
    ├ contents/
    │ └ group1/
    │    ├ note1a.md
    │    ├ note1b.md

記述内容は下記の通りです。

create_dt:作成日時
update_dt:更新日時
title:ノートのタイトル
summary:ノートの概要
reference:参照情報

note:--
ノート本文

hide:--
非公開ノート
--:hide

このノートの更新日付は「!!filemtime!!」です。
ノート「!!note:group1/note1_md/title!!」は「!!note:group1/note1_md/create_dt!!」に作成されました。
ソースコードを表示します。
<pre><code>!!file:/.. snip!! ../sample.php!!</code></pre>

--:note

タグ

create_dt:〜reference:の値は省略可能です。省略時はデフォルト値が設定されます。特にupdate_dtの省略値はノートの更新日付なので、特に理由のない場合は省略しておくと楽チンです。

他のデフォルト値はs238Note.phpのコンストラクタを参照してください。

note:--〜--:noteの範囲に本文を記述します。Markdownライブラリがインクルードされている場合はMarkdown記法が使用できます。ライブラリをインクルードしていない場合はnl2brでパースされます。

"note:--"、"--:note"タグは単一行に記述してください。それから、note:--〜--:noteは複数指定できます。note:--〜--:noteの範囲外は非公開になるので編集者のメモ書きに使用できます。

hide:--〜--:hideの範囲は非公開になります。こっちは"[非公開]"の文字列がwebに表示されます。このタグも単一行に記述してください。

置換コマンド

note:--〜--:noteのノート本文には以下の置換コマンドが使用できます。

機能 コマンド 説明
更新日付 !!filemtime!! ノートの更新日です。
ノートの参照 !!note:グループ/ノートID/キーワード!! ノートを参照します。
グループはディレクトリ、ノートIDはノートファイル名の'.'を'_'にしたもの、キーワードはcreate_dt〜referenceです。
ファイルの参照 !!file:ファイルパス・名!! ファイルを参照します。ファイルパス〜名は絶対参照で指定してください。

サンプル

下記リンクをクリックしてください新規Winでサンプルを実行します。
http://www.sys238.jp/sample/s238note/

まとめ

機能を絞ることでs238Note.php(データ作成部分)は500ステップ以下の収めることができました。よかったよかった。

このプログラムを作成してから、記事の作成〜管理がずいぶん楽になりました。楽になった分、更新頻度が増えれば万々歳なんですが...

記事の作成〜公開を使い慣れたエディタでできるのがとにかく嬉しいです。

バックアップも、PCのwebエディタで編集したのをそのままアプロードするので、完全なバックアップが常にPC上にあります。WordPressの管理画面からバックアップを作成する手間がなくなりました。

Subversionなどのバージョン管理システムを使うことで複数編集者対応や記事のバージョン管理もできます。

記事の入力インターフェースが無いとか、よその仕組みに比べると機能不足な部分が多いですが、その部分にお気に入りのツールが使えると考えればコレはコレでアリなんじゃないかな?と思ってます。

最後に

大したプログラムではないのですが。たまに問い合わせがあるので。

利用はご自由に、無制限の利用、配布、改変、オッケーです。連絡も不要です。

ただし、本プログラムを使ったことによる、また、使えなかったことによる不都合が発生しても一切の保証はしません。それから、自分とこのシステムに組み込んで納品した後、サポートだけこっちに押し付けるとかはダメですよ。ほんと、勘弁してください。