japanese_address_parser 2.2.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/Gemfile.lock +1 -1
  4. data/js/node_modules/.package-lock.json +7 -7
  5. data/js/node_modules/@geolonia/japanese-numeral/dist/index.js +1 -1
  6. data/js/node_modules/@geolonia/japanese-numeral/dist/oldJapaneseNumerics.js +1 -0
  7. data/js/node_modules/@geolonia/japanese-numeral/dist/utils.js +5 -1
  8. data/js/node_modules/@geolonia/japanese-numeral/package.json +1 -1
  9. data/js/node_modules/@geolonia/japanese-numeral/src/index.ts +1 -1
  10. data/js/node_modules/@geolonia/japanese-numeral/src/oldJapaneseNumerics.ts +1 -0
  11. data/js/node_modules/@geolonia/japanese-numeral/src/utils.ts +6 -1
  12. data/js/node_modules/@geolonia/japanese-numeral/test/test.ts +5 -0
  13. data/js/node_modules/@geolonia/normalize-japanese-addresses/README.md +21 -14
  14. data/js/node_modules/@geolonia/normalize-japanese-addresses/dist/config.d.ts +1 -5
  15. data/js/node_modules/@geolonia/normalize-japanese-addresses/dist/lib/cacheRegexes.d.ts +1 -0
  16. data/js/node_modules/@geolonia/normalize-japanese-addresses/dist/main-browser.d.ts +1 -1
  17. data/js/node_modules/@geolonia/normalize-japanese-addresses/dist/main-browser.js +94 -36
  18. data/js/node_modules/@geolonia/normalize-japanese-addresses/dist/main-node.d.ts +1 -1
  19. data/js/node_modules/@geolonia/normalize-japanese-addresses/dist/main-node.js +88 -35
  20. data/js/node_modules/@geolonia/normalize-japanese-addresses/dist/normalize.d.ts +13 -0
  21. data/js/node_modules/@geolonia/normalize-japanese-addresses/package.json +4 -4
  22. data/js/node_modules/@geolonia/normalize-japanese-addresses/src/config.ts +1 -6
  23. data/js/node_modules/@geolonia/normalize-japanese-addresses/src/lib/cacheRegexes.ts +45 -9
  24. data/js/node_modules/@geolonia/normalize-japanese-addresses/src/lib/dict.ts +2 -2
  25. data/js/node_modules/@geolonia/normalize-japanese-addresses/src/main-browser.ts +1 -2
  26. data/js/node_modules/@geolonia/normalize-japanese-addresses/src/main-node.ts +2 -3
  27. data/js/node_modules/@geolonia/normalize-japanese-addresses/src/normalize.ts +43 -15
  28. data/js/package-lock.json +14 -14
  29. data/lib/japanese_address_parser/data/01-01204.csv +1 -1
  30. data/lib/japanese_address_parser/data/01-01206.csv +2 -2
  31. data/lib/japanese_address_parser/data/01-01210.csv +1 -1
  32. data/lib/japanese_address_parser/data/01-01224.csv +1 -1
  33. data/lib/japanese_address_parser/data/01-01230.csv +1 -1
  34. data/lib/japanese_address_parser/data/01-01303.csv +1 -1
  35. data/lib/japanese_address_parser/data/01-01407.csv +3 -3
  36. data/lib/japanese_address_parser/data/01-01610.csv +1 -1
  37. data/lib/japanese_address_parser/data/01-01632.csv +1 -1
  38. data/lib/japanese_address_parser/data/01-01637.csv +1 -1
  39. data/lib/japanese_address_parser/data/01-01646.csv +1 -1
  40. data/lib/japanese_address_parser/data/01-01691.csv +1 -1
  41. data/lib/japanese_address_parser/data/03-03202.csv +1 -1
  42. data/lib/japanese_address_parser/data/03-03205.csv +29 -29
  43. data/lib/japanese_address_parser/data/03-03209.csv +56 -56
  44. data/lib/japanese_address_parser/data/03-03213.csv +1 -1
  45. data/lib/japanese_address_parser/data/03-03302.csv +1 -1
  46. data/lib/japanese_address_parser/data/03-03366.csv +1 -1
  47. data/lib/japanese_address_parser/data/03-03483.csv +1 -1
  48. data/lib/japanese_address_parser/data/03-03524.csv +1 -1
  49. data/lib/japanese_address_parser/data/04-04101.csv +6 -6
  50. data/lib/japanese_address_parser/data/04-04206.csv +32 -32
  51. data/lib/japanese_address_parser/data/04-04207.csv +41 -41
  52. data/lib/japanese_address_parser/data/06-06203.csv +1 -1
  53. data/lib/japanese_address_parser/data/07-07207.csv +1 -1
  54. data/lib/japanese_address_parser/data/07-07301.csv +2 -2
  55. data/lib/japanese_address_parser/data/11-11201.csv +3 -3
  56. data/lib/japanese_address_parser/data/12-12211.csv +1 -1
  57. data/lib/japanese_address_parser/data/12-12215.csv +2 -2
  58. data/lib/japanese_address_parser/data/13-13103.csv +2 -2
  59. data/lib/japanese_address_parser/data/13-13104.csv +3 -3
  60. data/lib/japanese_address_parser/data/13-13116.csv +5 -5
  61. data/lib/japanese_address_parser/data/14-14402.csv +2 -2
  62. data/lib/japanese_address_parser/data/15-15210.csv +5 -5
  63. data/lib/japanese_address_parser/data/15-15222.csv +4 -4
  64. data/lib/japanese_address_parser/data/15-15226.csv +1 -1
  65. data/lib/japanese_address_parser/data/16-16207.csv +1 -1
  66. data/lib/japanese_address_parser/data/16-16323.csv +2 -2
  67. data/lib/japanese_address_parser/data/17-17201.csv +26 -26
  68. data/lib/japanese_address_parser/data/17-17202.csv +1 -1
  69. data/lib/japanese_address_parser/data/17-17206.csv +29 -29
  70. data/lib/japanese_address_parser/data/19-19209.csv +1 -1
  71. data/lib/japanese_address_parser/data/19-19213.csv +2 -2
  72. data/lib/japanese_address_parser/data/20-20210.csv +1 -1
  73. data/lib/japanese_address_parser/data/20-20385.csv +14 -0
  74. data/lib/japanese_address_parser/data/20.csv +1 -13
  75. data/lib/japanese_address_parser/data/22-22135.csv +1 -1
  76. data/lib/japanese_address_parser/data/22-22209.csv +1 -1
  77. data/lib/japanese_address_parser/data/22-22210.csv +1 -1
  78. data/lib/japanese_address_parser/data/22-22211.csv +1 -1
  79. data/lib/japanese_address_parser/data/22-22325.csv +2 -2
  80. data/lib/japanese_address_parser/data/22-22341.csv +1 -1
  81. data/lib/japanese_address_parser/data/23-23105.csv +5 -5
  82. data/lib/japanese_address_parser/data/24-24205.csv +1 -1
  83. data/lib/japanese_address_parser/data/25-25202.csv +1 -1
  84. data/lib/japanese_address_parser/data/26-26102.csv +14 -14
  85. data/lib/japanese_address_parser/data/26-26103.csv +1 -1
  86. data/lib/japanese_address_parser/data/26-26104.csv +9 -9
  87. data/lib/japanese_address_parser/data/26-26105.csv +4 -4
  88. data/lib/japanese_address_parser/data/26-26106.csv +15 -15
  89. data/lib/japanese_address_parser/data/26-26107.csv +1 -1
  90. data/lib/japanese_address_parser/data/27-27145.csv +1 -1
  91. data/lib/japanese_address_parser/data/27-27202.csv +1 -1
  92. data/lib/japanese_address_parser/data/27-27208.csv +2 -2
  93. data/lib/japanese_address_parser/data/27-27211.csv +1 -1
  94. data/lib/japanese_address_parser/data/27-27227.csv +2 -2
  95. data/lib/japanese_address_parser/data/28-28109.csv +41 -41
  96. data/lib/japanese_address_parser/data/28-28201.csv +1 -1
  97. data/lib/japanese_address_parser/data/28-28204.csv +1 -1
  98. data/lib/japanese_address_parser/data/28-28208.csv +7 -7
  99. data/lib/japanese_address_parser/data/28-28217.csv +3 -3
  100. data/lib/japanese_address_parser/data/28-28226.csv +1 -1
  101. data/lib/japanese_address_parser/data/29-29201.csv +50 -50
  102. data/lib/japanese_address_parser/data/29-29203.csv +1 -1
  103. data/lib/japanese_address_parser/data/30-30304.csv +3 -3
  104. data/lib/japanese_address_parser/data/34-34210.csv +2 -2
  105. data/lib/japanese_address_parser/data/35-35201.csv +1 -1
  106. data/lib/japanese_address_parser/data/35-35213.csv +2 -2
  107. data/lib/japanese_address_parser/data/36-36201.csv +15 -15
  108. data/lib/japanese_address_parser/data/36-36202.csv +14 -14
  109. data/lib/japanese_address_parser/data/36-36207.csv +3 -3
  110. data/lib/japanese_address_parser/data/36-36208.csv +1 -1
  111. data/lib/japanese_address_parser/data/36-36468.csv +23 -23
  112. data/lib/japanese_address_parser/data/38-38202.csv +1 -1
  113. data/lib/japanese_address_parser/data/38-38203.csv +1 -1
  114. data/lib/japanese_address_parser/data/38-38210.csv +1 -1
  115. data/lib/japanese_address_parser/data/38-38422.csv +2 -2
  116. data/lib/japanese_address_parser/data/39-39206.csv +1 -1
  117. data/lib/japanese_address_parser/data/39-39210.csv +1 -1
  118. data/lib/japanese_address_parser/data/39-39212.csv +3 -3
  119. data/lib/japanese_address_parser/data/39-39386.csv +2 -2
  120. data/lib/japanese_address_parser/data/39-39412.csv +1 -1
  121. data/lib/japanese_address_parser/data/40-40131.csv +7 -7
  122. data/lib/japanese_address_parser/data/41-41201.csv +1 -1
  123. data/lib/japanese_address_parser/data/42-42214.csv +1 -1
  124. data/lib/japanese_address_parser/data/43-43101.csv +2 -2
  125. data/lib/japanese_address_parser/data/43-43204.csv +1 -1
  126. data/lib/japanese_address_parser/data/43-43205.csv +2 -2
  127. data/lib/japanese_address_parser/data/43-43215.csv +3 -3
  128. data/lib/japanese_address_parser/data/44-44204.csv +1 -1
  129. data/lib/japanese_address_parser/data/45-45201.csv +2 -2
  130. data/lib/japanese_address_parser/data/45-45202.csv +1 -1
  131. data/lib/japanese_address_parser/data/45-45203.csv +2 -2
  132. data/lib/japanese_address_parser/data/46-46201.csv +2 -2
  133. data/lib/japanese_address_parser/data/46-46210.csv +1 -1
  134. data/lib/japanese_address_parser/data/46-46215.csv +1 -1
  135. data/lib/japanese_address_parser/data/46-46216.csv +1 -1
  136. data/lib/japanese_address_parser/data/46-46217.csv +4 -4
  137. data/lib/japanese_address_parser/data/46-46218.csv +3 -3
  138. data/lib/japanese_address_parser/data/46-46221.csv +1 -1
  139. data/lib/japanese_address_parser/version.rb +1 -1
  140. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c72404909fd5b006109dce08ec33c77f8cc0b592dd7a8f33aee8c0cbd269a883
