- 追加された行はこの色です。
- 削除された行はこの色です。
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
////////////////////////////////////////////////////////////////