jsmigemo 0.3.1

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.
Files changed (114) hide show
  1. package/README.md +97 -0
  2. package/bin/jsmigemo-cli.js +122 -0
  3. package/bin/jsmigemo-dict.js +37 -0
  4. package/bin/jsmigemo-skk2migemo.js +61 -0
  5. package/demo-list.html +116 -0
  6. package/demo-text.html +65 -0
  7. package/esm/BitList.d.ts +8 -0
  8. package/esm/BitList.js +39 -0
  9. package/esm/BitList.js.map +1 -0
  10. package/esm/BitVector.d.ts +15 -0
  11. package/esm/BitVector.js +150 -0
  12. package/esm/BitVector.js.map +1 -0
  13. package/esm/CharacterConverter.d.ts +3 -0
  14. package/esm/CharacterConverter.js +382 -0
  15. package/esm/CharacterConverter.js.map +1 -0
  16. package/esm/CompactDictionary.d.ts +17 -0
  17. package/esm/CompactDictionary.js +124 -0
  18. package/esm/CompactDictionary.js.map +1 -0
  19. package/esm/CompactDictionaryBuilder.d.ts +3 -0
  20. package/esm/CompactDictionaryBuilder.js +118 -0
  21. package/esm/CompactDictionaryBuilder.js.map +1 -0
  22. package/esm/CompactHiraganaString.d.ts +6 -0
  23. package/esm/CompactHiraganaString.js +41 -0
  24. package/esm/CompactHiraganaString.js.map +1 -0
  25. package/esm/DoubleArray.d.ts +12 -0
  26. package/esm/DoubleArray.js +70 -0
  27. package/esm/DoubleArray.js.map +1 -0
  28. package/esm/LOUDSTrie.d.ts +13 -0
  29. package/esm/LOUDSTrie.js +67 -0
  30. package/esm/LOUDSTrie.js.map +1 -0
  31. package/esm/LOUDSTrieBuilder.d.ts +4 -0
  32. package/esm/LOUDSTrieBuilder.js +69 -0
  33. package/esm/LOUDSTrieBuilder.js.map +1 -0
  34. package/esm/Migemo.d.ts +13 -0
  35. package/esm/Migemo.js +71 -0
  36. package/esm/Migemo.js.map +1 -0
  37. package/esm/RomajiProcessor.d.ts +18 -0
  38. package/esm/RomajiProcessor.js +478 -0
  39. package/esm/RomajiProcessor.js.map +1 -0
  40. package/esm/RomajiProcessor2.d.ts +15 -0
  41. package/esm/RomajiProcessor2.js +91 -0
  42. package/esm/RomajiProcessor2.js.map +1 -0
  43. package/esm/SimpleDictionary.d.ts +1 -0
  44. package/esm/SimpleDictionary.js +54 -0
  45. package/esm/SimpleDictionary.js.map +1 -0
  46. package/esm/TernaryRegexGenerator.d.ts +27 -0
  47. package/esm/TernaryRegexGenerator.js +202 -0
  48. package/esm/TernaryRegexGenerator.js.map +1 -0
  49. package/esm/index.d.ts +3 -0
  50. package/esm/index.js +5 -0
  51. package/esm/index.js.map +1 -0
  52. package/esm/utils.d.ts +5 -0
  53. package/esm/utils.js +88 -0
  54. package/esm/utils.js.map +1 -0
  55. package/index.html +55 -0
  56. package/jest.config.js +12 -0
  57. package/lib/BitList.d.ts +8 -0
  58. package/lib/BitList.js +43 -0
  59. package/lib/BitList.js.map +1 -0
  60. package/lib/BitVector.d.ts +15 -0
  61. package/lib/BitVector.js +154 -0
  62. package/lib/BitVector.js.map +1 -0
  63. package/lib/CharacterConverter.d.ts +3 -0
  64. package/lib/CharacterConverter.js +388 -0
  65. package/lib/CharacterConverter.js.map +1 -0
  66. package/lib/CompactDictionary.d.ts +17 -0
  67. package/lib/CompactDictionary.js +128 -0
  68. package/lib/CompactDictionary.js.map +1 -0
  69. package/lib/CompactDictionaryBuilder.d.ts +3 -0
  70. package/lib/CompactDictionaryBuilder.js +122 -0
  71. package/lib/CompactDictionaryBuilder.js.map +1 -0
  72. package/lib/CompactHiraganaString.d.ts +6 -0
  73. package/lib/CompactHiraganaString.js +45 -0
  74. package/lib/CompactHiraganaString.js.map +1 -0
  75. package/lib/DoubleArray.d.ts +12 -0
  76. package/lib/DoubleArray.js +74 -0
  77. package/lib/DoubleArray.js.map +1 -0
  78. package/lib/LOUDSTrie.d.ts +13 -0
  79. package/lib/LOUDSTrie.js +71 -0
  80. package/lib/LOUDSTrie.js.map +1 -0
  81. package/lib/LOUDSTrieBuilder.d.ts +4 -0
  82. package/lib/LOUDSTrieBuilder.js +73 -0
  83. package/lib/LOUDSTrieBuilder.js.map +1 -0
  84. package/lib/Migemo.d.ts +13 -0
  85. package/lib/Migemo.js +75 -0
  86. package/lib/Migemo.js.map +1 -0
  87. package/lib/RegexGenerator.d.ts +21 -0
  88. package/lib/RegexGenerator.js +150 -0
  89. package/lib/RegexGenerator.js.map +1 -0
  90. package/lib/RomajiProcessor.d.ts +18 -0
  91. package/lib/RomajiProcessor.js +484 -0
  92. package/lib/RomajiProcessor.js.map +1 -0
  93. package/lib/RomajiProcessor2.d.ts +15 -0
  94. package/lib/RomajiProcessor2.js +96 -0
  95. package/lib/RomajiProcessor2.js.map +1 -0
  96. package/lib/RomanEntry.d.ts +1 -0
  97. package/lib/RomanEntry.js +481 -0
  98. package/lib/RomanEntry.js.map +1 -0
  99. package/lib/SimpleDictionary.d.ts +1 -0
  100. package/lib/SimpleDictionary.js +56 -0
  101. package/lib/SimpleDictionary.js.map +1 -0
  102. package/lib/TernaryRegexGenerator.d.ts +27 -0
  103. package/lib/TernaryRegexGenerator.js +206 -0
  104. package/lib/TernaryRegexGenerator.js.map +1 -0
  105. package/lib/index.d.ts +3 -0
  106. package/lib/index.js +17 -0
  107. package/lib/index.js.map +1 -0
  108. package/lib/utils.d.ts +5 -0
  109. package/lib/utils.js +96 -0
  110. package/lib/utils.js.map +1 -0
  111. package/migemo-compact-dict +0 -0
  112. package/package.json +37 -0
  113. package/tsconfig.esm.json +9 -0
  114. package/umd/jsmigemo.js +1 -0