4
- data.tar.gz: ee2da5984f6e06ef0739e18bcac4f17b53b86b764d59e178fb23b06792324678
3
+ metadata.gz: 713a2974b9ccf061e4c834969e879e37918ffc49c8b312a63daf42b91abc98a1
4
+ data.tar.gz: a3e41f696082da17e49b29ddec7a52228c8526fd8f74a9929f88aac9ba9b90a6
5
5
  SHA512:
6
- metadata.gz: 708d3a884f7c4d6da95944da2da0450e1fcde68fcee1193be497a03130432d3205e25625d9cd23dd1b7935a49d11374489b51594a0c0853474b33fd2cfed7ea4
7
- data.tar.gz: c8eb589b93201d7e20fdb905a157925e2d984a0135c1e72f32828ef14bffc2bd09de7b225824c01ba71e93370f565a79d2070f79899b3f1c72e730d967c781af
6
+ metadata.gz: e77067fd81c5347bfbe5af1d87f2da12de8814024c08bc79cfbdcd0c0eae2282b5a55a4cb62d789024b5fe028e62b39432c16bf5ab85dd29a9d2b845677640b8
7
+ data.tar.gz: 3d92174c193a17f0eb7566d7bec1ea54cddb22dca403dcd1c8e365a3c34c164404ce09ce00ed4f3cb9ff3bbd9243363ded73eca87c7ea80128dc776c8d5fba29
data/CHANGELOG.md CHANGED
@@ -17,6 +17,12 @@ Change Log の形式は [Keep a Changelog](http://keepachangelog.com/) に従い
17
17
 
18
18
  ### Security
19
19
 
20
+ ## [2.2.1] - 2022-07-16
21
+ ### Changed
22
+
23
+ - [#45](https://github.com/yamat47/japanese_address_parser/pull/45) geolonia/japanese-addressesのバージョンを上げた。([@yamat47](https://github.com/yamat47))
24
+ - [#46](https://github.com/yamat47/japanese_address_parser/pull/46) CIでRSpecを並列実行させるようにした。([@yamat47](https://github.com/yamat47))
25
+
20
26
  ## [2.2.0] - 2022-03-12
21
27
  ### Added
22
28
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- japanese_address_parser (2.2.0)
4
+ japanese_address_parser (2.2.1)
5
5
  schmooze
6
6
 
7
7
  GEM
@@ -4,16 +4,16 @@
4
4
  "requires": true,
5
5
  "packages": {
6
6
  "node_modules/@geolonia/japanese-numeral": {
7
- "version": "0.1.15",
8
- "resolved": "https://registry.npmjs.org/@geolonia/japanese-numeral/-/japanese-numeral-0.1.15.tgz",
9
- "integrity": "sha512-g8xizIJH7sfd5JSJyN6pCbNNWVkasMpw84gpYQZJ09VDuTT5qzT5cKhr3+pFyS4SpfwQ9rrsJBmeD6z3vI2bjA=="
7
+ "version": "0.1.16",
8
+ "resolved": "https://registry.npmjs.org/@geolonia/japanese-numeral/-/japanese-numeral-0.1.16.tgz",
9
+ "integrity": "sha512-xzSsIHhyyjqNpW8qSh5bFMu3FJvyJGBbNZ/t8clPHkigjUdZ7Ck8wkzCkcwlVd00RkoHwGDLnvXx5W0WiGK0TQ=="
10
10
  },
11
11
  "node_modules/@geolonia/normalize-japanese-addresses": {
12
- "version": "2.5.1",
13
- "resolved": "https://registry.npmjs.org/@geolonia/normalize-japanese-addresses/-/normalize-japanese-addresses-2.5.1.tgz",
14
- "integrity": "sha512-aIAkkyNnK7AVtP7ArTxNtx11pNpuQF3xiQ60PVG0N0MkpZom5qQ2JpgthHFdxh5ZEQA/ol5yFqPNdopKRIXytA==",
12
+ "version": "2.5.8",
13
+ "resolved": "https://registry.npmjs.org/@geolonia/normalize-japanese-addresses/-/normalize-japanese-addresses-2.5.8.tgz",
14
+ "integrity": "sha512-mv3+vHU2qXPjn2wbZH2p8kOKp7zTdcwCAWz8yryyyM5OGCRjHiqGBg+1t78Ut8b0wopyLJ7GjNanIoflEEKVeg==",
15
15
  "dependencies": {
16
- "@geolonia/japanese-numeral": "^0.1.15",
16
+ "@geolonia/japanese-numeral": "^0.1.16",
17
17
  "isomorphic-unfetch": "^3.1.0",
18
18
  "lru-cache": "^6.0.0"
19
19
  }
@@ -52,7 +52,7 @@ function number2kanji(num) {
52
52
  }
53
53
  exports.number2kanji = number2kanji;
54
54
  function findKanjiNumbers(text) {
55
- const num = '([0-90-9]*)|([〇一二三四五六七八九壱壹弐貳貮参參肆伍陸漆捌玖]*)';
55
+ const num = '([0-90-9]*)|([〇一二三四五六七八九壱壹弐弍貳貮参參肆伍陸漆捌玖]*)';
56
56
  const basePattern = `((${num})(千|阡|仟))?((${num})(百|陌|佰))?((${num})(十|拾))?(${num})?`;
57
57
  const pattern = `((${basePattern}兆)?(${basePattern}億)?(${basePattern}(万|萬))?${basePattern})`;
58
58
  const regex = new RegExp(pattern, 'g');
@@ -5,6 +5,7 @@ const oldJapaneseNumerics = {
5
5
  壱: '一',
6
6
  壹: '一',
7
7
  弐: '二',
8
+ 弍: '二',
8
9
  貳: '二',
9
10
  貮: '二',
10
11
  参: '三',
@@ -72,7 +72,11 @@ function kan2n(japanese) {
72
72
  number = number + Number(kanji);
73
73
  }
74
74
  else {
75
- number = number + japaneseNumerics_1.default[kanji];
75
+ for (let index = 0; index < kanji.length; index++) {
76
+ const char = kanji[index];
77
+ const digit = kanji.length - index - 1;
78
+ number = number + japaneseNumerics_1.default[char] * (10 ** digit);
79
+ }
76
80
  }
77
81
  }
78
82
  return number;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geolonia/japanese-numeral",
3
- "version": "0.1.15",
3
+ "version": "0.1.16",
4
4
  "description": "Converts Japanese Kanji numeral to number.",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -59,7 +59,7 @@ export function number2kanji(num: number) {
59
59
  }
60
60
 
61
61
  export function findKanjiNumbers(text: string) {
62
- const num = '([0-90-9]*)|([〇一二三四五六七八九壱壹弐貳貮参參肆伍陸漆捌玖]*)'
62
+ const num = '([0-90-9]*)|([〇一二三四五六七八九壱壹弐弍貳貮参參肆伍陸漆捌玖]*)'
63
63
  const basePattern = `((${num})(千|阡|仟))?((${num})(百|陌|佰))?((${num})(十|拾))?(${num})?`
64
64
  const pattern = `((${basePattern}兆)?(${basePattern}億)?(${basePattern}(万|萬))?${basePattern})`
65
65
  const regex = new RegExp(pattern, 'g')
@@ -7,6 +7,7 @@ const oldJapaneseNumerics: oldJapaneseNumericsType = {
7
7
  壱: '一',
8
8
  壹: '一',
9
9
  弐: '二',
10
+ 弍: '二',
10
11
  貳: '二',
11
12
  貮: '二',
12
13
  参: '三',
@@ -77,7 +77,12 @@ export function kan2n(japanese: string) {
77
77
  if (kanji.match(/^[0-9]+$/)) {
78
78
  number = number + Number(kanji)
79
79
  } else {
80
- number = number + japaneseNumerics[kanji]
80
+ for (let index = 0; index < kanji.length; index++) {
81
+ const char = kanji[index];
82
+ const digit = kanji.length - index - 1
83
+ number = number + japaneseNumerics[char] * (10 ** digit)
84
+
85
+ }
81
86
  }
82
87
  }
83
88
 
@@ -13,7 +13,11 @@ describe('Tests for japaneseNumeral.', () => {
13
13
  assert.deepEqual(kanji2number('二〇二〇'), 2020)
14
14
  assert.deepEqual(kanji2number('二千'), 2000)
15
15
  assert.deepEqual(kanji2number('壱万'), 10000)
16
+ assert.deepEqual(kanji2number('弍万'), 20000)
16
17
  assert.deepEqual(kanji2number('一二三四'), 1234)
18
+ assert.deepEqual(kanji2number('千二三四'), 1234)
19
+ assert.deepEqual(kanji2number('千二百三四'), 1234)
20
+ assert.deepEqual(kanji2number('千二百三十四'), 1234)
17
21
  assert.deepEqual(kanji2number('壱阡陌拾壱兆壱阡陌拾壱億壱阡陌拾壱萬壱阡陌拾壱'), 1111111111111111)
18
22
  assert.deepEqual(kanji2number('壱仟佰拾壱兆壱仟佰拾壱億壱仟佰拾壱萬壱仟佰拾壱'), 1111111111111111)
19
23
  });
@@ -62,6 +66,7 @@ describe('Tests for japaneseNumeral.', () => {
62
66
 
63
67
  it('should find old Japanese Kanji numbers.', () => {
64
68
  assert.deepEqual([ '壱', '弐' ], findKanjiNumbers('私が住んでいるのは壱番館の弐号室です。'))
69
+ assert.deepEqual([ '弍' ], findKanjiNumbers('私は、ハイツ弍号棟に住んでいます。'))
65
70
  assert.deepEqual([ '壱阡陌拾壱兆壱億壱萬', ], findKanjiNumbers('私は、壱阡陌拾壱兆壱億壱萬円持っています。'))
66
71
  assert.deepEqual([ '壱仟佰拾壱兆壱億壱萬', ], findKanjiNumbers('私は、壱仟佰拾壱兆壱億壱萬円持っています。'))
67
72
  })
@@ -1,6 +1,6 @@
1
1
  # @geolonia/normalize-japanese-addresses
2
2
 
3
- ![build](https://github.com/geolonia/normalize-japanese-addresses/workflows/build/badge.svg)
3
+ [![build](https://github.com/geolonia/normalize-japanese-addresses/actions/workflows/build.yml/badge.svg)](https://github.com/geolonia/normalize-japanese-addresses/actions/workflows/build.yml)
4
4
 
5
5
  オープンソースの住所正規化ライブラリです。
6
6
 
@@ -10,7 +10,7 @@
10
10
 
11
11
  https://codepen.io/geolonia/pen/oNBrqzL
12
12
 
13
- ## 使い方
13
+ ## インストール
14
14
 
15
15
  ライブラリは npm レジストリで `@geolonia/normalize-japanese-addresses` として配布されています。
16
16
  npm コマンドなどを使ってインストールして下さい。
@@ -19,7 +19,9 @@ npm コマンドなどを使ってインストールして下さい。
19
19
  $ npm install @geolonia/normalize-japanese-addresses -S
20
20
  ```
21
21
 
22
- ### `normalize(address: string)`
22
+ ## 使い方
23
+
24
+ ### `normalize(address: string, option: Option)`
23
25
 
24
26
  住所を正規化します。
25
27
 
@@ -37,20 +39,22 @@ normalize('北海道札幌市西区24-2-2-3-3').then(result => {
37
39
  * `2` - 市区町村まで判別できた。
38
40
  * `3` - 町丁目まで判別できた。
39
41
 
40
- 例えば都道府県名のみを正規化したい場合、`level` オプションで指定することで処理を早くすることができます。
42
+ 例えば都道府県名のみを正規化したい場合、`level` オプションで指定することで処理を速くすることができます。
41
43
 
42
44
  ```javascript
43
45
  const { normalize } = require('@geolonia/normalize-japanese-addresses')
44
- normalize('北海道札幌市西区24-2-2-3-3', {level}).then(result => {
46
+ normalize('北海道札幌市西区24-2-2-3-3', { level: 1 }).then(result => {
45
47
  console.log(result); // {"pref": "北海道", "city": "", "town": "", "addr": "札幌市西区二十四軒二条二丁目3-3", "lat": null, "lng": null, "level"; 1}
46
48
  })
47
49
  ```
48
50
 
49
- ### オプション
51
+ ### グローバルオプション
52
+
53
+ 以下のパラメーターを変更することでライブラリの動作全体に関わる設定が変更できます。
50
54
 
51
55
  #### `config.townCacheSize: number`
52
56
 
53
- @geolonia/normalize-japanese-addresses は市区町村毎の最新の町丁目のデータを web API から取得し住所の正規化を行います。 `townCacheSize` オプションはキャッシュする市区町村の数を変更します。デフォルトは 1,000 件になっています。
57
+ @geolonia/normalize-japanese-addresses は市区町村毎の最新の町丁目のデータを web API から取得し住所の正規化を行います。`townCacheSize` オプションはキャッシュする市区町村の数を変更します。デフォルトは 1,000 件になっています。
54
58
 
55
59
  #### `config.japaneseAddressesApi: string`
56
60
 
@@ -58,9 +62,11 @@ normalize('北海道札幌市西区24-2-2-3-3', {level}).then(result => {
58
62
 
59
63
  このオプションに対して `file://` 形式の URL を指定することで、ローカルファイルとして保存したファイルを参照することができます。
60
64
 
65
+ ##### 使用例
66
+
61
67
  ```shell
62
68
  # Geolonia 住所データのダウンロード
63
- $ curl -sL https://github.com/geolonia/japanese-addresses/archive/refs/heads/master.tar.gz | tar xvf -
69
+ $ curl -sL https://github.com/geolonia/japanese-addresses/archive/refs/heads/master.tar.gz | tar xvfz -
64
70
  ```
65
71
 
66
72
  ```javascript
@@ -108,12 +114,13 @@ $ npm install
108
114
  $ npm run build
109
115
  ```
110
116
 
111
- dist フォルダ以下に main.js など必要なファイルが生成されるので、
117
+ dist フォルダ以下に main-node.js など必要なファイルが生成されるので、
112
118
 
113
- ```
114
- const { normalize } = require('./dist/main-node.js')
115
- normalize('北海道札幌市西区24-2-2-3-3', {level: 3}).then(result => {
116
- console.log(result); // {"pref": "北海道", "city": "", "town": "", "addr": "札幌市西区二十四軒二条二丁目3-3", "level"; 1}
119
+ ```javascript
120
+ // sample.js
121
+ const { normalize } = require('./dist/main-node.js');
122
+ normalize('北海道札幌市西区24-2-2-3-3', { level: 3 }).then(result => {
123
+ console.log(result); // { "pref": "北海道", "city": "", "town": "", "addr": "札幌市西区二十四軒二条二丁目3-3", "level": 1 }
117
124
  })
118
125
  ```
119
126
 
@@ -134,7 +141,7 @@ $ node sample.js
134
141
 
135
142
  ### 貢献方法
136
143
 
137
- プルリクエストや Issue はいつでも歓迎します。
144
+ [プルリクエスト](https://github.com/geolonia/normalize-japanese-addresses/pulls) や [Issue](https://github.com/geolonia/normalize-japanese-addresses/issues) はいつでも歓迎します。
138
145
 
139
146
  ## ライセンス、利用規約
140
147
 
@@ -1,6 +1,2 @@
1
- export interface Config {
2
- japaneseAddressesApi: string;
3
- /** 町丁目のデータを何件までキャッシュするか。デフォルト 1,000 */
4
- townCacheSize: number;
5
- }
1
+ import { Config } from './normalize';
6
2
  export declare const currentConfig: Config;
@@ -3,6 +3,7 @@ declare type PrefectureList = {
3
3
  };
4
4
  interface SingleTown {
5
5
  town: string;
6
+ originalTown?: string;
6
7
  koaza: string;
7
8
  lat: string;
8
9
  lng: string;
@@ -1,3 +1,3 @@
1
1
  import * as Normalize from './normalize';
2
- export declare const config: import("./config").Config;
2
+ export declare const config: Normalize.Config;
3
3
  export declare const normalize: Normalize.Normalizer;
@@ -19,6 +19,17 @@
19
19
  PERFORMANCE OF THIS SOFTWARE.
20
20
  ***************************************************************************** */
21
21
 
22
+ var __assign = function() {
23
+ __assign = Object.assign || function __assign(t) {
24
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
25
+ s = arguments[i];
26
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
27
+ }
28
+ return t;
29
+ };
30
+ return __assign.apply(this, arguments);
31
+ };
32
+
22
33
  function __awaiter(thisArg, _arguments, P, generator) {
23
34
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
24
35
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -82,6 +93,7 @@
82
93
  壱: '一',
83
94
  壹: '一',
84
95
  弐: '二',
96
+ 弍: '二',
85
97
  貳: '二',
86
98
  貮: '二',
87
99
  参: '三',
@@ -208,7 +220,11 @@
208
220
  number = number + Number(kanji);
209
221
  }
210
222
  else {
211
- number = number + japaneseNumerics_1.default[kanji];
223
+ for (let index = 0; index < kanji.length; index++) {
224
+ const char = kanji[index];
225
+ const digit = kanji.length - index - 1;
226
+ number = number + japaneseNumerics_1.default[char] * (10 ** digit);
227
+ }
212
228
  }
213
229
  }
214
230
  return number;
@@ -308,7 +324,7 @@
308
324
  }
309
325
  exports.number2kanji = number2kanji;
310
326
  function findKanjiNumbers(text) {
311
- const num = '([0-90-9]*)|([〇一二三四五六七八九壱壹弐貳貮参參肆伍陸漆捌玖]*)';
327
+ const num = '([0-90-9]*)|([〇一二三四五六七八九壱壹弐弍貳貮参參肆伍陸漆捌玖]*)';
312
328
  const basePattern = `((${num})(千|阡|仟))?((${num})(百|陌|佰))?((${num})(十|拾))?(${num})?`;
313
329
  const pattern = `((${basePattern}兆)?(${basePattern}億)?(${basePattern}(万|萬))?${basePattern})`;
314
330
  const regex = new RegExp(pattern, 'g');
@@ -330,6 +346,11 @@
330
346
  exports.findKanjiNumbers = findKanjiNumbers;
331
347
  });
332
348
 
349
+ var currentConfig = {
350
+ japaneseAddressesApi: 'https://geolonia.github.io/japanese-addresses/api/ja',
351
+ townCacheSize: 1000,
352
+ };
353
+
333
354
  var kan2num = function (string) {
334
355
  var kanjiNumbers = dist.findKanjiNumbers(string);
335
356
  for (var i = 0; i < kanjiNumbers.length; i++) {
@@ -380,8 +401,8 @@
380
401
  };
381
402
 
382
403
  // JIS 第2水準 => 第1水準 及び 旧字体 => 新字体
383
- var JIS_OLD_KANJI = '亞,圍,壹,榮,驛,應,櫻,假,會,懷,覺,樂,陷,歡,氣,戲,據,挾,區,徑,溪,輕,藝,儉,圈,權,嚴,恆,國,齋,雜,蠶,殘,兒,實,釋,從,縱,敍,燒,條,剩,壤,釀,眞,盡,醉,髓,聲,竊,淺,錢,禪,爭,插,騷,屬,對,滯,擇,單,斷,癡,鑄,敕,鐵,傳,黨,鬪,屆,腦,廢,發,蠻,拂,邊,瓣,寶,沒,滿,藥,餘,樣,亂,兩,禮,靈,爐,灣,惡,醫,飮,營,圓,歐,奧,價,繪,擴,學,罐,勸,觀,歸,犧,擧,狹,驅,莖,經,繼,缺,劍,檢,顯,廣,鑛,碎,劑,參,慘,絲,辭,舍,壽,澁,肅,將,證,乘,疊,孃,觸,寢,圖,穗,樞,齊,攝,戰,潛,雙,莊,裝,藏,續,體,臺,澤,膽,彈,蟲,廳,鎭,點,燈,盜,獨,貳,霸,賣,髮,祕,佛,變,辯,豐,飜,默,與,譽,謠,覽,獵,勵,齡,勞,壓,爲,隱,衞,鹽,毆,穩,畫,壞,殼,嶽,卷,關,顏,僞,舊,峽,曉,勳,惠,螢,鷄,縣,險,獻,驗,效,號,濟,册,棧,贊,齒,濕,寫,收,獸,處,稱,奬,淨,繩,讓,囑,愼,粹,隨,數,靜,專,踐,纖,壯,搜,總,臟,墮,帶,瀧,擔,團,遲,晝,聽,遞,轉,當,稻,讀,惱,拜,麥,拔,濱,竝,辨,舖,襃,萬,譯,豫,搖,來,龍,壘,隸,戀,樓,鰺,鶯,蠣,攪,竈,灌,諫,頸,礦,蘂,靱,賤,壺,礪,檮,濤,邇,蠅,檜,儘,藪,籠'.split(/,/);
384
- var JIS_NEW_KANJI = '亜,囲,壱,栄,駅,応,桜,仮,会,懐,覚,楽,陥,歓,気,戯,拠,挟,区,径,渓,軽,芸,倹,圏,権,厳,恒,国,斎,雑,蚕,残,児,実,釈,従,縦,叙,焼,条,剰,壌,醸,真,尽,酔,髄,声,窃,浅,銭,禅,争,挿,騒,属,対,滞,択,単,断,痴,鋳,勅,鉄,伝,党,闘,届,脳,廃,発,蛮,払,辺,弁,宝,没,満,薬,余,様,乱,両,礼,霊,炉,湾,悪,医,飲,営,円,欧,奥,価,絵,拡,学,缶,勧,観,帰,犠,挙,狭,駆,茎,経,継,欠,剣,検,顕,広,鉱,砕,剤,参,惨,糸,辞,舎,寿,渋,粛,将,証,乗,畳,嬢,触,寝,図,穂,枢,斉,摂,戦,潜,双,荘,装,蔵,続,体,台,沢,胆,弾,虫,庁,鎮,点,灯,盗,独,弐,覇,売,髪,秘,仏,変,弁,豊,翻,黙,与,誉,謡,覧,猟,励,齢,労,圧,為,隠,衛,塩,殴,穏,画,壊,殻,岳,巻,関,顔,偽,旧,峡,暁,勲,恵,蛍,鶏,県,険,献,験,効,号,済,冊,桟,賛,歯,湿,写,収,獣,処,称,奨,浄,縄,譲,嘱,慎,粋,随,数,静,専,践,繊,壮,捜,総,臓,堕,帯,滝,担,団,遅,昼,聴,逓,転,当,稲,読,悩,拝,麦,抜,浜,並,弁,舗,褒,万,訳,予,揺,来,竜,塁,隷,恋,楼,鯵,鴬,蛎,撹,竃,潅,諌,頚,砿,蕊,靭,賎,壷,砺,梼,涛,迩,蝿,桧,侭,薮,篭'.split(/,/);
404
+ var JIS_OLD_KANJI = '亞,圍,壹,榮,驛,應,櫻,假,會,懷,覺,樂,陷,歡,氣,戲,據,挾,區,徑,溪,輕,藝,儉,圈,權,嚴,恆,國,齋,雜,蠶,殘,兒,實,釋,從,縱,敍,燒,條,剩,壤,釀,眞,盡,醉,髓,聲,竊,淺,錢,禪,爭,插,騷,屬,對,滯,擇,單,斷,癡,鑄,敕,鐵,傳,黨,鬪,屆,腦,廢,發,蠻,拂,邊,瓣,寶,沒,滿,藥,餘,樣,亂,兩,禮,靈,爐,灣,惡,醫,飮,營,圓,歐,奧,價,繪,擴,學,罐,勸,觀,歸,犧,擧,狹,驅,莖,經,繼,缺,劍,檢,顯,廣,鑛,碎,劑,參,慘,絲,辭,舍,壽,澁,肅,將,證,乘,疊,孃,觸,寢,圖,穗,樞,齊,攝,戰,潛,雙,莊,裝,藏,續,體,臺,澤,膽,彈,蟲,廳,鎭,點,燈,盜,獨,貳,霸,賣,髮,祕,佛,變,辯,豐,飜,默,與,譽,謠,覽,獵,勵,齡,勞,壓,爲,隱,衞,鹽,毆,穩,畫,壞,殼,嶽,卷,關,顏,僞,舊,峽,曉,勳,惠,螢,鷄,縣,險,獻,驗,效,號,濟,册,棧,贊,齒,濕,寫,收,獸,處,稱,奬,淨,繩,讓,囑,愼,粹,隨,數,靜,專,踐,纖,壯,搜,總,臟,墮,帶,瀧,擔,團,遲,晝,聽,遞,轉,當,稻,讀,惱,拜,麥,拔,濱,竝,辨,舖,襃,萬,譯,豫,搖,來,龍,壘,隸,戀,樓,鰺,鶯,蠣,攪,竈,灌,諫,頸,礦,蘂,靱,賤,壺,礪,檮,濤,邇,蠅,檜,儘,藪,籠,彌'.split(/,/);
405
+ var JIS_NEW_KANJI = '亜,囲,壱,栄,駅,応,桜,仮,会,懐,覚,楽,陥,歓,気,戯,拠,挟,区,径,渓,軽,芸,倹,圏,権,厳,恒,国,斎,雑,蚕,残,児,実,釈,従,縦,叙,焼,条,剰,壌,醸,真,尽,酔,髄,声,窃,浅,銭,禅,争,挿,騒,属,対,滞,択,単,断,痴,鋳,勅,鉄,伝,党,闘,届,脳,廃,発,蛮,払,辺,弁,宝,没,満,薬,余,様,乱,両,礼,霊,炉,湾,悪,医,飲,営,円,欧,奥,価,絵,拡,学,缶,勧,観,帰,犠,挙,狭,駆,茎,経,継,欠,剣,検,顕,広,鉱,砕,剤,参,惨,糸,辞,舎,寿,渋,粛,将,証,乗,畳,嬢,触,寝,図,穂,枢,斉,摂,戦,潜,双,荘,装,蔵,続,体,台,沢,胆,弾,虫,庁,鎮,点,灯,盗,独,弐,覇,売,髪,秘,仏,変,弁,豊,翻,黙,与,誉,謡,覧,猟,励,齢,労,圧,為,隠,衛,塩,殴,穏,画,壊,殻,岳,巻,関,顔,偽,旧,峡,暁,勲,恵,蛍,鶏,県,険,献,験,効,号,済,冊,桟,賛,歯,湿,写,収,獣,処,称,奨,浄,縄,譲,嘱,慎,粋,随,数,静,専,践,繊,壮,捜,総,臓,堕,帯,滝,担,団,遅,昼,聴,逓,転,当,稲,読,悩,拝,麦,抜,浜,並,弁,舗,褒,万,訳,予,揺,来,竜,塁,隷,恋,楼,鯵,鴬,蛎,撹,竃,潅,諌,頚,砿,蕊,靭,賎,壷,砺,梼,涛,迩,蝿,桧,侭,薮,篭,弥'.split(/,/);
385
406
  var JIS_KANJI_REGEX_PATTERNS = JIS_OLD_KANJI.map(function (old, i) {
386
407
  var pattern = old + "|" + JIS_NEW_KANJI[i];
387
408
  return [pattern, old, JIS_NEW_KANJI[i]];
@@ -428,11 +449,6 @@
428
449
  return _str;
429
450
  };
430
451
 
431
- var currentConfig = {
432
- japaneseAddressesApi: 'https://geolonia.github.io/japanese-addresses/api/ja',
433
- townCacheSize: 1000,
434
- };
435
-
436
452
  var iterator = function (Yallist) {
437
453
  Yallist.prototype[Symbol.iterator] = function* () {
438
454
  for (let walker = this.head; walker; walker = walker.next) {
@@ -1281,8 +1297,16 @@
1281
1297
  }
1282
1298
  });
1283
1299
  }); };
1300
+ // 十六町 のように漢数字と町が連結しているか
1301
+ var isKanjiNumberFollewedByCho = function (targetTownName) {
1302
+ var xCho = targetTownName.match(/.町/g);
1303
+ if (!xCho)
1304
+ return false;
1305
+ var kanjiNumbers = dist.findKanjiNumbers(xCho[0]);
1306
+ return kanjiNumbers.length > 0;
1307
+ };
1284
1308
  var getTownRegexPatterns = function (pref, city) { return __awaiter(void 0, void 0, void 0, function () {
1285
- var cachedResult, towns, patterns;
1309
+ var cachedResult, pre_towns, townSet, towns, isKyoto, _i, pre_towns_1, town, originalTown, townAbbr, patterns;
1286
1310
  return __generator(this, function (_a) {
1287
1311
  switch (_a.label) {
1288
1312
  case 0:
@@ -1290,11 +1314,32 @@
1290
1314
  if (typeof cachedResult !== 'undefined') {
1291
1315
  return [2 /*return*/, cachedResult];
1292
1316
  }
1293
- return [4 /*yield*/, getTowns(pref, city)
1294
- // 少ない文字数の地名に対してミスマッチしないように文字の長さ順にソート
1295
- ];
1317
+ return [4 /*yield*/, getTowns(pref, city)];
1296
1318
  case 1:
1297
- towns = _a.sent();
1319
+ pre_towns = _a.sent();
1320
+ townSet = new Set(pre_towns.map(function (town) { return town.town; }));
1321
+ towns = [];
1322
+ isKyoto = city.match(/^京都市/);
1323
+ // 町丁目に「○○町」が含まれるケースへの対応
1324
+ // 通常は「○○町」のうち「町」の省略を許容し同義語として扱うが、まれに自治体内に「○○町」と「○○」が共存しているケースがある。
1325
+ // この場合は町の省略は許容せず、入力された住所は書き分けられているものとして正規化を行う。
1326
+ // 更に、「愛知県名古屋市瑞穂区十六町1丁目」漢数字を含むケースだと丁目や番地・号の正規化が不可能になる。このようなケースも除外。
1327
+ for (_i = 0, pre_towns_1 = pre_towns; _i < pre_towns_1.length; _i++) {
1328
+ town = pre_towns_1[_i];
1329
+ towns.push(town);
1330
+ originalTown = town.town;
1331
+ if (originalTown.indexOf('町') === -1)
1332
+ continue;
1333
+ townAbbr = originalTown.replace(/(?!^町)町/g, '') // NOTE: 冒頭の「町」は明らかに省略するべきではないので、除外
1334
+ ;
1335
+ if (!isKyoto && // 京都は通り名削除の処理があるため、意図しないマッチになるケースがある。これを除く
1336
+ !townSet.has(townAbbr) &&
1337
+ !townSet.has("\u5927\u5B57" + townAbbr) && // 大字は省略されるため、大字〇〇と〇〇町がコンフリクトする。このケースを除外
1338
+ !isKanjiNumberFollewedByCho(originalTown)) {
1339
+ // エイリアスとして町なしのパターンを登録
1340
+ towns.push(__assign(__assign({}, town), { originalTown: originalTown, town: townAbbr }));
1341
+ }
1342
+ }
1298
1343
  // 少ない文字数の地名に対してミスマッチしないように文字の長さ順にソート
1299
1344
  towns.sort(function (a, b) {
1300
1345
  var aLen = a.town.length;
@@ -1335,12 +1380,7 @@
1335
1380
  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])";
1336
1381
  return _pattern; // デバッグのときにめんどくさいので変数に入れる。
1337
1382
  }));
1338
- if (city.match(/^京都市/)) {
1339
- return [town, ".*" + pattern];
1340
- }
1341
- else {
1342
- return [town, "^" + pattern];
1343
- }
1383
+ return [town, pattern];
1344
1384
  });
1345
1385
  cachedTownRegexes.set(pref + "-" + city, patterns);
1346
1386
  return [2 /*return*/, patterns];
@@ -1383,35 +1423,48 @@
1383
1423
 
1384
1424
  var browser = self.fetch || (self.fetch = require$$0.default || require$$0);
1385
1425
 
1426
+ var config$1 = currentConfig;
1386
1427
  var defaultOption = {
1387
1428
  level: 3,
1388
1429
  };
1430
+ /**
1431
+ * @internal
1432
+ */
1389
1433
  var __internals = {
1390
1434
  // default fetch
1391
1435
  fetch: function (input) {
1392
- var fileURL = new URL("" + currentConfig.japaneseAddressesApi + input);
1436
+ var fileURL = new URL("" + config$1.japaneseAddressesApi + input);
1393
1437
  return browser(fileURL.toString());
1394
1438
  },
1395
1439
  };
1396
1440
  var normalizeTownName = function (addr, pref, city) { return __awaiter(void 0, void 0, void 0, function () {
1397
- var townPatterns, i, _a, _town, pattern, match;
1398
- return __generator(this, function (_b) {
1399
- switch (_b.label) {
1441
+ var townPatterns, regexPrefixes, _i, regexPrefixes_1, regexPrefix, _a, townPatterns_1, _b, town, pattern, regex, match;
1442
+ return __generator(this, function (_c) {
1443
+ switch (_c.label) {
1400
1444
  case 0:
1401
1445
  addr = addr.trim().replace(/^大字/, '');
1402
1446
  return [4 /*yield*/, getTownRegexPatterns(pref, city)];
1403
1447
  case 1:
1404
- townPatterns = _b.sent();
1405
- for (i = 0; i < townPatterns.length; i++) {
1406
- _a = townPatterns[i], _town = _a[0], pattern = _a[1];
1407
- match = addr.match(pattern);
1408
- if (match) {
1409
- return [2 /*return*/, {
1410
- town: _town.town,
1411
- addr: addr.substr(match[0].length),
1412
- lat: _town.lat,
1413
- lng: _town.lng,
1414
- }];
1448
+ townPatterns = _c.sent();
1449
+ regexPrefixes = ['^'];
1450
+ if (city.match(/^京都市/)) {
1451
+ // 京都は通り名削除のために後方一致を使う
1452
+ regexPrefixes.push('.*');
1453
+ }
1454
+ for (_i = 0, regexPrefixes_1 = regexPrefixes; _i < regexPrefixes_1.length; _i++) {
1455
+ regexPrefix = regexPrefixes_1[_i];
1456
+ for (_a = 0, townPatterns_1 = townPatterns; _a < townPatterns_1.length; _a++) {
1457
+ _b = townPatterns_1[_a], town = _b[0], pattern = _b[1];
1458
+ regex = new RegExp("" + regexPrefix + pattern);
1459
+ match = addr.match(regex);
1460
+ if (match) {
1461
+ return [2 /*return*/, {
1462
+ town: town.originalTown || town.town,
1463
+ addr: addr.substr(match[0].length),
1464
+ lat: town.lat,
1465
+ lng: town.lng,
1466
+ }];
1467
+ }
1415
1468
  }
1416
1469
  }
1417
1470
  return [2 /*return*/];
@@ -1426,6 +1479,7 @@
1426
1479
  switch (_e.label) {
1427
1480
  case 0:
1428
1481
  addr = address
1482
+ .normalize('NFC')
1429
1483
  .replace(/ /g, ' ')
1430
1484
  .replace(/ +/g, ' ')
1431
1485
  .replace(/([0-9A-Za-z]+)/g, function (match) {
@@ -1533,6 +1587,10 @@
1533
1587
  addr = normalized.addr;
1534
1588
  lat = parseFloat(normalized.lat);
1535
1589
  lng = parseFloat(normalized.lng);
1590
+ if (Number.isNaN(lat) || Number.isNaN(lng)) {
1591
+ lat = null;
1592
+ lng = null;
1593
+ }
1536
1594
  }
1537
1595
  addr = addr
1538
1596
  .replace(/^-/, '')
@@ -1591,7 +1649,7 @@
1591
1649
  });
1592
1650
  };
1593
1651
 
1594
- var config = currentConfig;
1652
+ var config = config$1;
1595
1653
  var normalize = normalize$1;
1596
1654
 
1597
1655
  exports.config = config;
@@ -1,3 +1,3 @@
1
1
  import * as Normalize from './normalize';
2
- export declare const config: import("./config").Config;
2
+ export declare const config: Normalize.Config;
3
3
  export declare const normalize: Normalize.Normalizer;