@dso-toolkit/core 34.2.1 → 35.0.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.
Files changed (85) hide show
  1. package/dist/cjs/dso-autosuggest.cjs.entry.js +5 -1
  2. package/dist/cjs/dso-image-overlay.cjs.entry.js +62 -0
  3. package/dist/cjs/dso-ozon-content.cjs.entry.js +281 -423
  4. package/dist/cjs/dso-toolkit.cjs.js +1 -1
  5. package/dist/cjs/dso-viewer-grid.cjs.entry.js +5 -711
  6. package/dist/cjs/focus-trap.esm-8d3e3fb6.js +712 -0
  7. package/dist/cjs/loader.cjs.js +1 -1
  8. package/dist/collection/collection-manifest.json +1 -0
  9. package/dist/collection/components/autosuggest/autosuggest.js +6 -2
  10. package/dist/collection/components/highlight-box/highlight-box.template.js +4 -1
  11. package/dist/collection/components/image-overlay/image-overlay.css +263 -0
  12. package/dist/collection/components/image-overlay/image-overlay.js +72 -0
  13. package/dist/collection/components/image-overlay/image-overlay.template.js +7 -0
  14. package/dist/collection/components/ozon-content/nodes/al.node.js +13 -0
  15. package/dist/collection/components/ozon-content/nodes/document.node.js +9 -0
  16. package/dist/collection/components/ozon-content/nodes/ext-ref.node.js +15 -0
  17. package/dist/collection/components/ozon-content/nodes/fallback.node.js +10 -0
  18. package/dist/collection/components/ozon-content/nodes/illustratie.node.js +13 -0
  19. package/dist/collection/components/ozon-content/nodes/inhoud.node.js +14 -0
  20. package/dist/collection/components/ozon-content/nodes/inline.nodes.js +21 -0
  21. package/dist/collection/components/ozon-content/nodes/int-ref.node.js +26 -0
  22. package/dist/collection/components/ozon-content/nodes/noot.node.js +27 -0
  23. package/dist/collection/components/ozon-content/nodes/table.node/colspec/colspec-mapper.js +39 -0
  24. package/dist/collection/components/ozon-content/nodes/table.node/colspec/colspec.interface.js +2 -0
  25. package/dist/collection/components/ozon-content/nodes/table.node/index.js +1 -0
  26. package/dist/collection/components/ozon-content/nodes/table.node/table-cell.js +25 -0
  27. package/dist/collection/components/ozon-content/nodes/table.node/table-colgroup.js +4 -0
  28. package/dist/collection/components/ozon-content/nodes/table.node/table-rows.js +5 -0
  29. package/dist/collection/components/ozon-content/nodes/table.node/table.node.js +32 -0
  30. package/dist/collection/components/ozon-content/nodes/text.node.js +9 -0
  31. package/dist/collection/components/ozon-content/ozon-content-context.interface.js +1 -0
  32. package/dist/collection/components/ozon-content/ozon-content-mapper.js +76 -0
  33. package/dist/collection/components/ozon-content/ozon-content-node-context.interface.js +1 -0
  34. package/dist/collection/components/ozon-content/ozon-content-node-state.interface.js +1 -0
  35. package/dist/collection/components/ozon-content/ozon-content-node.interface.js +1 -0
  36. package/dist/collection/components/ozon-content/ozon-content.css +15 -7
  37. package/dist/collection/components/ozon-content/ozon-content.js +21 -33
  38. package/dist/collection/components/viewer-grid/viewer-grid.css +30 -2
  39. package/dist/custom-elements/index.d.ts +6 -0
  40. package/dist/custom-elements/index.js +3022 -3103
  41. package/dist/dso-toolkit/dso-toolkit.css +1 -1
  42. package/dist/dso-toolkit/dso-toolkit.esm.js +1 -1
  43. package/dist/dso-toolkit/{p-de3ab027.entry.js → p-225bbb28.entry.js} +1 -5
  44. package/dist/dso-toolkit/p-44905fb1.js +5 -0
  45. package/dist/dso-toolkit/p-c6f467b3.entry.js +1 -0
  46. package/dist/dso-toolkit/p-f193c258.entry.js +1 -0
  47. package/dist/esm/dso-autosuggest.entry.js +5 -1
  48. package/dist/esm/dso-image-overlay.entry.js +58 -0
  49. package/dist/esm/dso-ozon-content.entry.js +282 -424
  50. package/dist/esm/dso-toolkit.js +1 -1
  51. package/dist/esm/dso-viewer-grid.entry.js +3 -709
  52. package/dist/esm/focus-trap.esm-299989f2.js +710 -0
  53. package/dist/esm/loader.js +1 -1
  54. package/dist/types/components/autosuggest/autosuggest.d.ts +15 -1
  55. package/dist/types/components/image-overlay/image-overlay.d.ts +15 -0
  56. package/dist/types/components/image-overlay/image-overlay.template.d.ts +2 -0
  57. package/dist/types/components/ozon-content/nodes/al.node.d.ts +6 -0
  58. package/dist/types/components/ozon-content/nodes/document.node.d.ts +6 -0
  59. package/dist/types/components/ozon-content/nodes/ext-ref.node.d.ts +6 -0
  60. package/dist/types/components/ozon-content/nodes/fallback.node.d.ts +6 -0
  61. package/dist/types/components/ozon-content/nodes/illustratie.node.d.ts +5 -0
  62. package/dist/types/components/ozon-content/nodes/inhoud.node.d.ts +6 -0
  63. package/dist/types/components/ozon-content/nodes/inline.nodes.d.ts +6 -0
  64. package/dist/types/components/ozon-content/nodes/int-ref.node.d.ts +6 -0
  65. package/dist/types/components/ozon-content/nodes/noot.node.d.ts +8 -0
  66. package/dist/types/components/ozon-content/nodes/table.node/colspec/colspec-mapper.d.ts +2 -0
  67. package/dist/types/components/ozon-content/nodes/table.node/colspec/colspec.interface.d.ts +10 -0
  68. package/dist/types/components/ozon-content/nodes/table.node/index.d.ts +1 -0
  69. package/dist/types/components/ozon-content/nodes/table.node/table-cell.d.ts +8 -0
  70. package/dist/types/components/ozon-content/nodes/table.node/table-colgroup.d.ts +5 -0
  71. package/dist/types/components/ozon-content/nodes/table.node/table-rows.d.ts +8 -0
  72. package/dist/types/components/ozon-content/nodes/table.node/table.node.d.ts +7 -0
  73. package/dist/types/components/ozon-content/nodes/text.node.d.ts +5 -0
  74. package/dist/types/components/ozon-content/ozon-content-context.interface.d.ts +8 -0
  75. package/dist/types/components/ozon-content/ozon-content-mapper.d.ts +12 -0
  76. package/dist/types/components/ozon-content/ozon-content-node-context.interface.d.ts +8 -0
  77. package/dist/types/components/ozon-content/ozon-content-node-state.interface.d.ts +3 -0
  78. package/dist/types/components/ozon-content/ozon-content-node.interface.d.ts +8 -0
  79. package/dist/types/components/ozon-content/ozon-content.d.ts +8 -10
  80. package/dist/types/components/ozon-content/ozon-content.interfaces.d.ts +2 -2
  81. package/dist/types/components.d.ts +19 -6
  82. package/package.json +2 -2
  83. package/dist/collection/components/ozon-content/ozon-content.transformer.js +0 -105
  84. package/dist/dso-toolkit/p-20856f91.entry.js +0 -1
  85. package/dist/types/components/ozon-content/ozon-content.transformer.d.ts +0 -15