package/README.md ADDED
@@ -0,0 +1,97 @@
1
+ # jsmigemo
2
+
3
+ ![Node.js CI](https://github.com/oguna/jsmigemo/workflows/Node.js%20CI/badge.svg)
4
+ [![npm version](https://badge.fury.io/js/jsmigemo.svg)](https://badge.fury.io/js/jsmigemo)
5
+
6
+ JavaScriptでMigemoを利用するためのライブラリ
7
+
8
+ ## HOW TO USE
9
+
10
+ ### CLI
11
+
12
+ ```
13
+ $ npm install jsmigemo
14
+ $ jsmigemo
15
+ QUERY: kensaku
16
+ PATTERN: (kensaku|けんさく|ケンサク|建策|憲[作冊]|検索|献策|研削|羂索|kensaku|ケンサク)
17
+ ```
18
+
19
+ ### Node.js
20
+
21
+ ```js
22
+ const migemo = require('jsmigemo');
23
+ const path = require('path');
24
+ const fs = require('fs');
25
+ let buffer = fs.readFileSync(path.join(migemo.migemo_module_path, '../../migemo-compact-dict'));
26
+ let ab = new ArrayBuffer(buffer.length);
27
+ let view = new Uint8Array(ab);
28
+ buffer.copy(view);
29
+ let dict = new migemo.CompactDictionary(ab);
30
+ let m = new migemo.Migemo();
31
+ m.setDict(dict);
32
+ console.log(m.query('kensaku'));
33
+ //=> (kensaku|けんさく|ケンサク|建策|憲[作冊]|検索|献策|研削|羂索|kensaku|ケンサク)
34
+ ```
35
+
36
+ ### Browser
37
+
38
+ `jsmigemo.js` と `migemo-compact-dict` を本リポジトリから用意します。
39
+
40
+ jsmigemoを使うHTMLに次のタグを追加し、`jsmigemo.js` を読み込みます。
41
+
42
+ ```html
43
+ <script type="text/javascript" src='jsmigemo.js'></script>
44
+ ```
45
+
46
+ 次に、scriptタグ内で、辞書ファイルをサーバから読み込みます。
47
+
48
+ ```js
49
+ var cd;
50
+ var req = new XMLHttpRequest();
51
+ req.open("get", "migemo-compact-dict", true);
52
+ req.responseType = "arraybuffer";
53
+ req.onload = function () {
54
+ var ab = req.response;
55
+ cd = new jsmigemo.CompactDictionary(ab);
56
+ }
57
+ req.send(null);
58
+ ```
59
+
60
+ 読み込み完了後、migemoを初期化します。
61
+ setDictメソッドで、先に読み込んだ辞書ファイルを指定します。
62
+ queryメソッドで、検索したい単語をローマ字で引数に与えると、その単語にヒットする正規表現が返ります。
63
+
64
+ ```js
65
+ var migemo = new jsmigemo.Migemo()
66
+ migemo.setDict(cd);
67
+ var rowregex = migemo.query(queryInputElement.value);
68
+ ```
69
+
70
+ queryメソッドはステートレスのため、複数のスレッドから同時に呼び出すことができます。
71
+
72
+ ## 辞書ファイルの生成
73
+
74
+ ```shell
75
+ > node bin/jsmigemo-dict.js <text-dict-file> <compact-dict-file>
76
+ ```
77
+
78
+ `<text-dict-file>` は、C/Miemoで使われているテキスト形式の辞書ファイルです。
79
+ `<compact-dict-file>` は、出力ファイル名です。
80
+
81
+ ## ライセンス
82
+ 本ライブラリに付属の辞書ファイルは、SKK辞書から生成されています。
83
+ そのため、辞書ファイル `migemo-compact-dict` のライセンスはSKK辞書から継承しています。
84
+ SKK辞書のライセンスについては、[SKK辞書配布ページ](http://openlab.ring.gr.jp/skk/wiki/wiki.cgi?page=SKK%BC%AD%BD%F1)をご覧ください。
85
+
86
+ `migemo-compact-dict` 以外のファイルについては、MIT LICENSEのもとで配布します。
87
+
88
+ ## 辞書ファイルの作成
89
+
90
+ **WIP**
91
+
92
+ KaoriYa氏配布のC/Migemoに含まれている `migemo-dict` を入力ファイルとします。
93
+ 以下のコマンドにより、 `migemo-compact-dict` に、サイズが最適化された辞書ファイルが生成されます。
94
+
95
+ ```
96
+ node ./bin/jsmigemo-dict migemo-dict migemo-compact-dict
97
+ ```
@@ -0,0 +1,122 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * jsmigemo-cli.js
4
+ */
5
+
6
+ const migemo = require('../lib/index.js');
7
+ const fs = require('fs');
8
+ const path = require('path');
9
+ const readline = require('readline');
10
+
11
+ function help(prgname) {
12
+ const MIGEMO_ABOUT = "jsmigemo - Js/Migemo Library";
13
+ console.log(`${MIGEMO_ABOUT}\n
14
+ \n
15
+ USAGE: ${prgname} [OPTIONS]\n
16
+ \n
17
+ OPTIONS:\n
18
+ -d --dict <dict> Use a file <dict> for dictionary.\n
19
+ -q --quiet Show no message except results.\n
20
+ -v --vim Use vim style regexp.\n
21
+ -e --emacs Use emacs style regexp.\n
22
+ -n --nonewline Don't use newline match.\n
23
+ -w --word <word> Expand a <word> and soon exit.\n
24
+ -h --help Show this message.`);
25
+ }
26
+
27
+ let mode_vim = false;
28
+ let mode_emacs = false;
29
+ let mode_nonewline = false;
30
+ let mode_quiet = false;
31
+ let mode_help = false;
32
+ let file = path.join(migemo.migemo_module_path, '../migemo-compact-dict');
33
+ let word = null;
34
+ let prgname = process.argv[1];
35
+
36
+ for (let i = 2; i < process.argv.length; i++) {
37
+ let arg = process.argv[i];
38
+ switch (arg) {
39
+ case '--vim':
40
+ case '-v':
41
+ mode_vim = true;
42
+ break;
43
+ case '--emacs':
44
+ case '-e':
45
+ mode_emacs = true;
46
+ break;
47
+ case '--nonewline':
48
+ case '-n':
49
+ mode_nonewline = true;
50
+ break;
51
+ case '--dict':
52
+ case '-d':
53
+ i++;
54
+ file = process.argv[i];
55
+ break;
56
+ case '--word':
57
+ case '-w':
58
+ i++;
59
+ word = process.argv[i];
60
+ break;
61
+ case '--quite':
62
+ case '-q':
63
+ mode_quiet = true;
64
+ break;
65
+ case '--help':
66
+ case '-h':
67
+ mode_help = true;
68
+ break;
69
+ default:
70
+ console.error("Invalid option (Ignored): %s", arg);
71
+ break;
72
+ }
73
+ }
74
+ if (mode_help) {
75
+ help(prgname);
76
+ exit(0);
77
+ }
78
+
79
+ let buffer = fs.readFileSync(file);
80
+ let ab = new ArrayBuffer(buffer.length);
81
+ let view = new Uint8Array(ab);
82
+ buffer.copy(view);
83
+ let dict = new migemo.CompactDictionary(ab);
84
+
85
+ let rxop = ["|", "(", ")", "[", "]", ""];
86
+ if (mode_vim) {
87
+ if (mode_nonewline) {
88
+ rxop = ["\\|", "\\%(", "\\)", "[", "]", ""];
89
+ } else {
90
+ rxop = ["\\|", "\\%(", "\\)", "[", "]", "\\_s*"];
91
+ }
92
+ }
93
+ else if (mode_emacs) {
94
+ if (mode_nonewline) {
95
+ rxop = ["\\|", "\\(", "\\)", "[", "]", ""];
96
+ } else {
97
+ rxop = ["\\|", "\\(", "\\)", "[", "]", "\\s-*"];
98
+ }
99
+ }
100
+
101
+ let m = new migemo.Migemo(rxop);
102
+ m.setDict(dict);
103
+ m.setRxop(rxop);
104
+
105
+ if (word != null) {
106
+ console.log(m.query(word));
107
+ } else {
108
+ const rl = readline.createInterface({
109
+ input: process.stdin,
110
+ output: process.stdout,
111
+ prompt: mode_quiet ? '' : 'QUERY: '
112
+ });
113
+
114
+ rl.prompt();
115
+
116
+ rl.on('line', (line) => {
117
+ console.log((mode_quiet ? '' : 'PATTERN: ') + m.query(line.trim()));
118
+ rl.prompt();
119
+ }).on('close', () => {
120
+ process.exit(0);
121
+ });
122
+ }
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * jsmigemo-cli.js
4
+ */
5
+
6
+ const {CompactDictionaryBuilder} = require('../lib/CompactDictionaryBuilder.js')
7
+ const fs = require('fs');
8
+ const readline = require('readline');
9
+
10
+ if (process.argv.length <= 3) {
11
+ console.error("usage: jsmigemo-cli <input> <output>");
12
+ process.exit(1);
13
+ }
14
+
15
+ let ifilename = process.argv[2];
16
+ let ofilename = process.argv[3];
17
+
18
+ if (!fs.existsSync(ifilename)) {
19
+ console.error("input file is not exist");
20
+ process.exit(1);
21
+ }
22
+
23
+ let rs = fs.createReadStream(ifilename, 'utf8');
24
+ let rl = readline.createInterface(rs, {});
25
+ let dict = new Map();
26
+ rl.on('line', (line)=>{
27
+ if (line.startsWith(';') || line.length === 0) {
28
+ return;
29
+ }
30
+ const words = line.split('\t');
31
+ const key = words[0];
32
+ const value = words.slice(1);
33
+ dict.set(key, value);
34
+ }).on('close', () => {
35
+ const ab = CompactDictionaryBuilder.build(dict);
36
+ fs.writeFileSync(ofilename, Buffer.from(ab));
37
+ })
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * jsmigemo-skk2migemo.js
4
+ */
5
+
6
+ const migemo = require('../dist/lib/index.js');
7
+ const fs = require('fs');
8
+ const path = require('path');
9
+ const readline = require('readline');
10
+
11
+ if (process.argv.length <= 2) {
12
+ console.error("usage: jsmigemo-cli <input>");
13
+ process.exit(1);
14
+ }
15
+
16
+ let filename = process.argv[2];
17
+
18
+ if (!fs.existsSync(filename)) {
19
+ console.error("input file is not exist");
20
+ process.exit(1);
21
+ }
22
+
23
+ let rs = fs.createReadStream(filename, 'utf8');
24
+ let rl = readline.createInterface(rs, {});
25
+ let dict = new Map();
26
+ rl.on('line', (line)=>{
27
+ if (line.startsWith(";;")) {
28
+ return;
29
+ }
30
+ let keyValues = line.split(' ', 2);
31
+ let key = keyValues[0];
32
+ let value = keyValues[1];
33
+ if (key.startsWith("<") || key.startsWith(">") || key.startsWith("?")) {
34
+ return;
35
+ }
36
+ if (key.endsWith("<") || key.endsWith(">") || key.endsWith("?")) {
37
+ return;
38
+ }
39
+ let haveNumber = key.match("#");
40
+ if (key.match("[a-z]$") && !key.match("^[ -~]+$")) {
41
+ key = key.substr(0, key.length - 2);
42
+ }
43
+ if (value.startsWith("/")) {
44
+ value = value.substr(1);
45
+ }
46
+ if (value.endsWith("/")) {
47
+ value = value.substr(0, value.length - 1);
48
+ }
49
+ if (dict.has(key)) {
50
+ dict.set(key, dict.get(key).concat(value.split("/")));
51
+ } else {
52
+ dict.set(key, value.split("/"))
53
+ }
54
+ }).on('close', () => {
55
+ let outputContent = "";
56
+ for (var [k,v] of dict.entries()) {
57
+ v = [...new Set(v)];
58
+ outputContent += k + "\t" + v.join("\t") + "\n";
59
+ }
60
+ fs.writeFileSync("a.txt", outputContent);
61
+ })
package/demo-list.html ADDED
@@ -0,0 +1,116 @@
1
+ <!DOCTYPE html>
2
+ <html lang="ja">
3
+
4
+ <head>
5
+ <title>List Filtering Demo</title>
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
8
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous">
9
+ <script type="text/javascript" src='https://cdn.jsdelivr.net/npm/jsmigemo/umd/jsmigemo.js'></script>
10
+ </head>
11
+
12
+ <body style="padding-top: 4.5rem">
13
+ <nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
14
+ <div class="container">
15
+ <input class="form-control w-100" type="text" placeholder="Migemo" id="queryInput" />
16
+ </div>
17
+ </nav>
18
+ <main role="main" class="container">
19
+ <ul class="list-group" id="todofuken">
20
+ </ul>
21
+ </main>
22
+ <script type="text/javascript">
23
+ var queryInputElement = document.getElementById("queryInput");
24
+ var sd = null;
25
+ var cd = null;
26
+ function loadDictionary() {
27
+ var req = new XMLHttpRequest();
28
+ req.open("get", "https://cdn.jsdelivr.net/npm/jsmigemo/migemo-compact-dict", true);
29
+ req.responseType = "arraybuffer";
30
+ req.onload = function () {
31
+ var ab = req.response;
32
+ cd = new jsmigemo.CompactDictionary(ab);
33
+ }
34
+ req.send(null);
35
+ }
36
+ var action = function () {
37
+ // list update
38
+ if (queryInputElement.value == "") {
39
+ var todofuken = document.getElementById("todofuken");
40
+ todofuken.innerHTML = "";
41
+ for (var i of list) {
42
+ todofuken.innerHTML += '<li class="list-group-item">' + i + '</li>';
43
+ }
44
+ } else {
45
+ var migemo = new jsmigemo.Migemo()
46
+ migemo.setDict(cd);
47
+ var reg = migemo.query(queryInputElement.value);
48
+ var regex = new RegExp(reg, 'g');
49
+ var todofuken = document.getElementById("todofuken");
50
+ todofuken.innerHTML = "";
51
+ for (var i of list) {
52
+ let r = regex.exec(i);
53
+ if (r != null) {
54
+ todofuken.innerHTML += '<li class="list-group-item">' + i.substr(0, r.index) + "<span style='background: pink'>" + i.substr(r.index, r[0].length) + "</span>" + i.substr(r.index + r[0].length) + '</li>';
55
+ }
56
+ }
57
+ }
58
+ }
59
+ queryInputElement.addEventListener("input", action);
60
+ loadDictionary();
61
+
62
+ //--------
63
+ var list = [
64
+ "北海道",
65
+ "青森県",
66
+ "岩手県",
67
+ "宮城県",
68
+ "秋田県",
69
+ "山形県",
70
+ "福島県",
71
+ "茨城県",
72
+ "栃木県",
73
+ "群馬県",
74
+ "埼玉県",
75
+ "千葉県",
76
+ "東京都",
77
+ "神奈川県",
78
+ "新潟県",
79
+ "富山県",
80
+ "石川県",
81
+ "福井県",
82
+ "山梨県",
83
+ "長野県",
84
+ "岐阜県",
85
+ "静岡県",
86
+ "愛知県",
87
+ "三重県",
88
+ "滋賀県",
89
+ "京都府",
90
+ "大阪府",
91
+ "兵庫県",
92
+ "奈良県",
93
+ "和歌山県",
94
+ "鳥取県",
95
+ "島根県",
96
+ "岡山県",
97
+ "広島県",
98
+ "山口県",
99
+ "徳島県",
100
+ "香川県",
101
+ "愛媛県",
102
+ "高知県",
103
+ "福岡県",
104
+ "佐賀県",
105
+ "長崎県",
106
+ "熊本県",
107
+ "大分県",
108
+ "宮崎県",
109
+ "鹿児島県",
110
+ "沖縄県"]
111
+
112
+ action.call();
113
+ </script>
114
+ </body>
115
+
116
+ </html>
package/demo-text.html ADDED
@@ -0,0 +1,65 @@
1
+ <!DOCTYPE html>
2
+ <html lang="ja">
3
+
4
+ <head>
5
+ <title>Text Highlighting Demo</title>
6
+ <meta charset="utf-8">
7
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
8
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous">
9
+ <script type="text/javascript" src='https://cdn.jsdelivr.net/npm/jsmigemo/umd/jsmigemo.js'></script>
10
+ </head>
11
+
12
+ <body style="padding-top: 4.5rem">
13
+ <nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
14
+ <div class="container">
15
+ <input class="form-control w-100" type="text" placeholder="Migemo" id="queryInput" />
16
+ </div>
17
+ </nav>
18
+ <main role="main" class="container">
19
+ <div class="jumbotron">
20
+ <code id="wagahai" style="color: black"></code>
21
+ <footer><cite title="夏目漱石『吾輩は猫である』">夏目漱石『吾輩は猫である』</cite></footer>
22
+ </div>
23
+
24
+ </main>
25
+ <script type="text/javascript">
26
+ var queryInputElement = document.getElementById("queryInput");
27
+ var cd = null;
28
+ function loadDictionary() {
29
+ let req = new XMLHttpRequest();
30
+ req.open("get", "https://cdn.jsdelivr.net/npm/jsmigemo/migemo-compact-dict", true);
31
+ req.responseType = "arraybuffer";
32
+ req.onload = function () {
33
+ let ab = req.response;
34
+ cd = new jsmigemo.CompactDictionary(ab);
35
+ }
36
+ req.send(null);
37
+ }
38
+ let action = function (e) {
39
+ let migemo = new jsmigemo.Migemo()
40
+ migemo.setDict(cd);
41
+ let reg = migemo.query(queryInputElement.value);
42
+ // list update
43
+ let todofuken = document.getElementById("wagahai");
44
+ if (queryInputElement.value == "") {
45
+ todofuken.innerHTML = originalWagahai;
46
+ } else {
47
+ let regex = new RegExp(reg, 'g');
48
+ let replacer = function(match) {
49
+ return "<span style='background: pink'>" + match + "</span>"
50
+ }
51
+ todofuken.innerHTML = originalWagahai.replace(regex, replacer)
52
+ }
53
+ }
54
+ queryInputElement.addEventListener("input", action);
55
+ loadDictionary();
56
+
57
+ //--------
58
+ var originalWagahai = "吾輩は猫である。名前はまだ無い。\n" +
59
+  "どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。この書生というのは時々我々を捕まえて煮て食うという話である。しかしその当時は何という考もなかったから別段恐しいとも思わなかった。ただ彼の掌に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始めであろう。この時妙なものだと思った感じが今でも残っている。第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶だ。その後猫にもだいぶ逢ったがこんな片輪には一度も出会わした事がない。のみならず顔の真中があまりに突起している。そうしてその穴の中から時々ぷうぷうと煙を吹く。どうも咽せぽくて実に弱った。これが人間の飲む煙草というものである事はようやくこの頃知った。";
60
+ var todofuken = document.getElementById("wagahai");
61
+ todofuken.innerHTML = originalWagahai;
62
+ </script>
63
+ </body>
64
+
65
+ </html>
@@ -0,0 +1,8 @@
1
+ export declare class BitList {
2
+ words: Uint32Array;
3
+ size: number;
4
+ constructor(size?: number);
5
+ add(value: boolean): void;
6
+ set(pos: number, value: boolean): void;
7
+ get(pos: number): boolean;
8
+ }
package/esm/BitList.js ADDED
@@ -0,0 +1,39 @@
1
+ export class BitList {
2
+ constructor(size) {
3
+ if (size == undefined) {
4
+ this.words = new Uint32Array(8);
5
+ this.size = 0;
6
+ }
7
+ else {
8
+ this.words = new Uint32Array((size + 31) >> 5);
9
+ this.size = size;
10
+ }
11
+ }
12
+ add(value) {
13
+ if (this.words.length < (this.size + 1 + 31) >> 5) {
14
+ const newWords = new Uint32Array(this.words.length * 2);
15
+ newWords.set(this.words, 0);
16
+ this.words = newWords;
17
+ }
18
+ this.set(this.size, value);
19
+ this.size++;
20
+ }
21
+ set(pos, value) {
22
+ if (this.size < pos) {
23
+ throw new Error();
24
+ }
25
+ if (value) {
26
+ this.words[pos >> 5] |= 1 << (pos & 31);
27
+ }
28
+ else {
29
+ this.words[pos >> 5] &= ~(1 << (pos & 31));
30
+ }
31
+ }
32
+ get(pos) {
33
+ if (this.size < pos) {
34
+ throw new Error();
35
+ }
36
+ return ((this.words[pos >> 5] >> (pos & 31)) & 1) == 1;
37
+ }
38
+ }
39
+ //# sourceMappingURL=BitList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BitList.js","sourceRoot":"","sources":["../src/BitList.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,OAAO;IAGhB,YAAY,IAAa;QACrB,IAAI,IAAI,IAAI,SAAS,EAAE;YACnB,IAAI,CAAC,KAAK,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;SACjB;aAAM;YACH,IAAI,CAAC,KAAK,GAAG,IAAI,WAAW,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;SACpB;IACL,CAAC;IACD,GAAG,CAAC,KAAc;QACd,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE;YAC/C,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACxD,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;SACzB;QACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;IAChB,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAc;QAC3B,IAAI,IAAI,CAAC,IAAI,GAAG,GAAG,EAAE;YACjB,MAAM,IAAI,KAAK,EAAE,CAAC;SACrB;QACD,IAAI,KAAK,EAAE;YACP,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;SAC3C;aAAM;YACH,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;SAC9C;IACL,CAAC;IAED,GAAG,CAAC,GAAW;QACX,IAAI,IAAI,CAAC,IAAI,GAAG,GAAG,EAAE;YACjB,MAAM,IAAI,KAAK,EAAE,CAAC;SACrB;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;CACJ"}
@@ -0,0 +1,15 @@
1
+ export declare class BitVector {
2
+ words: Uint32Array;
3
+ sizeInBits: number;
4
+ lb: Uint32Array;
5
+ sb: Uint16Array;
6
+ constructor(words: Uint32Array, sizeInBits: number);
7
+ rank(pos: number, b: boolean): number;
8
+ select(count: number, b: boolean): number;
9
+ private lowerBoundBinarySearchLB;
10
+ private lowerBoundBinarySearchSB;
11
+ nextClearBit(fromIndex: number): number;
12
+ size(): number;
13
+ get(pos: number): boolean;
14
+ toString(): string;
15
+ }