diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-02-01 01:42:26 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-02-01 01:42:26 +0900 |
| commit | 9c39c8269e5c8a254081ce6cd43d3cd3da440280 (patch) | |
| tree | 78962765501a1682a48c85afc6645dbe50ccbdd6 | |
| parent | 5d8e7205ccbf8d7baaf4133faec49a44c5ae3c70 (diff) | |
| download | nsfisis.dev-9c39c8269e5c8a254081ce6cd43d3cd3da440280.tar.gz nsfisis.dev-9c39c8269e5c8a254081ce6cd43d3cd3da440280.tar.zst nsfisis.dev-9c39c8269e5c8a254081ce6cd43d3cd3da440280.zip | |
refactor(nuldoc): build pipeline
| -rw-r--r-- | services/nuldoc/lib/nuldoc.rb | 1 | ||||
| -rw-r--r-- | services/nuldoc/lib/nuldoc/commands/build.rb | 42 | ||||
| -rw-r--r-- | services/nuldoc/lib/nuldoc/pipeline.rb | 35 |
3 files changed, 62 insertions, 16 deletions
diff --git a/services/nuldoc/lib/nuldoc.rb b/services/nuldoc/lib/nuldoc.rb index 99c1b9fd..83df42d6 100644 --- a/services/nuldoc/lib/nuldoc.rb +++ b/services/nuldoc/lib/nuldoc.rb @@ -9,6 +9,7 @@ require 'rouge' require 'toml-rb' require 'webrick' +require_relative 'nuldoc/pipeline' require_relative 'nuldoc/dom' require_relative 'nuldoc/dom/atom_xml' require_relative 'nuldoc/dom/html' diff --git a/services/nuldoc/lib/nuldoc/commands/build.rb b/services/nuldoc/lib/nuldoc/commands/build.rb index 868493c3..330d3245 100644 --- a/services/nuldoc/lib/nuldoc/commands/build.rb +++ b/services/nuldoc/lib/nuldoc/commands/build.rb @@ -10,22 +10,32 @@ module Nuldoc end def run - posts = build_post_pages - build_post_list_page(posts) - slides = build_slide_pages - build_slide_list_page(slides) - post_tags = build_tag_pages(posts, 'blog') - build_tag_list_page(post_tags, 'blog') - slides_tags = build_tag_pages(slides, 'slides') - build_tag_list_page(slides_tags, 'slides') - build_home_page - build_about_page(slides) - %w[default about blog slides].each { |site| build_not_found_page(site) } - copy_static_files - copy_slides_files(slides) - copy_blog_asset_files - copy_slides_asset_files - copy_post_source_files(posts) + pipeline = Pipeline.new + + pipeline.step(:build_posts) { build_post_pages } + pipeline.step(:build_post_list, deps: [:build_posts]) { |r| build_post_list_page(r[:build_posts]) } + pipeline.step(:build_blog_tags, deps: [:build_posts]) { |r| build_tag_pages(r[:build_posts], 'blog') } + pipeline.step(:build_blog_tag_list, deps: [:build_blog_tags]) do |r| + build_tag_list_page(r[:build_blog_tags], 'blog') + end + pipeline.step(:copy_post_sources, deps: [:build_posts]) { |r| copy_post_source_files(r[:build_posts]) } + + pipeline.step(:build_slides) { build_slide_pages } + pipeline.step(:build_slide_list, deps: [:build_slides]) { |r| build_slide_list_page(r[:build_slides]) } + pipeline.step(:build_slide_tags, deps: [:build_slides]) { |r| build_tag_pages(r[:build_slides], 'slides') } + pipeline.step(:build_slide_tag_list, deps: [:build_slide_tags]) do |r| + build_tag_list_page(r[:build_slide_tags], 'slides') + end + pipeline.step(:build_about, deps: [:build_slides]) { |r| build_about_page(r[:build_slides]) } + pipeline.step(:copy_slides_files, deps: [:build_slides]) { |r| copy_slides_files(r[:build_slides]) } + + pipeline.step(:build_home) { build_home_page } + pipeline.step(:build_not_found) { %w[default about blog slides].each { |site| build_not_found_page(site) } } + pipeline.step(:copy_static) { copy_static_files } + pipeline.step(:copy_blog_assets) { copy_blog_asset_files } + pipeline.step(:copy_slides_assets) { copy_slides_asset_files } + + pipeline.execute end private diff --git a/services/nuldoc/lib/nuldoc/pipeline.rb b/services/nuldoc/lib/nuldoc/pipeline.rb new file mode 100644 index 00000000..7a30049a --- /dev/null +++ b/services/nuldoc/lib/nuldoc/pipeline.rb @@ -0,0 +1,35 @@ +require 'tsort' + +module Nuldoc + Step = Data.define(:name, :deps, :block) + + class Pipeline + include TSort + + def initialize + @steps = {} + end + + def step(name, deps: [], &block) + @steps[name] = Step.new(name: name, deps: deps, block: block) + end + + def execute + results = {} + tsort_each do |name| + results[name] = @steps[name].block.call(results) + end + results + end + + private + + def tsort_each_node(&) + @steps.each_key(&) + end + + def tsort_each_child(name, &) + @steps[name].deps.each(&) + end + end +end |
