jquery-selection-rails 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md ADDED
@@ -0,0 +1,17 @@
1
+ # jQuery Selectin for Rails
2
+
3
+ ## Installing Gem
4
+
5
+ gem "jquery-selection-rails"
6
+
7
+ ## Using the javascripts
8
+
9
+ Require jquery-selection in your app/assets/application.js file.
10
+
11
+ //= require jquery-selection
12
+
13
+ ## Thanks
14
+ Thanks to [IWASAKI Koji](https://github.com/madapaja) for writing an awesome selection plugin.
15
+
16
+ ## License
17
+ Copyright (c) 2012 Masahiro Saito
data/Rakefile ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env rake
2
+ require 'bundler'
3
+ Bundler::GemHelper.install_tasks
4
+
5
+ desc "Bundle the gem"
6
+ task :bundle do
7
+ sh('bundle install')
8
+ sh 'gem build *.gemspec'
9
+ sh 'gem install *.gem'
10
+ sh 'rm *.gem'
11
+ end
12
+
13
+ task(:default).clear
14
+ task :default => :bundle
15
+
@@ -0,0 +1,8 @@
1
+ module JQuery
2
+ module Selection
3
+ module Rails
4
+ require 'jquery/selection/rails/engine' if defined?(Rails)
5
+ end
6
+ end
7
+ end
8
+ require 'jquery/selection/rails/upload' if defined?(Rails)
@@ -0,0 +1,8 @@
1
+ module JQuery
2
+ module Selection
3
+ module Rails
4
+ class Engine < ::Rails::Engine
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,2 @@
1
+ require "jquery/selection/rails/engine"
2
+ require "jquery/selection/rails/version"
@@ -0,0 +1,7 @@
1
+ module JQuery
2
+ module Selection
3
+ module Rails
4
+ VERSION = "0.0.1"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,360 @@
1
+ /*!
2
+ * jQuery.selection - jQuery Plugin
3
+ *
4
+ * Copyright (c) 2010-2012 IWASAKI Koji (@madapaja).
5
+ * http://blog.madapaja.net/
6
+ * Under The MIT License
7
+ *
8
+ * Permission is hereby granted, free of charge, to any person obtaining
9
+ * a copy of this software and associated documentation files (the
10
+ * "Software"), to deal in the Software without restriction, including
11
+ * without limitation the rights to use, copy, modify, merge, publish,
12
+ * distribute, sublicense, and/or sell copies of the Software, and to
13
+ * permit persons to whom the Software is furnished to do so, subject to
14
+ * the following conditions:
15
+ *
16
+ * The above copyright notice and this permission notice shall be
17
+ * included in all copies or substantial portions of the Software.
18
+ *
19
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
23
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
24
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
25
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26
+ */
27
+ (function($, win, doc) {
28
+ /**
29
+ * 要素の文字列選択状態を取得します
30
+ *
31
+ * @param {Element} element 対象要素
32
+ * @return {Object} return
33
+ * @return {String} return.text 選択されている文字列
34
+ * @return {Integer} return.start 選択開始位置
35
+ * @return {Integer} return.end 選択終了位置
36
+ */
37
+ var _getCaretInfo = function(element){
38
+ var res = {
39
+ text: '',
40
+ start: 0,
41
+ end: 0
42
+ };
43
+
44
+ if (!element.value) {
45
+ /* 値がない、もしくは空文字列 */
46
+ return res;
47
+ }
48
+
49
+ try {
50
+ if (win.getSelection) {
51
+ /* IE 以外 */
52
+ res.start = element.selectionStart;
53
+ res.end = element.selectionEnd;
54
+ res.text = element.value.slice(res.start, res.end);
55
+ } else if (doc.selection) {
56
+ /* for IE */
57
+ element.focus();
58
+
59
+ var range = doc.selection.createRange(),
60
+ range2 = doc.body.createTextRange(),
61
+ tmpLength;
62
+
63
+ res.text = range.text;
64
+
65
+ try {
66
+ range2.moveToElementText(element);
67
+ range2.setEndPoint('StartToStart', range);
68
+ } catch (e) {
69
+ range2 = element.createTextRange();
70
+ range2.setEndPoint('StartToStart', range);
71
+ }
72
+
73
+ res.start = element.value.length - range2.text.length;
74
+ res.end = res.start + range.text.length;
75
+ }
76
+ } catch (e) {
77
+ /* あきらめる */
78
+ }
79
+
80
+ return res;
81
+ };
82
+
83
+ /**
84
+ * 要素に対するキャレット操作
85
+ * @type {Object}
86
+ */
87
+ var _CaretOperation = {
88
+ /**
89
+ * 要素のキャレット位置を取得します
90
+ *
91
+ * @param {Element} element 対象要素
92
+ * @return {Object} return
93
+ * @return {Integer} return.start 選択開始位置
94
+ * @return {Integer} return.end 選択終了位置
95
+ */
96
+ getPos: function(element) {
97
+ var tmp = _getCaretInfo(element);
98
+ return {start: tmp.start, end: tmp.end};
99
+ },
100
+
101
+ /**
102
+ * 要素のキャレット位置を設定します
103
+ *
104
+ * @param {Element} element 対象要素
105
+ * @param {Object} toRange 設定するキャレット位置
106
+ * @param {Integer} toRange.start 選択開始位置
107
+ * @param {Integer} toRange.end 選択終了位置
108
+ * @param {String} caret キャレットモード "keep" | "start" | "end" のいずれか
109
+ */
110
+ setPos: function(element, toRange, caret) {
111
+ caret = this._caretMode(caret);
112
+
113
+ if (caret == 'start') {
114
+ toRange.end = toRange.start;
115
+ } else if (caret == 'end') {
116
+ toRange.start = toRange.end;
117
+ }
118
+
119
+ element.focus();
120
+ try {
121
+ if (element.createTextRange) {
122
+ var range = element.createTextRange();
123
+
124
+ if (win.navigator.userAgent.toLowerCase().indexOf("msie") >= 0) {
125
+ toRange.start = element.value.substr(0, toRange.start).replace(/\r/g, '').length;
126
+ toRange.end = element.value.substr(0, toRange.end).replace(/\r/g, '').length;
127
+ }
128
+
129
+ range.collapse(true);
130
+ range.moveStart('character', toRange.start);
131
+ range.moveEnd('character', toRange.end - toRange.start);
132
+
133
+ range.select();
134
+ } else if (element.setSelectionRange) {
135
+ element.setSelectionRange(toRange.start, toRange.end);
136
+ }
137
+ } catch (e) {
138
+ /* あきらめる */
139
+ }
140
+ },
141
+
142
+ /**
143
+ * 要素内の選択文字列を取得します
144
+ *
145
+ * @param {Element} element 対象要素
146
+ * @return {String} return 選択文字列
147
+ */
148
+ getText: function(element) {
149
+ return _getCaretInfo(element).text;
150
+ },
151
+
152
+ /**
153
+ * キャレットモードを選択します
154
+ *
155
+ * @param {String} caret キャレットモード
156
+ * @return {String} return "keep" | "start" | "end" のいずれか
157
+ */
158
+ _caretMode: function(caret) {
159
+ caret = caret || "keep";
160
+ if (caret == false) {
161
+ caret = 'end';
162
+ }
163
+
164
+ switch (caret) {
165
+ case 'keep':
166
+ case 'start':
167
+ case 'end':
168
+ break;
169
+
170
+ default:
171
+ caret = 'keep';
172
+ }
173
+
174
+ return caret;
175
+ },
176
+
177
+ /**
178
+ * 選択文字列を置き換えます
179
+ *
180
+ * @param {Element} element 対象要素
181
+ * @param {String} text 置き換える文字列
182
+ * @param {String} caret キャレットモード "keep" | "start" | "end" のいずれか
183
+ */
184
+ replace: function(element, text, caret) {
185
+ var tmp = _getCaretInfo(element),
186
+ orig = element.value,
187
+ pos = $(element).scrollTop(),
188
+ range = {start: tmp.start, end: tmp.start + text.length};
189
+
190
+ element.value = orig.substr(0, tmp.start) + text + orig.substr(tmp.end);
191
+
192
+ $(element).scrollTop(pos);
193
+ this.setPos(element, range, caret);
194
+ },
195
+
196
+ /**
197
+ * 文字列を選択文字列の前に挿入します
198
+ *
199
+ * @param {Element} element 対象要素
200
+ * @param {String} text 挿入文字列
201
+ * @param {String} caret キャレットモード "keep" | "start" | "end" のいずれか
202
+ */
203
+ insertBefore: function(element, text, caret) {
204
+ var tmp = _getCaretInfo(element),
205
+ orig = element.value,
206
+ pos = $(element).scrollTop(),
207
+ range = {start: tmp.start + text.length, end: tmp.end + text.length};
208
+
209
+ element.value = orig.substr(0, tmp.start) + text + orig.substr(tmp.start);
210
+
211
+ $(element).scrollTop(pos);
212
+ this.setPos(element, range, caret);
213
+ },
214
+
215
+ /**
216
+ * 文字列を選択文字列の後に挿入します
217
+ *
218
+ * @param {Element} element 対象要素
219
+ * @param {String} text 挿入文字列
220
+ * @param {String} caret キャレットモード "keep" | "start" | "end" のいずれか
221
+ */
222
+ insertAfter: function(element, text, caret) {
223
+ var tmp = _getCaretInfo(element),
224
+ orig = element.value,
225
+ pos = $(element).scrollTop(),
226
+ range = {start: tmp.start, end: tmp.end};
227
+
228
+ element.value = orig.substr(0, tmp.end) + text + orig.substr(tmp.end);
229
+
230
+ $(element).scrollTop(pos);
231
+ this.setPos(element, range, caret);
232
+ }
233
+ };
234
+
235
+ /* jQuery.selection を追加 */
236
+ $.extend({
237
+ /**
238
+ * ウィンドウの選択されている文字列を取得
239
+ *
240
+ * @param {String} mode 選択モード "text" | "html" のいずれか
241
+ * @return {String} return
242
+ */
243
+ selection: function(mode) {
244
+ var getText = ((mode || 'text').toLowerCase() == 'text');
245
+
246
+ try {
247
+ if (win.getSelection) {
248
+ if (getText) {
249
+ // get text
250
+ return win.getSelection().toString();
251
+ } else {
252
+ // get html
253
+ var sel = win.getSelection(), range;
254
+
255
+ if (sel.getRangeAt) {
256
+ range = sel.getRangeAt(0);
257
+ } else {
258
+ range = doc.createRange();
259
+ range.setStart(sel.anchorNode, sel.anchorOffset);
260
+ range.setEnd(sel.focusNode, sel.focusOffset);
261
+ }
262
+
263
+ return $('<div></div>').append(range.cloneContents()).html();
264
+ }
265
+ } else if (doc.selection) {
266
+ if (getText) {
267
+ // get text
268
+ return doc.selection.createRange().text;
269
+ } else {
270
+ // get html
271
+ return doc.selection.createRange().htmlText;
272
+ }
273
+ }
274
+ } catch (e) {
275
+ /* あきらめる */
276
+ }
277
+
278
+ return '';
279
+ }
280
+ });
281
+
282
+ /* selection を追加 */
283
+ $.fn.extend({
284
+ selection: function(mode, opts) {
285
+ opts = opts || {};
286
+
287
+ switch (mode) {
288
+ /**
289
+ * selection('getPos')
290
+ * キャレット位置を取得します
291
+ *
292
+ * @return {Object} return
293
+ * @return {Integer} return.start 選択開始位置
294
+ * @return {Integer} return.end 選択終了位置
295
+ */
296
+ case 'getPos':
297
+ return _CaretOperation.getPos(this[0]);
298
+ break;
299
+
300
+ /**
301
+ * selection('setPos', opts)
302
+ * キャレット位置を設定します
303
+ *
304
+ * @param {Integer} opts.start 選択開始位置
305
+ * @param {Integer} opts.end 選択終了位置
306
+ */
307
+ case 'setPos':
308
+ return this.each(function() {
309
+ _CaretOperation.setPos(this, opts);
310
+ });
311
+ break;
312
+
313
+ /**
314
+ * selection('replace', opts)
315
+ * 選択文字列を置き換えます
316
+ *
317
+ * @param {String} opts.text 置き換える文字列
318
+ * @param {String} opts.caret キャレットモード "keep" | "start" | "end" のいずれか
319
+ */
320
+ case 'replace':
321
+ return this.each(function() {
322
+ _CaretOperation.replace(this, opts.text, opts.caret);
323
+ });
324
+ break;
325
+
326
+ /**
327
+ * selection('insert', opts)
328
+ * 選択文字列の前、もしくは後に文字列を挿入えます
329
+ *
330
+ * @param {String} opts.text 挿入文字列
331
+ * @param {String} opts.caret キャレットモード "keep" | "start" | "end" のいずれか
332
+ * @param {String} opts.mode 挿入モード "before" | "after" のいずれか
333
+ */
334
+ case 'insert':
335
+ return this.each(function() {
336
+ if (opts.mode == 'before') {
337
+ _CaretOperation.insertBefore(this, opts.text, opts.caret);
338
+ } else {
339
+ _CaretOperation.insertAfter(this, opts.text, opts.caret);
340
+ }
341
+ });
342
+
343
+ break;
344
+
345
+ /**
346
+ * selection('get')
347
+ * 選択されている文字列を取得
348
+ *
349
+ * @return {String} return
350
+ */
351
+ case 'get':
352
+ default:
353
+ return _CaretOperation.getText(this[0]);
354
+ break;
355
+ }
356
+
357
+ return this;
358
+ }
359
+ });
360
+ })(jQuery, window, window.document);
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jquery-selection-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Masahiro Saito
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-11-22 00:00:00.000000000 Z
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'
30
+ - !ruby/object:Gem::Dependency
31
+ name: actionpack
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '3.1'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '3.1'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rails
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '3.1'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '3.1'
62
+ description: jQuery Selectin for Rails
63
+ email:
64
+ - camelmasa@gmail.com
65
+ executables: []
66
+ extensions: []
67
+ extra_rdoc_files: []
68
+ files:
69
+ - lib/jquery/selection/rails/engine.rb
70
+ - lib/jquery/selection/rails/upload.rb
71
+ - lib/jquery/selection/rails/version.rb
72
+ - lib/jquery-selection-rails.rb
73
+ - vendor/assets/javascripts/jquery-selection.js
74
+ - Rakefile
75
+ - README.md
76
+ homepage: https://github.com/camelmasa/jquery-selection-rails
77
+ licenses: []
78
+ post_install_message:
79
+ rdoc_options: []
80
+ require_paths:
81
+ - lib
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ segments:
89
+ - 0
90
+ hash: -3999779397681091832
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ segments:
98
+ - 0
99
+ hash: -3999779397681091832
100
+ requirements: []
101
+ rubyforge_project: jquery-selection-rails
102
+ rubygems_version: 1.8.23
103
+ signing_key:
104
+ specification_version: 3
105
+ summary: jQuery Selectin for Rails
106
+ test_files: []