@bbl-digital/snorre 4.0.96 → 4.0.97
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/bundle.js +37 -15
- package/esm/core/QuillEditor/classes/IndentAttributor.js +15 -0
- package/esm/core/QuillEditor/classes/LinkSanitizer.js +21 -0
- package/esm/core/QuillEditor/classes/ListContainer.js +20 -0
- package/esm/core/QuillEditor/classes/ListItem.js +24 -0
- package/esm/core/QuillEditor/index.js +5 -3
- package/lib/core/QuillEditor/classes/IndentAttributor.d.ts +7 -0
- package/lib/core/QuillEditor/classes/IndentAttributor.d.ts.map +1 -0
- package/lib/core/QuillEditor/classes/IndentAttributor.js +15 -0
- package/lib/core/QuillEditor/classes/LinkSanitizer.d.ts +6 -0
- package/lib/core/QuillEditor/classes/LinkSanitizer.d.ts.map +1 -0
- package/lib/core/QuillEditor/classes/LinkSanitizer.js +21 -0
- package/lib/core/QuillEditor/classes/ListContainer.d.ts +10 -0
- package/lib/core/QuillEditor/classes/ListContainer.d.ts.map +1 -0
- package/lib/core/QuillEditor/classes/ListContainer.js +20 -0
- package/lib/core/QuillEditor/classes/ListItem.d.ts +10 -0
- package/lib/core/QuillEditor/classes/ListItem.d.ts.map +1 -0
- package/lib/core/QuillEditor/classes/ListItem.js +24 -0
- package/lib/core/QuillEditor/index.d.ts.map +1 -1
- package/lib/core/QuillEditor/index.js +5 -3
- package/package.json +1 -1
package/dist/bundle.js
CHANGED
@@ -1673,7 +1673,7 @@
|
|
1673
1673
|
const setDisabled = theme => /*#__PURE__*/react.css("color:", theme.btnDisabled, ";text-decoration:none;" + (process.env.NODE_ENV === "production" ? "" : ";label:setDisabled;"), process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wYWNrYWdlcy9jb3JlL0xpbmsvc3R5bGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXdFb0QiLCJmaWxlIjoiLi4vLi4vLi4vc3JjL3BhY2thZ2VzL2NvcmUvTGluay9zdHlsZXMudHMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCdcbmltcG9ydCB7IGNzcyB9IGZyb20gJ0BlbW90aW9uL3JlYWN0J1xuaW1wb3J0IHsgSUFwcFRoZW1lIH0gZnJvbSAnLi4vLi4vYXBwLXNoZWxsL3RoZW1lJ1xuXG5leHBvcnQgY29uc3QgSWNvbkxpbmtXcmFwcGVyID0gc3R5bGVkLnNwYW5gXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5gXG5cbmV4cG9ydCBjb25zdCBOb1N0eWxlID0gY3NzYFxuICBjb2xvcjogaW5oZXJpdDtcbiAgZm9udC1zaXplOiBpbmhlcml0O1xuICBmb250LXdlaWdodDogaW5oZXJpdDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlcjogbm9uZTtcbmBcblxuZXhwb3J0IGNvbnN0IExpbmtTdHlsZSA9IGNzc2BcbiAgYmFja2dyb3VuZDogbm9uZTtcbiAgYm9yZGVyOiBub25lO1xuICBvdXRsaW5lOiBub25lO1xuICBjb2xvcjogIzE2NTdlMjtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBmb250LXdlaWdodDogNjAwO1xuICBsZXR0ZXItc3BhY2luZzogMDtcbiAgbGluZS1oZWlnaHQ6IDIwcHg7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICBjdXJzb3I6IHBvaW50ZXI7XG5cbiAgJjpob3ZlcixcbiAgJjpmb2N1cyxcbiAgJjphY3RpdmUge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgfVxuXG4gICY6Zm9jdXMtdmlzaWJsZSB7XG4gICAgb3V0bGluZTogMXB4IGRvdHRlZCAjMjEyMTIxO1xuICAgIG91dGxpbmU6IDVweCBhdXRvIC13ZWJraXQtZm9jdXMtcmluZy1jb2xvcjtcbiAgfVxuYFxuXG5leHBvcnQgY29uc3QgZGFuZ2VyU3R5bGVzID0gKHRoZW1lOiBJQXBwVGhlbWUpID0+IGNzc2BcbiAgY29sb3I6ICR7dGhlbWUuYnRuRGFuZ2VyfTtcbmBcblxuZXhwb3J0IGNvbnN0IG5vUGFkZGluZyA9IGNzc2BcbiAgcGFkZGluZzogMDtcbmBcblxuZXhwb3J0IGNvbnN0IHNldEFsaWduID0gKGFsaWduOiBzdHJpbmcpID0+IGNzc2BcbiAgdGV4dC1hbGlnbjogJHthbGlnbn07XG5gXG5cbmV4cG9ydCBjb25zdCBzbWFsbFRleHQgPSBjc3NgXG4gIGZvbnQtc2l6ZTogMTRweDtcbmBcblxuZXhwb3J0IGNvbnN0IHVuZGVybGluZU5vbmUgPSBjc3NgXG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcblxuICAmOmhvdmVyLFxuICAmOmZvY3VzIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgfVxuYFxuXG5leHBvcnQgY29uc3Qgc2V0V29yZEJyZWFrID0gKHZhbHVlOiBzdHJpbmcpID0+IGNzc2BcbiAgd29yZC1icmVhazogJHt2YWx1ZX07XG5gXG5cbmV4cG9ydCBjb25zdCBzZXREaXNhYmxlZCA9ICh0aGVtZTogSUFwcFRoZW1lKSA9PiBjc3NgXG4gIGNvbG9yOiAke3RoZW1lLmJ0bkRpc2FibGVkfTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuYFxuIl19 */");
|
1674
1674
|
|
1675
1675
|
/** @jsxImportSource @emotion/react */
|
1676
|
-
const Link = props => {
|
1676
|
+
const Link$1 = props => {
|
1677
1677
|
const {
|
1678
1678
|
disabled,
|
1679
1679
|
children,
|
@@ -2117,7 +2117,7 @@
|
|
2117
2117
|
};
|
2118
2118
|
|
2119
2119
|
function _EMOTION_STRINGIFIED_CSS_ERROR__$15() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; }
|
2120
|
-
const Wrapper$B = /*#__PURE__*/_styled__default["default"](Link, process.env.NODE_ENV === "production" ? {
|
2120
|
+
const Wrapper$B = /*#__PURE__*/_styled__default["default"](Link$1, process.env.NODE_ENV === "production" ? {
|
2121
2121
|
target: "e17wos1x0"
|
2122
2122
|
} : {
|
2123
2123
|
target: "e17wos1x0",
|
@@ -2146,7 +2146,7 @@
|
|
2146
2146
|
};
|
2147
2147
|
|
2148
2148
|
function _EMOTION_STRINGIFIED_CSS_ERROR__$14() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; }
|
2149
|
-
const Wrapper$A = /*#__PURE__*/_styled__default["default"](Link, process.env.NODE_ENV === "production" ? {
|
2149
|
+
const Wrapper$A = /*#__PURE__*/_styled__default["default"](Link$1, process.env.NODE_ENV === "production" ? {
|
2150
2150
|
target: "ejgzy2n0"
|
2151
2151
|
} : {
|
2152
2152
|
target: "ejgzy2n0",
|
@@ -25646,7 +25646,7 @@
|
|
25646
25646
|
onClick,
|
25647
25647
|
children
|
25648
25648
|
}) => {
|
25649
|
-
return jsxRuntime.jsx(Link, {
|
25649
|
+
return jsxRuntime.jsx(Link$1, {
|
25650
25650
|
trackingName: "Topbar",
|
25651
25651
|
trackingEvent: 'Usermenu click: ' + (children ? children : ''),
|
25652
25652
|
css: theme => [userMenuOption(theme)],
|
@@ -28349,7 +28349,7 @@
|
|
28349
28349
|
};
|
28350
28350
|
|
28351
28351
|
function _EMOTION_STRINGIFIED_CSS_ERROR__$I() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; }
|
28352
|
-
const Wrapper$o = /*#__PURE__*/_styled__default["default"](Link, process.env.NODE_ENV === "production" ? {
|
28352
|
+
const Wrapper$o = /*#__PURE__*/_styled__default["default"](Link$1, process.env.NODE_ENV === "production" ? {
|
28353
28353
|
shouldForwardProp: pro => pro !== 'isLightTheme',
|
28354
28354
|
target: "eerewvt2"
|
28355
28355
|
} : {
|
@@ -28541,7 +28541,7 @@
|
|
28541
28541
|
};
|
28542
28542
|
|
28543
28543
|
function _EMOTION_STRINGIFIED_CSS_ERROR__$G() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; }
|
28544
|
-
const StyledLink = /*#__PURE__*/_styled__default["default"](Link, process.env.NODE_ENV === "production" ? {
|
28544
|
+
const StyledLink = /*#__PURE__*/_styled__default["default"](Link$1, process.env.NODE_ENV === "production" ? {
|
28545
28545
|
target: "e12msqxg2"
|
28546
28546
|
} : {
|
28547
28547
|
target: "e12msqxg2",
|
@@ -28651,7 +28651,7 @@
|
|
28651
28651
|
});
|
28652
28652
|
};
|
28653
28653
|
|
28654
|
-
const Wrapper$k = /*#__PURE__*/_styled__default["default"](Link, process.env.NODE_ENV === "production" ? {
|
28654
|
+
const Wrapper$k = /*#__PURE__*/_styled__default["default"](Link$1, process.env.NODE_ENV === "production" ? {
|
28655
28655
|
target: "e1s7qlfe0"
|
28656
28656
|
} : {
|
28657
28657
|
target: "e1s7qlfe0",
|
@@ -31500,7 +31500,7 @@
|
|
31500
31500
|
onClick,
|
31501
31501
|
children
|
31502
31502
|
}) => {
|
31503
|
-
return jsxRuntime.jsxs(Link, {
|
31503
|
+
return jsxRuntime.jsxs(Link$1, {
|
31504
31504
|
role: "menuitem",
|
31505
31505
|
trackingName: "Topbar",
|
31506
31506
|
trackingEvent: 'DropdownMenu click: ' + (children ? children : ''),
|
@@ -32281,7 +32281,7 @@
|
|
32281
32281
|
disabled
|
32282
32282
|
}) => onClick ? jsxRuntime.jsx(SelectOption, {
|
32283
32283
|
tabIndex: 0,
|
32284
|
-
children: jsxRuntime.jsx(Link, {
|
32284
|
+
children: jsxRuntime.jsx(Link$1, {
|
32285
32285
|
nopadding: true,
|
32286
32286
|
onClick: onClick,
|
32287
32287
|
children: displayText || value
|
@@ -32431,7 +32431,7 @@
|
|
32431
32431
|
indent,
|
32432
32432
|
disabled
|
32433
32433
|
}) => onClick ? jsxRuntime.jsx(SelectLinkWrapper, {
|
32434
|
-
children: jsxRuntime.jsx(Link, {
|
32434
|
+
children: jsxRuntime.jsx(Link$1, {
|
32435
32435
|
nopadding: true,
|
32436
32436
|
small: true,
|
32437
32437
|
onClick: onClick,
|
@@ -32814,7 +32814,7 @@
|
|
32814
32814
|
text: open ? notice.bodyHtml : notice.bodyHtml.substring(0, 2000)
|
32815
32815
|
})
|
32816
32816
|
}), !showAllContent && /*#__PURE__*/jsxRuntime$1.jsx(Div, {
|
32817
|
-
children: /*#__PURE__*/jsxRuntime$1.jsx(Link, {
|
32817
|
+
children: /*#__PURE__*/jsxRuntime$1.jsx(Link$1, {
|
32818
32818
|
onClick: () => setOpen(!open),
|
32819
32819
|
children: open ? 'Vis mindre' : 'Les mer'
|
32820
32820
|
})
|
@@ -33435,7 +33435,7 @@
|
|
33435
33435
|
css: theme => [styles$6.default(theme), (props.invalid || props.invalidMessage) && styles$6.invalid(theme), props.validation && styles$6.validation, props.onLabelClick && styles$6.clickableLabel, height && styles$6.height(height), css && css],
|
33436
33436
|
children: [jsxRuntime.jsxs("span", {
|
33437
33437
|
css: styles$6.label,
|
33438
|
-
children: [props.label && (props.onLabelClick ? jsxRuntime.jsx(Link, {
|
33438
|
+
children: [props.label && (props.onLabelClick ? jsxRuntime.jsx(Link$1, {
|
33439
33439
|
textAlign: "left",
|
33440
33440
|
removeUnderline: true,
|
33441
33441
|
onClick: props.onLabelClick,
|
@@ -33780,7 +33780,7 @@ to {top: 100vh;}
|
|
33780
33780
|
bold: true,
|
33781
33781
|
whiteSpace: "nowrap",
|
33782
33782
|
children: title
|
33783
|
-
}), isMobile && jsxRuntime.jsx(Link, {
|
33783
|
+
}), isMobile && jsxRuntime.jsx(Link$1, {
|
33784
33784
|
removeUnderline: true,
|
33785
33785
|
onClick: handleClose,
|
33786
33786
|
children: "Lukk"
|
@@ -33795,7 +33795,7 @@ to {top: 100vh;}
|
|
33795
33795
|
lightGray: true,
|
33796
33796
|
margin: "0.5em"
|
33797
33797
|
}), jsxRuntime.jsxs(ActionButtons, {
|
33798
|
-
children: [onClear && hasFilters && !isMobile && jsxRuntime.jsx(Link, {
|
33798
|
+
children: [onClear && hasFilters && !isMobile && jsxRuntime.jsx(Link$1, {
|
33799
33799
|
onClick: () => {
|
33800
33800
|
onClear();
|
33801
33801
|
if (closeOnClear) handleClose();
|
@@ -35384,6 +35384,27 @@ to {top: 100vh;}
|
|
35384
35384
|
}
|
35385
35385
|
}
|
35386
35386
|
|
35387
|
+
const Link = Quill__default["default"].import('formats/link');
|
35388
|
+
Link.PROTOCOL_WHITELIST = ['http', 'https', 'mailto', 'tel', 'radar', 'rdar', 'smb', 'sms'];
|
35389
|
+
class CustomLinkSanitizer extends Link {
|
35390
|
+
static sanitize(url) {
|
35391
|
+
// Run default sanitize method from Quill
|
35392
|
+
const sanitizedUrl = super.sanitize(url);
|
35393
|
+
|
35394
|
+
// Not whitelisted URL based on protocol so, let's return `blank`
|
35395
|
+
if (!sanitizedUrl || sanitizedUrl === 'about:blank') return sanitizedUrl;
|
35396
|
+
|
35397
|
+
// Verify if the URL already have a whitelisted protocol
|
35398
|
+
const hasWhitelistedProtocol = this.PROTOCOL_WHITELIST.some(function (protocol) {
|
35399
|
+
return sanitizedUrl.startsWith(protocol);
|
35400
|
+
});
|
35401
|
+
if (hasWhitelistedProtocol) return sanitizedUrl;
|
35402
|
+
|
35403
|
+
// if not, then append only 'http' to not to be a relative URL
|
35404
|
+
return `http://${sanitizedUrl}`;
|
35405
|
+
}
|
35406
|
+
}
|
35407
|
+
|
35387
35408
|
/** @jsxImportSource @emotion/react */
|
35388
35409
|
const Parchment = Quill__default["default"].import('parchment');
|
35389
35410
|
|
@@ -35427,6 +35448,7 @@ to {top: 100vh;}
|
|
35427
35448
|
'formats/list': Container,
|
35428
35449
|
'formats/ulist': MyListItem
|
35429
35450
|
});
|
35451
|
+
Quill__default["default"].register(CustomLinkSanitizer, true);
|
35430
35452
|
const QuillEditor = ({
|
35431
35453
|
height,
|
35432
35454
|
width,
|
@@ -35946,7 +35968,7 @@ to {top: 100vh;}
|
|
35946
35968
|
exports.Key = Key;
|
35947
35969
|
exports.Layout = Layout;
|
35948
35970
|
exports.LayoutShell = LayoutShell;
|
35949
|
-
exports.Link = Link;
|
35971
|
+
exports.Link = Link$1;
|
35950
35972
|
exports.List = List;
|
35951
35973
|
exports.ListItem = ListItem$2;
|
35952
35974
|
exports.ListPager = ListPager;
|
@@ -0,0 +1,15 @@
|
|
1
|
+
import Quill from 'quill';
|
2
|
+
const Parchment = Quill.import('parchment');
|
3
|
+
export class IndentAttributor extends Parchment.StyleAttributor {
|
4
|
+
constructor(...args) {
|
5
|
+
super(...args);
|
6
|
+
}
|
7
|
+
add(node, value) {
|
8
|
+
if (value === 0) {
|
9
|
+
this.remove(node);
|
10
|
+
return true;
|
11
|
+
} else {
|
12
|
+
return super.add(node, `${value}em`);
|
13
|
+
}
|
14
|
+
}
|
15
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import Quill from 'quill';
|
2
|
+
const Link = Quill.import('formats/link');
|
3
|
+
Link.PROTOCOL_WHITELIST = ['http', 'https', 'mailto', 'tel', 'radar', 'rdar', 'smb', 'sms'];
|
4
|
+
export class CustomLinkSanitizer extends Link {
|
5
|
+
static sanitize(url) {
|
6
|
+
// Run default sanitize method from Quill
|
7
|
+
const sanitizedUrl = super.sanitize(url);
|
8
|
+
|
9
|
+
// Not whitelisted URL based on protocol so, let's return `blank`
|
10
|
+
if (!sanitizedUrl || sanitizedUrl === 'about:blank') return sanitizedUrl;
|
11
|
+
|
12
|
+
// Verify if the URL already have a whitelisted protocol
|
13
|
+
const hasWhitelistedProtocol = this.PROTOCOL_WHITELIST.some(function (protocol) {
|
14
|
+
return sanitizedUrl.startsWith(protocol);
|
15
|
+
});
|
16
|
+
if (hasWhitelistedProtocol) return sanitizedUrl;
|
17
|
+
|
18
|
+
// if not, then append only 'http' to not to be a relative URL
|
19
|
+
return `http://${sanitizedUrl}`;
|
20
|
+
}
|
21
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import Quill from 'quill';
|
2
|
+
const ListContainer = Quill.import('formats/list-container');
|
3
|
+
export class MyListContainer extends ListContainer {
|
4
|
+
static tagName = ['OL', 'UL'];
|
5
|
+
static defaultTag = 'OL';
|
6
|
+
static create(value) {
|
7
|
+
return document.createElement(this.getTag(value));
|
8
|
+
}
|
9
|
+
static getTag(val) {
|
10
|
+
const map = {
|
11
|
+
bullet: 'UL',
|
12
|
+
ordered: 'OL'
|
13
|
+
};
|
14
|
+
return map[val] || this.defaultTag;
|
15
|
+
}
|
16
|
+
checkMerge() {
|
17
|
+
// Only merge if the next list is the same type as this one
|
18
|
+
return super.checkMerge() && this.domNode.tagName === this.next?.domNode.tagName;
|
19
|
+
}
|
20
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
import Quill from 'quill';
|
2
|
+
import { MyListContainer } from './ListContainer';
|
3
|
+
const ListItem = Quill.import('formats/list');
|
4
|
+
class MyListItem extends ListItem {
|
5
|
+
static requiredContainer = MyListContainer;
|
6
|
+
static register() {
|
7
|
+
Quill.register(MyListContainer, true);
|
8
|
+
}
|
9
|
+
optimize(context) {
|
10
|
+
if (this.statics.requiredContainer && !(this.parent instanceof this.statics.requiredContainer)) {
|
11
|
+
// Insert the format value (bullet, ordered) into wrap arguments
|
12
|
+
this.wrap(this.statics.requiredContainer.blotName, MyListItem.formats(this.domNode));
|
13
|
+
}
|
14
|
+
super.optimize(context);
|
15
|
+
}
|
16
|
+
format(name, value) {
|
17
|
+
// If the list type is different, wrap this list item in a new MyListContainer of that type
|
18
|
+
if (name === ListItem.blotName && value !== MyListItem.formats(this.domNode)) {
|
19
|
+
this.wrap(this.statics.requiredContainer.blotName, value);
|
20
|
+
}
|
21
|
+
super.format(name, value);
|
22
|
+
}
|
23
|
+
}
|
24
|
+
export { MyListItem as default };
|
@@ -7,9 +7,10 @@ import { ErrorWrapper, Label, styles } from './styles';
|
|
7
7
|
import Text from '../Text';
|
8
8
|
import IconErrorOutline from '../../icons/General/IconErrorOutline';
|
9
9
|
import { useTheme } from '@emotion/react';
|
10
|
-
import MyListItem from './
|
11
|
-
import {
|
12
|
-
import {
|
10
|
+
import MyListItem from './classes/ListItem';
|
11
|
+
import { IndentAttributor } from './classes/IndentAttributor';
|
12
|
+
import { CustomLinkSanitizer } from './classes/LinkSanitizer';
|
13
|
+
import { MyListContainer } from './classes/ListContainer';
|
13
14
|
import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
|
14
15
|
const Parchment = Quill.import('parchment');
|
15
16
|
|
@@ -53,6 +54,7 @@ Quill.register({
|
|
53
54
|
'formats/list': Container,
|
54
55
|
'formats/ulist': MyListItem
|
55
56
|
});
|
57
|
+
Quill.register(CustomLinkSanitizer, true);
|
56
58
|
const QuillEditor = ({
|
57
59
|
height,
|
58
60
|
width,
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"IndentAttributor.d.ts","sourceRoot":"","sources":["../../../../src/packages/core/QuillEditor/classes/IndentAttributor.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,SAAS,EAAgC,GAAG,CAAA;AAClD,qBAAa,gBAAiB,SAAQ,SAAS,CAAC,eAAe;gBACjD,GAAG,IAAI,EAAE,GAAG;IAGxB,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG;CAQ1B"}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
import Quill from 'quill';
|
2
|
+
const Parchment = Quill.import('parchment');
|
3
|
+
export class IndentAttributor extends Parchment.StyleAttributor {
|
4
|
+
constructor(...args) {
|
5
|
+
super(...args);
|
6
|
+
}
|
7
|
+
add(node, value) {
|
8
|
+
if (value === 0) {
|
9
|
+
this.remove(node);
|
10
|
+
return true;
|
11
|
+
} else {
|
12
|
+
return super.add(node, `${value}em`);
|
13
|
+
}
|
14
|
+
}
|
15
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"LinkSanitizer.d.ts","sourceRoot":"","sources":["../../../../src/packages/core/QuillEditor/classes/LinkSanitizer.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,IAAI,EAAmC,GAAG,CAAA;AAYhD,qBAAa,mBAAoB,SAAQ,IAAI;IAC3C,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM;CAmB5B"}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import Quill from 'quill';
|
2
|
+
const Link = Quill.import('formats/link');
|
3
|
+
Link.PROTOCOL_WHITELIST = ['http', 'https', 'mailto', 'tel', 'radar', 'rdar', 'smb', 'sms'];
|
4
|
+
export class CustomLinkSanitizer extends Link {
|
5
|
+
static sanitize(url) {
|
6
|
+
// Run default sanitize method from Quill
|
7
|
+
const sanitizedUrl = super.sanitize(url);
|
8
|
+
|
9
|
+
// Not whitelisted URL based on protocol so, let's return `blank`
|
10
|
+
if (!sanitizedUrl || sanitizedUrl === 'about:blank') return sanitizedUrl;
|
11
|
+
|
12
|
+
// Verify if the URL already have a whitelisted protocol
|
13
|
+
const hasWhitelistedProtocol = this.PROTOCOL_WHITELIST.some(function (protocol) {
|
14
|
+
return sanitizedUrl.startsWith(protocol);
|
15
|
+
});
|
16
|
+
if (hasWhitelistedProtocol) return sanitizedUrl;
|
17
|
+
|
18
|
+
// if not, then append only 'http' to not to be a relative URL
|
19
|
+
return `http://${sanitizedUrl}`;
|
20
|
+
}
|
21
|
+
}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
declare const ListContainer: any;
|
2
|
+
export declare class MyListContainer extends ListContainer {
|
3
|
+
static tagName: string[];
|
4
|
+
static defaultTag: string;
|
5
|
+
static create(value: 'bullet' | 'ordered'): HTMLElement;
|
6
|
+
static getTag(val: 'bullet' | 'ordered'): string;
|
7
|
+
checkMerge(): any;
|
8
|
+
}
|
9
|
+
export {};
|
10
|
+
//# sourceMappingURL=ListContainer.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ListContainer.d.ts","sourceRoot":"","sources":["../../../../src/packages/core/QuillEditor/classes/ListContainer.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,aAAa,EAA6C,GAAG,CAAA;AACnE,qBAAa,eAAgB,SAAQ,aAAa;IAChD,MAAM,CAAC,OAAO,WAAe;IAC7B,MAAM,CAAC,UAAU,SAAO;IAExB,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS;IAIzC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,GAAG,SAAS;IAQvC,UAAU;CAMX"}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import Quill from 'quill';
|
2
|
+
const ListContainer = Quill.import('formats/list-container');
|
3
|
+
export class MyListContainer extends ListContainer {
|
4
|
+
static tagName = ['OL', 'UL'];
|
5
|
+
static defaultTag = 'OL';
|
6
|
+
static create(value) {
|
7
|
+
return document.createElement(this.getTag(value));
|
8
|
+
}
|
9
|
+
static getTag(val) {
|
10
|
+
const map = {
|
11
|
+
bullet: 'UL',
|
12
|
+
ordered: 'OL'
|
13
|
+
};
|
14
|
+
return map[val] || this.defaultTag;
|
15
|
+
}
|
16
|
+
checkMerge() {
|
17
|
+
// Only merge if the next list is the same type as this one
|
18
|
+
return super.checkMerge() && this.domNode.tagName === this.next?.domNode.tagName;
|
19
|
+
}
|
20
|
+
}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import { MyListContainer } from './ListContainer';
|
2
|
+
declare const ListItem: any;
|
3
|
+
declare class MyListItem extends ListItem {
|
4
|
+
static requiredContainer: typeof MyListContainer;
|
5
|
+
static register(): void;
|
6
|
+
optimize(context: any): void;
|
7
|
+
format(name: any, value: any): void;
|
8
|
+
}
|
9
|
+
export { MyListItem as default };
|
10
|
+
//# sourceMappingURL=ListItem.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ListItem.d.ts","sourceRoot":"","sources":["../../../../src/packages/core/QuillEditor/classes/ListItem.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,QAAA,MAAM,QAAQ,EAAmC,GAAG,CAAA;AACpD,cAAM,UAAW,SAAQ,QAAQ;IAC/B,MAAM,CAAC,iBAAiB,yBAAkB;IAE1C,MAAM,CAAC,QAAQ;IAIf,QAAQ,CAAC,OAAO,EAAE,GAAG;IAcrB,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG;CAU7B;AAED,OAAO,EAAE,UAAU,IAAI,OAAO,EAAE,CAAA"}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
import Quill from 'quill';
|
2
|
+
import { MyListContainer } from './ListContainer';
|
3
|
+
const ListItem = Quill.import('formats/list');
|
4
|
+
class MyListItem extends ListItem {
|
5
|
+
static requiredContainer = MyListContainer;
|
6
|
+
static register() {
|
7
|
+
Quill.register(MyListContainer, true);
|
8
|
+
}
|
9
|
+
optimize(context) {
|
10
|
+
if (this.statics.requiredContainer && !(this.parent instanceof this.statics.requiredContainer)) {
|
11
|
+
// Insert the format value (bullet, ordered) into wrap arguments
|
12
|
+
this.wrap(this.statics.requiredContainer.blotName, MyListItem.formats(this.domNode));
|
13
|
+
}
|
14
|
+
super.optimize(context);
|
15
|
+
}
|
16
|
+
format(name, value) {
|
17
|
+
// If the list type is different, wrap this list item in a new MyListContainer of that type
|
18
|
+
if (name === ListItem.blotName && value !== MyListItem.formats(this.domNode)) {
|
19
|
+
this.wrap(this.statics.requiredContainer.blotName, value);
|
20
|
+
}
|
21
|
+
super.format(name, value);
|
22
|
+
}
|
23
|
+
}
|
24
|
+
export { MyListItem as default };
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/packages/core/QuillEditor/index.tsx"],"names":[],"mappings":"AAGA,OAAO,2BAA2B,CAAA;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/packages/core/QuillEditor/index.tsx"],"names":[],"mappings":"AAGA,OAAO,2BAA2B,CAAA;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AA+D3C,QAAA,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA+L3C,CAAA;AAED,eAAe,WAAW,CAAA"}
|
@@ -7,9 +7,10 @@ import { ErrorWrapper, Label, styles } from './styles';
|
|
7
7
|
import Text from '../Text';
|
8
8
|
import IconErrorOutline from '../../icons/General/IconErrorOutline';
|
9
9
|
import { useTheme } from '@emotion/react';
|
10
|
-
import MyListItem from './
|
11
|
-
import {
|
12
|
-
import {
|
10
|
+
import MyListItem from './classes/ListItem';
|
11
|
+
import { IndentAttributor } from './classes/IndentAttributor';
|
12
|
+
import { CustomLinkSanitizer } from './classes/LinkSanitizer';
|
13
|
+
import { MyListContainer } from './classes/ListContainer';
|
13
14
|
import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
|
14
15
|
const Parchment = Quill.import('parchment');
|
15
16
|
|
@@ -53,6 +54,7 @@ Quill.register({
|
|
53
54
|
'formats/list': Container,
|
54
55
|
'formats/ulist': MyListItem
|
55
56
|
});
|
57
|
+
Quill.register(CustomLinkSanitizer, true);
|
56
58
|
const QuillEditor = ({
|
57
59
|
height,
|
58
60
|
width,
|