better_select 0.0.3 → 0.0.4

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.
@@ -0,0 +1,330 @@
1
+ // Generated by CoffeeScript 1.3.3
2
+ (function() {
3
+ var $$, BetterSelect, addClass, build_element, getClasses, getLeft, getPos, getTop, letters, numbers, removeClass, renderOption, renderOptionGroup, setClasses;
4
+
5
+ $$ = function(html) {
6
+ var elm;
7
+ elm = document.createElement('div');
8
+ elm.innerHTML = html;
9
+ if (elm.children.length > 1) {
10
+ return elm.children;
11
+ } else {
12
+ return elm.children[0];
13
+ }
14
+ };
15
+
16
+ getPos = function(tgt, method) {
17
+ var pos;
18
+ pos = 0;
19
+ while (tgt) {
20
+ pos += tgt[method];
21
+ tgt = tgt.offsetParent;
22
+ }
23
+ return pos;
24
+ };
25
+
26
+ getTop = function(tgt) {
27
+ return getPos(tgt, 'offsetTop');
28
+ };
29
+
30
+ getLeft = function(tgt) {
31
+ return getPos(tgt, 'offsetLeft');
32
+ };
33
+
34
+ getClasses = function(tgt) {
35
+ return tgt.getAttribute('class').split(' ');
36
+ };
37
+
38
+ setClasses = function(tgt, classes) {
39
+ tgt.setAttribute('class', classes.join(' '));
40
+ return tgt;
41
+ };
42
+
43
+ addClass = function(tgt, className) {
44
+ var classes;
45
+ classes = getClasses(tgt);
46
+ if (classes.indexOf(className) === -1) {
47
+ classes.push(className);
48
+ }
49
+ return setClasses(tgt, classes);
50
+ };
51
+
52
+ removeClass = function(tgt, className) {
53
+ var classes, index;
54
+ if (!(index = (classes = getClasses(tgt)).indexOf(className === -1))) {
55
+ classes.splice(index, 1);
56
+ }
57
+ return setClasses(tgt, classes);
58
+ };
59
+
60
+ letters = 'a b c d e f g h i j k l m n o p q r s t u v w x y z'.split(' ');
61
+
62
+ numbers = '0 1 2 3 4 5 6 7 8 9 0'.split(' ');
63
+
64
+ build_element = function(what, orig, obj) {
65
+ var elm;
66
+ elm = $$(_.template(obj["" + what + "_template"])(obj["process_" + what](orig)));
67
+ elm.orig = orig;
68
+ orig.better_version = elm;
69
+ elm.better_select = obj;
70
+ return elm;
71
+ };
72
+
73
+ renderOption = function(orig_option, bs) {
74
+ var first_char, option;
75
+ option = build_element('option', orig_option, bs);
76
+ option.reset = function() {
77
+ this.orig.selected = void 0;
78
+ this.setAttribute('class', 'option');
79
+ return bs.reset(this);
80
+ };
81
+ option.select = function() {
82
+ this.orig.selected = 'selected';
83
+ this.setAttribute('class', 'option selected');
84
+ if (bs.select.getAttribute('class').indexOf('open') !== -1) {
85
+ bs.toggle();
86
+ }
87
+ return bs.set_selected(option);
88
+ };
89
+ option.addEventListener('click', function() {
90
+ return option.select();
91
+ });
92
+ option.addEventListener('mouseover', function() {
93
+ return option.better_select.set_focused(option);
94
+ });
95
+ bs.options.push(option);
96
+ first_char = option.innerHTML.substr(0, 1).toLowerCase();
97
+ if (!bs.options_by_first_char[first_char]) {
98
+ bs.options_by_first_char[first_char] = [];
99
+ }
100
+ bs.options_by_first_char[first_char].push(option);
101
+ bs.options_by_first_char[first_char].sort();
102
+ return option;
103
+ };
104
+
105
+ renderOptionGroup = function(orig_group, bs) {
106
+ var child, group, _i, _len, _ref;
107
+ group = build_element('option_group', orig_group, bs);
108
+ _ref = orig_group.children;
109
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
110
+ child = _ref[_i];
111
+ group.appendChild(renderOption(child, bs));
112
+ }
113
+ bs.option_groups.push(group);
114
+ return group;
115
+ };
116
+
117
+ BetterSelect = (function() {
118
+
119
+ BetterSelect.prototype.defaults = {
120
+ positionDropdown: true
121
+ };
122
+
123
+ function BetterSelect(elm, options) {
124
+ var child, children, last_char, method, selected, _i, _len, _ref,
125
+ _this = this;
126
+ if (!(elm && elm.tagName && elm.tagName === 'SELECT')) {
127
+ return;
128
+ }
129
+ this.settings = _.extend({}, this.defaults, options);
130
+ this.options = [];
131
+ this.options_by_first_char = {};
132
+ this.option_groups = [];
133
+ selected = elm.selectedOptions;
134
+ this.select = build_element('select', elm, this);
135
+ _ref = this.select.children, this.selected_option = _ref[0], this.dropdown = _ref[1];
136
+ if (elm.id) {
137
+ this.select.id = "" + elm.id + "-better-select";
138
+ this.dropdown.id = "" + elm.id + "-better-select-dropdown";
139
+ }
140
+ this.default_selected = [elm.children[elm.selectedIndex]];
141
+ elm.parentNode.insertBefore(this.select, elm);
142
+ elm.parentNode.insertBefore(elm, this.select);
143
+ elm.style.display = 'none';
144
+ children = elm.children;
145
+ if (this.settings.positionDropdown) {
146
+ document.body.appendChild(this.dropdown);
147
+ this.dropdown.style.left = '-9999px';
148
+ }
149
+ for (_i = 0, _len = children.length; _i < _len; _i++) {
150
+ child = children[_i];
151
+ switch (child.tagName) {
152
+ case 'OPTION':
153
+ method = renderOption;
154
+ break;
155
+ case 'OPTGROUP':
156
+ method = renderOptionGroup;
157
+ }
158
+ this.dropdown.appendChild(method(child, this));
159
+ }
160
+ if (this.default_selected) {
161
+ this.default_selected[0].better_version.select();
162
+ }
163
+ this.selected_option.addEventListener('click', function() {
164
+ _this.toggle();
165
+ return _this.set_selected(_this.dropdown_selected_option);
166
+ });
167
+ window.addEventListener('click', function(e) {
168
+ if (!(e.target === _this.selected_option || e.target === _this.select || _this.options.indexOf(e.target) !== -1)) {
169
+ if (_this.open) {
170
+ return _this.toggle();
171
+ }
172
+ }
173
+ });
174
+ last_char = false;
175
+ this.selected_option.addEventListener('focus', function() {
176
+ document.body.style.overflow = 'hidden';
177
+ return addClass(_this.select, 'focus');
178
+ });
179
+ this.selected_option.addEventListener('blur', function() {
180
+ removeClass(_this.select, 'focus');
181
+ document.body.style.overflow = 'auto';
182
+ if (_this.open === true) {
183
+ _this.toggle();
184
+ }
185
+ return true;
186
+ });
187
+ this.selected_option.addEventListener('keydown', function(e) {
188
+ if ([38, 40].indexOf(e.keyCode) !== -1) {
189
+ return e.preventDefault();
190
+ }
191
+ });
192
+ this.selected_option.addEventListener('keyup', function(e) {
193
+ var char, keyCode, last_character, option;
194
+ if (_this.open === false) {
195
+ _this.toggle();
196
+ }
197
+ keyCode = e.keyCode;
198
+ switch (keyCode) {
199
+ case 38:
200
+ _this.set_focused(_this.options[(_this.focus_index -= 1) < 0 ? _this.focus_index = _this.options.length - 1 : _this.focus_index]);
201
+ break;
202
+ case 40:
203
+ _this.set_focused(_this.options[(_this.focus_index += 1) >= _this.options.length ? _this.focus_index = 0 : _this.focus_index]);
204
+ break;
205
+ case 13:
206
+ _this.focused_option.select();
207
+ break;
208
+ default:
209
+ if (keyCode > 47 && keyCode < 58) {
210
+ char = numbers[keyCode - 47];
211
+ } else if (keyCode > 64 && keyCode < 91) {
212
+ char = letters[keyCode - 65];
213
+ } else {
214
+ if (_this.focused_option) {
215
+ removeClass(_this.focused_option, 'focus');
216
+ _this.focused_option = false;
217
+ _this.focus_index = -1;
218
+ }
219
+ _this.toggle();
220
+ }
221
+ if (char && _this.options_by_first_char[char]) {
222
+ if (last_char !== char) {
223
+ _this.options_by_first_char[char].sort();
224
+ }
225
+ option = _this.options_by_first_char[char].shift();
226
+ _this.options_by_first_char[char].push(option);
227
+ _this.set_focused(option);
228
+ _this.focus_index = _this.options.indexOf(option);
229
+ last_character = char;
230
+ }
231
+ }
232
+ _this.dropdown.addEventListener('click', function() {
233
+ return console.log(arguments);
234
+ });
235
+ e.preventDefault();
236
+ e.stopPropagation();
237
+ e.returnValue = false;
238
+ return false;
239
+ });
240
+ }
241
+
242
+ BetterSelect.prototype.focused_option = false;
243
+
244
+ BetterSelect.prototype.focus_index = -1;
245
+
246
+ BetterSelect.prototype.set_focused = function(option) {
247
+ var class_for_selected,
248
+ _this = this;
249
+ class_for_selected = function(option) {
250
+ if (_this.selected_option && option.innerHTML === _this.selected_option.innerHTML) {
251
+ return " selected";
252
+ } else {
253
+ return "";
254
+ }
255
+ };
256
+ if (this.focused_option) {
257
+ this.focused_option.setAttribute('class', "option" + (class_for_selected(this.focused_option)));
258
+ }
259
+ this.focused_option = option;
260
+ this.focused_option.setAttribute("class", "option focus" + (class_for_selected(option)));
261
+ return this.focus_index = this.options.indexOf(this.focused_option);
262
+ };
263
+
264
+ BetterSelect.prototype.open = false;
265
+
266
+ BetterSelect.prototype.toggle = function() {
267
+ var height, top;
268
+ ((this.open = !this.open) ? addClass : removeClass)(this.select, 'open');
269
+ if (this.settings.positionDropdown) {
270
+ if (this.dropdown.offsetHeight > window.innerHeight) {
271
+ height = window.innerHeight * .50;
272
+ this.dropdown.style.height = height + 'px';
273
+ this.dropdown.style['overflow-y'] = 'auto';
274
+ if (this.dropdown_selected_option.offsetTop > height || this.adjust_height) {
275
+ this.dropdown_selected_option.scrollIntoView();
276
+ this.adjust_height = true;
277
+ }
278
+ }
279
+ top = top || (getTop(this.select) - this.dropdown_selected_option.offsetTop);
280
+ top = getTop(this.select) - (this.dropdown_selected_option.offsetTop - this.dropdown.scrollTop);
281
+ this.dropdown.style.top = (top < 0 ? 0 : top) + 'px';
282
+ return this.dropdown.style.left = this.open ? getLeft(this.select) + 'px' : '-9999px';
283
+ }
284
+ };
285
+
286
+ BetterSelect.prototype.reset = function(option) {
287
+ if (this.default_selected) {
288
+ return this.default_selected[0].better_version.select();
289
+ }
290
+ };
291
+
292
+ BetterSelect.prototype.set_selected = function(option) {
293
+ var e;
294
+ if (this.selected_option.innerHTML !== option.innerHTML) {
295
+ if (this.dropdown_selected_option) {
296
+ removeClass(this.dropdown_selected_option, 'selected');
297
+ }
298
+ addClass(this.dropdown_selected_option = option, 'selected');
299
+ this.selected_option.innerHTML = option.innerHTML;
300
+ e = document.createEvent('Event');
301
+ e.initEvent('change', true, true);
302
+ return this.select.orig.dispatchEvent(e);
303
+ }
304
+ };
305
+
306
+ BetterSelect.prototype.option_template = '<div class="option"><%= innerHTML %></div>';
307
+
308
+ BetterSelect.prototype.option_group_template = '<div class="optgroup"><div class="option-group-label"><%= label %></div></div>';
309
+
310
+ BetterSelect.prototype.select_template = '<div class="select"><a href="javascript:void(0)" class="selected-option"></a><div class="better-select-dropdown dropdown"></div></div>';
311
+
312
+ BetterSelect.prototype.process_option = function(option) {
313
+ return option;
314
+ };
315
+
316
+ BetterSelect.prototype.process_option_group = function(option_group) {
317
+ return option_group;
318
+ };
319
+
320
+ BetterSelect.prototype.process_select = function(select) {
321
+ return select;
322
+ };
323
+
324
+ return BetterSelect;
325
+
326
+ })();
327
+
328
+ window.BetterSelect = BetterSelect;
329
+
330
+ }).call(this);
@@ -0,0 +1,183 @@
1
+ $$ = (html) ->
2
+ elm = document.createElement 'div'
3
+ elm.innerHTML = html
4
+ if elm.children.length > 1 then elm.children else elm.children[0]
5
+
6
+ getPos = (tgt, method) ->
7
+ pos = 0
8
+ while tgt
9
+ pos += tgt[method]
10
+ tgt = tgt.offsetParent
11
+ pos
12
+
13
+ getTop = (tgt) -> getPos tgt, 'offsetTop'
14
+ getLeft = (tgt) -> getPos tgt, 'offsetLeft'
15
+
16
+ getClasses = (tgt) -> tgt.getAttribute('class').split ' '
17
+
18
+ setClasses = (tgt, classes) ->
19
+ tgt.setAttribute 'class', classes.join ' '
20
+ tgt
21
+
22
+ addClass = (tgt, className) ->
23
+ classes = getClasses tgt
24
+ classes.push(className) if classes.indexOf(className) is -1
25
+ setClasses tgt, classes
26
+
27
+ removeClass = (tgt, className) ->
28
+ classes.splice(index, 1) unless index = (classes = getClasses tgt).indexOf className is -1
29
+ setClasses tgt, classes
30
+
31
+ letters = 'a b c d e f g h i j k l m n o p q r s t u v w x y z'.split ' '
32
+ numbers = '0 1 2 3 4 5 6 7 8 9 0'.split ' '
33
+
34
+ build_element = (what, orig, obj) ->
35
+ ((elm = $$ _.template(obj["#{what}_template"]) obj["process_#{what}"] orig).orig = orig).better_version = elm
36
+ elm.better_select = obj
37
+ elm
38
+
39
+ renderOption = (orig_option, bs) ->
40
+ option = build_element 'option', orig_option, bs
41
+ option.reset = ->
42
+ @orig.selected = undefined
43
+ @setAttribute 'class', 'option'
44
+ bs.reset @
45
+ option.select = ->
46
+ @orig.selected = 'selected'
47
+ @setAttribute 'class', 'option selected'
48
+ bs.toggle() if bs.select.getAttribute('class').indexOf('open') isnt -1
49
+ bs.set_selected option
50
+ option.addEventListener 'click', -> option.select()
51
+ option.addEventListener 'mouseover', -> option.better_select.set_focused option
52
+ bs.options.push option
53
+ first_char = option.innerHTML.substr(0, 1).toLowerCase()
54
+ bs.options_by_first_char[first_char] = [] unless bs.options_by_first_char[first_char]
55
+ bs.options_by_first_char[first_char].push option
56
+ bs.options_by_first_char[first_char].sort()
57
+ option
58
+
59
+ renderOptionGroup = (orig_group, bs) ->
60
+ group = build_element 'option_group', orig_group, bs
61
+ group.appendChild(renderOption child, bs) for child in orig_group.children
62
+ bs.option_groups.push group
63
+ group
64
+
65
+ class BetterSelect
66
+ defaults:
67
+ positionDropdown: true
68
+ constructor: (elm, options) ->
69
+ return unless elm && elm.tagName && elm.tagName is 'SELECT'
70
+ @settings = _.extend {}, @defaults, options
71
+ @options = []
72
+ @options_by_first_char = {}
73
+ @option_groups = []
74
+ selected = elm.selectedOptions
75
+ @select = build_element 'select', elm, @
76
+ [@selected_option, @dropdown] = @select.children
77
+ if elm.id
78
+ @select.id = "#{elm.id}-better-select"
79
+ @dropdown.id = "#{elm.id}-better-select-dropdown"
80
+ @default_selected = [elm.children[elm.selectedIndex]]
81
+ elm.parentNode.insertBefore @select, elm
82
+ elm.parentNode.insertBefore elm, @select
83
+ elm.style.display = 'none'
84
+ children = elm.children
85
+ if @settings.positionDropdown
86
+ document.body.appendChild @dropdown
87
+ @dropdown.style.left = '-9999px'
88
+ for child in children
89
+ switch child.tagName
90
+ when 'OPTION'
91
+ method = renderOption
92
+ when 'OPTGROUP'
93
+ method = renderOptionGroup
94
+ @dropdown.appendChild(method child, @)
95
+ @default_selected[0].better_version.select() if @default_selected
96
+ @selected_option.addEventListener 'click', =>
97
+ @toggle()
98
+ @set_selected @dropdown_selected_option
99
+ window.addEventListener 'click', (e) =>
100
+ unless e.target == @selected_option || e.target == @select || @options.indexOf(e.target) isnt -1
101
+ @toggle() if @open
102
+ last_char = false
103
+ @selected_option.addEventListener 'focus', =>
104
+ document.body.style.overflow = 'hidden'
105
+ addClass @select, 'focus'
106
+ @selected_option.addEventListener 'blur', =>
107
+ removeClass @select, 'focus'
108
+ document.body.style.overflow = 'auto'
109
+ @toggle() if @open is true
110
+ true
111
+ @selected_option.addEventListener 'keydown', (e) => e.preventDefault() unless [38, 40].indexOf(e.keyCode) is -1
112
+ @selected_option.addEventListener 'keyup', (e) =>
113
+ @toggle() if @open is false
114
+ keyCode = e.keyCode
115
+ switch keyCode
116
+ when 38 then @set_focused @options[if (@focus_index -= 1) < 0 then @focus_index = @options.length - 1 else @focus_index]
117
+ when 40 then @set_focused @options[if (@focus_index += 1) >= @options.length then @focus_index = 0 else @focus_index]
118
+ when 13
119
+ @focused_option.select()
120
+ else
121
+ if keyCode > 47 && keyCode < 58
122
+ char = numbers[keyCode - 47]
123
+ else if keyCode > 64 && keyCode < 91
124
+ char = letters[keyCode - 65]
125
+ else
126
+ if @focused_option
127
+ removeClass @focused_option, 'focus'
128
+ @focused_option = false
129
+ @focus_index = -1
130
+ @toggle()
131
+ if char && @options_by_first_char[char]
132
+ @options_by_first_char[char].sort() unless last_char is char
133
+ option = @options_by_first_char[char].shift()
134
+ @options_by_first_char[char].push option
135
+ @set_focused option
136
+ @focus_index = @options.indexOf option
137
+ last_character = char
138
+ @dropdown.addEventListener('click', -> console.log arguments)
139
+ e.preventDefault()
140
+ e.stopPropagation()
141
+ e.returnValue = false
142
+ false
143
+ focused_option: false
144
+ focus_index: -1
145
+ set_focused: (option) ->
146
+ class_for_selected = (option) => if @selected_option && option.innerHTML is @selected_option.innerHTML then " selected" else ""
147
+ @focused_option.setAttribute('class', "option#{class_for_selected(@focused_option)}") if @focused_option
148
+ @focused_option = option
149
+ @focused_option.setAttribute("class", "option focus#{class_for_selected(option)}")
150
+ @focus_index = @options.indexOf @focused_option
151
+ open: false
152
+ toggle: ->
153
+ (if @open = !@open then addClass else removeClass)(@select, 'open')
154
+ if @settings.positionDropdown
155
+ if @dropdown.offsetHeight > window.innerHeight
156
+ height = window.innerHeight * .50
157
+ @dropdown.style.height = height + 'px'
158
+ @dropdown.style['overflow-y'] = 'auto'
159
+ if @dropdown_selected_option.offsetTop > height || @adjust_height
160
+ @dropdown_selected_option.scrollIntoView()
161
+ @adjust_height = true
162
+ top = top || (getTop(@select) - @dropdown_selected_option.offsetTop)
163
+ top = getTop(@select) - (@dropdown_selected_option.offsetTop - @dropdown.scrollTop)
164
+ @dropdown.style.top = (if top < 0 then 0 else top) + 'px'
165
+ @dropdown.style.left = if @open then getLeft(@select) + 'px' else '-9999px'
166
+ reset: (option) -> @default_selected[0].better_version.select() if @default_selected
167
+ set_selected: (option) ->
168
+ unless @selected_option.innerHTML == option.innerHTML
169
+ removeClass(@dropdown_selected_option, 'selected') if @dropdown_selected_option
170
+ addClass @dropdown_selected_option = option, 'selected'
171
+ @selected_option.innerHTML = option.innerHTML
172
+ e = document.createEvent('Event')
173
+ e.initEvent 'change', true, true
174
+ @select.orig.dispatchEvent e
175
+ option_template: '<div class="option"><%= innerHTML %></div>'
176
+ option_group_template: '<div class="optgroup"><div class="option-group-label"><%= label %></div></div>'
177
+ select_template: '<div class="select"><a href="javascript:void(0)" class="selected-option"></a><div class="better-select-dropdown dropdown"></div></div>'
178
+ process_option: (option) -> option
179
+ process_option_group: (option_group) -> option_group
180
+ process_select: (select) -> select
181
+
182
+
183
+ window.BetterSelect = BetterSelect
@@ -0,0 +1,32 @@
1
+ .better-select-dropdown {
2
+ position: fixed;
3
+
4
+ .option {
5
+ cursor: pointer;
6
+ }
7
+ }
8
+
9
+ .select {
10
+ position: static;
11
+
12
+ &.dont-position-dropdown {
13
+ position: relative;
14
+
15
+ .dropdown {
16
+ top: 100%;
17
+ left: -99999px;
18
+ }
19
+ }
20
+
21
+ &.open {
22
+ &.dont-position-dropdown {
23
+ .dropdown {
24
+ left: 0px;
25
+ }
26
+ }
27
+ }
28
+
29
+ .selected-option {
30
+ cursor: pointer;
31
+ }
32
+ }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: better_select
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,23 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
  date: 2012-12-18 00:00:00.000000000 Z
