blue32a
@blue32a (blue32a)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

テンプレート(HTML + α)のインデントについて

質問

HTMLと他の言語が混在している状況で、インデントはどのように揃えていますか?
例えばウェブテンプレートエンジン(blade、twig、EJSなど)を利用している時です。

私が思いつくのは次の3パターンです。

  • ひとまとめにして揃える
  • それぞれで揃える1
  • それぞれで揃える2

こちらが良い、私はこうしているなどのご意見お待ちしております。

1.ひとまとめにして揃える例

<div class="hoge">
    <ul>
    {% for row in list %}
        {% if not row.isDeleted %}
            <li>{{ row.name }}</li>
        {% endif %}
    {% endfor %}
    </ul>
</div>

{% if isFuga %}
    <div class="fuga">
    </div>
{% endif %}

2.それぞれで揃える例1

テンプレートエンジンの構文はHTMLのインデントに近いところに記述します。

<div class="hoge">
    <ul>
    {% for row in list %}
        {% if not row.isDeleted %}
        <li>{{ row.name }}</li>
        {% endif %}
    {% endfor %}
    </ul>
</div>

{% if isFuga %}
<div class="fuga">
</div>
{% endif %}

3.それぞれで揃える例2

「それぞれで揃える例1」とは違ってテンプレートエンジンの構文もインデント無しから始めます。

<div class="hoge">
    <ul>
{% for row in list %}
    {% if not row.isDeleted %}
        <li>{{ row.name }}</li>
    {% endif %}
{% endfor %}
    </ul>
</div>

{% if isFuga %}
<div class="fuga">
</div>
{% endif %}

私の揃え方

まず最終的な出力であるHTMLのインデントを重視する、という点で「それぞれで揃える」を選択しています。
しかし、テンプレートエンジンの構文をどこから始めるかが悩みどころです。

変更など

私の揃え方を追記しました。
「それぞれで揃える例」を2つに分けました。

2

bladeを使っていて、自分も気になってる部分でした。
機会をありがとうございます。

それぞれで揃える

一応普段はこちらにしてますね(自動整形ツール入れてる時はそちら任せ)。

純粋な素のhtmlではないので、「ひとまとめにして揃える」でも良いと思うのですが、
双方で初歩的な階層ミスの方が起きやすい(自分だけ?)ので
それを防ぐためにも、インデント位置は別でイメージして書きますね。

1Like

@harmless_3d6
回答ありがとうございます。
いろいろ試行錯誤しているものの、なかなかしっくりくる回答に行き着かないので
こういった形で聞いてみました。
参考にさせていただきます。

0Like

エディタに支援機能が何もなく、レンダリング出力もHTMLに特化した何かが行われるものではないプレーンなタイプの場合は「それぞれで揃える」方式で、以下のようにテンプレートの構文の中でインデントすることが多いです。

<div class="hoge">
    <ul>
{% for row in list %}
{%     if not row.isDeleted %}
        <li>{{ row.name }}</li>
{%     endif %}
{% endfor %}
    </ul>
</div>

{% if isFuga %}
<div class="fuga">
</div>
{% endif %}

こうすればインデントが別世界なのも分かりますし、出力に余計なスペースも含まれなくなります。行頭を見ればなんらかのテンプレート的なブロックがあるのが分かるという効果もあります。

エディタに「ひとまとめにして揃える」系の支援機能がある場合は、それに逆らう利点はあまり無いためそれに従います。その場合は以下のようなHTMLの入れ子を無視した分岐は事実上書けなくなるので、インデントの違いだけではなく、そもそも考え方が全然違う感じになります。

<div class="hoge">
    {% if isFuga %}
        <ul class="fuga">
    {% else %}
        <ul>
    {%  endif %}
    {% for row in list %}
        <li>{{ row.name }}</li>
    {% endfor %}
    {% if isFuga %}
        <!-- /fuga ></ul>
    {% else %}
        <ul>
    {%  endif %}
</div>
1Like

@rryu

回答ありがとうございます。
このパターンは思いつきませんでした。
参考にさせていただきます。

<div class="hoge">
    <ul>
{% for row in list %}
{%     if not row.isDeleted %}
        <li>{{ row.name }}</li>
{%     endif %}
{% endfor %}
    </ul>
</div>
0Like

Your answer might help someone💌