japanese_address_parser 3.0.5 → 3.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +22 -2
  3. data/Gemfile.lock +6 -6
  4. data/js/node_modules/.package-lock.json +86 -1
  5. data/js/node_modules/@geolonia/normalize-japanese-addresses/dist/lib/cacheRegexes.d.ts +9 -2
  6. data/js/node_modules/@geolonia/normalize-japanese-addresses/dist/main-browser.js +141 -25
  7. data/js/node_modules/@geolonia/normalize-japanese-addresses/dist/main-es.d.ts +3 -0
  8. data/js/node_modules/@geolonia/normalize-japanese-addresses/dist/main-es.js +1922 -0
  9. data/js/node_modules/@geolonia/normalize-japanese-addresses/dist/main-node.d.ts +6 -0
  10. data/js/node_modules/@geolonia/normalize-japanese-addresses/dist/main-node.js +203 -54
  11. data/js/node_modules/@geolonia/normalize-japanese-addresses/dist/normalize.d.ts +47 -3
  12. data/js/node_modules/@geolonia/normalize-japanese-addresses/package.json +9 -5
  13. data/js/node_modules/@geolonia/normalize-japanese-addresses/rollup.config.ts +9 -0
  14. data/js/node_modules/@geolonia/normalize-japanese-addresses/src/config.ts +1 -0
  15. data/js/node_modules/@geolonia/normalize-japanese-addresses/src/lib/cacheRegexes.ts +71 -11
  16. data/js/node_modules/@geolonia/normalize-japanese-addresses/src/lib/dict.ts +3 -2
  17. data/js/node_modules/@geolonia/normalize-japanese-addresses/src/lib/kan2num.ts +6 -2
  18. data/js/node_modules/@geolonia/normalize-japanese-addresses/src/main-es.ts +4 -0
  19. data/js/node_modules/@geolonia/normalize-japanese-addresses/src/main-node.ts +41 -12
  20. data/js/node_modules/@geolonia/normalize-japanese-addresses/src/normalize.ts +165 -37
  21. data/js/package-lock.json +7 -7
  22. data/js/package.json +1 -1
  23. data/lib/japanese_address_parser/data/03-03206.csv +1 -0
  24. data/lib/japanese_address_parser/data/04-04421.csv +8 -8
  25. data/lib/japanese_address_parser/data/05-05203.csv +5 -0
  26. data/lib/japanese_address_parser/data/08-08222.csv +4 -0
  27. data/lib/japanese_address_parser/data/11-11442.csv +2 -0
  28. data/lib/japanese_address_parser/data/13-13225.csv +3 -0
  29. data/lib/japanese_address_parser/data/14-14134.csv +3 -0
  30. data/lib/japanese_address_parser/data/15-15104.csv +1 -1
  31. data/lib/japanese_address_parser/data/15-15222.csv +1 -1
  32. data/lib/japanese_address_parser/data/15-15225.csv +1 -1
  33. data/lib/japanese_address_parser/data/18-18202.csv +1 -1
  34. data/lib/japanese_address_parser/data/22-22102.csv +6 -0
  35. data/lib/japanese_address_parser/data/23-23202.csv +1 -0
  36. data/lib/japanese_address_parser/data/23-23207.csv +5 -0
  37. data/lib/japanese_address_parser/data/23-23213.csv +1 -0
  38. data/lib/japanese_address_parser/data/23-23236.csv +1 -0
  39. data/lib/japanese_address_parser/data/25-25206.csv +4 -0
  40. data/lib/japanese_address_parser/data/27-27212.csv +4 -0
  41. data/lib/japanese_address_parser/data/28-28108.csv +1 -0
  42. data/lib/japanese_address_parser/data/28-28204.csv +1 -1
  43. data/lib/japanese_address_parser/data/28-28226.csv +1 -0
  44. data/lib/japanese_address_parser/data/29-29201.csv +1 -1
  45. data/lib/japanese_address_parser/data/34-34207.csv +3 -0
  46. data/lib/japanese_address_parser/data/35-35215.csv +3 -0
  47. data/lib/japanese_address_parser/data/38-38204.csv +17 -0
  48. data/lib/japanese_address_parser/data/40-40131.csv +1 -0
  49. data/lib/japanese_address_parser/data/40-40342.csv +4 -0
  50. data/lib/japanese_address_parser/data/44-44201.csv +27 -0
  51. data/lib/japanese_address_parser/data/46-46201.csv +4 -0
  52. data/lib/japanese_address_parser/data/47-47205.csv +4 -0
  53. data/lib/japanese_address_parser/version.rb +1 -1
  54. metadata +6 -3
