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 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
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ .DS_Store
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1 @@
1
+ FIXME
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'bundler/gem_tasks'
2
+ Bundler.require
3
+ require 'rake/testtask'
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.test_files = FileList['test/*_test.rb']
7
+ end
8
+
9
+ task :default => :test
@@ -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,7 @@
1
+ class String
2
+
3
+ def to_html
4
+ Simple::Builder.string_to_html(self)
5
+ end
6
+
7
+ end
@@ -0,0 +1,8 @@
1
+ require 'nokogiri'
2
+ require 'rubypants'
3
+
4
+ require 'simple-builder/builders'
5
+ require 'simple-builder/string'
6
+ require 'simple-builder/fragments'
7
+ require 'simple-builder/helpers'
8
+ require 'simple-builder/parsers'
@@ -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’ &lt;and&gt; “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