aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-01 01:42:26 +0900
committernsfisis <nsfisis@gmail.com>2026-02-01 01:42:26 +0900
commit9c39c8269e5c8a254081ce6cd43d3cd3da440280 (patch)
tree78962765501a1682a48c85afc6645dbe50ccbdd6
parent5d8e7205ccbf8d7baaf4133faec49a44c5ae3c70 (diff)
downloadnsfisis.dev-9c39c8269e5c8a254081ce6cd43d3cd3da440280.tar.gz
nsfisis.dev-9c39c8269e5c8a254081ce6cd43d3cd3da440280.tar.zst
nsfisis.dev-9c39c8269e5c8a254081ce6cd43d3cd3da440280.zip
refactor(nuldoc): build pipeline
-rw-r--r--services/nuldoc/lib/nuldoc.rb1
-rw-r--r--services/nuldoc/lib/nuldoc/commands/build.rb42
-rw-r--r--services/nuldoc/lib/nuldoc/pipeline.rb35
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