jquery-atwho-rails 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,4 @@
1
+ // Generated by CoffeeScript 1.3.3
1
2
 
2
3
  /*
3
4
  Implement Twitter/Weibo @ mentions
@@ -24,132 +25,9 @@
24
25
  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
26
  */
26
27
 
27
- /*
28
- 本插件操作 textarea 或者 input 内的插入符
29
- 只实现了获得插入符在文本框中的位置,我设置
30
- 插入符的位置.
31
- */
32
28
 
33
29
  (function() {
34
30
 
35
- (function($) {
36
- var getCaretPos, setCaretPos;
37
- getCaretPos = function(inputor) {
38
- var end, endRange, len, normalizedValue, pos, range, start, textInputRange;
39
- if (document.selection) {
40
- /*
41
- #assume we select "HATE" in the inputor such as textarea -> { }.
42
- * start end-point.
43
- * /
44
- * < I really [HATE] IE > between the brackets is the selection range.
45
- * \
46
- * end end-point.
47
- */
48
- range = document.selection.createRange();
49
- pos = 0;
50
- if (range && range.parentElement() === inputor) {
51
- normalizedValue = inputor.value.replace(/\r\n/g, "\n");
52
- /* SOMETIME !!!
53
- "/r/n" is counted as two char.
54
- one line is two, two will be four. balalala.
55
- so we have to using the normalized one's length.;
56
- */
57
- len = normalizedValue.length;
58
- /*
59
- <[ I really HATE IE ]>:
60
- the whole content in the inputor will be the textInputRange.
61
- */
62
- textInputRange = inputor.createTextRange();
63
- /* _here must be the position of bookmark.
64
- /
65
- <[ I really [HATE] IE ]>
66
- [---------->[ ] : this is what moveToBookmark do.
67
- < I really [[HATE] IE ]> : here is result.
68
- \ two brackets in should be in line.
69
- */
70
- textInputRange.moveToBookmark(range.getBookmark());
71
- endRange = inputor.createTextRange();
72
- /* [--------------------->[] : if set false all end-point goto end.
73
- < I really [[HATE] IE []]>
74
- */
75
- endRange.collapse(false);
76
- /*
77
- ___VS____
78
- / \
79
- < I really [[HATE] IE []]>
80
- \_endRange end-point.
81
-
82
- " > -1" mean the start end-point will be the same or right to the end end-point
83
- * simplelly, all in the end.
84
- */
85
- if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
86
- start = end = len;
87
- } else {
88
- /*
89
- I really |HATE] IE ]>
90
- <-|
91
- I really[ [HATE] IE ]>
92
- <-[
93
- I reall[y [HATE] IE ]>
94
-
95
- will return how many unit have moved.
96
- */
97
- start = -textInputRange.moveStart("character", -len);
98
- end = -textInputRange.moveEnd("character", -len);
99
- }
100
- }
101
- } else {
102
- start = inputor.selectionStart;
103
- }
104
- return start;
105
- };
106
- setCaretPos = function(inputor, pos) {
107
- var range;
108
- if (document.selection) {
109
- range = inputor.createTextRange();
110
- range.move("character", pos);
111
- return range.select();
112
- } else {
113
- return inputor.setSelectionRange(pos, pos);
114
- }
115
- };
116
- return $.fn.caretPos = function(pos) {
117
- var inputor;
118
- inputor = this[0];
119
- inputor.focus();
120
- if (pos) {
121
- return setCaretPos(inputor, pos);
122
- } else {
123
- return getCaretPos(inputor);
124
- }
125
- };
126
- })(window.jQuery);
127
-
128
- /*
129
- Implement Twitter/Weibo @ mentions
130
-
131
- Copyright (c) 2012 chord.luo@gmail.com
132
-
133
- Permission is hereby granted, free of charge, to any person obtaining
134
- a copy of this software and associated documentation files (the
135
- "Software"), to deal in the Software without restriction, including
136
- without limitation the rights to use, copy, modify, merge, publish,
137
- distribute, sublicense, and/or sell copies of the Software, and to
138
- permit persons to whom the Software is furnished to do so, subject to
139
- the following conditions:
140
-
141
- The above copyright notice and this permission notice shall be
142
- included in all copies or substantial portions of the Software.
143
-
144
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
145
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
146
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
147
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
148
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
149
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
150
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
151
- */
152
-
153
31
  (function($) {
154
32
  var At, AtView, Mirror, log, _DEFAULT_TPL, _evalTpl, _highlighter, _isNil, _objectify, _sorter, _unique;
155
33
  Mirror = {
@@ -211,7 +89,9 @@
211
89
  var lookup, stop;
212
90
  stop = e.keyCode === 40 || e.keyCode === 38;
213
91
  lookup = !(stop && _this.view.isShowing());
214
- if (lookup) return _this.lookup();
92
+ if (lookup) {
93
+ return _this.lookup();
94
+ }
215
95
  }).on("mouseup.inputor", function(e) {
216
96
  return _this.lookup();
217
97
  });
@@ -223,7 +103,9 @@
223
103
  constructor: At,
224
104
  init: function() {
225
105
  var _this = this;
226
- this.$inputor.on('keydown.inputor', function(e) {
106
+ this.$inputor.on('keyup.inputor', function(e) {
107
+ return _this.onkeyup(e);
108
+ }).on('keydown.inputor', function(e) {
227
109
  return _this.onkeydown(e);
228
110
  }).on('scroll.inputor', function(e) {
229
111
  return _this.view.hide();
@@ -247,7 +129,9 @@
247
129
  dataValue: function() {
248
130
  var match, search_word;
249
131
  search_word = this.search_word[this.theflag];
250
- if (search_word) return search_word;
132
+ if (search_word) {
133
+ return search_word;
134
+ }
251
135
  match = /data-value=["']?\$\{(\w+)\}/g.exec(this.getOpt('tpl'));
252
136
  return this.search_word[this.theflag] = !_isNil(match) ? match[1] : null;
253
137
  },
@@ -278,6 +162,7 @@
278
162
  /* 克隆完inputor后将原来的文本内容根据
279
163
  @的位置进行分块,以获取@块在inputor(输入框)里的position
280
164
  */
165
+
281
166
  start_range = $inputor.val().slice(0, this.pos - 1);
282
167
  html = "<span>" + format(start_range) + "</span>";
283
168
  html += "<span id='flag'>@</span>";
@@ -287,6 +172,7 @@
287
172
  就得到了@相对于document的offset.
288
173
  当然,还要加上行高和滚动条的偏移量.
289
174
  */
175
+
290
176
  offset = $inputor.offset();
291
177
  at_rect = this.mirror.init($inputor).setContent(html).getFlagRect();
292
178
  x = offset.left + at_rect.left - $inputor.scrollLeft();
@@ -302,7 +188,9 @@
302
188
  cache: function(value) {
303
189
  var key, _base;
304
190
  key = this.query.text;
305
- if (!this.getOpt("cache") || !key) return null;
191
+ if (!this.getOpt("cache") || !key) {
192
+ return null;
193
+ }
306
194
  return (_base = this._cache)[key] || (_base[key] = value);
307
195
  },
308
196
  getKeyname: function() {
@@ -314,6 +202,7 @@
314
202
  /* 向在插入符前的的文本进行正则匹配
315
203
  * 考虑会有多个 @ 的存在, 匹配离插入符最近的一个
316
204
  */
205
+
317
206
  subtext = text.slice(0, caret_pos);
318
207
  matched = null;
319
208
  $.each(this.options, function(flag) {
@@ -321,7 +210,7 @@
321
210
  regexp = new RegExp(flag + '([A-Za-z0-9_\+\-]*)$|' + flag + '([^\\x00-\\xff]*)$', 'gi');
322
211
  match = regexp.exec(subtext);
323
212
  if (!_isNil(match)) {
324
- matched = match[1] === void 0 ? match[2] : match[1];
213
+ matched = match[2] ? match[2] : match[1];
325
214
  _this.theflag = flag;
326
215
  return false;
327
216
  }
@@ -342,22 +231,45 @@
342
231
  return this.query = key;
343
232
  },
344
233
  replaceStr: function(str) {
345
- var $inputor, key, source, start_str, text;
234
+ var $inputor, flag_len, key, source, start_str, text;
346
235
  $inputor = this.$inputor;
347
236
  key = this.query;
348
237
  source = $inputor.val();
349
- start_str = source.slice(0, key.start);
238
+ flag_len = this.getOpt("display_flag") ? 0 : this.theflag.length;
239
+ start_str = source.slice(0, key.start - flag_len);
350
240
  text = start_str + str + source.slice(key.end);
351
241
  $inputor.val(text);
352
242
  $inputor.caretPos(start_str.length + str.length);
353
243
  $inputor.change();
354
244
  return log("At.replaceStr", text);
355
245
  },
246
+ onkeyup: function(e) {
247
+ var view;
248
+ view = this.view;
249
+ if (!view.isShowing()) {
250
+ return;
251
+ }
252
+ switch (e.keyCode) {
253
+ case 27:
254
+ e.preventDefault();
255
+ view.hide();
256
+ break;
257
+ default:
258
+ $.noop();
259
+ }
260
+ return e.stopPropagation();
261
+ },
356
262
  onkeydown: function(e) {
357
263
  var view;
358
264
  view = this.view;
359
- if (!view.isShowing()) return;
265
+ if (!view.isShowing()) {
266
+ return;
267
+ }
360
268
  switch (e.keyCode) {
269
+ case 27:
270
+ e.preventDefault();
271
+ view.hide();
272
+ break;
361
273
  case 38:
362
274
  e.preventDefault();
363
275
  view.prev();
@@ -368,7 +280,9 @@
368
280
  break;
369
281
  case 9:
370
282
  case 13:
371
- if (!view.isShowing()) return;
283
+ if (!view.isShowing()) {
284
+ return;
285
+ }
372
286
  e.preventDefault();
373
287
  view.choose();
374
288
  break;
@@ -388,7 +302,9 @@
388
302
  lookup: function() {
389
303
  var callback, datas, key;
390
304
  key = this.getKeyname();
391
- if (!key) return false;
305
+ if (!key) {
306
+ return false;
307
+ }
392
308
  log("At.lookup.key", key);
393
309
  if (!_isNil(datas = this.cache())) {
394
310
  this.renderView(datas);
@@ -438,7 +354,9 @@
438
354
  init: function() {
439
355
  var $menu, tpl,
440
356
  _this = this;
441
- if (!_isNil(this.jqo())) return;
357
+ if (!_isNil(this.jqo())) {
358
+ return;
359
+ }
442
360
  tpl = "<div id='" + this.id.slice(1) + "' class='at-view'><ul id='" + this.id.slice(1) + "-ul'></ul></div>";
443
361
  $("body").append(tpl);
444
362
  $menu = this.jqo().find('ul');
@@ -480,25 +398,33 @@
480
398
  var cur, next;
481
399
  cur = this.jqo().find('.cur').removeClass('cur');
482
400
  next = cur.next();
483
- if (!next.length) next = $(this.jqo().find('li')[0]);
401
+ if (!next.length) {
402
+ next = $(this.jqo().find('li')[0]);
403
+ }
484
404
  return next.addClass('cur');
485
405
  },
486
406
  prev: function() {
487
407
  var cur, prev;
488
408
  cur = this.jqo().find('.cur').removeClass('cur');
489
409
  prev = cur.prev();
490
- if (!prev.length) prev = this.jqo().find('li').last();
410
+ if (!prev.length) {
411
+ prev = this.jqo().find('li').last();
412
+ }
491
413
  return prev.addClass('cur');
492
414
  },
493
415
  show: function() {
494
- if (!this.isShowing()) this.jqo().show();
416
+ if (!this.isShowing()) {
417
+ this.jqo().show();
418
+ }
495
419
  return this.rePosition();
496
420
  },
497
421
  hide: function(time) {
498
422
  var callback,
499
423
  _this = this;
500
424
  if (isNaN(time)) {
501
- if (this.isShowing()) return this.jqo().hide();
425
+ if (this.isShowing()) {
426
+ return this.jqo().hide();
427
+ }
502
428
  } else {
503
429
  callback = function() {
504
430
  return _this.hide();
@@ -508,12 +434,16 @@
508
434
  }
509
435
  },
510
436
  clear: function(clear_all) {
511
- if (clear_all === true) this._cache = {};
437
+ if (clear_all === true) {
438
+ this._cache = {};
439
+ }
512
440
  return this.jqo().find('ul').empty();
513
441
  },
514
442
  render: function(holder, list) {
515
443
  var $ul, tpl;
516
- if (!$.isArray(list)) return false;
444
+ if (!$.isArray(list)) {
445
+ return false;
446
+ }
517
447
  if (list.length <= 0) {
518
448
  this.hide();
519
449
  return true;
@@ -556,7 +486,9 @@
556
486
  }
557
487
  };
558
488
  _highlighter = function(li, query) {
559
- if (_isNil(query)) return li;
489
+ if (_isNil(query)) {
490
+ return li;
491
+ }
560
492
  return li.replace(new RegExp(">\\s*(\\w*)(" + query.replace("+", "\\+") + ")(\\w*)\\s*<", 'ig'), function(str, $1, $2, $3) {
561
493
  return '> ' + $1 + '<strong>' + $2 + '</strong>' + $3 + ' <';
562
494
  });
@@ -569,7 +501,9 @@
569
501
  for (_i = 0, _len = items.length; _i < _len; _i++) {
570
502
  item = items[_i];
571
503
  text = item[data_value];
572
- if (text.toLowerCase().indexOf(query) === -1) continue;
504
+ if (text.toLowerCase().indexOf(query) === -1) {
505
+ continue;
506
+ }
573
507
  item.order = text.toLowerCase().indexOf(query);
574
508
  results.push(item);
575
509
  }
@@ -584,6 +518,7 @@
584
518
  I think we should not change DOM element frequently.
585
519
  more, It seems batter not to call evalTpl function too much times.
586
520
  */
521
+
587
522
  _unique = function(list, query) {
588
523
  var record;
589
524
  record = [];
@@ -607,7 +542,9 @@
607
542
  var $this, data;
608
543
  $this = $(this);
609
544
  data = $this.data("AtWho");
610
- if (!data) $this.data('AtWho', (data = new At(this)));
545
+ if (!data) {
546
+ $this.data('AtWho', (data = new At(this)));
547
+ }
611
548
  return data.reg(flag, options);
612
549
  });
613
550
  };
@@ -617,8 +554,142 @@
617
554
  callback: null,
618
555
  cache: true,
619
556
  limit: 5,
557
+ display_flag: true,
620
558
  tpl: _DEFAULT_TPL
621
559
  };
622
560
  })(window.jQuery);
623
561
 
562
+ /*
563
+ Implement Twitter/Weibo @ mentions
564
+
565
+ Copyright (c) 2012 chord.luo@gmail.com
566
+
567
+ Permission is hereby granted, free of charge, to any person obtaining
568
+ a copy of this software and associated documentation files (the
569
+ "Software"), to deal in the Software without restriction, including
570
+ without limitation the rights to use, copy, modify, merge, publish,
571
+ distribute, sublicense, and/or sell copies of the Software, and to
572
+ permit persons to whom the Software is furnished to do so, subject to
573
+ the following conditions:
574
+
575
+ The above copyright notice and this permission notice shall be
576
+ included in all copies or substantial portions of the Software.
577
+
578
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
579
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
580
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
581
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
582
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
583
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
584
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
585
+ */
586
+
587
+
588
+ /*
589
+ 本插件操作 textarea 或者 input 内的插入符
590
+ 只实现了获得插入符在文本框中的位置,我设置
591
+ 插入符的位置.
592
+ */
593
+
594
+
595
+ (function($) {
596
+ var getCaretPos, setCaretPos;
597
+ getCaretPos = function(inputor) {
598
+ var end, endRange, len, normalizedValue, pos, range, start, textInputRange;
599
+ if (document.selection) {
600
+ /*
601
+ #assume we select "HATE" in the inputor such as textarea -> { }.
602
+ * start end-point.
603
+ * /
604
+ * < I really [HATE] IE > between the brackets is the selection range.
605
+ * \
606
+ * end end-point.
607
+ */
608
+
609
+ range = document.selection.createRange();
610
+ pos = 0;
611
+ if (range && range.parentElement() === inputor) {
612
+ normalizedValue = inputor.value.replace(/\r\n/g, "\n");
613
+ /* SOMETIME !!!
614
+ "/r/n" is counted as two char.
615
+ one line is two, two will be four. balalala.
616
+ so we have to using the normalized one's length.;
617
+ */
618
+
619
+ len = normalizedValue.length;
620
+ /*
621
+ <[ I really HATE IE ]>:
622
+ the whole content in the inputor will be the textInputRange.
623
+ */
624
+
625
+ textInputRange = inputor.createTextRange();
626
+ /* _here must be the position of bookmark.
627
+ /
628
+ <[ I really [HATE] IE ]>
629
+ [---------->[ ] : this is what moveToBookmark do.
630
+ < I really [[HATE] IE ]> : here is result.
631
+ \ two brackets in should be in line.
632
+ */
633
+
634
+ textInputRange.moveToBookmark(range.getBookmark());
635
+ endRange = inputor.createTextRange();
636
+ /* [--------------------->[] : if set false all end-point goto end.
637
+ < I really [[HATE] IE []]>
638
+ */
639
+
640
+ endRange.collapse(false);
641
+ /*
642
+ ___VS____
643
+ / \
644
+ < I really [[HATE] IE []]>
645
+ \_endRange end-point.
646
+
647
+ " > -1" mean the start end-point will be the same or right to the end end-point
648
+ * simplelly, all in the end.
649
+ */
650
+
651
+ if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
652
+ start = end = len;
653
+ } else {
654
+ /*
655
+ I really |HATE] IE ]>
656
+ <-|
657
+ I really[ [HATE] IE ]>
658
+ <-[
659
+ I reall[y [HATE] IE ]>
660
+
661
+ will return how many unit have moved.
662
+ */
663
+
664
+ start = -textInputRange.moveStart("character", -len);
665
+ end = -textInputRange.moveEnd("character", -len);
666
+ }
667
+ }
668
+ } else {
669
+ start = inputor.selectionStart;
670
+ }
671
+ return start;
672
+ };
673
+ setCaretPos = function(inputor, pos) {
674
+ var range;
675
+ if (document.selection) {
676
+ range = inputor.createTextRange();
677
+ range.move("character", pos);
678
+ return range.select();
679
+ } else {
680
+ return inputor.setSelectionRange(pos, pos);
681
+ }
682
+ };
683
+ return $.fn.caretPos = function(pos) {
684
+ var inputor;
685
+ inputor = this[0];
686
+ inputor.focus();
687
+ if (pos) {
688
+ return setCaretPos(inputor, pos);
689
+ } else {
690
+ return getCaretPos(inputor);
691
+ }
692
+ };
693
+ })(window.jQuery);
694
+
624
695
  }).call(this);
@@ -1,7 +1,7 @@
1
1
  module Jquery
2
2
  module Atwho
3
3
  module Rails
4
- VERSION = "0.1.6"
4
+ VERSION = "0.1.7"
5
5
  end
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jquery-atwho-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-01 00:00:00.000000000 Z
12
+ date: 2012-12-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -84,10 +84,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
84
  version: '0'
85
85
  requirements: []
86
86
  rubyforge_project: jquery-atwho-rails
87
- rubygems_version: 1.8.19
87
+ rubygems_version: 1.8.24
88
88
  signing_key:
89
89
  specification_version: 3
90
90
  summary: ! 'jquery plugin: @mentions'
91
91
  test_files:
92
92
  - spec/generators/install_generator_spec.rb
93
93
  - spec/spec_helper.rb
94
+ has_rdoc: