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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9ba38f960d59ed54a47b5d55bc646cab39b6e93c87808e93461d1608899ae256
4
- data.tar.gz: ff09c472468abec600b5a4a59dd36949d126f6f98eb86928795e63c5bf0eb6cc
3
+ metadata.gz: 5c14a5d669505ed74d43e52cb564a8635a48a21670e0dce86756b3fc18a90a28
4
+ data.tar.gz: 00c996b4444863bd710c722585b53638a28f562e64a79483335a853a7e4670e0
5
5
  SHA512:
6
- metadata.gz: 86f6b42c9a0166e266ef719a68c80dc67474a816c51e3ae15f17f870ba3c52429a13eb8623c40a926a9183ef6b970adb1fb99588a467553b24848555f281d037
7
- data.tar.gz: 350e52e105ceafd9d0e737af1bac20b53c7b0305324dc4d070bb5d586b24b3cbaa446d5c3aa7833d49dc16b7e2dbf212cb2ae0af3cd81dbac25b815c1f913962
6
+ metadata.gz: 00eebf82a2b96e95f25272f536ada28d90115a2a177a129c5877a966449dc87de88833520eb9aa0e8d18038f06a9fd3bab079e10ae92c40be3479e4670787592
7
+ data.tar.gz: 57047fe46f74f6bb2e6d400c1c0bbb4e9832fc631eabc43cd4f83070c7ccfa67d2a87c6a6c62e1b44db73d61ed3ce2b1fc17412f6a461616f37c349fc759b9b2
data/.version CHANGED
@@ -1 +1 @@
1
- 1.2.0
1
+ 2.0.0
data/lib/html-tag.rb CHANGED
@@ -1,6 +1,3 @@
1
- unless ''.respond_to?(:blank?)
2
- require 'fast_blank'
3
- end
4
-
5
- require_relative './html-tag/base'
1
+ require_relative './html-tag/html_tag_builder'
2
+ require_relative './html-tag/html_tag'
6
3
  require_relative './html-tag/adapter'
@@ -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=nil, inner_html=nil
36
- HtmlTagBuilder.build self, node_name, inner_html
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 opts, node_name, self
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(/"/,'&quot;')+'"'
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: 1.2.0
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: 2020-03-21 00:00:00.000000000 Z
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/base.rb"
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(/"/,'&quot;')+'"'
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