From 5e9d2df0de3c851c064856ca95c56b844b5f9cee Mon Sep 17 00:00:00 2001 From: Jonathan Horowitz Date: Mon, 28 Nov 2016 15:39:45 -0700 Subject: [PATCH 1/2] AMD/CommonJS support and automated builds. Signed-off-by: Jonathan Horowitz --- .gitignore | 1 + Gruntfile.js | 57 +++++++ README => README.md | 0 Selection-1.0.js | 186 --------------------- bower.json | 21 +++ dist/jquery.textselection.js | 266 +++++++++++++++++++++++++++++ dist/jquery.textselection.min.js | 3 + dist/jquery.textselection.min.map | 1 + example.html | 12 +- jquery.textSelection-1.0.js | 80 --------- jquery.textSelection-1.0.min.js | 1 - package.json | 32 ++++ src/Selection.js | 167 +++++++++++++++++++ src/jquery.textselection.js | 80 +++++++++ src/wrapper.js | 31 ++++ tasks/build.js | 268 ++++++++++++++++++++++++++++++ 16 files changed, 933 insertions(+), 273 deletions(-) create mode 100644 .gitignore create mode 100644 Gruntfile.js rename README => README.md (100%) delete mode 100644 Selection-1.0.js create mode 100644 bower.json create mode 100644 dist/jquery.textselection.js create mode 100644 dist/jquery.textselection.min.js create mode 100644 dist/jquery.textselection.min.map delete mode 100644 jquery.textSelection-1.0.js delete mode 100644 jquery.textSelection-1.0.min.js create mode 100644 package.json create mode 100644 src/Selection.js create mode 100644 src/jquery.textselection.js create mode 100644 src/wrapper.js create mode 100644 tasks/build.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..07e6e47 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/node_modules diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..4fe55bb --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,57 @@ +module.exports = function (grunt) { + "use strict"; + + var livereload = { + host: 'localhost', + port: 35729 + }; + + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + build: { + all: { + dest: "dist/jquery.textselection.js" + } + }, + uglify: { + all: { + files: { + "dist/jquery.textselection.min.js": ["dist/jquery.textselection.js"] + }, + options: { + preserveComments: false, + sourceMap: true, + ASCIIOnly: true, + sourceMapName: "dist/jquery.textselection.min.map", + report: "min", + beautify: { + "ascii_only": true + }, + banner: "/*! jQuery TextSelection v<%= pkg.version %> | GPL-3.0 license */", + compress: { + "hoist_funs": false, + loops: false, + unused: false + } + } + } + }, + watch: { + js: { + files: [ + 'src/**/*.js' + ], + tasks: ['build'], + options: { + livereload: livereload + } + } + }, + }); + + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.loadTasks("tasks"); + + grunt.registerTask("default", ["build", "uglify"]); +}; diff --git a/README b/README.md similarity index 100% rename from README rename to README.md diff --git a/Selection-1.0.js b/Selection-1.0.js deleted file mode 100644 index c04eee9..0000000 --- a/Selection-1.0.js +++ /dev/null @@ -1,186 +0,0 @@ -(function() { - - - /** - * - */ - var Selection = (function() { - - var hasRange = (typeof document.selection !== 'undefined' && typeof document.selection.createRange !== 'undefined'); - - return { - - /** - * - */ - getSelectionRange: function(el) { - - var start, - end, - range, - rangeLength, - duplicateRange, - textRange; - - el.focus(); - - // Mozilla / Safari - if (typeof el.selectionStart !== 'undefined') { - - start = el.selectionStart; - end = el.selectionEnd; - - // IE - } else if (hasRange) { - - range = document.selection.createRange(); - rangeLength = range.text.length; - - if(range.parentElement() !== el) { - throw('Unable to get selection range.'); - } - - // Textarea - if (el.type === 'textarea') { - - duplicateRange = range.duplicate(); - duplicateRange.moveToElementText(el); - duplicateRange.setEndPoint('EndToEnd', range); - - start = duplicateRange.text.length - rangeLength; - - // Text Input - } else { - - textRange = el.createTextRange(); - textRange.setEndPoint("EndToStart", range); - - start = textRange.text.length; - } - - end = start + rangeLength; - - // Unsupported type - } else { - throw('Unable to get selection range.'); - } - - return { - start: start, - end: end - }; - }, - - - /** - * - */ - getSelectionStart: function(el) { - return this.getSelectionRange(el).start; - }, - - - /** - * - */ - getSelectionEnd: function(el) { - return this.getSelectionRange(el).end; - }, - - - /** - * - */ - setSelectionRange: function(el, start, end) { - - var value, - range; - - el.focus(); - - if (typeof end === 'undefined') { - end = start; - } - - // Mozilla / Safari - if (typeof el.selectionStart !== 'undefined') { - - el.setSelectionRange(start, end); - - // IE - } else if (hasRange) { - - value = el.value; - range = el.createTextRange(); - end -= start + value.slice(start + 1, end).split("\n").length - 1; - start -= value.slice(0, start).split("\n").length - 1; - range.move('character', start); - range.moveEnd('character', end); - range.select(); - - // Unsupported - } else { - throw('Unable to set selection range.'); - } - }, - - - /** - * - */ - getSelectedText: function(el) { - var selection = this.getSelectionRange(el); - return el.value.substring(selection.start, selection.end); - }, - - - /** - * - */ - insertText: function(el, text, start, end, selectText) { - - end = end || start; - - var textLength = text.length, - selectionEnd = start + textLength, - beforeText = el.value.substring(0, start), - afterText = el.value.substr(end); - - el.value = beforeText + text + afterText; - - if (selectText === true) { - this.setSelectionRange(el, start, selectionEnd); - } else { - this.setSelectionRange(el, selectionEnd); - } - }, - - - /** - * - */ - replaceSelectedText: function(el, text, selectText) { - var selection = this.getSelectionRange(el); - this.insertText(el, text, selection.start, selection.end, selectText); - }, - - - /** - * - */ - wrapSelectedText: function(el, beforeText, afterText, selectText) { - var text = beforeText + this.getSelectedText(el) + afterText; - this.replaceSelectedText(el, text, selectText); - } - - }; - })(); - - - /** - * - */ - window.Selection = Selection; - - -})(); diff --git a/bower.json b/bower.json new file mode 100644 index 0000000..3c0eef0 --- /dev/null +++ b/bower.json @@ -0,0 +1,21 @@ +{ + "name": "jquery-textselection", + "homepage": "https://github.com/jhorowitz-firedrum/jquery-textselection", + "authors": [ + "David Furfero " + ], + "main": "dist/jquery.textselection.min.js", + "dependencies": { + "jquery": ">=1.7" + }, + "description": "A library of jQuery plugins for selecting, inserting, and replacing text within form elements", + "keywords": [], + "license": "GPL-3.0", + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "tests" + ] +} diff --git a/dist/jquery.textselection.js b/dist/jquery.textselection.js new file mode 100644 index 0000000..8a047fe --- /dev/null +++ b/dist/jquery.textselection.js @@ -0,0 +1,266 @@ +/*! + * jQuery TextSelection v1.0.1 + * https://github.com/jhorowitz-firedrum/jquery-textselection + * Copyright David Furfero and other contributors + * Released under the GPL-3.0 license + * Date: 2016-11-28T22:28Z + */ +window = ( typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {} ); +document = window.document || {}; + +; ( function ( factory, global ) { + if ( typeof require === "function" && typeof exports === "object" && typeof module === "object" ) { + + // CommonJS + factory( require( "jquery" ) ); + } else if ( typeof define === "function" && define.amd ) { + + // AMD + define( [ "jquery" ], factory ); + } else { + + // Normal script tag + factory( global.jQuery ); + } +}( function ( $ ) { + "use strict"; + + + var Selection = ( function() { + var hasRange = ( + typeof document.selection !== "undefined" && + typeof document.selection.createRange !== "undefined" + ); + + return { + + /** + * + */ + getSelectionRange: function( el ) { + var start, end, range, rangeLength, duplicateRange, textRange; + + el.focus(); + + if ( typeof el.selectionStart !== "undefined" ) { + + // Mozilla / Safari + start = el.selectionStart; + end = el.selectionEnd; + + } else if ( hasRange ) { + + // IE + range = document.selection.createRange(); + rangeLength = range.text.length; + + if( range.parentElement() !== el ) { + throw( "Unable to get selection range." ); + } + + if ( el.type === "textarea" ) { + + // Textarea + duplicateRange = range.duplicate(); + duplicateRange.moveToElementText(el); + duplicateRange.setEndPoint('EndToEnd', range); + + start = duplicateRange.text.length - rangeLength; + + } else { + + // Text Input + textRange = el.createTextRange(); + textRange.setEndPoint("EndToStart", range); + + start = textRange.text.length; + } + + end = start + rangeLength; + + } else { + + // Unsupported type + throw( "Unable to get selection range." ); + } + + return { + start: start, + end: end + }; + }, + + /** + * + */ + getSelectionStart: function( el ) { + return this.getSelectionRange( el ).start; + }, + + /** + * + */ + getSelectionEnd: function( el ) { + return this.getSelectionRange( el ).end; + }, + + /** + * + */ + setSelectionRange: function( el, start, end ) { + + var value, range; + + el.focus(); + + if ( typeof end === "undefined" ) { + end = start; + } + + if ( typeof el.selectionStart !== "undefined" ) { + + // Mozilla / Safari + el.setSelectionRange( start, end ); + + } else if ( hasRange ) { + + // IE + value = el.value; + range = el.createTextRange(); + end -= start + value.slice( start + 1, end ).split( "\n" ).length - 1; + start -= value.slice( 0, start ).split( "\n" ).length - 1; + range.move( "character", start ); + range.moveEnd( "character", end ); + range.select(); + + } else { + + // Unsupported + throw( "Unable to set selection range." ); + } + }, + + /** + * + */ + getSelectedText: function( el ) { + var selection = this.getSelectionRange( el ); + return el.value.substring( selection.start, selection.end ); + }, + + /** + * + */ + insertText: function( el, text, start, end, selectText ) { + + end = end || start; + + var textLength = text.length, + selectionEnd = start + textLength, + beforeText = el.value.substring( 0, start ), + afterText = el.value.substr( end ); + + el.value = beforeText + text + afterText; + + if ( selectText === true ) { + this.setSelectionRange( el, start, selectionEnd ); + } else { + this.setSelectionRange( el, selectionEnd ); + } + }, + + /** + * + */ + replaceSelectedText: function( el, text, selectText ) { + var selection = this.getSelectionRange( el ); + this.insertText( el, text, selection.start, selection.end, selectText ); + }, + + /** + * + */ + wrapSelectedText: function( el, beforeText, afterText, selectText ) { + var text = beforeText + this.getSelectedText( el ) + afterText; + this.replaceSelectedText( el, text, selectText ); + } + + }; + } )(); + + $.fn.extend({ + + /** + * + */ + getSelectionRange: function() { + return Selection.getSelectionRange(this[0]); + }, + + + /** + * + */ + getSelectionStart: function() { + return Selection.getSelectionStart(this[0]); + }, + + + /** + * + */ + getSelectionEnd: function() { + return Selection.getSelectionEnd(this[0]); + }, + + + /** + * + */ + getSelectedText: function() { + return Selection.getSelectedText(this[0]); + }, + + + /** + * + */ + setSelectionRange: function(start, end) { + return this.each(function() { + Selection.setSelectionRange(this, start, end); + }); + }, + + + /** + * + */ + insertText: function(text, start, end, selectText) { + return this.each(function() { + Selection.insertText(this, text, start, end, selectText); + }); + }, + + + /** + * + */ + replaceSelectedText: function(text, selectText) { + return this.each(function() { + Selection.replaceSelectedText(this, text, selectText); + }); + }, + + + /** + * + */ + wrapSelectedText: function(beforeText, afterText, selectText) { + return this.each(function() { + Selection.wrapSelectedText(this, beforeText, afterText, selectText); + }); + } + + }); + +}, window ) ); diff --git a/dist/jquery.textselection.min.js b/dist/jquery.textselection.min.js new file mode 100644 index 0000000..bf79bc2 --- /dev/null +++ b/dist/jquery.textselection.min.js @@ -0,0 +1,3 @@ +/*! jQuery TextSelection v1.0.1 | GPL-3.0 license */ +window="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},document=window.document||{},function(a,b){"function"==typeof require&&"object"==typeof exports&&"object"==typeof module?a(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],a):a(b.jQuery)}(function(a){"use strict";var b=function(){var a="undefined"!=typeof document.selection&&"undefined"!=typeof document.selection.createRange;return{getSelectionRange:function(b){var c,d,e,f,g,h;if(b.focus(),"undefined"!=typeof b.selectionStart)c=b.selectionStart,d=b.selectionEnd;else{if(!a)throw"Unable to get selection range.";if(e=document.selection.createRange(),f=e.text.length,e.parentElement()!==b)throw"Unable to get selection range.";"textarea"===b.type?(g=e.duplicate(),g.moveToElementText(b),g.setEndPoint("EndToEnd",e),c=g.text.length-f):(h=b.createTextRange(),h.setEndPoint("EndToStart",e),c=h.text.length),d=c+f}return{start:c,end:d}},getSelectionStart:function(a){return this.getSelectionRange(a).start},getSelectionEnd:function(a){return this.getSelectionRange(a).end},setSelectionRange:function(b,c,d){var e,f;if(b.focus(),"undefined"==typeof d&&(d=c),"undefined"!=typeof b.selectionStart)b.setSelectionRange(c,d);else{if(!a)throw"Unable to set selection range.";e=b.value,f=b.createTextRange(),d-=c+e.slice(c+1,d).split("\n").length-1,c-=e.slice(0,c).split("\n").length-1,f.move("character",c),f.moveEnd("character",d),f.select()}},getSelectedText:function(a){var b=this.getSelectionRange(a);return a.value.substring(b.start,b.end)},insertText:function(a,b,c,d,e){d=d||c;var f=b.length,g=c+f,h=a.value.substring(0,c),i=a.value.substr(d);a.value=h+b+i,e===!0?this.setSelectionRange(a,c,g):this.setSelectionRange(a,g)},replaceSelectedText:function(a,b,c){var d=this.getSelectionRange(a);this.insertText(a,b,d.start,d.end,c)},wrapSelectedText:function(a,b,c,d){var e=b+this.getSelectedText(a)+c;this.replaceSelectedText(a,e,d)}}}();a.fn.extend({getSelectionRange:function(){return b.getSelectionRange(this[0])},getSelectionStart:function(){return b.getSelectionStart(this[0])},getSelectionEnd:function(){return b.getSelectionEnd(this[0])},getSelectedText:function(){return b.getSelectedText(this[0])},setSelectionRange:function(a,c){return this.each(function(){b.setSelectionRange(this,a,c)})},insertText:function(a,c,d,e){return this.each(function(){b.insertText(this,a,c,d,e)})},replaceSelectedText:function(a,c){return this.each(function(){b.replaceSelectedText(this,a,c)})},wrapSelectedText:function(a,c,d){return this.each(function(){b.wrapSelectedText(this,a,c,d)})}})},window); +//# sourceMappingURL=jquery.textselection.min.map \ No newline at end of file diff --git a/dist/jquery.textselection.min.map b/dist/jquery.textselection.min.map new file mode 100644 index 0000000..583376b --- /dev/null +++ b/dist/jquery.textselection.min.map @@ -0,0 +1 @@ +{"version":3,"sources":["jquery.textselection.js"],"names":["window","global","self","document","factory","require","exports","module","define","amd","jQuery","$","Selection","hasRange","selection","createRange","getSelectionRange","el","start","end","range","rangeLength","duplicateRange","textRange","focus","selectionStart","selectionEnd","text","length","parentElement","type","duplicate","moveToElementText","setEndPoint","createTextRange","getSelectionStart","this","getSelectionEnd","setSelectionRange","value","slice","split","move","moveEnd","select","getSelectedText","substring","insertText","selectText","textLength","beforeText","afterText","substr","replaceSelectedText","wrapSelectedText","fn","extend","each"],"mappings":";AAOAA,OAA6B,mBAAXC,QAAyBA,OAAyB,mBAATC,MAAuBA,KAAyB,mBAAXF,QAAyBA,UACzHG,SAAWH,OAAOG,aAEd,SAAWC,EAASH,GACI,kBAAZI,UAA6C,gBAAZC,UAA0C,gBAAXC,QAGxEH,EAASC,QAAS,WACQ,kBAAXG,SAAyBA,OAAOC,IAG/CD,QAAU,UAAYJ,GAItBA,EAASH,EAAOS,SAErB,SAAWC,GACV,YAGA,IAAIC,GAAY,WACZ,GAAIC,GAC8B,mBAAvBV,UAASW,WAC0B,mBAAnCX,UAASW,UAAUC,WAG9B,QAKIC,kBAAmB,SAAUC,GACzB,GAAIC,GAAOC,EAAKC,EAAOC,EAAaC,EAAgBC,CAIpD,IAFAN,EAAGO,QAE+B,mBAAtBP,GAAGQ,eAGXP,EAAQD,EAAGQ,eACXN,EAAMF,EAAGS,iBAEN,CAAA,IAAKb,EAiCR,KAAK,gCA3BL,IAHAO,EAAQjB,SAASW,UAAUC,cAC3BM,EAAcD,EAAMO,KAAKC,OAErBR,EAAMS,kBAAoBZ,EAC1B,KAAK,gCAGQ,cAAZA,EAAGa,MAGJR,EAAiBF,EAAMW,YACvBT,EAAeU,kBAAkBf,GACjCK,EAAeW,YAAY,WAAYb,GAEvCF,EAAQI,EAAeK,KAAKC,OAASP,IAKrCE,EAAYN,EAAGiB,kBACfX,EAAUU,YAAY,aAAcb,GAEpCF,EAAQK,EAAUI,KAAKC,QAG3BT,EAAMD,EAAQG,EAQlB,OACIH,MAAOA,EACPC,IAAOA,IAOfgB,kBAAmB,SAAUlB,GACzB,MAAOmB,MAAKpB,kBAAmBC,GAAKC,OAMxCmB,gBAAiB,SAAUpB,GACvB,MAAOmB,MAAKpB,kBAAmBC,GAAKE,KAMxCmB,kBAAmB,SAAUrB,EAAIC,EAAOC,GAEpC,GAAIoB,GAAOnB,CAQX,IANAH,EAAGO,QAEiB,mBAARL,KACRA,EAAMD,GAGwB,mBAAtBD,GAAGQ,eAGXR,EAAGqB,kBAAmBpB,EAAOC,OAE1B,CAAA,IAAKN,EAcR,KAAK,gCAXL0B,GAAQtB,EAAGsB,MACXnB,EAAQH,EAAGiB,kBACXf,GAAOD,EAAQqB,EAAMC,MAAOtB,EAAQ,EAAGC,GAAMsB,MAAO,MAAOb,OAAS,EACpEV,GAASqB,EAAMC,MAAO,EAAGtB,GAAQuB,MAAO,MAAOb,OAAS,EACxDR,EAAMsB,KAAM,YAAaxB,GACzBE,EAAMuB,QAAS,YAAaxB,GAC5BC,EAAMwB,WAYdC,gBAAiB,SAAU5B,GACvB,GAAIH,GAAYsB,KAAKpB,kBAAmBC,EACxC,OAAOA,GAAGsB,MAAMO,UAAWhC,EAAUI,MAAOJ,EAAUK,MAM1D4B,WAAY,SAAU9B,EAAIU,EAAMT,EAAOC,EAAK6B,GAExC7B,EAAMA,GAAOD,CAEb,IAAI+B,GAAatB,EAAKC,OACtBF,EAAeR,EAAQ+B,EACvBC,EAAajC,EAAGsB,MAAMO,UAAW,EAAG5B,GACpCiC,EAAYlC,EAAGsB,MAAMa,OAAQjC,EAE7BF,GAAGsB,MAAQW,EAAavB,EAAOwB,EAE1BH,KAAe,EAChBZ,KAAKE,kBAAmBrB,EAAIC,EAAOQ,GAEnCU,KAAKE,kBAAmBrB,EAAIS,IAOpC2B,oBAAqB,SAAUpC,EAAIU,EAAMqB,GACrC,GAAIlC,GAAYsB,KAAKpB,kBAAmBC,EACxCmB,MAAKW,WAAY9B,EAAIU,EAAMb,EAAUI,MAAOJ,EAAUK,IAAK6B,IAM/DM,iBAAkB,SAAUrC,EAAIiC,EAAYC,EAAWH,GACnD,GAAIrB,GAAOuB,EAAad,KAAKS,gBAAiB5B,GAAOkC,CACrDf,MAAKiB,oBAAqBpC,EAAIU,EAAMqB,OAMhDrC,GAAE4C,GAAGC,QAKDxC,kBAAmB,WACf,MAAOJ,GAAUI,kBAAkBoB,KAAK,KAO5CD,kBAAmB,WACf,MAAOvB,GAAUuB,kBAAkBC,KAAK,KAO5CC,gBAAiB,WACb,MAAOzB,GAAUyB,gBAAgBD,KAAK,KAO1CS,gBAAiB,WACb,MAAOjC,GAAUiC,gBAAgBT,KAAK,KAO1CE,kBAAmB,SAASpB,EAAOC,GAC/B,MAAOiB,MAAKqB,KAAK,WACb7C,EAAU0B,kBAAkBF,KAAMlB,EAAOC,MAQjD4B,WAAY,SAASpB,EAAMT,EAAOC,EAAK6B,GACnC,MAAOZ,MAAKqB,KAAK,WACb7C,EAAUmC,WAAWX,KAAMT,EAAMT,EAAOC,EAAK6B,MAQrDK,oBAAqB,SAAS1B,EAAMqB,GAChC,MAAOZ,MAAKqB,KAAK,WACb7C,EAAUyC,oBAAoBjB,KAAMT,EAAMqB,MAQlDM,iBAAkB,SAASJ,EAAYC,EAAWH,GAC9C,MAAOZ,MAAKqB,KAAK,WACb7C,EAAU0C,iBAAiBlB,KAAMc,EAAYC,EAAWH,SAMrEhD","file":"jquery.textselection.min.js"} \ No newline at end of file diff --git a/example.html b/example.html index e82fa0e..820a2c3 100644 --- a/example.html +++ b/example.html @@ -22,8 +22,8 @@ } - - + +