@paroicms/quill-editor-plugin 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/bo-dist/bo-plugin.mjs +8977 -0
- package/bo-dist/style.css +7 -0
- package/dist-backend/quill-delta.js +137 -0
- package/package.json +54 -0
- package/plugin.cjs +17 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Quill Editor v2.0.2
|
|
3
|
+
* https://quilljs.com
|
|
4
|
+
* Copyright (c) 2017-2024, Slab
|
|
5
|
+
* Copyright (c) 2014, Jason Chen
|
|
6
|
+
* Copyright (c) 2013, salesforce.com
|
|
7
|
+
*/.ql-container{box-sizing:border-box;font-family:Helvetica,Arial,sans-serif;font-size:13px;height:100%;margin:0;position:relative}.ql-container.ql-disabled .ql-tooltip{visibility:hidden}.ql-container:not(.ql-disabled) li[data-list=checked]>.ql-ui,.ql-container:not(.ql-disabled) li[data-list=unchecked]>.ql-ui{cursor:pointer}.ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}.ql-clipboard p{margin:0;padding:0}.ql-editor{box-sizing:border-box;counter-reset:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;line-height:1.42;height:100%;outline:none;overflow-y:auto;padding:12px 15px;tab-size:4;-moz-tab-size:4;text-align:left;white-space:pre-wrap;word-wrap:break-word}.ql-editor>*{cursor:text}.ql-editor p,.ql-editor ol,.ql-editor pre,.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{margin:0;padding:0}@supports (counter-set:none){.ql-editor p,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{counter-set:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor p,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{counter-reset:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor table{border-collapse:collapse}.ql-editor td{border:1px solid #000;padding:2px 5px}.ql-editor ol{padding-left:1.5em}.ql-editor li{list-style-type:none;padding-left:1.5em;position:relative}.ql-editor li>.ql-ui:before{display:inline-block;margin-left:-1.5em;margin-right:.3em;text-align:right;white-space:nowrap;width:1.2em}.ql-editor li[data-list=checked]>.ql-ui,.ql-editor li[data-list=unchecked]>.ql-ui{color:#777}.ql-editor li[data-list=bullet]>.ql-ui:before{content:"•"}.ql-editor li[data-list=checked]>.ql-ui:before{content:"☑"}.ql-editor li[data-list=unchecked]>.ql-ui:before{content:"☐"}@supports (counter-set:none){.ql-editor li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list]{counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered]{counter-increment:list-0}.ql-editor li[data-list=ordered]>.ql-ui:before{content:counter(list-0,decimal) ". "}.ql-editor li[data-list=ordered].ql-indent-1{counter-increment:list-1}.ql-editor li[data-list=ordered].ql-indent-1>.ql-ui:before{content:counter(list-1,lower-alpha) ". "}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-1{counter-set:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-1{counter-reset:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-2{counter-increment:list-2}.ql-editor li[data-list=ordered].ql-indent-2>.ql-ui:before{content:counter(list-2,lower-roman) ". "}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-2{counter-set:list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-2{counter-reset:list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-3{counter-increment:list-3}.ql-editor li[data-list=ordered].ql-indent-3>.ql-ui:before{content:counter(list-3,decimal) ". "}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-3{counter-set:list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-3{counter-reset:list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-4{counter-increment:list-4}.ql-editor li[data-list=ordered].ql-indent-4>.ql-ui:before{content:counter(list-4,lower-alpha) ". "}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-4{counter-set:list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-4{counter-reset:list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-5{counter-increment:list-5}.ql-editor li[data-list=ordered].ql-indent-5>.ql-ui:before{content:counter(list-5,lower-roman) ". "}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-5{counter-set:list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-5{counter-reset:list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-6{counter-increment:list-6}.ql-editor li[data-list=ordered].ql-indent-6>.ql-ui:before{content:counter(list-6,decimal) ". "}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-6{counter-set:list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-6{counter-reset:list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-7{counter-increment:list-7}.ql-editor li[data-list=ordered].ql-indent-7>.ql-ui:before{content:counter(list-7,lower-alpha) ". "}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-7{counter-set:list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-7{counter-reset:list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-8{counter-increment:list-8}.ql-editor li[data-list=ordered].ql-indent-8>.ql-ui:before{content:counter(list-8,lower-roman) ". "}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-8{counter-set:list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-8{counter-reset:list-9}}.ql-editor li[data-list=ordered].ql-indent-9{counter-increment:list-9}.ql-editor li[data-list=ordered].ql-indent-9>.ql-ui:before{content:counter(list-9,decimal) ". "}.ql-editor .ql-indent-1:not(.ql-direction-rtl){padding-left:3em}.ql-editor li.ql-indent-1:not(.ql-direction-rtl){padding-left:4.5em}.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:3em}.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:4.5em}.ql-editor .ql-indent-2:not(.ql-direction-rtl){padding-left:6em}.ql-editor li.ql-indent-2:not(.ql-direction-rtl){padding-left:7.5em}.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:6em}.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:7.5em}.ql-editor .ql-indent-3:not(.ql-direction-rtl){padding-left:9em}.ql-editor li.ql-indent-3:not(.ql-direction-rtl){padding-left:10.5em}.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:9em}.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:10.5em}.ql-editor .ql-indent-4:not(.ql-direction-rtl){padding-left:12em}.ql-editor li.ql-indent-4:not(.ql-direction-rtl){padding-left:13.5em}.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:12em}.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:13.5em}.ql-editor .ql-indent-5:not(.ql-direction-rtl){padding-left:15em}.ql-editor li.ql-indent-5:not(.ql-direction-rtl){padding-left:16.5em}.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:15em}.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:16.5em}.ql-editor .ql-indent-6:not(.ql-direction-rtl){padding-left:18em}.ql-editor li.ql-indent-6:not(.ql-direction-rtl){padding-left:19.5em}.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:18em}.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:19.5em}.ql-editor .ql-indent-7:not(.ql-direction-rtl){padding-left:21em}.ql-editor li.ql-indent-7:not(.ql-direction-rtl){padding-left:22.5em}.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:21em}.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:22.5em}.ql-editor .ql-indent-8:not(.ql-direction-rtl){padding-left:24em}.ql-editor li.ql-indent-8:not(.ql-direction-rtl){padding-left:25.5em}.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:24em}.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:25.5em}.ql-editor .ql-indent-9:not(.ql-direction-rtl){padding-left:27em}.ql-editor li.ql-indent-9:not(.ql-direction-rtl){padding-left:28.5em}.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:27em}.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:28.5em}.ql-editor li.ql-direction-rtl{padding-right:1.5em}.ql-editor li.ql-direction-rtl>.ql-ui:before{margin-left:.3em;margin-right:-1.5em;text-align:left}.ql-editor table{table-layout:fixed;width:100%}.ql-editor table td{outline:none}.ql-editor .ql-code-block-container{font-family:monospace}.ql-editor .ql-video{display:block;max-width:100%}.ql-editor .ql-video.ql-align-center{margin:0 auto}.ql-editor .ql-video.ql-align-right{margin:0 0 0 auto}.ql-editor .ql-bg-black{background-color:#000}.ql-editor .ql-bg-red{background-color:#e60000}.ql-editor .ql-bg-orange{background-color:#f90}.ql-editor .ql-bg-yellow{background-color:#ff0}.ql-editor .ql-bg-green{background-color:#008a00}.ql-editor .ql-bg-blue{background-color:#06c}.ql-editor .ql-bg-purple{background-color:#93f}.ql-editor .ql-color-white{color:#fff}.ql-editor .ql-color-red{color:#e60000}.ql-editor .ql-color-orange{color:#f90}.ql-editor .ql-color-yellow{color:#ff0}.ql-editor .ql-color-green{color:#008a00}.ql-editor .ql-color-blue{color:#06c}.ql-editor .ql-color-purple{color:#93f}.ql-editor .ql-font-serif{font-family:Georgia,Times New Roman,serif}.ql-editor .ql-font-monospace{font-family:Monaco,Courier New,monospace}.ql-editor .ql-size-small{font-size:.75em}.ql-editor .ql-size-large{font-size:1.5em}.ql-editor .ql-size-huge{font-size:2.5em}.ql-editor .ql-direction-rtl{direction:rtl;text-align:inherit}.ql-editor .ql-align-center{text-align:center}.ql-editor .ql-align-justify{text-align:justify}.ql-editor .ql-align-right{text-align:right}.ql-editor .ql-ui{position:absolute}.ql-editor.ql-blank:before{color:#0009;content:attr(data-placeholder);font-style:italic;left:15px;pointer-events:none;position:absolute;right:15px}.ql-snow.ql-toolbar:after,.ql-snow .ql-toolbar:after{clear:both;content:"";display:table}.ql-snow.ql-toolbar button,.ql-snow .ql-toolbar button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.ql-snow.ql-toolbar button svg,.ql-snow .ql-toolbar button svg{float:left;height:100%}.ql-snow.ql-toolbar button:active:hover,.ql-snow .ql-toolbar button:active:hover{outline:none}.ql-snow.ql-toolbar input.ql-image[type=file],.ql-snow .ql-toolbar input.ql-image[type=file]{display:none}.ql-snow.ql-toolbar button:hover,.ql-snow .ql-toolbar button:hover,.ql-snow.ql-toolbar button:focus,.ql-snow .ql-toolbar button:focus,.ql-snow.ql-toolbar button.ql-active,.ql-snow .ql-toolbar button.ql-active,.ql-snow.ql-toolbar .ql-picker-label:hover,.ql-snow .ql-toolbar .ql-picker-label:hover,.ql-snow.ql-toolbar .ql-picker-label.ql-active,.ql-snow .ql-toolbar .ql-picker-label.ql-active,.ql-snow.ql-toolbar .ql-picker-item:hover,.ql-snow .ql-toolbar .ql-picker-item:hover,.ql-snow.ql-toolbar .ql-picker-item.ql-selected,.ql-snow .ql-toolbar .ql-picker-item.ql-selected{color:#06c}.ql-snow.ql-toolbar button:hover .ql-fill,.ql-snow .ql-toolbar button:hover .ql-fill,.ql-snow.ql-toolbar button:focus .ql-fill,.ql-snow .ql-toolbar button:focus .ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill{fill:#06c}.ql-snow.ql-toolbar button:hover .ql-stroke,.ql-snow .ql-toolbar button:hover .ql-stroke,.ql-snow.ql-toolbar button:focus .ql-stroke,.ql-snow .ql-toolbar button:focus .ql-stroke,.ql-snow.ql-toolbar button.ql-active .ql-stroke,.ql-snow .ql-toolbar button.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow.ql-toolbar button:hover .ql-stroke-miter,.ql-snow .ql-toolbar button:hover .ql-stroke-miter,.ql-snow.ql-toolbar button:focus .ql-stroke-miter,.ql-snow .ql-toolbar button:focus .ql-stroke-miter,.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter{stroke:#06c}@media (pointer:coarse){.ql-snow.ql-toolbar button:hover:not(.ql-active),.ql-snow .ql-toolbar button:hover:not(.ql-active){color:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill{fill:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter{stroke:#444}}.ql-snow,.ql-snow *{box-sizing:border-box}.ql-snow .ql-hidden{display:none}.ql-snow .ql-out-bottom,.ql-snow .ql-out-top{visibility:hidden}.ql-snow .ql-tooltip{position:absolute;transform:translateY(10px)}.ql-snow .ql-tooltip a{cursor:pointer;text-decoration:none}.ql-snow .ql-tooltip.ql-flip{transform:translateY(-10px)}.ql-snow .ql-formats{display:inline-block;vertical-align:middle}.ql-snow .ql-formats:after{clear:both;content:"";display:table}.ql-snow .ql-stroke{fill:none;stroke:#444;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.ql-snow .ql-stroke-miter{fill:none;stroke:#444;stroke-miterlimit:10;stroke-width:2}.ql-snow .ql-fill,.ql-snow .ql-stroke.ql-fill{fill:#444}.ql-snow .ql-empty{fill:none}.ql-snow .ql-even{fill-rule:evenodd}.ql-snow .ql-thin,.ql-snow .ql-stroke.ql-thin{stroke-width:1}.ql-snow .ql-transparent{opacity:.4}.ql-snow .ql-direction svg:last-child{display:none}.ql-snow .ql-direction.ql-active svg:last-child{display:inline}.ql-snow .ql-direction.ql-active svg:first-child{display:none}.ql-snow .ql-editor h1{font-size:2em}.ql-snow .ql-editor h2{font-size:1.5em}.ql-snow .ql-editor h3{font-size:1.17em}.ql-snow .ql-editor h4{font-size:1em}.ql-snow .ql-editor h5{font-size:.83em}.ql-snow .ql-editor h6{font-size:.67em}.ql-snow .ql-editor a{text-decoration:underline}.ql-snow .ql-editor blockquote{border-left:4px solid #ccc;margin-bottom:5px;margin-top:5px;padding-left:16px}.ql-snow .ql-editor code,.ql-snow .ql-editor .ql-code-block-container{background-color:#f0f0f0;border-radius:3px}.ql-snow .ql-editor .ql-code-block-container{margin-bottom:5px;margin-top:5px;padding:5px 10px}.ql-snow .ql-editor code{font-size:85%;padding:2px 4px}.ql-snow .ql-editor .ql-code-block-container{background-color:#23241f;color:#f8f8f2;overflow:visible}.ql-snow .ql-editor img{max-width:100%}.ql-snow .ql-picker{color:#444;display:inline-block;float:left;font-size:14px;font-weight:500;height:24px;position:relative;vertical-align:middle}.ql-snow .ql-picker-label{cursor:pointer;display:inline-block;height:100%;padding-left:8px;padding-right:2px;position:relative;width:100%}.ql-snow .ql-picker-label:before{display:inline-block;line-height:22px}.ql-snow .ql-picker-options{background-color:#fff;display:none;min-width:100%;padding:4px 8px;position:absolute;white-space:nowrap}.ql-snow .ql-picker-options .ql-picker-item{cursor:pointer;display:block;padding-bottom:5px;padding-top:5px}.ql-snow .ql-picker.ql-expanded .ql-picker-label{color:#ccc;z-index:2}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill{fill:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke{stroke:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-options{display:block;margin-top:-1px;top:100%;z-index:1}.ql-snow .ql-color-picker,.ql-snow .ql-icon-picker{width:28px}.ql-snow .ql-color-picker .ql-picker-label,.ql-snow .ql-icon-picker .ql-picker-label{padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-label svg,.ql-snow .ql-icon-picker .ql-picker-label svg{right:4px}.ql-snow .ql-icon-picker .ql-picker-options{padding:4px 0}.ql-snow .ql-icon-picker .ql-picker-item{height:24px;width:24px;padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-options{padding:3px 5px;width:152px}.ql-snow .ql-color-picker .ql-picker-item{border:1px solid transparent;float:left;height:16px;margin:2px;padding:0;width:16px}.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg{position:absolute;margin-top:-9px;right:0;top:50%;width:18px}.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=""]):before,.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=""]):before,.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=""]):before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=""]):before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=""]):before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=""]):before{content:attr(data-label)}.ql-snow .ql-picker.ql-header{width:98px}.ql-snow .ql-picker.ql-header .ql-picker-label:before,.ql-snow .ql-picker.ql-header .ql-picker-item:before{content:"Normal"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]:before{content:"Heading 1"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]:before{content:"Heading 2"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]:before{content:"Heading 3"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]:before{content:"Heading 4"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]:before{content:"Heading 5"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]:before{content:"Heading 6"}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]:before{font-size:2em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]:before{font-size:1.5em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]:before{font-size:1.17em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]:before{font-size:1em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]:before{font-size:.83em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]:before{font-size:.67em}.ql-snow .ql-picker.ql-font{width:108px}.ql-snow .ql-picker.ql-font .ql-picker-label:before,.ql-snow .ql-picker.ql-font .ql-picker-item:before{content:"Sans Serif"}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]:before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]:before{content:"Serif"}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]:before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]:before{content:"Monospace"}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]:before{font-family:Georgia,Times New Roman,serif}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]:before{font-family:Monaco,Courier New,monospace}.ql-snow .ql-picker.ql-size{width:98px}.ql-snow .ql-picker.ql-size .ql-picker-label:before,.ql-snow .ql-picker.ql-size .ql-picker-item:before{content:"Normal"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]:before{content:"Small"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]:before{content:"Large"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]:before{content:"Huge"}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]:before{font-size:10px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]:before{font-size:18px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]:before{font-size:32px}.ql-snow .ql-color-picker.ql-background .ql-picker-item{background-color:#fff}.ql-snow .ql-color-picker.ql-color .ql-picker-item{background-color:#000}.ql-code-block-container{position:relative}.ql-code-block-container .ql-ui{right:5px;top:5px}.ql-toolbar.ql-snow{border:1px solid #ccc;box-sizing:border-box;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;padding:8px}.ql-toolbar.ql-snow .ql-formats{margin-right:15px}.ql-toolbar.ql-snow .ql-picker-label{border:1px solid transparent}.ql-toolbar.ql-snow .ql-picker-options{border:1px solid transparent;box-shadow:#0003 0 2px 8px}.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label,.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options{border-color:#ccc}.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected,.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover{border-color:#000}.ql-toolbar.ql-snow+.ql-container.ql-snow{border-top:0}.ql-snow .ql-tooltip{background-color:#fff;border:1px solid #ccc;box-shadow:0 0 5px #ddd;color:#444;padding:5px 12px;white-space:nowrap}.ql-snow .ql-tooltip:before{content:"Visit URL:";line-height:26px;margin-right:8px}.ql-snow .ql-tooltip input[type=text]{display:none;border:1px solid #ccc;font-size:13px;height:26px;margin:0;padding:3px 5px;width:170px}.ql-snow .ql-tooltip a.ql-preview{display:inline-block;max-width:200px;overflow-x:hidden;text-overflow:ellipsis;vertical-align:top}.ql-snow .ql-tooltip a.ql-action:after{border-right:1px solid #ccc;content:"Edit";margin-left:16px;padding-right:8px}.ql-snow .ql-tooltip a.ql-remove:before{content:"Remove";margin-left:8px}.ql-snow .ql-tooltip a{line-height:26px}.ql-snow .ql-tooltip.ql-editing a.ql-preview,.ql-snow .ql-tooltip.ql-editing a.ql-remove{display:none}.ql-snow .ql-tooltip.ql-editing input[type=text]{display:inline-block}.ql-snow .ql-tooltip.ql-editing a.ql-action:after{border-right:0;content:"Save";padding-right:0}.ql-snow .ql-tooltip[data-mode=link]:before{content:"Enter link:"}.ql-snow .ql-tooltip[data-mode=formula]:before{content:"Enter formula:"}.ql-snow .ql-tooltip[data-mode=video]:before{content:"Enter video:"}.ql-snow a{color:#06c}.ql-container.ql-snow{border:1px solid #ccc}.QpTooltip{border-bottom:1px dotted #64748b;display:inline-block;position:relative}.QpTooltip-text{background-color:#64748b;border-radius:6px;color:#fff;left:110%;padding:5px;position:absolute;text-align:center;top:-5px;visibility:hidden;width:120px;z-index:1}.QpTooltip-text:after{border-color:transparent #64748b transparent transparent;border-style:solid;border-width:5px;content:"";margin-top:-5px;position:absolute;right:100%;top:50%}.QpTooltip:hover .QpTooltip-text{visibility:visible}.QuillEditor{max-width:800px}.QuillEditor .ql-container{height:calc(100% - 42px)}.QuillEditor .ql-editor{font-size:16px}.QpSpinner{align-items:center;display:flex;height:100%;justify-content:center}.QpSpinner:before{animation:spinner-rotate .75s infinite linear;border:.25rem solid #ccc;border-radius:50%;border-top-color:#ff4a4a;content:"";height:2rem;margin:auto;width:2rem}@keyframes spinner-rotate{to{transform:rotate(360deg)}}.ObfuscatorDialog-label{display:block}.ObfuscateBlot{border:2px dashed #8d5151;border-radius:3px;cursor:pointer;padding:0 2px}.QpBtn{background-color:#6366f1;border:1px solid #6366f1;border-radius:6px;color:#fff;cursor:pointer;font-size:1rem;padding:.75rem 1.25rem;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s}.QpBtn.secondary{background-color:#64748b;border:1px solid #64748b}.QpBtn.danger{background-color:#ef4444;border:1px solid #ef4444}.QpBtn.outlined{background-color:transparent;color:inherit}.QpBtn.outlined:hover{background-color:#c6c7f6}.QpBtn.secondary.outlined{color:#64748b}.QpBtn.secondary.outlined:hover{background-color:#64748b0a}.QpBtn.danger.outlined{color:#ef4444}.QpBtn.danger.outlined:hover{background-color:#ef44440a}.QpInput{appearance:none;background:#fff;border:1px solid #d1d5db;border-radius:6px;color:#4b5563;font-size:10px;padding:10px;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s}.QpInput:hover{border-color:#06b6d4}.QpInput:focus{border-color:#06b6d4;box-shadow:0 0 0 .2rem #a5f3fc;outline:0 none;outline-offset:0}.QpHtmlSnippetInput{width:100%}.QpOption{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:20px;width:100%}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.convertQuillDeltaToPlainText = exports.convertQuillDeltaToHtml = void 0;
|
|
4
|
+
const data_formatters_lib_1 = require("@paroi/data-formatters-lib");
|
|
5
|
+
const quill_delta_to_html_1 = require("@paroi/quill-delta-to-html");
|
|
6
|
+
const public_server_lib_1 = require("@paroicms/public-server-lib");
|
|
7
|
+
async function convertQuillDeltaToHtml(ctx, delta, options) {
|
|
8
|
+
const { siteContext, useImage } = ctx;
|
|
9
|
+
const ops = delta.ops;
|
|
10
|
+
preprocessDelta(ops);
|
|
11
|
+
const converter = new quill_delta_to_html_1.QuillDeltaToHtmlAsyncConverter(ops, {
|
|
12
|
+
multiLineParagraph: false,
|
|
13
|
+
});
|
|
14
|
+
converter.renderCustomWith((customOp) => {
|
|
15
|
+
const { type, value } = customOp.insert;
|
|
16
|
+
if (type === "html-snippet")
|
|
17
|
+
return value.html;
|
|
18
|
+
if (type === "obfuscate")
|
|
19
|
+
return obfuscateBlotProcessing(value, customOp.attributes);
|
|
20
|
+
if (type === "img")
|
|
21
|
+
return imgBlotProcessing(siteContext, useImage, value, options);
|
|
22
|
+
siteContext.siteLog.warn(`Invalid blot '${type}'`);
|
|
23
|
+
return "";
|
|
24
|
+
});
|
|
25
|
+
return await converter.convert();
|
|
26
|
+
}
|
|
27
|
+
exports.convertQuillDeltaToHtml = convertQuillDeltaToHtml;
|
|
28
|
+
function convertQuillDeltaToPlainText(delta, siteContext) {
|
|
29
|
+
const converter = new quill_delta_to_html_1.QuillDeltaToHtmlConverter(delta.ops);
|
|
30
|
+
converter.renderCustomWith((customOp) => {
|
|
31
|
+
const { type, value } = customOp.insert;
|
|
32
|
+
if (type === "html-snippet")
|
|
33
|
+
return value.html;
|
|
34
|
+
if (type === "img")
|
|
35
|
+
return "";
|
|
36
|
+
siteContext.siteLog.warn(`Invalid blot '${type}'`);
|
|
37
|
+
return "";
|
|
38
|
+
});
|
|
39
|
+
const html = converter.convert();
|
|
40
|
+
return (0, public_server_lib_1.stripHtmlTags)(html, { blockSeparator: " – " });
|
|
41
|
+
}
|
|
42
|
+
exports.convertQuillDeltaToPlainText = convertQuillDeltaToPlainText;
|
|
43
|
+
async function imgBlotProcessing(siteContext, useImage, value, options) {
|
|
44
|
+
const uid = (0, data_formatters_lib_1.strValOrUndef)(value.uid, { varName: "uid" });
|
|
45
|
+
const variant = (0, data_formatters_lib_1.strValOrUndef)(value.variant, { varName: "variant" });
|
|
46
|
+
const align = (0, data_formatters_lib_1.strValOrUndef)(value.align);
|
|
47
|
+
const zoom = (0, data_formatters_lib_1.strValOrUndef)(value.zoom);
|
|
48
|
+
const hasZoom = zoom !== "none";
|
|
49
|
+
let imgAttributes;
|
|
50
|
+
if (uid && variant && (0, public_server_lib_1.isImageSize)(variant)) {
|
|
51
|
+
const realSize = (0, public_server_lib_1.applyRatioToImageSize)(variant, siteContext.themeConf.pixelRatio);
|
|
52
|
+
const image = await useImage({ size: realSize, imageUid: uid });
|
|
53
|
+
let dataZoomSrc;
|
|
54
|
+
if (hasZoom) {
|
|
55
|
+
const zoomImage = await useImage({
|
|
56
|
+
imageUid: uid,
|
|
57
|
+
size: (0, public_server_lib_1.applyRatioToImageSize)("x1900x", siteContext.themeConf.pixelRatio),
|
|
58
|
+
});
|
|
59
|
+
dataZoomSrc = options?.absoluteImageUrls
|
|
60
|
+
? (0, public_server_lib_1.toAbsoluteUrl)(siteContext, zoomImage.url)
|
|
61
|
+
: zoomImage.url;
|
|
62
|
+
}
|
|
63
|
+
imgAttributes = {
|
|
64
|
+
dataZoomSrc,
|
|
65
|
+
src: options?.absoluteImageUrls ? (0, public_server_lib_1.toAbsoluteUrl)(siteContext, image.url) : image.url,
|
|
66
|
+
width: Math.round(image.width / siteContext.themeConf.pixelRatio),
|
|
67
|
+
height: Math.round(image.height / siteContext.themeConf.pixelRatio),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
const src = (0, data_formatters_lib_1.strValOrUndef)(value.src, { varName: "src" });
|
|
72
|
+
if (!src) {
|
|
73
|
+
siteContext.siteLog.warn("missing 'uid' and 'src' in 'img' blot");
|
|
74
|
+
return "";
|
|
75
|
+
}
|
|
76
|
+
imgAttributes = {
|
|
77
|
+
dataZoomSrc: hasZoom ? src : undefined,
|
|
78
|
+
src,
|
|
79
|
+
width: (0, data_formatters_lib_1.nbValOrUndef)(value.width),
|
|
80
|
+
height: (0, data_formatters_lib_1.nbValOrUndef)(value.height),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const attributes = [];
|
|
84
|
+
if (imgAttributes.dataZoomSrc) {
|
|
85
|
+
attributes.push(`data-zoom-src="${(0, public_server_lib_1.escapeHtml)(imgAttributes.dataZoomSrc)}"`);
|
|
86
|
+
}
|
|
87
|
+
attributes.push(`src="${(0, public_server_lib_1.escapeHtml)(imgAttributes.src)}"`);
|
|
88
|
+
attributes.push(`class="Img${align ? ` ${(0, public_server_lib_1.escapeHtml)(align)}` : ""}"`);
|
|
89
|
+
attributes.push(`loading="lazy"`);
|
|
90
|
+
if (imgAttributes.width !== undefined)
|
|
91
|
+
attributes.push(`width="${imgAttributes.width}"`);
|
|
92
|
+
if (imgAttributes.height !== undefined)
|
|
93
|
+
attributes.push(`height="${imgAttributes.height}"`);
|
|
94
|
+
return `<img ${attributes.join(" ")}>`;
|
|
95
|
+
}
|
|
96
|
+
function preprocessDelta(ops) {
|
|
97
|
+
for (const op of ops) {
|
|
98
|
+
if (!op.insert || !op.attributes?.obfuscate)
|
|
99
|
+
continue;
|
|
100
|
+
op.insert = {
|
|
101
|
+
obfuscate: op.insert,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function obfuscateBlotProcessing(value, inlineAttributes) {
|
|
106
|
+
const textVal = (0, data_formatters_lib_1.strValOrUndef)(value);
|
|
107
|
+
if (!textVal)
|
|
108
|
+
return "";
|
|
109
|
+
const asALink = formatObfuscateAsALink((0, data_formatters_lib_1.strVal)(inlineAttributes.obfuscate));
|
|
110
|
+
let obfuscatedVal;
|
|
111
|
+
if (asALink === "mailto" || asALink === "tel") {
|
|
112
|
+
obfuscatedVal = (0, public_server_lib_1.obfuscateAsHtmlLink)(textVal);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
obfuscatedVal = (0, public_server_lib_1.generateObfuscatedHtml)(textVal);
|
|
116
|
+
}
|
|
117
|
+
let result = obfuscatedVal;
|
|
118
|
+
if (inlineAttributes.strike) {
|
|
119
|
+
result = `<s>${result}</s>`;
|
|
120
|
+
}
|
|
121
|
+
if (inlineAttributes.italic) {
|
|
122
|
+
result = `<em>${result}</em>`;
|
|
123
|
+
}
|
|
124
|
+
if (inlineAttributes.bold) {
|
|
125
|
+
result = `<strong>${result}</strong>`;
|
|
126
|
+
}
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
129
|
+
function formatObfuscateAsALink(val) {
|
|
130
|
+
if (val === "raw")
|
|
131
|
+
return "raw";
|
|
132
|
+
if (val === "mailto")
|
|
133
|
+
return "mailto";
|
|
134
|
+
if (val === "tel")
|
|
135
|
+
return "tel";
|
|
136
|
+
throw new Error(`invalid link-type '${val}'`);
|
|
137
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@paroicms/quill-editor-plugin",
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "Quill Editor for ParoiCMS",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"paroicms",
|
|
7
|
+
"quill",
|
|
8
|
+
"plugin",
|
|
9
|
+
"editor"
|
|
10
|
+
],
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "https://gitlab.com/paroi/opensource/paroicms.git",
|
|
14
|
+
"directory": "plugins/quill-editor"
|
|
15
|
+
},
|
|
16
|
+
"author": "Paroi Team",
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"scripts": {
|
|
19
|
+
"dev": "vite",
|
|
20
|
+
"clear": "rimraf bo-dist/*",
|
|
21
|
+
"preview": "vite preview",
|
|
22
|
+
"build": "npm run build:backend && npm run build:frontend",
|
|
23
|
+
"build:backend": "tsc --project tsconfig.backend.json",
|
|
24
|
+
"build:frontend": "tsc && vite build"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@paroi/quill-delta-to-html": "~0.12.2",
|
|
28
|
+
"@paroi/data-formatters-lib": "~0.4.0"
|
|
29
|
+
},
|
|
30
|
+
"peerDependencies": {
|
|
31
|
+
"@paroicms/internal-anywhere-lib": "1",
|
|
32
|
+
"@paroicms/public-server-lib": "0"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@paroicms/public-anywhere-lib": "0.2.0",
|
|
36
|
+
"@paroicms/public-front-lib": "0.7.0",
|
|
37
|
+
"@paroicms/public-server-lib": "0.6.0",
|
|
38
|
+
"@solid-primitives/i18n": "~2.1.1",
|
|
39
|
+
"quill": "~2.0.2",
|
|
40
|
+
"rimraf": "~5.0.5",
|
|
41
|
+
"sass": "~1.76.0",
|
|
42
|
+
"solid-devtools": "~0.30.1",
|
|
43
|
+
"solid-js": "~1.8.17",
|
|
44
|
+
"typescript": "~5.4.5",
|
|
45
|
+
"vite": "~5.2.11",
|
|
46
|
+
"vite-plugin-solid": "~2.10.2"
|
|
47
|
+
},
|
|
48
|
+
"main": "plugin.cjs",
|
|
49
|
+
"files": [
|
|
50
|
+
"bo-dist",
|
|
51
|
+
"dist-backend",
|
|
52
|
+
"plugin.cjs"
|
|
53
|
+
]
|
|
54
|
+
}
|
package/plugin.cjs
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
const { join } = require("path");
|
|
2
|
+
const { version } = require("./package.json");
|
|
3
|
+
const { convertQuillDeltaToHtml, convertQuillDeltaToPlainText } = require("./dist-backend/quill-delta")
|
|
4
|
+
|
|
5
|
+
module.exports = {
|
|
6
|
+
boPluginDir: join(__dirname, "bo-dist"),
|
|
7
|
+
version,
|
|
8
|
+
siteInit(api) {
|
|
9
|
+
api.registerFieldProcessor("quillDelta", (ctx, value, options) => {
|
|
10
|
+
if (value !== undefined && value !== null && typeof value === "object" && "delta" in value && value.delta) {
|
|
11
|
+
const delta = value.delta;
|
|
12
|
+
if (options.outputType === "plainText") return convertQuillDeltaToPlainText(delta, ctx.siteContext)
|
|
13
|
+
else return convertQuillDeltaToHtml(ctx, delta, options)
|
|
14
|
+
} else return undefined
|
|
15
|
+
})
|
|
16
|
+
}
|
|
17
|
+
};
|