From 6128ad814359bef475ac1423a3ce974f8590ba3c Mon Sep 17 00:00:00 2001 From: condor2 Date: Tue, 16 Mar 2021 14:48:31 +0200 Subject: [PATCH 1/2] Summernote updated to v0.8.18 --- upload/admin/controller/catalog/category.php | 5 +- .../admin/controller/catalog/information.php | 5 +- .../admin/controller/catalog/manufacturer.php | 5 +- upload/admin/controller/catalog/product.php | 5 +- .../controller/extension/openbay/ebay.php | 5 +- .../extension/payment/ocstore_payeer.php | 5 +- upload/admin/controller/marketing/contact.php | 5 +- .../javascript/summernote/font/summernote.eot | Bin 13238 -> 12072 bytes .../javascript/summernote/font/summernote.ttf | Bin 13052 -> 11896 bytes .../summernote/font/summernote.woff | Bin 8332 -> 7428 bytes .../summernote/font/summernote.woff2 | Bin 0 -> 6156 bytes .../summernote/lang/summernote-ar-AR.js | 182 +- .../summernote/lang/summernote-ar-AR.min.js | 2 + .../summernote/lang/summernote-az-AZ.js | 283 + .../summernote/lang/summernote-az-AZ.min.js | 2 + .../summernote/lang/summernote-bg-BG.js | 185 +- .../summernote/lang/summernote-bg-BG.min.js | 2 + .../summernote/lang/summernote-ca-ES.js | 138 +- .../summernote/lang/summernote-ca-ES.min.js | 2 + .../summernote/lang/summernote-cs-CZ.js | 175 +- .../summernote/lang/summernote-cs-CZ.min.js | 2 + .../summernote/lang/summernote-da-DK.js | 169 +- .../summernote/lang/summernote-da-DK.min.js | 2 + .../summernote/lang/summernote-de-DE.js | 218 +- .../summernote/lang/summernote-de-DE.min.js | 2 + .../summernote/lang/summernote-el-GR.js | 281 + .../summernote/lang/summernote-el-GR.min.js | 2 + .../summernote/lang/summernote-es-ES.js | 259 +- .../summernote/lang/summernote-es-ES.min.js | 2 + .../summernote/lang/summernote-es-EU.js | 179 +- .../summernote/lang/summernote-es-EU.min.js | 2 + .../summernote/lang/summernote-fa-IR.js | 178 +- .../summernote/lang/summernote-fa-IR.min.js | 2 + .../summernote/lang/summernote-fi-FI.js | 189 +- .../summernote/lang/summernote-fi-FI.min.js | 2 + .../summernote/lang/summernote-fr-FR.js | 168 +- .../summernote/lang/summernote-fr-FR.min.js | 2 + .../summernote/lang/summernote-gl-ES.js | 273 + .../summernote/lang/summernote-gl-ES.min.js | 2 + .../summernote/lang/summernote-he-IL.js | 174 +- .../summernote/lang/summernote-he-IL.min.js | 2 + .../summernote/lang/summernote-hr-HR.js | 273 + .../summernote/lang/summernote-hr-HR.min.js | 2 + .../summernote/lang/summernote-hu-HU.js | 150 +- .../summernote/lang/summernote-hu-HU.min.js | 2 + .../summernote/lang/summernote-id-ID.js | 186 +- .../summernote/lang/summernote-id-ID.min.js | 2 + .../summernote/lang/summernote-it-IT.js | 177 +- .../summernote/lang/summernote-it-IT.min.js | 2 + .../summernote/lang/summernote-ja-JP.js | 181 +- .../summernote/lang/summernote-ja-JP.min.js | 2 + .../summernote/lang/summernote-ko-KR.js | 188 +- .../summernote/lang/summernote-ko-KR.min.js | 2 + .../summernote/lang/summernote-lt-LT.js | 174 +- .../summernote/lang/summernote-lt-LT.min.js | 2 + .../summernote/lang/summernote-lt-LV.js | 273 + .../summernote/lang/summernote-lt-LV.min.js | 2 + .../summernote/lang/summernote-mn-MN.js | 274 + .../summernote/lang/summernote-mn-MN.min.js | 2 + .../summernote/lang/summernote-nb-NO.js | 174 +- .../summernote/lang/summernote-nb-NO.min.js | 2 + .../summernote/lang/summernote-nl-NL.js | 177 +- .../summernote/lang/summernote-nl-NL.min.js | 2 + .../summernote/lang/summernote-pl-PL.js | 173 +- .../summernote/lang/summernote-pl-PL.min.js | 2 + .../summernote/lang/summernote-pt-BR.js | 201 +- .../summernote/lang/summernote-pt-BR.min.js | 2 + .../summernote/lang/summernote-pt-PT.js | 185 +- .../summernote/lang/summernote-pt-PT.min.js | 2 + .../summernote/lang/summernote-ro-RO.js | 187 +- .../summernote/lang/summernote-ro-RO.min.js | 2 + .../summernote/lang/summernote-ru-RU.js | 167 +- .../summernote/lang/summernote-ru-RU.min.js | 2 + .../summernote/lang/summernote-sk-SK.js | 175 +- .../summernote/lang/summernote-sk-SK.min.js | 2 + .../summernote/lang/summernote-sl-SI.js | 175 +- .../summernote/lang/summernote-sl-SI.min.js | 2 + .../summernote/lang/summernote-sr-RS-Latin.js | 175 +- .../lang/summernote-sr-RS-Latin.min.js | 2 + .../summernote/lang/summernote-sr-RS.js | 175 +- .../summernote/lang/summernote-sr-RS.min.js | 2 + .../summernote/lang/summernote-sv-SE.js | 177 +- .../summernote/lang/summernote-sv-SE.min.js | 2 + .../summernote/lang/summernote-ta-IN.js | 273 + .../summernote/lang/summernote-ta-IN.min.js | 2 + .../summernote/lang/summernote-th-TH.js | 375 +- .../summernote/lang/summernote-th-TH.min.js | 2 + .../summernote/lang/summernote-tr-TR.js | 174 +- .../summernote/lang/summernote-tr-TR.min.js | 2 + .../summernote/lang/summernote-uk-UA.js | 170 +- .../summernote/lang/summernote-uk-UA.min.js | 2 + .../summernote/lang/summernote-uz-UZ.js | 230 + .../summernote/lang/summernote-uz-UZ.min.js | 2 + .../summernote/lang/summernote-vi-VN.js | 273 +- .../summernote/lang/summernote-vi-VN.min.js | 2 + .../summernote/lang/summernote-zh-CN.js | 168 +- .../summernote/lang/summernote-zh-CN.min.js | 2 + .../summernote/lang/summernote-zh-TW.js | 166 +- .../summernote/lang/summernote-zh-TW.min.js | 2 + .../view/javascript/summernote/opencart.js | 35 +- .../databasic/summernote-ext-databasic.css | 16 + .../databasic/summernote-ext-databasic.js | 291 + .../plugin/hello/summernote-ext-hello.js | 30 +- .../summernote-ext-specialchars.js | 65 +- .../summernote/summernote-image-attributes.js | 653 + .../view/javascript/summernote/summernote.css | 14 +- .../view/javascript/summernote/summernote.js | 14107 ++++++++++------ .../javascript/summernote/summernote.js.map | 1 + .../javascript/summernote/summernote.min.css | 1 + .../javascript/summernote/summernote.min.js | 7 +- 110 files changed, 18331 insertions(+), 5909 deletions(-) create mode 100644 upload/admin/view/javascript/summernote/font/summernote.woff2 create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-ar-AR.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-az-AZ.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-az-AZ.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-bg-BG.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-ca-ES.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-cs-CZ.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-da-DK.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-de-DE.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-el-GR.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-el-GR.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-es-ES.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-es-EU.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-fa-IR.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-fi-FI.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-fr-FR.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-gl-ES.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-gl-ES.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-he-IL.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-hr-HR.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-hr-HR.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-hu-HU.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-id-ID.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-it-IT.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-ja-JP.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-ko-KR.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-lt-LT.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-lt-LV.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-lt-LV.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-mn-MN.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-mn-MN.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-nb-NO.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-nl-NL.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-pl-PL.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-pt-BR.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-pt-PT.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-ro-RO.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-ru-RU.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-sk-SK.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-sl-SI.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-sr-RS-Latin.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-sr-RS.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-sv-SE.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-ta-IN.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-ta-IN.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-th-TH.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-tr-TR.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-uk-UA.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-uz-UZ.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-uz-UZ.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-vi-VN.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-zh-CN.min.js create mode 100644 upload/admin/view/javascript/summernote/lang/summernote-zh-TW.min.js create mode 100644 upload/admin/view/javascript/summernote/plugin/databasic/summernote-ext-databasic.css create mode 100644 upload/admin/view/javascript/summernote/plugin/databasic/summernote-ext-databasic.js create mode 100644 upload/admin/view/javascript/summernote/summernote-image-attributes.js create mode 100644 upload/admin/view/javascript/summernote/summernote.js.map create mode 100644 upload/admin/view/javascript/summernote/summernote.min.css diff --git a/upload/admin/controller/catalog/category.php b/upload/admin/controller/catalog/category.php index 062ea8f13c..83e131bb74 100644 --- a/upload/admin/controller/catalog/category.php +++ b/upload/admin/controller/catalog/category.php @@ -302,10 +302,11 @@ protected function getForm() { $this->document->addScript('view/javascript/ckeditor/ckeditor.js'); $this->document->addScript('view/javascript/ckeditor/ckeditor_init.js'); } else { - $this->document->addScript('view/javascript/summernote/summernote.js'); + $this->document->addScript('view/javascript/summernote/summernote.min.js'); + $this->document->addScript('view/javascript/summernote/summernote-image-attributes.js'); $this->document->addScript('view/javascript/summernote/lang/summernote-' . $this->language->get('lang') . '.js'); $this->document->addScript('view/javascript/summernote/opencart.js'); - $this->document->addStyle('view/javascript/summernote/summernote.css'); + $this->document->addStyle('view/javascript/summernote/summernote.min.css'); } $data['heading_title'] = $this->language->get('heading_title'); diff --git a/upload/admin/controller/catalog/information.php b/upload/admin/controller/catalog/information.php index 5e3d4e7861..7ace811145 100644 --- a/upload/admin/controller/catalog/information.php +++ b/upload/admin/controller/catalog/information.php @@ -265,10 +265,11 @@ protected function getForm() { $this->document->addScript('view/javascript/ckeditor/ckeditor.js'); $this->document->addScript('view/javascript/ckeditor/ckeditor_init.js'); } else { - $this->document->addScript('view/javascript/summernote/summernote.js'); + $this->document->addScript('view/javascript/summernote/summernote.min.js'); + $this->document->addScript('view/javascript/summernote/summernote-image-attributes.js'); $this->document->addScript('view/javascript/summernote/lang/summernote-' . $this->language->get('lang') . '.js'); $this->document->addScript('view/javascript/summernote/opencart.js'); - $this->document->addStyle('view/javascript/summernote/summernote.css'); + $this->document->addStyle('view/javascript/summernote/summernote.min.css'); } $data['heading_title'] = $this->language->get('heading_title'); diff --git a/upload/admin/controller/catalog/manufacturer.php b/upload/admin/controller/catalog/manufacturer.php index 67fd328168..29405c24ab 100644 --- a/upload/admin/controller/catalog/manufacturer.php +++ b/upload/admin/controller/catalog/manufacturer.php @@ -265,10 +265,11 @@ protected function getForm() { $this->document->addScript('view/javascript/ckeditor/ckeditor.js'); $this->document->addScript('view/javascript/ckeditor/ckeditor_init.js'); } else { - $this->document->addScript('view/javascript/summernote/summernote.js'); + $this->document->addScript('view/javascript/summernote/summernote.min.js'); + $this->document->addScript('view/javascript/summernote/summernote-image-attributes.js'); $this->document->addScript('view/javascript/summernote/lang/summernote-' . $this->language->get('lang') . '.js'); $this->document->addScript('view/javascript/summernote/opencart.js'); - $this->document->addStyle('view/javascript/summernote/summernote.css'); + $this->document->addStyle('view/javascript/summernote/summernote.min.css'); } $data['heading_title'] = $this->language->get('heading_title'); diff --git a/upload/admin/controller/catalog/product.php b/upload/admin/controller/catalog/product.php index 2474fea0f9..e5b657d1ad 100644 --- a/upload/admin/controller/catalog/product.php +++ b/upload/admin/controller/catalog/product.php @@ -597,10 +597,11 @@ protected function getForm() { $this->document->addScript('view/javascript/ckeditor/ckeditor.js'); $this->document->addScript('view/javascript/ckeditor/ckeditor_init.js'); } else { - $this->document->addScript('view/javascript/summernote/summernote.js'); + $this->document->addScript('view/javascript/summernote/summernote.min.js'); + $this->document->addScript('view/javascript/summernote/summernote-image-attributes.js'); $this->document->addScript('view/javascript/summernote/lang/summernote-' . $this->language->get('lang') . '.js'); $this->document->addScript('view/javascript/summernote/opencart.js'); - $this->document->addStyle('view/javascript/summernote/summernote.css'); + $this->document->addStyle('view/javascript/summernote/summernote.min.css'); } $data['heading_title'] = $this->language->get('heading_title'); diff --git a/upload/admin/controller/extension/openbay/ebay.php b/upload/admin/controller/extension/openbay/ebay.php index 2601c532bf..46c9c390bd 100644 --- a/upload/admin/controller/extension/openbay/ebay.php +++ b/upload/admin/controller/extension/openbay/ebay.php @@ -1275,10 +1275,11 @@ public function create() { $this->document->addScript('view/javascript/ckeditor/ckeditor.js'); $this->document->addScript('view/javascript/ckeditor/ckeditor_init.js'); } else { - $this->document->addScript('view/javascript/summernote/summernote.js'); + $this->document->addScript('view/javascript/summernote/summernote.min.js'); + $this->document->addScript('view/javascript/summernote/summernote-image-attributes.js'); $this->document->addScript('view/javascript/summernote/lang/summernote-' . $this->language->get('lang') . '.js'); $this->document->addScript('view/javascript/summernote/opencart.js'); - $this->document->addStyle('view/javascript/summernote/summernote.css'); + $this->document->addStyle('view/javascript/summernote/summernote.min.css'); } if ($this->checkConfig() == true) { diff --git a/upload/admin/controller/extension/payment/ocstore_payeer.php b/upload/admin/controller/extension/payment/ocstore_payeer.php index a46bb5e307..82407342b9 100644 --- a/upload/admin/controller/extension/payment/ocstore_payeer.php +++ b/upload/admin/controller/extension/payment/ocstore_payeer.php @@ -61,10 +61,11 @@ public function index() { $this->document->addScript('view/javascript/ckeditor/ckeditor.js'); $this->document->addScript('view/javascript/ckeditor/ckeditor_init.js'); } else { - $this->document->addScript('view/javascript/summernote/summernote.js'); + $this->document->addScript('view/javascript/summernote/summernote.min.js'); + $this->document->addScript('view/javascript/summernote/summernote-image-attributes.js'); $this->document->addScript('view/javascript/summernote/lang/summernote-' . $this->language->get('lang') . '.js'); $this->document->addScript('view/javascript/summernote/opencart.js'); - $this->document->addStyle('view/javascript/summernote/summernote.css'); + $this->document->addStyle('view/javascript/summernote/summernote.min.css'); } $data = $this->_setData(array( diff --git a/upload/admin/controller/marketing/contact.php b/upload/admin/controller/marketing/contact.php index f70132b30d..dec2f98be7 100644 --- a/upload/admin/controller/marketing/contact.php +++ b/upload/admin/controller/marketing/contact.php @@ -12,10 +12,11 @@ public function index() { $this->document->addScript('view/javascript/ckeditor/ckeditor.js'); $this->document->addScript('view/javascript/ckeditor/ckeditor_init.js'); } else { - $this->document->addScript('view/javascript/summernote/summernote.js'); + $this->document->addScript('view/javascript/summernote/summernote.min.js'); + $this->document->addScript('view/javascript/summernote/summernote-image-attributes.js'); $this->document->addScript('view/javascript/summernote/lang/summernote-' . $this->language->get('lang') . '.js'); $this->document->addScript('view/javascript/summernote/opencart.js'); - $this->document->addStyle('view/javascript/summernote/summernote.css'); + $this->document->addStyle('view/javascript/summernote/summernote.min.css'); } $data['heading_title'] = $this->language->get('heading_title'); diff --git a/upload/admin/view/javascript/summernote/font/summernote.eot b/upload/admin/view/javascript/summernote/font/summernote.eot index 3138288e1e722fccad2cd3ce4709d0fd8e842fbd..4f047db9a0e2df65099bbd7173951f3c80b7129e 100644 GIT binary patch literal 12072 zcmd^ld3aPsx_8y-KBv30bvm7NXYDoV&f3{}At4Kd5M&7fWD!Aeay+?+ogE3L;z|ZJZHzlXRbazdENw5@6=J&-dN` zzCQh)Q&p$x)LT{W@_Xx?{8B=$bP+-cN7#=eyh2K#WDjMjMN8!Tm`2NA;dsdN_7TF4{G%h3n?cqQiePK=oz@h zI*%vAL_x~tUAm&da% zs;(vb>l+AB9U#Q|=k9>Nvnyv|3hI6W@^+&jiSVx?{URv0dsFDjUCH0wjpv<4{&a7! z!+$L9Bw99{F?%P%SWFOQm_+!y845IpX zSD_+1i#LfktG7y{kxF8xDyanZy4NmxtyNp|J&BiFOs#~rr`2247$;H3mJKW*S4Hk8 zaZ*jTm~m2iT*}M$<1o2(gllYCw45aM`a^vrlPIU$pPHtklto#gRqw-a;maL*jr^*uUP5UkBn%hZcg=u((G`dIB5BsTsRQOahb7+0(&%9Uh~R7c6m!!yP)hA?Gk zq8p9ZMlI<)ngC5;yS>FYyuR8f6mj|NAe2O#lZ=BKPt#%me#fYt27!tsUNkSMi%82P!7y`qH32GP`$cSlTSR)hGmxLi1 zjF^Ok<7L8{lQ6hqgw-eEM42E5B%CA@B!YysGC?*-I9Vo02?^_Dg1nG0tRf>w4hidJ zf((&xs!Wh35>Ar|az(-hnIK^#Y?KMIM#8X+j39L+oFNnBkAyR2f+Uh~mQ0XI5{4aM z1nDH<9GM`eBy5ri5=+8nnIO9)Y>^34Ou|-~AkQRhlL?Yd!giS;<0PCb6QrGl^JIeD zldwZ3XaEU2Wr8k{aK22?3KA}m3Hm|8g)%`?NVrHQ=nM%L%fz%gTp|`x zg-lFqrC&CwCR@l}@+|o~O`w<2$LU$FhU@3{ai1vi70Z+kXEp0IJ2YZkP24^4aq->pZzL2a>`C}z;^m2ll6EEiU0bK! zsr@L~mb@$ZP;!{bJcRmE{&S>MOhWY@YZ|qtS*g`y?N{cGeZ1RMjf{

W3pu=!bw3t(T-YmR;sh=7zv+@)Cot#AI6r6KMF^L6mcZ_HC2ft?4T;iCKBOq zLQbqLV>~XS`^R76g8&)?O=9XTw=x#PsD3;^r<;Q zj`$5tihNAtBPVGbr%gC?M~ca$*1oYzr4cf8+?%>|rpNMF&*NF@5hs~v#`j3Q%(M8@ zIgTgVetO<`8MmzMnvvIp8u5qGqkP5aQK|Kha@+sbcm-7wXD~`f9UHG}`gp}>M;X8CDlScdc&GLBPnmXQ7LdwJ%P0TWz>Bofn(YJZe=-c8ThFph5`hmtp zKBub487z^ETZCa@7#a<|q3%-ZuxY8z?I@x)Ax-CGIU&_Z4HZ7>^`&x3OD>n3l50_> z@HcBWdCVORWzN-R}Rx{>Tx^lR-ad5PZeXRp0d2P!kagZt>Fuw?>*Ny zB^PiuYm$AiBl9E=?D7lPx^TXn(tHW2W@@zwIW*N!X;rb@Mds@UHe8t%F^)|G{UJ6D zn6a@7_!`b)GkMWD&bojx_&4bHlyzi$v58`w)KgumVJ5BcdUQsXyI>v98~5abUbv3e z$y{B0B$*fR1s@E)elFb1ybv|&tVRv>S#>@Qb?U564OLlnD$4)v!{~_*M4#yUAbR3M z`j*&mn)98ahv=bGobR;Qz&9S_vfdYG(%0XQ{?{>arr2~c`tC{k0YpKKYp3T3U`44zu zjIjP>n^q<~2@h^%-ivxY?p&*#PpdGb=~4xIn$?mEC2@Lbg^6O=Mbs!K>^5dx`RfAW zJL2lq(c5oWviv&5DjJ}bXV1P9ef;_xmtB9ur7hQ9zhGcs{?csa>~%Li|EH9l%LgLO zTUvI0`r7`#7J0duj-PG5d;1*~dxjr+xO8psmr`^uIHaR%i>X_m~7&ZH&8#U*HW-7!0;OR@mR0L-r&zeV+^ zY6lRJ8D6=bbdlRJQWs59n5l`@DV&vpN#TV6yA*;-I>R`j#Aju9OQo7dC}I*#HPK4O zR4TZ#pDXbC>L`qe(?y*QRKwMc5>%|Cu*Rr|0YH0=CTfHp%cb1*#8Pibjxynf#IhMB z*^0!k5*67cGs+TgNKodKcuNz--RBk1k@H&6XT^OMuLXa)YT>mD7uL^OB>w9}L3i8Q z+nojZ&fC|vM)ryO7tXF*=*SyhNSDeL#Qjq$^u$V4iw#DaQR+4vGZ?wd61TzNF3IGK z$hu22!23wO!R^YV1{8R3O*a_QX{O7AtN~ZILHT!!XO_o2|C+tm~`cwzRkFCQFlQktRJ^S^!1g(cd4W>5G;uStNdb@b_Zi#e?D(%`Gj> z)Ohg4Km6vwU!0jWXU?oMzj#pm)r0q(nLTID>@)W~sPeZg62E-@1#!a*&xvOiwX`gv zY0tet?|R{Rn!2dv!G>91-2H&~!~=JKF{?pJ)0I*hawX|1|2_W`^KcsKg^P3AZFUWH z*vpxBgGmx#CM(OzeHAcFhRQ1HV^-3s_<%DC!eWl&6g2u-^mB!hqe}&WGe*A$r42VF8D_oKcCI@zF1$U-AjfN~+*8(VTLN1wb!_coPDNt%4O% zMjS)=)T5yunx>(Z8V=_)%5UX7(YLwrkzJhWX!O&u7rAj{JyA+m9;St~;IO#nrs#ft z>*&qg2lSVR#rMTyhv_ddR4JMzDypLJ=PsaDFK{NIHVoNa4~d6ObbBkUPL`7_A+uPL zV_^Q3Iea*a{psoA(#+^B*-mG6^j>!6 zlEek{w-ZEnq*r9jOMkUIcX@94tLgKQ%Mh2QUy?2^Nf&o!rwR|JW@o34w54Y6rT5=V z@57()ES6Rgm1-LA6oTO_W#vhwq@qTft%E-v72lz2Z;xwwQqK{zP^d={LvL>^YO33~B| z$QcIGx$8tYtf_n`5z{BIxSO(;6kJRMD8d(vg%PLl;fOgC*SkH?J+k$)L!#71t2 zTn8_CALfzyJ1B4xb7XQr#qrikFN-)(Ecrp^oS`Q^FRU|E>iqhYxB6hsCt5IPh-W!n zT&#`HTbU=TpKL%R0Pe8KD06ydYPD)%*j#BcRhmbJO>UFUQb1M8y{@L5QbXoE-@sV! z{1R`L$(UA@)hNzUZ$lOQf4os@LU;1dSX**y93{p~ZSsOSRl(7go|?vHTV}e;QJcF& z)tr*@dWt)boqoD?GOfCAGCj3iaNyZvH_Ck|w;2j7x*eQSFl2fokF3tkj!(4M>lCft zOoO1HbO_Z(_R4jIUR<|RPMMf&u~&`l*f6uMHa;#ParTuR%AHkqOLC%;D@$>wyqc2B zPU1UKI_pux&FUPP#F6|a;WumthN>8JQ$fbm4qE1R3CaXoWyqgXkt_VBpD$`MH%IKN+xq*x^*TdxzT!;NLMQEq zyeP)k!KOaS@4$}AV$zB}&Vix-5p<-Gfz||mN}~KD|HD}4JK!L$6(_UL5`6?$e!GN2 z{;$9bHCjAosky~NRO80+X7wf5!I$?$w35BU?iV%YITdh$3f`ATL42jou2J|j9RF?` zC2eXtEDryK#5ftH(uMoin{FCAL1!x#iHFW* zt$0K+ht{=_rL@@JDvt34@0N@W}8uzkjJxuM~1BdCQ^hEq~;>X-4&&9{; zHYgKVG@ysEI?P``dW|w(48!k_zln7&7jDBYmygT@cAkSeP;+*$;Mt}U((Ddo5T?K$ zz#PO5xJ$_%`1E#<0ktvKbG8(H+@VRaC1)iidkQ_7h8>*S?Oj;inPX1Z=cjus(w#i%T(enbyi;zve?RsTs6Mp zT&v!0Nikdc8a>4YnWaj;jmx&oiQdXB6px926+fiT$ZqPy9C73Cj(?ykSLMTd#9>s5 zJdHx-^w9&KDCQ|MqW93U$TMParedigIr7%K$_%b6dT-=_FZiQk2~m!>V_pskPhf3} z;Fp&Xk~d);xO$th+=z;k<7*gy@F;z*TdMU;MPErW~vp#(tcChpS zv<9PU@lQKtGoji6GiRjb^IP-Uj)Je|nAWs8R^SOdGd=i^-U=(oubG*Xp;l6=RA=POjAS+r&Y3gV z$W<23TRyK)Iz@kz>(EgOlcnTKJoJ;AGTRLC;Le)T+$uJIAi}>Q9E03ozm>r|Y6T2L z8Cg>|{6+3S9O`0}F0%DUFt&VTvpyOlSJhX@@H!D*%P$EEib=-78I zKx8wHt|kvHfYQ{XGUkemUAt5OvJHNE1ape`KH~LpEoj<#}qR4JCBqt>3 z45mDnyLN8NDt}MtnzQfiyREa?nZiFESw$5o#tfUaAh*z#pJmpi7}N4|D~f$CcVV$5 z$C&G?nA@;y{>r&6GwQ9mC3*EFzAUzrhM({VaI_N$x(SM!CPy==QZ&OtM|e`Z94cC* zs3ut|bFu*?AqHcIw9V(xtDGvM%IGutoIb^M+xmNd?J6yE?d#qAuNvVv-eNQhi;2craJwRo74&ET5II^i3g4!f8fM%oP`x{l$HK^Q~wW} zH|=wkmb&(B+PwX-yY`%@t*@^=vF9$@bmyMqb@h*{uWc1HHg(+3)+kkcayIJU65~<4iNpJ|X?R;g*QMAo!WIHtkS+#Q*$xVJGU${zfnjb1@RB`7 z{M9kcFX3hx^E2EGw9RmH+DN;En;%SLxEY`sf904hvwV7ZQJy&$K$}GinbBLN@Z!Gg z{QPV#aU!%}SJ=Bztk2kaan3*Ay_CWSHY64TLHMWfzHJKTKY};~T+#j0FhAlI8S{g2 z2Kxc7q|j)3c#(-HC!OxkjD;5gX$0TWgW|#oip2^V@IEzGI2RE7lc0hBC$rDBTM--p z=o=6!Fo1tP;5RC7lp`)V`kGjSPKBFA2vdU!DbIoq7BS#K|1ipn#hb$KgqQF(EER8g zTvEJg@KtybB?zg!lyW!$5vhr*L@7Lxkd~@9Kz3qj4X1+B!?vJ?@;7*zmUV5qt8=WN zvSnd=*Sw`2-2K{$hTN8pjq{cUyqea%QGPBrU)$3HAxYe(B^yJ~B@RAyWK zrNyHIav^^^u2VCRjcB3=}GAdnBiCAb@4k7T=Dpp24hjYLYq+Gihj8B-+MQ= zu58NN?#njm;$KNf7Uyo<+%R}aXl;^Kqt}-f6j$u}^xEQiN`;=clyj@nOK0V<_it=Y zu28oMF1&fHg{WCQl6R=Xz76vmPB;rTFA|oi)L?U$&5j0}fJM|}MLrFa1kp0lnKaF+ zZWVu)*PK(5W}uE-lgVH%aFmvmRjqJ&au+{4`n~v^xS*|Qk%6uhe`{P&csczAU5VqK z)rAX;;z7E~u&Ag_od4J=Yg2ZK*X!+N8qf%BCh)19waG$9?%WE{&eHI`)ZL z`t?4CRm_f_vE}artP@Y;OOb4KHsZ_-V6%BZA+2O1*-D1tSL{#(CmRP41~#VPN+5dJ zwxogq@uIYf7i^$Oo{{Py84Q}_V5^@pL;@&c#&(X3S!Pn`nNbgLBG{R`^7{BRbb*_- zcqIU7!q#{x^{Sq_Pp!UB0xja61#Nx0;<92}N{Vjm6rYsz4Hs%IC}P`b_lr;5Ke4rT z|C76hcWj96PBnXK-If_!qU(bI6lqmehQ3u|r}QWj9(t&8WuL9E)MC(T4T^&ncdf_l z+rr(`Z*5p@4X#uq`f93YNTu9kZ43HzDJeE|t&2RKl*G4ip$$8RcRe}TC0!|{iwc^f zyA@Z+{Gt=_p`dlOmGuy8jEFKn)ipk`YDHte)sj{ep}a7imL zktADK1%`bjRS{H1NwN$QG|@tK@c(DxRjF=$c5$x9wW6x5q|{MhHkeGg4(tJxiGITbEGrte!C1wOUki+T1u*XPIL3@O?ZD4?(V}CR zFArCS?5A8aIIFG_#f*kkA4PAYKZ+Vg(OagZeh}lRM8ovQYw3?GgcT!CZl_y!&@JLE zV&eG;MUQwh-8wp6%WaRPoJRm^4IAQOmuvx;i7n^vJZo^zj zsKTLIbyobd_~)-r(rlV@GMZ_b*RXik{4E8MCmpq`bh&$G&774rW087T=-i!0XMXmX zGV!y|%sD#k*ylaVuD;rkTGXXX7gX^Xdjr^nUwlCJy}~=fpYSz?4r^b)-qbUt@K~jd z6YwGJZQ(r;00LCRf&DI)1|DK*r1Vls;r1%`TW46sAFw4zxbr7a67Ks3x&(9J}ds)wvD{cd;e@IC@@8~nFA{Q+&SwtS)&anDty~i^pNddwk{$q?m=-f1R5Z*;xE4c-{F0zYx#<>S^(BKX=dH zu1L@5Z}2>K^{yjT$GPG%&1fe789$!cwnEfC{Pyn$Hb3?Dt=xhQi?(fB8i@Y(;eWgS zmVbYSes>z|9=e*XBOTv}b&Lm=N8}3d1Ya{1u1}zK$;FrfkEb5es-DC8TDn*9k@z*> zyf!_%z*ReE<+{@w{Fg6TFl%Ocu|3C-oS4Yqe2Is_`L+$AYX;tf+dC8OPEb_7dV^Y4+`!E|zA|b5<mQgbm`tq<3=H-J`z+eAA#Sh=esxap#w$4>t=_F^B-R@kPM;+8j^JxKIRTa@vU_0bu$idGZej}Kh?5~OoUM*! zjJHGC+tas^-{fE4(-F5R&^J`l(H-bOK~LY%V0>_(GcXY7?Clv03H^b-j-Fmse@{nf zXds~8JQToe2K$t_A5;$ndwbjc9UC=l(){gUNlLW`dV^czSeeYHZm>Vl(c|w$C;kC{ z2gV}|ZXUt}Bo2lKdNu|^-2=g)_1&7mq4vR!fu8FEpvA+-MoVAZqL literal 13238 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 WjZd4xJ#ZH*&x`vcvT`M+^M3#tu5=*) diff --git a/upload/admin/view/javascript/summernote/font/summernote.woff b/upload/admin/view/javascript/summernote/font/summernote.woff index 01b4e750b78754aa6009e94e403da1d63dc28df0..dfd4f6626b1045270b4cee325b8455c342c52d13 100644 GIT binary patch literal 7428 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' + html + ''); - + $('#modal-image').modal('show'); - + $('#modal-image').delegate('a.thumbnail', 'click', function(e) { e.preventDefault(); - + $(element).summernote('insertImage', $(this).attr('href')); $('#modal-image').modal('hide'); @@ -61,11 +81,10 @@ $(document).ready(function() { }); } }); - + return button.render(); } } }); }); - -}); +}); \ No newline at end of file diff --git a/upload/admin/view/javascript/summernote/plugin/databasic/summernote-ext-databasic.css b/upload/admin/view/javascript/summernote/plugin/databasic/summernote-ext-databasic.css new file mode 100644 index 0000000000..6232dde991 --- /dev/null +++ b/upload/admin/view/javascript/summernote/plugin/databasic/summernote-ext-databasic.css @@ -0,0 +1,16 @@ +.ext-databasic { + position: relative; + display: block; + min-height: 50px; + background-color: cyan; + text-align: center; + padding: 20px; + border: 1px solid white; + border-radius: 10px; +} + +.ext-databasic p { + color: white; + font-size: 1.2em; + margin: 0; +} diff --git a/upload/admin/view/javascript/summernote/plugin/databasic/summernote-ext-databasic.js b/upload/admin/view/javascript/summernote/plugin/databasic/summernote-ext-databasic.js new file mode 100644 index 0000000000..6e16c46e43 --- /dev/null +++ b/upload/admin/view/javascript/summernote/plugin/databasic/summernote-ext-databasic.js @@ -0,0 +1,291 @@ +(function(factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof module === 'object' && module.exports) { + // Node/CommonJS + module.exports = factory(require('jquery')); + } else { + // Browser globals + factory(window.jQuery); + } +}(function($) { + // pull in some summernote core functions + var ui = $.summernote.ui; + var dom = $.summernote.dom; + + // define the popover plugin + var DataBasicPlugin = function(context) { + var self = this; + var options = context.options; + var lang = options.langInfo; + + self.icon = ''; + + // add context menu button for dialog + context.memo('button.databasic', function() { + return ui.button({ + contents: self.icon, + tooltip: lang.databasic.insert, + click: context.createInvokeHandler('databasic.showDialog'), + }).render(); + }); + + // add popover edit button + context.memo('button.databasicDialog', function() { + return ui.button({ + contents: self.icon, + tooltip: lang.databasic.edit, + click: context.createInvokeHandler('databasic.showDialog'), + }).render(); + }); + + // add popover size buttons + context.memo('button.databasicSize100', function() { + return ui.button({ + contents: '100%', + tooltip: lang.image.resizeFull, + click: context.createInvokeHandler('editor.resize', '1'), + }).render(); + }); + context.memo('button.databasicSize50', function() { + return ui.button({ + contents: '50%', + tooltip: lang.image.resizeHalf, + click: context.createInvokeHandler('editor.resize', '0.5'), + }).render(); + }); + context.memo('button.databasicSize25', function() { + return ui.button({ + contents: '25%', + tooltip: lang.image.resizeQuarter, + click: context.createInvokeHandler('editor.resize', '0.25'), + }).render(); + }); + + self.events = { + 'summernote.init': function(we, e) { + // update existing containers + $('data.ext-databasic', e.editable).each(function() { self.setContent($(this)); }); + // TODO: make this an undo snapshot... + }, + 'summernote.keyup summernote.mouseup summernote.change summernote.scroll': function() { + self.update(); + }, + 'summernote.dialog.shown': function() { + self.hidePopover(); + }, + }; + + self.initialize = function() { + // create dialog markup + var $container = options.dialogsInBody ? $(document.body) : context.layoutInfo.editor; + + var body = '

' + + '' + + '' + + '
'; + var footer = ''; + + self.$dialog = ui.dialog({ + title: lang.databasic.name, + fade: options.dialogsFade, + body: body, + footer: footer, + }).render().appendTo($container); + + // create popover + self.$popover = ui.popover({ + className: 'ext-databasic-popover', + }).render().appendTo('body'); + var $content = self.$popover.find('.popover-content'); + + context.invoke('buttons.build', $content, options.popover.databasic); + }; + + self.destroy = function() { + self.$popover.remove(); + self.$popover = null; + self.$dialog.remove(); + self.$dialog = null; + }; + + self.update = function() { + // Prevent focusing on editable when invoke('code') is executed + if (!context.invoke('editor.hasFocus')) { + self.hidePopover(); + return; + } + + var rng = context.invoke('editor.createRange'); + var visible = false; + + if (rng.isOnData()) { + var $data = $(rng.sc).closest('data.ext-databasic'); + + if ($data.length) { + var pos = dom.posFromPlaceholder($data[0]); + + self.$popover.css({ + display: 'block', + left: pos.left, + top: pos.top, + }); + + // save editor target to let size buttons resize the container + context.invoke('editor.saveTarget', $data[0]); + + visible = true; + } + } + + // hide if not visible + if (!visible) { + self.hidePopover(); + } + }; + + self.hidePopover = function() { + self.$popover.hide(); + }; + + // define plugin dialog + self.getInfo = function() { + var rng = context.invoke('editor.createRange'); + + if (rng.isOnData()) { + var $data = $(rng.sc).closest('data.ext-databasic'); + + if ($data.length) { + // Get the first node on range(for edit). + return { + node: $data, + test: $data.attr('data-test'), + }; + } + } + + return {}; + }; + + self.setContent = function($node) { + $node.html('

' + self.icon + ' ' + lang.databasic.name + ': ' + + $node.attr('data-test') + '

'); + }; + + self.updateNode = function(info) { + self.setContent(info.node + .attr('data-test', info.test)); + }; + + self.createNode = function(info) { + var $node = $(''); + + if ($node) { + // save node to info structure + info.node = $node; + // insert node into editor dom + context.invoke('editor.insertNode', $node[0]); + } + + return $node; + }; + + self.showDialog = function() { + var info = self.getInfo(); + var newNode = !info.node; + context.invoke('editor.saveRange'); + + self + .openDialog(info) + .then(function(dialogInfo) { + // [workaround] hide dialog before restore range for IE range focus + ui.hideDialog(self.$dialog); + context.invoke('editor.restoreRange'); + + // insert a new node + if (newNode) { + self.createNode(info); + } + + // update info with dialog info + $.extend(info, dialogInfo); + + self.updateNode(info); + }) + .fail(function() { + context.invoke('editor.restoreRange'); + }); + }; + + self.openDialog = function(info) { + return $.Deferred(function(deferred) { + var $inpTest = self.$dialog.find('.ext-databasic-test'); + var $saveBtn = self.$dialog.find('.ext-databasic-save'); + var onKeyup = function(event) { + if (event.keyCode === 13) { + $saveBtn.trigger('click'); + } + }; + + ui.onDialogShown(self.$dialog, function() { + context.triggerEvent('dialog.shown'); + + $inpTest.val(info.test).on('input', function() { + ui.toggleBtn($saveBtn, $inpTest.val()); + }).trigger('focus').on('keyup', onKeyup); + + $saveBtn + .text(info.node ? lang.databasic.edit : lang.databasic.insert) + .click(function(event) { + event.preventDefault(); + + deferred.resolve({ test: $inpTest.val() }); + }); + + // init save button + ui.toggleBtn($saveBtn, $inpTest.val()); + }); + + ui.onDialogHidden(self.$dialog, function() { + $inpTest.off('input keyup'); + $saveBtn.off('click'); + + if (deferred.state() === 'pending') { + deferred.reject(); + } + }); + + ui.showDialog(self.$dialog); + }); + }; + }; + + // Extends summernote + $.extend(true, $.summernote, { + plugins: { + databasic: DataBasicPlugin, + }, + + options: { + popover: { + databasic: [ + ['databasic', ['databasicDialog', 'databasicSize100', 'databasicSize50', 'databasicSize25']], + ], + }, + }, + + // add localization texts + lang: { + 'en-US': { + databasic: { + name: 'Basic Data Container', + insert: 'insert basic data container', + edit: 'edit basic data container', + testLabel: 'test input', + }, + }, + }, + + }); +})); diff --git a/upload/admin/view/javascript/summernote/plugin/hello/summernote-ext-hello.js b/upload/admin/view/javascript/summernote/plugin/hello/summernote-ext-hello.js index 7c6434a447..f95d302fd5 100644 --- a/upload/admin/view/javascript/summernote/plugin/hello/summernote-ext-hello.js +++ b/upload/admin/view/javascript/summernote/plugin/hello/summernote-ext-hello.js @@ -1,5 +1,4 @@ -(function (factory) { - /* global define */ +(function(factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['jquery'], factory); @@ -10,15 +9,14 @@ // Browser globals factory(window.jQuery); } -}(function ($) { - +}(function($) { // Extends plugins for adding hello. // - plugin is external module for customizing. $.extend($.summernote.plugins, { /** * @param {Object} context - context object has status of editor. */ - 'hello': function (context) { + 'hello': function(context) { var self = this; // ui has renders to build ui elements. @@ -26,17 +24,17 @@ var ui = $.summernote.ui; // add hello button - context.memo('button.hello', function () { + context.memo('button.hello', function() { // create button var button = ui.button({ contents: ' Hello', tooltip: 'hello', - click: function () { + click: function() { self.$panel.show(); self.$panel.hide(500); // invoke insertText method with 'hello' on editor module. context.invoke('editor.insertText', 'hello'); - } + }, }); // create jQuery object from button instance. @@ -47,25 +45,27 @@ // This events will be attached when editor is initialized. this.events = { // This will be called after modules are initialized. - 'summernote.init': function (we, e) { + 'summernote.init': function(we, e) { + // eslint-disable-next-line console.log('summernote initialized', we, e); }, // This will be called when user releases a key on editable. - 'summernote.keyup': function (we, e) { + 'summernote.keyup': function(we, e) { + // eslint-disable-next-line console.log('summernote keyup', we, e); - } + }, }; // This method will be called when editor is initialized by $('..').summernote(); // You can create elements for plugin - this.initialize = function () { + this.initialize = function() { this.$panel = $('
').css({ position: 'absolute', width: 100, height: 100, left: '50%', top: '50%', - background: 'red' + background: 'red', }).hide(); this.$panel.appendTo('body'); @@ -73,10 +73,10 @@ // This methods will be called when editor is destroyed by $('..').summernote('destroy'); // You should remove elements on `initialize`. - this.destroy = function () { + this.destroy = function() { this.$panel.remove(); this.$panel = null; }; - } + }, }); })); diff --git a/upload/admin/view/javascript/summernote/plugin/specialchars/summernote-ext-specialchars.js b/upload/admin/view/javascript/summernote/plugin/specialchars/summernote-ext-specialchars.js index 41a08a2114..e5e5ed46ca 100644 --- a/upload/admin/view/javascript/summernote/plugin/specialchars/summernote-ext-specialchars.js +++ b/upload/admin/view/javascript/summernote/plugin/specialchars/summernote-ext-specialchars.js @@ -1,5 +1,4 @@ -(function (factory) { - /* global define */ +(function(factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['jquery'], factory); @@ -10,9 +9,9 @@ // Browser globals factory(window.jQuery); } -}(function ($) { +}(function($) { $.extend($.summernote.plugins, { - 'specialchars': function (context) { + 'specialchars': function(context) { var self = this; var ui = $.summernote.ui; @@ -25,12 +24,15 @@ DOWN: 40, LEFT: 37, RIGHT: 39, - ENTER: 13 + ENTER: 13, }; var COLUMN_LENGTH = 15; var COLUMN_WIDTH = 35; - var currentColumn, currentRow, totalColumn, totalRow = 0; + var currentColumn = 0; + var currentRow = 0; + var totalColumn = 0; + var totalRow = 0; // special characters data set var specialCharDataSet = [ @@ -58,16 +60,16 @@ '⊄', '⊆', '⊇', '⊕', '⊗', '⊥', '⋅', '⌈', '⌉', '⌊', '⌋', '◊', '♠', '♣', '♥', - '♦' + '♦', ]; - context.memo('button.specialCharacter', function () { + context.memo('button.specialchars', function() { return ui.button({ contents: '', tooltip: lang.specialChar.specialChar, - click: function () { + click: function() { self.show(); - } + }, }).render(); }); @@ -78,23 +80,23 @@ * @private * @return {jQuery} */ - this.makeSpecialCharSetTable = function () { + this.makeSpecialCharSetTable = function() { var $table = $(''); - $.each(specialCharDataSet, function (idx, text) { + $.each(specialCharDataSet, function(idx, text) { var $td = $('') : $table.find('tr').last(); var $button = ui.button({ - callback : function ($node) { + callback: function($node) { $node.html(text); $node.attr('title', text); $node.attr('data-value', encodeURIComponent(text)); $node.css({ width: COLUMN_WIDTH, - 'margin-right' : '2px', - 'margin-bottom' : '2px' + 'margin-right': '2px', + 'margin-bottom': '2px', }); - } + }, }).render(); $td.append($button); @@ -111,21 +113,21 @@ return $table; }; - this.initialize = function () { + this.initialize = function() { var $container = options.dialogsInBody ? $(document.body) : $editor; var body = '
' + this.makeSpecialCharSetTable()[0].outerHTML + '
'; this.$dialog = ui.dialog({ title: lang.specialChar.select, - body: body + body: body, }).render().appendTo($container); }; - this.show = function () { + this.show = function() { var text = context.invoke('editor.getSelectedText'); context.invoke('editor.saveRange'); - this.showSpecialCharDialog(text).then(function (selectChar) { + this.showSpecialCharDialog(text).then(function(selectChar) { context.invoke('editor.restoreRange'); // build node @@ -135,7 +137,7 @@ // insert video node context.invoke('editor.insertNode', $node); } - }).fail(function () { + }).fail(function() { context.invoke('editor.restoreRange'); }); }; @@ -146,8 +148,8 @@ * @param {jQuery} $dialog * @return {Promise} */ - this.showSpecialCharDialog = function (text) { - return $.Deferred(function (deferred) { + this.showSpecialCharDialog = function(text) { + return $.Deferred(function(deferred) { var $specialCharDialog = self.$dialog; var $specialCharNode = $specialCharDialog.find('.note-specialchar-node'); var $selectedNode = null; @@ -170,7 +172,7 @@ // find next node function findNextNode(row, column) { var findNode = null; - $.each($specialCharNode, function (idx, $node) { + $.each($specialCharNode, function(idx, $node) { var findRow = Math.ceil((idx + 1) / COLUMN_LENGTH); var findColumn = ((idx + 1) % COLUMN_LENGTH === 0) ? COLUMN_LENGTH : (idx + 1) % COLUMN_LENGTH; if (findRow === row && findColumn === column) { @@ -187,7 +189,6 @@ var lastRowColumnLength = $specialCharNode.length % totalColumn; if (KEY.LEFT === keyCode) { - if (currentColumn > 1) { currentColumn = currentColumn - 1; } else if (currentRow === 1 && currentColumn === 1) { @@ -197,9 +198,7 @@ currentColumn = totalColumn; currentRow = currentRow - 1; } - } else if (KEY.RIGHT === keyCode) { - if (currentRow === totalRow && lastRowColumnLength === currentColumn) { currentColumn = 1; currentRow = 1; @@ -209,7 +208,6 @@ currentColumn = 1; currentRow = currentRow + 1; } - } else if (KEY.UP === keyCode) { if (currentRow === 1 && lastRowColumnLength < currentColumn) { currentRow = totalRow - 1; @@ -281,22 +279,19 @@ } } - ui.onDialogShown(self.$dialog, function () { - + ui.onDialogShown(self.$dialog, function() { $(document).on('keydown', keyDownEventHandler); self.$dialog.find('button').tooltip(); - $specialCharNode.on('click', function (event) { + $specialCharNode.on('click', function(event) { event.preventDefault(); deferred.resolve(decodeURIComponent($(event.currentTarget).find('button').attr('data-value'))); ui.hideDialog(self.$dialog); }); - - }); - ui.onDialogHidden(self.$dialog, function () { + ui.onDialogHidden(self.$dialog, function() { $specialCharNode.off('click'); self.$dialog.find('button').tooltip('destroy'); @@ -311,6 +306,6 @@ ui.showDialog(self.$dialog); }); }; - } + }, }); })); diff --git a/upload/admin/view/javascript/summernote/summernote-image-attributes.js b/upload/admin/view/javascript/summernote/summernote-image-attributes.js new file mode 100644 index 0000000000..d41587f1e9 --- /dev/null +++ b/upload/admin/view/javascript/summernote/summernote-image-attributes.js @@ -0,0 +1,653 @@ +/** + * Summernote Image Attributes + * https://github.com/StudioJunkyard/summernote-image-attributes + */ +(function(factory){ + if(typeof define==='function'&&define.amd){ + define(['jquery'],factory); + }else if(typeof module==='object'&&module.exports){ + module.exports=factory(require('jquery')); + }else{ + factory(window.jQuery); + } +}(function($){ + var readFileAsDataURL=function(file){ + return $.Deferred(function(deferred){ + $.extend(new FileReader(),{ + onload:function(e){ + var sDataURL=e.target.result; + deferred.resolve(sDataURL); + }, + onerror:function(){ + deferred.reject(this); + } + }).readAsDataURL(file); + }).promise(); + }; + $.extend(true,$.summernote.lang,{ + 'en-US':{ /* English */ + imageAttributes:{ + dialogTitle:'Image Attributes', + tooltip:'Image Attributes', + pluginImageTitle:'Image Attributes', + pluginLinkTitle:'Link Attributes', + title:'Title', + src:'Source', + srcHelp:'Selecting an image will replace existing image with an Inlined Image.', + alt:'Alt', + class:'Class', + classSelect:'Select Class', + style:'Style', + role:'Role', + href:'URL', + target:'Target', + linkClass:'Class', + linkRole:'Role', + rel:'Rel', + relBlank:'Do not use Rel Attribute', + relAlternate:'Alternate: Links to an alternate version of the document', + relAuthor:'Author: Links to the Author of the Document', + relBookmark:'Bookmark: Permanent URL used for Bookmarking', + relHelp:'Help: Links to a Help Document', + relLicense:'License: Links to copyright information for the document', + relNext:'Next: The next document in a selection', + relNofollow:'NoFollow: Links to an unendorsed document, like a paid link, also stops Search Engines following this link', + relNoreferrer:'NoReferrer: Specifies that the browser should not send a HTTP Header', + relPrefetch:'PreFetch: Specifies that the target document should be cached', + relPrev:'Prev: The previous document in a selection', + relSearch:'Search: Links to a search tool for the document', + relTag:'Tag: A tag (Keyword) for the current document' + } + }, + 'es-ES':{ /* Spanish */ + imageAttributes:{ + dialogTitle:'Propiedades de la Imagen', + tooltip:'Propiedades de la Imagen', + pluginImageTitle:'Atributos de la Imagen', + pluginLinkTitle:'Atributos del Enlace', + title:'Titulo', + src:'Fuente', + srcHelp:'La selección de una imagen reemplazará la imagen existente con una imagen Inline.', + alt:'Alternativo', + class:'Clases', + classSelect:'Selecciona Forma', + style:'Estilo', + role:'Papel', + href:'URL', + target:'Destino', + linkClass:'Clase', + linkRole:'Papel', + rel:'Rel', + relBlank:'No usar atributo Rel', + relAlternate:'Alternate: Enlaza a una versión alternativa del documento', + relAuthor:'Author: Enlaza al autor del documento', + relBookmark:'Bookmark: URL permanente utilizada para enlazar', + relHelp:'Help: Enlaza a un documento de Ayuda', + relLicense:'License: Enlaza a un documento de información de Copyright', + relNext:'Next: Enlaza al siguiente documento en una selección', + relNofollow:'NoFollow: Enlaza a un documento no confirmado, como un enlace de pago, también evita que los buscadores sigan este enlace', + relNoreferrer:'NoReferrer: Specifies that the browser should not send a HTTP Header', + relPrefetch:'PreFetch: Specifies that the target document should be cached', + relPrev:'Prev: Enlaza al documento anterior en una selección', + relSearch:'Search: Enlaza a una herramienta de búsqueda para el documento', + relTag:'Tag: Un etiqueta (palabra clave) para el documento actual' + } + }, + 'pt-BR':{ /* Spanish */ + imageAttributes:{ + dialogTitle:'Propriedades da Imagem', + tooltip:'Propriedades da Imagem', + pluginImageTitle:'Propriedades da Imagem', + pluginLinkTitle:'Propriedades do Link', + title:'Título', + src:'Fonte', + srcHelp:'Selecionar uma imagem irá substituir a imagem existente com uma imagem inline.', + alt:'Alt', + class:'Class', + classSelect:'Selecione a Classe', + style:'Estilo', + role:'Papel', + href:'URL', + target:'Destino', + linkClass:'Classe', + linkRole:'Papel', + rel:'Rel', + relBlank:'Não use o atribudo Rel', + relAlternate:'Alternate: Links para uma versão alternativa do documento', + relAuthor:'Author: Links para o autor do documento', + relBookmark:'Bookmark: URL permanente usada para favoritos', + relHelp:'Help: Links para um documento de ajuda', + relLicense:'License: Links para a informação de copyright do documento', + relNext:'Next: O próximo documento em uma seleção', + relNofollow:'NoFollow: Links para um documento não confirmado, como um link pago, também impede mecanismos de busca de seguir esse link', + relNoreferrer:'NoReferrer: Especifica que o navegador não deve enviar um cabeçalho HTTP', + relPrefetch:'PreFetch: Especifica que o documento de destino deve ser cacheado', + relPrev:'Prev: O documento anterior em uma seleção', + relSearch:'Search: Links para um mecanismos de busca para o documento', + relTag:'Tag: Uma etiqueta (palavra-chave) para o documento atual' + } + }, + 'fr-FR':{ /* French */ + imageAttributes:{ + dialogTitle:'Attributs de l\'image', + tooltip:'Attributs de l\'image', + pluginImageTitle:'Attributs de l\'image', + pluginLinkTitle:'Attributs du lien', + title:'Titre', + src:'La source', + srcHelp:'La sélection d\'une image remplacera l\'image existante par une Image Inline.', + alt:'Alt', + class:'Class CSS', + classSelect:'Choisir une Class', + style:'Style', + role:'Rôle', + href:'URL', + target:'Cible', + linkClass:'Class CSS du lien', + linkRole:'Rôle', + rel:'Lien Rel', + relBlank:'Ne pas utiliser d\'attribut Rel', + relAlternate:'Alternate: Lien vers une autre version du document', + relAuthor:'Author: Lien vers l\'auteur du document', + relBookmark:'Bookmark: Lien permant utilisé pour les signets', + relHelp:'Help: Lien vers un document d\'aide', + relLicense:'License: Lien vers les informations de droits d\'auteur du document', + relNext:'Next: La page suivante de ce document', + relNofollow:'NoFollow: Empêcher les moteurs de recherche de suivre ce lien', + relNoreferrer:'NoReferrer: Précise que le navigateur ne doit pas envoyer d\'entête HTTP', + relPrefetch:'PreFetch: Précise que le document cible doit être mis en cache', + relPrev:'Prev: La page précédente de ce document', + relSearch:'Search: Lien vers un outil de recherche du document', + relTag:'Tag: Mot-clé du document' + } + }, + 'zh-TW':{ /* Chinese */ + imageAttributes:{ + dialogTitle:'圖片提示', + tooltip:'圖片提示', + pluginImageTitle:'圖片屬性', + pluginLinkTitle:'連結屬性', + title:'標題', + src:'資源', + srcHelp:'選擇圖像將用內聯圖像替換現有圖像.', + alt:'圖片說明', + class:'类', + classSelect:'選擇 类', + style:'样式', + role:'角色', + href:'URL', + target:'目標', + linkClass:'連結樣式', + linkRole:'角色', + rel:'描述', + relBlank:'不使用連結說明', + rel:'不使用鏈結說明', + relBlank:'不使用鏈結說明', + relAlternate:'替代說明: 連至替代說明文件', + relAuthor:'作者: 連至來源位置', + relBookmark:'書籤: 提供加入書籤', + relHelp:'幫助: 連結至幫助文件', + relLicense:'版權: 連結至版權宣告頁面', + relNext:'下一步: 連結至下一個被選擇的頁面', + relNofollow:'不追蹤: 連結設置取消追蹤選項, 例如付費頁面, 並且禁止搜尋引擎追蹤該頁面', + relNoreferrer:'NoReferrer: 指定發送時取消 HTTP 的開頭', + relPrefetch:'預存: 指定該頁面啟用預存瀏覽', + relPrev:'上一步: 上一個被選擇的頁面', + relSearch:'搜尋: 連至搜尋文件', + relTag:'標籤: 為該文件設定標籤(關鍵字)' + } + }, + 'it-IT':{ /* Italian */ + imageAttributes:{ + dialogTitle:'Attributi Immagine', + tooltip:'Attributi Immagine', + pluginImageTitle:'Attributi Immagine', + pluginLinkTitle:'Attributi Collegamento', + title:'Titolo', + src:'Fonte', + srcHelp:'elezione di un\'immagine sostituirà immagine esistente con un inline Immagine.', + alt:'Alt', + class:'Classe', + classSelect:'Seleziona Classe', + style:'Stile', + role:'Ruolo', + href:'URL', + target:'Bersaglio', + linkClass:'Classe per il collegamento', + linkRole:'Ruolo', + rel:'Link Rel', + relBlank:'Non usare attributo Rel', + relAlternate:'Alternate: Collegamento ad una versione alternativa del documento', + relAuthor:'Author: Collegamento all\'autore del documento', + relBookmark:'Bookmark: URL permanente per i preferiti', + relHelp:'Help: Collegamento ad una pagina di aiuto per questo documento', + relLicense:'License: Collegamento alle informazioni sul copyright di questo docuemnto', + relNext:'Next: Pagina successiva di questo documento', + relNofollow:'NoFollow: Impedisce ai motori di ricerca di seguire questo collegamento', + relNoreferrer:'NoReferrer: Specifica al browser di non inviare Header HTTP', + relPrefetch:'PreFetch: Specifica che il documento di destinazione deve essere memorizzato nella cache', + relPrev:'Prev: Pagina precedente di questo documento', + relSearch:'Search: Collegamenti a uno strumento di ricerca per questo documento', + relTag:'Tag: Un tag (parola chiave) per questo documento' + } + }, + 'de-DE':{ /* German */ + imageAttributes:{ + dialogTitle:'Bild Eigenschaften', + tooltip:'Bild Eigenschaften', + pluginImageTitle:'Bild Eigenschaften', + pluginLinkTitle:'Link Eigenschaften', + title:'Titel', + src:'Quelle', + srcHelp:'Wenn Sie ein Bild auswählen, wird das bestehende Bild durch ein Inlined Image ersetzt.', + alt:'Alt Tag', + class:'CSS Klasse', + classSelect:'wähle CSS Klasse', + style:'Stil', + role:'Rolle', + href:'URL', + target:'Ziel (target)', + linkClass:'CSS Link Klasse', + linkRole:'Ruolo', + rel:'Link Beziehung (Relation)', + relBlank:'Keine Link Beziehung', + relAlternate:'Alternate: Link zu einer alternativen Version', + relAuthor:'Author: Link zum Autor des Artikels', + relBookmark:'Bookmark: Permanent URL für Lesezeichen', + relHelp:'Help: Link zur Hilfe', + relLicense:'License: Link zu Urheber und Lizenzinformationen', + relNext:'Next: Die nächste aktive Seite', + relNofollow:'NoFollow: Suchmaschinen sollen dem Link nicht folgen', + relNoreferrer:'NoReferrer: Browser soll keinen HTTP Header senden', + relPrefetch:'PreFetch: Gibt an, dass die Seite gecacht werden soll', + relPrev:'Prev: Die zuletzt aktive Seite', + relSearch:'Search: Link zur Dokumentsuche', + relTag:'Tag: Ein Schlüsselwort (keyword) für diese Seite' + } + }, + 'tr-TR':{ /* Turkish */ + imageAttributes:{ + dialogTitle:'Resim Özellikleri', + tooltip:'Resim Özellikleri', + pluginImageTitle:'Resim Özellikleri', + pluginLinkTitle:'Bağlantı Özellikleri', + title:'Başlık', + src:'Kaynak', + srcHelp:'Bir görüntüyü seçmek, var olan resmi Inlined Image ile değiştirecektir.', + alt:'Alt. Metin', + class:'Sınıf', + classSelect:'Sınıf Seçin', + style:'Stil', + role:'Rol', + href:'URL', + target:'Hedef', + linkClass:'Bağlantı Sınıfı', + linkRole:'Rol', + rel:'Bağlantı İlişkisi(Rel)', + relBlank:'İlişki özelliğini kullanma', + relAlternate:'Alternatif: Belgenin farklı bir versiyonuna bağlantı', + relAuthor:'Yazar: Belgenin yazarına bağlantı', + relBookmark:'Yer İmi: Yer İmi eklemek için kalıcı adres', + relHelp:'Yardım: Yardım dökümanına giden bağlantı', + relLicense:'Lisans: Belgenin telif hakkı bilgisine bağlantı', + relNext:'Sonraki: Sıradaki belgeye giden bağlantı', + relNofollow:'Takip Etme (NoFollow): Arama motorlarının bu bağlantıyı takip etmemesini sağlar', + relNoreferrer:'Referanssız (NoReferrer): Tarayıcının bu bağlantıya referans adresi göndermemesi gerektiğini belirtir', + relPrefetch:'ÖnBellek(PreFetch): Hedef bağlantının ön belleğe alınması gerektiğini belirtir', + relPrev:'Önceki: Önceki belgeye giden bağlantı', + relSearch:'Arama: Belge için bir arama aracına bağlantı olduğunu belirtir.', + relTag:'Etiket: Belge için bir etiket olduğunu belirtir' + } + } + }); + $.extend($.summernote.options,{ + imageDialogLayout:'default', /* default|horizontal */ + imageAttributes:{ + icon:'', + removeEmpty:true, + }, + displayFields:{ + imageBasic:true, + imageExtra:false, + linkBasic:true, + linkExtra:false + } + }); + $.extend($.summernote.plugins,{ + 'imageAttributes':function(context){ + var self=this; + var ui=$.summernote.ui; + var $note=context.layoutInfo.note; + var $editor=context.layoutInfo.editor; + var $editable=context.layoutInfo.editable; + var options=context.options; + var lang=options.langInfo; + var imageLimitation=''; + if(options.maximumImageFileSize){ + var unit=Math.floor(Math.log(options.maximumImageFileSize)/Math.log(1024)); + var readableSize=(options.maximumImageFileSize/Math.pow(1024,unit)).toFixed(2)*1+' '+' KMGTP'[unit]+'B'; + imageLimitation=''+lang.image.maximumFileSize+' : '+readableSize+''; + } + context.memo('button.imageAttributes',function(){ + var button=ui.button({ + contents:options.imageAttributes.icon, + tooltip:lang.imageAttributes.tooltip, + click:function(e){ + context.invoke('imageAttributes.show'); + } + }); + return button.render(); + }); + this.initialize=function(){ + var $container=options.dialogsInBody?$(document.body):$editor; + if(options.imageDialogLayout=='horizontal'){ + var body='
'; + if (options.displayFields.imageBasic) { + body += '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
'+imageLimitation+'
'+ + '
'+ + '
'+lang.imageAttributes.srcHelp+'
'+ + '
'+ + '
'; + } + if (options.displayFields.imageExtra) { + body += '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
'; + } + body += '
'+ + '
'; + if (options.displayFields.linkBasic) { + body += '

'+lang.imageAttributes.pluginLinkTitle+'

'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
'; + } + if (options.displayFields.linkExtra) { + body += '
'+ + '
'+ + '
'+ + '
'+ + '
'+ + '
'; + } + body += '
'; + }else{ + var body='
'; + if (options.displayFields.imageBasic) { + body += ''+ + '
'+ + ''+ + '
'+ + '
'+ + '
'+ + ''+ + '
'+ + ''+ + '
'+ + '
'+ + '
'+ + ''+ + '
'+ + ''+imageLimitation+ + ''+lang.imageAttributes.srcHelp+''+ + '
'+ + '
'+ + '
'+ + ''+ + '
'+ + ''+ + '
'+ + '
'; + } + if (options.displayFields.imageExtra) { + body += '
'+ + ''+ + '
'+ + ''+ + '
'+ + '
'+ + '
'+ + ''+ + '
'+ + ''+ + '
'+ + '
'+ + '
'+ + ''+ + '
'+ + ''+ + '
'+ + '
'; + } + if (options.displayFields.linkBasic || options.displayFields.linkExtra) { + body += '

'+lang.imageAttributes.pluginLinkTitle+'

'+ + '
'; + } + if (options.displayFields.linkBasic) { + body += '
'+ + ''+ + '
'+ + ''+ + '
'+ + '
'+ + '
'+ + ''+ + '
'+ + ''+ + '
'+ + '
'; + } + if (options.displayFields.linkExtra) { + body += '
'+ + ''+ + '
'+ + ''+ + '
'+ + '
'+ + '
'+ + ''+ + '
'+ + ''+ + '
'+ + '
'+ + '
'+ + ''+ + '
'+ + ''+ + '
'+ + '
'; + } + } + this.$dialog=ui.dialog({ + title:lang.imageAttributes.dialogTitle, + body:body, + footer:'' + }).render().appendTo($container); + }; + this.destroy=function(){ + ui.hideDialog(this.$dialog); + this.$dialog.remove(); + }; + this.bindEnterKey=function($input,$btn){ + $input.on('keypress',function(event){ + if(event.keyCode===13)$btn.trigger('click'); + }); + }; + this.bindLabels=function(){ + self.$dialog.find('.form-control:first').focus().select(); + self.$dialog.find('label').on('click',function(){ + $(this).parent().find('.form-control:first').focus(); + }); + }; + this.show=function(){ + var $img=$($editable.data('target')); + var imgInfo={ + imgDom:$img, + title:$img.attr('title'), + src:$img.attr('src'), + alt:$img.attr('alt'), + role:$img.attr('role'), + class:$img.attr('class'), + style:$img.attr('style'), + imgLink:$($img.context).parent().is("a")?$($img.context).parent():null + }; + this.showLinkDialog(imgInfo) + .then(function(imgInfo){ + ui.hideDialog(self.$dialog); + var $img=imgInfo.imgDom; + if(options.imageAttributes.removeEmpty){ + if(imgInfo.alt)$img.attr('alt',imgInfo.alt);else $img.removeAttr('alt'); + if(imgInfo.title)$img.attr('title',imgInfo.title);else $img.removeAttr('title'); + if(imgInfo.src)$img.attr('src',imgInfo.src);else $img.attr('src', '#'); + if(imgInfo.class)$img.attr('class',imgInfo.class);else $img.removeAttr('class'); + if(imgInfo.style)$img.attr('style',imgInfo.style);else $img.removeAttr('style'); + if(imgInfo.role)$img.attr('role',imgInfo.role);else $img.removeAttr('role'); + }else{ + $img.attr('alt',imgInfo.alt); + $img.attr('title',imgInfo.title); + $img.attr('class',imgInfo.class); + $img.attr('style',imgInfo.style); + $img.attr('role',imgInfo.role); + } + if($img.parent().is("a"))$img.unwrap(); + var hrefRegex=new RegExp(/(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/gi); + if(imgInfo.href.match(hrefRegex)){ + var lnktxt='.btn-group,.panel-heading.note-toolbar>.btn-group{margin-top:5px;margin-right:5px;margin-left:0}.note-popover .popover-content .btn-group .note-table,.panel-heading.note-toolbar .btn-group .note-table{min-width:0;padding:5px}.note-popover .popover-content .btn-group .note-table .note-dimension-picker,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker{font-size:18px}.note-popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher{position:absolute!important;z-index:3;width:10em;height:10em;cursor:pointer}.note-popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted{position:relative!important;z-index:1;width:5em;height:5em;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC') repeat}.note-popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted{position:absolute!important;z-index:2;width:1em;height:1em;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC') repeat}.note-popover .popover-content .note-style h1,.panel-heading.note-toolbar .note-style h1,.note-popover .popover-content .note-style h2,.panel-heading.note-toolbar .note-style h2,.note-popover .popover-content .note-style h3,.panel-heading.note-toolbar .note-style h3,.note-popover .popover-content .note-style h4,.panel-heading.note-toolbar .note-style h4,.note-popover .popover-content .note-style h5,.panel-heading.note-toolbar .note-style h5,.note-popover .popover-content .note-style h6,.panel-heading.note-toolbar .note-style h6,.note-popover .popover-content .note-style blockquote,.panel-heading.note-toolbar .note-style blockquote{margin:0}.note-popover .popover-content .note-color .dropdown-toggle,.panel-heading.note-toolbar .note-color .dropdown-toggle{width:20px;padding-left:5px}.note-popover .popover-content .note-color .dropdown-menu,.panel-heading.note-toolbar .note-color .dropdown-menu{min-width:340px}.note-popover .popover-content .note-color .dropdown-menu .btn-group,.panel-heading.note-toolbar .note-color .dropdown-menu .btn-group{margin:0}.note-popover .popover-content .note-color .dropdown-menu .btn-group:first-child,.panel-heading.note-toolbar .note-color .dropdown-menu .btn-group:first-child{margin:0 5px}.note-popover .popover-content .note-color .dropdown-menu .btn-group .note-palette-title,.panel-heading.note-toolbar .note-color .dropdown-menu .btn-group .note-palette-title{margin:2px 7px;font-size:12px;text-align:center;border-bottom:1px solid #eee}.note-popover .popover-content .note-color .dropdown-menu .btn-group .note-color-reset,.panel-heading.note-toolbar .note-color .dropdown-menu .btn-group .note-color-reset{width:100%;padding:0 3px;margin:3px;font-size:11px;cursor:pointer;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.note-popover .popover-content .note-color .dropdown-menu .btn-group .note-color-row,.panel-heading.note-toolbar .note-color .dropdown-menu .btn-group .note-color-row{height:20px}.note-popover .popover-content .note-color .dropdown-menu .btn-group .note-color-reset:hover,.panel-heading.note-toolbar .note-color .dropdown-menu .btn-group .note-color-reset:hover{background:#eee}.note-popover .popover-content .note-para .dropdown-menu,.panel-heading.note-toolbar .note-para .dropdown-menu{min-width:216px;padding:5px}.note-popover .popover-content .note-para .dropdown-menu>div:first-child,.panel-heading.note-toolbar .note-para .dropdown-menu>div:first-child{margin-right:5px}.note-popover .popover-content .dropdown-menu,.panel-heading.note-toolbar .dropdown-menu{min-width:90px}.note-popover .popover-content .dropdown-menu.right,.panel-heading.note-toolbar .dropdown-menu.right{right:0;left:auto}.note-popover .popover-content .dropdown-menu.right::before,.panel-heading.note-toolbar .dropdown-menu.right::before{right:9px;left:auto!important}.note-popover .popover-content .dropdown-menu.right::after,.panel-heading.note-toolbar .dropdown-menu.right::after{right:10px;left:auto!important}.note-popover .popover-content .dropdown-menu.note-check li a i,.panel-heading.note-toolbar .dropdown-menu.note-check li a i{color:deepskyblue;visibility:hidden}.note-popover .popover-content .dropdown-menu.note-check li a.checked i,.panel-heading.note-toolbar .dropdown-menu.note-check li a.checked i{visibility:visible}.note-popover .popover-content .note-fontsize-10,.panel-heading.note-toolbar .note-fontsize-10{font-size:10px}.note-popover .popover-content .note-color-palette,.panel-heading.note-toolbar .note-color-palette{line-height:1}.note-popover .popover-content .note-color-palette div .note-color-btn,.panel-heading.note-toolbar .note-color-palette div .note-color-btn{width:20px;height:20px;padding:0;margin:0;border:1px solid #fff}.note-popover .popover-content .note-color-palette div .note-color-btn:hover,.panel-heading.note-toolbar .note-color-palette div .note-color-btn:hover{border:1px solid #000}.note-dialog>div{display:none}.note-dialog .form-group{margin-right:0;margin-left:0}.note-dialog .note-modal-form{margin:0}.note-dialog .note-image-dialog .note-dropzone{min-height:100px;margin-bottom:10px;font-size:30px;line-height:4;color:lightgray;text-align:center;border:4px dashed lightgray}@-moz-document url-prefix(){.note-image-input{height:auto}}.note-placeholder{position:absolute;display:none;color:gray}.note-handle .note-control-selection{position:absolute;display:none;border:1px solid black}.note-handle .note-control-selection>div{position:absolute}.note-handle .note-control-selection .note-control-selection-bg{width:100%;height:100%;background-color:black;-webkit-opacity:.3;-khtml-opacity:.3;-moz-opacity:.3;opacity:.3;-ms-filter:alpha(opacity=30);filter:alpha(opacity=30)}.note-handle .note-control-selection .note-control-handle{width:7px;height:7px;border:1px solid black}.note-handle .note-control-selection .note-control-holder{width:7px;height:7px;border:1px solid black}.note-handle .note-control-selection .note-control-sizing{width:7px;height:7px;background-color:white;border:1px solid black}.note-handle .note-control-selection .note-control-nw{top:-5px;left:-5px;border-right:0;border-bottom:0}.note-handle .note-control-selection .note-control-ne{top:-5px;right:-5px;border-bottom:0;border-left:none}.note-handle .note-control-selection .note-control-sw{bottom:-5px;left:-5px;border-top:0;border-right:0}.note-handle .note-control-selection .note-control-se{right:-5px;bottom:-5px;cursor:se-resize}.note-handle .note-control-selection .note-control-se.note-control-holder{cursor:default;border-top:0;border-left:none}.note-handle .note-control-selection .note-control-selection-info{right:0;bottom:0;padding:5px;margin:5px;font-size:12px;color:white;background-color:black;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-opacity:.7;-khtml-opacity:.7;-moz-opacity:.7;opacity:.7;-ms-filter:alpha(opacity=70);filter:alpha(opacity=70)}.note-hint-popover{min-width:100px;padding:2px}.note-hint-popover .popover-content{max-height:150px;padding:3px;overflow:auto}.note-hint-popover .popover-content .note-hint-group .note-hint-item{display:block!important;padding:3px}.note-hint-popover .popover-content .note-hint-group .note-hint-item.active,.note-hint-popover .popover-content .note-hint-group .note-hint-item:hover{display:block;clear:both;font-weight:400;line-height:1.4;color:white;text-decoration:none;white-space:nowrap;cursor:pointer;background-color:#428bca;outline:0} \ No newline at end of file +/*! + * + * Super simple wysiwyg editor v0.8.18 + * https://summernote.org + * + * + * Copyright 2013- Alan Hong. and other contributors + * summernote may be freely distributed under the MIT license. + * + * Date: 2020-05-20T18:09Z + * + */ +@font-face{font-family:"summernote";font-style:normal;font-weight:400;font-display:auto;src:url(font/summernote.eot);src:url(font/summernote.eot?#iefix) format("embedded-opentype"),url(font/summernote.woff2) format("woff2"),url(font/summernote.woff) format("woff"),url(font/summernote.ttf) format("truetype")}[class^=note-icon]:before,[class*=" note-icon"]:before{display:inline-block;font-family:summernote;font-style:normal;font-size:inherit;text-decoration:inherit;text-rendering:auto;text-transform:none;vertical-align:middle;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;speak:none}.note-icon-fw{text-align:center;width:1.25em}.note-icon-border{border:solid .08em #eee;border-radius:.1em;padding:.2em .25em .15em}.note-icon-pull-left{float:left}.note-icon-pull-right{float:right}.note-icon.note-icon-pull-left{margin-right:.3em}.note-icon.note-icon-pull-right{margin-left:.3em}.note-icon-align::before{content:""}.note-icon-align-center::before{content:""}.note-icon-align-indent::before{content:""}.note-icon-align-justify::before{content:""}.note-icon-align-left::before{content:""}.note-icon-align-outdent::before{content:""}.note-icon-align-right::before{content:""}.note-icon-arrow-circle-down::before{content:""}.note-icon-arrow-circle-left::before{content:""}.note-icon-arrow-circle-right::before{content:""}.note-icon-arrow-circle-up::before{content:""}.note-icon-arrows-alt::before{content:""}.note-icon-arrows-h::before{content:""}.note-icon-arrows-v::before{content:""}.note-icon-bold::before{content:""}.note-icon-caret::before{content:""}.note-icon-chain-broken::before{content:""}.note-icon-circle::before{content:""}.note-icon-close::before{content:""}.note-icon-code::before{content:""}.note-icon-col-after::before{content:""}.note-icon-col-before::before{content:""}.note-icon-col-remove::before{content:""}.note-icon-eraser::before{content:""}.note-icon-float-left::before{content:""}.note-icon-float-none::before{content:""}.note-icon-float-right::before{content:""}.note-icon-font::before{content:""}.note-icon-frame::before{content:""}.note-icon-italic::before{content:""}.note-icon-link::before{content:""}.note-icon-magic::before{content:""}.note-icon-menu-check::before{content:""}.note-icon-minus::before{content:""}.note-icon-orderedlist::before{content:""}.note-icon-pencil::before{content:""}.note-icon-picture::before{content:""}.note-icon-question::before{content:""}.note-icon-redo::before{content:""}.note-icon-rollback::before{content:""}.note-icon-row-above::before{content:""}.note-icon-row-below::before{content:""}.note-icon-row-remove::before{content:""}.note-icon-special-character::before{content:""}.note-icon-square::before{content:""}.note-icon-strikethrough::before{content:""}.note-icon-subscript::before{content:""}.note-icon-summernote::before{content:""}.note-icon-superscript::before{content:""}.note-icon-table::before{content:""}.note-icon-text-height::before{content:""}.note-icon-trash::before{content:""}.note-icon-underline::before{content:""}.note-icon-undo::before{content:""}.note-icon-unorderedlist::before{content:""}.note-icon-video::before{content:""}.note-editor{position:relative}.note-editor .note-dropzone{position:absolute;display:none;z-index:100;color:#87cefa;background-color:#fff;opacity:.95}.note-editor .note-dropzone .note-dropzone-message{display:table-cell;vertical-align:middle;text-align:center;font-size:28px;font-weight:700}.note-editor .note-dropzone.hover{color:#098ddf}.note-editor.dragover .note-dropzone{display:table}.note-editor .note-editing-area{position:relative}.note-editor .note-editing-area .note-editable{outline:none}.note-editor .note-editing-area .note-editable sup{vertical-align:super}.note-editor .note-editing-area .note-editable sub{vertical-align:sub}.note-editor .note-editing-area .note-editable img.note-float-left{margin-right:10px}.note-editor .note-editing-area .note-editable img.note-float-right{margin-left:10px}.note-editor.note-frame,.note-editor.note-airframe{border:1px solid #00000032}.note-editor.note-frame.codeview .note-editing-area .note-editable,.note-editor.note-airframe.codeview .note-editing-area .note-editable{display:none}.note-editor.note-frame.codeview .note-editing-area .note-codable,.note-editor.note-airframe.codeview .note-editing-area .note-codable{display:block}.note-editor.note-frame .note-editing-area,.note-editor.note-airframe .note-editing-area{overflow:hidden}.note-editor.note-frame .note-editing-area .note-editable,.note-editor.note-airframe .note-editing-area .note-editable{padding:10px;overflow:auto;word-wrap:break-word}.note-editor.note-frame .note-editing-area .note-editable[contenteditable=false],.note-editor.note-airframe .note-editing-area .note-editable[contenteditable=false]{background-color:#8080801d}.note-editor.note-frame .note-editing-area .note-codable,.note-editor.note-airframe .note-editing-area .note-codable{display:none;width:100%;padding:10px;border:none;box-shadow:none;font-family:Menlo,Monaco,monospace,sans-serif;font-size:14px;color:#ccc;background-color:#222;resize:none;outline:none;-ms-box-sizing:border-box;box-sizing:border-box;border-radius:0;margin-bottom:0}.note-editor.note-frame.fullscreen,.note-editor.note-airframe.fullscreen{position:fixed;top:0;left:0;width:100% !important;z-index:1050}.note-editor.note-frame.fullscreen .note-resizebar,.note-editor.note-airframe.fullscreen .note-resizebar{display:none}.note-editor.note-frame .note-status-output,.note-editor.note-airframe .note-status-output{display:block;width:100%;font-size:14px;line-height:1.42857143;height:20px;margin-bottom:0;color:#000;border:0;border-top:1px solid #e2e2e2}.note-editor.note-frame .note-status-output:empty,.note-editor.note-airframe .note-status-output:empty{height:0;border-top:0 solid transparent}.note-editor.note-frame .note-status-output .pull-right,.note-editor.note-airframe .note-status-output .pull-right{float:right !important}.note-editor.note-frame .note-status-output .text-muted,.note-editor.note-airframe .note-status-output .text-muted{color:#777}.note-editor.note-frame .note-status-output .text-primary,.note-editor.note-airframe .note-status-output .text-primary{color:#286090}.note-editor.note-frame .note-status-output .text-success,.note-editor.note-airframe .note-status-output .text-success{color:#3c763d}.note-editor.note-frame .note-status-output .text-info,.note-editor.note-airframe .note-status-output .text-info{color:#31708f}.note-editor.note-frame .note-status-output .text-warning,.note-editor.note-airframe .note-status-output .text-warning{color:#8a6d3b}.note-editor.note-frame .note-status-output .text-danger,.note-editor.note-airframe .note-status-output .text-danger{color:#a94442}.note-editor.note-frame .note-status-output .alert,.note-editor.note-airframe .note-status-output .alert{margin:-7px 0 0 0;padding:7px 10px 2px 10px;border-radius:0;color:#000;background-color:#f5f5f5}.note-editor.note-frame .note-status-output .alert .note-icon,.note-editor.note-airframe .note-status-output .alert .note-icon{margin-right:5px}.note-editor.note-frame .note-status-output .alert-success,.note-editor.note-airframe .note-status-output .alert-success{color:#3c763d !important;background-color:#dff0d8 !important}.note-editor.note-frame .note-status-output .alert-info,.note-editor.note-airframe .note-status-output .alert-info{color:#31708f !important;background-color:#d9edf7 !important}.note-editor.note-frame .note-status-output .alert-warning,.note-editor.note-airframe .note-status-output .alert-warning{color:#8a6d3b !important;background-color:#fcf8e3 !important}.note-editor.note-frame .note-status-output .alert-danger,.note-editor.note-airframe .note-status-output .alert-danger{color:#a94442 !important;background-color:#f2dede !important}.note-editor.note-frame .note-statusbar,.note-editor.note-airframe .note-statusbar{background-color:#8080801d;border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top:1px solid #00000032}.note-editor.note-frame .note-statusbar .note-resizebar,.note-editor.note-airframe .note-statusbar .note-resizebar{padding-top:1px;height:9px;width:100%;cursor:ns-resize}.note-editor.note-frame .note-statusbar .note-resizebar .note-icon-bar,.note-editor.note-airframe .note-statusbar .note-resizebar .note-icon-bar{width:20px;margin:1px auto;border-top:1px solid #00000032}.note-editor.note-frame .note-statusbar.locked .note-resizebar,.note-editor.note-airframe .note-statusbar.locked .note-resizebar{cursor:default}.note-editor.note-frame .note-statusbar.locked .note-resizebar .note-icon-bar,.note-editor.note-airframe .note-statusbar.locked .note-resizebar .note-icon-bar{display:none}.note-editor.note-frame .note-placeholder,.note-editor.note-airframe .note-placeholder{padding:10px}.note-editor.note-airframe{border:0}.note-editor.note-airframe .note-editing-area .note-editable{padding:0}.note-popover.popover{display:none;max-width:none}.note-popover.popover .popover-content a{display:inline-block;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.note-popover.popover .arrow{left:20px !important}.note-toolbar{position:relative}.note-popover .popover-content,.note-editor .note-toolbar{margin:0;padding:0 0 5px 5px}.note-popover .popover-content>.note-btn-group,.note-editor .note-toolbar>.note-btn-group{margin-top:5px;margin-left:0;margin-right:5px}.note-popover .popover-content .note-btn-group .note-table,.note-editor .note-toolbar .note-btn-group .note-table{min-width:0;padding:5px}.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker,.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker{font-size:18px}.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher,.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher{position:absolute !important;z-index:3;width:10em;height:10em;cursor:pointer}.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted,.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted{position:relative !important;z-index:1;width:5em;height:5em;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat}.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted,.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted{position:absolute !important;z-index:2;width:1em;height:1em;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat}.note-popover .popover-content .note-style .dropdown-style blockquote,.note-popover .popover-content .note-style .dropdown-style pre,.note-editor .note-toolbar .note-style .dropdown-style blockquote,.note-editor .note-toolbar .note-style .dropdown-style pre{margin:0;padding:5px 10px}.note-popover .popover-content .note-style .dropdown-style h1,.note-popover .popover-content .note-style .dropdown-style h2,.note-popover .popover-content .note-style .dropdown-style h3,.note-popover .popover-content .note-style .dropdown-style h4,.note-popover .popover-content .note-style .dropdown-style h5,.note-popover .popover-content .note-style .dropdown-style h6,.note-popover .popover-content .note-style .dropdown-style p,.note-editor .note-toolbar .note-style .dropdown-style h1,.note-editor .note-toolbar .note-style .dropdown-style h2,.note-editor .note-toolbar .note-style .dropdown-style h3,.note-editor .note-toolbar .note-style .dropdown-style h4,.note-editor .note-toolbar .note-style .dropdown-style h5,.note-editor .note-toolbar .note-style .dropdown-style h6,.note-editor .note-toolbar .note-style .dropdown-style p{margin:0;padding:0}.note-popover .popover-content .note-color-all .note-dropdown-menu,.note-editor .note-toolbar .note-color-all .note-dropdown-menu{min-width:337px}.note-popover .popover-content .note-color .dropdown-toggle,.note-editor .note-toolbar .note-color .dropdown-toggle{width:20px;padding-left:5px}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette{display:inline-block;margin:0;width:160px}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette:first-child,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette:first-child{margin:0 5px}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-palette-title,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-palette-title{font-size:12px;margin:2px 7px;text-align:center;border-bottom:1px solid #eee}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select{font-size:11px;margin:3px;padding:0 3px;cursor:pointer;width:100%;border-radius:5px}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset:hover,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select:hover,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset:hover,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select:hover{background:#eee}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-row,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-row{height:20px}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select-btn,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select-btn{display:none}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn{border:1px solid #eee}.note-popover .popover-content .note-para .note-dropdown-menu,.note-editor .note-toolbar .note-para .note-dropdown-menu{min-width:228px;padding:5px}.note-popover .popover-content .note-para .note-dropdown-menu>div+div,.note-editor .note-toolbar .note-para .note-dropdown-menu>div+div{margin-left:5px}.note-popover .popover-content .note-dropdown-menu,.note-editor .note-toolbar .note-dropdown-menu{min-width:160px}.note-popover .popover-content .note-dropdown-menu.right,.note-editor .note-toolbar .note-dropdown-menu.right{right:0;left:auto}.note-popover .popover-content .note-dropdown-menu.right::before,.note-editor .note-toolbar .note-dropdown-menu.right::before{right:9px;left:auto !important}.note-popover .popover-content .note-dropdown-menu.right::after,.note-editor .note-toolbar .note-dropdown-menu.right::after{right:10px;left:auto !important}.note-popover .popover-content .note-dropdown-menu.note-check a i,.note-editor .note-toolbar .note-dropdown-menu.note-check a i{color:#00bfff;visibility:hidden}.note-popover .popover-content .note-dropdown-menu.note-check a.checked i,.note-editor .note-toolbar .note-dropdown-menu.note-check a.checked i{visibility:visible}.note-popover .popover-content .note-fontsize-10,.note-editor .note-toolbar .note-fontsize-10{font-size:10px}.note-popover .popover-content .note-color-palette,.note-editor .note-toolbar .note-color-palette{line-height:1}.note-popover .popover-content .note-color-palette div .note-color-btn,.note-editor .note-toolbar .note-color-palette div .note-color-btn{width:20px;height:20px;padding:0;margin:0;border:0;border-radius:0}.note-popover .popover-content .note-color-palette div .note-color-btn:hover,.note-editor .note-toolbar .note-color-palette div .note-color-btn:hover{transform:scale(1.2);transition:all .2s}.note-modal .modal-dialog{outline:0;border-radius:5px;box-shadow:0 3px 9px rgba(0,0,0,.5)}.note-modal .form-group{margin-left:0;margin-right:0}.note-modal .note-modal-form{margin:0}.note-modal .note-image-dialog .note-dropzone{min-height:100px;font-size:30px;line-height:4;color:#d3d3d3;text-align:center;border:4px dashed #d3d3d3;margin-bottom:10px}@-moz-document url-prefix(){.note-modal .note-image-input{height:auto}}.note-placeholder{position:absolute;display:none;color:gray}.note-handle .note-control-selection{position:absolute;display:none;border:1px solid #000}.note-handle .note-control-selection>div{position:absolute}.note-handle .note-control-selection .note-control-selection-bg{width:100%;height:100%;background-color:#000;-webkit-opacity:.3;-khtml-opacity:.3;-moz-opacity:.3;opacity:.3;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);filter:alpha(opacity=30)}.note-handle .note-control-selection .note-control-handle,.note-handle .note-control-selection .note-control-sizing,.note-handle .note-control-selection .note-control-holder{width:7px;height:7px;border:1px solid #000}.note-handle .note-control-selection .note-control-sizing{background-color:#000}.note-handle .note-control-selection .note-control-nw{top:-5px;left:-5px;border-right:none;border-bottom:none}.note-handle .note-control-selection .note-control-ne{top:-5px;right:-5px;border-bottom:none;border-left:none}.note-handle .note-control-selection .note-control-sw{bottom:-5px;left:-5px;border-top:none;border-right:none}.note-handle .note-control-selection .note-control-se{right:-5px;bottom:-5px;cursor:se-resize}.note-handle .note-control-selection .note-control-se.note-control-holder{cursor:default;border-top:none;border-left:none}.note-handle .note-control-selection .note-control-selection-info{right:0;bottom:0;padding:5px;margin:5px;color:#fff;background-color:#000;font-size:12px;border-radius:5px;-webkit-opacity:.7;-khtml-opacity:.7;-moz-opacity:.7;opacity:.7;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=70);filter:alpha(opacity=70)}.note-hint-popover{min-width:100px;padding:2px}.note-hint-popover .popover-content{padding:3px;max-height:150px;overflow:auto}.note-hint-popover .popover-content .note-hint-group .note-hint-item{display:block !important;padding:3px}.note-hint-popover .popover-content .note-hint-group .note-hint-item.active,.note-hint-popover .popover-content .note-hint-group .note-hint-item:hover{display:block;clear:both;font-weight:400;line-height:1.4;color:#fff;white-space:nowrap;text-decoration:none;background-color:#428bca;outline:0;cursor:pointer} diff --git a/upload/admin/view/javascript/summernote/summernote.js b/upload/admin/view/javascript/summernote/summernote.js index 8d152f5b92..d0bbf4cc68 100644 --- a/upload/admin/view/javascript/summernote/summernote.js +++ b/upload/admin/view/javascript/summernote/summernote.js @@ -1,3832 +1,5745 @@ -/** - * Super simple wysiwyg editor v0.8.1 - * http://summernote.org/ - * - * summernote.js - * Copyright 2013-2015 Alan Hong. and other contributors - * summernote may be freely distributed under the MIT license./ - * - * Date: 2016-02-15T18:35Z +/*! + * + * Super simple wysiwyg editor v0.8.18 + * https://summernote.org + * + * + * Copyright 2013- Alan Hong. and other contributors + * summernote may be freely distributed under the MIT license. + * + * Date: 2020-05-20T18:09Z + * */ -(function (factory) { - /* global define */ - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(['jquery'], factory); - } else if (typeof module === 'object' && module.exports) { - // Node/CommonJS - module.exports = factory(require('jquery')); - } else { - // Browser globals - factory(window.jQuery); +(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 = 52); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ 0: +/***/ (function(module, exports) { + +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__); +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); } + +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; } + + + +var Renderer = /*#__PURE__*/function () { + function Renderer(markup, children, options, callback) { + _classCallCheck(this, Renderer); + + this.markup = markup; + this.children = children; + this.options = options; + this.callback = callback; } -}(function ($) { - 'use strict'; - /** - * @class core.func - * - * func utils (for high-order func's arg) - * - * @singleton - * @alternateClassName func - */ - var func = (function () { - var eq = function (itemA) { - return function (itemB) { - return itemA === itemB; - }; - }; + _createClass(Renderer, [{ + key: "render", + value: function render($parent) { + var $node = jquery__WEBPACK_IMPORTED_MODULE_0___default()(this.markup); - var eq2 = function (itemA, itemB) { - return itemA === itemB; - }; + if (this.options && this.options.contents) { + $node.html(this.options.contents); + } - var peq2 = function (propName) { - return function (itemA, itemB) { - return itemA[propName] === itemB[propName]; - }; - }; + if (this.options && this.options.className) { + $node.addClass(this.options.className); + } - var ok = function () { - return true; - }; + 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); + }); + } - var fail = function () { - return false; - }; + if (this.options && this.options.click) { + $node.on('click', this.options.click); + } - var not = function (f) { - return function () { - return !f.apply(f, arguments); - }; - }; + if (this.children) { + var $container = $node.find('.note-children-container'); + this.children.forEach(function (child) { + child.render($container.length ? $container : $node); + }); + } - var and = function (fA, fB) { - return function (item) { - return fA(item) && fB(item); - }; - }; + if (this.callback) { + this.callback($node, this.options); + } - var self = function (a) { - return a; - }; + if (this.options && this.options.callback) { + this.options.callback($node); + } - var invoke = function (obj, method) { - return function () { - return obj[method].apply(obj, arguments); - }; - }; + if ($parent) { + $parent.append($node); + } - var idCounter = 0; + return $node; + } + }]); - /** - * generate a globally-unique id - * - * @param {String} [prefix] - */ - var uniqueId = function (prefix) { - var id = ++idCounter + ''; - return prefix ? prefix + id : id; - }; + return Renderer; +}(); - /** - * 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 - */ - var rect2bnd = function (rect) { - var $document = $(document); - return { - top: rect.top + $document.scrollTop(), - left: rect.left + $document.scrollLeft(), - width: rect.right - rect.left, - height: rect.bottom - rect.top - }; - }; +/* 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] : []; - /** - * returns a copy of the object where the keys have become the values and the values the keys. - * @param {Object} obj - * @return {Object} - */ - var invertObject = function (obj) { - var inverted = {}; - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - inverted[obj[key]] = key; - } + if (options && options.children) { + children = options.children; } - return inverted; - }; - - /** - * @param {String} namespace - * @param {String} [prefix] - * @return {String} - */ - var namespaceToCamel = function (namespace, prefix) { - prefix = prefix || ''; - return prefix + namespace.split('.').map(function (name) { - return name.substring(0, 1).toUpperCase() + name.substring(1); - }).join(''); - }; - - return { - eq: eq, - eq2: eq2, - peq2: peq2, - ok: ok, - fail: fail, - self: self, - not: not, - and: and, - invoke: invoke, - uniqueId: uniqueId, - rect2bnd: rect2bnd, - invertObject: invertObject, - namespaceToCamel: namespaceToCamel - }; - })(); - /** - * @class core.list - * - * list utils - * - * @singleton - * @alternateClassName list - */ - var list = (function () { - /** - * returns the first item of an array. - * - * @param {Array} array - */ - var head = function (array) { - return array[0]; + return new Renderer(markup, children, options, callback); }; + } +}); - /** - * returns the last item of an array. - * - * @param {Array} array - */ - var last = function (array) { - return array[array.length - 1]; - }; +/***/ }), - /** - * returns everything but the last entry of the array. - * - * @param {Array} array - */ - var initial = function (array) { - return array.slice(0, array.length - 1); - }; +/***/ 2: +/***/ (function(module, exports) { - /** - * returns the rest of the items in an array. - * - * @param {Array} array - */ - var tail = function (array) { - return array.slice(1); - }; +/* WEBPACK VAR INJECTION */(function(__webpack_amd_options__) {/* globals __webpack_amd_options__ */ +module.exports = __webpack_amd_options__; - /** - * returns item of array - */ - var find = function (array, pred) { - for (var idx = 0, len = array.length; idx < len; idx ++) { - var item = array[idx]; - if (pred(item)) { - return item; - } - } - }; +/* WEBPACK VAR INJECTION */}.call(this, {})) - /** - * returns true if all of the values in the array pass the predicate truth test. - */ - var all = function (array, pred) { - for (var idx = 0, len = array.length; idx < len; idx ++) { - if (!pred(array[idx])) { - return false; - } - } - return true; - }; +/***/ }), - /** - * returns index of item - */ - var indexOf = function (array, item) { - return $.inArray(item, array); - }; +/***/ 3: +/***/ (function(module, __webpack_exports__, __webpack_require__) { - /** - * returns true if the value is present in the list. - */ - var contains = function (array, item) { - return indexOf(array, item) !== -1; - }; +"use strict"; - /** - * get sum from a list - * - * @param {Array} array - array - * @param {Function} fn - iterator - */ - var sum = function (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, ... - */ - var from = function (collection) { - var result = [], idx = -1, length = collection.length; - while (++idx < length) { - result[idx] = collection[idx]; - } - return result; - }; +// 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_); - /** - * returns whether list is empty or not - */ - var isEmpty = function (array) { - return !array || !array.length; - }; - - /** - * cluster elements by predicate function. - * - * @param {Array} array - array - * @param {Function} fn - predicate function for cluster rule - * @param {Array[]} - */ - var clusterBy = function (array, fn) { - if (!array.length) { return []; } - var aTail = tail(array); - return aTail.reduce(function (memo, v) { - var aLast = last(memo); - if (fn(last(aLast), v)) { - aLast[aLast.length] = v; - } else { - memo[memo.length] = [v]; - } - return memo; - }, [[head(array)]]); - }; - - /** - * returns a copy of the array with all falsy values removed - * - * @param {Array} array - array - * @param {Function} fn - predicate function for cluster rule - */ - var compact = function (array) { - var aResult = []; - for (var idx = 0, len = array.length; idx < len; idx ++) { - if (array[idx]) { aResult.push(array[idx]); } - } - return aResult; - }; +// CONCATENATED MODULE: ./src/js/base/summernote-en-US.js - /** - * produces a duplicate-free version of the array - * - * @param {Array} array - */ - var unique = function (array) { - var results = []; +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: { + 'escape': 'Escape', + 'insertParagraph': 'Insert Paragraph', + 'undo': 'Undo the last command', + 'redo': 'Redo the last command', + '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 - for (var idx = 0, len = array.length; idx < len; idx ++) { - if (!contains(results, array[idx])) { - results.push(array[idx]); - } - } +var isSupportAmd = typeof define === 'function' && __webpack_require__(2); // eslint-disable-line - return results; - }; +/** + * returns whether font is installed or not. + * + * @param {String} fontName + * @return {Boolean} + */ - /** - * returns next item. - * @param {Array} array - */ - var next = function (array, item) { - var idx = indexOf(array, item); - if (idx === -1) { return null; } +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]); + } - return array[idx + 1]; - }; + matches = /Trident\/.*rv:([0-9]{1,}[.0-9]{0,})/.exec(userAgent); - /** - * returns prev item. - * @param {Array} array - */ - var prev = function (array, item) { - var idx = indexOf(array, item); - if (idx === -1) { return null; } + if (matches) { + browserVersion = parseFloat(matches[1]); + } +} - return array[idx - 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 - return { head: head, last: last, initial: initial, tail: tail, - prev: prev, next: next, find: find, contains: contains, - all: all, sum: sum, from: from, isEmpty: isEmpty, - clusterBy: clusterBy, compact: compact, unique: unique }; - })(); +var inputEventName = isMSIE ? 'DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted' : 'input'; +/** + * @class core.env + * + * Object which check platform and agent + * + * @singleton + * @alternateClassName env + */ - var isSupportAmd = typeof define === 'function' && define.amd; +/* 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 - /** - * returns whether font is installed or not. - * - * @param {String} fontName - * @return {Boolean} - */ - var isFontInstalled = function (fontName) { - var testFontName = fontName === 'Comic Sans MS' ? 'Courier New' : 'Comic Sans MS'; - var $tester = $('
').css({ - position: 'absolute', - left: '-9999px', - top: '-9999px', - fontSize: '200px' - }).text('mmmmmmmmmwwwwwww').appendTo(document.body); +/** + * @class core.func + * + * func utils (for high-order func's arg) + * + * @singleton + * @alternateClassName func + */ - var originalWidth = $tester.css('fontFamily', testFontName).width(); - var width = $tester.css('fontFamily', fontName + ',' + testFontName).width(); +function eq(itemA) { + return function (itemB) { + return itemA === itemB; + }; +} - $tester.remove(); +function eq2(itemA, itemB) { + return itemA === itemB; +} - return originalWidth !== width; +function peq2(propName) { + return function (itemA, itemB) { + return itemA[propName] === itemB[propName]; }; +} - 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]); - } - } +function ok() { + return true; +} - var isEdge = /Edge\/\d+/.test(userAgent); +function fail() { + return false; +} - var hasCodeMirror = !!window.CodeMirror; - if (!hasCodeMirror && isSupportAmd && require) { - if (require.hasOwnProperty('resolve')) { - try { - // If CodeMirror can't be resolved, `require.resolve` will throw an - // exception and `hasCodeMirror` won't be set to `true`. - require.resolve('codemirror'); - hasCodeMirror = true; - } catch (e) { - hasCodeMirror = false; - } - } else if (require.hasOwnProperty('specified')) { - hasCodeMirror = require.specified('codemirror'); - } - } +function not(f) { + return function () { + return !f.apply(f, arguments); + }; +} - /** - * @class core.agent - * - * Object which check platform and agent - * - * @singleton - * @alternateClassName agent - */ - var agent = { - 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), - browserVersion: browserVersion, - jqueryVersion: parseFloat($.fn.jquery), - isSupportAmd: isSupportAmd, - hasCodeMirror: hasCodeMirror, - isFontInstalled: isFontInstalled, - isW3CRangeSupport: !!document.createRange +function and(fA, fB) { + return function (item) { + return fA(item) && fB(item); }; +} +function func_self(a) { + return a; +} - var NBSP_CHAR = String.fromCharCode(160); - var ZERO_WIDTH_NBSP_CHAR = '\ufeff'; +function func_invoke(obj, method) { + return function () { + return obj[method].apply(obj, arguments); + }; +} - /** - * @class core.dom - * - * Dom functions - * - * @singleton - * @alternateClassName dom - */ - var dom = (function () { - /** - * @method isEditable - * - * returns whether node is `note-editable` or not. - * - * @param {Node} node - * @return {Boolean} - */ - var isEditable = function (node) { - return node && $(node).hasClass('note-editable'); - }; +var idCounter = 0; +/** + * reset globally-unique id + * + */ - /** - * @method isControlSizing - * - * returns whether node is `note-control-sizing` or not. - * - * @param {Node} node - * @return {Boolean} - */ - var isControlSizing = function (node) { - return node && $(node).hasClass('note-control-sizing'); - }; +function resetUniqueId() { + idCounter = 0; +} +/** + * generate a globally-unique id + * + * @param {String} [prefix] + */ - /** - * @method makePredByNodeName - * - * returns predicate which judge whether nodeName is same - * - * @param {String} nodeName - * @return {Function} - */ - var makePredByNodeName = function (nodeName) { - nodeName = nodeName.toUpperCase(); - return function (node) { - return node && node.nodeName.toUpperCase() === nodeName; - }; - }; - /** - * @method isText - * - * - * - * @param {Node} node - * @return {Boolean} true if node's type is text(3) - */ - var isText = function (node) { - return node && node.nodeType === 3; - }; +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 + */ - /** - * @method isElement - * - * - * - * @param {Node} node - * @return {Boolean} true if node's type is element(1) - */ - var isElement = function (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 - */ - var isVoid = function (node) { - return node && /^BR|^IMG|^HR|^IFRAME|^BUTTON/.test(node.nodeName.toUpperCase()); - }; +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 + }; +} +/** + * returns a copy of the object where the keys have become the values and the values the keys. + * @param {Object} obj + * @return {Object} + */ - var isPara = function (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 invertObject(obj) { + var inverted = {}; - var isHeading = function (node) { - return node && /^H[1-7]/.test(node.nodeName.toUpperCase()); - }; + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + inverted[obj[key]] = key; + } + } - var isPre = makePredByNodeName('PRE'); + return inverted; +} +/** + * @param {String} namespace + * @param {String} [prefix] + * @return {String} + */ - var isLi = makePredByNodeName('LI'); - var isPurePara = function (node) { - return isPara(node) && !isLi(node); - }; +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} + */ - var isTable = makePredByNodeName('TABLE'); - var isInline = function (node) { - return !isBodyContainer(node) && - !isList(node) && - !isHr(node) && - !isPara(node) && - !isTable(node) && - !isBlockquote(node); - }; +function debounce(func, wait, immediate) { + var timeout; + return function () { + var context = this; + var args = arguments; - var isList = function (node) { - return node && /^UL|^OL/.test(node.nodeName.toUpperCase()); + var later = function later() { + timeout = null; + + if (!immediate) { + func.apply(context, args); + } }; - var isHr = makePredByNodeName('HR'); + var callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); - var isCell = function (node) { - return node && /^TD|^TH/.test(node.nodeName.toUpperCase()); - }; + if (callNow) { + func.apply(context, args); + } + }; +} +/** + * + * @param {String} url + * @return {Boolean} + */ - var isBlockquote = makePredByNodeName('BLOCKQUOTE'); - var isBodyContainer = function (node) { - return isCell(node) || isBlockquote(node) || isEditable(node); - }; +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 - var isAnchor = makePredByNodeName('A'); +/** + * returns the first item of an array. + * + * @param {Array} array + */ - var isParaInline = function (node) { - return isInline(node) && !!ancestor(node, isPara); - }; +function lists_head(array) { + return array[0]; +} +/** + * returns the last item of an array. + * + * @param {Array} array + */ - var isBodyInline = function (node) { - return isInline(node) && !ancestor(node, isPara); - }; - var isBody = makePredByNodeName('BODY'); +function lists_last(array) { + return array[array.length - 1]; +} +/** + * returns everything but the last entry of the array. + * + * @param {Array} array + */ - /** - * returns whether nodeB is closest sibling of nodeA - * - * @param {Node} nodeA - * @param {Node} nodeB - * @return {Boolean} - */ - var isClosestSibling = function (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[]} - */ - var withClosestSiblings = function (node, pred) { - pred = pred || func.ok; +function initial(array) { + return array.slice(0, array.length - 1); +} +/** + * returns the rest of the items in an array. + * + * @param {Array} array + */ - var siblings = []; - if (node.previousSibling && pred(node.previousSibling)) { - siblings.push(node.previousSibling); - } - siblings.push(node); - if (node.nextSibling && pred(node.nextSibling)) { - siblings.push(node.nextSibling); - } - return siblings; - }; - /** - * blank HTML for cursor position - * - [workaround] old IE only works with   - * - [workaround] IE11 and other browser works with bogus br - */ - var blankHTML = agent.isMSIE && agent.browserVersion < 11 ? ' ' : '
'; +function tail(array) { + return array.slice(1); +} +/** + * returns item of array + */ - /** - * @method nodeLength - * - * returns #text's text size or element's childNodes size - * - * @param {Node} node - */ - var nodeLength = function (node) { - if (isText(node)) { - return node.nodeValue.length; - } - return node.childNodes.length; - }; +function find(array, pred) { + for (var idx = 0, len = array.length; idx < len; idx++) { + var item = array[idx]; - /** - * returns whether node is empty or not. - * - * @param {Node} node - * @return {Boolean} - */ - var isEmpty = function (node) { - var len = nodeLength(node); + if (pred(item)) { + return item; + } + } +} +/** + * returns true if all of the values in the array pass the predicate truth test. + */ - if (len === 0) { - return true; - } else if (!isText(node) && len === 1 && node.innerHTML === blankHTML) { - // ex)


,
- return true; - } else if (list.all(node.childNodes, isText) && node.innerHTML === '') { - // ex)

, - return true; - } +function lists_all(array, pred) { + for (var idx = 0, len = array.length; idx < len; idx++) { + if (!pred(array[idx])) { return false; - }; + } + } - /** - * padding blankHTML if node is empty (for cursor position) - */ - var paddingBlankHTML = function (node) { - if (!isVoid(node) && !nodeLength(node)) { - node.innerHTML = blankHTML; - } - }; + return true; +} +/** + * returns true if the value is present in the list. + */ - /** - * find nearest ancestor predicate hit - * - * @param {Node} node - * @param {Function} pred - predicate function - */ - var ancestor = function (node, pred) { - while (node) { - if (pred(node)) { return node; } - if (isEditable(node)) { break; } - node = node.parentNode; - } - return null; - }; +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); + } + } - /** - * find nearest ancestor only single child blood line and predicate hit - * - * @param {Node} node - * @param {Function} pred - predicate function - */ - var singleChildAncestor = function (node, pred) { - node = node.parentNode; + return false; +} +/** + * get sum from a list + * + * @param {Array} array - array + * @param {Function} fn - iterator + */ - while (node) { - if (nodeLength(node) !== 1) { break; } - if (pred(node)) { return node; } - if (isEditable(node)) { break; } - node = node.parentNode; - } - return null; - }; +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, ... + */ - /** - * returns new array of ancestor nodes (until predicate hit). - * - * @param {Node} node - * @param {Function} [optional] pred - predicate function - */ - var listAncestor = function (node, pred) { - pred = pred || func.fail; - var ancestors = []; - ancestor(node, function (el) { - if (!isEditable(el)) { - ancestors.push(el); - } +function from(collection) { + var result = []; + var length = collection.length; + var idx = -1; - return pred(el); - }); - return ancestors; - }; + while (++idx < length) { + result[idx] = collection[idx]; + } - /** - * find farthest ancestor predicate hit - */ - var lastAncestor = function (node, pred) { - var ancestors = listAncestor(node); - return list.last(ancestors.filter(pred)); - }; + return result; +} +/** + * returns whether list is empty or not + */ - /** - * returns common ancestor node between two nodes. - * - * @param {Node} nodeA - * @param {Node} nodeB - */ - var commonAncestor = function (nodeA, nodeB) { - var ancestors = listAncestor(nodeA); - for (var n = nodeB; n; n = n.parentNode) { - if ($.inArray(n, ancestors) > -1) { return n; } - } - return null; // difference document area - }; - /** - * listing all previous siblings (until predicate hit). - * - * @param {Node} node - * @param {Function} [optional] pred - predicate function - */ - var listPrev = function (node, pred) { - pred = pred || func.fail; +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[]} + */ - var nodes = []; - while (node) { - if (pred(node)) { break; } - nodes.push(node); - node = node.previousSibling; - } - return nodes; - }; - /** - * listing next siblings (until predicate hit). - * - * @param {Node} node - * @param {Function} [pred] - predicate function - */ - var listNext = function (node, pred) { - pred = pred || func.fail; +function clusterBy(array, fn) { + if (!array.length) { + return []; + } - var nodes = []; - while (node) { - if (pred(node)) { break; } - nodes.push(node); - node = node.nextSibling; - } - return nodes; - }; + var aTail = tail(array); + return aTail.reduce(function (memo, v) { + var aLast = lists_last(memo); - /** - * listing descendant nodes - * - * @param {Node} node - * @param {Function} [pred] - predicate function - */ - var listDescendant = function (node, pred) { - var descendants = []; - pred = pred || func.ok; + if (fn(lists_last(aLast), v)) { + aLast[aLast.length] = v; + } else { + memo[memo.length] = [v]; + } - // 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 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 + */ - return descendants; - }; - /** - * wrap node with new tag. - * - * @param {Node} node - * @param {Node} tagName of wrapper - * @return {Node} - wrapper - */ - var wrap = function (node, wrapperName) { - var parent = node.parentNode; - var wrapper = $('<' + wrapperName + '>')[0]; +function compact(array) { + var aResult = []; - parent.insertBefore(wrapper, node); - wrapper.appendChild(node); + for (var idx = 0, len = array.length; idx < len; idx++) { + if (array[idx]) { + aResult.push(array[idx]); + } + } - return wrapper; - }; + return aResult; +} +/** + * produces a duplicate-free version of the array + * + * @param {Array} array + */ - /** - * insert node after preceding - * - * @param {Node} node - * @param {Node} preceding - predicate function - */ - var insertAfter = function (node, preceding) { - var next = preceding.nextSibling, parent = preceding.parentNode; - if (next) { - parent.insertBefore(node, next); - } else { - parent.appendChild(node); - } - return node; - }; - /** - * append elements. - * - * @param {Node} node - * @param {Collection} aChild - */ - var appendChildNodes = function (node, aChild) { - $.each(aChild, function (idx, child) { - node.appendChild(child); - }); - return node; - }; +function unique(array) { + var results = []; - /** - * returns whether boundaryPoint is left edge or not. - * - * @param {BoundaryPoint} point - * @return {Boolean} - */ - var isLeftEdgePoint = function (point) { - return point.offset === 0; - }; + for (var idx = 0, len = array.length; idx < len; idx++) { + if (!contains(results, array[idx])) { + results.push(array[idx]); + } + } - /** - * returns whether boundaryPoint is right edge or not. - * - * @param {BoundaryPoint} point - * @return {Boolean} - */ - var isRightEdgePoint = function (point) { - return point.offset === nodeLength(point.node); - }; + return results; +} +/** + * returns next item. + * @param {Array} array + */ - /** - * returns whether boundaryPoint is edge or not. - * - * @param {BoundaryPoint} point - * @return {Boolean} - */ - var isEdgePoint = function (point) { - return isLeftEdgePoint(point) || isRightEdgePoint(point); - }; - /** - * returns whether node is left edge of ancestor or not. - * - * @param {Node} node - * @param {Node} ancestor - * @return {Boolean} - */ - var isLeftEdgeOf = function (node, ancestor) { - while (node && node !== ancestor) { - if (position(node) !== 0) { - return false; - } - node = node.parentNode; - } +function lists_next(array, item) { + if (array && array.length && item) { + var idx = array.indexOf(item); + return idx === -1 ? null : array[idx + 1]; + } - return true; - }; + return null; +} +/** + * returns prev item. + * @param {Array} array + */ - /** - * returns whether node is right edge of ancestor or not. - * - * @param {Node} node - * @param {Node} ancestor - * @return {Boolean} - */ - var isRightEdgeOf = function (node, ancestor) { - while (node && node !== ancestor) { - if (position(node) !== nodeLength(node.parentNode) - 1) { - return false; - } - node = node.parentNode; - } - return true; - }; +function prev(array, item) { + if (array && array.length && item) { + var idx = array.indexOf(item); + return idx === -1 ? null : array[idx - 1]; + } - /** - * returns whether point is left edge of ancestor or not. - * @param {BoundaryPoint} point - * @param {Node} ancestor - * @return {Boolean} - */ - var isLeftEdgePointOf = function (point, ancestor) { - return isLeftEdgePoint(point) && isLeftEdgeOf(point.node, ancestor); - }; + return null; +} +/** + * @class core.list + * + * list utils + * + * @singleton + * @alternateClassName list + */ - /** - * returns whether point is right edge of ancestor or not. - * @param {BoundaryPoint} point - * @param {Node} ancestor - * @return {Boolean} - */ - var isRightEdgePointOf = function (point, ancestor) { - return isRightEdgePoint(point) && isRightEdgeOf(point.node, ancestor); - }; - /** - * returns offset from parent. - * - * @param {Node} node - */ - var position = function (node) { - var offset = 0; - while ((node = node.previousSibling)) { - offset += 1; - } - return offset; - }; +/* 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 hasChildren = function (node) { - return !!(node && node.childNodes && node.childNodes.length); - }; - /** - * returns previous boundaryPoint - * - * @param {BoundaryPoint} point - * @param {Boolean} isSkipInnerOffset - * @return {BoundaryPoint} - */ - var prevPoint = function (point, isSkipInnerOffset) { - var node, offset; - if (point.offset === 0) { - if (isEditable(point.node)) { - return null; - } - node = point.node.parentNode; - offset = 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; - } +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} + */ - return { - node: node, - offset: offset - }; - }; +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} + */ - /** - * returns next boundaryPoint - * - * @param {BoundaryPoint} point - * @param {Boolean} isSkipInnerOffset - * @return {BoundaryPoint} - */ - var nextPoint = function (point, isSkipInnerOffset) { - var node, offset; - if (nodeLength(point.node) === point.offset) { - if (isEditable(point.node)) { - return null; - } +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} + */ - node = point.node.parentNode; - offset = 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 - }; - }; +function makePredByNodeName(nodeName) { + nodeName = nodeName.toUpperCase(); + return function (node) { + return node && node.nodeName.toUpperCase() === nodeName; + }; +} +/** + * @method isText + * + * + * + * @param {Node} node + * @return {Boolean} true if node's type is text(3) + */ - /** - * returns whether pointA and pointB is same or not. - * - * @param {BoundaryPoint} pointA - * @param {BoundaryPoint} pointB - * @return {Boolean} - */ - var isSamePoint = function (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} - */ - var isVisiblePoint = function (point) { - if (isText(point.node) || !hasChildren(point.node) || isEmpty(point.node)) { - return true; - } +function isText(node) { + return node && node.nodeType === 3; +} +/** + * @method isElement + * + * + * + * @param {Node} node + * @return {Boolean} true if node's type is element(1) + */ - var leftNode = point.node.childNodes[point.offset - 1]; - var rightNode = point.node.childNodes[point.offset]; - if ((!leftNode || isVoid(leftNode)) && (!rightNode || isVoid(rightNode))) { - return true; - } - return false; - }; +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 + */ - /** - * @method prevPointUtil - * - * @param {BoundaryPoint} point - * @param {Function} pred - * @return {BoundaryPoint} - */ - var prevPointUntil = function (point, pred) { - while (point) { - if (pred(point)) { - return point; - } - point = prevPoint(point); - } +function isVoid(node) { + return node && /^BR|^IMG|^HR|^IFRAME|^BUTTON|^INPUT|^AUDIO|^VIDEO|^EMBED/.test(node.nodeName.toUpperCase()); +} - return null; - }; +function isPara(node) { + if (isEditable(node)) { + return false; + } // Chrome(v31.0), FF(v25.0.1) use DIV for paragraph - /** - * @method nextPointUntil - * - * @param {BoundaryPoint} point - * @param {Function} pred - * @return {BoundaryPoint} - */ - var nextPointUntil = function (point, pred) { - while (point) { - if (pred(point)) { - return point; - } - point = nextPoint(point); - } + return node && /^DIV|^P|^LI|^H[1-7]/.test(node.nodeName.toUpperCase()); +} - return null; - }; +function isHeading(node) { + return node && /^H[1-7]/.test(node.nodeName.toUpperCase()); +} - /** - * returns whether point has character or not. - * - * @param {Point} point - * @return {Boolean} - */ - var isCharPoint = function (point) { - if (!isText(point.node)) { - return false; - } +var isPre = makePredByNodeName('PRE'); +var isLi = makePredByNodeName('LI'); - var ch = point.node.nodeValue.charAt(point.offset - 1); - return ch && (ch !== ' ' && ch !== NBSP_CHAR); - }; +function isPurePara(node) { + return isPara(node) && !isLi(node); +} - /** - * @method walkPoint - * - * @param {BoundaryPoint} startPoint - * @param {BoundaryPoint} endPoint - * @param {Function} handler - * @param {Boolean} isSkipInnerOffset - */ - var walkPoint = function (startPoint, endPoint, handler, isSkipInnerOffset) { - var point = startPoint; +var isTable = makePredByNodeName('TABLE'); +var isData = makePredByNodeName('DATA'); - while (point) { - handler(point); +function dom_isInline(node) { + return !isBodyContainer(node) && !isList(node) && !isHr(node) && !isPara(node) && !isTable(node) && !isBlockquote(node) && !isData(node); +} - if (isSamePoint(point, endPoint)) { - break; - } +function isList(node) { + return node && /^UL|^OL/.test(node.nodeName.toUpperCase()); +} - var isSkipOffset = isSkipInnerOffset && - startPoint.node !== point.node && - endPoint.node !== point.node; - point = nextPoint(point, isSkipOffset); - } - }; +var isHr = makePredByNodeName('HR'); - /** - * @method makeOffsetPath - * - * return offsetPath(array of offset) from ancestor - * - * @param {Node} ancestor - ancestor node - * @param {Node} node - */ - var makeOffsetPath = function (ancestor, node) { - var ancestors = listAncestor(node, func.eq(ancestor)); - return ancestors.map(position).reverse(); - }; +function dom_isCell(node) { + return node && /^TD|^TH/.test(node.nodeName.toUpperCase()); +} - /** - * @method fromOffsetPath - * - * return element from offsetPath(array of offset) - * - * @param {Node} ancestor - ancestor node - * @param {array} offsets - offsetPath - */ - var fromOffsetPath = function (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]]; - } - } - return current; - }; +var isBlockquote = makePredByNodeName('BLOCKQUOTE'); - /** - * @method splitNode - * - * split element or #text - * - * @param {BoundaryPoint} point - * @param {Object} [options] - * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false - * @param {Boolean} [options.isNotSplitEdgePoint] - default: false - * @return {Node} right node of boundaryPoint - */ - var splitNode = function (point, options) { - var isSkipPaddingBlankHTML = options && options.isSkipPaddingBlankHTML; - var isNotSplitEdgePoint = options && options.isNotSplitEdgePoint; - - // edge case - if (isEdgePoint(point) && (isText(point.node) || isNotSplitEdgePoint)) { - if (isLeftEdgePoint(point)) { - return point.node; - } else if (isRightEdgePoint(point)) { - return point.node.nextSibling; - } - } +function isBodyContainer(node) { + return dom_isCell(node) || isBlockquote(node) || isEditable(node); +} - // 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)); +var isAnchor = makePredByNodeName('A'); - if (!isSkipPaddingBlankHTML) { - paddingBlankHTML(point.node); - paddingBlankHTML(clone); - } +function isParaInline(node) { + return dom_isInline(node) && !!dom_ancestor(node, isPara); +} - return clone; - } - }; +function isBodyInline(node) { + return dom_isInline(node) && !dom_ancestor(node, isPara); +} - /** - * @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 - */ - var splitTree = function (root, point, options) { - // ex) [#text, ,

] - var ancestors = listAncestor(point.node, func.eq(root)); +var isBody = makePredByNodeName('BODY'); +/** + * returns whether nodeB is closest sibling of nodeA + * + * @param {Node} nodeA + * @param {Node} nodeB + * @return {Boolean} + */ - if (!ancestors.length) { - return null; - } else if (ancestors.length === 1) { - return splitNode(point, options); - } +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[]} + */ - 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); - }); - }; +function withClosestSiblings(node, pred) { + pred = pred || func.ok; + var siblings = []; - /** - * split point - * - * @param {Point} point - * @param {Boolean} isInline - * @return {Object} - */ - var splitPoint = function (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 = list.last(ancestors) || point.node; - - var splitRoot, container; - if (pred(topAncestor)) { - splitRoot = ancestors[ancestors.length - 2]; - container = topAncestor; - } else { - splitRoot = topAncestor; - container = splitRoot.parentNode; - } + if (node.previousSibling && pred(node.previousSibling)) { + siblings.push(node.previousSibling); + } - // if splitRoot is exists, split with splitTree - var pivot = splitRoot && splitTree(splitRoot, point, { - isSkipPaddingBlankHTML: isInline, - isNotSplitEdgePoint: isInline - }); + siblings.push(node); - // if container is point.node, find pivot with point.offset - if (!pivot && container === point.node) { - pivot = point.node.childNodes[point.offset]; - } + if (node.nextSibling && pred(node.nextSibling)) { + siblings.push(node.nextSibling); + } - return { - rightNode: pivot, - container: container - }; - }; + return siblings; +} +/** + * blank HTML for cursor position + * - [workaround] old IE only works with   + * - [workaround] IE11 and other browser works with bogus br + */ - var create = function (nodeName) { - return document.createElement(nodeName); - }; - var createText = function (text) { - return document.createTextNode(text); - }; +var blankHTML = env.isMSIE && env.browserVersion < 11 ? ' ' : '
'; +/** + * @method nodeLength + * + * returns #text's text size or element's childNodes size + * + * @param {Node} node + */ - /** - * @method remove - * - * remove node, (isRemoveChild: remove child or not) - * - * @param {Node} node - * @param {Boolean} isRemoveChild - */ - var remove = function (node, isRemoveChild) { - if (!node || !node.parentNode) { return; } - if (node.removeNode) { return node.removeNode(isRemoveChild); } - - var parent = node.parentNode; - if (!isRemoveChild) { - var nodes = []; - var i, len; - for (i = 0, len = node.childNodes.length; i < len; i++) { - nodes.push(node.childNodes[i]); - } +function nodeLength(node) { + if (isText(node)) { + return node.nodeValue.length; + } - for (i = 0, len = nodes.length; i < len; i++) { - parent.insertBefore(nodes[i], node); - } - } + if (node) { + return node.childNodes.length; + } - parent.removeChild(node); - }; + return 0; +} +/** + * returns whether deepest child node is empty or not. + * + * @param {Node} node + * @return {Boolean} + */ - /** - * @method removeWhile - * - * @param {Node} node - * @param {Function} pred - */ - var removeWhile = function (node, pred) { - while (node) { - if (isEditable(node) || !pred(node)) { - break; - } - var parent = node.parentNode; - remove(node); - node = parent; - } - }; +function deepestChildIsEmpty(node) { + do { + if (node.firstElementChild === null || node.firstElementChild.innerHTML === '') break; + } while (node = node.firstElementChild); - /** - * @method replace - * - * replace node with provided nodeName - * - * @param {Node} node - * @param {String} nodeName - * @return {Node} - new node - */ - var replace = function (node, nodeName) { - if (node.nodeName.toUpperCase() === nodeName.toUpperCase()) { - return node; - } + return dom_isEmpty(node); +} +/** + * returns whether node is empty or not. + * + * @param {Node} node + * @return {Boolean} + */ - var newNode = create(nodeName); - if (node.style.cssText) { - newNode.style.cssText = node.style.cssText; - } +function dom_isEmpty(node) { + var len = nodeLength(node); - appendChildNodes(newNode, list.from(node.childNodes)); - insertAfter(newNode, node); - remove(node); + if (len === 0) { + return true; + } else if (!isText(node) && len === 1 && node.innerHTML === blankHTML) { + // ex)


,
+ return true; + } else if (lists.all(node.childNodes, isText) && node.innerHTML === '') { + // ex)

, + return true; + } - return newNode; - }; + return false; +} +/** + * padding blankHTML if node is empty (for cursor position) + */ - var isTextarea = makePredByNodeName('TEXTAREA'); - /** - * @param {jQuery} $node - * @param {Boolean} [stripLinebreaks] - default: false - */ - var value = function ($node, stripLinebreaks) { - var val = isTextarea($node[0]) ? $node.val() : $node.html(); - if (stripLinebreaks) { - return val.replace(/[\n\r]/g, ''); - } - return val; - }; +function paddingBlankHTML(node) { + if (!isVoid(node) && !nodeLength(node)) { + node.innerHTML = blankHTML; + } +} +/** + * find nearest ancestor predicate hit + * + * @param {Node} node + * @param {Function} pred - predicate function + */ - /** - * @method html - * - * get the HTML contents of node - * - * @param {jQuery} $node - * @param {Boolean} [isNewlineOnBlock] - */ - var html = function ($node, isNewlineOnBlock) { - var markup = 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 = $.trim(markup); - } - return markup; - }; +function dom_ancestor(node, pred) { + while (node) { + if (pred(node)) { + return node; + } - var posFromPlaceholder = function (placeholder) { - var $placeholder = $(placeholder); - var pos = $placeholder.offset(); - var height = $placeholder.outerHeight(true); // include margin + if (isEditable(node)) { + break; + } - return { - left: pos.left, - top: pos.top + height - }; - }; + node = node.parentNode; + } - var attachEvents = function ($node, events) { - Object.keys(events).forEach(function (key) { - $node.on(key, events[key]); - }); - }; + return null; +} +/** + * find nearest ancestor only single child blood line and predicate hit + * + * @param {Node} node + * @param {Function} pred - predicate function + */ - var detachEvents = function ($node, events) { - Object.keys(events).forEach(function (key) { - $node.off(key, events[key]); - }); - }; - return { - /** @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: '

' + blankHTML + '

', - makePredByNodeName: makePredByNodeName, - isEditable: isEditable, - isControlSizing: isControlSizing, - isText: isText, - isElement: isElement, - isVoid: isVoid, - isPara: isPara, - isPurePara: isPurePara, - isHeading: isHeading, - isInline: isInline, - isBlock: func.not(isInline), - isBodyInline: isBodyInline, - isBody: isBody, - isParaInline: isParaInline, - isPre: isPre, - isList: isList, - isTable: isTable, - isCell: 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, - isEmpty: isEmpty, - isEmptyAnchor: func.and(isAnchor, isEmpty), - isClosestSibling: isClosestSibling, - withClosestSiblings: withClosestSiblings, - nodeLength: nodeLength, - isLeftEdgePoint: isLeftEdgePoint, - isRightEdgePoint: isRightEdgePoint, - isEdgePoint: isEdgePoint, - isLeftEdgeOf: isLeftEdgeOf, - isRightEdgeOf: isRightEdgeOf, - isLeftEdgePointOf: isLeftEdgePointOf, - isRightEdgePointOf: isRightEdgePointOf, - prevPoint: prevPoint, - nextPoint: nextPoint, - isSamePoint: isSamePoint, - isVisiblePoint: isVisiblePoint, - prevPointUntil: prevPointUntil, - nextPointUntil: nextPointUntil, - isCharPoint: isCharPoint, - walkPoint: walkPoint, - ancestor: ancestor, - singleChildAncestor: singleChildAncestor, - listAncestor: listAncestor, - lastAncestor: lastAncestor, - listNext: listNext, - listPrev: listPrev, - listDescendant: listDescendant, - commonAncestor: commonAncestor, - wrap: wrap, - insertAfter: insertAfter, - appendChildNodes: appendChildNodes, - position: position, - hasChildren: hasChildren, - makeOffsetPath: makeOffsetPath, - fromOffsetPath: fromOffsetPath, - splitTree: splitTree, - splitPoint: splitPoint, - create: create, - createText: createText, - remove: remove, - removeWhile: removeWhile, - replace: replace, - html: html, - value: value, - posFromPlaceholder: posFromPlaceholder, - attachEvents: attachEvents, - detachEvents: detachEvents - }; - })(); +function singleChildAncestor(node, pred) { + node = node.parentNode; - /** - * @param {jQuery} $note - * @param {Object} options - * @return {Context} - */ - var Context = function ($note, options) { - var self = this; + while (node) { + if (nodeLength(node) !== 1) { + break; + } - var ui = $.summernote.ui; - this.memos = {}; - this.modules = {}; - this.layoutInfo = {}; - this.options = options; + if (pred(node)) { + return node; + } - /** - * create layout and initialize modules and other resources - */ - this.initialize = function () { - this.layoutInfo = ui.createLayout($note, options); - this._initialize(); - $note.hide(); - return this; - }; + if (isEditable(node)) { + break; + } - /** - * destroy modules and other resources and remove layout - */ - this.destroy = function () { - this._destroy(); - $note.removeData('summernote'); - ui.removeLayout($note, this.layoutInfo); - }; + node = node.parentNode; + } - /** - * destory modules and other resources and initialize it again - */ - this.reset = function () { - var disabled = self.isDisabled(); - this.code(dom.emptyPara); - this._destroy(); - this._initialize(); + return null; +} +/** + * returns new array of ancestor nodes (until predicate hit). + * + * @param {Node} node + * @param {Function} [optional] pred - predicate function + */ - if (disabled) { - self.disable(); - } - }; - this._initialize = function () { - // add optional buttons - var buttons = $.extend({}, this.options.buttons); - Object.keys(buttons).forEach(function (key) { - self.memo('button.' + key, buttons[key]); - }); +function listAncestor(node, pred) { + pred = pred || func.fail; + var ancestors = []; + dom_ancestor(node, function (el) { + if (!isEditable(el)) { + ancestors.push(el); + } - var modules = $.extend({}, this.options.modules, $.summernote.plugins || {}); + return pred(el); + }); + return ancestors; +} +/** + * find farthest ancestor predicate hit + */ - // add and initialize modules - Object.keys(modules).forEach(function (key) { - self.module(key, modules[key], true); - }); - Object.keys(this.modules).forEach(function (key) { - self.initializeModule(key); - }); - }; +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 + */ - this._destroy = function () { - // destroy modules with reversed order - Object.keys(this.modules).reverse().forEach(function (key) { - self.removeModule(key); - }); - Object.keys(this.memos).forEach(function (key) { - self.removeMemo(key); - }); - }; +function dom_commonAncestor(nodeA, nodeB) { + var ancestors = listAncestor(nodeA); - this.code = function (html) { - var isActivated = this.invoke('codeview.isActivated'); + for (var n = nodeB; n; n = n.parentNode) { + if (ancestors.indexOf(n) > -1) return n; + } - if (html === undefined) { - this.invoke('codeview.sync'); - return isActivated ? this.layoutInfo.codable.val() : this.layoutInfo.editable.html(); - } else { - if (isActivated) { - this.layoutInfo.codable.val(html); - } else { - this.layoutInfo.editable.html(html); - } - $note.val(html); - this.triggerEvent('change', html); - } - }; - - this.isDisabled = function () { - return this.layoutInfo.editable.attr('contenteditable') === 'false'; - }; - - this.enable = function () { - this.layoutInfo.editable.attr('contenteditable', true); - this.invoke('toolbar.activate', true); - }; + return null; // difference document area +} +/** + * listing all previous siblings (until predicate hit). + * + * @param {Node} node + * @param {Function} [optional] pred - predicate function + */ - this.disable = function () { - // close codeview if codeview is opend - if (this.invoke('codeview.isActivated')) { - this.invoke('codeview.deactivate'); - } - this.layoutInfo.editable.attr('contenteditable', false); - this.invoke('toolbar.deactivate', true); - }; - this.triggerEvent = function () { - var namespace = list.head(arguments); - var args = list.tail(list.from(arguments)); +function listPrev(node, pred) { + pred = pred || func.fail; + var nodes = []; - var callback = this.options.callbacks[func.namespaceToCamel(namespace, 'on')]; - if (callback) { - callback.apply($note[0], args); - } - $note.trigger('summernote.' + namespace, args); - }; + while (node) { + if (pred(node)) { + break; + } - this.initializeModule = function (key) { - var module = this.modules[key]; - module.shouldInitialize = module.shouldInitialize || func.ok; - if (!module.shouldInitialize()) { - return; - } + nodes.push(node); + node = node.previousSibling; + } - // initialize module - if (module.initialize) { - module.initialize(); - } + return nodes; +} +/** + * listing next siblings (until predicate hit). + * + * @param {Node} node + * @param {Function} [pred] - predicate function + */ - // attach events - if (module.events) { - dom.attachEvents($note, module.events); - } - }; - this.module = function (key, ModuleClass, withoutIntialize) { - if (arguments.length === 1) { - return this.modules[key]; - } +function listNext(node, pred) { + pred = pred || func.fail; + var nodes = []; - this.modules[key] = new ModuleClass(this); + while (node) { + if (pred(node)) { + break; + } - if (!withoutIntialize) { - this.initializeModule(key); - } - }; + nodes.push(node); + node = node.nextSibling; + } - this.removeModule = function (key) { - var module = this.modules[key]; - if (module.shouldInitialize()) { - if (module.events) { - dom.detachEvents($note, module.events); - } + return nodes; +} +/** + * listing descendant nodes + * + * @param {Node} node + * @param {Function} [pred] - predicate function + */ - if (module.destroy) { - module.destroy(); - } - } - delete this.modules[key]; - }; +function listDescendant(node, pred) { + var descendants = []; + pred = pred || func.ok; // start DFS(depth first search) with node - this.memo = function (key, obj) { - if (arguments.length === 1) { - return this.memos[key]; - } - this.memos[key] = obj; - }; + (function fnWalk(current) { + if (node !== current && pred(current)) { + descendants.push(current); + } - this.removeMemo = function (key) { - if (this.memos[key] && this.memos[key].destroy) { - this.memos[key].destroy(); - } + for (var idx = 0, len = current.childNodes.length; idx < len; idx++) { + fnWalk(current.childNodes[idx]); + } + })(node); - delete this.memos[key]; - }; + return descendants; +} +/** + * wrap node with new tag. + * + * @param {Node} node + * @param {Node} tagName of wrapper + * @return {Node} - wrapper + */ - this.createInvokeHandler = function (namespace, value) { - return function (event) { - event.preventDefault(); - self.invoke(namespace, value || $(event.target).closest('[data-value]').data('value')); - }; - }; - this.invoke = function () { - var namespace = list.head(arguments); - var args = list.tail(list.from(arguments)); +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 + */ - var splits = namespace.split('.'); - var hasSeparator = splits.length > 1; - var moduleName = hasSeparator && list.head(splits); - var methodName = hasSeparator ? list.last(splits) : list.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); - } - }; +function insertAfter(node, preceding) { + var next = preceding.nextSibling; + var parent = preceding.parentNode; - return this.initialize(); - }; + if (next) { + parent.insertBefore(node, next); + } else { + parent.appendChild(node); + } - $.fn.extend({ - /** - * Summernote API - * - * @param {Object|String} - * @return {this} - */ - summernote: function () { - var type = $.type(list.head(arguments)); - var isExternalAPICalled = type === 'string'; - var hasInitOptions = type === 'object'; - - var options = hasInitOptions ? list.head(arguments) : {}; - - options = $.extend({}, $.summernote.options, options); - options.langInfo = $.extend(true, {}, $.summernote.lang['en-US'], $.summernote.lang[options.lang]); - - this.each(function (idx, note) { - var $note = $(note); - if (!$note.data('summernote')) { - var context = new Context($note, options); - $note.data('summernote', context); - $note.data('summernote').triggerEvent('init', context.layoutInfo); - } - }); + return node; +} +/** + * append elements. + * + * @param {Node} node + * @param {Collection} aChild + */ - var $note = this.first(); - if ($note.length) { - var context = $note.data('summernote'); - if (isExternalAPICalled) { - return context.invoke.apply(context, list.from(arguments)); - } else if (options.focus) { - context.invoke('editor.focus'); - } - } - return this; - } +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} + */ - var Renderer = function (markup, children, options, callback) { - this.render = function ($parent) { - var $node = $(markup); +function isLeftEdgePoint(point) { + return point.offset === 0; +} +/** + * returns whether boundaryPoint is right edge or not. + * + * @param {BoundaryPoint} point + * @return {Boolean} + */ - if (options && options.contents) { - $node.html(options.contents); - } - if (options && options.className) { - $node.addClass(options.className); - } +function isRightEdgePoint(point) { + return point.offset === nodeLength(point.node); +} +/** + * returns whether boundaryPoint is edge or not. + * + * @param {BoundaryPoint} point + * @return {Boolean} + */ - if (options && options.data) { - $.each(options.data, function (k, v) { - $node.attr('data-' + k, v); - }); - } - if (options && options.click) { - $node.on('click', options.click); - } +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} + */ - if (children) { - var $container = $node.find('.note-children-container'); - children.forEach(function (child) { - child.render($container.length ? $container : $node); - }); - } - if (callback) { - callback($node, options); - } +function dom_isLeftEdgeOf(node, ancestor) { + while (node && node !== ancestor) { + if (dom_position(node) !== 0) { + return false; + } - if (options && options.callback) { - options.callback($node); - } + node = node.parentNode; + } - if ($parent) { - $parent.append($node); - } + return true; +} +/** + * returns whether node is right edge of ancestor or not. + * + * @param {Node} node + * @param {Node} ancestor + * @return {Boolean} + */ - return $node; - }; - }; - var renderer = { - create: function (markup, callback) { - return function () { - var children = $.isArray(arguments[0]) ? arguments[0] : []; - var options = typeof arguments[1] === 'object' ? arguments[1] : arguments[0]; - if (options && options.children) { - children = options.children; - } - return new Renderer(markup, children, options, callback); - }; - } - }; +function isRightEdgeOf(node, ancestor) { + if (!ancestor) { + return false; + } - var editor = renderer.create('
'); - var toolbar = renderer.create('
'); - var editingArea = renderer.create('
'); - var codable = renderer.create('
').addClass('note-specialchar-node'); var $tr = (idx % COLUMN_LENGTH === 0) ? $('