杏z学習帳
Swiftを中心にFlutterやらUnityなどに手を出してます

Publishで日付とかで階層つけてパスを構築したい(2020/09/19)

Publishで日付とかで階層つけてパスを構築したい

Swift製静的サイトジェネレーター Publish の使い方。

記事のURLで日付で階層にしたい

Publish でデフォルトの設定は

struct BlogPublish: Website {
    enum SectionID: String, WebsiteSectionID {
        // Add the sections that you want your website to contain here:
        case posts
    }

    struct ItemMetadata: WebsiteItemMetadata {
        // Add any site-specific metadata that you want to use here.
    }

    // Update these properties to configure your website:
    var url = URL(string: "https://example.com")!
    var name = "BlogPublish"
    var description = "A description of BlogPublish"
    var language: Language { .japanese }
    var imagePath: Path? { nil }
}

こうなっていて、実際に記事を書くところのフォルダ構成が

Content
  ├ index.md
  └ posts
      ├ index.md
      └ first-post.md

という感じになっています。
この状態で記事のパスは /posts/fist-post/ になり、とてもわかり易いです。

では、日付で階層を1つ深くするのはどうするのでしょう?
これまたとても簡単で記事を書くContentの中で実現してしまえばいいだけです。

たとえば /posts/2020/09/first-item/ としたい場合は

Content
  ├ index.md
  └ posts
      └ 2020
         └ 09
           └ index.md

というフォルダ構造にして記事を配置していけば、generateしたときには自然といい感じに処理してくれます 👍

ハマってた話

わかってしまえばすごく簡単なのですが、実は結構ハマっていました。
まさか(?)フォルダ構成を変えたらいい感じにやってくれるとは露ほども思っていなかったので、
WebSite のプロパティをなにかオーバーライドするのかな?とか
ビルドステップになにか差し込んでやるのなかな?とか...
いきなり深淵を覗こうとしたものでめちゃくちゃ迷路にハマってました。

この PR 見ていてわかったのです。そのまま変えるだけでいいんだと...
本当に助かりました 🙏