tmp
This commit is contained in:
parent
03c4eca9b0
commit
78ff370a4e
8 changed files with 197 additions and 0 deletions
1
Gemfile
1
Gemfile
|
@ -2,4 +2,5 @@
|
|||
|
||||
source 'https://rubygems.org'
|
||||
|
||||
gem 'addressable', '~> 2.8'
|
||||
gem 'i18n', '~> 1.14'
|
||||
|
|
|
@ -34,3 +34,15 @@ Chapter 2 paragraph text
|
|||
|
||||
|
||||
Gemtext epilogue
|
||||
|
||||
|
||||
|
||||
## Related articles
|
||||
|
||||
=> ./foo-bar 1) 2024-09-12 Foo Bar
|
||||
|
||||
|
||||
|
||||
## Links
|
||||
|
||||
=> https://example.com 2) Example Domain
|
||||
|
|
|
@ -81,3 +81,23 @@ Chapter 2 paragraph text
|
|||
<div>
|
||||
HTTP epilogue
|
||||
</div>
|
||||
<h2>Related articles</h2>
|
||||
|
||||
<ol>
|
||||
<li id="self-foo-bar" value="1" class="fragment-highlight">
|
||||
<span class="text-muted">
|
||||
<time datetime="2024-09-12">
|
||||
September 12, 2024
|
||||
</time>
|
||||
</span>
|
||||
<a href="./foo-bar">Foo Bar</a>
|
||||
</li>
|
||||
</ol>
|
||||
<h2>Links</h2>
|
||||
|
||||
<ol>
|
||||
<li id="link-example-com" value="2" class="fragment-highlight">
|
||||
<a href="https://example.com">Example Domain</a>
|
||||
(<a href="https://web.archive.org/arch/example.com">web.archive.org</a>)
|
||||
</li>
|
||||
</ol>
|
||||
|
|
|
@ -58,3 +58,30 @@ 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,
|
||||
slug: 'foo-bar',
|
||||
index: 1,
|
||||
url: './foo-bar',
|
||||
text: 'Foo Bar',
|
||||
date: '2024-09-12',
|
||||
)
|
||||
end
|
||||
|
||||
article.footnotes_category 'Links' do |category|
|
||||
category.footnote(
|
||||
category: :link,
|
||||
slug: 'example-com',
|
||||
index: 2,
|
||||
url: 'https://example.com',
|
||||
text: 'Example Domain',
|
||||
alt_urls: [
|
||||
{
|
||||
name: 'web.archive.org',
|
||||
url: 'https://web.archive.org/arch/example.com',
|
||||
},
|
||||
],
|
||||
)
|
||||
end
|
||||
|
|
|
@ -1,12 +1,15 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'cgi'
|
||||
require 'date'
|
||||
require 'forwardable'
|
||||
require 'open3'
|
||||
require 'pathname'
|
||||
require 'uri'
|
||||
require 'yaml'
|
||||
|
||||
require 'addressable'
|
||||
|
||||
require_relative 'repubmark/config'
|
||||
require_relative 'repubmark/highlight'
|
||||
require_relative 'repubmark/titled_ref'
|
||||
|
@ -19,6 +22,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'
|
||||
# Always inside Annotation, Blockquote, Chapter
|
||||
|
@ -57,6 +61,9 @@ require_relative 'repubmark/elems/text'
|
|||
require_relative 'repubmark/elems/link'
|
||||
require_relative 'repubmark/elems/power'
|
||||
|
||||
# Always inside FootnotesCategory
|
||||
require_relative 'repubmark/elems/footnote'
|
||||
|
||||
module Repubmark
|
||||
FORMATS = %i[gemtext html summary_plain word_count].freeze
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@ module Repubmark
|
|||
def initialize(config) # rubocop:disable Lint/MissingSuper
|
||||
@parent = nil
|
||||
self.config = config
|
||||
@footnotes_categories = []
|
||||
end
|
||||
|
||||
#################
|
||||
|
@ -32,6 +33,7 @@ module Repubmark
|
|||
@annotation&.to_html,
|
||||
@chapter&.to_html,
|
||||
@epilogue&.to_html,
|
||||
*@footnotes_categories.map(&:to_html),
|
||||
].compact.join.freeze
|
||||
end
|
||||
|
||||
|
@ -41,6 +43,7 @@ module Repubmark
|
|||
@annotation&.to_gemtext,
|
||||
@chapter&.to_gemtext,
|
||||
@epilogue&.to_gemtext,
|
||||
*@footnotes_categories.map(&:to_gemtext),
|
||||
].compact.join("\n\n\n").freeze
|
||||
end
|
||||
|
||||
|
@ -94,6 +97,13 @@ module Repubmark
|
|||
nil
|
||||
end
|
||||
|
||||
def footnotes_category(name)
|
||||
footnotes_category = FootnotesCategory.new self, name
|
||||
@footnotes_categories << footnotes_category
|
||||
yield footnotes_category
|
||||
nil
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def config=(config)
|
||||
|
|
74
lib/repubmark/elems/footnote.rb
Normal file
74
lib/repubmark/elems/footnote.rb
Normal file
|
@ -0,0 +1,74 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Repubmark
|
||||
module Elems
|
||||
class Footnote < Base
|
||||
EM_DASH = '—'
|
||||
|
||||
parents :FootnotesCategory
|
||||
|
||||
attr_reader :category, :slug, :index, :url,
|
||||
:text, :descr, :date, :alt_urls
|
||||
|
||||
def initialize(parent, **kwargs)
|
||||
super parent
|
||||
kwargs.each { |k, v| send :"#{k}=", v }
|
||||
end
|
||||
|
||||
#################
|
||||
# Basic methods #
|
||||
#################
|
||||
|
||||
def to_html
|
||||
result = ''
|
||||
result +=
|
||||
%(<li id="#{category}-#{slug}" value="#{index}" class="fragment-highlight">\n)
|
||||
if date
|
||||
result += %(<span class="text-muted">\n)
|
||||
result += %(<time datetime="#{date}">\n)
|
||||
result += "#{I18n.localize(Date.parse(date), format: :long)}\n"
|
||||
result += "</time>\n"
|
||||
result += "</span>\n"
|
||||
end
|
||||
if url
|
||||
scheme = Addressable::URI.parse(url).scheme&.downcase
|
||||
if scheme
|
||||
unless %w[http https].include? scheme
|
||||
result += %(<span class="badge text-bg-secondary">\n)
|
||||
result += %(#{scheme}://\n)
|
||||
result += "</span>\n"
|
||||
end
|
||||
end
|
||||
result += %(<a href="#{url}">#{text}</a>\n)
|
||||
else
|
||||
result += %(#{text}\n)
|
||||
end
|
||||
result += " — #{descr}\n" if descr
|
||||
if alt_urls&.any?
|
||||
result += %[(#{
|
||||
alt_urls.map do |alt_url|
|
||||
%(<a href=\"#{alt_url[:url]}\">#{alt_url[:name]}</a>)
|
||||
end.join ', '
|
||||
})\n]
|
||||
end
|
||||
result += '</li>'
|
||||
result.freeze
|
||||
end
|
||||
|
||||
def to_gemtext
|
||||
result = ''
|
||||
result += url ? "=> #{url}" : '*'
|
||||
result += " #{index})"
|
||||
result += " #{Date.parse(date)}" if date
|
||||
result += " #{text}"
|
||||
result += " #{EM_DASH} #{descr}" if descr
|
||||
result.freeze
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
attr_writer :category, :slug, :index, :url,
|
||||
:text, :descr, :date, :alt_urls
|
||||
end
|
||||
end
|
||||
end
|
46
lib/repubmark/elems/footnotes_category.rb
Normal file
46
lib/repubmark/elems/footnotes_category.rb
Normal file
|
@ -0,0 +1,46 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Repubmark
|
||||
module Elems
|
||||
class FootnotesCategory < Base
|
||||
parents :Article
|
||||
|
||||
def initialize(parent, title)
|
||||
super parent
|
||||
@title = title
|
||||
@footnotes = []
|
||||
end
|
||||
|
||||
#################
|
||||
# Basic methods #
|
||||
#################
|
||||
|
||||
def to_html
|
||||
<<~HTML
|
||||
<h2>#@title</h2>
|
||||
|
||||
<ol>
|
||||
#{@footnotes.map(&:to_html).map(&:strip).join("\n")}
|
||||
</ol>
|
||||
HTML
|
||||
end
|
||||
|
||||
def to_gemtext
|
||||
<<~GEMTEXT
|
||||
## #@title
|
||||
|
||||
#{@footnotes.map(&:to_gemtext).map(&:strip).join("\n")}
|
||||
GEMTEXT
|
||||
end
|
||||
|
||||
###################
|
||||
# Builder methods #
|
||||
###################
|
||||
|
||||
def footnote(**kwargs)
|
||||
@footnotes << Footnote.new(self, **kwargs)
|
||||
nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue