html-tag 1.2.0 → 2.0.0
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 +4 -4
- data/.version +1 -1
- data/lib/html-tag.rb +2 -5
- data/lib/html-tag/adapter.rb +3 -35
- data/lib/html-tag/html_tag.rb +18 -0
- data/lib/html-tag/html_tag_builder.rb +124 -0
- metadata +8 -21
- data/lib/html-tag/base.rb +0 -116
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c14a5d669505ed74d43e52cb564a8635a48a21670e0dce86756b3fc18a90a28
|
4
|
+
data.tar.gz: 00c996b4444863bd710c722585b53638a28f562e64a79483335a853a7e4670e0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 00eebf82a2b96e95f25272f536ada28d90115a2a177a129c5877a966449dc87de88833520eb9aa0e8d18038f06a9fd3bab079e10ae92c40be3479e4670787592
|
7
|
+
data.tar.gz: 57047fe46f74f6bb2e6d400c1c0bbb4e9832fc631eabc43cd4f83070c7ccfa67d2a87c6a6c62e1b44db73d61ed3ce2b1fc17412f6a461616f37c349fc759b9b2
|
data/.version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
2.0.0
|
data/lib/html-tag.rb
CHANGED
data/lib/html-tag/adapter.rb
CHANGED
@@ -1,39 +1,8 @@
|
|
1
|
-
module HtmlTagBuilderHelper
|
2
|
-
# tag :div, { 'class'=>'iform' } do
|
3
|
-
# tag.div(class: :iform) { |n| ... }
|
4
|
-
def xtag name=nil, opts={}, data=nil
|
5
|
-
return HtmlTagBuilder unless name
|
6
|
-
data = yield(opts) if block_given?
|
7
|
-
HtmlTagBuilder.tag name, opts, data
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
# add to Rails, Sinatra or all other that respond to ApplicationHelper
|
12
|
-
if defined?(ActionView::Base)
|
13
|
-
class ActionView::Base
|
14
|
-
def tag *args, &block
|
15
|
-
args.first ? HtmlTagBuilder.tag(*args, &block) : HtmlTagBuilder
|
16
|
-
end
|
17
|
-
end
|
18
|
-
elsif defined?(Sinatra::Base)
|
19
|
-
class Sinatra::Base
|
20
|
-
def tag *args, &block
|
21
|
-
args.first ? HtmlTagBuilder.tag(*args, &block) : HtmlTagBuilder
|
22
|
-
end
|
23
|
-
end
|
24
|
-
elsif defined?(ApplicationHelper)
|
25
|
-
module ApplicationHelper
|
26
|
-
def tag *args, &block
|
27
|
-
args.first ? HtmlTagBuilder.tag(*args, &block) : HtmlTagBuilder
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
1
|
# Hash
|
33
2
|
unless {}.respond_to?(:tag)
|
34
3
|
class Hash
|
35
|
-
def tag node_name
|
36
|
-
HtmlTagBuilder.build
|
4
|
+
def tag node_name, inner_html=nil
|
5
|
+
::HtmlTagBuilder.build node_name, self, inner_html
|
37
6
|
end
|
38
7
|
end
|
39
8
|
end
|
@@ -42,8 +11,7 @@ end
|
|
42
11
|
unless ''.respond_to?(:tag)
|
43
12
|
class String
|
44
13
|
def tag node_name, opts={}
|
45
|
-
HtmlTagBuilder.build
|
14
|
+
::HtmlTagBuilder.build node_name, opts, self
|
46
15
|
end
|
47
16
|
end
|
48
17
|
end
|
49
|
-
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# inclue HtmlTag to import tag method
|
2
|
+
|
3
|
+
module HtmlTag
|
4
|
+
extend self
|
5
|
+
|
6
|
+
def tag
|
7
|
+
::HtmlTagBuilder
|
8
|
+
end
|
9
|
+
|
10
|
+
# forward to class only if
|
11
|
+
def method_missing tag_name, *args, &block
|
12
|
+
if self === HtmlTag
|
13
|
+
::HtmlTagBuilder.tag(tag_name, args[0], args[1], &block)
|
14
|
+
else
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
require 'set'
|
2
|
+
|
3
|
+
class HtmlTagBuilder
|
4
|
+
EMPTY_TAGS ||= Set.new %w(area base br col embed hr img input keygen link meta param source track wbr)
|
5
|
+
|
6
|
+
class << self
|
7
|
+
# tag.div -> tag.tag :div
|
8
|
+
def method_missing name, *args, &block
|
9
|
+
tag name, args[0], args[1], &block
|
10
|
+
end
|
11
|
+
|
12
|
+
# tag :div, { 'class'=>'iform' } do
|
13
|
+
def tag name, *args
|
14
|
+
data, opts =
|
15
|
+
if args[1]
|
16
|
+
args[0].class == Hash ? args.reverse : args
|
17
|
+
elsif args[0]
|
18
|
+
if args[0].class == Symbol
|
19
|
+
# tag.div(:a) { 1 } -> <div class="a">1</div>
|
20
|
+
[nil, { class: args[0].to_s.gsub('__', ' ').gsub('_', '-') }]
|
21
|
+
elsif args[0].class == Hash
|
22
|
+
[nil, args[0]]
|
23
|
+
else
|
24
|
+
[args[0], {}]
|
25
|
+
end
|
26
|
+
else
|
27
|
+
[nil, {}]
|
28
|
+
end
|
29
|
+
|
30
|
+
opts ||= {}
|
31
|
+
|
32
|
+
unless opts.class == Hash
|
33
|
+
raise ArgumentError.new('HtmlTag: bad agrument, attriobutes are no a hash')
|
34
|
+
end
|
35
|
+
|
36
|
+
if data.class == Hash
|
37
|
+
raise ArgumentError.new('HtmlTag: bad agrument, data sent as hash')
|
38
|
+
end
|
39
|
+
|
40
|
+
# covert n._row_foo to n(class: 'row-foo')
|
41
|
+
name = name.to_s
|
42
|
+
if name.to_s[0, 1] == '_'
|
43
|
+
opts ||= {}
|
44
|
+
opts[:class] = name.to_s.sub('_', '').gsub('_', '-')
|
45
|
+
name = :div
|
46
|
+
end
|
47
|
+
|
48
|
+
if block_given?
|
49
|
+
if data
|
50
|
+
raise ArgumentError.new('HtmlTag: data is allreay defined and block is given')
|
51
|
+
end
|
52
|
+
|
53
|
+
stack = new
|
54
|
+
data = yield(stack, opts)
|
55
|
+
|
56
|
+
# if data is pushed to passed node, use that data
|
57
|
+
data = stack.data if stack.data.first
|
58
|
+
end
|
59
|
+
|
60
|
+
data = data.join('') if data.is_a?(Array)
|
61
|
+
|
62
|
+
build name, opts, data
|
63
|
+
end
|
64
|
+
|
65
|
+
# build html node
|
66
|
+
def build node, attrs={}, text=nil
|
67
|
+
node = node.to_s
|
68
|
+
|
69
|
+
opts = []
|
70
|
+
attrs.each do |attr_key, attr_value|
|
71
|
+
if attr_value.is_a?(Hash)
|
72
|
+
for data_key, data_value in attr_value
|
73
|
+
__add_opts opts, "#{attr_key}-#{data_key}", data_value
|
74
|
+
end
|
75
|
+
else
|
76
|
+
__add_opts opts, attr_key, attr_value
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
opts = opts.first ? ' '+opts.join(' ') : ''
|
81
|
+
|
82
|
+
if node
|
83
|
+
text ||= '' unless EMPTY_TAGS.include?(node)
|
84
|
+
out = text ? %{<#{node}#{opts}>#{text}</#{node}>} : %{<#{node}#{opts} />}
|
85
|
+
out.respond_to?(:html_safe) ? out.html_safe : out
|
86
|
+
else
|
87
|
+
opts
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# tag.div(class: 'klasa') do -> tag.('klasa') do
|
92
|
+
def call class_name, &block
|
93
|
+
tag(:div, class_name, &block)
|
94
|
+
end
|
95
|
+
|
96
|
+
def __add_opts opts, key, value
|
97
|
+
unless value.to_s == ''
|
98
|
+
value = value.join(' ') if value.is_a?(Array)
|
99
|
+
key = key.to_s.gsub(/data_/,'data-')
|
100
|
+
opts.push key+'="'+value.to_s.gsub(/"/,'"')+'"'
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
###
|
106
|
+
|
107
|
+
attr_reader :data
|
108
|
+
|
109
|
+
def initialize
|
110
|
+
@data = []
|
111
|
+
end
|
112
|
+
|
113
|
+
# push data to stack
|
114
|
+
def push data=nil
|
115
|
+
@data.push block_given? ? yield : data
|
116
|
+
end
|
117
|
+
|
118
|
+
private
|
119
|
+
|
120
|
+
# forward to class
|
121
|
+
def method_missing tag_name, *args, &block
|
122
|
+
@data.push self.class.tag(tag_name, args[0], args[1], &block)
|
123
|
+
end
|
124
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: html-tag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dino Reic
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: fast_blank
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '1'
|
11
|
+
date: 2021-02-27 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
27
13
|
description: Fast and powerful tag builder, upgrade to Rails tag helper, framework
|
28
14
|
agnostic.
|
29
15
|
email: reic.dino@gmail.com
|
@@ -34,12 +20,13 @@ files:
|
|
34
20
|
- "./.version"
|
35
21
|
- "./lib/html-tag.rb"
|
36
22
|
- "./lib/html-tag/adapter.rb"
|
37
|
-
- "./lib/html-tag/
|
23
|
+
- "./lib/html-tag/html_tag.rb"
|
24
|
+
- "./lib/html-tag/html_tag_builder.rb"
|
38
25
|
homepage: https://github.com/dux/html-tag
|
39
26
|
licenses:
|
40
27
|
- MIT
|
41
28
|
metadata: {}
|
42
|
-
post_install_message:
|
29
|
+
post_install_message:
|
43
30
|
rdoc_options: []
|
44
31
|
require_paths:
|
45
32
|
- lib
|
@@ -55,7 +42,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
55
42
|
version: '0'
|
56
43
|
requirements: []
|
57
44
|
rubygems_version: 3.0.6
|
58
|
-
signing_key:
|
45
|
+
signing_key:
|
59
46
|
specification_version: 4
|
60
47
|
summary: HTML tag builder
|
61
48
|
test_files: []
|
data/lib/html-tag/base.rb
DELETED
@@ -1,116 +0,0 @@
|
|
1
|
-
class HtmlTagBuilder
|
2
|
-
class << self
|
3
|
-
# tag.div -> tag.tag :div
|
4
|
-
def method_missing tag_name, *args, &block
|
5
|
-
tag tag_name, args[0], args[1], &block
|
6
|
-
end
|
7
|
-
|
8
|
-
# tag :div, { 'class'=>'iform' } do
|
9
|
-
def tag name=nil, opts={}, data=nil
|
10
|
-
if Array === opts
|
11
|
-
# join data given as an array
|
12
|
-
data = opts
|
13
|
-
opts = {}
|
14
|
-
elsif Hash === data
|
15
|
-
# tag.button('btn', href: '/') { 'Foo' }
|
16
|
-
opts = data.merge class: opts
|
17
|
-
data = nil
|
18
|
-
end
|
19
|
-
|
20
|
-
# covert n._row_foo to n(class: 'row-foo')
|
21
|
-
name = name.to_s
|
22
|
-
if name.to_s[0, 1] == '_'
|
23
|
-
opts ||= {}
|
24
|
-
opts[:class] = name.to_s.sub('_', '').gsub('_', '-')
|
25
|
-
name = :div
|
26
|
-
end
|
27
|
-
|
28
|
-
# covert tag.a '.foo.bar' to class names
|
29
|
-
# covert tag.a '#id' to id names
|
30
|
-
if (data || block_given?) && opts.is_a?(String)
|
31
|
-
given = opts.dup
|
32
|
-
opts = {}
|
33
|
-
|
34
|
-
given.sub(/#([\w\-]+)/) { opts[:id] = $1 }
|
35
|
-
klass = given.sub(/^\./, '').gsub('.', ' ')
|
36
|
-
opts[:class] = klass unless klass.blank?
|
37
|
-
end
|
38
|
-
|
39
|
-
# fix data and opts unless opts is Hash
|
40
|
-
data, opts = opts, {} unless opts.class == Hash
|
41
|
-
|
42
|
-
if block_given?
|
43
|
-
stack = new
|
44
|
-
data = yield(stack, opts)
|
45
|
-
|
46
|
-
# if data is pushed to passed node, use that data
|
47
|
-
data = stack.data if stack.data.first
|
48
|
-
end
|
49
|
-
|
50
|
-
data = data.join('') if data.is_a?(Array)
|
51
|
-
|
52
|
-
build opts, name, data
|
53
|
-
end
|
54
|
-
|
55
|
-
# build html node
|
56
|
-
def build attrs, node=nil, text=nil
|
57
|
-
opts = []
|
58
|
-
attrs.each do |attr_key, attr_value|
|
59
|
-
if attr_value.is_a?(Hash)
|
60
|
-
for data_key, data_value in attr_value
|
61
|
-
__add_opts opts, "#{attr_key}-#{data_key}", data_value
|
62
|
-
end
|
63
|
-
else
|
64
|
-
__add_opts opts, attr_key, attr_value
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
opts = opts.first ? ' '+opts.join(' ') : ''
|
69
|
-
|
70
|
-
return opts unless node
|
71
|
-
|
72
|
-
empty_tags = ['input', 'img', 'meta', 'link', 'hr', 'br', 'col', 'frame', 'area']
|
73
|
-
text ||= '' unless empty_tags.include?(node.to_s)
|
74
|
-
out = text ? %{<#{node}#{opts}>#{text}</#{node}>} : %{<#{node}#{opts} />}
|
75
|
-
out.respond_to?(:html_safe) ? out.html_safe : out
|
76
|
-
end
|
77
|
-
|
78
|
-
# tag.div(class: 'klasa') do -> tag.('klasa') do
|
79
|
-
def call class_name, &block
|
80
|
-
tag(:div, class_name, &block)
|
81
|
-
end
|
82
|
-
|
83
|
-
def __add_opts opts, key, value
|
84
|
-
unless value.to_s.blank?
|
85
|
-
value = value.join(' ') if value.is_a?(Array)
|
86
|
-
opts.push key.to_s.gsub(/_/,'-')+'="'+value.to_s.gsub(/"/,'"')+'"'
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
end
|
91
|
-
|
92
|
-
###
|
93
|
-
|
94
|
-
attr_reader :data
|
95
|
-
|
96
|
-
def initialize
|
97
|
-
@data = []
|
98
|
-
end
|
99
|
-
|
100
|
-
# push data to stack
|
101
|
-
def push data
|
102
|
-
@data.push data
|
103
|
-
end
|
104
|
-
|
105
|
-
# n.('foo') do -> n.div(class: 'foo') do
|
106
|
-
def call class_name, &block
|
107
|
-
@data.push self.class.tag(:div, { class: class_name }, &block)
|
108
|
-
end
|
109
|
-
|
110
|
-
private
|
111
|
-
|
112
|
-
# forward to class
|
113
|
-
def method_missing tag_name, *args, &block
|
114
|
-
@data.push self.class.tag(tag_name, args[0], args[1], &block)
|
115
|
-
end
|
116
|
-
end
|