jquery-atwho-rails 0.4.11 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: edd22436434bb09eecdc9e926d6a14a1f1f9a177
4
- data.tar.gz: bbd43f1b9adf1c0294327d166f7b33d1b5b5a961
3
+ metadata.gz: ec1b0e0e1b0876d6881d5bc64f8a08ab858a3399
4
+ data.tar.gz: 97e3bfd53d3df6ce4b6223d9532711563bc86510
5
5
  SHA512:
6
- metadata.gz: 7b51f3042fb10491bfb2b09ed3c5df937b9006086a7e40e898111b730c7fc48ae14907ff44214c5ce5daee8c82724b90083f7be603384ac74ae43ab89bb3e879
7
- data.tar.gz: d4a0286f34a546f694f46ee7d93b27cf98687db0bc724056129b863804a1b0b0a1d3da21f31da6a996f9dd17c2420db31f50aaeca043a0669152dbe2e6b0644a
6
+ metadata.gz: c61673d1cb967107e63e150726e4b0780b5f349caa140b4460a0e8d20334054263f9dd3c85e95277de1af5f0afd64eb9c6a7115687849a8f21c65846509d59d8
7
+ data.tar.gz: e02326f5c3ae2782022b11c349951efa636f80afb72549368f1a89c5bbd63995dafff2210e797e1af03286cd9722fa44b02e019a68f4b12b20a756e2b93bf161
data/Appraisals ADDED
@@ -0,0 +1,3 @@
1
+ appraise "rails30" do
2
+ gem "rails", "~> 3.0.0"
3
+ end
data/Gemfile CHANGED
@@ -1,5 +1,10 @@
1
- #source "http://rubygems.org"
2
- source "http://ruby.taobao.org"
1
+ if ENV['TRAVIS']
2
+ source 'https://rubygems.org'
3
+ else
4
+ source 'http://ruby.taobao.org'
5
+ end
3
6
 
4
7
  # Specify your gem's dependencies in jquery-atwho-rails.gemspec
5
8
  gemspec
9
+
10
+ gem 'appraisal'
data/README.md CHANGED
@@ -3,8 +3,10 @@
3
3
  Bind your textarea
4
4
 
5
5
  ```javascript
6
- data = ['tom','john'];
7
- $('textarea').atwho({at:"@", 'data':data});
6
+ $(function(){
7
+ data = ['tom','john'];
8
+ $('textarea').atwho({at:"@", 'data':data});
9
+ });
8
10
  ```
9
11
 
10
12
  that's it, check it out!
@@ -17,12 +19,12 @@ Issue command line bellow:
17
19
  `rails generate atwho:install`
18
20
  then It will show in `public/[javascript|stylesheets]/` directory.
19
21
 
20
- #### Rails 3.1.x
22
+ #### Rails >= 3.1.x
21
23
  Add this gem in `Gemfile` like this:
22
24
  `gem jquery-atwho-rails`
23
25
 
24
26
  then add
25
- ` //= require jquery.atwho/index ` to `app/assets/javascripts/application.js`
27
+ ` //= require jquery.atwho ` to `app/assets/javascripts/application.js`
26
28
  and add ` //=require jquery.atwho ` to `app/assets/stylesheets/applications.css`
27
29
 
28
30
  #### History Versions
