securemark 0.249.1 → 0.250.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/README.md +1 -1
- package/dist/index.js +91 -88
- package/markdown.d.ts +1 -1
- package/package.json +3 -3
- package/src/parser/api/parse.test.ts +6 -6
- package/src/parser/block/blockquote.test.ts +2 -2
- package/src/parser/block/dlist.test.ts +2 -1
- package/src/parser/block/dlist.ts +4 -4
- package/src/parser/block/extension/figure.ts +3 -3
- package/src/parser/block/heading.test.ts +1 -0
- package/src/parser/block/heading.ts +4 -4
- package/src/parser/block/olist.ts +3 -2
- package/src/parser/block/paragraph.test.ts +10 -10
- package/src/parser/block/paragraph.ts +2 -2
- package/src/parser/block/reply.ts +2 -2
- package/src/parser/block/ulist.ts +4 -3
- package/src/parser/inline/annotation.ts +2 -2
- package/src/parser/inline/comment.test.ts +44 -44
- package/src/parser/inline/comment.ts +2 -2
- package/src/parser/inline/extension/index.test.ts +4 -4
- package/src/parser/inline/extension/placeholder.test.ts +4 -4
- package/src/parser/inline/link.ts +2 -2
- package/src/parser/inline/reference.ts +3 -3
- package/src/parser/inline.test.ts +2 -2
- package/src/parser/util.ts +8 -8
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! securemark v0.
|
|
1
|
+
/*! securemark v0.250.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("DOMPurify"), require("Prism"));
|
|
@@ -386,7 +386,7 @@ class Cache {
|
|
|
386
386
|
LRU: new invlist_1.List(),
|
|
387
387
|
LFU: new invlist_1.List()
|
|
388
388
|
};
|
|
389
|
-
this.expiries = new heap_1.Heap();
|
|
389
|
+
this.expiries = new heap_1.Heap((a, b) => a.value.expiry - b.value.expiry);
|
|
390
390
|
this.stats = {
|
|
391
391
|
LRU: (0, tuple_1.tuple)(0, 0),
|
|
392
392
|
LFU: (0, tuple_1.tuple)(0, 0),
|
|
@@ -439,15 +439,15 @@ class Cache {
|
|
|
439
439
|
return this.SIZE;
|
|
440
440
|
}
|
|
441
441
|
|
|
442
|
-
evict(node,
|
|
442
|
+
evict(node, callback) {
|
|
443
443
|
const index = node.value;
|
|
444
444
|
callback &&= !!this.disposer;
|
|
445
|
-
record = callback ? record ?? this.memory.get(index.key) : record;
|
|
446
445
|
this.overlap -= +(index.region === 'LFU' && node.list === this.indexes.LRU);
|
|
446
|
+
index.enode && this.expiries.delete(index.enode);
|
|
447
447
|
node.delete();
|
|
448
448
|
this.memory.delete(index.key);
|
|
449
449
|
this.SIZE -= index.size;
|
|
450
|
-
callback && this.disposer?.(
|
|
450
|
+
callback && this.disposer?.(node.value.value, index.key);
|
|
451
451
|
}
|
|
452
452
|
|
|
453
453
|
ensure(margin, skip) {
|
|
@@ -463,7 +463,6 @@ class Cache {
|
|
|
463
463
|
|
|
464
464
|
switch (true) {
|
|
465
465
|
case (target = this.expiries.peek()) && target !== skip && target.value.expiry < (0, clock_1.now)():
|
|
466
|
-
target = this.expiries.extract();
|
|
467
466
|
break;
|
|
468
467
|
|
|
469
468
|
case LRU.length === 0:
|
|
@@ -486,7 +485,7 @@ class Cache {
|
|
|
486
485
|
target = LRU.last !== skip ? LRU.last : LRU.length >= 2 ? LRU.last.prev : LFU.last;
|
|
487
486
|
}
|
|
488
487
|
|
|
489
|
-
this.evict(target,
|
|
488
|
+
this.evict(target, true);
|
|
490
489
|
skip = skip?.list && skip;
|
|
491
490
|
size = skip?.value.size ?? 0;
|
|
492
491
|
}
|
|
@@ -502,11 +501,10 @@ class Cache {
|
|
|
502
501
|
}
|
|
503
502
|
|
|
504
503
|
const expiry = age === global_1.Infinity ? global_1.Infinity : (0, clock_1.now)() + age;
|
|
505
|
-
const
|
|
504
|
+
const node = this.memory.get(key);
|
|
506
505
|
|
|
507
|
-
if (
|
|
508
|
-
const
|
|
509
|
-
const val = record.value;
|
|
506
|
+
if (node) {
|
|
507
|
+
const val = node.value.value;
|
|
510
508
|
const index = node.value;
|
|
511
509
|
this.ensure(size, node);
|
|
512
510
|
this.SIZE += size - index.size;
|
|
@@ -514,13 +512,13 @@ class Cache {
|
|
|
514
512
|
index.expiry = expiry;
|
|
515
513
|
|
|
516
514
|
if (this.earlyExpiring && expiry !== global_1.Infinity) {
|
|
517
|
-
index.enode ? this.expiries.update(index.enode
|
|
515
|
+
index.enode ? this.expiries.update(index.enode) : index.enode = this.expiries.insert(node);
|
|
518
516
|
} else if (index.enode) {
|
|
519
517
|
this.expiries.delete(index.enode);
|
|
520
518
|
index.enode = void 0;
|
|
521
519
|
}
|
|
522
520
|
|
|
523
|
-
|
|
521
|
+
node.value.value = value;
|
|
524
522
|
this.disposer?.(val, key);
|
|
525
523
|
return true;
|
|
526
524
|
}
|
|
@@ -530,19 +528,16 @@ class Cache {
|
|
|
530
528
|
LRU
|
|
531
529
|
} = this.indexes;
|
|
532
530
|
this.SIZE += size;
|
|
533
|
-
|
|
531
|
+
this.memory.set(key, LRU.unshift({
|
|
534
532
|
key,
|
|
533
|
+
value,
|
|
535
534
|
size,
|
|
536
535
|
expiry,
|
|
537
536
|
region: 'LRU'
|
|
538
|
-
});
|
|
539
|
-
this.memory.set(key, {
|
|
540
|
-
inode: node,
|
|
541
|
-
value
|
|
542
|
-
});
|
|
537
|
+
}));
|
|
543
538
|
|
|
544
539
|
if (this.earlyExpiring && expiry !== global_1.Infinity) {
|
|
545
|
-
|
|
540
|
+
LRU.head.value.enode = this.expiries.insert(LRU.head);
|
|
546
541
|
}
|
|
547
542
|
|
|
548
543
|
return false;
|
|
@@ -554,32 +549,31 @@ class Cache {
|
|
|
554
549
|
}
|
|
555
550
|
|
|
556
551
|
get(key) {
|
|
557
|
-
const
|
|
558
|
-
if (!
|
|
559
|
-
const node = record.inode;
|
|
552
|
+
const node = this.memory.get(key);
|
|
553
|
+
if (!node) return;
|
|
560
554
|
const expiry = node.value.expiry;
|
|
561
555
|
|
|
562
556
|
if (expiry !== global_1.Infinity && expiry < (0, clock_1.now)()) {
|
|
563
|
-
this.evict(node,
|
|
557
|
+
this.evict(node, true);
|
|
564
558
|
return;
|
|
565
559
|
} // Optimization for memoize.
|
|
566
560
|
|
|
567
561
|
|
|
568
|
-
if (this.capacity > 3 && node === node.list.head) return
|
|
562
|
+
if (this.capacity > 3 && node === node.list.head) return node.value.value;
|
|
569
563
|
this.access(node);
|
|
570
564
|
this.slide();
|
|
571
|
-
return
|
|
565
|
+
return node.value.value;
|
|
572
566
|
}
|
|
573
567
|
|
|
574
568
|
has(key) {
|
|
575
569
|
//assert(this.memory.has(key) === (this.indexes.LFU.has(key) || this.indexes.LRU.has(key)));
|
|
576
570
|
//assert(this.memory.size === this.indexes.LFU.length + this.indexes.LRU.length);
|
|
577
|
-
const
|
|
578
|
-
if (!
|
|
579
|
-
const expiry =
|
|
571
|
+
const node = this.memory.get(key);
|
|
572
|
+
if (!node) return false;
|
|
573
|
+
const expiry = node.value.expiry;
|
|
580
574
|
|
|
581
575
|
if (expiry !== global_1.Infinity && expiry < (0, clock_1.now)()) {
|
|
582
|
-
this.evict(
|
|
576
|
+
this.evict(node, true);
|
|
583
577
|
return false;
|
|
584
578
|
}
|
|
585
579
|
|
|
@@ -587,9 +581,9 @@ class Cache {
|
|
|
587
581
|
}
|
|
588
582
|
|
|
589
583
|
delete(key) {
|
|
590
|
-
const
|
|
591
|
-
if (!
|
|
592
|
-
this.evict(
|
|
584
|
+
const node = this.memory.get(key);
|
|
585
|
+
if (!node) return false;
|
|
586
|
+
this.evict(node, this.settings.capture.delete === true);
|
|
593
587
|
return true;
|
|
594
588
|
}
|
|
595
589
|
|
|
@@ -606,7 +600,9 @@ class Cache {
|
|
|
606
600
|
this.memory = new global_1.Map();
|
|
607
601
|
|
|
608
602
|
for (const [key, {
|
|
609
|
-
value
|
|
603
|
+
value: {
|
|
604
|
+
value
|
|
605
|
+
}
|
|
610
606
|
}] of memory) {
|
|
611
607
|
this.disposer(value, key);
|
|
612
608
|
}
|
|
@@ -614,7 +610,9 @@ class Cache {
|
|
|
614
610
|
|
|
615
611
|
*[Symbol.iterator]() {
|
|
616
612
|
for (const [key, {
|
|
617
|
-
value
|
|
613
|
+
value: {
|
|
614
|
+
value
|
|
615
|
+
}
|
|
618
616
|
}] of this.memory) {
|
|
619
617
|
yield [key, value];
|
|
620
618
|
}
|
|
@@ -634,8 +632,9 @@ class Cache {
|
|
|
634
632
|
indexes
|
|
635
633
|
} = this;
|
|
636
634
|
const window = capacity;
|
|
637
|
-
LRU[0] + LFU[0]
|
|
638
|
-
|
|
635
|
+
const total = LRU[0] + LFU[0];
|
|
636
|
+
total === window && this.stats.slide();
|
|
637
|
+
if (total * 1000 % capacity || !LRU[1] || !LFU[1]) return;
|
|
639
638
|
const lenR = indexes.LRU.length;
|
|
640
639
|
const lenF = indexes.LFU.length;
|
|
641
640
|
const lenV = this.overlap;
|
|
@@ -942,13 +941,14 @@ Object.defineProperty(exports, "__esModule", ({
|
|
|
942
941
|
}));
|
|
943
942
|
exports.Heap = void 0;
|
|
944
943
|
|
|
945
|
-
const alias_1 = __webpack_require__(5406); //
|
|
944
|
+
const alias_1 = __webpack_require__(5406); // Min heap
|
|
946
945
|
|
|
947
946
|
|
|
948
947
|
const undefined = void 0;
|
|
949
948
|
|
|
950
949
|
class Heap {
|
|
951
|
-
constructor(stable = false) {
|
|
950
|
+
constructor(cmp = (a, b) => a > b ? 1 : a < b ? -1 : 0, stable = false) {
|
|
951
|
+
this.cmp = cmp;
|
|
952
952
|
this.stable = stable;
|
|
953
953
|
this.array = [];
|
|
954
954
|
this.$length = 0;
|
|
@@ -958,19 +958,19 @@ class Heap {
|
|
|
958
958
|
return this.$length;
|
|
959
959
|
}
|
|
960
960
|
|
|
961
|
-
insert(
|
|
961
|
+
insert(value, order = value) {
|
|
962
962
|
const array = this.array;
|
|
963
|
-
const node = array[this.$length] = [
|
|
964
|
-
upHeapify(array, this.$length);
|
|
963
|
+
const node = array[this.$length] = [order, value, this.$length++];
|
|
964
|
+
upHeapify(array, this.cmp, this.$length);
|
|
965
965
|
return node;
|
|
966
966
|
}
|
|
967
967
|
|
|
968
|
-
replace(
|
|
968
|
+
replace(value, order = value) {
|
|
969
969
|
const array = this.array;
|
|
970
|
-
if (this.$length === 0) return void this.insert(
|
|
970
|
+
if (this.$length === 0) return void this.insert(value, order);
|
|
971
971
|
const replaced = array[0][1];
|
|
972
|
-
array[0] = [
|
|
973
|
-
downHeapify(array, 1, this.$length, this.stable);
|
|
972
|
+
array[0] = [order, value, 0];
|
|
973
|
+
downHeapify(array, this.cmp, 1, this.$length, this.stable);
|
|
974
974
|
return replaced;
|
|
975
975
|
}
|
|
976
976
|
|
|
@@ -990,25 +990,24 @@ class Heap {
|
|
|
990
990
|
array[this.$length] = undefined;
|
|
991
991
|
index < this.$length && this.sort(array[index]);
|
|
992
992
|
|
|
993
|
-
if (array.length
|
|
994
|
-
array.splice(array.length / 2, array.length);
|
|
993
|
+
if (array.length >= 2 ** 16 && array.length >= this.$length * 2) {
|
|
994
|
+
array.splice(array.length / 2, array.length / 2);
|
|
995
995
|
}
|
|
996
996
|
|
|
997
997
|
return node[1];
|
|
998
998
|
}
|
|
999
999
|
|
|
1000
|
-
update(node,
|
|
1000
|
+
update(node, order = node[1], value = node[1]) {
|
|
1001
1001
|
const array = this.array;
|
|
1002
1002
|
if (array[node[2]] !== node) throw new Error('Invalid node');
|
|
1003
1003
|
node[1] = value;
|
|
1004
|
-
if (node[0] ===
|
|
1005
|
-
node[0] = priority;
|
|
1004
|
+
if (this.cmp(node[0], node[0] = order) === 0) return;
|
|
1006
1005
|
this.sort(node);
|
|
1007
1006
|
}
|
|
1008
1007
|
|
|
1009
1008
|
sort(node) {
|
|
1010
1009
|
const array = this.array;
|
|
1011
|
-
return upHeapify(array, node[2] + 1) || downHeapify(array, node[2] + 1, this.$length, this.stable);
|
|
1010
|
+
return upHeapify(array, this.cmp, node[2] + 1) || downHeapify(array, this.cmp, node[2] + 1, this.$length, this.stable);
|
|
1012
1011
|
}
|
|
1013
1012
|
|
|
1014
1013
|
peek() {
|
|
@@ -1024,13 +1023,13 @@ class Heap {
|
|
|
1024
1023
|
|
|
1025
1024
|
exports.Heap = Heap;
|
|
1026
1025
|
|
|
1027
|
-
function upHeapify(array, index) {
|
|
1028
|
-
const
|
|
1026
|
+
function upHeapify(array, cmp, index) {
|
|
1027
|
+
const order = array[index - 1][0];
|
|
1029
1028
|
let changed = false;
|
|
1030
1029
|
|
|
1031
1030
|
while (index > 1) {
|
|
1032
1031
|
const parent = (0, alias_1.floor)(index / 2);
|
|
1033
|
-
if (array[parent - 1][0]
|
|
1032
|
+
if (cmp(array[parent - 1][0], order) <= 0) break;
|
|
1034
1033
|
swap(array, index - 1, parent - 1);
|
|
1035
1034
|
index = parent;
|
|
1036
1035
|
changed ||= true;
|
|
@@ -1039,25 +1038,25 @@ function upHeapify(array, index) {
|
|
|
1039
1038
|
return changed;
|
|
1040
1039
|
}
|
|
1041
1040
|
|
|
1042
|
-
function downHeapify(array, index, length, stable) {
|
|
1041
|
+
function downHeapify(array, cmp, index, length, stable) {
|
|
1043
1042
|
let changed = false;
|
|
1044
1043
|
|
|
1045
1044
|
while (index < length) {
|
|
1046
1045
|
const left = index * 2;
|
|
1047
1046
|
const right = index * 2 + 1;
|
|
1048
|
-
let
|
|
1047
|
+
let min = index;
|
|
1049
1048
|
|
|
1050
|
-
if (left <= length && (stable ? array[left - 1][0]
|
|
1051
|
-
|
|
1049
|
+
if (left <= length && (stable ? cmp(array[left - 1][0], array[min - 1][0]) <= 0 : cmp(array[left - 1][0], array[min - 1][0]) < 0)) {
|
|
1050
|
+
min = left;
|
|
1052
1051
|
}
|
|
1053
1052
|
|
|
1054
|
-
if (right <= length && (stable ? array[right - 1][0]
|
|
1055
|
-
|
|
1053
|
+
if (right <= length && (stable ? cmp(array[right - 1][0], array[min - 1][0]) <= 0 : cmp(array[right - 1][0], array[min - 1][0]) < 0)) {
|
|
1054
|
+
min = right;
|
|
1056
1055
|
}
|
|
1057
1056
|
|
|
1058
|
-
if (
|
|
1059
|
-
swap(array, index - 1,
|
|
1060
|
-
index =
|
|
1057
|
+
if (min === index) break;
|
|
1058
|
+
swap(array, index - 1, min - 1);
|
|
1059
|
+
index = min;
|
|
1061
1060
|
changed ||= true;
|
|
1062
1061
|
}
|
|
1063
1062
|
|
|
@@ -3833,8 +3832,8 @@ exports.dlist = (0, combinator_1.lazy)(() => (0, combinator_1.block)((0, locale_
|
|
|
3833
3832
|
}
|
|
3834
3833
|
}
|
|
3835
3834
|
}, (0, combinator_1.some)(term)), (0, combinator_1.some)(desc)]))), es => [(0, dom_1.html)('dl', fillTrailingDescription(es))]))));
|
|
3836
|
-
const term = (0, combinator_1.creator)((0, combinator_1.line)((0, inline_1.indexee)((0, combinator_1.fmap)((0, combinator_1.open)(/^~[^\S\n]+(?=\S)/, (0,
|
|
3837
|
-
const desc = (0, combinator_1.creator)((0, combinator_1.block)((0, combinator_1.fmap)((0, combinator_1.open)(/^:[^\S\n]+(?=\S)|/, (0, combinator_1.rewrite)((0, combinator_1.some)(source_1.anyline, /^[~:][^\S\n]+\S/), (0,
|
|
3835
|
+
const term = (0, combinator_1.creator)((0, combinator_1.line)((0, inline_1.indexee)((0, combinator_1.fmap)((0, combinator_1.open)(/^~[^\S\n]+(?=\S)/, (0, util_1.visualize)((0, util_1.trimBlank)((0, combinator_1.some)((0, combinator_1.union)([inline_1.indexer, inline_1.inline])))), true), ns => [(0, dom_1.html)('dt', (0, dom_1.defrag)(ns))]))));
|
|
3836
|
+
const desc = (0, combinator_1.creator)((0, combinator_1.block)((0, combinator_1.fmap)((0, combinator_1.open)(/^:[^\S\n]+(?=\S)|/, (0, combinator_1.rewrite)((0, combinator_1.some)(source_1.anyline, /^[~:][^\S\n]+\S/), (0, util_1.visualize)((0, combinator_1.trimEnd)((0, combinator_1.some)((0, combinator_1.union)([inline_1.inline]))))), true), ns => [(0, dom_1.html)('dd', (0, dom_1.defrag)(ns))]), false));
|
|
3838
3837
|
|
|
3839
3838
|
function fillTrailingDescription(es) {
|
|
3840
3839
|
return es.length > 0 && es[es.length - 1].tagName === 'DT' ? (0, array_1.push)(es, [(0, dom_1.html)('dd')]) : es;
|
|
@@ -4137,7 +4136,7 @@ exports.figure = (0, combinator_1.block)((0, combinator_1.fallback)((0, combinat
|
|
|
4137
4136
|
media: false
|
|
4138
4137
|
}
|
|
4139
4138
|
}
|
|
4140
|
-
}, (0,
|
|
4139
|
+
}, (0, util_1.visualize)((0, util_1.trimBlank)((0, combinator_1.trimEnd)((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, array_1.unshift)([(0, dom_1.html)('span', {
|
|
4141
4140
|
class: 'figindex'
|
|
4142
4141
|
})], (0, dom_1.defrag)(caption))), (0, dom_1.html)('div', [content])])])), (0, combinator_1.fmap)((0, combinator_1.fence)(/^(~{3,})(?:figure|\[?\$\S*)(?!\S)[^\n]*(?:$|\n)/, 300), ([body, overflow, closer, opener, delim], _, context) => [(0, dom_1.html)('pre', {
|
|
4143
4142
|
class: 'invalid',
|
|
@@ -4671,13 +4670,13 @@ exports.heading = (0, combinator_1.block)((0, combinator_1.rewrite)(exports.segm
|
|
|
4671
4670
|
media: false
|
|
4672
4671
|
}
|
|
4673
4672
|
}
|
|
4674
|
-
}, (0, combinator_1.line)((0, inline_1.indexee)((0, combinator_1.fmap)((0, combinator_1.union)([(0, combinator_1.open)((0, source_1.str)(/^##+/), (0,
|
|
4673
|
+
}, (0, combinator_1.line)((0, inline_1.indexee)((0, combinator_1.fmap)((0, combinator_1.union)([(0, combinator_1.open)((0, source_1.str)(/^##+/), (0, util_1.visualize)((0, util_1.trimBlank)((0, combinator_1.some)((0, combinator_1.union)([inline_1.indexer, inline_1.inline])))), true), (0, combinator_1.open)((0, source_1.str)('#'), (0, combinator_1.context)({
|
|
4675
4674
|
syntax: {
|
|
4676
4675
|
inline: {
|
|
4677
4676
|
autolink: false
|
|
4678
4677
|
}
|
|
4679
4678
|
}
|
|
4680
|
-
}, (0,
|
|
4679
|
+
}, (0, util_1.visualize)((0, util_1.trimBlank)((0, combinator_1.some)((0, combinator_1.union)([inline_1.indexer, inline_1.inline]))))), true)]), ([h, ...ns]) => [h.length <= 6 ? (0, dom_1.html)(`h${h.length}`, (0, dom_1.defrag)(ns)) : (0, dom_1.html)(`h6`, {
|
|
4681
4680
|
class: 'invalid',
|
|
4682
4681
|
'data-invalid-syntax': 'heading',
|
|
4683
4682
|
'data-invalid-type': 'syntax',
|
|
@@ -4828,6 +4827,8 @@ const inline_1 = __webpack_require__(1160);
|
|
|
4828
4827
|
|
|
4829
4828
|
const source_1 = __webpack_require__(6743);
|
|
4830
4829
|
|
|
4830
|
+
const util_1 = __webpack_require__(9437);
|
|
4831
|
+
|
|
4831
4832
|
const dom_1 = __webpack_require__(3252);
|
|
4832
4833
|
|
|
4833
4834
|
const memoize_1 = __webpack_require__(1808);
|
|
@@ -4847,7 +4848,7 @@ exports.olist = (0, combinator_1.lazy)(() => (0, combinator_1.block)((0, combina
|
|
|
4847
4848
|
}, exports.olist_))));
|
|
4848
4849
|
exports.olist_ = (0, combinator_1.lazy)(() => (0, combinator_1.block)((0, combinator_1.union)([(0, combinator_1.match)(new RegExp(`^(?=${openers['.'].source.replace('?:', '')})`), (0, memoize_1.memoize)(ms => list(type(ms[1]), '.'), ms => type(ms[1]).charCodeAt(0) || 0, [])), (0, combinator_1.match)(new RegExp(`^(?=${openers['('].source.replace('?:', '')})`), (0, memoize_1.memoize)(ms => list(type(ms[1]), '('), ms => type(ms[1]).charCodeAt(0) || 0, []))])));
|
|
4849
4850
|
|
|
4850
|
-
const list = (type, form) => (0, combinator_1.fmap)((0, combinator_1.some)((0, combinator_1.creator)((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.trim)((0, combinator_1.subsequence)([ulist_1.checkbox, (0,
|
|
4851
|
+
const list = (type, form) => (0, combinator_1.fmap)((0, combinator_1.some)((0, combinator_1.creator)((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.trim)((0, combinator_1.subsequence)([ulist_1.checkbox, (0, util_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_]))]), invalid), ns => [(0, dom_1.html)('li', {
|
|
4851
4852
|
'data-marker': ns[0]
|
|
4852
4853
|
}, (0, dom_1.defrag)((0, ulist_1.fillFirstLine)((0, array_1.shift)(ns)[1])))]), true)]))), es => [format((0, dom_1.html)('ol', es), type, form)]);
|
|
4853
4854
|
|
|
@@ -4970,7 +4971,7 @@ const util_1 = __webpack_require__(9437);
|
|
|
4970
4971
|
|
|
4971
4972
|
const dom_1 = __webpack_require__(3252);
|
|
4972
4973
|
|
|
4973
|
-
exports.paragraph = (0, combinator_1.block)((0, locale_1.localize)((0, combinator_1.fmap)((0,
|
|
4974
|
+
exports.paragraph = (0, combinator_1.block)((0, locale_1.localize)((0, combinator_1.fmap)((0, util_1.visualize)((0, combinator_1.trimEnd)((0, combinator_1.some)((0, combinator_1.union)([inline_1.inline])))), ns => [(0, dom_1.html)('p', (0, dom_1.defrag)(ns))])));
|
|
4974
4975
|
|
|
4975
4976
|
/***/ }),
|
|
4976
4977
|
|
|
@@ -5010,7 +5011,7 @@ const array_1 = __webpack_require__(8112);
|
|
|
5010
5011
|
*/
|
|
5011
5012
|
|
|
5012
5013
|
|
|
5013
|
-
exports.reply = (0, combinator_1.block)((0, combinator_1.validate)('>', (0, locale_1.localize)((0, combinator_1.fmap)((0, combinator_1.inits)([(0, combinator_1.some)((0, combinator_1.inits)([cite_1.cite, quote_1.quote])), (0, combinator_1.some)((0, combinator_1.subsequence)([(0, combinator_1.some)(quote_1.quote), (0, combinator_1.fmap)((0, combinator_1.rewrite)((0, combinator_1.some)(source_1.anyline, quote_1.syntax), (0,
|
|
5014
|
+
exports.reply = (0, combinator_1.block)((0, combinator_1.validate)('>', (0, locale_1.localize)((0, combinator_1.fmap)((0, combinator_1.inits)([(0, combinator_1.some)((0, combinator_1.inits)([cite_1.cite, quote_1.quote])), (0, combinator_1.some)((0, combinator_1.subsequence)([(0, combinator_1.some)(quote_1.quote), (0, combinator_1.fmap)((0, combinator_1.rewrite)((0, combinator_1.some)(source_1.anyline, quote_1.syntax), (0, util_1.visualize)((0, combinator_1.trimEnd)((0, combinator_1.some)(inline_1.inline)))), ns => (0, array_1.push)(ns, [(0, dom_1.html)('br')]))]))]), ns => [(0, dom_1.html)('p', (0, dom_1.defrag)((0, array_1.pop)(ns)[0]))]))));
|
|
5014
5015
|
|
|
5015
5016
|
/***/ }),
|
|
5016
5017
|
|
|
@@ -5227,12 +5228,14 @@ const ilist_1 = __webpack_require__(238);
|
|
|
5227
5228
|
|
|
5228
5229
|
const inline_1 = __webpack_require__(1160);
|
|
5229
5230
|
|
|
5231
|
+
const source_1 = __webpack_require__(6743);
|
|
5232
|
+
|
|
5233
|
+
const util_1 = __webpack_require__(9437);
|
|
5234
|
+
|
|
5230
5235
|
const dom_1 = __webpack_require__(3252);
|
|
5231
5236
|
|
|
5232
5237
|
const array_1 = __webpack_require__(8112);
|
|
5233
5238
|
|
|
5234
|
-
const source_1 = __webpack_require__(6743);
|
|
5235
|
-
|
|
5236
5239
|
exports.ulist = (0, combinator_1.lazy)(() => (0, combinator_1.block)((0, combinator_1.validate)(/^-(?=[^\S\n]|\n[^\S\n]*\S)/, (0, combinator_1.context)({
|
|
5237
5240
|
syntax: {
|
|
5238
5241
|
inline: {
|
|
@@ -5240,7 +5243,7 @@ exports.ulist = (0, combinator_1.lazy)(() => (0, combinator_1.block)((0, combina
|
|
|
5240
5243
|
}
|
|
5241
5244
|
}
|
|
5242
5245
|
}, exports.ulist_))));
|
|
5243
|
-
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.creator)((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.trim)((0, combinator_1.subsequence)([exports.checkbox, (0,
|
|
5246
|
+
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.creator)((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.trim)((0, combinator_1.subsequence)([exports.checkbox, (0, util_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_]))]), invalid), ns => [(0, dom_1.html)('li', (0, dom_1.defrag)(fillFirstLine(ns)))]), true)])))), es => [format((0, dom_1.html)('ul', es))])));
|
|
5244
5247
|
exports.checkbox = (0, combinator_1.focus)(/^\[[xX ]\](?=$|\s)/, source => [[(0, dom_1.html)('span', {
|
|
5245
5248
|
class: 'checkbox'
|
|
5246
5249
|
}, source[1].trimStart() ? '☑' : '☐')], '']);
|
|
@@ -5450,7 +5453,7 @@ exports.annotation = (0, combinator_1.lazy)(() => (0, combinator_1.creator)((0,
|
|
|
5450
5453
|
}
|
|
5451
5454
|
},
|
|
5452
5455
|
delimiters: global_1.undefined
|
|
5453
|
-
}, (0, util_1.
|
|
5456
|
+
}, (0, util_1.trimBlank)((0, combinator_1.some)((0, combinator_1.union)([inline_1.inline]), ')', /^\\?\n/)))), '))'), ns => [(0, dom_1.html)('sup', {
|
|
5454
5457
|
class: 'annotation'
|
|
5455
5458
|
}, (0, dom_1.defrag)(ns))]))));
|
|
5456
5459
|
|
|
@@ -5804,7 +5807,7 @@ const memoize_1 = __webpack_require__(1808);
|
|
|
5804
5807
|
|
|
5805
5808
|
const array_1 = __webpack_require__(8112);
|
|
5806
5809
|
|
|
5807
|
-
exports.comment = (0, combinator_1.lazy)(() => (0, combinator_1.creator)((0, combinator_1.validate)('[
|
|
5810
|
+
exports.comment = (0, combinator_1.lazy)(() => (0, combinator_1.creator)((0, combinator_1.validate)('[%', (0, combinator_1.match)(/^(?=\[(%+)\s)/, (0, memoize_1.memoize)(([, fence]) => (0, combinator_1.surround)((0, combinator_1.open)((0, source_1.str)(`[${fence}`), (0, combinator_1.some)(source_1.text, new RegExp(String.raw`^\s+${fence}\]|^\S`)), true), (0, combinator_1.some)((0, combinator_1.union)([inline_1.inline]), new RegExp(String.raw`^\s+${fence}\]`)), (0, combinator_1.close)((0, combinator_1.some)(source_1.text, /^\S/), (0, source_1.str)(`${fence}]`)), true, ([as, bs = [], cs], rest) => [[(0, dom_1.html)('span', {
|
|
5808
5811
|
class: 'comment'
|
|
5809
5812
|
}, [(0, dom_1.html)('input', {
|
|
5810
5813
|
type: 'checkbox'
|
|
@@ -6429,7 +6432,7 @@ exports.link = (0, combinator_1.lazy)(() => (0, combinator_1.creator)(10, (0, co
|
|
|
6429
6432
|
autolink: false
|
|
6430
6433
|
}
|
|
6431
6434
|
}
|
|
6432
|
-
}, (0, util_1.
|
|
6435
|
+
}, (0, util_1.trimBlank)((0, combinator_1.some)(inline_1.inline, ']', /^\\?\n/))), ']', true)]))), (0, combinator_1.dup)((0, combinator_1.surround)(/^{(?![{}])/, (0, combinator_1.inits)([exports.uri, (0, combinator_1.some)(exports.option)]), /^[^\S\n]*}/))]))), ([params, content = []], rest, context) => {
|
|
6433
6436
|
if ((0, parser_1.eval)((0, combinator_1.some)(autolink_1.autolink)((0, util_1.stringify)(content), context))?.some(node => typeof node === 'object')) return;
|
|
6434
6437
|
const INSECURE_URI = params.shift();
|
|
6435
6438
|
const el = elem(INSECURE_URI, (0, dom_1.defrag)(content), new url_1.ReadonlyURL(resolve(INSECURE_URI, context.host ?? global_1.location, context.url ?? context.host ?? global_1.location), context.host?.href || global_1.location.href), context.host?.origin || global_1.location.origin);
|
|
@@ -6716,8 +6719,8 @@ exports.reference = (0, combinator_1.lazy)(() => (0, combinator_1.creator)((0, c
|
|
|
6716
6719
|
}
|
|
6717
6720
|
},
|
|
6718
6721
|
delimiters: global_1.undefined
|
|
6719
|
-
}, (0, combinator_1.subsequence)([abbr, (0, combinator_1.focus)(/^\^[^\S\n]*/, source => [['', source], '']), (0, util_1.
|
|
6720
|
-
const abbr = (0, combinator_1.creator)((0, combinator_1.bind)((0, combinator_1.surround)('^', (0, combinator_1.union)([(0, source_1.str)(/^(?![0-9]+\s?[|\]])[0-9A-Za-z]+(?:(?:-|(?=\W)(?!'\d)'?(?!\.\d)\.?(?!,\S),? ?)[0-9A-Za-z]+)*(?:-|'?\.?,? ?)?/)]), /^\|?(?=]])|^\|[^\S\n]*/), ([source], rest) => [[(0, dom_1.html)('abbr', source)], rest.replace(util_1.
|
|
6722
|
+
}, (0, combinator_1.subsequence)([abbr, (0, combinator_1.focus)(/^\^[^\S\n]*/, source => [['', source], '']), (0, util_1.trimBlank)((0, combinator_1.some)(inline_1.inline, ']', /^\\?\n/))]))), ']]'), ns => [(0, dom_1.html)('sup', attributes(ns), (0, dom_1.defrag)(ns))]))));
|
|
6723
|
+
const abbr = (0, combinator_1.creator)((0, combinator_1.bind)((0, combinator_1.surround)('^', (0, combinator_1.union)([(0, source_1.str)(/^(?![0-9]+\s?[|\]])[0-9A-Za-z]+(?:(?:-|(?=\W)(?!'\d)'?(?!\.\d)\.?(?!,\S),? ?)[0-9A-Za-z]+)*(?:-|'?\.?,? ?)?/)]), /^\|?(?=]])|^\|[^\S\n]*/), ([source], rest) => [[(0, dom_1.html)('abbr', source)], rest.replace(util_1.regBlankStart, '')]));
|
|
6721
6724
|
|
|
6722
6725
|
function attributes(ns) {
|
|
6723
6726
|
return typeof ns[0] === 'object' && ns[0].tagName === 'ABBR' ? {
|
|
@@ -7776,7 +7779,7 @@ exports.unescsource = (0, combinator_1.creator)(source => {
|
|
|
7776
7779
|
Object.defineProperty(exports, "__esModule", ({
|
|
7777
7780
|
value: true
|
|
7778
7781
|
}));
|
|
7779
|
-
exports.stringify = exports.trimNodeEnd = exports.
|
|
7782
|
+
exports.stringify = exports.trimNodeEnd = exports.trimBlank = exports.isStartTightNodes = exports.startTight = exports.startLoose = exports.visualize = exports.blankWith = exports.regBlankStart = void 0;
|
|
7780
7783
|
|
|
7781
7784
|
const global_1 = __webpack_require__(4128);
|
|
7782
7785
|
|
|
@@ -7794,7 +7797,7 @@ const memoize_1 = __webpack_require__(1808);
|
|
|
7794
7797
|
|
|
7795
7798
|
const array_1 = __webpack_require__(8112);
|
|
7796
7799
|
|
|
7797
|
-
exports.
|
|
7800
|
+
exports.regBlankStart = new RegExp(String.raw`^(?:\\?[^\S\n]|&(?:${normalize_1.invisibleHTMLEntityNames.join('|')});|<wbr>)+`);
|
|
7798
7801
|
|
|
7799
7802
|
function blankWith(starting, delimiter) {
|
|
7800
7803
|
if (delimiter === global_1.undefined) return blankWith('', starting);
|
|
@@ -7837,7 +7840,7 @@ function startLoose(parser, except) {
|
|
|
7837
7840
|
|
|
7838
7841
|
exports.startLoose = startLoose;
|
|
7839
7842
|
const isStartLoose = (0, memoize_1.reduce)((source, context, except) => {
|
|
7840
|
-
return isStartTight(source.replace(exports.
|
|
7843
|
+
return isStartTight(source.replace(exports.regBlankStart, ''), context, except);
|
|
7841
7844
|
}, (source, _, except = '') => `${source}\x1E${except}`);
|
|
7842
7845
|
|
|
7843
7846
|
function startTight(parser, except) {
|
|
@@ -7922,14 +7925,14 @@ function isVisible(node, strpos) {
|
|
|
7922
7925
|
}
|
|
7923
7926
|
}
|
|
7924
7927
|
|
|
7925
|
-
function
|
|
7926
|
-
return (0, combinator_1.fmap)(
|
|
7928
|
+
function trimBlank(parser) {
|
|
7929
|
+
return (0, combinator_1.fmap)(trimBlankStart(parser), trimNodeEnd);
|
|
7927
7930
|
}
|
|
7928
7931
|
|
|
7929
|
-
exports.
|
|
7932
|
+
exports.trimBlank = trimBlank;
|
|
7930
7933
|
|
|
7931
|
-
function
|
|
7932
|
-
return (0, combinator_1.convert)((0, memoize_1.reduce)(source => source.replace(exports.
|
|
7934
|
+
function trimBlankStart(parser) {
|
|
7935
|
+
return (0, combinator_1.convert)((0, memoize_1.reduce)(source => source.replace(exports.regBlankStart, '')), parser);
|
|
7933
7936
|
} //export function trimNode(nodes: (HTMLElement | string)[]): (HTMLElement | string)[] {
|
|
7934
7937
|
// return trimNodeStart(trimNodeEnd(nodes));
|
|
7935
7938
|
//}
|
package/markdown.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "securemark",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.250.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",
|
|
@@ -49,9 +49,9 @@
|
|
|
49
49
|
"karma-mocha": "^2.0.1",
|
|
50
50
|
"karma-power-assert": "^1.0.0",
|
|
51
51
|
"mocha": "^10.0.0",
|
|
52
|
-
"npm-check-updates": "^13.1.
|
|
52
|
+
"npm-check-updates": "^13.1.2",
|
|
53
53
|
"semver": "^7.3.7",
|
|
54
|
-
"spica": "0.0.
|
|
54
|
+
"spica": "0.0.567",
|
|
55
55
|
"ts-loader": "^9.3.0",
|
|
56
56
|
"typed-dom": "^0.0.298",
|
|
57
57
|
"typescript": "4.7.3",
|
|
@@ -52,11 +52,11 @@ describe('Unit: parser/api/parse', () => {
|
|
|
52
52
|
[...parse('<wbr>\na').children].map(el => el.outerHTML),
|
|
53
53
|
['<p><wbr><br>a</p>']);
|
|
54
54
|
assert.deepStrictEqual(
|
|
55
|
-
[...parse('[
|
|
56
|
-
['<p><span class="comment"><input type="checkbox"><span>[
|
|
55
|
+
[...parse('[%\n<wbr>\n%]').children].map(el => el.outerHTML),
|
|
56
|
+
['<p><span class="comment"><input type="checkbox"><span>[%<br><wbr><br>%]</span></span></p>']);
|
|
57
57
|
assert.deepStrictEqual(
|
|
58
|
-
[...parse('[
|
|
59
|
-
['<p><span class="comment"><input type="checkbox"><span>[
|
|
58
|
+
[...parse('[%\n<wbr>\n%]\na').children].map(el => el.outerHTML),
|
|
59
|
+
['<p><span class="comment"><input type="checkbox"><span>[%<br><wbr><br>%]</span></span><br>a</p>']);
|
|
60
60
|
});
|
|
61
61
|
|
|
62
62
|
it('linebreak', () => {
|
|
@@ -220,8 +220,8 @@ describe('Unit: parser/api/parse', () => {
|
|
|
220
220
|
|
|
221
221
|
it('creation', () => {
|
|
222
222
|
assert.deepStrictEqual(
|
|
223
|
-
[...parse('"[
|
|
224
|
-
[`<p>${'"[
|
|
223
|
+
[...parse('"[% '.repeat(100)).children].map(el => el.outerHTML),
|
|
224
|
+
[`<p>${'"[% '.repeat(100).trim()}</p>`]);
|
|
225
225
|
});
|
|
226
226
|
|
|
227
227
|
it('recursion', () => {
|
|
@@ -72,7 +72,7 @@ describe('Unit: parser/block/blockquote', () => {
|
|
|
72
72
|
assert.deepStrictEqual(inspect(parser('!> a\\\nb')), [['<blockquote><section><p>a<span class="linebreak"> </span>b</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
73
73
|
assert.deepStrictEqual(inspect(parser('!> *a\nb*')), [['<blockquote><section><p><em>a<br>b</em></p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
74
74
|
assert.deepStrictEqual(inspect(parser('!> *a\n> b*')), [['<blockquote><section><p><em>a<br>b</em></p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
75
|
-
assert.deepStrictEqual(inspect(parser('!> a \n b c ')), [['<blockquote><section><p>a<br> b c</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
75
|
+
assert.deepStrictEqual(inspect(parser('!> a \n b c ')), [['<blockquote><section><p> a<br> b c</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
76
76
|
assert.deepStrictEqual(inspect(parser('!>> a')), [['<blockquote><blockquote><section><p>a</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote></blockquote>'], '']);
|
|
77
77
|
assert.deepStrictEqual(inspect(parser('!>> a\n> b')), [['<blockquote><blockquote><section><p>a</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote><section><p>b</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
78
78
|
assert.deepStrictEqual(inspect(parser('!> - a')), [['<blockquote><section><ul><li>a</li></ul><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
@@ -90,7 +90,7 @@ describe('Unit: parser/block/blockquote', () => {
|
|
|
90
90
|
assert.deepStrictEqual(inspect(parser('!> \na')), [['<blockquote><section><p>a</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
91
91
|
assert.deepStrictEqual(inspect(parser('!>\n')), undefined);
|
|
92
92
|
assert.deepStrictEqual(inspect(parser('!>\na')), [['<blockquote><section><p>a</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
93
|
-
assert.deepStrictEqual(inspect(parser('!>\n a')), [['<blockquote><section><p>a</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
93
|
+
assert.deepStrictEqual(inspect(parser('!>\n a')), [['<blockquote><section><p> a</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
94
94
|
assert.deepStrictEqual(inspect(parser('!>\n>')), [['<blockquote><section><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
95
95
|
assert.deepStrictEqual(inspect(parser('!>\n> a')), [['<blockquote><section><p>a</p><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
96
96
|
assert.deepStrictEqual(inspect(parser('!>> ## a\n> ## a')), [['<blockquote><blockquote><section><h2>a</h2><ol class="annotations"></ol><ol class="references"></ol></section></blockquote><section><h2>a</h2><ol class="annotations"></ol><ol class="references"></ol></section></blockquote>'], '']);
|
|
@@ -33,6 +33,7 @@ describe('Unit: parser/block/dlist', () => {
|
|
|
33
33
|
it('single', () => {
|
|
34
34
|
assert.deepStrictEqual(inspect(parser('~ a')), [['<dl><dt id="index:a">a</dt><dd></dd></dl>'], '']);
|
|
35
35
|
assert.deepStrictEqual(inspect(parser('~ \\')), [['<dl><dt id="index:\\">\\</dt><dd></dd></dl>'], '']);
|
|
36
|
+
assert.deepStrictEqual(inspect(parser('~ \\ a')), [['<dl><dt id="index:a">a</dt><dd></dd></dl>'], '']);
|
|
36
37
|
assert.deepStrictEqual(inspect(parser('~ a\nb')), [['<dl><dt id="index:a">a</dt><dd>b</dd></dl>'], '']);
|
|
37
38
|
assert.deepStrictEqual(inspect(parser('~ a\nb\n')), [['<dl><dt id="index:a">a</dt><dd>b</dd></dl>'], '']);
|
|
38
39
|
assert.deepStrictEqual(inspect(parser('~ a\nb\nc')), [['<dl><dt id="index:a">a</dt><dd>b<br>c</dd></dl>'], '']);
|
|
@@ -57,7 +58,7 @@ describe('Unit: parser/block/dlist', () => {
|
|
|
57
58
|
|
|
58
59
|
it('multiple', () => {
|
|
59
60
|
assert.deepStrictEqual(inspect(parser('~ a\n: b\n~ c\n: d')), [['<dl><dt id="index:a">a</dt><dd>b</dd><dt id="index:c">c</dt><dd>d</dd></dl>'], '']);
|
|
60
|
-
assert.deepStrictEqual(inspect(parser('~ a\n b\nc\n d')), [['<dl><dt id="index:a">a</dt><dd>b<br>c<br> d</dd></dl>'], '']);
|
|
61
|
+
assert.deepStrictEqual(inspect(parser('~ a\n b\nc\n d')), [['<dl><dt id="index:a">a</dt><dd> b<br>c<br> d</dd></dl>'], '']);
|
|
61
62
|
assert.deepStrictEqual(inspect(parser('~ a\n: b\nc\n: d')), [['<dl><dt id="index:a">a</dt><dd>b<br>c</dd><dd>d</dd></dl>'], '']);
|
|
62
63
|
assert.deepStrictEqual(inspect(parser('~ a\n: b\nc\n~ d\n: e')), [['<dl><dt id="index:a">a</dt><dd>b<br>c</dd><dt id="index:d">d</dt><dd>e</dd></dl>'], '']);
|
|
63
64
|
assert.deepStrictEqual(inspect(parser('~ a\n: b\n~ c\n: d\n~ e\n: f')), [['<dl><dt id="index:a">a</dt><dd>b</dd><dt id="index:c">c</dt><dd>d</dd><dt id="index:e">e</dt><dd>f</dd></dl>'], '']);
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { DListParser } from '../block';
|
|
2
|
-
import { union, inits, some, block, line, validate, rewrite, context, creator, open,
|
|
2
|
+
import { union, inits, some, block, line, validate, rewrite, context, creator, open, trimEnd, lazy, fmap } from '../../combinator';
|
|
3
3
|
import { inline, indexee, indexer } from '../inline';
|
|
4
4
|
import { anyline } from '../source';
|
|
5
5
|
import { localize } from '../locale';
|
|
6
|
-
import { visualize } from '../util';
|
|
6
|
+
import { visualize, trimBlank } from '../util';
|
|
7
7
|
import { html, defrag } from 'typed-dom/dom';
|
|
8
8
|
import { push } from 'spica/array';
|
|
9
9
|
|
|
@@ -25,7 +25,7 @@ export const dlist: DListParser = lazy(() => block(localize(fmap(validate(
|
|
|
25
25
|
|
|
26
26
|
const term: DListParser.TermParser = creator(line(indexee(fmap(open(
|
|
27
27
|
/^~[^\S\n]+(?=\S)/,
|
|
28
|
-
|
|
28
|
+
visualize(trimBlank(some(union([indexer, inline])))),
|
|
29
29
|
true),
|
|
30
30
|
ns => [html('dt', defrag(ns))]))));
|
|
31
31
|
|
|
@@ -33,7 +33,7 @@ const desc: DListParser.DescriptionParser = creator(block(fmap(open(
|
|
|
33
33
|
/^:[^\S\n]+(?=\S)|/,
|
|
34
34
|
rewrite(
|
|
35
35
|
some(anyline, /^[~:][^\S\n]+\S/),
|
|
36
|
-
|
|
36
|
+
visualize(trimEnd(some(union([inline]))))),
|
|
37
37
|
true),
|
|
38
38
|
ns => [html('dd', defrag(ns))]),
|
|
39
39
|
false));
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { undefined } from 'spica/global';
|
|
2
2
|
import { ExtensionParser } from '../../block';
|
|
3
|
-
import { union, inits, sequence, some, block, line, fence, rewrite, context, close, match, convert,
|
|
3
|
+
import { union, inits, sequence, some, block, line, fence, rewrite, context, close, match, convert, trimEnd, fallback, fmap } from '../../../combinator';
|
|
4
4
|
import { str, contentline, emptyline } from '../../source';
|
|
5
5
|
import { label, segment as seg_label } from '../../inline/extension/label';
|
|
6
6
|
import { ulist } from '../ulist';
|
|
@@ -15,7 +15,7 @@ import { blockquote, segment as seg_blockquote } from '../blockquote';
|
|
|
15
15
|
import { placeholder, segment_ as seg_placeholder } from './placeholder';
|
|
16
16
|
import { inline, media, shortmedia } from '../../inline';
|
|
17
17
|
import { localize } from '../../locale';
|
|
18
|
-
import { visualize } from '../../util';
|
|
18
|
+
import { visualize, trimBlank } from '../../util';
|
|
19
19
|
import { html, defrag } from 'typed-dom/dom';
|
|
20
20
|
import { memoize } from 'spica/memoize';
|
|
21
21
|
import { unshift } from 'spica/array';
|
|
@@ -70,7 +70,7 @@ export const figure: FigureParser = block(fallback(rewrite(segment, fmap(
|
|
|
70
70
|
emptyline,
|
|
71
71
|
block(localize(
|
|
72
72
|
context({ syntax: { inline: { media: false } } },
|
|
73
|
-
|
|
73
|
+
visualize(trimBlank(trimEnd(some(inline))))))),
|
|
74
74
|
]),
|
|
75
75
|
])),
|
|
76
76
|
([label, param, content, ...caption]: [HTMLAnchorElement, string, ...HTMLElement[]]) => [
|
|
@@ -40,6 +40,7 @@ describe('Unit: parser/block/heading', () => {
|
|
|
40
40
|
assert.deepStrictEqual(inspect(parser('# a\\')), [['<h1 id="index:a">a</h1>'], '']);
|
|
41
41
|
assert.deepStrictEqual(inspect(parser('# a\\\n')), [['<h1 id="index:a">a</h1>'], '']);
|
|
42
42
|
assert.deepStrictEqual(inspect(parser('# \\')), [['<h1 id="index:\\">\\</h1>'], '']);
|
|
43
|
+
assert.deepStrictEqual(inspect(parser('# \\ a')), [['<h1 id="index:a">a</h1>'], '']);
|
|
43
44
|
assert.deepStrictEqual(inspect(parser('## \\')), [['<h2 id="index:\\">\\</h2>'], '']);
|
|
44
45
|
assert.deepStrictEqual(inspect(parser('# @a')), [['<h1 id="index:@a">@a</h1>'], '']);
|
|
45
46
|
assert.deepStrictEqual(inspect(parser('## @a')), [['<h2 id="index:@a"><a href="/@a" class="account">@a</a></h2>'], '']);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { HeadingParser } from '../block';
|
|
2
|
-
import { union, some, block, line, validate, focus, rewrite, context, open,
|
|
2
|
+
import { union, some, block, line, validate, focus, rewrite, context, open, fmap } from '../../combinator';
|
|
3
3
|
import { inline, indexee, indexer } from '../inline';
|
|
4
4
|
import { str } from '../source';
|
|
5
|
-
import { visualize } from '../util';
|
|
5
|
+
import { visualize, trimBlank } from '../util';
|
|
6
6
|
import { html, defrag } from 'typed-dom/dom';
|
|
7
7
|
|
|
8
8
|
export const segment: HeadingParser.SegmentParser = block(validate('#', focus(
|
|
@@ -21,13 +21,13 @@ export const heading: HeadingParser = block(rewrite(segment,
|
|
|
21
21
|
line(indexee(fmap(union([
|
|
22
22
|
open(
|
|
23
23
|
str(/^##+/),
|
|
24
|
-
|
|
24
|
+
visualize(trimBlank(some(union([indexer, inline])))), true),
|
|
25
25
|
open(
|
|
26
26
|
str('#'),
|
|
27
27
|
context({ syntax: { inline: {
|
|
28
28
|
autolink: false,
|
|
29
29
|
}}},
|
|
30
|
-
|
|
30
|
+
visualize(trimBlank(some(union([indexer, inline]))))), true),
|
|
31
31
|
]),
|
|
32
32
|
([h, ...ns]: [string, ...(HTMLElement | string)[]]) => [
|
|
33
33
|
h.length <= 6
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { undefined } from 'spica/global';
|
|
2
2
|
import { OListParser } from '../block';
|
|
3
|
-
import { union, inits, subsequence, some, block, line, validate, indent, focus, rewrite, context, creator, open, match, trim,
|
|
3
|
+
import { union, inits, subsequence, some, block, line, validate, indent, focus, rewrite, context, creator, open, match, trim, fallback, lazy, fmap } from '../../combinator';
|
|
4
4
|
import { checkbox, ulist_, fillFirstLine } from './ulist';
|
|
5
5
|
import { ilist_ } from './ilist';
|
|
6
6
|
import { inline, indexee, indexer } from '../inline';
|
|
7
7
|
import { contentline } from '../source';
|
|
8
|
+
import { trimBlank } from '../util';
|
|
8
9
|
import { html, define, defrag } from 'typed-dom/dom';
|
|
9
10
|
import { memoize } from 'spica/memoize';
|
|
10
11
|
import { shift } from 'spica/array';
|
|
@@ -35,7 +36,7 @@ const list = (type: string, form: string): OListParser.ListParser => fmap(
|
|
|
35
36
|
some(creator(union([
|
|
36
37
|
indexee(fmap(fallback(
|
|
37
38
|
inits([
|
|
38
|
-
line(open(heads[form], trim(subsequence([checkbox,
|
|
39
|
+
line(open(heads[form], trim(subsequence([checkbox, trimBlank(some(union([indexer, inline])))])), true)),
|
|
39
40
|
indent(union([ulist_, olist_, ilist_])),
|
|
40
41
|
]),
|
|
41
42
|
invalid),
|
|
@@ -33,7 +33,7 @@ describe('Unit: parser/block/paragraph', () => {
|
|
|
33
33
|
assert.deepStrictEqual(inspect(parser('***a*b\n<wbr>**\nc')), [['<p>**<em>a</em>b<br><wbr>**<br>c</p>'], '']);
|
|
34
34
|
assert.deepStrictEqual(inspect(parser('***a**b\n<wbr>*\nc')), [['<p>*<strong>a</strong>b<br><wbr>*<br>c</p>'], '']);
|
|
35
35
|
assert.deepStrictEqual(inspect(parser('==a\n<wbr>==\nb')), [['<p>==a<br><wbr>==<br>b</p>'], '']);
|
|
36
|
-
assert.deepStrictEqual(inspect(parser(' a')), [['<p>a</p>'], '']);
|
|
36
|
+
assert.deepStrictEqual(inspect(parser(' a')), [['<p> a</p>'], '']);
|
|
37
37
|
});
|
|
38
38
|
|
|
39
39
|
it('anchor', () => {
|
|
@@ -50,18 +50,18 @@ describe('Unit: parser/block/paragraph', () => {
|
|
|
50
50
|
assert.deepStrictEqual(inspect(parser('a\n>>1')), [['<p>a<br><a href="?at=1" class="anchor">>>1</a></p>'], '']);
|
|
51
51
|
assert.deepStrictEqual(inspect(parser('a\n>>1\nb')), [['<p>a<br><a href="?at=1" class="anchor">>>1</a><br>b</p>'], '']);
|
|
52
52
|
assert.deepStrictEqual(inspect(parser('a\n>> b\nc')), [['<p>a<br>>> b<br>c</p>'], '']);
|
|
53
|
-
assert.deepStrictEqual(inspect(parser(' >>1')), [['<p
|
|
54
|
-
assert.deepStrictEqual(inspect(parser(' >>>1')), [['<p
|
|
53
|
+
assert.deepStrictEqual(inspect(parser(' >>1')), [['<p> <a href="?at=1" class="anchor">>>1</a></p>'], '']);
|
|
54
|
+
assert.deepStrictEqual(inspect(parser(' >>>1')), [['<p> ><a href="?at=1" class="anchor">>>1</a></p>'], '']);
|
|
55
55
|
});
|
|
56
56
|
|
|
57
57
|
it('comment', () => {
|
|
58
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
59
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
60
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
61
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
62
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
63
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
64
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
58
|
+
assert.deepStrictEqual(inspect(parser('[% a %]')), [['<p><span class="comment"><input type="checkbox"><span>[% a %]</span></span></p>'], '']);
|
|
59
|
+
assert.deepStrictEqual(inspect(parser('[% a %]b')), [['<p><span class="comment"><input type="checkbox"><span>[% a %]</span></span>b</p>'], '']);
|
|
60
|
+
assert.deepStrictEqual(inspect(parser('[% a %]\nb')), [['<p><span class="comment"><input type="checkbox"><span>[% a %]</span></span><br>b</p>'], '']);
|
|
61
|
+
assert.deepStrictEqual(inspect(parser('[%% a %%]')), [['<p><span class="comment"><input type="checkbox"><span>[%% a %%]</span></span></p>'], '']);
|
|
62
|
+
assert.deepStrictEqual(inspect(parser('[%\n<wbr>\n%]')), [['<p><span class="comment"><input type="checkbox"><span>[%<br><wbr><br>%]</span></span></p>'], '']);
|
|
63
|
+
assert.deepStrictEqual(inspect(parser('[%\n<wbr>\n%]a')), [['<p><span class="comment"><input type="checkbox"><span>[%<br><wbr><br>%]</span></span>a</p>'], '']);
|
|
64
|
+
assert.deepStrictEqual(inspect(parser('[%\n<wbr>\n%]\na')), [['<p><span class="comment"><input type="checkbox"><span>[%<br><wbr><br>%]</span></span><br>a</p>'], '']);
|
|
65
65
|
});
|
|
66
66
|
|
|
67
67
|
it('template', () => {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { ParagraphParser } from '../block';
|
|
2
|
-
import { union, some, block,
|
|
2
|
+
import { union, some, block, trimEnd, fmap } from '../../combinator';
|
|
3
3
|
import { inline } from '../inline';
|
|
4
4
|
import { localize } from '../locale';
|
|
5
5
|
import { visualize } from '../util';
|
|
6
6
|
import { html, defrag } from 'typed-dom/dom';
|
|
7
7
|
|
|
8
8
|
export const paragraph: ParagraphParser = block(localize(fmap(
|
|
9
|
-
|
|
9
|
+
visualize(trimEnd(some(union([inline])))),
|
|
10
10
|
ns => [html('p', defrag(ns))])));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ReplyParser } from '../block';
|
|
2
|
-
import { inits, subsequence, some, block, validate, rewrite,
|
|
2
|
+
import { inits, subsequence, some, block, validate, rewrite, trimEnd, fmap } from '../../combinator';
|
|
3
3
|
import { cite } from './reply/cite';
|
|
4
4
|
import { quote, syntax as delimiter } from './reply/quote';
|
|
5
5
|
import { inline } from '../inline';
|
|
@@ -26,7 +26,7 @@ export const reply: ReplyParser = block(validate('>', localize(fmap(
|
|
|
26
26
|
some(quote),
|
|
27
27
|
fmap(rewrite(
|
|
28
28
|
some(anyline, delimiter),
|
|
29
|
-
|
|
29
|
+
visualize(trimEnd(some(inline)))),
|
|
30
30
|
ns => push(ns, [html('br')])),
|
|
31
31
|
])),
|
|
32
32
|
]),
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { UListParser } from '../block';
|
|
2
|
-
import { union, inits, subsequence, some, block, line, validate, indent, focus, rewrite, context, creator, open, trim,
|
|
2
|
+
import { union, inits, subsequence, some, block, line, validate, indent, focus, rewrite, context, creator, open, trim, fallback, lazy, fmap } from '../../combinator';
|
|
3
3
|
import { olist_ } from './olist';
|
|
4
4
|
import { ilist_ } from './ilist';
|
|
5
5
|
import { inline, indexer, indexee } from '../inline';
|
|
6
|
+
import { contentline } from '../source';
|
|
7
|
+
import { trimBlank } from '../util';
|
|
6
8
|
import { html, defrag } from 'typed-dom/dom';
|
|
7
9
|
import { unshift } from 'spica/array';
|
|
8
|
-
import { contentline } from '../source';
|
|
9
10
|
|
|
10
11
|
export const ulist: UListParser = lazy(() => block(validate(
|
|
11
12
|
/^-(?=[^\S\n]|\n[^\S\n]*\S)/,
|
|
@@ -17,7 +18,7 @@ export const ulist_: UListParser = lazy(() => block(fmap(validate(
|
|
|
17
18
|
some(creator(union([
|
|
18
19
|
indexee(fmap(fallback(
|
|
19
20
|
inits([
|
|
20
|
-
line(open(/^-(?:$|\s)/, trim(subsequence([checkbox,
|
|
21
|
+
line(open(/^-(?:$|\s)/, trim(subsequence([checkbox, trimBlank(some(union([indexer, inline])))])), true)),
|
|
21
22
|
indent(union([ulist_, olist_, ilist_])),
|
|
22
23
|
]),
|
|
23
24
|
invalid),
|
|
@@ -2,7 +2,7 @@ import { undefined } from 'spica/global';
|
|
|
2
2
|
import { AnnotationParser } from '../inline';
|
|
3
3
|
import { union, some, validate, guard, context, creator, surround, lazy, fmap } from '../../combinator';
|
|
4
4
|
import { inline } from '../inline';
|
|
5
|
-
import {
|
|
5
|
+
import { trimBlank } from '../util';
|
|
6
6
|
import { html, defrag } from 'typed-dom/dom';
|
|
7
7
|
|
|
8
8
|
export const annotation: AnnotationParser = lazy(() => creator(validate('((', '))', '\n', fmap(surround(
|
|
@@ -19,6 +19,6 @@ export const annotation: AnnotationParser = lazy(() => creator(validate('((', ')
|
|
|
19
19
|
//link: true,
|
|
20
20
|
//autolink: true,
|
|
21
21
|
}}, delimiters: undefined },
|
|
22
|
-
|
|
22
|
+
trimBlank(some(union([inline]), ')', /^\\?\n/)))),
|
|
23
23
|
'))'),
|
|
24
24
|
ns => [html('sup', { class: 'annotation' }, defrag(ns))]))));
|
|
@@ -9,53 +9,53 @@ describe('Unit: parser/inline/comment', () => {
|
|
|
9
9
|
it('invalid', () => {
|
|
10
10
|
assert.deepStrictEqual(inspect(parser('')), undefined);
|
|
11
11
|
assert.deepStrictEqual(inspect(parser('<')), undefined);
|
|
12
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
13
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
14
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
15
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
16
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
17
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
18
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
19
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
20
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
21
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
22
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
23
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
24
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
25
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
26
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
27
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
28
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
29
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
30
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
31
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
32
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
33
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
34
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
35
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
36
|
-
assert.deepStrictEqual(inspect(parser(' [
|
|
12
|
+
assert.deepStrictEqual(inspect(parser('[%')), undefined);
|
|
13
|
+
assert.deepStrictEqual(inspect(parser('[%[%')), undefined);
|
|
14
|
+
assert.deepStrictEqual(inspect(parser('[%a%]')), undefined);
|
|
15
|
+
assert.deepStrictEqual(inspect(parser('[%a b%]')), undefined);
|
|
16
|
+
assert.deepStrictEqual(inspect(parser('[% ')), [['[%'], '']);
|
|
17
|
+
assert.deepStrictEqual(inspect(parser('[% \n a')), [['[%', '<br>', ' ', 'a'], '']);
|
|
18
|
+
assert.deepStrictEqual(inspect(parser('[%%]')), undefined);
|
|
19
|
+
assert.deepStrictEqual(inspect(parser('[% [%')), [['[%', ' ', '[', '%'], '']);
|
|
20
|
+
assert.deepStrictEqual(inspect(parser('[% [% ')), [['[%', ' ', '[%'], '']);
|
|
21
|
+
assert.deepStrictEqual(inspect(parser('[% [% a')), [['[%', ' ', '[%', ' ', 'a'], '']);
|
|
22
|
+
assert.deepStrictEqual(inspect(parser('[% [% a %]')), [['[%', ' ', '<span class="comment"><input type="checkbox"><span>[% a %]</span></span>'], '']);
|
|
23
|
+
assert.deepStrictEqual(inspect(parser('[% a[%')), [['[%', ' ', 'a', '[', '%'], '']);
|
|
24
|
+
assert.deepStrictEqual(inspect(parser('[% a [%')), [['[%', ' ', 'a', ' ', '[', '%'], '']);
|
|
25
|
+
assert.deepStrictEqual(inspect(parser('[% a [% ')), [['[%', ' ', 'a', ' ', '[%'], '']);
|
|
26
|
+
assert.deepStrictEqual(inspect(parser('[% a [% b')), [['[%', ' ', 'a', ' ', '[%', ' ', 'b'], '']);
|
|
27
|
+
assert.deepStrictEqual(inspect(parser('[% a [%% b')), [['[%', ' ', 'a', ' ', '[%%', ' ', 'b'], '']);
|
|
28
|
+
assert.deepStrictEqual(inspect(parser('[%% a [% b')), [['[%%', ' ', 'a', ' ', '[%', ' ', 'b'], '']);
|
|
29
|
+
assert.deepStrictEqual(inspect(parser('[%\\ a %]')), undefined);
|
|
30
|
+
assert.deepStrictEqual(inspect(parser('[% a\\ %]')), [['[%', ' ', 'a', ' ', '%', ']'], '']);
|
|
31
|
+
assert.deepStrictEqual(inspect(parser('[% a%]')), [['[%', ' ', 'a', '%', ']'], '']);
|
|
32
|
+
assert.deepStrictEqual(inspect(parser('[% a %%]')), [['[%', ' ', 'a', ' ', '%', '%', ']'], '']);
|
|
33
|
+
assert.deepStrictEqual(inspect(parser('[% [%% %]')), [['[%', ' ', '[%%', ' ', '%', ']'], '']);
|
|
34
|
+
assert.deepStrictEqual(inspect(parser('[%% [% %%]')), [['[%%', ' ', '[%', ' ', '%', '%', ']'], '']);
|
|
35
|
+
assert.deepStrictEqual(inspect(parser('[%% a %]')), [['[%%', ' ', 'a', ' ', '%', ']'], '']);
|
|
36
|
+
assert.deepStrictEqual(inspect(parser(' [% a %]')), undefined);
|
|
37
37
|
});
|
|
38
38
|
|
|
39
39
|
it('basic', () => {
|
|
40
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
41
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
42
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
43
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
44
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
45
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
46
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
47
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
48
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
49
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
50
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
51
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
52
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
53
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
54
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
55
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
56
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
57
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
58
|
-
assert.deepStrictEqual(inspect(parser('[
|
|
40
|
+
assert.deepStrictEqual(inspect(parser('[% %]')), [['<span class="comment"><input type="checkbox"><span>[% %]</span></span>'], '']);
|
|
41
|
+
assert.deepStrictEqual(inspect(parser('[% %]')), [['<span class="comment"><input type="checkbox"><span>[% %]</span></span>'], '']);
|
|
42
|
+
assert.deepStrictEqual(inspect(parser('[% %]')), [['<span class="comment"><input type="checkbox"><span>[% %]</span></span>'], '']);
|
|
43
|
+
assert.deepStrictEqual(inspect(parser('[% a %]')), [['<span class="comment"><input type="checkbox"><span>[% a %]</span></span>'], '']);
|
|
44
|
+
assert.deepStrictEqual(inspect(parser('[% a b %]')), [['<span class="comment"><input type="checkbox"><span>[% a b %]</span></span>'], '']);
|
|
45
|
+
assert.deepStrictEqual(inspect(parser('[% a\nb %]')), [['<span class="comment"><input type="checkbox"><span>[% a<br>b %]</span></span>'], '']);
|
|
46
|
+
assert.deepStrictEqual(inspect(parser('[% a %] %]')), [['<span class="comment"><input type="checkbox"><span>[% a %]</span></span>'], ' %]']);
|
|
47
|
+
assert.deepStrictEqual(inspect(parser('[% %%] %]')), [['<span class="comment"><input type="checkbox"><span>[% %%] %]</span></span>'], '']);
|
|
48
|
+
assert.deepStrictEqual(inspect(parser('[% [% a %] %]')), [['<span class="comment"><input type="checkbox"><span>[% <span class="comment"><input type="checkbox"><span>[% a %]</span></span> %]</span></span>'], '']);
|
|
49
|
+
assert.deepStrictEqual(inspect(parser('[% [%% a %%] %]')), [['<span class="comment"><input type="checkbox"><span>[% <span class="comment"><input type="checkbox"><span>[%% a %%]</span></span> %]</span></span>'], '']);
|
|
50
|
+
assert.deepStrictEqual(inspect(parser('[%% a %%]')), [['<span class="comment"><input type="checkbox"><span>[%% a %%]</span></span>'], '']);
|
|
51
|
+
assert.deepStrictEqual(inspect(parser('[%% %] %%]')), [['<span class="comment"><input type="checkbox"><span>[%% %] %%]</span></span>'], '']);
|
|
52
|
+
assert.deepStrictEqual(inspect(parser('[%% [% a %] %%]')), [['<span class="comment"><input type="checkbox"><span>[%% <span class="comment"><input type="checkbox"><span>[% a %]</span></span> %%]</span></span>'], '']);
|
|
53
|
+
assert.deepStrictEqual(inspect(parser('[% a %]b')), [['<span class="comment"><input type="checkbox"><span>[% a %]</span></span>'], 'b']);
|
|
54
|
+
assert.deepStrictEqual(inspect(parser('[%\na\n%]')), [['<span class="comment"><input type="checkbox"><span>[%<br>a<br>%]</span></span>'], '']);
|
|
55
|
+
assert.deepStrictEqual(inspect(parser('[% &a; %]')), [['<span class="comment"><input type="checkbox"><span>[% <span class="invalid">&a;</span> %]</span></span>'], '']);
|
|
56
|
+
assert.deepStrictEqual(inspect(parser('[% © %]')), [['<span class="comment"><input type="checkbox"><span>[% © %]</span></span>'], '']);
|
|
57
|
+
assert.deepStrictEqual(inspect(parser('[% &copy; %]')), [['<span class="comment"><input type="checkbox"><span>[% &copy; %]</span></span>'], '']);
|
|
58
|
+
assert.deepStrictEqual(inspect(parser('[% \\ a %]')), [['<span class="comment"><input type="checkbox"><span>[% a %]</span></span>'], '']);
|
|
59
59
|
});
|
|
60
60
|
|
|
61
61
|
});
|
|
@@ -6,8 +6,8 @@ import { html, defrag } from 'typed-dom/dom';
|
|
|
6
6
|
import { memoize } from 'spica/memoize';
|
|
7
7
|
import { unshift, push } from 'spica/array';
|
|
8
8
|
|
|
9
|
-
export const comment: CommentParser = lazy(() => creator(validate('[
|
|
10
|
-
/^(?=\[(
|
|
9
|
+
export const comment: CommentParser = lazy(() => creator(validate('[%', match(
|
|
10
|
+
/^(?=\[(%+)\s)/,
|
|
11
11
|
memoize(
|
|
12
12
|
([, fence]) =>
|
|
13
13
|
surround(
|
|
@@ -45,7 +45,7 @@ describe('Unit: parser/inline/extension/index', () => {
|
|
|
45
45
|
assert.deepStrictEqual(inspect(parser('[#a \\ ]')), [['<a class="index" href="#index:a">a</a>'], '']);
|
|
46
46
|
assert.deepStrictEqual(inspect(parser('[#a ]')), [['<a class="index" href="#index:a">a</a>'], '']);
|
|
47
47
|
assert.deepStrictEqual(inspect(parser('[#a <wbr>]')), [['<a class="index" href="#index:a">a</a>'], '']);
|
|
48
|
-
assert.deepStrictEqual(inspect(parser('[#a [
|
|
48
|
+
assert.deepStrictEqual(inspect(parser('[#a [% b %]]')), [['<a class="index" href="#index:a">a <span class="comment"><input type="checkbox"><span>[% b %]</span></span></a>'], '']);
|
|
49
49
|
assert.deepStrictEqual(inspect(parser('[#a\\ ]')), [['<a class="index" href="#index:a">a</a>'], '']);
|
|
50
50
|
assert.deepStrictEqual(inspect(parser('[#a\\ b]')), [['<a class="index" href="#index:a_b">a b</a>'], '']);
|
|
51
51
|
assert.deepStrictEqual(inspect(parser('[#[]]')), [['<a class="index" href="#index:[]">[]</a>'], '']);
|
|
@@ -61,8 +61,8 @@ describe('Unit: parser/inline/extension/index', () => {
|
|
|
61
61
|
assert.deepStrictEqual(inspect(parser('[#@a]')), [['<a class="index" href="#index:@a">@a</a>'], '']);
|
|
62
62
|
assert.deepStrictEqual(inspect(parser('[#http://host]')), [['<a class="index" href="#index:http://host">http://host</a>'], '']);
|
|
63
63
|
assert.deepStrictEqual(inspect(parser('[#!http://host]')), [['<a class="index" href="#index:!http://host">!http://host</a>'], '']);
|
|
64
|
-
assert.deepStrictEqual(inspect(parser('[#[
|
|
65
|
-
assert.deepStrictEqual(inspect(parser('[#[
|
|
64
|
+
assert.deepStrictEqual(inspect(parser('[#[% %]]')), [['<a class="index"><span class="comment"><input type="checkbox"><span>[% %]</span></span></a>'], '']);
|
|
65
|
+
assert.deepStrictEqual(inspect(parser('[#[% a %]]')), [['<a class="index"><span class="comment"><input type="checkbox"><span>[% a %]</span></span></a>'], '']);
|
|
66
66
|
assert.deepStrictEqual(inspect(parser('[#a((b))]')), [['<a class="index" href="#index:a((b))">a<span class="paren">((b))</span></a>'], '']);
|
|
67
67
|
assert.deepStrictEqual(inspect(parser('[#a[[b]]]')), [['<a class="index" href="#index:a[[b]]">a[[b]]</a>'], '']);
|
|
68
68
|
});
|
|
@@ -89,7 +89,7 @@ describe('Unit: parser/inline/extension/index', () => {
|
|
|
89
89
|
assert.deepStrictEqual(inspect(parser('[#a \\ |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
90
90
|
assert.deepStrictEqual(inspect(parser('[#a |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
91
91
|
assert.deepStrictEqual(inspect(parser('[#a <wbr>|#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
92
|
-
assert.deepStrictEqual(inspect(parser('[#a [
|
|
92
|
+
assert.deepStrictEqual(inspect(parser('[#a [% b %]|#c]')), [['<a class="index" href="#index:c">a <span class="comment"><input type="checkbox"><span>[% b %]</span></span><span class="indexer" data-index="c"></span></a>'], '']);
|
|
93
93
|
assert.deepStrictEqual(inspect(parser('[#a\\ |#b]')), [['<a class="index" href="#index:b">a<span class="indexer" data-index="b"></span></a>'], '']);
|
|
94
94
|
});
|
|
95
95
|
|
|
@@ -45,13 +45,13 @@ describe('Unit: parser/inline/extension/placeholder', () => {
|
|
|
45
45
|
assert.deepStrictEqual(inspect(parser('[^a\\ \\ ]')), [['<span class="invalid">a </span>'], '']);
|
|
46
46
|
assert.deepStrictEqual(inspect(parser('[^a<wbr>]')), [['<span class="invalid">a<wbr></span>'], '']);
|
|
47
47
|
assert.deepStrictEqual(inspect(parser('[^a<wbr><wbr>]')), [['<span class="invalid">a<wbr><wbr></span>'], '']);
|
|
48
|
-
assert.deepStrictEqual(inspect(parser('[^a[
|
|
49
|
-
assert.deepStrictEqual(inspect(parser('[^a[
|
|
48
|
+
assert.deepStrictEqual(inspect(parser('[^a[% b %]]')), [['<span class="invalid">a<span class="comment"><input type="checkbox"><span>[% b %]</span></span></span>'], '']);
|
|
49
|
+
assert.deepStrictEqual(inspect(parser('[^a[% b %][% c %]]')), [['<span class="invalid">a<span class="comment"><input type="checkbox"><span>[% b %]</span></span><span class="comment"><input type="checkbox"><span>[% c %]</span></span></span>'], '']);
|
|
50
50
|
assert.deepStrictEqual(inspect(parser('[^\\]]')), [['<span class="invalid">]</span>'], '']);
|
|
51
51
|
assert.deepStrictEqual(inspect(parser('[^(])]')), [['<span class="invalid"><span class="paren">(])</span></span>'], '']);
|
|
52
52
|
assert.deepStrictEqual(inspect(parser('[^!http://host]')), [['<span class="invalid"><a href="http://host" target="_blank"><img class="media" data-src="http://host" alt=""></a></span>'], '']);
|
|
53
|
-
assert.deepStrictEqual(inspect(parser('[^[
|
|
54
|
-
assert.deepStrictEqual(inspect(parser('[^[
|
|
53
|
+
assert.deepStrictEqual(inspect(parser('[^[% a %]]')), [['<span class="invalid"><span class="comment"><input type="checkbox"><span>[% a %]</span></span></span>'], '']);
|
|
54
|
+
assert.deepStrictEqual(inspect(parser('[^[% a %]b]')), [['<span class="invalid"><span class="comment"><input type="checkbox"><span>[% a %]</span></span>b</span>'], '']);
|
|
55
55
|
});
|
|
56
56
|
|
|
57
57
|
});
|
|
@@ -6,7 +6,7 @@ import { inline, media, shortmedia } from '../inline';
|
|
|
6
6
|
import { attributes } from './html';
|
|
7
7
|
import { autolink } from '../autolink';
|
|
8
8
|
import { str } from '../source';
|
|
9
|
-
import {
|
|
9
|
+
import { trimBlank, stringify } from '../util';
|
|
10
10
|
import { html, define, defrag } from 'typed-dom/dom';
|
|
11
11
|
import { ReadonlyURL } from 'spica/url';
|
|
12
12
|
|
|
@@ -36,7 +36,7 @@ export const link: LinkParser = lazy(() => creator(10, validate(['[', '{'], '}',
|
|
|
36
36
|
media: false,
|
|
37
37
|
autolink: false,
|
|
38
38
|
}}},
|
|
39
|
-
|
|
39
|
+
trimBlank(some(inline, ']', /^\\?\n/))),
|
|
40
40
|
']',
|
|
41
41
|
true),
|
|
42
42
|
]))),
|
|
@@ -3,7 +3,7 @@ import { ReferenceParser } from '../inline';
|
|
|
3
3
|
import { union, subsequence, some, validate, focus, guard, context, creator, surround, lazy, fmap, bind } from '../../combinator';
|
|
4
4
|
import { inline } from '../inline';
|
|
5
5
|
import { str } from '../source';
|
|
6
|
-
import {
|
|
6
|
+
import { regBlankStart, trimBlank, stringify } from '../util';
|
|
7
7
|
import { html, defrag } from 'typed-dom/dom';
|
|
8
8
|
|
|
9
9
|
export const reference: ReferenceParser = lazy(() => creator(validate('[[', ']]', '\n', fmap(surround(
|
|
@@ -22,7 +22,7 @@ export const reference: ReferenceParser = lazy(() => creator(validate('[[', ']]'
|
|
|
22
22
|
subsequence([
|
|
23
23
|
abbr,
|
|
24
24
|
focus(/^\^[^\S\n]*/, source => [['', source], '']),
|
|
25
|
-
|
|
25
|
+
trimBlank(some(inline, ']', /^\\?\n/)),
|
|
26
26
|
]))),
|
|
27
27
|
']]'),
|
|
28
28
|
ns => [html('sup', attributes(ns), defrag(ns))]))));
|
|
@@ -31,7 +31,7 @@ const abbr: ReferenceParser.AbbrParser = creator(bind(surround(
|
|
|
31
31
|
'^',
|
|
32
32
|
union([str(/^(?![0-9]+\s?[|\]])[0-9A-Za-z]+(?:(?:-|(?=\W)(?!'\d)'?(?!\.\d)\.?(?!,\S),? ?)[0-9A-Za-z]+)*(?:-|'?\.?,? ?)?/)]),
|
|
33
33
|
/^\|?(?=]])|^\|[^\S\n]*/),
|
|
34
|
-
([source], rest) => [[html('abbr', source)], rest.replace(
|
|
34
|
+
([source], rest) => [[html('abbr', source)], rest.replace(regBlankStart, '')]));
|
|
35
35
|
|
|
36
36
|
function attributes(ns: (string | HTMLElement)[]): Record<string, string | undefined> {
|
|
37
37
|
return typeof ns[0] === 'object' && ns[0].tagName === 'ABBR'
|
|
@@ -166,8 +166,8 @@ describe('Unit: parser/inline', () => {
|
|
|
166
166
|
assert.deepStrictEqual(inspect(parser('[#a*b\nc*]')), [['[', '<a href="/hashtags/a" class="hashtag">#a</a>', '<em>b<br>c</em>', ']'], '']);
|
|
167
167
|
assert.deepStrictEqual(inspect(parser('[*a\nb*]{/}')), [['[', '<em>a<br>b</em>', ']', '<a href="/">/</a>'], '']);
|
|
168
168
|
assert.deepStrictEqual(inspect(parser('[[*a\nb*]]')), [['[', '[', '<em>a<br>b</em>', ']', ']'], '']);
|
|
169
|
-
assert.deepStrictEqual(inspect(parser('"[
|
|
170
|
-
assert.deepStrictEqual(inspect(parser('"[
|
|
169
|
+
assert.deepStrictEqual(inspect(parser('"[% *"*"*')), [['"', '[%', ' ', '*', '"', '*', '"', '*'], '']);
|
|
170
|
+
assert.deepStrictEqual(inspect(parser('"[% "*"* %]')), [['"', '[%', ' ', '"', '*', '"', '*', ' ', '%', ']'], '']);
|
|
171
171
|
});
|
|
172
172
|
|
|
173
173
|
it('uri', () => {
|
package/src/parser/util.ts
CHANGED
|
@@ -8,7 +8,7 @@ import { invisibleHTMLEntityNames } from './api/normalize';
|
|
|
8
8
|
import { reduce } from 'spica/memoize';
|
|
9
9
|
import { push } from 'spica/array';
|
|
10
10
|
|
|
11
|
-
export const
|
|
11
|
+
export const regBlankStart = new RegExp(String.raw
|
|
12
12
|
`^(?:\\?[^\S\n]|&(?:${invisibleHTMLEntityNames.join('|')});|<wbr>)+`);
|
|
13
13
|
|
|
14
14
|
export function blankWith(delimiter: string | RegExp): RegExp;
|
|
@@ -60,7 +60,7 @@ export function startLoose<T extends HTMLElement | string>(parser: Parser<T>, ex
|
|
|
60
60
|
: undefined;
|
|
61
61
|
}
|
|
62
62
|
const isStartLoose = reduce((source: string, context: MarkdownParser.Context, except?: string): boolean => {
|
|
63
|
-
return isStartTight(source.replace(
|
|
63
|
+
return isStartTight(source.replace(regBlankStart, ''), context, except);
|
|
64
64
|
}, (source, _, except = '') => `${source}\x1E${except}`);
|
|
65
65
|
|
|
66
66
|
export function startTight<P extends Parser<unknown>>(parser: P, except?: string): P;
|
|
@@ -137,16 +137,16 @@ function isVisible(node: HTMLElement | string, strpos?: number): boolean {
|
|
|
137
137
|
}
|
|
138
138
|
}
|
|
139
139
|
|
|
140
|
-
export function
|
|
141
|
-
export function
|
|
140
|
+
export function trimBlank<P extends Parser<HTMLElement | string>>(parser: P): P;
|
|
141
|
+
export function trimBlank<T extends HTMLElement | string>(parser: Parser<T>): Parser<T> {
|
|
142
142
|
return fmap(
|
|
143
|
-
|
|
143
|
+
trimBlankStart(parser),
|
|
144
144
|
trimNodeEnd);
|
|
145
145
|
}
|
|
146
|
-
function
|
|
147
|
-
function
|
|
146
|
+
function trimBlankStart<P extends Parser<unknown>>(parser: P): P;
|
|
147
|
+
function trimBlankStart<T>(parser: Parser<T>): Parser<T> {
|
|
148
148
|
return convert(
|
|
149
|
-
reduce(source => source.replace(
|
|
149
|
+
reduce(source => source.replace(regBlankStart, '')),
|
|
150
150
|
parser);
|
|
151
151
|
}
|
|
152
152
|
//export function trimNode(nodes: (HTMLElement | string)[]): (HTMLElement | string)[] {
|