simple-builder 0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +3 -0
- data/README.md +1 -0
- data/Rakefile +9 -0
- data/lib/simple-builder/builders.rb +67 -0
- data/lib/simple-builder/fragments.rb +41 -0
- data/lib/simple-builder/helpers.rb +55 -0
- data/lib/simple-builder/parsers.rb +27 -0
- data/lib/simple-builder/string.rb +7 -0
- data/lib/simple-builder.rb +8 -0
- data/simple-builder.gemspec +23 -0
- data/test/builder_test.rb +53 -0
- metadata +139 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 7d2b59531cfd70ca72b3078ce6a844741ff88d88abed85921d3a555529eb378f
|
4
|
+
data.tar.gz: d871021f4dfcd4bba1c12fe8d8e84fb97cac3432fc45176bcb7aca277b690f74
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ca3e79b297e5abf5e8e86a44e00513cb2275e2dbfc28ebb0caa903e2d57e9f726c892e445b952788f73094b8348dec46a904219bb32d8cc1328cf941f02f2f3f
|
7
|
+
data.tar.gz: b53a1e68e0b0ee0b8118c6794533d8f78ece3479a8241cf45e1ce2f44c118dc16ed53fa86cb2aee6d23b24f3a546c34f15e4a5e730c294517c78dc281c1dee68
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
FIXME
|
data/Rakefile
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
module Simple
|
2
|
+
|
3
|
+
class Builder
|
4
|
+
|
5
|
+
def self.build_html4_document(&block)
|
6
|
+
HTML4Document.new.build_html(&block)
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.build_html5_document(&block)
|
10
|
+
HTML5Document.new.build_html(&block)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.build_html(&block)
|
14
|
+
HTMLFragment.new.build_html(&block)
|
15
|
+
end
|
16
|
+
|
17
|
+
def build_html(&block)
|
18
|
+
Nokogiri::HTML::Builder.with(@root) do |builder|
|
19
|
+
yield(builder)
|
20
|
+
end
|
21
|
+
@root
|
22
|
+
end
|
23
|
+
|
24
|
+
class HTMLDocument < Builder
|
25
|
+
|
26
|
+
def initialize
|
27
|
+
super
|
28
|
+
@root = Nokogiri::HTML::Document.new
|
29
|
+
@root.encoding = 'UTF-8'
|
30
|
+
@root.internal_subset.remove
|
31
|
+
@root.create_internal_subset(*internal_subset) if internal_subset
|
32
|
+
end
|
33
|
+
|
34
|
+
def internal_subset
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
class HTML4Document < HTMLDocument
|
41
|
+
|
42
|
+
def internal_subset
|
43
|
+
['html', '-//W3C//DTD HTML 4.01 Transitional//EN', 'http://www.w3.org/TR/html4/loose.dtd']
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
class HTML5Document < HTMLDocument
|
49
|
+
|
50
|
+
def internal_subset
|
51
|
+
['html', nil, nil]
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
class HTMLFragment < Builder
|
57
|
+
|
58
|
+
def initialize
|
59
|
+
super
|
60
|
+
@root = Nokogiri::HTML.fragment('')
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Simple
|
2
|
+
|
3
|
+
class Builder
|
4
|
+
|
5
|
+
class << self
|
6
|
+
|
7
|
+
def viewport
|
8
|
+
build_html do |html|
|
9
|
+
html.meta(name: 'viewport', content: 'width=device-width, initial-scale=1')
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def style(href=nil, &block)
|
14
|
+
build_html do |html|
|
15
|
+
if href
|
16
|
+
html.link(href: href, rel: 'stylesheet', type: 'text/css')
|
17
|
+
elsif block_given?
|
18
|
+
html.style(type: 'text/css') do
|
19
|
+
html << yield
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def script(src=nil, &block)
|
26
|
+
build_html do |html|
|
27
|
+
if src
|
28
|
+
html.script(src: src, type: 'text/javascript')
|
29
|
+
elsif block_given?
|
30
|
+
html.script(type: 'text/javascript') do
|
31
|
+
html << yield
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Simple
|
2
|
+
|
3
|
+
class Builder
|
4
|
+
|
5
|
+
class << self
|
6
|
+
|
7
|
+
def find_link_element_attributes(doc)
|
8
|
+
doc.xpath('//@href | //@src')
|
9
|
+
end
|
10
|
+
|
11
|
+
def find_head_element(doc)
|
12
|
+
doc.at_xpath('/html/head')
|
13
|
+
end
|
14
|
+
|
15
|
+
def find_body_element(doc)
|
16
|
+
doc.at_xpath('/html/body')
|
17
|
+
end
|
18
|
+
|
19
|
+
def find_title_element(doc)
|
20
|
+
find_head_element(doc).at_xpath('title')
|
21
|
+
end
|
22
|
+
|
23
|
+
def find_meta_info(doc)
|
24
|
+
find_head_element(doc).xpath('meta[@name]').map do |meta|
|
25
|
+
[meta['name'], meta['content']]
|
26
|
+
end.to_h
|
27
|
+
end
|
28
|
+
|
29
|
+
def find_p_child_elements(doc)
|
30
|
+
if (p = doc.at_xpath('p'))
|
31
|
+
p.children
|
32
|
+
else
|
33
|
+
doc
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def replace_element(doc, xpath, &block)
|
38
|
+
doc.xpath(xpath).each do |elem|
|
39
|
+
elem.replace(yield(elem))
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def string_to_html(str)
|
44
|
+
find_p_child_elements(
|
45
|
+
parse_html_fragment(
|
46
|
+
RubyPants.new(str).to_html
|
47
|
+
)
|
48
|
+
).to_html
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Simple
|
2
|
+
|
3
|
+
class Builder
|
4
|
+
|
5
|
+
class ParseError < StandardError; end
|
6
|
+
|
7
|
+
class << self
|
8
|
+
|
9
|
+
def parse_html_document(html)
|
10
|
+
Nokogiri::HTML5::Document.parse(html).tap { |doc| check_html_errors(doc) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def parse_html_fragment(html)
|
14
|
+
Nokogiri::HTML5::DocumentFragment.parse(html).tap { |doc| check_html_errors(doc) }
|
15
|
+
end
|
16
|
+
|
17
|
+
def check_html_errors(doc)
|
18
|
+
doc.errors.each do |error|
|
19
|
+
raise ParseError, "HTML error #{error}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
Gem::Specification.new do |gem|
|
2
|
+
gem.name = 'simple-builder'
|
3
|
+
gem.version = '0.3'
|
4
|
+
gem.licenses = ['MIT']
|
5
|
+
gem.authors = 'John Labovitz'
|
6
|
+
gem.email = 'johnl@johnlabovitz.com'
|
7
|
+
gem.summary = %q{Simple HTML builder}
|
8
|
+
gem.description = %q{Simple HTML builder.}
|
9
|
+
gem.homepage = 'https://github.com/jslabovitz/simple-builder.git'
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($/)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.require_paths = ['lib']
|
15
|
+
|
16
|
+
gem.add_dependency 'nokogiri', '~> 1.15'
|
17
|
+
gem.add_dependency 'rubypants', '~> 0.7'
|
18
|
+
|
19
|
+
gem.add_development_dependency 'bundler', '~> 2.4'
|
20
|
+
gem.add_development_dependency 'minitest', '~> 5.20'
|
21
|
+
gem.add_development_dependency 'minitest-power_assert', '~> 0.3'
|
22
|
+
gem.add_development_dependency 'rake', '~> 13.1'
|
23
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'minitest/power_assert'
|
3
|
+
|
4
|
+
$LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
|
5
|
+
require 'simple-builder'
|
6
|
+
|
7
|
+
module Simple
|
8
|
+
|
9
|
+
class BuilderTest < Minitest::Test
|
10
|
+
|
11
|
+
def test_html4_document
|
12
|
+
html = Simple::Builder.build_html4_document do |b|
|
13
|
+
b.html(lang: 'en') do
|
14
|
+
b.h1('foo')
|
15
|
+
end
|
16
|
+
end.to_html
|
17
|
+
expected_html = <<END
|
18
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
19
|
+
<html lang="en"><h1>foo</h1></html>
|
20
|
+
END
|
21
|
+
assert { html == expected_html }
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_html5_document
|
25
|
+
html = Simple::Builder.build_html5_document do |b|
|
26
|
+
b.html(lang: 'en') do
|
27
|
+
b.h1('foo')
|
28
|
+
end
|
29
|
+
end.to_html
|
30
|
+
expected_html = <<END
|
31
|
+
<!DOCTYPE html>
|
32
|
+
<html lang="en"><h1>foo</h1></html>
|
33
|
+
END
|
34
|
+
assert { html == expected_html }
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_fragment
|
38
|
+
html = Simple::Builder.build_html do |b|
|
39
|
+
b.h1('foo')
|
40
|
+
end.to_html
|
41
|
+
expected_html = %q{<h1>foo</h1>}
|
42
|
+
assert { html == expected_html }
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_string_to_html
|
46
|
+
html = %q{'foo' <and> "bar"}.to_html
|
47
|
+
expected_html = %q{‘foo’ <and> “bar”}
|
48
|
+
assert { html == expected_html }
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
metadata
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: simple-builder
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.3'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- John Labovitz
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-11-30 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: nokogiri
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.15'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.15'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rubypants
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.7'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.7'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.4'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.4'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '5.20'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '5.20'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest-power_assert
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.3'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.3'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '13.1'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '13.1'
|
97
|
+
description: Simple HTML builder.
|
98
|
+
email: johnl@johnlabovitz.com
|
99
|
+
executables: []
|
100
|
+
extensions: []
|
101
|
+
extra_rdoc_files: []
|
102
|
+
files:
|
103
|
+
- ".gitignore"
|
104
|
+
- Gemfile
|
105
|
+
- README.md
|
106
|
+
- Rakefile
|
107
|
+
- lib/simple-builder.rb
|
108
|
+
- lib/simple-builder/builders.rb
|
109
|
+
- lib/simple-builder/fragments.rb
|
110
|
+
- lib/simple-builder/helpers.rb
|
111
|
+
- lib/simple-builder/parsers.rb
|
112
|
+
- lib/simple-builder/string.rb
|
113
|
+
- simple-builder.gemspec
|
114
|
+
- test/builder_test.rb
|
115
|
+
homepage: https://github.com/jslabovitz/simple-builder.git
|
116
|
+
licenses:
|
117
|
+
- MIT
|
118
|
+
metadata: {}
|
119
|
+
post_install_message:
|
120
|
+
rdoc_options: []
|
121
|
+
require_paths:
|
122
|
+
- lib
|
123
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '0'
|
128
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - ">="
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0'
|
133
|
+
requirements: []
|
134
|
+
rubygems_version: 3.4.22
|
135
|
+
signing_key:
|
136
|
+
specification_version: 4
|
137
|
+
summary: Simple HTML builder
|
138
|
+
test_files:
|
139
|
+
- test/builder_test.rb
|