jquery-selection-rails 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.
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: []