<Extends base />
<Insert main>
    <section id="install">
      <h2>インストール</h2>
      <pre><code>pip install nexom</code></pre>
      <div class="note">
        <strong>前提:</strong> Nexom は WSGI ベースです。WSGI サーバ（例: gunicorn）と組み合わせて動かす想定です。
      </div>
    </section>

    <section id="quickstart">
      <h2>最短スタート</h2>
      <p>まずは「HTML を返すルート」を 1 本作るのが最速です。</p>
      <h3>ルート定義（例）</h3>
      <pre><code>from nexom.web.path import Path, Pathlib
from nexom.web.response import HtmlResponse

def index(request, args):
    return HtmlResponse("&lt;h1&gt;Hello Nexom&lt;/h1&gt;")

routing = Pathlib(
    Path("", index, "index"),
)</code></pre>

      <p class="note">
        <strong>ポイント:</strong> Nexom の handler は <code>(request, args)</code> を受け取って <code>Response</code>（または <code>HtmlResponse</code>/<code>JsonResponse</code>）を返すのが基本です。
      </p>
    </section>

    <section id="routing">
      <h2>ルーティング</h2>

      <h3>基本</h3>
      <pre><code>from nexom.web.path import Path, Pathlib

routing = Pathlib(
    Path("", index, "index"),
    Path("doc/", docs, "docs"),
)</code></pre>

      <h3>パスパラメータ（{id}）</h3>
      <p><code>user/{id}</code> のように書くと、URL の該当部分が <code>args</code> に入ります。</p>
      <pre><code>from nexom.web.response import HtmlResponse

def user(request, args):
    return HtmlResponse(f"&lt;p&gt;User ID: {args['id']}&lt;/p&gt;")

Path("user/{id}", user, "user")</code></pre>

      <h3>静的ファイル（Static）</h3>
      <p><code>Static</code> を使うと、ディレクトリ配下のファイルを配信できます。</p>
      <pre><code>from nexom.web.path import Static

Static("static/", "./static", "static_files")</code></pre>
      <ul>
        <li><code>/static/xxx</code> を <code>./static/xxx</code> にマップして配信します。</li>
        <li>ディレクトリトラバーサル対策（<code>../</code>）はフレームワーク側でブロックする設計です。</li>
      </ul>
    </section>

    <section id="responses">
      <h2>レスポンス</h2>

      <h3>HtmlResponse</h3>
      <pre><code>from nexom.web.response import HtmlResponse

return HtmlResponse("&lt;h1&gt;OK&lt;/h1&gt;")</code></pre>

      <h3>JsonResponse</h3>
      <pre><code>from nexom.web.response import JsonResponse

return JsonResponse({"ok": True, "message": "hello"})</code></pre>

      <h3>低レベル Response（自由度重視）</h3>
      <p>高度なことをしたい場合は <code>Response</code> を直接使います。</p>
      <pre><code>from nexom.web.response import Response

# バイナリや任意 Content-Type を返す
return Response(
    b"binary",
    content_type="application/octet-stream",
)</code></pre>

      <h3>リダイレクト</h3>
      <pre><code>from nexom.web.response import Redirect

return Redirect("/to")</code></pre>

      <h3>エラーレスポンス</h3>
      <p>標準のエラーページテンプレートから HTML を生成します。</p>
      <pre><code>from nexom.web.response import ErrorResponse

return ErrorResponse(404, "Not Found")</code></pre>

      <div class="note">
        <strong>charset について:</strong>
        Nexom は <code>str</code> の body を返すときに <code>charset</code> で <code>encode</code> します。<br>
        <code>HtmlResponse</code> / <code>JsonResponse</code> は “短く書ける” 方向で、UTF-8 を前提に使える設計です。
      </div>
    </section>

    <section id="templates">
      <h2>テンプレート</h2>
      <p>Nexom のテンプレートは「最小機能で予測可能」に寄せた独自構文です。</p>

      <h3>変数展開</h3>
      <pre><code>&lt;h1&gt;{{ title }}&lt;/h1&gt;</code></pre>

      <h3>継承（Extends）と差し込み（Insert）</h3>
      <pre><code>&lt;Extends base /&gt;
&lt;Insert main&gt;
  &lt;h1&gt;Hello&lt;/h1&gt;
&lt;/Insert&gt;</code></pre>

      <h3>部品読み込み（Import）</h3>
      <pre><code>&lt;Import header /&gt;</code></pre>

      <h3>Python 側から呼ぶ</h3>
      <pre><code>from nexom.web.template import Templates

templates = Templates("./templates", "default", "document")

html = templates.default(title="Nexom")
return HtmlResponse(html)</code></pre>

      <div class="note">
        <strong>設計方針:</strong> テンプレートにロジックを入れず、「HTML と差し込み」に寄せることで、コード側をシンプルに保つ思想です。
      </div>
    </section>

    <section id="cli">
      <h2>CLI</h2>

      <h3>動作確認</h3>
      <pre><code>python -m nexom test</code></pre>

      <h3>サーバープロジェクト生成</h3>
      <pre><code>python -m nexom build-server myapp</code></pre>

      <p>生成されるプロジェクトには以下が含まれます（構成はバージョンにより変わる場合があります）。</p>
      <ul>
        <li>最小のルーティング定義</li>
        <li>テンプレート一式</li>
        <li>静的ファイル用ディレクトリ</li>
        <li>gunicorn / config の雛形</li>
      </ul>
    </section>

    <section id="tips">
      <h2>運用のコツ</h2>

      <h3>「短く書く層」と「脱出口」を分ける</h3>
      <ul>
        <li>普段: <code>HtmlResponse</code> / <code>JsonResponse</code> を使う</li>
        <li>詰めたい: <code>Response</code> で headers / content-type を直接制御</li>
      </ul>

      <h3>ルーティングは “薄く”</h3>
      <p>handler 内で複雑化しそうなら、関数を分けて「処理の塊」を小さくするのが Nexom と相性良いです。</p>

      <h3>テストのおすすめ</h3>
      <p>公開運用を想定するなら、最低限この3つのテストを用意すると安心です。</p>
      <ul>
        <li>Path の引数抽出</li>
        <li>Static の traversal ブロック</li>
        <li>Response の Content-Type / charset の期待値</li>
      </ul>
    </section>
</Insert>