input 0.0.1

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.
Files changed (3) hide show
  1. data/lib/input.rb +157 -0
  2. data/lib/input/version.rb +7 -0
  3. metadata +47 -0
@@ -0,0 +1,157 @@
1
+ require 'input/version'
2
+
3
+ module Input
4
+
5
+ def self.form(obj=nil, attributes={}, &block)
6
+ Form.begin(obj, attributes, &block)
7
+ end
8
+
9
+ class Form
10
+
11
+ # The object related to the form, if any.
12
+ attr_reader :obj
13
+
14
+ # the final output of the form being built
15
+ attr_accessor :output
16
+
17
+ ##
18
+ #
19
+ # Create a new instance tied to an object and initialize output.
20
+ #
21
+ #
22
+ # @param [Object] obj
23
+ # Sets the object for the form (if any)
24
+ #
25
+ def initialize(obj)
26
+ @obj = obj
27
+ @output = ''
28
+ end
29
+
30
+ ##
31
+ #
32
+ # Create a form object and yeild to block
33
+ #
34
+ # @param [Object] obj
35
+ # Sets the object for the form (if any)
36
+ #
37
+ def self.begin(obj, attributes={}, &block)
38
+ # build form object
39
+ form = new(obj)
40
+
41
+ # construct form
42
+ form.build(Tag.new(self, :form, attributes), &block)
43
+
44
+ # return final output
45
+ form.output
46
+ end
47
+
48
+ ##
49
+ #
50
+ # Create a tag, build it, and yield to block if needed
51
+ #
52
+ def tag(type, attributes={}, &block)
53
+ tag = Tag.new(self, type, attributes)
54
+ build(tag, &block)
55
+ end
56
+
57
+ ##
58
+ #
59
+ # Create input tag, build it, and yield to block if needed
60
+ #
61
+ def input(type, attributes={}, &block)
62
+ tag = Input.new(self, type, attributes)
63
+ build(tag, &block)
64
+ end
65
+
66
+ ##
67
+ #
68
+ # Create input tag, build it, and yield to block if needed
69
+ #
70
+ def build(tag, &block)
71
+ @output << tag.open
72
+ yield self if block_given?
73
+ @output << tag.close
74
+ end
75
+
76
+ end
77
+
78
+
79
+ class Tag
80
+
81
+ attr_accessor :form
82
+ attr_accessor :type
83
+ attr_accessor :attributes
84
+
85
+ # Which tags are self closing (such tags ignore children).
86
+ SELF_CLOSING = [:img, :input]
87
+
88
+ # Borrowed from Rack::Utils, map of single character strings to html escaped versions.
89
+ ESCAPE_HTML = {"&" => "&amp;", "<" => "&lt;", ">" => "&gt;", "'" => "&#39;", '"' => "&quot;"}
90
+
91
+ # A regexp that matches all html characters requiring escaping.
92
+ ESCAPE_HTML_PATTERN = Regexp.union(*ESCAPE_HTML.keys)
93
+
94
+ ##
95
+ #
96
+ # Create a new tag.
97
+ #
98
+ def initialize(form, type, attributes={})
99
+ @form = form
100
+ @type = type
101
+ @attributes = attributes
102
+ end
103
+
104
+ ##
105
+ #
106
+ # Return opening half of tag, or entire tag if self closing
107
+ #
108
+ def open
109
+ if SELF_CLOSING.include?(@type)
110
+ "<#{@type}#{attr_html(attributes)}/>"
111
+ else
112
+ "<#{@type}#{attr_html(attributes)}>"
113
+ end
114
+ end
115
+
116
+ ##
117
+ #
118
+ # Return opening half of tag, or nothing tag if self closing
119
+ #
120
+ def close
121
+ if SELF_CLOSING.include?(type)
122
+ ""
123
+ else
124
+ "</#{type}>"
125
+ end
126
+ end
127
+
128
+ private
129
+
130
+ ##
131
+ #
132
+ # Escape ampersands, brackets and quotes to their HTML/XML entities.
133
+ #
134
+ def h(string)
135
+ string.to_s.gsub(ESCAPE_HTML_PATTERN){|c| ESCAPE_HTML[c] }
136
+ end
137
+
138
+ ##
139
+ #
140
+ # Transforms attributes hash into html, quoting and escaping values.
141
+ #
142
+ def attr_html(attr)
143
+ attr = attr.to_a.reject{|k,v| v.nil?}
144
+ " #{attr.map{|k, v| "#{k}=\"#{h(v)}\""}.sort.join(' ')}" unless attr.empty?
145
+ end
146
+
147
+ end
148
+
149
+ class Input < Tag
150
+
151
+ def initialize(form, type, attributes={})
152
+ super(form, :input, attributes.merge({:type=>type}))
153
+ end
154
+
155
+ end
156
+
157
+ end
@@ -0,0 +1,7 @@
1
+ module Input
2
+ VERSION = '0.0.1'
3
+
4
+ def self.version
5
+ VERSION
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,47 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: input
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Tyler Kellen
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-12-17 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Input is a framework-agnostic HTML5 form library with no external dependencies.
15
+ email: tyler@sleekcode.net
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/input/version.rb
21
+ - lib/input.rb
22
+ homepage: https://github.com/tkellen/input
23
+ licenses: []
24
+ post_install_message:
25
+ rdoc_options: []
26
+ require_paths:
27
+ - lib
28
+ required_ruby_version: !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ none: false
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ requirements: []
41
+ rubyforge_project: input
42
+ rubygems_version: 1.8.10
43
+ signing_key:
44
+ specification_version: 3
45
+ summary: A lightweight HTML5 form library.
46
+ test_files: []
47
+ has_rdoc: