tmp
This commit is contained in:
parent
03c4eca9b0
commit
45f9ad7622
8 changed files with 197 additions and 0 deletions
1
Gemfile
1
Gemfile
|
@ -2,4 +2,5 @@
|
||||||
|
|
||||||
source 'https://rubygems.org'
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
|
gem 'addressable', '~> 2.8'
|
||||||
gem 'i18n', '~> 1.14'
|
gem 'i18n', '~> 1.14'
|
||||||
|
|
|
@ -34,3 +34,15 @@ Chapter 2 paragraph text
|
||||||
|
|
||||||
|
|
||||||
Gemtext epilogue
|
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>
|
<div>
|
||||||
HTTP epilogue
|
HTTP epilogue
|
||||||
</div>
|
</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 :html, 'HTTP epilogue'
|
||||||
custom.for :gemtext, 'Gemtext epilogue'
|
custom.for :gemtext, 'Gemtext epilogue'
|
||||||
end
|
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
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require 'cgi'
|
require 'cgi'
|
||||||
|
require 'date'
|
||||||
require 'forwardable'
|
require 'forwardable'
|
||||||
require 'open3'
|
require 'open3'
|
||||||
require 'pathname'
|
require 'pathname'
|
||||||
require 'uri'
|
require 'uri'
|
||||||
require 'yaml'
|
require 'yaml'
|
||||||
|
|
||||||
|
require 'addressable'
|
||||||
|
|
||||||
require_relative 'repubmark/config'
|
require_relative 'repubmark/config'
|
||||||
require_relative 'repubmark/highlight'
|
require_relative 'repubmark/highlight'
|
||||||
require_relative 'repubmark/titled_ref'
|
require_relative 'repubmark/titled_ref'
|
||||||
|
@ -19,6 +22,7 @@ require_relative 'repubmark/elems/article'
|
||||||
# Always inside Article
|
# Always inside Article
|
||||||
require_relative 'repubmark/elems/annotation'
|
require_relative 'repubmark/elems/annotation'
|
||||||
require_relative 'repubmark/elems/custom_logue'
|
require_relative 'repubmark/elems/custom_logue'
|
||||||
|
require_relative 'repubmark/elems/footnotes_category'
|
||||||
# Always inside Article, Chapter
|
# Always inside Article, Chapter
|
||||||
require_relative 'repubmark/elems/chapter'
|
require_relative 'repubmark/elems/chapter'
|
||||||
# Always inside Annotation, Blockquote, Chapter
|
# Always inside Annotation, Blockquote, Chapter
|
||||||
|
@ -57,6 +61,9 @@ require_relative 'repubmark/elems/text'
|
||||||
require_relative 'repubmark/elems/link'
|
require_relative 'repubmark/elems/link'
|
||||||
require_relative 'repubmark/elems/power'
|
require_relative 'repubmark/elems/power'
|
||||||
|
|
||||||
|
# Always inside FootnotesCategory
|
||||||
|
require_relative 'repubmark/elems/footnote'
|
||||||
|
|
||||||
module Repubmark
|
module Repubmark
|
||||||
FORMATS = %i[gemtext html summary_plain word_count].freeze
|
FORMATS = %i[gemtext html summary_plain word_count].freeze
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ module Repubmark
|
||||||
def initialize(config) # rubocop:disable Lint/MissingSuper
|
def initialize(config) # rubocop:disable Lint/MissingSuper
|
||||||
@parent = nil
|
@parent = nil
|
||||||
self.config = config
|
self.config = config
|
||||||
|
@footnotes_categories = []
|
||||||
end
|
end
|
||||||
|
|
||||||
#################
|
#################
|
||||||
|
@ -32,6 +33,7 @@ module Repubmark
|
||||||
@annotation&.to_html,
|
@annotation&.to_html,
|
||||||
@chapter&.to_html,
|
@chapter&.to_html,
|
||||||
@epilogue&.to_html,
|
@epilogue&.to_html,
|
||||||
|
*@footnotes_categories.map(&:to_html),
|
||||||
].compact.join.freeze
|
].compact.join.freeze
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -41,6 +43,7 @@ module Repubmark
|
||||||
@annotation&.to_gemtext,
|
@annotation&.to_gemtext,
|
||||||
@chapter&.to_gemtext,
|
@chapter&.to_gemtext,
|
||||||
@epilogue&.to_gemtext,
|
@epilogue&.to_gemtext,
|
||||||
|
*@footnotes_categories.map(&:to_gemtext),
|
||||||
].compact.join("\n\n\n").freeze
|
].compact.join("\n\n\n").freeze
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -94,6 +97,13 @@ module Repubmark
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def footnotes_category(name)
|
||||||
|
footnotes_category = FootnotesCategory.new self, name
|
||||||
|
@footnotes_categories << footnotes_category
|
||||||
|
yield footnotes_category
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def config=(config)
|
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