@@ -0,0 +1,1922 @@
1
+ /*! *****************************************************************************
2
+ Copyright (c) Microsoft Corporation.
3
+
4
+ Permission to use, copy, modify, and/or distribute this software for any
5
+ purpose with or without fee is hereby granted.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
8
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
9
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
10
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
11
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
12
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
13
+ PERFORMANCE OF THIS SOFTWARE.
14
+ ***************************************************************************** */
15
+
16
+ var __assign = function() {
17
+ __assign = Object.assign || function __assign(t) {
18
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
19
+ s = arguments[i];
20
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
21
+ }
22
+ return t;
23
+ };
24
+ return __assign.apply(this, arguments);
25
+ };
26
+
27
+ function __awaiter(thisArg, _arguments, P, generator) {
28
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
29
+ return new (P || (P = Promise))(function (resolve, reject) {
30
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
31
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
32
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
33
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
34
+ });
35
+ }
36
+
37
+ function __generator(thisArg, body) {
38
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
39
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
40
+ function verb(n) { return function (v) { return step([n, v]); }; }
41
+ function step(op) {
42
+ if (f) throw new TypeError("Generator is already executing.");
43
+ while (_) try {
44
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
45
+ if (y = 0, t) op = [op[0] & 2, t.value];
46
+ switch (op[0]) {
47
+ case 0: case 1: t = op; break;
48
+ case 4: _.label++; return { value: op[1], done: false };
49
+ case 5: _.label++; y = op[1]; op = [0]; continue;
50
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
51
+ default:
52
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
53
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
54
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
55
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
56
+ if (t[2]) _.ops.pop();
57
+ _.trys.pop(); continue;
58
+ }
59
+ op = body.call(thisArg, _);
60
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
61
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
62
+ }
63
+ }
64
+
65
+ function getAugmentedNamespace(n) {
66
+ if (n.__esModule) return n;
67
+ var a = Object.defineProperty({}, '__esModule', {value: true});
68
+ Object.keys(n).forEach(function (k) {
69
+ var d = Object.getOwnPropertyDescriptor(n, k);
70
+ Object.defineProperty(a, k, d.get ? d : {
71
+ enumerable: true,
72
+ get: function () {
73
+ return n[k];
74
+ }
75
+ });
76
+ });
77
+ return a;
78
+ }
79
+
80
+ function createCommonjsModule(fn) {
81
+ var module = { exports: {} };
82
+ return fn(module, module.exports), module.exports;
83
+ }
84
+
85
+ const oldJapaneseNumerics = {
86
+ 零: '〇',
87
+ 壱: '一',
88
+ 壹: '一',
89
+ 弐: '二',
90
+ 弍: '二',
91
+ 貳: '二',
92
+ 貮: '二',
93
+ 参: '三',
94
+ 參: '三',
95
+ 肆: '四',
96
+ 伍: '五',
97
+ 陸: '六',
98
+ 漆: '七',
99
+ 捌: '八',
100
+ 玖: '九',
101
+ 拾: '十',
102
+ 廿: '二十',
103
+ 陌: '百',
104
+ 佰: '百',
105
+ 阡: '千',
106
+ 仟: '千',
107
+ 萬: '万',
108
+ };
109
+ var _default$1 = oldJapaneseNumerics;
110
+
111
+ var oldJapaneseNumerics_1 = /*#__PURE__*/Object.defineProperty({
112
+ default: _default$1
113
+ }, '__esModule', {value: true});
114
+
115
+ const japaneseNumerics = {
116
+ 〇: 0,
117
+ 一: 1,
118
+ 二: 2,
119
+ 三: 3,
120
+ 四: 4,
121
+ 五: 5,
122
+ 六: 6,
123
+ 七: 7,
124
+ 八: 8,
125
+ 九: 9,
126
+ '0': 0,
127
+ '1': 1,
128
+ '2': 2,
129
+ '3': 3,
130
+ '4': 4,
131
+ '5': 5,
132
+ '6': 6,
133
+ '7': 7,
134
+ '8': 8,
135
+ '9': 9,
136
+ };
137
+ var _default = japaneseNumerics;
138
+
139
+ var japaneseNumerics_1 = /*#__PURE__*/Object.defineProperty({
140
+ default: _default
141
+ }, '__esModule', {value: true});
142
+
143
+ var utils = createCommonjsModule(function (module, exports) {
144
+ Object.defineProperty(exports, "__esModule", { value: true });
145
+ exports.zen2han = exports.n2kan = exports.kan2n = exports.splitLargeNumber = exports.normalize = exports.smallNumbers = exports.largeNumbers = void 0;
146
+
147
+
148
+ exports.largeNumbers = { '兆': 1000000000000, '億': 100000000, '万': 10000 };
149
+ exports.smallNumbers = { '千': 1000, '百': 100, '十': 10 };
150
+ function normalize(japanese) {
151
+ for (const key in oldJapaneseNumerics_1.default) {
152
+ const reg = new RegExp(key, 'g');
153
+ japanese = japanese.replace(reg, oldJapaneseNumerics_1.default[key]);
154
+ }
155
+ return japanese;
156
+ }
157
+ exports.normalize = normalize;
158
+ /**
159
+ * 漢数字を兆、億、万単位に分割する
160
+ */
161
+ function splitLargeNumber(japanese) {
162
+ let kanji = japanese;
163
+ const numbers = {};
164
+ for (const key in exports.largeNumbers) {
165
+ const reg = new RegExp(`(.+)${key}`);
166
+ const match = kanji.match(reg);
167
+ if (match) {
168
+ numbers[key] = kan2n(match[1]);
169
+ kanji = kanji.replace(match[0], '');
170
+ }
171
+ else {
172
+ numbers[key] = 0;
173
+ }
174
+ }
175
+ if (kanji) {
176
+ numbers['千'] = kan2n(kanji);
177
+ }
178
+ else {
179
+ numbers['千'] = 0;
180
+ }
181
+ return numbers;
182
+ }
183
+ exports.splitLargeNumber = splitLargeNumber;
184
+ /**
185
+ * 千単位以下の漢数字を数字に変換する(例: 三千 => 3000)
186
+ *
187
+ * @param japanese
188
+ */
189
+ function kan2n(japanese) {
190
+ if (japanese.match(/^[0-9]+$/)) {
191
+ return Number(japanese);
192
+ }
193
+ let kanji = zen2han(japanese);
194
+ let number = 0;
195
+ for (const key in exports.smallNumbers) {
196
+ const reg = new RegExp(`(.*)${key}`);
197
+ const match = kanji.match(reg);
198
+ if (match) {
199
+ let n = 1;
200
+ if (match[1]) {
201
+ if (match[1].match(/^[0-9]+$/)) {
202
+ n = Number(match[1]);
203
+ }
204
+ else {
205
+ n = japaneseNumerics_1.default[match[1]];
206
+ }
207
+ }
208
+ number = number + (n * exports.smallNumbers[key]);
209
+ kanji = kanji.replace(match[0], '');
210
+ }
211
+ }
212
+ if (kanji) {
213
+ if (kanji.match(/^[0-9]+$/)) {
214
+ number = number + Number(kanji);
215
+ }
216
+ else {
217
+ for (let index = 0; index < kanji.length; index++) {
218
+ const char = kanji[index];
219
+ const digit = kanji.length - index - 1;
220
+ number = number + japaneseNumerics_1.default[char] * (10 ** digit);
221
+ }
222
+ }
223
+ }
224
+ return number;
225
+ }
226
+ exports.kan2n = kan2n;
227
+ /**
228
+ * Converts number less than 10000 to kanji.
229
+ *
230
+ * @param num
231
+ */
232
+ function n2kan(num) {
233
+ const kanjiNumbers = Object.keys(japaneseNumerics_1.default);
234
+ let number = num;
235
+ let kanji = '';
236
+ for (const key in exports.smallNumbers) {
237
+ const n = Math.floor(number / exports.smallNumbers[key]);
238
+ if (n) {
239
+ number = number - (n * exports.smallNumbers[key]);
240
+ if (1 === n) {
241
+ kanji = `${kanji}${key}`;
242
+ }
243
+ else {
244
+ kanji = `${kanji}${kanjiNumbers[n]}${key}`;
245
+ }
246
+ }
247
+ }
248
+ if (number) {
249
+ kanji = `${kanji}${kanjiNumbers[number]}`;
250
+ }
251
+ return kanji;
252
+ }
253
+ exports.n2kan = n2kan;
254
+ /**
255
+ * Converts double-width number to number as string.
256
+ *
257
+ * @param num
258
+ */
259
+ function zen2han(str) {
260
+ return str.replace(/[0-9]/g, (s) => {
261
+ return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);
262
+ });
263
+ }
264
+ exports.zen2han = zen2han;
265
+ });
266
+
267
+ var dist = createCommonjsModule(function (module, exports) {
268
+ Object.defineProperty(exports, "__esModule", { value: true });
269
+ exports.findKanjiNumbers = exports.number2kanji = exports.kanji2number = void 0;
270
+
271
+
272
+ function kanji2number(japanese) {
273
+ japanese = utils.normalize(japanese);
274
+ if (japanese.match('〇') || japanese.match(/^[〇一二三四五六七八九]+$/)) {
275
+ for (const key in japaneseNumerics_1.default) {
276
+ const reg = new RegExp(key, 'g');
277
+ japanese = japanese.replace(reg, japaneseNumerics_1.default[key].toString());
278
+ }
279
+ return Number(japanese);
280
+ }
281
+ else {
282
+ let number = 0;
283
+ const numbers = utils.splitLargeNumber(japanese);
284
+ // 万以上の数字を数値に変換
285
+ for (const key in utils.largeNumbers) {
286
+ if (numbers[key]) {
287
+ const n = utils.largeNumbers[key] * numbers[key];
288
+ number = number + n;
289
+ }
290
+ }
291
+ if (!Number.isInteger(number) || !Number.isInteger(numbers['千'])) {
292
+ throw new TypeError('The attribute of kanji2number() must be a Japanese numeral as integer.');
293
+ }
294
+ // 千以下の数字を足す
295
+ return number + numbers['千'];
296
+ }
297
+ }
298
+ exports.kanji2number = kanji2number;
299
+ function number2kanji(num) {
300
+ if (!num.toString().match(/^[0-9]+$/)) {
301
+ throw new TypeError('The attribute of number2kanji() must be integer.');
302
+ }
303
+ Object.keys(japaneseNumerics_1.default);
304
+ let number = num;
305
+ let kanji = '';
306
+ // 万以上の数字を漢字に変換
307
+ for (const key in utils.largeNumbers) {
308
+ const n = Math.floor(number / utils.largeNumbers[key]);
309
+ if (n) {
310
+ number = number - (n * utils.largeNumbers[key]);
311
+ kanji = `${kanji}${utils.n2kan(n)}${key}`;
312
+ }
313
+ }
314
+ if (number) {
315
+ kanji = `${kanji}${utils.n2kan(number)}`;
316
+ }
317
+ return kanji;
318
+ }
319
+ exports.number2kanji = number2kanji;
320
+ function findKanjiNumbers(text) {
321
+ const num = '([0-90-9]*)|([〇一二三四五六七八九壱壹弐弍貳貮参參肆伍陸漆捌玖]*)';
322
+ const basePattern = `((${num})(千|阡|仟))?((${num})(百|陌|佰))?((${num})(十|拾))?(${num})?`;
323
+ const pattern = `((${basePattern}兆)?(${basePattern}億)?(${basePattern}(万|萬))?${basePattern})`;
324
+ const regex = new RegExp(pattern, 'g');
325
+ const match = text.match(regex);
326
+ if (match) {
327
+ return match.filter((item) => {
328
+ if ((!item.match(/^[0-90-9]+$/)) && (item.length && '兆' !== item && '億' !== item && '万' !== item && '萬' !== item)) {
329
+ return true;
330
+ }
331
+ else {
332
+ return false;
333
+ }
334
+ });
335
+ }
336
+ else {
337
+ return [];
338
+ }
339
+ }
340
+ exports.findKanjiNumbers = findKanjiNumbers;
341
+ });
342
+
343
+ var gh_pages_endpoint = 'https://geolonia.github.io/japanese-addresses/api/ja';
344
+ var currentConfig = {
345
+ interfaceVersion: 1,
346
+ japaneseAddressesApi: gh_pages_endpoint,
347
+ townCacheSize: 1000,
348
+ };
349
+
350
+ var kan2num = function (string) {
351
+ var kanjiNumbers = dist.findKanjiNumbers(string);
352
+ for (var i = 0; i < kanjiNumbers.length; i++) {
353
+ try {
354
+ // @ts-ignore
355
+ string = string.replace(kanjiNumbers[i], dist.kanji2number(kanjiNumbers[i]));
356
+ }
357
+ catch (error) {
358
+ // ignore
359
+ }
360
+ }
361
+ return string;
362
+ };
363
+
364
+ var zen2han = function (str) {
365
+ return str.replace(/[A-Za-z0-9]/g, function (s) {
366
+ return String.fromCharCode(s.charCodeAt(0) - 0xfee0);
367
+ });
368
+ };
369
+
370
+ var addrPatches = [
371
+ {
372
+ pref: '香川県',
373
+ city: '仲多度郡まんのう町',
374
+ town: '勝浦',
375
+ pattern: '^字?家6',
376
+ result: '家六',
377
+ },
378
+ {
379
+ pref: '愛知県',
380
+ city: 'あま市',
381
+ town: '西今宿',
382
+ pattern: '^字?梶村1',
383
+ result: '梶村一',
384
+ },
385
+ {
386
+ pref: '香川県',
387
+ city: '丸亀市',
388
+ town: '原田町',
389
+ pattern: '^字?東三分1',
390
+ result: '東三分一',
391
+ },
392
+ ];
393
+ var patchAddr = function (pref, city, town, addr) {
394
+ var _addr = addr;
395
+ for (var i = 0; i < addrPatches.length; i++) {
396
+ var patch = addrPatches[i];
397
+ if (patch.pref === pref && patch.city === city && patch.town === town) {
398
+ _addr = _addr.replace(new RegExp(patch.pattern), patch.result);
399
+ }
400
+ }
401
+ return _addr;
402
+ };
403
+
404
+ // JIS 第2水準 => 第1水準 及び 旧字体 => 新字体
405
+ var JIS_OLD_KANJI = '亞,圍,壹,榮,驛,應,櫻,假,會,懷,覺,樂,陷,歡,氣,戲,據,挾,區,徑,溪,輕,藝,儉,圈,權,嚴,恆,國,齋,雜,蠶,殘,兒,實,釋,從,縱,敍,燒,條,剩,壤,釀,眞,盡,醉,髓,聲,竊,淺,錢,禪,爭,插,騷,屬,對,滯,擇,單,斷,癡,鑄,敕,鐵,傳,黨,鬪,屆,腦,廢,發,蠻,拂,邊,瓣,寶,沒,滿,藥,餘,樣,亂,兩,禮,靈,爐,灣,惡,醫,飮,營,圓,歐,奧,價,繪,擴,學,罐,勸,觀,歸,犧,擧,狹,驅,莖,經,繼,缺,劍,檢,顯,廣,鑛,碎,劑,參,慘,絲,辭,舍,壽,澁,肅,將,證,乘,疊,孃,觸,寢,圖,穗,樞,齊,攝,戰,潛,雙,莊,裝,藏,續,體,臺,澤,膽,彈,蟲,廳,鎭,點,燈,盜,獨,貳,霸,賣,髮,祕,佛,變,辯,豐,飜,默,與,譽,謠,覽,獵,勵,齡,勞,壓,爲,隱,衞,鹽,毆,穩,畫,壞,殼,嶽,卷,關,顏,僞,舊,峽,曉,勳,惠,螢,鷄,縣,險,獻,驗,效,號,濟,册,棧,贊,齒,濕,寫,收,獸,處,稱,奬,淨,繩,讓,囑,愼,粹,隨,數,靜,專,踐,纖,壯,搜,總,臟,墮,帶,瀧,擔,團,遲,晝,聽,遞,轉,當,稻,讀,惱,拜,麥,拔,濱,竝,辨,舖,襃,萬,譯,豫,搖,來,龍,壘,隸,戀,樓,鰺,鶯,蠣,攪,竈,灌,諫,頸,礦,蘂,靱,賤,壺,礪,檮,濤,邇,蠅,檜,儘,藪,籠,彌,麩'.split(/,/);
406
+ var JIS_NEW_KANJI = '亜,囲,壱,栄,駅,応,桜,仮,会,懐,覚,楽,陥,歓,気,戯,拠,挟,区,径,渓,軽,芸,倹,圏,権,厳,恒,国,斎,雑,蚕,残,児,実,釈,従,縦,叙,焼,条,剰,壌,醸,真,尽,酔,髄,声,窃,浅,銭,禅,争,挿,騒,属,対,滞,択,単,断,痴,鋳,勅,鉄,伝,党,闘,届,脳,廃,発,蛮,払,辺,弁,宝,没,満,薬,余,様,乱,両,礼,霊,炉,湾,悪,医,飲,営,円,欧,奥,価,絵,拡,学,缶,勧,観,帰,犠,挙,狭,駆,茎,経,継,欠,剣,検,顕,広,鉱,砕,剤,参,惨,糸,辞,舎,寿,渋,粛,将,証,乗,畳,嬢,触,寝,図,穂,枢,斉,摂,戦,潜,双,荘,装,蔵,続,体,台,沢,胆,弾,虫,庁,鎮,点,灯,盗,独,弐,覇,売,髪,秘,仏,変,弁,豊,翻,黙,与,誉,謡,覧,猟,励,齢,労,圧,為,隠,衛,塩,殴,穏,画,壊,殻,岳,巻,関,顔,偽,旧,峡,暁,勲,恵,蛍,鶏,県,険,献,験,効,号,済,冊,桟,賛,歯,湿,写,収,獣,処,称,奨,浄,縄,譲,嘱,慎,粋,随,数,静,専,践,繊,壮,捜,総,臓,堕,帯,滝,担,団,遅,昼,聴,逓,転,当,稲,読,悩,拝,麦,抜,浜,並,弁,舗,褒,万,訳,予,揺,来,竜,塁,隷,恋,楼,鯵,鴬,蛎,撹,竃,潅,諌,頚,砿,蕊,靭,賎,壷,砺,梼,涛,迩,蝿,桧,侭,薮,篭,弥,麸'.split(/,/);
407
+ var JIS_KANJI_REGEX_PATTERNS = JIS_OLD_KANJI.map(function (old, i) {
408
+ var pattern = old + "|" + JIS_NEW_KANJI[i];
409
+ return [pattern, old, JIS_NEW_KANJI[i]];
410
+ });
411
+ var jisKanji = function (str) {
412
+ var _str = str;
413
+ for (var i = 0; i < JIS_KANJI_REGEX_PATTERNS.length; i++) {
414
+ var _a = JIS_KANJI_REGEX_PATTERNS[i], pattern = _a[0], oldKanji = _a[1], newKanji = _a[2];
415
+ _str = _str.replace(new RegExp(pattern, 'g'), "(" + oldKanji + "|" + newKanji + ")");
416
+ }
417
+ return _str;
418
+ };
419
+ var toRegexPattern = function (string) {
420
+ var _str = string;
421
+ // 以下なるべく文字数が多いものほど上にすること
422
+ _str = _str
423
+ .replace(/三栄町|四谷三栄町/g, '(三栄町|四谷三栄町)')
424
+ .replace(/鬮野川|くじ野川|くじの川/g, '(鬮野川|くじ野川|くじの川)')
425
+ .replace(/柿碕町|柿さき町/g, '(柿碕町|柿さき町)')
426
+ .replace(/通り|とおり/g, '(通り|とおり)')
427
+ .replace(/埠頭|ふ頭/g, '(埠頭|ふ頭)')
428
+ .replace(/番町|番丁/g, '(番町|番丁)')
429
+ .replace(/大冝|大宜/g, '(大冝|大宜)')
430
+ .replace(/穝|さい/g, '(穝|さい)')
431
+ .replace(/杁|えぶり/g, '(杁|えぶり)')
432
+ .replace(/薭|稗|ひえ|ヒエ/g, '(薭|稗|ひえ|ヒエ)')
433
+ .replace(/[之ノの]/g, '[之ノの]')
434
+ .replace(/[ヶケが]/g, '[ヶケが]')
435
+ .replace(/[ヵカか力]/g, '[ヵカか力]')
436
+ .replace(/[ッツっつ]/g, '[ッツっつ]')
437
+ .replace(/[ニ二]/g, '[ニ二]')
438
+ .replace(/[ハ八]/g, '[ハ八]')
439
+ .replace(/塚|塚/g, '(塚|塚)')
440
+ .replace(/釜|竈/g, '(釜|竈)')
441
+ .replace(/條|条/g, '(條|条)')
442
+ .replace(/狛|拍/g, '(狛|拍)')
443
+ .replace(/藪|薮/g, '(藪|薮)')
444
+ .replace(/渕|淵/g, '(渕|淵)')
445
+ .replace(/エ|ヱ|え/g, '(エ|ヱ|え)')
446
+ .replace(/曾|曽/g, '(曾|曽)')
447
+ .replace(/舟|船/g, '(舟|船)')
448
+ .replace(/莵|菟/g, '(莵|菟)')
449
+ .replace(/市|巿/g, '(市|巿)');
450
+ _str = jisKanji(_str);
451
+ return _str;
452
+ };
453
+
454
+ var iterator = function (Yallist) {
455
+ Yallist.prototype[Symbol.iterator] = function* () {
456
+ for (let walker = this.head; walker; walker = walker.next) {
457
+ yield walker.value;
458
+ }
459
+ };
460
+ };
461
+
462
+ var yallist = Yallist;
463
+
464
+ Yallist.Node = Node;
465
+ Yallist.create = Yallist;
466
+
467
+ function Yallist (list) {
468
+ var self = this;
469
+ if (!(self instanceof Yallist)) {
470
+ self = new Yallist();
471
+ }
472
+
473
+ self.tail = null;
474
+ self.head = null;
475
+ self.length = 0;
476
+
477
+ if (list && typeof list.forEach === 'function') {
478
+ list.forEach(function (item) {
479
+ self.push(item);
480
+ });
481
+ } else if (arguments.length > 0) {
482
+ for (var i = 0, l = arguments.length; i < l; i++) {
483
+ self.push(arguments[i]);
484
+ }
485
+ }
486
+
487
+ return self
488
+ }
489
+
490
+ Yallist.prototype.removeNode = function (node) {
491
+ if (node.list !== this) {
492
+ throw new Error('removing node which does not belong to this list')
493
+ }
494
+
495
+ var next = node.next;
496
+ var prev = node.prev;
497
+
498
+ if (next) {
499
+ next.prev = prev;
500
+ }
501
+
502
+ if (prev) {
503
+ prev.next = next;
504
+ }
505
+
506
+ if (node === this.head) {
507
+ this.head = next;
508
+ }
509
+ if (node === this.tail) {
510
+ this.tail = prev;
511
+ }
512
+
513
+ node.list.length--;
514
+ node.next = null;
515
+ node.prev = null;
516
+ node.list = null;
517
+
518
+ return next
519
+ };
520
+
521
+ Yallist.prototype.unshiftNode = function (node) {
522
+ if (node === this.head) {
523
+ return
524
+ }
525
+
526
+ if (node.list) {
527
+ node.list.removeNode(node);
528
+ }
529
+
530
+ var head = this.head;
531
+ node.list = this;
532
+ node.next = head;
533
+ if (head) {
534
+ head.prev = node;
535
+ }
536
+
537
+ this.head = node;
538
+ if (!this.tail) {
539
+ this.tail = node;
540
+ }
541
+ this.length++;
542
+ };
543
+
544
+ Yallist.prototype.pushNode = function (node) {
545
+ if (node === this.tail) {
546
+ return
547
+ }
548
+
549
+ if (node.list) {
550
+ node.list.removeNode(node);
551
+ }
552
+
553
+ var tail = this.tail;
554
+ node.list = this;
555
+ node.prev = tail;
556
+ if (tail) {
557
+ tail.next = node;
558
+ }
559
+
560
+ this.tail = node;
561
+ if (!this.head) {
562
+ this.head = node;
563
+ }
564
+ this.length++;
565
+ };
566
+
567
+ Yallist.prototype.push = function () {
568
+ for (var i = 0, l = arguments.length; i < l; i++) {
569
+ push(this, arguments[i]);
570
+ }
571
+ return this.length
572
+ };
573
+
574
+ Yallist.prototype.unshift = function () {
575
+ for (var i = 0, l = arguments.length; i < l; i++) {
576
+ unshift(this, arguments[i]);
577
+ }
578
+ return this.length
579
+ };
580
+
581
+ Yallist.prototype.pop = function () {
582
+ if (!this.tail) {
583
+ return undefined
584
+ }
585
+
586
+ var res = this.tail.value;
587
+ this.tail = this.tail.prev;
588
+ if (this.tail) {
589
+ this.tail.next = null;
590
+ } else {
591
+ this.head = null;
592
+ }
593
+ this.length--;
594
+ return res
595
+ };
596
+
597
+ Yallist.prototype.shift = function () {
598
+ if (!this.head) {
599
+ return undefined
600
+ }
601
+
602
+ var res = this.head.value;
603
+ this.head = this.head.next;
604
+ if (this.head) {
605
+ this.head.prev = null;
606
+ } else {
607
+ this.tail = null;
608
+ }
609
+ this.length--;
610
+ return res
611
+ };
612
+
613
+ Yallist.prototype.forEach = function (fn, thisp) {
614
+ thisp = thisp || this;
615
+ for (var walker = this.head, i = 0; walker !== null; i++) {
616
+ fn.call(thisp, walker.value, i, this);
617
+ walker = walker.next;
618
+ }
619
+ };
620
+
621
+ Yallist.prototype.forEachReverse = function (fn, thisp) {
622
+ thisp = thisp || this;
623
+ for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {
624
+ fn.call(thisp, walker.value, i, this);
625
+ walker = walker.prev;
626
+ }
627
+ };
628
+
629
+ Yallist.prototype.get = function (n) {
630
+ for (var i = 0, walker = this.head; walker !== null && i < n; i++) {
631
+ // abort out of the list early if we hit a cycle
632
+ walker = walker.next;
633
+ }
634
+ if (i === n && walker !== null) {
635
+ return walker.value
636
+ }
637
+ };
638
+
639
+ Yallist.prototype.getReverse = function (n) {
640
+ for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {
641
+ // abort out of the list early if we hit a cycle
642
+ walker = walker.prev;
643
+ }
644
+ if (i === n && walker !== null) {
645
+ return walker.value
646
+ }
647
+ };
648
+
649
+ Yallist.prototype.map = function (fn, thisp) {
650
+ thisp = thisp || this;
651
+ var res = new Yallist();
652
+ for (var walker = this.head; walker !== null;) {
653
+ res.push(fn.call(thisp, walker.value, this));
654
+ walker = walker.next;
655
+ }
656
+ return res
657
+ };
658
+
659
+ Yallist.prototype.mapReverse = function (fn, thisp) {
660
+ thisp = thisp || this;
661
+ var res = new Yallist();
662
+ for (var walker = this.tail; walker !== null;) {
663
+ res.push(fn.call(thisp, walker.value, this));
664
+ walker = walker.prev;
665
+ }
666
+ return res
667
+ };
668
+
669
+ Yallist.prototype.reduce = function (fn, initial) {
670
+ var acc;
671
+ var walker = this.head;
672
+ if (arguments.length > 1) {
673
+ acc = initial;
674
+ } else if (this.head) {
675
+ walker = this.head.next;
676
+ acc = this.head.value;
677
+ } else {
678
+ throw new TypeError('Reduce of empty list with no initial value')
679
+ }
680
+
681
+ for (var i = 0; walker !== null; i++) {
682
+ acc = fn(acc, walker.value, i);
683
+ walker = walker.next;
684
+ }
685
+
686
+ return acc
687
+ };
688
+
689
+ Yallist.prototype.reduceReverse = function (fn, initial) {
690
+ var acc;
691
+ var walker = this.tail;
692
+ if (arguments.length > 1) {
693
+ acc = initial;
694
+ } else if (this.tail) {
695
+ walker = this.tail.prev;
696
+ acc = this.tail.value;
697
+ } else {
698
+ throw new TypeError('Reduce of empty list with no initial value')
699
+ }
700
+
701
+ for (var i = this.length - 1; walker !== null; i--) {
702
+ acc = fn(acc, walker.value, i);
703
+ walker = walker.prev;
704
+ }
705
+
706
+ return acc
707
+ };
708
+
709
+ Yallist.prototype.toArray = function () {
710
+ var arr = new Array(this.length);
711
+ for (var i = 0, walker = this.head; walker !== null; i++) {
712
+ arr[i] = walker.value;
713
+ walker = walker.next;
714
+ }
715
+ return arr
716
+ };
717
+
718
+ Yallist.prototype.toArrayReverse = function () {
719
+ var arr = new Array(this.length);
720
+ for (var i = 0, walker = this.tail; walker !== null; i++) {
721
+ arr[i] = walker.value;
722
+ walker = walker.prev;
723
+ }
724
+ return arr
725
+ };
726
+
727
+ Yallist.prototype.slice = function (from, to) {
728
+ to = to || this.length;
729
+ if (to < 0) {
730
+ to += this.length;
731
+ }
732
+ from = from || 0;
733
+ if (from < 0) {
734
+ from += this.length;
735
+ }
736
+ var ret = new Yallist();
737
+ if (to < from || to < 0) {
738
+ return ret
739
+ }
740
+ if (from < 0) {
741
+ from = 0;
742
+ }
743
+ if (to > this.length) {
744
+ to = this.length;
745
+ }
746
+ for (var i = 0, walker = this.head; walker !== null && i < from; i++) {
747
+ walker = walker.next;
748
+ }
749
+ for (; walker !== null && i < to; i++, walker = walker.next) {
750
+ ret.push(walker.value);
751
+ }
752
+ return ret
753
+ };
754
+
755
+ Yallist.prototype.sliceReverse = function (from, to) {
756
+ to = to || this.length;
757
+ if (to < 0) {
758
+ to += this.length;
759
+ }
760
+ from = from || 0;
761
+ if (from < 0) {
762
+ from += this.length;
763
+ }
764
+ var ret = new Yallist();
765
+ if (to < from || to < 0) {
766
+ return ret
767
+ }
768
+ if (from < 0) {
769
+ from = 0;
770
+ }
771
+ if (to > this.length) {
772
+ to = this.length;
773
+ }
774
+ for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {
775
+ walker = walker.prev;
776
+ }
777
+ for (; walker !== null && i > from; i--, walker = walker.prev) {
778
+ ret.push(walker.value);
779
+ }
780
+ return ret
781
+ };
782
+
783
+ Yallist.prototype.splice = function (start, deleteCount, ...nodes) {
784
+ if (start > this.length) {
785
+ start = this.length - 1;
786
+ }
787
+ if (start < 0) {
788
+ start = this.length + start;
789
+ }
790
+
791
+ for (var i = 0, walker = this.head; walker !== null && i < start; i++) {
792
+ walker = walker.next;
793
+ }
794
+
795
+ var ret = [];
796
+ for (var i = 0; walker && i < deleteCount; i++) {
797
+ ret.push(walker.value);
798
+ walker = this.removeNode(walker);
799
+ }
800
+ if (walker === null) {
801
+ walker = this.tail;
802
+ }
803
+
804
+ if (walker !== this.head && walker !== this.tail) {
805
+ walker = walker.prev;
806
+ }
807
+
808
+ for (var i = 0; i < nodes.length; i++) {
809
+ walker = insert(this, walker, nodes[i]);
810
+ }
811
+ return ret;
812
+ };
813
+
814
+ Yallist.prototype.reverse = function () {
815
+ var head = this.head;
816
+ var tail = this.tail;
817
+ for (var walker = head; walker !== null; walker = walker.prev) {
818
+ var p = walker.prev;
819
+ walker.prev = walker.next;
820
+ walker.next = p;
821
+ }
822
+ this.head = tail;
823
+ this.tail = head;
824
+ return this
825
+ };
826
+
827
+ function insert (self, node, value) {
828
+ var inserted = node === self.head ?
829
+ new Node(value, null, node, self) :
830
+ new Node(value, node, node.next, self);
831
+
832
+ if (inserted.next === null) {
833
+ self.tail = inserted;
834
+ }
835
+ if (inserted.prev === null) {
836
+ self.head = inserted;
837
+ }
838
+
839
+ self.length++;
840
+
841
+ return inserted
842
+ }
843
+
844
+ function push (self, item) {
845
+ self.tail = new Node(item, self.tail, null, self);
846
+ if (!self.head) {
847
+ self.head = self.tail;
848
+ }
849
+ self.length++;
850
+ }
851
+
852
+ function unshift (self, item) {
853
+ self.head = new Node(item, null, self.head, self);
854
+ if (!self.tail) {
855
+ self.tail = self.head;
856
+ }
857
+ self.length++;
858
+ }
859
+
860
+ function Node (value, prev, next, list) {
861
+ if (!(this instanceof Node)) {
862
+ return new Node(value, prev, next, list)
863
+ }
864
+
865
+ this.list = list;
866
+ this.value = value;
867
+
868
+ if (prev) {
869
+ prev.next = this;
870
+ this.prev = prev;
871
+ } else {
872
+ this.prev = null;
873
+ }
874
+
875
+ if (next) {
876
+ next.prev = this;
877
+ this.next = next;
878
+ } else {
879
+ this.next = null;
880
+ }
881
+ }
882
+
883
+ try {
884
+ // add if support for Symbol.iterator is present
885
+ iterator(Yallist);
886
+ } catch (er) {}
887
+
888
+ // A linked list to keep track of recently-used-ness
889
+
890
+
891
+ const MAX = Symbol('max');
892
+ const LENGTH = Symbol('length');
893
+ const LENGTH_CALCULATOR = Symbol('lengthCalculator');
894
+ const ALLOW_STALE = Symbol('allowStale');
895
+ const MAX_AGE = Symbol('maxAge');
896
+ const DISPOSE = Symbol('dispose');
897
+ const NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet');
898
+ const LRU_LIST = Symbol('lruList');
899
+ const CACHE = Symbol('cache');
900
+ const UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet');
901
+
902
+ const naiveLength = () => 1;
903
+
904
+ // lruList is a yallist where the head is the youngest
905
+ // item, and the tail is the oldest. the list contains the Hit
906
+ // objects as the entries.
907
+ // Each Hit object has a reference to its Yallist.Node. This
908
+ // never changes.
909
+ //
910
+ // cache is a Map (or PseudoMap) that matches the keys to
911
+ // the Yallist.Node object.
912
+ class LRUCache {
913
+ constructor (options) {
914
+ if (typeof options === 'number')
915
+ options = { max: options };
916
+
917
+ if (!options)
918
+ options = {};
919
+
920
+ if (options.max && (typeof options.max !== 'number' || options.max < 0))
921
+ throw new TypeError('max must be a non-negative number')
922
+ // Kind of weird to have a default max of Infinity, but oh well.
923
+ this[MAX] = options.max || Infinity;
924
+
925
+ const lc = options.length || naiveLength;
926
+ this[LENGTH_CALCULATOR] = (typeof lc !== 'function') ? naiveLength : lc;
927
+ this[ALLOW_STALE] = options.stale || false;
928
+ if (options.maxAge && typeof options.maxAge !== 'number')
929
+ throw new TypeError('maxAge must be a number')
930
+ this[MAX_AGE] = options.maxAge || 0;
931
+ this[DISPOSE] = options.dispose;
932
+ this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false;
933
+ this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false;
934
+ this.reset();
935
+ }
936
+
937
+ // resize the cache when the max changes.
938
+ set max (mL) {
939
+ if (typeof mL !== 'number' || mL < 0)
940
+ throw new TypeError('max must be a non-negative number')
941
+
942
+ this[MAX] = mL || Infinity;
943
+ trim(this);
944
+ }
945
+ get max () {
946
+ return this[MAX]
947
+ }
948
+
949
+ set allowStale (allowStale) {
950
+ this[ALLOW_STALE] = !!allowStale;
951
+ }
952
+ get allowStale () {
953
+ return this[ALLOW_STALE]
954
+ }
955
+
956
+ set maxAge (mA) {
957
+ if (typeof mA !== 'number')
958
+ throw new TypeError('maxAge must be a non-negative number')
959
+
960
+ this[MAX_AGE] = mA;
961
+ trim(this);
962
+ }
963
+ get maxAge () {
964
+ return this[MAX_AGE]
965
+ }
966
+
967
+ // resize the cache when the lengthCalculator changes.
968
+ set lengthCalculator (lC) {
969
+ if (typeof lC !== 'function')
970
+ lC = naiveLength;
971
+
972
+ if (lC !== this[LENGTH_CALCULATOR]) {
973
+ this[LENGTH_CALCULATOR] = lC;
974
+ this[LENGTH] = 0;
975
+ this[LRU_LIST].forEach(hit => {
976
+ hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key);
977
+ this[LENGTH] += hit.length;
978
+ });
979
+ }
980
+ trim(this);
981
+ }
982
+ get lengthCalculator () { return this[LENGTH_CALCULATOR] }
983
+
984
+ get length () { return this[LENGTH] }
985
+ get itemCount () { return this[LRU_LIST].length }
986
+
987
+ rforEach (fn, thisp) {
988
+ thisp = thisp || this;
989
+ for (let walker = this[LRU_LIST].tail; walker !== null;) {
990
+ const prev = walker.prev;
991
+ forEachStep(this, fn, walker, thisp);
992
+ walker = prev;
993
+ }
994
+ }
995
+
996
+ forEach (fn, thisp) {
997
+ thisp = thisp || this;
998
+ for (let walker = this[LRU_LIST].head; walker !== null;) {
999
+ const next = walker.next;
1000
+ forEachStep(this, fn, walker, thisp);
1001
+ walker = next;
1002
+ }
1003
+ }
1004
+
1005
+ keys () {
1006
+ return this[LRU_LIST].toArray().map(k => k.key)
1007
+ }
1008
+
1009
+ values () {
1010
+ return this[LRU_LIST].toArray().map(k => k.value)
1011
+ }
1012
+
1013
+ reset () {
1014
+ if (this[DISPOSE] &&
1015
+ this[LRU_LIST] &&
1016
+ this[LRU_LIST].length) {
1017
+ this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value));
1018
+ }
1019
+
1020
+ this[CACHE] = new Map(); // hash of items by key
1021
+ this[LRU_LIST] = new yallist(); // list of items in order of use recency
1022
+ this[LENGTH] = 0; // length of items in the list
1023
+ }
1024
+
1025
+ dump () {
1026
+ return this[LRU_LIST].map(hit =>
1027
+ isStale(this, hit) ? false : {
1028
+ k: hit.key,
1029
+ v: hit.value,
1030
+ e: hit.now + (hit.maxAge || 0)
1031
+ }).toArray().filter(h => h)
1032
+ }
1033
+
1034
+ dumpLru () {
1035
+ return this[LRU_LIST]
1036
+ }
1037
+
1038
+ set (key, value, maxAge) {
1039
+ maxAge = maxAge || this[MAX_AGE];
1040
+
1041
+ if (maxAge && typeof maxAge !== 'number')
1042
+ throw new TypeError('maxAge must be a number')
1043
+
1044
+ const now = maxAge ? Date.now() : 0;
1045
+ const len = this[LENGTH_CALCULATOR](value, key);
1046
+
1047
+ if (this[CACHE].has(key)) {
1048
+ if (len > this[MAX]) {
1049
+ del(this, this[CACHE].get(key));
1050
+ return false
1051
+ }
1052
+
1053
+ const node = this[CACHE].get(key);
1054
+ const item = node.value;
1055
+
1056
+ // dispose of the old one before overwriting
1057
+ // split out into 2 ifs for better coverage tracking
1058
+ if (this[DISPOSE]) {
1059
+ if (!this[NO_DISPOSE_ON_SET])
1060
+ this[DISPOSE](key, item.value);
1061
+ }
1062
+
1063
+ item.now = now;
1064
+ item.maxAge = maxAge;
1065
+ item.value = value;
1066
+ this[LENGTH] += len - item.length;
1067
+ item.length = len;
1068
+ this.get(key);
1069
+ trim(this);
1070
+ return true
1071
+ }
1072
+
1073
+ const hit = new Entry(key, value, len, now, maxAge);
1074
+
1075
+ // oversized objects fall out of cache automatically.
1076
+ if (hit.length > this[MAX]) {
1077
+ if (this[DISPOSE])
1078
+ this[DISPOSE](key, value);
1079
+
1080
+ return false
1081
+ }
1082
+
1083
+ this[LENGTH] += hit.length;
1084
+ this[LRU_LIST].unshift(hit);
1085
+ this[CACHE].set(key, this[LRU_LIST].head);
1086
+ trim(this);
1087
+ return true
1088
+ }
1089
+
1090
+ has (key) {
1091
+ if (!this[CACHE].has(key)) return false
1092
+ const hit = this[CACHE].get(key).value;
1093
+ return !isStale(this, hit)
1094
+ }
1095
+
1096
+ get (key) {
1097
+ return get(this, key, true)
1098
+ }
1099
+
1100
+ peek (key) {
1101
+ return get(this, key, false)
1102
+ }
1103
+
1104
+ pop () {
1105
+ const node = this[LRU_LIST].tail;
1106
+ if (!node)
1107
+ return null
1108
+
1109
+ del(this, node);
1110
+ return node.value
1111
+ }
1112
+
1113
+ del (key) {
1114
+ del(this, this[CACHE].get(key));
1115
+ }
1116
+
1117
+ load (arr) {
1118
+ // reset the cache
1119
+ this.reset();
1120
+
1121
+ const now = Date.now();
1122
+ // A previous serialized cache has the most recent items first
1123
+ for (let l = arr.length - 1; l >= 0; l--) {
1124
+ const hit = arr[l];
1125
+ const expiresAt = hit.e || 0;
1126
+ if (expiresAt === 0)
1127
+ // the item was created without expiration in a non aged cache
1128
+ this.set(hit.k, hit.v);
1129
+ else {
1130
+ const maxAge = expiresAt - now;
1131
+ // dont add already expired items
1132
+ if (maxAge > 0) {
1133
+ this.set(hit.k, hit.v, maxAge);
1134
+ }
1135
+ }
1136
+ }
1137
+ }
1138
+
1139
+ prune () {
1140
+ this[CACHE].forEach((value, key) => get(this, key, false));
1141
+ }
1142
+ }
1143
+
1144
+ const get = (self, key, doUse) => {
1145
+ const node = self[CACHE].get(key);
1146
+ if (node) {
1147
+ const hit = node.value;
1148
+ if (isStale(self, hit)) {
1149
+ del(self, node);
1150
+ if (!self[ALLOW_STALE])
1151
+ return undefined
1152
+ } else {
1153
+ if (doUse) {
1154
+ if (self[UPDATE_AGE_ON_GET])
1155
+ node.value.now = Date.now();
1156
+ self[LRU_LIST].unshiftNode(node);
1157
+ }
1158
+ }
1159
+ return hit.value
1160
+ }
1161
+ };
1162
+
1163
+ const isStale = (self, hit) => {
1164
+ if (!hit || (!hit.maxAge && !self[MAX_AGE]))
1165
+ return false
1166
+
1167
+ const diff = Date.now() - hit.now;
1168
+ return hit.maxAge ? diff > hit.maxAge
1169
+ : self[MAX_AGE] && (diff > self[MAX_AGE])
1170
+ };
1171
+
1172
+ const trim = self => {
1173
+ if (self[LENGTH] > self[MAX]) {
1174
+ for (let walker = self[LRU_LIST].tail;
1175
+ self[LENGTH] > self[MAX] && walker !== null;) {
1176
+ // We know that we're about to delete this one, and also
1177
+ // what the next least recently used key will be, so just
1178
+ // go ahead and set it now.
1179
+ const prev = walker.prev;
1180
+ del(self, walker);
1181
+ walker = prev;
1182
+ }
1183
+ }
1184
+ };
1185
+
1186
+ const del = (self, node) => {
1187
+ if (node) {
1188
+ const hit = node.value;
1189
+ if (self[DISPOSE])
1190
+ self[DISPOSE](hit.key, hit.value);
1191
+
1192
+ self[LENGTH] -= hit.length;
1193
+ self[CACHE].delete(hit.key);
1194
+ self[LRU_LIST].removeNode(node);
1195
+ }
1196
+ };
1197
+
1198
+ class Entry {
1199
+ constructor (key, value, length, now, maxAge) {
1200
+ this.key = key;
1201
+ this.value = value;
1202
+ this.length = length;
1203
+ this.now = now;
1204
+ this.maxAge = maxAge || 0;
1205
+ }
1206
+ }
1207
+
1208
+ const forEachStep = (self, fn, node, thisp) => {
1209
+ let hit = node.value;
1210
+ if (isStale(self, hit)) {
1211
+ del(self, node);
1212
+ if (!self[ALLOW_STALE])
1213
+ hit = undefined;
1214
+ }
1215
+ if (hit)
1216
+ fn.call(thisp, hit.value, hit.key, self);
1217
+ };
1218
+
1219
+ var lruCache = LRUCache;
1220
+
1221
+ var cachedTownRegexes = new lruCache({
1222
+ max: currentConfig.townCacheSize,
1223
+ maxAge: 60 * 60 * 24 * 7 * 1000, // 7日間
1224
+ });
1225
+ var cachedPrefecturePatterns = undefined;
1226
+ var cachedCityPatterns = {};
1227
+ var cachedPrefectures = undefined;
1228
+ var cachedTowns = {};
1229
+ var cachedGaikuListItem = {};
1230
+ var cachedResidentials = {};
1231
+ var cachedAddrs = {}; // TODO: use LRU
1232
+ var cachedSameNamedPrefectureCityRegexPatterns = undefined;
1233
+ var getPrefectures = function () { return __awaiter(void 0, void 0, void 0, function () {
1234
+ var prefsResp, data;
1235
+ return __generator(this, function (_a) {
1236
+ switch (_a.label) {
1237
+ case 0:
1238
+ if (typeof cachedPrefectures !== 'undefined') {
1239
+ return [2 /*return*/, cachedPrefectures];
1240
+ }
1241
+ return [4 /*yield*/, __internals.fetch('.json', { level: 1 })]; // ja.json
1242
+ case 1:
1243
+ prefsResp = _a.sent() // ja.json
1244
+ ;
1245
+ return [4 /*yield*/, prefsResp.json()];
1246
+ case 2:
1247
+ data = (_a.sent());
1248
+ return [2 /*return*/, cachePrefectures(data)];
1249
+ }
1250
+ });
1251
+ }); };
1252
+ var cachePrefectures = function (data) {
1253
+ return (cachedPrefectures = data);
1254
+ };
1255
+ var getPrefectureRegexPatterns = function (prefs) {
1256
+ if (cachedPrefecturePatterns) {
1257
+ return cachedPrefecturePatterns;
1258
+ }
1259
+ cachedPrefecturePatterns = prefs.map(function (pref) {
1260
+ var _pref = pref.replace(/(都|道|府|県)$/, ''); // `東京` の様に末尾の `都府県` が抜けた住所に対応
1261
+ var pattern = "^" + _pref + "(\u90FD|\u9053|\u5E9C|\u770C)?";
1262
+ return [pref, pattern];
1263
+ });
1264
+ return cachedPrefecturePatterns;
1265
+ };
1266
+ var getCityRegexPatterns = function (pref, cities) {
1267
+ var cachedResult = cachedCityPatterns[pref];
1268
+ if (typeof cachedResult !== 'undefined') {
1269
+ return cachedResult;
1270
+ }
1271
+ // 少ない文字数の地名に対してミスマッチしないように文字の長さ順にソート
1272
+ cities.sort(function (a, b) {
1273
+ return b.length - a.length;
1274
+ });
1275
+ var patterns = cities.map(function (city) {
1276
+ var pattern = "^" + toRegexPattern(city);
1277
+ if (city.match(/(町|村)$/)) {
1278
+ pattern = "^" + toRegexPattern(city).replace(/(.+?)郡/, '($1郡)?'); // 郡が省略されてるかも
1279
+ }
1280
+ return [city, pattern];
1281
+ });
1282
+ cachedCityPatterns[pref] = patterns;
1283
+ return patterns;
1284
+ };
1285
+ var getTowns = function (pref, city) { return __awaiter(void 0, void 0, void 0, function () {
1286
+ var cacheKey, cachedTown, townsResp, towns;
1287
+ return __generator(this, function (_a) {
1288
+ switch (_a.label) {
1289
+ case 0:
1290
+ cacheKey = pref + "-" + city;
1291
+ cachedTown = cachedTowns[cacheKey];
1292
+ if (typeof cachedTown !== 'undefined') {
1293
+ return [2 /*return*/, cachedTown];
1294
+ }
1295
+ return [4 /*yield*/, __internals.fetch(['', encodeURI(pref), encodeURI(city) + '.json'].join('/'), { level: 3, pref: pref, city: city })];
1296
+ case 1:
1297
+ townsResp = _a.sent();
1298
+ return [4 /*yield*/, townsResp.json()];
1299
+ case 2:
1300
+ towns = (_a.sent());
1301
+ return [2 /*return*/, (cachedTowns[cacheKey] = towns)];
1302
+ }
1303
+ });
1304
+ }); };
1305
+ var getGaikuList = function (pref, city, town) { return __awaiter(void 0, void 0, void 0, function () {
1306
+ var cacheKey, cache, gaikuResp, gaikuListItem;
1307
+ return __generator(this, function (_b) {
1308
+ switch (_b.label) {
1309
+ case 0:
1310
+ if (currentConfig.interfaceVersion > 1) {
1311
+ throw new Error("Invalid config.interfaceVersion: " + currentConfig.interfaceVersion + "'}. Please set config.interfaceVersion to 1.");
1312
+ }
1313
+ cacheKey = pref + "-" + city + "-" + town + "-v" + currentConfig.interfaceVersion;
1314
+ cache = cachedGaikuListItem[cacheKey];
1315
+ if (typeof cache !== 'undefined') {
1316
+ return [2 /*return*/, cache];
1317
+ }
1318
+ return [4 /*yield*/, __internals.fetch(['', encodeURI(pref), encodeURI(city), encodeURI(town + '.json')].join('/'))];
1319
+ case 1:
1320
+ gaikuResp = _b.sent();
1321
+ _b.label = 2;
1322
+ case 2:
1323
+ _b.trys.push([2, 4, , 5]);
1324
+ return [4 /*yield*/, gaikuResp.json()];
1325
+ case 3:
1326
+ gaikuListItem = (_b.sent());
1327
+ return [3 /*break*/, 5];
1328
+ case 4:
1329
+ _b.sent();
1330
+ gaikuListItem = [];
1331
+ return [3 /*break*/, 5];
1332
+ case 5: return [2 /*return*/, (cachedGaikuListItem[cacheKey] = gaikuListItem)];
1333
+ }
1334
+ });
1335
+ }); };
1336
+ var getResidentials = function (pref, city, town) { return __awaiter(void 0, void 0, void 0, function () {
1337
+ var cacheKey, cache, residentialsResp, residentials;
1338
+ return __generator(this, function (_b) {
1339
+ switch (_b.label) {
1340
+ case 0:
1341
+ if (currentConfig.interfaceVersion > 1) {
1342
+ throw new Error("Invalid config.interfaceVersion: " + currentConfig.interfaceVersion + "'}. Please set config.interfaceVersion to 1.");
1343
+ }
1344
+ cacheKey = pref + "-" + city + "-" + town + "-v" + currentConfig.interfaceVersion;
1345
+ cache = cachedResidentials[cacheKey];
1346
+ if (typeof cache !== 'undefined') {
1347
+ return [2 /*return*/, cache];
1348
+ }
1349
+ return [4 /*yield*/, __internals.fetch([
1350
+ '',
1351
+ encodeURI(pref),
1352
+ encodeURI(city),
1353
+ encodeURI(town),
1354
+ encodeURI('住居表示.json'),
1355
+ ].join('/'))];
1356
+ case 1:
1357
+ residentialsResp = _b.sent();
1358
+ _b.label = 2;
1359
+ case 2:
1360
+ _b.trys.push([2, 4, , 5]);
1361
+ return [4 /*yield*/, residentialsResp.json()];
1362
+ case 3:
1363
+ residentials = (_b.sent());
1364
+ return [3 /*break*/, 5];
1365
+ case 4:
1366
+ _b.sent();
1367
+ residentials = [];
1368
+ return [3 /*break*/, 5];
1369
+ case 5:
1370
+ residentials.sort(function (res1, res2) {
1371
+ return (res2.gaiku + "-" + res2.jyukyo).length -
1372
+ (res1.gaiku + "-" + res1.jyukyo).length;
1373
+ });
1374
+ return [2 /*return*/, (cachedResidentials[cacheKey] = residentials)];
1375
+ }
1376
+ });
1377
+ }); };
1378
+ var getAddrs = function (pref, city, town) { return __awaiter(void 0, void 0, void 0, function () {
1379
+ var cacheKey, cache, addrsResp, addrs;
1380
+ return __generator(this, function (_b) {
1381
+ switch (_b.label) {
1382
+ case 0:
1383
+ if (currentConfig.interfaceVersion < 2) {
1384
+ throw new Error("Invalid config.interfaceVersion: " + currentConfig.interfaceVersion + "'}. Please set config.interfaceVersion to 2 or higher");
1385
+ }
1386
+ cacheKey = pref + "-" + city + "-" + town + "-v" + currentConfig.interfaceVersion;
1387
+ cache = cachedAddrs[cacheKey];
1388
+ if (typeof cache !== 'undefined') {
1389
+ return [2 /*return*/, cache];
1390
+ }
1391
+ return [4 /*yield*/, __internals.fetch(['', encodeURI(pref), encodeURI(city), encodeURI(town) + '.json'].join('/'), { level: 8, pref: pref, city: city, town: town })];
1392
+ case 1:
1393
+ addrsResp = _b.sent();
1394
+ _b.label = 2;
1395
+ case 2:
1396
+ _b.trys.push([2, 4, , 5]);
1397
+ return [4 /*yield*/, addrsResp.json()];
1398
+ case 3:
1399
+ addrs = (_b.sent());
1400
+ return [3 /*break*/, 5];
1401
+ case 4:
1402
+ _b.sent();
1403
+ addrs = [];
1404
+ return [3 /*break*/, 5];
1405
+ case 5:
1406
+ addrs.sort(function (res1, res2) { return res1.addr.length - res2.addr.length; });
1407
+ return [2 /*return*/, (cachedAddrs[cacheKey] = addrs)];
1408
+ }
1409
+ });
1410
+ }); };
1411
+ // 十六町 のように漢数字と町が連結しているか
1412
+ var isKanjiNumberFollewedByCho = function (targetTownName) {
1413
+ var xCho = targetTownName.match(/.町/g);
1414
+ if (!xCho)
1415
+ return false;
1416
+ var kanjiNumbers = dist.findKanjiNumbers(xCho[0]);
1417
+ return kanjiNumbers.length > 0;
1418
+ };
1419
+ var getTownRegexPatterns = function (pref, city) { return __awaiter(void 0, void 0, void 0, function () {
1420
+ var cachedResult, pre_towns, townSet, towns, isKyoto, _i, pre_towns_1, town, originalTown, townAbbr, patterns, _a, towns_1, town, chomeMatch, chomeNamePart, chomeNum, pattern;
1421
+ return __generator(this, function (_b) {
1422
+ switch (_b.label) {
1423
+ case 0:
1424
+ cachedResult = cachedTownRegexes.get(pref + "-" + city);
1425
+ if (typeof cachedResult !== 'undefined') {
1426
+ return [2 /*return*/, cachedResult];
1427
+ }
1428
+ return [4 /*yield*/, getTowns(pref, city)];
1429
+ case 1:
1430
+ pre_towns = _b.sent();
1431
+ townSet = new Set(pre_towns.map(function (town) { return town.town; }));
1432
+ towns = [];
1433
+ isKyoto = city.match(/^京都市/);
1434
+ // 町丁目に「○○町」が含まれるケースへの対応
1435
+ // 通常は「○○町」のうち「町」の省略を許容し同義語として扱うが、まれに自治体内に「○○町」と「○○」が共存しているケースがある。
1436
+ // この場合は町の省略は許容せず、入力された住所は書き分けられているものとして正規化を行う。
1437
+ // 更に、「愛知県名古屋市瑞穂区十六町1丁目」漢数字を含むケースだと丁目や番地・号の正規化が不可能になる。このようなケースも除外。
1438
+ for (_i = 0, pre_towns_1 = pre_towns; _i < pre_towns_1.length; _i++) {
1439
+ town = pre_towns_1[_i];
1440
+ towns.push(town);
1441
+ originalTown = town.town;
1442
+ if (originalTown.indexOf('町') === -1)
1443
+ continue;
1444
+ townAbbr = originalTown.replace(/(?!^町)町/g, '') // NOTE: 冒頭の「町」は明らかに省略するべきではないので、除外
1445
+ ;
1446
+ if (!isKyoto && // 京都は通り名削除の処理があるため、意図しないマッチになるケースがある。これを除く
1447
+ !townSet.has(townAbbr) &&
1448
+ !townSet.has("\u5927\u5B57" + townAbbr) && // 大字は省略されるため、大字〇〇と〇〇町がコンフリクトする。このケースを除外
1449
+ !isKanjiNumberFollewedByCho(originalTown)) {
1450
+ // エイリアスとして町なしのパターンを登録
1451
+ towns.push(__assign(__assign({}, town), { originalTown: originalTown, town: townAbbr }));
1452
+ }
1453
+ }
1454
+ // 少ない文字数の地名に対してミスマッチしないように文字の長さ順にソート
1455
+ towns.sort(function (a, b) {
1456
+ var aLen = a.town.length;
1457
+ var bLen = b.town.length;
1458
+ // 大字で始まる場合、優先度を低く設定する。
1459
+ // 大字XX と XXYY が存在するケースもあるので、 XXYY を先にマッチしたい
1460
+ if (a.town.startsWith('大字'))
1461
+ aLen -= 2;
1462
+ if (b.town.startsWith('大字'))
1463
+ bLen -= 2;
1464
+ return bLen - aLen;
1465
+ });
1466
+ patterns = towns.map(function (town) {
1467
+ var pattern = toRegexPattern(town.town
1468
+ // 横棒を含む場合(流通センター、など)に対応
1469
+ .replace(/[--﹣−‐⁃‑‒–—﹘―⎯⏤ーー─━]/g, '[--﹣−‐⁃‑‒–—﹘―⎯⏤ーー─━]')
1470
+ .replace(/大?字/g, '(大?字)?')
1471
+ // 以下住所マスターの町丁目に含まれる数字を正規表現に変換する
1472
+ .replace(/([壱一二三四五六七八九十]+)(丁目?|番(町|丁)|条|軒|線|(の|ノ)町|地割|号)/g, function (match) {
1473
+ var patterns = [];
1474
+ patterns.push(match
1475
+ .toString()
1476
+ .replace(/(丁目?|番(町|丁)|条|軒|線|(の|ノ)町|地割|号)/, '')); // 漢数字
1477
+ if (match.match(/^壱/)) {
1478
+ patterns.push('一');
1479
+ patterns.push('1');
1480
+ patterns.push('1');
1481
+ }
1482
+ else {
1483
+ var num = match
1484
+ .replace(/([一二三四五六七八九十]+)/g, function (match) {
1485
+ return kan2num(match);
1486
+ })
1487
+ .replace(/(丁目?|番(町|丁)|条|軒|線|(の|ノ)町|地割|号)/, '');
1488
+ patterns.push(num.toString()); // 半角アラビア数字
1489
+ }
1490
+ // 以下の正規表現は、上のよく似た正規表現とは違うことに注意!
1491
+ var _pattern = "(" + patterns.join('|') + ")((\u4E01|\u753A)\u76EE?|\u756A(\u753A|\u4E01)|\u6761|\u8ED2|\u7DDA|\u306E\u753A?|\u5730\u5272|\u53F7|[-\uFF0D\uFE63\u2212\u2010\u2043\u2011\u2012\u2013\u2014\uFE58\u2015\u23AF\u23E4\u30FC\uFF70\u2500\u2501])";
1492
+ return _pattern; // デバッグのときにめんどくさいので変数に入れる。
1493
+ }));
1494
+ return [town, pattern];
1495
+ });
1496
+ // X丁目の丁目なしの数字だけ許容するため、最後に数字だけ追加していく
1497
+ for (_a = 0, towns_1 = towns; _a < towns_1.length; _a++) {
1498
+ town = towns_1[_a];
1499
+ chomeMatch = town.town.match(/([^一二三四五六七八九十]+)([一二三四五六七八九十]+)(丁目?)/);
1500
+ if (!chomeMatch) {
1501
+ continue;
1502
+ }
1503
+ chomeNamePart = chomeMatch[1];
1504
+ chomeNum = chomeMatch[2];
1505
+ pattern = toRegexPattern("^" + chomeNamePart + "(" + chomeNum + "|" + kan2num(chomeNum) + ")");
1506
+ patterns.push([town, pattern]);
1507
+ }
1508
+ cachedTownRegexes.set(pref + "-" + city, patterns);
1509
+ return [2 /*return*/, patterns];
1510
+ }
1511
+ });
1512
+ }); };
1513
+ var getSameNamedPrefectureCityRegexPatterns = function (prefs, prefList) {
1514
+ if (typeof cachedSameNamedPrefectureCityRegexPatterns !== 'undefined') {
1515
+ return cachedSameNamedPrefectureCityRegexPatterns;
1516
+ }
1517
+ var _prefs = prefs.map(function (pref) {
1518
+ return pref.replace(/[都|道|府|県]$/, '');
1519
+ });
1520
+ cachedSameNamedPrefectureCityRegexPatterns = [];
1521
+ for (var pref in prefList) {
1522
+ for (var i = 0; i < prefList[pref].length; i++) {
1523
+ var city = prefList[pref][i];
1524
+ // 「福島県石川郡石川町」のように、市の名前が別の都道府県名から始まっているケースも考慮する。
1525
+ for (var j = 0; j < _prefs.length; j++) {
1526
+ if (city.indexOf(_prefs[j]) === 0) {
1527
+ cachedSameNamedPrefectureCityRegexPatterns.push([
1528
+ "" + pref + city,
1529
+ "^" + city,
1530
+ ]);
1531
+ }
1532
+ }
1533
+ }
1534
+ }
1535
+ return cachedSameNamedPrefectureCityRegexPatterns;
1536
+ };
1537
+
1538
+ function unfetch_module(e,n){return n=n||{},new Promise(function(t,r){var s=new XMLHttpRequest,o=[],u=[],i={},a=function(){return {ok:2==(s.status/100|0),statusText:s.statusText,status:s.status,url:s.responseURL,text:function(){return Promise.resolve(s.responseText)},json:function(){return Promise.resolve(s.responseText).then(JSON.parse)},blob:function(){return Promise.resolve(new Blob([s.response]))},clone:a,headers:{keys:function(){return o},entries:function(){return u},get:function(e){return i[e.toLowerCase()]},has:function(e){return e.toLowerCase()in i}}}};for(var l in s.open(n.method||"get",e,!0),s.onload=function(){s.getAllResponseHeaders().replace(/^(.*?):[^\S\n]*([\s\S]*?)$/gm,function(e,n,t){o.push(n=n.toLowerCase()),u.push([n,t]),i[n]=i[n]?i[n]+","+t:t;}),t(a());},s.onerror=r,s.withCredentials="include"==n.credentials,n.headers)s.setRequestHeader(l,n.headers[l]);s.send(n.body||null);})}
1539
+
1540
+ var unfetch_module$1 = /*#__PURE__*/Object.freeze({
1541
+ __proto__: null,
1542
+ 'default': unfetch_module
1543
+ });
1544
+
1545
+ var require$$0 = /*@__PURE__*/getAugmentedNamespace(unfetch_module$1);
1546
+
1547
+ var browser = self.fetch || (self.fetch = require$$0.default || require$$0);
1548
+
1549
+ var config$1 = currentConfig;
1550
+ var defaultOption = {
1551
+ level: 3,
1552
+ };
1553
+ /**
1554
+ * @internal
1555
+ */
1556
+ var __internals = {
1557
+ // default fetch
1558
+ fetch: function (input) {
1559
+ var url = new URL("" + config$1.japaneseAddressesApi + input).toString();
1560
+ if (config$1.geoloniaApiKey) {
1561
+ url += "?geolonia-api-key=" + config$1.geoloniaApiKey;
1562
+ }
1563
+ return browser(url);
1564
+ },
1565
+ };
1566
+ var normalizeTownName = function (addr, pref, city) { return __awaiter(void 0, void 0, void 0, function () {
1567
+ var townPatterns, regexPrefixes, _i, regexPrefixes_1, regexPrefix, _a, townPatterns_1, _b, town, pattern, regex, match;
1568
+ return __generator(this, function (_c) {
1569
+ switch (_c.label) {
1570
+ case 0:
1571
+ addr = addr.trim().replace(/^大字/, '');
1572
+ return [4 /*yield*/, getTownRegexPatterns(pref, city)];
1573
+ case 1:
1574
+ townPatterns = _c.sent();
1575
+ regexPrefixes = ['^'];
1576
+ if (city.match(/^京都市/)) {
1577
+ // 京都は通り名削除のために後方一致を使う
1578
+ regexPrefixes.push('.*');
1579
+ }
1580
+ for (_i = 0, regexPrefixes_1 = regexPrefixes; _i < regexPrefixes_1.length; _i++) {
1581
+ regexPrefix = regexPrefixes_1[_i];
1582
+ for (_a = 0, townPatterns_1 = townPatterns; _a < townPatterns_1.length; _a++) {
1583
+ _b = townPatterns_1[_a], town = _b[0], pattern = _b[1];
1584
+ regex = new RegExp("" + regexPrefix + pattern);
1585
+ match = addr.match(regex);
1586
+ if (match) {
1587
+ return [2 /*return*/, {
1588
+ town: town.originalTown || town.town,
1589
+ addr: addr.substr(match[0].length),
1590
+ lat: town.lat,
1591
+ lng: town.lng,
1592
+ }];
1593
+ }
1594
+ }
1595
+ }
1596
+ return [2 /*return*/];
1597
+ }
1598
+ });
1599
+ }); };
1600
+ var normalizeResidentialPart = function (addr, pref, city, town) { return __awaiter(void 0, void 0, void 0, function () {
1601
+ var _a, gaikuListItem, residentials, match, gaiku_1, jyukyo, jyukyohyoji_1, residential, addr2, gaikuItem, addr2;
1602
+ return __generator(this, function (_b) {
1603
+ switch (_b.label) {
1604
+ case 0: return [4 /*yield*/, Promise.all([
1605
+ getGaikuList(pref, city, town),
1606
+ getResidentials(pref, city, town),
1607
+ ])
1608
+ // 住居表示未整備
1609
+ ];
1610
+ case 1:
1611
+ _a = _b.sent(), gaikuListItem = _a[0], residentials = _a[1];
1612
+ // 住居表示未整備
1613
+ if (gaikuListItem.length === 0) {
1614
+ return [2 /*return*/, null];
1615
+ }
1616
+ match = addr.match(/^([1-9][0-9]*)-([1-9][0-9]*)/);
1617
+ if (match) {
1618
+ gaiku_1 = match[1];
1619
+ jyukyo = match[2];
1620
+ jyukyohyoji_1 = gaiku_1 + "-" + jyukyo;
1621
+ residential = residentials.find(function (res) { return res.gaiku + "-" + res.jyukyo === jyukyohyoji_1; });
1622
+ if (residential) {
1623
+ addr2 = addr.replace(jyukyohyoji_1, '').trim();
1624
+ return [2 /*return*/, {
1625
+ gaiku: gaiku_1,
1626
+ jyukyo: jyukyo,
1627
+ addr: addr2,
1628
+ lat: residential.lat,
1629
+ lng: residential.lng,
1630
+ }];
1631
+ }
1632
+ gaikuItem = gaikuListItem.find(function (item) { return item.gaiku === gaiku_1; });
1633
+ if (gaikuItem) {
1634
+ addr2 = addr.replace(gaikuItem.gaiku, '').trim();
1635
+ return [2 /*return*/, { gaiku: gaiku_1, addr: addr2, lat: gaikuItem.lat, lng: gaikuItem.lng }];
1636
+ }
1637
+ }
1638
+ return [2 /*return*/, null];
1639
+ }
1640
+ });
1641
+ }); };
1642
+ var normalizeAddrPart = function (addr, pref, city, town) { return __awaiter(void 0, void 0, void 0, function () {
1643
+ var addrListItem, addrItem, other;
1644
+ return __generator(this, function (_a) {
1645
+ switch (_a.label) {
1646
+ case 0: return [4 /*yield*/, getAddrs(pref, city, town)
1647
+ // 住居表示住所、および地番住所が見つからなかった
1648
+ ];
1649
+ case 1:
1650
+ addrListItem = _a.sent();
1651
+ // 住居表示住所、および地番住所が見つからなかった
1652
+ if (addrListItem.length === 0) {
1653
+ return [2 /*return*/, null];
1654
+ }
1655
+ addrItem = addrListItem.find(function (item) { return addr.startsWith(item.addr); });
1656
+ if (addrItem) {
1657
+ other = addr.replace(addrItem.addr, '').trim();
1658
+ return [2 /*return*/, { addr: addrItem.addr, other: other, lat: addrItem.lat, lng: addrItem.lng }];
1659
+ }
1660
+ return [2 /*return*/, null];
1661
+ }
1662
+ });
1663
+ }); };
1664
+ var normalize$1 = function (address, _option) {
1665
+ if (_option === void 0) { _option = defaultOption; }
1666
+ return __awaiter(void 0, void 0, void 0, function () {
1667
+ var option, addr, pref, city, town, lat, lng, level, normalized, prefectures, prefs, prefPatterns, sameNamedPrefectureCityRegexPatterns, i, _a, prefectureCity, reg, match, i, _b, _pref, pattern, match, matched, _pref, cities, cityPatterns, i, _c, _city, pattern, match, i, normalized_1, cities, cityPatterns, i, _d, _city, pattern, match, normalizedAddrPart, other, result, result;
1668
+ return __generator(this, function (_e) {
1669
+ switch (_e.label) {
1670
+ case 0:
1671
+ option = __assign(__assign({}, defaultOption), _option);
1672
+ if (option.geoloniaApiKey || config$1.geoloniaApiKey) {
1673
+ option.level = 8;
1674
+ option.geoloniaApiKey && (config$1.geoloniaApiKey = option.geoloniaApiKey);
1675
+ // API キーがある場合は、 Geolonia SaaS に切り替え。
1676
+ // ただし、config を書き換えて別のエンドポイントを使うようにカスタマイズしているケースがあるので、その場合は config に既に入っている値を優先
1677
+ if (config$1.japaneseAddressesApi === gh_pages_endpoint) {
1678
+ config$1.japaneseAddressesApi =
1679
+ 'https://japanese-addresses.geolonia.com/next/ja';
1680
+ }
1681
+ }
1682
+ addr = address
1683
+ .normalize('NFC')
1684
+ .replace(/ /g, ' ')
1685
+ .replace(/ +/g, ' ')
1686
+ .replace(/([0-9A-Za-z]+)/g, function (match) {
1687
+ // 全角のアラビア数字は問答無用で半角にする
1688
+ return zen2han(match);
1689
+ })
1690
+ // 数字の後または数字の前にくる横棒はハイフンに統一する
1691
+ .replace(/([0-90-9一二三四五六七八九〇十百千][--﹣−‐⁃‑‒–—﹘―⎯⏤ーー─━])|([--﹣−‐⁃‑‒–—﹘―⎯⏤ーー─━])[0-90-9一二三四五六七八九〇十]/g, function (match) {
1692
+ return match.replace(/[--﹣−‐⁃‑‒–—﹘―⎯⏤ーー─━]/g, '-');
1693
+ })
1694
+ .replace(/(.+)(丁目?|番(町|地|丁)|条|軒|線|(の|ノ)町|地割)/, function (match) {
1695
+ return match.replace(/ /g, ''); // 町丁目名以前のスペースはすべて削除
1696
+ })
1697
+ .replace(/(.+)((郡.+(町|村))|((市|巿).+(区|區)))/, function (match) {
1698
+ return match.replace(/ /g, ''); // 区、郡以前のスペースはすべて削除
1699
+ })
1700
+ .replace(/.+?[0-9一二三四五六七八九〇十百千]-/, function (match) {
1701
+ return match.replace(/ /g, ''); // 1番はじめに出てくるアラビア数字以前のスペースを削除
1702
+ });
1703
+ pref = '';
1704
+ city = '';
1705
+ town = '';
1706
+ lat = null;
1707
+ lng = null;
1708
+ level = 0;
1709
+ normalized = null;
1710
+ return [4 /*yield*/, getPrefectures()];
1711
+ case 1:
1712
+ prefectures = _e.sent();
1713
+ prefs = Object.keys(prefectures);
1714
+ prefPatterns = getPrefectureRegexPatterns(prefs);
1715
+ sameNamedPrefectureCityRegexPatterns = getSameNamedPrefectureCityRegexPatterns(prefs, prefectures);
1716
+ // 県名が省略されており、かつ市の名前がどこかの都道府県名と同じ場合(例.千葉県千葉市)、
1717
+ // あらかじめ県名を補完しておく。
1718
+ for (i = 0; i < sameNamedPrefectureCityRegexPatterns.length; i++) {
1719
+ _a = sameNamedPrefectureCityRegexPatterns[i], prefectureCity = _a[0], reg = _a[1];
1720
+ match = addr.match(reg);
1721
+ if (match) {
1722
+ addr = addr.replace(new RegExp(reg), prefectureCity);
1723
+ break;
1724
+ }
1725
+ }
1726
+ for (i = 0; i < prefPatterns.length; i++) {
1727
+ _b = prefPatterns[i], _pref = _b[0], pattern = _b[1];
1728
+ match = addr.match(pattern);
1729
+ if (match) {
1730
+ pref = _pref;
1731
+ addr = addr.substring(match[0].length); // 都道府県名以降の住所
1732
+ break;
1733
+ }
1734
+ }
1735
+ if (!!pref) return [3 /*break*/, 6];
1736
+ matched = [];
1737
+ for (_pref in prefectures) {
1738
+ cities = prefectures[_pref];
1739
+ cityPatterns = getCityRegexPatterns(_pref, cities);
1740
+ addr = addr.trim();
1741
+ for (i = 0; i < cityPatterns.length; i++) {
1742
+ _c = cityPatterns[i], _city = _c[0], pattern = _c[1];
1743
+ match = addr.match(pattern);
1744
+ if (match) {
1745
+ matched.push({
1746
+ pref: _pref,
1747
+ city: _city,
1748
+ addr: addr.substring(match[0].length),
1749
+ });
1750
+ }
1751
+ }
1752
+ }
1753
+ if (!(1 === matched.length)) return [3 /*break*/, 2];
1754
+ pref = matched[0].pref;
1755
+ return [3 /*break*/, 6];
1756
+ case 2:
1757
+ i = 0;
1758
+ _e.label = 3;
1759
+ case 3:
1760
+ if (!(i < matched.length)) return [3 /*break*/, 6];
1761
+ return [4 /*yield*/, normalizeTownName(matched[i].addr, matched[i].pref, matched[i].city)];
1762
+ case 4:
1763
+ normalized_1 = _e.sent();
1764
+ if (normalized_1) {
1765
+ pref = matched[i].pref;
1766
+ }
1767
+ _e.label = 5;
1768
+ case 5:
1769
+ i++;
1770
+ return [3 /*break*/, 3];
1771
+ case 6:
1772
+ if (pref && option.level >= 2) {
1773
+ cities = prefectures[pref];
1774
+ cityPatterns = getCityRegexPatterns(pref, cities);
1775
+ addr = addr.trim();
1776
+ for (i = 0; i < cityPatterns.length; i++) {
1777
+ _d = cityPatterns[i], _city = _d[0], pattern = _d[1];
1778
+ match = addr.match(pattern);
1779
+ if (match) {
1780
+ city = _city;
1781
+ addr = addr.substring(match[0].length); // 市区町村名以降の住所
1782
+ break;
1783
+ }
1784
+ }
1785
+ }
1786
+ if (!(city && option.level >= 3)) return [3 /*break*/, 8];
1787
+ return [4 /*yield*/, normalizeTownName(addr, pref, city)];
1788
+ case 7:
1789
+ normalized = _e.sent();
1790
+ if (normalized) {
1791
+ town = normalized.town;
1792
+ addr = normalized.addr;
1793
+ lat = parseFloat(normalized.lat);
1794
+ lng = parseFloat(normalized.lng);
1795
+ if (Number.isNaN(lat) || Number.isNaN(lng)) {
1796
+ lat = null;
1797
+ lng = null;
1798
+ }
1799
+ }
1800
+ // townが取得できた場合にのみ、addrに対する各種の変換処理を行う。
1801
+ if (town) {
1802
+ addr = addr
1803
+ .replace(/^-/, '')
1804
+ .replace(/([0-9]+)(丁目)/g, function (match) {
1805
+ return match.replace(/([0-9]+)/g, function (num) {
1806
+ return dist.number2kanji(Number(num));
1807
+ });
1808
+ })
1809
+ .replace(/(([0-9〇一二三四五六七八九十百千]+)(番地?)([0-9〇一二三四五六七八九十百千]+)号)\s*(.+)/, '$1 $5')
1810
+ .replace(/([0-9〇一二三四五六七八九十百千]+)\s*(番地?)\s*([0-9〇一二三四五六七八九十百千]+)\s*号?/, '$1-$3')
1811
+ .replace(/([0-9〇一二三四五六七八九十百千]+)番地?/, '$1')
1812
+ .replace(/([0-9〇一二三四五六七八九十百千]+)の/g, '$1-')
1813
+ .replace(/([0-9〇一二三四五六七八九十百千]+)[--﹣−‐⁃‑‒–—﹘―⎯⏤ーー─━]/g, function (match) {
1814
+ return kan2num(match).replace(/[--﹣−‐⁃‑‒–—﹘―⎯⏤ーー─━]/g, '-');
1815
+ })
1816
+ .replace(/[--﹣−‐⁃‑‒–—﹘―⎯⏤ーー─━]([0-9〇一二三四五六七八九十百千]+)/g, function (match) {
1817
+ return kan2num(match).replace(/[--﹣−‐⁃‑‒–—﹘―⎯⏤ーー─━]/g, '-');
1818
+ })
1819
+ .replace(/([0-9〇一二三四五六七八九十百千]+)-/, function (s) {
1820
+ // `1-` のようなケース
1821
+ return kan2num(s);
1822
+ })
1823
+ .replace(/-([0-9〇一二三四五六七八九十百千]+)/, function (s) {
1824
+ // `-1` のようなケース
1825
+ return kan2num(s);
1826
+ })
1827
+ .replace(/-[^0-9]([0-9〇一二三四五六七八九十百千]+)/, function (s) {
1828
+ // `-あ1` のようなケース
1829
+ return kan2num(zen2han(s));
1830
+ })
1831
+ .replace(/([0-9〇一二三四五六七八九十百千]+)$/, function (s) {
1832
+ // `串本町串本1234` のようなケース
1833
+ return kan2num(s);
1834
+ })
1835
+ .trim();
1836
+ }
1837
+ _e.label = 8;
1838
+ case 8:
1839
+ addr = patchAddr(pref, city, town, addr);
1840
+ if (pref)
1841
+ level = level + 1;
1842
+ if (city)
1843
+ level = level + 1;
1844
+ if (town)
1845
+ level = level + 1;
1846
+ if (option.level <= 3 || level < 3) {
1847
+ return [2 /*return*/, { pref: pref, city: city, town: town, addr: addr, level: level, lat: lat, lng: lng }];
1848
+ }
1849
+ if (!(currentConfig.interfaceVersion === 2)) return [3 /*break*/, 10];
1850
+ return [4 /*yield*/, normalizeAddrPart(addr, pref, city, town)];
1851
+ case 9:
1852
+ normalizedAddrPart = _e.sent();
1853
+ other = undefined;
1854
+ if (normalizedAddrPart) {
1855
+ addr = normalizedAddrPart.addr;
1856
+ if (normalizedAddrPart.other) {
1857
+ other = normalizedAddrPart.other;
1858
+ }
1859
+ if (normalizedAddrPart.lat !== null)
1860
+ lat = parseFloat(normalizedAddrPart.lat);
1861
+ if (normalizedAddrPart.lng !== null)
1862
+ lng = parseFloat(normalizedAddrPart.lng);
1863
+ level = 8;
1864
+ }
1865
+ result = {
1866
+ pref: pref,
1867
+ city: city,
1868
+ town: town,
1869
+ addr: addr,
1870
+ level: level,
1871
+ lat: lat,
1872
+ lng: lng,
1873
+ };
1874
+ if (other) {
1875
+ result.other = other;
1876
+ }
1877
+ return [2 /*return*/, result];
1878
+ case 10:
1879
+ if (!(currentConfig.interfaceVersion === 1)) return [3 /*break*/, 13];
1880
+ if (!(option.level > 3 && normalized && town)) return [3 /*break*/, 12];
1881
+ return [4 /*yield*/, normalizeResidentialPart(addr, pref, city, town)];
1882
+ case 11:
1883
+ normalized = _e.sent();
1884
+ _e.label = 12;
1885
+ case 12:
1886
+ if (normalized) {
1887
+ lat = parseFloat(normalized.lat);
1888
+ lng = parseFloat(normalized.lng);
1889
+ }
1890
+ if (Number.isNaN(lat) || Number.isNaN(lng)) {
1891
+ lat = null;
1892
+ lng = null;
1893
+ }
1894
+ result = {
1895
+ pref: pref,
1896
+ city: city,
1897
+ town: town,
1898
+ addr: addr,
1899
+ lat: lat,
1900
+ lng: lng,
1901
+ level: level,
1902
+ };
1903
+ if (normalized && 'gaiku' in normalized) {
1904
+ result.addr = normalized.addr;
1905
+ result.gaiku = normalized.gaiku;
1906
+ result.level = 7;
1907
+ }
1908
+ if (normalized && 'jyukyo' in normalized) {
1909
+ result.jyukyo = normalized.jyukyo;
1910
+ result.level = 8;
1911
+ }
1912
+ return [2 /*return*/, result];
1913
+ case 13: throw new Error('invalid interfaceVersion');
1914
+ }
1915
+ });
1916
+ });
1917
+ };
1918
+
1919
+ var config = config$1;
1920
+ var normalize = normalize$1;
1921
+
1922
+ export { config, normalize };