@@ -4,489 +4,347 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  const index = require('./index-5ea63531.js');
6
6
 
7
- 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); }
8
-
9
- function assertString(input) {
10
- var isString = typeof input === 'string' || input instanceof String;
11
-
12
- if (!isString) {
13
- var invalidType = _typeof(input);
14
-
15
- if (input === null) invalidType = 'null';else if (invalidType === 'object') invalidType = input.constructor.name;
16
- throw new TypeError("Expected a string but received a ".concat(invalidType));
7
+ class OzonContentAlNode {
8
+ constructor() {
9
+ this.name = 'Al';
17
10
  }
18
- }
19
-
20
- function merge() {
21
- var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
22
- var defaults = arguments.length > 1 ? arguments[1] : undefined;
23
-
24
- for (var key in defaults) {
25
- if (typeof obj[key] === 'undefined') {
26
- obj[key] = defaults[key];
27
- }
11
+ render(node, { mapNodeToJsx, path }) {
12
+ const nestedAl = path.some(node => node.nodeName === 'Al');
13
+ const content = mapNodeToJsx(node.childNodes);
14
+ return nestedAl
15
+ ? index.h("span", { role: "paragraph" }, content)
16
+ : index.h("p", null, content);
28
17
  }
29
-
30
- return obj;
31
18
  }
32
19
 
33
- var default_fqdn_options = {
34
- require_tld: true,
35
- allow_underscores: false,
36
- allow_trailing_dot: false,
37
- allow_numeric_tld: false,
38
- allow_wildcard: false
39
- };
40
- function isFQDN(str, options) {
41
- assertString(str);
42
- options = merge(options, default_fqdn_options);
43
- /* Remove the optional trailing dot before checking validity */
44
-
45
- if (options.allow_trailing_dot && str[str.length - 1] === '.') {
46
- str = str.substring(0, str.length - 1);
20
+ class OzonContentDocumentNode {
21
+ constructor() {
22
+ this.name = '#document';
47
23
  }
48
- /* Remove the optional wildcard before checking validity */
49
-
50
-
51
- if (options.allow_wildcard === true && str.indexOf('*.') === 0) {
52
- str = str.substring(2);
24
+ render(node, { mapNodeToJsx }) {
25
+ return index.h(index.Fragment, null, mapNodeToJsx(node.childNodes));
53
26
  }
54
-
55
- var parts = str.split('.');
56
- var tld = parts[parts.length - 1];
57
-
58
- if (options.require_tld) {
59
- // disallow fqdns without tld
60
- if (parts.length < 2) {
61
- return false;
62
- }
63
-
64
- if (!/^([a-z\u00A1-\u00A8\u00AA-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{2,}|xn[a-z0-9-]{2,})$/i.test(tld)) {
65
- return false;
66
- } // disallow spaces
67
-
68
-
69
- if (/\s/.test(tld)) {
70
- return false;
71
- }
72
- } // reject numeric TLDs
73
-
74
-
75
- if (!options.allow_numeric_tld && /^\d+$/.test(tld)) {
76
- return false;
77
- }
78
-
79
- return parts.every(function (part) {
80
- if (part.length > 63) {
81
- return false;
82
- }
83
-
84
- if (!/^[a-z_\u00a1-\uffff0-9-]+$/i.test(part)) {
85
- return false;
86
- } // disallow full-width chars
87
-
88
-
89
- if (/[\uff01-\uff5e]/.test(part)) {
90
- return false;
91
- } // disallow parts starting or ending with hyphen
92
-
93
-
94
- if (/^-|-$/.test(part)) {
95
- return false;
96
- }
97
-
98
- if (!options.allow_underscores && /_/.test(part)) {
99
- return false;
100
- }
101
-
102
- return true;
103
- });
104
27
  }
105
28
 
106
- /**
107
- 11.3. Examples
108
-
109
- The following addresses
110
-
111
- fe80::1234 (on the 1st link of the node)
112
- ff02::5678 (on the 5th link of the node)
113
- ff08::9abc (on the 10th organization of the node)
114
-
115
- would be represented as follows:
116
-
117
- fe80::1234%1
118
- ff02::5678%5
119
- ff08::9abc%10
120
-
121
- (Here we assume a natural translation from a zone index to the
122
- <zone_id> part, where the Nth zone of any scope is translated into
123
- "N".)
124
-
125
- If we use interface names as <zone_id>, those addresses could also be
126
- represented as follows:
127
-
128
- fe80::1234%ne0
129
- ff02::5678%pvc1.3
130
- ff08::9abc%interface10
131
-
132
- where the interface "ne0" belongs to the 1st link, "pvc1.3" belongs
133
- to the 5th link, and "interface10" belongs to the 10th organization.
134
- * * */
135
-
136
- var IPv4SegmentFormat = '(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
137
- var IPv4AddressFormat = "(".concat(IPv4SegmentFormat, "[.]){3}").concat(IPv4SegmentFormat);
138
- var IPv4AddressRegExp = new RegExp("^".concat(IPv4AddressFormat, "$"));
139
- var IPv6SegmentFormat = '(?:[0-9a-fA-F]{1,4})';
140
- var IPv6AddressRegExp = new RegExp('^(' + "(?:".concat(IPv6SegmentFormat, ":){7}(?:").concat(IPv6SegmentFormat, "|:)|") + "(?:".concat(IPv6SegmentFormat, ":){6}(?:").concat(IPv4AddressFormat, "|:").concat(IPv6SegmentFormat, "|:)|") + "(?:".concat(IPv6SegmentFormat, ":){5}(?::").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,2}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){4}(?:(:").concat(IPv6SegmentFormat, "){0,1}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,3}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){3}(?:(:").concat(IPv6SegmentFormat, "){0,2}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,4}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){2}(?:(:").concat(IPv6SegmentFormat, "){0,3}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,5}|:)|") + "(?:".concat(IPv6SegmentFormat, ":){1}(?:(:").concat(IPv6SegmentFormat, "){0,4}:").concat(IPv4AddressFormat, "|(:").concat(IPv6SegmentFormat, "){1,6}|:)|") + "(?::((?::".concat(IPv6SegmentFormat, "){0,5}:").concat(IPv4AddressFormat, "|(?::").concat(IPv6SegmentFormat, "){1,7}|:))") + ')(%[0-9a-zA-Z-.:]{1,})?$');
141
- function isIP(str) {
142
- var version = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
143
- assertString(str);
144
- version = String(version);
145
-
146
- if (!version) {
147
- return isIP(str, 4) || isIP(str, 6);
29
+ class OzonContentExtRefNode {
30
+ constructor() {
31
+ this.name = [
32
+ 'ExtRef',
33
+ 'ExtIoRef'
34
+ ];
148
35
  }
149
-
150
- if (version === '4') {
151
- if (!IPv4AddressRegExp.test(str)) {
152
- return false;
153
- }
154
-
155
- var parts = str.split('.').sort(function (a, b) {
156
- return a - b;
157
- });
158
- return parts[3] <= 255;
36
+ render(node, { mapNodeToJsx }) {
37
+ var _a;
38
+ return (index.h("a", { target: "_blank", rel: "noopener noreferrer", href: (_a = node.getAttribute('ref')) !== null && _a !== void 0 ? _a : undefined },
39
+ index.h("span", { class: "sr-only" }, "opent in nieuw venster"),
40
+ mapNodeToJsx(node.childNodes)));
159
41
  }
42
+ }
160
43
 
161
- if (version === '6') {
162
- return !!IPv6AddressRegExp.test(str);
44
+ class OzonContentIllustratieNode {
45
+ constructor() {
46
+ this.name = [
47
+ 'Illustratie',
48
+ 'InlineTekstAfbeelding'
49
+ ];
50
+ }
51
+ render(node) {
52
+ var _a, _b, _c, _d;
53
+ return (index.h("img", { src: (_a = node.getAttribute('naam')) !== null && _a !== void 0 ? _a : undefined, alt: (_b = node.getAttribute('naam')) !== null && _b !== void 0 ? _b : undefined, height: (_c = node.getAttribute('hoogte')) !== null && _c !== void 0 ? _c : undefined, width: (_d = node.getAttribute('breedte')) !== null && _d !== void 0 ? _d : undefined }));
163
54
  }
164
-
165
- return false;
166
55
  }
167
56
 
168
- function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
169
-
170
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
171
-
172
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
173
-
174
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
175
-
176
- function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
177
-
178
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
179
- /*
180
- options for isURL method
181
-
182
- require_protocol - if set as true isURL will return false if protocol is not present in the URL
183
- require_valid_protocol - isURL will check if the URL's protocol is present in the protocols option
184
- protocols - valid protocols can be modified with this option
185
- require_host - if set as false isURL will not check if host is present in the URL
186
- require_port - if set as true isURL will check if port is present in the URL
187
- allow_protocol_relative_urls - if set as true protocol relative URLs will be allowed
188
- validate_length - if set as false isURL will skip string length validation (IE maximum is 2083)
189
-
190
- */
191
-
192
- var default_url_options = {
193
- protocols: ['http', 'https', 'ftp'],
194
- require_tld: true,
195
- require_protocol: false,
196
- require_host: true,
197
- require_port: false,
198
- require_valid_protocol: true,
199
- allow_underscores: false,
200
- allow_trailing_dot: false,
201
- allow_protocol_relative_urls: false,
202
- allow_fragments: true,
203
- allow_query_components: true,
204
- validate_length: true
205
- };
206
- var wrapped_ipv6 = /^\[([^\]]+)\](?::([0-9]+))?$/;
207
-
208
- function isRegExp(obj) {
209
- return Object.prototype.toString.call(obj) === '[object RegExp]';
57
+ class OzonContentInhoudNode {
58
+ constructor() {
59
+ this.name = [
60
+ 'Inhoud',
61
+ 'Opschrift',
62
+ 'ContainerBlocksType',
63
+ 'BlockMixedcontentMetMaximaleInlinesMarkersPopupsType'
64
+ ];
65
+ }
66
+ render(node, { mapNodeToJsx }) {
67
+ return index.h("div", { class: "dso-rich-content" }, mapNodeToJsx(node.childNodes));
68
+ }
210
69
  }
211
70
 
212
- function checkHost(host, matches) {
213
- for (var i = 0; i < matches.length; i++) {
214
- var match = matches[i];
215
-
216
- if (host === match || isRegExp(match) && match.test(host)) {
217
- return true;
71
+ class OzonContentInlineNodes {
72
+ constructor() {
73
+ this.name = [
74
+ 'sub',
75
+ 'sup',
76
+ 'strong',
77
+ 'b',
78
+ 'u',
79
+ 'i',
80
+ 'br'
81
+ ];
82
+ }
83
+ render(node, { mapNodeToJsx }) {
84
+ if (node.localName === 'br') {
85
+ return index.h("br", null);
218
86
  }
87
+ const Tag = node.localName;
88
+ return index.h(Tag, null, mapNodeToJsx(node.childNodes));
219
89
  }
220
-
221
- return false;
222
90
  }
223
91
 
224
- function isURL(url, options) {
225
- assertString(url);
226
-
227
- if (!url || /[\s<>]/.test(url)) {
228
- return false;
229
- }
230
-
231
- if (url.indexOf('mailto:') === 0) {
232
- return false;
92
+ class OzonContentIntRefNode {
93
+ constructor() {
94
+ this.name = 'IntRef';
233
95
  }
234
-
235
- options = merge(options, default_url_options);
236
-
237
- if (options.validate_length && url.length >= 2083) {
238
- return false;
96
+ render(node, { mapNodeToJsx, emitAnchorClick }) {
97
+ const ref = node.getAttribute('ref');
98
+ if (!ref) {
99
+ return mapNodeToJsx(node.childNodes);
100
+ }
101
+ const intRefOnClick = (event) => {
102
+ event.preventDefault();
103
+ const target = event.currentTarget;
104
+ if (!(target instanceof HTMLAnchorElement)) {
105
+ return;
106
+ }
107
+ const { href } = target;
108
+ emitAnchorClick({
109
+ href,
110
+ documentComponent: ref,
111
+ originalEvent: event
112
+ });
113
+ };
114
+ return (index.h("a", { href: `#${ref}`, onClick: intRefOnClick }, mapNodeToJsx(node.childNodes)));
239
115
  }
116
+ }
240
117
 
241
- if (!options.allow_fragments && url.includes('#')) {
242
- return false;
118
+ class OzonContentNootNode {
119
+ constructor() {
120
+ this.name = 'Noot';
121
+ this.handles = ['NootNummer'];
243
122
  }
244
-
245
- if (!options.allow_query_components && (url.includes('?') || url.includes('&'))) {
246
- return false;
123
+ identify(node) {
124
+ var _a;
125
+ return (_a = node.getAttribute("id")) !== null && _a !== void 0 ? _a : undefined;
126
+ }
127
+ render(node, { mapNodeToJsx, state: noteIsOpen, setState }) {
128
+ var _a, _b;
129
+ const noteId = (_a = node.getAttribute('id')) !== null && _a !== void 0 ? _a : undefined;
130
+ const noteControlsId = noteId && `dso-ozon-note-${noteId}`;
131
+ const noteHref = noteId && `#${noteControlsId}`;
132
+ const childNodes = Array.from(node.childNodes);
133
+ const nootNummer = (_b = childNodes.find(n => n.nodeName === 'NootNummer')) === null || _b === void 0 ? void 0 : _b.textContent;
134
+ const onClickNote = (event) => {
135
+ event.preventDefault();
136
+ setState === null || setState === void 0 ? void 0 : setState(!noteIsOpen);
137
+ };
138
+ return (index.h(index.Fragment, null,
139
+ index.h("a", { class: { noot: true, "dso-open": !!noteIsOpen }, href: noteHref, "aria-controls": noteControlsId, "aria-expanded": noteIsOpen ? "true" : "false", onClick: onClickNote },
140
+ index.h("sup", null, nootNummer)),
141
+ index.h("span", { id: noteControlsId, role: "section" }, mapNodeToJsx(Array.from(node.querySelectorAll(':scope > Al'))))));
247
142
  }
143
+ }
248
144
 
249
- var protocol, auth, host, hostname, port, port_str, split, ipv6;
250
- split = url.split('#');
251
- url = split.shift();
252
- split = url.split('?');
253
- url = split.shift();
254
- split = url.split('://');
255
-
256
- if (split.length > 1) {
257
- protocol = split.shift().toLowerCase();
258
-
259
- if (options.require_valid_protocol && options.protocols.indexOf(protocol) === -1) {
260
- return false;
261
- }
262
- } else if (options.require_protocol) {
263
- return false;
264
- } else if (url.substr(0, 2) === '//') {
265
- if (!options.allow_protocol_relative_urls) {
266
- return false;
267
- }
268
-
269
- split[0] = url.substr(2);
145
+ function mapColspecs(count, nodeList) {
146
+ const elements = Array.from(nodeList);
147
+ const totalWidth = getTotalWidth(elements);
148
+ return {
149
+ totalWidth,
150
+ count,
151
+ columns: elements.map((element, index) => {
152
+ var _a;
153
+ const colNumber = element.getAttribute('colnum');
154
+ return {
155
+ name: (_a = element.getAttribute('colname')) !== null && _a !== void 0 ? _a : '',
156
+ number: colNumber ? parseInt(colNumber, 10) : index + 1,
157
+ width: getWidth(totalWidth, element)
158
+ };
159
+ })
160
+ };
161
+ }
162
+ function getTotalWidth(elements) {
163
+ return elements.reduce((totalWidth, element) => {
164
+ var _a, _b;
165
+ const width = (_b = (_a = element.getAttribute('colwidth')) === null || _a === void 0 ? void 0 : _a.replace(/[^0-9]/, '')) !== null && _b !== void 0 ? _b : '';
166
+ const colWidth = parseInt(width, 10);
167
+ return totalWidth + (isNaN(colWidth) ? 0 : colWidth);
168
+ }, 0);
169
+ }
170
+ function getWidth(totalWidth, element) {
171
+ const width = element.getAttribute('colwidth');
172
+ if (!width) {
173
+ return undefined;
270
174
  }
271
-
272
- url = split.join('://');
273
-
274
- if (url === '') {
275
- return false;
175
+ if (width === '*') {
176
+ return '100%';
276
177
  }
277
-
278
- split = url.split('/');
279
- url = split.shift();
280
-
281
- if (url === '' && !options.require_host) {
282
- return true;
178
+ if (width.includes('*') || width.match(/^[\d+]$/)) {
179
+ const colWidth = parseInt(width.replace(/[^0-9]/, ''), 10);
180
+ return `${Math.round(colWidth / totalWidth * 100)}%`;
283
181
  }
182
+ return width;
183
+ }
284
184
 
285
- split = url.split('@');
286
-
287
- if (split.length > 1) {
288
- if (options.disallow_auth) {
289
- return false;
290
- }
291
-
292
- if (split[0] === '') {
293
- return false;
294
- }
295
-
296
- auth = split.shift();
297
-
298
- if (auth.indexOf(':') >= 0 && auth.split(':').length > 2) {
299
- return false;
300
- }
301
-
302
- var _auth$split = auth.split(':'),
303
- _auth$split2 = _slicedToArray(_auth$split, 2),
304
- user = _auth$split2[0],
305
- password = _auth$split2[1];
306
-
307
- if (user === '' && password === '') {
308
- return false;
309
- }
310
- }
185
+ const Colgroup = ({ colspecs }) => (colspecs.columns.length > 0
186
+ ? (index.h("colgroup", null, colspecs.columns.map(colspec => (index.h("col", { style: { width: colspec.width } })))))
187
+ : index.h(index.Fragment, null));
311
188
 
312
- hostname = split.join('@');
313
- port_str = null;
314
- ipv6 = null;
315
- var ipv6_match = hostname.match(wrapped_ipv6);
189
+ function getData(cell) {
190
+ return {
191
+ moreRows: cell.getAttribute('morerows'),
192
+ nameStart: cell.getAttribute('namest'),
193
+ nameEnd: cell.getAttribute('nameend')
194
+ };
195
+ }
196
+ function getColspan({ columns }, nameStart, nameEnd) {
197
+ const colspecStart = columns.find(c => c.name === nameStart);
198
+ const colspecEnd = columns.find(c => c.name === nameEnd);
199
+ if (!colspecStart || !colspecEnd) {
200
+ return undefined;
201
+ }
202
+ const colspan = colspecEnd.number - colspecStart.number + 1;
203
+ return colspan === 1 ? undefined : colspan;
204
+ }
205
+ const Cell = ({ context: { mapNodeToJsx }, colspecs, cell }) => {
206
+ const { moreRows, nameStart, nameEnd } = getData(cell);
207
+ const td = {
208
+ rowSpan: moreRows ? parseInt(moreRows, 10) + 1 : undefined,
209
+ colSpan: colspecs && nameStart && nameEnd ? getColspan(colspecs, nameStart, nameEnd) : undefined
210
+ };
211
+ return (index.h("td", Object.assign({}, td), mapNodeToJsx(cell.childNodes)));
212
+ };
316
213
 
317
- if (ipv6_match) {
318
- host = '';
319
- ipv6 = ipv6_match[1];
320
- port_str = ipv6_match[2] || null;
321
- } else {
322
- split = hostname.split(':');
323
- host = split.shift();
214
+ const Rows = ({ context, colspecs, rows }) => {
215
+ return (index.h(index.Fragment, null, rows.map(row => (index.h("tr", null, Array.from(row.children).map(cell => (index.h(Cell, { cell: cell, colspecs: colspecs, context: context }))))))));
216
+ };
324
217
 
325
- if (split.length) {
326
- port_str = split.join(':');
327
- }
218
+ function mapData(node) {
219
+ var _a, _b, _c;
220
+ const tgroup = node.querySelector(':scope > tgroup');
221
+ const colAttribute = (_a = tgroup === null || tgroup === void 0 ? void 0 : tgroup.getAttribute('cols')) !== null && _a !== void 0 ? _a : undefined;
222
+ const columnCount = colAttribute ? parseInt(colAttribute, 10) : undefined;
223
+ return {
224
+ caption: (_c = (_b = node.querySelector(':scope > title')) === null || _b === void 0 ? void 0 : _b.textContent) !== null && _c !== void 0 ? _c : undefined,
225
+ colspecs: tgroup && columnCount ? mapColspecs(columnCount, tgroup.querySelectorAll(':scope > colspec')) : undefined,
226
+ headRows: Array.from(node.querySelectorAll(':scope > tgroup > thead > row')),
227
+ bodyRows: Array.from(node.querySelectorAll(':scope > tgroup > tbody > row'))
228
+ };
229
+ }
230
+ class OzonContentTableNode {
231
+ constructor() {
232
+ this.name = 'table';
233
+ this.handles = ['title', 'tgroup', 'colspec', 'thead', 'tbody', 'row', 'cell'];
234
+ }
235
+ render(node, context) {
236
+ const { caption, colspecs, headRows, bodyRows } = mapData(node);
237
+ return (index.h("table", { class: "table" },
238
+ caption && (index.h("caption", null, caption)),
239
+ colspecs && (index.h(Colgroup, { colspecs: colspecs })),
240
+ headRows.length > 0 && (index.h("thead", null,
241
+ index.h(Rows, { rows: headRows, colspecs: colspecs, context: context }))),
242
+ bodyRows.length > 0 && (index.h("tbody", null,
243
+ index.h(Rows, { rows: bodyRows, colspecs: colspecs, context: context })))));
328
244
  }
245
+ }
329
246
 
330
- if (port_str !== null && port_str.length > 0) {
331
- port = parseInt(port_str, 10);
332
-
333
- if (!/^[0-9]+$/.test(port_str) || port <= 0 || port > 65535) {
334
- return false;
335
- }
336
- } else if (options.require_port) {
337
- return false;
247
+ class OzonContentTextNode {
248
+ constructor() {
249
+ this.name = '#text';
338
250
  }
339
-
340
- if (options.host_whitelist) {
341
- return checkHost(host, options.host_whitelist);
251
+ render(node) {
252
+ return index.h(index.Fragment, null, node.textContent);
342
253
  }
254
+ }
343
255
 
344
- if (!isIP(host) && !isFQDN(host, options) && (!ipv6 || !isIP(ipv6, 6))) {
345
- return false;
256
+ class OzonContentFallbackNode {
257
+ constructor() {
258
+ // This name does not match any elements
259
+ this.name = ['<fallback>'];
346
260
  }
347
-
348
- host = host || ipv6;
349
-
350
- if (options.host_blacklist && checkHost(host, options.host_blacklist)) {
351
- return false;
261
+ render(node, { mapNodeToJsx }) {
262
+ return (index.h("span", { class: `fallback od-${node instanceof Element ? node.localName : node.nodeName}` }, mapNodeToJsx(node.childNodes)));
352
263
  }
353
-
354
- return true;
355
264
  }
356
265
 
357
- function transformDescriptionNote(body) {
358
- body.querySelectorAll('div.noot').forEach((nootElement, index) => {
359
- const contentElement = nootElement.nextElementSibling;
360
- if (!(contentElement instanceof HTMLDivElement && contentElement.classList.value === 'noot_popup')) {
361
- return;
362
- }
363
- const nootAnchorElement = nootElement.querySelector('a');
364
- if (!(nootAnchorElement instanceof HTMLAnchorElement)) {
365
- return;
366
- }
367
- const contentAlElement = contentElement.querySelector(':scope > .od-Al');
368
- if (!(contentAlElement instanceof HTMLDivElement && contentAlElement.classList.value === 'od-Al')) {
369
- return;
370
- }
371
- nootElement.replaceWith(...Array.from(nootElement.childNodes));
372
- const contentWrapper = document.createElement('div');
373
- contentWrapper.replaceChildren(...Array.from(contentAlElement.childNodes));
374
- contentAlElement.replaceChildren(contentWrapper);
375
- contentElement.replaceWith(contentAlElement);
376
- const supElement = document.createElement('sup');
377
- supElement.replaceChildren(...Array.from(nootAnchorElement.childNodes));
378
- nootAnchorElement.replaceChildren(supElement);
379
- const id = (index + 1).toString(10);
380
- const [termId, contentId] = [`dso-ozon-term-${id}`, `dso-ozon-content-${id}`];
381
- nootAnchorElement.setAttribute('href', `#${termId}`);
382
- nootAnchorElement.setAttribute('id', termId);
383
- nootAnchorElement.setAttribute('aria-controls', contentId);
384
- nootAnchorElement.setAttribute('aria-expanded', 'false');
385
- contentAlElement === null || contentAlElement === void 0 ? void 0 : contentAlElement.setAttribute('id', contentId);
386
- });
387
- return body;
388
- }
389
- function transformDocumentComponent(body) {
390
- body.querySelectorAll('span[data-verwijst-naar-documentcomponent]').forEach(e => {
391
- const a = document.createElement('a');
392
- a.href = `#${e.getAttribute('data-verwijst-naar-documentcomponent')}`;
393
- a.replaceChildren(...Array.from(e.childNodes));
394
- e.replaceWith(a);
395
- });
396
- return body;
397
- }
398
- const transformers = [transformDescriptionNote, transformDocumentComponent];
399
- class OzonContentTransformer {
400
- constructor(anchorClick) {
401
- this.anchorClick = anchorClick;
266
+ class Mapper {
267
+ constructor() {
268
+ this.mappers = [
269
+ new OzonContentTextNode(),
270
+ new OzonContentDocumentNode(),
271
+ new OzonContentInhoudNode(),
272
+ new OzonContentIntRefNode(),
273
+ new OzonContentExtRefNode(),
274
+ new OzonContentAlNode(),
275
+ new OzonContentInlineNodes(),
276
+ new OzonContentIllustratieNode(),
277
+ new OzonContentNootNode(),
278
+ new OzonContentTableNode()
279
+ ];
280
+ this.skip = this.mappers.reduce((t, m) => {
281
+ if (m.handles) {
282
+ t.push(...m.handles);
283
+ }
284
+ return t;
285
+ }, []);
286
+ this.fallbackNode = new OzonContentFallbackNode();
402
287
  this.domParser = new DOMParser();
403
- this.eventHandlers = [this.handleValidUrls, this.handleDescriptionNoteClick, this.handleContentAnchor];
404
- }
405
- setContent(content) {
406
- this.content = transformers.reduce((c, t) => t(c), this.domParser.parseFromString(content, 'text/html').body).children;
407
288
  }
408
- handleClickEvent(event) {
409
- this.eventHandlers.some(h => h.bind(this)(event.composedPath(), event));
410
- }
411
- handleDescriptionNoteClick(composedPath, event) {
289
+ findMapper(name) {
412
290
  var _a;
413
- const containerIndex = composedPath.findIndex(this.isHostElement);
414
- if (containerIndex === -1) {
415
- return false;
291
+ if (this.skip.includes(name)) {
292
+ return undefined;
416
293
  }
417
- const anchorElement = (_a = composedPath
418
- .slice(0, containerIndex)) === null || _a === void 0 ? void 0 : _a.find((e) => e instanceof HTMLAnchorElement && e.classList.contains('noot'));
419
- if (!anchorElement) {
420
- return false;
294
+ return (_a = this.mappers.find(m => {
295
+ if (Array.isArray(m.name)) {
296
+ return m.name.includes(name);
297
+ }
298
+ return m.name === name;
299
+ })) !== null && _a !== void 0 ? _a : this.fallbackNode;
300
+ }
301
+ mapNodeToJsx(node, context, path) {
302
+ var _a, _b;
303
+ if (node instanceof NodeList) {
304
+ return index.h(index.Fragment, null, Array.from(node).map(n => this.mapNodeToJsx(n, context, path)));
421
305
  }
422
- event.preventDefault();
423
- const open = anchorElement.classList.contains('dso-open');
424
- if (open) {
425
- anchorElement.classList.remove('dso-open');
426
- anchorElement.setAttribute('aria-expanded', 'false');
306
+ if (Array.isArray(node)) {
307
+ return index.h(index.Fragment, null, node.map(n => this.mapNodeToJsx(n, context, path)));
427
308
  }
428
- else {
429
- anchorElement.classList.add('dso-open');
430
- anchorElement.setAttribute('aria-expanded', 'true');
309
+ const nodeName = node instanceof Element ? node.localName : node.nodeName;
310
+ const mapper = this.findMapper(nodeName);
311
+ const identity = (_a = mapper === null || mapper === void 0 ? void 0 : mapper.identify) === null || _a === void 0 ? void 0 : _a.call(mapper, node);
312
+ const state = identity ? context.state[identity] : undefined;
313
+ const setState = identity ? (state) => context.setState(Object.assign(Object.assign({}, context.state), { [identity]: state })) : undefined;
314
+ return (_b = mapper === null || mapper === void 0 ? void 0 : mapper.render(node, {
315
+ mapNodeToJsx: n => this.mapNodeToJsx(n, context, [...path, node]),
316
+ emitAnchorClick: context.emitAnchorClick,
317
+ setState,
318
+ state,
319
+ path
320
+ })) !== null && _b !== void 0 ? _b : index.h(index.Fragment, null);
321
+ }
322
+ transform(xml, context) {
323
+ if (!this.cache || this.cache.xml !== xml) {
324
+ this.cache = { xml, document: this.domParser.parseFromString(xml, 'text/xml') };
431
325
  }
432
- return true;
433
- }
434
- handleContentAnchor(composedPath, event) {
435
- if (composedPath.some(e => e instanceof HTMLAnchorElement)) {
436
- event.preventDefault();
437
- const anchor = composedPath.find((e) => e instanceof HTMLAnchorElement);
438
- const href = anchor.href;
439
- this.anchorClick.emit({
440
- href,
441
- documentComponent: href.substr(href.indexOf('#') + 1),
442
- originalEvent: event
443
- });
444
- return true;
445
- }
446
- return false;
447
- }
448
- handleValidUrls(composedPath) {
449
- var _a;
450
- const containerIndex = composedPath.findIndex(this.isHostElement);
451
- if (containerIndex === -1) {
452
- return false;
453
- }
454
- // require_tld: false is needed to allow http://localhost
455
- return (_a = composedPath.slice(0, containerIndex)) === null || _a === void 0 ? void 0 : _a.some(e => { var _a; return e instanceof HTMLAnchorElement && isURL((_a = e.getAttribute('href')) !== null && _a !== void 0 ? _a : '', { require_tld: false, require_protocol: true }); });
456
- }
457
- isHostElement(value) {
458
- return value instanceof HTMLElement && value.tagName === 'DSO-OZON-CONTENT';
326
+ const xmlDocument = this.cache.document;
327
+ return this.mapNodeToJsx(xmlDocument.getRootNode(), context, []);
459
328
  }
460
329
  }
461
330
 
462
- const ozonContentCss = "dso-ozon-content{display:block}.noot{text-decoration:none}.noot:not(.dso-open)+.od-Al{display:none}.noot.dso-open+.od-Al{display:block}.noot+.od-Al{margin:4px 0;padding:8px 32px 8px 8px;position:relative}.noot+.od-Al>a{display:block;height:24px;position:absolute;right:0;text-align:center;top:0;width:24px}.noot+.od-Al>a::before{background:var(--dso-icon, var(--di-times-zwart)) no-repeat;background-position:center;background-size:cover;height:1.5em;vertical-align:top;width:1.5em;content:\"\";display:block}.noot+.od-Al{background-color:#ebf3e6}.od-Term{font-weight:700}.od-Definitie,.od-Tussenkop{font-style:italic}.od-Inhoud,.od-Inhoud>.od-Lijst,.od-IntIoRef,.od-Lidnr,.od-LiNr,.od-Opschrift,.od-Tussenkop{display:inline}.od-Al,.od-Lijstaanhef{margin-bottom:0.75em}.od-IntIoRef{border-bottom:1px dotted}.od-LiNummer{float:left;min-width:0.7em;padding-right:0.3em;text-align:right}.od-Figuur img{margin-left:25px;max-width:100%;height:auto}.od-Figuur .od-Bijschrift{font-size:0.75rem;margin-left:25px;padding-bottom:2.5rem}.od-Tabel thead{font-weight:600}.od-Kadertekst{border:1px solid #e5e5e5;margin-bottom:1rem;padding:1rem}";
331
+ const ozonContentCss = ".sc-dso-ozon-content-h{display:block}.noot.sc-dso-ozon-content{text-decoration:none}.noot.sc-dso-ozon-content:not(.dso-open)+*.sc-dso-ozon-content{display:none}.noot.dso-open.sc-dso-ozon-content+*.sc-dso-ozon-content{display:block}.noot.sc-dso-ozon-content+*.sc-dso-ozon-content{margin:4px 0;padding:8px 32px 8px 8px;position:relative}.noot.sc-dso-ozon-content+*.sc-dso-ozon-content>a.sc-dso-ozon-content{display:block;height:24px;position:absolute;right:0;text-align:center;top:0;width:24px}.noot.sc-dso-ozon-content+*.sc-dso-ozon-content>a.sc-dso-ozon-content::before{background:var(--dso-icon, var(--di-times-zwart)) no-repeat;background-position:center;background-size:cover;height:1.5em;vertical-align:top;width:1.5em;content:\"\";display:block}.noot.sc-dso-ozon-content+*.sc-dso-ozon-content{background-color:#ebf3e6}span[role=paragraph].sc-dso-ozon-content{display:block}.fallback.sc-dso-ozon-content{display:block}.od-Term.sc-dso-ozon-content{font-weight:700}.od-Definitie.sc-dso-ozon-content,.od-Tussenkop.sc-dso-ozon-content{font-style:italic}.od-Inhoud.sc-dso-ozon-content,.od-Inhoud.sc-dso-ozon-content>.od-Lijst.sc-dso-ozon-content,.od-IntIoRef.sc-dso-ozon-content,.od-Lidnr.sc-dso-ozon-content,.od-LiNr.sc-dso-ozon-content,.od-Opschrift.sc-dso-ozon-content,.od-Tussenkop.sc-dso-ozon-content{display:inline}.od-Al.sc-dso-ozon-content,.od-Lijstaanhef.sc-dso-ozon-content{margin-bottom:0.75em}.od-IntIoRef.sc-dso-ozon-content{border-bottom:1px dotted}.od-LiNummer.sc-dso-ozon-content{float:left;min-width:0.7em;padding-right:0.3em;text-align:right}.od-Figuur.sc-dso-ozon-content img.sc-dso-ozon-content{margin-left:25px;max-width:100%;height:auto}.od-Figuur.sc-dso-ozon-content .od-Bijschrift.sc-dso-ozon-content{font-size:0.75rem;margin-left:25px;padding-bottom:2.5rem}.od-Tabel.sc-dso-ozon-content thead.sc-dso-ozon-content{font-weight:600}.od-Kadertekst.sc-dso-ozon-content{border:1px solid #e5e5e5;margin-bottom:1rem;padding:1rem}";
463
332
 
464
333
  let OzonContent = class {
465
334
  constructor(hostRef) {
466
335
  index.registerInstance(this, hostRef);
467
336
  this.anchorClick = index.createEvent(this, "anchorClick", 7);
468
- }
469
- handleClick(event) {
470
- this.transformer.handleClickEvent(event);
471
- }
472
- componentWillLoad() {
473
- this.transformer = new OzonContentTransformer(this.anchorClick);
474
- }
475
- componentWillRender() {
476
- this.transformer.setContent(this.content);
337
+ this.state = {};
338
+ this.mapper = new Mapper();
477
339
  }
478
340
  render() {
479
- return index.h("div", { class: "dso-rich-content", ref: el => this.container = el });
480
- }
481
- componentDidRender() {
482
341
  var _a;
483
- const content = this.transformer.content;
484
- if (this.container && content) {
485
- this.container.replaceChildren(...Array.from(content));
486
- }
487
- else {
488
- (_a = this.container) === null || _a === void 0 ? void 0 : _a.replaceChildren();
489
- }
342
+ const context = {
343
+ state: this.state,
344
+ setState: state => this.state = state,
345
+ emitAnchorClick: this.anchorClick.emit
346
+ };
347
+ return this.mapper.transform((_a = this.content) !== null && _a !== void 0 ? _a : '', context);
490
348
  }
491
349
  };
492
350
  OzonContent.style = ozonContentCss;