palt-typesetting 0.1.11 → 0.4.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/README.md +67 -23
- package/bundle/typesetter.min.js +1 -0
- package/dist/apply-style.d.ts +3 -2
- package/dist/apply-style.d.ts.map +1 -1
- package/dist/apply-style.js +37 -34
- package/dist/html-processor.d.ts +1 -1
- package/dist/html-processor.d.ts.map +1 -1
- package/dist/html-processor.js +88 -55
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +97 -61
- package/dist/insert-separators.d.ts +4 -4
- package/dist/insert-separators.d.ts.map +1 -1
- package/dist/insert-separators.js +41 -39
- package/dist/style/typesetting.css +27 -0
- package/dist/{utils-regex.d.ts → util-regex.d.ts} +3 -1
- package/dist/util-regex.d.ts.map +1 -0
- package/dist/util-regex.js +20 -0
- package/dist/util-tags.d.ts +9 -0
- package/dist/util-tags.d.ts.map +1 -0
- package/dist/util-tags.js +55 -0
- package/dist/{utils-text-classes.d.ts → util-text-classes.d.ts} +3 -2
- package/dist/util-text-classes.d.ts.map +1 -0
- package/dist/util-text-classes.js +98 -0
- package/dist/win-browser.js +4 -4
- package/dist/win.js +6 -6
- package/package.json +20 -12
- package/{dist/types → types}/index.d.ts +0 -5
- package/dist/apply-style.js.map +0 -1
- package/dist/html-processor.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/insert-separators.js.map +0 -1
- package/dist/utils-regex.d.ts.map +0 -1
- package/dist/utils-regex.js +0 -10
- package/dist/utils-regex.js.map +0 -1
- package/dist/utils-tags.d.ts +0 -8
- package/dist/utils-tags.d.ts.map +0 -1
- package/dist/utils-tags.js +0 -40
- package/dist/utils-tags.js.map +0 -1
- package/dist/utils-text-classes.d.ts.map +0 -1
- package/dist/utils-text-classes.js +0 -78
- package/dist/utils-text-classes.js.map +0 -1
- package/dist/win-browser.js.map +0 -1
- package/dist/win.js.map +0 -1
- /package/{dist/types → types}/linebreak.d.ts +0 -0
package/README.md
CHANGED
|
@@ -2,14 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
## Typesetting Library for Proportional Spacing
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
Palt Typesetting は、美しいテキスト表示を実現するための JavaScript ライブラリです。和欧混植、およびツメ組み (`font-feature-settings: 'palt'`) の版面設計において、最大限の力を発揮します。
|
|
6
8
|
|
|
7
9
|
四分アキの自動挿入、カーニングルールの適用、英語のような単語区切りでの改行など、洗練された組版機能を提供します。
|
|
8
10
|
|
|
9
11
|
## Demo
|
|
10
12
|
|
|
11
13
|
- [Interactive Demo](https://palt.typesetting.jp)
|
|
12
|
-
- [
|
|
14
|
+
- [Try on CodePen](https://codepen.io/yamatoiizuka-the-animator/pen/PoLGrZe)
|
|
13
15
|
|
|
14
16
|
## Getting Started
|
|
15
17
|
|
|
@@ -29,23 +31,67 @@ const typesetter = new Typesetter()
|
|
|
29
31
|
typesetter.renderToSelector('.my-class')
|
|
30
32
|
```
|
|
31
33
|
|
|
32
|
-
###
|
|
34
|
+
### Use Typesetter from CDN
|
|
35
|
+
|
|
36
|
+
```html
|
|
37
|
+
<script src="https://unpkg.com/palt-typesetting@0.4.0/bundle/typesetter.min.js"></script>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
```html
|
|
41
|
+
<script>
|
|
42
|
+
// Typesetter のインスタンスを作成
|
|
43
|
+
const typesetter = new Typesetter()
|
|
44
|
+
|
|
45
|
+
// セレクターにマッチする要素に対して組版を適用
|
|
46
|
+
typesetter.renderToSelector('.my-class')
|
|
47
|
+
</script>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Apply CSS (Example)
|
|
33
51
|
|
|
34
52
|
```css
|
|
35
|
-
/*
|
|
53
|
+
/*
|
|
54
|
+
* 共通のスタイリング(例)
|
|
55
|
+
*/
|
|
36
56
|
.typeset {
|
|
57
|
+
/* プロポーショナルメトリクス(ツメ組み)の設定 */
|
|
37
58
|
font-feature-settings: 'palt';
|
|
38
|
-
|
|
59
|
+
|
|
60
|
+
/* 行間 */
|
|
39
61
|
line-height: 1.8;
|
|
62
|
+
|
|
63
|
+
/* 文字間 */
|
|
64
|
+
letter-spacing: 0.1em;
|
|
65
|
+
|
|
66
|
+
/*
|
|
67
|
+
* Safari のフォントレンダリング対策。
|
|
68
|
+
* 英数(.typeset-latin)で -webkit-text-stroke を使う場合は必須。
|
|
69
|
+
* text-stroke-weight > 0, text-stroke-color: transparent
|
|
70
|
+
*/
|
|
71
|
+
-webkit-text-stroke: 0.01em transparent;
|
|
40
72
|
}
|
|
41
73
|
|
|
42
|
-
/*
|
|
74
|
+
/*
|
|
75
|
+
* 英数のみのスタイリング(例)
|
|
76
|
+
*/
|
|
43
77
|
.typeset-latin {
|
|
78
|
+
/* フォントの拡大・縮小 */
|
|
79
|
+
font-size: 105%;
|
|
80
|
+
|
|
81
|
+
/* ベースラインの調整 */
|
|
82
|
+
vertical-align: 0.02em;
|
|
83
|
+
|
|
84
|
+
/*
|
|
85
|
+
* 行間の調整。親要素 .typeset の行間と視覚的に合わせます。
|
|
86
|
+
* [.typeset の line-height] ÷ [フォントの拡大率] - [ベースラインの調整値の絶対値] × 2
|
|
87
|
+
*/
|
|
88
|
+
line-height: calc(1.8 / 1.05 - 0.02 * 2);
|
|
89
|
+
|
|
90
|
+
/* 文字間の調整 */
|
|
44
91
|
letter-spacing: 0.05em;
|
|
45
92
|
|
|
46
|
-
/*
|
|
47
|
-
|
|
48
|
-
line-height: calc(1.8 / 1.05);
|
|
93
|
+
/* 文字の細らせ・太らせ */
|
|
94
|
+
-webkit-text-stroke: 0.01em #000;
|
|
49
95
|
}
|
|
50
96
|
```
|
|
51
97
|
|
|
@@ -69,7 +115,7 @@ typesetter.renderToElements(elements)
|
|
|
69
115
|
// 組版を適用した HTML の取得
|
|
70
116
|
const srcHtml = '「日本語」とEnglish'
|
|
71
117
|
console.log(typesetter.render(srcHtml))
|
|
72
|
-
// <span class="typeset" /* 中略 */>「日本語」<span class="typeset-thin-space" style="font-size:
|
|
118
|
+
// <span class="typeset" /* 中略 */>「日本語」<span class="typeset-thin-space" style="font-size: 100%;" /* 中略 */> </span><wbr>と<span class="typeset-thin-space" style="font-size: 100%;" /* 中略 */> </span><wbr><span class="typeset-latin">English</span></span>
|
|
73
119
|
```
|
|
74
120
|
|
|
75
121
|
### Constructor
|
|
@@ -92,9 +138,6 @@ console.log(typesetter.render(srcHtml))
|
|
|
92
138
|
|
|
93
139
|
```javascript
|
|
94
140
|
const options = {
|
|
95
|
-
// ライブラリで使用される CSS クラス名のプレフィックスを指定します。
|
|
96
|
-
classNamePrefix: 'typeset',
|
|
97
|
-
|
|
98
141
|
// 単語や助詞など、単語区切りでの改行を行います。
|
|
99
142
|
useWordBreak: true,
|
|
100
143
|
|
|
@@ -108,17 +151,17 @@ const options = {
|
|
|
108
151
|
insertThinSpaces: true,
|
|
109
152
|
|
|
110
153
|
// 四分アキスペースの幅を設定します。
|
|
111
|
-
thinSpaceWidth: '
|
|
154
|
+
thinSpaceWidth: '0.2em',
|
|
112
155
|
|
|
113
156
|
// 特定の文字間のカーニングルールを設定します。
|
|
114
157
|
kerningRules: [
|
|
115
158
|
{
|
|
116
|
-
between: ['
|
|
117
|
-
value: '
|
|
159
|
+
between: ['し', 'ま'],
|
|
160
|
+
value: '60',
|
|
118
161
|
},
|
|
119
162
|
{
|
|
120
|
-
between: ['
|
|
121
|
-
value: '-
|
|
163
|
+
between: ['す', '。'],
|
|
164
|
+
value: '-80',
|
|
122
165
|
},
|
|
123
166
|
],
|
|
124
167
|
}
|
|
@@ -131,12 +174,11 @@ typesetter.renderToSelector('.my-class')
|
|
|
131
174
|
|
|
132
175
|
| オプション名 | 説明 | 型 | デフォルト値 |
|
|
133
176
|
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------- | ------------ |
|
|
134
|
-
| `classNamePrefix` | ライブラリで使用される CSS クラス名のプレフィックスを指定します。 | `string` | `'typeset' ` |
|
|
135
177
|
| `useWordBreak` | 単語や助詞など、単語区切りでの改行を行います。 | `boolean` | `true` |
|
|
136
178
|
| `wrapLatin` | 英数を `span.typeset-latin` でラップします。<br>`useWordBreak` が `true` の場合にのみ有効です。 | `boolean` | `true` |
|
|
137
179
|
| `noSpaceBetweenNoBreaks` | 罫線などの分離禁則文字を `span.typeset-no-breaks` でラップし、文字間を 0 に設定します。<br>`useWordBreak` が `true` の場合にのみ有効です。 | `boolean` | `true` |
|
|
138
180
|
| `insertThinSpaces` | 四分アキスペースを自動で挿入します。 | `boolean` | `true` |
|
|
139
|
-
| `thinSpaceWidth` | 四分アキスペースの幅を設定します。<br>`insertThinSpaces` が `true` の場合にのみ有効です。 | `string` | `'
|
|
181
|
+
| `thinSpaceWidth` | 四分アキスペースの幅を設定します。<br>`insertThinSpaces` が `true` の場合にのみ有効です。 | `string` | `'100%' ` |
|
|
140
182
|
| `kerningRules` | 特定の文字間のカーニングルールを設定します。 | `{between: [string, string], value: string \| number}[]` | `[]` |
|
|
141
183
|
|
|
142
184
|
## Notes
|
|
@@ -148,9 +190,11 @@ Palt Typesetting ライブラリは、テキストを言語固有のセグメン
|
|
|
148
190
|
- Node.js: 16.0.0 以上
|
|
149
191
|
- ブラウザ: Intl.Segmenter をサポートしているブラウザ
|
|
150
192
|
|
|
151
|
-
クライアントサイドで実行する場合、この機能は一部のブラウザで利用できません。Palt Typesetting
|
|
193
|
+
クライアントサイドで実行する場合、この機能は一部のブラウザで利用できません。Palt Typesetting ライブラリは、Firefox などの `Intl.Segmenter` がサポートされていない環境[^1] では組版処理をスキップし、元のテキストをそのまま返します。全てのモダンブラウザで同様の見え方を再現するには、サーバーサイドでの処理(SSG など)が必要になります。
|
|
194
|
+
|
|
195
|
+
`Intl.Segmenter` の対応状況については、[Can I use...](https://caniuse.com/?search=Intl.Segmenter) で確認できます。
|
|
152
196
|
|
|
153
|
-
|
|
197
|
+
[^1]: Firefox では、バージョン 125 から Intl.Segmenter のサポートが予定されています。
|
|
154
198
|
|
|
155
199
|
### 注意事項
|
|
156
200
|
|
|
@@ -158,4 +202,4 @@ Palt Typesetting ライブラリは HTML 入力をサポートしていますが
|
|
|
158
202
|
|
|
159
203
|
## Author
|
|
160
204
|
|
|
161
|
-
飯塚 大和 (Yamato Iizuka)
|
|
205
|
+
[飯塚 大和 (Yamato Iizuka)](https://yamatoiizuka.com)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Typesetter=t():e.Typesetter=t()}(this,(()=>(()=>{var e={954:(e,t)=>{!function(e){"use strict";var t="undefined"!=typeof Uint8Array?Uint8Array:Array,r="+".charCodeAt(0),n="/".charCodeAt(0),u="0".charCodeAt(0),o="a".charCodeAt(0),a="A".charCodeAt(0),s="-".charCodeAt(0),i="_".charCodeAt(0);function A(e){var t=e.charCodeAt(0);return t===r||t===s?62:t===n||t===i?63:t<u?-1:t<u+10?t-u+26+26:t<a+26?t-a:t<o+26?t-o+26:void 0}e.toByteArray=function(e){var r,n,u,o,a,s;if(e.length%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var i=e.length;a="="===e.charAt(i-2)?2:"="===e.charAt(i-1)?1:0,s=new t(3*e.length/4-a),u=a>0?e.length-4:e.length;var c=0;function f(e){s[c++]=e}for(r=0,n=0;r<u;r+=4,n+=3)f((16711680&(o=A(e.charAt(r))<<18|A(e.charAt(r+1))<<12|A(e.charAt(r+2))<<6|A(e.charAt(r+3))))>>16),f((65280&o)>>8),f(255&o);return 2===a?f(255&(o=A(e.charAt(r))<<2|A(e.charAt(r+1))>>4)):1===a&&(f((o=A(e.charAt(r))<<10|A(e.charAt(r+1))<<4|A(e.charAt(r+2))>>2)>>8&255),f(255&o)),s},e.fromByteArray=function(e){var t,r,n,u,o=e.length%3,a="";function s(e){return"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(e)}for(t=0,n=e.length-o;t<n;t+=3)a+=s((u=r=(e[t]<<16)+(e[t+1]<<8)+e[t+2])>>18&63)+s(u>>12&63)+s(u>>6&63)+s(63&u);switch(o){case 1:a+=s((r=e[e.length-1])>>2),a+=s(r<<4&63),a+="==";break;case 2:a+=s((r=(e[e.length-2]<<8)+e[e.length-1])>>10),a+=s(r>>4&63),a+=s(r<<2&63),a+="="}return a}}(t)},297:(e,t,r)=>{"use strict";r.d(t,{A:()=>l});var n=r(601),u=r.n(n),o=r(314),a=r.n(o),s=r(417),i=r.n(s),A=new URL(r(539),r.b),c=a()(u()),f=i()(A);c.push([e.id,`@font-face {\n /* \n * カスタムフォント: 1/10000 UPM 幅のスペースとノンブレーキングスペースを定義。\n * 注意:完全なゼロ幅スペースを使用すると、Safari では letter-spacing が無視される。\n * @sharapeco による貢献に感謝します。{@link https://gist.github.com/sharapeco/1dd7f4433dad07648e1325e1fa5926ee}\n */\n font-family: ling-one;\n src: url(${f})\n format('woff2');\n}\n\n.typeset-word-break {\n word-break: keep-all;\n overflow-wrap: anywhere;\n}\n\n.typeset-thin-space,\n.typeset-kerning {\n font-family: ling-one; /* カスタムフォントのスペースを使用します。 */\n line-height: 0; /* 空白による行の高さの影響を無視します。 */\n letter-spacing: 0; /* 親要素から継承される letter-spacing の影響を無視します。 */\n user-select: none; /* ユーザーによるテキストのコピーを無効にします。 */\n}\n\n.typeset-no-breaks {\n letter-spacing: 0; /* 親要素から継承される letter-spacing の影響を無視します。 */\n}\n`,""]);const l=c},314:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var r="",n=void 0!==t[5];return t[4]&&(r+="@supports (".concat(t[4],") {")),t[2]&&(r+="@media ".concat(t[2]," {")),n&&(r+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),r+=e(t),n&&(r+="}"),t[2]&&(r+="}"),t[4]&&(r+="}"),r})).join("")},t.i=function(e,r,n,u,o){"string"==typeof e&&(e=[[null,e,void 0]]);var a={};if(n)for(var s=0;s<this.length;s++){var i=this[s][0];null!=i&&(a[i]=!0)}for(var A=0;A<e.length;A++){var c=[].concat(e[A]);n&&a[c[0]]||(void 0!==o&&(void 0===c[5]||(c[1]="@layer".concat(c[5].length>0?" ".concat(c[5]):""," {").concat(c[1],"}")),c[5]=o),r&&(c[2]?(c[1]="@media ".concat(c[2]," {").concat(c[1],"}"),c[2]=r):c[2]=r),u&&(c[4]?(c[1]="@supports (".concat(c[4],") {").concat(c[1],"}"),c[4]=u):c[4]="".concat(u)),t.push(c))}},t}},417:e=>{"use strict";e.exports=function(e,t){return t||(t={}),e?(e=String(e.__esModule?e.default:e),/^['"].*['"]$/.test(e)&&(e=e.slice(1,-1)),t.hash&&(e+=t.hash),/["'() \t\n]|(%20)/.test(e)||t.needQuotes?'"'.concat(e.replace(/"/g,'\\"').replace(/\n/g,"\\n"),'"'):e):e}},601:e=>{"use strict";e.exports=function(e){return e[1]}},72:e=>{"use strict";var t=[];function r(e){for(var r=-1,n=0;n<t.length;n++)if(t[n].identifier===e){r=n;break}return r}function n(e,n){for(var o={},a=[],s=0;s<e.length;s++){var i=e[s],A=n.base?i[0]+n.base:i[0],c=o[A]||0,f="".concat(A," ").concat(c);o[A]=c+1;var l=r(f),p={css:i[1],media:i[2],sourceMap:i[3],supports:i[4],layer:i[5]};if(-1!==l)t[l].references++,t[l].updater(p);else{var h=u(p,n);n.byIndex=s,t.splice(s,0,{identifier:f,updater:h,references:1})}a.push(f)}return a}function u(e,t){var r=t.domAPI(t);return r.update(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap&&t.supports===e.supports&&t.layer===e.layer)return;r.update(e=t)}else r.remove()}}e.exports=function(e,u){var o=n(e=e||[],u=u||{});return function(e){e=e||[];for(var a=0;a<o.length;a++){var s=r(o[a]);t[s].references--}for(var i=n(e,u),A=0;A<o.length;A++){var c=r(o[A]);0===t[c].references&&(t[c].updater(),t.splice(c,1))}o=i}}},659:e=>{"use strict";var t={};e.exports=function(e,r){var n=function(e){if(void 0===t[e]){var r=document.querySelector(e);if(window.HTMLIFrameElement&&r instanceof window.HTMLIFrameElement)try{r=r.contentDocument.head}catch(e){r=null}t[e]=r}return t[e]}(e);if(!n)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");n.appendChild(r)}},540:e=>{"use strict";e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},56:(e,t,r)=>{"use strict";e.exports=function(e){var t=r.nc;t&&e.setAttribute("nonce",t)}},825:e=>{"use strict";e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(r){!function(e,t,r){var n="";r.supports&&(n+="@supports (".concat(r.supports,") {")),r.media&&(n+="@media ".concat(r.media," {"));var u=void 0!==r.layer;u&&(n+="@layer".concat(r.layer.length>0?" ".concat(r.layer):""," {")),n+=r.css,u&&(n+="}"),r.media&&(n+="}"),r.supports&&(n+="}");var o=r.sourceMap;o&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(o))))," */")),t.styleTagTransform(n,e,t.options)}(t,e,r)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},113:e=>{"use strict";e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},741:e=>{function t(){this.table=new Uint16Array(16),this.trans=new Uint16Array(288)}function r(e,r){this.source=e,this.sourceIndex=0,this.tag=0,this.bitcount=0,this.dest=r,this.destLen=0,this.ltree=new t,this.dtree=new t}var n=new t,u=new t,o=new Uint8Array(30),a=new Uint16Array(30),s=new Uint8Array(30),i=new Uint16Array(30),A=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),c=new t,f=new Uint8Array(320);function l(e,t,r,n){var u,o;for(u=0;u<r;++u)e[u]=0;for(u=0;u<30-r;++u)e[u+r]=u/r|0;for(o=n,u=0;u<30;++u)t[u]=o,o+=1<<e[u]}var p=new Uint16Array(16);function h(e,t,r,n){var u,o;for(u=0;u<16;++u)e.table[u]=0;for(u=0;u<n;++u)e.table[t[r+u]]++;for(e.table[0]=0,o=0,u=0;u<16;++u)p[u]=o,o+=e.table[u];for(u=0;u<n;++u)t[r+u]&&(e.trans[p[t[r+u]]++]=u)}function d(e){e.bitcount--||(e.tag=e.source[e.sourceIndex++],e.bitcount=7);var t=1&e.tag;return e.tag>>>=1,t}function b(e,t,r){if(!t)return r;for(;e.bitcount<24;)e.tag|=e.source[e.sourceIndex++]<<e.bitcount,e.bitcount+=8;var n=e.tag&65535>>>16-t;return e.tag>>>=t,e.bitcount-=t,n+r}function v(e,t){for(;e.bitcount<24;)e.tag|=e.source[e.sourceIndex++]<<e.bitcount,e.bitcount+=8;var r=0,n=0,u=0,o=e.tag;do{n=2*n+(1&o),o>>>=1,++u,r+=t.table[u],n-=t.table[u]}while(n>=0);return e.tag=o,e.bitcount-=u,t.trans[r+n]}function y(e,t,r){var n,u,o,a,s,i;for(n=b(e,5,257),u=b(e,5,1),o=b(e,4,4),a=0;a<19;++a)f[a]=0;for(a=0;a<o;++a){var l=b(e,3,0);f[A[a]]=l}for(h(c,f,0,19),s=0;s<n+u;){var p=v(e,c);switch(p){case 16:var d=f[s-1];for(i=b(e,2,3);i;--i)f[s++]=d;break;case 17:for(i=b(e,3,3);i;--i)f[s++]=0;break;case 18:for(i=b(e,7,11);i;--i)f[s++]=0;break;default:f[s++]=p}}h(t,f,0,n),h(r,f,n,u)}function g(e,t,r){for(;;){var n,u,A,c,f=v(e,t);if(256===f)return 0;if(f<256)e.dest[e.destLen++]=f;else for(n=b(e,o[f-=257],a[f]),u=v(e,r),c=A=e.destLen-b(e,s[u],i[u]);c<A+n;++c)e.dest[e.destLen++]=e.dest[c]}}function D(e){for(var t,r;e.bitcount>8;)e.sourceIndex--,e.bitcount-=8;if((t=256*(t=e.source[e.sourceIndex+1])+e.source[e.sourceIndex])!==(65535&~(256*e.source[e.sourceIndex+3]+e.source[e.sourceIndex+2])))return-3;for(e.sourceIndex+=4,r=t;r;--r)e.dest[e.destLen++]=e.source[e.sourceIndex++];return e.bitcount=0,0}!function(e,t){var r;for(r=0;r<7;++r)e.table[r]=0;for(e.table[7]=24,e.table[8]=152,e.table[9]=112,r=0;r<24;++r)e.trans[r]=256+r;for(r=0;r<144;++r)e.trans[24+r]=r;for(r=0;r<8;++r)e.trans[168+r]=280+r;for(r=0;r<112;++r)e.trans[176+r]=144+r;for(r=0;r<5;++r)t.table[r]=0;for(t.table[5]=32,r=0;r<32;++r)t.trans[r]=r}(n,u),l(o,a,4,3),l(s,i,2,1),o[28]=0,a[28]=258,e.exports=function(e,t){var o,a,s=new r(e,t);do{switch(o=d(s),b(s,2,0)){case 0:a=D(s);break;case 1:a=g(s,n,u);break;case 2:y(s,s.ltree,s.dtree),a=g(s,s.ltree,s.dtree);break;default:a=-3}if(0!==a)throw new Error("Data error")}while(!o);return s.destLen<s.dest.length?"function"==typeof s.dest.slice?s.dest.slice(0,s.destLen):s.dest.subarray(0,s.destLen):s.dest}},667:(e,t,r)=>{const n=r(741),{swap32LE:u}=r(288);e.exports=class{constructor(e){const t="function"==typeof e.readUInt32BE&&"function"==typeof e.slice;if(t||e instanceof Uint8Array){let r;if(t)this.highStart=e.readUInt32LE(0),this.errorValue=e.readUInt32LE(4),r=e.readUInt32LE(8),e=e.slice(12);else{const t=new DataView(e.buffer);this.highStart=t.getUint32(0,!0),this.errorValue=t.getUint32(4,!0),r=t.getUint32(8,!0),e=e.subarray(12)}e=n(e,new Uint8Array(r)),e=n(e,new Uint8Array(r)),u(e),this.data=new Uint32Array(e.buffer)}else({data:this.data,highStart:this.highStart,errorValue:this.errorValue}=e)}get(e){let t;return e<0||e>1114111?this.errorValue:e<55296||e>56319&&e<=65535?(t=(this.data[e>>5]<<2)+(31&e),this.data[t]):e<=65535?(t=(this.data[2048+(e-55296>>5)]<<2)+(31&e),this.data[t]):e<this.highStart?(t=this.data[2080+(e>>11)],t=this.data[t+(e>>5&63)],t=(t<<2)+(31&e),this.data[t]):this.data[this.data.length-4]}}},288:e=>{const t=18===new Uint8Array(new Uint32Array([305419896]).buffer)[0],r=(e,t,r)=>{let n=e[t];e[t]=e[r],e[r]=n};e.exports={swap32LE:e=>{t&&(e=>{const t=e.length;for(let n=0;n<t;n+=4)r(e,n,n+3),r(e,n+1,n+2)})(e)}}},539:e=>{"use strict";e.exports="data:font/woff2;base64,AAEAAAAKAIAAAwAgT1MvMhG03xcAAAEoAAAAYGNtYXAADABzAAABkAAAADRnbHlmJAM2GwAAAcwAAAAYaGVhZCLbfFwAAACsAAAANmhoZWEnEvkrAAAA5AAAACRobXR4AAEAAAAAAYgAAAAIbG9jYQAMABgAAAHEAAAACG1heHAAcQAiAAABCAAAACBuYW1lBbsdPAAAAeQAAACKcG9zdHQrY6cAAAJwAAAALQABAAAAAQAAsWqD8F8PPPUAAycQAAAAAOHcugAAAAAA4edeTwAAAAAAAQABAAAABwACAAAAAAAAAAEAACcQ+DAAAAB9AAAAfAABAAEAAAAAAAAAAAAAAAAAAAABAAEAAAADAAMAAQAAAAAAAQACAB4ABgAAAGQAAAAAAAAAAwB9AZAABQAIGWQXcAAAAu4ZZBdwAAANrAAyC7gAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc3N6bQBAACAAIB9A+DAH0CcQB9AAAAABAAAAABOIG1gAAAAgAAAAAQAAAAAAAAAAAAIAAAADAAAAFAADAAEAAAAUAAQAIAAAAAQABAABAAAAIP//AAAAIP///+EAAQAAAAAAAAAMAAwADAABAAAAAAABAAEAAgAANRcjAQEBAQAAAAAAAAYATgADAAEECQABAAgAAAADAAEECQACAAIACAADAAEECQADAB4ACgADAAEECQAEAAwAKAADAAEECQAFAAgANAADAAEECQAGAAwAKABMAGkAbgBnADEAMQAuADAAOwBzAHMAegBtADsATABpAG4AZwAtADEATABpAG4AZwAtADEAdgAxAC4AMAAAAAIAAAAAAAD/tQAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMBAgRuYnNwAAAA"}},t={};function r(n){var u=t[n];if(void 0!==u)return u.exports;var o=t[n]={id:n,exports:{}};return e[n](o,o.exports,r),o.exports}r.m=e,r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.b=document.baseURI||self.location.href,r.nc=void 0;var n={};return(()=>{"use strict";r.d(n,{default:()=>ae});var e=window;function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t(e)}function u(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,o(n.key),n)}}function o(e){var r=function(e,r){if("object"!=t(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var u=n.call(e,"string");if("object"!=t(u))return u;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==t(r)?r:String(r)}var a,s=function(){function t(r,n){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),this.replaceNode=function(t,r){var n=e.document.createRange();n.selectNode(t);var u=n.createContextualFragment(r);t.parentNode&&(t.parentNode.insertBefore(u,t),t.parentNode.removeChild(t))},this.transformFunctions=r,this.options=n}var r,n;return r=t,(n=[{key:"processHtmlWithFunctions",value:function(e){var t=this;return""===e?e:this.transformFunctions.reduce((function(e,r){return t.processHtml(e,r)}),e)}},{key:"processHtml",value:function(e,t){var r=this;if(""===e)return e;var n=i(e),u=A(n.body);return u.forEach((function(e,n){var o=u[n+1]||null,a=r.getTransformedHtml(e,o,t);r.replaceNode(e,a)})),n.body.innerHTML}},{key:"getTransformedHtml",value:function(e,t,r){return r(e.nodeValue||"",t&&t.nodeValue||"",this.options)}}])&&u(r.prototype,n),Object.defineProperty(r,"prototype",{writable:!1}),t}(),i=function(t){return(new e.DOMParser).parseFromString(t,"text/html")},A=function(t){for(var r=e.document.createTreeWalker(t,e.NodeFilter.SHOW_TEXT),n=r.nextNode(),u=[];n;)n.nodeValue&&""!==n.nodeValue.trim()&&u.push(n),n=r.nextNode();return u},c=s,f=r(667),l=r(954);const p=[[4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,4,4,4,4,4,4,4,4,4,4,4],[0,4,4,1,1,4,4,4,4,1,1,0,0,0,0,1,1,1,0,0,4,2,4,0,0,0,0,0,0,0,0,1,0],[0,4,4,1,1,4,4,4,4,1,1,1,1,1,0,1,1,1,0,0,4,2,4,0,0,0,0,0,0,0,0,1,0],[4,4,4,1,1,1,4,4,4,1,1,1,1,1,1,1,1,1,1,1,4,2,4,1,1,1,1,1,1,1,1,1,1],[1,4,4,1,1,1,4,4,4,1,1,1,1,1,1,1,1,1,1,1,4,2,4,1,1,1,1,1,1,1,1,1,1],[0,4,4,1,1,1,4,4,4,0,0,0,0,0,0,1,1,1,0,0,4,2,4,0,0,0,0,0,0,0,0,1,0],[0,4,4,1,1,1,4,4,4,0,0,0,0,0,0,1,1,1,0,0,4,2,4,0,0,0,0,0,0,0,0,1,0],[0,4,4,1,1,1,4,4,4,0,0,1,0,1,0,1,1,1,0,0,4,2,4,0,0,0,0,0,0,0,0,1,0],[0,4,4,1,1,1,4,4,4,0,0,1,1,1,0,1,1,1,0,0,4,2,4,0,0,0,0,0,0,0,0,1,0],[1,4,4,1,1,1,4,4,4,0,0,1,1,1,1,1,1,1,0,0,4,2,4,1,1,1,1,1,0,1,1,1,0],[1,4,4,1,1,1,4,4,4,0,0,1,1,1,0,1,1,1,0,0,4,2,4,0,0,0,0,0,0,0,0,1,0],[1,4,4,1,1,1,4,4,4,1,1,1,1,1,0,1,1,1,0,0,4,2,4,0,0,0,0,0,0,0,0,1,0],[1,4,4,1,1,1,4,4,4,1,1,1,1,1,0,1,1,1,0,0,4,2,4,0,0,0,0,0,0,0,0,1,0],[1,4,4,1,1,1,4,4,4,1,1,1,1,1,0,1,1,1,0,0,4,2,4,0,0,0,0,0,0,0,0,1,0],[0,4,4,1,1,1,4,4,4,0,1,0,0,0,0,1,1,1,0,0,4,2,4,0,0,0,0,0,0,0,0,1,0],[0,4,4,1,1,1,4,4,4,0,0,0,0,0,0,1,1,1,0,0,4,2,4,0,0,0,0,0,0,0,0,1,0],[0,4,4,1,0,1,4,4,4,0,0,1,0,0,0,1,1,1,0,0,4,2,4,0,0,0,0,0,0,0,0,1,0],[0,4,4,1,0,1,4,4,4,0,0,0,0,0,0,1,1,1,0,0,4,2,4,0,0,0,0,0,0,0,0,1,0],[1,4,4,1,1,1,4,4,4,1,1,1,1,1,1,1,1,1,1,1,4,2,4,1,1,1,1,1,1,1,1,1,0],[0,4,4,1,1,1,4,4,4,0,0,0,0,0,0,1,1,1,0,4,4,2,4,0,0,0,0,0,0,0,0,1,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0],[1,4,4,1,1,1,4,4,4,1,1,1,1,1,0,1,1,1,0,0,4,2,4,0,0,0,0,0,0,0,0,1,0],[1,4,4,1,1,1,4,4,4,1,1,1,1,1,1,1,1,1,1,1,4,2,4,1,1,1,1,1,1,1,1,1,1],[0,4,4,1,1,1,4,4,4,0,1,0,0,0,0,1,1,1,0,0,4,2,4,0,0,0,1,1,0,0,0,1,0],[0,4,4,1,1,1,4,4,4,0,1,0,0,0,0,1,1,1,0,0,4,2,4,0,0,0,0,1,0,0,0,1,0],[0,4,4,1,1,1,4,4,4,0,1,0,0,0,0,1,1,1,0,0,4,2,4,1,1,1,1,0,0,0,0,1,0],[0,4,4,1,1,1,4,4,4,0,1,0,0,0,0,1,1,1,0,0,4,2,4,0,0,0,1,1,0,0,0,1,0],[0,4,4,1,1,1,4,4,4,0,1,0,0,0,0,1,1,1,0,0,4,2,4,0,0,0,0,1,0,0,0,1,0],[0,4,4,1,1,1,4,4,4,0,0,0,0,0,0,1,1,1,0,0,4,2,4,0,0,0,0,0,1,0,0,1,0],[0,4,4,1,1,1,4,4,4,0,1,0,0,0,0,1,1,1,0,0,4,2,4,0,0,0,0,0,0,0,1,1,0],[0,4,4,1,1,1,4,4,4,0,1,0,0,0,0,1,1,1,0,0,4,2,4,0,0,0,0,0,0,0,0,1,0],[1,4,4,1,1,1,4,4,4,1,1,1,1,1,0,1,1,1,0,0,4,2,4,0,0,0,0,0,0,0,0,1,0],[0,4,4,1,1,0,4,4,4,0,0,0,0,0,0,0,0,0,0,0,4,2,4,0,0,0,0,0,0,0,0,1,0]],h=new f(l.toByteArray("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")),d=function(e){switch(e){case 33:case 39:case 40:case 42:return 12;case 35:return 5;default:return e}},b=function(e){switch(e){case 37:case 38:return 34;case 41:return 22;default:return e}};class v{constructor(e,t=!1){this.position=e,this.required=t}}a=class{nextCodePoint(){const e=this.string.charCodeAt(this.pos++),t=this.string.charCodeAt(this.pos);return 55296<=e&&e<=56319&&56320<=t&&t<=57343?(this.pos++,1024*(e-55296)+(t-56320)+65536):e}nextCharClass(){return d(h.get(this.nextCodePoint()))}getSimpleBreak(){switch(this.nextClass){case 41:return!1;case 34:case 37:case 38:return this.curClass=34,!1;case 36:return this.curClass=36,!1}return null}getPairTableBreak(e){let t=!1;switch(p[this.curClass][this.nextClass]){case 0:t=!0;break;case 1:t=41===e;break;case 2:if(t=41===e,!t)return t=!1,t;break;case 3:if(41!==e)return t}return this.LB8a&&(t=!1),!this.LB21a||16!==this.curClass&&17!==this.curClass?this.LB21a=13===this.curClass:(t=!1,this.LB21a=!1),28===this.curClass?(this.LB30a++,2==this.LB30a&&28===this.nextClass&&(t=!0,this.LB30a=0)):this.LB30a=0,this.curClass=this.nextClass,t}nextBreak(){if(null==this.curClass){let e=this.nextCharClass();this.curClass=b(e),this.nextClass=e,this.LB8a=31===e,this.LB30a=0}for(;this.pos<this.string.length;){this.lastPos=this.pos;const e=this.nextClass;if(this.nextClass=this.nextCharClass(),34===this.curClass||36===this.curClass&&37!==this.nextClass)return this.curClass=b(d(this.nextClass)),new v(this.lastPos,!0);let t=this.getSimpleBreak();if(null===t&&(t=this.getPairTableBreak(e)),this.LB8a=31===this.nextClass,t)return new v(this.lastPos)}return this.lastPos<this.string.length?(this.lastPos=this.string.length,new v(this.string.length)):null}constructor(e){this.string=e,this.pos=0,this.lastPos=0,this.curClass=null,this.nextClass=null,this.LB8a=!1,this.LB21a=!1,this.LB30a=0}};var y=/(?:[\t-\r -~\xA0-\xA5\xAA\xAC\xB1-\xB3\xB9\xBA\xBF-\u02B8\u02E0-\u02E4\u0363-\u036F\u0485\u0486\u0951\u0952\u10FB\u1680\u1D00-\u1D25\u1D2C-\u1D5C\u1D62-\u1D65\u1D6B-\u1D77\u1D79-\u1DBE\u1E00-\u1EFF\u2000-\u200A\u2018\u2019\u201C\u201D\u2028\u2029\u202F\u2030\u205F\u2070\u2071\u2074-\u208E\u2090-\u209C\u20AC\u20F0\u212A\u212B\u2132\u214E\u2160-\u2188\u2202\u2205\u220F\u2211\u2212\u221A\u221E\u222B\u2248\u2260\u2264\u2265\u2C60-\u2C7F\u3000\uA700-\uA707\uA722-\uA787\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA7FF\uA92E\uAB30-\uAB5A\uAB5C-\uAB64\uAB66-\uAB69\uFB00-\uFB06\uFEFF\uFF21-\uFF3A\uFF41-\uFF5A]|\uD801[\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A])+/,g=/(?:[\|\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u3001-\u3003\u3005-\u3011\u3013-\u301F\u3021-\u302D\u3030-\u3035\u3037-\u303F\u3041-\u3096\u3099-\u30FF\u3190-\u319F\u31C0-\u31E3\u31F0-\u31FF\u3220-\u3247\u3280-\u32B0\u32C0-\u32CB\u32D0-\u3370\u337B-\u337F\u33E0-\u33FE\u3400-\u4DBF\u4E00-\u9FFF\uA700-\uA707\uF900-\uFA6D\uFA70-\uFAD9\uFE45\uFE46\uFF61-\uFF9F]|\uD81B[\uDFE2\uDFE3\uDFF0\uDFF1]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67]|\uD834[\uDF60-\uDF71]|\uD83C[\uDE00\uDE50\uDE51]|[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD887][\uDC00-\uDFFF]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF39\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0\uDFF0-\uDFFF]|\uD87B[\uDC00-\uDE5D]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD888[\uDC00-\uDFAF])+/,D=/(|[|{|〔|〈|《|「|『|【|〘|〖|“|‘/,m=/)|]|}|〕|〉|》|」|』|】|〙|〗|”|’/,F=/・|:|;/,w=/、|,/,B=/。|./,C=new RegExp("[".concat("—‥…_",String.fromCharCode(9472),"-").concat(String.fromCharCode(9599),"]+")),E={isLatin:function(e){return y.test(e)},isJapanese:function(e){return g.test(e)},hasLanguageTransition:function(e,t){return E.isJapanese(e)!==E.isJapanese(t)},shouldAddThinSpace:function(e,t){return E.hasLanguageTransition(e,t)&&(r=t,!new RegExp("^[".concat(B.source).concat(w.source,"]")).test(r));var r}},P=r(72),x=r.n(P),S=r(825),O=r.n(S),L=r(659),j=r.n(L),H=r(56),T=r.n(H),k=r(540),X=r.n(k),I=r(113),U=r.n(I),W=r(297),z={};z.styleTagTransform=U(),z.setAttributes=T(),z.insert=j().bind(null,"head"),z.domAPI=O(),z.insertStyleElement=X(),x()(W.A,z),W.A&&W.A.locals&&W.A.locals;var N=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",n=arguments.length>3&&void 0!==arguments[3]&&arguments[3],u=r?' style="'.concat(r,'"'):"",o=n?' aria-hidden="true" data-nosnippet=""':"";return'<span class="'.concat(t,'"').concat(u).concat(o,">").concat(e,"</span>")},V=function(e){var t=new Intl.Segmenter("ja-JP",{granularity:"word"});return Array.from(t.segment(e),(function(e){return e.segment}))},Q=function(e,t){return E.shouldAddThinSpace(e,t)||function(e,t){for(var r=new RegExp("(".concat(m.source,"|").concat(w.source,"|").concat(B.source,")")),n={spaceBefore:{regex:D,hasSpaceBefore:!0,hasSpaceAfter:!1},spaceAfter:{regex:r,hasSpaceBefore:!1,hasSpaceAfter:!0},spaceBoth:{regex:F,hasSpaceBefore:!0,hasSpaceAfter:!0}},u=0,o=Object.values(n);u<o.length;u++){var a=o[u],s=a.regex,i=a.hasSpaceBefore,A=a.hasSpaceAfter;if(i&&s.test(t)&&!s.test(e))return!0;if(A&&s.test(e)&&!s.test(t))return!0}return!1}(e,t)},M=function(e,t){var r=e.slice(-1)+t.slice(0,1),n=new a(r).nextBreak();return!!n&&1===n.position},Z=function(e,t,r){var n=V(e),u=V(t);return n.reduce((function(e,t,n,o){return e+function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>2?arguments[2]:void 0;if(!t)return e;var n=r.insertThinSpaces&&Q(e,t),u=M(e,t);return n?e+function(e,t){var r=t?" ":" ",n="letter-spacing: ".concat(e,";");return N(r,"typeset-thin-space",n,!0)}(r.thinSpaceWidth,u):r.useWordBreak&&u?e+"<wbr>":e}(t,o[n+1]||u[0],r)}),"")};function R(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var G=function(e,t,r){return" "===e?e:(n=e,u="typeset",o=r.useWordBreak?"".concat(u," ").concat("typeset-word-break"):u,N(n,o));var n,u,o},q=function(e,t,r){return" "===e?e:r.wrapLatin&&E.isLatin(e)?e.replace(y,(function(e){return N(e,"typeset-latin")})):r.noSpaceBetweenNoBreaks&&(n=e,C.test(n))?e.replace(C,(function(e){return N(e,"typeset-no-breaks")})):e;var n},K=function(e,t,r){var n,u=function(e){if(Array.isArray(e))return R(e)}(n=e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(n)||function(e,t){if(e){if("string"==typeof e)return R(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?R(e,t):void 0}}(n)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}();return u.map((function(e,n){var o=u[n+1]||t[0]||"",a=r.kerningRules.find((function(t){return t.between[0]===e&&t.between[1]===o}));if(a){var s="number"==typeof a.value?a.value:parseInt(a.value,10),i=!r.useWordBreak&&M(e,o);return e+function(e,t){if(0===e)return"";var r="typeset-kerning";if(e<0){var n="margin: ".concat(e/1e3/2+"em",";");return N("",r,n,!0)}var u=t?" ":" ",o="letter-spacing: ".concat(e/1e3+"em",";");return N(u,r,o,!0)}(s,i)}return e})).join("")};function J(e){return J="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},J(e)}function Y(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function _(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?Y(Object(r),!0).forEach((function(t){var n,u,o;n=e,u=t,o=r[t],(u=ee(u))in n?Object.defineProperty(n,u,{value:o,enumerable:!0,configurable:!0,writable:!0}):n[u]=o})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):Y(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function $(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,ee(n.key),n)}}function ee(e){var t=function(e,t){if("object"!=J(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,"string");if("object"!=J(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==J(t)?t:String(t)}function te(e,t,r){return t=ne(t),function(e,t){if(t&&("object"===J(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,re()?Reflect.construct(t,r||[],ne(e).constructor):t.apply(e,r))}function re(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(re=function(){return!!e})()}function ne(e){return ne=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},ne(e)}function ue(e,t){return ue=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},ue(e,t)}var oe=function(t){function r(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,r);var n=[G,Z,q,K],u=r.validateOptions(t);return(e=te(this,r,[n,u])).isIntlSegmenterSupported=void 0!==Intl.Segmenter,e.isIntlSegmenterSupported||console.warn("\n Intl.Segmenter is not supported in this environment. \n The original HTML string will be returned. \n For more information, see: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter\n "),e}var n,u,o;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&ue(e,t)}(r,t),n=r,o=[{key:"getDefaultOptions",value:function(){return{useWordBreak:!0,wrapLatin:!0,noSpaceBetweenNoBreaks:!0,insertThinSpaces:!0,thinSpaceWidth:"0.2em",kerningRules:[]}}},{key:"validateOptions",value:function(e){return e.kerningRules&&(e.kerningRules=e.kerningRules.filter(r.isValidKerningRule)),_(_({},r.getDefaultOptions()),e)}},{key:"isValidKerningRule",value:function(e){return 1===e.between[0].length&&1===e.between[1].length||(console.warn("Kerning rule between '".concat(e.between[0],"' and '").concat(e.between[1],"' must be single characters.")),!1)}}],(u=[{key:"render",value:function(e){return this.isIntlSegmenterSupported&&e?this.processHtmlWithFunctions(e):e}},{key:"renderToElements",value:function(e){var t=this;this.isIntlSegmenterSupported&&e&&(Array.isArray(e)||(e=[e]),e.forEach((function(e){var r=t.render(e.innerHTML);e.innerHTML=r})))}},{key:"renderToSelector",value:function(t){if(this.isIntlSegmenterSupported&&t){var r=e.document.querySelectorAll(t);this.renderToElements(Array.from(r))}}}])&&$(n.prototype,u),o&&$(n,o),Object.defineProperty(n,"prototype",{writable:!1}),r}(c),ae=oe})(),n.default})()));
|
package/dist/apply-style.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { TypesettingOptions } from '
|
|
1
|
+
import { TypesettingOptions } from '../types';
|
|
2
2
|
declare const applyStyleToText: (currentNodeValue: string, nextNodeValue: string, options: TypesettingOptions) => string;
|
|
3
3
|
declare const applyStyleToSegment: (currentSegment: string, nextSegment: string, options: TypesettingOptions) => string;
|
|
4
|
-
|
|
4
|
+
declare const applyKerningToSegment: (currentSegment: string, nextSegment: string, options: TypesettingOptions) => string;
|
|
5
|
+
export { applyStyleToText, applyStyleToSegment, applyKerningToSegment };
|
|
5
6
|
//# sourceMappingURL=apply-style.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply-style.d.ts","sourceRoot":"","sources":["../src/apply-style.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"apply-style.d.ts","sourceRoot":"","sources":["../src/apply-style.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAQ7C,QAAA,MAAM,gBAAgB,qBAAsB,MAAM,iBAAiB,MAAM,WAAW,kBAAkB,KAAG,MAOxG,CAAA;AAUD,QAAA,MAAM,mBAAmB,mBAAoB,MAAM,eAAe,MAAM,WAAW,kBAAkB,KAAG,MAiBvG,CAAA;AAUD,QAAA,MAAM,qBAAqB,mBAAoB,MAAM,eAAe,MAAM,WAAW,kBAAkB,KAAG,MAmBzG,CAAA;AAED,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,CAAA"}
|
package/dist/apply-style.js
CHANGED
|
@@ -1,40 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const utils_tags_1 = require("./utils-tags");
|
|
1
|
+
import { isBreakable } from "./insert-separators";
|
|
2
|
+
import { CharClass, LanguageClass } from "./util-text-classes";
|
|
3
|
+
import { applyWrapperStyle, applyLatinStyle, applyNoBreaksStyle, createKerning } from "./util-tags";
|
|
4
|
+
import * as util from "./util-regex";
|
|
6
5
|
const applyStyleToText = (currentNodeValue, nextNodeValue, options) => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
if (currentNodeValue === " ") {
|
|
7
|
+
return currentNodeValue;
|
|
8
|
+
}
|
|
9
|
+
return applyWrapperStyle(currentNodeValue, options.useWordBreak);
|
|
11
10
|
};
|
|
12
|
-
exports.applyStyleToText = applyStyleToText;
|
|
13
11
|
const applyStyleToSegment = (currentSegment, nextSegment, options) => {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
return kernedSegment;
|
|
12
|
+
if (currentSegment === " ") {
|
|
13
|
+
return currentSegment;
|
|
14
|
+
}
|
|
15
|
+
if (options.wrapLatin && LanguageClass.isLatin(currentSegment)) {
|
|
16
|
+
return currentSegment.replace(util.latinRegex, (match) => applyLatinStyle(match));
|
|
17
|
+
}
|
|
18
|
+
if (options.noSpaceBetweenNoBreaks && CharClass.shouldNotBreak(currentSegment)) {
|
|
19
|
+
return currentSegment.replace(util.noBreakRulesRegex, (match) => applyNoBreaksStyle(match));
|
|
20
|
+
}
|
|
21
|
+
return currentSegment;
|
|
25
22
|
};
|
|
26
|
-
exports.applyStyleToSegment = applyStyleToSegment;
|
|
27
23
|
const applyKerningToSegment = (currentSegment, nextSegment, options) => {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
24
|
+
const chars = [...currentSegment];
|
|
25
|
+
const kernedChars = chars.map((currentChar, i) => {
|
|
26
|
+
const nextChar = chars[i + 1] || nextSegment[0] || "";
|
|
27
|
+
const kerningRule = options.kerningRules.find(
|
|
28
|
+
(rule) => rule.between[0] === currentChar && rule.between[1] === nextChar
|
|
29
|
+
);
|
|
30
|
+
if (kerningRule) {
|
|
31
|
+
const kerningValue = typeof kerningRule.value === "number" ? kerningRule.value : parseInt(kerningRule.value, 10);
|
|
32
|
+
const breakable = options.useWordBreak ? false : isBreakable(currentChar, nextChar);
|
|
33
|
+
return currentChar + createKerning(kerningValue, breakable);
|
|
34
|
+
}
|
|
35
|
+
return currentChar;
|
|
36
|
+
});
|
|
37
|
+
return kernedChars.join("");
|
|
38
|
+
};
|
|
39
|
+
export {
|
|
40
|
+
applyKerningToSegment,
|
|
41
|
+
applyStyleToSegment,
|
|
42
|
+
applyStyleToText
|
|
39
43
|
};
|
|
40
|
-
//# sourceMappingURL=apply-style.js.map
|
package/dist/html-processor.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-processor.d.ts","sourceRoot":"","sources":["../src/html-processor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"html-processor.d.ts","sourceRoot":"","sources":["../src/html-processor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAOrE,cAAM,aAAa;IACjB,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,OAAO,CAAoB;gBAEvB,kBAAkB,EAAE,iBAAiB,EAAE,EAAE,OAAO,EAAE,kBAAkB;IAahF,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAmBjD,OAAO,CAAC,WAAW;IAyBnB,OAAO,CAAC,kBAAkB;IAe1B,OAAO,CAAC,WAAW,CASlB;CACF;AAQD,QAAA,MAAM,eAAe,SAAU,MAAM,aAEpC,CAAA;AAQD,QAAA,MAAM,YAAY,YAAa,WAAW,KAAG,IAAI,EAahD,CAAA;AAED,eAAe,aAAa,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,CAAA"}
|
package/dist/html-processor.js
CHANGED
|
@@ -1,64 +1,97 @@
|
|
|
1
|
-
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.getTextNodes = exports.parseFromString = void 0;
|
|
7
|
-
const win_1 = __importDefault(require("./win"));
|
|
1
|
+
import win from "./win";
|
|
8
2
|
class HTMLProcessor {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
3
|
+
constructor(transformFunctions, options) {
|
|
4
|
+
/**
|
|
5
|
+
* 指定されたノードを、新しいHTMLコンテンツで置き換えます。
|
|
6
|
+
*
|
|
7
|
+
* @param node - 置き換えるノード。
|
|
8
|
+
* @param transformedHtml - ノードに挿入される変換後のHTMLコンテンツ。
|
|
9
|
+
*/
|
|
10
|
+
this.replaceNode = (node, transformedHtml) => {
|
|
11
|
+
const range = win.document.createRange();
|
|
12
|
+
range.selectNode(node);
|
|
13
|
+
const fragment = range.createContextualFragment(transformedHtml);
|
|
14
|
+
if (node.parentNode) {
|
|
15
|
+
node.parentNode.insertBefore(fragment, node);
|
|
16
|
+
node.parentNode.removeChild(node);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
this.transformFunctions = transformFunctions;
|
|
20
|
+
this.options = options;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 与えられたHTML文字列に対して、指定された変換関数の配列を順番に適用し、
|
|
24
|
+
* 変換されたHTMLを生成します。
|
|
25
|
+
*
|
|
26
|
+
* @param srcHtml - 変換を適用する元のHTML文字列。
|
|
27
|
+
* @param functions - 順番に適用する変換関数の配列。
|
|
28
|
+
* @return 変換後のHTML文字列。
|
|
29
|
+
*/
|
|
30
|
+
processHtmlWithFunctions(srcHtml) {
|
|
31
|
+
if (srcHtml === "") {
|
|
32
|
+
return srcHtml;
|
|
27
33
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
34
|
+
return this.transformFunctions.reduce(
|
|
35
|
+
(currentHtml, transformFunction) => this.processHtml(currentHtml, transformFunction),
|
|
36
|
+
srcHtml
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* HTML文字列を解析し、特定の変換関数を使用してその内容を変換し、
|
|
41
|
+
* 変換されたHTMLを文字列として返します。
|
|
42
|
+
*
|
|
43
|
+
* @param html - 解析および変換するHTML文字列。
|
|
44
|
+
* @param transformFunction - 各テキストノードに適用される変換関数。
|
|
45
|
+
* @return 変換後のHTML内容を含む文字列。テキストが空の場合は、そのまま返されます。
|
|
46
|
+
*/
|
|
47
|
+
processHtml(html, transformFunction) {
|
|
48
|
+
if (html === "") {
|
|
49
|
+
return html;
|
|
44
50
|
}
|
|
51
|
+
const doc = parseFromString(html);
|
|
52
|
+
const textNodes = getTextNodes(doc.body);
|
|
53
|
+
textNodes.forEach((currentNode, index) => {
|
|
54
|
+
const nextNode = textNodes[index + 1] || null;
|
|
55
|
+
const transformedHtml = this.getTransformedHtml(currentNode, nextNode, transformFunction);
|
|
56
|
+
this.replaceNode(currentNode, transformedHtml);
|
|
57
|
+
});
|
|
58
|
+
return doc.body.innerHTML;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 与えられたノードと、その次のノードに基づいて変換されたHTMLを生成します。
|
|
62
|
+
*
|
|
63
|
+
* @param currentNode - 現在のノード。
|
|
64
|
+
* @param nextNode - 次のノード、または存在しない場合は null。
|
|
65
|
+
* @param transformFunction - ノードの値を変換するための関数。
|
|
66
|
+
* @return 変換されたHTMLコンテンツを含む文字列。
|
|
67
|
+
*/
|
|
68
|
+
getTransformedHtml(currentNode, nextNode, transformFunction) {
|
|
69
|
+
const transformedHtml = transformFunction(
|
|
70
|
+
currentNode.nodeValue || "",
|
|
71
|
+
nextNode ? nextNode.nodeValue || "" : "",
|
|
72
|
+
this.options
|
|
73
|
+
);
|
|
74
|
+
return transformedHtml;
|
|
75
|
+
}
|
|
45
76
|
}
|
|
46
77
|
const parseFromString = (html) => {
|
|
47
|
-
|
|
78
|
+
return new win.DOMParser().parseFromString(html, "text/html");
|
|
48
79
|
};
|
|
49
|
-
exports.parseFromString = parseFromString;
|
|
50
80
|
const getTextNodes = (element) => {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
textNode = walk.nextNode();
|
|
81
|
+
const walk = win.document.createTreeWalker(element, win.NodeFilter.SHOW_TEXT);
|
|
82
|
+
let textNode = walk.nextNode();
|
|
83
|
+
const textNodes = [];
|
|
84
|
+
while (textNode) {
|
|
85
|
+
if (textNode.nodeValue && textNode.nodeValue.trim() !== "") {
|
|
86
|
+
textNodes.push(textNode);
|
|
59
87
|
}
|
|
60
|
-
|
|
88
|
+
textNode = walk.nextNode();
|
|
89
|
+
}
|
|
90
|
+
return textNodes;
|
|
91
|
+
};
|
|
92
|
+
var html_processor_default = HTMLProcessor;
|
|
93
|
+
export {
|
|
94
|
+
html_processor_default as default,
|
|
95
|
+
getTextNodes,
|
|
96
|
+
parseFromString
|
|
61
97
|
};
|
|
62
|
-
exports.getTextNodes = getTextNodes;
|
|
63
|
-
exports.default = HTMLProcessor;
|
|
64
|
-
//# sourceMappingURL=html-processor.js.map
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import HTMLProcessor from './html-processor';
|
|
2
|
-
import type { TypesettingOptions } from '
|
|
2
|
+
import type { TypesettingOptions } from '../types';
|
|
3
3
|
declare class Typesetter extends HTMLProcessor {
|
|
4
|
-
static
|
|
4
|
+
static getDefaultOptions(): TypesettingOptions;
|
|
5
5
|
private isIntlSegmenterSupported;
|
|
6
6
|
constructor(options?: Partial<TypesettingOptions>);
|
|
7
7
|
private static validateOptions;
|
|
@@ -11,4 +11,5 @@ declare class Typesetter extends HTMLProcessor {
|
|
|
11
11
|
renderToSelector(selector: string | null): void;
|
|
12
12
|
}
|
|
13
13
|
export default Typesetter;
|
|
14
|
+
export type { TypesettingOptions, KerningRule } from '../types';
|
|
14
15
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,kBAAkB,CAAA;AAI5C,OAAO,KAAK,EAAE,kBAAkB,EAAe,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,kBAAkB,CAAA;AAI5C,OAAO,KAAK,EAAE,kBAAkB,EAAe,MAAM,UAAU,CAAA;AAM/D,cAAM,UAAW,SAAQ,aAAa;IAIpC,MAAM,CAAC,iBAAiB,IAAI,kBAAkB;IAc9C,OAAO,CAAC,wBAAwB,CAAS;gBAE7B,OAAO,GAAE,OAAO,CAAC,kBAAkB,CAAM;IA2BrD,OAAO,CAAC,MAAM,CAAC,eAAe;IAkB9B,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAiBjC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAc/B,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,IAAI,GAAG,IAAI;IAqB5D,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;CAQhD;AAED,eAAe,UAAU,CAAA;AACzB,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA"}
|