Syntax Demo Download JSR GitHub Visual Studio Marketplace

文法

Indentdownが生成するHTMLは多くありません。
インデントが見出し要素(<h1>-<h6>)とコンテンツ区分要素(<div>)を、空行が段落要素(<p>)と改行要素(<br>)を生成するだけです。
しかしそれ以外に、多くの特徴的な変換が行われます。

入力と出力

入力、出力ともに文字列です。
入力はIndentdownの文法に沿った文字列、出力はHTMLとしての文字列です。

インデント

行頭の2個のスペースがインデントとして扱われます。

行われる変換

以下の処理が順番に行われます。

  • HTMLタグのエスケープ
  • 根ノードの追加
  • 木構造への変換
  • HTMLへの変換
  • 根ノードの削除
  • テキストエリア要素のアンインデント
  • 整形済みテキスト要素のアンインデント

HTMLタグのエスケープ

"#<"が"&lt;"に変換されます。

根ノードの追加

木構造は1個の根ノードしか持ちませんが、HTMLとして最も浅い深さに複数の要素を持ちたい場合があります。
この要求のため、入力の各行のインデントを1増やし、先頭に"ROOT"という行を追加します。

木構造への変換

1行以上の連続する行がノードになります。
各ノードの深さは、インデントの深さになります。
ブロックレベル要素およびテキストエリア要素の開始から終了までは1個のノードになり、ブロックレベル要素フラグが付きます。
それ以外の部分はインデントの深さが変化したときと空行を挟んだときにノードに分割されます。

HTMLへの変換

各ノードのインデントの深さを、ノードの深さにします。

ブロックレベル要素フラグの付いていないノードには以下の変換が行われます。

子ノードを持つ場合

ノードをインデントの深さに応じて見出し要素で囲みます。

子ノードを持たない場合

ノードの各行のインデントの深さを1増やします。
ノードの各行の末尾に改行要素を追加します。
ノードを段落要素で囲みます。

根ノードの削除

ここまでの変換で入力は以下のように変換されているはずです。

<h0>ROOT</h0>
<div>
  内容
</div>

この最初の2行と最後の1行を取り除き、内容のインデントの深さを1減らします。

テキストエリア要素のアンインデント

<textarea></textarea>タグのインデントの深さを0にします。
また、テキストエリア要素の内容はこのインデントの深さ+1だけ減らされます。

例:

<h1>見出し1</h1>
<div>
  <div>
    <textarea>
      テキストエリア要素の
        内容
    </textarea>
  </div>
</div>

このような入力が、

<h1>見出し1</h1>
<div>
  <div>
<textarea>
テキストエリア要素の
  内容
</textarea>
  </div>
</div>

このように出力されます。

整形済みテキスト要素のアンインデント

整形済みテキスト要素<pre>についても、テキストエリア要素と同様の変換が行われます。

終わりに

以上でIndentdownの全ての変換を経てHTMLとしての文字列を得られました。
入力された文字列の末尾に改行が付いていたとしても、出力される文字列の末尾には改行が付いていません。
必要に応じて追加してください。