html_gen 0.0.0 → 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +0 -2
- data/Gemfile.lock +0 -14
- data/VERSION +1 -1
- data/html_gen.gemspec +61 -0
- data/lib/html_gen.rb +6 -0
- data/lib/html_gen_element.rb +87 -20
- data/spec/html_gen_spec.rb +16 -3
- metadata +11 -21
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,25 +1,14 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
-
datet (0.0.14)
|
5
4
|
diff-lcs (1.1.3)
|
6
5
|
git (1.2.5)
|
7
|
-
http2 (0.0.5)
|
8
6
|
jeweler (1.8.4)
|
9
7
|
bundler (~> 1.0)
|
10
8
|
git (>= 1.2.5)
|
11
9
|
rake
|
12
10
|
rdoc
|
13
11
|
json (1.7.4)
|
14
|
-
knjrbfw (0.0.78)
|
15
|
-
datet
|
16
|
-
http2
|
17
|
-
php4r
|
18
|
-
tsafe
|
19
|
-
wref
|
20
|
-
php4r (0.0.2)
|
21
|
-
datet
|
22
|
-
http2
|
23
12
|
rake (0.9.2.2)
|
24
13
|
rdoc (3.12)
|
25
14
|
json (~> 1.4)
|
@@ -31,8 +20,6 @@ GEM
|
|
31
20
|
rspec-expectations (2.8.0)
|
32
21
|
diff-lcs (~> 1.1.2)
|
33
22
|
rspec-mocks (2.8.0)
|
34
|
-
tsafe (0.0.11)
|
35
|
-
wref (0.0.5)
|
36
23
|
|
37
24
|
PLATFORMS
|
38
25
|
ruby
|
@@ -40,6 +27,5 @@ PLATFORMS
|
|
40
27
|
DEPENDENCIES
|
41
28
|
bundler (>= 1.0.0)
|
42
29
|
jeweler (~> 1.8.4)
|
43
|
-
knjrbfw
|
44
30
|
rdoc (~> 3.12)
|
45
31
|
rspec (~> 2.8.0)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.1
|
data/html_gen.gemspec
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{html_gen}
|
8
|
+
s.version = "0.0.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Kasper Johansen"]
|
12
|
+
s.date = %q{2012-08-10}
|
13
|
+
s.description = %q{A small framework for generating HTML.}
|
14
|
+
s.email = %q{k@spernj.org}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE.txt",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".rspec",
|
22
|
+
"Gemfile",
|
23
|
+
"Gemfile.lock",
|
24
|
+
"LICENSE.txt",
|
25
|
+
"README.rdoc",
|
26
|
+
"Rakefile",
|
27
|
+
"VERSION",
|
28
|
+
"html_gen.gemspec",
|
29
|
+
"lib/html_gen.rb",
|
30
|
+
"lib/html_gen_element.rb",
|
31
|
+
"spec/html_gen_spec.rb",
|
32
|
+
"spec/spec_helper.rb"
|
33
|
+
]
|
34
|
+
s.homepage = %q{http://github.com/kaspernj/html_gen}
|
35
|
+
s.licenses = ["MIT"]
|
36
|
+
s.require_paths = ["lib"]
|
37
|
+
s.rubygems_version = %q{1.6.2}
|
38
|
+
s.summary = %q{A small framework for generating HTML.}
|
39
|
+
|
40
|
+
if s.respond_to? :specification_version then
|
41
|
+
s.specification_version = 3
|
42
|
+
|
43
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
44
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.8.0"])
|
45
|
+
s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
|
46
|
+
s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
|
47
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
|
48
|
+
else
|
49
|
+
s.add_dependency(%q<rspec>, ["~> 2.8.0"])
|
50
|
+
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
51
|
+
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
52
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
|
53
|
+
end
|
54
|
+
else
|
55
|
+
s.add_dependency(%q<rspec>, ["~> 2.8.0"])
|
56
|
+
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
57
|
+
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
58
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
data/lib/html_gen.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
#This class doesnt hold other methods than for autoloading of subclasses.
|
1
2
|
class Html_gen
|
2
3
|
#Autoloader for subclasses.
|
3
4
|
def self.const_missing(name)
|
@@ -5,4 +6,9 @@ class Html_gen
|
|
5
6
|
raise "Still not defined: '#{name}'." if !Html_gen.const_defined?(name)
|
6
7
|
return Html_gen.const_get(name)
|
7
8
|
end
|
9
|
+
|
10
|
+
#Escapes HTML from the given string. This is to avoid any dependencies and should not be used by other libs.
|
11
|
+
def self.escape_html(string)
|
12
|
+
return string.to_s.gsub(/&/, "&").gsub(/\"/, """).gsub(/>/, ">").gsub(/</, "<")
|
13
|
+
end
|
8
14
|
end
|
data/lib/html_gen_element.rb
CHANGED
@@ -1,34 +1,88 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
#This class can be used to generate HTML.
|
2
|
+
#===Examples
|
3
|
+
# ele = Html_gen::Element.new(:a) #=> #<Html_gen::Element:0x00000000e5f650 @attr={}, @name=:a, @classes=[], @str_html="", @str="", @css={}, @eles=[], @nl="\n", @inden="\t">
|
4
|
+
# ele.classes << "custom_link"
|
5
|
+
# ele.css["font-weight"] = "bold"
|
6
|
+
# ele.attr[:href] = "http://www.youtube.com"
|
7
|
+
#
|
8
|
+
# b = ele.add_ele(:b)
|
9
|
+
# b.str = "Title of link"
|
10
|
+
#
|
11
|
+
# ele.html #=> "<a href=\"http://www.youtube.com\" style=\"font-weight: bold;\" class=\"custom_link\">\n\t<b>\n\t\tTitle of link\n\t</b>\n</a>\n"
|
3
12
|
class Html_gen::Element
|
4
|
-
|
13
|
+
#Attributes hash which will be used to generate attributes-elements.
|
14
|
+
#===Example
|
15
|
+
# element.attr[:href] = "http://www.youtube.com"
|
16
|
+
attr_reader :attr
|
5
17
|
|
18
|
+
#CSS-hash which will be used to generate the 'style'-attribute.
|
19
|
+
#===Example
|
20
|
+
# element.css["font-weight"] = "bold"
|
21
|
+
attr_reader :css
|
22
|
+
|
23
|
+
#Classes-array which will be used to generate the 'class'-attribute.
|
24
|
+
#===Example
|
25
|
+
# element.classes += ["class1", "class2"]
|
26
|
+
# element.html #=> ... class="class1 class2"...
|
27
|
+
attr_reader :classes
|
28
|
+
|
29
|
+
#This string is used to generate the value of an element. It will be HTML-escaped.
|
30
|
+
#===Example
|
31
|
+
# element = Html_gen::Element.new("b")
|
32
|
+
# element.str = "Te<i>s</i>t"
|
33
|
+
# element.html(:pretty => false) #=> "<b>Te<i>s</i>t</b>"
|
34
|
+
attr_accessor :str
|
35
|
+
|
36
|
+
#This string is used to generate the value of an element. It will not be HTML-escaped.
|
37
|
+
#===Example
|
38
|
+
# element = Html_gen::Element.new("b")
|
39
|
+
# element.str_html = "Te<i>s</i>t"
|
40
|
+
# element.html #=> "<b>Te<i>s</i>t</b>"
|
41
|
+
attr_accessor :str_html
|
42
|
+
|
43
|
+
#You can give various arguments as shortcuts to calling the methods. You can also decide what should be used for newline and indentation.
|
44
|
+
# Html_gen::Element.new(:b, {
|
45
|
+
# :css => {"font-weight" => "bold"},
|
46
|
+
# :attr => {"href" => "http://www.youtube.com"},
|
47
|
+
# :classes => ["class1", "class2"],
|
48
|
+
# :str => "A title",
|
49
|
+
# :str_html => "Some custom URL as title",
|
50
|
+
# :nl => "\n",
|
51
|
+
# :inden => "\t",
|
52
|
+
# :eles => [Html_gen::Element.new("i", :str => "Hello world!")
|
53
|
+
# })
|
6
54
|
def initialize(name, args = {})
|
7
|
-
if args[:attr]
|
8
|
-
@attr = args[:attr]
|
9
|
-
else
|
10
|
-
@attr = {}
|
11
|
-
end
|
12
|
-
|
13
55
|
raise "'name' should be a string or a symbol but was a '#{name.class.name}'."if !name.is_a?(String) and !name.is_a?(Symbol)
|
14
|
-
|
15
56
|
@name = name
|
16
57
|
|
17
|
-
{:classes => [], :
|
58
|
+
{:attr => {}, :classes => [], :str_html => "", :str => "", :css => {}, :eles => [], :nl => "\n", :inden => "\t"}.each do |arg, default_val|
|
18
59
|
if args[arg]
|
19
60
|
instance_variable_set("@#{arg}", args[arg])
|
20
61
|
else
|
21
62
|
instance_variable_set("@#{arg}", default_val)
|
22
63
|
end
|
64
|
+
|
65
|
+
args.delete(arg)
|
23
66
|
end
|
67
|
+
|
68
|
+
raise "Unknown arguments: '#{args.keys.join(",")}'." if !args.empty?
|
24
69
|
end
|
25
70
|
|
71
|
+
#Adds a sub-element to the element.
|
72
|
+
#===Examples
|
73
|
+
# element = Html_gen::Element.new("a")
|
74
|
+
# another_ele = element.add_ele("b")
|
75
|
+
# another_ele.str = "Hello world!"
|
76
|
+
# element.html #=> "<a>\n\t<b>\n\t\tHello world!\n\t</b>\n</a>\n"
|
26
77
|
def add_ele(name, args = {})
|
27
78
|
ele = Html_gen::Element.new(name, args)
|
28
79
|
@eles << ele
|
29
80
|
return ele
|
30
81
|
end
|
31
82
|
|
83
|
+
# Returns the HTML for the element.
|
84
|
+
# To avoid indentation and newlines you can use the 'pretty'-argument:
|
85
|
+
# element.html(:pretty => false)
|
32
86
|
def html(args = {})
|
33
87
|
if args[:level]
|
34
88
|
level = args[:level]
|
@@ -42,15 +96,23 @@ class Html_gen::Element
|
|
42
96
|
pretty = true
|
43
97
|
end
|
44
98
|
|
99
|
+
#Used for keeping 'pretty'-value and correct indentation according to parent elements.
|
45
100
|
pass_args = {:level => (level + 1), :pretty => pretty}
|
46
101
|
|
102
|
+
#Clone the attributes-hash since we are going to add stuff to it, and it shouldnt be reflected (if 'html' is called multiple times, it will bug unless we clone).
|
47
103
|
attr = @attr.clone
|
48
|
-
classes = @classes.clone
|
49
104
|
|
50
|
-
str
|
105
|
+
#Start generating the string with HTML (possible go give a custom 'str'-variable where the content should be pushed to).
|
106
|
+
if args[:str]
|
107
|
+
str = args[:str]
|
108
|
+
else
|
109
|
+
str = ""
|
110
|
+
end
|
111
|
+
|
51
112
|
str << @inden * level if pretty and level > 0
|
52
113
|
str << "<#{@name}"
|
53
114
|
|
115
|
+
#Add content from the 'css'-hash to the 'style'-attribute in the right format.
|
54
116
|
if !@css.empty?
|
55
117
|
style = ""
|
56
118
|
@css.each do |key, val|
|
@@ -66,36 +128,40 @@ class Html_gen::Element
|
|
66
128
|
end
|
67
129
|
end
|
68
130
|
|
131
|
+
#Add content from the 'classes'-array to the 'class'-attribute in the right format.
|
69
132
|
if !@classes.empty?
|
70
133
|
class_str = @classes.join(" ")
|
71
134
|
|
72
135
|
if @attr[:class] and !@attr[:class].empty?
|
73
|
-
|
136
|
+
attr[:class] << " #{class_str}"
|
74
137
|
else
|
75
|
-
|
138
|
+
attr[:class] = class_str
|
76
139
|
end
|
77
140
|
end
|
78
141
|
|
142
|
+
#Write out the attributes to the string.
|
79
143
|
attr.each do |key, val|
|
80
|
-
str << " #{key}=\"#{
|
144
|
+
str << " #{key}=\"#{Html_gen.escape_html(val)}\""
|
81
145
|
end
|
82
146
|
|
83
|
-
if @eles.empty? and @str.empty? and @
|
147
|
+
if @eles.empty? and @str.empty? and @str_html.empty?
|
148
|
+
#If no sub-string, sub-HTML or sub-elements are given, we should end the HTML with " />".
|
84
149
|
str << " />"
|
85
150
|
str << @nl if pretty
|
86
151
|
else
|
152
|
+
#Write end-of-element and then all sub-elements.
|
87
153
|
str << ">"
|
88
154
|
str << @nl if pretty
|
89
155
|
|
90
156
|
if !@str.empty?
|
91
157
|
str << @inden * (level + 1) if pretty
|
92
|
-
str <<
|
158
|
+
str << Html_gen.escape_html(@str)
|
93
159
|
str << @nl if pretty
|
94
160
|
end
|
95
161
|
|
96
|
-
if !@
|
162
|
+
if !@str_html.empty?
|
97
163
|
str << @inden * (level + 1) if pretty
|
98
|
-
str << @
|
164
|
+
str << @str_html
|
99
165
|
str << @nl if pretty
|
100
166
|
end
|
101
167
|
|
@@ -108,6 +174,7 @@ class Html_gen::Element
|
|
108
174
|
str << @nl if pretty
|
109
175
|
end
|
110
176
|
|
177
|
+
#Returns the string.
|
111
178
|
return str
|
112
179
|
end
|
113
180
|
end
|
data/spec/html_gen_spec.rb
CHANGED
@@ -2,13 +2,26 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
2
2
|
|
3
3
|
describe "HtmlGen" do
|
4
4
|
it "should be able to generate html" do
|
5
|
-
html = Html_gen::Element.new(:td, :classes => [:test]).html
|
5
|
+
html = Html_gen::Element.new(:td, :classes => [:test]).html(:pretty => false)
|
6
6
|
raise "Expected valid HTML." if html != "<td class=\"test\" />"
|
7
7
|
|
8
|
-
html = Html_gen::Element.new(:td, :attr => {:colspan => 2}).html
|
8
|
+
html = Html_gen::Element.new(:td, :attr => {:colspan => 2}).html(:pretty => false)
|
9
9
|
raise "Expected valid HTML." if html != "<td colspan=\"2\" />"
|
10
10
|
|
11
|
-
html = Html_gen::Element.new(:td, :css => {:width => "80px"}).html
|
11
|
+
html = Html_gen::Element.new(:td, :css => {:width => "80px"}).html(:pretty => false)
|
12
12
|
raise "Expected valid HTML: '#{html}'." if html != "<td style=\"width: 80px;\" />"
|
13
|
+
|
14
|
+
a = Html_gen::Element.new(:a)
|
15
|
+
b = a.add_ele(:b)
|
16
|
+
b.str = "Test"
|
17
|
+
|
18
|
+
html = a.html(:pretty => false)
|
19
|
+
raise "Expected something else." if html != "<a><b>Test</b></a>"
|
20
|
+
|
21
|
+
html = Html_gen::Element.new(:b, :str => "<b>Test</b>").html(:pretty => false)
|
22
|
+
raise "Expected escape HTML: '#{html}'." if html != "<b><b>Test</b></b>"
|
23
|
+
|
24
|
+
html = Html_gen::Element.new(:b, :str_html => "<b>Test</b>").html(:pretty => false)
|
25
|
+
raise "Expected escape HTML: '#{html}'." if html != "<b><b>Test</b></b>"
|
13
26
|
end
|
14
27
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: html_gen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Kasper Johansen
|
@@ -13,20 +13,9 @@ cert_chain: []
|
|
13
13
|
date: 2012-08-10 00:00:00 +02:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
|
-
- !ruby/object:Gem::Dependency
|
17
|
-
name: knjrbfw
|
18
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
19
|
-
none: false
|
20
|
-
requirements:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: "0"
|
24
|
-
type: :runtime
|
25
|
-
prerelease: false
|
26
|
-
version_requirements: *id001
|
27
16
|
- !ruby/object:Gem::Dependency
|
28
17
|
name: rspec
|
29
|
-
requirement: &
|
18
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
30
19
|
none: false
|
31
20
|
requirements:
|
32
21
|
- - ~>
|
@@ -34,10 +23,10 @@ dependencies:
|
|
34
23
|
version: 2.8.0
|
35
24
|
type: :development
|
36
25
|
prerelease: false
|
37
|
-
version_requirements: *
|
26
|
+
version_requirements: *id001
|
38
27
|
- !ruby/object:Gem::Dependency
|
39
28
|
name: rdoc
|
40
|
-
requirement: &
|
29
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
30
|
none: false
|
42
31
|
requirements:
|
43
32
|
- - ~>
|
@@ -45,10 +34,10 @@ dependencies:
|
|
45
34
|
version: "3.12"
|
46
35
|
type: :development
|
47
36
|
prerelease: false
|
48
|
-
version_requirements: *
|
37
|
+
version_requirements: *id002
|
49
38
|
- !ruby/object:Gem::Dependency
|
50
39
|
name: bundler
|
51
|
-
requirement: &
|
40
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
41
|
none: false
|
53
42
|
requirements:
|
54
43
|
- - ">="
|
@@ -56,10 +45,10 @@ dependencies:
|
|
56
45
|
version: 1.0.0
|
57
46
|
type: :development
|
58
47
|
prerelease: false
|
59
|
-
version_requirements: *
|
48
|
+
version_requirements: *id003
|
60
49
|
- !ruby/object:Gem::Dependency
|
61
50
|
name: jeweler
|
62
|
-
requirement: &
|
51
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
63
52
|
none: false
|
64
53
|
requirements:
|
65
54
|
- - ~>
|
@@ -67,7 +56,7 @@ dependencies:
|
|
67
56
|
version: 1.8.4
|
68
57
|
type: :development
|
69
58
|
prerelease: false
|
70
|
-
version_requirements: *
|
59
|
+
version_requirements: *id004
|
71
60
|
description: A small framework for generating HTML.
|
72
61
|
email: k@spernj.org
|
73
62
|
executables: []
|
@@ -86,6 +75,7 @@ files:
|
|
86
75
|
- README.rdoc
|
87
76
|
- Rakefile
|
88
77
|
- VERSION
|
78
|
+
- html_gen.gemspec
|
89
79
|
- lib/html_gen.rb
|
90
80
|
- lib/html_gen_element.rb
|
91
81
|
- spec/html_gen_spec.rb
|
@@ -104,7 +94,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
104
94
|
requirements:
|
105
95
|
- - ">="
|
106
96
|
- !ruby/object:Gem::Version
|
107
|
-
hash:
|
97
|
+
hash: 3676011512365822361
|
108
98
|
segments:
|
109
99
|
- 0
|
110
100
|
version: "0"
|