securemark 0.278.0 → 0.279.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/CHANGELOG.md +4 -0
- package/dist/index.js +76 -44
- package/markdown.d.ts +30 -3
- package/package.json +6 -6
- package/src/parser/api/parse.test.ts +3 -3
- package/src/parser/block/extension/figure.ts +2 -5
- package/src/parser/block/extension/message.ts +2 -0
- package/src/parser/block/extension/table.ts +14 -4
- package/src/parser/block/ilist.ts +4 -6
- package/src/parser/block/mediablock.ts +26 -0
- package/src/parser/block/olist.ts +3 -19
- package/src/parser/block/paragraph.test.ts +3 -3
- package/src/parser/block/table.ts +8 -3
- package/src/parser/block/ulist.ts +17 -5
- package/src/parser/block.ts +3 -0
- package/src/parser/inline/extension/indexer.ts +2 -4
- package/src/parser/inline.test.ts +1 -1
- package/src/parser/inline.ts +2 -6
- package/src/parser/visibility.ts +3 -5
- package/src/renderer/render/media/image.ts +1 -1
- package/src/renderer/render.test.ts +5 -5
- package/src/util/quote.test.ts +2 -2
package/CHANGELOG.md
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! securemark v0.
|
|
1
|
+
/*! securemark v0.279.0 https://github.com/falsandtru/securemark | (c) 2017, falsandtru | UNLICENSED License */
|
|
2
2
|
(function webpackUniversalModuleDefinition(root, factory) {
|
|
3
3
|
if(typeof exports === 'object' && typeof module === 'object')
|
|
4
4
|
module.exports = factory(require("Prism"), require("DOMPurify"));
|
|
@@ -4350,6 +4350,7 @@ const mathblock_1 = __webpack_require__(3754);
|
|
|
4350
4350
|
const extension_1 = __webpack_require__(4751);
|
|
4351
4351
|
const sidefence_1 = __webpack_require__(4078);
|
|
4352
4352
|
const blockquote_1 = __webpack_require__(7859);
|
|
4353
|
+
const mediablock_1 = __webpack_require__(785);
|
|
4353
4354
|
const reply_1 = __webpack_require__(9978);
|
|
4354
4355
|
const paragraph_1 = __webpack_require__(6457);
|
|
4355
4356
|
const random_1 = __webpack_require__(7325);
|
|
@@ -4359,7 +4360,7 @@ exports.block = (0, combinator_1.creation)(1, false, error((0, combinator_1.rese
|
|
|
4359
4360
|
clock: 50 * 1000,
|
|
4360
4361
|
recursion: 20
|
|
4361
4362
|
}
|
|
4362
|
-
}, (0, combinator_1.union)([source_1.emptyline, pagebreak_1.pagebreak, heading_1.heading, ulist_1.ulist, olist_1.olist, ilist_1.ilist, dlist_1.dlist, table_1.table, codeblock_1.codeblock, mathblock_1.mathblock, extension_1.extension, sidefence_1.sidefence, blockquote_1.blockquote, reply_1.reply, paragraph_1.paragraph]))));
|
|
4363
|
+
}, (0, combinator_1.union)([source_1.emptyline, pagebreak_1.pagebreak, heading_1.heading, ulist_1.ulist, olist_1.olist, ilist_1.ilist, dlist_1.dlist, table_1.table, codeblock_1.codeblock, mathblock_1.mathblock, extension_1.extension, sidefence_1.sidefence, blockquote_1.blockquote, mediablock_1.mediablock, reply_1.reply, paragraph_1.paragraph]))));
|
|
4363
4364
|
function error(parser) {
|
|
4364
4365
|
return (0, combinator_1.recover)((0, combinator_1.fallback)((0, combinator_1.open)('\x07', ({
|
|
4365
4366
|
source
|
|
@@ -4736,7 +4737,7 @@ const dom_1 = __webpack_require__(3252);
|
|
|
4736
4737
|
exports.segment = (0, combinator_1.block)((0, combinator_1.match)(/^(~{3,})(?:figure[^\S\n])?(?=\[?\$)/, (0, memoize_1.memoize)(([, fence], closer = new RegExp(String.raw`^${fence}[^\S\n]*(?:$|\n)`)) => (0, combinator_1.close)((0, combinator_1.sequence)([source_1.contentline, (0, combinator_1.inits)([
|
|
4737
4738
|
// All parsers which can include closing terms.
|
|
4738
4739
|
(0, combinator_1.union)([codeblock_1.segment_, mathblock_1.segment_, table_2.segment_, blockquote_1.segment, placeholder_1.segment_, (0, combinator_1.some)(source_1.contentline, closer)]), source_1.emptyline, (0, combinator_1.union)([source_1.emptyline, (0, combinator_1.some)(source_1.contentline, closer)])])]), closer), ([, fence]) => fence.length, [])));
|
|
4739
|
-
exports.figure = (0, combinator_1.block)((0, combinator_1.fallback)((0, combinator_1.rewrite)(exports.segment, (0, combinator_1.fmap)((0, combinator_1.convert)(source => source.slice(source.match(/^~+(?:\w+\s+)?/)[0].length, source.trimEnd().lastIndexOf('\n')), (0, combinator_1.sequence)([(0, combinator_1.line)((0, combinator_1.sequence)([label_1.label, (0, source_1.str)(/^(?=\s).*\n/)])), (0, combinator_1.inits)([(0, combinator_1.block)((0, combinator_1.union)([ulist_1.ulist, olist_1.olist, table_1.table, codeblock_1.codeblock, mathblock_1.mathblock, example_1.example, table_2.table, blockquote_1.blockquote, placeholder_1.placeholder, (0, combinator_1.line)(inline_1.media), (0, combinator_1.line)(inline_1.shortmedia)])), source_1.emptyline, (0, combinator_1.block)((0,
|
|
4740
|
+
exports.figure = (0, combinator_1.block)((0, combinator_1.fallback)((0, combinator_1.rewrite)(exports.segment, (0, combinator_1.fmap)((0, combinator_1.convert)(source => source.slice(source.match(/^~+(?:\w+\s+)?/)[0].length, source.trimEnd().lastIndexOf('\n')), (0, combinator_1.sequence)([(0, combinator_1.line)((0, combinator_1.sequence)([label_1.label, (0, source_1.str)(/^(?=\s).*\n/)])), (0, combinator_1.inits)([(0, combinator_1.block)((0, combinator_1.union)([ulist_1.ulist, olist_1.olist, table_1.table, codeblock_1.codeblock, mathblock_1.mathblock, example_1.example, table_2.table, blockquote_1.blockquote, placeholder_1.placeholder, (0, combinator_1.line)(inline_1.media), (0, combinator_1.line)(inline_1.shortmedia)])), source_1.emptyline, (0, combinator_1.block)((0, visibility_1.visualize)((0, visibility_1.trimBlankStart)((0, combinator_1.some)(inline_1.inline))))])])), ([label, param, content, ...caption]) => [(0, dom_1.html)('figure', attributes(label.getAttribute('data-label'), param, content, caption), [(0, dom_1.html)('figcaption', [(0, dom_1.html)('span', {
|
|
4740
4741
|
class: 'figindex'
|
|
4741
4742
|
}), (0, dom_1.html)('span', {
|
|
4742
4743
|
class: 'figtext'
|
|
@@ -4857,6 +4858,7 @@ const codeblock_1 = __webpack_require__(1849);
|
|
|
4857
4858
|
const mathblock_1 = __webpack_require__(3754);
|
|
4858
4859
|
const sidefence_1 = __webpack_require__(4078);
|
|
4859
4860
|
const blockquote_1 = __webpack_require__(7859);
|
|
4861
|
+
const mediablock_1 = __webpack_require__(785);
|
|
4860
4862
|
const paragraph_1 = __webpack_require__(6457);
|
|
4861
4863
|
const array_1 = __webpack_require__(8112);
|
|
4862
4864
|
const dom_1 = __webpack_require__(3252);
|
|
@@ -4903,7 +4905,7 @@ function title(type) {
|
|
|
4903
4905
|
}
|
|
4904
4906
|
}
|
|
4905
4907
|
// Must not have indexed blocks.
|
|
4906
|
-
const content = (0, combinator_1.union)([source_1.emptyline, ulist_1.ulist, olist_1.olist, ilist_1.ilist, table_1.table, codeblock_1.codeblock, mathblock_1.mathblock, sidefence_1.sidefence, blockquote_1.blockquote, paragraph_1.paragraph]);
|
|
4908
|
+
const content = (0, combinator_1.union)([source_1.emptyline, ulist_1.ulist, olist_1.olist, ilist_1.ilist, table_1.table, codeblock_1.codeblock, mathblock_1.mathblock, sidefence_1.sidefence, blockquote_1.blockquote, mediablock_1.mediablock, paragraph_1.paragraph]);
|
|
4907
4909
|
|
|
4908
4910
|
/***/ }),
|
|
4909
4911
|
|
|
@@ -4985,8 +4987,8 @@ const row = (0, combinator_1.lazy)(() => (0, combinator_1.dup)((0, combinator_1.
|
|
|
4985
4987
|
const alignment = /^[-=<>]+(?:\/[-=^v]*)?(?=[^\S\n]*\n)/;
|
|
4986
4988
|
const align = (0, combinator_1.line)((0, combinator_1.fmap)((0, combinator_1.union)([(0, source_1.str)(alignment)]), ([s]) => s.split('/').map(s => s.split(''))));
|
|
4987
4989
|
const delimiter = /^[-=<>]+(?:\/[-=^v]*)?(?=[^\S\n]*\n)|^[#:](?:(?!:\D|0)\d*:(?!0)\d*)?(?:!+[+]?)?(?=\s)/;
|
|
4988
|
-
const head = (0, combinator_1.creation)(1, false, (0, combinator_1.block)((0, combinator_1.fmap)((0, combinator_1.open)((0, source_1.str)(/^#(?:(?!:\D|0)\d*:(?!0)\d*)?(?:!+[+]?)?(?=\s)/), (0, combinator_1.rewrite)((0, combinator_1.inits)([source_1.anyline, (0, combinator_1.some)(source_1.contentline, delimiter)]), (0, combinator_1.open)(/^(?:\s*\n|\s)/, (0, visibility_1.visualize)((0, visibility_1.trimBlankStart)((0, combinator_1.some)(
|
|
4989
|
-
const data = (0, combinator_1.creation)(1, false, (0, combinator_1.block)((0, combinator_1.fmap)((0, combinator_1.open)((0, source_1.str)(/^:(?:(?!:\D|0)\d*:(?!0)\d*)?(?:!+[+]?)?(?=\s)/), (0, combinator_1.rewrite)((0, combinator_1.inits)([source_1.anyline, (0, combinator_1.some)(source_1.contentline, delimiter)]), (0, combinator_1.open)(/^(?:\s*\n|\s)/, (0, visibility_1.visualize)((0, combinator_1.some)(
|
|
4990
|
+
const head = (0, combinator_1.creation)(1, false, (0, combinator_1.block)((0, combinator_1.fmap)((0, combinator_1.open)((0, source_1.str)(/^#(?:(?!:\D|0)\d*:(?!0)\d*)?(?:!+[+]?)?(?=\s)/), (0, combinator_1.rewrite)((0, combinator_1.inits)([source_1.anyline, (0, combinator_1.some)(source_1.contentline, delimiter)]), (0, combinator_1.union)([(0, combinator_1.block)((0, combinator_1.surround)(/^[^\n]/, inline_1.medialink, /^\s*$/)), (0, combinator_1.block)((0, combinator_1.surround)(/^[^\n]/, inline_1.media, /^\s*$/)), (0, combinator_1.block)((0, combinator_1.surround)(/^[^\n]/, inline_1.shortmedia, /^\s*$/)), (0, combinator_1.open)(/^(?:\s*\n|\s)/, (0, visibility_1.visualize)((0, visibility_1.trimBlankStart)((0, combinator_1.some)(inline_1.inline))), true)])), true), ns => [(0, dom_1.html)('th', attributes(ns.shift()), (0, visibility_1.trimNodeEnd)((0, dom_1.defrag)(ns)))]), false));
|
|
4991
|
+
const data = (0, combinator_1.creation)(1, false, (0, combinator_1.block)((0, combinator_1.fmap)((0, combinator_1.open)((0, source_1.str)(/^:(?:(?!:\D|0)\d*:(?!0)\d*)?(?:!+[+]?)?(?=\s)/), (0, combinator_1.rewrite)((0, combinator_1.inits)([source_1.anyline, (0, combinator_1.some)(source_1.contentline, delimiter)]), (0, combinator_1.union)([(0, combinator_1.block)((0, combinator_1.surround)(/^[^\n]/, inline_1.medialink, /^\s*$/)), (0, combinator_1.block)((0, combinator_1.surround)(/^[^\n]/, inline_1.media, /^\s*$/)), (0, combinator_1.block)((0, combinator_1.surround)(/^[^\n]/, inline_1.shortmedia, /^\s*$/)), (0, combinator_1.open)(/^(?:\s*\n|\s)/, (0, visibility_1.visualize)((0, combinator_1.some)(inline_1.inline)), true)])), true), ns => [(0, dom_1.html)('td', attributes(ns.shift()), (0, visibility_1.trimNodeEnd)((0, dom_1.defrag)(ns)))]), false));
|
|
4990
4992
|
const dataline = (0, combinator_1.creation)(1, false, (0, combinator_1.line)((0, combinator_1.rewrite)(source_1.contentline, (0, combinator_1.union)([(0, combinator_1.validate)(/^!+\s/, (0, combinator_1.convert)(source => `:${source}`, data)), (0, combinator_1.convert)(source => `: ${source}`, data)]))));
|
|
4991
4993
|
function attributes(source) {
|
|
4992
4994
|
let [, rowspan = undefined, colspan = undefined, highlight = undefined, extension = undefined] = source.match(/^[#:](?:(\d+)?:(\d+)?)?(?:(!+)([+]?))?$/) ?? [];
|
|
@@ -5237,8 +5239,8 @@ const ulist_1 = __webpack_require__(5425);
|
|
|
5237
5239
|
const olist_1 = __webpack_require__(7471);
|
|
5238
5240
|
const inline_1 = __webpack_require__(1160);
|
|
5239
5241
|
const dom_1 = __webpack_require__(3252);
|
|
5240
|
-
exports.ilist = (0, combinator_1.lazy)(() => (0, combinator_1.block)((0, combinator_1.validate)(/^[-+*](?=[^\S\n]|\n[^\S\n]*\S)/,
|
|
5241
|
-
exports.ilist_ = (0, combinator_1.lazy)(() => (0, combinator_1.block)((0, combinator_1.fmap)((0, combinator_1.validate)(/^[-+*](?:$|\s)/, (0, combinator_1.some)((0, combinator_1.creation)(1, false, (0, combinator_1.union)([(0, combinator_1.fmap)((0, combinator_1.fallback)((0, combinator_1.inits)([(0, combinator_1.line)((0, combinator_1.open)(/^[-+*](?:$|\s)/, (0, combinator_1.some)(inline_1.inline), true)), (0, combinator_1.indent)((0, combinator_1.union)([ulist_1.ulist_, olist_1.olist_, exports.ilist_]))]),
|
|
5242
|
+
exports.ilist = (0, combinator_1.lazy)(() => (0, combinator_1.block)((0, combinator_1.validate)(/^[-+*](?=[^\S\n]|\n[^\S\n]*\S)/, exports.ilist_)));
|
|
5243
|
+
exports.ilist_ = (0, combinator_1.lazy)(() => (0, combinator_1.block)((0, combinator_1.fmap)((0, combinator_1.validate)(/^[-+*](?:$|\s)/, (0, combinator_1.some)((0, combinator_1.creation)(1, false, (0, combinator_1.union)([(0, combinator_1.fmap)((0, combinator_1.fallback)((0, combinator_1.inits)([(0, combinator_1.line)((0, combinator_1.open)(/^[-+*](?:$|\s)/, (0, combinator_1.some)(inline_1.inline), true)), (0, combinator_1.indent)((0, combinator_1.union)([ulist_1.ulist_, olist_1.olist_, exports.ilist_]))]), ulist_1.invalid), ns => [(0, dom_1.html)('li', (0, dom_1.defrag)((0, ulist_1.fillFirstLine)(ns)))])])))), es => [(0, dom_1.html)('ul', {
|
|
5242
5244
|
class: 'invalid',
|
|
5243
5245
|
'data-invalid-syntax': 'list',
|
|
5244
5246
|
'data-invalid-type': 'syntax',
|
|
@@ -5281,6 +5283,31 @@ exports.mathblock = (0, combinator_1.block)((0, combinator_1.validate)('$$', (0,
|
|
|
5281
5283
|
|
|
5282
5284
|
/***/ }),
|
|
5283
5285
|
|
|
5286
|
+
/***/ 785:
|
|
5287
|
+
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
5288
|
+
|
|
5289
|
+
"use strict";
|
|
5290
|
+
|
|
5291
|
+
|
|
5292
|
+
Object.defineProperty(exports, "__esModule", ({
|
|
5293
|
+
value: true
|
|
5294
|
+
}));
|
|
5295
|
+
exports.mediablock = void 0;
|
|
5296
|
+
const combinator_1 = __webpack_require__(2087);
|
|
5297
|
+
const inline_1 = __webpack_require__(1160);
|
|
5298
|
+
const dom_1 = __webpack_require__(3252);
|
|
5299
|
+
exports.mediablock = (0, combinator_1.block)((0, combinator_1.validate)(['[!', '!'], (0, combinator_1.fmap)((0, combinator_1.inits)([(0, combinator_1.line)((0, combinator_1.union)([inline_1.medialink, inline_1.media, inline_1.shortmedia])), (0, combinator_1.some)((0, combinator_1.line)((0, combinator_1.fallback)((0, combinator_1.union)([inline_1.medialink, inline_1.media, inline_1.shortmedia]), ({
|
|
5300
|
+
source
|
|
5301
|
+
}) => [[(0, dom_1.html)('div', [(0, dom_1.html)('span', attrs, source.replace('\n', ''))])], ''])))]), ns => [(0, dom_1.html)('div', ns)])));
|
|
5302
|
+
const attrs = {
|
|
5303
|
+
class: 'invalid',
|
|
5304
|
+
'data-invalid-syntax': 'mediablock',
|
|
5305
|
+
'data-invalid-type': 'syntax',
|
|
5306
|
+
'data-invalid-message': 'Not media syntax'
|
|
5307
|
+
};
|
|
5308
|
+
|
|
5309
|
+
/***/ }),
|
|
5310
|
+
|
|
5284
5311
|
/***/ 7471:
|
|
5285
5312
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
5286
5313
|
|
|
@@ -5290,13 +5317,12 @@ exports.mathblock = (0, combinator_1.block)((0, combinator_1.validate)('$$', (0,
|
|
|
5290
5317
|
Object.defineProperty(exports, "__esModule", ({
|
|
5291
5318
|
value: true
|
|
5292
5319
|
}));
|
|
5293
|
-
exports.
|
|
5320
|
+
exports.olist_ = exports.olist = void 0;
|
|
5294
5321
|
const combinator_1 = __webpack_require__(2087);
|
|
5295
5322
|
const ulist_1 = __webpack_require__(5425);
|
|
5296
5323
|
const ilist_1 = __webpack_require__(238);
|
|
5297
5324
|
const inline_1 = __webpack_require__(1160);
|
|
5298
5325
|
const index_1 = __webpack_require__(4479);
|
|
5299
|
-
const source_1 = __webpack_require__(6743);
|
|
5300
5326
|
const visibility_1 = __webpack_require__(7618);
|
|
5301
5327
|
const memoize_1 = __webpack_require__(1808);
|
|
5302
5328
|
const dom_1 = __webpack_require__(3252);
|
|
@@ -5304,12 +5330,12 @@ const openers = {
|
|
|
5304
5330
|
'.': /^([0-9]+|[a-z]+|[A-Z]+)(?:-(?!-)[0-9]*)*(?![^\S\n])\.?(?:$|\s)/,
|
|
5305
5331
|
'(': /^\(([0-9]*|[a-z]*)(?![^)\n])\)?(?:-(?!-)[0-9]*)*(?:$|\s)/
|
|
5306
5332
|
};
|
|
5307
|
-
exports.olist = (0, combinator_1.lazy)(() => (0, combinator_1.block)((0, combinator_1.validate)(new RegExp([/^([0-9]+|[a-z]+|[A-Z]+)(?:-[0-9]+)*\.(?=[^\S\n]|\n[^\S\n]*\S)/.source, /^\(([0-9]+|[a-z]+)\)(?:-[0-9]+)*(?=[^\S\n]|\n[^\S\n]*\S)/.source].join('|')),
|
|
5333
|
+
exports.olist = (0, combinator_1.lazy)(() => (0, combinator_1.block)((0, combinator_1.validate)(new RegExp([/^([0-9]+|[a-z]+|[A-Z]+)(?:-[0-9]+)*\.(?=[^\S\n]|\n[^\S\n]*\S)/.source, /^\(([0-9]+|[a-z]+)\)(?:-[0-9]+)*(?=[^\S\n]|\n[^\S\n]*\S)/.source].join('|')), exports.olist_)));
|
|
5308
5334
|
exports.olist_ = (0, combinator_1.lazy)(() => (0, combinator_1.block)((0, combinator_1.union)([(0, combinator_1.match)(openers['.'], (0, memoize_1.memoize)(ms => list(type(ms[1]), '.'), ms => idx(ms[1]), [])), (0, combinator_1.match)(openers['('], (0, memoize_1.memoize)(ms => list(type(ms[1]), '('), ms => idx(ms[1]), []))])));
|
|
5309
5335
|
const list = (type, form) => (0, combinator_1.fmap)((0, combinator_1.some)((0, combinator_1.creation)(1, false, (0, combinator_1.union)([(0, inline_1.indexee)((0, combinator_1.fmap)((0, combinator_1.fallback)((0, combinator_1.inits)([(0, combinator_1.line)((0, combinator_1.open)(heads[form], (0, combinator_1.subsequence)([ulist_1.checkbox, (0, combinator_1.trim)((0, combinator_1.union)([(0, combinator_1.fmap)((0, combinator_1.close)((0, combinator_1.union)([index_1.index]), /^$/), ([el]) => [(0, dom_1.define)(el, {
|
|
5310
5336
|
class: void el.classList.add('indexer'),
|
|
5311
5337
|
'data-index': ''
|
|
5312
|
-
})]), (0, visibility_1.visualize)((0, visibility_1.trimBlank)((0, combinator_1.some)((0, combinator_1.union)([inline_1.indexer, inline_1.inline]))))]))]), true)), (0, combinator_1.indent)((0, combinator_1.union)([ulist_1.ulist_, exports.olist_, ilist_1.ilist_]))]),
|
|
5338
|
+
})]), (0, visibility_1.visualize)((0, visibility_1.trimBlank)((0, combinator_1.some)((0, combinator_1.union)([inline_1.indexer, inline_1.inline]))))]))]), true)), (0, combinator_1.indent)((0, combinator_1.union)([ulist_1.ulist_, exports.olist_, ilist_1.ilist_]))]), ulist_1.invalid), ns => [(0, dom_1.html)('li', {
|
|
5313
5339
|
'data-marker': ns.shift() || undefined
|
|
5314
5340
|
}, (0, dom_1.defrag)((0, ulist_1.fillFirstLine)(ns)))]), true)]))), es => [format((0, dom_1.html)('ol', es), type, form)]);
|
|
5315
5341
|
const heads = {
|
|
@@ -5320,16 +5346,6 @@ const heads = {
|
|
|
5320
5346
|
source
|
|
5321
5347
|
}) => [[source.trimEnd().replace(/^\($/, '(1)').replace(/^\((\w+)$/, '($1)')], ''])
|
|
5322
5348
|
};
|
|
5323
|
-
exports.invalid = (0, combinator_1.rewrite)((0, combinator_1.inits)([source_1.contentline, (0, combinator_1.indent)(({
|
|
5324
|
-
source
|
|
5325
|
-
}) => [[source], ''])]), ({
|
|
5326
|
-
source
|
|
5327
|
-
}) => [['', (0, dom_1.html)('span', {
|
|
5328
|
-
class: 'invalid',
|
|
5329
|
-
'data-invalid-syntax': 'list',
|
|
5330
|
-
'data-invalid-type': 'syntax',
|
|
5331
|
-
'data-invalid-message': 'Fix the indent or the head of the list item'
|
|
5332
|
-
}, source.replace('\n', ''))], '']);
|
|
5333
5349
|
function idx(value) {
|
|
5334
5350
|
switch (value) {
|
|
5335
5351
|
case 'i':
|
|
@@ -5638,7 +5654,7 @@ const row = (parser, optional) => (0, combinator_1.creation)(1, false, (0, combi
|
|
|
5638
5654
|
'data-invalid-message': 'Missing the start symbol of the table row'
|
|
5639
5655
|
}, [(0, dom_1.html)('td', source.replace('\n', ''))])], ''])));
|
|
5640
5656
|
const align = (0, combinator_1.creation)(1, false, (0, combinator_1.fmap)((0, combinator_1.open)('|', (0, combinator_1.union)([(0, combinator_1.focus)(/^:-+:/, () => [['center'], '']), (0, combinator_1.focus)(/^:-+/, () => [['start'], '']), (0, combinator_1.focus)(/^-+:/, () => [['end'], '']), (0, combinator_1.focus)(/^-+/, () => [[''], ''])])), ns => [(0, dom_1.html)('td', (0, dom_1.defrag)(ns))]));
|
|
5641
|
-
const cell = (0, combinator_1.surround)(/^\|\s*(?=\S)/, (0,
|
|
5657
|
+
const cell = (0, combinator_1.surround)(/^\|\s*(?=\S)/, (0, combinator_1.trimStart)((0, combinator_1.union)([(0, combinator_1.close)(inline_1.medialink, /^\s*(?=\||$)/), (0, combinator_1.close)(inline_1.media, /^\s*(?=\||$)/), (0, combinator_1.close)(inline_1.shortmedia, /^\s*(?=\||$)/), (0, visibility_1.trimBlankStart)((0, combinator_1.some)(inline_1.inline, /^\|/, [[/^[|\\]?\s*$/, 9]]))])), /^[^|]*/, true);
|
|
5642
5658
|
const head = (0, combinator_1.creation)(1, false, (0, combinator_1.fmap)(cell, ns => [(0, dom_1.html)('th', (0, visibility_1.trimNodeEnd)((0, dom_1.defrag)(ns)))]));
|
|
5643
5659
|
const data = (0, combinator_1.creation)(1, false, (0, combinator_1.fmap)(cell, ns => [(0, dom_1.html)('td', (0, visibility_1.trimNodeEnd)((0, dom_1.defrag)(ns)))]));
|
|
5644
5660
|
function format(rows) {
|
|
@@ -5666,25 +5682,36 @@ function format(rows) {
|
|
|
5666
5682
|
Object.defineProperty(exports, "__esModule", ({
|
|
5667
5683
|
value: true
|
|
5668
5684
|
}));
|
|
5669
|
-
exports.fillFirstLine = exports.checkbox = exports.ulist_ = exports.ulist = void 0;
|
|
5685
|
+
exports.fillFirstLine = exports.invalid = exports.checkbox = exports.ulist_ = exports.ulist = void 0;
|
|
5670
5686
|
const combinator_1 = __webpack_require__(2087);
|
|
5671
5687
|
const olist_1 = __webpack_require__(7471);
|
|
5672
5688
|
const ilist_1 = __webpack_require__(238);
|
|
5673
5689
|
const inline_1 = __webpack_require__(1160);
|
|
5674
5690
|
const index_1 = __webpack_require__(4479);
|
|
5691
|
+
const source_1 = __webpack_require__(6743);
|
|
5675
5692
|
const visibility_1 = __webpack_require__(7618);
|
|
5676
5693
|
const array_1 = __webpack_require__(8112);
|
|
5677
5694
|
const dom_1 = __webpack_require__(3252);
|
|
5678
|
-
exports.ulist = (0, combinator_1.lazy)(() => (0, combinator_1.block)((0, combinator_1.validate)(/^-(?=[^\S\n]|\n[^\S\n]*\S)/,
|
|
5695
|
+
exports.ulist = (0, combinator_1.lazy)(() => (0, combinator_1.block)((0, combinator_1.validate)(/^-(?=[^\S\n]|\n[^\S\n]*\S)/, exports.ulist_)));
|
|
5679
5696
|
exports.ulist_ = (0, combinator_1.lazy)(() => (0, combinator_1.block)((0, combinator_1.fmap)((0, combinator_1.validate)(/^-(?=$|\s)/, (0, combinator_1.some)((0, combinator_1.creation)(1, false, (0, combinator_1.union)([(0, inline_1.indexee)((0, combinator_1.fmap)((0, combinator_1.fallback)((0, combinator_1.inits)([(0, combinator_1.line)((0, combinator_1.open)(/^-(?:$|\s)/, (0, combinator_1.subsequence)([exports.checkbox, (0, combinator_1.trim)((0, combinator_1.union)([(0, combinator_1.fmap)((0, combinator_1.close)((0, combinator_1.union)([index_1.index]), /^$/), ([el]) => [(0, dom_1.define)(el, {
|
|
5680
5697
|
class: void el.classList.add('indexer'),
|
|
5681
5698
|
'data-index': ''
|
|
5682
|
-
})]), (0, visibility_1.visualize)((0, visibility_1.trimBlank)((0, combinator_1.some)((0, combinator_1.union)([inline_1.indexer, inline_1.inline]))))]))]), true)), (0, combinator_1.indent)((0, combinator_1.union)([exports.ulist_, olist_1.olist_, ilist_1.ilist_]))]),
|
|
5699
|
+
})]), (0, visibility_1.visualize)((0, visibility_1.trimBlank)((0, combinator_1.some)((0, combinator_1.union)([inline_1.indexer, inline_1.inline]))))]))]), true)), (0, combinator_1.indent)((0, combinator_1.union)([exports.ulist_, olist_1.olist_, ilist_1.ilist_]))]), exports.invalid), ns => [(0, dom_1.html)('li', (0, dom_1.defrag)(fillFirstLine(ns)))]), true)])))), es => [format((0, dom_1.html)('ul', es))])));
|
|
5683
5700
|
exports.checkbox = (0, combinator_1.creation)(1, false, (0, combinator_1.focus)(/^\[[xX ]\](?=$|\s)/, ({
|
|
5684
5701
|
source
|
|
5685
5702
|
}) => [[(0, dom_1.html)('span', {
|
|
5686
5703
|
class: 'checkbox'
|
|
5687
5704
|
}, source[1].trimStart() ? '☑' : '☐')], '']));
|
|
5705
|
+
exports.invalid = (0, combinator_1.rewrite)((0, combinator_1.inits)([source_1.contentline, (0, combinator_1.indent)(({
|
|
5706
|
+
source
|
|
5707
|
+
}) => [[source], ''])]), ({
|
|
5708
|
+
source
|
|
5709
|
+
}) => [['', (0, dom_1.html)('span', {
|
|
5710
|
+
class: 'invalid',
|
|
5711
|
+
'data-invalid-syntax': 'list',
|
|
5712
|
+
'data-invalid-type': 'syntax',
|
|
5713
|
+
'data-invalid-message': 'Fix the indent or the head of the list item'
|
|
5714
|
+
}, source.replace('\n', ''))], '']);
|
|
5688
5715
|
function fillFirstLine(ns) {
|
|
5689
5716
|
return ns.length === 1 && typeof ns[0] === 'object' && ['UL', 'OL'].includes(ns[0].tagName) ? (0, array_1.unshift)([(0, dom_1.html)('br')], ns) : ns;
|
|
5690
5717
|
}
|
|
@@ -5756,7 +5783,7 @@ const field = (0, combinator_1.line)(({
|
|
|
5756
5783
|
Object.defineProperty(exports, "__esModule", ({
|
|
5757
5784
|
value: true
|
|
5758
5785
|
}));
|
|
5759
|
-
exports.shortmedia = exports.media = exports.indexer = exports.indexee = exports.inline = void 0;
|
|
5786
|
+
exports.shortmedia = exports.media = exports.medialink = exports.indexer = exports.indexee = exports.inline = void 0;
|
|
5760
5787
|
const combinator_1 = __webpack_require__(2087);
|
|
5761
5788
|
const annotation_1 = __webpack_require__(2736);
|
|
5762
5789
|
const reference_1 = __webpack_require__(3555);
|
|
@@ -5774,13 +5801,11 @@ const emstrong_1 = __webpack_require__(6132);
|
|
|
5774
5801
|
const emphasis_1 = __webpack_require__(3867);
|
|
5775
5802
|
const strong_1 = __webpack_require__(6578);
|
|
5776
5803
|
const code_1 = __webpack_require__(5771);
|
|
5777
|
-
const media_1 = __webpack_require__(1303);
|
|
5778
5804
|
const htmlentity_1 = __webpack_require__(1562);
|
|
5779
|
-
const shortmedia_1 = __webpack_require__(4189);
|
|
5780
5805
|
const autolink_1 = __webpack_require__(6051);
|
|
5781
5806
|
const bracket_1 = __webpack_require__(5196);
|
|
5782
5807
|
const source_1 = __webpack_require__(6743);
|
|
5783
|
-
exports.inline = (0, combinator_1.lazy)(() => (0, combinator_1.union)([annotation_1.annotation, reference_1.reference, template_1.template, remark_1.remark, math_1.math, extension_1.extension, ruby_1.ruby, link_1.textlink,
|
|
5808
|
+
exports.inline = (0, combinator_1.lazy)(() => (0, combinator_1.union)([annotation_1.annotation, reference_1.reference, template_1.template, remark_1.remark, math_1.math, extension_1.extension, ruby_1.ruby, link_1.textlink, html_1.html, insertion_1.insertion, deletion_1.deletion, mark_1.mark, emstrong_1.emstrong, strong_1.strong, emphasis_1.emphasis, code_1.code, htmlentity_1.htmlentity, autolink_1.autolink, bracket_1.bracket, source_1.text]));
|
|
5784
5809
|
var indexee_1 = __webpack_require__(1269);
|
|
5785
5810
|
Object.defineProperty(exports, "indexee", ({
|
|
5786
5811
|
enumerable: true,
|
|
@@ -5795,18 +5820,25 @@ Object.defineProperty(exports, "indexer", ({
|
|
|
5795
5820
|
return indexer_1.indexer;
|
|
5796
5821
|
}
|
|
5797
5822
|
}));
|
|
5798
|
-
var
|
|
5823
|
+
var link_2 = __webpack_require__(9628);
|
|
5824
|
+
Object.defineProperty(exports, "medialink", ({
|
|
5825
|
+
enumerable: true,
|
|
5826
|
+
get: function () {
|
|
5827
|
+
return link_2.medialink;
|
|
5828
|
+
}
|
|
5829
|
+
}));
|
|
5830
|
+
var media_1 = __webpack_require__(1303);
|
|
5799
5831
|
Object.defineProperty(exports, "media", ({
|
|
5800
5832
|
enumerable: true,
|
|
5801
5833
|
get: function () {
|
|
5802
|
-
return
|
|
5834
|
+
return media_1.media;
|
|
5803
5835
|
}
|
|
5804
5836
|
}));
|
|
5805
|
-
var
|
|
5837
|
+
var shortmedia_1 = __webpack_require__(4189);
|
|
5806
5838
|
Object.defineProperty(exports, "shortmedia", ({
|
|
5807
5839
|
enumerable: true,
|
|
5808
5840
|
get: function () {
|
|
5809
|
-
return
|
|
5841
|
+
return shortmedia_1.shortmedia;
|
|
5810
5842
|
}
|
|
5811
5843
|
}));
|
|
5812
5844
|
|
|
@@ -6331,10 +6363,10 @@ exports.indexer = void 0;
|
|
|
6331
6363
|
const combinator_1 = __webpack_require__(2087);
|
|
6332
6364
|
const index_1 = __webpack_require__(4479);
|
|
6333
6365
|
const dom_1 = __webpack_require__(3252);
|
|
6334
|
-
exports.indexer = (0, combinator_1.surround)(/^\s+\[(?=\|\S)/, (0, combinator_1.
|
|
6366
|
+
exports.indexer = (0, combinator_1.surround)(/^\s+\[(?=\|\S)/, (0, combinator_1.union)([index_1.signature, (0, combinator_1.creation)((0, combinator_1.focus)(/^\|(?=\])/, () => [[(0, dom_1.html)('span', {
|
|
6335
6367
|
class: 'indexer',
|
|
6336
6368
|
'data-index': ''
|
|
6337
|
-
})], '']))])
|
|
6369
|
+
})], '']))]), /^\]\s*$/);
|
|
6338
6370
|
|
|
6339
6371
|
/***/ }),
|
|
6340
6372
|
|
|
@@ -7739,21 +7771,21 @@ var blank;
|
|
|
7739
7771
|
blank.start = new RegExp(/^(?:\\?[^\S\n]|&IHN;|<wbr[^\S\n]*>)+/.source.replace('IHN', `(?:${normalize_1.invisibleHTMLEntityNames.join('|')})`));
|
|
7740
7772
|
})(blank || (exports.blank = blank = {}));
|
|
7741
7773
|
function visualize(parser) {
|
|
7742
|
-
return (0, combinator_1.union)([(0, combinator_1.convert)(source => source.replace(blank.line, line => line.replace(/[\\&<]/g, '\x1B$&')), (0, combinator_1.verify)(parser, (ns, rest
|
|
7774
|
+
return (0, combinator_1.union)([(0, combinator_1.convert)(source => source.replace(blank.line, line => line.replace(/[\\&<]/g, '\x1B$&')), (0, combinator_1.verify)(parser, (ns, rest) => !rest && hasVisible(ns))), (0, combinator_1.some)((0, combinator_1.union)([source_1.linebreak, source_1.unescsource]))]);
|
|
7743
7775
|
}
|
|
7744
7776
|
exports.visualize = visualize;
|
|
7745
|
-
function hasVisible(nodes
|
|
7746
|
-
state = 0
|
|
7747
|
-
} = {}) {
|
|
7777
|
+
function hasVisible(nodes) {
|
|
7748
7778
|
for (let i = 0; i < nodes.length; ++i) {
|
|
7749
7779
|
const node = nodes[i];
|
|
7750
7780
|
if (typeof node === 'string') {
|
|
7751
7781
|
if (node && node.trimStart()) return true;
|
|
7752
7782
|
} else {
|
|
7753
7783
|
if (node.innerText.trimStart()) return true;
|
|
7754
|
-
if (state &
|
|
7784
|
+
//if (state & State.media ^ State.media &&
|
|
7785
|
+
// (node.classList.contains('media') || node.getElementsByClassName('media')[0])) return true;
|
|
7755
7786
|
}
|
|
7756
7787
|
}
|
|
7788
|
+
|
|
7757
7789
|
return false;
|
|
7758
7790
|
}
|
|
7759
7791
|
function blankWith(starting, delimiter) {
|
|
@@ -8098,7 +8130,7 @@ function image(source, url, cache) {
|
|
|
8098
8130
|
src: source.getAttribute('data-src'),
|
|
8099
8131
|
loading: 'lazy'
|
|
8100
8132
|
});
|
|
8101
|
-
cache?.set(url.href, (0, dom_1.define)(source.cloneNode(true), Object.fromEntries([...source.attributes].filter(attr => !['class', 'data-type', 'data-src', 'src', 'loading'].includes(attr.name)).map(attr => [attr.name, null]))));
|
|
8133
|
+
cache?.set(url.href, (0, dom_1.define)(source.cloneNode(true), Object.fromEntries([...source.attributes].filter(attr => !['class', 'data-type', 'data-src', 'src', 'loading'].includes(attr.name)).map(attr => [attr.name, attr.name === 'alt' ? '' : null]))));
|
|
8102
8134
|
return source;
|
|
8103
8135
|
}
|
|
8104
8136
|
exports.image = image;
|
|
@@ -8528,7 +8560,7 @@ function unlink(h) {
|
|
|
8528
8560
|
/***/ 3252:
|
|
8529
8561
|
/***/ (function(module) {
|
|
8530
8562
|
|
|
8531
|
-
/*! typed-dom v0.0.
|
|
8563
|
+
/*! typed-dom v0.0.336 https://github.com/falsandtru/typed-dom | (c) 2016, falsandtru | (Apache-2.0 AND MPL-2.0) License */
|
|
8532
8564
|
(function webpackUniversalModuleDefinition(root, factory) {
|
|
8533
8565
|
if(true)
|
|
8534
8566
|
module.exports = factory();
|
|
@@ -8864,7 +8896,7 @@ exports.defrag = defrag;
|
|
|
8864
8896
|
/***/ 6120:
|
|
8865
8897
|
/***/ (function(module) {
|
|
8866
8898
|
|
|
8867
|
-
/*! typed-dom v0.0.
|
|
8899
|
+
/*! typed-dom v0.0.336 https://github.com/falsandtru/typed-dom | (c) 2016, falsandtru | (Apache-2.0 AND MPL-2.0) License */
|
|
8868
8900
|
(function webpackUniversalModuleDefinition(root, factory) {
|
|
8869
8901
|
if(true)
|
|
8870
8902
|
module.exports = factory();
|
package/markdown.d.ts
CHANGED
|
@@ -71,6 +71,7 @@ export namespace MarkdownParser {
|
|
|
71
71
|
BlockParser.ExtensionParser,
|
|
72
72
|
BlockParser.SidefenceParser,
|
|
73
73
|
BlockParser.BlockquoteParser,
|
|
74
|
+
BlockParser.MediaBlockParser,
|
|
74
75
|
BlockParser.ReplyParser,
|
|
75
76
|
BlockParser.ParagraphParser,
|
|
76
77
|
]> {
|
|
@@ -270,12 +271,18 @@ export namespace MarkdownParser {
|
|
|
270
271
|
export interface HeadParser extends
|
|
271
272
|
Block<'table/cell/head'>,
|
|
272
273
|
Parser<HTMLTableCellElement, Context, [
|
|
274
|
+
InlineParser.LinkParser.MediaLinkParser,
|
|
275
|
+
InlineParser.MediaParser,
|
|
276
|
+
InlineParser.ShortMediaParser,
|
|
273
277
|
InlineParser,
|
|
274
278
|
]> {
|
|
275
279
|
}
|
|
276
280
|
export interface DataParser extends
|
|
277
281
|
Block<'table/cell/data'>,
|
|
278
282
|
Parser<HTMLTableCellElement, Context, [
|
|
283
|
+
InlineParser.LinkParser.MediaLinkParser,
|
|
284
|
+
InlineParser.MediaParser,
|
|
285
|
+
InlineParser.ShortMediaParser,
|
|
279
286
|
InlineParser,
|
|
280
287
|
]> {
|
|
281
288
|
}
|
|
@@ -457,12 +464,18 @@ export namespace MarkdownParser {
|
|
|
457
464
|
export interface HeadParser extends
|
|
458
465
|
Block<'extension/table/cell/head'>,
|
|
459
466
|
Parser<HTMLTableCellElement, Context, [
|
|
467
|
+
InlineParser.LinkParser.MediaLinkParser,
|
|
468
|
+
InlineParser.MediaParser,
|
|
469
|
+
InlineParser.ShortMediaParser,
|
|
460
470
|
InlineParser,
|
|
461
471
|
]> {
|
|
462
472
|
}
|
|
463
473
|
export interface DataParser extends
|
|
464
474
|
Block<'extension/table/cell/data'>,
|
|
465
475
|
Parser<HTMLTableCellElement, Context, [
|
|
476
|
+
InlineParser.LinkParser.MediaLinkParser,
|
|
477
|
+
InlineParser.MediaParser,
|
|
478
|
+
InlineParser.ShortMediaParser,
|
|
466
479
|
InlineParser,
|
|
467
480
|
]> {
|
|
468
481
|
}
|
|
@@ -497,6 +510,7 @@ export namespace MarkdownParser {
|
|
|
497
510
|
BlockParser.MathBlockParser,
|
|
498
511
|
BlockParser.SidefenceParser,
|
|
499
512
|
BlockParser.BlockquoteParser,
|
|
513
|
+
BlockParser.MediaBlockParser,
|
|
500
514
|
BlockParser.ParagraphParser,
|
|
501
515
|
]> {
|
|
502
516
|
}
|
|
@@ -562,6 +576,22 @@ export namespace MarkdownParser {
|
|
|
562
576
|
]> {
|
|
563
577
|
}
|
|
564
578
|
}
|
|
579
|
+
export interface MediaBlockParser extends
|
|
580
|
+
// abc
|
|
581
|
+
Block<'mediablock'>,
|
|
582
|
+
Parser<HTMLDivElement, Context, [
|
|
583
|
+
Parser<HTMLElement, Context, [
|
|
584
|
+
InlineParser.LinkParser.MediaLinkParser,
|
|
585
|
+
InlineParser.MediaParser,
|
|
586
|
+
InlineParser.ShortMediaParser,
|
|
587
|
+
]>,
|
|
588
|
+
Parser<HTMLElement, Context, [
|
|
589
|
+
InlineParser.LinkParser.MediaLinkParser,
|
|
590
|
+
InlineParser.MediaParser,
|
|
591
|
+
InlineParser.ShortMediaParser,
|
|
592
|
+
]>,
|
|
593
|
+
]> {
|
|
594
|
+
}
|
|
565
595
|
export interface ReplyParser extends
|
|
566
596
|
// >>1
|
|
567
597
|
// > text
|
|
@@ -641,8 +671,6 @@ export namespace MarkdownParser {
|
|
|
641
671
|
InlineParser.ExtensionParser,
|
|
642
672
|
InlineParser.RubyParser,
|
|
643
673
|
InlineParser.LinkParser.TextLinkParser,
|
|
644
|
-
InlineParser.LinkParser.LineMediaLinkParser,
|
|
645
|
-
InlineParser.MediaParser.LineMediaParser,
|
|
646
674
|
InlineParser.HTMLParser,
|
|
647
675
|
InlineParser.InsertionParser,
|
|
648
676
|
InlineParser.DeletionParser,
|
|
@@ -652,7 +680,6 @@ export namespace MarkdownParser {
|
|
|
652
680
|
InlineParser.EmphasisParser,
|
|
653
681
|
InlineParser.CodeParser,
|
|
654
682
|
InlineParser.HTMLEntityParser,
|
|
655
|
-
InlineParser.ShortMediaParser.LineShortMediaParser,
|
|
656
683
|
InlineParser.AutolinkParser,
|
|
657
684
|
InlineParser.BracketParser,
|
|
658
685
|
SourceParser.TextParser,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "securemark",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.279.0",
|
|
4
4
|
"description": "Secure markdown renderer working on browsers for user input data.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"homepage": "https://github.com/falsandtru/securemark",
|
|
@@ -34,14 +34,14 @@
|
|
|
34
34
|
"@types/mocha": "10.0.1",
|
|
35
35
|
"@types/power-assert": "1.5.8",
|
|
36
36
|
"@types/prismjs": "1.26.0",
|
|
37
|
-
"@typescript-eslint/parser": "^5.59.
|
|
37
|
+
"@typescript-eslint/parser": "^5.59.9",
|
|
38
38
|
"babel-loader": "^9.1.2",
|
|
39
39
|
"babel-plugin-unassert": "^3.2.0",
|
|
40
40
|
"concurrently": "^8.1.0",
|
|
41
41
|
"eslint": "^8.42.0",
|
|
42
42
|
"eslint-plugin-redos": "^4.4.5",
|
|
43
43
|
"eslint-webpack-plugin": "^4.0.1",
|
|
44
|
-
"glob": "^10.2.
|
|
44
|
+
"glob": "^10.2.7",
|
|
45
45
|
"karma": "^6.4.2",
|
|
46
46
|
"karma-chrome-launcher": "^3.2.0",
|
|
47
47
|
"karma-coverage": "^2.2.0",
|
|
@@ -51,11 +51,11 @@
|
|
|
51
51
|
"mocha": "^10.2.0",
|
|
52
52
|
"npm-check-updates": "^16.10.12",
|
|
53
53
|
"semver": "^7.5.1",
|
|
54
|
-
"spica": "0.0.
|
|
54
|
+
"spica": "0.0.732",
|
|
55
55
|
"ts-loader": "^9.4.3",
|
|
56
|
-
"typed-dom": "0.0.
|
|
56
|
+
"typed-dom": "0.0.336",
|
|
57
57
|
"typescript": "5.1.3",
|
|
58
|
-
"webpack": "^5.85.
|
|
58
|
+
"webpack": "^5.85.1",
|
|
59
59
|
"webpack-cli": "^5.1.3",
|
|
60
60
|
"webpack-merge": "^5.9.0"
|
|
61
61
|
},
|
|
@@ -132,9 +132,9 @@ describe('Unit: parser/api/parse', () => {
|
|
|
132
132
|
'<p><a class="url" href="https://source/a" target="_blank">../a</a></p>',
|
|
133
133
|
'<p><a class="url" href="https://source/a" target="_blank">../../a</a></p>',
|
|
134
134
|
'<p><a class="url" href="//domain/a" target="_blank">//domain/a</a></p>',
|
|
135
|
-
'<
|
|
136
|
-
'<
|
|
137
|
-
'<
|
|
135
|
+
'<div><a href="https://source/x/a" target="_blank"><img class="media" data-src="https://source/x/a" alt=""></a></div>',
|
|
136
|
+
'<div><a href="/z/a" target="_blank"><img class="media" data-src="/z/a" alt=""></a></div>',
|
|
137
|
+
'<div><a href="https://source/a" target="_blank"><img class="media" data-src="https://source/a" alt=""></a></div>',
|
|
138
138
|
'<ol class="annotations"><li id="annotation::def:a:1" data-marker="*1"><span>a</span><sup><a href="#annotation::ref:a:1">^1</a></sup></li></ol>',
|
|
139
139
|
]);
|
|
140
140
|
assert.deepStrictEqual(
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ExtensionParser } from '../../block';
|
|
2
|
-
import { union, inits, sequence, some,
|
|
2
|
+
import { union, inits, sequence, some, block, line, fence, rewrite, close, match, convert, fallback, fmap } from '../../../combinator';
|
|
3
3
|
import { str, contentline, emptyline } from '../../source';
|
|
4
4
|
import { label, segment as seg_label } from '../../inline/extension/label';
|
|
5
5
|
import { ulist } from '../ulist';
|
|
@@ -12,7 +12,6 @@ import { table, segment_ as seg_table } from './table';
|
|
|
12
12
|
import { blockquote, segment as seg_blockquote } from '../blockquote';
|
|
13
13
|
import { placeholder, segment_ as seg_placeholder } from './placeholder';
|
|
14
14
|
import { inline, media, shortmedia } from '../../inline';
|
|
15
|
-
import { State } from '../../context';
|
|
16
15
|
import { visualize, trimBlankStart, trimNodeEnd } from '../../visibility';
|
|
17
16
|
import { memoize } from 'spica/memoize';
|
|
18
17
|
import { html, defrag } from 'typed-dom/dom';
|
|
@@ -64,9 +63,7 @@ export const figure: FigureParser = block(fallback(rewrite(segment, fmap(
|
|
|
64
63
|
line(shortmedia),
|
|
65
64
|
])),
|
|
66
65
|
emptyline,
|
|
67
|
-
block(
|
|
68
|
-
state(State.media,
|
|
69
|
-
visualize(trimBlankStart(some(inline))))),
|
|
66
|
+
block(visualize(trimBlankStart(some(inline)))),
|
|
70
67
|
]),
|
|
71
68
|
])),
|
|
72
69
|
([label, param, content, ...caption]: [HTMLAnchorElement, string, ...HTMLElement[]]) => [
|
|
@@ -11,6 +11,7 @@ import { codeblock } from '../codeblock';
|
|
|
11
11
|
import { mathblock } from '../mathblock';
|
|
12
12
|
import { sidefence } from '../sidefence';
|
|
13
13
|
import { blockquote } from '../blockquote';
|
|
14
|
+
import { mediablock } from '../mediablock';
|
|
14
15
|
import { paragraph } from '../paragraph';
|
|
15
16
|
import { unshift, push } from 'spica/array';
|
|
16
17
|
import { html } from 'typed-dom/dom';
|
|
@@ -74,5 +75,6 @@ const content: MessageParser.ContentParser = union([
|
|
|
74
75
|
mathblock,
|
|
75
76
|
sidefence,
|
|
76
77
|
blockquote,
|
|
78
|
+
mediablock,
|
|
77
79
|
paragraph,
|
|
78
80
|
]);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { max, min, isArray } from 'spica/alias';
|
|
2
2
|
import { ExtensionParser } from '../../block';
|
|
3
3
|
import { Tree, eval } from '../../../combinator/data/parser';
|
|
4
|
-
import { union, subsequence, inits, some, creation, block, line, validate, fence, rewrite, open, clear, convert, dup, lazy, fmap } from '../../../combinator';
|
|
5
|
-
import { inline } from '../../inline';
|
|
4
|
+
import { union, subsequence, inits, some, creation, block, line, validate, fence, rewrite, surround, open, clear, convert, dup, lazy, fmap } from '../../../combinator';
|
|
5
|
+
import { inline, medialink, media, shortmedia } from '../../inline';
|
|
6
6
|
import { str, anyline, emptyline, contentline } from '../../source';
|
|
7
7
|
import { visualize, trimBlankStart, trimNodeEnd } from '../../visibility';
|
|
8
8
|
import { unshift, splice } from 'spica/array';
|
|
@@ -84,7 +84,12 @@ const head: CellParser.HeadParser = creation(1, false, block(fmap(open(
|
|
|
84
84
|
anyline,
|
|
85
85
|
some(contentline, delimiter),
|
|
86
86
|
]),
|
|
87
|
-
|
|
87
|
+
union([
|
|
88
|
+
block(surround(/^[^\n]/, medialink, /^\s*$/)),
|
|
89
|
+
block(surround(/^[^\n]/, media, /^\s*$/)),
|
|
90
|
+
block(surround(/^[^\n]/, shortmedia, /^\s*$/)),
|
|
91
|
+
open(/^(?:\s*\n|\s)/, visualize(trimBlankStart(some(inline))), true),
|
|
92
|
+
])),
|
|
88
93
|
true),
|
|
89
94
|
ns => [html('th', attributes(ns.shift()! as string), trimNodeEnd(defrag(ns)))]),
|
|
90
95
|
false));
|
|
@@ -96,7 +101,12 @@ const data: CellParser.DataParser = creation(1, false, block(fmap(open(
|
|
|
96
101
|
anyline,
|
|
97
102
|
some(contentline, delimiter),
|
|
98
103
|
]),
|
|
99
|
-
|
|
104
|
+
union([
|
|
105
|
+
block(surround(/^[^\n]/, medialink, /^\s*$/)),
|
|
106
|
+
block(surround(/^[^\n]/, media, /^\s*$/)),
|
|
107
|
+
block(surround(/^[^\n]/, shortmedia, /^\s*$/)),
|
|
108
|
+
open(/^(?:\s*\n|\s)/, visualize(some(inline)), true),
|
|
109
|
+
])),
|
|
100
110
|
true),
|
|
101
111
|
ns => [html('td', attributes(ns.shift()! as string), trimNodeEnd(defrag(ns)))]),
|
|
102
112
|
false));
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
import { IListParser } from '../block';
|
|
2
|
-
import { union, inits, some, creation,
|
|
3
|
-
import { ulist_, fillFirstLine } from './ulist';
|
|
4
|
-
import { olist_
|
|
2
|
+
import { union, inits, some, creation, block, line, validate, indent, open, fallback, lazy, fmap } from '../../combinator';
|
|
3
|
+
import { ulist_, invalid, fillFirstLine } from './ulist';
|
|
4
|
+
import { olist_ } from './olist';
|
|
5
5
|
import { inline } from '../inline';
|
|
6
|
-
import { State } from '../context';
|
|
7
6
|
import { html, defrag } from 'typed-dom/dom';
|
|
8
7
|
|
|
9
8
|
export const ilist: IListParser = lazy(() => block(validate(
|
|
10
9
|
/^[-+*](?=[^\S\n]|\n[^\S\n]*\S)/,
|
|
11
|
-
|
|
12
|
-
ilist_))));
|
|
10
|
+
ilist_)));
|
|
13
11
|
|
|
14
12
|
export const ilist_: IListParser = lazy(() => block(fmap(validate(
|
|
15
13
|
/^[-+*](?:$|\s)/,
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { MediaBlockParser } from '../block';
|
|
2
|
+
import { union, inits, some, block, line, validate, fallback, fmap } from '../../combinator';
|
|
3
|
+
import { medialink, media, shortmedia } from '../inline';
|
|
4
|
+
import { html } from 'typed-dom/dom';
|
|
5
|
+
|
|
6
|
+
export const mediablock: MediaBlockParser = block(validate(['[!', '!'], fmap(
|
|
7
|
+
inits([
|
|
8
|
+
line(union([
|
|
9
|
+
medialink,
|
|
10
|
+
media,
|
|
11
|
+
shortmedia,
|
|
12
|
+
])),
|
|
13
|
+
some(line(fallback(union([
|
|
14
|
+
medialink,
|
|
15
|
+
media,
|
|
16
|
+
shortmedia,
|
|
17
|
+
]), ({ source }) => [[html('div', [html('span', attrs, source.replace('\n', ''))])], '']))),
|
|
18
|
+
]),
|
|
19
|
+
ns => [html('div', ns)])));
|
|
20
|
+
|
|
21
|
+
const attrs = {
|
|
22
|
+
class: 'invalid',
|
|
23
|
+
'data-invalid-syntax': 'mediablock',
|
|
24
|
+
'data-invalid-type': 'syntax',
|
|
25
|
+
'data-invalid-message': 'Not media syntax',
|
|
26
|
+
} as const;
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import { OListParser } from '../block';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { checkbox, ulist_, fillFirstLine } from './ulist';
|
|
2
|
+
import { union, inits, subsequence, some, creation, block, line, validate, indent, focus, open, close, match, trim, fallback, lazy, fmap } from '../../combinator';
|
|
3
|
+
import { ulist_, checkbox, invalid, fillFirstLine } from './ulist';
|
|
5
4
|
import { ilist_ } from './ilist';
|
|
6
5
|
import { inline, indexee, indexer } from '../inline';
|
|
7
6
|
import { index } from '../inline/extension/index';
|
|
8
|
-
import { contentline } from '../source';
|
|
9
|
-
import { State } from '../context';
|
|
10
7
|
import { visualize, trimBlank } from '../visibility';
|
|
11
8
|
import { memoize } from 'spica/memoize';
|
|
12
9
|
import { html, define, defrag } from 'typed-dom/dom';
|
|
@@ -21,8 +18,7 @@ export const olist: OListParser = lazy(() => block(validate(
|
|
|
21
18
|
/^([0-9]+|[a-z]+|[A-Z]+)(?:-[0-9]+)*\.(?=[^\S\n]|\n[^\S\n]*\S)/.source,
|
|
22
19
|
/^\(([0-9]+|[a-z]+)\)(?:-[0-9]+)*(?=[^\S\n]|\n[^\S\n]*\S)/.source,
|
|
23
20
|
].join('|')),
|
|
24
|
-
|
|
25
|
-
olist_))));
|
|
21
|
+
olist_)));
|
|
26
22
|
|
|
27
23
|
export const olist_: OListParser = lazy(() => block(union([
|
|
28
24
|
match(
|
|
@@ -59,18 +55,6 @@ const heads = {
|
|
|
59
55
|
({ source }) => [[source.trimEnd().replace(/^\($/, '(1)').replace(/^\((\w+)$/, '($1)')], '']),
|
|
60
56
|
} as const;
|
|
61
57
|
|
|
62
|
-
export const invalid = rewrite(
|
|
63
|
-
inits([contentline, indent<Parser<string>>(({ source }) => [[source], ''])]),
|
|
64
|
-
({ source }) => [[
|
|
65
|
-
'',
|
|
66
|
-
html('span', {
|
|
67
|
-
class: 'invalid',
|
|
68
|
-
'data-invalid-syntax': 'list',
|
|
69
|
-
'data-invalid-type': 'syntax',
|
|
70
|
-
'data-invalid-message': 'Fix the indent or the head of the list item',
|
|
71
|
-
}, source.replace('\n', ''))
|
|
72
|
-
], '']);
|
|
73
|
-
|
|
74
58
|
function idx(value: string): number {
|
|
75
59
|
switch (value) {
|
|
76
60
|
case 'i':
|
|
@@ -35,9 +35,9 @@ describe('Unit: parser/block/paragraph', () => {
|
|
|
35
35
|
assert.deepStrictEqual(inspect(parser('==a\n<wbr>==\nb')), [['<p>==a<br><wbr>==<br>b</p>'], '']);
|
|
36
36
|
assert.deepStrictEqual(inspect(parser('http://host#\\')), [['<p><a class="url" href="http://host#\\" target="_blank">http://host#\\</a></p>'], '']);
|
|
37
37
|
assert.deepStrictEqual(inspect(parser('a\nhttp://host#\\ \nb')), [['<p>a<br><a class="url" href="http://host#\\" target="_blank">http://host#\\</a><br>b</p>'], '']);
|
|
38
|
-
assert.deepStrictEqual(inspect(parser('!http://host#\\')), [['<p><a href="http://host#\\" target="_blank"><img class="media" data-src="http://host#\\" alt=""></a></p>'], '']);
|
|
39
|
-
assert.deepStrictEqual(inspect(parser('!http://host#\\ a')), [['<p>!<a class="url" href="http://host#" target="_blank">http://host#</a> a</p>'], '']);
|
|
40
|
-
assert.deepStrictEqual(inspect(parser(' !http://host#\\')), [['<p> !<a class="url" href="http://host#" target="_blank">http://host#</a></p>'], '']);
|
|
38
|
+
//assert.deepStrictEqual(inspect(parser('!http://host#\\')), [['<p><a href="http://host#\\" target="_blank"><img class="media" data-src="http://host#\\" alt=""></a></p>'], '']);
|
|
39
|
+
//assert.deepStrictEqual(inspect(parser('!http://host#\\ a')), [['<p>!<a class="url" href="http://host#" target="_blank">http://host#</a> a</p>'], '']);
|
|
40
|
+
//assert.deepStrictEqual(inspect(parser(' !http://host#\\')), [['<p> !<a class="url" href="http://host#" target="_blank">http://host#</a></p>'], '']);
|
|
41
41
|
assert.deepStrictEqual(inspect(parser('\ta')), [['<p>\ta</p>'], '']);
|
|
42
42
|
});
|
|
43
43
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TableParser } from '../block';
|
|
2
|
-
import { union, sequence, some, creation, block, line, validate, focus, rewrite, surround, open, fallback, lazy, fmap } from '../../combinator';
|
|
3
|
-
import { inline } from '../inline';
|
|
2
|
+
import { union, sequence, some, creation, block, line, validate, focus, rewrite, surround, open, close, trimStart, fallback, lazy, fmap } from '../../combinator';
|
|
3
|
+
import { inline, media, medialink, shortmedia } from '../inline';
|
|
4
4
|
import { contentline } from '../source';
|
|
5
5
|
import { trimBlankStart, trimNodeEnd } from '../visibility';
|
|
6
6
|
import { duffReduce } from 'spica/duff';
|
|
@@ -49,7 +49,12 @@ const align: AlignParser = creation(1, false, fmap(open(
|
|
|
49
49
|
|
|
50
50
|
const cell: CellParser = surround(
|
|
51
51
|
/^\|\s*(?=\S)/,
|
|
52
|
-
|
|
52
|
+
trimStart(union([
|
|
53
|
+
close(medialink, /^\s*(?=\||$)/),
|
|
54
|
+
close(media, /^\s*(?=\||$)/),
|
|
55
|
+
close(shortmedia, /^\s*(?=\||$)/),
|
|
56
|
+
trimBlankStart(some(inline, /^\|/, [[/^[|\\]?\s*$/, 9]])),
|
|
57
|
+
])),
|
|
53
58
|
/^[^|]*/, true);
|
|
54
59
|
|
|
55
60
|
const head: CellParser.HeadParser = creation(1, false, fmap(
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { UListParser } from '../block';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { Parser } from '../../combinator/data/parser';
|
|
3
|
+
import { union, inits, subsequence, some, creation, block, line, validate, indent, focus, rewrite, open, close, trim, fallback, lazy, fmap } from '../../combinator';
|
|
4
|
+
import { olist_ } from './olist';
|
|
4
5
|
import { ilist_ } from './ilist';
|
|
5
6
|
import { inline, indexer, indexee } from '../inline';
|
|
6
7
|
import { index } from '../inline/extension/index';
|
|
7
|
-
import {
|
|
8
|
+
import { contentline } from '../source';
|
|
8
9
|
import { visualize, trimBlank } from '../visibility';
|
|
9
10
|
import { unshift } from 'spica/array';
|
|
10
11
|
import { html, define, defrag } from 'typed-dom/dom';
|
|
11
12
|
|
|
12
13
|
export const ulist: UListParser = lazy(() => block(validate(
|
|
13
14
|
/^-(?=[^\S\n]|\n[^\S\n]*\S)/,
|
|
14
|
-
|
|
15
|
-
ulist_))));
|
|
15
|
+
ulist_)));
|
|
16
16
|
|
|
17
17
|
export const ulist_: UListParser = lazy(() => block(fmap(validate(
|
|
18
18
|
/^-(?=$|\s)/,
|
|
@@ -38,6 +38,18 @@ export const checkbox = creation(1, false, focus(
|
|
|
38
38
|
html('span', { class: 'checkbox' }, source[1].trimStart() ? '☑' : '☐'),
|
|
39
39
|
], '']));
|
|
40
40
|
|
|
41
|
+
export const invalid = rewrite(
|
|
42
|
+
inits([contentline, indent<Parser<string>>(({ source }) => [[source], ''])]),
|
|
43
|
+
({ source }) => [[
|
|
44
|
+
'',
|
|
45
|
+
html('span', {
|
|
46
|
+
class: 'invalid',
|
|
47
|
+
'data-invalid-syntax': 'list',
|
|
48
|
+
'data-invalid-type': 'syntax',
|
|
49
|
+
'data-invalid-message': 'Fix the indent or the head of the list item',
|
|
50
|
+
}, source.replace('\n', ''))
|
|
51
|
+
], '']);
|
|
52
|
+
|
|
41
53
|
export function fillFirstLine(ns: (HTMLElement | string)[]): (HTMLElement | string)[] {
|
|
42
54
|
return ns.length === 1
|
|
43
55
|
&& typeof ns[0] === 'object'
|
package/src/parser/block.ts
CHANGED
|
@@ -13,6 +13,7 @@ import { mathblock } from './block/mathblock';
|
|
|
13
13
|
import { extension } from './block/extension';
|
|
14
14
|
import { sidefence } from './block/sidefence';
|
|
15
15
|
import { blockquote } from './block/blockquote';
|
|
16
|
+
import { mediablock } from './block/mediablock';
|
|
16
17
|
import { reply } from './block/reply';
|
|
17
18
|
import { paragraph } from './block/paragraph';
|
|
18
19
|
import { rnd0Z } from 'spica/random';
|
|
@@ -31,6 +32,7 @@ export import MathBlockParser = BlockParser.MathBlockParser;
|
|
|
31
32
|
export import ExtensionParser = BlockParser.ExtensionParser;
|
|
32
33
|
export import SidefenceParser = BlockParser.SidefenceParser;
|
|
33
34
|
export import BlockquoteParser = BlockParser.BlockquoteParser;
|
|
35
|
+
export import MediaBlockParser = BlockParser.MediaBlockParser;
|
|
34
36
|
export import ReplyParser = BlockParser.ReplyParser;
|
|
35
37
|
export import ParagraphParser = BlockParser.ParagraphParser;
|
|
36
38
|
|
|
@@ -50,6 +52,7 @@ export const block: BlockParser = creation(1, false, error(
|
|
|
50
52
|
extension,
|
|
51
53
|
sidefence,
|
|
52
54
|
blockquote,
|
|
55
|
+
mediablock,
|
|
53
56
|
reply,
|
|
54
57
|
paragraph
|
|
55
58
|
]))));
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
import { ExtensionParser } from '../../inline';
|
|
2
|
-
import { union, creation,
|
|
2
|
+
import { union, creation, focus, surround } from '../../../combinator';
|
|
3
3
|
import { signature } from './index';
|
|
4
|
-
import { State } from '../../context';
|
|
5
4
|
import { html } from 'typed-dom/dom';
|
|
6
5
|
|
|
7
6
|
export const indexer: ExtensionParser.IndexerParser = surround(
|
|
8
7
|
/^\s+\[(?=\|\S)/,
|
|
9
|
-
state(State.index, false,
|
|
10
8
|
union([
|
|
11
9
|
signature,
|
|
12
10
|
creation(focus(/^\|(?=\])/, () => [[html('span', { class: 'indexer', 'data-index': '' })], ''])),
|
|
13
|
-
])
|
|
11
|
+
]),
|
|
14
12
|
/^\]\s*$/);
|
|
@@ -134,7 +134,7 @@ describe('Unit: parser/inline', () => {
|
|
|
134
134
|
assert.deepStrictEqual(inspect(parser('{a}')), [['<a class="url" href="a">a</a>'], '']);
|
|
135
135
|
assert.deepStrictEqual(inspect(parser('{{a}}')), [['<span class="template">{{a}}</span>'], '']);
|
|
136
136
|
assert.deepStrictEqual(inspect(parser('\r!{}')), [['!', '{', '}'], '']);
|
|
137
|
-
assert.deepStrictEqual(inspect(parser('\r!{a}')), [['<a
|
|
137
|
+
assert.deepStrictEqual(inspect(parser('\r!{a}')), [['!', '<a class="url" href="a">a</a>'], '']);
|
|
138
138
|
assert.deepStrictEqual(inspect(parser('\r!{{a}}')), [['!', '<span class="template">{{a}}</span>'], '']);
|
|
139
139
|
assert.deepStrictEqual(inspect(parser('\r!{{{a}}}')), [['!', '<span class="template">{{{a}}}</span>'], '']);
|
|
140
140
|
assert.deepStrictEqual(inspect(parser('\r!!{a}')), [['!', '!', '<a class="url" href="a">a</a>'], '']);
|
package/src/parser/inline.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { remark } from './inline/remark';
|
|
|
7
7
|
import { math } from './inline/math';
|
|
8
8
|
import { extension } from './inline/extension';
|
|
9
9
|
import { ruby } from './inline/ruby';
|
|
10
|
-
import { textlink
|
|
10
|
+
import { textlink } from './inline/link';
|
|
11
11
|
import { html } from './inline/html';
|
|
12
12
|
import { insertion } from './inline/insertion';
|
|
13
13
|
import { deletion } from './inline/deletion';
|
|
@@ -16,9 +16,7 @@ import { emstrong } from './inline/emstrong';
|
|
|
16
16
|
import { emphasis } from './inline/emphasis';
|
|
17
17
|
import { strong } from './inline/strong';
|
|
18
18
|
import { code } from './inline/code';
|
|
19
|
-
import { linemedia } from './inline/media';
|
|
20
19
|
import { htmlentity } from './inline/htmlentity';
|
|
21
|
-
import { lineshortmedia } from './inline/shortmedia';
|
|
22
20
|
import { autolink } from './inline/autolink';
|
|
23
21
|
import { bracket } from './inline/bracket';
|
|
24
22
|
import { text } from './source';
|
|
@@ -56,8 +54,6 @@ export const inline: InlineParser = lazy(() => union([
|
|
|
56
54
|
extension,
|
|
57
55
|
ruby,
|
|
58
56
|
textlink,
|
|
59
|
-
linemedialink,
|
|
60
|
-
linemedia,
|
|
61
57
|
html,
|
|
62
58
|
insertion,
|
|
63
59
|
deletion,
|
|
@@ -67,7 +63,6 @@ export const inline: InlineParser = lazy(() => union([
|
|
|
67
63
|
emphasis,
|
|
68
64
|
code,
|
|
69
65
|
htmlentity,
|
|
70
|
-
lineshortmedia,
|
|
71
66
|
autolink,
|
|
72
67
|
bracket,
|
|
73
68
|
text
|
|
@@ -75,5 +70,6 @@ export const inline: InlineParser = lazy(() => union([
|
|
|
75
70
|
|
|
76
71
|
export { indexee } from './inline/extension/indexee';
|
|
77
72
|
export { indexer } from './inline/extension/indexer';
|
|
73
|
+
export { medialink } from './inline/link';
|
|
78
74
|
export { media } from './inline/media';
|
|
79
75
|
export { shortmedia } from './inline/shortmedia';
|
package/src/parser/visibility.ts
CHANGED
|
@@ -3,7 +3,6 @@ import { Parser, Input, eval } from '../combinator/data/parser';
|
|
|
3
3
|
import { union, some, verify, convert, fmap } from '../combinator';
|
|
4
4
|
import { unsafehtmlentity } from './inline/htmlentity';
|
|
5
5
|
import { linebreak, unescsource } from './source';
|
|
6
|
-
import { State } from './context';
|
|
7
6
|
import { invisibleHTMLEntityNames } from './api/normalize';
|
|
8
7
|
import { reduce } from 'spica/memoize';
|
|
9
8
|
import { push } from 'spica/array';
|
|
@@ -23,13 +22,12 @@ export function visualize<T extends HTMLElement | string>(parser: Parser<T>): Pa
|
|
|
23
22
|
return union([
|
|
24
23
|
convert(
|
|
25
24
|
source => source.replace(blank.line, line => line.replace(/[\\&<]/g, '\x1B$&')),
|
|
26
|
-
verify(parser, (ns, rest
|
|
25
|
+
verify(parser, (ns, rest) => !rest && hasVisible(ns))),
|
|
27
26
|
some(union([linebreak, unescsource])),
|
|
28
27
|
]);
|
|
29
28
|
}
|
|
30
29
|
function hasVisible(
|
|
31
30
|
nodes: readonly (HTMLElement | string)[],
|
|
32
|
-
{ state = 0 }: MarkdownParser.Context = {},
|
|
33
31
|
): boolean {
|
|
34
32
|
for (let i = 0; i < nodes.length; ++i) {
|
|
35
33
|
const node = nodes[i];
|
|
@@ -38,8 +36,8 @@ function hasVisible(
|
|
|
38
36
|
}
|
|
39
37
|
else {
|
|
40
38
|
if (node.innerText.trimStart()) return true;
|
|
41
|
-
if (state & State.media ^ State.media &&
|
|
42
|
-
|
|
39
|
+
//if (state & State.media ^ State.media &&
|
|
40
|
+
// (node.classList.contains('media') || node.getElementsByClassName('media')[0])) return true;
|
|
43
41
|
}
|
|
44
42
|
}
|
|
45
43
|
return false;
|
|
@@ -15,6 +15,6 @@ export function image(source: HTMLImageElement, url: URL, cache?: Dict<string, H
|
|
|
15
15
|
source.cloneNode(true),
|
|
16
16
|
Object.fromEntries([...source.attributes]
|
|
17
17
|
.filter(attr => !['class', 'data-type', 'data-src', 'src', 'loading'].includes(attr.name))
|
|
18
|
-
.map(attr => [attr.name, null]))));
|
|
18
|
+
.map(attr => [attr.name, attr.name === 'alt' ? '' : null]))));
|
|
19
19
|
return source;
|
|
20
20
|
}
|
|
@@ -23,18 +23,18 @@ describe('Unit: renderer/render', () => {
|
|
|
23
23
|
|
|
24
24
|
it('media', () => {
|
|
25
25
|
// image
|
|
26
|
-
assert(render(parse('!https://pbs.twimg.com/media/C-RAIleV0AAO81x.jpg').querySelector('
|
|
27
|
-
assert(render(parse('[!{https://pbs.twimg.com/media/C-RAIleV0AAO81x.jpg}]{#}').querySelector('
|
|
26
|
+
assert(render(parse('!https://pbs.twimg.com/media/C-RAIleV0AAO81x.jpg').querySelector('div')!).querySelector('img')!.matches('div > a > img'));
|
|
27
|
+
assert(render(parse('[!{https://pbs.twimg.com/media/C-RAIleV0AAO81x.jpg}]{#}').querySelector('div')!).querySelector('img')!.matches('div > a > img'));
|
|
28
28
|
// other
|
|
29
|
-
assert(render(parse('!http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_open_parameters.pdf').querySelector('
|
|
30
|
-
assert(render(parse('[!{http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_open_parameters.pdf}]{#}').querySelector('
|
|
29
|
+
assert(render(parse('!http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_open_parameters.pdf').querySelector('div')!).querySelector('.media')!.matches('div > .media'));
|
|
30
|
+
assert(render(parse('[!{http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_open_parameters.pdf}]{#}').querySelector('div')!).querySelector('.media')!.matches('div > .media'));
|
|
31
31
|
// all
|
|
32
32
|
assert(render(parse([
|
|
33
33
|
'!https://youtu.be/xRF7WIZV4lA',
|
|
34
34
|
'!http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_open_parameters.pdf',
|
|
35
35
|
'!https://twitter.com/hourenso_u/status/856828123882676225?hide_thread=true',
|
|
36
36
|
'!https://pbs.twimg.com/media/C-RAIleV0AAO81x.jpg',
|
|
37
|
-
].join('\n')).querySelector('
|
|
37
|
+
].join('\n')).querySelector('div')!).querySelectorAll('.media').length === 4);
|
|
38
38
|
});
|
|
39
39
|
|
|
40
40
|
});
|
package/src/util/quote.test.ts
CHANGED
|
@@ -5,10 +5,10 @@ describe('Unit: util/quote', () => {
|
|
|
5
5
|
describe('quote', () => {
|
|
6
6
|
it('basic', () => {
|
|
7
7
|
const range = document.createRange();
|
|
8
|
-
const el = parse('>>1\n>2\n> a\n>>4 `b` ${c}$\n
|
|
8
|
+
const el = parse('>>1\n>2\n> a\n>>4 `b` ${c}$\n [e](f) ').firstElementChild!;
|
|
9
9
|
range.setStart(el.firstChild!.firstChild!, 0);
|
|
10
10
|
range.setEnd(el.lastChild!.lastChild!.lastChild!, 1);
|
|
11
|
-
assert(quote('3', range) === `>>>1\n> >2\n>> a\n>>3\n> >>4 \`b\` \${c}$\n>
|
|
11
|
+
assert(quote('3', range) === `>>>1\n> >2\n>> a\n>>3\n> >>4 \`b\` \${c}$\n> e`);
|
|
12
12
|
});
|
|
13
13
|
|
|
14
14
|
it('adjustment', () => {
|