html-tag 1.2.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|