diff --git a/examples/full.gmi b/examples/full.gmi index 05ca44a..bbb49e3 100644 --- a/examples/full.gmi +++ b/examples/full.gmi @@ -1,3 +1,7 @@ +Gemtext prolofue + + + Annotation paragraph text @@ -29,6 +33,10 @@ Chapter 2 paragraph text +Gemtext epilogue + + + ## Related articles => ./foo-bar 1) 2024-09-12 Foo Bar diff --git a/examples/full.html b/examples/full.html index 2e6dbed..94c2bf4 100644 --- a/examples/full.html +++ b/examples/full.html @@ -1,3 +1,6 @@ +
+HTTP prologue +

@@ -76,7 +79,8 @@ Chapter 2 paragraph text

-
+HTTP epilogue +

Related articles

    @@ -97,4 +101,3 @@ September 12, 2024 (web.archive.org)
-
diff --git a/examples/full.repub b/examples/full.repub index b2ca580..a91e0a2 100644 --- a/examples/full.repub +++ b/examples/full.repub @@ -1,3 +1,8 @@ +article.prologue do |custom| + custom.for :html, 'HTTP prologue' + custom.for :gemtext, 'Gemtext prolofue' +end + article.annotation do |annotation| annotation.paragraph do |paragraph| paragraph.text 'Annotation paragraph text' @@ -49,6 +54,11 @@ end +article.epilogue do |custom| + custom.for :html, 'HTTP epilogue' + custom.for :gemtext, 'Gemtext epilogue' +end + article.footnotes_category 'Related articles' do |category| category.footnote( category: :self, diff --git a/lib/repubmark.rb b/lib/repubmark.rb index 8f3e242..314f721 100644 --- a/lib/repubmark.rb +++ b/lib/repubmark.rb @@ -21,6 +21,7 @@ require_relative 'repubmark/elems/article' # Always inside Article require_relative 'repubmark/elems/annotation' +require_relative 'repubmark/elems/custom_logue' require_relative 'repubmark/elems/footnotes_category' # Always inside Article, Chapter require_relative 'repubmark/elems/chapter' diff --git a/lib/repubmark/elems/article.rb b/lib/repubmark/elems/article.rb index 8041dce..2c14bae 100644 --- a/lib/repubmark/elems/article.rb +++ b/lib/repubmark/elems/article.rb @@ -29,18 +29,20 @@ module Repubmark def to_html [ + @prologue&.to_html, @annotation&.to_html, @chapter&.to_html, - @footnotes_categories.any? ? "
\n
\n" : nil, + @epilogue&.to_html, *@footnotes_categories.map(&:to_html), - @footnotes_categories.any? ? "
\n" : nil, ].compact.join.freeze end def to_gemtext [ + @prologue&.to_gemtext, @annotation&.to_gemtext, @chapter&.to_gemtext, + @epilogue&.to_gemtext, *@footnotes_categories.map(&:to_gemtext), ].compact.join("\n\n\n").freeze end @@ -49,9 +51,21 @@ module Repubmark # Builder methods # ################### + def prologue + raise 'Prologue already exists' if @prologue + raise 'Prologue after annotation' if @annotation + raise 'Prologue after chapters' if @chapters + raise 'Prologue after epilogue' if @epilogue + + @prologue = CustomLogue.new self + yield @prologue + nil + end + def annotation raise 'Annotation already exists' if @annotation raise 'Annotation after chapters' if @chapter + raise 'Annotation after epilogue' if @epilogue @annotation = Annotation.new self yield @annotation @@ -64,6 +78,8 @@ module Repubmark end def method_missing(method_name, ...) + raise 'Chapters after epilogue' if @epilogue + chapter = @chapter || Chapter.new(self) if chapter.respond_to? method_name @chapter = chapter @@ -73,6 +89,14 @@ module Repubmark end end + def epilogue + raise 'Epilogue already exists' if @epilogue + + @epilogue = CustomLogue.new self + yield @epilogue + nil + end + def footnotes_category(name) footnotes_category = FootnotesCategory.new self, name @footnotes_categories << footnotes_category diff --git a/lib/repubmark/elems/custom_logue.rb b/lib/repubmark/elems/custom_logue.rb new file mode 100644 index 0000000..a3bd396 --- /dev/null +++ b/lib/repubmark/elems/custom_logue.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +module Repubmark + module Elems + class CustomLogue < Base + parents :Article + + def initialize(parent) + super parent + @for = {} + end + + ################# + # Basic methods # + ################# + + def to_html + "
\n#{@for[:html].strip}\n
\n".freeze if @for[:html] + end + + def to_gemtext + "#{@for[:gemtext].strip}\n".freeze if @for[:gemtext] + end + + ################### + # Builder methods # + ################### + + def for(format, str) + raise 'Invalid format' unless FORMATS.include? format + raise 'Format already configured' if @for.key? format + + str = String(str).strip.freeze + return if str.empty? + + @for[format] = str + end + end + end +end diff --git a/lib/repubmark/elems/footnote.rb b/lib/repubmark/elems/footnote.rb index 7394fa7..18f1606 100644 --- a/lib/repubmark/elems/footnote.rb +++ b/lib/repubmark/elems/footnote.rb @@ -39,15 +39,11 @@ module Repubmark result += "\n" end end - result += %(#{text}) + result += %(#{text}\n) else - result += text - end - if descr - result += " — #{descr}\n" - else - result += "\n" + result += %(#{text}\n) end + result += " — #{descr}\n" if descr if alt_urls&.any? result += %[(#{ alt_urls.map do |alt_url|