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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +22 -2
- data/Gemfile.lock +6 -6
- data/js/node_modules/.package-lock.json +86 -1
- data/js/node_modules/@geolonia/normalize-japanese-addresses/dist/lib/cacheRegexes.d.ts +9 -2
- data/js/node_modules/@geolonia/normalize-japanese-addresses/dist/main-browser.js +141 -25
- data/js/node_modules/@geolonia/normalize-japanese-addresses/dist/main-es.d.ts +3 -0
- data/js/node_modules/@geolonia/normalize-japanese-addresses/dist/main-es.js +1922 -0
- data/js/node_modules/@geolonia/normalize-japanese-addresses/dist/main-node.d.ts +6 -0
- data/js/node_modules/@geolonia/normalize-japanese-addresses/dist/main-node.js +203 -54
- data/js/node_modules/@geolonia/normalize-japanese-addresses/dist/normalize.d.ts +47 -3
- data/js/node_modules/@geolonia/normalize-japanese-addresses/package.json +9 -5
- data/js/node_modules/@geolonia/normalize-japanese-addresses/rollup.config.ts +9 -0
- data/js/node_modules/@geolonia/normalize-japanese-addresses/src/config.ts +1 -0
- data/js/node_modules/@geolonia/normalize-japanese-addresses/src/lib/cacheRegexes.ts +71 -11
- data/js/node_modules/@geolonia/normalize-japanese-addresses/src/lib/dict.ts +3 -2
- data/js/node_modules/@geolonia/normalize-japanese-addresses/src/lib/kan2num.ts +6 -2
- data/js/node_modules/@geolonia/normalize-japanese-addresses/src/main-es.ts +4 -0
- data/js/node_modules/@geolonia/normalize-japanese-addresses/src/main-node.ts +41 -12
- data/js/node_modules/@geolonia/normalize-japanese-addresses/src/normalize.ts +165 -37
- data/js/package-lock.json +7 -7
- data/js/package.json +1 -1
- data/lib/japanese_address_parser/data/03-03206.csv +1 -0
- data/lib/japanese_address_parser/data/04-04421.csv +8 -8
- data/lib/japanese_address_parser/data/05-05203.csv +5 -0
- data/lib/japanese_address_parser/data/08-08222.csv +4 -0
- data/lib/japanese_address_parser/data/11-11442.csv +2 -0
- data/lib/japanese_address_parser/data/13-13225.csv +3 -0
- data/lib/japanese_address_parser/data/14-14134.csv +3 -0
- data/lib/japanese_address_parser/data/15-15104.csv +1 -1
- data/lib/japanese_address_parser/data/15-15222.csv +1 -1
- data/lib/japanese_address_parser/data/15-15225.csv +1 -1
- data/lib/japanese_address_parser/data/18-18202.csv +1 -1
- data/lib/japanese_address_parser/data/22-22102.csv +6 -0
- data/lib/japanese_address_parser/data/23-23202.csv +1 -0
- data/lib/japanese_address_parser/data/23-23207.csv +5 -0
- data/lib/japanese_address_parser/data/23-23213.csv +1 -0
- data/lib/japanese_address_parser/data/23-23236.csv +1 -0
- data/lib/japanese_address_parser/data/25-25206.csv +4 -0
- data/lib/japanese_address_parser/data/27-27212.csv +4 -0
- data/lib/japanese_address_parser/data/28-28108.csv +1 -0
- data/lib/japanese_address_parser/data/28-28204.csv +1 -1
- data/lib/japanese_address_parser/data/28-28226.csv +1 -0
- data/lib/japanese_address_parser/data/29-29201.csv +1 -1
- data/lib/japanese_address_parser/data/34-34207.csv +3 -0
- data/lib/japanese_address_parser/data/35-35215.csv +3 -0
- data/lib/japanese_address_parser/data/38-38204.csv +17 -0
- data/lib/japanese_address_parser/data/40-40131.csv +1 -0
- data/lib/japanese_address_parser/data/40-40342.csv +4 -0
- data/lib/japanese_address_parser/data/44-44201.csv +27 -0
- data/lib/japanese_address_parser/data/46-46201.csv +4 -0
- data/lib/japanese_address_parser/data/47-47205.csv +4 -0
- data/lib/japanese_address_parser/version.rb +1 -1
- metadata +6 -3
@@ -1,3 +1,9 @@
|
|
1
1
|
import * as Normalize from './normalize';
|
2
|
+
export declare const requestHandlers: {
|
3
|
+
file: (fileURL: URL) => {
|
4
|
+
json: () => Promise<any>;
|
5
|
+
};
|
6
|
+
http: (fileURL: URL) => Promise<Response>;
|
7
|
+
};
|
2
8
|
export declare const config: Normalize.Config;
|
3
9
|
export declare const normalize: Normalize.Normalizer;
|
@@ -78,6 +78,7 @@ function __generator(thisArg, body) {
|
|
78
78
|
|
79
79
|
var gh_pages_endpoint = 'https://geolonia.github.io/japanese-addresses/api/ja';
|
80
80
|
var currentConfig = {
|
81
|
+
interfaceVersion: 1,
|
81
82
|
japaneseAddressesApi: gh_pages_endpoint,
|
82
83
|
townCacheSize: 1000,
|
83
84
|
};
|
@@ -85,8 +86,13 @@ var currentConfig = {
|
|
85
86
|
var kan2num = function (string) {
|
86
87
|
var kanjiNumbers = japaneseNumeral.findKanjiNumbers(string);
|
87
88
|
for (var i = 0; i < kanjiNumbers.length; i++) {
|
88
|
-
|
89
|
-
|
89
|
+
try {
|
90
|
+
// @ts-ignore
|
91
|
+
string = string.replace(kanjiNumbers[i], japaneseNumeral.kanji2number(kanjiNumbers[i]));
|
92
|
+
}
|
93
|
+
catch (error) {
|
94
|
+
// ignore
|
95
|
+
}
|
90
96
|
}
|
91
97
|
return string;
|
92
98
|
};
|
@@ -132,8 +138,8 @@ var patchAddr = function (pref, city, town, addr) {
|
|
132
138
|
};
|
133
139
|
|
134
140
|
// JIS 第2水準 => 第1水準 及び 旧字体 => 新字体
|
135
|
-
var JIS_OLD_KANJI = '
|
136
|
-
var JIS_NEW_KANJI = '
|
141
|
+
var JIS_OLD_KANJI = '亞,圍,壹,榮,驛,應,櫻,假,會,懷,覺,樂,陷,歡,氣,戲,據,挾,區,徑,溪,輕,藝,儉,圈,權,嚴,恆,國,齋,雜,蠶,殘,兒,實,釋,從,縱,敍,燒,條,剩,壤,釀,眞,盡,醉,髓,聲,竊,淺,錢,禪,爭,插,騷,屬,對,滯,擇,單,斷,癡,鑄,敕,鐵,傳,黨,鬪,屆,腦,廢,發,蠻,拂,邊,瓣,寶,沒,滿,藥,餘,樣,亂,兩,禮,靈,爐,灣,惡,醫,飮,營,圓,歐,奧,價,繪,擴,學,罐,勸,觀,歸,犧,擧,狹,驅,莖,經,繼,缺,劍,檢,顯,廣,鑛,碎,劑,參,慘,絲,辭,舍,壽,澁,肅,將,證,乘,疊,孃,觸,寢,圖,穗,樞,齊,攝,戰,潛,雙,莊,裝,藏,續,體,臺,澤,膽,彈,蟲,廳,鎭,點,燈,盜,獨,貳,霸,賣,髮,祕,佛,變,辯,豐,飜,默,與,譽,謠,覽,獵,勵,齡,勞,壓,爲,隱,衞,鹽,毆,穩,畫,壞,殼,嶽,卷,關,顏,僞,舊,峽,曉,勳,惠,螢,鷄,縣,險,獻,驗,效,號,濟,册,棧,贊,齒,濕,寫,收,獸,處,稱,奬,淨,繩,讓,囑,愼,粹,隨,數,靜,專,踐,纖,壯,搜,總,臟,墮,帶,瀧,擔,團,遲,晝,聽,遞,轉,當,稻,讀,惱,拜,麥,拔,濱,竝,辨,舖,襃,萬,譯,豫,搖,來,龍,壘,隸,戀,樓,鰺,鶯,蠣,攪,竈,灌,諫,頸,礦,蘂,靱,賤,壺,礪,檮,濤,邇,蠅,檜,儘,藪,籠,彌,麩'.split(/,/);
|
142
|
+
var JIS_NEW_KANJI = '亜,囲,壱,栄,駅,応,桜,仮,会,懐,覚,楽,陥,歓,気,戯,拠,挟,区,径,渓,軽,芸,倹,圏,権,厳,恒,国,斎,雑,蚕,残,児,実,釈,従,縦,叙,焼,条,剰,壌,醸,真,尽,酔,髄,声,窃,浅,銭,禅,争,挿,騒,属,対,滞,択,単,断,痴,鋳,勅,鉄,伝,党,闘,届,脳,廃,発,蛮,払,辺,弁,宝,没,満,薬,余,様,乱,両,礼,霊,炉,湾,悪,医,飲,営,円,欧,奥,価,絵,拡,学,缶,勧,観,帰,犠,挙,狭,駆,茎,経,継,欠,剣,検,顕,広,鉱,砕,剤,参,惨,糸,辞,舎,寿,渋,粛,将,証,乗,畳,嬢,触,寝,図,穂,枢,斉,摂,戦,潜,双,荘,装,蔵,続,体,台,沢,胆,弾,虫,庁,鎮,点,灯,盗,独,弐,覇,売,髪,秘,仏,変,弁,豊,翻,黙,与,誉,謡,覧,猟,励,齢,労,圧,為,隠,衛,塩,殴,穏,画,壊,殻,岳,巻,関,顔,偽,旧,峡,暁,勲,恵,蛍,鶏,県,険,献,験,効,号,済,冊,桟,賛,歯,湿,写,収,獣,処,称,奨,浄,縄,譲,嘱,慎,粋,随,数,静,専,践,繊,壮,捜,総,臓,堕,帯,滝,担,団,遅,昼,聴,逓,転,当,稲,読,悩,拝,麦,抜,浜,並,弁,舗,褒,万,訳,予,揺,来,竜,塁,隷,恋,楼,鯵,鴬,蛎,撹,竃,潅,諌,頚,砿,蕊,靭,賎,壷,砺,梼,涛,迩,蝿,桧,侭,薮,篭,弥,麸'.split(/,/);
|
137
143
|
var JIS_KANJI_REGEX_PATTERNS = JIS_OLD_KANJI.map(function (old, i) {
|
138
144
|
var pattern = old + "|" + JIS_NEW_KANJI[i];
|
139
145
|
return [pattern, old, JIS_NEW_KANJI[i]];
|
@@ -152,6 +158,7 @@ var toRegexPattern = function (string) {
|
|
152
158
|
_str = _str
|
153
159
|
.replace(/三栄町|四谷三栄町/g, '(三栄町|四谷三栄町)')
|
154
160
|
.replace(/鬮野川|くじ野川|くじの川/g, '(鬮野川|くじ野川|くじの川)')
|
161
|
+
.replace(/柿碕町|柿さき町/g, '(柿碕町|柿さき町)')
|
155
162
|
.replace(/通り|とおり/g, '(通り|とおり)')
|
156
163
|
.replace(/埠頭|ふ頭/g, '(埠頭|ふ頭)')
|
157
164
|
.replace(/番町|番丁/g, '(番町|番丁)')
|
@@ -190,6 +197,7 @@ var cachedPrefectures = undefined;
|
|
190
197
|
var cachedTowns = {};
|
191
198
|
var cachedGaikuListItem = {};
|
192
199
|
var cachedResidentials = {};
|
200
|
+
var cachedAddrs = {}; // TODO: use LRU
|
193
201
|
var cachedSameNamedPrefectureCityRegexPatterns = undefined;
|
194
202
|
var getPrefectures = function () { return __awaiter(void 0, void 0, void 0, function () {
|
195
203
|
var prefsResp, data;
|
@@ -199,7 +207,7 @@ var getPrefectures = function () { return __awaiter(void 0, void 0, void 0, func
|
|
199
207
|
if (typeof cachedPrefectures !== 'undefined') {
|
200
208
|
return [2 /*return*/, cachedPrefectures];
|
201
209
|
}
|
202
|
-
return [4 /*yield*/, __internals.fetch('.json')]; // ja.json
|
210
|
+
return [4 /*yield*/, __internals.fetch('.json', { level: 1 })]; // ja.json
|
203
211
|
case 1:
|
204
212
|
prefsResp = _a.sent() // ja.json
|
205
213
|
;
|
@@ -253,7 +261,7 @@ var getTowns = function (pref, city) { return __awaiter(void 0, void 0, void 0,
|
|
253
261
|
if (typeof cachedTown !== 'undefined') {
|
254
262
|
return [2 /*return*/, cachedTown];
|
255
263
|
}
|
256
|
-
return [4 /*yield*/, __internals.fetch(['', encodeURI(pref), encodeURI(city) + '.json'].join('/'))];
|
264
|
+
return [4 /*yield*/, __internals.fetch(['', encodeURI(pref), encodeURI(city) + '.json'].join('/'), { level: 3, pref: pref, city: city })];
|
257
265
|
case 1:
|
258
266
|
townsResp = _a.sent();
|
259
267
|
return [4 /*yield*/, townsResp.json()];
|
@@ -268,7 +276,10 @@ var getGaikuList = function (pref, city, town) { return __awaiter(void 0, void 0
|
|
268
276
|
return __generator(this, function (_b) {
|
269
277
|
switch (_b.label) {
|
270
278
|
case 0:
|
271
|
-
|
279
|
+
if (currentConfig.interfaceVersion > 1) {
|
280
|
+
throw new Error("Invalid config.interfaceVersion: " + currentConfig.interfaceVersion + "'}. Please set config.interfaceVersion to 1.");
|
281
|
+
}
|
282
|
+
cacheKey = pref + "-" + city + "-" + town + "-v" + currentConfig.interfaceVersion;
|
272
283
|
cache = cachedGaikuListItem[cacheKey];
|
273
284
|
if (typeof cache !== 'undefined') {
|
274
285
|
return [2 /*return*/, cache];
|
@@ -296,7 +307,10 @@ var getResidentials = function (pref, city, town) { return __awaiter(void 0, voi
|
|
296
307
|
return __generator(this, function (_b) {
|
297
308
|
switch (_b.label) {
|
298
309
|
case 0:
|
299
|
-
|
310
|
+
if (currentConfig.interfaceVersion > 1) {
|
311
|
+
throw new Error("Invalid config.interfaceVersion: " + currentConfig.interfaceVersion + "'}. Please set config.interfaceVersion to 1.");
|
312
|
+
}
|
313
|
+
cacheKey = pref + "-" + city + "-" + town + "-v" + currentConfig.interfaceVersion;
|
300
314
|
cache = cachedResidentials[cacheKey];
|
301
315
|
if (typeof cache !== 'undefined') {
|
302
316
|
return [2 /*return*/, cache];
|
@@ -330,6 +344,39 @@ var getResidentials = function (pref, city, town) { return __awaiter(void 0, voi
|
|
330
344
|
}
|
331
345
|
});
|
332
346
|
}); };
|
347
|
+
var getAddrs = function (pref, city, town) { return __awaiter(void 0, void 0, void 0, function () {
|
348
|
+
var cacheKey, cache, addrsResp, addrs;
|
349
|
+
return __generator(this, function (_b) {
|
350
|
+
switch (_b.label) {
|
351
|
+
case 0:
|
352
|
+
if (currentConfig.interfaceVersion < 2) {
|
353
|
+
throw new Error("Invalid config.interfaceVersion: " + currentConfig.interfaceVersion + "'}. Please set config.interfaceVersion to 2 or higher");
|
354
|
+
}
|
355
|
+
cacheKey = pref + "-" + city + "-" + town + "-v" + currentConfig.interfaceVersion;
|
356
|
+
cache = cachedAddrs[cacheKey];
|
357
|
+
if (typeof cache !== 'undefined') {
|
358
|
+
return [2 /*return*/, cache];
|
359
|
+
}
|
360
|
+
return [4 /*yield*/, __internals.fetch(['', encodeURI(pref), encodeURI(city), encodeURI(town) + '.json'].join('/'), { level: 8, pref: pref, city: city, town: town })];
|
361
|
+
case 1:
|
362
|
+
addrsResp = _b.sent();
|
363
|
+
_b.label = 2;
|
364
|
+
case 2:
|
365
|
+
_b.trys.push([2, 4, , 5]);
|
366
|
+
return [4 /*yield*/, addrsResp.json()];
|
367
|
+
case 3:
|
368
|
+
addrs = (_b.sent());
|
369
|
+
return [3 /*break*/, 5];
|
370
|
+
case 4:
|
371
|
+
_b.sent();
|
372
|
+
addrs = [];
|
373
|
+
return [3 /*break*/, 5];
|
374
|
+
case 5:
|
375
|
+
addrs.sort(function (res1, res2) { return res1.addr.length - res2.addr.length; });
|
376
|
+
return [2 /*return*/, (cachedAddrs[cacheKey] = addrs)];
|
377
|
+
}
|
378
|
+
});
|
379
|
+
}); };
|
333
380
|
// 十六町 のように漢数字と町が連結しているか
|
334
381
|
var isKanjiNumberFollewedByCho = function (targetTownName) {
|
335
382
|
var xCho = targetTownName.match(/.町/g);
|
@@ -339,9 +386,9 @@ var isKanjiNumberFollewedByCho = function (targetTownName) {
|
|
339
386
|
return kanjiNumbers.length > 0;
|
340
387
|
};
|
341
388
|
var getTownRegexPatterns = function (pref, city) { return __awaiter(void 0, void 0, void 0, function () {
|
342
|
-
var cachedResult, pre_towns, townSet, towns, isKyoto, _i, pre_towns_1, town, originalTown, townAbbr, patterns;
|
343
|
-
return __generator(this, function (
|
344
|
-
switch (
|
389
|
+
var cachedResult, pre_towns, townSet, towns, isKyoto, _i, pre_towns_1, town, originalTown, townAbbr, patterns, _a, towns_1, town, chomeMatch, chomeNamePart, chomeNum, pattern;
|
390
|
+
return __generator(this, function (_b) {
|
391
|
+
switch (_b.label) {
|
345
392
|
case 0:
|
346
393
|
cachedResult = cachedTownRegexes.get(pref + "-" + city);
|
347
394
|
if (typeof cachedResult !== 'undefined') {
|
@@ -349,7 +396,7 @@ var getTownRegexPatterns = function (pref, city) { return __awaiter(void 0, void
|
|
349
396
|
}
|
350
397
|
return [4 /*yield*/, getTowns(pref, city)];
|
351
398
|
case 1:
|
352
|
-
pre_towns =
|
399
|
+
pre_towns = _b.sent();
|
353
400
|
townSet = new Set(pre_towns.map(function (town) { return town.town; }));
|
354
401
|
towns = [];
|
355
402
|
isKyoto = city.match(/^京都市/);
|
@@ -415,6 +462,18 @@ var getTownRegexPatterns = function (pref, city) { return __awaiter(void 0, void
|
|
415
462
|
}));
|
416
463
|
return [town, pattern];
|
417
464
|
});
|
465
|
+
// X丁目の丁目なしの数字だけ許容するため、最後に数字だけ追加していく
|
466
|
+
for (_a = 0, towns_1 = towns; _a < towns_1.length; _a++) {
|
467
|
+
town = towns_1[_a];
|
468
|
+
chomeMatch = town.town.match(/([^一二三四五六七八九十]+)([一二三四五六七八九十]+)(丁目?)/);
|
469
|
+
if (!chomeMatch) {
|
470
|
+
continue;
|
471
|
+
}
|
472
|
+
chomeNamePart = chomeMatch[1];
|
473
|
+
chomeNum = chomeMatch[2];
|
474
|
+
pattern = toRegexPattern("^" + chomeNamePart + "(" + chomeNum + "|" + kan2num(chomeNum) + ")");
|
475
|
+
patterns.push([town, pattern]);
|
476
|
+
}
|
418
477
|
cachedTownRegexes.set(pref + "-" + city, patterns);
|
419
478
|
return [2 /*return*/, patterns];
|
420
479
|
}
|
@@ -538,10 +597,32 @@ var normalizeResidentialPart = function (addr, pref, city, town) { return __awai
|
|
538
597
|
}
|
539
598
|
});
|
540
599
|
}); };
|
600
|
+
var normalizeAddrPart = function (addr, pref, city, town) { return __awaiter(void 0, void 0, void 0, function () {
|
601
|
+
var addrListItem, addrItem, other;
|
602
|
+
return __generator(this, function (_a) {
|
603
|
+
switch (_a.label) {
|
604
|
+
case 0: return [4 /*yield*/, getAddrs(pref, city, town)
|
605
|
+
// 住居表示住所、および地番住所が見つからなかった
|
606
|
+
];
|
607
|
+
case 1:
|
608
|
+
addrListItem = _a.sent();
|
609
|
+
// 住居表示住所、および地番住所が見つからなかった
|
610
|
+
if (addrListItem.length === 0) {
|
611
|
+
return [2 /*return*/, null];
|
612
|
+
}
|
613
|
+
addrItem = addrListItem.find(function (item) { return addr.startsWith(item.addr); });
|
614
|
+
if (addrItem) {
|
615
|
+
other = addr.replace(addrItem.addr, '').trim();
|
616
|
+
return [2 /*return*/, { addr: addrItem.addr, other: other, lat: addrItem.lat, lng: addrItem.lng }];
|
617
|
+
}
|
618
|
+
return [2 /*return*/, null];
|
619
|
+
}
|
620
|
+
});
|
621
|
+
}); };
|
541
622
|
var normalize$1 = function (address, _option) {
|
542
623
|
if (_option === void 0) { _option = defaultOption; }
|
543
624
|
return __awaiter(void 0, void 0, void 0, function () {
|
544
|
-
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, result;
|
625
|
+
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;
|
545
626
|
return __generator(this, function (_e) {
|
546
627
|
switch (_e.label) {
|
547
628
|
case 0:
|
@@ -684,7 +765,7 @@ var normalize$1 = function (address, _option) {
|
|
684
765
|
});
|
685
766
|
})
|
686
767
|
.replace(/(([0-9〇一二三四五六七八九十百千]+)(番地?)([0-9〇一二三四五六七八九十百千]+)号)\s*(.+)/, '$1 $5')
|
687
|
-
.replace(/([0-9〇一二三四五六七八九十百千]+)(番地?)([0-9〇一二三四五六七八九十百千]+)
|
768
|
+
.replace(/([0-9〇一二三四五六七八九十百千]+)\s*(番地?)\s*([0-9〇一二三四五六七八九十百千]+)\s*号?/, '$1-$3')
|
688
769
|
.replace(/([0-9〇一二三四五六七八九十百千]+)番地?/, '$1')
|
689
770
|
.replace(/([0-9〇一二三四五六七八九十百千]+)の/g, '$1-')
|
690
771
|
.replace(/([0-9〇一二三四五六七八九十百千]+)[--﹣−‐⁃‑‒–—﹘―⎯⏤ーー─━]/g, function (match) {
|
@@ -701,7 +782,7 @@ var normalize$1 = function (address, _option) {
|
|
701
782
|
// `-1` のようなケース
|
702
783
|
return kan2num(s);
|
703
784
|
})
|
704
|
-
.replace(/-[^0-9]
|
785
|
+
.replace(/-[^0-9]([0-9〇一二三四五六七八九十百千]+)/, function (s) {
|
705
786
|
// `-あ1` のようなケース
|
706
787
|
return kan2num(zen2han(s));
|
707
788
|
})
|
@@ -714,12 +795,52 @@ var normalize$1 = function (address, _option) {
|
|
714
795
|
_e.label = 8;
|
715
796
|
case 8:
|
716
797
|
addr = patchAddr(pref, city, town, addr);
|
717
|
-
if (
|
718
|
-
|
798
|
+
if (pref)
|
799
|
+
level = level + 1;
|
800
|
+
if (city)
|
801
|
+
level = level + 1;
|
802
|
+
if (town)
|
803
|
+
level = level + 1;
|
804
|
+
if (option.level <= 3 || level < 3) {
|
805
|
+
return [2 /*return*/, { pref: pref, city: city, town: town, addr: addr, level: level, lat: lat, lng: lng }];
|
806
|
+
}
|
807
|
+
if (!(currentConfig.interfaceVersion === 2)) return [3 /*break*/, 10];
|
808
|
+
return [4 /*yield*/, normalizeAddrPart(addr, pref, city, town)];
|
719
809
|
case 9:
|
720
|
-
|
721
|
-
|
810
|
+
normalizedAddrPart = _e.sent();
|
811
|
+
other = undefined;
|
812
|
+
if (normalizedAddrPart) {
|
813
|
+
addr = normalizedAddrPart.addr;
|
814
|
+
if (normalizedAddrPart.other) {
|
815
|
+
other = normalizedAddrPart.other;
|
816
|
+
}
|
817
|
+
if (normalizedAddrPart.lat !== null)
|
818
|
+
lat = parseFloat(normalizedAddrPart.lat);
|
819
|
+
if (normalizedAddrPart.lng !== null)
|
820
|
+
lng = parseFloat(normalizedAddrPart.lng);
|
821
|
+
level = 8;
|
822
|
+
}
|
823
|
+
result = {
|
824
|
+
pref: pref,
|
825
|
+
city: city,
|
826
|
+
town: town,
|
827
|
+
addr: addr,
|
828
|
+
level: level,
|
829
|
+
lat: lat,
|
830
|
+
lng: lng,
|
831
|
+
};
|
832
|
+
if (other) {
|
833
|
+
result.other = other;
|
834
|
+
}
|
835
|
+
return [2 /*return*/, result];
|
722
836
|
case 10:
|
837
|
+
if (!(currentConfig.interfaceVersion === 1)) return [3 /*break*/, 13];
|
838
|
+
if (!(option.level > 3 && normalized && town)) return [3 /*break*/, 12];
|
839
|
+
return [4 /*yield*/, normalizeResidentialPart(addr, pref, city, town)];
|
840
|
+
case 11:
|
841
|
+
normalized = _e.sent();
|
842
|
+
_e.label = 12;
|
843
|
+
case 12:
|
723
844
|
if (normalized) {
|
724
845
|
lat = parseFloat(normalized.lat);
|
725
846
|
lng = parseFloat(normalized.lng);
|
@@ -728,12 +849,6 @@ var normalize$1 = function (address, _option) {
|
|
728
849
|
lat = null;
|
729
850
|
lng = null;
|
730
851
|
}
|
731
|
-
if (pref)
|
732
|
-
level = level + 1;
|
733
|
-
if (city)
|
734
|
-
level = level + 1;
|
735
|
-
if (town)
|
736
|
-
level = level + 1;
|
737
852
|
result = {
|
738
853
|
pref: pref,
|
739
854
|
city: city,
|
@@ -753,45 +868,79 @@ var normalize$1 = function (address, _option) {
|
|
753
868
|
result.level = 8;
|
754
869
|
}
|
755
870
|
return [2 /*return*/, result];
|
871
|
+
case 13: throw new Error('invalid interfaceVersion');
|
756
872
|
}
|
757
873
|
});
|
758
874
|
});
|
759
875
|
};
|
760
876
|
|
761
|
-
var
|
762
|
-
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
|
767
|
-
|
768
|
-
|
769
|
-
|
770
|
-
|
771
|
-
|
772
|
-
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
778
|
-
|
779
|
-
|
780
|
-
|
781
|
-
|
782
|
-
|
783
|
-
});
|
784
|
-
}); },
|
785
|
-
}];
|
786
|
-
}
|
787
|
-
else {
|
788
|
-
throw new Error("Unknown URL schema: " + fileURL.protocol);
|
877
|
+
var requestHandlers = {
|
878
|
+
file: function (fileURL) {
|
879
|
+
var filePath = process.platform === 'win32'
|
880
|
+
? decodeURI(fileURL.pathname).substr(1)
|
881
|
+
: decodeURI(fileURL.pathname);
|
882
|
+
return {
|
883
|
+
json: function () { return __awaiter(void 0, void 0, void 0, function () {
|
884
|
+
var contents;
|
885
|
+
return __generator(this, function (_a) {
|
886
|
+
switch (_a.label) {
|
887
|
+
case 0: return [4 /*yield*/, fs.promises.readFile(filePath)];
|
888
|
+
case 1:
|
889
|
+
contents = _a.sent();
|
890
|
+
return [2 /*return*/, JSON.parse(contents.toString('utf-8'))];
|
891
|
+
}
|
892
|
+
});
|
893
|
+
}); },
|
894
|
+
};
|
895
|
+
},
|
896
|
+
http: function (fileURL) {
|
897
|
+
if (config$1.geoloniaApiKey) {
|
898
|
+
fileURL.search = "?geolonia-api-key=" + config$1.geoloniaApiKey;
|
789
899
|
}
|
900
|
+
return unfetch__default['default'](fileURL.toString());
|
901
|
+
},
|
902
|
+
};
|
903
|
+
/**
|
904
|
+
* 正規化のためのデータを取得する
|
905
|
+
* @param input - Path part like '東京都/文京区.json'
|
906
|
+
* @param requestOptions - input を構造化したデータ
|
907
|
+
*/
|
908
|
+
var fetchOrReadFile = function (input, requestOptions) {
|
909
|
+
if (requestOptions === void 0) { requestOptions = { level: -1 }; }
|
910
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
911
|
+
var fileURL, result_1;
|
912
|
+
return __generator(this, function (_a) {
|
913
|
+
switch (_a.label) {
|
914
|
+
case 0:
|
915
|
+
fileURL = new URL("" + config$1.japaneseAddressesApi + input);
|
916
|
+
if (!(config$1.transformRequest && requestOptions.level !== -1)) return [3 /*break*/, 2];
|
917
|
+
return [4 /*yield*/, config$1.transformRequest(fileURL, requestOptions)];
|
918
|
+
case 1:
|
919
|
+
result_1 = _a.sent();
|
920
|
+
return [2 /*return*/, {
|
921
|
+
json: function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
|
922
|
+
return [2 /*return*/, Promise.resolve(result_1)];
|
923
|
+
}); }); },
|
924
|
+
}];
|
925
|
+
case 2:
|
926
|
+
if (fileURL.protocol === 'http:' || fileURL.protocol === 'https:') {
|
927
|
+
return [2 /*return*/, requestHandlers.http(fileURL)];
|
928
|
+
}
|
929
|
+
else if (fileURL.protocol === 'file:') {
|
930
|
+
return [2 /*return*/, requestHandlers.file(fileURL)];
|
931
|
+
}
|
932
|
+
else {
|
933
|
+
throw new Error("Unknown URL schema: " + fileURL.protocol);
|
934
|
+
}
|
935
|
+
case 3: return [2 /*return*/];
|
936
|
+
}
|
937
|
+
});
|
790
938
|
});
|
791
|
-
}
|
939
|
+
};
|
792
940
|
__internals.fetch = fetchOrReadFile;
|
793
941
|
var config = config$1;
|
794
942
|
var normalize = normalize$1;
|
795
943
|
|
796
944
|
exports.config = config;
|
797
945
|
exports.normalize = normalize;
|
946
|
+
exports.requestHandlers = requestHandlers;
|
@@ -1,18 +1,35 @@
|
|
1
|
+
import { PrefectureList, TownList, AddrList } from './lib/cacheRegexes';
|
2
|
+
declare type TransformRequestResponse = null | PrefectureList | TownList | AddrList;
|
3
|
+
export declare type TransformRequestQuery = {
|
4
|
+
level: number;
|
5
|
+
pref?: string;
|
6
|
+
city?: string;
|
7
|
+
town?: string;
|
8
|
+
};
|
9
|
+
export declare type TransformRequestFunction = (url: URL, query: TransformRequestQuery) => TransformRequestResponse | Promise<TransformRequestResponse>;
|
1
10
|
/**
|
2
11
|
* normalize {@link Normalizer} の動作オプション。
|
3
12
|
*/
|
4
13
|
export interface Config {
|
14
|
+
/**
|
15
|
+
* レスポンス型のバージョン。デフォルト 1
|
16
|
+
* 1 の場合は jyukyo: string, gaiku: string
|
17
|
+
* 2 の場合は addr: string, other: string
|
18
|
+
*/
|
19
|
+
interfaceVersion: number;
|
5
20
|
/** 住所データを URL 形式で指定。 file:// 形式で指定するとローカルファイルを参照できます。 */
|
6
21
|
japaneseAddressesApi: string;
|
7
22
|
/** 町丁目のデータを何件までキャッシュするか。デフォルト 1,000 */
|
8
23
|
townCacheSize: number;
|
24
|
+
/** 住所データへのリクエストを変形するオプション。 interfaceVersion === 2 で有効 */
|
25
|
+
transformRequest?: TransformRequestFunction;
|
9
26
|
geoloniaApiKey?: string;
|
10
27
|
}
|
11
28
|
export declare const config: Config;
|
12
29
|
/**
|
13
30
|
* 住所の正規化結果として戻されるオブジェクト
|
14
31
|
*/
|
15
|
-
|
32
|
+
interface NormalizeResult_v1 {
|
16
33
|
/** 都道府県 */
|
17
34
|
pref: string;
|
18
35
|
/** 市区町村 */
|
@@ -27,7 +44,7 @@ export interface NormalizeResult {
|
|
27
44
|
addr: string;
|
28
45
|
/** 緯度。データが存在しない場合は null */
|
29
46
|
lat: number | null;
|
30
|
-
/**
|
47
|
+
/** 経度。データが存在しない場合は null */
|
31
48
|
lng: number | null;
|
32
49
|
/**
|
33
50
|
* 住所文字列をどこまで判別できたかを表す正規化レベル
|
@@ -40,6 +57,32 @@ export interface NormalizeResult {
|
|
40
57
|
*/
|
41
58
|
level: number;
|
42
59
|
}
|
60
|
+
declare type NormalizeResult_v2 = {
|
61
|
+
/** 都道府県 */
|
62
|
+
pref: string;
|
63
|
+
/** 市区町村 */
|
64
|
+
city: string;
|
65
|
+
/** 町丁目 */
|
66
|
+
town: string;
|
67
|
+
/** 住居表示または地番 */
|
68
|
+
addr: string;
|
69
|
+
/** 正規化後の住所文字列 */
|
70
|
+
other?: string;
|
71
|
+
/** 緯度。データが存在しない場合は null */
|
72
|
+
lat: number | null;
|
73
|
+
/** 経度。データが存在しない場合は null */
|
74
|
+
lng: number | null;
|
75
|
+
/**
|
76
|
+
* 住所文字列をどこまで判別できたかを表す正規化レベル
|
77
|
+
* - 0 - 都道府県も判別できなかった。
|
78
|
+
* - 1 - 都道府県まで判別できた。
|
79
|
+
* - 2 - 市区町村まで判別できた。
|
80
|
+
* - 3 - 町丁目まで判別できた。
|
81
|
+
* - 8 - 住居表示住所の街区符号・住居番号までの判別または地番住所の判別ができた。
|
82
|
+
*/
|
83
|
+
level: number;
|
84
|
+
};
|
85
|
+
export declare type NormalizeResult = NormalizeResult_v1 | NormalizeResult_v2;
|
43
86
|
/**
|
44
87
|
* 正規化関数の {@link normalize} のオプション
|
45
88
|
*/
|
@@ -64,7 +107,7 @@ export interface Option {
|
|
64
107
|
* @see https://github.com/geolonia/normalize-japanese-addresses#normalizeaddress-string
|
65
108
|
*/
|
66
109
|
export declare type Normalizer = (input: string, option?: Option) => Promise<NormalizeResult>;
|
67
|
-
export declare type FetchLike = (input: string) => Promise<Response | {
|
110
|
+
export declare type FetchLike = (input: string, requestQuery?: TransformRequestQuery) => Promise<Response | {
|
68
111
|
json: () => Promise<unknown>;
|
69
112
|
}>;
|
70
113
|
/**
|
@@ -74,3 +117,4 @@ export declare const __internals: {
|
|
74
117
|
fetch: FetchLike;
|
75
118
|
};
|
76
119
|
export declare const normalize: Normalizer;
|
120
|
+
export {};
|
@@ -1,19 +1,23 @@
|
|
1
1
|
{
|
2
2
|
"name": "@geolonia/normalize-japanese-addresses",
|
3
|
-
"version": "2.
|
3
|
+
"version": "2.9.2",
|
4
4
|
"description": "",
|
5
5
|
"browser": "./dist/main-browser.js",
|
6
6
|
"main": "./dist/main-node.js",
|
7
7
|
"types": "./dist/normalize.d.ts",
|
8
8
|
"scripts": {
|
9
|
-
"test": "npm run test:main && npm run test:addresses && npm run test:node && npm run test:
|
9
|
+
"test": "npm run test:main && npm run test:addresses && npm run test:node:platform && npm run test:advanced",
|
10
|
+
"test:node:platform": "npm run test:node-win || npm run test:node",
|
10
11
|
"test:main": "jest test/main.test.ts",
|
11
12
|
"test:addresses": "jest test/addresses.test.ts",
|
12
|
-
"test:
|
13
|
-
"test:
|
13
|
+
"test:advanced": "jest test/advanced --runInBand",
|
14
|
+
"test:util": "jest test/util.test.ts",
|
15
|
+
"test:node": "curl -sL https://github.com/geolonia/japanese-addresses/archive/refs/heads/master.tar.gz | tar xvfz - -C ./test > nul 2>&1 && jest test/fs.test.ts",
|
16
|
+
"test:node-win": "curl -sL https://github.com/geolonia/japanese-addresses/archive/refs/heads/master.tar.gz -o master.tar.gz && 7z x master.tar.gz -y -o./ && 7z x ./master.tar -y -o./test && del master.tar.gz master.tar && jest test/fs.test.ts",
|
14
17
|
"test:generate-test-data": "npx ts-node -O '{\"module\":\"commonjs\"}' test/build-test-data.ts > test/addresses.csv",
|
15
18
|
"lint": "eslint \"src/**/*.ts\" \"test/**/*.test.ts\" --fix",
|
16
|
-
"build": "
|
19
|
+
"build": "npm run clean && rollup -c rollup.config.ts",
|
20
|
+
"clean": "node -e \"const fs = require('fs'); try { fs.rmSync('dist', { recursive: true, force: true }) } catch (err) { console.error(err) }\""
|
17
21
|
},
|
18
22
|
"author": "",
|
19
23
|
"license": "MIT",
|
@@ -25,4 +25,13 @@ export default [
|
|
25
25
|
output: { file: pkg.main, format: 'cjs' },
|
26
26
|
plugins: [typescript()],
|
27
27
|
},
|
28
|
+
{
|
29
|
+
input: 'src/main-es.ts',
|
30
|
+
output: {
|
31
|
+
dir: 'dist',
|
32
|
+
name: 'normalize',
|
33
|
+
format: 'esm',
|
34
|
+
},
|
35
|
+
plugins: [typescript(), resolve({ browser: true }), commonjs()],
|
36
|
+
},
|
28
37
|
]
|