TITLE:H整形済みテキスト書式の導入
%indent
#contents
//-- convert_html L800 L1100

////////////////////////////////////////////////////////////////
* 方針 [#h5024014]
- 字下げ書式では、行頭の空白は無視されるため、従来の空白整形済みテキストに代わる書式が必要。
- 書式には目に見える文字を当てるべし。
- 先頭が「##&^;##」で始まる「H整形/Hat整形」を導入。
-- 正規表現で行頭を示す「##&^;##」から連想:「##^##」は真の行頭、以降は一字一句そのまま出力。
-- Wikiで引用を表す矢印形「##&>;##」や「##&<;##」からの連想:実際、何かの引用である場合が多い。
- 以降では便宜上、空白で始まる整形済みテキストの書式を「S整形/Space整形」で区別。

////////////////////////////////////////////////////////////////
* 仕様 [#z8a6319e]
- 行頭が「##&^;##」の行は整形済み書式と見なす。基本仕様はS整形に同じ。
  ^    ^    「^」より左は字下げ、「^」より右は整形済みテキスト。
- S整形とH整形の混用は無効。段が一旦切られる。

////////////////////////////////////////////////////////////////
* 改造 [#uc70684d]
+ ##lib/convert_html.php## で、S整形のクラス ##class Pre## を''コピー''。場所は任意だが、流れ的にS整形の直後で、
    #code(diff){{{{
    !    // '^ 'Hat-beginning sentence
    !    // '^ 'Hat-beginning sentence
    !    // '^ 'Hat-beginning sentence
    !    class HPre extends Element  // for Indent extension
         {
    !        function HPre(& $root, $text)
             {
                 parent::Element();
                 $this->elements[] = htmlspecialchars(substr($text, 1));
             }

             function canContain(& $obj)
             {
    !            return is_a($obj, 'HPre');
             }

             function & insert(& $obj)
             {
                 $this->elements[] = $obj->elements[0];
                 return $this;
             }

             function toString()
             {
                 return $this->wrap(join("\n", $this->elements), 'pre');
             }
         }
    }}}}
-- 「##!##」で始まる行は ##class Pre## との差分。
-- ##'HPre'## はH整形の識別キーであり、クラス名との一致が必要。
//
+ 同ファイルの ##class Body## の ##function parse## の ##while (! empty($lines))## 中にて、##Pre## に関する分岐を''コピー''し、
    #code(diff){{{{
             // Pre
    -        if ($head == ' ' || $head == "\t") {
    +        if (!$indent_format && ($head == ' ' || $head == "\t")) {
                 $this->last = & $this->last->add(new Pre($this, $line));
                 continue;
             }
    +        // HPre
    +        if ($head == '^') {
    +            $this->last = & $this->last->add(new HPre($this, $line));
    +            continue;
    +        }
    }}}}
-- ##!$indent_format && ## は字下げ書式でS整形を無効化する条件。
-- ##if ($head == '^')## はH整形への分岐。

////////////////////////////////////////////////////////////////
* コメント
#pcomment

////////////////////////////////////////////////////////////////

    初基 一覧 検索 最新 バックアップ リンク元   ヘルプ   最終更新のRSS