2015-09-30 18:09:17 -04:00
/ * !
* clipboard . js v1 . 4.2
* https : //zenorocha.github.io/clipboard.js
*
* Licensed MIT © Zeno Rocha
* /
( function ( f ) { if ( typeof exports === "object" && typeof module !== "undefined" ) { module . exports = f ( ) } else if ( typeof define === "function" && define . amd ) { define ( [ ] , f ) } else { var g ; if ( typeof window !== "undefined" ) { g = window } else if ( typeof global !== "undefined" ) { g = global } else if ( typeof self !== "undefined" ) { g = self } else { g = this } g . Clipboard = f ( ) } } ) ( function ( ) { var define , module , exports ; return ( function e ( t , n , r ) { function s ( o , u ) { if ( ! n [ o ] ) { if ( ! t [ o ] ) { var a = typeof require == "function" && require ; if ( ! u && a ) return a ( o , ! 0 ) ; if ( i ) return i ( o , ! 0 ) ; var f = new Error ( "Cannot find module '" + o + "'" ) ; throw f . code = "MODULE_NOT_FOUND" , f } var l = n [ o ] = { exports : { } } ; t [ o ] [ 0 ] . call ( l . exports , function ( e ) { var n = t [ o ] [ 1 ] [ e ] ; return s ( n ? n : e ) } , l , l . exports , e , t , n , r ) } return n [ o ] . exports } var i = typeof require == "function" && require ; for ( var o = 0 ; o < r . length ; o ++ ) s ( r [ o ] ) ; return s } ) ( { 1 : [ function ( require , module , exports ) {
/ * *
* Module dependencies .
* /
var closest = require ( 'closest' )
, event = require ( 'component-event' ) ;
/ * *
* Delegate event ` type ` to ` selector `
* and invoke ` fn(e) ` . A callback function
* is returned which may be passed to ` .unbind() ` .
*
* @ param { Element } el
* @ param { String } selector
* @ param { String } type
* @ param { Function } fn
* @ param { Boolean } capture
* @ return { Function }
* @ api public
* /
// Some events don't bubble, so we want to bind to the capture phase instead
// when delegating.
var forceCaptureEvents = [ 'focus' , 'blur' ] ;
exports . bind = function ( el , selector , type , fn , capture ) {
if ( forceCaptureEvents . indexOf ( type ) !== - 1 ) capture = true ;
return event . bind ( el , type , function ( e ) {
var target = e . target || e . srcElement ;
e . delegateTarget = closest ( target , selector , true , el ) ;
if ( e . delegateTarget ) fn . call ( el , e ) ;
} , capture ) ;
} ;
/ * *
* Unbind event ` type ` ' s callback ` fn ` .
*
* @ param { Element } el
* @ param { String } type
* @ param { Function } fn
* @ param { Boolean } capture
* @ api public
* /
exports . unbind = function ( el , type , fn , capture ) {
if ( forceCaptureEvents . indexOf ( type ) !== - 1 ) capture = true ;
event . unbind ( el , type , fn , capture ) ;
} ;
} , { "closest" : 2 , "component-event" : 4 } ] , 2 : [ function ( require , module , exports ) {
var matches = require ( 'matches-selector' )
module . exports = function ( element , selector , checkYoSelf ) {
var parent = checkYoSelf ? element : element . parentNode
while ( parent && parent !== document ) {
if ( matches ( parent , selector ) ) return parent ;
parent = parent . parentNode
}
}
} , { "matches-selector" : 3 } ] , 3 : [ function ( require , module , exports ) {
/ * *
* Element prototype .
* /
var proto = Element . prototype ;
/ * *
* Vendor function .
* /
var vendor = proto . matchesSelector
|| proto . webkitMatchesSelector
|| proto . mozMatchesSelector
|| proto . msMatchesSelector
|| proto . oMatchesSelector ;
/ * *
* Expose ` match() ` .
* /
module . exports = match ;
/ * *
* Match ` el ` to ` selector ` .
*
* @ param { Element } el
* @ param { String } selector
* @ return { Boolean }
* @ api public
* /
function match ( el , selector ) {
if ( vendor ) return vendor . call ( el , selector ) ;
var nodes = el . parentNode . querySelectorAll ( selector ) ;
for ( var i = 0 ; i < nodes . length ; ++ i ) {
if ( nodes [ i ] == el ) return true ;
}
return false ;
}
} , { } ] , 4 : [ function ( require , module , exports ) {
var bind = window . addEventListener ? 'addEventListener' : 'attachEvent' ,
unbind = window . removeEventListener ? 'removeEventListener' : 'detachEvent' ,
prefix = bind !== 'addEventListener' ? 'on' : '' ;
/ * *
* Bind ` el ` event ` type ` to ` fn ` .
*
* @ param { Element } el
* @ param { String } type
* @ param { Function } fn
* @ param { Boolean } capture
* @ return { Function }
* @ api public
* /
exports . bind = function ( el , type , fn , capture ) {
el [ bind ] ( prefix + type , fn , capture || false ) ;
return fn ;
} ;
/ * *
* Unbind ` el ` event ` type ` ' s callback ` fn ` .
*
* @ param { Element } el
* @ param { String } type
* @ param { Function } fn
* @ param { Boolean } capture
* @ return { Function }
* @ api public
* /
exports . unbind = function ( el , type , fn , capture ) {
el [ unbind ] ( prefix + type , fn , capture || false ) ;
return fn ;
} ;
} , { } ] , 5 : [ function ( require , module , exports ) {
function E ( ) {
// Keep this empty so it's easier to inherit from
// (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)
}
E . prototype = {
on : function ( name , callback , ctx ) {
var e = this . e || ( this . e = { } ) ;
2016-07-26 05:46:44 -04:00
2015-09-30 18:09:17 -04:00
( e [ name ] || ( e [ name ] = [ ] ) ) . push ( {
fn : callback ,
ctx : ctx
} ) ;
2016-07-26 05:46:44 -04:00
2015-09-30 18:09:17 -04:00
return this ;
} ,
once : function ( name , callback , ctx ) {
var self = this ;
var fn = function ( ) {
self . off ( name , fn ) ;
callback . apply ( ctx , arguments ) ;
} ;
2016-07-26 05:46:44 -04:00
2015-09-30 18:09:17 -04:00
return this . on ( name , fn , ctx ) ;
} ,
emit : function ( name ) {
var data = [ ] . slice . call ( arguments , 1 ) ;
var evtArr = ( ( this . e || ( this . e = { } ) ) [ name ] || [ ] ) . slice ( ) ;
var i = 0 ;
var len = evtArr . length ;
2016-07-26 05:46:44 -04:00
2015-09-30 18:09:17 -04:00
for ( i ; i < len ; i ++ ) {
evtArr [ i ] . fn . apply ( evtArr [ i ] . ctx , data ) ;
}
2016-07-26 05:46:44 -04:00
2015-09-30 18:09:17 -04:00
return this ;
} ,
off : function ( name , callback ) {
var e = this . e || ( this . e = { } ) ;
var evts = e [ name ] ;
var liveEvents = [ ] ;
2016-07-26 05:46:44 -04:00
2015-09-30 18:09:17 -04:00
if ( evts && callback ) {
for ( var i = 0 , len = evts . length ; i < len ; i ++ ) {
if ( evts [ i ] . fn !== callback ) liveEvents . push ( evts [ i ] ) ;
}
}
2016-07-26 05:46:44 -04:00
2015-09-30 18:09:17 -04:00
// Remove event from queue to prevent memory leak
// Suggested by https://github.com/lazd
// Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910
2016-07-26 05:46:44 -04:00
( liveEvents . length )
2015-09-30 18:09:17 -04:00
? e [ name ] = liveEvents
: delete e [ name ] ;
2016-07-26 05:46:44 -04:00
2015-09-30 18:09:17 -04:00
return this ;
}
} ;
module . exports = E ;
} , { } ] , 6 : [ function ( require , module , exports ) {
/ * *
* Inner class which performs selection from either ` text ` or ` target `
* properties and then executes copy or cut operations .
* /
'use strict' ;
exports . _ _esModule = true ;
var _createClass = ( function ( ) { function defineProperties ( target , props ) { for ( var i = 0 ; i < props . length ; i ++ ) { var descriptor = props [ i ] ; descriptor . enumerable = descriptor . enumerable || false ; descriptor . configurable = true ; if ( 'value' in descriptor ) descriptor . writable = true ; Object . defineProperty ( target , descriptor . key , descriptor ) ; } } return function ( Constructor , protoProps , staticProps ) { if ( protoProps ) defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) defineProperties ( Constructor , staticProps ) ; return Constructor ; } ; } ) ( ) ;
function _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( 'Cannot call a class as a function' ) ; } }
var ClipboardAction = ( function ( ) {
/ * *
* @ param { Object } options
* /
function ClipboardAction ( options ) {
_classCallCheck ( this , ClipboardAction ) ;
this . resolveOptions ( options ) ;
this . initSelection ( ) ;
}
/ * *
* Defines base properties passed from constructor .
* @ param { Object } options
* /
ClipboardAction . prototype . resolveOptions = function resolveOptions ( ) {
var options = arguments . length <= 0 || arguments [ 0 ] === undefined ? { } : arguments [ 0 ] ;
this . action = options . action ;
this . emitter = options . emitter ;
this . target = options . target ;
this . text = options . text ;
this . trigger = options . trigger ;
this . selectedText = '' ;
} ;
/ * *
* Decides which selection strategy is going to be applied based
* on the existence of ` text ` and ` target ` properties .
* /
ClipboardAction . prototype . initSelection = function initSelection ( ) {
if ( this . text && this . target ) {
throw new Error ( 'Multiple attributes declared, use either "target" or "text"' ) ;
} else if ( this . text ) {
this . selectFake ( ) ;
} else if ( this . target ) {
this . selectTarget ( ) ;
} else {
throw new Error ( 'Missing required attributes, use either "target" or "text"' ) ;
}
} ;
/ * *
* Creates a fake textarea element , sets its value from ` text ` property ,
* and makes a selection on it .
* /
ClipboardAction . prototype . selectFake = function selectFake ( ) {
var _this = this ;
this . removeFake ( ) ;
this . fakeHandler = document . body . addEventListener ( 'click' , function ( ) {
return _this . removeFake ( ) ;
} ) ;
this . fakeElem = document . createElement ( 'textarea' ) ;
this . fakeElem . style . position = 'absolute' ;
this . fakeElem . style . left = '-9999px' ;
this . fakeElem . style . top = ( window . pageYOffset || document . documentElement . scrollTop ) + 'px' ;
this . fakeElem . setAttribute ( 'readonly' , '' ) ;
this . fakeElem . value = this . text ;
this . selectedText = this . text ;
document . body . appendChild ( this . fakeElem ) ;
this . fakeElem . select ( ) ;
this . copyText ( ) ;
} ;
/ * *
* Only removes the fake element after another click event , that way
* a user can hit ` Ctrl+C ` to copy because selection still exists .
* /
ClipboardAction . prototype . removeFake = function removeFake ( ) {
if ( this . fakeHandler ) {
document . body . removeEventListener ( 'click' ) ;
this . fakeHandler = null ;
}
if ( this . fakeElem ) {
document . body . removeChild ( this . fakeElem ) ;
this . fakeElem = null ;
}
} ;
/ * *
* Selects the content from element passed on ` target ` property .
* /
ClipboardAction . prototype . selectTarget = function selectTarget ( ) {
if ( this . target . nodeName === 'INPUT' || this . target . nodeName === 'TEXTAREA' ) {
this . target . select ( ) ;
this . selectedText = this . target . value ;
} else {
var range = document . createRange ( ) ;
var selection = window . getSelection ( ) ;
selection . removeAllRanges ( ) ;
range . selectNodeContents ( this . target ) ;
selection . addRange ( range ) ;
this . selectedText = selection . toString ( ) ;
}
this . copyText ( ) ;
} ;
/ * *
* Executes the copy operation based on the current selection .
* /
ClipboardAction . prototype . copyText = function copyText ( ) {
var succeeded = undefined ;
try {
succeeded = document . execCommand ( this . action ) ;
} catch ( err ) {
succeeded = false ;
}
this . handleResult ( succeeded ) ;
} ;
/ * *
* Fires an event based on the copy operation result .
* @ param { Boolean } succeeded
* /
ClipboardAction . prototype . handleResult = function handleResult ( succeeded ) {
if ( succeeded ) {
this . emitter . emit ( 'success' , {
action : this . action ,
text : this . selectedText ,
trigger : this . trigger ,
clearSelection : this . clearSelection . bind ( this )
} ) ;
} else {
this . emitter . emit ( 'error' , {
action : this . action ,
trigger : this . trigger ,
clearSelection : this . clearSelection . bind ( this )
} ) ;
}
} ;
/ * *
* Removes current selection and focus from ` target ` element .
* /
ClipboardAction . prototype . clearSelection = function clearSelection ( ) {
if ( this . target ) {
this . target . blur ( ) ;
}
window . getSelection ( ) . removeAllRanges ( ) ;
} ;
/ * *
* Sets the ` action ` to be performed which can be either 'copy' or 'cut' .
* @ param { String } action
* /
/ * *
* Destroy lifecycle .
* /
ClipboardAction . prototype . destroy = function destroy ( ) {
this . removeFake ( ) ;
} ;
_createClass ( ClipboardAction , [ {
key : 'action' ,
set : function set ( ) {
var action = arguments . length <= 0 || arguments [ 0 ] === undefined ? 'copy' : arguments [ 0 ] ;
this . _action = action ;
if ( this . _action !== 'copy' && this . _action !== 'cut' ) {
throw new Error ( 'Invalid "action" value, use either "copy" or "cut"' ) ;
}
} ,
/ * *
* Gets the ` action ` property .
* @ return { String }
* /
get : function get ( ) {
return this . _action ;
}
/ * *
* Sets the ` target ` property using an element
* that will be have its content copied .
* @ param { Element } target
* /
} , {
key : 'target' ,
set : function set ( target ) {
if ( target !== undefined ) {
if ( target && typeof target === 'object' && target . nodeType === 1 ) {
this . _target = target ;
} else {
throw new Error ( 'Invalid "target" value, use a valid Element' ) ;
}
}
} ,
/ * *
* Gets the ` target ` property .
* @ return { String | HTMLElement }
* /
get : function get ( ) {
return this . _target ;
}
} ] ) ;
return ClipboardAction ;
} ) ( ) ;
exports [ 'default' ] = ClipboardAction ;
module . exports = exports [ 'default' ] ;
} , { } ] , 7 : [ function ( require , module , exports ) {
'use strict' ;
exports . _ _esModule = true ;
function _interopRequireDefault ( obj ) { return obj && obj . _ _esModule ? obj : { 'default' : obj } ; }
function _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( 'Cannot call a class as a function' ) ; } }
function _inherits ( subClass , superClass ) { if ( typeof superClass !== 'function' && superClass !== null ) { throw new TypeError ( 'Super expression must either be null or a function, not ' + typeof superClass ) ; } subClass . prototype = Object . create ( superClass && superClass . prototype , { constructor : { value : subClass , enumerable : false , writable : true , configurable : true } } ) ; if ( superClass ) Object . setPrototypeOf ? Object . setPrototypeOf ( subClass , superClass ) : subClass . _ _proto _ _ = superClass ; }
var _clipboardAction = require ( './clipboard-action' ) ;
var _clipboardAction2 = _interopRequireDefault ( _clipboardAction ) ;
var _delegateEvents = require ( 'delegate-events' ) ;
var _delegateEvents2 = _interopRequireDefault ( _delegateEvents ) ;
var _tinyEmitter = require ( 'tiny-emitter' ) ;
var _tinyEmitter2 = _interopRequireDefault ( _tinyEmitter ) ;
/ * *
* Base class which takes a selector , delegates a click event to it ,
* and instantiates a new ` ClipboardAction ` on each click .
* /
var Clipboard = ( function ( _Emitter ) {
_inherits ( Clipboard , _Emitter ) ;
/ * *
* @ param { String } selector
* @ param { Object } options
* /
function Clipboard ( selector , options ) {
_classCallCheck ( this , Clipboard ) ;
_Emitter . call ( this ) ;
this . resolveOptions ( options ) ;
this . delegateClick ( selector ) ;
}
/ * *
* Helper function to retrieve attribute value .
* @ param { String } suffix
* @ param { Element } element
* /
/ * *
* Defines if attributes would be resolved using internal setter functions
* or custom functions that were passed in the constructor .
* @ param { Object } options
* /
Clipboard . prototype . resolveOptions = function resolveOptions ( ) {
var options = arguments . length <= 0 || arguments [ 0 ] === undefined ? { } : arguments [ 0 ] ;
this . action = typeof options . action === 'function' ? options . action : this . defaultAction ;
this . target = typeof options . target === 'function' ? options . target : this . defaultTarget ;
this . text = typeof options . text === 'function' ? options . text : this . defaultText ;
} ;
/ * *
* Delegates a click event on the passed selector .
* @ param { String } selector
* /
Clipboard . prototype . delegateClick = function delegateClick ( selector ) {
var _this = this ;
this . binding = _delegateEvents2 [ 'default' ] . bind ( document . body , selector , 'click' , function ( e ) {
return _this . onClick ( e ) ;
} ) ;
} ;
/ * *
* Undelegates a click event on body .
* @ param { String } selector
* /
Clipboard . prototype . undelegateClick = function undelegateClick ( ) {
_delegateEvents2 [ 'default' ] . unbind ( document . body , 'click' , this . binding ) ;
} ;
/ * *
* Defines a new ` ClipboardAction ` on each click event .
* @ param { Event } e
* /
Clipboard . prototype . onClick = function onClick ( e ) {
if ( this . clipboardAction ) {
this . clipboardAction = null ;
}
this . clipboardAction = new _clipboardAction2 [ 'default' ] ( {
action : this . action ( e . delegateTarget ) ,
target : this . target ( e . delegateTarget ) ,
text : this . text ( e . delegateTarget ) ,
trigger : e . delegateTarget ,
emitter : this
} ) ;
} ;
/ * *
* Default ` action ` lookup function .
* @ param { Element } trigger
* /
Clipboard . prototype . defaultAction = function defaultAction ( trigger ) {
return getAttributeValue ( 'action' , trigger ) ;
} ;
/ * *
* Default ` target ` lookup function .
* @ param { Element } trigger
* /
Clipboard . prototype . defaultTarget = function defaultTarget ( trigger ) {
var selector = getAttributeValue ( 'target' , trigger ) ;
if ( selector ) {
return document . querySelector ( selector ) ;
}
} ;
/ * *
* Default ` text ` lookup function .
* @ param { Element } trigger
* /
Clipboard . prototype . defaultText = function defaultText ( trigger ) {
return getAttributeValue ( 'text' , trigger ) ;
} ;
/ * *
* Destroy lifecycle .
* /
Clipboard . prototype . destroy = function destroy ( ) {
this . undelegateClick ( ) ;
if ( this . clipboardAction ) {
this . clipboardAction . destroy ( ) ;
this . clipboardAction = null ;
}
} ;
return Clipboard ;
} ) ( _tinyEmitter2 [ 'default' ] ) ;
function getAttributeValue ( suffix , element ) {
var attribute = 'data-clipboard-' + suffix ;
if ( ! element . hasAttribute ( attribute ) ) {
return ;
}
return element . getAttribute ( attribute ) ;
}
exports [ 'default' ] = Clipboard ;
module . exports = exports [ 'default' ] ;
} , { "./clipboard-action" : 6 , "delegate-events" : 1 , "tiny-emitter" : 5 } ] } , { } , [ 7 ] ) ( 7 )
2016-07-26 05:46:44 -04:00
} ) ;