@@ -32,4 +34,4 @@ All in [At.js](https://github.com/ichord/At.js) project.
32
34
  ---
33
35
  #### Test generator
34
36
  Just issue
35
- `bundle` then `rspec`
37
+ `bundle` then `appraisal rails30 rspec`
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
1
3
  require "bundler/gem_tasks"
2
4
 
3
5
  at_dir = "tmp/At.js"
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "http://ruby.taobao.org"
4
+
5
+ gem "appraisal"
6
+ gem "rails", "~> 3.0.0"
7
+
8
+ gemspec :path => "../"
@@ -0,0 +1,105 @@
1
+ PATH
2
+ remote: ../
3
+ specs:
4
+ jquery-atwho-rails (0.4.11)
5
+
6
+ GEM
7
+ remote: http://ruby.taobao.org/
8
+ specs:
9
+ abstract (1.0.0)
10
+ actionmailer (3.0.20)
11
+ actionpack (= 3.0.20)
12
+ mail (~> 2.2.19)
13
+ actionpack (3.0.20)
14
+ activemodel (= 3.0.20)
15
+ activesupport (= 3.0.20)
16
+ builder (~> 2.1.2)
17
+ erubis (~> 2.6.6)
18
+ i18n (~> 0.5.0)
19
+ rack (~> 1.2.5)
20
+ rack-mount (~> 0.6.14)
21
+ rack-test (~> 0.5.7)
22
+ tzinfo (~> 0.3.23)
23
+ activemodel (3.0.20)
24
+ activesupport (= 3.0.20)
25
+ builder (~> 2.1.2)
26
+ i18n (~> 0.5.0)
27
+ activerecord (3.0.20)
28
+ activemodel (= 3.0.20)
29
+ activesupport (= 3.0.20)
30
+ arel (~> 2.0.10)
31
+ tzinfo (~> 0.3.23)
32
+ activeresource (3.0.20)
33
+ activemodel (= 3.0.20)
34
+ activesupport (= 3.0.20)
35
+ activesupport (3.0.20)
36
+ appraisal (1.0.0)
37
+ bundler
38
+ rake
39
+ thor (>= 0.14.0)
40
+ arel (2.0.10)
41
+ builder (2.1.2)
42
+ diff-lcs (1.2.5)
43
+ erubis (2.6.6)
44
+ abstract (>= 1.0.0)
45
+ generator_spec (0.9.2)
46
+ activesupport (>= 3.0.0)
47
+ railties (>= 3.0.0)
48
+ i18n (0.5.4)
49
+ json (1.8.1)
50
+ mail (2.2.20)
51
+ activesupport (>= 2.3.6)
52
+ i18n (>= 0.4.0)
53
+ mime-types (~> 1.16)
54
+ treetop (~> 1.4.8)
55
+ mime-types (1.25.1)
56
+ polyglot (0.3.5)
57
+ rack (1.2.8)
58
+ rack-mount (0.6.14)
59
+ rack (>= 1.0.0)
60
+ rack-test (0.5.7)
61
+ rack (>= 1.0)
62
+ rails (3.0.20)
63
+ actionmailer (= 3.0.20)
64
+ actionpack (= 3.0.20)
65
+ activerecord (= 3.0.20)
66
+ activeresource (= 3.0.20)
67
+ activesupport (= 3.0.20)
68
+ bundler (~> 1.0)
69
+ railties (= 3.0.20)
70
+ railties (3.0.20)
71
+ actionpack (= 3.0.20)
72
+ activesupport (= 3.0.20)
73
+ rake (>= 0.8.7)
74
+ rdoc (~> 3.4)
75
+ thor (~> 0.14.4)
76
+ rake (10.3.2)
77
+ rdoc (3.12.2)
78
+ json (~> 1.4)
79
+ rspec (3.0.0)
80
+ rspec-core (~> 3.0.0)
81
+ rspec-expectations (~> 3.0.0)
82
+ rspec-mocks (~> 3.0.0)
83
+ rspec-core (3.0.4)
84
+ rspec-support (~> 3.0.0)
85
+ rspec-expectations (3.0.4)
86
+ diff-lcs (>= 1.2.0, < 2.0)
87
+ rspec-support (~> 3.0.0)
88
+ rspec-mocks (3.0.4)
89
+ rspec-support (~> 3.0.0)
90
+ rspec-support (3.0.4)
91
+ thor (0.14.6)
92
+ treetop (1.4.15)
93
+ polyglot
94
+ polyglot (>= 0.3.1)
95
+ tzinfo (0.3.41)
96
+
97
+ PLATFORMS
98
+ ruby
99
+
100
+ DEPENDENCIES
101
+ appraisal
102
+ generator_spec
103
+ jquery-atwho-rails!
104
+ rails (~> 3.0.0)
105
+ rspec
@@ -1,4 +1,4 @@
1
- /*! jquery.atwho - v0.4.11 - 2014-04-27
1
+ /*! jquery.atwho - v0.5.0 - 2014-07-14
2
2
  * Copyright (c) 2014 chord.luo <chord.luo@gmail.com>;
3
3
  * homepage: http://ichord.github.com/At.js
4
4
  * Licensed MIT
@@ -13,7 +13,7 @@
13
13
  }
14
14
  })(function($) {
15
15
 
16
- var $CONTAINER, Api, App, Atwho, Controller, DEFAULT_CALLBACKS, KEY_CODE, Model, View,
16
+ var $CONTAINER, Api, App, Controller, DEFAULT_CALLBACKS, KEY_CODE, Model, View,
17
17
  __slice = [].slice;
18
18
 
19
19
  App = (function() {
@@ -28,25 +28,36 @@ App = (function() {
28
28
  }
29
29
 
30
30
  App.prototype.setIframe = function(iframe) {
31
- var error;
32
31
  if (iframe) {
33
32
  this.window = iframe.contentWindow;
34
33
  this.document = iframe.contentDocument || this.window.document;
35
- this.iframe = iframe;
36
- return this;
34
+ return this.iframe = iframe;
37
35
  } else {
38
- this.document = this.$inputor[0].ownerDocument;
39
- this.window = this.document.defaultView || this.document.parentWindow;
40
- try {
41
- return this.iframe = this.window.frameElement;
42
- } catch (_error) {
43
- error = _error;
44
- }
36
+ this.document = document;
37
+ this.window = window;
38
+ return this.iframe = null;
45
39
  }
46
40
  };
47
41
 
48
42
  App.prototype.controller = function(at) {
49
- return this.controllers[this.alias_maps[at] || at || this.current_flag];
43
+ var c, current, current_flag, _ref;
44
+ if (this.alias_maps[at]) {
45
+ current = this.controllers[this.alias_maps[at]];
46
+ } else {
47
+ _ref = this.controllers;
48
+ for (current_flag in _ref) {
49
+ c = _ref[current_flag];
50
+ if (current_flag === at) {
51
+ current = c;
52
+ break;
53
+ }
54
+ }
55
+ }
56
+ if (current) {
57
+ return current;
58
+ } else {
59
+ return this.controllers[this.current_flag];
60
+ }
50
61
  };
51
62
 
52
63
  App.prototype.set_context_for = function(at) {
@@ -76,15 +87,20 @@ App = (function() {
76
87
  })(this)).on('scroll.atwhoInner', (function(_this) {
77
88
  return function(e) {
78
89
  var _ref;
79
- return (_ref = _this.controller()) != null ? _ref.view.hide() : void 0;
90
+ return (_ref = _this.controller()) != null ? _ref.view.hide(e) : void 0;
80
91
  };
81
92
  })(this)).on('blur.atwhoInner', (function(_this) {
82
93
  return function(e) {
83
94
  var c;
84
95
  if (c = _this.controller()) {
85
- return c.view.hide(c.get_opt("display_timeout"));
96
+ return c.view.hide(e, c.get_opt("display_timeout"));
86
97
  }
87
98
  };
99
+ })(this)).on('click.atwhoInner', (function(_this) {
100
+ return function(e) {
101
+ var _ref;
102
+ return (_ref = _this.controller()) != null ? _ref.view.hide(e) : void 0;
103
+ };
88
104
  })(this));
89
105
  };
90
106
 
@@ -153,7 +169,7 @@ App = (function() {
153
169
  switch (e.keyCode) {
154
170
  case KEY_CODE.ESC:
155
171
  e.preventDefault();
156
- view.hide();
172
+ view.hide(e);
157
173
  break;
158
174
  case KEY_CODE.UP:
159
175
  e.preventDefault();
@@ -183,7 +199,7 @@ App = (function() {
183
199
  return;
184
200
  }
185
201
  e.preventDefault();
186
- view.choose();
202
+ view.choose(e);
187
203
  break;
188
204
  default:
189
205
  $.noop();
@@ -274,7 +290,9 @@ Controller = (function() {
274
290
  Controller.prototype.catch_query = function() {
275
291
  var caret_pos, content, end, query, start, subtext;
276
292
  content = this.content();
277
- caret_pos = this.$inputor.caret('pos');
293
+ caret_pos = this.$inputor.caret('pos', {
294
+ iframe: this.app.iframe
295
+ });
278
296
  subtext = content.slice(0, caret_pos);
279
297
  query = this.callbacks("matcher").call(this, this.at, subtext, this.get_opt('start_with_space'));
280
298
  if (typeof query === "string" && query.length <= this.get_opt('max_len', 20)) {
@@ -296,9 +314,9 @@ Controller = (function() {
296
314
 
297
315
  Controller.prototype.rect = function() {
298
316
  var c, scale_bottom;
299
- if (!(c = this.$inputor.caret({
317
+ if (!(c = this.$inputor.caret('offset', this.pos - 1, {
300
318
  iframe: this.app.iframe
301
- }).caret('offset', this.pos - 1))) {
319
+ }))) {
302
320
  return;
303
321
  }
304
322
  if (this.$inputor.attr('contentEditable') === 'true') {
@@ -344,37 +362,32 @@ Controller = (function() {
344
362
  };
345
363
 
346
364
  Controller.prototype.insert = function(content, $li) {
347
- var $inputor, $insert_node, class_name, content_node, insert_node, pos, range, sel, source, start_str, text;
365
+ var $inputor, content_node, pos, range, sel, source, start_str, text, wrapped_content;
348
366
  $inputor = this.$inputor;
349
- if ($inputor.attr('contentEditable') === 'true') {
350
- class_name = "atwho-view-flag atwho-view-flag-" + (this.get_opt('alias') || this.at);
351
- content_node = "" + content + "<span contenteditable='false'>&nbsp;<span>";
352
- insert_node = "<span contenteditable='false' class='" + class_name + "'>" + content_node + "</span>";
353
- $insert_node = $(insert_node, this.app.document).data('atwho-data-item', $li.data('item-data'));
354
- if (this.app.document.selection) {
355
- $insert_node = $("<span contenteditable='true'></span>", this.app.document).html($insert_node);
356
- }
357
- }
367
+ wrapped_content = this.callbacks('inserting_wrapper').call(this, $inputor, content, this.get_opt("suffix"));
358
368
  if ($inputor.is('textarea, input')) {
359
- content = '' + content;
360
369
  source = $inputor.val();
361
370
  start_str = source.slice(0, Math.max(this.query.head_pos - this.at.length, 0));
362
- text = "" + start_str + content + " " + (source.slice(this.query['end_pos'] || 0));
371
+ text = "" + start_str + wrapped_content + (source.slice(this.query['end_pos'] || 0));
363
372
  $inputor.val(text);
364
- $inputor.caret('pos', start_str.length + content.length + 1);
373
+ $inputor.caret('pos', start_str.length + wrapped_content.length, {
374
+ iframe: this.app.iframe
375
+ });
365
376
  } else if (range = this.range) {
366
377
  pos = range.startOffset - (this.query.end_pos - this.query.head_pos) - this.at.length;
367
378
  range.setStart(range.endContainer, Math.max(pos, 0));
368
379
  range.setEnd(range.endContainer, range.endOffset);
369
380
  range.deleteContents();
370
- range.insertNode($insert_node[0]);
381
+ content_node = $(wrapped_content, this.app.document)[0];
382
+ range.insertNode(content_node);
383
+ range.setEndAfter(content_node);
371
384
  range.collapse(false);
372
385
  sel = this.app.window.getSelection();
373
386
  sel.removeAllRanges();
374
387
  sel.addRange(range);
375
388
  } else if (range = this.ie8_range) {
376
389
  range.moveStart('character', this.query.end_pos - this.query.head_pos - this.at.length);
377
- range.pasteHTML(content_node);
390
+ range.pasteHTML(wrapped_content);
378
391
  range.collapse(false);
379
392
  range.select();
380
393
  }
@@ -504,7 +517,7 @@ View = (function() {
504
517
  return $(e.currentTarget).addClass('cur');
505
518
  }).on('click', (function(_this) {
506
519
  return function(e) {
507
- _this.choose();
520
+ _this.choose(e);
508
521
  return e.preventDefault();
509
522
  };
510
523
  })(this));
@@ -514,13 +527,16 @@ View = (function() {
514
527
  return this.$el.is(":visible");
515
528
  };
516
529
 
517
- View.prototype.choose = function() {
530
+ View.prototype.choose = function(e) {
518
531
  var $li, content;
519
532
  if (($li = this.$el.find(".cur")).length) {
520
533
  content = this.context.insert_content_for($li);
521
534
  this.context.insert(this.context.callbacks("before_insert").call(this.context, content, $li), $li);
522
- this.context.trigger("inserted", [$li]);
523
- return this.hide();
535
+ this.context.trigger("inserted", [$li, e]);
536
+ this.hide(e);
537
+ }
538
+ if (this.context.get_opt("hide_without_suffix")) {
539
+ return this.stop_showing = true;
524
540
  }
525
541
  };
526
542
 
@@ -562,6 +578,10 @@ View = (function() {
562
578
 
563
579
  View.prototype.show = function() {
564
580
  var rect;
581
+ if (this.stop_showing) {
582
+ this.stop_showing = false;
583
+ return;
584
+ }
565
585
  this.context.mark_range();
566
586
  if (!this.visible()) {
567
587
  this.$el.show();
@@ -572,12 +592,15 @@ View = (function() {
572
592
  }
573
593
  };
574
594
 
575
- View.prototype.hide = function(time) {
595
+ View.prototype.hide = function(e, time) {
576
596
  var callback;
577
- if (isNaN(time && this.visible())) {
597
+ if (!this.visible()) {
598
+ return;
599
+ }
600
+ if (isNaN(time)) {
578
601
  this.context.reset_rect();
579
602
  this.$el.hide();
580
- return this.context.trigger('hidden');
603
+ return this.context.trigger('hidden', [e]);
581
604
  } else {
582
605
  callback = (function(_this) {
583
606
  return function() {
@@ -707,13 +730,32 @@ DEFAULT_CALLBACKS = {
707
730
  if (!query) {
708
731
  return li;
709
732
  }
710
- regexp = new RegExp(">\\s*(\\w*)(" + query.replace("+", "\\+") + ")(\\w*)\\s*<", 'ig');
733
+ regexp = new RegExp(">\\s*(\\w*?)(" + query.replace("+", "\\+") + ")(\\w*)\\s*<", 'ig');
711
734
  return li.replace(regexp, function(str, $1, $2, $3) {
712
735
  return '> ' + $1 + '<strong>' + $2 + '</strong>' + $3 + ' <';
713
736
  });
714
737
  },
715
738
  before_insert: function(value, $li) {
716
739
  return value;
740
+ },
741
+ inserting_wrapper: function($inputor, content, suffix) {
742
+ var new_suffix, wrapped_content;
743
+ new_suffix = suffix === "" ? suffix : suffix || " ";
744
+ if ($inputor.is('textarea, input')) {
745
+ return '' + content + new_suffix;
746
+ } else if ($inputor.attr('contentEditable') === 'true') {
747
+ new_suffix = suffix === "" ? suffix : suffix || "&nbsp;";
748
+ if (/firefox/i.test(navigator.userAgent)) {
749
+ wrapped_content = "<span>" + content + new_suffix + "</span>";
750
+ } else {
751
+ suffix = "<span contenteditable='false'>" + new_suffix + "<span>";
752
+ wrapped_content = "<span contenteditable='false'>" + content + suffix + "</span>";
753
+ }
754
+ if (this.app.document.selection) {
755
+ wrapped_content = "<span contenteditable='true'>" + content + "</span>";
756
+ }
757
+ return wrapped_content;
758
+ }
717
759
  }
718
760
  };
719
761
 
@@ -724,36 +766,9 @@ Api = {
724
766
  return c.model.load(data);
725
767
  }
726
768
  },
727
- getInsertedItemsWithIDs: function(at) {
728
- var c, ids, items;
729
- if (!(c = this.controller(at))) {
730
- return [null, null];
731
- }
732
- if (at) {
733
- at = "-" + (c.get_opt('alias') || c.at);
734
- }
735
- ids = [];
736
- items = $.map(this.$inputor.find("span.atwho-view-flag" + (at || "")), function(item) {
737
- var data;
738
- data = $(item).data('atwho-data-item');
739
- if (ids.indexOf(data.id) > -1) {
740
- return;
741
- }
742
- if (data.id) {
743
- ids.push = data.id;
744
- }
745
- return data;
746
- });
747
- return [ids, items];
748
- },
749
- getInsertedItems: function(at) {
750
- return Api.getInsertedItemsWithIDs.apply(this, [at])[1];
751
- },
752
- getInsertedIDs: function(at) {
753
- return Api.getInsertedItemsWithIDs.apply(this, [at])[0];
754
- },
755
769
  setIframe: function(iframe) {
756
- return this.setIframe(iframe);
770
+ this.setIframe(iframe);
771
+ return null;
757
772
  },
758
773
  run: function() {
759
774
  return this.dispatch();
@@ -764,18 +779,6 @@ Api = {
764
779
  }
765
780
  };
766
781
 
767
- Atwho = {
768
- init: function(options) {
769
- var $this, app;
770
- app = ($this = $(this)).data("atwho");
771
- if (!app) {
772
- $this.data('atwho', (app = new App(this)));
773
- }
774
- app.reg(options.at, options);
775
- return this;
776
- }
777
- };
778
-
779
782
  $CONTAINER = $("<div id='atwho-container'></div>");
780
783
 
781
784
  $.fn.atwho = function(method) {
@@ -784,13 +787,14 @@ $.fn.atwho = function(method) {
784
787
  $('body').append($CONTAINER);
785
788
  result = null;
786
789
  this.filter('textarea, input, [contenteditable=true]').each(function() {
787
- var app;
790
+ var $this, app;
791
+ if (!(app = ($this = $(this)).data("atwho"))) {
792
+ $this.data('atwho', (app = new App(this)));
793
+ }
788
794
  if (typeof method === 'object' || !method) {
789
- return Atwho.init.apply(this, _args);
790
- } else if (Api[method]) {
791
- if (app = $(this).data('atwho')) {
792
- return result = Api[method].apply(app, Array.prototype.slice.call(_args, 1));
793
- }
795
+ return app.reg(method.at, method);
796
+ } else if (Api[method] && app) {
797
+ return result = Api[method].apply(app, Array.prototype.slice.call(_args, 1));
794
798
  } else {
795
799
  return $.error("Method " + method + " does not exist on jQuery.caret");
796
800
  }
@@ -803,9 +807,11 @@ $.fn.atwho["default"] = {
803
807
  alias: void 0,
804
808
  data: null,
805
809
  tpl: "<li data-value='${atwho-at}${name}'>${name}</li>",
806
- insert_tpl: "<span>${atwho-data-value}</span>",
810
+ insert_tpl: "<span id='${id}'>${atwho-data-value}</span>",
807
811
  callbacks: DEFAULT_CALLBACKS,
808
812
  search_key: "name",
813
+ suffix: void 0,
814
+ hide_without_suffix: false,
809
815
  start_with_space: true,
810
816
  highlight_first: true,
811
817
  limit: 5,
@@ -24,7 +24,7 @@
24
24
  }
25
25
  })(function($) {
26
26
  "use strict";
27
- var EditableCaret, InputCaret, Mirror, Utils, configure, methods, oDocument, oFrame, oWindow, pluginName, setContextBy;
27
+ var EditableCaret, InputCaret, Mirror, Utils, discoveryIframeOf, methods, oDocument, oFrame, oWindow, pluginName, setContextBy;
28
28
  pluginName = 'caret';
29
29
  EditableCaret = (function() {
30
30
  function EditableCaret($inputor) {
@@ -204,7 +204,7 @@
204
204
  };
205
205
 
206
206
  InputCaret.prototype.getPosition = function(pos) {
207
- var $inputor, at_rect, format, html, mirror, start_range;
207
+ var $inputor, at_rect, end_range, format, html, mirror, start_range;
208
208
  $inputor = this.$inputor;
209
209
  format = function(value) {
210
210
  return value.replace(/</g, '&lt').replace(/>/g, '&gt').replace(/`/g, '&#96').replace(/"/g, '&quot').replace(/\r\n|\r|\n/g, "<br />");
@@ -213,8 +213,10 @@
213
213
  pos = this.getPos();
214
214
  }
215
215
  start_range = $inputor.val().slice(0, pos);
216
- html = "<span>" + format(start_range) + "</span>";
217
- html += "<span id='caret'>|</span>";
216
+ end_range = $inputor.val().slice(pos);
217
+ html = "<span style='position: relative; display: inline;'>" + format(start_range) + "</span>";
218
+ html += "<span id='caret' style='position: relative; display: inline;'>|</span>";
219
+ html += "<span style='position: relative; display: inline;'>" + format(end_range) + "</span>";
218
220
  mirror = new Mirror($inputor);
219
221
  return at_rect = mirror.create(html).rect();
220
222
  };
@@ -237,7 +239,7 @@
237
239
 
238
240
  })();
239
241
  Mirror = (function() {
240
- Mirror.prototype.css_attr = ["overflowY", "height", "width", "paddingTop", "paddingLeft", "paddingRight", "paddingBottom", "marginTop", "marginLeft", "marginRight", "marginBottom", "fontFamily", "borderStyle", "borderWidth", "wordWrap", "fontSize", "lineHeight", "overflowX", "text-align"];
242
+ Mirror.prototype.css_attr = ["borderBottomWidth", "borderLeftWidth", "borderRightWidth", "borderTopStyle", "borderRightStyle", "borderBottomStyle", "borderLeftStyle", "borderTopWidth", "boxSizing", "fontFamily", "fontSize", "fontWeight", "height", "letterSpacing", "lineHeight", "marginBottom", "marginLeft", "marginRight", "marginTop", "outlineWidth", "overflow", "overflowX", "overflowY", "paddingBottom", "paddingLeft", "paddingRight", "paddingTop", "textAlign", "textOverflow", "textTransform", "whiteSpace", "wordBreak", "wordWrap"];
241
243
 
242
244
  function Mirror($inputor) {
243
245
  this.$inputor = $inputor;
@@ -250,9 +252,11 @@
250
252
  position: 'absolute',
251
253
  left: -9999,
252
254
  top: 0,
253
- zIndex: -20000,
254
- 'white-space': 'pre-wrap'
255
+ zIndex: -20000
255
256
  };
257
+ if (this.$inputor.prop('tagName') === 'TEXTAREA') {
258
+ this.css_attr.push('width');
259
+ }
256
260
  $.each(this.css_attr, function(i, p) {
257
261
  return css[p] = _this.$inputor.css(p);
258
262
  });
@@ -317,37 +321,39 @@
317
321
  oDocument = null;
318
322
  oWindow = null;
319
323
  oFrame = null;
320
- setContextBy = function(iframe) {
321
- oFrame = iframe;
322
- oWindow = iframe.contentWindow;
323
- return oDocument = iframe.contentDocument || oWindow.document;
324
- };
325
- configure = function($dom, settings) {
326
- var error, iframe;
327
- if ($.isPlainObject(settings) && (iframe = settings.iframe)) {
328
- $dom.data('caret-iframe', iframe);
329
- return setContextBy(iframe);
330
- } else if (iframe = $dom.data('caret-iframe')) {
331
- return setContextBy(iframe);
324
+ setContextBy = function(settings) {
325
+ var iframe;
326
+ if (iframe = settings != null ? settings.iframe : void 0) {
327
+ oFrame = iframe;
328
+ oWindow = iframe.contentWindow;
329
+ return oDocument = iframe.contentDocument || oWindow.document;
332
330
  } else {
333
- oDocument = $dom[0].ownerDocument;
334
- oWindow = oDocument.defaultView || oDocument.parentWindow;
335
- try {
336
- return oFrame = oWindow.frameElement;
337
- } catch (_error) {
338
- error = _error;
339
- }
331
+ oFrame = void 0;
332
+ oWindow = window;
333
+ return oDocument = document;
334
+ }
335
+ };
336
+ discoveryIframeOf = function($dom) {
337
+ var error;
338
+ oDocument = $dom[0].ownerDocument;
339
+ oWindow = oDocument.defaultView || oDocument.parentWindow;
340
+ try {
341
+ return oFrame = oWindow.frameElement;
342
+ } catch (_error) {
343
+ error = _error;
340
344
  }
341
345
  };
342
- $.fn.caret = function(method) {
346
+ $.fn.caret = function(method, value, settings) {
343
347
  var caret;
344
- if (typeof method === 'object') {
345
- configure(this, method);
346
- return this;
347
- } else if (methods[method]) {
348
- configure(this);
348
+ if (methods[method]) {
349
+ if ($.isPlainObject(value)) {
350
+ setContextBy(value);
351
+ value = void 0;
352
+ } else {
353
+ setContextBy(settings);
354
+ }
349
355
  caret = Utils.contentEditable(this) ? new EditableCaret(this) : new InputCaret(this);
350
- return methods[method].apply(caret, Array.prototype.slice.call(arguments, 1));
356
+ return methods[method].apply(caret, [value]);
351
357
  } else {
352
358
  return $.error("Method " + method + " does not exist on jQuery.caret");
353
359
  }
@@ -9,7 +9,7 @@
9
9
  border-radius: 3px;
10
10
  box-shadow: 0 0 5px rgba(0,0,0,0.1);
11
11
  min-width: 120px;
12
- z-index: 10;
12
+ z-index: 11110 !important;
13
13
  }
14
14
 
15
15
  .atwho-view .cur {
@@ -12,7 +12,8 @@ if ::Rails.version < "3.1" || !::Rails.application.config.assets.enabled
12
12
 
13
13
  def copy_js
14
14
  say_status("copying js", " jquery.atwho.js (#{Jquery::Atwho::Rails::VERSION})", :green)
15
- copy_file "javascripts/jquery.atwho.js", "public/javascripts/jquery.atwho.js"
15
+ copy_file "javascripts/jquery.atwho/jquery.caret.js", "public/javascripts/jquery.atwho/jquery.caret.js"
16
+ copy_file "javascripts/jquery.atwho/jquery.atwho.js", "public/javascripts/jquery.atwho/jquery.atwho.js"
16
17
  #copy_file "javascripts/jquery.atwho.min.js", "public/javascripts/jquery.atwho.min.js"
17
18
  end
18
19
 
@@ -1,7 +1,7 @@
1
1
  module Jquery
2
2
  module Atwho
3
3
  module Rails
4
- VERSION = "0.4.11"
4
+ VERSION = "0.5.0"
5
5
  end
6
6
  end
7
7
  end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe Atwho::Generators::InstallGenerator do
4
4
  include GeneratorSpec::TestCase
5
-
5
+
6
6
  destination File.expand_path("../../../tmp/", __FILE__)
7
7
  before(:all) do
8
8
  prepare_destination
@@ -10,13 +10,9 @@ describe Atwho::Generators::InstallGenerator do
10
10
  end
11
11
 
12
12
  it "generate assets files" do
13
- js_prefix = "public/javascripts"
14
- css_prefix = "public/stylesheets"
15
-
16
- assert_file "#{js_prefix}/jquery.atwho.js"
17
- #assert_file "#{js_prefix}/jquery.atwho.min.js"
18
-
19
- assert_file "#{css_prefix}/jquery.atwho.css"
20
- #assert_file "#{css_prefix}/jquery.atwho.min.css"
13
+ if ::Rails.version < "3.1"
14
+ assert_file "public/javascripts/jquery.atwho/jquery.atwho.js"
15
+ assert_file "public/stylesheets/jquery.atwho.css"
16
+ end
21
17
  end
22
18
  end
data/spec/spec_helper.rb CHANGED
@@ -19,5 +19,5 @@ Rails.application.config.root = Rails.root
19
19
  #Rails::Generators.configure!
20
20
 
21
21
  #Rails.application.config.assets.enabled = true
22
+ require "generator_spec"
22
23
  require 'generators/atwho/install_generator'
23
- require 'generator_spec/test_case'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jquery-atwho-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.11
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ichord
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-23 00:00:00.000000000 Z
11
+ date: 2014-08-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -48,11 +48,14 @@ extensions: []
48
48
  extra_rdoc_files: []
49
49
  files:
50
50
  - .gitignore
51
+ - Appraisals
51
52
  - Gemfile
52
53
  - LICENSE-MIT
53
54
  - README.md
54
55
  - Rakefile
55
56
  - changelog.md
57
+ - gemfiles/rails30.gemfile
58
+ - gemfiles/rails30.gemfile.lock
56
59
  - jquery-atwho-rails.gemspec
57
60
  - lib/assets/javascripts/jquery.atwho/index.js
58
61
  - lib/assets/javascripts/jquery.atwho/jquery.atwho.js