html-tag 1.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 +7 -0
- data/.version +1 -0
- data/lib/html-tag.rb +6 -0
- data/lib/html-tag/adapter.rb +33 -0
- data/lib/html-tag/base.rb +113 -0
- metadata +61 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b88800aadc21733d2b0da8e33e274a8b95fd8008a972ebb760864ae29b18fa61
|
4
|
+
data.tar.gz: f0108dae498ca7302f6e3de9285676aa0cc01903cd95f58742e5e0ae9d415085
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9fa4dcb68bb10d7b96b63239c44693f7ec92a03fb8ac6de41d5fd344ae5722d79f90f04806a57279ab868666af2a446b8ad4d2e49f951fa27c83517486a44c8e
|
7
|
+
data.tar.gz: d36b0ed5b1e20b89513e86626fc17e8db0fb8adf9de711649ee43429ea0ff265e7edb75b57e936190601099c4f6f6d4740336bbc0bc56364bb436a6512f81b94
|
data/.version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.0.0
|
data/lib/html-tag.rb
ADDED
@@ -0,0 +1,33 @@
|
|
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
|
+
# Rails
|
12
|
+
if defined?(ActionView::Base)
|
13
|
+
ActionView::Base.send :include, HtmlTagBuilderHelper
|
14
|
+
|
15
|
+
# Sinatra
|
16
|
+
elsif defined?(Sinatra::Base)
|
17
|
+
class Sinatra::Base
|
18
|
+
include HtmlTagBuilderHelper
|
19
|
+
alias :tag :xtag
|
20
|
+
end
|
21
|
+
|
22
|
+
# Lux and other
|
23
|
+
elsif defined?(ApplicationHelper)
|
24
|
+
# all other frameworks, including Lux
|
25
|
+
module ApplicationHelper
|
26
|
+
include HtmlTagBuilderHelper
|
27
|
+
alias :tag :xtag
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
|
@@ -0,0 +1,113 @@
|
|
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 to n(class: 'row')
|
21
|
+
name = name.to_s
|
22
|
+
if name.to_s[0, 1] == '_'
|
23
|
+
opts ||= {}
|
24
|
+
opts[:class] = name.to_s.sub('_', '')
|
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
|
+
inline = new
|
44
|
+
data = yield(inline, opts)
|
45
|
+
|
46
|
+
# if data is pushed to passed node, use that data
|
47
|
+
data = inline.data if inline.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
|
+
text = yield opts if block_given?
|
73
|
+
text ||= '' unless ['input', 'img', 'meta', 'link', 'hr', 'br'].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
|
+
opts.push key.to_s.gsub(/_/,'-')+'="'+value.to_s.gsub(/"/,'"')+'"'
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
###
|
92
|
+
|
93
|
+
attr_reader :data
|
94
|
+
|
95
|
+
def initialize
|
96
|
+
@data = []
|
97
|
+
end
|
98
|
+
|
99
|
+
# push data to stack
|
100
|
+
def push data
|
101
|
+
@data.push data
|
102
|
+
end
|
103
|
+
|
104
|
+
# n.div(class: 'klasa') do -> n.('klasa') do
|
105
|
+
def call class_name, &block
|
106
|
+
@data.push self.class.tag(:div, { class: class_name }, &block)
|
107
|
+
end
|
108
|
+
|
109
|
+
# forward to class
|
110
|
+
def method_missing tag_name, *args, &block
|
111
|
+
@data.push self.class.tag(tag_name, args[0], args[1], &block)
|
112
|
+
end
|
113
|
+
end
|
metadata
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: html-tag
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dino Reic
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-09-23 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'
|
27
|
+
description: Fast and powerful tag builder, upgrade to Rails tag helper, framework
|
28
|
+
agnostic.
|
29
|
+
email: reic.dino@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- "./.version"
|
35
|
+
- "./lib/html-tag.rb"
|
36
|
+
- "./lib/html-tag/adapter.rb"
|
37
|
+
- "./lib/html-tag/base.rb"
|
38
|
+
homepage: https://github.com/dux/html-tag
|
39
|
+
licenses:
|
40
|
+
- MIT
|
41
|
+
metadata: {}
|
42
|
+
post_install_message:
|
43
|
+
rdoc_options: []
|
44
|
+
require_paths:
|
45
|
+
- lib
|
46
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '0'
|
51
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
requirements: []
|
57
|
+
rubygems_version: 3.0.6
|
58
|
+
signing_key:
|
59
|
+
specification_version: 4
|
60
|
+
summary: HTML tag builder
|
61
|
+
test_files: []
|