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|