securemark 0.241.0 → 0.242.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/securemark.js +695 -591
- package/global.dev.d.ts +6 -2
- package/markdown.d.ts +40 -30
- package/package-lock.json +79 -53
- package/package.json +4 -3
- package/src/combinator/control/manipulation/indent.test.ts +3 -1
- package/src/combinator/control/manipulation/indent.ts +5 -4
- package/src/parser/block/blockquote.test.ts +4 -4
- package/src/parser/block/codeblock.test.ts +27 -27
- package/src/parser/block/codeblock.ts +1 -1
- package/src/parser/block/extension/fig.test.ts +3 -3
- package/src/parser/block/extension/fig.ts +1 -1
- package/src/parser/block/extension/figure.test.ts +3 -3
- package/src/parser/block/extension/figure.ts +4 -2
- package/src/parser/block/extension/message.test.ts +7 -7
- package/src/parser/block/extension/message.ts +3 -1
- package/src/parser/block/indentblock.test.ts +30 -0
- package/src/parser/block/indentblock.ts +13 -0
- package/src/parser/block.ts +4 -1
- package/src/parser/processor/figure.ts +3 -3
- package/src/parser/processor/footnote.ts +1 -1
- package/src/renderer/render/media/twitter.ts +4 -4
- package/src/renderer/render.ts +3 -5
- package/src/util/info.ts +3 -7
|
@@ -6,11 +6,12 @@ import { label } from '../../inline/extension/label';
|
|
|
6
6
|
import { ulist } from '../ulist';
|
|
7
7
|
import { olist } from '../olist';
|
|
8
8
|
import { table as styled_table } from '../table';
|
|
9
|
+
import { indentblock } from '../indentblock';
|
|
9
10
|
import { codeblock, segment_ as seg_code } from '../codeblock';
|
|
10
11
|
import { mathblock, segment_ as seg_math } from '../mathblock';
|
|
11
|
-
import { blockquote, segment as seg_blockquote } from '../blockquote';
|
|
12
12
|
import { example } from './example';
|
|
13
13
|
import { table, segment_ as seg_table } from './table';
|
|
14
|
+
import { blockquote, segment as seg_blockquote } from '../blockquote';
|
|
14
15
|
import { placeholder, segment_ as seg_placeholder } from './placeholder';
|
|
15
16
|
import { inline, media, shortmedia } from '../../inline';
|
|
16
17
|
import { localize } from '../../locale';
|
|
@@ -57,11 +58,12 @@ export const figure: FigureParser = block(rewrite(segment, fmap(
|
|
|
57
58
|
ulist,
|
|
58
59
|
olist,
|
|
59
60
|
styled_table,
|
|
61
|
+
indentblock,
|
|
60
62
|
codeblock,
|
|
61
63
|
mathblock,
|
|
62
|
-
blockquote,
|
|
63
64
|
example,
|
|
64
65
|
table,
|
|
66
|
+
blockquote,
|
|
65
67
|
placeholder,
|
|
66
68
|
line(media),
|
|
67
69
|
line(shortmedia),
|
|
@@ -15,13 +15,13 @@ describe('Unit: parser/block/extension/message', () => {
|
|
|
15
15
|
});
|
|
16
16
|
|
|
17
17
|
it('valid', () => {
|
|
18
|
-
assert.deepStrictEqual(inspect(parser('~~~message/note\n~~~')), [['<div class="message type
|
|
19
|
-
assert.deepStrictEqual(inspect(parser('~~~message/note\n\n~~~')), [['<div class="message type
|
|
20
|
-
assert.deepStrictEqual(inspect(parser('~~~message/note\na\n~~~')), [['<div class="message type
|
|
21
|
-
assert.deepStrictEqual(inspect(parser('~~~message/note\na\n\n- \n~~~')), [['<div class="message type
|
|
22
|
-
assert.deepStrictEqual(inspect(parser('~~~message/note\n# a\n~~~')), [['<div class="message type
|
|
23
|
-
assert.deepStrictEqual(inspect(parser('~~~message/caution\n~~~')), [['<div class="message type
|
|
24
|
-
assert.deepStrictEqual(inspect(parser('~~~message/warning\n~~~')), [['<div class="message type
|
|
18
|
+
assert.deepStrictEqual(inspect(parser('~~~message/note\n~~~')), [['<div class="message" data-type="note"><h6>Note</h6></div>'], '']);
|
|
19
|
+
assert.deepStrictEqual(inspect(parser('~~~message/note\n\n~~~')), [['<div class="message" data-type="note"><h6>Note</h6></div>'], '']);
|
|
20
|
+
assert.deepStrictEqual(inspect(parser('~~~message/note\na\n~~~')), [['<div class="message" data-type="note"><h6>Note</h6><p>a</p></div>'], '']);
|
|
21
|
+
assert.deepStrictEqual(inspect(parser('~~~message/note\na\n\n- \n~~~')), [['<div class="message" data-type="note"><h6>Note</h6><p>a</p><ul><li></li></ul></div>'], '']);
|
|
22
|
+
assert.deepStrictEqual(inspect(parser('~~~message/note\n# a\n~~~')), [['<div class="message" data-type="note"><h6>Note</h6><p># a</p></div>'], '']);
|
|
23
|
+
assert.deepStrictEqual(inspect(parser('~~~message/caution\n~~~')), [['<div class="message" data-type="caution"><h6>Caution!</h6></div>'], '']);
|
|
24
|
+
assert.deepStrictEqual(inspect(parser('~~~message/warning\n~~~')), [['<div class="message" data-type="warning"><h6>WARNING!!</h6></div>'], '']);
|
|
25
25
|
});
|
|
26
26
|
|
|
27
27
|
});
|
|
@@ -7,6 +7,7 @@ import { ulist } from '../ulist';
|
|
|
7
7
|
import { olist } from '../olist';
|
|
8
8
|
import { ilist } from '../ilist';
|
|
9
9
|
import { table } from '../table';
|
|
10
|
+
import { indentblock } from '../indentblock';
|
|
10
11
|
import { codeblock } from '../codeblock';
|
|
11
12
|
import { mathblock } from '../mathblock';
|
|
12
13
|
import { blockquote } from '../blockquote';
|
|
@@ -41,7 +42,7 @@ export const message: MessageParser = block(validate('~~~', fmap(
|
|
|
41
42
|
}, `${opener}${body}${closer}`)];
|
|
42
43
|
}
|
|
43
44
|
return [
|
|
44
|
-
html('div', { class: `message type
|
|
45
|
+
html('div', { class: `message`, 'data-type': type }, unshift(
|
|
45
46
|
[html('h6', title(type))],
|
|
46
47
|
[...segment(body)].reduce((acc, seg) => push(acc, eval(content(seg, context), [])), []))),
|
|
47
48
|
];
|
|
@@ -65,6 +66,7 @@ const content: MessageParser.ContentParser = union([
|
|
|
65
66
|
olist,
|
|
66
67
|
ilist,
|
|
67
68
|
table,
|
|
69
|
+
indentblock,
|
|
68
70
|
codeblock,
|
|
69
71
|
mathblock,
|
|
70
72
|
blockquote,
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { indentblock } from './indentblock';
|
|
2
|
+
import { some } from '../../combinator';
|
|
3
|
+
import { inspect } from '../../debug.test';
|
|
4
|
+
|
|
5
|
+
describe('Unit: parser/block/indentblock', () => {
|
|
6
|
+
describe('indentblock', () => {
|
|
7
|
+
const parser = (source: string) => some(indentblock)(source, {});
|
|
8
|
+
|
|
9
|
+
it('invalid', () => {
|
|
10
|
+
assert.deepStrictEqual(inspect(parser('')), undefined);
|
|
11
|
+
assert.deepStrictEqual(inspect(parser('\na')), undefined);
|
|
12
|
+
assert.deepStrictEqual(inspect(parser(' a')), undefined);
|
|
13
|
+
assert.deepStrictEqual(inspect(parser(' \ta')), undefined);
|
|
14
|
+
assert.deepStrictEqual(inspect(parser(' a\nb')), undefined);
|
|
15
|
+
assert.deepStrictEqual(inspect(parser(' a\n b')), undefined);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('valid', () => {
|
|
19
|
+
assert.deepStrictEqual(inspect(parser(' a')), [['<pre class="text">a</pre>'], '']);
|
|
20
|
+
assert.deepStrictEqual(inspect(parser(' a ')), [['<pre class="text">a </pre>'], '']);
|
|
21
|
+
assert.deepStrictEqual(inspect(parser(' a \n')), [['<pre class="text">a </pre>'], '']);
|
|
22
|
+
assert.deepStrictEqual(inspect(parser(' a \n b')), [['<pre class="text">a <br> b</pre>'], '']);
|
|
23
|
+
assert.deepStrictEqual(inspect(parser(' a\\\n b')), [['<pre class="text">a\\<br>b</pre>'], '']);
|
|
24
|
+
assert.deepStrictEqual(inspect(parser('\ta')), [['<pre class="text">a</pre>'], '']);
|
|
25
|
+
assert.deepStrictEqual(inspect(parser('\t a')), [['<pre class="text"> a</pre>'], '']);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { IndentBlockParser } from '../block';
|
|
2
|
+
import { union, block, validate, indent, convert } from '../../combinator';
|
|
3
|
+
import { codeblock } from './codeblock';
|
|
4
|
+
|
|
5
|
+
// 空行を含むインデントブロックはインデントの違いによるセグメント分割の境界が視認不能となるため採用しない
|
|
6
|
+
|
|
7
|
+
export const indentblock: IndentBlockParser = block(validate(/^(?: |\t)/, indent(convert(
|
|
8
|
+
source => {
|
|
9
|
+
const fence = (source.match(/^`{3,}(?=[^\S\n]*$)/mg) ?? [])
|
|
10
|
+
.reduce((max, fence) => fence > max ? fence : max, '``') + '`';
|
|
11
|
+
return `${fence}\n${source}\n${fence}`;
|
|
12
|
+
},
|
|
13
|
+
union([codeblock])), true)));
|
package/src/parser/block.ts
CHANGED
|
@@ -9,10 +9,11 @@ import { olist } from './block/olist';
|
|
|
9
9
|
import { ilist } from './block/ilist';
|
|
10
10
|
import { dlist } from './block/dlist';
|
|
11
11
|
import { table } from './block/table';
|
|
12
|
-
import {
|
|
12
|
+
import { indentblock } from './block/indentblock';
|
|
13
13
|
import { codeblock } from './block/codeblock';
|
|
14
14
|
import { mathblock } from './block/mathblock';
|
|
15
15
|
import { extension } from './block/extension';
|
|
16
|
+
import { blockquote } from './block/blockquote';
|
|
16
17
|
import { reply } from './block/reply';
|
|
17
18
|
import { paragraph } from './block/paragraph';
|
|
18
19
|
import { html } from 'typed-dom/dom';
|
|
@@ -26,6 +27,7 @@ export import OListParser = BlockParser.OListParser;
|
|
|
26
27
|
export import IListParser = BlockParser.IListParser;
|
|
27
28
|
export import DListParser = BlockParser.DListParser;
|
|
28
29
|
export import TableParser = BlockParser.TableParser;
|
|
30
|
+
export import IndentBlockParser = BlockParser.IndentBlockParser;
|
|
29
31
|
export import CodeBlockParser = BlockParser.CodeBlockParser;
|
|
30
32
|
export import MathBlockParser = BlockParser.MathBlockParser;
|
|
31
33
|
export import ExtensionParser = BlockParser.ExtensionParser;
|
|
@@ -44,6 +46,7 @@ export const block: BlockParser = creator(error(
|
|
|
44
46
|
ilist,
|
|
45
47
|
dlist,
|
|
46
48
|
table,
|
|
49
|
+
indentblock,
|
|
47
50
|
codeblock,
|
|
48
51
|
mathblock,
|
|
49
52
|
extension,
|
|
@@ -12,9 +12,9 @@ export function* figure(
|
|
|
12
12
|
}> = {},
|
|
13
13
|
): Generator<HTMLAnchorElement | undefined, undefined, undefined> {
|
|
14
14
|
const refs = new MultiMap<string, HTMLAnchorElement>(push(push(push([],
|
|
15
|
-
target.querySelectorAll
|
|
16
|
-
footnotes?.annotations.querySelectorAll
|
|
17
|
-
footnotes?.references.querySelectorAll
|
|
15
|
+
target.querySelectorAll('a.label:not(.disabled)[data-label]')),
|
|
16
|
+
footnotes?.annotations.querySelectorAll('a.label:not(.disabled)') ?? []),
|
|
17
|
+
footnotes?.references.querySelectorAll('a.label:not(.disabled)') ?? [])
|
|
18
18
|
.map(el => [el.getAttribute('data-label')!, el]));
|
|
19
19
|
const labels = new Set<string>();
|
|
20
20
|
const numbers = new Map<string, string>();
|
|
@@ -42,7 +42,7 @@ function build(
|
|
|
42
42
|
const check = footnotes.some(el => target.contains(el));
|
|
43
43
|
let style: 'count' | 'abbr';
|
|
44
44
|
for (
|
|
45
|
-
let refs = target.querySelectorAll
|
|
45
|
+
let refs = target.querySelectorAll(`sup.${syntax}:not(.disabled)`),
|
|
46
46
|
i = 0, len = refs.length; i < len; ++i) {
|
|
47
47
|
yield;
|
|
48
48
|
const ref = refs[i];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { window, document } from 'spica/global';
|
|
2
2
|
import { parse } from '../../../parser';
|
|
3
|
-
import { html, define } from 'typed-dom/dom';
|
|
3
|
+
import { html as h, define } from 'typed-dom/dom';
|
|
4
4
|
import { sanitize } from 'dompurify';
|
|
5
5
|
|
|
6
6
|
declare global {
|
|
@@ -21,8 +21,8 @@ export function twitter(source: HTMLImageElement, url: URL): HTMLElement | undef
|
|
|
21
21
|
if (!origins.includes(url.origin)) return;
|
|
22
22
|
if (url.pathname.split('/').pop()!.includes('.')) return;
|
|
23
23
|
if (!url.pathname.match(/^\/\w+\/status\/[0-9]{15,}(?!\w)/)) return;
|
|
24
|
-
const el =
|
|
25
|
-
|
|
24
|
+
const el = h('div', { class: source.className, 'data-type': 'twitter' }, [
|
|
25
|
+
h('em', `Loading ${source.getAttribute('data-src')}...`),
|
|
26
26
|
]);
|
|
27
27
|
$.ajax(`https://publish.twitter.com/oembed?url=${url.href.replace('?', '&')}&omit_script=true`, {
|
|
28
28
|
dataType: 'jsonp',
|
|
@@ -33,7 +33,7 @@ export function twitter(source: HTMLImageElement, url: URL): HTMLElement | undef
|
|
|
33
33
|
if (window.twttr) return void window.twttr.widgets.load(el);
|
|
34
34
|
const id = 'twitter-wjs';
|
|
35
35
|
if (document.getElementById(id)) return;
|
|
36
|
-
document.body.appendChild(
|
|
36
|
+
document.body.appendChild(h('script', { id, src: 'https://platform.twitter.com/widgets.js' }));
|
|
37
37
|
},
|
|
38
38
|
error({ status, statusText }) {
|
|
39
39
|
assert(Number.isSafeInteger(status));
|
package/src/renderer/render.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { RenderingOptions } from '../../';
|
|
|
3
3
|
import { code } from './render/code';
|
|
4
4
|
import { math } from './render/math';
|
|
5
5
|
import { media } from './render/media';
|
|
6
|
+
import { querySelectorAll } from 'typed-dom/query';
|
|
6
7
|
import { reduce } from 'spica/memoize';
|
|
7
8
|
|
|
8
9
|
const selector = 'img.media:not(.invalid):not([src])[data-src], a > :not(img).media:not(.invalid), pre.code:not(.invalid), .math:not(.invalid)';
|
|
@@ -13,11 +14,8 @@ const extend = reduce((opts: RenderingOptions): RenderingOptions =>
|
|
|
13
14
|
export function render(source: HTMLElement, opts: RenderingOptions = {}): void {
|
|
14
15
|
opts = extend(opts);
|
|
15
16
|
const base = location.href;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
let es = source.querySelectorAll<HTMLElement>(selector),
|
|
19
|
-
i = 0, len = es.length; i < len; ++i) {
|
|
20
|
-
render_(base, es[i], opts);
|
|
17
|
+
for (const el of querySelectorAll<HTMLElement>(source, selector)) {
|
|
18
|
+
render_(base, el, opts);
|
|
21
19
|
}
|
|
22
20
|
}
|
|
23
21
|
|
package/src/util/info.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Info } from '../..';
|
|
2
2
|
import { scope } from './scope';
|
|
3
|
+
import { querySelectorAll } from 'typed-dom/query';
|
|
3
4
|
|
|
4
5
|
export function info(source: DocumentFragment | HTMLElement | ShadowRoot): Info {
|
|
5
6
|
const match = scope(source, '.invalid');
|
|
@@ -19,12 +20,7 @@ export function info(source: DocumentFragment | HTMLElement | ShadowRoot): Info
|
|
|
19
20
|
};
|
|
20
21
|
|
|
21
22
|
function find<T extends HTMLElement>(selector: string): T[] {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const el = es[i];
|
|
25
|
-
if (!match(el)) continue;
|
|
26
|
-
acc.push(el);
|
|
27
|
-
}
|
|
28
|
-
return acc;
|
|
23
|
+
return querySelectorAll<T>(source, selector)
|
|
24
|
+
.filter(match);
|
|
29
25
|
}
|
|
30
26
|
}
|