2020-04-01 22:52:43 +00:00
/ * !
*
2020-06-01 11:05:25 +00:00
* Super simple wysiwyg editor v0 . 8.18
2019-06-10 15:38:54 +00:00
* https : //summernote.org
2020-04-01 22:52:43 +00:00
*
*
2019-06-10 15:38:54 +00:00
* Copyright 2013 - Alan Hong . and other contributors
* summernote may be freely distributed under the MIT license .
2020-04-01 22:52:43 +00:00
*
2020-06-01 11:05:25 +00:00
* Date : 2020 - 05 - 20 T16 : 47 Z
2020-04-01 22:52:43 +00:00
*
2019-06-10 15:38:54 +00:00
* /
2020-04-01 22:52:43 +00:00
( function webpackUniversalModuleDefinition ( root , factory ) {
if ( typeof exports === 'object' && typeof module === 'object' )
module . exports = factory ( require ( "jquery" ) ) ;
else if ( typeof define === 'function' && define . amd )
define ( [ "jquery" ] , factory ) ;
else {
var a = typeof exports === 'object' ? factory ( require ( "jquery" ) ) : factory ( root [ "jQuery" ] ) ;
for ( var i in a ) ( typeof exports === 'object' ? exports : root ) [ i ] = a [ i ] ;
}
} ) ( window , function ( _ _WEBPACK _EXTERNAL _MODULE _ _0 _ _ ) {
return /******/ ( function ( modules ) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = { } ;
/******/
/******/ // The require function
/******/ function _ _webpack _require _ _ ( moduleId ) {
/******/
/******/ // Check if module is in cache
/******/ if ( installedModules [ moduleId ] ) {
/******/ return installedModules [ moduleId ] . exports ;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules [ moduleId ] = {
/******/ i : moduleId ,
/******/ l : false ,
/******/ exports : { }
/******/ } ;
/******/
/******/ // Execute the module function
/******/ modules [ moduleId ] . call ( module . exports , module , module . exports , _ _webpack _require _ _ ) ;
/******/
/******/ // Flag the module as loaded
/******/ module . l = true ;
/******/
/******/ // Return the exports of the module
/******/ return module . exports ;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ _ _webpack _require _ _ . m = modules ;
/******/
/******/ // expose the module cache
/******/ _ _webpack _require _ _ . c = installedModules ;
/******/
/******/ // define getter function for harmony exports
/******/ _ _webpack _require _ _ . d = function ( exports , name , getter ) {
/******/ if ( ! _ _webpack _require _ _ . o ( exports , name ) ) {
/******/ Object . defineProperty ( exports , name , { enumerable : true , get : getter } ) ;
/******/ }
/******/ } ;
/******/
/******/ // define __esModule on exports
/******/ _ _webpack _require _ _ . r = function ( exports ) {
/******/ if ( typeof Symbol !== 'undefined' && Symbol . toStringTag ) {
/******/ Object . defineProperty ( exports , Symbol . toStringTag , { value : 'Module' } ) ;
/******/ }
/******/ Object . defineProperty ( exports , '__esModule' , { value : true } ) ;
/******/ } ;
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ _ _webpack _require _ _ . t = function ( value , mode ) {
/******/ if ( mode & 1 ) value = _ _webpack _require _ _ ( value ) ;
/******/ if ( mode & 8 ) return value ;
/******/ if ( ( mode & 4 ) && typeof value === 'object' && value && value . _ _esModule ) return value ;
/******/ var ns = Object . create ( null ) ;
/******/ _ _webpack _require _ _ . r ( ns ) ;
/******/ Object . defineProperty ( ns , 'default' , { enumerable : true , value : value } ) ;
/******/ if ( mode & 2 && typeof value != 'string' ) for ( var key in value ) _ _webpack _require _ _ . d ( ns , key , function ( key ) { return value [ key ] ; } . bind ( null , key ) ) ;
/******/ return ns ;
/******/ } ;
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ _ _webpack _require _ _ . n = function ( module ) {
/******/ var getter = module && module . _ _esModule ?
/******/ function getDefault ( ) { return module [ 'default' ] ; } :
/******/ function getModuleExports ( ) { return module ; } ;
/******/ _ _webpack _require _ _ . d ( getter , 'a' , getter ) ;
/******/ return getter ;
/******/ } ;
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ _ _webpack _require _ _ . o = function ( object , property ) { return Object . prototype . hasOwnProperty . call ( object , property ) ; } ;
/******/
/******/ // __webpack_public_path__
/******/ _ _webpack _require _ _ . p = "" ;
/******/
/******/
/******/ // Load entry module and return exports
/******/ return _ _webpack _require _ _ ( _ _webpack _require _ _ . s = 51 ) ;
/******/ } )
/************************************************************************/
/******/ ( {
2019-06-10 15:38:54 +00:00
2020-04-01 22:52:43 +00:00
/***/ 0 :
/***/ ( function ( module , exports ) {
2019-06-10 15:38:54 +00:00
2020-04-01 22:52:43 +00:00
module . exports = _ _WEBPACK _EXTERNAL _MODULE _ _0 _ _ ;
/***/ } ) ,
/***/ 1 :
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
/* harmony import */ var jquery _ _WEBPACK _IMPORTED _MODULE _0 _ _ = _ _webpack _require _ _ ( 0 ) ;
/* harmony import */ var jquery _ _WEBPACK _IMPORTED _MODULE _0 _ _ _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( jquery _ _WEBPACK _IMPORTED _MODULE _0 _ _ ) ;
2020-06-01 11:05:25 +00:00
function _typeof ( obj ) { "@babel/helpers - typeof" ; if ( typeof Symbol === "function" && typeof Symbol . iterator === "symbol" ) { _typeof = function _typeof ( obj ) { return typeof obj ; } ; } else { _typeof = function _typeof ( obj ) { return obj && typeof Symbol === "function" && obj . constructor === Symbol && obj !== Symbol . prototype ? "symbol" : typeof obj ; } ; } return _typeof ( obj ) ; }
2020-04-01 22:52:43 +00:00
function _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a 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 ) ; } }
function _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
2020-06-01 11:05:25 +00:00
var Renderer = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function Renderer ( markup , children , options , callback ) {
_classCallCheck ( this , Renderer ) ;
this . markup = markup ;
this . children = children ;
this . options = options ;
this . callback = callback ;
}
_createClass ( Renderer , [ {
key : "render" ,
value : function render ( $parent ) {
var $node = jquery _ _WEBPACK _IMPORTED _MODULE _0 _ _ _default ( ) ( this . markup ) ;
if ( this . options && this . options . contents ) {
$node . html ( this . options . contents ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
if ( this . options && this . options . className ) {
$node . addClass ( this . options . className ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
if ( this . options && this . options . data ) {
jquery _ _WEBPACK _IMPORTED _MODULE _0 _ _ _default . a . each ( this . options . data , function ( k , v ) {
$node . attr ( 'data-' + k , v ) ;
} ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
if ( this . options && this . options . click ) {
$node . on ( 'click' , this . options . click ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
if ( this . children ) {
var $container = $node . find ( '.note-children-container' ) ;
this . children . forEach ( function ( child ) {
child . render ( $container . length ? $container : $node ) ;
} ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
if ( this . callback ) {
this . callback ( $node , this . options ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
if ( this . options && this . options . callback ) {
this . options . callback ( $node ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
if ( $parent ) {
$parent . append ( $node ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return $node ;
}
} ] ) ;
return Renderer ;
} ( ) ;
/* harmony default export */ _ _webpack _exports _ _ [ "a" ] = ( {
create : function create ( markup , callback ) {
return function ( ) {
var options = _typeof ( arguments [ 1 ] ) === 'object' ? arguments [ 1 ] : arguments [ 0 ] ;
var children = Array . isArray ( arguments [ 0 ] ) ? arguments [ 0 ] : [ ] ;
if ( options && options . children ) {
children = options . children ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return new Renderer ( markup , children , options , callback ) ;
} ;
}
} ) ;
/***/ } ) ,
/***/ 2 :
/***/ ( function ( module , exports ) {
/* WEBPACK VAR INJECTION */ ( function ( _ _webpack _amd _options _ _ ) { /* globals __webpack_amd_options__ */
module . exports = _ _webpack _amd _options _ _ ;
/* WEBPACK VAR INJECTION */ } . call ( this , { } ) )
/***/ } ) ,
/***/ 3 :
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
// EXTERNAL MODULE: external {"root":"jQuery","commonjs2":"jquery","commonjs":"jquery","amd":"jquery"}
var external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _ = _ _webpack _require _ _ ( 0 ) ;
var external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _ ) ;
// CONCATENATED MODULE: ./src/js/base/summernote-en-US.js
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote || {
lang : { }
} ;
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . extend ( external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote . lang , {
'en-US' : {
font : {
bold : 'Bold' ,
italic : 'Italic' ,
underline : 'Underline' ,
clear : 'Remove Font Style' ,
height : 'Line Height' ,
name : 'Font Family' ,
strikethrough : 'Strikethrough' ,
subscript : 'Subscript' ,
superscript : 'Superscript' ,
size : 'Font Size' ,
sizeunit : 'Font Size Unit'
} ,
image : {
image : 'Picture' ,
insert : 'Insert Image' ,
resizeFull : 'Resize full' ,
resizeHalf : 'Resize half' ,
resizeQuarter : 'Resize quarter' ,
resizeNone : 'Original size' ,
floatLeft : 'Float Left' ,
floatRight : 'Float Right' ,
floatNone : 'Remove float' ,
shapeRounded : 'Shape: Rounded' ,
shapeCircle : 'Shape: Circle' ,
shapeThumbnail : 'Shape: Thumbnail' ,
shapeNone : 'Shape: None' ,
dragImageHere : 'Drag image or text here' ,
dropImage : 'Drop image or Text' ,
selectFromFiles : 'Select from files' ,
maximumFileSize : 'Maximum file size' ,
maximumFileSizeError : 'Maximum file size exceeded.' ,
url : 'Image URL' ,
remove : 'Remove Image' ,
original : 'Original'
} ,
video : {
video : 'Video' ,
videoLink : 'Video Link' ,
insert : 'Insert Video' ,
url : 'Video URL' ,
providers : '(YouTube, Vimeo, Vine, Instagram, DailyMotion or Youku)'
} ,
link : {
link : 'Link' ,
insert : 'Insert Link' ,
unlink : 'Unlink' ,
edit : 'Edit' ,
textToDisplay : 'Text to display' ,
url : 'To what URL should this link go?' ,
openInNewWindow : 'Open in new window' ,
useProtocol : 'Use default protocol'
} ,
table : {
table : 'Table' ,
addRowAbove : 'Add row above' ,
addRowBelow : 'Add row below' ,
addColLeft : 'Add column left' ,
addColRight : 'Add column right' ,
delRow : 'Delete row' ,
delCol : 'Delete column' ,
delTable : 'Delete table'
} ,
hr : {
insert : 'Insert Horizontal Rule'
} ,
style : {
style : 'Style' ,
p : 'Normal' ,
blockquote : 'Quote' ,
pre : 'Code' ,
h1 : 'Header 1' ,
h2 : 'Header 2' ,
h3 : 'Header 3' ,
h4 : 'Header 4' ,
h5 : 'Header 5' ,
h6 : 'Header 6'
} ,
lists : {
unordered : 'Unordered list' ,
ordered : 'Ordered list'
} ,
options : {
help : 'Help' ,
fullscreen : 'Full Screen' ,
codeview : 'Code View'
} ,
paragraph : {
paragraph : 'Paragraph' ,
outdent : 'Outdent' ,
indent : 'Indent' ,
left : 'Align left' ,
center : 'Align center' ,
right : 'Align right' ,
justify : 'Justify full'
} ,
color : {
recent : 'Recent Color' ,
more : 'More Color' ,
background : 'Background Color' ,
foreground : 'Text Color' ,
transparent : 'Transparent' ,
setTransparent : 'Set transparent' ,
reset : 'Reset' ,
resetToDefault : 'Reset to default' ,
cpSelect : 'Select'
} ,
shortcut : {
shortcuts : 'Keyboard shortcuts' ,
close : 'Close' ,
textFormatting : 'Text formatting' ,
action : 'Action' ,
paragraphFormatting : 'Paragraph formatting' ,
documentStyle : 'Document Style' ,
extraKeys : 'Extra keys'
} ,
help : {
2020-06-01 11:05:25 +00:00
'escape' : 'Escape' ,
2020-04-01 22:52:43 +00:00
'insertParagraph' : 'Insert Paragraph' ,
2020-06-01 11:05:25 +00:00
'undo' : 'Undo the last command' ,
'redo' : 'Redo the last command' ,
2020-04-01 22:52:43 +00:00
'tab' : 'Tab' ,
'untab' : 'Untab' ,
'bold' : 'Set a bold style' ,
'italic' : 'Set a italic style' ,
'underline' : 'Set a underline style' ,
'strikethrough' : 'Set a strikethrough style' ,
'removeFormat' : 'Clean a style' ,
'justifyLeft' : 'Set left align' ,
'justifyCenter' : 'Set center align' ,
'justifyRight' : 'Set right align' ,
'justifyFull' : 'Set full align' ,
'insertUnorderedList' : 'Toggle unordered list' ,
'insertOrderedList' : 'Toggle ordered list' ,
'outdent' : 'Outdent on current paragraph' ,
'indent' : 'Indent on current paragraph' ,
'formatPara' : 'Change current block\'s format as a paragraph(P tag)' ,
'formatH1' : 'Change current block\'s format as H1' ,
'formatH2' : 'Change current block\'s format as H2' ,
'formatH3' : 'Change current block\'s format as H3' ,
'formatH4' : 'Change current block\'s format as H4' ,
'formatH5' : 'Change current block\'s format as H5' ,
'formatH6' : 'Change current block\'s format as H6' ,
'insertHorizontalRule' : 'Insert horizontal rule' ,
'linkDialog.show' : 'Show Link Dialog'
} ,
history : {
undo : 'Undo' ,
redo : 'Redo'
} ,
specialChar : {
specialChar : 'SPECIAL CHARACTERS' ,
select : 'Select Special characters'
} ,
output : {
noSelection : 'No Selection Made!'
}
}
} ) ;
// CONCATENATED MODULE: ./src/js/base/core/env.js
var isSupportAmd = typeof define === 'function' && _ _webpack _require _ _ ( 2 ) ; // eslint-disable-line
/ * *
* returns whether font is installed or not .
*
* @ param { String } fontName
* @ return { Boolean }
* /
var genericFontFamilies = [ 'sans-serif' , 'serif' , 'monospace' , 'cursive' , 'fantasy' ] ;
function validFontName ( fontName ) {
return external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . inArray ( fontName . toLowerCase ( ) , genericFontFamilies ) === - 1 ? "'" . concat ( fontName , "'" ) : fontName ;
}
function env _isFontInstalled ( fontName ) {
var testFontName = fontName === 'Comic Sans MS' ? 'Courier New' : 'Comic Sans MS' ;
var testText = 'mmmmmmmmmmwwwww' ;
var testSize = '200px' ;
var canvas = document . createElement ( 'canvas' ) ;
var context = canvas . getContext ( '2d' ) ;
context . font = testSize + " '" + testFontName + "'" ;
var originalWidth = context . measureText ( testText ) . width ;
context . font = testSize + ' ' + validFontName ( fontName ) + ', "' + testFontName + '"' ;
var width = context . measureText ( testText ) . width ;
return originalWidth !== width ;
}
var userAgent = navigator . userAgent ;
var isMSIE = /MSIE|Trident/i . test ( userAgent ) ;
var browserVersion ;
if ( isMSIE ) {
var matches = /MSIE (\d+[.]\d+)/ . exec ( userAgent ) ;
if ( matches ) {
browserVersion = parseFloat ( matches [ 1 ] ) ;
}
matches = /Trident\/.*rv:([0-9]{1,}[.0-9]{0,})/ . exec ( userAgent ) ;
if ( matches ) {
browserVersion = parseFloat ( matches [ 1 ] ) ;
}
}
var isEdge = /Edge\/\d+/ . test ( userAgent ) ;
var isSupportTouch = 'ontouchstart' in window || navigator . MaxTouchPoints > 0 || navigator . msMaxTouchPoints > 0 ; // [workaround] IE doesn't have input events for contentEditable
// - see: https://goo.gl/4bfIvA
var inputEventName = isMSIE ? 'DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted' : 'input' ;
/ * *
* @ class core . env
*
* Object which check platform and agent
*
* @ singleton
* @ alternateClassName env
* /
/* harmony default export */ var env = ( {
isMac : navigator . appVersion . indexOf ( 'Mac' ) > - 1 ,
isMSIE : isMSIE ,
isEdge : isEdge ,
isFF : ! isEdge && /firefox/i . test ( userAgent ) ,
isPhantom : /PhantomJS/i . test ( userAgent ) ,
isWebkit : ! isEdge && /webkit/i . test ( userAgent ) ,
isChrome : ! isEdge && /chrome/i . test ( userAgent ) ,
isSafari : ! isEdge && /safari/i . test ( userAgent ) && ! /chrome/i . test ( userAgent ) ,
browserVersion : browserVersion ,
jqueryVersion : parseFloat ( external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . fn . jquery ) ,
isSupportAmd : isSupportAmd ,
isSupportTouch : isSupportTouch ,
isFontInstalled : env _isFontInstalled ,
isW3CRangeSupport : ! ! document . createRange ,
inputEventName : inputEventName ,
genericFontFamilies : genericFontFamilies ,
validFontName : validFontName
} ) ;
// CONCATENATED MODULE: ./src/js/base/core/func.js
/ * *
* @ class core . func
*
* func utils ( for high - order func ' s arg )
*
* @ singleton
* @ alternateClassName func
* /
function eq ( itemA ) {
return function ( itemB ) {
return itemA === itemB ;
2019-06-10 15:38:54 +00:00
} ;
2020-04-01 22:52:43 +00:00
}
function eq2 ( itemA , itemB ) {
return itemA === itemB ;
}
function peq2 ( propName ) {
return function ( itemA , itemB ) {
return itemA [ propName ] === itemB [ propName ] ;
2019-06-10 15:38:54 +00:00
} ;
2020-04-01 22:52:43 +00:00
}
function ok ( ) {
return true ;
}
function fail ( ) {
return false ;
}
function not ( f ) {
return function ( ) {
return ! f . apply ( f , arguments ) ;
2019-06-10 15:38:54 +00:00
} ;
2020-04-01 22:52:43 +00:00
}
function and ( fA , fB ) {
return function ( item ) {
return fA ( item ) && fB ( item ) ;
2019-06-10 15:38:54 +00:00
} ;
2020-04-01 22:52:43 +00:00
}
function func _self ( a ) {
return a ;
}
function func _invoke ( obj , method ) {
return function ( ) {
return obj [ method ] . apply ( obj , arguments ) ;
2019-06-10 15:38:54 +00:00
} ;
2020-04-01 22:52:43 +00:00
}
var idCounter = 0 ;
/ * *
* reset globally - unique id
*
* /
function resetUniqueId ( ) {
idCounter = 0 ;
}
/ * *
* generate a globally - unique id
*
* @ param { String } [ prefix ]
* /
function uniqueId ( prefix ) {
var id = ++ idCounter + '' ;
return prefix ? prefix + id : id ;
}
/ * *
* returns bnd ( bounds ) from rect
*
* - IE Compatibility Issue : http : //goo.gl/sRLOAo
* - Scroll Issue : http : //goo.gl/sNjUc
*
* @ param { Rect } rect
* @ return { Object } bounds
* @ return { Number } bounds . top
* @ return { Number } bounds . left
* @ return { Number } bounds . width
* @ return { Number } bounds . height
* /
2019-06-10 15:38:54 +00:00
2020-04-01 22:52:43 +00:00
function rect2bnd ( rect ) {
var $document = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( document ) ;
return {
top : rect . top + $document . scrollTop ( ) ,
left : rect . left + $document . scrollLeft ( ) ,
width : rect . right - rect . left ,
height : rect . bottom - rect . top
2019-06-10 15:38:54 +00:00
} ;
2020-04-01 22:52:43 +00:00
}
/ * *
* returns a copy of the object where the keys have become the values and the values the keys .
* @ param { Object } obj
* @ return { Object }
* /
2019-06-10 15:38:54 +00:00
2020-04-01 22:52:43 +00:00
function invertObject ( obj ) {
var inverted = { } ;
for ( var key in obj ) {
if ( Object . prototype . hasOwnProperty . call ( obj , key ) ) {
inverted [ obj [ key ] ] = key ;
}
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return inverted ;
}
/ * *
* @ param { String } namespace
* @ param { String } [ prefix ]
* @ return { String }
* /
function namespaceToCamel ( namespace , prefix ) {
prefix = prefix || '' ;
return prefix + namespace . split ( '.' ) . map ( function ( name ) {
return name . substring ( 0 , 1 ) . toUpperCase ( ) + name . substring ( 1 ) ;
} ) . join ( '' ) ;
}
/ * *
* Returns a function , that , as long as it continues to be invoked , will not
* be triggered . The function will be called after it stops being called for
* N milliseconds . If ` immediate ` is passed , trigger the function on the
* leading edge , instead of the trailing .
* @ param { Function } func
* @ param { Number } wait
* @ param { Boolean } immediate
* @ return { Function }
* /
function debounce ( func , wait , immediate ) {
var timeout ;
return function ( ) {
var context = this ;
var args = arguments ;
var later = function later ( ) {
timeout = null ;
if ( ! immediate ) {
func . apply ( context , args ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
} ;
var callNow = immediate && ! timeout ;
clearTimeout ( timeout ) ;
timeout = setTimeout ( later , wait ) ;
if ( callNow ) {
func . apply ( context , args ) ;
}
2019-06-10 15:38:54 +00:00
} ;
2020-04-01 22:52:43 +00:00
}
/ * *
*
* @ param { String } url
* @ return { Boolean }
* /
2019-06-10 15:38:54 +00:00
2020-04-01 22:52:43 +00:00
function isValidUrl ( url ) {
var expression = /[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gi ;
return expression . test ( url ) ;
}
/* harmony default export */ var func = ( {
eq : eq ,
eq2 : eq2 ,
peq2 : peq2 ,
ok : ok ,
fail : fail ,
self : func _self ,
not : not ,
and : and ,
invoke : func _invoke ,
resetUniqueId : resetUniqueId ,
uniqueId : uniqueId ,
rect2bnd : rect2bnd ,
invertObject : invertObject ,
namespaceToCamel : namespaceToCamel ,
debounce : debounce ,
isValidUrl : isValidUrl
} ) ;
// CONCATENATED MODULE: ./src/js/base/core/lists.js
/ * *
* returns the first item of an array .
*
* @ param { Array } array
* /
function lists _head ( array ) {
return array [ 0 ] ;
}
/ * *
* returns the last item of an array .
*
* @ param { Array } array
* /
function lists _last ( array ) {
return array [ array . length - 1 ] ;
}
/ * *
* returns everything but the last entry of the array .
*
* @ param { Array } array
* /
function initial ( array ) {
return array . slice ( 0 , array . length - 1 ) ;
}
/ * *
* returns the rest of the items in an array .
*
* @ param { Array } array
* /
function tail ( array ) {
return array . slice ( 1 ) ;
}
/ * *
* returns item of array
* /
function find ( array , pred ) {
for ( var idx = 0 , len = array . length ; idx < len ; idx ++ ) {
var item = array [ idx ] ;
if ( pred ( item ) ) {
return item ;
}
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
/ * *
* returns true if all of the values in the array pass the predicate truth test .
* /
function lists _all ( array , pred ) {
for ( var idx = 0 , len = array . length ; idx < len ; idx ++ ) {
if ( ! pred ( array [ idx ] ) ) {
2019-06-10 15:38:54 +00:00
return false ;
2020-04-01 22:52:43 +00:00
}
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return true ;
}
/ * *
* returns true if the value is present in the list .
* /
function contains ( array , item ) {
if ( array && array . length && item ) {
if ( array . indexOf ) {
return array . indexOf ( item ) !== - 1 ;
} else if ( array . contains ) {
// `DOMTokenList` doesn't implement `.indexOf`, but it implements `.contains`
return array . contains ( item ) ;
}
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return false ;
}
/ * *
* get sum from a list
*
* @ param { Array } array - array
* @ param { Function } fn - iterator
* /
function sum ( array , fn ) {
fn = fn || func . self ;
return array . reduce ( function ( memo , v ) {
return memo + fn ( v ) ;
} , 0 ) ;
}
/ * *
* returns a copy of the collection with array type .
* @ param { Collection } collection - collection eg ) node . childNodes , ...
* /
function from ( collection ) {
var result = [ ] ;
var length = collection . length ;
var idx = - 1 ;
while ( ++ idx < length ) {
result [ idx ] = collection [ idx ] ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return result ;
}
/ * *
* returns whether list is empty or not
* /
function lists _isEmpty ( array ) {
return ! array || ! array . length ;
}
/ * *
* cluster elements by predicate function .
*
* @ param { Array } array - array
* @ param { Function } fn - predicate function for cluster rule
* @ param { Array [ ] }
* /
function clusterBy ( array , fn ) {
if ( ! array . length ) {
return [ ] ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
var aTail = tail ( array ) ;
return aTail . reduce ( function ( memo , v ) {
var aLast = lists _last ( memo ) ;
if ( fn ( lists _last ( aLast ) , v ) ) {
aLast [ aLast . length ] = v ;
} else {
memo [ memo . length ] = [ v ] ;
}
return memo ;
} , [ [ lists _head ( array ) ] ] ) ;
}
/ * *
* returns a copy of the array with all false values removed
*
* @ param { Array } array - array
* @ param { Function } fn - predicate function for cluster rule
* /
function compact ( array ) {
var aResult = [ ] ;
for ( var idx = 0 , len = array . length ; idx < len ; idx ++ ) {
if ( array [ idx ] ) {
aResult . push ( array [ idx ] ) ;
}
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return aResult ;
}
/ * *
* produces a duplicate - free version of the array
*
* @ param { Array } array
* /
function unique ( array ) {
var results = [ ] ;
for ( var idx = 0 , len = array . length ; idx < len ; idx ++ ) {
if ( ! contains ( results , array [ idx ] ) ) {
results . push ( array [ idx ] ) ;
}
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return results ;
}
/ * *
* returns next item .
* @ param { Array } array
* /
function lists _next ( array , item ) {
if ( array && array . length && item ) {
var idx = array . indexOf ( item ) ;
return idx === - 1 ? null : array [ idx + 1 ] ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return null ;
}
/ * *
* returns prev item .
* @ param { Array } array
* /
function prev ( array , item ) {
if ( array && array . length && item ) {
var idx = array . indexOf ( item ) ;
return idx === - 1 ? null : array [ idx - 1 ] ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return null ;
}
/ * *
* @ class core . list
*
* list utils
*
* @ singleton
* @ alternateClassName list
* /
/* harmony default export */ var lists = ( {
head : lists _head ,
last : lists _last ,
initial : initial ,
tail : tail ,
prev : prev ,
next : lists _next ,
find : find ,
contains : contains ,
all : lists _all ,
sum : sum ,
from : from ,
isEmpty : lists _isEmpty ,
clusterBy : clusterBy ,
compact : compact ,
unique : unique
} ) ;
// CONCATENATED MODULE: ./src/js/base/core/dom.js
var NBSP _CHAR = String . fromCharCode ( 160 ) ;
var ZERO _WIDTH _NBSP _CHAR = "\uFEFF" ;
/ * *
* @ method isEditable
*
* returns whether node is ` note-editable ` or not .
*
* @ param { Node } node
* @ return { Boolean }
* /
function isEditable ( node ) {
return node && external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( node ) . hasClass ( 'note-editable' ) ;
}
/ * *
* @ method isControlSizing
*
* returns whether node is ` note-control-sizing ` or not .
*
* @ param { Node } node
* @ return { Boolean }
* /
function isControlSizing ( node ) {
return node && external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( node ) . hasClass ( 'note-control-sizing' ) ;
}
/ * *
* @ method makePredByNodeName
*
* returns predicate which judge whether nodeName is same
*
* @ param { String } nodeName
* @ return { Function }
* /
function makePredByNodeName ( nodeName ) {
nodeName = nodeName . toUpperCase ( ) ;
return function ( node ) {
return node && node . nodeName . toUpperCase ( ) === nodeName ;
2019-06-10 15:38:54 +00:00
} ;
2020-04-01 22:52:43 +00:00
}
/ * *
* @ method isText
*
*
*
* @ param { Node } node
* @ return { Boolean } true if node ' s type is text ( 3 )
* /
2019-06-10 15:38:54 +00:00
2020-04-01 22:52:43 +00:00
function isText ( node ) {
return node && node . nodeType === 3 ;
}
/ * *
* @ method isElement
*
*
*
* @ param { Node } node
* @ return { Boolean } true if node ' s type is element ( 1 )
* /
function isElement ( node ) {
return node && node . nodeType === 1 ;
}
/ * *
* ex ) br , col , embed , hr , img , input , ...
* @ see http : //www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements
* /
function isVoid ( node ) {
return node && /^BR|^IMG|^HR|^IFRAME|^BUTTON|^INPUT|^AUDIO|^VIDEO|^EMBED/ . test ( node . nodeName . toUpperCase ( ) ) ;
}
function isPara ( node ) {
if ( isEditable ( node ) ) {
return false ;
} // Chrome(v31.0), FF(v25.0.1) use DIV for paragraph
return node && /^DIV|^P|^LI|^H[1-7]/ . test ( node . nodeName . toUpperCase ( ) ) ;
}
function isHeading ( node ) {
return node && /^H[1-7]/ . test ( node . nodeName . toUpperCase ( ) ) ;
}
var isPre = makePredByNodeName ( 'PRE' ) ;
var isLi = makePredByNodeName ( 'LI' ) ;
function isPurePara ( node ) {
return isPara ( node ) && ! isLi ( node ) ;
}
var isTable = makePredByNodeName ( 'TABLE' ) ;
var isData = makePredByNodeName ( 'DATA' ) ;
function dom _isInline ( node ) {
return ! isBodyContainer ( node ) && ! isList ( node ) && ! isHr ( node ) && ! isPara ( node ) && ! isTable ( node ) && ! isBlockquote ( node ) && ! isData ( node ) ;
}
function isList ( node ) {
return node && /^UL|^OL/ . test ( node . nodeName . toUpperCase ( ) ) ;
}
var isHr = makePredByNodeName ( 'HR' ) ;
function dom _isCell ( node ) {
return node && /^TD|^TH/ . test ( node . nodeName . toUpperCase ( ) ) ;
}
var isBlockquote = makePredByNodeName ( 'BLOCKQUOTE' ) ;
function isBodyContainer ( node ) {
return dom _isCell ( node ) || isBlockquote ( node ) || isEditable ( node ) ;
}
var isAnchor = makePredByNodeName ( 'A' ) ;
function isParaInline ( node ) {
return dom _isInline ( node ) && ! ! dom _ancestor ( node , isPara ) ;
}
function isBodyInline ( node ) {
return dom _isInline ( node ) && ! dom _ancestor ( node , isPara ) ;
}
var isBody = makePredByNodeName ( 'BODY' ) ;
/ * *
* returns whether nodeB is closest sibling of nodeA
*
* @ param { Node } nodeA
* @ param { Node } nodeB
* @ return { Boolean }
* /
function isClosestSibling ( nodeA , nodeB ) {
return nodeA . nextSibling === nodeB || nodeA . previousSibling === nodeB ;
}
/ * *
* returns array of closest siblings with node
*
* @ param { Node } node
* @ param { function } [ pred ] - predicate function
* @ return { Node [ ] }
* /
function withClosestSiblings ( node , pred ) {
pred = pred || func . ok ;
var siblings = [ ] ;
if ( node . previousSibling && pred ( node . previousSibling ) ) {
siblings . push ( node . previousSibling ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
siblings . push ( node ) ;
if ( node . nextSibling && pred ( node . nextSibling ) ) {
siblings . push ( node . nextSibling ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return siblings ;
}
/ * *
* blank HTML for cursor position
* - [ workaround ] old IE only works with & nbsp ;
* - [ workaround ] IE11 and other browser works with bogus br
* /
var blankHTML = env . isMSIE && env . browserVersion < 11 ? ' ' : '<br>' ;
/ * *
* @ method nodeLength
*
* returns # text 's text size or element' s childNodes size
*
* @ param { Node } node
* /
function nodeLength ( node ) {
if ( isText ( node ) ) {
return node . nodeValue . length ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
if ( node ) {
return node . childNodes . length ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return 0 ;
}
/ * *
* returns whether deepest child node is empty or not .
*
* @ param { Node } node
* @ return { Boolean }
* /
function deepestChildIsEmpty ( node ) {
do {
if ( node . firstElementChild === null || node . firstElementChild . innerHTML === '' ) break ;
} while ( node = node . firstElementChild ) ;
return dom _isEmpty ( node ) ;
}
/ * *
* returns whether node is empty or not .
*
* @ param { Node } node
* @ return { Boolean }
* /
function dom _isEmpty ( node ) {
var len = nodeLength ( node ) ;
if ( len === 0 ) {
return true ;
} else if ( ! isText ( node ) && len === 1 && node . innerHTML === blankHTML ) {
// ex) <p><br></p>, <span><br></span>
return true ;
} else if ( lists . all ( node . childNodes , isText ) && node . innerHTML === '' ) {
// ex) <p></p>, <span></span>
return true ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return false ;
}
/ * *
* padding blankHTML if node is empty ( for cursor position )
* /
function paddingBlankHTML ( node ) {
if ( ! isVoid ( node ) && ! nodeLength ( node ) ) {
node . innerHTML = blankHTML ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
/ * *
* find nearest ancestor predicate hit
*
* @ param { Node } node
* @ param { Function } pred - predicate function
* /
function dom _ancestor ( node , pred ) {
while ( node ) {
if ( pred ( node ) ) {
return node ;
}
if ( isEditable ( node ) ) {
break ;
}
node = node . parentNode ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return null ;
}
/ * *
* find nearest ancestor only single child blood line and predicate hit
*
* @ param { Node } node
* @ param { Function } pred - predicate function
* /
function singleChildAncestor ( node , pred ) {
node = node . parentNode ;
while ( node ) {
if ( nodeLength ( node ) !== 1 ) {
break ;
}
if ( pred ( node ) ) {
return node ;
}
if ( isEditable ( node ) ) {
break ;
}
node = node . parentNode ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return null ;
}
/ * *
* returns new array of ancestor nodes ( until predicate hit ) .
*
* @ param { Node } node
* @ param { Function } [ optional ] pred - predicate function
* /
function listAncestor ( node , pred ) {
pred = pred || func . fail ;
var ancestors = [ ] ;
dom _ancestor ( node , function ( el ) {
if ( ! isEditable ( el ) ) {
ancestors . push ( el ) ;
}
return pred ( el ) ;
} ) ;
return ancestors ;
}
/ * *
* find farthest ancestor predicate hit
* /
function lastAncestor ( node , pred ) {
var ancestors = listAncestor ( node ) ;
return lists . last ( ancestors . filter ( pred ) ) ;
}
/ * *
* returns common ancestor node between two nodes .
*
* @ param { Node } nodeA
* @ param { Node } nodeB
* /
function dom _commonAncestor ( nodeA , nodeB ) {
var ancestors = listAncestor ( nodeA ) ;
for ( var n = nodeB ; n ; n = n . parentNode ) {
if ( ancestors . indexOf ( n ) > - 1 ) return n ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return null ; // difference document area
}
/ * *
* listing all previous siblings ( until predicate hit ) .
*
* @ param { Node } node
* @ param { Function } [ optional ] pred - predicate function
* /
function listPrev ( node , pred ) {
pred = pred || func . fail ;
var nodes = [ ] ;
while ( node ) {
if ( pred ( node ) ) {
break ;
}
nodes . push ( node ) ;
node = node . previousSibling ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return nodes ;
}
/ * *
* listing next siblings ( until predicate hit ) .
*
* @ param { Node } node
* @ param { Function } [ pred ] - predicate function
* /
function listNext ( node , pred ) {
pred = pred || func . fail ;
var nodes = [ ] ;
while ( node ) {
if ( pred ( node ) ) {
break ;
}
nodes . push ( node ) ;
node = node . nextSibling ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return nodes ;
}
/ * *
* listing descendant nodes
*
* @ param { Node } node
* @ param { Function } [ pred ] - predicate function
* /
function listDescendant ( node , pred ) {
var descendants = [ ] ;
pred = pred || func . ok ; // start DFS(depth first search) with node
( function fnWalk ( current ) {
if ( node !== current && pred ( current ) ) {
descendants . push ( current ) ;
}
for ( var idx = 0 , len = current . childNodes . length ; idx < len ; idx ++ ) {
fnWalk ( current . childNodes [ idx ] ) ;
}
} ) ( node ) ;
return descendants ;
}
/ * *
* wrap node with new tag .
*
* @ param { Node } node
* @ param { Node } tagName of wrapper
* @ return { Node } - wrapper
* /
function wrap ( node , wrapperName ) {
var parent = node . parentNode ;
var wrapper = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<' + wrapperName + '>' ) [ 0 ] ;
parent . insertBefore ( wrapper , node ) ;
wrapper . appendChild ( node ) ;
return wrapper ;
}
/ * *
* insert node after preceding
*
* @ param { Node } node
* @ param { Node } preceding - predicate function
* /
function insertAfter ( node , preceding ) {
var next = preceding . nextSibling ;
var parent = preceding . parentNode ;
if ( next ) {
parent . insertBefore ( node , next ) ;
} else {
parent . appendChild ( node ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return node ;
}
/ * *
* append elements .
*
* @ param { Node } node
* @ param { Collection } aChild
* /
function appendChildNodes ( node , aChild ) {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . each ( aChild , function ( idx , child ) {
node . appendChild ( child ) ;
} ) ;
return node ;
}
/ * *
* returns whether boundaryPoint is left edge or not .
*
* @ param { BoundaryPoint } point
* @ return { Boolean }
* /
function isLeftEdgePoint ( point ) {
return point . offset === 0 ;
}
/ * *
* returns whether boundaryPoint is right edge or not .
*
* @ param { BoundaryPoint } point
* @ return { Boolean }
* /
function isRightEdgePoint ( point ) {
return point . offset === nodeLength ( point . node ) ;
}
/ * *
* returns whether boundaryPoint is edge or not .
*
* @ param { BoundaryPoint } point
* @ return { Boolean }
* /
function isEdgePoint ( point ) {
return isLeftEdgePoint ( point ) || isRightEdgePoint ( point ) ;
}
/ * *
* returns whether node is left edge of ancestor or not .
*
* @ param { Node } node
* @ param { Node } ancestor
* @ return { Boolean }
* /
function dom _isLeftEdgeOf ( node , ancestor ) {
while ( node && node !== ancestor ) {
if ( dom _position ( node ) !== 0 ) {
return false ;
}
node = node . parentNode ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return true ;
}
/ * *
* returns whether node is right edge of ancestor or not .
*
* @ param { Node } node
* @ param { Node } ancestor
* @ return { Boolean }
* /
function isRightEdgeOf ( node , ancestor ) {
if ( ! ancestor ) {
return false ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
while ( node && node !== ancestor ) {
if ( dom _position ( node ) !== nodeLength ( node . parentNode ) - 1 ) {
return false ;
}
node = node . parentNode ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return true ;
}
/ * *
* returns whether point is left edge of ancestor or not .
* @ param { BoundaryPoint } point
* @ param { Node } ancestor
* @ return { Boolean }
* /
function isLeftEdgePointOf ( point , ancestor ) {
return isLeftEdgePoint ( point ) && dom _isLeftEdgeOf ( point . node , ancestor ) ;
}
/ * *
* returns whether point is right edge of ancestor or not .
* @ param { BoundaryPoint } point
* @ param { Node } ancestor
* @ return { Boolean }
* /
function isRightEdgePointOf ( point , ancestor ) {
return isRightEdgePoint ( point ) && isRightEdgeOf ( point . node , ancestor ) ;
}
/ * *
* returns offset from parent .
*
* @ param { Node } node
* /
function dom _position ( node ) {
var offset = 0 ;
while ( node = node . previousSibling ) {
offset += 1 ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return offset ;
}
function hasChildren ( node ) {
return ! ! ( node && node . childNodes && node . childNodes . length ) ;
}
/ * *
* returns previous boundaryPoint
*
* @ param { BoundaryPoint } point
* @ param { Boolean } isSkipInnerOffset
* @ return { BoundaryPoint }
* /
function dom _prevPoint ( point , isSkipInnerOffset ) {
var node ;
var offset ;
if ( point . offset === 0 ) {
if ( isEditable ( point . node ) ) {
return null ;
}
node = point . node . parentNode ;
offset = dom _position ( point . node ) ;
} else if ( hasChildren ( point . node ) ) {
node = point . node . childNodes [ point . offset - 1 ] ;
offset = nodeLength ( node ) ;
} else {
node = point . node ;
offset = isSkipInnerOffset ? 0 : point . offset - 1 ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return {
node : node ,
offset : offset
} ;
}
/ * *
* returns next boundaryPoint
*
* @ param { BoundaryPoint } point
* @ param { Boolean } isSkipInnerOffset
* @ return { BoundaryPoint }
* /
function dom _nextPoint ( point , isSkipInnerOffset ) {
var node , offset ;
2020-06-01 11:05:25 +00:00
if ( nodeLength ( point . node ) === point . offset ) {
if ( isEditable ( point . node ) ) {
return null ;
}
var nextTextNode = getNextTextNode ( point . node ) ;
if ( nextTextNode ) {
node = nextTextNode ;
offset = 0 ;
} else {
node = point . node . parentNode ;
offset = dom _position ( point . node ) + 1 ;
}
} else if ( hasChildren ( point . node ) ) {
node = point . node . childNodes [ point . offset ] ;
offset = 0 ;
} else {
node = point . node ;
offset = isSkipInnerOffset ? nodeLength ( point . node ) : point . offset + 1 ;
}
return {
node : node ,
offset : offset
} ;
}
/ * *
* returns next boundaryPoint with empty node
*
* @ param { BoundaryPoint } point
* @ param { Boolean } isSkipInnerOffset
* @ return { BoundaryPoint }
* /
function nextPointWithEmptyNode ( point , isSkipInnerOffset ) {
var node , offset ; // if node is empty string node, return current node's sibling.
2020-04-01 22:52:43 +00:00
if ( dom _isEmpty ( point . node ) ) {
2020-06-01 11:05:25 +00:00
node = point . node . nextSibling ;
offset = 0 ;
return {
node : node ,
offset : offset
} ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
if ( nodeLength ( point . node ) === point . offset ) {
if ( isEditable ( point . node ) ) {
return null ;
}
2020-06-01 11:05:25 +00:00
var nextTextNode = getNextTextNode ( point . node ) ;
if ( nextTextNode ) {
node = nextTextNode ;
offset = 0 ;
} else {
node = point . node . parentNode ;
offset = dom _position ( point . node ) + 1 ;
} // if next node is editable, return current node's sibling node.
if ( isEditable ( node ) ) {
node = point . node . nextSibling ;
offset = 0 ;
}
2020-04-01 22:52:43 +00:00
} else if ( hasChildren ( point . node ) ) {
node = point . node . childNodes [ point . offset ] ;
offset = 0 ;
if ( dom _isEmpty ( node ) ) {
return null ;
}
} else {
node = point . node ;
offset = isSkipInnerOffset ? nodeLength ( point . node ) : point . offset + 1 ;
if ( dom _isEmpty ( node ) ) {
return null ;
}
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return {
node : node ,
offset : offset
} ;
}
2020-06-01 11:05:25 +00:00
/ *
* returns the next Text node index or 0 if not found .
* /
function getNextTextNode ( actual ) {
if ( ! actual . nextSibling ) return undefined ;
if ( actual . parent !== actual . nextSibling . parent ) return undefined ;
if ( isText ( actual . nextSibling ) ) return actual . nextSibling ;
return getNextTextNode ( actual . nextSibling ) ;
}
2020-04-01 22:52:43 +00:00
/ * *
* returns whether pointA and pointB is same or not .
*
* @ param { BoundaryPoint } pointA
* @ param { BoundaryPoint } pointB
* @ return { Boolean }
* /
function isSamePoint ( pointA , pointB ) {
return pointA . node === pointB . node && pointA . offset === pointB . offset ;
}
/ * *
* returns whether point is visible ( can set cursor ) or not .
*
* @ param { BoundaryPoint } point
* @ return { Boolean }
* /
function isVisiblePoint ( point ) {
if ( isText ( point . node ) || ! hasChildren ( point . node ) || dom _isEmpty ( point . node ) ) {
return true ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
var leftNode = point . node . childNodes [ point . offset - 1 ] ;
var rightNode = point . node . childNodes [ point . offset ] ;
if ( ( ! leftNode || isVoid ( leftNode ) ) && ( ! rightNode || isVoid ( rightNode ) ) ) {
return true ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return false ;
}
/ * *
* @ method prevPointUtil
*
* @ param { BoundaryPoint } point
* @ param { Function } pred
* @ return { BoundaryPoint }
* /
function prevPointUntil ( point , pred ) {
while ( point ) {
if ( pred ( point ) ) {
return point ;
}
point = dom _prevPoint ( point ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return null ;
}
/ * *
* @ method nextPointUntil
*
* @ param { BoundaryPoint } point
* @ param { Function } pred
* @ return { BoundaryPoint }
* /
function nextPointUntil ( point , pred ) {
while ( point ) {
if ( pred ( point ) ) {
return point ;
}
point = dom _nextPoint ( point ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return null ;
}
/ * *
* returns whether point has character or not .
*
* @ param { Point } point
* @ return { Boolean }
* /
function isCharPoint ( point ) {
if ( ! isText ( point . node ) ) {
return false ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
var ch = point . node . nodeValue . charAt ( point . offset - 1 ) ;
return ch && ch !== ' ' && ch !== NBSP _CHAR ;
}
/ * *
* returns whether point has space or not .
*
* @ param { Point } point
* @ return { Boolean }
* /
function isSpacePoint ( point ) {
if ( ! isText ( point . node ) ) {
return false ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
var ch = point . node . nodeValue . charAt ( point . offset - 1 ) ;
return ch === ' ' || ch === NBSP _CHAR ;
}
/ * *
* @ method walkPoint
*
* @ param { BoundaryPoint } startPoint
* @ param { BoundaryPoint } endPoint
* @ param { Function } handler
* @ param { Boolean } isSkipInnerOffset
* /
function walkPoint ( startPoint , endPoint , handler , isSkipInnerOffset ) {
var point = startPoint ;
while ( point ) {
handler ( point ) ;
if ( isSamePoint ( point , endPoint ) ) {
break ;
}
var isSkipOffset = isSkipInnerOffset && startPoint . node !== point . node && endPoint . node !== point . node ;
2020-06-01 11:05:25 +00:00
point = nextPointWithEmptyNode ( point , isSkipOffset ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
/ * *
* @ method makeOffsetPath
*
* return offsetPath ( array of offset ) from ancestor
*
* @ param { Node } ancestor - ancestor node
* @ param { Node } node
* /
function makeOffsetPath ( ancestor , node ) {
var ancestors = listAncestor ( node , func . eq ( ancestor ) ) ;
return ancestors . map ( dom _position ) . reverse ( ) ;
}
/ * *
* @ method fromOffsetPath
*
* return element from offsetPath ( array of offset )
*
* @ param { Node } ancestor - ancestor node
* @ param { array } offsets - offsetPath
* /
function fromOffsetPath ( ancestor , offsets ) {
var current = ancestor ;
for ( var i = 0 , len = offsets . length ; i < len ; i ++ ) {
if ( current . childNodes . length <= offsets [ i ] ) {
current = current . childNodes [ current . childNodes . length - 1 ] ;
} else {
current = current . childNodes [ offsets [ i ] ] ;
}
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return current ;
}
/ * *
* @ method splitNode
*
* split element or # text
*
* @ param { BoundaryPoint } point
* @ param { Object } [ options ]
* @ param { Boolean } [ options . isSkipPaddingBlankHTML ] - default : false
* @ param { Boolean } [ options . isNotSplitEdgePoint ] - default : false
* @ param { Boolean } [ options . isDiscardEmptySplits ] - default : false
* @ return { Node } right node of boundaryPoint
* /
function splitNode ( point , options ) {
var isSkipPaddingBlankHTML = options && options . isSkipPaddingBlankHTML ;
var isNotSplitEdgePoint = options && options . isNotSplitEdgePoint ;
var isDiscardEmptySplits = options && options . isDiscardEmptySplits ;
if ( isDiscardEmptySplits ) {
isSkipPaddingBlankHTML = true ;
} // edge case
if ( isEdgePoint ( point ) && ( isText ( point . node ) || isNotSplitEdgePoint ) ) {
if ( isLeftEdgePoint ( point ) ) {
return point . node ;
} else if ( isRightEdgePoint ( point ) ) {
return point . node . nextSibling ;
}
} // split #text
if ( isText ( point . node ) ) {
return point . node . splitText ( point . offset ) ;
} else {
var childNode = point . node . childNodes [ point . offset ] ;
var clone = insertAfter ( point . node . cloneNode ( false ) , point . node ) ;
appendChildNodes ( clone , listNext ( childNode ) ) ;
if ( ! isSkipPaddingBlankHTML ) {
paddingBlankHTML ( point . node ) ;
paddingBlankHTML ( clone ) ;
}
if ( isDiscardEmptySplits ) {
if ( dom _isEmpty ( point . node ) ) {
remove ( point . node ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
if ( dom _isEmpty ( clone ) ) {
remove ( clone ) ;
return point . node . nextSibling ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
return clone ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
/ * *
* @ method splitTree
*
* split tree by point
*
* @ param { Node } root - split root
* @ param { BoundaryPoint } point
* @ param { Object } [ options ]
* @ param { Boolean } [ options . isSkipPaddingBlankHTML ] - default : false
* @ param { Boolean } [ options . isNotSplitEdgePoint ] - default : false
* @ return { Node } right node of boundaryPoint
* /
function splitTree ( root , point , options ) {
// ex) [#text, <span>, <p>]
var ancestors = listAncestor ( point . node , func . eq ( root ) ) ;
if ( ! ancestors . length ) {
return null ;
} else if ( ancestors . length === 1 ) {
return splitNode ( point , options ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return ancestors . reduce ( function ( node , parent ) {
if ( node === point . node ) {
node = splitNode ( point , options ) ;
}
return splitNode ( {
node : parent ,
offset : node ? dom _position ( node ) : nodeLength ( parent )
} , options ) ;
} ) ;
}
/ * *
* split point
*
* @ param { Point } point
* @ param { Boolean } isInline
* @ return { Object }
* /
function splitPoint ( point , isInline ) {
// find splitRoot, container
// - inline: splitRoot is a child of paragraph
// - block: splitRoot is a child of bodyContainer
var pred = isInline ? isPara : isBodyContainer ;
var ancestors = listAncestor ( point . node , pred ) ;
var topAncestor = lists . last ( ancestors ) || point . node ;
var splitRoot , container ;
if ( pred ( topAncestor ) ) {
splitRoot = ancestors [ ancestors . length - 2 ] ;
container = topAncestor ;
} else {
splitRoot = topAncestor ;
container = splitRoot . parentNode ;
} // if splitRoot is exists, split with splitTree
var pivot = splitRoot && splitTree ( splitRoot , point , {
isSkipPaddingBlankHTML : isInline ,
isNotSplitEdgePoint : isInline
} ) ; // if container is point.node, find pivot with point.offset
if ( ! pivot && container === point . node ) {
pivot = point . node . childNodes [ point . offset ] ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return {
rightNode : pivot ,
container : container
} ;
}
function dom _create ( nodeName ) {
return document . createElement ( nodeName ) ;
}
function createText ( text ) {
return document . createTextNode ( text ) ;
}
/ * *
* @ method remove
*
* remove node , ( isRemoveChild : remove child or not )
*
* @ param { Node } node
* @ param { Boolean } isRemoveChild
* /
function remove ( node , isRemoveChild ) {
if ( ! node || ! node . parentNode ) {
return ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
if ( node . removeNode ) {
return node . removeNode ( isRemoveChild ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
var parent = node . parentNode ;
if ( ! isRemoveChild ) {
var nodes = [ ] ;
for ( var i = 0 , len = node . childNodes . length ; i < len ; i ++ ) {
nodes . push ( node . childNodes [ i ] ) ;
}
for ( var _i = 0 , _len = nodes . length ; _i < _len ; _i ++ ) {
parent . insertBefore ( nodes [ _i ] , node ) ;
}
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
parent . removeChild ( node ) ;
}
/ * *
* @ method removeWhile
*
* @ param { Node } node
* @ param { Function } pred
* /
function removeWhile ( node , pred ) {
while ( node ) {
if ( isEditable ( node ) || ! pred ( node ) ) {
break ;
}
var parent = node . parentNode ;
remove ( node ) ;
node = parent ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
/ * *
* @ method replace
*
* replace node with provided nodeName
*
* @ param { Node } node
* @ param { String } nodeName
* @ return { Node } - new node
* /
function dom _replace ( node , nodeName ) {
if ( node . nodeName . toUpperCase ( ) === nodeName . toUpperCase ( ) ) {
return node ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
var newNode = dom _create ( nodeName ) ;
if ( node . style . cssText ) {
newNode . style . cssText = node . style . cssText ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
appendChildNodes ( newNode , lists . from ( node . childNodes ) ) ;
insertAfter ( newNode , node ) ;
remove ( node ) ;
return newNode ;
}
var isTextarea = makePredByNodeName ( 'TEXTAREA' ) ;
/ * *
* @ param { jQuery } $node
* @ param { Boolean } [ stripLinebreaks ] - default : false
* /
function dom _value ( $node , stripLinebreaks ) {
var val = isTextarea ( $node [ 0 ] ) ? $node . val ( ) : $node . html ( ) ;
if ( stripLinebreaks ) {
return val . replace ( /[\n\r]/g , '' ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return val ;
}
/ * *
* @ method html
*
* get the HTML contents of node
*
* @ param { jQuery } $node
* @ param { Boolean } [ isNewlineOnBlock ]
* /
function dom _html ( $node , isNewlineOnBlock ) {
var markup = dom _value ( $node ) ;
if ( isNewlineOnBlock ) {
var regexTag = /<(\/?)(\b(?!!)[^>\s]*)(.*?)(\s*\/?>)/g ;
markup = markup . replace ( regexTag , function ( match , endSlash , name ) {
name = name . toUpperCase ( ) ;
var isEndOfInlineContainer = /^DIV|^TD|^TH|^P|^LI|^H[1-7]/ . test ( name ) && ! ! endSlash ;
var isBlockNode = /^BLOCKQUOTE|^TABLE|^TBODY|^TR|^HR|^UL|^OL/ . test ( name ) ;
return match + ( isEndOfInlineContainer || isBlockNode ? '\n' : '' ) ;
} ) ;
markup = markup . trim ( ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return markup ;
}
function posFromPlaceholder ( placeholder ) {
var $placeholder = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( placeholder ) ;
var pos = $placeholder . offset ( ) ;
var height = $placeholder . outerHeight ( true ) ; // include margin
return {
left : pos . left ,
top : pos . top + height
} ;
}
function attachEvents ( $node , events ) {
Object . keys ( events ) . forEach ( function ( key ) {
$node . on ( key , events [ key ] ) ;
} ) ;
}
function detachEvents ( $node , events ) {
Object . keys ( events ) . forEach ( function ( key ) {
$node . off ( key , events [ key ] ) ;
} ) ;
}
/ * *
* @ method isCustomStyleTag
*
* assert if a node contains a "note-styletag" class ,
* which implies that ' s a custom - made style tag node
*
* @ param { Node } an HTML DOM node
* /
function isCustomStyleTag ( node ) {
return node && ! isText ( node ) && lists . contains ( node . classList , 'note-styletag' ) ;
}
/* harmony default export */ var dom = ( {
/** @property {String} NBSP_CHAR */
NBSP _CHAR : NBSP _CHAR ,
/** @property {String} ZERO_WIDTH_NBSP_CHAR */
ZERO _WIDTH _NBSP _CHAR : ZERO _WIDTH _NBSP _CHAR ,
/** @property {String} blank */
blank : blankHTML ,
/** @property {String} emptyPara */
emptyPara : "<p>" . concat ( blankHTML , "</p>" ) ,
makePredByNodeName : makePredByNodeName ,
isEditable : isEditable ,
isControlSizing : isControlSizing ,
isText : isText ,
isElement : isElement ,
isVoid : isVoid ,
isPara : isPara ,
isPurePara : isPurePara ,
isHeading : isHeading ,
isInline : dom _isInline ,
isBlock : func . not ( dom _isInline ) ,
isBodyInline : isBodyInline ,
isBody : isBody ,
isParaInline : isParaInline ,
isPre : isPre ,
isList : isList ,
isTable : isTable ,
isData : isData ,
isCell : dom _isCell ,
isBlockquote : isBlockquote ,
isBodyContainer : isBodyContainer ,
isAnchor : isAnchor ,
isDiv : makePredByNodeName ( 'DIV' ) ,
isLi : isLi ,
isBR : makePredByNodeName ( 'BR' ) ,
isSpan : makePredByNodeName ( 'SPAN' ) ,
isB : makePredByNodeName ( 'B' ) ,
isU : makePredByNodeName ( 'U' ) ,
isS : makePredByNodeName ( 'S' ) ,
isI : makePredByNodeName ( 'I' ) ,
isImg : makePredByNodeName ( 'IMG' ) ,
isTextarea : isTextarea ,
deepestChildIsEmpty : deepestChildIsEmpty ,
isEmpty : dom _isEmpty ,
isEmptyAnchor : func . and ( isAnchor , dom _isEmpty ) ,
isClosestSibling : isClosestSibling ,
withClosestSiblings : withClosestSiblings ,
nodeLength : nodeLength ,
isLeftEdgePoint : isLeftEdgePoint ,
isRightEdgePoint : isRightEdgePoint ,
isEdgePoint : isEdgePoint ,
isLeftEdgeOf : dom _isLeftEdgeOf ,
isRightEdgeOf : isRightEdgeOf ,
isLeftEdgePointOf : isLeftEdgePointOf ,
isRightEdgePointOf : isRightEdgePointOf ,
prevPoint : dom _prevPoint ,
nextPoint : dom _nextPoint ,
2020-06-01 11:05:25 +00:00
nextPointWithEmptyNode : nextPointWithEmptyNode ,
2020-04-01 22:52:43 +00:00
isSamePoint : isSamePoint ,
isVisiblePoint : isVisiblePoint ,
prevPointUntil : prevPointUntil ,
nextPointUntil : nextPointUntil ,
isCharPoint : isCharPoint ,
isSpacePoint : isSpacePoint ,
walkPoint : walkPoint ,
ancestor : dom _ancestor ,
singleChildAncestor : singleChildAncestor ,
listAncestor : listAncestor ,
lastAncestor : lastAncestor ,
listNext : listNext ,
listPrev : listPrev ,
listDescendant : listDescendant ,
commonAncestor : dom _commonAncestor ,
wrap : wrap ,
insertAfter : insertAfter ,
appendChildNodes : appendChildNodes ,
position : dom _position ,
hasChildren : hasChildren ,
makeOffsetPath : makeOffsetPath ,
fromOffsetPath : fromOffsetPath ,
splitTree : splitTree ,
splitPoint : splitPoint ,
create : dom _create ,
createText : createText ,
remove : remove ,
removeWhile : removeWhile ,
replace : dom _replace ,
html : dom _html ,
value : dom _value ,
posFromPlaceholder : posFromPlaceholder ,
attachEvents : attachEvents ,
detachEvents : detachEvents ,
isCustomStyleTag : isCustomStyleTag
} ) ;
// CONCATENATED MODULE: ./src/js/base/Context.js
function _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a 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 ) ; } }
function _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
2020-06-01 11:05:25 +00:00
var Context _Context = /*#__PURE__*/ function ( ) {
2019-06-10 15:38:54 +00:00
/ * *
2020-04-01 22:52:43 +00:00
* @ param { jQuery } $note
* @ param { Object } options
2019-06-10 15:38:54 +00:00
* /
2020-04-01 22:52:43 +00:00
function Context ( $note , options ) {
_classCallCheck ( this , Context ) ;
this . $note = $note ;
this . memos = { } ;
this . modules = { } ;
this . layoutInfo = { } ;
this . options = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . extend ( true , { } , options ) ; // init ui with options
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote . ui = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote . ui _template ( this . options ) ;
this . ui = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote . ui ;
this . initialize ( ) ;
2019-06-10 15:38:54 +00:00
}
/ * *
2020-04-01 22:52:43 +00:00
* create layout and initialize modules and other resources
2019-06-10 15:38:54 +00:00
* /
2020-04-01 22:52:43 +00:00
_createClass ( Context , [ {
key : "initialize" ,
value : function initialize ( ) {
this . layoutInfo = this . ui . createLayout ( this . $note ) ;
this . _initialize ( ) ;
this . $note . hide ( ) ;
return this ;
}
/ * *
* destroy modules and other resources and remove layout
* /
} , {
key : "destroy" ,
value : function destroy ( ) {
this . _destroy ( ) ;
this . $note . removeData ( 'summernote' ) ;
this . ui . removeLayout ( this . $note , this . layoutInfo ) ;
}
/ * *
* destory modules and other resources and initialize it again
* /
} , {
key : "reset" ,
value : function reset ( ) {
var disabled = this . isDisabled ( ) ;
this . code ( dom . emptyPara ) ;
this . _destroy ( ) ;
this . _initialize ( ) ;
if ( disabled ) {
this . disable ( ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
} , {
key : "_initialize" ,
value : function _initialize ( ) {
var _this = this ;
// set own id
this . options . id = func . uniqueId ( external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . now ( ) ) ; // set default container for tooltips, popovers, and dialogs
this . options . container = this . options . container || this . layoutInfo . editor ; // add optional buttons
var buttons = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . extend ( { } , this . options . buttons ) ;
Object . keys ( buttons ) . forEach ( function ( key ) {
_this . memo ( 'button.' + key , buttons [ key ] ) ;
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
var modules = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . extend ( { } , this . options . modules , external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote . plugins || { } ) ; // add and initialize modules
Object . keys ( modules ) . forEach ( function ( key ) {
_this . module ( key , modules [ key ] , true ) ;
} ) ;
Object . keys ( this . modules ) . forEach ( function ( key ) {
_this . initializeModule ( key ) ;
} ) ;
}
} , {
key : "_destroy" ,
value : function _destroy ( ) {
var _this2 = this ;
// destroy modules with reversed order
Object . keys ( this . modules ) . reverse ( ) . forEach ( function ( key ) {
_this2 . removeModule ( key ) ;
} ) ;
Object . keys ( this . memos ) . forEach ( function ( key ) {
_this2 . removeMemo ( key ) ;
} ) ; // trigger custom onDestroy callback
this . triggerEvent ( 'destroy' , this ) ;
}
} , {
key : "code" ,
value : function code ( html ) {
var isActivated = this . invoke ( 'codeview.isActivated' ) ;
if ( html === undefined ) {
this . invoke ( 'codeview.sync' ) ;
return isActivated ? this . layoutInfo . codable . val ( ) : this . layoutInfo . editable . html ( ) ;
} else {
if ( isActivated ) {
2020-06-01 11:05:25 +00:00
this . invoke ( 'codeview.sync' , html ) ;
2020-04-01 22:52:43 +00:00
} else {
this . layoutInfo . editable . html ( html ) ;
}
this . $note . val ( html ) ;
this . triggerEvent ( 'change' , html , this . layoutInfo . editable ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
} , {
key : "isDisabled" ,
value : function isDisabled ( ) {
return this . layoutInfo . editable . attr ( 'contenteditable' ) === 'false' ;
}
} , {
key : "enable" ,
value : function enable ( ) {
this . layoutInfo . editable . attr ( 'contenteditable' , true ) ;
this . invoke ( 'toolbar.activate' , true ) ;
this . triggerEvent ( 'disable' , false ) ;
this . options . editing = true ;
}
} , {
key : "disable" ,
value : function disable ( ) {
// close codeview if codeview is opend
if ( this . invoke ( 'codeview.isActivated' ) ) {
this . invoke ( 'codeview.deactivate' ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
this . layoutInfo . editable . attr ( 'contenteditable' , false ) ;
this . options . editing = false ;
this . invoke ( 'toolbar.deactivate' , true ) ;
this . triggerEvent ( 'disable' , true ) ;
}
} , {
key : "triggerEvent" ,
value : function triggerEvent ( ) {
var namespace = lists . head ( arguments ) ;
var args = lists . tail ( lists . from ( arguments ) ) ;
var callback = this . options . callbacks [ func . namespaceToCamel ( namespace , 'on' ) ] ;
if ( callback ) {
callback . apply ( this . $note [ 0 ] , args ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
this . $note . trigger ( 'summernote.' + namespace , args ) ;
}
} , {
key : "initializeModule" ,
value : function initializeModule ( key ) {
var module = this . modules [ key ] ;
module . shouldInitialize = module . shouldInitialize || func . ok ;
if ( ! module . shouldInitialize ( ) ) {
return ;
} // initialize module
if ( module . initialize ) {
module . initialize ( ) ;
} // attach events
if ( module . events ) {
dom . attachEvents ( this . $note , module . events ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
} , {
key : "module" ,
value : function module ( key , ModuleClass , withoutIntialize ) {
if ( arguments . length === 1 ) {
return this . modules [ key ] ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
this . modules [ key ] = new ModuleClass ( this ) ;
if ( ! withoutIntialize ) {
this . initializeModule ( key ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
} , {
key : "removeModule" ,
value : function removeModule ( key ) {
var module = this . modules [ key ] ;
if ( module . shouldInitialize ( ) ) {
if ( module . events ) {
dom . detachEvents ( this . $note , module . events ) ;
}
if ( module . destroy ) {
module . destroy ( ) ;
}
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
delete this . modules [ key ] ;
}
} , {
key : "memo" ,
value : function memo ( key , obj ) {
if ( arguments . length === 1 ) {
return this . memos [ key ] ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
this . memos [ key ] = obj ;
}
} , {
key : "removeMemo" ,
value : function removeMemo ( key ) {
if ( this . memos [ key ] && this . memos [ key ] . destroy ) {
this . memos [ key ] . destroy ( ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
delete this . memos [ key ] ;
}
/ * *
* Some buttons need to change their visual style immediately once they get pressed
* /
} , {
key : "createInvokeHandlerAndUpdateState" ,
value : function createInvokeHandlerAndUpdateState ( namespace , value ) {
var _this3 = this ;
return function ( event ) {
_this3 . createInvokeHandler ( namespace , value ) ( event ) ;
_this3 . invoke ( 'buttons.updateCurrentStyle' ) ;
2019-06-10 15:38:54 +00:00
} ;
2020-04-01 22:52:43 +00:00
}
} , {
key : "createInvokeHandler" ,
value : function createInvokeHandler ( namespace , value ) {
var _this4 = this ;
return function ( event ) {
event . preventDefault ( ) ;
var $target = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( event . target ) ;
_this4 . invoke ( namespace , value || $target . closest ( '[data-value]' ) . data ( 'value' ) , $target ) ;
} ;
}
} , {
key : "invoke" ,
value : function invoke ( ) {
var namespace = lists . head ( arguments ) ;
var args = lists . tail ( lists . from ( arguments ) ) ;
var splits = namespace . split ( '.' ) ;
var hasSeparator = splits . length > 1 ;
var moduleName = hasSeparator && lists . head ( splits ) ;
var methodName = hasSeparator ? lists . last ( splits ) : lists . head ( splits ) ;
var module = this . modules [ moduleName || 'editor' ] ;
if ( ! moduleName && this [ methodName ] ) {
return this [ methodName ] . apply ( this , args ) ;
} else if ( module && module [ methodName ] && module . shouldInitialize ( ) ) {
return module [ methodName ] . apply ( module , args ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
} ] ) ;
return Context ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/summernote.js
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . fn . extend ( {
2019-06-10 15:38:54 +00:00
/ * *
2020-04-01 22:52:43 +00:00
* Summernote API
2019-06-10 15:38:54 +00:00
*
2020-04-01 22:52:43 +00:00
* @ param { Object | String }
* @ return { this }
2019-06-10 15:38:54 +00:00
* /
2020-04-01 22:52:43 +00:00
summernote : function summernote ( ) {
var type = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . type ( lists . head ( arguments ) ) ;
var isExternalAPICalled = type === 'string' ;
var hasInitOptions = type === 'object' ;
var options = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . extend ( { } , external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote . options , hasInitOptions ? lists . head ( arguments ) : { } ) ; // Update options
options . langInfo = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . extend ( true , { } , external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote . lang [ 'en-US' ] , external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote . lang [ options . lang ] ) ;
options . icons = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . extend ( true , { } , external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote . options . icons , options . icons ) ;
options . tooltip = options . tooltip === 'auto' ? ! env . isSupportTouch : options . tooltip ;
this . each ( function ( idx , note ) {
var $note = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( note ) ;
if ( ! $note . data ( 'summernote' ) ) {
var context = new Context _Context ( $note , options ) ;
$note . data ( 'summernote' , context ) ;
$note . data ( 'summernote' ) . triggerEvent ( 'init' , context . layoutInfo ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
} ) ;
var $note = this . first ( ) ;
if ( $note . length ) {
var context = $note . data ( 'summernote' ) ;
if ( isExternalAPICalled ) {
return context . invoke . apply ( context , lists . from ( arguments ) ) ;
} else if ( options . focus ) {
context . invoke ( 'editor.focus' ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
return this ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
} ) ;
// CONCATENATED MODULE: ./src/js/base/core/range.js
function range _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function range _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 ) ; } }
function range _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) range _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) range _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
/ * *
* return boundaryPoint from TextRange , inspired by Andy Na ' s HuskyRange . js
*
* @ param { TextRange } textRange
* @ param { Boolean } isStart
* @ return { BoundaryPoint }
*
* @ see http : //msdn.microsoft.com/en-us/library/ie/ms535872(v=vs.85).aspx
* /
function textRangeToPoint ( textRange , isStart ) {
var container = textRange . parentElement ( ) ;
var offset ;
var tester = document . body . createTextRange ( ) ;
var prevContainer ;
var childNodes = lists . from ( container . childNodes ) ;
for ( offset = 0 ; offset < childNodes . length ; offset ++ ) {
if ( dom . isText ( childNodes [ offset ] ) ) {
continue ;
}
tester . moveToElementText ( childNodes [ offset ] ) ;
if ( tester . compareEndPoints ( 'StartToStart' , textRange ) >= 0 ) {
break ;
}
prevContainer = childNodes [ offset ] ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
if ( offset !== 0 && dom . isText ( childNodes [ offset - 1 ] ) ) {
var textRangeStart = document . body . createTextRange ( ) ;
var curTextNode = null ;
textRangeStart . moveToElementText ( prevContainer || container ) ;
textRangeStart . collapse ( ! prevContainer ) ;
curTextNode = prevContainer ? prevContainer . nextSibling : container . firstChild ;
var pointTester = textRange . duplicate ( ) ;
pointTester . setEndPoint ( 'StartToStart' , textRangeStart ) ;
var textCount = pointTester . text . replace ( /[\r\n]/g , '' ) . length ;
while ( textCount > curTextNode . nodeValue . length && curTextNode . nextSibling ) {
textCount -= curTextNode . nodeValue . length ;
curTextNode = curTextNode . nextSibling ;
} // [workaround] enforce IE to re-reference curTextNode, hack
var dummy = curTextNode . nodeValue ; // eslint-disable-line
if ( isStart && curTextNode . nextSibling && dom . isText ( curTextNode . nextSibling ) && textCount === curTextNode . nodeValue . length ) {
textCount -= curTextNode . nodeValue . length ;
curTextNode = curTextNode . nextSibling ;
}
container = curTextNode ;
offset = textCount ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return {
cont : container ,
offset : offset
} ;
}
/ * *
* return TextRange from boundary point ( inspired by google closure - library )
* @ param { BoundaryPoint } point
* @ return { TextRange }
* /
function pointToTextRange ( point ) {
var textRangeInfo = function textRangeInfo ( container , offset ) {
var node , isCollapseToStart ;
if ( dom . isText ( container ) ) {
var prevTextNodes = dom . listPrev ( container , func . not ( dom . isText ) ) ;
var prevContainer = lists . last ( prevTextNodes ) . previousSibling ;
node = prevContainer || container . parentNode ;
offset += lists . sum ( lists . tail ( prevTextNodes ) , dom . nodeLength ) ;
isCollapseToStart = ! prevContainer ;
} else {
node = container . childNodes [ offset ] || container ;
if ( dom . isText ( node ) ) {
return textRangeInfo ( node , 0 ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
offset = 0 ;
isCollapseToStart = false ;
}
return {
node : node ,
collapseToStart : isCollapseToStart ,
offset : offset
} ;
} ;
var textRange = document . body . createTextRange ( ) ;
var info = textRangeInfo ( point . node , point . offset ) ;
textRange . moveToElementText ( info . node ) ;
textRange . collapse ( info . collapseToStart ) ;
textRange . moveStart ( 'character' , info . offset ) ;
return textRange ;
}
/ * *
* Wrapped Range
2019-06-10 15:38:54 +00:00
*
2020-04-01 22:52:43 +00:00
* @ constructor
* @ param { Node } sc - start container
* @ param { Number } so - start offset
* @ param { Node } ec - end container
* @ param { Number } eo - end offset
2019-06-10 15:38:54 +00:00
* /
2020-04-01 22:52:43 +00:00
2020-06-01 11:05:25 +00:00
var range _WrappedRange = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function WrappedRange ( sc , so , ec , eo ) {
range _classCallCheck ( this , WrappedRange ) ;
this . sc = sc ;
this . so = so ;
this . ec = ec ;
this . eo = eo ; // isOnEditable: judge whether range is on editable or not
this . isOnEditable = this . makeIsOn ( dom . isEditable ) ; // isOnList: judge whether range is on list node or not
this . isOnList = this . makeIsOn ( dom . isList ) ; // isOnAnchor: judge whether range is on anchor node or not
this . isOnAnchor = this . makeIsOn ( dom . isAnchor ) ; // isOnCell: judge whether range is on cell node or not
this . isOnCell = this . makeIsOn ( dom . isCell ) ; // isOnData: judge whether range is on data node or not
this . isOnData = this . makeIsOn ( dom . isData ) ;
} // nativeRange: get nativeRange from sc, so, ec, eo
range _createClass ( WrappedRange , [ {
key : "nativeRange" ,
value : function nativeRange ( ) {
if ( env . isW3CRangeSupport ) {
var w3cRange = document . createRange ( ) ;
2020-06-01 11:05:25 +00:00
w3cRange . setStart ( this . sc , this . so ) ;
w3cRange . setEnd ( this . ec , this . eo ) ;
2020-04-01 22:52:43 +00:00
return w3cRange ;
} else {
var textRange = pointToTextRange ( {
node : this . sc ,
offset : this . so
} ) ;
textRange . setEndPoint ( 'EndToEnd' , pointToTextRange ( {
node : this . ec ,
offset : this . eo
} ) ) ;
return textRange ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
} , {
key : "getPoints" ,
value : function getPoints ( ) {
2019-06-10 15:38:54 +00:00
return {
2020-04-01 22:52:43 +00:00
sc : this . sc ,
so : this . so ,
ec : this . ec ,
eo : this . eo
} ;
}
} , {
key : "getStartPoint" ,
value : function getStartPoint ( ) {
return {
node : this . sc ,
offset : this . so
2019-06-10 15:38:54 +00:00
} ;
2020-04-01 22:52:43 +00:00
}
} , {
key : "getEndPoint" ,
value : function getEndPoint ( ) {
return {
node : this . ec ,
offset : this . eo
} ;
}
/ * *
* select update visible range
* /
} , {
key : "select" ,
value : function select ( ) {
var nativeRng = this . nativeRange ( ) ;
if ( env . isW3CRangeSupport ) {
var selection = document . getSelection ( ) ;
if ( selection . rangeCount > 0 ) {
selection . removeAllRanges ( ) ;
}
selection . addRange ( nativeRng ) ;
} else {
nativeRng . select ( ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return this ;
}
/ * *
* Moves the scrollbar to start container ( sc ) of current range
*
* @ return { WrappedRange }
* /
} , {
key : "scrollIntoView" ,
value : function scrollIntoView ( container ) {
var height = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( container ) . height ( ) ;
if ( container . scrollTop + height < this . sc . offsetTop ) {
container . scrollTop += Math . abs ( container . scrollTop + height - this . sc . offsetTop ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return this ;
}
/ * *
* @ return { WrappedRange }
* /
} , {
key : "normalize" ,
value : function normalize ( ) {
/ * *
* @ param { BoundaryPoint } point
* @ param { Boolean } isLeftToRight - true : prefer to choose right node
* - false : prefer to choose left node
* @ return { BoundaryPoint }
* /
var getVisiblePoint = function getVisiblePoint ( point , isLeftToRight ) {
if ( ! point ) {
return point ;
} // Just use the given point [XXX:Adhoc]
// - case 01. if the point is on the middle of the node
// - case 02. if the point is on the right edge and prefer to choose left node
// - case 03. if the point is on the left edge and prefer to choose right node
// - case 04. if the point is on the right edge and prefer to choose right node but the node is void
// - case 05. if the point is on the left edge and prefer to choose left node but the node is void
// - case 06. if the point is on the block node and there is no children
if ( dom . isVisiblePoint ( point ) ) {
if ( ! dom . isEdgePoint ( point ) || dom . isRightEdgePoint ( point ) && ! isLeftToRight || dom . isLeftEdgePoint ( point ) && isLeftToRight || dom . isRightEdgePoint ( point ) && isLeftToRight && dom . isVoid ( point . node . nextSibling ) || dom . isLeftEdgePoint ( point ) && ! isLeftToRight && dom . isVoid ( point . node . previousSibling ) || dom . isBlock ( point . node ) && dom . isEmpty ( point . node ) ) {
return point ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
} // point on block's edge
2019-06-10 15:38:54 +00:00
2020-04-01 22:52:43 +00:00
var block = dom . ancestor ( point . node , dom . isBlock ) ;
var hasRightNode = false ;
if ( ! hasRightNode ) {
var prevPoint = dom . prevPoint ( point ) || {
node : null
2019-06-10 15:38:54 +00:00
} ;
2020-04-01 22:52:43 +00:00
hasRightNode = ( dom . isLeftEdgePointOf ( point , block ) || dom . isVoid ( prevPoint . node ) ) && ! isLeftToRight ;
}
var hasLeftNode = false ;
if ( ! hasLeftNode ) {
var _nextPoint = dom . nextPoint ( point ) || {
node : null
2019-06-10 15:38:54 +00:00
} ;
2020-04-01 22:52:43 +00:00
hasLeftNode = ( dom . isRightEdgePointOf ( point , block ) || dom . isVoid ( _nextPoint . node ) ) && isLeftToRight ;
}
if ( hasRightNode || hasLeftNode ) {
// returns point already on visible point
if ( dom . isVisiblePoint ( point ) ) {
return point ;
} // reverse direction
isLeftToRight = ! isLeftToRight ;
}
var nextPoint = isLeftToRight ? dom . nextPointUntil ( dom . nextPoint ( point ) , dom . isVisiblePoint ) : dom . prevPointUntil ( dom . prevPoint ( point ) , dom . isVisiblePoint ) ;
return nextPoint || point ;
2019-06-10 15:38:54 +00:00
} ;
2020-04-01 22:52:43 +00:00
var endPoint = getVisiblePoint ( this . getEndPoint ( ) , false ) ;
var startPoint = this . isCollapsed ( ) ? endPoint : getVisiblePoint ( this . getStartPoint ( ) , true ) ;
return new WrappedRange ( startPoint . node , startPoint . offset , endPoint . node , endPoint . offset ) ;
}
/ * *
* returns matched nodes on range
*
* @ param { Function } [ pred ] - predicate function
* @ param { Object } [ options ]
* @ param { Boolean } [ options . includeAncestor ]
* @ param { Boolean } [ options . fullyContains ]
* @ return { Node [ ] }
* /
} , {
key : "nodes" ,
value : function nodes ( pred , options ) {
pred = pred || func . ok ;
var includeAncestor = options && options . includeAncestor ;
var fullyContains = options && options . fullyContains ; // TODO compare points and sort
var startPoint = this . getStartPoint ( ) ;
var endPoint = this . getEndPoint ( ) ;
var nodes = [ ] ;
var leftEdgeNodes = [ ] ;
dom . walkPoint ( startPoint , endPoint , function ( point ) {
if ( dom . isEditable ( point . node ) ) {
return ;
}
var node ;
if ( fullyContains ) {
if ( dom . isLeftEdgePoint ( point ) ) {
leftEdgeNodes . push ( point . node ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
if ( dom . isRightEdgePoint ( point ) && lists . contains ( leftEdgeNodes , point . node ) ) {
node = point . node ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
} else if ( includeAncestor ) {
node = dom . ancestor ( point . node , pred ) ;
} else {
node = point . node ;
}
if ( node && pred ( node ) ) {
nodes . push ( node ) ;
}
} , true ) ;
return lists . unique ( nodes ) ;
}
/ * *
* returns commonAncestor of range
* @ return { Element } - commonAncestor
* /
} , {
key : "commonAncestor" ,
value : function commonAncestor ( ) {
return dom . commonAncestor ( this . sc , this . ec ) ;
}
/ * *
* returns expanded range by pred
*
* @ param { Function } pred - predicate function
* @ return { WrappedRange }
* /
} , {
key : "expand" ,
value : function expand ( pred ) {
var startAncestor = dom . ancestor ( this . sc , pred ) ;
var endAncestor = dom . ancestor ( this . ec , pred ) ;
if ( ! startAncestor && ! endAncestor ) {
return new WrappedRange ( this . sc , this . so , this . ec , this . eo ) ;
}
var boundaryPoints = this . getPoints ( ) ;
if ( startAncestor ) {
boundaryPoints . sc = startAncestor ;
boundaryPoints . so = 0 ;
}
if ( endAncestor ) {
boundaryPoints . ec = endAncestor ;
boundaryPoints . eo = dom . nodeLength ( endAncestor ) ;
}
return new WrappedRange ( boundaryPoints . sc , boundaryPoints . so , boundaryPoints . ec , boundaryPoints . eo ) ;
}
/ * *
* @ param { Boolean } isCollapseToStart
* @ return { WrappedRange }
* /
} , {
key : "collapse" ,
value : function collapse ( isCollapseToStart ) {
if ( isCollapseToStart ) {
return new WrappedRange ( this . sc , this . so , this . sc , this . so ) ;
} else {
return new WrappedRange ( this . ec , this . eo , this . ec , this . eo ) ;
}
}
/ * *
* splitText on range
* /
} , {
key : "splitText" ,
value : function splitText ( ) {
var isSameContainer = this . sc === this . ec ;
var boundaryPoints = this . getPoints ( ) ;
if ( dom . isText ( this . ec ) && ! dom . isEdgePoint ( this . getEndPoint ( ) ) ) {
this . ec . splitText ( this . eo ) ;
}
if ( dom . isText ( this . sc ) && ! dom . isEdgePoint ( this . getStartPoint ( ) ) ) {
boundaryPoints . sc = this . sc . splitText ( this . so ) ;
boundaryPoints . so = 0 ;
if ( isSameContainer ) {
boundaryPoints . ec = boundaryPoints . sc ;
boundaryPoints . eo = this . eo - this . so ;
}
}
return new WrappedRange ( boundaryPoints . sc , boundaryPoints . so , boundaryPoints . ec , boundaryPoints . eo ) ;
}
/ * *
* delete contents on range
* @ return { WrappedRange }
* /
} , {
key : "deleteContents" ,
value : function deleteContents ( ) {
if ( this . isCollapsed ( ) ) {
return this ;
}
var rng = this . splitText ( ) ;
var nodes = rng . nodes ( null , {
fullyContains : true
} ) ; // find new cursor point
var point = dom . prevPointUntil ( rng . getStartPoint ( ) , function ( point ) {
return ! lists . contains ( nodes , point . node ) ;
} ) ;
var emptyParents = [ ] ;
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . each ( nodes , function ( idx , node ) {
// find empty parents
var parent = node . parentNode ;
if ( point . node !== parent && dom . nodeLength ( parent ) === 1 ) {
emptyParents . push ( parent ) ;
}
dom . remove ( node , false ) ;
} ) ; // remove empty parents
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . each ( emptyParents , function ( idx , node ) {
dom . remove ( node , false ) ;
} ) ;
return new WrappedRange ( point . node , point . offset , point . node , point . offset ) . normalize ( ) ;
}
/ * *
* makeIsOn : return isOn ( pred ) function
* /
} , {
key : "makeIsOn" ,
value : function makeIsOn ( pred ) {
return function ( ) {
var ancestor = dom . ancestor ( this . sc , pred ) ;
return ! ! ancestor && ancestor === dom . ancestor ( this . ec , pred ) ;
2019-06-10 15:38:54 +00:00
} ;
2020-04-01 22:52:43 +00:00
}
/ * *
* @ param { Function } pred
* @ return { Boolean }
* /
} , {
key : "isLeftEdgeOf" ,
value : function isLeftEdgeOf ( pred ) {
if ( ! dom . isLeftEdgePoint ( this . getStartPoint ( ) ) ) {
return false ;
}
var node = dom . ancestor ( this . sc , pred ) ;
return node && dom . isLeftEdgeOf ( this . sc , node ) ;
}
/ * *
* returns whether range was collapsed or not
* /
} , {
key : "isCollapsed" ,
value : function isCollapsed ( ) {
return this . sc === this . ec && this . so === this . eo ;
}
/ * *
* wrap inline nodes which children of body with paragraph
*
* @ return { WrappedRange }
* /
2019-06-10 15:38:54 +00:00
2020-04-01 22:52:43 +00:00
} , {
key : "wrapBodyInlineWithPara" ,
value : function wrapBodyInlineWithPara ( ) {
if ( dom . isBodyContainer ( this . sc ) && dom . isEmpty ( this . sc ) ) {
this . sc . innerHTML = dom . emptyPara ;
return new WrappedRange ( this . sc . firstChild , 0 , this . sc . firstChild , 0 ) ;
}
2019-06-10 15:38:54 +00:00
/ * *
2020-04-01 22:52:43 +00:00
* [ workaround ] firefox often create range on not visible point . so normalize here .
* - firefox : | < p > text < / p > |
* - chrome : < p > | text | < / p >
2019-06-10 15:38:54 +00:00
* /
2020-04-01 22:52:43 +00:00
var rng = this . normalize ( ) ;
if ( dom . isParaInline ( this . sc ) || dom . isPara ( this . sc ) ) {
return rng ;
} // find inline top ancestor
var topAncestor ;
if ( dom . isInline ( rng . sc ) ) {
var ancestors = dom . listAncestor ( rng . sc , func . not ( dom . isInline ) ) ;
topAncestor = lists . last ( ancestors ) ;
if ( ! dom . isInline ( topAncestor ) ) {
topAncestor = ancestors [ ancestors . length - 2 ] || rng . sc . childNodes [ rng . so ] ;
}
} else {
topAncestor = rng . sc . childNodes [ rng . so > 0 ? rng . so - 1 : 0 ] ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
if ( topAncestor ) {
// siblings not in paragraph
var inlineSiblings = dom . listPrev ( topAncestor , dom . isParaInline ) . reverse ( ) ;
inlineSiblings = inlineSiblings . concat ( dom . listNext ( topAncestor . nextSibling , dom . isParaInline ) ) ; // wrap with paragraph
if ( inlineSiblings . length ) {
var para = dom . wrap ( lists . head ( inlineSiblings ) , 'p' ) ;
dom . appendChildNodes ( para , lists . tail ( inlineSiblings ) ) ;
}
}
return this . normalize ( ) ;
}
/ * *
* insert node at current cursor
*
* @ param { Node } node
* @ return { Node }
* /
} , {
key : "insertNode" ,
value : function insertNode ( node ) {
var rng = this ;
if ( dom . isText ( node ) || dom . isInline ( node ) ) {
rng = this . wrapBodyInlineWithPara ( ) . deleteContents ( ) ;
}
var info = dom . splitPoint ( rng . getStartPoint ( ) , dom . isInline ( node ) ) ;
if ( info . rightNode ) {
info . rightNode . parentNode . insertBefore ( node , info . rightNode ) ;
2020-06-01 11:05:25 +00:00
if ( dom . isEmpty ( info . rightNode ) && dom . isPara ( node ) ) {
info . rightNode . parentNode . removeChild ( info . rightNode ) ;
}
2020-04-01 22:52:43 +00:00
} else {
info . container . appendChild ( node ) ;
}
return node ;
}
/ * *
* insert html at current cursor
* /
} , {
key : "pasteHTML" ,
value : function pasteHTML ( markup ) {
markup = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . trim ( markup ) ;
var contentsContainer = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<div></div>' ) . html ( markup ) [ 0 ] ;
var childNodes = lists . from ( contentsContainer . childNodes ) ; // const rng = this.wrapBodyInlineWithPara().deleteContents();
var rng = this ;
2020-06-01 11:05:25 +00:00
var reversed = false ;
2020-04-01 22:52:43 +00:00
if ( rng . so >= 0 ) {
childNodes = childNodes . reverse ( ) ;
2020-06-01 11:05:25 +00:00
reversed = true ;
2020-04-01 22:52:43 +00:00
}
childNodes = childNodes . map ( function ( childNode ) {
return rng . insertNode ( childNode ) ;
} ) ;
2020-06-01 11:05:25 +00:00
if ( reversed ) {
2020-04-01 22:52:43 +00:00
childNodes = childNodes . reverse ( ) ;
}
return childNodes ;
}
/ * *
* returns text in range
*
* @ return { String }
* /
} , {
key : "toString" ,
value : function toString ( ) {
var nativeRng = this . nativeRange ( ) ;
return env . isW3CRangeSupport ? nativeRng . toString ( ) : nativeRng . text ;
}
/ * *
* returns range for word before cursor
*
* @ param { Boolean } [ findAfter ] - find after cursor , default : false
* @ return { WrappedRange }
* /
} , {
key : "getWordRange" ,
value : function getWordRange ( findAfter ) {
var endPoint = this . getEndPoint ( ) ;
if ( ! dom . isCharPoint ( endPoint ) ) {
return this ;
}
var startPoint = dom . prevPointUntil ( endPoint , function ( point ) {
return ! dom . isCharPoint ( point ) ;
} ) ;
if ( findAfter ) {
endPoint = dom . nextPointUntil ( endPoint , function ( point ) {
return ! dom . isCharPoint ( point ) ;
} ) ;
}
return new WrappedRange ( startPoint . node , startPoint . offset , endPoint . node , endPoint . offset ) ;
}
/ * *
* returns range for words before cursor
*
* @ param { Boolean } [ findAfter ] - find after cursor , default : false
* @ return { WrappedRange }
* /
} , {
key : "getWordsRange" ,
value : function getWordsRange ( findAfter ) {
var endPoint = this . getEndPoint ( ) ;
var isNotTextPoint = function isNotTextPoint ( point ) {
return ! dom . isCharPoint ( point ) && ! dom . isSpacePoint ( point ) ;
} ;
if ( isNotTextPoint ( endPoint ) ) {
return this ;
}
var startPoint = dom . prevPointUntil ( endPoint , isNotTextPoint ) ;
if ( findAfter ) {
endPoint = dom . nextPointUntil ( endPoint , isNotTextPoint ) ;
}
return new WrappedRange ( startPoint . node , startPoint . offset , endPoint . node , endPoint . offset ) ;
}
/ * *
* returns range for words before cursor that match with a Regex
*
* example :
* range : 'hi @Peter Pan'
* regex : '/@[a-z ]+/i'
* return range : '@Peter Pan'
*
* @ param { RegExp } [ regex ]
* @ return { WrappedRange | null }
* /
} , {
key : "getWordsMatchRange" ,
value : function getWordsMatchRange ( regex ) {
var endPoint = this . getEndPoint ( ) ;
var startPoint = dom . prevPointUntil ( endPoint , function ( point ) {
if ( ! dom . isCharPoint ( point ) && ! dom . isSpacePoint ( point ) ) {
return true ;
}
var rng = new WrappedRange ( point . node , point . offset , endPoint . node , endPoint . offset ) ;
var result = regex . exec ( rng . toString ( ) ) ;
return result && result . index === 0 ;
} ) ;
var rng = new WrappedRange ( startPoint . node , startPoint . offset , endPoint . node , endPoint . offset ) ;
var text = rng . toString ( ) ;
var result = regex . exec ( text ) ;
if ( result && result [ 0 ] . length === text . length ) {
return rng ;
} else {
return null ;
}
}
/ * *
* create offsetPath bookmark
*
* @ param { Node } editable
* /
} , {
key : "bookmark" ,
value : function bookmark ( editable ) {
return {
s : {
path : dom . makeOffsetPath ( editable , this . sc ) ,
offset : this . so
} ,
e : {
path : dom . makeOffsetPath ( editable , this . ec ) ,
offset : this . eo
}
} ;
}
/ * *
* create offsetPath bookmark base on paragraph
*
* @ param { Node [ ] } paras
* /
} , {
key : "paraBookmark" ,
value : function paraBookmark ( paras ) {
return {
s : {
path : lists . tail ( dom . makeOffsetPath ( lists . head ( paras ) , this . sc ) ) ,
offset : this . so
} ,
e : {
path : lists . tail ( dom . makeOffsetPath ( lists . last ( paras ) , this . ec ) ) ,
offset : this . eo
}
} ;
}
/ * *
* getClientRects
* @ return { Rect [ ] }
* /
} , {
key : "getClientRects" ,
value : function getClientRects ( ) {
var nativeRng = this . nativeRange ( ) ;
return nativeRng . getClientRects ( ) ;
}
} ] ) ;
return WrappedRange ;
} ( ) ;
/ * *
* Data structure
* * BoundaryPoint : a point of dom tree
* * BoundaryPoints : two boundaryPoints corresponding to the start and the end of the Range
*
* See to http : //www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Position
* /
/* harmony default export */ var range = ( {
2019-06-10 15:38:54 +00:00
/ * *
2020-04-01 22:52:43 +00:00
* create Range Object From arguments or Browser Selection
2019-06-10 15:38:54 +00:00
*
2020-04-01 22:52:43 +00:00
* @ param { Node } sc - start container
* @ param { Number } so - start offset
* @ param { Node } ec - end container
* @ param { Number } eo - end offset
* @ return { WrappedRange }
2019-06-10 15:38:54 +00:00
* /
2020-04-01 22:52:43 +00:00
create : function create ( sc , so , ec , eo ) {
if ( arguments . length === 4 ) {
return new range _WrappedRange ( sc , so , ec , eo ) ;
} else if ( arguments . length === 2 ) {
// collapsed
ec = sc ;
eo = so ;
return new range _WrappedRange ( sc , so , ec , eo ) ;
} else {
var wrappedRange = this . createFromSelection ( ) ;
if ( ! wrappedRange && arguments . length === 1 ) {
var bodyElement = arguments [ 0 ] ;
if ( dom . isEditable ( bodyElement ) ) {
bodyElement = bodyElement . lastChild ;
}
return this . createFromBodyElement ( bodyElement , dom . emptyPara === arguments [ 0 ] . innerHTML ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return wrappedRange ;
}
} ,
createFromBodyElement : function createFromBodyElement ( bodyElement ) {
var isCollapseToStart = arguments . length > 1 && arguments [ 1 ] !== undefined ? arguments [ 1 ] : false ;
var wrappedRange = this . createFromNode ( bodyElement ) ;
return wrappedRange . collapse ( isCollapseToStart ) ;
} ,
createFromSelection : function createFromSelection ( ) {
var sc , so , ec , eo ;
if ( env . isW3CRangeSupport ) {
var selection = document . getSelection ( ) ;
if ( ! selection || selection . rangeCount === 0 ) {
return null ;
} else if ( dom . isBody ( selection . anchorNode ) ) {
// Firefox: returns entire body as range on initialization.
// We won't never need it.
return null ;
}
var nativeRng = selection . getRangeAt ( 0 ) ;
sc = nativeRng . startContainer ;
so = nativeRng . startOffset ;
ec = nativeRng . endContainer ;
eo = nativeRng . endOffset ;
} else {
// IE8: TextRange
var textRange = document . selection . createRange ( ) ;
var textRangeEnd = textRange . duplicate ( ) ;
textRangeEnd . collapse ( false ) ;
var textRangeStart = textRange ;
textRangeStart . collapse ( true ) ;
var startPoint = textRangeToPoint ( textRangeStart , true ) ;
var endPoint = textRangeToPoint ( textRangeEnd , false ) ; // same visible point case: range was collapsed.
if ( dom . isText ( startPoint . node ) && dom . isLeftEdgePoint ( startPoint ) && dom . isTextNode ( endPoint . node ) && dom . isRightEdgePoint ( endPoint ) && endPoint . node . nextSibling === startPoint . node ) {
startPoint = endPoint ;
}
sc = startPoint . cont ;
so = startPoint . offset ;
ec = endPoint . cont ;
eo = endPoint . offset ;
}
return new range _WrappedRange ( sc , so , ec , eo ) ;
} ,
2019-06-10 15:38:54 +00:00
/ * *
2020-04-01 22:52:43 +00:00
* @ method
*
* create WrappedRange from node
*
* @ param { Node } node
* @ return { WrappedRange }
2019-06-10 15:38:54 +00:00
* /
2020-04-01 22:52:43 +00:00
createFromNode : function createFromNode ( node ) {
var sc = node ;
var so = 0 ;
var ec = node ;
var eo = dom . nodeLength ( ec ) ; // browsers can't target a picture or void node
if ( dom . isVoid ( sc ) ) {
so = dom . listPrev ( sc ) . length - 1 ;
sc = sc . parentNode ;
}
if ( dom . isBR ( ec ) ) {
eo = dom . listPrev ( ec ) . length - 1 ;
ec = ec . parentNode ;
} else if ( dom . isVoid ( ec ) ) {
eo = dom . listPrev ( ec ) . length ;
ec = ec . parentNode ;
}
return this . create ( sc , so , ec , eo ) ;
} ,
2019-06-10 15:38:54 +00:00
/ * *
2020-04-01 22:52:43 +00:00
* create WrappedRange from node after position
*
* @ param { Node } node
* @ return { WrappedRange }
* /
createFromNodeBefore : function createFromNodeBefore ( node ) {
return this . createFromNode ( node ) . collapse ( true ) ;
} ,
2019-06-10 15:38:54 +00:00
/ * *
2020-04-01 22:52:43 +00:00
* create WrappedRange from node after position
2019-06-10 15:38:54 +00:00
*
2020-04-01 22:52:43 +00:00
* @ param { Node } node
* @ return { WrappedRange }
2019-06-10 15:38:54 +00:00
* /
2020-04-01 22:52:43 +00:00
createFromNodeAfter : function createFromNodeAfter ( node ) {
return this . createFromNode ( node ) . collapse ( ) ;
} ,
2019-06-10 15:38:54 +00:00
/ * *
2020-04-01 22:52:43 +00:00
* @ method
2019-06-10 15:38:54 +00:00
*
2020-04-01 22:52:43 +00:00
* create WrappedRange from bookmark
2019-06-10 15:38:54 +00:00
*
2020-04-01 22:52:43 +00:00
* @ param { Node } editable
* @ param { Object } bookmark
* @ return { WrappedRange }
2019-06-10 15:38:54 +00:00
* /
2020-04-01 22:52:43 +00:00
createFromBookmark : function createFromBookmark ( editable , bookmark ) {
var sc = dom . fromOffsetPath ( editable , bookmark . s . path ) ;
var so = bookmark . s . offset ;
var ec = dom . fromOffsetPath ( editable , bookmark . e . path ) ;
var eo = bookmark . e . offset ;
return new range _WrappedRange ( sc , so , ec , eo ) ;
} ,
2019-06-10 15:38:54 +00:00
/ * *
2020-04-01 22:52:43 +00:00
* @ method
2019-06-10 15:38:54 +00:00
*
2020-04-01 22:52:43 +00:00
* create WrappedRange from paraBookmark
2019-06-10 15:38:54 +00:00
*
2020-04-01 22:52:43 +00:00
* @ param { Object } bookmark
* @ param { Node [ ] } paras
* @ return { WrappedRange }
2019-06-10 15:38:54 +00:00
* /
2020-04-01 22:52:43 +00:00
createFromParaBookmark : function createFromParaBookmark ( bookmark , paras ) {
var so = bookmark . s . offset ;
var eo = bookmark . e . offset ;
var sc = dom . fromOffsetPath ( lists . head ( paras ) , bookmark . s . path ) ;
var ec = dom . fromOffsetPath ( lists . last ( paras ) , bookmark . e . path ) ;
return new range _WrappedRange ( sc , so , ec , eo ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
} ) ;
// CONCATENATED MODULE: ./src/js/base/core/key.js
var KEY _MAP = {
'BACKSPACE' : 8 ,
'TAB' : 9 ,
'ENTER' : 13 ,
2020-06-01 11:05:25 +00:00
'ESCAPE' : 27 ,
2020-04-01 22:52:43 +00:00
'SPACE' : 32 ,
'DELETE' : 46 ,
// Arrow
'LEFT' : 37 ,
'UP' : 38 ,
'RIGHT' : 39 ,
'DOWN' : 40 ,
// Number: 0-9
'NUM0' : 48 ,
'NUM1' : 49 ,
'NUM2' : 50 ,
'NUM3' : 51 ,
'NUM4' : 52 ,
'NUM5' : 53 ,
'NUM6' : 54 ,
'NUM7' : 55 ,
'NUM8' : 56 ,
// Alphabet: a-z
'B' : 66 ,
'E' : 69 ,
'I' : 73 ,
'J' : 74 ,
'K' : 75 ,
'L' : 76 ,
'R' : 82 ,
'S' : 83 ,
'U' : 85 ,
'V' : 86 ,
'Y' : 89 ,
'Z' : 90 ,
'SLASH' : 191 ,
'LEFTBRACKET' : 219 ,
'BACKSLASH' : 220 ,
'RIGHTBRACKET' : 221 ,
// Navigation
'HOME' : 36 ,
'END' : 35 ,
'PAGEUP' : 33 ,
'PAGEDOWN' : 34
} ;
/ * *
* @ class core . key
*
* Object for keycodes .
*
* @ singleton
* @ alternateClassName key
* /
/* harmony default export */ var core _key = ( {
/ * *
* @ method isEdit
*
* @ param { Number } keyCode
* @ return { Boolean }
* /
isEdit : function isEdit ( keyCode ) {
return lists . contains ( [ KEY _MAP . BACKSPACE , KEY _MAP . TAB , KEY _MAP . ENTER , KEY _MAP . SPACE , KEY _MAP . DELETE ] , keyCode ) ;
} ,
2019-06-10 15:38:54 +00:00
/ * *
2020-04-01 22:52:43 +00:00
* @ method isMove
2019-06-10 15:38:54 +00:00
*
2020-04-01 22:52:43 +00:00
* @ param { Number } keyCode
* @ return { Boolean }
* /
isMove : function isMove ( keyCode ) {
return lists . contains ( [ KEY _MAP . LEFT , KEY _MAP . UP , KEY _MAP . RIGHT , KEY _MAP . DOWN ] , keyCode ) ;
} ,
/ * *
* @ method isNavigation
2019-06-10 15:38:54 +00:00
*
2020-04-01 22:52:43 +00:00
* @ param { Number } keyCode
* @ return { Boolean }
2019-06-10 15:38:54 +00:00
* /
2020-04-01 22:52:43 +00:00
isNavigation : function isNavigation ( keyCode ) {
return lists . contains ( [ KEY _MAP . HOME , KEY _MAP . END , KEY _MAP . PAGEUP , KEY _MAP . PAGEDOWN ] , keyCode ) ;
} ,
/ * *
* @ property { Object } nameFromCode
* @ property { String } nameFromCode . 8 "BACKSPACE"
* /
nameFromCode : func . invertObject ( KEY _MAP ) ,
code : KEY _MAP
} ) ;
// CONCATENATED MODULE: ./src/js/base/core/async.js
/ * *
* @ method readFileAsDataURL
*
* read contents of file as representing URL
*
* @ param { File } file
* @ return { Promise } - then : dataUrl
* /
function readFileAsDataURL ( file ) {
return external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . Deferred ( function ( deferred ) {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . extend ( new FileReader ( ) , {
onload : function onload ( e ) {
var dataURL = e . target . result ;
deferred . resolve ( dataURL ) ;
} ,
onerror : function onerror ( err ) {
deferred . reject ( err ) ;
}
} ) . readAsDataURL ( file ) ;
} ) . promise ( ) ;
}
/ * *
* @ method createImage
*
* create ` <image> ` from url string
*
* @ param { String } url
* @ return { Promise } - then : $image
* /
function createImage ( url ) {
return external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . Deferred ( function ( deferred ) {
var $img = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<img>' ) ;
$img . one ( 'load' , function ( ) {
$img . off ( 'error abort' ) ;
deferred . resolve ( $img ) ;
} ) . one ( 'error abort' , function ( ) {
$img . off ( 'load' ) . detach ( ) ;
deferred . reject ( $img ) ;
} ) . css ( {
display : 'none'
} ) . appendTo ( document . body ) . attr ( 'src' , url ) ;
} ) . promise ( ) ;
}
// CONCATENATED MODULE: ./src/js/base/editing/History.js
function History _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function History _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 ) ; } }
function History _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) History _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) History _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
2020-06-01 11:05:25 +00:00
var History _History = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function History ( context ) {
History _classCallCheck ( this , History ) ;
this . stack = [ ] ;
this . stackOffset = - 1 ;
this . context = context ;
this . $editable = context . layoutInfo . editable ;
this . editable = this . $editable [ 0 ] ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
History _createClass ( History , [ {
key : "makeSnapshot" ,
value : function makeSnapshot ( ) {
var rng = range . create ( this . editable ) ;
var emptyBookmark = {
s : {
path : [ ] ,
offset : 0
} ,
e : {
path : [ ] ,
offset : 0
}
2019-06-10 15:38:54 +00:00
} ;
2020-04-01 22:52:43 +00:00
return {
contents : this . $editable . html ( ) ,
bookmark : rng && rng . isOnEditable ( ) ? rng . bookmark ( this . editable ) : emptyBookmark
} ;
}
} , {
key : "applySnapshot" ,
value : function applySnapshot ( snapshot ) {
if ( snapshot . contents !== null ) {
this . $editable . html ( snapshot . contents ) ;
}
2019-06-10 15:38:54 +00:00
2020-04-01 22:52:43 +00:00
if ( snapshot . bookmark !== null ) {
range . createFromBookmark ( this . editable , snapshot . bookmark ) . select ( ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
/ * *
* @ method rewind
* Rewinds the history stack back to the first snapshot taken .
* Leaves the stack intact , so that "Redo" can still be used .
* /
} , {
key : "rewind" ,
value : function rewind ( ) {
// Create snap shot if not yet recorded
if ( this . $editable . html ( ) !== this . stack [ this . stackOffset ] . contents ) {
this . recordUndo ( ) ;
} // Return to the first available snapshot.
this . stackOffset = 0 ; // Apply that snapshot.
this . applySnapshot ( this . stack [ this . stackOffset ] ) ;
}
/ * *
* @ method commit
* Resets history stack , but keeps current editor ' s content .
* /
} , {
key : "commit" ,
value : function commit ( ) {
// Clear the stack.
this . stack = [ ] ; // Restore stackOffset to its original value.
this . stackOffset = - 1 ; // Record our first snapshot (of nothing).
this . recordUndo ( ) ;
}
/ * *
* @ method reset
* Resets the history stack completely ; reverting to an empty editor .
* /
} , {
key : "reset" ,
value : function reset ( ) {
// Clear the stack.
this . stack = [ ] ; // Restore stackOffset to its original value.
this . stackOffset = - 1 ; // Clear the editable area.
this . $editable . html ( '' ) ; // Record our first snapshot (of nothing).
this . recordUndo ( ) ;
}
/ * *
* undo
* /
} , {
key : "undo" ,
value : function undo ( ) {
// Create snap shot if not yet recorded
if ( this . $editable . html ( ) !== this . stack [ this . stackOffset ] . contents ) {
this . recordUndo ( ) ;
}
if ( this . stackOffset > 0 ) {
this . stackOffset -- ;
this . applySnapshot ( this . stack [ this . stackOffset ] ) ;
}
}
/ * *
* redo
* /
} , {
key : "redo" ,
value : function redo ( ) {
if ( this . stack . length - 1 > this . stackOffset ) {
this . stackOffset ++ ;
this . applySnapshot ( this . stack [ this . stackOffset ] ) ;
}
}
/ * *
* recorded undo
* /
} , {
key : "recordUndo" ,
value : function recordUndo ( ) {
this . stackOffset ++ ; // Wash out stack after stackOffset
if ( this . stack . length > this . stackOffset ) {
this . stack = this . stack . slice ( 0 , this . stackOffset ) ;
} // Create new snapshot and push it to the end
this . stack . push ( this . makeSnapshot ( ) ) ; // If the stack size reachs to the limit, then slice it
if ( this . stack . length > this . context . options . historyLimit ) {
this . stack . shift ( ) ;
this . stackOffset -= 1 ;
}
}
} ] ) ;
return History ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/editing/Style.js
function Style _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function Style _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 ) ; } }
function Style _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) Style _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) Style _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
2020-06-01 11:05:25 +00:00
var Style _Style = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function Style ( ) {
Style _classCallCheck ( this , Style ) ;
}
Style _createClass ( Style , [ {
key : "jQueryCSS" ,
/ * *
* @ method jQueryCSS
*
* [ workaround ] for old jQuery
* passing an array of style properties to . css ( )
* will result in an object of property - value pairs .
* ( compability with version < 1.9 )
*
* @ private
* @ param { jQuery } $obj
* @ param { Array } propertyNames - An array of one or more CSS properties .
* @ return { Object }
* /
value : function jQueryCSS ( $obj , propertyNames ) {
if ( env . jqueryVersion < 1.9 ) {
var result = { } ;
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . each ( propertyNames , function ( idx , propertyName ) {
result [ propertyName ] = $obj . css ( propertyName ) ;
} ) ;
return result ;
}
return $obj . css ( propertyNames ) ;
}
/ * *
* returns style object from node
*
* @ param { jQuery } $node
* @ return { Object }
* /
} , {
key : "fromNode" ,
value : function fromNode ( $node ) {
var properties = [ 'font-family' , 'font-size' , 'text-align' , 'list-style-type' , 'line-height' ] ;
var styleInfo = this . jQueryCSS ( $node , properties ) || { } ;
var fontSize = $node [ 0 ] . style . fontSize || styleInfo [ 'font-size' ] ;
styleInfo [ 'font-size' ] = parseInt ( fontSize , 10 ) ;
styleInfo [ 'font-size-unit' ] = fontSize . match ( /[a-z%]+$/ ) ;
return styleInfo ;
}
/ * *
* paragraph level style
*
* @ param { WrappedRange } rng
* @ param { Object } styleInfo
* /
} , {
key : "stylePara" ,
value : function stylePara ( rng , styleInfo ) {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . each ( rng . nodes ( dom . isPara , {
includeAncestor : true
} ) , function ( idx , para ) {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( para ) . css ( styleInfo ) ;
} ) ;
}
/ * *
* insert and returns styleNodes on range .
*
* @ param { WrappedRange } rng
* @ param { Object } [ options ] - options for styleNodes
* @ param { String } [ options . nodeName ] - default : ` SPAN `
* @ param { Boolean } [ options . expandClosestSibling ] - default : ` false `
* @ param { Boolean } [ options . onlyPartialContains ] - default : ` false `
* @ return { Node [ ] }
* /
} , {
key : "styleNodes" ,
value : function styleNodes ( rng , options ) {
rng = rng . splitText ( ) ;
var nodeName = options && options . nodeName || 'SPAN' ;
var expandClosestSibling = ! ! ( options && options . expandClosestSibling ) ;
var onlyPartialContains = ! ! ( options && options . onlyPartialContains ) ;
if ( rng . isCollapsed ( ) ) {
return [ rng . insertNode ( dom . create ( nodeName ) ) ] ;
}
var pred = dom . makePredByNodeName ( nodeName ) ;
var nodes = rng . nodes ( dom . isText , {
fullyContains : true
} ) . map ( function ( text ) {
return dom . singleChildAncestor ( text , pred ) || dom . wrap ( text , nodeName ) ;
} ) ;
if ( expandClosestSibling ) {
if ( onlyPartialContains ) {
var nodesInRange = rng . nodes ( ) ; // compose with partial contains predication
pred = func . and ( pred , function ( node ) {
return lists . contains ( nodesInRange , node ) ;
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
}
return nodes . map ( function ( node ) {
var siblings = dom . withClosestSiblings ( node , pred ) ;
var head = lists . head ( siblings ) ;
var tails = lists . tail ( siblings ) ;
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . each ( tails , function ( idx , elem ) {
dom . appendChildNodes ( head , elem . childNodes ) ;
dom . remove ( elem ) ;
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
return lists . head ( siblings ) ;
} ) ;
} else {
return nodes ;
}
}
/ * *
* get current style on cursor
*
* @ param { WrappedRange } rng
* @ return { Object } - object contains style properties .
* /
} , {
key : "current" ,
value : function current ( rng ) {
var $cont = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( ! dom . isElement ( rng . sc ) ? rng . sc . parentNode : rng . sc ) ;
var styleInfo = this . fromNode ( $cont ) ; // document.queryCommandState for toggle state
// [workaround] prevent Firefox nsresult: "0x80004005 (NS_ERROR_FAILURE)"
try {
styleInfo = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . extend ( styleInfo , {
'font-bold' : document . queryCommandState ( 'bold' ) ? 'bold' : 'normal' ,
'font-italic' : document . queryCommandState ( 'italic' ) ? 'italic' : 'normal' ,
'font-underline' : document . queryCommandState ( 'underline' ) ? 'underline' : 'normal' ,
'font-subscript' : document . queryCommandState ( 'subscript' ) ? 'subscript' : 'normal' ,
'font-superscript' : document . queryCommandState ( 'superscript' ) ? 'superscript' : 'normal' ,
'font-strikethrough' : document . queryCommandState ( 'strikethrough' ) ? 'strikethrough' : 'normal' ,
'font-family' : document . queryCommandValue ( 'fontname' ) || styleInfo [ 'font-family' ]
} ) ;
} catch ( e ) { } // eslint-disable-next-line
// list-style-type to list-style(unordered, ordered)
2019-06-10 15:38:54 +00:00
2020-04-01 22:52:43 +00:00
if ( ! rng . isOnList ( ) ) {
styleInfo [ 'list-style' ] = 'none' ;
} else {
var orderedTypes = [ 'circle' , 'disc' , 'disc-leading-zero' , 'square' ] ;
var isUnordered = orderedTypes . indexOf ( styleInfo [ 'list-style-type' ] ) > - 1 ;
styleInfo [ 'list-style' ] = isUnordered ? 'unordered' : 'ordered' ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
var para = dom . ancestor ( rng . sc , dom . isPara ) ;
if ( para && para . style [ 'line-height' ] ) {
styleInfo [ 'line-height' ] = para . style . lineHeight ;
} else {
var lineHeight = parseInt ( styleInfo [ 'line-height' ] , 10 ) / parseInt ( styleInfo [ 'font-size' ] , 10 ) ;
styleInfo [ 'line-height' ] = lineHeight . toFixed ( 1 ) ;
}
styleInfo . anchor = rng . isOnAnchor ( ) && dom . ancestor ( rng . sc , dom . isAnchor ) ;
styleInfo . ancestors = dom . listAncestor ( rng . sc , dom . isEditable ) ;
styleInfo . range = rng ;
return styleInfo ;
}
} ] ) ;
return Style ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/editing/Bullet.js
function Bullet _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function Bullet _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 ) ; } }
function Bullet _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) Bullet _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) Bullet _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
2020-06-01 11:05:25 +00:00
var Bullet _Bullet = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function Bullet ( ) {
Bullet _classCallCheck ( this , Bullet ) ;
}
Bullet _createClass ( Bullet , [ {
key : "insertOrderedList" ,
/ * *
* toggle ordered list
* /
value : function insertOrderedList ( editable ) {
this . toggleList ( 'OL' , editable ) ;
}
/ * *
* toggle unordered list
* /
} , {
key : "insertUnorderedList" ,
value : function insertUnorderedList ( editable ) {
this . toggleList ( 'UL' , editable ) ;
}
/ * *
* indent
* /
} , {
key : "indent" ,
value : function indent ( editable ) {
var _this = this ;
var rng = range . create ( editable ) . wrapBodyInlineWithPara ( ) ;
var paras = rng . nodes ( dom . isPara , {
includeAncestor : true
} ) ;
var clustereds = lists . clusterBy ( paras , func . peq2 ( 'parentNode' ) ) ;
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . each ( clustereds , function ( idx , paras ) {
var head = lists . head ( paras ) ;
if ( dom . isLi ( head ) ) {
var previousList = _this . findList ( head . previousSibling ) ;
if ( previousList ) {
paras . map ( function ( para ) {
return previousList . appendChild ( para ) ;
} ) ;
} else {
_this . wrapList ( paras , head . parentNode . nodeName ) ;
paras . map ( function ( para ) {
return para . parentNode ;
} ) . map ( function ( para ) {
return _this . appendToPrevious ( para ) ;
} ) ;
}
} else {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . each ( paras , function ( idx , para ) {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( para ) . css ( 'marginLeft' , function ( idx , val ) {
return ( parseInt ( val , 10 ) || 0 ) + 25 ;
} ) ;
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
}
} ) ;
rng . select ( ) ;
}
/ * *
* outdent
* /
} , {
key : "outdent" ,
value : function outdent ( editable ) {
var _this2 = this ;
var rng = range . create ( editable ) . wrapBodyInlineWithPara ( ) ;
var paras = rng . nodes ( dom . isPara , {
includeAncestor : true
} ) ;
var clustereds = lists . clusterBy ( paras , func . peq2 ( 'parentNode' ) ) ;
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . each ( clustereds , function ( idx , paras ) {
var head = lists . head ( paras ) ;
if ( dom . isLi ( head ) ) {
_this2 . releaseList ( [ paras ] ) ;
} else {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . each ( paras , function ( idx , para ) {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( para ) . css ( 'marginLeft' , function ( idx , val ) {
val = parseInt ( val , 10 ) || 0 ;
return val > 25 ? val - 25 : '' ;
} ) ;
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
}
} ) ;
rng . select ( ) ;
}
/ * *
* toggle list
*
* @ param { String } listName - OL or UL
* /
} , {
key : "toggleList" ,
value : function toggleList ( listName , editable ) {
var _this3 = this ;
var rng = range . create ( editable ) . wrapBodyInlineWithPara ( ) ;
var paras = rng . nodes ( dom . isPara , {
includeAncestor : true
} ) ;
var bookmark = rng . paraBookmark ( paras ) ;
var clustereds = lists . clusterBy ( paras , func . peq2 ( 'parentNode' ) ) ; // paragraph to list
if ( lists . find ( paras , dom . isPurePara ) ) {
var wrappedParas = [ ] ;
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . each ( clustereds , function ( idx , paras ) {
wrappedParas = wrappedParas . concat ( _this3 . wrapList ( paras , listName ) ) ;
} ) ;
paras = wrappedParas ; // list to paragraph or change list style
} else {
var diffLists = rng . nodes ( dom . isList , {
includeAncestor : true
} ) . filter ( function ( listNode ) {
return ! external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . nodeName ( listNode , listName ) ;
} ) ;
if ( diffLists . length ) {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . each ( diffLists , function ( idx , listNode ) {
dom . replace ( listNode , listName ) ;
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
} else {
paras = this . releaseList ( clustereds , true ) ;
}
}
range . createFromParaBookmark ( bookmark , paras ) . select ( ) ;
}
/ * *
* @ param { Node [ ] } paras
* @ param { String } listName
* @ return { Node [ ] }
* /
} , {
key : "wrapList" ,
value : function wrapList ( paras , listName ) {
var head = lists . head ( paras ) ;
var last = lists . last ( paras ) ;
var prevList = dom . isList ( head . previousSibling ) && head . previousSibling ;
var nextList = dom . isList ( last . nextSibling ) && last . nextSibling ;
var listNode = prevList || dom . insertAfter ( dom . create ( listName || 'UL' ) , last ) ; // P to LI
paras = paras . map ( function ( para ) {
return dom . isPurePara ( para ) ? dom . replace ( para , 'LI' ) : para ;
} ) ; // append to list(<ul>, <ol>)
dom . appendChildNodes ( listNode , paras ) ;
if ( nextList ) {
dom . appendChildNodes ( listNode , lists . from ( nextList . childNodes ) ) ;
dom . remove ( nextList ) ;
}
return paras ;
}
/ * *
* @ method releaseList
*
* @ param { Array [ ] } clustereds
* @ param { Boolean } isEscapseToBody
* @ return { Node [ ] }
* /
} , {
key : "releaseList" ,
value : function releaseList ( clustereds , isEscapseToBody ) {
var _this4 = this ;
var releasedParas = [ ] ;
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . each ( clustereds , function ( idx , paras ) {
var head = lists . head ( paras ) ;
var last = lists . last ( paras ) ;
var headList = isEscapseToBody ? dom . lastAncestor ( head , dom . isList ) : head . parentNode ;
var parentItem = headList . parentNode ;
if ( headList . parentNode . nodeName === 'LI' ) {
paras . map ( function ( para ) {
var newList = _this4 . findNextSiblings ( para ) ;
if ( parentItem . nextSibling ) {
parentItem . parentNode . insertBefore ( para , parentItem . nextSibling ) ;
} else {
parentItem . parentNode . appendChild ( para ) ;
}
if ( newList . length ) {
_this4 . wrapList ( newList , headList . nodeName ) ;
para . appendChild ( newList [ 0 ] . parentNode ) ;
}
} ) ;
if ( headList . children . length === 0 ) {
parentItem . removeChild ( headList ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
if ( parentItem . childNodes . length === 0 ) {
parentItem . parentNode . removeChild ( parentItem ) ;
}
} else {
var lastList = headList . childNodes . length > 1 ? dom . splitTree ( headList , {
node : last . parentNode ,
offset : dom . position ( last ) + 1
} , {
isSkipPaddingBlankHTML : true
} ) : null ;
var middleList = dom . splitTree ( headList , {
node : head . parentNode ,
offset : dom . position ( head )
} , {
isSkipPaddingBlankHTML : true
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
paras = isEscapseToBody ? dom . listDescendant ( middleList , dom . isLi ) : lists . from ( middleList . childNodes ) . filter ( dom . isLi ) ; // LI to P
if ( isEscapseToBody || ! dom . isList ( headList . parentNode ) ) {
paras = paras . map ( function ( para ) {
return dom . replace ( para , 'P' ) ;
} ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . each ( lists . from ( paras ) . reverse ( ) , function ( idx , para ) {
dom . insertAfter ( para , headList ) ;
} ) ; // remove empty lists
var rootLists = lists . compact ( [ headList , middleList , lastList ] ) ;
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . each ( rootLists , function ( idx , rootList ) {
var listNodes = [ rootList ] . concat ( dom . listDescendant ( rootList , dom . isList ) ) ;
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . each ( listNodes . reverse ( ) , function ( idx , listNode ) {
if ( ! dom . nodeLength ( listNode ) ) {
dom . remove ( listNode , true ) ;
}
} ) ;
} ) ;
}
releasedParas = releasedParas . concat ( paras ) ;
} ) ;
return releasedParas ;
}
/ * *
* @ method appendToPrevious
*
* Appends list to previous list item , if
* none exist it wraps the list in a new list item .
*
* @ param { HTMLNode } ListItem
* @ return { HTMLNode }
* /
} , {
key : "appendToPrevious" ,
value : function appendToPrevious ( node ) {
return node . previousSibling ? dom . appendChildNodes ( node . previousSibling , [ node ] ) : this . wrapList ( [ node ] , 'LI' ) ;
}
/ * *
* @ method findList
*
* Finds an existing list in list item
*
* @ param { HTMLNode } ListItem
* @ return { Array [ ] }
* /
} , {
key : "findList" ,
value : function findList ( node ) {
return node ? lists . find ( node . children , function ( child ) {
return [ 'OL' , 'UL' ] . indexOf ( child . nodeName ) > - 1 ;
} ) : null ;
}
/ * *
* @ method findNextSiblings
*
* Finds all list item siblings that follow it
*
* @ param { HTMLNode } ListItem
* @ return { HTMLNode }
* /
} , {
key : "findNextSiblings" ,
value : function findNextSiblings ( node ) {
var siblings = [ ] ;
while ( node . nextSibling ) {
siblings . push ( node . nextSibling ) ;
node = node . nextSibling ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return siblings ;
}
} ] ) ;
return Bullet ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/editing/Typing.js
function Typing _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function Typing _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 ) ; } }
function Typing _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) Typing _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) Typing _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
/ * *
* @ class editing . Typing
*
* Typing
*
* /
2020-06-01 11:05:25 +00:00
var Typing _Typing = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function Typing ( context ) {
Typing _classCallCheck ( this , Typing ) ;
// a Bullet instance to toggle lists off
this . bullet = new Bullet _Bullet ( ) ;
this . options = context . options ;
}
2019-06-10 15:38:54 +00:00
/ * *
2020-04-01 22:52:43 +00:00
* insert tab
*
* @ param { WrappedRange } rng
* @ param { Number } tabsize
2019-06-10 15:38:54 +00:00
* /
2020-04-01 22:52:43 +00:00
Typing _createClass ( Typing , [ {
key : "insertTab" ,
value : function insertTab ( rng , tabsize ) {
var tab = dom . createText ( new Array ( tabsize + 1 ) . join ( dom . NBSP _CHAR ) ) ;
rng = rng . deleteContents ( ) ;
rng . insertNode ( tab , true ) ;
rng = range . create ( tab , tabsize ) ;
rng . select ( ) ;
}
/ * *
* insert paragraph
*
* @ param { jQuery } $editable
* @ param { WrappedRange } rng Can be used in unit tests to "mock" the range
*
* blockquoteBreakingLevel
* 0 - No break , the new paragraph remains inside the quote
* 1 - Break the first blockquote in the ancestors list
* 2 - Break all blockquotes , so that the new paragraph is not quoted ( this is the default )
* /
} , {
key : "insertParagraph" ,
value : function insertParagraph ( editable , rng ) {
rng = rng || range . create ( editable ) ; // deleteContents on range.
rng = rng . deleteContents ( ) ; // Wrap range if it needs to be wrapped by paragraph
rng = rng . wrapBodyInlineWithPara ( ) ; // finding paragraph
var splitRoot = dom . ancestor ( rng . sc , dom . isPara ) ;
var nextPara ; // on paragraph: split paragraph
if ( splitRoot ) {
// if it is an empty line with li
if ( dom . isLi ( splitRoot ) && ( dom . isEmpty ( splitRoot ) || dom . deepestChildIsEmpty ( splitRoot ) ) ) {
2020-06-01 11:05:25 +00:00
// toggle UL/OL and escape
2020-04-01 22:52:43 +00:00
this . bullet . toggleList ( splitRoot . parentNode . nodeName ) ;
return ;
} else {
var blockquote = null ;
if ( this . options . blockquoteBreakingLevel === 1 ) {
blockquote = dom . ancestor ( splitRoot , dom . isBlockquote ) ;
} else if ( this . options . blockquoteBreakingLevel === 2 ) {
blockquote = dom . lastAncestor ( splitRoot , dom . isBlockquote ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
if ( blockquote ) {
// We're inside a blockquote and options ask us to break it
nextPara = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( dom . emptyPara ) [ 0 ] ; // If the split is right before a <br>, remove it so that there's no "empty line"
// after the split in the new blockquote created
if ( dom . isRightEdgePoint ( rng . getStartPoint ( ) ) && dom . isBR ( rng . sc . nextSibling ) ) {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( rng . sc . nextSibling ) . remove ( ) ;
}
var split = dom . splitTree ( blockquote , rng . getStartPoint ( ) , {
isDiscardEmptySplits : true
} ) ;
if ( split ) {
split . parentNode . insertBefore ( nextPara , split ) ;
} else {
dom . insertAfter ( nextPara , blockquote ) ; // There's no split if we were at the end of the blockquote
}
} else {
nextPara = dom . splitTree ( splitRoot , rng . getStartPoint ( ) ) ; // not a blockquote, just insert the paragraph
var emptyAnchors = dom . listDescendant ( splitRoot , dom . isEmptyAnchor ) ;
emptyAnchors = emptyAnchors . concat ( dom . listDescendant ( nextPara , dom . isEmptyAnchor ) ) ;
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . each ( emptyAnchors , function ( idx , anchor ) {
dom . remove ( anchor ) ;
} ) ; // replace empty heading, pre or custom-made styleTag with P tag
if ( ( dom . isHeading ( nextPara ) || dom . isPre ( nextPara ) || dom . isCustomStyleTag ( nextPara ) ) && dom . isEmpty ( nextPara ) ) {
nextPara = dom . replace ( nextPara , 'p' ) ;
}
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
} // no paragraph: insert empty paragraph
} else {
var next = rng . sc . childNodes [ rng . so ] ;
nextPara = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( dom . emptyPara ) [ 0 ] ;
if ( next ) {
rng . sc . insertBefore ( nextPara , next ) ;
} else {
rng . sc . appendChild ( nextPara ) ;
}
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
range . create ( nextPara , 0 ) . normalize ( ) . select ( ) . scrollIntoView ( editable ) ;
}
} ] ) ;
return Typing ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/editing/Table.js
function Table _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function Table _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 ) ; } }
function Table _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) Table _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) Table _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
/ * *
* @ class Create a virtual table to create what actions to do in change .
* @ param { object } startPoint Cell selected to apply change .
* @ param { enum } where Where change will be applied Row or Col . Use enum : TableResultAction . where
* @ param { enum } action Action to be applied . Use enum : TableResultAction . requestAction
* @ param { object } domTable Dom element of table to make changes .
* /
var TableResultAction = function TableResultAction ( startPoint , where , action , domTable ) {
var _startPoint = {
'colPos' : 0 ,
'rowPos' : 0
2019-06-10 15:38:54 +00:00
} ;
2020-04-01 22:52:43 +00:00
var _virtualTable = [ ] ;
var _actionCellList = [ ] ; /// ///////////////////////////////////////////
// Private functions
/// ///////////////////////////////////////////
2019-06-10 15:38:54 +00:00
/ * *
2020-04-01 22:52:43 +00:00
* Set the startPoint of action .
* /
function setStartPoint ( ) {
if ( ! startPoint || ! startPoint . tagName || startPoint . tagName . toLowerCase ( ) !== 'td' && startPoint . tagName . toLowerCase ( ) !== 'th' ) {
// Impossible to identify start Cell point
return ;
}
_startPoint . colPos = startPoint . cellIndex ;
if ( ! startPoint . parentElement || ! startPoint . parentElement . tagName || startPoint . parentElement . tagName . toLowerCase ( ) !== 'tr' ) {
// Impossible to identify start Row point
return ;
}
_startPoint . rowPos = startPoint . parentElement . rowIndex ;
}
2019-06-10 15:38:54 +00:00
/ * *
2020-04-01 22:52:43 +00:00
* Define virtual table position info object .
*
* @ param { int } rowIndex Index position in line of virtual table .
* @ param { int } cellIndex Index position in column of virtual table .
* @ param { object } baseRow Row affected by this position .
* @ param { object } baseCell Cell affected by this position .
* @ param { bool } isSpan Inform if it is an span cell / row .
* /
function setVirtualTablePosition ( rowIndex , cellIndex , baseRow , baseCell , isRowSpan , isColSpan , isVirtualCell ) {
var objPosition = {
'baseRow' : baseRow ,
'baseCell' : baseCell ,
'isRowSpan' : isRowSpan ,
'isColSpan' : isColSpan ,
'isVirtual' : isVirtualCell
} ;
if ( ! _virtualTable [ rowIndex ] ) {
_virtualTable [ rowIndex ] = [ ] ;
}
_virtualTable [ rowIndex ] [ cellIndex ] = objPosition ;
}
2019-06-10 15:38:54 +00:00
/ * *
2020-04-01 22:52:43 +00:00
* Create action cell object .
2019-06-10 15:38:54 +00:00
*
2020-04-01 22:52:43 +00:00
* @ param { object } virtualTableCellObj Object of specific position on virtual table .
* @ param { enum } resultAction Action to be applied in that item .
* /
function getActionCell ( virtualTableCellObj , resultAction , virtualRowPosition , virtualColPosition ) {
return {
'baseCell' : virtualTableCellObj . baseCell ,
'action' : resultAction ,
'virtualTable' : {
'rowIndex' : virtualRowPosition ,
'cellIndex' : virtualColPosition
}
} ;
}
/ * *
* Recover free index of row to append Cell .
2019-06-10 15:38:54 +00:00
*
2020-04-01 22:52:43 +00:00
* @ param { int } rowIndex Index of row to find free space .
* @ param { int } cellIndex Index of cell to find free space in table .
* /
function recoverCellIndex ( rowIndex , cellIndex ) {
if ( ! _virtualTable [ rowIndex ] ) {
return cellIndex ;
}
if ( ! _virtualTable [ rowIndex ] [ cellIndex ] ) {
return cellIndex ;
}
var newCellIndex = cellIndex ;
while ( _virtualTable [ rowIndex ] [ newCellIndex ] ) {
newCellIndex ++ ;
if ( ! _virtualTable [ rowIndex ] [ newCellIndex ] ) {
return newCellIndex ;
}
}
}
/ * *
* Recover info about row and cell and add information to virtual table .
2019-06-10 15:38:54 +00:00
*
2020-04-01 22:52:43 +00:00
* @ param { object } row Row to recover information .
* @ param { object } cell Cell to recover information .
2019-06-10 15:38:54 +00:00
* /
2020-04-01 22:52:43 +00:00
function addCellInfoToVirtual ( row , cell ) {
var cellIndex = recoverCellIndex ( row . rowIndex , cell . cellIndex ) ;
var cellHasColspan = cell . colSpan > 1 ;
var cellHasRowspan = cell . rowSpan > 1 ;
var isThisSelectedCell = row . rowIndex === _startPoint . rowPos && cell . cellIndex === _startPoint . colPos ;
setVirtualTablePosition ( row . rowIndex , cellIndex , row , cell , cellHasRowspan , cellHasColspan , false ) ; // Add span rows to virtual Table.
var rowspanNumber = cell . attributes . rowSpan ? parseInt ( cell . attributes . rowSpan . value , 10 ) : 0 ;
if ( rowspanNumber > 1 ) {
for ( var rp = 1 ; rp < rowspanNumber ; rp ++ ) {
var rowspanIndex = row . rowIndex + rp ;
adjustStartPoint ( rowspanIndex , cellIndex , cell , isThisSelectedCell ) ;
setVirtualTablePosition ( rowspanIndex , cellIndex , row , cell , true , cellHasColspan , true ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
} // Add span cols to virtual table.
var colspanNumber = cell . attributes . colSpan ? parseInt ( cell . attributes . colSpan . value , 10 ) : 0 ;
2019-06-10 15:38:54 +00:00
2020-04-01 22:52:43 +00:00
if ( colspanNumber > 1 ) {
for ( var cp = 1 ; cp < colspanNumber ; cp ++ ) {
var cellspanIndex = recoverCellIndex ( row . rowIndex , cellIndex + cp ) ;
adjustStartPoint ( row . rowIndex , cellspanIndex , cell , isThisSelectedCell ) ;
setVirtualTablePosition ( row . rowIndex , cellspanIndex , row , cell , cellHasRowspan , true , true ) ;
}
}
}
2019-06-10 15:38:54 +00:00
/ * *
2020-04-01 22:52:43 +00:00
* Process validation and adjust of start point if needed
*
* @ param { int } rowIndex
* @ param { int } cellIndex
* @ param { object } cell
* @ param { bool } isSelectedCell
2019-06-10 15:38:54 +00:00
* /
2020-04-01 22:52:43 +00:00
function adjustStartPoint ( rowIndex , cellIndex , cell , isSelectedCell ) {
if ( rowIndex === _startPoint . rowPos && _startPoint . colPos >= cell . cellIndex && cell . cellIndex <= cellIndex && ! isSelectedCell ) {
_startPoint . colPos ++ ;
}
}
/ * *
* Create virtual table of cells with all cells , including span cells .
* /
function createVirtualTable ( ) {
var rows = domTable . rows ;
for ( var rowIndex = 0 ; rowIndex < rows . length ; rowIndex ++ ) {
var cells = rows [ rowIndex ] . cells ;
for ( var cellIndex = 0 ; cellIndex < cells . length ; cellIndex ++ ) {
addCellInfoToVirtual ( rows [ rowIndex ] , cells [ cellIndex ] ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
}
/ * *
* Get action to be applied on the cell .
*
* @ param { object } cell virtual table cell to apply action
* /
function getDeleteResultActionToCell ( cell ) {
switch ( where ) {
case TableResultAction . where . Column :
if ( cell . isColSpan ) {
return TableResultAction . resultAction . SubtractSpanCount ;
}
break ;
case TableResultAction . where . Row :
if ( ! cell . isVirtual && cell . isRowSpan ) {
return TableResultAction . resultAction . AddCell ;
} else if ( cell . isRowSpan ) {
return TableResultAction . resultAction . SubtractSpanCount ;
}
break ;
}
return TableResultAction . resultAction . RemoveCell ;
}
/ * *
* Get action to be applied on the cell .
*
* @ param { object } cell virtual table cell to apply action
* /
function getAddResultActionToCell ( cell ) {
switch ( where ) {
case TableResultAction . where . Column :
if ( cell . isColSpan ) {
return TableResultAction . resultAction . SumSpanCount ;
} else if ( cell . isRowSpan && cell . isVirtual ) {
return TableResultAction . resultAction . Ignore ;
}
break ;
case TableResultAction . where . Row :
if ( cell . isRowSpan ) {
return TableResultAction . resultAction . SumSpanCount ;
} else if ( cell . isColSpan && cell . isVirtual ) {
return TableResultAction . resultAction . Ignore ;
}
break ;
}
return TableResultAction . resultAction . AddCell ;
}
function init ( ) {
setStartPoint ( ) ;
createVirtualTable ( ) ;
} /// ///////////////////////////////////////////
// Public functions
/// ///////////////////////////////////////////
/ * *
* Recover array os what to do in table .
* /
this . getActionList = function ( ) {
var fixedRow = where === TableResultAction . where . Row ? _startPoint . rowPos : - 1 ;
var fixedCol = where === TableResultAction . where . Column ? _startPoint . colPos : - 1 ;
var actualPosition = 0 ;
var canContinue = true ;
while ( canContinue ) {
var rowPosition = fixedRow >= 0 ? fixedRow : actualPosition ;
var colPosition = fixedCol >= 0 ? fixedCol : actualPosition ;
var row = _virtualTable [ rowPosition ] ;
if ( ! row ) {
canContinue = false ;
return _actionCellList ;
}
var cell = row [ colPosition ] ;
if ( ! cell ) {
canContinue = false ;
return _actionCellList ;
} // Define action to be applied in this cell
var resultAction = TableResultAction . resultAction . Ignore ;
switch ( action ) {
case TableResultAction . requestAction . Add :
resultAction = getAddResultActionToCell ( cell ) ;
break ;
case TableResultAction . requestAction . Delete :
resultAction = getDeleteResultActionToCell ( cell ) ;
break ;
}
_actionCellList . push ( getActionCell ( cell , resultAction , rowPosition , colPosition ) ) ;
actualPosition ++ ;
}
return _actionCellList ;
} ;
init ( ) ;
} ;
/ * *
*
* Where action occours enum .
* /
TableResultAction . where = {
'Row' : 0 ,
'Column' : 1
} ;
/ * *
*
* Requested action to apply enum .
* /
TableResultAction . requestAction = {
'Add' : 0 ,
'Delete' : 1
} ;
/ * *
*
* Result action to be executed enum .
* /
TableResultAction . resultAction = {
'Ignore' : 0 ,
'SubtractSpanCount' : 1 ,
'RemoveCell' : 2 ,
'AddCell' : 3 ,
'SumSpanCount' : 4
} ;
/ * *
*
* @ class editing . Table
*
* Table
*
* /
2020-06-01 11:05:25 +00:00
var Table _Table = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function Table ( ) {
Table _classCallCheck ( this , Table ) ;
}
Table _createClass ( Table , [ {
key : "tab" ,
/ * *
* handle tab key
*
* @ param { WrappedRange } rng
* @ param { Boolean } isShift
* /
value : function tab ( rng , isShift ) {
var cell = dom . ancestor ( rng . commonAncestor ( ) , dom . isCell ) ;
var table = dom . ancestor ( cell , dom . isTable ) ;
var cells = dom . listDescendant ( table , dom . isCell ) ;
var nextCell = lists [ isShift ? 'prev' : 'next' ] ( cells , cell ) ;
if ( nextCell ) {
range . create ( nextCell , 0 ) . select ( ) ;
}
}
/ * *
* Add a new row
*
* @ param { WrappedRange } rng
* @ param { String } position ( top / bottom )
* @ return { Node }
* /
} , {
key : "addRow" ,
value : function addRow ( rng , position ) {
var cell = dom . ancestor ( rng . commonAncestor ( ) , dom . isCell ) ;
var currentTr = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( cell ) . closest ( 'tr' ) ;
var trAttributes = this . recoverAttributes ( currentTr ) ;
var html = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<tr' + trAttributes + '></tr>' ) ;
var vTable = new TableResultAction ( cell , TableResultAction . where . Row , TableResultAction . requestAction . Add , external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( currentTr ) . closest ( 'table' ) [ 0 ] ) ;
var actions = vTable . getActionList ( ) ;
for ( var idCell = 0 ; idCell < actions . length ; idCell ++ ) {
var currentCell = actions [ idCell ] ;
var tdAttributes = this . recoverAttributes ( currentCell . baseCell ) ;
switch ( currentCell . action ) {
case TableResultAction . resultAction . AddCell :
html . append ( '<td' + tdAttributes + '>' + dom . blank + '</td>' ) ;
break ;
case TableResultAction . resultAction . SumSpanCount :
{
if ( position === 'top' ) {
var baseCellTr = currentCell . baseCell . parent ;
var isTopFromRowSpan = ( ! baseCellTr ? 0 : currentCell . baseCell . closest ( 'tr' ) . rowIndex ) <= currentTr [ 0 ] . rowIndex ;
if ( isTopFromRowSpan ) {
var newTd = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<div></div>' ) . append ( external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<td' + tdAttributes + '>' + dom . blank + '</td>' ) . removeAttr ( 'rowspan' ) ) . html ( ) ;
html . append ( newTd ) ;
break ;
}
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
var rowspanNumber = parseInt ( currentCell . baseCell . rowSpan , 10 ) ;
rowspanNumber ++ ;
currentCell . baseCell . setAttribute ( 'rowSpan' , rowspanNumber ) ;
}
break ;
}
}
if ( position === 'top' ) {
currentTr . before ( html ) ;
} else {
var cellHasRowspan = cell . rowSpan > 1 ;
if ( cellHasRowspan ) {
var lastTrIndex = currentTr [ 0 ] . rowIndex + ( cell . rowSpan - 2 ) ;
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( currentTr ) . parent ( ) . find ( 'tr' ) [ lastTrIndex ] ) . after ( external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( html ) ) ;
return ;
}
currentTr . after ( html ) ;
}
}
/ * *
* Add a new col
*
* @ param { WrappedRange } rng
* @ param { String } position ( left / right )
* @ return { Node }
* /
} , {
key : "addCol" ,
value : function addCol ( rng , position ) {
var cell = dom . ancestor ( rng . commonAncestor ( ) , dom . isCell ) ;
var row = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( cell ) . closest ( 'tr' ) ;
var rowsGroup = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( row ) . siblings ( ) ;
rowsGroup . push ( row ) ;
var vTable = new TableResultAction ( cell , TableResultAction . where . Column , TableResultAction . requestAction . Add , external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( row ) . closest ( 'table' ) [ 0 ] ) ;
var actions = vTable . getActionList ( ) ;
for ( var actionIndex = 0 ; actionIndex < actions . length ; actionIndex ++ ) {
var currentCell = actions [ actionIndex ] ;
var tdAttributes = this . recoverAttributes ( currentCell . baseCell ) ;
switch ( currentCell . action ) {
case TableResultAction . resultAction . AddCell :
if ( position === 'right' ) {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( currentCell . baseCell ) . after ( '<td' + tdAttributes + '>' + dom . blank + '</td>' ) ;
} else {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( currentCell . baseCell ) . before ( '<td' + tdAttributes + '>' + dom . blank + '</td>' ) ;
}
break ;
case TableResultAction . resultAction . SumSpanCount :
if ( position === 'right' ) {
var colspanNumber = parseInt ( currentCell . baseCell . colSpan , 10 ) ;
colspanNumber ++ ;
currentCell . baseCell . setAttribute ( 'colSpan' , colspanNumber ) ;
} else {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( currentCell . baseCell ) . before ( '<td' + tdAttributes + '>' + dom . blank + '</td>' ) ;
}
break ;
}
}
}
/ *
* Copy attributes from element .
*
* @ param { object } Element to recover attributes .
* @ return { string } Copied string elements .
* /
} , {
key : "recoverAttributes" ,
value : function recoverAttributes ( el ) {
var resultStr = '' ;
if ( ! el ) {
return resultStr ;
}
var attrList = el . attributes || [ ] ;
for ( var i = 0 ; i < attrList . length ; i ++ ) {
if ( attrList [ i ] . name . toLowerCase ( ) === 'id' ) {
continue ;
}
if ( attrList [ i ] . specified ) {
resultStr += ' ' + attrList [ i ] . name + '=\'' + attrList [ i ] . value + '\'' ;
}
}
return resultStr ;
}
/ * *
* Delete current row
*
* @ param { WrappedRange } rng
* @ return { Node }
* /
} , {
key : "deleteRow" ,
value : function deleteRow ( rng ) {
var cell = dom . ancestor ( rng . commonAncestor ( ) , dom . isCell ) ;
var row = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( cell ) . closest ( 'tr' ) ;
var cellPos = row . children ( 'td, th' ) . index ( external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( cell ) ) ;
var rowPos = row [ 0 ] . rowIndex ;
var vTable = new TableResultAction ( cell , TableResultAction . where . Row , TableResultAction . requestAction . Delete , external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( row ) . closest ( 'table' ) [ 0 ] ) ;
var actions = vTable . getActionList ( ) ;
for ( var actionIndex = 0 ; actionIndex < actions . length ; actionIndex ++ ) {
if ( ! actions [ actionIndex ] ) {
continue ;
}
var baseCell = actions [ actionIndex ] . baseCell ;
var virtualPosition = actions [ actionIndex ] . virtualTable ;
var hasRowspan = baseCell . rowSpan && baseCell . rowSpan > 1 ;
var rowspanNumber = hasRowspan ? parseInt ( baseCell . rowSpan , 10 ) : 0 ;
switch ( actions [ actionIndex ] . action ) {
case TableResultAction . resultAction . Ignore :
continue ;
case TableResultAction . resultAction . AddCell :
{
var nextRow = row . next ( 'tr' ) [ 0 ] ;
if ( ! nextRow ) {
continue ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
var cloneRow = row [ 0 ] . cells [ cellPos ] ;
if ( hasRowspan ) {
if ( rowspanNumber > 2 ) {
rowspanNumber -- ;
nextRow . insertBefore ( cloneRow , nextRow . cells [ cellPos ] ) ;
nextRow . cells [ cellPos ] . setAttribute ( 'rowSpan' , rowspanNumber ) ;
nextRow . cells [ cellPos ] . innerHTML = '' ;
} else if ( rowspanNumber === 2 ) {
nextRow . insertBefore ( cloneRow , nextRow . cells [ cellPos ] ) ;
nextRow . cells [ cellPos ] . removeAttribute ( 'rowSpan' ) ;
nextRow . cells [ cellPos ] . innerHTML = '' ;
}
}
}
continue ;
case TableResultAction . resultAction . SubtractSpanCount :
if ( hasRowspan ) {
if ( rowspanNumber > 2 ) {
rowspanNumber -- ;
baseCell . setAttribute ( 'rowSpan' , rowspanNumber ) ;
if ( virtualPosition . rowIndex !== rowPos && baseCell . cellIndex === cellPos ) {
baseCell . innerHTML = '' ;
}
} else if ( rowspanNumber === 2 ) {
baseCell . removeAttribute ( 'rowSpan' ) ;
if ( virtualPosition . rowIndex !== rowPos && baseCell . cellIndex === cellPos ) {
baseCell . innerHTML = '' ;
}
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
continue ;
case TableResultAction . resultAction . RemoveCell :
// Do not need remove cell because row will be deleted.
continue ;
}
}
row . remove ( ) ;
}
/ * *
* Delete current col
*
* @ param { WrappedRange } rng
* @ return { Node }
* /
} , {
key : "deleteCol" ,
value : function deleteCol ( rng ) {
var cell = dom . ancestor ( rng . commonAncestor ( ) , dom . isCell ) ;
var row = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( cell ) . closest ( 'tr' ) ;
var cellPos = row . children ( 'td, th' ) . index ( external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( cell ) ) ;
var vTable = new TableResultAction ( cell , TableResultAction . where . Column , TableResultAction . requestAction . Delete , external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( row ) . closest ( 'table' ) [ 0 ] ) ;
var actions = vTable . getActionList ( ) ;
for ( var actionIndex = 0 ; actionIndex < actions . length ; actionIndex ++ ) {
if ( ! actions [ actionIndex ] ) {
continue ;
}
switch ( actions [ actionIndex ] . action ) {
case TableResultAction . resultAction . Ignore :
continue ;
case TableResultAction . resultAction . SubtractSpanCount :
{
var baseCell = actions [ actionIndex ] . baseCell ;
var hasColspan = baseCell . colSpan && baseCell . colSpan > 1 ;
if ( hasColspan ) {
var colspanNumber = baseCell . colSpan ? parseInt ( baseCell . colSpan , 10 ) : 0 ;
if ( colspanNumber > 2 ) {
colspanNumber -- ;
baseCell . setAttribute ( 'colSpan' , colspanNumber ) ;
if ( baseCell . cellIndex === cellPos ) {
baseCell . innerHTML = '' ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
} else if ( colspanNumber === 2 ) {
baseCell . removeAttribute ( 'colSpan' ) ;
if ( baseCell . cellIndex === cellPos ) {
baseCell . innerHTML = '' ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
continue ;
2019-06-10 15:38:54 +00:00
2020-04-01 22:52:43 +00:00
case TableResultAction . resultAction . RemoveCell :
dom . remove ( actions [ actionIndex ] . baseCell , true ) ;
continue ;
}
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
/ * *
* create empty table element
*
* @ param { Number } rowCount
* @ param { Number } colCount
* @ return { Node }
* /
} , {
key : "createTable" ,
value : function createTable ( colCount , rowCount , options ) {
var tds = [ ] ;
var tdHTML ;
for ( var idxCol = 0 ; idxCol < colCount ; idxCol ++ ) {
tds . push ( '<td>' + dom . blank + '</td>' ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
tdHTML = tds . join ( '' ) ;
var trs = [ ] ;
var trHTML ;
for ( var idxRow = 0 ; idxRow < rowCount ; idxRow ++ ) {
trs . push ( '<tr>' + tdHTML + '</tr>' ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
trHTML = trs . join ( '' ) ;
var $table = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<table>' + trHTML + '</table>' ) ;
if ( options && options . tableClassName ) {
$table . addClass ( options . tableClassName ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
return $table [ 0 ] ;
}
/ * *
* Delete current table
*
* @ param { WrappedRange } rng
* @ return { Node }
* /
} , {
key : "deleteTable" ,
value : function deleteTable ( rng ) {
var cell = dom . ancestor ( rng . commonAncestor ( ) , dom . isCell ) ;
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( cell ) . closest ( 'table' ) . remove ( ) ;
}
} ] ) ;
return Table ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/module/Editor.js
function Editor _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function Editor _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 ) ; } }
function Editor _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) Editor _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) Editor _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
var KEY _BOGUS = 'bogus' ;
/ * *
* @ class Editor
* /
2020-06-01 11:05:25 +00:00
var Editor _Editor = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function Editor ( context ) {
var _this = this ;
Editor _classCallCheck ( this , Editor ) ;
this . context = context ;
this . $note = context . layoutInfo . note ;
this . $editor = context . layoutInfo . editor ;
this . $editable = context . layoutInfo . editable ;
this . options = context . options ;
this . lang = this . options . langInfo ;
this . editable = this . $editable [ 0 ] ;
this . lastRange = null ;
this . snapshot = null ;
this . style = new Style _Style ( ) ;
this . table = new Table _Table ( ) ;
this . typing = new Typing _Typing ( context ) ;
this . bullet = new Bullet _Bullet ( ) ;
this . history = new History _History ( context ) ;
2020-06-01 11:05:25 +00:00
this . context . memo ( 'help.escape' , this . lang . help . escape ) ;
2020-04-01 22:52:43 +00:00
this . context . memo ( 'help.undo' , this . lang . help . undo ) ;
this . context . memo ( 'help.redo' , this . lang . help . redo ) ;
this . context . memo ( 'help.tab' , this . lang . help . tab ) ;
this . context . memo ( 'help.untab' , this . lang . help . untab ) ;
this . context . memo ( 'help.insertParagraph' , this . lang . help . insertParagraph ) ;
this . context . memo ( 'help.insertOrderedList' , this . lang . help . insertOrderedList ) ;
this . context . memo ( 'help.insertUnorderedList' , this . lang . help . insertUnorderedList ) ;
this . context . memo ( 'help.indent' , this . lang . help . indent ) ;
this . context . memo ( 'help.outdent' , this . lang . help . outdent ) ;
this . context . memo ( 'help.formatPara' , this . lang . help . formatPara ) ;
this . context . memo ( 'help.insertHorizontalRule' , this . lang . help . insertHorizontalRule ) ;
this . context . memo ( 'help.fontName' , this . lang . help . fontName ) ; // native commands(with execCommand), generate function for execCommand
var commands = [ 'bold' , 'italic' , 'underline' , 'strikethrough' , 'superscript' , 'subscript' , 'justifyLeft' , 'justifyCenter' , 'justifyRight' , 'justifyFull' , 'formatBlock' , 'removeFormat' , 'backColor' ] ;
for ( var idx = 0 , len = commands . length ; idx < len ; idx ++ ) {
this [ commands [ idx ] ] = function ( sCmd ) {
return function ( value ) {
_this . beforeCommand ( ) ;
document . execCommand ( sCmd , false , value ) ;
_this . afterCommand ( true ) ;
} ;
} ( commands [ idx ] ) ;
this . context . memo ( 'help.' + commands [ idx ] , this . lang . help [ commands [ idx ] ] ) ;
}
this . fontName = this . wrapCommand ( function ( value ) {
return _this . fontStyling ( 'font-family' , env . validFontName ( value ) ) ;
} ) ;
this . fontSize = this . wrapCommand ( function ( value ) {
var unit = _this . currentStyle ( ) [ 'font-size-unit' ] ;
return _this . fontStyling ( 'font-size' , value + unit ) ;
} ) ;
this . fontSizeUnit = this . wrapCommand ( function ( value ) {
var size = _this . currentStyle ( ) [ 'font-size' ] ;
return _this . fontStyling ( 'font-size' , size + value ) ;
} ) ;
for ( var _idx = 1 ; _idx <= 6 ; _idx ++ ) {
this [ 'formatH' + _idx ] = function ( idx ) {
return function ( ) {
_this . formatBlock ( 'H' + idx ) ;
} ;
} ( _idx ) ;
this . context . memo ( 'help.formatH' + _idx , this . lang . help [ 'formatH' + _idx ] ) ;
}
this . insertParagraph = this . wrapCommand ( function ( ) {
_this . typing . insertParagraph ( _this . editable ) ;
} ) ;
this . insertOrderedList = this . wrapCommand ( function ( ) {
_this . bullet . insertOrderedList ( _this . editable ) ;
} ) ;
this . insertUnorderedList = this . wrapCommand ( function ( ) {
_this . bullet . insertUnorderedList ( _this . editable ) ;
} ) ;
this . indent = this . wrapCommand ( function ( ) {
_this . bullet . indent ( _this . editable ) ;
} ) ;
this . outdent = this . wrapCommand ( function ( ) {
_this . bullet . outdent ( _this . editable ) ;
} ) ;
/ * *
* insertNode
* insert node
* @ param { Node } node
* /
this . insertNode = this . wrapCommand ( function ( node ) {
if ( _this . isLimited ( external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( node ) . text ( ) . length ) ) {
return ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
var rng = _this . getLastRange ( ) ;
rng . insertNode ( node ) ;
_this . setLastRange ( range . createFromNodeAfter ( node ) . select ( ) ) ;
} ) ;
/ * *
* insert text
* @ param { String } text
* /
this . insertText = this . wrapCommand ( function ( text ) {
if ( _this . isLimited ( text . length ) ) {
return ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
var rng = _this . getLastRange ( ) ;
var textNode = rng . insertNode ( dom . createText ( text ) ) ;
_this . setLastRange ( range . create ( textNode , dom . nodeLength ( textNode ) ) . select ( ) ) ;
} ) ;
/ * *
* paste HTML
* @ param { String } markup
* /
this . pasteHTML = this . wrapCommand ( function ( markup ) {
if ( _this . isLimited ( markup . length ) ) {
return ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
markup = _this . context . invoke ( 'codeview.purify' , markup ) ;
var contents = _this . getLastRange ( ) . pasteHTML ( markup ) ;
_this . setLastRange ( range . createFromNodeAfter ( lists . last ( contents ) ) . select ( ) ) ;
} ) ;
/ * *
* formatBlock
*
* @ param { String } tagName
* /
this . formatBlock = this . wrapCommand ( function ( tagName , $target ) {
var onApplyCustomStyle = _this . options . callbacks . onApplyCustomStyle ;
if ( onApplyCustomStyle ) {
onApplyCustomStyle . call ( _this , $target , _this . context , _this . onFormatBlock ) ;
} else {
_this . onFormatBlock ( tagName , $target ) ;
}
} ) ;
/ * *
* insert horizontal rule
* /
this . insertHorizontalRule = this . wrapCommand ( function ( ) {
var hrNode = _this . getLastRange ( ) . insertNode ( dom . create ( 'HR' ) ) ;
if ( hrNode . nextSibling ) {
_this . setLastRange ( range . create ( hrNode . nextSibling , 0 ) . normalize ( ) . select ( ) ) ;
}
} ) ;
/ * *
* lineHeight
* @ param { String } value
* /
this . lineHeight = this . wrapCommand ( function ( value ) {
_this . style . stylePara ( _this . getLastRange ( ) , {
lineHeight : value
} ) ;
} ) ;
/ * *
* create link ( command )
*
* @ param { Object } linkInfo
* /
this . createLink = this . wrapCommand ( function ( linkInfo ) {
var linkUrl = linkInfo . url ;
var linkText = linkInfo . text ;
var isNewWindow = linkInfo . isNewWindow ;
var checkProtocol = linkInfo . checkProtocol ;
var rng = linkInfo . range || _this . getLastRange ( ) ;
var additionalTextLength = linkText . length - rng . toString ( ) . length ;
if ( additionalTextLength > 0 && _this . isLimited ( additionalTextLength ) ) {
return ;
}
var isTextChanged = rng . toString ( ) !== linkText ; // handle spaced urls from input
if ( typeof linkUrl === 'string' ) {
linkUrl = linkUrl . trim ( ) ;
}
if ( _this . options . onCreateLink ) {
linkUrl = _this . options . onCreateLink ( linkUrl ) ;
} else if ( checkProtocol ) {
// if url doesn't have any protocol and not even a relative or a label, use http:// as default
linkUrl = /^([A-Za-z][A-Za-z0-9+-.]*\:|#|\/)/ . test ( linkUrl ) ? linkUrl : _this . options . defaultProtocol + linkUrl ;
}
var anchors = [ ] ;
if ( isTextChanged ) {
rng = rng . deleteContents ( ) ;
var anchor = rng . insertNode ( external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<A>' + linkText + '</A>' ) [ 0 ] ) ;
anchors . push ( anchor ) ;
} else {
anchors = _this . style . styleNodes ( rng , {
nodeName : 'A' ,
expandClosestSibling : true ,
onlyPartialContains : true
} ) ;
}
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . each ( anchors , function ( idx , anchor ) {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( anchor ) . attr ( 'href' , linkUrl ) ;
if ( isNewWindow ) {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( anchor ) . attr ( 'target' , '_blank' ) ;
} else {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( anchor ) . removeAttr ( 'target' ) ;
}
} ) ;
2020-06-01 11:05:25 +00:00
_this . setLastRange ( _this . createRangeFromList ( anchors ) . select ( ) ) ;
2020-04-01 22:52:43 +00:00
} ) ;
/ * *
* setting color
*
* @ param { Object } sObjColor color code
* @ param { String } sObjColor . foreColor foreground color
* @ param { String } sObjColor . backColor background color
* /
this . color = this . wrapCommand ( function ( colorInfo ) {
var foreColor = colorInfo . foreColor ;
var backColor = colorInfo . backColor ;
if ( foreColor ) {
document . execCommand ( 'foreColor' , false , foreColor ) ;
}
if ( backColor ) {
document . execCommand ( 'backColor' , false , backColor ) ;
}
} ) ;
/ * *
* Set foreground color
*
* @ param { String } colorCode foreground color code
* /
this . foreColor = this . wrapCommand ( function ( colorInfo ) {
document . execCommand ( 'foreColor' , false , colorInfo ) ;
} ) ;
/ * *
* insert Table
*
* @ param { String } dimension of table ( ex : "5x5" )
* /
this . insertTable = this . wrapCommand ( function ( dim ) {
var dimension = dim . split ( 'x' ) ;
var rng = _this . getLastRange ( ) . deleteContents ( ) ;
rng . insertNode ( _this . table . createTable ( dimension [ 0 ] , dimension [ 1 ] , _this . options ) ) ;
} ) ;
/ * *
* remove media object and Figure Elements if media object is img with Figure .
* /
this . removeMedia = this . wrapCommand ( function ( ) {
var $target = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( _this . restoreTarget ( ) ) . parent ( ) ;
if ( $target . closest ( 'figure' ) . length ) {
$target . closest ( 'figure' ) . remove ( ) ;
} else {
$target = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( _this . restoreTarget ( ) ) . detach ( ) ;
}
_this . context . triggerEvent ( 'media.delete' , $target , _this . $editable ) ;
} ) ;
/ * *
* float me
*
* @ param { String } value
* /
this . floatMe = this . wrapCommand ( function ( value ) {
var $target = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( _this . restoreTarget ( ) ) ;
$target . toggleClass ( 'note-float-left' , value === 'left' ) ;
$target . toggleClass ( 'note-float-right' , value === 'right' ) ;
$target . css ( 'float' , value === 'none' ? '' : value ) ;
} ) ;
/ * *
* resize overlay element
* @ param { String } value
* /
this . resize = this . wrapCommand ( function ( value ) {
var $target = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( _this . restoreTarget ( ) ) ;
value = parseFloat ( value ) ;
if ( value === 0 ) {
$target . css ( 'width' , '' ) ;
} else {
$target . css ( {
width : value * 100 + '%' ,
height : ''
} ) ;
}
} ) ;
}
Editor _createClass ( Editor , [ {
key : "initialize" ,
value : function initialize ( ) {
var _this2 = this ;
// bind custom events
this . $editable . on ( 'keydown' , function ( event ) {
if ( event . keyCode === core _key . code . ENTER ) {
_this2 . context . triggerEvent ( 'enter' , event ) ;
}
_this2 . context . triggerEvent ( 'keydown' , event ) ; // keep a snapshot to limit text on input event
_this2 . snapshot = _this2 . history . makeSnapshot ( ) ;
_this2 . hasKeyShortCut = false ;
if ( ! event . isDefaultPrevented ( ) ) {
if ( _this2 . options . shortcuts ) {
_this2 . hasKeyShortCut = _this2 . handleKeyMap ( event ) ;
} else {
_this2 . preventDefaultEditableShortCuts ( event ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
if ( _this2 . isLimited ( 1 , event ) ) {
var lastRange = _this2 . getLastRange ( ) ;
if ( lastRange . eo - lastRange . so === 0 ) {
return false ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
_this2 . setLastRange ( ) ; // record undo in the key event except keyMap.
if ( _this2 . options . recordEveryKeystroke ) {
if ( _this2 . hasKeyShortCut === false ) {
_this2 . history . recordUndo ( ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
} ) . on ( 'keyup' , function ( event ) {
_this2 . setLastRange ( ) ;
_this2 . context . triggerEvent ( 'keyup' , event ) ;
} ) . on ( 'focus' , function ( event ) {
_this2 . setLastRange ( ) ;
_this2 . context . triggerEvent ( 'focus' , event ) ;
} ) . on ( 'blur' , function ( event ) {
_this2 . context . triggerEvent ( 'blur' , event ) ;
} ) . on ( 'mousedown' , function ( event ) {
_this2 . context . triggerEvent ( 'mousedown' , event ) ;
} ) . on ( 'mouseup' , function ( event ) {
_this2 . setLastRange ( ) ;
_this2 . history . recordUndo ( ) ;
_this2 . context . triggerEvent ( 'mouseup' , event ) ;
} ) . on ( 'scroll' , function ( event ) {
_this2 . context . triggerEvent ( 'scroll' , event ) ;
} ) . on ( 'paste' , function ( event ) {
_this2 . setLastRange ( ) ;
_this2 . context . triggerEvent ( 'paste' , event ) ;
} ) . on ( 'input' , function ( ) {
// To limit composition characters (e.g. Korean)
if ( _this2 . isLimited ( 0 ) && _this2 . snapshot ) {
_this2 . history . applySnapshot ( _this2 . snapshot ) ;
}
} ) ;
this . $editable . attr ( 'spellcheck' , this . options . spellCheck ) ;
this . $editable . attr ( 'autocorrect' , this . options . spellCheck ) ;
if ( this . options . disableGrammar ) {
this . $editable . attr ( 'data-gramm' , false ) ;
} // init content before set event
this . $editable . html ( dom . html ( this . $note ) || dom . emptyPara ) ;
this . $editable . on ( env . inputEventName , func . debounce ( function ( ) {
_this2 . context . triggerEvent ( 'change' , _this2 . $editable . html ( ) , _this2 . $editable ) ;
} , 10 ) ) ;
this . $editable . on ( 'focusin' , function ( event ) {
_this2 . context . triggerEvent ( 'focusin' , event ) ;
} ) . on ( 'focusout' , function ( event ) {
_this2 . context . triggerEvent ( 'focusout' , event ) ;
} ) ;
if ( this . options . airMode ) {
if ( this . options . overrideContextMenu ) {
this . $editor . on ( 'contextmenu' , function ( event ) {
_this2 . context . triggerEvent ( 'contextmenu' , event ) ;
return false ;
} ) ;
}
} else {
if ( this . options . width ) {
this . $editor . outerWidth ( this . options . width ) ;
}
if ( this . options . height ) {
this . $editable . outerHeight ( this . options . height ) ;
}
if ( this . options . maxHeight ) {
this . $editable . css ( 'max-height' , this . options . maxHeight ) ;
}
if ( this . options . minHeight ) {
this . $editable . css ( 'min-height' , this . options . minHeight ) ;
}
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
this . history . recordUndo ( ) ;
this . setLastRange ( ) ;
}
} , {
key : "destroy" ,
value : function destroy ( ) {
this . $editable . off ( ) ;
}
} , {
key : "handleKeyMap" ,
value : function handleKeyMap ( event ) {
var keyMap = this . options . keyMap [ env . isMac ? 'mac' : 'pc' ] ;
var keys = [ ] ;
if ( event . metaKey ) {
keys . push ( 'CMD' ) ;
}
if ( event . ctrlKey && ! event . altKey ) {
keys . push ( 'CTRL' ) ;
}
if ( event . shiftKey ) {
keys . push ( 'SHIFT' ) ;
}
var keyName = core _key . nameFromCode [ event . keyCode ] ;
if ( keyName ) {
keys . push ( keyName ) ;
}
var eventName = keyMap [ keys . join ( '+' ) ] ;
if ( keyName === 'TAB' && ! this . options . tabDisable ) {
this . afterCommand ( ) ;
} else if ( eventName ) {
if ( this . context . invoke ( eventName ) !== false ) {
event . preventDefault ( ) ; // if keyMap action was invoked
return true ;
}
} else if ( core _key . isEdit ( event . keyCode ) ) {
this . afterCommand ( ) ;
}
return false ;
}
} , {
key : "preventDefaultEditableShortCuts" ,
value : function preventDefaultEditableShortCuts ( event ) {
// B(Bold, 66) / I(Italic, 73) / U(Underline, 85)
if ( ( event . ctrlKey || event . metaKey ) && lists . contains ( [ 66 , 73 , 85 ] , event . keyCode ) ) {
event . preventDefault ( ) ;
}
}
} , {
key : "isLimited" ,
value : function isLimited ( pad , event ) {
pad = pad || 0 ;
if ( typeof event !== 'undefined' ) {
if ( core _key . isMove ( event . keyCode ) || core _key . isNavigation ( event . keyCode ) || event . ctrlKey || event . metaKey || lists . contains ( [ core _key . code . BACKSPACE , core _key . code . DELETE ] , event . keyCode ) ) {
return false ;
}
}
if ( this . options . maxTextLength > 0 ) {
if ( this . $editable . text ( ) . length + pad > this . options . maxTextLength ) {
return true ;
}
}
return false ;
}
/ * *
* create range
* @ return { WrappedRange }
* /
} , {
key : "createRange" ,
value : function createRange ( ) {
this . focus ( ) ;
this . setLastRange ( ) ;
return this . getLastRange ( ) ;
}
2020-06-01 11:05:25 +00:00
/ * *
* create a new range from the list of elements
*
* @ param { list } dom element list
* @ return { WrappedRange }
* /
} , {
key : "createRangeFromList" ,
value : function createRangeFromList ( lst ) {
var startRange = range . createFromNodeBefore ( lists . head ( lst ) ) ;
var startPoint = startRange . getStartPoint ( ) ;
var endRange = range . createFromNodeAfter ( lists . last ( lst ) ) ;
var endPoint = endRange . getEndPoint ( ) ;
return range . create ( startPoint . node , startPoint . offset , endPoint . node , endPoint . offset ) ;
}
/ * *
* set the last range
*
* if given rng is exist , set rng as the last range
* or create a new range at the end of the document
*
* @ param { WrappedRange } rng
* /
2020-04-01 22:52:43 +00:00
} , {
key : "setLastRange" ,
value : function setLastRange ( rng ) {
if ( rng ) {
this . lastRange = rng ;
} else {
this . lastRange = range . create ( this . editable ) ;
if ( external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( this . lastRange . sc ) . closest ( '.note-editable' ) . length === 0 ) {
this . lastRange = range . createFromBodyElement ( this . editable ) ;
}
}
}
2020-06-01 11:05:25 +00:00
/ * *
* get the last range
*
* if there is a saved last range , return it
* or create a new range and return it
*
* @ return { WrappedRange }
* /
2020-04-01 22:52:43 +00:00
} , {
key : "getLastRange" ,
value : function getLastRange ( ) {
if ( ! this . lastRange ) {
this . setLastRange ( ) ;
}
return this . lastRange ;
}
/ * *
* saveRange
*
* save current range
*
* @ param { Boolean } [ thenCollapse = false ]
* /
} , {
key : "saveRange" ,
value : function saveRange ( thenCollapse ) {
if ( thenCollapse ) {
this . getLastRange ( ) . collapse ( ) . select ( ) ;
}
}
/ * *
* restoreRange
*
* restore lately range
* /
} , {
key : "restoreRange" ,
value : function restoreRange ( ) {
if ( this . lastRange ) {
this . lastRange . select ( ) ;
this . focus ( ) ;
}
}
} , {
key : "saveTarget" ,
value : function saveTarget ( node ) {
this . $editable . data ( 'target' , node ) ;
}
} , {
key : "clearTarget" ,
value : function clearTarget ( ) {
this . $editable . removeData ( 'target' ) ;
}
} , {
key : "restoreTarget" ,
value : function restoreTarget ( ) {
return this . $editable . data ( 'target' ) ;
}
/ * *
* currentStyle
*
* current style
* @ return { Object | Boolean } unfocus
* /
} , {
key : "currentStyle" ,
value : function currentStyle ( ) {
var rng = range . create ( ) ;
if ( rng ) {
rng = rng . normalize ( ) ;
}
return rng ? this . style . current ( rng ) : this . style . fromNode ( this . $editable ) ;
}
/ * *
* style from node
*
* @ param { jQuery } $node
* @ return { Object }
* /
} , {
key : "styleFromNode" ,
value : function styleFromNode ( $node ) {
return this . style . fromNode ( $node ) ;
}
/ * *
* undo
* /
} , {
key : "undo" ,
value : function undo ( ) {
this . context . triggerEvent ( 'before.command' , this . $editable . html ( ) ) ;
this . history . undo ( ) ;
this . context . triggerEvent ( 'change' , this . $editable . html ( ) , this . $editable ) ;
}
/ *
* commit
* /
} , {
key : "commit" ,
value : function commit ( ) {
this . context . triggerEvent ( 'before.command' , this . $editable . html ( ) ) ;
this . history . commit ( ) ;
this . context . triggerEvent ( 'change' , this . $editable . html ( ) , this . $editable ) ;
}
/ * *
* redo
* /
} , {
key : "redo" ,
value : function redo ( ) {
this . context . triggerEvent ( 'before.command' , this . $editable . html ( ) ) ;
this . history . redo ( ) ;
this . context . triggerEvent ( 'change' , this . $editable . html ( ) , this . $editable ) ;
}
/ * *
* before command
* /
} , {
key : "beforeCommand" ,
value : function beforeCommand ( ) {
this . context . triggerEvent ( 'before.command' , this . $editable . html ( ) ) ; // Set styleWithCSS before run a command
document . execCommand ( 'styleWithCSS' , false , this . options . styleWithCSS ) ; // keep focus on editable before command execution
this . focus ( ) ;
}
/ * *
* after command
* @ param { Boolean } isPreventTrigger
* /
} , {
key : "afterCommand" ,
value : function afterCommand ( isPreventTrigger ) {
this . normalizeContent ( ) ;
this . history . recordUndo ( ) ;
if ( ! isPreventTrigger ) {
this . context . triggerEvent ( 'change' , this . $editable . html ( ) , this . $editable ) ;
}
}
/ * *
* handle tab key
* /
} , {
key : "tab" ,
value : function tab ( ) {
var rng = this . getLastRange ( ) ;
if ( rng . isCollapsed ( ) && rng . isOnCell ( ) ) {
this . table . tab ( rng ) ;
} else {
if ( this . options . tabSize === 0 ) {
return false ;
}
if ( ! this . isLimited ( this . options . tabSize ) ) {
this . beforeCommand ( ) ;
this . typing . insertTab ( rng , this . options . tabSize ) ;
this . afterCommand ( ) ;
}
}
}
/ * *
* handle shift + tab key
* /
} , {
key : "untab" ,
value : function untab ( ) {
var rng = this . getLastRange ( ) ;
if ( rng . isCollapsed ( ) && rng . isOnCell ( ) ) {
this . table . tab ( rng , true ) ;
} else {
if ( this . options . tabSize === 0 ) {
return false ;
}
}
}
/ * *
* run given function between beforeCommand and afterCommand
* /
} , {
key : "wrapCommand" ,
value : function wrapCommand ( fn ) {
return function ( ) {
this . beforeCommand ( ) ;
fn . apply ( this , arguments ) ;
this . afterCommand ( ) ;
2019-06-10 15:38:54 +00:00
} ;
2020-04-01 22:52:43 +00:00
}
/ * *
* insert image
*
* @ param { String } src
* @ param { String | Function } param
* @ return { Promise }
* /
} , {
key : "insertImage" ,
value : function insertImage ( src , param ) {
var _this3 = this ;
return createImage ( src , param ) . then ( function ( $image ) {
_this3 . beforeCommand ( ) ;
if ( typeof param === 'function' ) {
param ( $image ) ;
} else {
if ( typeof param === 'string' ) {
$image . attr ( 'data-filename' , param ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
$image . css ( 'width' , Math . min ( _this3 . $editable . width ( ) , $image . width ( ) ) ) ;
}
$image . show ( ) ;
_this3 . getLastRange ( ) . insertNode ( $image [ 0 ] ) ;
_this3 . setLastRange ( range . createFromNodeAfter ( $image [ 0 ] ) . select ( ) ) ;
_this3 . afterCommand ( ) ;
} ) . fail ( function ( e ) {
_this3 . context . triggerEvent ( 'image.upload.error' , e ) ;
} ) ;
}
/ * *
* insertImages
* @ param { File [ ] } files
* /
} , {
key : "insertImagesAsDataURL" ,
value : function insertImagesAsDataURL ( files ) {
var _this4 = this ;
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . each ( files , function ( idx , file ) {
var filename = file . name ;
if ( _this4 . options . maximumImageFileSize && _this4 . options . maximumImageFileSize < file . size ) {
_this4 . context . triggerEvent ( 'image.upload.error' , _this4 . lang . image . maximumFileSizeError ) ;
} else {
readFileAsDataURL ( file ) . then ( function ( dataURL ) {
return _this4 . insertImage ( dataURL , filename ) ;
} ) . fail ( function ( ) {
_this4 . context . triggerEvent ( 'image.upload.error' ) ;
} ) ;
}
} ) ;
}
/ * *
* insertImagesOrCallback
* @ param { File [ ] } files
* /
} , {
key : "insertImagesOrCallback" ,
value : function insertImagesOrCallback ( files ) {
var callbacks = this . options . callbacks ; // If onImageUpload set,
if ( callbacks . onImageUpload ) {
this . context . triggerEvent ( 'image.upload' , files ) ; // else insert Image as dataURL
} else {
this . insertImagesAsDataURL ( files ) ;
}
}
/ * *
* return selected plain text
* @ return { String } text
* /
} , {
key : "getSelectedText" ,
value : function getSelectedText ( ) {
var rng = this . getLastRange ( ) ; // if range on anchor, expand range with anchor
if ( rng . isOnAnchor ( ) ) {
rng = range . createFromNode ( dom . ancestor ( rng . sc , dom . isAnchor ) ) ;
}
return rng . toString ( ) ;
}
} , {
key : "onFormatBlock" ,
value : function onFormatBlock ( tagName , $target ) {
// [workaround] for MSIE, IE need `<`
document . execCommand ( 'FormatBlock' , false , env . isMSIE ? '<' + tagName + '>' : tagName ) ; // support custom class
if ( $target && $target . length ) {
// find the exact element has given tagName
if ( $target [ 0 ] . tagName . toUpperCase ( ) !== tagName . toUpperCase ( ) ) {
$target = $target . find ( tagName ) ;
}
if ( $target && $target . length ) {
var className = $target [ 0 ] . className || '' ;
if ( className ) {
var currentRange = this . createRange ( ) ;
var $parent = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( [ currentRange . sc , currentRange . ec ] ) . closest ( tagName ) ;
$parent . addClass ( className ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
}
}
} , {
key : "formatPara" ,
value : function formatPara ( ) {
this . formatBlock ( 'P' ) ;
}
} , {
key : "fontStyling" ,
value : function fontStyling ( target , value ) {
var rng = this . getLastRange ( ) ;
if ( rng !== '' ) {
var spans = this . style . styleNodes ( rng ) ;
this . $editor . find ( '.note-status-output' ) . html ( '' ) ;
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( spans ) . css ( target , value ) ; // [workaround] added styled bogus span for style
// - also bogus character needed for cursor position
if ( rng . isCollapsed ( ) ) {
var firstSpan = lists . head ( spans ) ;
if ( firstSpan && ! dom . nodeLength ( firstSpan ) ) {
firstSpan . innerHTML = dom . ZERO _WIDTH _NBSP _CHAR ;
2020-06-01 11:05:25 +00:00
range . createFromNode ( firstSpan . firstChild ) . select ( ) ;
2020-04-01 22:52:43 +00:00
this . setLastRange ( ) ;
this . $editable . data ( KEY _BOGUS , firstSpan ) ;
}
2020-06-01 11:05:25 +00:00
} else {
this . setLastRange ( this . createRangeFromList ( spans ) . select ( ) ) ;
2020-04-01 22:52:43 +00:00
}
} else {
var noteStatusOutput = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . now ( ) ;
this . $editor . find ( '.note-status-output' ) . html ( '<div id="note-status-output-' + noteStatusOutput + '" class="alert alert-info">' + this . lang . output . noSelection + '</div>' ) ;
setTimeout ( function ( ) {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '#note-status-output-' + noteStatusOutput ) . remove ( ) ;
} , 5000 ) ;
}
}
/ * *
* unlink
*
* @ type command
* /
} , {
key : "unlink" ,
value : function unlink ( ) {
var rng = this . getLastRange ( ) ;
if ( rng . isOnAnchor ( ) ) {
var anchor = dom . ancestor ( rng . sc , dom . isAnchor ) ;
rng = range . createFromNode ( anchor ) ;
rng . select ( ) ;
this . setLastRange ( ) ;
this . beforeCommand ( ) ;
document . execCommand ( 'unlink' ) ;
this . afterCommand ( ) ;
}
}
/ * *
* returns link info
*
* @ return { Object }
* @ return { WrappedRange } return . range
* @ return { String } return . text
* @ return { Boolean } [ return . isNewWindow = true ]
* @ return { String } [ return . url = "" ]
* /
} , {
key : "getLinkInfo" ,
value : function getLinkInfo ( ) {
var rng = this . getLastRange ( ) . expand ( dom . isAnchor ) ; // Get the first anchor on range(for edit).
var $anchor = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( lists . head ( rng . nodes ( dom . isAnchor ) ) ) ;
var linkInfo = {
range : rng ,
text : rng . toString ( ) ,
url : $anchor . length ? $anchor . attr ( 'href' ) : ''
} ; // When anchor exists,
if ( $anchor . length ) {
// Set isNewWindow by checking its target.
linkInfo . isNewWindow = $anchor . attr ( 'target' ) === '_blank' ;
}
return linkInfo ;
}
} , {
key : "addRow" ,
value : function addRow ( position ) {
var rng = this . getLastRange ( this . $editable ) ;
if ( rng . isCollapsed ( ) && rng . isOnCell ( ) ) {
this . beforeCommand ( ) ;
this . table . addRow ( rng , position ) ;
this . afterCommand ( ) ;
}
}
} , {
key : "addCol" ,
value : function addCol ( position ) {
var rng = this . getLastRange ( this . $editable ) ;
if ( rng . isCollapsed ( ) && rng . isOnCell ( ) ) {
this . beforeCommand ( ) ;
this . table . addCol ( rng , position ) ;
this . afterCommand ( ) ;
}
}
} , {
key : "deleteRow" ,
value : function deleteRow ( ) {
var rng = this . getLastRange ( this . $editable ) ;
if ( rng . isCollapsed ( ) && rng . isOnCell ( ) ) {
this . beforeCommand ( ) ;
this . table . deleteRow ( rng ) ;
this . afterCommand ( ) ;
}
}
} , {
key : "deleteCol" ,
value : function deleteCol ( ) {
var rng = this . getLastRange ( this . $editable ) ;
if ( rng . isCollapsed ( ) && rng . isOnCell ( ) ) {
this . beforeCommand ( ) ;
this . table . deleteCol ( rng ) ;
this . afterCommand ( ) ;
}
}
} , {
key : "deleteTable" ,
value : function deleteTable ( ) {
var rng = this . getLastRange ( this . $editable ) ;
if ( rng . isCollapsed ( ) && rng . isOnCell ( ) ) {
this . beforeCommand ( ) ;
this . table . deleteTable ( rng ) ;
this . afterCommand ( ) ;
}
}
/ * *
* @ param { Position } pos
* @ param { jQuery } $target - target element
* @ param { Boolean } [ bKeepRatio ] - keep ratio
* /
} , {
key : "resizeTo" ,
value : function resizeTo ( pos , $target , bKeepRatio ) {
var imageSize ;
if ( bKeepRatio ) {
var newRatio = pos . y / pos . x ;
var ratio = $target . data ( 'ratio' ) ;
imageSize = {
width : ratio > newRatio ? pos . x : pos . y / ratio ,
height : ratio > newRatio ? pos . x * ratio : pos . y
} ;
} else {
imageSize = {
width : pos . x ,
height : pos . y
} ;
}
$target . css ( imageSize ) ;
}
/ * *
* returns whether editable area has focus or not .
* /
} , {
key : "hasFocus" ,
value : function hasFocus ( ) {
return this . $editable . is ( ':focus' ) ;
}
/ * *
* set focus
* /
} , {
key : "focus" ,
value : function focus ( ) {
// [workaround] Screen will move when page is scolled in IE.
// - do focus when not focused
if ( ! this . hasFocus ( ) ) {
this . $editable . focus ( ) ;
}
}
/ * *
* returns whether contents is empty or not .
* @ return { Boolean }
* /
} , {
key : "isEmpty" ,
value : function isEmpty ( ) {
return dom . isEmpty ( this . $editable [ 0 ] ) || dom . emptyPara === this . $editable . html ( ) ;
}
/ * *
* Removes all contents and restores the editable instance to an _emptyPara _ .
* /
} , {
key : "empty" ,
value : function empty ( ) {
this . context . invoke ( 'code' , dom . emptyPara ) ;
}
/ * *
* normalize content
* /
} , {
key : "normalizeContent" ,
value : function normalizeContent ( ) {
this . $editable [ 0 ] . normalize ( ) ;
}
} ] ) ;
return Editor ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/module/Clipboard.js
function Clipboard _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function Clipboard _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 ) ; } }
function Clipboard _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) Clipboard _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) Clipboard _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
2020-06-01 11:05:25 +00:00
var Clipboard _Clipboard = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function Clipboard ( context ) {
Clipboard _classCallCheck ( this , Clipboard ) ;
this . context = context ;
this . $editable = context . layoutInfo . editable ;
}
Clipboard _createClass ( Clipboard , [ {
key : "initialize" ,
value : function initialize ( ) {
this . $editable . on ( 'paste' , this . pasteByEvent . bind ( this ) ) ;
}
/ * *
* paste by clipboard event
*
* @ param { Event } event
* /
} , {
key : "pasteByEvent" ,
value : function pasteByEvent ( event ) {
var _this = this ;
var clipboardData = event . originalEvent . clipboardData ;
if ( clipboardData && clipboardData . items && clipboardData . items . length ) {
var item = clipboardData . items . length > 1 ? clipboardData . items [ 1 ] : lists . head ( clipboardData . items ) ;
if ( item . kind === 'file' && item . type . indexOf ( 'image/' ) !== - 1 ) {
// paste img file
this . context . invoke ( 'editor.insertImagesOrCallback' , [ item . getAsFile ( ) ] ) ;
event . preventDefault ( ) ;
} else if ( item . kind === 'string' ) {
// paste text with maxTextLength check
if ( this . context . invoke ( 'editor.isLimited' , clipboardData . getData ( 'Text' ) . length ) ) {
event . preventDefault ( ) ;
}
}
} else if ( window . clipboardData ) {
// for IE
var text = window . clipboardData . getData ( 'text' ) ;
if ( this . context . invoke ( 'editor.isLimited' , text . length ) ) {
event . preventDefault ( ) ;
}
} // Call editor.afterCommand after proceeding default event handler
setTimeout ( function ( ) {
_this . context . invoke ( 'editor.afterCommand' ) ;
} , 10 ) ;
}
} ] ) ;
return Clipboard ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/module/Dropzone.js
function Dropzone _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function Dropzone _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 ) ; } }
function Dropzone _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) Dropzone _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) Dropzone _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
2020-06-01 11:05:25 +00:00
var Dropzone _Dropzone = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function Dropzone ( context ) {
Dropzone _classCallCheck ( this , Dropzone ) ;
this . context = context ;
this . $eventListener = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( document ) ;
this . $editor = context . layoutInfo . editor ;
this . $editable = context . layoutInfo . editable ;
this . options = context . options ;
this . lang = this . options . langInfo ;
this . documentEventHandlers = { } ;
2020-06-01 11:05:25 +00:00
this . $dropzone = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( [ '<div class="note-dropzone">' , '<div class="note-dropzone-message"></div>' , '</div>' ] . join ( '' ) ) . prependTo ( this . $editor ) ;
2020-04-01 22:52:43 +00:00
}
/ * *
* attach Drag and Drop Events
* /
Dropzone _createClass ( Dropzone , [ {
key : "initialize" ,
value : function initialize ( ) {
if ( this . options . disableDragAndDrop ) {
// prevent default drop event
this . documentEventHandlers . onDrop = function ( e ) {
e . preventDefault ( ) ;
} ; // do not consider outside of dropzone
this . $eventListener = this . $dropzone ;
this . $eventListener . on ( 'drop' , this . documentEventHandlers . onDrop ) ;
} else {
this . attachDragAndDropEvent ( ) ;
}
}
/ * *
* attach Drag and Drop Events
* /
} , {
key : "attachDragAndDropEvent" ,
value : function attachDragAndDropEvent ( ) {
var _this = this ;
var collection = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( ) ;
var $dropzoneMessage = this . $dropzone . find ( '.note-dropzone-message' ) ;
this . documentEventHandlers . onDragenter = function ( e ) {
var isCodeview = _this . context . invoke ( 'codeview.isActivated' ) ;
var hasEditorSize = _this . $editor . width ( ) > 0 && _this . $editor . height ( ) > 0 ;
if ( ! isCodeview && ! collection . length && hasEditorSize ) {
_this . $editor . addClass ( 'dragover' ) ;
_this . $dropzone . width ( _this . $editor . width ( ) ) ;
_this . $dropzone . height ( _this . $editor . height ( ) ) ;
$dropzoneMessage . text ( _this . lang . image . dragImageHere ) ;
}
collection = collection . add ( e . target ) ;
2019-06-10 15:38:54 +00:00
} ;
2020-04-01 22:52:43 +00:00
this . documentEventHandlers . onDragleave = function ( e ) {
collection = collection . not ( e . target ) ; // If nodeName is BODY, then just make it over (fix for IE)
if ( ! collection . length || e . target . nodeName === 'BODY' ) {
collection = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( ) ;
_this . $editor . removeClass ( 'dragover' ) ;
}
2019-06-10 15:38:54 +00:00
} ;
2020-04-01 22:52:43 +00:00
this . documentEventHandlers . onDrop = function ( ) {
collection = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( ) ;
_this . $editor . removeClass ( 'dragover' ) ;
} ; // show dropzone on dragenter when dragging a object to document
// -but only if the editor is visible, i.e. has a positive width and height
this . $eventListener . on ( 'dragenter' , this . documentEventHandlers . onDragenter ) . on ( 'dragleave' , this . documentEventHandlers . onDragleave ) . on ( 'drop' , this . documentEventHandlers . onDrop ) ; // change dropzone's message on hover.
this . $dropzone . on ( 'dragenter' , function ( ) {
_this . $dropzone . addClass ( 'hover' ) ;
$dropzoneMessage . text ( _this . lang . image . dropImage ) ;
} ) . on ( 'dragleave' , function ( ) {
_this . $dropzone . removeClass ( 'hover' ) ;
$dropzoneMessage . text ( _this . lang . image . dragImageHere ) ;
} ) ; // attach dropImage
this . $dropzone . on ( 'drop' , function ( event ) {
var dataTransfer = event . originalEvent . dataTransfer ; // stop the browser from opening the dropped content
event . preventDefault ( ) ;
if ( dataTransfer && dataTransfer . files && dataTransfer . files . length ) {
_this . $editable . focus ( ) ;
_this . context . invoke ( 'editor.insertImagesOrCallback' , dataTransfer . files ) ;
} else {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . each ( dataTransfer . types , function ( idx , type ) {
// skip moz-specific types
if ( type . toLowerCase ( ) . indexOf ( '_moz_' ) > - 1 ) {
return ;
}
var content = dataTransfer . getData ( type ) ;
if ( type . toLowerCase ( ) . indexOf ( 'text' ) > - 1 ) {
_this . context . invoke ( 'editor.pasteHTML' , content ) ;
} else {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( content ) . each ( function ( idx , item ) {
_this . context . invoke ( 'editor.insertNode' , item ) ;
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
}
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
}
} ) . on ( 'dragover' , false ) ; // prevent default dragover event
}
} , {
key : "destroy" ,
value : function destroy ( ) {
var _this2 = this ;
Object . keys ( this . documentEventHandlers ) . forEach ( function ( key ) {
_this2 . $eventListener . off ( key . substr ( 2 ) . toLowerCase ( ) , _this2 . documentEventHandlers [ key ] ) ;
} ) ;
this . documentEventHandlers = { } ;
}
} ] ) ;
return Dropzone ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/module/Codeview.js
2020-06-01 11:05:25 +00:00
function _createForOfIteratorHelper ( o ) { if ( typeof Symbol === "undefined" || o [ Symbol . iterator ] == null ) { if ( Array . isArray ( o ) || ( o = _unsupportedIterableToArray ( o ) ) ) { var i = 0 ; var F = function F ( ) { } ; return { s : F , n : function n ( ) { if ( i >= o . length ) return { done : true } ; return { done : false , value : o [ i ++ ] } ; } , e : function e ( _e ) { throw _e ; } , f : F } ; } throw new TypeError ( "Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method." ) ; } var it , normalCompletion = true , didErr = false , err ; return { s : function s ( ) { it = o [ Symbol . iterator ] ( ) ; } , n : function n ( ) { var step = it . next ( ) ; normalCompletion = step . done ; return step ; } , e : function e ( _e2 ) { didErr = true ; err = _e2 ; } , f : function f ( ) { try { if ( ! normalCompletion && it [ "return" ] != null ) it [ "return" ] ( ) ; } finally { if ( didErr ) throw err ; } } } ; }
function _unsupportedIterableToArray ( o , minLen ) { if ( ! o ) return ; if ( typeof o === "string" ) return _arrayLikeToArray ( o , minLen ) ; var n = Object . prototype . toString . call ( o ) . slice ( 8 , - 1 ) ; if ( n === "Object" && o . constructor ) n = o . constructor . name ; if ( n === "Map" || n === "Set" ) return Array . from ( n ) ; if ( n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/ . test ( n ) ) return _arrayLikeToArray ( o , minLen ) ; }
function _arrayLikeToArray ( arr , len ) { if ( len == null || len > arr . length ) len = arr . length ; for ( var i = 0 , arr2 = new Array ( len ) ; i < len ; i ++ ) { arr2 [ i ] = arr [ i ] ; } return arr2 ; }
2020-04-01 22:52:43 +00:00
function Codeview _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function Codeview _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 ) ; } }
function Codeview _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) Codeview _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) Codeview _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
/ * *
* @ class Codeview
* /
2020-06-01 11:05:25 +00:00
var Codeview _CodeView = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function CodeView ( context ) {
Codeview _classCallCheck ( this , CodeView ) ;
this . context = context ;
this . $editor = context . layoutInfo . editor ;
this . $editable = context . layoutInfo . editable ;
this . $codable = context . layoutInfo . codable ;
this . options = context . options ;
2020-06-01 11:05:25 +00:00
this . CodeMirrorConstructor = window . CodeMirror ;
if ( this . options . codemirror . CodeMirrorConstructor ) {
this . CodeMirrorConstructor = this . options . codemirror . CodeMirrorConstructor ;
}
2020-04-01 22:52:43 +00:00
}
Codeview _createClass ( CodeView , [ {
key : "sync" ,
2020-06-01 11:05:25 +00:00
value : function sync ( html ) {
2020-04-01 22:52:43 +00:00
var isCodeview = this . isActivated ( ) ;
2020-06-01 11:05:25 +00:00
var CodeMirror = this . CodeMirrorConstructor ;
2020-04-01 22:52:43 +00:00
2020-06-01 11:05:25 +00:00
if ( isCodeview ) {
if ( html ) {
if ( CodeMirror ) {
this . $codable . data ( 'cmEditor' ) . getDoc ( ) . setValue ( html ) ;
} else {
this . $codable . val ( html ) ;
}
} else {
if ( CodeMirror ) {
this . $codable . data ( 'cmEditor' ) . save ( ) ;
}
}
2020-04-01 22:52:43 +00:00
}
}
2020-06-01 11:05:25 +00:00
} , {
key : "initialize" ,
value : function initialize ( ) {
var _this = this ;
this . $codable . on ( 'keyup' , function ( event ) {
if ( event . keyCode === core _key . code . ESCAPE ) {
_this . deactivate ( ) ;
}
} ) ;
}
2020-04-01 22:52:43 +00:00
/ * *
* @ return { Boolean }
* /
} , {
key : "isActivated" ,
value : function isActivated ( ) {
return this . $editor . hasClass ( 'codeview' ) ;
}
/ * *
* toggle codeview
* /
} , {
key : "toggle" ,
value : function toggle ( ) {
if ( this . isActivated ( ) ) {
this . deactivate ( ) ;
} else {
this . activate ( ) ;
}
this . context . triggerEvent ( 'codeview.toggled' ) ;
}
/ * *
* purify input value
* @ param value
* @ returns { * }
* /
} , {
key : "purify" ,
value : function purify ( value ) {
if ( this . options . codeviewFilter ) {
// filter code view regex
value = value . replace ( this . options . codeviewFilterRegex , '' ) ; // allow specific iframe tag
if ( this . options . codeviewIframeFilter ) {
var whitelist = this . options . codeviewIframeWhitelistSrc . concat ( this . options . codeviewIframeWhitelistSrcBase ) ;
value = value . replace ( /(<iframe.*?>.*?(?:<\/iframe>)?)/gi , function ( tag ) {
// remove if src attribute is duplicated
if ( /<.+src(?==?('|"|\s)?)[\s\S]+src(?=('|"|\s)?)[^>]*?>/i . test ( tag ) ) {
return '' ;
}
2020-06-01 11:05:25 +00:00
var _iterator = _createForOfIteratorHelper ( whitelist ) ,
_step ;
2020-04-01 22:52:43 +00:00
try {
2020-06-01 11:05:25 +00:00
for ( _iterator . s ( ) ; ! ( _step = _iterator . n ( ) ) . done ; ) {
2020-04-01 22:52:43 +00:00
var src = _step . value ;
// pass if src is trusted
if ( new RegExp ( 'src="(https?:)?\/\/' + src . replace ( /[-\/\\^$*+?.()|[\]{}]/g , '\\$&' ) + '\/(.+)"' ) . test ( tag ) ) {
return tag ;
}
}
} catch ( err ) {
2020-06-01 11:05:25 +00:00
_iterator . e ( err ) ;
2020-04-01 22:52:43 +00:00
} finally {
2020-06-01 11:05:25 +00:00
_iterator . f ( ) ;
2020-04-01 22:52:43 +00:00
}
return '' ;
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
}
}
return value ;
}
/ * *
* activate code view
* /
} , {
key : "activate" ,
value : function activate ( ) {
2020-06-01 11:05:25 +00:00
var _this2 = this ;
2020-04-01 22:52:43 +00:00
2020-06-01 11:05:25 +00:00
var CodeMirror = this . CodeMirrorConstructor ;
2020-04-01 22:52:43 +00:00
this . $codable . val ( dom . html ( this . $editable , this . options . prettifyHtml ) ) ;
this . $codable . height ( this . $editable . height ( ) ) ;
this . context . invoke ( 'toolbar.updateCodeview' , true ) ;
2020-06-01 11:05:25 +00:00
this . context . invoke ( 'airPopover.updateCodeview' , true ) ;
2020-04-01 22:52:43 +00:00
this . $editor . addClass ( 'codeview' ) ;
this . $codable . focus ( ) ; // activate CodeMirror as codable
2020-06-01 11:05:25 +00:00
if ( CodeMirror ) {
2020-04-01 22:52:43 +00:00
var cmEditor = CodeMirror . fromTextArea ( this . $codable [ 0 ] , this . options . codemirror ) ; // CodeMirror TernServer
if ( this . options . codemirror . tern ) {
var server = new CodeMirror . TernServer ( this . options . codemirror . tern ) ;
cmEditor . ternServer = server ;
cmEditor . on ( 'cursorActivity' , function ( cm ) {
server . updateArgHints ( cm ) ;
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
}
cmEditor . on ( 'blur' , function ( event ) {
2020-06-01 11:05:25 +00:00
_this2 . context . triggerEvent ( 'blur.codeview' , cmEditor . getValue ( ) , event ) ;
2020-04-01 22:52:43 +00:00
} ) ;
cmEditor . on ( 'change' , function ( ) {
2020-06-01 11:05:25 +00:00
_this2 . context . triggerEvent ( 'change.codeview' , cmEditor . getValue ( ) , cmEditor ) ;
2020-04-01 22:52:43 +00:00
} ) ; // CodeMirror hasn't Padding.
cmEditor . setSize ( null , this . $editable . outerHeight ( ) ) ;
this . $codable . data ( 'cmEditor' , cmEditor ) ;
} else {
this . $codable . on ( 'blur' , function ( event ) {
2020-06-01 11:05:25 +00:00
_this2 . context . triggerEvent ( 'blur.codeview' , _this2 . $codable . val ( ) , event ) ;
2020-04-01 22:52:43 +00:00
} ) ;
this . $codable . on ( 'input' , function ( ) {
2020-06-01 11:05:25 +00:00
_this2 . context . triggerEvent ( 'change.codeview' , _this2 . $codable . val ( ) , _this2 . $codable ) ;
2020-04-01 22:52:43 +00:00
} ) ;
}
}
/ * *
* deactivate code view
* /
} , {
key : "deactivate" ,
value : function deactivate ( ) {
2020-06-01 11:05:25 +00:00
var CodeMirror = this . CodeMirrorConstructor ; // deactivate CodeMirror as codable
if ( CodeMirror ) {
2020-04-01 22:52:43 +00:00
var cmEditor = this . $codable . data ( 'cmEditor' ) ;
this . $codable . val ( cmEditor . getValue ( ) ) ;
cmEditor . toTextArea ( ) ;
}
var value = this . purify ( dom . value ( this . $codable , this . options . prettifyHtml ) || dom . emptyPara ) ;
var isChange = this . $editable . html ( ) !== value ;
this . $editable . html ( value ) ;
this . $editable . height ( this . options . height ? this . $codable . height ( ) : 'auto' ) ;
this . $editor . removeClass ( 'codeview' ) ;
if ( isChange ) {
this . context . triggerEvent ( 'change' , this . $editable . html ( ) , this . $editable ) ;
}
this . $editable . focus ( ) ;
this . context . invoke ( 'toolbar.updateCodeview' , false ) ;
2020-06-01 11:05:25 +00:00
this . context . invoke ( 'airPopover.updateCodeview' , false ) ;
2020-04-01 22:52:43 +00:00
}
} , {
key : "destroy" ,
value : function destroy ( ) {
if ( this . isActivated ( ) ) {
this . deactivate ( ) ;
}
}
} ] ) ;
return CodeView ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/module/Statusbar.js
function Statusbar _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function Statusbar _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 ) ; } }
function Statusbar _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) Statusbar _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) Statusbar _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
var EDITABLE _PADDING = 24 ;
2020-06-01 11:05:25 +00:00
var Statusbar _Statusbar = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function Statusbar ( context ) {
Statusbar _classCallCheck ( this , Statusbar ) ;
this . $document = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( document ) ;
this . $statusbar = context . layoutInfo . statusbar ;
this . $editable = context . layoutInfo . editable ;
this . options = context . options ;
}
Statusbar _createClass ( Statusbar , [ {
key : "initialize" ,
value : function initialize ( ) {
var _this = this ;
if ( this . options . airMode || this . options . disableResizeEditor ) {
this . destroy ( ) ;
return ;
}
this . $statusbar . on ( 'mousedown' , function ( event ) {
event . preventDefault ( ) ;
event . stopPropagation ( ) ;
var editableTop = _this . $editable . offset ( ) . top - _this . $document . scrollTop ( ) ;
var onMouseMove = function onMouseMove ( event ) {
var height = event . clientY - ( editableTop + EDITABLE _PADDING ) ;
height = _this . options . minheight > 0 ? Math . max ( height , _this . options . minheight ) : height ;
height = _this . options . maxHeight > 0 ? Math . min ( height , _this . options . maxHeight ) : height ;
_this . $editable . height ( height ) ;
} ;
_this . $document . on ( 'mousemove' , onMouseMove ) . one ( 'mouseup' , function ( ) {
_this . $document . off ( 'mousemove' , onMouseMove ) ;
} ) ;
} ) ;
}
} , {
key : "destroy" ,
value : function destroy ( ) {
this . $statusbar . off ( ) ;
this . $statusbar . addClass ( 'locked' ) ;
}
} ] ) ;
return Statusbar ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/module/Fullscreen.js
function Fullscreen _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function Fullscreen _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 ) ; } }
function Fullscreen _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) Fullscreen _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) Fullscreen _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
2020-06-01 11:05:25 +00:00
var Fullscreen _Fullscreen = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function Fullscreen ( context ) {
var _this = this ;
Fullscreen _classCallCheck ( this , Fullscreen ) ;
this . context = context ;
this . $editor = context . layoutInfo . editor ;
this . $toolbar = context . layoutInfo . toolbar ;
this . $editable = context . layoutInfo . editable ;
this . $codable = context . layoutInfo . codable ;
this . $window = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( window ) ;
this . $scrollbar = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( 'html, body' ) ;
this . onResize = function ( ) {
_this . resizeTo ( {
h : _this . $window . height ( ) - _this . $toolbar . outerHeight ( )
} ) ;
} ;
}
Fullscreen _createClass ( Fullscreen , [ {
key : "resizeTo" ,
value : function resizeTo ( size ) {
this . $editable . css ( 'height' , size . h ) ;
this . $codable . css ( 'height' , size . h ) ;
if ( this . $codable . data ( 'cmeditor' ) ) {
this . $codable . data ( 'cmeditor' ) . setsize ( null , size . h ) ;
}
}
/ * *
* toggle fullscreen
* /
} , {
key : "toggle" ,
value : function toggle ( ) {
this . $editor . toggleClass ( 'fullscreen' ) ;
if ( this . isFullscreen ( ) ) {
this . $editable . data ( 'orgHeight' , this . $editable . css ( 'height' ) ) ;
this . $editable . data ( 'orgMaxHeight' , this . $editable . css ( 'maxHeight' ) ) ;
this . $editable . css ( 'maxHeight' , '' ) ;
this . $window . on ( 'resize' , this . onResize ) . trigger ( 'resize' ) ;
this . $scrollbar . css ( 'overflow' , 'hidden' ) ;
} else {
this . $window . off ( 'resize' , this . onResize ) ;
this . resizeTo ( {
h : this . $editable . data ( 'orgHeight' )
} ) ;
this . $editable . css ( 'maxHeight' , this . $editable . css ( 'orgMaxHeight' ) ) ;
this . $scrollbar . css ( 'overflow' , 'visible' ) ;
}
this . context . invoke ( 'toolbar.updateFullscreen' , this . isFullscreen ( ) ) ;
}
} , {
key : "isFullscreen" ,
value : function isFullscreen ( ) {
return this . $editor . hasClass ( 'fullscreen' ) ;
}
} ] ) ;
return Fullscreen ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/module/Handle.js
function Handle _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function Handle _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 ) ; } }
function Handle _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) Handle _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) Handle _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
2020-06-01 11:05:25 +00:00
var Handle _Handle = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function Handle ( context ) {
var _this = this ;
Handle _classCallCheck ( this , Handle ) ;
this . context = context ;
this . $document = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( document ) ;
this . $editingArea = context . layoutInfo . editingArea ;
this . options = context . options ;
this . lang = this . options . langInfo ;
this . events = {
'summernote.mousedown' : function summernoteMousedown ( we , e ) {
if ( _this . update ( e . target , e ) ) {
e . preventDefault ( ) ;
}
} ,
'summernote.keyup summernote.scroll summernote.change summernote.dialog.shown' : function summernoteKeyupSummernoteScrollSummernoteChangeSummernoteDialogShown ( ) {
_this . update ( ) ;
} ,
'summernote.disable summernote.blur' : function summernoteDisableSummernoteBlur ( ) {
_this . hide ( ) ;
} ,
'summernote.codeview.toggled' : function summernoteCodeviewToggled ( ) {
_this . update ( ) ;
}
} ;
}
Handle _createClass ( Handle , [ {
key : "initialize" ,
value : function initialize ( ) {
var _this2 = this ;
this . $handle = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( [ '<div class="note-handle">' , '<div class="note-control-selection">' , '<div class="note-control-selection-bg"></div>' , '<div class="note-control-holder note-control-nw"></div>' , '<div class="note-control-holder note-control-ne"></div>' , '<div class="note-control-holder note-control-sw"></div>' , '<div class="' , this . options . disableResizeImage ? 'note-control-holder' : 'note-control-sizing' , ' note-control-se"></div>' , this . options . disableResizeImage ? '' : '<div class="note-control-selection-info"></div>' , '</div>' , '</div>' ] . join ( '' ) ) . prependTo ( this . $editingArea ) ;
this . $handle . on ( 'mousedown' , function ( event ) {
if ( dom . isControlSizing ( event . target ) ) {
event . preventDefault ( ) ;
event . stopPropagation ( ) ;
var $target = _this2 . $handle . find ( '.note-control-selection' ) . data ( 'target' ) ;
var posStart = $target . offset ( ) ;
var scrollTop = _this2 . $document . scrollTop ( ) ;
var onMouseMove = function onMouseMove ( event ) {
_this2 . context . invoke ( 'editor.resizeTo' , {
x : event . clientX - posStart . left ,
y : event . clientY - ( posStart . top - scrollTop )
} , $target , ! event . shiftKey ) ;
_this2 . update ( $target [ 0 ] , event ) ;
} ;
_this2 . $document . on ( 'mousemove' , onMouseMove ) . one ( 'mouseup' , function ( e ) {
e . preventDefault ( ) ;
_this2 . $document . off ( 'mousemove' , onMouseMove ) ;
_this2 . context . invoke ( 'editor.afterCommand' ) ;
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
if ( ! $target . data ( 'ratio' ) ) {
// original ratio.
$target . data ( 'ratio' , $target . height ( ) / $target . width ( ) ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
} ) ; // Listen for scrolling on the handle overlay.
this . $handle . on ( 'wheel' , function ( e ) {
e . preventDefault ( ) ;
_this2 . update ( ) ;
} ) ;
}
} , {
key : "destroy" ,
value : function destroy ( ) {
this . $handle . remove ( ) ;
}
} , {
key : "update" ,
value : function update ( target , event ) {
if ( this . context . isDisabled ( ) ) {
return false ;
}
var isImage = dom . isImg ( target ) ;
var $selection = this . $handle . find ( '.note-control-selection' ) ;
this . context . invoke ( 'imagePopover.update' , target , event ) ;
if ( isImage ) {
var $image = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( target ) ;
var position = $image . position ( ) ;
var pos = {
left : position . left + parseInt ( $image . css ( 'marginLeft' ) , 10 ) ,
top : position . top + parseInt ( $image . css ( 'marginTop' ) , 10 )
} ; // exclude margin
var imageSize = {
w : $image . outerWidth ( false ) ,
h : $image . outerHeight ( false )
} ;
$selection . css ( {
display : 'block' ,
left : pos . left ,
top : pos . top ,
width : imageSize . w ,
height : imageSize . h
} ) . data ( 'target' , $image ) ; // save current image element.
var origImageObj = new Image ( ) ;
origImageObj . src = $image . attr ( 'src' ) ;
var sizingText = imageSize . w + 'x' + imageSize . h + ' (' + this . lang . image . original + ': ' + origImageObj . width + 'x' + origImageObj . height + ')' ;
$selection . find ( '.note-control-selection-info' ) . text ( sizingText ) ;
this . context . invoke ( 'editor.saveTarget' , target ) ;
} else {
this . hide ( ) ;
}
return isImage ;
}
/ * *
* hide
*
* @ param { jQuery } $handle
* /
} , {
key : "hide" ,
value : function hide ( ) {
this . context . invoke ( 'editor.clearTarget' ) ;
this . $handle . children ( ) . hide ( ) ;
}
} ] ) ;
return Handle ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/module/AutoLink.js
function AutoLink _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function AutoLink _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 ) ; } }
function AutoLink _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) AutoLink _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) AutoLink _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
var defaultScheme = 'http://' ;
var linkPattern = /^([A-Za-z][A-Za-z0-9+-.]*\:[\/]{2}|tel:|mailto:[A-Z0-9._%+-]+@)?(www\.)?(.+)$/i ;
2020-06-01 11:05:25 +00:00
var AutoLink _AutoLink = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function AutoLink ( context ) {
var _this = this ;
AutoLink _classCallCheck ( this , AutoLink ) ;
this . context = context ;
2020-06-01 11:05:25 +00:00
this . options = context . options ;
2020-04-01 22:52:43 +00:00
this . events = {
'summernote.keyup' : function summernoteKeyup ( we , e ) {
if ( ! e . isDefaultPrevented ( ) ) {
_this . handleKeyup ( e ) ;
}
} ,
'summernote.keydown' : function summernoteKeydown ( we , e ) {
_this . handleKeydown ( e ) ;
}
} ;
}
AutoLink _createClass ( AutoLink , [ {
key : "initialize" ,
value : function initialize ( ) {
this . lastWordRange = null ;
}
} , {
key : "destroy" ,
value : function destroy ( ) {
this . lastWordRange = null ;
}
} , {
key : "replace" ,
value : function replace ( ) {
if ( ! this . lastWordRange ) {
return ;
}
var keyword = this . lastWordRange . toString ( ) ;
var match = keyword . match ( linkPattern ) ;
if ( match && ( match [ 1 ] || match [ 2 ] ) ) {
var link = match [ 1 ] ? keyword : defaultScheme + keyword ;
2020-06-01 11:05:25 +00:00
var urlText = this . options . showDomainOnlyForAutolink ? keyword . replace ( /^(?:https?:\/\/)?(?:tel?:?)?(?:mailto?:?)?(?:www\.)?/i , '' ) . split ( '/' ) [ 0 ] : keyword ;
2020-04-01 22:52:43 +00:00
var node = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<a />' ) . html ( urlText ) . attr ( 'href' , link ) [ 0 ] ;
if ( this . context . options . linkTargetBlank ) {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( node ) . attr ( 'target' , '_blank' ) ;
}
this . lastWordRange . insertNode ( node ) ;
this . lastWordRange = null ;
this . context . invoke ( 'editor.focus' ) ;
}
}
} , {
key : "handleKeydown" ,
value : function handleKeydown ( e ) {
if ( lists . contains ( [ core _key . code . ENTER , core _key . code . SPACE ] , e . keyCode ) ) {
var wordRange = this . context . invoke ( 'editor.createRange' ) . getWordRange ( ) ;
this . lastWordRange = wordRange ;
}
}
} , {
key : "handleKeyup" ,
value : function handleKeyup ( e ) {
if ( lists . contains ( [ core _key . code . ENTER , core _key . code . SPACE ] , e . keyCode ) ) {
this . replace ( ) ;
}
}
} ] ) ;
return AutoLink ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/module/AutoSync.js
function AutoSync _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function AutoSync _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 ) ; } }
function AutoSync _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) AutoSync _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) AutoSync _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
/ * *
* textarea auto sync .
* /
2020-06-01 11:05:25 +00:00
var AutoSync _AutoSync = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function AutoSync ( context ) {
var _this = this ;
AutoSync _classCallCheck ( this , AutoSync ) ;
this . $note = context . layoutInfo . note ;
this . events = {
'summernote.change' : function summernoteChange ( ) {
_this . $note . val ( context . invoke ( 'code' ) ) ;
}
} ;
}
AutoSync _createClass ( AutoSync , [ {
key : "shouldInitialize" ,
value : function shouldInitialize ( ) {
return dom . isTextarea ( this . $note [ 0 ] ) ;
}
} ] ) ;
return AutoSync ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/module/AutoReplace.js
function AutoReplace _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function AutoReplace _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 ) ; } }
function AutoReplace _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) AutoReplace _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) AutoReplace _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
2020-06-01 11:05:25 +00:00
var AutoReplace _AutoReplace = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function AutoReplace ( context ) {
var _this = this ;
AutoReplace _classCallCheck ( this , AutoReplace ) ;
this . context = context ;
this . options = context . options . replace || { } ;
this . keys = [ core _key . code . ENTER , core _key . code . SPACE , core _key . code . PERIOD , core _key . code . COMMA , core _key . code . SEMICOLON , core _key . code . SLASH ] ;
this . previousKeydownCode = null ;
this . events = {
'summernote.keyup' : function summernoteKeyup ( we , e ) {
if ( ! e . isDefaultPrevented ( ) ) {
_this . handleKeyup ( e ) ;
}
} ,
'summernote.keydown' : function summernoteKeydown ( we , e ) {
_this . handleKeydown ( e ) ;
}
} ;
}
AutoReplace _createClass ( AutoReplace , [ {
key : "shouldInitialize" ,
value : function shouldInitialize ( ) {
return ! ! this . options . match ;
}
} , {
key : "initialize" ,
value : function initialize ( ) {
this . lastWord = null ;
}
} , {
key : "destroy" ,
value : function destroy ( ) {
this . lastWord = null ;
}
} , {
key : "replace" ,
value : function replace ( ) {
if ( ! this . lastWord ) {
return ;
}
var self = this ;
var keyword = this . lastWord . toString ( ) ;
this . options . match ( keyword , function ( match ) {
if ( match ) {
var node = '' ;
if ( typeof match === 'string' ) {
node = dom . createText ( match ) ;
} else if ( match instanceof jQuery ) {
node = match [ 0 ] ;
} else if ( match instanceof Node ) {
node = match ;
}
if ( ! node ) return ;
self . lastWord . insertNode ( node ) ;
self . lastWord = null ;
self . context . invoke ( 'editor.focus' ) ;
}
} ) ;
}
} , {
key : "handleKeydown" ,
value : function handleKeydown ( e ) {
// this forces it to remember the last whole word, even if multiple termination keys are pressed
// before the previous key is let go.
if ( this . previousKeydownCode && lists . contains ( this . keys , this . previousKeydownCode ) ) {
this . previousKeydownCode = e . keyCode ;
return ;
}
if ( lists . contains ( this . keys , e . keyCode ) ) {
var wordRange = this . context . invoke ( 'editor.createRange' ) . getWordRange ( ) ;
this . lastWord = wordRange ;
}
this . previousKeydownCode = e . keyCode ;
}
} , {
key : "handleKeyup" ,
value : function handleKeyup ( e ) {
if ( lists . contains ( this . keys , e . keyCode ) ) {
this . replace ( ) ;
}
}
} ] ) ;
return AutoReplace ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/module/Placeholder.js
function Placeholder _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function Placeholder _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 ) ; } }
function Placeholder _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) Placeholder _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) Placeholder _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
2020-06-01 11:05:25 +00:00
var Placeholder _Placeholder = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function Placeholder ( context ) {
var _this = this ;
Placeholder _classCallCheck ( this , Placeholder ) ;
this . context = context ;
this . $editingArea = context . layoutInfo . editingArea ;
this . options = context . options ;
if ( this . options . inheritPlaceholder === true ) {
// get placeholder value from the original element
this . options . placeholder = this . context . $note . attr ( 'placeholder' ) || this . options . placeholder ;
}
this . events = {
'summernote.init summernote.change' : function summernoteInitSummernoteChange ( ) {
_this . update ( ) ;
} ,
'summernote.codeview.toggled' : function summernoteCodeviewToggled ( ) {
_this . update ( ) ;
}
} ;
}
Placeholder _createClass ( Placeholder , [ {
key : "shouldInitialize" ,
value : function shouldInitialize ( ) {
return ! ! this . options . placeholder ;
}
} , {
key : "initialize" ,
value : function initialize ( ) {
var _this2 = this ;
this . $placeholder = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<div class="note-placeholder">' ) ;
this . $placeholder . on ( 'click' , function ( ) {
_this2 . context . invoke ( 'focus' ) ;
} ) . html ( this . options . placeholder ) . prependTo ( this . $editingArea ) ;
this . update ( ) ;
}
} , {
key : "destroy" ,
value : function destroy ( ) {
this . $placeholder . remove ( ) ;
}
} , {
key : "update" ,
value : function update ( ) {
var isShow = ! this . context . invoke ( 'codeview.isActivated' ) && this . context . invoke ( 'editor.isEmpty' ) ;
this . $placeholder . toggle ( isShow ) ;
}
} ] ) ;
return Placeholder ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/module/Buttons.js
function Buttons _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function Buttons _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 ) ; } }
function Buttons _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) Buttons _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) Buttons _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
2020-06-01 11:05:25 +00:00
var Buttons _Buttons = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function Buttons ( context ) {
Buttons _classCallCheck ( this , Buttons ) ;
this . ui = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote . ui ;
this . context = context ;
this . $toolbar = context . layoutInfo . toolbar ;
this . options = context . options ;
this . lang = this . options . langInfo ;
this . invertedKeyMap = func . invertObject ( this . options . keyMap [ env . isMac ? 'mac' : 'pc' ] ) ;
}
Buttons _createClass ( Buttons , [ {
key : "representShortcut" ,
value : function representShortcut ( editorMethod ) {
var shortcut = this . invertedKeyMap [ editorMethod ] ;
if ( ! this . options . shortcuts || ! shortcut ) {
return '' ;
}
if ( env . isMac ) {
shortcut = shortcut . replace ( 'CMD' , '⌘' ) . replace ( 'SHIFT' , '⇧' ) ;
}
shortcut = shortcut . replace ( 'BACKSLASH' , '\\' ) . replace ( 'SLASH' , '/' ) . replace ( 'LEFTBRACKET' , '[' ) . replace ( 'RIGHTBRACKET' , ']' ) ;
return ' (' + shortcut + ')' ;
}
} , {
key : "button" ,
value : function button ( o ) {
if ( ! this . options . tooltip && o . tooltip ) {
delete o . tooltip ;
}
o . container = this . options . container ;
return this . ui . button ( o ) ;
}
} , {
key : "initialize" ,
value : function initialize ( ) {
this . addToolbarButtons ( ) ;
this . addImagePopoverButtons ( ) ;
this . addLinkPopoverButtons ( ) ;
this . addTablePopoverButtons ( ) ;
this . fontInstalledMap = { } ;
}
} , {
key : "destroy" ,
value : function destroy ( ) {
delete this . fontInstalledMap ;
}
} , {
key : "isFontInstalled" ,
value : function isFontInstalled ( name ) {
if ( ! Object . prototype . hasOwnProperty . call ( this . fontInstalledMap , name ) ) {
this . fontInstalledMap [ name ] = env . isFontInstalled ( name ) || lists . contains ( this . options . fontNamesIgnoreCheck , name ) ;
}
return this . fontInstalledMap [ name ] ;
}
} , {
key : "isFontDeservedToAdd" ,
value : function isFontDeservedToAdd ( name ) {
name = name . toLowerCase ( ) ;
return name !== '' && this . isFontInstalled ( name ) && env . genericFontFamilies . indexOf ( name ) === - 1 ;
}
} , {
key : "colorPalette" ,
value : function colorPalette ( className , tooltip , backColor , foreColor ) {
var _this = this ;
return this . ui . buttonGroup ( {
className : 'note-color ' + className ,
children : [ this . button ( {
className : 'note-current-color-button' ,
contents : this . ui . icon ( this . options . icons . font + ' note-recent-color' ) ,
tooltip : tooltip ,
click : function click ( e ) {
var $button = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( e . currentTarget ) ;
if ( backColor && foreColor ) {
_this . context . invoke ( 'editor.color' , {
backColor : $button . attr ( 'data-backColor' ) ,
foreColor : $button . attr ( 'data-foreColor' )
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
} else if ( backColor ) {
_this . context . invoke ( 'editor.color' , {
backColor : $button . attr ( 'data-backColor' )
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
} else if ( foreColor ) {
_this . context . invoke ( 'editor.color' , {
foreColor : $button . attr ( 'data-foreColor' )
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
}
} ,
callback : function callback ( $button ) {
var $recentColor = $button . find ( '.note-recent-color' ) ;
if ( backColor ) {
$recentColor . css ( 'background-color' , _this . options . colorButton . backColor ) ;
$button . attr ( 'data-backColor' , _this . options . colorButton . backColor ) ;
}
if ( foreColor ) {
$recentColor . css ( 'color' , _this . options . colorButton . foreColor ) ;
$button . attr ( 'data-foreColor' , _this . options . colorButton . foreColor ) ;
} else {
$recentColor . css ( 'color' , 'transparent' ) ;
}
}
} ) , this . button ( {
className : 'dropdown-toggle' ,
contents : this . ui . dropdownButtonContents ( '' , this . options ) ,
tooltip : this . lang . color . more ,
data : {
toggle : 'dropdown'
}
} ) , this . ui . dropdown ( {
2020-06-01 11:05:25 +00:00
items : ( backColor ? [ '<div class="note-palette">' , '<div class="note-palette-title">' + this . lang . color . background + '</div>' , '<div>' , '<button type="button" class="note-color-reset btn btn-light btn-default" data-event="backColor" data-value="transparent">' , this . lang . color . transparent , '</button>' , '</div>' , '<div class="note-holder" data-event="backColor"><!-- back colors --></div>' , '<div>' , '<button type="button" class="note-color-select btn btn-light btn-default" data-event="openPalette" data-value="backColorPicker">' , this . lang . color . cpSelect , '</button>' , '<input type="color" id="backColorPicker" class="note-btn note-color-select-btn" value="' + this . options . colorButton . backColor + '" data-event="backColorPalette">' , '</div>' , '<div class="note-holder-custom" id="backColorPalette" data-event="backColor"></div>' , '</div>' ] . join ( '' ) : '' ) + ( foreColor ? [ '<div class="note-palette">' , '<div class="note-palette-title">' + this . lang . color . foreground + '</div>' , '<div>' , '<button type="button" class="note-color-reset btn btn-light btn-default" data-event="removeFormat" data-value="foreColor">' , this . lang . color . resetToDefault , '</button>' , '</div>' , '<div class="note-holder" data-event="foreColor"><!-- fore colors --></div>' , '<div>' , '<button type="button" class="note-color-select btn btn-light btn-default" data-event="openPalette" data-value="foreColorPicker">' , this . lang . color . cpSelect , '</button>' , '<input type="color" id="foreColorPicker" class="note-btn note-color-select-btn" value="' + this . options . colorButton . foreColor + '" data-event="foreColorPalette">' , '</div>' , // Fix missing Div, Commented to find easily if it's wrong
'<div class="note-holder-custom" id="foreColorPalette" data-event="foreColor"></div>' , '</div>' ] . join ( '' ) : '' ) ,
2020-04-01 22:52:43 +00:00
callback : function callback ( $dropdown ) {
$dropdown . find ( '.note-holder' ) . each ( function ( idx , item ) {
var $holder = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( item ) ;
$holder . append ( _this . ui . palette ( {
colors : _this . options . colors ,
colorsName : _this . options . colorsName ,
eventName : $holder . data ( 'event' ) ,
container : _this . options . container ,
tooltip : _this . options . tooltip
} ) . render ( ) ) ;
} ) ;
/* TODO: do we have to record recent custom colors within cookies? */
var customColors = [ [ '#FFFFFF' , '#FFFFFF' , '#FFFFFF' , '#FFFFFF' , '#FFFFFF' , '#FFFFFF' , '#FFFFFF' , '#FFFFFF' ] ] ;
$dropdown . find ( '.note-holder-custom' ) . each ( function ( idx , item ) {
var $holder = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( item ) ;
$holder . append ( _this . ui . palette ( {
colors : customColors ,
colorsName : customColors ,
eventName : $holder . data ( 'event' ) ,
container : _this . options . container ,
tooltip : _this . options . tooltip
} ) . render ( ) ) ;
} ) ;
$dropdown . find ( 'input[type=color]' ) . each ( function ( idx , item ) {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( item ) . change ( function ( ) {
var $chip = $dropdown . find ( '#' + external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( this ) . data ( 'event' ) ) . find ( '.note-color-btn' ) . first ( ) ;
var color = this . value . toUpperCase ( ) ;
$chip . css ( 'background-color' , color ) . attr ( 'aria-label' , color ) . attr ( 'data-value' , color ) . attr ( 'data-original-title' , color ) ;
$chip . click ( ) ;
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
} ) ;
} ,
click : function click ( event ) {
event . stopPropagation ( ) ;
var $parent = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '.' + className ) . find ( '.note-dropdown-menu' ) ;
var $button = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( event . target ) ;
var eventName = $button . data ( 'event' ) ;
var value = $button . attr ( 'data-value' ) ;
if ( eventName === 'openPalette' ) {
var $picker = $parent . find ( '#' + value ) ;
var $palette = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( $parent . find ( '#' + $picker . data ( 'event' ) ) . find ( '.note-color-row' ) [ 0 ] ) ; // Shift palette chips
var $chip = $palette . find ( '.note-color-btn' ) . last ( ) . detach ( ) ; // Set chip attributes
var color = $picker . val ( ) ;
$chip . css ( 'background-color' , color ) . attr ( 'aria-label' , color ) . attr ( 'data-value' , color ) . attr ( 'data-original-title' , color ) ;
$palette . prepend ( $chip ) ;
$picker . click ( ) ;
} else {
if ( lists . contains ( [ 'backColor' , 'foreColor' ] , eventName ) ) {
var key = eventName === 'backColor' ? 'background-color' : 'color' ;
var $color = $button . closest ( '.note-color' ) . find ( '.note-recent-color' ) ;
var $currentButton = $button . closest ( '.note-color' ) . find ( '.note-current-color-button' ) ;
$color . css ( key , value ) ;
$currentButton . attr ( 'data-' + eventName , value ) ;
}
_this . context . invoke ( 'editor.' + eventName , value ) ;
}
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
} ) ]
} ) . render ( ) ;
}
} , {
key : "addToolbarButtons" ,
value : function addToolbarButtons ( ) {
var _this2 = this ;
this . context . memo ( 'button.style' , function ( ) {
return _this2 . ui . buttonGroup ( [ _this2 . button ( {
className : 'dropdown-toggle' ,
contents : _this2 . ui . dropdownButtonContents ( _this2 . ui . icon ( _this2 . options . icons . magic ) , _this2 . options ) ,
tooltip : _this2 . lang . style . style ,
data : {
toggle : 'dropdown'
}
} ) , _this2 . ui . dropdown ( {
className : 'dropdown-style' ,
items : _this2 . options . styleTags ,
title : _this2 . lang . style . style ,
template : function template ( item ) {
// TBD: need to be simplified
if ( typeof item === 'string' ) {
item = {
tag : item ,
title : Object . prototype . hasOwnProperty . call ( _this2 . lang . style , item ) ? _this2 . lang . style [ item ] : item
} ;
}
var tag = item . tag ;
var title = item . title ;
var style = item . style ? ' style="' + item . style + '" ' : '' ;
var className = item . className ? ' class="' + item . className + '"' : '' ;
return '<' + tag + style + className + '>' + title + '</' + tag + '>' ;
} ,
click : _this2 . context . createInvokeHandler ( 'editor.formatBlock' )
} ) ] ) . render ( ) ;
} ) ;
var _loop = function _loop ( styleIdx , styleLen ) {
var item = _this2 . options . styleTags [ styleIdx ] ;
_this2 . context . memo ( 'button.style.' + item , function ( ) {
return _this2 . button ( {
className : 'note-btn-style-' + item ,
contents : '<div data-value="' + item + '">' + item . toUpperCase ( ) + '</div>' ,
tooltip : _this2 . lang . style [ item ] ,
click : _this2 . context . createInvokeHandler ( 'editor.formatBlock' )
} ) . render ( ) ;
} ) ;
2019-06-10 15:38:54 +00:00
} ;
2020-04-01 22:52:43 +00:00
for ( var styleIdx = 0 , styleLen = this . options . styleTags . length ; styleIdx < styleLen ; styleIdx ++ ) {
_loop ( styleIdx , styleLen ) ;
}
this . context . memo ( 'button.bold' , function ( ) {
return _this2 . button ( {
className : 'note-btn-bold' ,
contents : _this2 . ui . icon ( _this2 . options . icons . bold ) ,
tooltip : _this2 . lang . font . bold + _this2 . representShortcut ( 'bold' ) ,
click : _this2 . context . createInvokeHandlerAndUpdateState ( 'editor.bold' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.italic' , function ( ) {
return _this2 . button ( {
className : 'note-btn-italic' ,
contents : _this2 . ui . icon ( _this2 . options . icons . italic ) ,
tooltip : _this2 . lang . font . italic + _this2 . representShortcut ( 'italic' ) ,
click : _this2 . context . createInvokeHandlerAndUpdateState ( 'editor.italic' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.underline' , function ( ) {
return _this2 . button ( {
className : 'note-btn-underline' ,
contents : _this2 . ui . icon ( _this2 . options . icons . underline ) ,
tooltip : _this2 . lang . font . underline + _this2 . representShortcut ( 'underline' ) ,
click : _this2 . context . createInvokeHandlerAndUpdateState ( 'editor.underline' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.clear' , function ( ) {
return _this2 . button ( {
contents : _this2 . ui . icon ( _this2 . options . icons . eraser ) ,
tooltip : _this2 . lang . font . clear + _this2 . representShortcut ( 'removeFormat' ) ,
click : _this2 . context . createInvokeHandler ( 'editor.removeFormat' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.strikethrough' , function ( ) {
return _this2 . button ( {
className : 'note-btn-strikethrough' ,
contents : _this2 . ui . icon ( _this2 . options . icons . strikethrough ) ,
tooltip : _this2 . lang . font . strikethrough + _this2 . representShortcut ( 'strikethrough' ) ,
click : _this2 . context . createInvokeHandlerAndUpdateState ( 'editor.strikethrough' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.superscript' , function ( ) {
return _this2 . button ( {
className : 'note-btn-superscript' ,
contents : _this2 . ui . icon ( _this2 . options . icons . superscript ) ,
tooltip : _this2 . lang . font . superscript ,
click : _this2 . context . createInvokeHandlerAndUpdateState ( 'editor.superscript' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.subscript' , function ( ) {
return _this2 . button ( {
className : 'note-btn-subscript' ,
contents : _this2 . ui . icon ( _this2 . options . icons . subscript ) ,
tooltip : _this2 . lang . font . subscript ,
click : _this2 . context . createInvokeHandlerAndUpdateState ( 'editor.subscript' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.fontname' , function ( ) {
var styleInfo = _this2 . context . invoke ( 'editor.currentStyle' ) ;
if ( _this2 . options . addDefaultFonts ) {
// Add 'default' fonts into the fontnames array if not exist
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . each ( styleInfo [ 'font-family' ] . split ( ',' ) , function ( idx , fontname ) {
fontname = fontname . trim ( ) . replace ( /['"]+/g , '' ) ;
if ( _this2 . isFontDeservedToAdd ( fontname ) ) {
if ( _this2 . options . fontNames . indexOf ( fontname ) === - 1 ) {
_this2 . options . fontNames . push ( fontname ) ;
}
}
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
}
return _this2 . ui . buttonGroup ( [ _this2 . button ( {
className : 'dropdown-toggle' ,
2020-06-01 11:05:25 +00:00
contents : _this2 . ui . dropdownButtonContents ( '<span class="note-current-fontname"></span>' , _this2 . options ) ,
2020-04-01 22:52:43 +00:00
tooltip : _this2 . lang . font . name ,
data : {
toggle : 'dropdown'
}
} ) , _this2 . ui . dropdownCheck ( {
className : 'dropdown-fontname' ,
checkClassName : _this2 . options . icons . menuCheck ,
items : _this2 . options . fontNames . filter ( _this2 . isFontInstalled . bind ( _this2 ) ) ,
title : _this2 . lang . font . name ,
template : function template ( item ) {
return '<span style="font-family: ' + env . validFontName ( item ) + '">' + item + '</span>' ;
} ,
click : _this2 . context . createInvokeHandlerAndUpdateState ( 'editor.fontName' )
} ) ] ) . render ( ) ;
} ) ;
this . context . memo ( 'button.fontsize' , function ( ) {
return _this2 . ui . buttonGroup ( [ _this2 . button ( {
className : 'dropdown-toggle' ,
2020-06-01 11:05:25 +00:00
contents : _this2 . ui . dropdownButtonContents ( '<span class="note-current-fontsize"></span>' , _this2 . options ) ,
2020-04-01 22:52:43 +00:00
tooltip : _this2 . lang . font . size ,
data : {
toggle : 'dropdown'
}
} ) , _this2 . ui . dropdownCheck ( {
className : 'dropdown-fontsize' ,
checkClassName : _this2 . options . icons . menuCheck ,
items : _this2 . options . fontSizes ,
title : _this2 . lang . font . size ,
click : _this2 . context . createInvokeHandlerAndUpdateState ( 'editor.fontSize' )
} ) ] ) . render ( ) ;
} ) ;
this . context . memo ( 'button.fontsizeunit' , function ( ) {
return _this2 . ui . buttonGroup ( [ _this2 . button ( {
className : 'dropdown-toggle' ,
2020-06-01 11:05:25 +00:00
contents : _this2 . ui . dropdownButtonContents ( '<span class="note-current-fontsizeunit"></span>' , _this2 . options ) ,
2020-04-01 22:52:43 +00:00
tooltip : _this2 . lang . font . sizeunit ,
data : {
toggle : 'dropdown'
}
} ) , _this2 . ui . dropdownCheck ( {
className : 'dropdown-fontsizeunit' ,
checkClassName : _this2 . options . icons . menuCheck ,
items : _this2 . options . fontSizeUnits ,
title : _this2 . lang . font . sizeunit ,
click : _this2 . context . createInvokeHandlerAndUpdateState ( 'editor.fontSizeUnit' )
} ) ] ) . render ( ) ;
} ) ;
this . context . memo ( 'button.color' , function ( ) {
return _this2 . colorPalette ( 'note-color-all' , _this2 . lang . color . recent , true , true ) ;
} ) ;
this . context . memo ( 'button.forecolor' , function ( ) {
return _this2 . colorPalette ( 'note-color-fore' , _this2 . lang . color . foreground , false , true ) ;
} ) ;
this . context . memo ( 'button.backcolor' , function ( ) {
return _this2 . colorPalette ( 'note-color-back' , _this2 . lang . color . background , true , false ) ;
} ) ;
this . context . memo ( 'button.ul' , function ( ) {
return _this2 . button ( {
contents : _this2 . ui . icon ( _this2 . options . icons . unorderedlist ) ,
tooltip : _this2 . lang . lists . unordered + _this2 . representShortcut ( 'insertUnorderedList' ) ,
click : _this2 . context . createInvokeHandler ( 'editor.insertUnorderedList' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.ol' , function ( ) {
return _this2 . button ( {
contents : _this2 . ui . icon ( _this2 . options . icons . orderedlist ) ,
tooltip : _this2 . lang . lists . ordered + _this2 . representShortcut ( 'insertOrderedList' ) ,
click : _this2 . context . createInvokeHandler ( 'editor.insertOrderedList' )
} ) . render ( ) ;
} ) ;
var justifyLeft = this . button ( {
contents : this . ui . icon ( this . options . icons . alignLeft ) ,
tooltip : this . lang . paragraph . left + this . representShortcut ( 'justifyLeft' ) ,
click : this . context . createInvokeHandler ( 'editor.justifyLeft' )
} ) ;
var justifyCenter = this . button ( {
contents : this . ui . icon ( this . options . icons . alignCenter ) ,
tooltip : this . lang . paragraph . center + this . representShortcut ( 'justifyCenter' ) ,
click : this . context . createInvokeHandler ( 'editor.justifyCenter' )
} ) ;
var justifyRight = this . button ( {
contents : this . ui . icon ( this . options . icons . alignRight ) ,
tooltip : this . lang . paragraph . right + this . representShortcut ( 'justifyRight' ) ,
click : this . context . createInvokeHandler ( 'editor.justifyRight' )
} ) ;
var justifyFull = this . button ( {
contents : this . ui . icon ( this . options . icons . alignJustify ) ,
tooltip : this . lang . paragraph . justify + this . representShortcut ( 'justifyFull' ) ,
click : this . context . createInvokeHandler ( 'editor.justifyFull' )
} ) ;
var outdent = this . button ( {
contents : this . ui . icon ( this . options . icons . outdent ) ,
tooltip : this . lang . paragraph . outdent + this . representShortcut ( 'outdent' ) ,
click : this . context . createInvokeHandler ( 'editor.outdent' )
} ) ;
var indent = this . button ( {
contents : this . ui . icon ( this . options . icons . indent ) ,
tooltip : this . lang . paragraph . indent + this . representShortcut ( 'indent' ) ,
click : this . context . createInvokeHandler ( 'editor.indent' )
} ) ;
this . context . memo ( 'button.justifyLeft' , func . invoke ( justifyLeft , 'render' ) ) ;
this . context . memo ( 'button.justifyCenter' , func . invoke ( justifyCenter , 'render' ) ) ;
this . context . memo ( 'button.justifyRight' , func . invoke ( justifyRight , 'render' ) ) ;
this . context . memo ( 'button.justifyFull' , func . invoke ( justifyFull , 'render' ) ) ;
this . context . memo ( 'button.outdent' , func . invoke ( outdent , 'render' ) ) ;
this . context . memo ( 'button.indent' , func . invoke ( indent , 'render' ) ) ;
this . context . memo ( 'button.paragraph' , function ( ) {
return _this2 . ui . buttonGroup ( [ _this2 . button ( {
className : 'dropdown-toggle' ,
contents : _this2 . ui . dropdownButtonContents ( _this2 . ui . icon ( _this2 . options . icons . alignLeft ) , _this2 . options ) ,
tooltip : _this2 . lang . paragraph . paragraph ,
data : {
toggle : 'dropdown'
}
} ) , _this2 . ui . dropdown ( [ _this2 . ui . buttonGroup ( {
className : 'note-align' ,
children : [ justifyLeft , justifyCenter , justifyRight , justifyFull ]
} ) , _this2 . ui . buttonGroup ( {
className : 'note-list' ,
children : [ outdent , indent ]
} ) ] ) ] ) . render ( ) ;
} ) ;
this . context . memo ( 'button.height' , function ( ) {
return _this2 . ui . buttonGroup ( [ _this2 . button ( {
className : 'dropdown-toggle' ,
contents : _this2 . ui . dropdownButtonContents ( _this2 . ui . icon ( _this2 . options . icons . textHeight ) , _this2 . options ) ,
tooltip : _this2 . lang . font . height ,
data : {
toggle : 'dropdown'
}
} ) , _this2 . ui . dropdownCheck ( {
items : _this2 . options . lineHeights ,
checkClassName : _this2 . options . icons . menuCheck ,
className : 'dropdown-line-height' ,
title : _this2 . lang . font . height ,
click : _this2 . context . createInvokeHandler ( 'editor.lineHeight' )
} ) ] ) . render ( ) ;
} ) ;
this . context . memo ( 'button.table' , function ( ) {
return _this2 . ui . buttonGroup ( [ _this2 . button ( {
className : 'dropdown-toggle' ,
contents : _this2 . ui . dropdownButtonContents ( _this2 . ui . icon ( _this2 . options . icons . table ) , _this2 . options ) ,
tooltip : _this2 . lang . table . table ,
data : {
toggle : 'dropdown'
}
} ) , _this2 . ui . dropdown ( {
title : _this2 . lang . table . table ,
className : 'note-table' ,
2020-06-01 11:05:25 +00:00
items : [ '<div class="note-dimension-picker">' , '<div class="note-dimension-picker-mousecatcher" data-event="insertTable" data-value="1x1"></div>' , '<div class="note-dimension-picker-highlighted"></div>' , '<div class="note-dimension-picker-unhighlighted"></div>' , '</div>' , '<div class="note-dimension-display">1 x 1</div>' ] . join ( '' )
2020-04-01 22:52:43 +00:00
} ) ] , {
callback : function callback ( $node ) {
var $catcher = $node . find ( '.note-dimension-picker-mousecatcher' ) ;
$catcher . css ( {
width : _this2 . options . insertTableMaxSize . col + 'em' ,
height : _this2 . options . insertTableMaxSize . row + 'em'
} ) . mousedown ( _this2 . context . createInvokeHandler ( 'editor.insertTable' ) ) . on ( 'mousemove' , _this2 . tableMoveHandler . bind ( _this2 ) ) ;
}
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.link' , function ( ) {
return _this2 . button ( {
contents : _this2 . ui . icon ( _this2 . options . icons . link ) ,
tooltip : _this2 . lang . link . link + _this2 . representShortcut ( 'linkDialog.show' ) ,
click : _this2 . context . createInvokeHandler ( 'linkDialog.show' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.picture' , function ( ) {
return _this2 . button ( {
contents : _this2 . ui . icon ( _this2 . options . icons . picture ) ,
tooltip : _this2 . lang . image . image ,
click : _this2 . context . createInvokeHandler ( 'imageDialog.show' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.video' , function ( ) {
return _this2 . button ( {
contents : _this2 . ui . icon ( _this2 . options . icons . video ) ,
tooltip : _this2 . lang . video . video ,
click : _this2 . context . createInvokeHandler ( 'videoDialog.show' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.hr' , function ( ) {
return _this2 . button ( {
contents : _this2 . ui . icon ( _this2 . options . icons . minus ) ,
tooltip : _this2 . lang . hr . insert + _this2 . representShortcut ( 'insertHorizontalRule' ) ,
click : _this2 . context . createInvokeHandler ( 'editor.insertHorizontalRule' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.fullscreen' , function ( ) {
return _this2 . button ( {
2020-06-01 11:05:25 +00:00
className : 'btn-fullscreen note-codeview-keep' ,
2020-04-01 22:52:43 +00:00
contents : _this2 . ui . icon ( _this2 . options . icons . arrowsAlt ) ,
tooltip : _this2 . lang . options . fullscreen ,
click : _this2 . context . createInvokeHandler ( 'fullscreen.toggle' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.codeview' , function ( ) {
return _this2 . button ( {
2020-06-01 11:05:25 +00:00
className : 'btn-codeview note-codeview-keep' ,
2020-04-01 22:52:43 +00:00
contents : _this2 . ui . icon ( _this2 . options . icons . code ) ,
tooltip : _this2 . lang . options . codeview ,
click : _this2 . context . createInvokeHandler ( 'codeview.toggle' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.redo' , function ( ) {
return _this2 . button ( {
contents : _this2 . ui . icon ( _this2 . options . icons . redo ) ,
tooltip : _this2 . lang . history . redo + _this2 . representShortcut ( 'redo' ) ,
click : _this2 . context . createInvokeHandler ( 'editor.redo' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.undo' , function ( ) {
return _this2 . button ( {
contents : _this2 . ui . icon ( _this2 . options . icons . undo ) ,
tooltip : _this2 . lang . history . undo + _this2 . representShortcut ( 'undo' ) ,
click : _this2 . context . createInvokeHandler ( 'editor.undo' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.help' , function ( ) {
return _this2 . button ( {
contents : _this2 . ui . icon ( _this2 . options . icons . question ) ,
tooltip : _this2 . lang . options . help ,
click : _this2 . context . createInvokeHandler ( 'helpDialog.show' )
} ) . render ( ) ;
} ) ;
}
/ * *
* image : [
* [ 'imageResize' , [ 'resizeFull' , 'resizeHalf' , 'resizeQuarter' , 'resizeNone' ] ] ,
* [ 'float' , [ 'floatLeft' , 'floatRight' , 'floatNone' ] ] ,
* [ 'remove' , [ 'removeMedia' ] ] ,
* ] ,
* /
} , {
key : "addImagePopoverButtons" ,
value : function addImagePopoverButtons ( ) {
var _this3 = this ;
// Image Size Buttons
this . context . memo ( 'button.resizeFull' , function ( ) {
return _this3 . button ( {
contents : '<span class="note-fontsize-10">100%</span>' ,
tooltip : _this3 . lang . image . resizeFull ,
click : _this3 . context . createInvokeHandler ( 'editor.resize' , '1' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.resizeHalf' , function ( ) {
return _this3 . button ( {
contents : '<span class="note-fontsize-10">50%</span>' ,
tooltip : _this3 . lang . image . resizeHalf ,
click : _this3 . context . createInvokeHandler ( 'editor.resize' , '0.5' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.resizeQuarter' , function ( ) {
return _this3 . button ( {
contents : '<span class="note-fontsize-10">25%</span>' ,
tooltip : _this3 . lang . image . resizeQuarter ,
click : _this3 . context . createInvokeHandler ( 'editor.resize' , '0.25' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.resizeNone' , function ( ) {
return _this3 . button ( {
contents : _this3 . ui . icon ( _this3 . options . icons . rollback ) ,
tooltip : _this3 . lang . image . resizeNone ,
click : _this3 . context . createInvokeHandler ( 'editor.resize' , '0' )
} ) . render ( ) ;
} ) ; // Float Buttons
this . context . memo ( 'button.floatLeft' , function ( ) {
return _this3 . button ( {
contents : _this3 . ui . icon ( _this3 . options . icons . floatLeft ) ,
tooltip : _this3 . lang . image . floatLeft ,
click : _this3 . context . createInvokeHandler ( 'editor.floatMe' , 'left' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.floatRight' , function ( ) {
return _this3 . button ( {
contents : _this3 . ui . icon ( _this3 . options . icons . floatRight ) ,
tooltip : _this3 . lang . image . floatRight ,
click : _this3 . context . createInvokeHandler ( 'editor.floatMe' , 'right' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.floatNone' , function ( ) {
return _this3 . button ( {
contents : _this3 . ui . icon ( _this3 . options . icons . rollback ) ,
tooltip : _this3 . lang . image . floatNone ,
click : _this3 . context . createInvokeHandler ( 'editor.floatMe' , 'none' )
} ) . render ( ) ;
} ) ; // Remove Buttons
this . context . memo ( 'button.removeMedia' , function ( ) {
return _this3 . button ( {
contents : _this3 . ui . icon ( _this3 . options . icons . trash ) ,
tooltip : _this3 . lang . image . remove ,
click : _this3 . context . createInvokeHandler ( 'editor.removeMedia' )
} ) . render ( ) ;
} ) ;
}
} , {
key : "addLinkPopoverButtons" ,
value : function addLinkPopoverButtons ( ) {
var _this4 = this ;
this . context . memo ( 'button.linkDialogShow' , function ( ) {
return _this4 . button ( {
contents : _this4 . ui . icon ( _this4 . options . icons . link ) ,
tooltip : _this4 . lang . link . edit ,
click : _this4 . context . createInvokeHandler ( 'linkDialog.show' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.unlink' , function ( ) {
return _this4 . button ( {
contents : _this4 . ui . icon ( _this4 . options . icons . unlink ) ,
tooltip : _this4 . lang . link . unlink ,
click : _this4 . context . createInvokeHandler ( 'editor.unlink' )
} ) . render ( ) ;
} ) ;
}
/ * *
* table : [
* [ 'add' , [ 'addRowDown' , 'addRowUp' , 'addColLeft' , 'addColRight' ] ] ,
* [ 'delete' , [ 'deleteRow' , 'deleteCol' , 'deleteTable' ] ]
* ] ,
* /
} , {
key : "addTablePopoverButtons" ,
value : function addTablePopoverButtons ( ) {
var _this5 = this ;
this . context . memo ( 'button.addRowUp' , function ( ) {
return _this5 . button ( {
className : 'btn-md' ,
contents : _this5 . ui . icon ( _this5 . options . icons . rowAbove ) ,
tooltip : _this5 . lang . table . addRowAbove ,
click : _this5 . context . createInvokeHandler ( 'editor.addRow' , 'top' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.addRowDown' , function ( ) {
return _this5 . button ( {
className : 'btn-md' ,
contents : _this5 . ui . icon ( _this5 . options . icons . rowBelow ) ,
tooltip : _this5 . lang . table . addRowBelow ,
click : _this5 . context . createInvokeHandler ( 'editor.addRow' , 'bottom' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.addColLeft' , function ( ) {
return _this5 . button ( {
className : 'btn-md' ,
contents : _this5 . ui . icon ( _this5 . options . icons . colBefore ) ,
tooltip : _this5 . lang . table . addColLeft ,
click : _this5 . context . createInvokeHandler ( 'editor.addCol' , 'left' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.addColRight' , function ( ) {
return _this5 . button ( {
className : 'btn-md' ,
contents : _this5 . ui . icon ( _this5 . options . icons . colAfter ) ,
tooltip : _this5 . lang . table . addColRight ,
click : _this5 . context . createInvokeHandler ( 'editor.addCol' , 'right' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.deleteRow' , function ( ) {
return _this5 . button ( {
className : 'btn-md' ,
contents : _this5 . ui . icon ( _this5 . options . icons . rowRemove ) ,
tooltip : _this5 . lang . table . delRow ,
click : _this5 . context . createInvokeHandler ( 'editor.deleteRow' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.deleteCol' , function ( ) {
return _this5 . button ( {
className : 'btn-md' ,
contents : _this5 . ui . icon ( _this5 . options . icons . colRemove ) ,
tooltip : _this5 . lang . table . delCol ,
click : _this5 . context . createInvokeHandler ( 'editor.deleteCol' )
} ) . render ( ) ;
} ) ;
this . context . memo ( 'button.deleteTable' , function ( ) {
return _this5 . button ( {
className : 'btn-md' ,
contents : _this5 . ui . icon ( _this5 . options . icons . trash ) ,
tooltip : _this5 . lang . table . delTable ,
click : _this5 . context . createInvokeHandler ( 'editor.deleteTable' )
} ) . render ( ) ;
} ) ;
}
} , {
key : "build" ,
value : function build ( $container , groups ) {
for ( var groupIdx = 0 , groupLen = groups . length ; groupIdx < groupLen ; groupIdx ++ ) {
var group = groups [ groupIdx ] ;
var groupName = Array . isArray ( group ) ? group [ 0 ] : group ;
var buttons = Array . isArray ( group ) ? group . length === 1 ? [ group [ 0 ] ] : group [ 1 ] : [ group ] ;
var $group = this . ui . buttonGroup ( {
className : 'note-' + groupName
} ) . render ( ) ;
for ( var idx = 0 , len = buttons . length ; idx < len ; idx ++ ) {
var btn = this . context . memo ( 'button.' + buttons [ idx ] ) ;
if ( btn ) {
$group . append ( typeof btn === 'function' ? btn ( this . context ) : btn ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
$group . appendTo ( $container ) ;
}
}
/ * *
* @ param { jQuery } [ $container ]
* /
} , {
key : "updateCurrentStyle" ,
value : function updateCurrentStyle ( $container ) {
var _this6 = this ;
var $cont = $container || this . $toolbar ;
var styleInfo = this . context . invoke ( 'editor.currentStyle' ) ;
this . updateBtnStates ( $cont , {
'.note-btn-bold' : function noteBtnBold ( ) {
return styleInfo [ 'font-bold' ] === 'bold' ;
} ,
'.note-btn-italic' : function noteBtnItalic ( ) {
return styleInfo [ 'font-italic' ] === 'italic' ;
} ,
'.note-btn-underline' : function noteBtnUnderline ( ) {
return styleInfo [ 'font-underline' ] === 'underline' ;
} ,
'.note-btn-subscript' : function noteBtnSubscript ( ) {
return styleInfo [ 'font-subscript' ] === 'subscript' ;
} ,
'.note-btn-superscript' : function noteBtnSuperscript ( ) {
return styleInfo [ 'font-superscript' ] === 'superscript' ;
} ,
'.note-btn-strikethrough' : function noteBtnStrikethrough ( ) {
return styleInfo [ 'font-strikethrough' ] === 'strikethrough' ;
}
} ) ;
if ( styleInfo [ 'font-family' ] ) {
var fontNames = styleInfo [ 'font-family' ] . split ( ',' ) . map ( function ( name ) {
return name . replace ( /[\'\"]/g , '' ) . replace ( /\s+$/ , '' ) . replace ( /^\s+/ , '' ) ;
} ) ;
var fontName = lists . find ( fontNames , this . isFontInstalled . bind ( this ) ) ;
$cont . find ( '.dropdown-fontname a' ) . each ( function ( idx , item ) {
var $item = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( item ) ; // always compare string to avoid creating another func.
var isChecked = $item . data ( 'value' ) + '' === fontName + '' ;
$item . toggleClass ( 'checked' , isChecked ) ;
} ) ;
$cont . find ( '.note-current-fontname' ) . text ( fontName ) . css ( 'font-family' , fontName ) ;
}
if ( styleInfo [ 'font-size' ] ) {
var fontSize = styleInfo [ 'font-size' ] ;
$cont . find ( '.dropdown-fontsize a' ) . each ( function ( idx , item ) {
var $item = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( item ) ; // always compare with string to avoid creating another func.
var isChecked = $item . data ( 'value' ) + '' === fontSize + '' ;
$item . toggleClass ( 'checked' , isChecked ) ;
} ) ;
$cont . find ( '.note-current-fontsize' ) . text ( fontSize ) ;
var fontSizeUnit = styleInfo [ 'font-size-unit' ] ;
$cont . find ( '.dropdown-fontsizeunit a' ) . each ( function ( idx , item ) {
var $item = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( item ) ;
var isChecked = $item . data ( 'value' ) + '' === fontSizeUnit + '' ;
$item . toggleClass ( 'checked' , isChecked ) ;
} ) ;
$cont . find ( '.note-current-fontsizeunit' ) . text ( fontSizeUnit ) ;
}
if ( styleInfo [ 'line-height' ] ) {
var lineHeight = styleInfo [ 'line-height' ] ;
$cont . find ( '.dropdown-line-height li a' ) . each ( function ( idx , item ) {
// always compare with string to avoid creating another func.
var isChecked = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( item ) . data ( 'value' ) + '' === lineHeight + '' ;
_this6 . className = isChecked ? 'checked' : '' ;
} ) ;
}
}
} , {
key : "updateBtnStates" ,
value : function updateBtnStates ( $container , infos ) {
var _this7 = this ;
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . each ( infos , function ( selector , pred ) {
_this7 . ui . toggleBtnActive ( $container . find ( selector ) , pred ( ) ) ;
} ) ;
}
} , {
key : "tableMoveHandler" ,
value : function tableMoveHandler ( event ) {
var PX _PER _EM = 18 ;
var $picker = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( event . target . parentNode ) ; // target is mousecatcher
var $dimensionDisplay = $picker . next ( ) ;
var $catcher = $picker . find ( '.note-dimension-picker-mousecatcher' ) ;
var $highlighted = $picker . find ( '.note-dimension-picker-highlighted' ) ;
var $unhighlighted = $picker . find ( '.note-dimension-picker-unhighlighted' ) ;
var posOffset ; // HTML5 with jQuery - e.offsetX is undefined in Firefox
if ( event . offsetX === undefined ) {
var posCatcher = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( event . target ) . offset ( ) ;
posOffset = {
x : event . pageX - posCatcher . left ,
y : event . pageY - posCatcher . top
} ;
} else {
posOffset = {
x : event . offsetX ,
y : event . offsetY
} ;
}
var dim = {
c : Math . ceil ( posOffset . x / PX _PER _EM ) || 1 ,
r : Math . ceil ( posOffset . y / PX _PER _EM ) || 1
2019-06-10 15:38:54 +00:00
} ;
2020-04-01 22:52:43 +00:00
$highlighted . css ( {
width : dim . c + 'em' ,
height : dim . r + 'em'
} ) ;
$catcher . data ( 'value' , dim . c + 'x' + dim . r ) ;
if ( dim . c > 3 && dim . c < this . options . insertTableMaxSize . col ) {
$unhighlighted . css ( {
width : dim . c + 1 + 'em'
} ) ;
}
if ( dim . r > 3 && dim . r < this . options . insertTableMaxSize . row ) {
$unhighlighted . css ( {
height : dim . r + 1 + 'em'
} ) ;
}
$dimensionDisplay . html ( dim . c + ' x ' + dim . r ) ;
}
} ] ) ;
return Buttons ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/module/Toolbar.js
function Toolbar _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function Toolbar _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 ) ; } }
function Toolbar _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) Toolbar _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) Toolbar _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
2020-06-01 11:05:25 +00:00
var Toolbar _Toolbar = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function Toolbar ( context ) {
Toolbar _classCallCheck ( this , Toolbar ) ;
this . context = context ;
this . $window = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( window ) ;
this . $document = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( document ) ;
this . ui = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote . ui ;
this . $note = context . layoutInfo . note ;
this . $editor = context . layoutInfo . editor ;
this . $toolbar = context . layoutInfo . toolbar ;
this . $editable = context . layoutInfo . editable ;
this . $statusbar = context . layoutInfo . statusbar ;
this . options = context . options ;
this . isFollowing = false ;
this . followScroll = this . followScroll . bind ( this ) ;
}
Toolbar _createClass ( Toolbar , [ {
key : "shouldInitialize" ,
value : function shouldInitialize ( ) {
return ! this . options . airMode ;
}
} , {
key : "initialize" ,
value : function initialize ( ) {
var _this = this ;
this . options . toolbar = this . options . toolbar || [ ] ;
if ( ! this . options . toolbar . length ) {
this . $toolbar . hide ( ) ;
} else {
this . context . invoke ( 'buttons.build' , this . $toolbar , this . options . toolbar ) ;
}
if ( this . options . toolbarContainer ) {
this . $toolbar . appendTo ( this . options . toolbarContainer ) ;
}
this . changeContainer ( false ) ;
this . $note . on ( 'summernote.keyup summernote.mouseup summernote.change' , function ( ) {
_this . context . invoke ( 'buttons.updateCurrentStyle' ) ;
} ) ;
this . context . invoke ( 'buttons.updateCurrentStyle' ) ;
if ( this . options . followingToolbar ) {
this . $window . on ( 'scroll resize' , this . followScroll ) ;
}
}
} , {
key : "destroy" ,
value : function destroy ( ) {
this . $toolbar . children ( ) . remove ( ) ;
if ( this . options . followingToolbar ) {
this . $window . off ( 'scroll resize' , this . followScroll ) ;
}
}
} , {
key : "followScroll" ,
value : function followScroll ( ) {
if ( this . $editor . hasClass ( 'fullscreen' ) ) {
return false ;
}
var editorHeight = this . $editor . outerHeight ( ) ;
var editorWidth = this . $editor . width ( ) ;
var toolbarHeight = this . $toolbar . height ( ) ;
var statusbarHeight = this . $statusbar . height ( ) ; // check if the web app is currently using another static bar
var otherBarHeight = 0 ;
if ( this . options . otherStaticBar ) {
otherBarHeight = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( this . options . otherStaticBar ) . outerHeight ( ) ;
}
var currentOffset = this . $document . scrollTop ( ) ;
var editorOffsetTop = this . $editor . offset ( ) . top ;
var editorOffsetBottom = editorOffsetTop + editorHeight ;
var activateOffset = editorOffsetTop - otherBarHeight ;
var deactivateOffsetBottom = editorOffsetBottom - otherBarHeight - toolbarHeight - statusbarHeight ;
if ( ! this . isFollowing && currentOffset > activateOffset && currentOffset < deactivateOffsetBottom - toolbarHeight ) {
this . isFollowing = true ;
this . $editable . css ( {
marginTop : this . $toolbar . outerHeight ( )
} ) ;
this . $toolbar . css ( {
position : 'fixed' ,
top : otherBarHeight ,
width : editorWidth ,
zIndex : 1000
} ) ;
} else if ( this . isFollowing && ( currentOffset < activateOffset || currentOffset > deactivateOffsetBottom ) ) {
this . isFollowing = false ;
this . $toolbar . css ( {
position : 'relative' ,
top : 0 ,
width : '100%' ,
zIndex : 'auto'
} ) ;
this . $editable . css ( {
marginTop : ''
} ) ;
}
}
} , {
key : "changeContainer" ,
value : function changeContainer ( isFullscreen ) {
if ( isFullscreen ) {
this . $toolbar . prependTo ( this . $editor ) ;
} else {
if ( this . options . toolbarContainer ) {
this . $toolbar . appendTo ( this . options . toolbarContainer ) ;
}
}
if ( this . options . followingToolbar ) {
this . followScroll ( ) ;
}
}
} , {
key : "updateFullscreen" ,
value : function updateFullscreen ( isFullscreen ) {
this . ui . toggleBtnActive ( this . $toolbar . find ( '.btn-fullscreen' ) , isFullscreen ) ;
this . changeContainer ( isFullscreen ) ;
}
} , {
key : "updateCodeview" ,
value : function updateCodeview ( isCodeview ) {
this . ui . toggleBtnActive ( this . $toolbar . find ( '.btn-codeview' ) , isCodeview ) ;
if ( isCodeview ) {
this . deactivate ( ) ;
} else {
this . activate ( ) ;
}
}
} , {
key : "activate" ,
value : function activate ( isIncludeCodeview ) {
var $btn = this . $toolbar . find ( 'button' ) ;
if ( ! isIncludeCodeview ) {
2020-06-01 11:05:25 +00:00
$btn = $btn . not ( '.note-codeview-keep' ) ;
2020-04-01 22:52:43 +00:00
}
this . ui . toggleBtn ( $btn , true ) ;
}
} , {
key : "deactivate" ,
value : function deactivate ( isIncludeCodeview ) {
var $btn = this . $toolbar . find ( 'button' ) ;
if ( ! isIncludeCodeview ) {
2020-06-01 11:05:25 +00:00
$btn = $btn . not ( '.note-codeview-keep' ) ;
2020-04-01 22:52:43 +00:00
}
this . ui . toggleBtn ( $btn , false ) ;
}
} ] ) ;
return Toolbar ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/module/LinkDialog.js
function LinkDialog _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function LinkDialog _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 ) ; } }
function LinkDialog _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) LinkDialog _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) LinkDialog _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
2020-06-01 11:05:25 +00:00
var LinkDialog _LinkDialog = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function LinkDialog ( context ) {
LinkDialog _classCallCheck ( this , LinkDialog ) ;
this . context = context ;
this . ui = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote . ui ;
this . $body = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( document . body ) ;
this . $editor = context . layoutInfo . editor ;
this . options = context . options ;
this . lang = this . options . langInfo ;
context . memo ( 'help.linkDialog.show' , this . options . langInfo . help [ 'linkDialog.show' ] ) ;
}
LinkDialog _createClass ( LinkDialog , [ {
key : "initialize" ,
value : function initialize ( ) {
var $container = this . options . dialogsInBody ? this . $body : this . options . container ;
var body = [ '<div class="form-group note-form-group">' , "<label for=\"note-dialog-link-txt-" . concat ( this . options . id , "\" class=\"note-form-label\">" ) . concat ( this . lang . link . textToDisplay , "</label>" ) , "<input id=\"note-dialog-link-txt-" . concat ( this . options . id , "\" class=\"note-link-text form-control note-form-control note-input\" type=\"text\"/>" ) , '</div>' , '<div class="form-group note-form-group">' , "<label for=\"note-dialog-link-url-" . concat ( this . options . id , "\" class=\"note-form-label\">" ) . concat ( this . lang . link . url , "</label>" ) , "<input id=\"note-dialog-link-url-" . concat ( this . options . id , "\" class=\"note-link-url form-control note-form-control note-input\" type=\"text\" value=\"http://\"/>" ) , '</div>' , ! this . options . disableLinkTarget ? external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<div/>' ) . append ( this . ui . checkbox ( {
className : 'sn-checkbox-open-in-new-window' ,
text : this . lang . link . openInNewWindow ,
checked : true
} ) . render ( ) ) . html ( ) : '' , external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<div/>' ) . append ( this . ui . checkbox ( {
className : 'sn-checkbox-use-protocol' ,
text : this . lang . link . useProtocol ,
checked : true
} ) . render ( ) ) . html ( ) ] . join ( '' ) ;
var buttonClass = 'btn btn-primary note-btn note-btn-primary note-link-btn' ;
var footer = "<input type=\"button\" href=\"#\" class=\"" . concat ( buttonClass , "\" value=\"" ) . concat ( this . lang . link . insert , "\" disabled>" ) ;
this . $dialog = this . ui . dialog ( {
className : 'link-dialog' ,
title : this . lang . link . insert ,
fade : this . options . dialogsFade ,
body : body ,
footer : footer
} ) . render ( ) . appendTo ( $container ) ;
}
} , {
key : "destroy" ,
value : function destroy ( ) {
this . ui . hideDialog ( this . $dialog ) ;
this . $dialog . remove ( ) ;
}
} , {
key : "bindEnterKey" ,
value : function bindEnterKey ( $input , $btn ) {
$input . on ( 'keypress' , function ( event ) {
if ( event . keyCode === core _key . code . ENTER ) {
event . preventDefault ( ) ;
$btn . trigger ( 'click' ) ;
}
} ) ;
}
/ * *
* toggle update button
* /
} , {
key : "toggleLinkBtn" ,
value : function toggleLinkBtn ( $linkBtn , $linkText , $linkUrl ) {
this . ui . toggleBtn ( $linkBtn , $linkText . val ( ) && $linkUrl . val ( ) ) ;
}
/ * *
* Show link dialog and set event handlers on dialog controls .
*
* @ param { Object } linkInfo
* @ return { Promise }
* /
} , {
key : "showLinkDialog" ,
value : function showLinkDialog ( linkInfo ) {
var _this = this ;
return external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . Deferred ( function ( deferred ) {
var $linkText = _this . $dialog . find ( '.note-link-text' ) ;
var $linkUrl = _this . $dialog . find ( '.note-link-url' ) ;
var $linkBtn = _this . $dialog . find ( '.note-link-btn' ) ;
var $openInNewWindow = _this . $dialog . find ( '.sn-checkbox-open-in-new-window input[type=checkbox]' ) ;
var $useProtocol = _this . $dialog . find ( '.sn-checkbox-use-protocol input[type=checkbox]' ) ;
_this . ui . onDialogShown ( _this . $dialog , function ( ) {
_this . context . triggerEvent ( 'dialog.shown' ) ; // If no url was given and given text is valid URL then copy that into URL Field
if ( ! linkInfo . url && func . isValidUrl ( linkInfo . text ) ) {
linkInfo . url = linkInfo . text ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
$linkText . on ( 'input paste propertychange' , function ( ) {
// If linktext was modified by input events,
// cloning text from linkUrl will be stopped.
linkInfo . text = $linkText . val ( ) ;
_this . toggleLinkBtn ( $linkBtn , $linkText , $linkUrl ) ;
} ) . val ( linkInfo . text ) ;
$linkUrl . on ( 'input paste propertychange' , function ( ) {
// Display same text on `Text to display` as default
// when linktext has no text
if ( ! linkInfo . text ) {
$linkText . val ( $linkUrl . val ( ) ) ;
}
_this . toggleLinkBtn ( $linkBtn , $linkText , $linkUrl ) ;
} ) . val ( linkInfo . url ) ;
if ( ! env . isSupportTouch ) {
$linkUrl . trigger ( 'focus' ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
_this . toggleLinkBtn ( $linkBtn , $linkText , $linkUrl ) ;
_this . bindEnterKey ( $linkUrl , $linkBtn ) ;
_this . bindEnterKey ( $linkText , $linkBtn ) ;
var isNewWindowChecked = linkInfo . isNewWindow !== undefined ? linkInfo . isNewWindow : _this . context . options . linkTargetBlank ;
$openInNewWindow . prop ( 'checked' , isNewWindowChecked ) ;
var useProtocolChecked = linkInfo . url ? false : _this . context . options . useProtocol ;
$useProtocol . prop ( 'checked' , useProtocolChecked ) ;
$linkBtn . one ( 'click' , function ( event ) {
event . preventDefault ( ) ;
deferred . resolve ( {
range : linkInfo . range ,
url : $linkUrl . val ( ) ,
text : $linkText . val ( ) ,
isNewWindow : $openInNewWindow . is ( ':checked' ) ,
checkProtocol : $useProtocol . is ( ':checked' )
} ) ;
_this . ui . hideDialog ( _this . $dialog ) ;
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
} ) ;
_this . ui . onDialogHidden ( _this . $dialog , function ( ) {
// detach events
$linkText . off ( ) ;
$linkUrl . off ( ) ;
$linkBtn . off ( ) ;
if ( deferred . state ( ) === 'pending' ) {
deferred . reject ( ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
} ) ;
_this . ui . showDialog ( _this . $dialog ) ;
} ) . promise ( ) ;
}
/ * *
* @ param { Object } layoutInfo
* /
} , {
key : "show" ,
value : function show ( ) {
var _this2 = this ;
var linkInfo = this . context . invoke ( 'editor.getLinkInfo' ) ;
this . context . invoke ( 'editor.saveRange' ) ;
this . showLinkDialog ( linkInfo ) . then ( function ( linkInfo ) {
_this2 . context . invoke ( 'editor.restoreRange' ) ;
_this2 . context . invoke ( 'editor.createLink' , linkInfo ) ;
} ) . fail ( function ( ) {
_this2 . context . invoke ( 'editor.restoreRange' ) ;
} ) ;
}
} ] ) ;
return LinkDialog ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/module/LinkPopover.js
function LinkPopover _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function LinkPopover _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 ) ; } }
function LinkPopover _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) LinkPopover _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) LinkPopover _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
2020-06-01 11:05:25 +00:00
var LinkPopover _LinkPopover = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function LinkPopover ( context ) {
var _this = this ;
LinkPopover _classCallCheck ( this , LinkPopover ) ;
this . context = context ;
this . ui = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote . ui ;
this . options = context . options ;
this . events = {
'summernote.keyup summernote.mouseup summernote.change summernote.scroll' : function summernoteKeyupSummernoteMouseupSummernoteChangeSummernoteScroll ( ) {
_this . update ( ) ;
} ,
'summernote.disable summernote.dialog.shown summernote.blur' : function summernoteDisableSummernoteDialogShownSummernoteBlur ( ) {
_this . hide ( ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
} ;
}
LinkPopover _createClass ( LinkPopover , [ {
key : "shouldInitialize" ,
value : function shouldInitialize ( ) {
return ! lists . isEmpty ( this . options . popover . link ) ;
}
} , {
key : "initialize" ,
value : function initialize ( ) {
this . $popover = this . ui . popover ( {
className : 'note-link-popover' ,
callback : function callback ( $node ) {
var $content = $node . find ( '.popover-content,.note-popover-content' ) ;
$content . prepend ( '<span><a target="_blank"></a> </span>' ) ;
}
} ) . render ( ) . appendTo ( this . options . container ) ;
var $content = this . $popover . find ( '.popover-content,.note-popover-content' ) ;
this . context . invoke ( 'buttons.build' , $content , this . options . popover . link ) ;
this . $popover . on ( 'mousedown' , function ( e ) {
e . preventDefault ( ) ;
} ) ;
}
} , {
key : "destroy" ,
value : function destroy ( ) {
this . $popover . remove ( ) ;
}
} , {
key : "update" ,
value : function update ( ) {
// Prevent focusing on editable when invoke('code') is executed
if ( ! this . context . invoke ( 'editor.hasFocus' ) ) {
this . hide ( ) ;
return ;
}
var rng = this . context . invoke ( 'editor.getLastRange' ) ;
if ( rng . isCollapsed ( ) && rng . isOnAnchor ( ) ) {
var anchor = dom . ancestor ( rng . sc , dom . isAnchor ) ;
var href = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( anchor ) . attr ( 'href' ) ;
this . $popover . find ( 'a' ) . attr ( 'href' , href ) . text ( href ) ;
var pos = dom . posFromPlaceholder ( anchor ) ;
var containerOffset = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( this . options . container ) . offset ( ) ;
pos . top -= containerOffset . top ;
pos . left -= containerOffset . left ;
this . $popover . css ( {
display : 'block' ,
left : pos . left ,
top : pos . top
} ) ;
} else {
this . hide ( ) ;
}
}
} , {
key : "hide" ,
value : function hide ( ) {
this . $popover . hide ( ) ;
}
} ] ) ;
return LinkPopover ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/module/ImageDialog.js
function ImageDialog _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function ImageDialog _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 ) ; } }
function ImageDialog _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) ImageDialog _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) ImageDialog _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
2020-06-01 11:05:25 +00:00
var ImageDialog _ImageDialog = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function ImageDialog ( context ) {
ImageDialog _classCallCheck ( this , ImageDialog ) ;
this . context = context ;
this . ui = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote . ui ;
this . $body = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( document . body ) ;
this . $editor = context . layoutInfo . editor ;
this . options = context . options ;
this . lang = this . options . langInfo ;
}
ImageDialog _createClass ( ImageDialog , [ {
key : "initialize" ,
value : function initialize ( ) {
var imageLimitation = '' ;
if ( this . options . maximumImageFileSize ) {
var unit = Math . floor ( Math . log ( this . options . maximumImageFileSize ) / Math . log ( 1024 ) ) ;
var readableSize = ( this . options . maximumImageFileSize / Math . pow ( 1024 , unit ) ) . toFixed ( 2 ) * 1 + ' ' + ' KMGTP' [ unit ] + 'B' ;
imageLimitation = "<small>" . concat ( this . lang . image . maximumFileSize + ' : ' + readableSize , "</small>" ) ;
}
var $container = this . options . dialogsInBody ? this . $body : this . options . container ;
var body = [ '<div class="form-group note-form-group note-group-select-from-files">' , '<label for="note-dialog-image-file-' + this . options . id + '" class="note-form-label">' + this . lang . image . selectFromFiles + '</label>' , '<input id="note-dialog-image-file-' + this . options . id + '" class="note-image-input form-control-file note-form-control note-input" ' , ' type="file" name="files" accept="image/*" multiple="multiple"/>' , imageLimitation , '</div>' , '<div class="form-group note-group-image-url">' , '<label for="note-dialog-image-url-' + this . options . id + '" class="note-form-label">' + this . lang . image . url + '</label>' , '<input id="note-dialog-image-url-' + this . options . id + '" class="note-image-url form-control note-form-control note-input" type="text"/>' , '</div>' ] . join ( '' ) ;
var buttonClass = 'btn btn-primary note-btn note-btn-primary note-image-btn' ;
var footer = "<input type=\"button\" href=\"#\" class=\"" . concat ( buttonClass , "\" value=\"" ) . concat ( this . lang . image . insert , "\" disabled>" ) ;
this . $dialog = this . ui . dialog ( {
title : this . lang . image . insert ,
fade : this . options . dialogsFade ,
body : body ,
footer : footer
} ) . render ( ) . appendTo ( $container ) ;
}
} , {
key : "destroy" ,
value : function destroy ( ) {
this . ui . hideDialog ( this . $dialog ) ;
this . $dialog . remove ( ) ;
}
} , {
key : "bindEnterKey" ,
value : function bindEnterKey ( $input , $btn ) {
$input . on ( 'keypress' , function ( event ) {
if ( event . keyCode === core _key . code . ENTER ) {
event . preventDefault ( ) ;
$btn . trigger ( 'click' ) ;
}
} ) ;
}
} , {
key : "show" ,
value : function show ( ) {
var _this = this ;
this . context . invoke ( 'editor.saveRange' ) ;
this . showImageDialog ( ) . then ( function ( data ) {
// [workaround] hide dialog before restore range for IE range focus
_this . ui . hideDialog ( _this . $dialog ) ;
_this . context . invoke ( 'editor.restoreRange' ) ;
if ( typeof data === 'string' ) {
// image url
// If onImageLinkInsert set,
if ( _this . options . callbacks . onImageLinkInsert ) {
_this . context . triggerEvent ( 'image.link.insert' , data ) ;
} else {
_this . context . invoke ( 'editor.insertImage' , data ) ;
}
} else {
// array of files
_this . context . invoke ( 'editor.insertImagesOrCallback' , data ) ;
}
} ) . fail ( function ( ) {
_this . context . invoke ( 'editor.restoreRange' ) ;
} ) ;
}
/ * *
* show image dialog
*
* @ param { jQuery } $dialog
* @ return { Promise }
* /
2019-06-10 15:38:54 +00:00
2020-04-01 22:52:43 +00:00
} , {
key : "showImageDialog" ,
value : function showImageDialog ( ) {
var _this2 = this ;
return external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . Deferred ( function ( deferred ) {
var $imageInput = _this2 . $dialog . find ( '.note-image-input' ) ;
var $imageUrl = _this2 . $dialog . find ( '.note-image-url' ) ;
var $imageBtn = _this2 . $dialog . find ( '.note-image-btn' ) ;
_this2 . ui . onDialogShown ( _this2 . $dialog , function ( ) {
_this2 . context . triggerEvent ( 'dialog.shown' ) ; // Cloning imageInput to clear element.
$imageInput . replaceWith ( $imageInput . clone ( ) . on ( 'change' , function ( event ) {
deferred . resolve ( event . target . files || event . target . value ) ;
} ) . val ( '' ) ) ;
$imageUrl . on ( 'input paste propertychange' , function ( ) {
_this2 . ui . toggleBtn ( $imageBtn , $imageUrl . val ( ) ) ;
} ) . val ( '' ) ;
if ( ! env . isSupportTouch ) {
$imageUrl . trigger ( 'focus' ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
$imageBtn . click ( function ( event ) {
event . preventDefault ( ) ;
deferred . resolve ( $imageUrl . val ( ) ) ;
} ) ;
_this2 . bindEnterKey ( $imageUrl , $imageBtn ) ;
} ) ;
_this2 . ui . onDialogHidden ( _this2 . $dialog , function ( ) {
$imageInput . off ( ) ;
$imageUrl . off ( ) ;
$imageBtn . off ( ) ;
if ( deferred . state ( ) === 'pending' ) {
deferred . reject ( ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
} ) ;
_this2 . ui . showDialog ( _this2 . $dialog ) ;
} ) ;
}
} ] ) ;
return ImageDialog ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/module/ImagePopover.js
function ImagePopover _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function ImagePopover _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 ) ; } }
function ImagePopover _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) ImagePopover _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) ImagePopover _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
/ * *
* Image popover module
* mouse events that show / hide popover will be handled by Handle . js .
* Handle . js will receive the events and invoke 'imagePopover.update' .
* /
2020-06-01 11:05:25 +00:00
var ImagePopover _ImagePopover = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function ImagePopover ( context ) {
var _this = this ;
ImagePopover _classCallCheck ( this , ImagePopover ) ;
this . context = context ;
this . ui = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote . ui ;
this . editable = context . layoutInfo . editable [ 0 ] ;
this . options = context . options ;
this . events = {
'summernote.disable summernote.blur' : function summernoteDisableSummernoteBlur ( ) {
_this . hide ( ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
} ;
}
ImagePopover _createClass ( ImagePopover , [ {
key : "shouldInitialize" ,
value : function shouldInitialize ( ) {
return ! lists . isEmpty ( this . options . popover . image ) ;
}
} , {
key : "initialize" ,
value : function initialize ( ) {
this . $popover = this . ui . popover ( {
className : 'note-image-popover'
} ) . render ( ) . appendTo ( this . options . container ) ;
var $content = this . $popover . find ( '.popover-content,.note-popover-content' ) ;
this . context . invoke ( 'buttons.build' , $content , this . options . popover . image ) ;
this . $popover . on ( 'mousedown' , function ( e ) {
e . preventDefault ( ) ;
} ) ;
}
} , {
key : "destroy" ,
value : function destroy ( ) {
this . $popover . remove ( ) ;
}
} , {
key : "update" ,
value : function update ( target , event ) {
if ( dom . isImg ( target ) ) {
var position = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( target ) . offset ( ) ;
var containerOffset = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( this . options . container ) . offset ( ) ;
var pos = { } ;
if ( this . options . popatmouse ) {
pos . left = event . pageX - 20 ;
pos . top = event . pageY ;
} else {
pos = position ;
}
pos . top -= containerOffset . top ;
pos . left -= containerOffset . left ;
this . $popover . css ( {
display : 'block' ,
left : pos . left ,
top : pos . top
} ) ;
} else {
this . hide ( ) ;
}
}
} , {
key : "hide" ,
value : function hide ( ) {
this . $popover . hide ( ) ;
}
} ] ) ;
return ImagePopover ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/module/TablePopover.js
function TablePopover _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function TablePopover _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 ) ; } }
function TablePopover _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) TablePopover _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) TablePopover _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
2020-06-01 11:05:25 +00:00
var TablePopover _TablePopover = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function TablePopover ( context ) {
var _this = this ;
TablePopover _classCallCheck ( this , TablePopover ) ;
this . context = context ;
this . ui = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote . ui ;
this . options = context . options ;
this . events = {
'summernote.mousedown' : function summernoteMousedown ( we , e ) {
_this . update ( e . target ) ;
} ,
'summernote.keyup summernote.scroll summernote.change' : function summernoteKeyupSummernoteScrollSummernoteChange ( ) {
_this . update ( ) ;
} ,
'summernote.disable summernote.blur' : function summernoteDisableSummernoteBlur ( ) {
_this . hide ( ) ;
}
} ;
}
TablePopover _createClass ( TablePopover , [ {
key : "shouldInitialize" ,
value : function shouldInitialize ( ) {
return ! lists . isEmpty ( this . options . popover . table ) ;
}
} , {
key : "initialize" ,
value : function initialize ( ) {
this . $popover = this . ui . popover ( {
className : 'note-table-popover'
} ) . render ( ) . appendTo ( this . options . container ) ;
var $content = this . $popover . find ( '.popover-content,.note-popover-content' ) ;
this . context . invoke ( 'buttons.build' , $content , this . options . popover . table ) ; // [workaround] Disable Firefox's default table editor
if ( env . isFF ) {
document . execCommand ( 'enableInlineTableEditing' , false , false ) ;
}
this . $popover . on ( 'mousedown' , function ( e ) {
e . preventDefault ( ) ;
} ) ;
}
} , {
key : "destroy" ,
value : function destroy ( ) {
this . $popover . remove ( ) ;
}
} , {
key : "update" ,
value : function update ( target ) {
if ( this . context . isDisabled ( ) ) {
return false ;
}
var isCell = dom . isCell ( target ) ;
if ( isCell ) {
var pos = dom . posFromPlaceholder ( target ) ;
var containerOffset = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( this . options . container ) . offset ( ) ;
pos . top -= containerOffset . top ;
pos . left -= containerOffset . left ;
this . $popover . css ( {
display : 'block' ,
left : pos . left ,
top : pos . top
} ) ;
} else {
this . hide ( ) ;
}
return isCell ;
}
} , {
key : "hide" ,
value : function hide ( ) {
this . $popover . hide ( ) ;
}
} ] ) ;
return TablePopover ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/module/VideoDialog.js
function VideoDialog _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function VideoDialog _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 ) ; } }
function VideoDialog _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) VideoDialog _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) VideoDialog _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
2020-06-01 11:05:25 +00:00
var VideoDialog _VideoDialog = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function VideoDialog ( context ) {
VideoDialog _classCallCheck ( this , VideoDialog ) ;
this . context = context ;
this . ui = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote . ui ;
this . $body = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( document . body ) ;
this . $editor = context . layoutInfo . editor ;
this . options = context . options ;
this . lang = this . options . langInfo ;
}
VideoDialog _createClass ( VideoDialog , [ {
key : "initialize" ,
value : function initialize ( ) {
var $container = this . options . dialogsInBody ? this . $body : this . options . container ;
var body = [ '<div class="form-group note-form-group row-fluid">' , "<label for=\"note-dialog-video-url-" . concat ( this . options . id , "\" class=\"note-form-label\">" ) . concat ( this . lang . video . url , " <small class=\"text-muted\">" ) . concat ( this . lang . video . providers , "</small></label>" ) , "<input id=\"note-dialog-video-url-" . concat ( this . options . id , "\" class=\"note-video-url form-control note-form-control note-input\" type=\"text\"/>" ) , '</div>' ] . join ( '' ) ;
var buttonClass = 'btn btn-primary note-btn note-btn-primary note-video-btn' ;
var footer = "<input type=\"button\" href=\"#\" class=\"" . concat ( buttonClass , "\" value=\"" ) . concat ( this . lang . video . insert , "\" disabled>" ) ;
this . $dialog = this . ui . dialog ( {
title : this . lang . video . insert ,
fade : this . options . dialogsFade ,
body : body ,
footer : footer
} ) . render ( ) . appendTo ( $container ) ;
}
} , {
key : "destroy" ,
value : function destroy ( ) {
this . ui . hideDialog ( this . $dialog ) ;
this . $dialog . remove ( ) ;
}
} , {
key : "bindEnterKey" ,
value : function bindEnterKey ( $input , $btn ) {
$input . on ( 'keypress' , function ( event ) {
if ( event . keyCode === core _key . code . ENTER ) {
event . preventDefault ( ) ;
$btn . trigger ( 'click' ) ;
}
} ) ;
}
} , {
key : "createVideoNode" ,
value : function createVideoNode ( url ) {
// video url patterns(youtube, instagram, vimeo, dailymotion, youku, mp4, ogg, webm)
2020-06-01 11:05:25 +00:00
var ytRegExp = /\/\/(?:(?:www|m)\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))([\w|-]{11})(?:(?:[\?&]t=)(\S+))?$/ ;
2020-04-01 22:52:43 +00:00
var ytRegExpForStart = /^(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?$/ ;
var ytMatch = url . match ( ytRegExp ) ;
var igRegExp = /(?:www\.|\/\/)instagram\.com\/p\/(.[a-zA-Z0-9_-]*)/ ;
var igMatch = url . match ( igRegExp ) ;
var vRegExp = /\/\/vine\.co\/v\/([a-zA-Z0-9]+)/ ;
var vMatch = url . match ( vRegExp ) ;
var vimRegExp = /\/\/(player\.)?vimeo\.com\/([a-z]*\/)*(\d+)[?]?.*/ ;
var vimMatch = url . match ( vimRegExp ) ;
var dmRegExp = /.+dailymotion.com\/(video|hub)\/([^_]+)[^#]*(#video=([^_&]+))?/ ;
var dmMatch = url . match ( dmRegExp ) ;
var youkuRegExp = /\/\/v\.youku\.com\/v_show\/id_(\w+)=*\.html/ ;
var youkuMatch = url . match ( youkuRegExp ) ;
var qqRegExp = /\/\/v\.qq\.com.*?vid=(.+)/ ;
var qqMatch = url . match ( qqRegExp ) ;
var qqRegExp2 = /\/\/v\.qq\.com\/x?\/?(page|cover).*?\/([^\/]+)\.html\??.*/ ;
var qqMatch2 = url . match ( qqRegExp2 ) ;
var mp4RegExp = /^.+.(mp4|m4v)$/ ;
var mp4Match = url . match ( mp4RegExp ) ;
var oggRegExp = /^.+.(ogg|ogv)$/ ;
var oggMatch = url . match ( oggRegExp ) ;
var webmRegExp = /^.+.(webm)$/ ;
var webmMatch = url . match ( webmRegExp ) ;
var fbRegExp = /(?:www\.|\/\/)facebook\.com\/([^\/]+)\/videos\/([0-9]+)/ ;
var fbMatch = url . match ( fbRegExp ) ;
var $video ;
if ( ytMatch && ytMatch [ 1 ] . length === 11 ) {
var youtubeId = ytMatch [ 1 ] ;
var start = 0 ;
if ( typeof ytMatch [ 2 ] !== 'undefined' ) {
var ytMatchForStart = ytMatch [ 2 ] . match ( ytRegExpForStart ) ;
if ( ytMatchForStart ) {
for ( var n = [ 3600 , 60 , 1 ] , i = 0 , r = n . length ; i < r ; i ++ ) {
start += typeof ytMatchForStart [ i + 1 ] !== 'undefined' ? n [ i ] * parseInt ( ytMatchForStart [ i + 1 ] , 10 ) : 0 ;
}
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
$video = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<iframe>' ) . attr ( 'frameborder' , 0 ) . attr ( 'src' , '//www.youtube.com/embed/' + youtubeId + ( start > 0 ? '?start=' + start : '' ) ) . attr ( 'width' , '640' ) . attr ( 'height' , '360' ) ;
} else if ( igMatch && igMatch [ 0 ] . length ) {
$video = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<iframe>' ) . attr ( 'frameborder' , 0 ) . attr ( 'src' , 'https://instagram.com/p/' + igMatch [ 1 ] + '/embed/' ) . attr ( 'width' , '612' ) . attr ( 'height' , '710' ) . attr ( 'scrolling' , 'no' ) . attr ( 'allowtransparency' , 'true' ) ;
} else if ( vMatch && vMatch [ 0 ] . length ) {
$video = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<iframe>' ) . attr ( 'frameborder' , 0 ) . attr ( 'src' , vMatch [ 0 ] + '/embed/simple' ) . attr ( 'width' , '600' ) . attr ( 'height' , '600' ) . attr ( 'class' , 'vine-embed' ) ;
} else if ( vimMatch && vimMatch [ 3 ] . length ) {
$video = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>' ) . attr ( 'frameborder' , 0 ) . attr ( 'src' , '//player.vimeo.com/video/' + vimMatch [ 3 ] ) . attr ( 'width' , '640' ) . attr ( 'height' , '360' ) ;
} else if ( dmMatch && dmMatch [ 2 ] . length ) {
$video = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<iframe>' ) . attr ( 'frameborder' , 0 ) . attr ( 'src' , '//www.dailymotion.com/embed/video/' + dmMatch [ 2 ] ) . attr ( 'width' , '640' ) . attr ( 'height' , '360' ) ;
} else if ( youkuMatch && youkuMatch [ 1 ] . length ) {
$video = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>' ) . attr ( 'frameborder' , 0 ) . attr ( 'height' , '498' ) . attr ( 'width' , '510' ) . attr ( 'src' , '//player.youku.com/embed/' + youkuMatch [ 1 ] ) ;
} else if ( qqMatch && qqMatch [ 1 ] . length || qqMatch2 && qqMatch2 [ 2 ] . length ) {
var vid = qqMatch && qqMatch [ 1 ] . length ? qqMatch [ 1 ] : qqMatch2 [ 2 ] ;
2020-06-01 11:05:25 +00:00
$video = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>' ) . attr ( 'frameborder' , 0 ) . attr ( 'height' , '310' ) . attr ( 'width' , '500' ) . attr ( 'src' , 'https://v.qq.com/txp/iframe/player.html?vid=' + vid + '&auto=0' ) ;
2020-04-01 22:52:43 +00:00
} else if ( mp4Match || oggMatch || webmMatch ) {
$video = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<video controls>' ) . attr ( 'src' , url ) . attr ( 'width' , '640' ) . attr ( 'height' , '360' ) ;
} else if ( fbMatch && fbMatch [ 0 ] . length ) {
$video = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<iframe>' ) . attr ( 'frameborder' , 0 ) . attr ( 'src' , 'https://www.facebook.com/plugins/video.php?href=' + encodeURIComponent ( fbMatch [ 0 ] ) + '&show_text=0&width=560' ) . attr ( 'width' , '560' ) . attr ( 'height' , '301' ) . attr ( 'scrolling' , 'no' ) . attr ( 'allowtransparency' , 'true' ) ;
} else {
// this is not a known video link. Now what, Cat? Now what?
return false ;
}
$video . addClass ( 'note-video-clip' ) ;
return $video [ 0 ] ;
}
} , {
key : "show" ,
value : function show ( ) {
var _this = this ;
var text = this . context . invoke ( 'editor.getSelectedText' ) ;
this . context . invoke ( 'editor.saveRange' ) ;
this . showVideoDialog ( text ) . then ( function ( url ) {
// [workaround] hide dialog before restore range for IE range focus
_this . ui . hideDialog ( _this . $dialog ) ;
_this . context . invoke ( 'editor.restoreRange' ) ; // build node
var $node = _this . createVideoNode ( url ) ;
if ( $node ) {
// insert video node
_this . context . invoke ( 'editor.insertNode' , $node ) ;
}
} ) . fail ( function ( ) {
_this . context . invoke ( 'editor.restoreRange' ) ;
} ) ;
}
/ * *
* show video dialog
*
* @ param { jQuery } $dialog
* @ return { Promise }
* /
} , {
key : "showVideoDialog" ,
value : function showVideoDialog ( )
/* text */
{
var _this2 = this ;
return external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . Deferred ( function ( deferred ) {
var $videoUrl = _this2 . $dialog . find ( '.note-video-url' ) ;
var $videoBtn = _this2 . $dialog . find ( '.note-video-btn' ) ;
_this2 . ui . onDialogShown ( _this2 . $dialog , function ( ) {
_this2 . context . triggerEvent ( 'dialog.shown' ) ;
$videoUrl . on ( 'input paste propertychange' , function ( ) {
_this2 . ui . toggleBtn ( $videoBtn , $videoUrl . val ( ) ) ;
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
if ( ! env . isSupportTouch ) {
$videoUrl . trigger ( 'focus' ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
$videoBtn . click ( function ( event ) {
event . preventDefault ( ) ;
deferred . resolve ( $videoUrl . val ( ) ) ;
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
_this2 . bindEnterKey ( $videoUrl , $videoBtn ) ;
} ) ;
_this2 . ui . onDialogHidden ( _this2 . $dialog , function ( ) {
$videoUrl . off ( ) ;
$videoBtn . off ( ) ;
if ( deferred . state ( ) === 'pending' ) {
deferred . reject ( ) ;
}
} ) ;
_this2 . ui . showDialog ( _this2 . $dialog ) ;
} ) ;
}
} ] ) ;
return VideoDialog ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/module/HelpDialog.js
function HelpDialog _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function HelpDialog _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 ) ; } }
function HelpDialog _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) HelpDialog _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) HelpDialog _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
2020-06-01 11:05:25 +00:00
var HelpDialog _HelpDialog = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function HelpDialog ( context ) {
HelpDialog _classCallCheck ( this , HelpDialog ) ;
this . context = context ;
this . ui = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote . ui ;
this . $body = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( document . body ) ;
this . $editor = context . layoutInfo . editor ;
this . options = context . options ;
this . lang = this . options . langInfo ;
}
HelpDialog _createClass ( HelpDialog , [ {
key : "initialize" ,
value : function initialize ( ) {
var $container = this . options . dialogsInBody ? this . $body : this . options . container ;
2020-06-01 11:05:25 +00:00
var body = [ '<p class="text-center">' , '<a href="http://summernote.org/" target="_blank">Summernote 0.8.18</a> · ' , '<a href="https://github.com/summernote/summernote" target="_blank">Project</a> · ' , '<a href="https://github.com/summernote/summernote/issues" target="_blank">Issues</a>' , '</p>' ] . join ( '' ) ;
2020-04-01 22:52:43 +00:00
this . $dialog = this . ui . dialog ( {
title : this . lang . options . help ,
fade : this . options . dialogsFade ,
body : this . createShortcutList ( ) ,
footer : body ,
callback : function callback ( $node ) {
$node . find ( '.modal-body,.note-modal-body' ) . css ( {
'max-height' : 300 ,
'overflow' : 'scroll'
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
}
} ) . render ( ) . appendTo ( $container ) ;
}
} , {
key : "destroy" ,
value : function destroy ( ) {
this . ui . hideDialog ( this . $dialog ) ;
this . $dialog . remove ( ) ;
}
} , {
key : "createShortcutList" ,
value : function createShortcutList ( ) {
var _this = this ;
var keyMap = this . options . keyMap [ env . isMac ? 'mac' : 'pc' ] ;
return Object . keys ( keyMap ) . map ( function ( key ) {
var command = keyMap [ key ] ;
2020-06-01 11:05:25 +00:00
var $row = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<div><div class="help-list-item"></div></div>' ) ;
2020-04-01 22:52:43 +00:00
$row . append ( external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<label><kbd>' + key + '</kdb></label>' ) . css ( {
'width' : 180 ,
'margin-right' : 10
} ) ) . append ( external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<span/>' ) . html ( _this . context . memo ( 'help.' + command ) || command ) ) ;
return $row . html ( ) ;
} ) . join ( '' ) ;
}
/ * *
* show help dialog
*
* @ return { Promise }
* /
} , {
key : "showHelpDialog" ,
value : function showHelpDialog ( ) {
var _this2 = this ;
return external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . Deferred ( function ( deferred ) {
_this2 . ui . onDialogShown ( _this2 . $dialog , function ( ) {
_this2 . context . triggerEvent ( 'dialog.shown' ) ;
deferred . resolve ( ) ;
} ) ;
_this2 . ui . showDialog ( _this2 . $dialog ) ;
} ) . promise ( ) ;
}
} , {
key : "show" ,
value : function show ( ) {
var _this3 = this ;
this . context . invoke ( 'editor.saveRange' ) ;
this . showHelpDialog ( ) . then ( function ( ) {
_this3 . context . invoke ( 'editor.restoreRange' ) ;
} ) ;
}
} ] ) ;
return HelpDialog ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/module/AirPopover.js
function AirPopover _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function AirPopover _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 ) ; } }
function AirPopover _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) AirPopover _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) AirPopover _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
var AIRMODE _POPOVER _X _OFFSET = - 5 ;
var AIRMODE _POPOVER _Y _OFFSET = 5 ;
2020-06-01 11:05:25 +00:00
var AirPopover _AirPopover = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function AirPopover ( context ) {
var _this = this ;
AirPopover _classCallCheck ( this , AirPopover ) ;
this . context = context ;
this . ui = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote . ui ;
this . options = context . options ;
this . hidable = true ;
this . onContextmenu = false ;
this . pageX = null ;
this . pageY = null ;
this . events = {
'summernote.contextmenu' : function summernoteContextmenu ( e ) {
if ( _this . options . editing ) {
e . preventDefault ( ) ;
e . stopPropagation ( ) ;
_this . onContextmenu = true ;
_this . update ( true ) ;
}
} ,
'summernote.mousedown' : function summernoteMousedown ( we , e ) {
_this . pageX = e . pageX ;
_this . pageY = e . pageY ;
} ,
'summernote.keyup summernote.mouseup summernote.scroll' : function summernoteKeyupSummernoteMouseupSummernoteScroll ( we , e ) {
if ( _this . options . editing && ! _this . onContextmenu ) {
_this . pageX = e . pageX ;
_this . pageY = e . pageY ;
_this . update ( ) ;
}
_this . onContextmenu = false ;
} ,
'summernote.disable summernote.change summernote.dialog.shown summernote.blur' : function summernoteDisableSummernoteChangeSummernoteDialogShownSummernoteBlur ( ) {
_this . hide ( ) ;
} ,
'summernote.focusout' : function summernoteFocusout ( ) {
if ( ! _this . $popover . is ( ':active,:focus' ) ) {
_this . hide ( ) ;
}
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
} ;
}
AirPopover _createClass ( AirPopover , [ {
key : "shouldInitialize" ,
value : function shouldInitialize ( ) {
return this . options . airMode && ! lists . isEmpty ( this . options . popover . air ) ;
}
} , {
key : "initialize" ,
value : function initialize ( ) {
var _this2 = this ;
this . $popover = this . ui . popover ( {
className : 'note-air-popover'
} ) . render ( ) . appendTo ( this . options . container ) ;
var $content = this . $popover . find ( '.popover-content' ) ;
this . context . invoke ( 'buttons.build' , $content , this . options . popover . air ) ; // disable hiding this popover preemptively by 'summernote.blur' event.
this . $popover . on ( 'mousedown' , function ( ) {
_this2 . hidable = false ;
} ) ; // (re-)enable hiding after 'summernote.blur' has been handled (aka. ignored).
this . $popover . on ( 'mouseup' , function ( ) {
_this2 . hidable = true ;
} ) ;
}
} , {
key : "destroy" ,
value : function destroy ( ) {
this . $popover . remove ( ) ;
}
} , {
key : "update" ,
value : function update ( forcelyOpen ) {
var styleInfo = this . context . invoke ( 'editor.currentStyle' ) ;
if ( styleInfo . range && ( ! styleInfo . range . isCollapsed ( ) || forcelyOpen ) ) {
var rect = {
left : this . pageX ,
top : this . pageY
} ;
var containerOffset = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( this . options . container ) . offset ( ) ;
rect . top -= containerOffset . top ;
rect . left -= containerOffset . left ;
this . $popover . css ( {
display : 'block' ,
left : Math . max ( rect . left , 0 ) + AIRMODE _POPOVER _X _OFFSET ,
top : rect . top + AIRMODE _POPOVER _Y _OFFSET
} ) ;
this . context . invoke ( 'buttons.updateCurrentStyle' , this . $popover ) ;
} else {
this . hide ( ) ;
}
}
2020-06-01 11:05:25 +00:00
} , {
key : "updateCodeview" ,
value : function updateCodeview ( isCodeview ) {
this . ui . toggleBtnActive ( this . $popover . find ( '.btn-codeview' ) , isCodeview ) ;
if ( isCodeview ) {
this . hide ( ) ;
}
}
2020-04-01 22:52:43 +00:00
} , {
key : "hide" ,
value : function hide ( ) {
if ( this . hidable ) {
this . $popover . hide ( ) ;
}
}
} ] ) ;
return AirPopover ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/module/HintPopover.js
function HintPopover _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function HintPopover _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 ) ; } }
function HintPopover _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) HintPopover _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) HintPopover _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
var POPOVER _DIST = 5 ;
2020-06-01 11:05:25 +00:00
var HintPopover _HintPopover = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function HintPopover ( context ) {
var _this = this ;
HintPopover _classCallCheck ( this , HintPopover ) ;
this . context = context ;
this . ui = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote . ui ;
this . $editable = context . layoutInfo . editable ;
this . options = context . options ;
this . hint = this . options . hint || [ ] ;
this . direction = this . options . hintDirection || 'bottom' ;
this . hints = Array . isArray ( this . hint ) ? this . hint : [ this . hint ] ;
this . events = {
'summernote.keyup' : function summernoteKeyup ( we , e ) {
if ( ! e . isDefaultPrevented ( ) ) {
_this . handleKeyup ( e ) ;
}
} ,
'summernote.keydown' : function summernoteKeydown ( we , e ) {
_this . handleKeydown ( e ) ;
} ,
'summernote.disable summernote.dialog.shown summernote.blur' : function summernoteDisableSummernoteDialogShownSummernoteBlur ( ) {
_this . hide ( ) ;
}
} ;
}
HintPopover _createClass ( HintPopover , [ {
key : "shouldInitialize" ,
value : function shouldInitialize ( ) {
return this . hints . length > 0 ;
}
} , {
key : "initialize" ,
value : function initialize ( ) {
var _this2 = this ;
this . lastWordRange = null ;
this . matchingWord = null ;
this . $popover = this . ui . popover ( {
className : 'note-hint-popover' ,
hideArrow : true ,
direction : ''
} ) . render ( ) . appendTo ( this . options . container ) ;
this . $popover . hide ( ) ;
this . $content = this . $popover . find ( '.popover-content,.note-popover-content' ) ;
this . $content . on ( 'click' , '.note-hint-item' , function ( e ) {
_this2 . $content . find ( '.active' ) . removeClass ( 'active' ) ;
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( e . currentTarget ) . addClass ( 'active' ) ;
_this2 . replace ( ) ;
} ) ;
this . $popover . on ( 'mousedown' , function ( e ) {
e . preventDefault ( ) ;
} ) ;
}
} , {
key : "destroy" ,
value : function destroy ( ) {
this . $popover . remove ( ) ;
}
} , {
key : "selectItem" ,
value : function selectItem ( $item ) {
this . $content . find ( '.active' ) . removeClass ( 'active' ) ;
$item . addClass ( 'active' ) ;
this . $content [ 0 ] . scrollTop = $item [ 0 ] . offsetTop - this . $content . innerHeight ( ) / 2 ;
}
} , {
key : "moveDown" ,
value : function moveDown ( ) {
var $current = this . $content . find ( '.note-hint-item.active' ) ;
var $next = $current . next ( ) ;
if ( $next . length ) {
this . selectItem ( $next ) ;
} else {
var $nextGroup = $current . parent ( ) . next ( ) ;
if ( ! $nextGroup . length ) {
$nextGroup = this . $content . find ( '.note-hint-group' ) . first ( ) ;
}
this . selectItem ( $nextGroup . find ( '.note-hint-item' ) . first ( ) ) ;
}
}
} , {
key : "moveUp" ,
value : function moveUp ( ) {
var $current = this . $content . find ( '.note-hint-item.active' ) ;
var $prev = $current . prev ( ) ;
if ( $prev . length ) {
this . selectItem ( $prev ) ;
} else {
var $prevGroup = $current . parent ( ) . prev ( ) ;
if ( ! $prevGroup . length ) {
$prevGroup = this . $content . find ( '.note-hint-group' ) . last ( ) ;
}
this . selectItem ( $prevGroup . find ( '.note-hint-item' ) . last ( ) ) ;
}
}
} , {
key : "replace" ,
value : function replace ( ) {
var $item = this . $content . find ( '.note-hint-item.active' ) ;
if ( $item . length ) {
var node = this . nodeFromItem ( $item ) ; // If matchingWord length = 0 -> capture OK / open hint / but as mention capture "" (\w*)
if ( this . matchingWord !== null && this . matchingWord . length === 0 ) {
this . lastWordRange . so = this . lastWordRange . eo ; // Else si > 0 and normal case -> adjust range "before" for correct position of insertion
} else if ( this . matchingWord !== null && this . matchingWord . length > 0 && ! this . lastWordRange . isCollapsed ( ) ) {
var rangeCompute = this . lastWordRange . eo - this . lastWordRange . so - this . matchingWord . length ;
if ( rangeCompute > 0 ) {
this . lastWordRange . so += rangeCompute ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
this . lastWordRange . insertNode ( node ) ;
if ( this . options . hintSelect === 'next' ) {
var blank = document . createTextNode ( '' ) ;
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( node ) . after ( blank ) ;
range . createFromNodeBefore ( blank ) . select ( ) ;
} else {
range . createFromNodeAfter ( node ) . select ( ) ;
}
this . lastWordRange = null ;
this . hide ( ) ;
this . context . invoke ( 'editor.focus' ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
} , {
key : "nodeFromItem" ,
value : function nodeFromItem ( $item ) {
var hint = this . hints [ $item . data ( 'index' ) ] ;
var item = $item . data ( 'item' ) ;
var node = hint . content ? hint . content ( item ) : item ;
if ( typeof node === 'string' ) {
node = dom . createText ( node ) ;
}
return node ;
}
} , {
key : "createItemTemplates" ,
value : function createItemTemplates ( hintIdx , items ) {
var hint = this . hints [ hintIdx ] ;
return items . map ( function ( item
/*, idx */
) {
var $item = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<div class="note-hint-item"/>' ) ;
$item . append ( hint . template ? hint . template ( item ) : item + '' ) ;
$item . data ( {
'index' : hintIdx ,
'item' : item
} ) ;
return $item ;
} ) ;
}
} , {
key : "handleKeydown" ,
value : function handleKeydown ( e ) {
if ( ! this . $popover . is ( ':visible' ) ) {
return ;
}
if ( e . keyCode === core _key . code . ENTER ) {
e . preventDefault ( ) ;
this . replace ( ) ;
} else if ( e . keyCode === core _key . code . UP ) {
e . preventDefault ( ) ;
this . moveUp ( ) ;
} else if ( e . keyCode === core _key . code . DOWN ) {
e . preventDefault ( ) ;
this . moveDown ( ) ;
}
}
} , {
key : "searchKeyword" ,
value : function searchKeyword ( index , keyword , callback ) {
var hint = this . hints [ index ] ;
if ( hint && hint . match . test ( keyword ) && hint . search ) {
var matches = hint . match . exec ( keyword ) ;
this . matchingWord = matches [ 0 ] ;
hint . search ( matches [ 1 ] , callback ) ;
} else {
callback ( ) ;
}
}
} , {
key : "createGroup" ,
value : function createGroup ( idx , keyword ) {
var _this3 = this ;
2020-06-01 11:05:25 +00:00
var $group = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<div class="note-hint-group note-hint-group-' + idx + '"></div>' ) ;
2020-04-01 22:52:43 +00:00
this . searchKeyword ( idx , keyword , function ( items ) {
items = items || [ ] ;
if ( items . length ) {
$group . html ( _this3 . createItemTemplates ( idx , items ) ) ;
_this3 . show ( ) ;
}
} ) ;
return $group ;
}
} , {
key : "handleKeyup" ,
value : function handleKeyup ( e ) {
var _this4 = this ;
if ( ! lists . contains ( [ core _key . code . ENTER , core _key . code . UP , core _key . code . DOWN ] , e . keyCode ) ) {
var _range = this . context . invoke ( 'editor.getLastRange' ) ;
var wordRange , keyword ;
if ( this . options . hintMode === 'words' ) {
wordRange = _range . getWordsRange ( _range ) ;
keyword = wordRange . toString ( ) ;
this . hints . forEach ( function ( hint ) {
if ( hint . match . test ( keyword ) ) {
wordRange = _range . getWordsMatchRange ( hint . match ) ;
return false ;
}
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
if ( ! wordRange ) {
this . hide ( ) ;
return ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
keyword = wordRange . toString ( ) ;
} else {
wordRange = _range . getWordRange ( ) ;
keyword = wordRange . toString ( ) ;
}
if ( this . hints . length && keyword ) {
this . $content . empty ( ) ;
var bnd = func . rect2bnd ( lists . last ( wordRange . getClientRects ( ) ) ) ;
var containerOffset = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( this . options . container ) . offset ( ) ;
if ( bnd ) {
bnd . top -= containerOffset . top ;
bnd . left -= containerOffset . left ;
this . $popover . hide ( ) ;
this . lastWordRange = wordRange ;
this . hints . forEach ( function ( hint , idx ) {
if ( hint . match . test ( keyword ) ) {
_this4 . createGroup ( idx , keyword ) . appendTo ( _this4 . $content ) ;
}
} ) ; // select first .note-hint-item
this . $content . find ( '.note-hint-item:first' ) . addClass ( 'active' ) ; // set position for popover after group is created
if ( this . direction === 'top' ) {
this . $popover . css ( {
left : bnd . left ,
top : bnd . top - this . $popover . outerHeight ( ) - POPOVER _DIST
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
} else {
this . $popover . css ( {
left : bnd . left ,
top : bnd . top + bnd . height + POPOVER _DIST
} ) ;
}
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
} else {
this . hide ( ) ;
}
}
}
} , {
key : "show" ,
value : function show ( ) {
this . $popover . show ( ) ;
}
} , {
key : "hide" ,
value : function hide ( ) {
this . $popover . hide ( ) ;
}
} ] ) ;
return HintPopover ;
} ( ) ;
// CONCATENATED MODULE: ./src/js/base/settings.js
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . extend ( external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote , {
2020-06-01 11:05:25 +00:00
version : '0.8.18' ,
2020-04-01 22:52:43 +00:00
plugins : { } ,
dom : dom ,
range : range ,
lists : lists ,
options : {
langInfo : external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote . lang [ 'en-US' ] ,
editing : true ,
modules : {
'editor' : Editor _Editor ,
'clipboard' : Clipboard _Clipboard ,
'dropzone' : Dropzone _Dropzone ,
'codeview' : Codeview _CodeView ,
'statusbar' : Statusbar _Statusbar ,
'fullscreen' : Fullscreen _Fullscreen ,
'handle' : Handle _Handle ,
// FIXME: HintPopover must be front of autolink
// - Script error about range when Enter key is pressed on hint popover
'hintPopover' : HintPopover _HintPopover ,
'autoLink' : AutoLink _AutoLink ,
'autoSync' : AutoSync _AutoSync ,
'autoReplace' : AutoReplace _AutoReplace ,
'placeholder' : Placeholder _Placeholder ,
'buttons' : Buttons _Buttons ,
'toolbar' : Toolbar _Toolbar ,
'linkDialog' : LinkDialog _LinkDialog ,
'linkPopover' : LinkPopover _LinkPopover ,
'imageDialog' : ImageDialog _ImageDialog ,
'imagePopover' : ImagePopover _ImagePopover ,
'tablePopover' : TablePopover _TablePopover ,
'videoDialog' : VideoDialog _VideoDialog ,
'helpDialog' : HelpDialog _HelpDialog ,
'airPopover' : AirPopover _AirPopover
} ,
buttons : { } ,
lang : 'en-US' ,
followingToolbar : false ,
toolbarPosition : 'top' ,
otherStaticBar : '' ,
// toolbar
2020-06-01 11:05:25 +00:00
codeviewKeepButton : false ,
2020-04-01 22:52:43 +00:00
toolbar : [ [ 'style' , [ 'style' ] ] , [ 'font' , [ 'bold' , 'underline' , 'clear' ] ] , [ 'fontname' , [ 'fontname' ] ] , [ 'color' , [ 'color' ] ] , [ 'para' , [ 'ul' , 'ol' , 'paragraph' ] ] , [ 'table' , [ 'table' ] ] , [ 'insert' , [ 'link' , 'picture' , 'video' ] ] , [ 'view' , [ 'fullscreen' , 'codeview' , 'help' ] ] ] ,
// popover
popatmouse : true ,
popover : {
image : [ [ 'resize' , [ 'resizeFull' , 'resizeHalf' , 'resizeQuarter' , 'resizeNone' ] ] , [ 'float' , [ 'floatLeft' , 'floatRight' , 'floatNone' ] ] , [ 'remove' , [ 'removeMedia' ] ] ] ,
link : [ [ 'link' , [ 'linkDialogShow' , 'unlink' ] ] ] ,
table : [ [ 'add' , [ 'addRowDown' , 'addRowUp' , 'addColLeft' , 'addColRight' ] ] , [ 'delete' , [ 'deleteRow' , 'deleteCol' , 'deleteTable' ] ] ] ,
air : [ [ 'color' , [ 'color' ] ] , [ 'font' , [ 'bold' , 'underline' , 'clear' ] ] , [ 'para' , [ 'ul' , 'paragraph' ] ] , [ 'table' , [ 'table' ] ] , [ 'insert' , [ 'link' , 'picture' ] ] , [ 'view' , [ 'fullscreen' , 'codeview' ] ] ]
} ,
// air mode: inline editor
airMode : false ,
overrideContextMenu : false ,
// TBD
width : null ,
height : null ,
linkTargetBlank : true ,
useProtocol : true ,
defaultProtocol : 'http://' ,
focus : false ,
tabDisabled : false ,
tabSize : 4 ,
styleWithCSS : false ,
shortcuts : true ,
textareaAutoSync : true ,
tooltip : 'auto' ,
container : null ,
maxTextLength : 0 ,
blockquoteBreakingLevel : 2 ,
spellCheck : true ,
disableGrammar : false ,
placeholder : null ,
inheritPlaceholder : false ,
// TODO: need to be documented
recordEveryKeystroke : false ,
historyLimit : 200 ,
// TODO: need to be documented
2020-06-01 11:05:25 +00:00
showDomainOnlyForAutolink : false ,
// TODO: need to be documented
2020-04-01 22:52:43 +00:00
hintMode : 'word' ,
hintSelect : 'after' ,
hintDirection : 'bottom' ,
styleTags : [ 'p' , 'blockquote' , 'pre' , 'h1' , 'h2' , 'h3' , 'h4' , 'h5' , 'h6' ] ,
fontNames : [ 'Arial' , 'Arial Black' , 'Comic Sans MS' , 'Courier New' , 'Helvetica Neue' , 'Helvetica' , 'Impact' , 'Lucida Grande' , 'Tahoma' , 'Times New Roman' , 'Verdana' ] ,
fontNamesIgnoreCheck : [ ] ,
addDefaultFonts : true ,
fontSizes : [ '8' , '9' , '10' , '11' , '12' , '14' , '18' , '24' , '36' ] ,
fontSizeUnits : [ 'px' , 'pt' ] ,
// pallete colors(n x n)
colors : [ [ '#000000' , '#424242' , '#636363' , '#9C9C94' , '#CEC6CE' , '#EFEFEF' , '#F7F7F7' , '#FFFFFF' ] , [ '#FF0000' , '#FF9C00' , '#FFFF00' , '#00FF00' , '#00FFFF' , '#0000FF' , '#9C00FF' , '#FF00FF' ] , [ '#F7C6CE' , '#FFE7CE' , '#FFEFC6' , '#D6EFD6' , '#CEDEE7' , '#CEE7F7' , '#D6D6E7' , '#E7D6DE' ] , [ '#E79C9C' , '#FFC69C' , '#FFE79C' , '#B5D6A5' , '#A5C6CE' , '#9CC6EF' , '#B5A5D6' , '#D6A5BD' ] , [ '#E76363' , '#F7AD6B' , '#FFD663' , '#94BD7B' , '#73A5AD' , '#6BADDE' , '#8C7BC6' , '#C67BA5' ] , [ '#CE0000' , '#E79439' , '#EFC631' , '#6BA54A' , '#4A7B8C' , '#3984C6' , '#634AA5' , '#A54A7B' ] , [ '#9C0000' , '#B56308' , '#BD9400' , '#397B21' , '#104A5A' , '#085294' , '#311873' , '#731842' ] , [ '#630000' , '#7B3900' , '#846300' , '#295218' , '#083139' , '#003163' , '#21104A' , '#4A1031' ] ] ,
// http://chir.ag/projects/name-that-color/
colorsName : [ [ 'Black' , 'Tundora' , 'Dove Gray' , 'Star Dust' , 'Pale Slate' , 'Gallery' , 'Alabaster' , 'White' ] , [ 'Red' , 'Orange Peel' , 'Yellow' , 'Green' , 'Cyan' , 'Blue' , 'Electric Violet' , 'Magenta' ] , [ 'Azalea' , 'Karry' , 'Egg White' , 'Zanah' , 'Botticelli' , 'Tropical Blue' , 'Mischka' , 'Twilight' ] , [ 'Tonys Pink' , 'Peach Orange' , 'Cream Brulee' , 'Sprout' , 'Casper' , 'Perano' , 'Cold Purple' , 'Careys Pink' ] , [ 'Mandy' , 'Rajah' , 'Dandelion' , 'Olivine' , 'Gulf Stream' , 'Viking' , 'Blue Marguerite' , 'Puce' ] , [ 'Guardsman Red' , 'Fire Bush' , 'Golden Dream' , 'Chelsea Cucumber' , 'Smalt Blue' , 'Boston Blue' , 'Butterfly Bush' , 'Cadillac' ] , [ 'Sangria' , 'Mai Tai' , 'Buddha Gold' , 'Forest Green' , 'Eden' , 'Venice Blue' , 'Meteorite' , 'Claret' ] , [ 'Rosewood' , 'Cinnamon' , 'Olive' , 'Parsley' , 'Tiber' , 'Midnight Blue' , 'Valentino' , 'Loulou' ] ] ,
colorButton : {
foreColor : '#000000' ,
backColor : '#FFFF00'
} ,
lineHeights : [ '1.0' , '1.2' , '1.4' , '1.5' , '1.6' , '1.8' , '2.0' , '3.0' ] ,
tableClassName : 'table table-bordered' ,
insertTableMaxSize : {
col : 10 ,
row : 10
} ,
// By default, dialogs are attached in container.
dialogsInBody : false ,
dialogsFade : false ,
maximumImageFileSize : null ,
callbacks : {
onBeforeCommand : null ,
onBlur : null ,
onBlurCodeview : null ,
onChange : null ,
onChangeCodeview : null ,
onDialogShown : null ,
onEnter : null ,
onFocus : null ,
onImageLinkInsert : null ,
onImageUpload : null ,
onImageUploadError : null ,
onInit : null ,
onKeydown : null ,
onKeyup : null ,
onMousedown : null ,
onMouseup : null ,
onPaste : null ,
onScroll : null
} ,
codemirror : {
mode : 'text/html' ,
htmlMode : true ,
lineNumbers : true
} ,
codeviewFilter : false ,
codeviewFilterRegex : /<\/*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|ilayer|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|t(?:itle|extarea)|xml)[^>]*?>/gi ,
codeviewIframeFilter : true ,
codeviewIframeWhitelistSrc : [ ] ,
codeviewIframeWhitelistSrcBase : [ 'www.youtube.com' , 'www.youtube-nocookie.com' , 'www.facebook.com' , 'vine.co' , 'instagram.com' , 'player.vimeo.com' , 'www.dailymotion.com' , 'player.youku.com' , 'v.qq.com' ] ,
keyMap : {
pc : {
2020-06-01 11:05:25 +00:00
'ESC' : 'escape' ,
2020-04-01 22:52:43 +00:00
'ENTER' : 'insertParagraph' ,
'CTRL+Z' : 'undo' ,
'CTRL+Y' : 'redo' ,
'TAB' : 'tab' ,
'SHIFT+TAB' : 'untab' ,
'CTRL+B' : 'bold' ,
'CTRL+I' : 'italic' ,
'CTRL+U' : 'underline' ,
'CTRL+SHIFT+S' : 'strikethrough' ,
'CTRL+BACKSLASH' : 'removeFormat' ,
'CTRL+SHIFT+L' : 'justifyLeft' ,
'CTRL+SHIFT+E' : 'justifyCenter' ,
'CTRL+SHIFT+R' : 'justifyRight' ,
'CTRL+SHIFT+J' : 'justifyFull' ,
'CTRL+SHIFT+NUM7' : 'insertUnorderedList' ,
'CTRL+SHIFT+NUM8' : 'insertOrderedList' ,
'CTRL+LEFTBRACKET' : 'outdent' ,
'CTRL+RIGHTBRACKET' : 'indent' ,
'CTRL+NUM0' : 'formatPara' ,
'CTRL+NUM1' : 'formatH1' ,
'CTRL+NUM2' : 'formatH2' ,
'CTRL+NUM3' : 'formatH3' ,
'CTRL+NUM4' : 'formatH4' ,
'CTRL+NUM5' : 'formatH5' ,
'CTRL+NUM6' : 'formatH6' ,
'CTRL+ENTER' : 'insertHorizontalRule' ,
'CTRL+K' : 'linkDialog.show'
} ,
mac : {
2020-06-01 11:05:25 +00:00
'ESC' : 'escape' ,
2020-04-01 22:52:43 +00:00
'ENTER' : 'insertParagraph' ,
'CMD+Z' : 'undo' ,
'CMD+SHIFT+Z' : 'redo' ,
'TAB' : 'tab' ,
'SHIFT+TAB' : 'untab' ,
'CMD+B' : 'bold' ,
'CMD+I' : 'italic' ,
'CMD+U' : 'underline' ,
'CMD+SHIFT+S' : 'strikethrough' ,
'CMD+BACKSLASH' : 'removeFormat' ,
'CMD+SHIFT+L' : 'justifyLeft' ,
'CMD+SHIFT+E' : 'justifyCenter' ,
'CMD+SHIFT+R' : 'justifyRight' ,
'CMD+SHIFT+J' : 'justifyFull' ,
'CMD+SHIFT+NUM7' : 'insertUnorderedList' ,
'CMD+SHIFT+NUM8' : 'insertOrderedList' ,
'CMD+LEFTBRACKET' : 'outdent' ,
'CMD+RIGHTBRACKET' : 'indent' ,
'CMD+NUM0' : 'formatPara' ,
'CMD+NUM1' : 'formatH1' ,
'CMD+NUM2' : 'formatH2' ,
'CMD+NUM3' : 'formatH3' ,
'CMD+NUM4' : 'formatH4' ,
'CMD+NUM5' : 'formatH5' ,
'CMD+NUM6' : 'formatH6' ,
'CMD+ENTER' : 'insertHorizontalRule' ,
'CMD+K' : 'linkDialog.show'
}
} ,
icons : {
'align' : 'note-icon-align' ,
'alignCenter' : 'note-icon-align-center' ,
'alignJustify' : 'note-icon-align-justify' ,
'alignLeft' : 'note-icon-align-left' ,
'alignRight' : 'note-icon-align-right' ,
'rowBelow' : 'note-icon-row-below' ,
'colBefore' : 'note-icon-col-before' ,
'colAfter' : 'note-icon-col-after' ,
'rowAbove' : 'note-icon-row-above' ,
'rowRemove' : 'note-icon-row-remove' ,
'colRemove' : 'note-icon-col-remove' ,
'indent' : 'note-icon-align-indent' ,
'outdent' : 'note-icon-align-outdent' ,
'arrowsAlt' : 'note-icon-arrows-alt' ,
'bold' : 'note-icon-bold' ,
'caret' : 'note-icon-caret' ,
'circle' : 'note-icon-circle' ,
'close' : 'note-icon-close' ,
'code' : 'note-icon-code' ,
'eraser' : 'note-icon-eraser' ,
'floatLeft' : 'note-icon-float-left' ,
'floatRight' : 'note-icon-float-right' ,
'font' : 'note-icon-font' ,
'frame' : 'note-icon-frame' ,
'italic' : 'note-icon-italic' ,
'link' : 'note-icon-link' ,
'unlink' : 'note-icon-chain-broken' ,
'magic' : 'note-icon-magic' ,
'menuCheck' : 'note-icon-menu-check' ,
'minus' : 'note-icon-minus' ,
'orderedlist' : 'note-icon-orderedlist' ,
'pencil' : 'note-icon-pencil' ,
'picture' : 'note-icon-picture' ,
'question' : 'note-icon-question' ,
'redo' : 'note-icon-redo' ,
'rollback' : 'note-icon-rollback' ,
'square' : 'note-icon-square' ,
'strikethrough' : 'note-icon-strikethrough' ,
'subscript' : 'note-icon-subscript' ,
'superscript' : 'note-icon-superscript' ,
'table' : 'note-icon-table' ,
'textHeight' : 'note-icon-text-height' ,
'trash' : 'note-icon-trash' ,
'underline' : 'note-icon-underline' ,
'undo' : 'note-icon-undo' ,
'unorderedlist' : 'note-icon-unorderedlist' ,
'video' : 'note-icon-video'
}
}
} ) ;
/***/ } ) ,
/***/ 51 :
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
2020-06-01 11:05:25 +00:00
// ESM COMPAT FLAG
2020-04-01 22:52:43 +00:00
_ _webpack _require _ _ . r ( _ _webpack _exports _ _ ) ;
// EXTERNAL MODULE: external {"root":"jQuery","commonjs2":"jquery","commonjs":"jquery","amd":"jquery"}
var external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _ = _ _webpack _require _ _ ( 0 ) ;
var external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default = /*#__PURE__*/ _ _webpack _require _ _ . n ( external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _ ) ;
// EXTERNAL MODULE: ./src/js/base/renderer.js
var renderer = _ _webpack _require _ _ ( 1 ) ;
// CONCATENATED MODULE: ./src/js/lite/ui/TooltipUI.js
function _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a 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 ) ; } }
function _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
2020-06-01 11:05:25 +00:00
var TooltipUI _TooltipUI = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function TooltipUI ( $node , options ) {
_classCallCheck ( this , TooltipUI ) ;
this . $node = $node ;
this . options = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . extend ( { } , {
title : '' ,
target : options . container ,
trigger : 'hover focus' ,
placement : 'bottom'
} , options ) ; // create tooltip node
2020-06-01 11:05:25 +00:00
this . $tooltip = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( [ '<div class="note-tooltip">' , '<div class="note-tooltip-arrow"></div>' , '<div class="note-tooltip-content"></div>' , '</div>' ] . join ( '' ) ) ; // define event
2020-04-01 22:52:43 +00:00
if ( this . options . trigger !== 'manual' ) {
var showCallback = this . show . bind ( this ) ;
var hideCallback = this . hide . bind ( this ) ;
var toggleCallback = this . toggle . bind ( this ) ;
this . options . trigger . split ( ' ' ) . forEach ( function ( eventName ) {
if ( eventName === 'hover' ) {
$node . off ( 'mouseenter mouseleave' ) ;
$node . on ( 'mouseenter' , showCallback ) . on ( 'mouseleave' , hideCallback ) ;
} else if ( eventName === 'click' ) {
$node . on ( 'click' , toggleCallback ) ;
} else if ( eventName === 'focus' ) {
$node . on ( 'focus' , showCallback ) . on ( 'blur' , hideCallback ) ;
}
} ) ;
}
}
_createClass ( TooltipUI , [ {
key : "show" ,
value : function show ( ) {
var $node = this . $node ;
var offset = $node . offset ( ) ;
var targetOffset = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( this . options . target ) . offset ( ) ;
offset . top -= targetOffset . top ;
offset . left -= targetOffset . left ;
var $tooltip = this . $tooltip ;
var title = this . options . title || $node . attr ( 'title' ) || $node . data ( 'title' ) ;
var placement = this . options . placement || $node . data ( 'placement' ) ;
$tooltip . addClass ( placement ) ;
$tooltip . find ( '.note-tooltip-content' ) . text ( title ) ;
$tooltip . appendTo ( this . options . target ) ;
var nodeWidth = $node . outerWidth ( ) ;
var nodeHeight = $node . outerHeight ( ) ;
var tooltipWidth = $tooltip . outerWidth ( ) ;
var tooltipHeight = $tooltip . outerHeight ( ) ;
if ( placement === 'bottom' ) {
$tooltip . css ( {
top : offset . top + nodeHeight ,
left : offset . left + ( nodeWidth / 2 - tooltipWidth / 2 )
} ) ;
} else if ( placement === 'top' ) {
$tooltip . css ( {
top : offset . top - tooltipHeight ,
left : offset . left + ( nodeWidth / 2 - tooltipWidth / 2 )
} ) ;
} else if ( placement === 'left' ) {
$tooltip . css ( {
top : offset . top + ( nodeHeight / 2 - tooltipHeight / 2 ) ,
left : offset . left - tooltipWidth
} ) ;
} else if ( placement === 'right' ) {
$tooltip . css ( {
top : offset . top + ( nodeHeight / 2 - tooltipHeight / 2 ) ,
left : offset . left + nodeWidth
} ) ;
}
$tooltip . addClass ( 'in' ) ;
}
} , {
key : "hide" ,
value : function hide ( ) {
var _this = this ;
this . $tooltip . removeClass ( 'in' ) ;
setTimeout ( function ( ) {
_this . $tooltip . remove ( ) ;
} , 200 ) ;
}
} , {
key : "toggle" ,
value : function toggle ( ) {
if ( this . $tooltip . hasClass ( 'in' ) ) {
this . hide ( ) ;
} else {
this . show ( ) ;
}
}
} ] ) ;
return TooltipUI ;
} ( ) ;
/* harmony default export */ var ui _TooltipUI = ( TooltipUI _TooltipUI ) ;
// CONCATENATED MODULE: ./src/js/lite/ui/DropdownUI.js
function DropdownUI _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function DropdownUI _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 ) ; } }
function DropdownUI _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) DropdownUI _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) DropdownUI _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
2020-06-01 11:05:25 +00:00
var DropdownUI _DropdownUI = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function DropdownUI ( $node , options ) {
DropdownUI _classCallCheck ( this , DropdownUI ) ;
this . $button = $node ;
this . options = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . extend ( { } , {
target : options . container
} , options ) ;
this . setEvent ( ) ;
}
DropdownUI _createClass ( DropdownUI , [ {
key : "setEvent" ,
value : function setEvent ( ) {
var _this = this ;
this . $button . on ( 'click' , function ( e ) {
_this . toggle ( ) ;
e . stopImmediatePropagation ( ) ;
} ) ;
}
} , {
key : "clear" ,
value : function clear ( ) {
var $parent = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '.note-btn-group.open' ) ;
$parent . find ( '.note-btn.active' ) . removeClass ( 'active' ) ;
$parent . removeClass ( 'open' ) ;
}
} , {
key : "show" ,
value : function show ( ) {
this . $button . addClass ( 'active' ) ;
this . $button . parent ( ) . addClass ( 'open' ) ;
var $dropdown = this . $button . next ( ) ;
var offset = $dropdown . offset ( ) ;
var width = $dropdown . outerWidth ( ) ;
var windowWidth = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( window ) . width ( ) ;
var targetMarginRight = parseFloat ( external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( this . options . target ) . css ( 'margin-right' ) ) ;
if ( offset . left + width > windowWidth - targetMarginRight ) {
$dropdown . css ( 'margin-left' , windowWidth - targetMarginRight - ( offset . left + width ) ) ;
} else {
$dropdown . css ( 'margin-left' , '' ) ;
2019-06-10 15:38:54 +00:00
}
2020-04-01 22:52:43 +00:00
}
} , {
key : "hide" ,
value : function hide ( ) {
this . $button . removeClass ( 'active' ) ;
this . $button . parent ( ) . removeClass ( 'open' ) ;
}
} , {
key : "toggle" ,
value : function toggle ( ) {
var isOpened = this . $button . parent ( ) . hasClass ( 'open' ) ;
this . clear ( ) ;
if ( isOpened ) {
this . hide ( ) ;
} else {
this . show ( ) ;
}
}
} ] ) ;
return DropdownUI ;
} ( ) ;
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( document ) . on ( 'click' , function ( e ) {
if ( ! external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( e . target ) . closest ( '.note-btn-group' ) . length ) {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '.note-btn-group.open' ) . removeClass ( 'open' ) ;
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '.note-btn-group .note-btn.active' ) . removeClass ( 'active' ) ;
}
} ) ;
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( document ) . on ( 'click.note-dropdown-menu' , function ( e ) {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( e . target ) . closest ( '.note-dropdown-menu' ) . parent ( ) . removeClass ( 'open' ) ;
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( e . target ) . closest ( '.note-dropdown-menu' ) . parent ( ) . find ( '.note-btn.active' ) . removeClass ( 'active' ) ;
} ) ;
/* harmony default export */ var ui _DropdownUI = ( DropdownUI _DropdownUI ) ;
// CONCATENATED MODULE: ./src/js/lite/ui/ModalUI.js
function ModalUI _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
function ModalUI _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 ) ; } }
function ModalUI _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) ModalUI _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) ModalUI _defineProperties ( Constructor , staticProps ) ; return Constructor ; }
2020-06-01 11:05:25 +00:00
var ModalUI _ModalUI = /*#__PURE__*/ function ( ) {
2020-04-01 22:52:43 +00:00
function ModalUI ( $node
/*, options */
) {
ModalUI _classCallCheck ( this , ModalUI ) ;
this . $modal = $node ;
this . $backdrop = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<div class="note-modal-backdrop"/>' ) ;
}
ModalUI _createClass ( ModalUI , [ {
key : "show" ,
value : function show ( ) {
var _this = this ;
this . $backdrop . appendTo ( document . body ) . show ( ) ;
this . $modal . addClass ( 'open' ) . show ( ) ;
this . $modal . trigger ( 'note.modal.show' ) ;
this . $modal . off ( 'click' , '.close' ) . on ( 'click' , '.close' , this . hide . bind ( this ) ) ;
this . $modal . on ( 'keydown' , function ( event ) {
if ( event . which === 27 ) {
event . preventDefault ( ) ;
_this . hide ( ) ;
}
} ) ;
}
} , {
key : "hide" ,
value : function hide ( ) {
this . $modal . removeClass ( 'open' ) . hide ( ) ;
this . $backdrop . hide ( ) ;
this . $modal . trigger ( 'note.modal.hide' ) ;
this . $modal . off ( 'keydown' ) ;
}
} ] ) ;
return ModalUI ;
} ( ) ;
/* harmony default export */ var ui _ModalUI = ( ModalUI _ModalUI ) ;
// CONCATENATED MODULE: ./src/js/lite/ui.js
var editor = renderer [ "a" /* default */ ] . create ( '<div class="note-editor note-frame"/>' ) ;
var toolbar = renderer [ "a" /* default */ ] . create ( '<div class="note-toolbar" role="toolbar"/>' ) ;
var editingArea = renderer [ "a" /* default */ ] . create ( '<div class="note-editing-area"/>' ) ;
var codable = renderer [ "a" /* default */ ] . create ( '<textarea class="note-codable" aria-multiline="true"/>' ) ;
var editable = renderer [ "a" /* default */ ] . create ( '<div class="note-editable" contentEditable="true" role="textbox" aria-multiline="true"/>' ) ;
2020-06-01 11:05:25 +00:00
var statusbar = renderer [ "a" /* default */ ] . create ( [ '<output class="note-status-output" role="status" aria-live="polite"></output>' , '<div class="note-statusbar" role="status">' , '<div class="note-resizebar" aria-label="resize">' , '<div class="note-icon-bar"></div>' , '<div class="note-icon-bar"></div>' , '<div class="note-icon-bar"></div>' , '</div>' , '</div>' ] . join ( '' ) ) ;
2020-04-01 22:52:43 +00:00
var airEditor = renderer [ "a" /* default */ ] . create ( '<div class="note-editor note-airframe"/>' ) ;
2020-06-01 11:05:25 +00:00
var airEditable = renderer [ "a" /* default */ ] . create ( [ '<div class="note-editable" contentEditable="true" role="textbox" aria-multiline="true"></div>' , '<output class="note-status-output" role="status" aria-live="polite"></output>' ] . join ( '' ) ) ;
2020-04-01 22:52:43 +00:00
var buttonGroup = renderer [ "a" /* default */ ] . create ( '<div class="note-btn-group">' ) ;
var ui _button = renderer [ "a" /* default */ ] . create ( '<button type="button" class="note-btn" tabindex="-1">' , function ( $node , options ) {
// set button type
if ( options && options . tooltip ) {
$node . attr ( {
'aria-label' : options . tooltip
} ) ;
$node . data ( '_lite_tooltip' , new ui _TooltipUI ( $node , {
title : options . tooltip ,
container : options . container
} ) ) . on ( 'click' , function ( e ) {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( e . currentTarget ) . data ( '_lite_tooltip' ) . hide ( ) ;
} ) ;
}
if ( options . contents ) {
$node . html ( options . contents ) ;
}
if ( options && options . data && options . data . toggle === 'dropdown' ) {
$node . data ( '_lite_dropdown' , new ui _DropdownUI ( $node , {
container : options . container
} ) ) ;
}
2020-06-01 11:05:25 +00:00
if ( options && options . codeviewKeepButton ) {
$node . addClass ( 'note-codeview-keep' ) ;
}
2020-04-01 22:52:43 +00:00
} ) ;
var dropdown = renderer [ "a" /* default */ ] . create ( '<div class="note-dropdown-menu" role="list">' , function ( $node , options ) {
var markup = Array . isArray ( options . items ) ? options . items . map ( function ( item ) {
var value = typeof item === 'string' ? item : item . value || '' ;
var content = options . template ? options . template ( item ) : item ;
var $temp = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<a class="note-dropdown-item" href="#" data-value="' + value + '" role="listitem" aria-label="' + value + '"></a>' ) ;
$temp . html ( content ) . data ( 'item' , item ) ;
return $temp ;
} ) : options . items ;
$node . html ( markup ) . attr ( {
'aria-label' : options . title
} ) ;
$node . on ( 'click' , '> .note-dropdown-item' , function ( e ) {
var $a = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( this ) ;
var item = $a . data ( 'item' ) ;
var value = $a . data ( 'value' ) ;
if ( item . click ) {
item . click ( $a ) ;
} else if ( options . itemClick ) {
options . itemClick ( e , item , value ) ;
}
} ) ;
2020-06-01 11:05:25 +00:00
if ( options && options . codeviewKeepButton ) {
$node . addClass ( 'note-codeview-keep' ) ;
}
2020-04-01 22:52:43 +00:00
} ) ;
var dropdownCheck = renderer [ "a" /* default */ ] . create ( '<div class="note-dropdown-menu note-check" role="list">' , function ( $node , options ) {
var markup = Array . isArray ( options . items ) ? options . items . map ( function ( item ) {
var value = typeof item === 'string' ? item : item . value || '' ;
var content = options . template ? options . template ( item ) : item ;
var $temp = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( '<a class="note-dropdown-item" href="#" data-value="' + value + '" role="listitem" aria-label="' + item + '"></a>' ) ;
$temp . html ( [ icon ( options . checkClassName ) , ' ' , content ] ) . data ( 'item' , item ) ;
return $temp ;
} ) : options . items ;
$node . html ( markup ) . attr ( {
'aria-label' : options . title
} ) ;
$node . on ( 'click' , '> .note-dropdown-item' , function ( e ) {
var $a = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( this ) ;
var item = $a . data ( 'item' ) ;
var value = $a . data ( 'value' ) ;
if ( item . click ) {
item . click ( $a ) ;
} else if ( options . itemClick ) {
options . itemClick ( e , item , value ) ;
}
} ) ;
2020-06-01 11:05:25 +00:00
if ( options && options . codeviewKeepButton ) {
$node . addClass ( 'note-codeview-keep' ) ;
}
2020-04-01 22:52:43 +00:00
} ) ;
var dropdownButtonContents = function dropdownButtonContents ( contents , options ) {
return contents + ' ' + icon ( options . icons . caret , 'span' ) ;
} ;
var dropdownButton = function dropdownButton ( opt , callback ) {
return buttonGroup ( [ ui _button ( {
className : 'dropdown-toggle' ,
contents : opt . title + ' ' + icon ( 'note-icon-caret' ) ,
tooltip : opt . tooltip ,
data : {
toggle : 'dropdown'
}
} ) , dropdown ( {
className : opt . className ,
items : opt . items ,
template : opt . template ,
itemClick : opt . itemClick
} ) ] , {
callback : callback
} ) . render ( ) ;
} ;
var dropdownCheckButton = function dropdownCheckButton ( opt , callback ) {
return buttonGroup ( [ ui _button ( {
className : 'dropdown-toggle' ,
contents : opt . title + ' ' + icon ( 'note-icon-caret' ) ,
tooltip : opt . tooltip ,
data : {
toggle : 'dropdown'
}
} ) , dropdownCheck ( {
className : opt . className ,
checkClassName : opt . checkClassName ,
items : opt . items ,
template : opt . template ,
itemClick : opt . itemClick
} ) ] , {
callback : callback
} ) . render ( ) ;
} ;
var paragraphDropdownButton = function paragraphDropdownButton ( opt ) {
return buttonGroup ( [ ui _button ( {
className : 'dropdown-toggle' ,
contents : opt . title + ' ' + icon ( 'note-icon-caret' ) ,
tooltip : opt . tooltip ,
data : {
toggle : 'dropdown'
}
} ) , dropdown ( [ buttonGroup ( {
className : 'note-align' ,
children : opt . items [ 0 ]
} ) , buttonGroup ( {
className : 'note-list' ,
children : opt . items [ 1 ]
} ) ] ) ] ) . render ( ) ;
} ;
var ui _tableMoveHandler = function tableMoveHandler ( event , col , row ) {
var PX _PER _EM = 18 ;
var $picker = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( event . target . parentNode ) ; // target is mousecatcher
var $dimensionDisplay = $picker . next ( ) ;
var $catcher = $picker . find ( '.note-dimension-picker-mousecatcher' ) ;
var $highlighted = $picker . find ( '.note-dimension-picker-highlighted' ) ;
var $unhighlighted = $picker . find ( '.note-dimension-picker-unhighlighted' ) ;
var posOffset ; // HTML5 with jQuery - e.offsetX is undefined in Firefox
if ( event . offsetX === undefined ) {
var posCatcher = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( event . target ) . offset ( ) ;
posOffset = {
x : event . pageX - posCatcher . left ,
y : event . pageY - posCatcher . top
} ;
} else {
posOffset = {
x : event . offsetX ,
y : event . offsetY
} ;
}
var dim = {
c : Math . ceil ( posOffset . x / PX _PER _EM ) || 1 ,
r : Math . ceil ( posOffset . y / PX _PER _EM ) || 1
} ;
$highlighted . css ( {
width : dim . c + 'em' ,
height : dim . r + 'em'
} ) ;
$catcher . data ( 'value' , dim . c + 'x' + dim . r ) ;
if ( dim . c > 3 && dim . c < col ) {
$unhighlighted . css ( {
width : dim . c + 1 + 'em'
} ) ;
}
if ( dim . r > 3 && dim . r < row ) {
$unhighlighted . css ( {
height : dim . r + 1 + 'em'
} ) ;
}
$dimensionDisplay . html ( dim . c + ' x ' + dim . r ) ;
} ;
var tableDropdownButton = function tableDropdownButton ( opt ) {
return buttonGroup ( [ ui _button ( {
className : 'dropdown-toggle' ,
contents : opt . title + ' ' + icon ( 'note-icon-caret' ) ,
tooltip : opt . tooltip ,
data : {
toggle : 'dropdown'
}
} ) , dropdown ( {
className : 'note-table' ,
2020-06-01 11:05:25 +00:00
items : [ '<div class="note-dimension-picker">' , '<div class="note-dimension-picker-mousecatcher" data-event="insertTable" data-value="1x1"></div>' , '<div class="note-dimension-picker-highlighted"></div>' , '<div class="note-dimension-picker-unhighlighted"></div>' , '</div>' , '<div class="note-dimension-display">1 x 1</div>' ] . join ( '' )
2020-04-01 22:52:43 +00:00
} ) ] , {
callback : function callback ( $node ) {
var $catcher = $node . find ( '.note-dimension-picker-mousecatcher' ) ;
$catcher . css ( {
width : opt . col + 'em' ,
height : opt . row + 'em'
} ) . mousedown ( opt . itemClick ) . mousemove ( function ( e ) {
ui _tableMoveHandler ( e , opt . col , opt . row ) ;
} ) ;
}
} ) . render ( ) ;
} ;
var palette = renderer [ "a" /* default */ ] . create ( '<div class="note-color-palette"/>' , function ( $node , options ) {
var contents = [ ] ;
for ( var row = 0 , rowSize = options . colors . length ; row < rowSize ; row ++ ) {
var eventName = options . eventName ;
var colors = options . colors [ row ] ;
var colorsName = options . colorsName [ row ] ;
var buttons = [ ] ;
for ( var col = 0 , colSize = colors . length ; col < colSize ; col ++ ) {
var color = colors [ col ] ;
var colorName = colorsName [ col ] ;
buttons . push ( [ '<button type="button" class="note-btn note-color-btn"' , 'style="background-color:' , color , '" ' , 'data-event="' , eventName , '" ' , 'data-value="' , color , '" ' , 'data-title="' , colorName , '" ' , 'aria-label="' , colorName , '" ' , 'data-toggle="button" tabindex="-1"></button>' ] . join ( '' ) ) ;
}
contents . push ( '<div class="note-color-row">' + buttons . join ( '' ) + '</div>' ) ;
}
$node . html ( contents . join ( '' ) ) ;
$node . find ( '.note-color-btn' ) . each ( function ( ) {
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( this ) . data ( '_lite_tooltip' , new ui _TooltipUI ( external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( this ) , {
container : options . container
} ) ) ;
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
} ) ;
var ui _colorDropdownButton = function colorDropdownButton ( opt , type ) {
return buttonGroup ( {
className : 'note-color' ,
children : [ ui _button ( {
className : 'note-current-color-button' ,
contents : opt . title ,
tooltip : opt . lang . color . recent ,
click : opt . currentClick ,
callback : function callback ( $button ) {
var $recentColor = $button . find ( '.note-recent-color' ) ;
if ( type !== 'foreColor' ) {
$recentColor . css ( 'background-color' , '#FFFF00' ) ;
$button . attr ( 'data-backColor' , '#FFFF00' ) ;
}
}
} ) , ui _button ( {
className : 'dropdown-toggle' ,
contents : icon ( 'note-icon-caret' ) ,
tooltip : opt . lang . color . more ,
data : {
toggle : 'dropdown'
}
} ) , dropdown ( {
2020-06-01 11:05:25 +00:00
items : [ '<div>' , '<div class="note-btn-group btn-background-color">' , '<div class="note-palette-title">' + opt . lang . color . background + '</div>' , '<div>' , '<button type="button" class="note-color-reset note-btn note-btn-block" data-event="backColor" data-value="transparent">' , opt . lang . color . transparent , '</button>' , '</div>' , '<div class="note-holder" data-event="backColor"></div>' , '<div class="btn-sm">' , '<input type="color" id="html5bcp" class="note-btn btn-default" value="#21104A" style="width:100%;" data-value="cp">' , '<button type="button" class="note-color-reset btn" data-event="backColor" data-value="cpbackColor">' , opt . lang . color . cpSelect , '</button>' , '</div>' , '</div>' , '<div class="note-btn-group btn-foreground-color">' , '<div class="note-palette-title">' + opt . lang . color . foreground + '</div>' , '<div>' , '<button type="button" class="note-color-reset note-btn note-btn-block" data-event="removeFormat" data-value="foreColor">' , opt . lang . color . resetToDefault , '</button>' , '</div>' , '<div class="note-holder" data-event="foreColor"></div>' , '<div class="btn-sm">' , '<input type="color" id="html5fcp" class="note-btn btn-default" value="#21104A" style="width:100%;" data-value="cp">' , '<button type="button" class="note-color-reset btn" data-event="foreColor" data-value="cpforeColor">' , opt . lang . color . cpSelect , '</button>' , '</div>' , '</div>' , '</div>' ] . join ( '' ) ,
2020-04-01 22:52:43 +00:00
callback : function callback ( $dropdown ) {
$dropdown . find ( '.note-holder' ) . each ( function ( ) {
var $holder = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( this ) ;
$holder . append ( palette ( {
colors : opt . colors ,
eventName : $holder . data ( 'event' )
} ) . render ( ) ) ;
} ) ;
if ( type === 'fore' ) {
$dropdown . find ( '.btn-background-color' ) . hide ( ) ;
$dropdown . css ( {
'min-width' : '210px'
} ) ;
} else if ( type === 'back' ) {
$dropdown . find ( '.btn-foreground-color' ) . hide ( ) ;
$dropdown . css ( {
'min-width' : '210px'
} ) ;
}
} ,
click : function click ( event ) {
var $button = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default ( ) ( event . target ) ;
var eventName = $button . data ( 'event' ) ;
var value = $button . data ( 'value' ) ;
var foreinput = document . getElementById ( 'html5fcp' ) . value ;
var backinput = document . getElementById ( 'html5bcp' ) . value ;
if ( value === 'cp' ) {
event . stopPropagation ( ) ;
} else if ( value === 'cpbackColor' ) {
value = backinput ;
} else if ( value === 'cpforeColor' ) {
value = foreinput ;
}
if ( eventName && value ) {
var key = eventName === 'backColor' ? 'background-color' : 'color' ;
var $color = $button . closest ( '.note-color' ) . find ( '.note-recent-color' ) ;
var $currentButton = $button . closest ( '.note-color' ) . find ( '.note-current-color-button' ) ;
$color . css ( key , value ) ;
$currentButton . attr ( 'data-' + eventName , value ) ;
2019-06-10 15:38:54 +00:00
2020-04-01 22:52:43 +00:00
if ( type === 'fore' ) {
opt . itemClick ( 'foreColor' , value ) ;
} else if ( type === 'back' ) {
opt . itemClick ( 'backColor' , value ) ;
} else {
opt . itemClick ( eventName , value ) ;
}
}
}
} ) ]
} ) . render ( ) ;
} ;
var dialog = renderer [ "a" /* default */ ] . create ( '<div class="note-modal" aria-hidden="false" tabindex="-1" role="dialog"/>' , function ( $node , options ) {
if ( options . fade ) {
$node . addClass ( 'fade' ) ;
}
$node . attr ( {
'aria-label' : options . title
2019-06-10 15:38:54 +00:00
} ) ;
2020-04-01 22:52:43 +00:00
$node . html ( [ '<div class="note-modal-content">' , options . title ? '<div class="note-modal-header"><button type="button" class="close" aria-label="Close" aria-hidden="true"><i class="note-icon-close"></i></button><h4 class="note-modal-title">' + options . title + '</h4></div>' : '' , '<div class="note-modal-body">' + options . body + '</div>' , options . footer ? '<div class="note-modal-footer">' + options . footer + '</div>' : '' , '</div>' ] . join ( '' ) ) ;
$node . data ( 'modal' , new ui _ModalUI ( $node , options ) ) ;
} ) ;
var videoDialog = function videoDialog ( opt ) {
var body = '<div class="note-form-group">' + '<label for="note-dialog-video-url-' + opt . id + '" class="note-form-label">' + opt . lang . video . url + ' <small class="text-muted">' + opt . lang . video . providers + '</small></label>' + '<input id="note-dialog-video-url-' + opt . id + '" class="note-video-url note-input" type="text"/>' + '</div>' ;
var footer = [ '<button type="button" href="#" class="note-btn note-btn-primary note-video-btn disabled" disabled>' , opt . lang . video . insert , '</button>' ] . join ( '' ) ;
return dialog ( {
title : opt . lang . video . insert ,
fade : opt . fade ,
body : body ,
footer : footer
} ) . render ( ) ;
} ;
var imageDialog = function imageDialog ( opt ) {
var body = '<div class="note-form-group note-group-select-from-files">' + '<label for="note-dialog-image-file-' + opt . id + '" class="note-form-label">' + opt . lang . image . selectFromFiles + '</label>' + '<input id="note-dialog-image-file-' + opt . id + '" class="note-note-image-input note-input" type="file" name="files" accept="image/*" multiple="multiple"/>' + opt . imageLimitation + '</div>' + '<div class="note-form-group">' + '<label for="note-dialog-image-url-' + opt . id + '" class="note-form-label">' + opt . lang . image . url + '</label>' + '<input id="note-dialog-image-url-' + opt . id + '" class="note-image-url note-input" type="text"/>' + '</div>' ;
var footer = [ '<button href="#" type="button" class="note-btn note-btn-primary note-btn-large note-image-btn disabled" disabled>' , opt . lang . image . insert , '</button>' ] . join ( '' ) ;
return dialog ( {
title : opt . lang . image . insert ,
fade : opt . fade ,
body : body ,
footer : footer
} ) . render ( ) ;
} ;
var linkDialog = function linkDialog ( opt ) {
var body = '<div class="note-form-group">' + '<label for="note-dialog-link-txt-' + opt . id + '" class="note-form-label">' + opt . lang . link . textToDisplay + '</label>' + '<input id="note-dialog-link-txt-' + opt . id + '" class="note-link-text note-input" type="text"/>' + '</div>' + '<div class="note-form-group">' + '<label for="note-dialog-link-url-' + opt . id + '" class="note-form-label">' + opt . lang . link . url + '</label>' + '<input id="note-dialog-link-url-' + opt . id + '" class="note-link-url note-input" type="text" value="http://"/>' + '</div>' + ( ! opt . disableLinkTarget ? '<div class="checkbox"><label for="note-dialog-link-nw-' + opt . id + '"><input id="note-dialog-link-nw-' + opt . id + '" type="checkbox" checked> ' + opt . lang . link . openInNewWindow + '</label></div>' : '' ) + '<div class="checkbox"><label for="note-dialog-link-up-' + opt . id + '"><input id="note-dialog-link-up-' + opt . id + '" type="checkbox" checked> ' + opt . lang . link . useProtocol + '</label></div>' ;
var footer = [ '<button href="#" type="button" class="note-btn note-btn-primary note-link-btn disabled" disabled>' , opt . lang . link . insert , '</button>' ] . join ( '' ) ;
return dialog ( {
className : 'link-dialog' ,
title : opt . lang . link . insert ,
fade : opt . fade ,
body : body ,
footer : footer
} ) . render ( ) ;
} ;
2020-06-01 11:05:25 +00:00
var popover = renderer [ "a" /* default */ ] . create ( [ '<div class="note-popover bottom">' , '<div class="note-popover-arrow"></div>' , '<div class="popover-content note-children-container"></div>' , '</div>' ] . join ( '' ) , function ( $node , options ) {
2020-04-01 22:52:43 +00:00
var direction = typeof options . direction !== 'undefined' ? options . direction : 'bottom' ;
$node . addClass ( direction ) . hide ( ) ;
if ( options . hideArrow ) {
$node . find ( '.note-popover-arrow' ) . hide ( ) ;
}
} ) ;
var ui _checkbox = renderer [ "a" /* default */ ] . create ( '<div class="checkbox"></div>' , function ( $node , options ) {
$node . html ( [ '<label' + ( options . id ? ' for="note-' + options . id + '"' : '' ) + '>' , '<input role="checkbox" type="checkbox"' + ( options . id ? ' id="note-' + options . id + '"' : '' ) , options . checked ? ' checked' : '' , ' aria-checked="' + ( options . checked ? 'true' : 'false' ) + '"/>' , options . text ? options . text : '' , '</label>' ] . join ( '' ) ) ;
} ) ;
var icon = function icon ( iconClassName , tagName ) {
tagName = tagName || 'i' ;
return '<' + tagName + ' class="' + iconClassName + '"/>' ;
} ;
var ui = function ui ( editorOptions ) {
return {
editor : editor ,
toolbar : toolbar ,
editingArea : editingArea ,
codable : codable ,
editable : editable ,
statusbar : statusbar ,
airEditor : airEditor ,
airEditable : airEditable ,
buttonGroup : buttonGroup ,
button : ui _button ,
dropdown : dropdown ,
dropdownCheck : dropdownCheck ,
dropdownButton : dropdownButton ,
dropdownButtonContents : dropdownButtonContents ,
dropdownCheckButton : dropdownCheckButton ,
paragraphDropdownButton : paragraphDropdownButton ,
tableDropdownButton : tableDropdownButton ,
colorDropdownButton : ui _colorDropdownButton ,
palette : palette ,
dialog : dialog ,
videoDialog : videoDialog ,
imageDialog : imageDialog ,
linkDialog : linkDialog ,
popover : popover ,
checkbox : ui _checkbox ,
icon : icon ,
options : editorOptions ,
toggleBtn : function toggleBtn ( $btn , isEnable ) {
$btn . toggleClass ( 'disabled' , ! isEnable ) ;
$btn . attr ( 'disabled' , ! isEnable ) ;
} ,
toggleBtnActive : function toggleBtnActive ( $btn , isActive ) {
$btn . toggleClass ( 'active' , isActive ) ;
} ,
check : function check ( $dom , value ) {
$dom . find ( '.checked' ) . removeClass ( 'checked' ) ;
$dom . find ( '[data-value="' + value + '"]' ) . addClass ( 'checked' ) ;
} ,
onDialogShown : function onDialogShown ( $dialog , handler ) {
$dialog . one ( 'note.modal.show' , handler ) ;
} ,
onDialogHidden : function onDialogHidden ( $dialog , handler ) {
$dialog . one ( 'note.modal.hide' , handler ) ;
} ,
showDialog : function showDialog ( $dialog ) {
$dialog . data ( 'modal' ) . show ( ) ;
} ,
hideDialog : function hideDialog ( $dialog ) {
$dialog . data ( 'modal' ) . hide ( ) ;
} ,
/ * *
* get popover content area
*
* @ param $popover
* @ returns { * }
* /
getPopoverContent : function getPopoverContent ( $popover ) {
return $popover . find ( '.note-popover-content' ) ;
} ,
/ * *
* get dialog ' s body area
*
* @ param $dialog
* @ returns { * }
* /
getDialogBody : function getDialogBody ( $dialog ) {
return $dialog . find ( '.note-modal-body' ) ;
} ,
createLayout : function createLayout ( $note ) {
var $editor = ( editorOptions . airMode ? airEditor ( [ editingArea ( [ codable ( ) , airEditable ( ) ] ) ] ) : editorOptions . toolbarPosition === 'bottom' ? editor ( [ editingArea ( [ codable ( ) , editable ( ) ] ) , toolbar ( ) , statusbar ( ) ] ) : editor ( [ toolbar ( ) , editingArea ( [ codable ( ) , editable ( ) ] ) , statusbar ( ) ] ) ) . render ( ) ;
$editor . insertAfter ( $note ) ;
return {
note : $note ,
editor : $editor ,
toolbar : $editor . find ( '.note-toolbar' ) ,
editingArea : $editor . find ( '.note-editing-area' ) ,
editable : $editor . find ( '.note-editable' ) ,
codable : $editor . find ( '.note-codable' ) ,
statusbar : $editor . find ( '.note-statusbar' )
} ;
} ,
removeLayout : function removeLayout ( $note , layoutInfo ) {
$note . html ( layoutInfo . editable . html ( ) ) ;
layoutInfo . editor . remove ( ) ;
$note . off ( 'summernote' ) ; // remove summernote custom event
$note . show ( ) ;
}
} ;
} ;
/* harmony default export */ var lite _ui = ( ui ) ;
// EXTERNAL MODULE: ./src/js/base/settings.js + 37 modules
var settings = _ _webpack _require _ _ ( 3 ) ;
// EXTERNAL MODULE: ./src/styles/summernote-lite.scss
var summernote _lite = _ _webpack _require _ _ ( 6 ) ;
// CONCATENATED MODULE: ./src/js/lite/settings.js
external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote = external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . extend ( external _root _jQuery _commonjs2 _jquery _commonjs _jquery _amd _jquery _default . a . summernote , {
ui _template : lite _ui ,
"interface" : 'lite'
} ) ;
/***/ } ) ,
/***/ 6 :
/***/ ( function ( module , exports , _ _webpack _require _ _ ) {
// extracted by mini-css-extract-plugin
/***/ } )
2019-06-10 15:38:54 +00:00
2020-04-01 22:52:43 +00:00
/******/ } ) ;
} ) ;
//# sourceMappingURL=summernote-lite.js.map