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 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