13
- dependencies: []
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: railties
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '3.1'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '3.1'
14
30
  description: A better HTMLSelectElement replacement
15
31
  email:
16
32
  - bennyjbergstein@gmail.com
@@ -24,13 +40,30 @@ files:
24
40
  - LICENSE
25
41
  - README.md
26
42
  - Rakefile
27
- - better_select_rails.gemspec
43
+ - better_select.gemspec
28
44
  - lib/better_select.rb
29
45
  - lib/better_select/engine.rb
30
46
  - lib/better_select/version.rb
47
+ - vendor/assets/better_select.gemspec
48
+ - vendor/assets/build/better-select.css
49
+ - vendor/assets/build/better-select.js
50
+ - vendor/assets/javascripts/better-select.js.coffee
51
+ - vendor/assets/lib/better-select.coffee
52
+ - vendor/assets/lib/better-select.css.scss
53
+ - vendor/assets/LICENSE
54
+ - vendor/assets/Makefile
55
+ - vendor/assets/README.md
56
+ - vendor/assets/stylesheets/better-select.css.scss
57
+ - vendor/build/better-select.css
58
+ - vendor/build/better-select.js
31
59
  - vendor/javascripts/better-select.js.coffee
60
+ - vendor/lib/better-select.coffee
61
+ - vendor/lib/better-select.css.scss
62
+ - vendor/LICENSE
63
+ - vendor/Makefile
64
+ - vendor/README.md
32
65
  - vendor/stylesheets/better-select.css.scss
33
- homepage: http://www.benjaminbergstein.com
66
+ homepage: http://www.benjaminberstein.com
34
67
  licenses: []
35
68
  post_install_message:
36
69
  rdoc_options: []