mobiledoc-html-renderer 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f6697ed1f95cc02e5f30ed4b1bd1cce7f3aaf2a3
4
+ data.tar.gz: 5693aad2ca1c66473ff19e5a7897e105262b6228
5
+ SHA512:
6
+ metadata.gz: 01e763a5d4eebe5bc4ba4460413e15f109a3aa6f840a1f4364f8affd1738a6cca016408274a5305590da567323d739dd7003eeb4cd2487c99d5bbf9acc5dc3d0
7
+ data.tar.gz: 99aad0af215587c2df5a6f508085a5e79b1ed287bc0347514635246cecf5faf32a7dcce59431b677bdb8e78fe045fced067049ed851cf430ad7679a448ab0430
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.5
4
+ before_install: gem install bundler -v 1.10.6
@@ -0,0 +1,13 @@
1
+ # Contributor Code of Conduct
2
+
3
+ As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
4
+
5
+ We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion.
6
+
7
+ Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
8
+
9
+ Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
10
+
11
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.
12
+
13
+ This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in mobiledoc-html-renderer.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Justin Giancola
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,67 @@
1
+ # Mobiledoc HTML Renderer for Ruby
2
+
3
+ This is an HTML renderer for the [Mobiledoc format](https://github.com/bustlelabs/mobiledoc-kit/blob/master/MOBILEDOC.md) used by [Mobiledoc-Kit](https://github.com/bustlelabs/mobiledoc-kit).
4
+
5
+ To learn more about Mobiledoc cards and renderers, see the **[Mobiledoc Cards docs](https://github.com/bustlelabs/mobiledoc-kit/blob/master/CARDS.md)**
6
+
7
+ The implementation is based closely on https://github.com/bustlelabs/mobiledoc-html-renderer (kinda sorta a port to Ruby).
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ ```ruby
14
+ gem 'mobiledoc_html_renderer'
15
+ ```
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install mobiledoc_html_renderer
24
+
25
+ ## Usage
26
+
27
+ ```ruby
28
+ require 'mobiledoc_html_renderer'
29
+
30
+ mobiledoc = {
31
+ "version" => "0.2.0",
32
+ "sections" => [
33
+ [ # markers
34
+ ['B']
35
+ ],
36
+ [ # sections
37
+ [1, 'P', [ # array of markups
38
+ # markup
39
+ [
40
+ [0], # open markers (by index)
41
+ 0, # close count
42
+ 'hello world'
43
+ ]
44
+ ]
45
+ ]
46
+ ]
47
+ }
48
+
49
+ renderer = Mobiledoc::HTMLRenderer.new(cards: [])
50
+ renderer.render(mobiledoc) # "<div><p><b>hello world</b></p></div>"
51
+ ```
52
+
53
+ ## Development
54
+
55
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
56
+
57
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
58
+
59
+ ## Contributing
60
+
61
+ Bug reports and pull requests are welcome on GitHub at https://github.com/elucid/mobiledoc-html-renderer. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](contributor-covenant.org) code of conduct.
62
+
63
+
64
+ ## License
65
+
66
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
67
+
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "mobiledoc/html/renderer"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,17 @@
1
+ require "mobiledoc/error"
2
+
3
+ module Mobiledoc
4
+ module UnknownAtom
5
+ module_function
6
+
7
+ def type
8
+ 'html'
9
+ end
10
+
11
+ def render(env, value, payload, options)
12
+ name = env[:name]
13
+
14
+ raise Mobiledoc::Error.new(%Q[Atom "#{name}" not found])
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ module Mobiledoc
2
+ module ImageCard
3
+ module_function
4
+
5
+ def name
6
+ 'image-card'
7
+ end
8
+
9
+ def type
10
+ 'html'
11
+ end
12
+
13
+ def render(env, payload, options)
14
+ if payload['src']
15
+ %Q[<img src="#{payload['src']}">]
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ require "mobiledoc/error"
2
+
3
+ module Mobiledoc
4
+ module UnknownCard
5
+ module_function
6
+
7
+ def type
8
+ 'html'
9
+ end
10
+
11
+ def render(env, payload, options)
12
+ name = env[:name]
13
+
14
+ raise Mobiledoc::Error.new(%Q[Card "#{name}" not found])
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,4 @@
1
+ module Mobiledoc
2
+ class Error < StandardError
3
+ end
4
+ end
@@ -0,0 +1,227 @@
1
+ require "nokogiri"
2
+ require "mobiledoc/utils/section_types"
3
+ require "mobiledoc/utils/tag_names"
4
+ require "mobiledoc/cards/image"
5
+ require "mobiledoc/error"
6
+
7
+ module Mobiledoc
8
+ class Renderer_0_2
9
+ MOBILEDOC_VERSIONS = ['0.2.0']
10
+
11
+ include Mobiledoc::Utils::SectionTypes
12
+ include Mobiledoc::Utils::TagNames
13
+
14
+ attr_accessor :root, :marker_types, :sections, :doc, :cards, :card_options, :unknown_card_handler
15
+
16
+ def initialize(mobiledoc, state)
17
+ version, section_data = *mobiledoc.values_at('version', 'sections')
18
+ validate_version(version)
19
+
20
+ self.marker_types, self.sections = *section_data
21
+
22
+ self.doc = Nokogiri::HTML.fragment('')
23
+ self.root = create_document_fragment
24
+ self.cards = state[:cards]
25
+ self.card_options = state[:card_options]
26
+ self.unknown_card_handler = state[:unknown_card_handler]
27
+ end
28
+
29
+ def validate_version(version)
30
+ unless self.class::MOBILEDOC_VERSIONS.to_a.include? version
31
+ raise Mobiledoc::Error.new(%Q[Unexpected Mobiledoc version "#{version}"])
32
+ end
33
+ end
34
+
35
+ def render
36
+ root = create_document_fragment
37
+
38
+ sections.each do |section|
39
+ rendered = render_section(section)
40
+
41
+ if rendered
42
+ append_child(root, rendered)
43
+ end
44
+ end
45
+
46
+ root.to_html(save_with: 0).gsub(' ', ' &nbsp;')
47
+ end
48
+
49
+ def create_document_fragment
50
+ create_element('div')
51
+ end
52
+
53
+ def create_element(tag_name)
54
+ tag_name = normalize_tag_name(tag_name)
55
+ Nokogiri::XML::Node.new(tag_name, doc)
56
+ end
57
+
58
+ def set_attribute(element, prop_name, prop_value)
59
+ element.set_attribute(prop_name, prop_value)
60
+ end
61
+
62
+ def create_text_node(text)
63
+ Nokogiri::XML::Text.new(text, doc)
64
+ end
65
+
66
+ def create_element_from_marker_type(tag_name='', attributes=[])
67
+ element = create_element(tag_name)
68
+
69
+ attributes.each_slice(2) do |prop_name, prop_value|
70
+ set_attribute(element, prop_name, prop_value)
71
+ end
72
+
73
+ element
74
+ end
75
+
76
+ def append_child(target, child)
77
+ target.add_child(child)
78
+ end
79
+
80
+ def render_section(section)
81
+ type = section.first
82
+ case type
83
+ when MARKUP_SECTION_TYPE
84
+ render_markup_section(*section)
85
+ when IMAGE_SECTION_TYPE
86
+ render_image_section(*section)
87
+ when LIST_SECTION_TYPE
88
+ render_list_section(*section)
89
+ when CARD_SECTION_TYPE
90
+ render_card_section(*section)
91
+ end
92
+ end
93
+
94
+ def render_markup_section(type, tag_name, markers)
95
+ return unless valid_section_tag_name?(tag_name, MARKUP_SECTION_TYPE)
96
+
97
+ element = create_element(tag_name)
98
+ _render_markers_on_element(element, markers)
99
+ element
100
+ end
101
+
102
+ def render_image_section(type, url)
103
+ element = create_element('img')
104
+ set_attribute(element, 'src', url)
105
+ element
106
+ end
107
+
108
+ def render_list_section(type, tag_name, items)
109
+ return unless valid_section_tag_name?(tag_name, LIST_SECTION_TYPE)
110
+
111
+ element = create_element(tag_name)
112
+ items.each do |item|
113
+ append_child(element, render_list_item(item))
114
+ end
115
+
116
+ element
117
+ end
118
+
119
+ def render_list_item(markers)
120
+ element = create_element('li')
121
+ _render_markers_on_element(element, markers)
122
+ element
123
+ end
124
+
125
+ def render_card_section(type, name, payload={})
126
+ card = find_card(name)
127
+
128
+ _render_card_section(card, name, payload)
129
+ end
130
+
131
+ def _render_card_section(card, name, payload)
132
+ card_wrapper = _create_card_element
133
+ card_arg = _create_card_argument(name, payload)
134
+ rendered = card.render(*card_arg)
135
+
136
+ _validate_card_render(rendered, card.name)
137
+
138
+ if rendered
139
+ append_child(card_wrapper, rendered)
140
+ end
141
+
142
+ card_wrapper
143
+ end
144
+
145
+ def find_card(name)
146
+ card = cards.find { |c| c.name == name }
147
+
148
+ case
149
+ when card
150
+ card
151
+ when ImageCard.name == name
152
+ ImageCard
153
+ else
154
+ unknown_card_handler
155
+ end
156
+ end
157
+
158
+ def _create_card_element
159
+ create_element('div')
160
+ end
161
+
162
+ def _create_card_argument(card_name, payload={})
163
+ env = {
164
+ name: card_name
165
+ }
166
+
167
+ [ env, payload, card_options ]
168
+ end
169
+
170
+ def _validate_card_render(rendered, card_name)
171
+ return unless rendered
172
+
173
+ unless rendered.is_a?(String)
174
+ raise Mobiledoc::Error.new(%Q[Card "#{card_name}" must render html, but result was #{rendered.class}"]);
175
+ end
176
+ end
177
+
178
+ def _render_markers_on_element(element, markers)
179
+ elements = [element]
180
+ current_element = element
181
+
182
+ markers.each do |marker|
183
+ open_types, close_count, text = *marker
184
+
185
+ open_types.each do |open_type|
186
+ marker_type = marker_types[open_type]
187
+ tag_name = marker_type.first
188
+
189
+ if valid_marker_type?(tag_name)
190
+ opened_element = create_element_from_marker_type(*marker_type)
191
+ append_child(current_element, opened_element)
192
+ elements.push(opened_element)
193
+ current_element = opened_element
194
+ else
195
+ close_count -= 1
196
+ end
197
+ end
198
+
199
+ append_child(current_element, create_text_node(text))
200
+
201
+ close_count.times do
202
+ elements.pop
203
+ current_element = elements.last
204
+ end
205
+ end
206
+ end
207
+
208
+ def valid_section_tag_name?(tag_name, section_type)
209
+ tag_name = normalize_tag_name(tag_name)
210
+
211
+ case section_type
212
+ when MARKUP_SECTION_TYPE
213
+ MARKUP_SECTION_TAG_NAMES.include?(tag_name)
214
+ when LIST_SECTION_TYPE
215
+ LIST_SECTION_TAG_NAMES.include?(tag_name)
216
+ else
217
+ raise Mobiledoc::Error.new(%Q[Cannot validate tag_name for unknown section type "#{section_type}"])
218
+ end
219
+ end
220
+
221
+ def valid_marker_type?(type)
222
+ type = normalize_tag_name(type)
223
+
224
+ MARKUP_TYPES.include?(type)
225
+ end
226
+ end
227
+ end
@@ -0,0 +1,143 @@
1
+ require "mobiledoc/renderers/0.2"
2
+ require 'mobiledoc/utils/marker_types'
3
+ require "mobiledoc/error"
4
+
5
+ module Mobiledoc
6
+ class Renderer_0_3 < Renderer_0_2
7
+ MOBILEDOC_VERSIONS = ['0.3.0', '0.3.1', '0.3.2']
8
+
9
+ include Mobiledoc::Utils::MarkerTypes
10
+
11
+ attr_accessor :atom_types, :card_types, :atoms, :unknown_atom_handler
12
+
13
+ def initialize(mobiledoc, state)
14
+ version, sections, atom_types, card_types, marker_types = *mobiledoc.values_at('version', 'sections', 'atoms', 'cards', 'markups')
15
+ validate_version(version)
16
+
17
+ self.doc = Nokogiri::HTML.fragment('')
18
+ self.root = create_document_fragment
19
+ self.sections = sections
20
+ self.atom_types = atom_types
21
+ self.card_types = card_types
22
+ self.marker_types = marker_types
23
+ self.cards = state[:cards]
24
+ self.atoms = state[:atoms]
25
+ self.card_options = state[:card_options]
26
+ self.unknown_card_handler = state[:unknown_card_handler]
27
+ self.unknown_atom_handler = state[:unknown_atom_handler]
28
+ end
29
+
30
+ def render_markup_section(type, tag_name, markers, attributes = [])
31
+ return unless valid_section_tag_name?(tag_name, MARKUP_SECTION_TYPE)
32
+
33
+ element = create_element(tag_name)
34
+ attributes.each_slice(2) do |prop_name, prop_value|
35
+ set_attribute(element, prop_name, prop_value)
36
+ end
37
+ _render_markers_on_element(element, markers)
38
+ element
39
+ end
40
+
41
+ def render_card_section(type, index)
42
+ card, name, payload = _find_card_by_index(index)
43
+
44
+ _render_card_section(card, name, payload)
45
+ end
46
+
47
+ def _find_card_by_index(index)
48
+ card_type = card_types[index]
49
+
50
+ unless card_type
51
+ raise Mobiledoc::Error.new("No card definition found at index #{index}")
52
+ end
53
+
54
+ name, payload = *card_type
55
+ card = find_card(name)
56
+
57
+ [ card, name, payload ]
58
+ end
59
+
60
+ def _render_markers_on_element(element, markers)
61
+ elements = [element]
62
+ current_element = element
63
+
64
+ markers.each do |marker|
65
+ type, open_types, close_count, value = *marker
66
+
67
+ open_types.each do |open_type|
68
+ marker_type = marker_types[open_type]
69
+ tag_name = marker_type.first
70
+
71
+ if valid_marker_type?(tag_name)
72
+ opened_element = create_element_from_marker_type(*marker_type)
73
+ append_child(current_element, opened_element)
74
+ elements.push(opened_element)
75
+ current_element = opened_element
76
+ else
77
+ close_count -= 1
78
+ end
79
+ end
80
+
81
+ case type
82
+ when MARKUP_MARKER_TYPE
83
+ append_child(current_element, create_text_node(value))
84
+ when ATOM_MARKER_TYPE
85
+ append_child(current_element, _render_atom(value))
86
+ else
87
+ raise Mobiledoc::Error.new("Unknown markup type (#{type})");
88
+ end
89
+
90
+ close_count.times do
91
+ elements.pop
92
+ current_element = elements.last
93
+ end
94
+ end
95
+ end
96
+
97
+ def find_atom(name)
98
+ atom = atoms.find { |a| a.name == name }
99
+
100
+ atom || unknown_atom_handler
101
+ end
102
+
103
+ def _render_atom(index)
104
+ atom, name, value, payload = _find_atom_by_index(index)
105
+ atom_arg = _create_atom_argument(atom, name, value, payload)
106
+ rendered = atom.render(*atom_arg)
107
+
108
+ _validate_atom_render(rendered, atom.name)
109
+
110
+ rendered || create_text_node('')
111
+ end
112
+
113
+ def _find_atom_by_index(index)
114
+ atom_type = atom_types[index]
115
+
116
+ unless atom_type
117
+ raise Mobiledoc::Error.new("No atom definition found at index #{index}")
118
+ end
119
+
120
+ name, value, payload = *atom_type
121
+ atom = find_atom(name)
122
+
123
+ [ atom, name, value, payload ]
124
+ end
125
+
126
+ def _create_atom_argument(atom, atom_name, value, payload={})
127
+ env = {
128
+ name: atom_name
129
+ }
130
+
131
+ [ env, value, payload, card_options ]
132
+ end
133
+
134
+ def _validate_atom_render(rendered, atom_name)
135
+ return unless rendered
136
+
137
+ unless rendered.is_a?(String)
138
+ raise Mobiledoc::Error.new(%Q[Atom "#{atom_name}" must render html, but result was #{rendered.class}"]);
139
+ end
140
+ end
141
+
142
+ end
143
+ end
@@ -0,0 +1,8 @@
1
+ module Mobiledoc
2
+ module Utils
3
+ module MarkerTypes
4
+ MARKUP_MARKER_TYPE = 0
5
+ ATOM_MARKER_TYPE = 1
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,10 @@
1
+ module Mobiledoc
2
+ module Utils
3
+ module SectionTypes
4
+ MARKUP_SECTION_TYPE = 1
5
+ IMAGE_SECTION_TYPE = 2
6
+ LIST_SECTION_TYPE = 3
7
+ CARD_SECTION_TYPE = 10
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,21 @@
1
+ module Mobiledoc
2
+ module Utils
3
+ module TagNames
4
+ MARKUP_SECTION_TAG_NAMES = [
5
+ 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'blockquote', 'pull-quote', 'aside'
6
+ ]
7
+
8
+ LIST_SECTION_TAG_NAMES = [
9
+ 'ul', 'ol'
10
+ ]
11
+
12
+ MARKUP_TYPES = [
13
+ 'b', 'i', 'strong', 'em', 'a', 'u', 'sub', 'sup', 's', 'code'
14
+ ]
15
+
16
+ def normalize_tag_name(name)
17
+ name.downcase
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,78 @@
1
+ require "mobiledoc_html_renderer/version"
2
+ require "mobiledoc/renderers/0.2"
3
+ require "mobiledoc/renderers/0.3"
4
+ require "mobiledoc/cards/unknown"
5
+ require "mobiledoc/atoms/unknown"
6
+ require "mobiledoc/error"
7
+
8
+ module Mobiledoc
9
+ class HTMLRenderer
10
+ attr_accessor :state
11
+
12
+ def initialize(options={})
13
+ cards = options[:cards] || []
14
+ validate_cards(cards)
15
+
16
+ atoms = options[:atoms] || []
17
+ validate_atoms(atoms)
18
+
19
+ card_options = options[:card_options] || {}
20
+
21
+ unknown_card_handler = options[:unknown_card_handler] || UnknownCard
22
+ unknown_atom_handler = options[:unknown_atom_handler] || UnknownAtom
23
+
24
+ self.state = {
25
+ cards: cards,
26
+ atoms: atoms,
27
+ card_options: card_options,
28
+ unknown_card_handler: unknown_card_handler,
29
+ unknown_atom_handler: unknown_atom_handler
30
+ }
31
+ end
32
+
33
+ def validate_cards(cards)
34
+ unless cards.is_a?(Array)
35
+ raise Mobiledoc::Error.new("`cards` must be passed as an array")
36
+ end
37
+
38
+ cards.each do |card|
39
+ unless card.type == 'html'
40
+ raise Mobiledoc::Error.new(%Q[Card "#{card.name}" must be of type "html", was "#{card.type}"])
41
+ end
42
+
43
+ unless card.respond_to?(:render)
44
+ raise Mobiledoc::Error.new(%Q[Card "#{card.name}" must define \`render\`])
45
+ end
46
+ end
47
+ end
48
+
49
+ def validate_atoms(atoms)
50
+ unless atoms.is_a?(Array)
51
+ raise Mobiledoc::Error.new("`atoms` must be passed as an array")
52
+ end
53
+
54
+ atoms.each do |atom|
55
+ unless atom.type == 'html'
56
+ raise Mobiledoc::Error.new(%Q[Atom "#{atom.name}" must be of type "html", was "#{atom.type}"])
57
+ end
58
+
59
+ unless atom.respond_to?(:render)
60
+ raise Mobiledoc::Error.new(%Q[Atom "#{atom.name}" must define \`render\`])
61
+ end
62
+ end
63
+ end
64
+
65
+ def render(mobiledoc)
66
+ version = mobiledoc['version']
67
+
68
+ case version
69
+ when '0.2.0'
70
+ Renderer_0_2.new(mobiledoc, state).render
71
+ when '0.3.0', '0.3.1', '0.3.2', nil
72
+ Renderer_0_3.new(mobiledoc, state).render
73
+ else
74
+ raise Mobiledoc::Error.new(%Q[Unexpected Mobiledoc version "#{version}"])
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,5 @@
1
+ module Mobiledoc
2
+ class HTMLRenderer
3
+ VERSION = "1.0.0"
4
+ end
5
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'mobiledoc_html_renderer/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "mobiledoc-html-renderer"
8
+ spec.version = Mobiledoc::HTMLRenderer::VERSION
9
+ spec.authors = ["Justin Giancola"]
10
+ spec.email = ["justin.giancola@gmail.com"]
11
+
12
+ spec.summary = %q{MobileDoc HTML Renderer for Ruby}
13
+ spec.homepage = "https://github.com/elucid/mobiledoc-html-renderer"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = "exe"
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "> 1.10"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "pry"
25
+
26
+ spec.add_dependency "nokogiri", "~> 1.6"
27
+ end
metadata ADDED
@@ -0,0 +1,136 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mobiledoc-html-renderer
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Justin Giancola
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-12-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: nokogiri
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.6'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.6'
83
+ description:
84
+ email:
85
+ - justin.giancola@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".rspec"
92
+ - ".travis.yml"
93
+ - CODE_OF_CONDUCT.md
94
+ - Gemfile
95
+ - LICENSE.txt
96
+ - README.md
97
+ - Rakefile
98
+ - bin/console
99
+ - bin/setup
100
+ - lib/mobiledoc/atoms/unknown.rb
101
+ - lib/mobiledoc/cards/image.rb
102
+ - lib/mobiledoc/cards/unknown.rb
103
+ - lib/mobiledoc/error.rb
104
+ - lib/mobiledoc/renderers/0.2.rb
105
+ - lib/mobiledoc/renderers/0.3.rb
106
+ - lib/mobiledoc/utils/marker_types.rb
107
+ - lib/mobiledoc/utils/section_types.rb
108
+ - lib/mobiledoc/utils/tag_names.rb
109
+ - lib/mobiledoc_html_renderer.rb
110
+ - lib/mobiledoc_html_renderer/version.rb
111
+ - mobiledoc-html-renderer.gemspec
112
+ homepage: https://github.com/elucid/mobiledoc-html-renderer
113
+ licenses:
114
+ - MIT
115
+ metadata: {}
116
+ post_install_message:
117
+ rdoc_options: []
118
+ require_paths:
119
+ - lib
120
+ required_ruby_version: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ required_rubygems_version: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ requirements: []
131
+ rubyforge_project:
132
+ rubygems_version: 2.2.2
133
+ signing_key:
134
+ specification_version: 4
135
+ summary: MobileDoc HTML Renderer for Ruby
136
+ test_files: []