20年前にPHPでJavaカスタムタグのようなものを実装していた

2001年くらいにPHPJavaカスタムタグのようなものを実装したのを発掘したので放流。

PHPでJavaのカスタムタグっぽいものを実装した2001年 · GitHub

メーリングリストでやりとりをしてたときに
「できらぁ!PHPJavaカスタムタグの実装できらぁ!」
「え、PHPJavaカスタムタグを?」
ってなって、一晩でがーっと作った記憶。
自分だけしか使わない前提で、%var%で変数が埋め込まれる程度のものを作ったのだけど、1年くらい実プロジェクトで使っていた。
600行くらいでコンパクト。
当時は元気があったんだな。

PHP4の時代で、テンプレートエンジンもなかったというかPHP自体がテンプレートエンジンというイメージで まだテンプレートエンジン需要も あまりなかったんじゃないかと。
SynfonyやZend Frameworkもまだ出ていなかった。

こんな感じのテンプレートを書く。

<php:switch condition="%user_type%">
    <php:case value="2">
        <h1>提案書一覧</h1>
    </php:case>
</php:switch>
<pg:exec result="rtn">
    <pg:title field="youki_type_cd">
        <b><pg:result field="youki_type_nm">種類</pg:result></b><br>
        <ul>
    </pg:title>
    <pg:aif href="teian.php?teian=" field="teian_cd"><pg:result field="teian_nm">提案書名</pg:result></pg:aif><br>
    <pg:total field="youki_type_cd">
        </ul>
    </pg:total>
</pg:exec>

そうするとこんなPHPが生成されて、あとはそのままこれを実行する。
そういう動きもJSPのカスタムタグと同じ。
勢いで書いたわりにはよくできてるな。

<?//switch
if (!isset($__phptag_switch_1)) $__phptag_switch_1 = new SwitchTag;
$__phptag_switch_1->parenttag = null;
ob_start();
?><?=$user_type?><?$__phptag_switch_1->attr["condition"] = ob_get_contents();
ob_end_clean();
if ($__phptag_switch_1->doStartTag() == TAG_BODY_INCLUDE){
ob_start();
?>
    <?//case
if (!isset($__phptag_case_2)) $__phptag_case_2 = new CaseTag;
$__phptag_case_2->parenttag = &$__phptag_switch_1;
$__phptag_case_2->attr["value"] = "2";
if ($__phptag_case_2->doStartTag() == TAG_BODY_INCLUDE){
ob_start();
?>
        <h1>提案書一覧</h1>
    <?
$page_content = ob_get_contents();
ob_end_clean();
echo $page_content;
}
$__phptag_case_2->doEndTag();
?>
<?
$page_content = ob_get_contents();
ob_end_clean();
echo $page_content;
}
$__phptag_switch_1->doEndTag();
?>
<?//exec
if (!isset($__phptag_exec_3)) $__phptag_exec_3 = new PgExecTag;
$__phptag_exec_3->parenttag = null;
$__phptag_exec_3->attr["result"] = "rtn";
if ($__phptag_exec_3->doStartTag() == TAG_BODY_INCLUDE){
$__phptag_exec_3->doInitBody();
while(true){
if ($__phptag_exec_3->doBeginBody() == TAG_SKIP_BODY) break;
ob_start();
?>
    <?//title
if (!isset($__phptag_title_4)) $__phptag_title_4 = new PgResultTitleTag;
$__phptag_title_4->parenttag = &$__phptag_exec_3;
$__phptag_title_4->attr["field"] = "youki_type_cd";
if ($__phptag_title_4->doStartTag() == TAG_BODY_INCLUDE){
ob_start();
?>
        <b><?//result
if (!isset($__phptag_result_5)) $__phptag_result_5 = new PgResultTag;
$__phptag_result_5->parenttag = &$__phptag_title_4;
$__phptag_result_5->attr["field"] = "youki_type_nm";
if ($__phptag_result_5->doStartTag() == TAG_BODY_INCLUDE){
ob_start();
?>種類<?
$page_content = ob_get_contents();
ob_end_clean();
echo $page_content;
}
$__phptag_result_5->doEndTag();
?></b><br>
        <ul>
    <?
$page_content = ob_get_contents();
ob_end_clean();
echo $page_content;
}
$__phptag_title_4->doEndTag();
?>
    <?//aif
if (!isset($__phptag_aif_6)) $__phptag_aif_6 = new PgResultIfLinkTag;
$__phptag_aif_6->parenttag = &$__phptag_exec_3;
$__phptag_aif_6->attr["href"] = "teian.php?teian=";
$__phptag_aif_6->attr["field"] = "teian_cd";
if ($__phptag_aif_6->doStartTag() == TAG_BODY_INCLUDE){
ob_start();
?><?//result
if (!isset($__phptag_result_7)) $__phptag_result_7 = new PgResultTag;
$__phptag_result_7->parenttag = &$__phptag_aif_6;
$__phptag_result_7->attr["field"] = "teian_nm";
if ($__phptag_result_7->doStartTag() == TAG_BODY_INCLUDE){
ob_start();
?>提案書名<?
$page_content = ob_get_contents();
ob_end_clean();
echo $page_content;
}
$__phptag_result_7->doEndTag();
?><?
$page_content = ob_get_contents();
ob_end_clean();
echo $page_content;
}
$__phptag_aif_6->doEndTag();
?><br>
    <?//total
if (!isset($__phptag_total_8)) $__phptag_total_8 = new PgResultTotalTag;
$__phptag_total_8->parenttag = &$__phptag_exec_3;
$__phptag_total_8->attr["field"] = "type_cd";
if ($__phptag_total_8->doStartTag() == TAG_BODY_INCLUDE){
$__phptag_total_8->doInitBody();
while(true){
if ($__phptag_total_8->doBeginBody() == TAG_SKIP_BODY) break;
ob_start();
?>
        </ul>
    <?
$page_content = ob_get_contents();
ob_end_clean();
if ($__phptag_total_8->doAfterBody($page_content) != TAG_BODY_AGAIN) break;
}
}
$__phptag_total_8->doEndTag();
?>
<?
$page_content = ob_get_contents();
ob_end_clean();
if ($__phptag_exec_3->doAfterBody($page_content) != TAG_BODY_AGAIN) break;
}
}
$__phptag_exec_3->doEndTag();
?>