rbmobile 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/README.markdown +65 -0
  2. data/lib/mobile_helpers.rb +578 -0
  3. metadata +83 -0
@@ -0,0 +1,65 @@
1
+ # Ruby JQuery Mobile HAML helper
2
+
3
+ A swiss knife for creating a hipster UI like from Apple
4
+
5
+ ### Description
6
+
7
+ This project should help you to create more readable HAML templates for your
8
+ mobile applications using http://jquerymobile.com framework.
9
+
10
+
11
+ ### Documentation
12
+
13
+ http://rdoc.info/projects/mfojtik/rbmobile
14
+
15
+ ### Requirements
16
+
17
+ - You should include JQuery library in your project or place this library into
18
+ 'public' folder
19
+ - You should unzip JQuery mobile inside your 'public' folder:
20
+
21
+ $ wget http://code.jquery.com/mobile/1.0b2/jquery.mobile-1.0b2.zip -O public/jquery.mobile-1.0b2.zip
22
+ $ cd public && unzip jquery.mobile-1.0b2.zip
23
+
24
+ ### Installation
25
+
26
+ gem install rbmobile
27
+
28
+ ### Sinatra
29
+
30
+ require 'mobile_helpers'
31
+ helpers RBMobile::Helpers
32
+
33
+ ### Rails(?)
34
+
35
+ app/helpers/application_helper.rb:
36
+ require 'mobile_helpers'
37
+ include RBMobile::Helpers
38
+
39
+ ### TODO:
40
+
41
+ - Finish forms.
42
+
43
+ == LICENSE:
44
+
45
+ Copyright (c) 20011 Michal Fojtik
46
+
47
+ Permission is hereby granted, free of charge, to any person obtaining
48
+ a copy of this software and associated documentation files (the
49
+ 'Software'), to deal in the Software without restriction, including
50
+ without limitation the rights to use, copy, modify, merge, publish,
51
+ distribute, sublicense, and/or sell copies of the Software, and to
52
+ permit persons to whom the Software is furnished to do so, subject to
53
+ the following conditions:
54
+
55
+ The above copyright notice and this permission notice shall be
56
+ included in all copies or substantial portions of the Software.
57
+
58
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
59
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
60
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
61
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
62
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
63
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
64
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
65
+
@@ -0,0 +1,578 @@
1
+ # This is a jquery.mobile[1] HAML helper to provide an easiest way
2
+ # to generate mobile application UI
3
+ #
4
+ # This helper could be used in Sinatra but also in Rails if properly
5
+ # included.
6
+ #
7
+ # Author:: Michal Fojtik (mi@mifo.sk)
8
+ # License:: GNU General Public License, version 2 (GPL-2.0)
9
+ # Copyright:: Michal Fojtik
10
+ #
11
+ # [1] http://jquerymobile.com
12
+
13
+
14
+ module RBMobile
15
+
16
+ # Assume jquery.mobile installed in public/jquery.mobile-1.0b2/
17
+ JQUERY_MOBILE_VERSION = 'jquery.mobile-1.0b2'
18
+
19
+ # Assume jquery library installed in public/jquery-1.6.2.min.js
20
+ JQUERY_VERSION = 'jquery-1.6.2'
21
+
22
+ # Default configuration
23
+ @configuration = {
24
+ :ajax => true
25
+ }
26
+
27
+ # You can disable or enable configuration properties
28
+ # using:
29
+ #
30
+ # RBMobile::config do
31
+ # enable :property
32
+ # disable :property
33
+ # end
34
+ #
35
+ def self.config(&block)
36
+ RBMobile::class_eval(&block) if block_given?
37
+ @configuration
38
+ end
39
+
40
+ # This method enable given boolean property
41
+ def self.enable(bool)
42
+ @configuration[bool] = true
43
+ end
44
+
45
+ # This method disable given boolean property
46
+ def self.disable(bool)
47
+ @configuration[bool] = false
48
+ end
49
+
50
+ # This module should be included as a view helper
51
+ # In Sinatra you need to do following:
52
+ #
53
+ # require 'mobile_helpers'
54
+ # helpers RBMobile::Helpers
55
+ #
56
+ # In Rails you should be able to include this module
57
+ # inside your ApplicationHelper as:
58
+ #
59
+ # require 'mobile_helpers'
60
+ # include RBMobile::Helpers
61
+ #
62
+ module Helpers
63
+
64
+ # Include all necessary javascript and css libraries for jQuery mobile
65
+ # You can exclude jQuery itself (in case your project is already including
66
+ # this library somewhere else by:
67
+ #
68
+ # = mobile_include(:no_jquery => true)
69
+ #
70
+ # This method should be placed right after %head tag.
71
+ #
72
+ def mobile_include(opts={})
73
+ capture_haml do
74
+ haml_tag :meta, :name => 'viewport', :content => 'width=device-width, initial-scale=1'
75
+ haml_tag :link, :rel => 'stylesheet', :href => "/#{JQUERY_MOBILE_VERSION}/#{JQUERY_MOBILE_VERSION}.min.css"
76
+ unless opts[:no_jquery]
77
+ haml_tag :script, :type => 'text/javascript', :src => "/#{JQUERY_VERSION}.min.js"
78
+ end
79
+ haml_tag :script, :type => 'text/javascript', :src => "/#{JQUERY_MOBILE_VERSION}/#{JQUERY_MOBILE_VERSION}.min.js"
80
+ end
81
+ end
82
+
83
+ # The jQuery Mobile "page" structure is optimized to support either single
84
+ # pages, or local internal linked "pages" within a page.
85
+ #
86
+ # The goal of this model is to allow developers to create websites using
87
+ # best practices — where ordinary links will "just work" without any special
88
+ # configuration — while creating a rich, native-like experience that can't
89
+ # be achieved with standard HTTP requests
90
+ #
91
+ # This helper will generate:
92
+ #
93
+ # <div data-role="page">
94
+ # </div>
95
+ #
96
+ # Additional properties that could be set:
97
+ #
98
+ # [title] Set 'data-title' attribute
99
+ # [theme] Change mobile theme ('a'..'f')
100
+ #
101
+ # Example usage:
102
+ #
103
+ # - page :theme => 'c' do
104
+ # - header do
105
+ # %h1 Header
106
+ #
107
+ def page(opts={}, &block)
108
+ opts.merge!(:'data-title' => opts.delete(:title)) if opts[:title]
109
+ role :page, opts, &block
110
+ end
111
+
112
+ # The header is a toolbar at the top of the page that usually contains the
113
+ # page title text and optional buttons positioned to the the left and/or
114
+ # right of the title for navigation or actions.
115
+ # The title text is normally an H1 heading element but it's possible to use any
116
+ # heading level (H1-H6) to allow for semantic flexibility. For example, a page
117
+ # containing multiple mobile 'pages' may use a H1 element on the home 'page' and a
118
+ # H2 element on the secondary pages. All heading levels are styled identically by
119
+ # default to maintain visual consistency.
120
+ #
121
+ # This helper will generate:
122
+ #
123
+ # <div data-role="header">
124
+ # </div>
125
+ #
126
+ # Additional properties that could be set:
127
+ #
128
+ # [theme] Change mobile theme ('a'..'f')
129
+ #
130
+ def header(opts={}, &block)
131
+ opts.merge!(:'data-position' => 'inline')
132
+ role :header, opts, &block
133
+ end
134
+
135
+ # The content block is the main container for your content.
136
+ #
137
+ # This helper will generate:
138
+ #
139
+ # <div data-role="content">
140
+ # </div>
141
+ #
142
+ # Additional properties that could be set:
143
+ #
144
+ # [theme] Change mobile theme ('a'..'f')
145
+
146
+ def content(opts={}, &block)
147
+ role :content, opts, &block
148
+ end
149
+
150
+ # Any page can be presented as a modal dialog by adding the
151
+ # data-rel="dialog" attribute to the page anchor link. When the "dialog"
152
+ # attribute is applied, the framework adds styles to add rounded corners,
153
+ # margins around the page and a dark background to make the "dialog" appear
154
+ # to be suspended above the page.
155
+ #
156
+ # <a href="foo.html" data-rel="dialog">Open dialog</a>
157
+ #
158
+ # This helper will generate a block that may contain a dialog:
159
+ #
160
+ # <div data-role="dialog">
161
+ # </div>
162
+ #
163
+ # Additional properties that could be set:
164
+ #
165
+ # [theme] Change mobile theme ('a'..'f')
166
+
167
+ def dialog(opts={}, &block)
168
+ role :dialog, opts, &block
169
+ end
170
+
171
+ # jQuery Mobile has a very basic navbar widget that is useful for providing
172
+ # up to 5 buttons with optional icons in a bar , typically within a header
173
+ # or footer.
174
+
175
+ # A navbar is coded as an unordered list of links wrapped in a container
176
+ # element that has the data-role="navbar" attribute. To set one of links to
177
+ # the active (selected) state, add class="ui-btn-active" to the anchor. In
178
+ # this example, we have a two-button navbar in the footer with the "One"
179
+ # item set to active
180
+ #
181
+ # This helper will generate:
182
+ #
183
+ # <div data-role="navbar">
184
+ # <ul>
185
+ # </ul>
186
+ # </div>
187
+ #
188
+ # Additional properties that could be set:
189
+ #
190
+ # [theme] Change mobile theme ('a'..'f')
191
+
192
+ def navbar(opts={}, &block)
193
+ role :navbar, opts do
194
+ haml_tag :ul do
195
+ block.call if block_given?
196
+ end
197
+ end
198
+ end
199
+
200
+ # This helper will generate a link inside 'navbar' block:
201
+ #
202
+ # - navbar do
203
+ # = navigate_to 'a.html', 'One'
204
+ # = navigate_to 'b.html', 'Two'
205
+ #
206
+ # Will produce:
207
+ #
208
+ # <div data-role="navbar">
209
+ # <ul>
210
+ # <li><a href="a.html" class="ui-btn-active">One</a></li>
211
+ # <li><a href="b.html">Two</a></li>
212
+ # </ul>
213
+ # </div>
214
+ #
215
+ # Additional properties that could be set:
216
+ #
217
+ # [theme] Change mobile theme ('a'..'f')
218
+ # [icon] Icon to use, eg. 'delete' (refer to jquery mobile icon names)
219
+ # [active] This will make current navigation item active
220
+ #
221
+ def navigate_to(url, label, opts={})
222
+ options = {
223
+ :href => url
224
+ }.merge(opts)
225
+ options.merge!(:class => 'ui-btn-active') if options.delete(:active)
226
+ options.merge!(:'data-icon' => options.delete(:icon)) if options[:icon]
227
+ capture_haml do
228
+ haml_tag :li do
229
+ haml_tag :a, options do
230
+ haml_concat label
231
+ end
232
+ end
233
+ end
234
+ end
235
+
236
+ # The footer bar has the same basic structure as the header except it uses the data-role attribute value of footer.
237
+ #
238
+ # - footer do
239
+ # %h4 Footer content
240
+ #
241
+ # Will generate:
242
+ #
243
+ # <div data-role="footer">
244
+ # <h4>Footer content</h4>
245
+ # </div>
246
+ #
247
+ # Additional properties that could be set:
248
+ #
249
+ # [theme] Change mobile theme ('a'..'f')
250
+ # [uibar] Include padding on the bar
251
+ # [fixed] Fixed toolbars will re-appear after you scroll
252
+
253
+ def footer(opts={}, &block)
254
+ opts.merge!(:class => "ui-bar") if opts.delete(:uibar)
255
+ opts.merge!(:'data-position' => "fixed") if opts.delete(:fixed)
256
+ role :footer, opts, &block
257
+ end
258
+
259
+ # Occasionally, you may want to visually group a set of buttons together to
260
+ # form a single block that looks contained like a navigation component. To
261
+ # get this effect, wrap a set of buttons in a container with the
262
+ # data-role="controlgroup" attribute — the framework will create a vertical
263
+ # button group, remove all margins and drop shadows between the buttons, and
264
+ # only round the first and last buttons of the set to create the effect that
265
+ # they are grouped together.
266
+ #
267
+ # This helper will generate:
268
+ #
269
+ # - buttongroup :horizontal do
270
+ # = button :load, 'load.html', 'Load'
271
+ # = button :save, 'save.html', 'Save'
272
+ #
273
+ # Will produce:
274
+ #
275
+ # <div data-role="controlgroup">
276
+ # <a href="load.html" data-role="button">Load</a>
277
+ # <a href="save.html" data-role="button">Save</a>
278
+ # </div>
279
+ #
280
+ # Additional properties that could be set:
281
+ #
282
+ # [kind] The kind of group. Could be horizontal or vertical. Default: horizontal
283
+ #
284
+ def buttongroup(kind=:horizontal, &block)
285
+ haml_tag :div, :'data-role' => "controlgroup", :'data-type' => "horizontal" do
286
+ block.call if block_given?
287
+ end
288
+ end
289
+
290
+ # Buttons that are used for navigation should be coded as anchor links, and
291
+ # those that submit forms as button elements — each will be styled
292
+ # identically by the framework.
293
+ #
294
+ # Example usage:
295
+ #
296
+ # = button :save, 'save.html', 'Save', :theme => 'b'
297
+ # = button :save, 'save.html', 'Save', :ajax => true
298
+ #
299
+ # [kind] Define icon used for button
300
+ # [url] Where to move after click
301
+ # [label] Text displayed in button
302
+ # [theme] Change mobile theme ('a'..'f')
303
+ # [ajax] Overide default AJAX setting
304
+
305
+ def button(kind, url, label, opts={})
306
+ options = {
307
+ :'data-icon' => kind,
308
+ :'data-role' => :button,
309
+ :href => url
310
+ }.merge(opts)
311
+ options.merge!(:'data-ajax' => 'false') if not RBMobile::config[:ajax] and not options.delete(:ajax)
312
+ options.merge!(:'data-theme' => options.delete(:theme)) if options[:theme]
313
+ capture_haml do
314
+ haml_tag :a, options do
315
+ haml_concat label
316
+ end
317
+ end
318
+ end
319
+
320
+ # By default, all buttons in the body content are styled as block-level
321
+ # element so they fill the width of the screen However, if you want a more
322
+ # compact button that is only as wide as the text and icons inside, add the
323
+ # data-inline="true" attribute to the button
324
+ #
325
+ # Example usage:
326
+ #
327
+ # %p
328
+ # Click %{inline_button(:save, '/save', 'Save')} to submit changes
329
+ #
330
+ def inline_button(kind, url, label, opts={})
331
+ opts.merge!(:'data-inline' => 'true')
332
+ button(kind, url, label, opts)
333
+ end
334
+
335
+ # Using multiple column layouts isn't generally recommended on a mobile
336
+ # device because of the narrow screen width, but there are times where you
337
+ # may need to place small elements side-by-side (like buttons or navigation
338
+ # tabs, for example). The jQuery Mobile framework provides a simple way to
339
+ # build CSS-based columns through a block style class convention called
340
+ # ui-grid. There are two preset configurations layouts — two-column (using
341
+ # the class of ui-grid-a), and three-column (using the class of ui-grid-b) —
342
+ # that can be used in any situation that requires columns. Grids are 100%
343
+ # width, completely invisible (no borders or backgrounds) and don't have
344
+ # padding or margins, so they shouldn't interfere with the styles of
345
+ # elements placed inside them.
346
+ #
347
+ # Usage:
348
+ #
349
+ # - grid do
350
+ # - column do
351
+ # Left content
352
+ # - column do
353
+ # Right content
354
+ #
355
+ # [columns] How many columns will be used (Default: 2)
356
+ #
357
+ def grid(columns=2, &block)
358
+ @columns = ['ui-block-a', 'ui-block-b', 'ui-block-c'].reverse
359
+ haml_tag :div, :class => (columns==2) ? 'ui-grid-a' : 'ui-grid-b' do
360
+ block.call if block_given?
361
+ end
362
+ end
363
+
364
+ # A single grid column
365
+ #
366
+ # Usage: see 'grid'
367
+ #
368
+ def column(&block)
369
+ haml_tag :div, :class => @columns.pop do
370
+ block.call if block_given?
371
+ end
372
+ end
373
+
374
+ # To create a collapsible blocks of content, create a container and add the
375
+ # data-role="collapsible" attribute.
376
+ #
377
+ # Usage:
378
+ #
379
+ # - collapse "This content is collapsible" do
380
+ # %p Some content here!
381
+ #
382
+ # <div data-role="collapsible">
383
+ # <h3>I'm a header</h3>
384
+ # <p>I'm the collapsible content. By default I'm open and displayed on the page, but you can click the header to hide me.</p>
385
+ # </div>
386
+ #
387
+ # [collapsed] Determine whenever this block is collapsed or not
388
+ #
389
+ def collapse(title, opts={}, &block)
390
+ opts[:'data-collapsed'] = 'true' if opts.delete(:collapsed) or @collapsed
391
+ role :collapsible, opts do
392
+ haml_tag :h3 do
393
+ haml_concat title
394
+ end
395
+ block.call
396
+ end
397
+ end
398
+
399
+ # Collapsible sets start with the exact same markup as individual
400
+ # collapsibles. By adding a parent wrapper with a
401
+ # data-role="collapsible-set" attribute around a number of collapsibles, the
402
+ # framework will style these to looks like a visually grouped widget and
403
+ # make it behave like an accordion so only one section can be open at a
404
+ # time.
405
+ #
406
+ # Example:
407
+ #
408
+ # - collapse_set do
409
+ # - collapse 'This is collapsible' do
410
+ # Hello world!
411
+ # - collapse 'This is collapsible' do
412
+ # Hello world!
413
+ #
414
+ def collapse_set(opts={}, &block)
415
+ @collapsed = true
416
+ role :'collapsible-set', opts do
417
+ block.call if block_given?
418
+ end
419
+ end
420
+
421
+ # A list view is coded as a simple unordered list containing linked list
422
+ # items with a data-role="listview" attribute. jQuery Mobile will apply all
423
+ # the necessary styles to transform the list into a mobile-friendly list
424
+ # view with right arrow indicator that fills the full width of the browser
425
+ # window. When you tap on the list item, the framework will trigger a click
426
+ # on the first link inside the list item, issue an AJAX request for the URL
427
+ # in the link, create the new page in the DOM, then kick off a page
428
+ # transition.
429
+ #
430
+ # Example:
431
+ # - list :theme => 'a', :filter => true do
432
+ # = divider "This is divider"
433
+ # - item do
434
+ # Hello World!
435
+ # = counter('3')
436
+ #
437
+ # [filter] Determine if search filter will show up or not
438
+ #
439
+ def list(opts={}, &block)
440
+ opts[:element] = opts.delete(:ordered) ? :ol : :ul
441
+ opts[:'data-inset'] = 'true'
442
+ opts[:'data-split-theme'] = opts.delete(:'split-theme') if opts[:'split-theme']
443
+ opts[:'data-filter'] = opts.delete(:'filter') ? 'true' : 'false'
444
+ role :'listview', opts do
445
+ block.call if block_given?
446
+ end
447
+ end
448
+
449
+ # Same as 'list' but instead of creating a unorder list will create an
450
+ # ordered list
451
+ #
452
+ def ordered_list(opts={}, &block)
453
+ list(opts.merge(:ordered => true), &block)
454
+ end
455
+
456
+ # A single list item (li).
457
+ #
458
+ # Example: See 'list'
459
+ #
460
+ # Options:
461
+ #
462
+ # [icon] Define the right icon in list
463
+ # [theme] Change default theme for single list item
464
+ # [item_icon_url] Allow to display custom (64x64) icon on the left side
465
+ #
466
+ def item(opts={}, &block)
467
+ opts[:'data-icon'] = opts.delete(:icon) if opts[:icon]
468
+ opts[:'data-theme'] = opts.delete(:theme) if opts[:theme]
469
+ haml_tag :li, opts do
470
+ block.call if block_given?
471
+ haml_tag(:img, :src => opts[:item_icon_url], :class => 'ui-li-icon') if opts[:item_icon_url]
472
+ end
473
+ end
474
+
475
+ # Same as list item ('item') but this will create a 'link' item.
476
+ #
477
+ # Example:
478
+ #
479
+ # - list do
480
+ # - link 'a.html', :icon => 'alert' do
481
+ # This item will send you to a.html
482
+ #
483
+ def link(url, opts={}, &block)
484
+ original_block = block
485
+ new_block = Proc::new do
486
+ haml_tag :a, :href => url do
487
+ original_block.call
488
+ end
489
+ end
490
+ item(opts, &new_block)
491
+ end
492
+
493
+ # This will allow you to create a 'nested' list item.
494
+ # Instead of showing just one single line in list item this will show a
495
+ # header and text on bottom.
496
+ #
497
+ # Example:
498
+ #
499
+ # - list do
500
+ # - nested_item 'This is item header', :theme => 'b' do
501
+ # This is item content
502
+ #
503
+ def nested_item(title, opts={}, &block)
504
+ original_block = block
505
+ new_block = Proc::new do
506
+ haml_tag :h3 do
507
+ haml_concat title
508
+ end
509
+ original_block.call
510
+ end
511
+ item(opts, &new_block)
512
+ end
513
+
514
+ # This will add a small counter on the right side of list item.
515
+ #
516
+ # Example:
517
+ #
518
+ # - list do
519
+ # - item do
520
+ # Active connections
521
+ # = counter '3'
522
+ #
523
+ def counter(value)
524
+ capture_haml do
525
+ haml_tag :span, :class => 'ui-li-count' do
526
+ haml_concat value
527
+ end
528
+ end
529
+ end
530
+
531
+ # This will allow you to add an thumbnail on right side of list item.
532
+ #
533
+ # Example:
534
+ #
535
+ # - list do
536
+ # - item do
537
+ # = thumb '/images/computer.png'
538
+ # Computer
539
+ #
540
+ def thumb(image_url)
541
+ capture_haml do
542
+ haml_tag :image, :class => 'ui-li-thumb', :src => image_url
543
+ end
544
+ end
545
+
546
+ # This will create a list divider. It could be also used to create a contact
547
+ # list alphabetically sorted.
548
+ #
549
+ # - list do
550
+ # = divider "A"
551
+ # - item do
552
+ # Andreas Muller
553
+ #
554
+ def divider(title, opts={})
555
+ opts[:element] = :li
556
+ capture_haml do
557
+ role :'list-divider', opts do
558
+ haml_concat title
559
+ end
560
+ end
561
+ end
562
+
563
+ private
564
+
565
+ def role(name, opts={}, &block)
566
+ options = {
567
+ :'data-role' => name
568
+ }
569
+ options.merge!(:'data-theme' => opts.delete(:theme)) if opts[:theme]
570
+ options.merge!(opts)
571
+ element = options.delete(:element) || :div
572
+ haml_tag element, options do
573
+ block.call if block_given?
574
+ end
575
+ end
576
+
577
+ end
578
+ end
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rbmobile
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Michal Fojtik
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-08-16 00:00:00 +02:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: haml
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ description: " A swiss knife to create a hipster UI using jquery.mobile framework.\n Provides set of HAML helpers to make your template more beautifull.\n"
36
+ email: mi@mifo.sk
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files: []
42
+
43
+ files:
44
+ - lib/mobile_helpers.rb
45
+ - README.markdown
46
+ has_rdoc: true
47
+ homepage: http://github.com/mifo/rbmobile
48
+ licenses: []
49
+
50
+ post_install_message:
51
+ rdoc_options: []
52
+
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ hash: 53
61
+ segments:
62
+ - 1
63
+ - 8
64
+ - 1
65
+ version: 1.8.1
66
+ required_rubygems_version: !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ hash: 3
72
+ segments:
73
+ - 0
74
+ version: "0"
75
+ requirements: []
76
+
77
+ rubyforge_project:
78
+ rubygems_version: 1.6.2
79
+ signing_key:
80
+ specification_version: 3
81
+ summary: jquery.mobile HAML helpers
82
+ test_files: []
83
+