gmi2html 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.editorconfig +9 -0
- data/.gitignore +18 -0
- data/.rubocop.yml +16 -0
- data/.ruby-version +1 -0
- data/.yardoopts +1 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +22 -0
- data/README.gmi +46 -0
- data/Rakefile +20 -0
- data/gmi2html.gemspec +36 -0
- data/lib/gmi2html/document.rb +30 -0
- data/lib/gmi2html/extensions.rb +5 -0
- data/lib/gmi2html/node_renderers/base.rb +50 -0
- data/lib/gmi2html/node_renderers/heading.rb +11 -0
- data/lib/gmi2html/node_renderers/link.rb +34 -0
- data/lib/gmi2html/node_renderers/list_item.rb +22 -0
- data/lib/gmi2html/node_renderers/preformatted.rb +29 -0
- data/lib/gmi2html/node_renderers/quote.rb +11 -0
- data/lib/gmi2html/node_renderers/sub_heading.rb +11 -0
- data/lib/gmi2html/node_renderers/sub_sub_heading.rb +11 -0
- data/lib/gmi2html/node_renderers/text.rb +11 -0
- data/lib/gmi2html/node_renderers/whitespace.rb +14 -0
- data/lib/gmi2html/renderer.rb +27 -0
- data/lib/gmi2html/version.rb +5 -0
- data/lib/gmi2html.rb +19 -0
- data/spec/fixtures/complex.gmi +19 -0
- data/spec/fixtures/complex.html +12 -0
- data/spec/fixtures/simple.gmi +3 -0
- data/spec/fixtures/simple.html +2 -0
- data/spec/gmi2html/document_spec.rb +41 -0
- data/spec/gmi2html/node_renderers/base_spec.rb +65 -0
- data/spec/gmi2html/node_renderers/heading_spec.rb +13 -0
- data/spec/gmi2html/node_renderers/link_spec.rb +20 -0
- data/spec/gmi2html/node_renderers/list_item_spec.rb +50 -0
- data/spec/gmi2html/node_renderers/preformatted_spec.rb +23 -0
- data/spec/gmi2html/node_renderers/quote_spec.rb +13 -0
- data/spec/gmi2html/node_renderers/sub_heading_spec.rb +13 -0
- data/spec/gmi2html/node_renderers/sub_sub_heading_spec.rb +13 -0
- data/spec/gmi2html/node_renderers/text_spec.rb +13 -0
- data/spec/gmi2html/node_renderers/whitespace_spec.rb +34 -0
- data/spec/gmi2html/renderer_spec.rb +48 -0
- data/spec/gmi2html_spec.rb +11 -0
- data/spec/spec_helper.rb +28 -0
- metadata +246 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ae673cf5c85980e03af885f8da0c40ed224fbac8eac0fdc5fb7d83695ed30d7c
|
4
|
+
data.tar.gz: 790e59d74edf8769df5ebd6551245417539536c3308626429a87415d506a6b4d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e9160a96d69dc21b3a9a9918ab0438889e5ab07d9e93dec730a01f0103de781918d2d92de52f82c3d116565302ef7b3773e85db24f174e0a5da2f365e77e12a1
|
7
|
+
data.tar.gz: f3cf8b3d11b3e5190fdc86727262549f366fd7d676757949dd2e6fae7aeb46cbfaaf80d024a60e9e058f039bd8bd2e541e85dc740e9791faffae7d1b9b093c0c
|
data/.editorconfig
ADDED
data/.gitignore
ADDED
data/.rubocop.yml
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.7.2
|
data/.yardoopts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--api public --hide-void-return --markup markdown
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2021 Jeremy Wilkins
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.gmi
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# Gmi2html
|
2
|
+
|
3
|
+
This is a pure ruby Gemtext to HTML convertor, relying on the gemtext gem
|
4
|
+
|
5
|
+
## Gemini
|
6
|
+
|
7
|
+
Gemtext is a simple plain text format, similar to Markdown but simpler. It is the official format for pages within Gemini capsules.
|
8
|
+
|
9
|
+
For more information on Gemini see the official page
|
10
|
+
|
11
|
+
=> //gemini.circumlunar.space Gemini official page
|
12
|
+
=> //gemini.circumlunar.space/docs/specification.gmi Gemini specification
|
13
|
+
|
14
|
+
## Using Gmi2html
|
15
|
+
|
16
|
+
To convert a Gemtext string to an html string
|
17
|
+
|
18
|
+
```
|
19
|
+
require 'gmi2html'
|
20
|
+
|
21
|
+
html_string = Gmi2html::Document.new(my_gemtext_string).to_html
|
22
|
+
```
|
23
|
+
|
24
|
+
To convert a Gemtext file to an html string
|
25
|
+
|
26
|
+
```
|
27
|
+
require 'gmi2html'
|
28
|
+
|
29
|
+
html_string = File.open('capsule/my_gemtext.gmi', 'r') do |f|
|
30
|
+
Gmi2html::Document.new(f).to_html
|
31
|
+
end
|
32
|
+
```
|
33
|
+
|
34
|
+
## Status
|
35
|
+
|
36
|
+
First release but should be feature complete
|
37
|
+
|
38
|
+
### Supported
|
39
|
+
|
40
|
+
* Paragraphs
|
41
|
+
* Headings
|
42
|
+
* Quotes
|
43
|
+
* Whitespace
|
44
|
+
* List items
|
45
|
+
* Preformatted text
|
46
|
+
* Syntax highlighted preformatted text
|
data/Rakefile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler/gem_tasks'
|
5
|
+
require 'rspec/core/rake_task'
|
6
|
+
require 'yard'
|
7
|
+
require 'rubocop/rake_task'
|
8
|
+
|
9
|
+
RuboCop::RakeTask.new
|
10
|
+
|
11
|
+
desc 'Run all examples'
|
12
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
13
|
+
t.rspec_opts = %w[--color]
|
14
|
+
end
|
15
|
+
|
16
|
+
YARD::Rake::YardocTask.new do |t|
|
17
|
+
t.files = ['lib/**/*.rb']
|
18
|
+
end
|
19
|
+
|
20
|
+
task default: :spec
|
data/gmi2html.gemspec
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require 'gmi2html/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |gem|
|
8
|
+
gem.name = 'gmi2html'
|
9
|
+
gem.version = Gmi2html::VERSION
|
10
|
+
gem.summary = 'Gemini to HTML convertor'
|
11
|
+
gem.description = <<~DESCRIPTION
|
12
|
+
Simple pure ruby Gemini to HTML convertor
|
13
|
+
DESCRIPTION
|
14
|
+
gem.authors = ['Jeremy Wilkins']
|
15
|
+
gem.email = ['jeb@jdwilkins.co.uk']
|
16
|
+
gem.homepage = 'https://github.com/jebw/gmi2html'
|
17
|
+
gem.license = 'MIT'
|
18
|
+
|
19
|
+
gem.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
20
|
+
gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
21
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
22
|
+
gem.require_paths = %w[lib]
|
23
|
+
gem.required_ruby_version = '>= 2.5.0'
|
24
|
+
|
25
|
+
gem.add_dependency 'gemtext', '~> 1.0'
|
26
|
+
|
27
|
+
gem.add_development_dependency 'bundler', '~> 2.2'
|
28
|
+
gem.add_development_dependency 'byebug', '~> 11.1'
|
29
|
+
gem.add_development_dependency 'rake', '~> 13.0'
|
30
|
+
gem.add_development_dependency 'rspec', '~> 3.10'
|
31
|
+
gem.add_development_dependency 'rubocop', '~> 1.23'
|
32
|
+
gem.add_development_dependency 'rubocop-rake', '~> 0.6'
|
33
|
+
gem.add_development_dependency 'rubocop-rspec', '~> 2.6'
|
34
|
+
gem.add_development_dependency 'simplecov', '~> 0.21'
|
35
|
+
gem.add_development_dependency 'yard', '~> 0.9.26'
|
36
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'gemtext'
|
4
|
+
|
5
|
+
module Gmi2html
|
6
|
+
class Document
|
7
|
+
def initialize(doc)
|
8
|
+
@document_io = wrap_document(doc)
|
9
|
+
@gemtext = parse_gemtext
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_html
|
13
|
+
renderer.to_html
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def wrap_document(doc)
|
19
|
+
doc.is_a?(String) ? StringIO.new(doc) : doc
|
20
|
+
end
|
21
|
+
|
22
|
+
def parse_gemtext
|
23
|
+
::Gemtext::Parser.new(@document_io).parse
|
24
|
+
end
|
25
|
+
|
26
|
+
def renderer
|
27
|
+
Renderer.new @gemtext.nodes
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'cgi'
|
4
|
+
|
5
|
+
module Gmi2html
|
6
|
+
module NodeRenderers
|
7
|
+
class NotGemtextNode < RuntimeError
|
8
|
+
def initialize
|
9
|
+
super 'Supplied object does not inherit from Gemtext::Node'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Base
|
14
|
+
class << self
|
15
|
+
def for_gemtext(gemtext_node)
|
16
|
+
klass_for_gemtext_node(gemtext_node).new gemtext_node
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def klass_for_gemtext_node(node)
|
22
|
+
raise NotGemtextNode unless node.is_a? Gemtext::Node
|
23
|
+
|
24
|
+
node_type = node.class.to_s.split('::').last
|
25
|
+
Gmi2html::NodeRenderers.const_get node_type
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def initialize(node)
|
30
|
+
@node = node
|
31
|
+
end
|
32
|
+
|
33
|
+
def render(_prev_node = nil, _next_node = nil)
|
34
|
+
"<#{tag}>#{escaped_content}</#{tag}>\n"
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_s
|
38
|
+
render
|
39
|
+
end
|
40
|
+
|
41
|
+
def content
|
42
|
+
@node.content
|
43
|
+
end
|
44
|
+
|
45
|
+
def escaped_content
|
46
|
+
CGI.escapeHTML(content)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Gmi2html
|
4
|
+
module NodeRenderers
|
5
|
+
class Link < Base
|
6
|
+
def tag
|
7
|
+
'a'
|
8
|
+
end
|
9
|
+
|
10
|
+
def wrapping_tag
|
11
|
+
'p'
|
12
|
+
end
|
13
|
+
|
14
|
+
def escaped_link
|
15
|
+
CGI.escapeHTML(@node.target)
|
16
|
+
end
|
17
|
+
|
18
|
+
def escaped_description
|
19
|
+
CGI.escapeHTML(@node.description)
|
20
|
+
end
|
21
|
+
|
22
|
+
def rendered_link_tag
|
23
|
+
%(<#{tag} href="#{escaped_link}">#{escaped_description}</#{tag}>\n)
|
24
|
+
end
|
25
|
+
|
26
|
+
def render(_prev_node = nil, _next_node = nil)
|
27
|
+
prefix = "<#{wrapping_tag}>\n"
|
28
|
+
suffix = "</#{wrapping_tag}>\n"
|
29
|
+
|
30
|
+
"#{prefix}#{rendered_link_tag}#{suffix}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Gmi2html
|
4
|
+
module NodeRenderers
|
5
|
+
class ListItem < Base
|
6
|
+
def tag
|
7
|
+
'li'
|
8
|
+
end
|
9
|
+
|
10
|
+
def wrapping_tag
|
11
|
+
'ul'
|
12
|
+
end
|
13
|
+
|
14
|
+
def render(prev_node = nil, next_node = nil)
|
15
|
+
prefix = prev_node.is_a?(Gemtext::ListItem) ? '' : "<#{wrapping_tag}>\n"
|
16
|
+
suffix = next_node.is_a?(Gemtext::ListItem) ? '' : "</#{wrapping_tag}>\n"
|
17
|
+
|
18
|
+
"#{prefix}#{super}#{suffix}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Gmi2html
|
4
|
+
module NodeRenderers
|
5
|
+
class Preformatted < Base
|
6
|
+
def tag
|
7
|
+
'pre'
|
8
|
+
end
|
9
|
+
|
10
|
+
def escaped_link
|
11
|
+
CGI.escapeHTML(@node.target)
|
12
|
+
end
|
13
|
+
|
14
|
+
def escaped_alt_text
|
15
|
+
CGI.escapeHTML(@node.caption)
|
16
|
+
end
|
17
|
+
|
18
|
+
def escaped_code
|
19
|
+
return escaped_content unless @node.caption
|
20
|
+
|
21
|
+
%(<code class="language-#{escaped_alt_text}">#{escaped_content}</code>)
|
22
|
+
end
|
23
|
+
|
24
|
+
def render(_prev_node = nil, _next_node = nil)
|
25
|
+
%(<#{tag}>#{escaped_code}</#{tag}>\n)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Gmi2html
|
4
|
+
module NodeRenderers
|
5
|
+
class Whitespace < Base
|
6
|
+
def render(prev_node = nil, _next_node = nil)
|
7
|
+
# Skip the first whitespace node except at start of document
|
8
|
+
return if prev_node && !prev_node.is_a?(Gemtext::Whitespace)
|
9
|
+
|
10
|
+
"<br />\n"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Gmi2html
|
4
|
+
class Renderer
|
5
|
+
attr_reader :nodes
|
6
|
+
|
7
|
+
def initialize(nodes)
|
8
|
+
@nodes = nodes
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_html
|
12
|
+
rendered_nodes.compact.join
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def rendered_nodes
|
18
|
+
nodes.map.with_index do |node, index|
|
19
|
+
prev_node = index >= 0 ? nodes[index - 1] : nil
|
20
|
+
next_node = nodes[index + 1]
|
21
|
+
|
22
|
+
node_renderer = NodeRenderers::Base.for_gemtext(node)
|
23
|
+
node_renderer.render(prev_node, next_node)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/gmi2html.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'gmi2html/document'
|
4
|
+
require 'gmi2html/node_renderers/base'
|
5
|
+
require 'gmi2html/node_renderers/heading'
|
6
|
+
require 'gmi2html/node_renderers/sub_heading'
|
7
|
+
require 'gmi2html/node_renderers/sub_sub_heading'
|
8
|
+
require 'gmi2html/node_renderers/text'
|
9
|
+
require 'gmi2html/node_renderers/quote'
|
10
|
+
require 'gmi2html/node_renderers/link'
|
11
|
+
require 'gmi2html/node_renderers/list_item'
|
12
|
+
require 'gmi2html/node_renderers/whitespace'
|
13
|
+
require 'gmi2html/node_renderers/preformatted'
|
14
|
+
require 'gmi2html/renderer'
|
15
|
+
require 'gmi2html/version'
|
16
|
+
require 'gmi2html/extensions'
|
17
|
+
|
18
|
+
module Gmi2html
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Hello world
|
2
|
+
|
3
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
4
|
+
|
5
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
|
6
|
+
|
7
|
+
## Some bullets
|
8
|
+
|
9
|
+
* First
|
10
|
+
* Second
|
11
|
+
* Third
|
12
|
+
|
13
|
+
### Third level heading
|
14
|
+
|
15
|
+
This is some more text
|
16
|
+
|
17
|
+
```
|
18
|
+
This is a pre-formatted text block
|
19
|
+
```
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<h1>Hello world</h1>
|
2
|
+
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
|
3
|
+
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
|
4
|
+
<h2>Some bullets</h2>
|
5
|
+
<ul>
|
6
|
+
<li>First</li>
|
7
|
+
<li>Second</li>
|
8
|
+
<li>Third</li>
|
9
|
+
</ul>
|
10
|
+
<h3>Third level heading</h3>
|
11
|
+
<p>This is some more text</p>
|
12
|
+
<pre>This is a pre-formatted text block</pre>
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Gmi2html::Document do
|
6
|
+
describe '#new' do
|
7
|
+
context 'with open file' do
|
8
|
+
subject { described_class.new StringIO.new("# Title\n\nBody content") }
|
9
|
+
|
10
|
+
it { is_expected.to be_instance_of described_class }
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'with gemini content' do
|
14
|
+
subject { described_class.new "# Title\n\nBody content" }
|
15
|
+
|
16
|
+
it { is_expected.to be_instance_of described_class }
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'without gemini content' do
|
20
|
+
let(:instance) { described_class.new }
|
21
|
+
|
22
|
+
it { expect { instance }.to raise_exception ArgumentError }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#to_html' do
|
27
|
+
subject { instance.to_html }
|
28
|
+
|
29
|
+
let(:instance) { described_class.new File.read(gemtext_file) }
|
30
|
+
|
31
|
+
shared_examples 'a converted gemtext file' do |filename|
|
32
|
+
let(:gemtext_file) { "spec/fixtures/#{filename}.gmi" }
|
33
|
+
let(:expected_html_output) { File.read "spec/fixtures/#{filename}.html" }
|
34
|
+
|
35
|
+
it { is_expected.to eql expected_html_output }
|
36
|
+
end
|
37
|
+
|
38
|
+
it_behaves_like 'a converted gemtext file', 'simple'
|
39
|
+
it_behaves_like 'a converted gemtext file', 'complex'
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Gmi2html::NodeRenderers::Base do
|
6
|
+
let(:content) { 'Hello, world!' }
|
7
|
+
let(:instance) { test_node_renderer.new Gemtext::Node.new(content) }
|
8
|
+
|
9
|
+
let :test_node_renderer do
|
10
|
+
Class.new(described_class) do
|
11
|
+
def tag
|
12
|
+
'test'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '.for_gemtext' do
|
18
|
+
let(:node) { Gemtext::Text.new content }
|
19
|
+
let(:instance) { described_class.for_gemtext node }
|
20
|
+
|
21
|
+
it 'will return a Gmi2html::NodeRenderers::Text' do
|
22
|
+
expect(instance).to be_kind_of Gmi2html::NodeRenderers::Text
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'will assign the content' do
|
26
|
+
expect(instance.content).to eq node.content
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#render' do
|
31
|
+
it 'will generate a <test> html element' do
|
32
|
+
expect(instance.render).to match %r{\A<test>[^<]+</test>}
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'will include the content' do
|
36
|
+
expect(instance.render).to match %r{>Hello, world!<}
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'will end with a newline' do
|
40
|
+
expect(instance.render).to match %r{</test>\n\z}
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'with html tags in' do
|
44
|
+
let(:content) { '<p>Hello</p>' }
|
45
|
+
|
46
|
+
it 'will escape the content' do
|
47
|
+
expect(instance.render).to eql "<test><p>Hello</p></test>\n"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'with html special chars' do
|
52
|
+
let(:content) { 'Hello & world' }
|
53
|
+
|
54
|
+
it 'will escape the content' do
|
55
|
+
expect(instance.render).to eql "<test>Hello & world</test>\n"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe '#to_s' do
|
61
|
+
it 'will generate a <test> html element' do
|
62
|
+
expect(instance.render).to match %r{\A<test>[^<]+</test>}
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Gmi2html::NodeRenderers::Heading do
|
6
|
+
let(:instance) { described_class.new Gemtext::Heading.new('Heading') }
|
7
|
+
|
8
|
+
describe '#render' do
|
9
|
+
subject { instance.render }
|
10
|
+
|
11
|
+
it { is_expected.to eq "<h1>Heading</h1>\n" }
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Gmi2html::NodeRenderers::Link do
|
6
|
+
let(:instance) { described_class.new link }
|
7
|
+
|
8
|
+
describe '#render' do
|
9
|
+
subject(:rendered) { instance.render }
|
10
|
+
|
11
|
+
let(:link) { Gemtext::Link.new '/my-capsule my capsule' }
|
12
|
+
|
13
|
+
context 'when only list item' do
|
14
|
+
it 'will render opening and closing p tags in addition to the a tag' do
|
15
|
+
expect(rendered).to eql \
|
16
|
+
%(<p>\n<a href="/my-capsule">my capsule</a>\n</p>\n)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Gmi2html::NodeRenderers::ListItem do
|
6
|
+
let(:instance) { described_class.new list_item }
|
7
|
+
|
8
|
+
describe '#render' do
|
9
|
+
subject(:rendered) { instance.render(prev_node, next_node) }
|
10
|
+
|
11
|
+
let(:other_node) { Gemtext::Node.new('Hello, world!') }
|
12
|
+
let(:list_item) { Gemtext::ListItem.new 'first item' }
|
13
|
+
|
14
|
+
context 'when only list item' do
|
15
|
+
let(:prev_node) { other_node }
|
16
|
+
let(:next_node) { other_node }
|
17
|
+
|
18
|
+
it 'will render opening and closing ul tags in addition to the li tags' do
|
19
|
+
expect(rendered).to eql "<ul>\n<li>first item</li>\n</ul>\n"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'when first list item' do
|
24
|
+
let(:prev_node) { other_node }
|
25
|
+
let(:next_node) { list_item }
|
26
|
+
|
27
|
+
it 'will render opening ul tag as well as li tags' do
|
28
|
+
expect(rendered).to eql "<ul>\n<li>first item</li>\n"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'when last list item' do
|
33
|
+
let(:prev_node) { list_item }
|
34
|
+
let(:next_node) { nil }
|
35
|
+
|
36
|
+
it 'will render li tags plus closing ul tag' do
|
37
|
+
expect(rendered).to eql "<li>first item</li>\n</ul>\n"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'when in the middle of list items' do
|
42
|
+
let(:prev_node) { list_item }
|
43
|
+
let(:next_node) { list_item }
|
44
|
+
|
45
|
+
it 'will render only the li tags' do
|
46
|
+
expect(rendered).to eql "<li>first item</li>\n"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Gmi2html::NodeRenderers::Preformatted do
|
6
|
+
let(:instance) { described_class.new preformatted }
|
7
|
+
let(:preformatted) { Gemtext::Preformatted.new("Some text\n\n\tIndented") }
|
8
|
+
|
9
|
+
describe '#render' do
|
10
|
+
subject(:rendered) { instance.render }
|
11
|
+
|
12
|
+
it { is_expected.to eq "<pre>Some text\n\n\tIndented</pre>\n" }
|
13
|
+
|
14
|
+
context 'with a specified language' do
|
15
|
+
let(:preformatted) { Gemtext::Preformatted.new('puts "Hello matz"', 'ruby') }
|
16
|
+
|
17
|
+
it 'includes the language class' do
|
18
|
+
expect(rendered).to eq \
|
19
|
+
%(<pre><code class="language-ruby">puts "Hello matz"</code></pre>\n)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Gmi2html::NodeRenderers::Quote do
|
6
|
+
let(:instance) { described_class.new Gemtext::Quote.new('Quote') }
|
7
|
+
|
8
|
+
describe '#render' do
|
9
|
+
subject { instance.render }
|
10
|
+
|
11
|
+
it { is_expected.to eq "<blockquote>Quote</blockquote>\n" }
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Gmi2html::NodeRenderers::SubHeading do
|
6
|
+
let(:instance) { described_class.new Gemtext::SubHeading.new('Heading 2') }
|
7
|
+
|
8
|
+
describe '#render' do
|
9
|
+
subject { instance.render }
|
10
|
+
|
11
|
+
it { is_expected.to eq "<h2>Heading 2</h2>\n" }
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Gmi2html::NodeRenderers::SubSubHeading do
|
6
|
+
let(:instance) { described_class.new Gemtext::SubSubHeading.new('Heading 3') }
|
7
|
+
|
8
|
+
describe '#render' do
|
9
|
+
subject { instance.render }
|
10
|
+
|
11
|
+
it { is_expected.to eq "<h3>Heading 3</h3>\n" }
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Gmi2html::NodeRenderers::Text do
|
6
|
+
let(:instance) { described_class.new Gemtext::Text.new('Hello') }
|
7
|
+
|
8
|
+
describe '#render' do
|
9
|
+
subject { instance.render }
|
10
|
+
|
11
|
+
it { is_expected.to eq "<p>Hello</p>\n" }
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Gmi2html::NodeRenderers::Whitespace do
|
6
|
+
let(:instance) { described_class.new Gemtext::Whitespace.new }
|
7
|
+
|
8
|
+
describe '#render' do
|
9
|
+
subject { instance.render }
|
10
|
+
|
11
|
+
let(:other_node) { Gemtext::Node.new('Hello, world!') }
|
12
|
+
let(:whitespace_node) { Gemtext::Whitespace.new }
|
13
|
+
|
14
|
+
it { is_expected.to eq "<br />\n" }
|
15
|
+
|
16
|
+
context 'when first node in document' do
|
17
|
+
subject { instance.render(nil, other_node) }
|
18
|
+
|
19
|
+
it('will render a break tag') { is_expected.to eq "<br />\n" }
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'when first node in sequence of whitespace nodes' do
|
23
|
+
subject { instance.render(other_node, whitespace_node) }
|
24
|
+
|
25
|
+
it('will not render a break tag') { is_expected.to be_nil }
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'when later node in sequence of whitespace nodes' do
|
29
|
+
subject { instance.render(whitespace_node, other_node) }
|
30
|
+
|
31
|
+
it('will render a break tag') { is_expected.to eq "<br />\n" }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Gmi2html::Renderer do
|
6
|
+
subject(:renderer) { described_class.new(nodes) }
|
7
|
+
|
8
|
+
let(:node) { Gemtext::Text.new('Hello, world!') }
|
9
|
+
let(:heading) { Gemtext::Heading.new('Heading') }
|
10
|
+
let(:heading_renderer) { Gmi2html::NodeRenderers::Heading.new(heading) }
|
11
|
+
let(:nodes) { [heading, node, node] }
|
12
|
+
|
13
|
+
describe '#to_html' do
|
14
|
+
subject(:rendered) { renderer.to_html }
|
15
|
+
|
16
|
+
before do
|
17
|
+
allow(Gmi2html::NodeRenderers::Base).to \
|
18
|
+
receive(:for_gemtext).and_call_original
|
19
|
+
|
20
|
+
allow(Gmi2html::NodeRenderers::Base).to \
|
21
|
+
receive(:for_gemtext).with(heading).and_return(heading_renderer)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'will combine the nodes' do
|
25
|
+
expect(rendered).to eql \
|
26
|
+
"<h1>Heading</h1>\n<p>Hello, world!</p>\n<p>Hello, world!</p>\n"
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'with nodes which render a nil response' do
|
30
|
+
before { allow(heading_renderer).to receive(:render).and_return(nil) }
|
31
|
+
|
32
|
+
it 'will skip those nodes' do
|
33
|
+
expect(rendered).to eql("<p>Hello, world!</p>\n<p>Hello, world!</p>\n")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'with multiple nodes' do
|
38
|
+
let(:nodes) { [node, heading, node] }
|
39
|
+
|
40
|
+
before { allow(heading_renderer).to receive(:render).and_call_original }
|
41
|
+
|
42
|
+
it 'will pass surrounding nodes for context into NodeRenderer#render' do
|
43
|
+
renderer.to_html
|
44
|
+
expect(heading_renderer).to have_received(:render).with(node, node)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'byebug'
|
4
|
+
require 'simplecov'
|
5
|
+
SimpleCov.start do
|
6
|
+
add_filter '/spec/'
|
7
|
+
end
|
8
|
+
|
9
|
+
require 'gmi2html'
|
10
|
+
|
11
|
+
RSpec.configure do |config|
|
12
|
+
config.filter_run_when_matching :focus
|
13
|
+
|
14
|
+
config.disable_monkey_patching!
|
15
|
+
|
16
|
+
if config.files_to_run.one?
|
17
|
+
# Use the documentation formatter for detailed output,
|
18
|
+
# unless a formatter has already been configured
|
19
|
+
# (e.g. via a command-line flag).
|
20
|
+
config.default_formatter = 'doc'
|
21
|
+
end
|
22
|
+
|
23
|
+
config.order = :random
|
24
|
+
|
25
|
+
Kernel.srand config.seed
|
26
|
+
|
27
|
+
config.raise_errors_for_deprecations!
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,246 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gmi2html
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jeremy Wilkins
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-11-17 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: gemtext
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.2'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: byebug
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '11.1'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '11.1'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '13.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '13.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.10'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.10'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubocop
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.23'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.23'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop-rake
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.6'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0.6'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop-rspec
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '2.6'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '2.6'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: simplecov
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0.21'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0.21'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: yard
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 0.9.26
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 0.9.26
|
153
|
+
description: 'Simple pure ruby Gemini to HTML convertor
|
154
|
+
|
155
|
+
'
|
156
|
+
email:
|
157
|
+
- jeb@jdwilkins.co.uk
|
158
|
+
executables: []
|
159
|
+
extensions: []
|
160
|
+
extra_rdoc_files: []
|
161
|
+
files:
|
162
|
+
- ".editorconfig"
|
163
|
+
- ".gitignore"
|
164
|
+
- ".rubocop.yml"
|
165
|
+
- ".ruby-version"
|
166
|
+
- ".yardoopts"
|
167
|
+
- Gemfile
|
168
|
+
- LICENSE.txt
|
169
|
+
- README.gmi
|
170
|
+
- Rakefile
|
171
|
+
- gmi2html.gemspec
|
172
|
+
- lib/gmi2html.rb
|
173
|
+
- lib/gmi2html/document.rb
|
174
|
+
- lib/gmi2html/extensions.rb
|
175
|
+
- lib/gmi2html/node_renderers/base.rb
|
176
|
+
- lib/gmi2html/node_renderers/heading.rb
|
177
|
+
- lib/gmi2html/node_renderers/link.rb
|
178
|
+
- lib/gmi2html/node_renderers/list_item.rb
|
179
|
+
- lib/gmi2html/node_renderers/preformatted.rb
|
180
|
+
- lib/gmi2html/node_renderers/quote.rb
|
181
|
+
- lib/gmi2html/node_renderers/sub_heading.rb
|
182
|
+
- lib/gmi2html/node_renderers/sub_sub_heading.rb
|
183
|
+
- lib/gmi2html/node_renderers/text.rb
|
184
|
+
- lib/gmi2html/node_renderers/whitespace.rb
|
185
|
+
- lib/gmi2html/renderer.rb
|
186
|
+
- lib/gmi2html/version.rb
|
187
|
+
- spec/fixtures/complex.gmi
|
188
|
+
- spec/fixtures/complex.html
|
189
|
+
- spec/fixtures/simple.gmi
|
190
|
+
- spec/fixtures/simple.html
|
191
|
+
- spec/gmi2html/document_spec.rb
|
192
|
+
- spec/gmi2html/node_renderers/base_spec.rb
|
193
|
+
- spec/gmi2html/node_renderers/heading_spec.rb
|
194
|
+
- spec/gmi2html/node_renderers/link_spec.rb
|
195
|
+
- spec/gmi2html/node_renderers/list_item_spec.rb
|
196
|
+
- spec/gmi2html/node_renderers/preformatted_spec.rb
|
197
|
+
- spec/gmi2html/node_renderers/quote_spec.rb
|
198
|
+
- spec/gmi2html/node_renderers/sub_heading_spec.rb
|
199
|
+
- spec/gmi2html/node_renderers/sub_sub_heading_spec.rb
|
200
|
+
- spec/gmi2html/node_renderers/text_spec.rb
|
201
|
+
- spec/gmi2html/node_renderers/whitespace_spec.rb
|
202
|
+
- spec/gmi2html/renderer_spec.rb
|
203
|
+
- spec/gmi2html_spec.rb
|
204
|
+
- spec/spec_helper.rb
|
205
|
+
homepage: https://github.com/jebw/gmi2html
|
206
|
+
licenses:
|
207
|
+
- MIT
|
208
|
+
metadata: {}
|
209
|
+
post_install_message:
|
210
|
+
rdoc_options: []
|
211
|
+
require_paths:
|
212
|
+
- lib
|
213
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
214
|
+
requirements:
|
215
|
+
- - ">="
|
216
|
+
- !ruby/object:Gem::Version
|
217
|
+
version: 2.5.0
|
218
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - ">="
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: '0'
|
223
|
+
requirements: []
|
224
|
+
rubygems_version: 3.1.4
|
225
|
+
signing_key:
|
226
|
+
specification_version: 4
|
227
|
+
summary: Gemini to HTML convertor
|
228
|
+
test_files:
|
229
|
+
- spec/fixtures/complex.gmi
|
230
|
+
- spec/fixtures/complex.html
|
231
|
+
- spec/fixtures/simple.gmi
|
232
|
+
- spec/fixtures/simple.html
|
233
|
+
- spec/gmi2html/document_spec.rb
|
234
|
+
- spec/gmi2html/node_renderers/base_spec.rb
|
235
|
+
- spec/gmi2html/node_renderers/heading_spec.rb
|
236
|
+
- spec/gmi2html/node_renderers/link_spec.rb
|
237
|
+
- spec/gmi2html/node_renderers/list_item_spec.rb
|
238
|
+
- spec/gmi2html/node_renderers/preformatted_spec.rb
|
239
|
+
- spec/gmi2html/node_renderers/quote_spec.rb
|
240
|
+
- spec/gmi2html/node_renderers/sub_heading_spec.rb
|
241
|
+
- spec/gmi2html/node_renderers/sub_sub_heading_spec.rb
|
242
|
+
- spec/gmi2html/node_renderers/text_spec.rb
|
243
|
+
- spec/gmi2html/node_renderers/whitespace_spec.rb
|
244
|
+
- spec/gmi2html/renderer_spec.rb
|
245
|
+
- spec/gmi2html_spec.rb
|
246
|
+
- spec/spec_helper.rb
|