securemark 0.281.4 → 0.282.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 CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.282.0
4
+
5
+ - Change identifiers.
6
+
3
7
  ## 0.281.4
4
8
 
5
9
  - Fix identifiers.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! securemark v0.281.4 https://github.com/falsandtru/securemark | (c) 2017, falsandtru | UNLICENSED License */
1
+ /*! securemark v0.282.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"));
@@ -6108,6 +6108,7 @@ const MAX = 60;
6108
6108
  const ELLIPSIS = '...';
6109
6109
  const PART = (MAX - ELLIPSIS.length) / 2 | 0;
6110
6110
  const REM = MAX - PART * 2 - ELLIPSIS.length;
6111
+ const table = [...[...Array(36)].map((_, i) => i.toString(36)), ...[...Array(36)].map((_, i) => i.toString(36).toUpperCase()).slice(-26), '-', '='].join('');
6111
6112
  function identity(type, id, text) {
6112
6113
  if (id === '') return undefined;
6113
6114
  if (typeof text !== 'string') {
@@ -6120,7 +6121,7 @@ function identity(type, id, text) {
6120
6121
  const str = text.replace(/\s/g, '_');
6121
6122
  const cs = [...str];
6122
6123
  if (type === '' || cs.length <= MAX) {
6123
- return `${type}:${id ?? ''}:${str}${/_|[^\S ]|=[0-9a-z]{1,7}$/.test(text) ? `=${hash(text)}` : ''}`;
6124
+ return `${type}:${id ?? ''}:${str}${/_|[^\S ]|=[0-9A-Za-z]{1,6}$/.test(text) ? `=${hash(text)}` : ''}`;
6124
6125
  }
6125
6126
  const s1 = cs.slice(0, PART + REM).join('');
6126
6127
  const s2 = cs.slice(-PART).join('');
@@ -6130,12 +6131,24 @@ exports.identity = identity;
6130
6131
  function hash(source) {
6131
6132
  let x = 0;
6132
6133
  for (let i = 0; i < source.length; ++i) {
6133
- x ^= source.charCodeAt(i) << 1 | 1; // 16+1bit
6134
+ const c = source.charCodeAt(i);
6135
+ x = x ^ c << 1 || ~x ^ c << 1; // 16+1bit
6136
+
6134
6137
  x ^= x << 13; // shift <= 32-17bit
6135
6138
  x ^= x >>> 17;
6136
6139
  x ^= x << 15;
6137
6140
  }
6138
- return (x >>> 0).toString(36);
6141
+ return baseR(x >>> 0, 62);
6142
+ }
6143
+ // 62も64も最大6桁
6144
+ function baseR(n, r) {
6145
+ let acc = '';
6146
+ do {
6147
+ const mod = n % r;
6148
+ n = (n - mod) / r;
6149
+ acc = table[mod] + acc;
6150
+ } while (n > 0);
6151
+ return acc;
6139
6152
  }
6140
6153
  function signature(source) {
6141
6154
  const target = source.cloneNode(true);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securemark",
3
- "version": "0.281.4",
3
+ "version": "0.282.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",
@@ -51,8 +51,8 @@ describe('Unit: parser/inline/extension/index', () => {
51
51
  assert.deepStrictEqual(inspect(parser('[#a\\ ]')), [['<a class="index" href="#index::a">a</a>'], '']);
52
52
  assert.deepStrictEqual(inspect(parser('[#a b]')), [['<a class="index" href="#index::a_b">a b</a>'], '']);
53
53
  assert.deepStrictEqual(inspect(parser('[#a b]')), [['<a class="index" href="#index::a__b">a b</a>'], '']);
54
- assert.deepStrictEqual(inspect(parser('[#a\tb]')), [['<a class="index" href="#index::a_b=1eu1tj4">a\tb</a>'], '']);
55
- assert.deepStrictEqual(inspect(parser('[#a_b]')), [['<a class="index" href="#index::a_b=10dxc9b">a_b</a>'], '']);
54
+ assert.deepStrictEqual(inspect(parser('[#a\tb]')), [['<a class="index" href="#index::a_b=33Mw2l">a\tb</a>'], '']);
55
+ assert.deepStrictEqual(inspect(parser('[#a_b]')), [['<a class="index" href="#index::a_b=2H8oCG">a_b</a>'], '']);
56
56
  assert.deepStrictEqual(inspect(parser('[#a\\ b]')), [['<a class="index" href="#index::a_b">a b</a>'], '']);
57
57
  assert.deepStrictEqual(inspect(parser('[#[]]')), [['<a class="index" href="#index::[]">[]</a>'], '']);
58
58
  assert.deepStrictEqual(inspect(parser('[#\\]]')), [['<a class="index" href="#index::]">]</a>'], '']);
@@ -87,8 +87,8 @@ describe('Unit: parser/inline/extension/index', () => {
87
87
  assert.deepStrictEqual(inspect(parser('[#a|*b*]')), [['<a class="index" href="#index::*b*">a<span class="indexer" data-index="*b*"></span></a>'], '']);
88
88
  assert.deepStrictEqual(inspect(parser('[#a|b c]')), [['<a class="index" href="#index::b_c">a<span class="indexer" data-index="b_c"></span></a>'], '']);
89
89
  assert.deepStrictEqual(inspect(parser('[#a|b c]')), [['<a class="index" href="#index::b__c">a<span class="indexer" data-index="b__c"></span></a>'], '']);
90
- assert.deepStrictEqual(inspect(parser('[#a|b\tc]')), [['<a class="index" href="#index::b_c=3p5wqt">a<span class="indexer" data-index="b_c=3p5wqt"></span></a>'], '']);
91
- assert.deepStrictEqual(inspect(parser('[#a|b_c]')), [['<a class="index" href="#index::b_c=fvw9e2">a<span class="indexer" data-index="b_c=fvw9e2"></span></a>'], '']);
90
+ assert.deepStrictEqual(inspect(parser('[#a|b\tc]')), [['<a class="index" href="#index::b_c=xeqYk">a<span class="indexer" data-index="b_c=xeqYk"></span></a>'], '']);
91
+ assert.deepStrictEqual(inspect(parser('[#a|b_c]')), [['<a class="index" href="#index::b_c=KUxv5">a<span class="indexer" data-index="b_c=KUxv5"></span></a>'], '']);
92
92
  assert.deepStrictEqual(inspect(parser('[#a|[]]')), [['<a class="index" href="#index::[]">a<span class="indexer" data-index="[]"></span></a>'], '']);
93
93
  assert.deepStrictEqual(inspect(parser('[#a|&copy;]')), [['<a class="index" href="#index::&amp;copy;">a<span class="indexer" data-index="&amp;copy;"></span></a>'], '']);
94
94
  assert.deepStrictEqual(inspect(parser('[#a |b]')), [['<a class="index" href="#index::b">a<span class="indexer" data-index="b"></span></a>'], '']);
@@ -13,6 +13,12 @@ const MAX = 60;
13
13
  const ELLIPSIS = '...';
14
14
  const PART = (MAX - ELLIPSIS.length) / 2 | 0;
15
15
  const REM = MAX - PART * 2 - ELLIPSIS.length;
16
+ const table = [
17
+ ...[...Array(36)].map((_, i) => i.toString(36)),
18
+ ...[...Array(36)].map((_, i) => i.toString(36).toUpperCase()).slice(-26),
19
+ '-', '=',
20
+ ].join('');
21
+ assert(table.length === 64);
16
22
  export function identity(
17
23
  type: 'index' | 'mark' | '',
18
24
  id: string | undefined,
@@ -32,7 +38,7 @@ export function identity(
32
38
  const str = text.replace(/\s/g, '_');
33
39
  const cs = [...str];
34
40
  if (type === '' || cs.length <= MAX) {
35
- return `${type}:${id ?? ''}:${str}${/_|[^\S ]|=[0-9a-z]{1,7}$/.test(text) ? `=${hash(text)}` : ''}`;
41
+ return `${type}:${id ?? ''}:${str}${/_|[^\S ]|=[0-9A-Za-z]{1,6}$/.test(text) ? `=${hash(text)}` : ''}`;
36
42
  }
37
43
  const s1 = cs.slice(0, PART + REM).join('');
38
44
  const s2 = cs.slice(-PART).join('');
@@ -42,6 +48,9 @@ export function identity(
42
48
  assert.deepStrictEqual(
43
49
  identity('index', undefined, ' 0 '),
44
50
  identity('index', undefined, ' 0 '.trim()));
51
+ assert.notDeepStrictEqual(
52
+ identity('index', undefined, '0 0'),
53
+ identity('index', undefined, '0 0'));
45
54
  assert.notDeepStrictEqual(
46
55
  identity('index', undefined, '0 0'),
47
56
  identity('index', undefined, '0_0'));
@@ -56,23 +65,44 @@ assert.deepStrictEqual(
56
65
  `${'0'.repeat(MAX - 1)}1`);
57
66
  assert.deepStrictEqual(
58
67
  identity('index', undefined, `0${'1'.repeat(MAX / 2)}${'2'.repeat(MAX / 2)}3`)!.slice(7),
59
- `0${'1'.repeat(PART + REM - 1)}${ELLIPSIS}${'2'.repeat(PART - 1)}3=mhy513`);
68
+ `0${'1'.repeat(PART + REM - 1)}${ELLIPSIS}${'2'.repeat(PART - 1)}3=MYkmc`);
60
69
  assert.deepStrictEqual(
61
70
  identity('index', undefined, `0${'1'.repeat(MAX * 2)}${'2'.repeat(MAX * 2)}3`)!.slice(7),
62
- `0${'1'.repeat(PART + REM - 1)}${ELLIPSIS}${'2'.repeat(PART - 1)}3=12jqtiv`);
71
+ `0${'1'.repeat(PART + REM - 1)}${ELLIPSIS}${'2'.repeat(PART - 1)}3=3bF8VU`);
63
72
  function hash(source: string): string {
64
73
  let x = 0;
65
74
  for (let i = 0; i < source.length; ++i) {
66
- x ^= source.charCodeAt(i) << 1 | 1; // 16+1bit
75
+ const c = source.charCodeAt(i);
76
+ x = x ^ c << 1 || ~x ^ c << 1; // 16+1bit
77
+ assert(x !== 0);
67
78
  x ^= x << 13; // shift <= 32-17bit
68
79
  x ^= x >>> 17;
69
80
  x ^= x << 15;
70
81
  }
71
- return (x >>> 0).toString(36);
82
+ return baseR(x >>> 0, 62);
72
83
  }
73
84
  assert(hash('\x00') !== '0');
74
85
  assert(hash('\x01') !== '0');
75
86
  assert(hash('\x00') !== hash(String.fromCharCode(1 << 15)));
87
+ // 62も64も最大6桁
88
+ function baseR(n: number, r: number): string {
89
+ assert(n >= 0);
90
+ assert(Math.floor(n) === n);
91
+ assert(r <= 64);
92
+ let acc = '';
93
+ do {
94
+ const mod = n % r;
95
+ n = (n - mod) / r;
96
+ assert(Math.floor(n) === n);
97
+ acc = table[mod] + acc;
98
+ } while (n > 0)
99
+ assert(acc !== '');
100
+ return acc;
101
+ }
102
+ assert(baseR(0, 36) === (0).toString(36));
103
+ assert(baseR(~0 >>> 0, 36) === (~0 >>> 0).toString(36));
104
+ assert(baseR(61, 62) === 'Z');
105
+ assert(baseR(62, 62) === '10');
76
106
 
77
107
  export function signature(source: Element | DocumentFragment): string {
78
108
  assert(!navigator.userAgent.includes('Chrome') || !source.querySelector('br:not(:has(+ :is(ul, ol)))'));
@@ -25,8 +25,8 @@ describe('Unit: parser/inline/extension/indexer', () => {
25
25
  assert.deepStrictEqual(inspect(parser(' [|a ]')), [['<span class="indexer" data-index="a"></span>'], '']);
26
26
  assert.deepStrictEqual(inspect(parser(' [|a b]')), [['<span class="indexer" data-index="a_b"></span>'], '']);
27
27
  assert.deepStrictEqual(inspect(parser(' [|a b]')), [['<span class="indexer" data-index="a__b"></span>'], '']);
28
- assert.deepStrictEqual(inspect(parser(' [|a\tb]')), [['<span class="indexer" data-index="a_b=1eu1tj4"></span>'], '']);
29
- assert.deepStrictEqual(inspect(parser(' [|a_b]')), [['<span class="indexer" data-index="a_b=10dxc9b"></span>'], '']);
28
+ assert.deepStrictEqual(inspect(parser(' [|a\tb]')), [['<span class="indexer" data-index="a_b=33Mw2l"></span>'], '']);
29
+ assert.deepStrictEqual(inspect(parser(' [|a_b]')), [['<span class="indexer" data-index="a_b=2H8oCG"></span>'], '']);
30
30
  assert.deepStrictEqual(inspect(parser(' [|A]')), [['<span class="indexer" data-index="A"></span>'], '']);
31
31
  assert.deepStrictEqual(inspect(parser(' [|*A*]')), [['<span class="indexer" data-index="*A*"></span>'], '']);
32
32
  assert.deepStrictEqual(inspect(parser(' [|`A`]')), [['<span class="indexer" data-index="`A`"></span>'], '']);
@@ -30,7 +30,7 @@ describe('Unit: parser/inline/mark', () => {
30
30
 
31
31
  it('basic', () => {
32
32
  assert.deepStrictEqual(inspect(parser('==a==')), [['<mark id="mark::a">a</mark>', '<a href="#mark::a"></a>'], '']);
33
- assert.deepStrictEqual(inspect(parser('==a=b==')), [['<mark id="mark::a=b=1aef5x1">a=b</mark>', '<a href="#mark::a=b=1aef5x1"></a>'], '']);
33
+ assert.deepStrictEqual(inspect(parser('==a=b==')), [['<mark id="mark::a=b=3lYfIw">a=b</mark>', '<a href="#mark::a=b=3lYfIw"></a>'], '']);
34
34
  assert.deepStrictEqual(inspect(parser('==\\===')), [['<mark id="mark::=">=</mark>', '<a href="#mark::="></a>'], '']);
35
35
  assert.deepStrictEqual(inspect(parser('==a===')), [['<mark id="mark::a">a</mark>', '<a href="#mark::a"></a>'], '=']);
36
36
  });
@@ -38,7 +38,7 @@ describe('Unit: parser/inline/mark', () => {
38
38
  it('nest', () => {
39
39
  assert.deepStrictEqual(inspect(parser('==a ==b====')), [['<mark id="mark::a_b">a <mark id="mark::b">b</mark><a href="#mark::b"></a></mark>', '<a href="#mark::a_b"></a>'], '']);
40
40
  assert.deepStrictEqual(inspect(parser('==a\\ ==b====')), [['<mark id="mark::a_b">a <mark id="mark::b">b</mark><a href="#mark::b"></a></mark>', '<a href="#mark::a_b"></a>'], '']);
41
- assert.deepStrictEqual(inspect(parser('==a&Tab;==b====')), [['<mark id="mark::a_b=1eu1tj4">a\t<mark id="mark::b">b</mark><a href="#mark::b"></a></mark>', '<a href="#mark::a_b=1eu1tj4"></a>'], '']);
41
+ assert.deepStrictEqual(inspect(parser('==a&Tab;==b====')), [['<mark id="mark::a_b=33Mw2l">a\t<mark id="mark::b">b</mark><a href="#mark::b"></a></mark>', '<a href="#mark::a_b=33Mw2l"></a>'], '']);
42
42
  assert.deepStrictEqual(inspect(parser('==a<wbr>==b====')), [['<mark id="mark::ab">a<wbr><mark id="mark::b">b</mark><a href="#mark::b"></a></mark>', '<a href="#mark::ab"></a>'], '']);
43
43
  assert.deepStrictEqual(inspect(parser('==*==a==*==')), [['<mark id="mark::a"><em><mark id="mark::a">a</mark><a href="#mark::a"></a></em></mark>', '<a href="#mark::a"></a>'], '']);
44
44
  });