From e20eb7c6c5c2b77272953c6a3f7a02f414bb4f8c Mon Sep 17 00:00:00 2001 From: Alex Kotov Date: Sat, 24 Feb 2024 08:02:58 +0400 Subject: [PATCH] Add class Repubmark::Elems::CustomLogue --- lib/repubmark.rb | 1 + lib/repubmark/elems/article.rb | 28 ++++++++++++++++++- lib/repubmark/elems/custom_logue.rb | 42 +++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 lib/repubmark/elems/custom_logue.rb diff --git a/lib/repubmark.rb b/lib/repubmark.rb index d5cc6f2..d87c8d2 100644 --- a/lib/repubmark.rb +++ b/lib/repubmark.rb @@ -17,6 +17,7 @@ require_relative 'repubmark/elems/article' # Always inside Article require_relative 'repubmark/elems/annotation' +require_relative 'repubmark/elems/custom_logue' # Always inside Article, Chapter require_relative 'repubmark/elems/chapter' # Always inside Annotation, Blockquote, Chapter diff --git a/lib/repubmark/elems/article.rb b/lib/repubmark/elems/article.rb index f3bd1d8..8d86251 100644 --- a/lib/repubmark/elems/article.rb +++ b/lib/repubmark/elems/article.rb @@ -21,15 +21,19 @@ module Repubmark def to_html [ + @prologue&.to_html, @annotation&.to_html, @chapter&.to_html, + @epilogue&.to_html, ].compact.join.freeze end def to_gemtext [ + @prologue&.to_gemtext, @annotation&.to_gemtext, @chapter&.to_gemtext, + @epilogue&.to_gemtext, ].compact.join("\n\n\n").freeze end @@ -37,9 +41,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 chapter' if @chapter + raise 'Annotation after chapters' if @chapter + raise 'Annotation after epilogue' if @epilogue @annotation = Annotation.new self yield @annotation @@ -52,6 +68,8 @@ module Repubmark end def method_missing(method_name, ...) + raise 'Chapters after chapters' if @epilogue + chapter = @chapter || Chapter.new(self) if chapter.respond_to? method_name @chapter = chapter @@ -61,6 +79,14 @@ module Repubmark end end + def epilogue + raise 'Epilogue already exists' if @epilogue + + @epilogue = CustomLogue.new self + yield @epilogue + nil + end + private def config=(config) diff --git a/lib/repubmark/elems/custom_logue.rb b/lib/repubmark/elems/custom_logue.rb new file mode 100644 index 0000000..5b73c1b --- /dev/null +++ b/lib/repubmark/elems/custom_logue.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +module Repubmark + module Elems + class CustomLogue < Base + FORMATS = %i[html gemtext].freeze + + parents :Canvas + + 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