chaffjs 0.30.0 → 0.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (530) hide show
  1. package/dist/announced-count.d.ts +2 -0
  2. package/dist/announced-count.d.ts.map +1 -1
  3. package/dist/announced-count.js +4 -3
  4. package/dist/announced-count.js.map +1 -1
  5. package/dist/contacts/addresses.d.ts +21 -0
  6. package/dist/contacts/addresses.d.ts.map +1 -0
  7. package/dist/contacts/addresses.js +144 -0
  8. package/dist/contacts/addresses.js.map +1 -0
  9. package/dist/contacts/emails.d.ts +11 -0
  10. package/dist/contacts/emails.d.ts.map +1 -0
  11. package/dist/contacts/emails.js +51 -0
  12. package/dist/contacts/emails.js.map +1 -0
  13. package/dist/contacts/variants.d.ts +14 -0
  14. package/dist/contacts/variants.d.ts.map +1 -0
  15. package/dist/contacts/variants.js +25 -0
  16. package/dist/contacts/variants.js.map +1 -0
  17. package/dist/derived/battery-runtime.d.ts +85 -0
  18. package/dist/derived/battery-runtime.d.ts.map +1 -0
  19. package/dist/derived/battery-runtime.js +217 -0
  20. package/dist/derived/battery-runtime.js.map +1 -0
  21. package/dist/derived/period-counts.d.ts +48 -0
  22. package/dist/derived/period-counts.d.ts.map +1 -0
  23. package/dist/derived/period-counts.js +128 -0
  24. package/dist/derived/period-counts.js.map +1 -0
  25. package/dist/derived/time-lengths.d.ts.map +1 -1
  26. package/dist/derived/time-lengths.js +12 -9
  27. package/dist/derived/time-lengths.js.map +1 -1
  28. package/dist/derived/use-interval.d.ts +33 -0
  29. package/dist/derived/use-interval.d.ts.map +1 -0
  30. package/dist/derived/use-interval.js +93 -0
  31. package/dist/derived/use-interval.js.map +1 -0
  32. package/dist/detectors/announced-count.d.ts.map +1 -1
  33. package/dist/detectors/announced-count.js +1 -0
  34. package/dist/detectors/announced-count.js.map +1 -1
  35. package/dist/detectors/capacity-runtime.d.ts +7 -0
  36. package/dist/detectors/capacity-runtime.d.ts.map +1 -0
  37. package/dist/detectors/capacity-runtime.js +98 -0
  38. package/dist/detectors/capacity-runtime.js.map +1 -0
  39. package/dist/detectors/contact-variant.d.ts +3 -0
  40. package/dist/detectors/contact-variant.d.ts.map +1 -0
  41. package/dist/detectors/contact-variant.js +21 -0
  42. package/dist/detectors/contact-variant.js.map +1 -0
  43. package/dist/detectors/count-over-capacity.d.ts +4 -0
  44. package/dist/detectors/count-over-capacity.d.ts.map +1 -0
  45. package/dist/detectors/count-over-capacity.js +26 -0
  46. package/dist/detectors/count-over-capacity.js.map +1 -0
  47. package/dist/detectors/date-outside-period.d.ts.map +1 -1
  48. package/dist/detectors/date-outside-period.js +2 -1
  49. package/dist/detectors/date-outside-period.js.map +1 -1
  50. package/dist/detectors/date-stamp-order.d.ts +3 -0
  51. package/dist/detectors/date-stamp-order.d.ts.map +1 -0
  52. package/dist/detectors/date-stamp-order.js +24 -0
  53. package/dist/detectors/date-stamp-order.js.map +1 -0
  54. package/dist/detectors/defined-term-form.d.ts.map +1 -1
  55. package/dist/detectors/defined-term-form.js +57 -7
  56. package/dist/detectors/defined-term-form.js.map +1 -1
  57. package/dist/detectors/definition-use.d.ts +1 -1
  58. package/dist/detectors/definition-use.d.ts.map +1 -1
  59. package/dist/detectors/definition-use.js +4 -2
  60. package/dist/detectors/definition-use.js.map +1 -1
  61. package/dist/detectors/derived-numbers.d.ts +9 -1
  62. package/dist/detectors/derived-numbers.d.ts.map +1 -1
  63. package/dist/detectors/derived-numbers.js +2 -2
  64. package/dist/detectors/derived-numbers.js.map +1 -1
  65. package/dist/detectors/due-date.d.ts.map +1 -1
  66. package/dist/detectors/due-date.js +6 -0
  67. package/dist/detectors/due-date.js.map +1 -1
  68. package/dist/detectors/en-shape.d.ts.map +1 -1
  69. package/dist/detectors/en-shape.js +7 -4
  70. package/dist/detectors/en-shape.js.map +1 -1
  71. package/dist/detectors/event-deadline.d.ts +3 -0
  72. package/dist/detectors/event-deadline.d.ts.map +1 -0
  73. package/dist/detectors/event-deadline.js +24 -0
  74. package/dist/detectors/event-deadline.js.map +1 -0
  75. package/dist/detectors/fact-consistency.d.ts +1 -1
  76. package/dist/detectors/fact-consistency.d.ts.map +1 -1
  77. package/dist/detectors/fact-consistency.js +52 -3
  78. package/dist/detectors/fact-consistency.js.map +1 -1
  79. package/dist/detectors/heading-case.d.ts +5 -2
  80. package/dist/detectors/heading-case.d.ts.map +1 -1
  81. package/dist/detectors/heading-case.js +12 -4
  82. package/dist/detectors/heading-case.js.map +1 -1
  83. package/dist/detectors/heading-echo.d.ts +5 -0
  84. package/dist/detectors/heading-echo.d.ts.map +1 -1
  85. package/dist/detectors/heading-echo.js +14 -1
  86. package/dist/detectors/heading-echo.js.map +1 -1
  87. package/dist/detectors/layout-code.d.ts +5 -0
  88. package/dist/detectors/layout-code.d.ts.map +1 -0
  89. package/dist/detectors/layout-code.js +124 -0
  90. package/dist/detectors/layout-code.js.map +1 -0
  91. package/dist/detectors/measured-facts.d.ts +8 -0
  92. package/dist/detectors/measured-facts.d.ts.map +1 -0
  93. package/dist/detectors/measured-facts.js +18 -0
  94. package/dist/detectors/measured-facts.js.map +1 -0
  95. package/dist/detectors/name-variant-model-codes.d.ts +11 -0
  96. package/dist/detectors/name-variant-model-codes.d.ts.map +1 -0
  97. package/dist/detectors/name-variant-model-codes.js +21 -0
  98. package/dist/detectors/name-variant-model-codes.js.map +1 -0
  99. package/dist/detectors/name-variant.d.ts.map +1 -1
  100. package/dist/detectors/name-variant.js +25 -4
  101. package/dist/detectors/name-variant.js.map +1 -1
  102. package/dist/detectors/orthographic-variant.d.ts.map +1 -1
  103. package/dist/detectors/orthographic-variant.js +62 -7
  104. package/dist/detectors/orthographic-variant.js.map +1 -1
  105. package/dist/detectors/orthography.d.ts.map +1 -1
  106. package/dist/detectors/orthography.js +12 -6
  107. package/dist/detectors/orthography.js.map +1 -1
  108. package/dist/detectors/quantity-range.d.ts +3 -0
  109. package/dist/detectors/quantity-range.d.ts.map +1 -0
  110. package/dist/detectors/quantity-range.js +35 -0
  111. package/dist/detectors/quantity-range.js.map +1 -0
  112. package/dist/detectors/range-band.d.ts +5 -0
  113. package/dist/detectors/range-band.d.ts.map +1 -0
  114. package/dist/detectors/range-band.js +80 -0
  115. package/dist/detectors/range-band.js.map +1 -0
  116. package/dist/detectors/registry/capacity-runtime-mismatch.d.ts +3 -0
  117. package/dist/detectors/registry/capacity-runtime-mismatch.d.ts.map +1 -0
  118. package/dist/detectors/registry/capacity-runtime-mismatch.js +3 -0
  119. package/dist/detectors/registry/capacity-runtime-mismatch.js.map +1 -0
  120. package/dist/detectors/registry/contact-variant.d.ts +3 -0
  121. package/dist/detectors/registry/contact-variant.d.ts.map +1 -0
  122. package/dist/detectors/registry/contact-variant.js +3 -0
  123. package/dist/detectors/registry/contact-variant.js.map +1 -0
  124. package/dist/detectors/registry/count-over-capacity.d.ts +3 -0
  125. package/dist/detectors/registry/count-over-capacity.d.ts.map +1 -0
  126. package/dist/detectors/registry/count-over-capacity.js +3 -0
  127. package/dist/detectors/registry/count-over-capacity.js.map +1 -0
  128. package/dist/detectors/registry/date-stamp-order.d.ts +3 -0
  129. package/dist/detectors/registry/date-stamp-order.d.ts.map +1 -0
  130. package/dist/detectors/registry/date-stamp-order.js +3 -0
  131. package/dist/detectors/registry/date-stamp-order.js.map +1 -0
  132. package/dist/detectors/registry/event-deadline.d.ts +3 -0
  133. package/dist/detectors/registry/event-deadline.d.ts.map +1 -0
  134. package/dist/detectors/registry/event-deadline.js +3 -0
  135. package/dist/detectors/registry/event-deadline.js.map +1 -0
  136. package/dist/detectors/registry/interval-count-mismatch.d.ts +3 -0
  137. package/dist/detectors/registry/interval-count-mismatch.d.ts.map +1 -0
  138. package/dist/detectors/registry/interval-count-mismatch.js +3 -0
  139. package/dist/detectors/registry/interval-count-mismatch.js.map +1 -0
  140. package/dist/detectors/registry/layout-code-mismatch.d.ts +3 -0
  141. package/dist/detectors/registry/layout-code-mismatch.d.ts.map +1 -0
  142. package/dist/detectors/registry/layout-code-mismatch.js +3 -0
  143. package/dist/detectors/registry/layout-code-mismatch.js.map +1 -0
  144. package/dist/detectors/registry/quantity-range.d.ts +3 -0
  145. package/dist/detectors/registry/quantity-range.d.ts.map +1 -0
  146. package/dist/detectors/registry/quantity-range.js +3 -0
  147. package/dist/detectors/registry/quantity-range.js.map +1 -0
  148. package/dist/detectors/registry/range-band-mismatch.d.ts +3 -0
  149. package/dist/detectors/registry/range-band-mismatch.d.ts.map +1 -0
  150. package/dist/detectors/registry/range-band-mismatch.js +3 -0
  151. package/dist/detectors/registry/range-band-mismatch.js.map +1 -0
  152. package/dist/detectors/registry/rent-multiple-mismatch.d.ts +3 -0
  153. package/dist/detectors/registry/rent-multiple-mismatch.d.ts.map +1 -0
  154. package/dist/detectors/registry/rent-multiple-mismatch.js +3 -0
  155. package/dist/detectors/registry/rent-multiple-mismatch.js.map +1 -0
  156. package/dist/detectors/registry/scaled-quantity-mismatch.d.ts +3 -0
  157. package/dist/detectors/registry/scaled-quantity-mismatch.d.ts.map +1 -0
  158. package/dist/detectors/registry/scaled-quantity-mismatch.js +3 -0
  159. package/dist/detectors/registry/scaled-quantity-mismatch.js.map +1 -0
  160. package/dist/detectors/registry/step-time-sum-mismatch.d.ts +3 -0
  161. package/dist/detectors/registry/step-time-sum-mismatch.d.ts.map +1 -0
  162. package/dist/detectors/registry/step-time-sum-mismatch.js +3 -0
  163. package/dist/detectors/registry/step-time-sum-mismatch.js.map +1 -0
  164. package/dist/detectors/registry/time-range-reversed.d.ts +3 -0
  165. package/dist/detectors/registry/time-range-reversed.d.ts.map +1 -0
  166. package/dist/detectors/registry/time-range-reversed.js +3 -0
  167. package/dist/detectors/registry/time-range-reversed.js.map +1 -0
  168. package/dist/detectors/registry/unlisted-item-used.d.ts +3 -0
  169. package/dist/detectors/registry/unlisted-item-used.d.ts.map +1 -0
  170. package/dist/detectors/registry/unlisted-item-used.js +3 -0
  171. package/dist/detectors/registry/unlisted-item-used.js.map +1 -0
  172. package/dist/detectors/registry/walk-time-distance-mismatch.d.ts +3 -0
  173. package/dist/detectors/registry/walk-time-distance-mismatch.d.ts.map +1 -0
  174. package/dist/detectors/registry/walk-time-distance-mismatch.js +3 -0
  175. package/dist/detectors/registry/walk-time-distance-mismatch.js.map +1 -0
  176. package/dist/detectors/rent-multiple-mismatch.d.ts +3 -0
  177. package/dist/detectors/rent-multiple-mismatch.d.ts.map +1 -0
  178. package/dist/detectors/rent-multiple-mismatch.js +39 -0
  179. package/dist/detectors/rent-multiple-mismatch.js.map +1 -0
  180. package/dist/detectors/scaled-quantity.d.ts +3 -0
  181. package/dist/detectors/scaled-quantity.d.ts.map +1 -0
  182. package/dist/detectors/scaled-quantity.js +37 -0
  183. package/dist/detectors/scaled-quantity.js.map +1 -0
  184. package/dist/detectors/signals.d.ts.map +1 -1
  185. package/dist/detectors/signals.js +3 -1
  186. package/dist/detectors/signals.js.map +1 -1
  187. package/dist/detectors/step-time-sum.d.ts +3 -0
  188. package/dist/detectors/step-time-sum.d.ts.map +1 -0
  189. package/dist/detectors/step-time-sum.js +46 -0
  190. package/dist/detectors/step-time-sum.js.map +1 -0
  191. package/dist/detectors/structure-tree.d.ts +2 -0
  192. package/dist/detectors/structure-tree.d.ts.map +1 -1
  193. package/dist/detectors/structure-tree.js +22 -5
  194. package/dist/detectors/structure-tree.js.map +1 -1
  195. package/dist/detectors/structure.js +1 -1
  196. package/dist/detectors/structure.js.map +1 -1
  197. package/dist/detectors/technical-docs.d.ts +5 -0
  198. package/dist/detectors/technical-docs.d.ts.map +1 -1
  199. package/dist/detectors/technical-docs.js +12 -0
  200. package/dist/detectors/technical-docs.js.map +1 -1
  201. package/dist/detectors/time-order.d.ts +1 -0
  202. package/dist/detectors/time-order.d.ts.map +1 -1
  203. package/dist/detectors/time-order.js +3 -1
  204. package/dist/detectors/time-order.js.map +1 -1
  205. package/dist/detectors/unit-consistency.d.ts +1 -1
  206. package/dist/detectors/unit-consistency.d.ts.map +1 -1
  207. package/dist/detectors/unit-consistency.js +46 -38
  208. package/dist/detectors/unit-consistency.js.map +1 -1
  209. package/dist/detectors/unlisted-items.d.ts +3 -0
  210. package/dist/detectors/unlisted-items.d.ts.map +1 -0
  211. package/dist/detectors/unlisted-items.js +57 -0
  212. package/dist/detectors/unlisted-items.js.map +1 -0
  213. package/dist/detectors/use-count-words.d.ts +8 -0
  214. package/dist/detectors/use-count-words.d.ts.map +1 -0
  215. package/dist/detectors/use-count-words.js +20 -0
  216. package/dist/detectors/use-count-words.js.map +1 -0
  217. package/dist/detectors/use-interval.d.ts +3 -0
  218. package/dist/detectors/use-interval.d.ts.map +1 -0
  219. package/dist/detectors/use-interval.js +39 -0
  220. package/dist/detectors/use-interval.js.map +1 -0
  221. package/dist/detectors/walk-time-distance-mismatch.d.ts +4 -0
  222. package/dist/detectors/walk-time-distance-mismatch.d.ts.map +1 -0
  223. package/dist/detectors/walk-time-distance-mismatch.js +38 -0
  224. package/dist/detectors/walk-time-distance-mismatch.js.map +1 -0
  225. package/dist/facts/approximate-tolerance.d.ts +7 -0
  226. package/dist/facts/approximate-tolerance.d.ts.map +1 -0
  227. package/dist/facts/approximate-tolerance.js +16 -0
  228. package/dist/facts/approximate-tolerance.js.map +1 -0
  229. package/dist/facts/item-amounts.d.ts +18 -0
  230. package/dist/facts/item-amounts.d.ts.map +1 -0
  231. package/dist/facts/item-amounts.js +67 -0
  232. package/dist/facts/item-amounts.js.map +1 -0
  233. package/dist/facts/labelled-facts.d.ts +4 -0
  234. package/dist/facts/labelled-facts.d.ts.map +1 -1
  235. package/dist/facts/labelled-facts.js +21 -6
  236. package/dist/facts/labelled-facts.js.map +1 -1
  237. package/dist/facts/measure-units.d.ts +5 -0
  238. package/dist/facts/measure-units.d.ts.map +1 -0
  239. package/dist/facts/measure-units.js +28 -0
  240. package/dist/facts/measure-units.js.map +1 -0
  241. package/dist/facts/measures.d.ts +23 -4
  242. package/dist/facts/measures.d.ts.map +1 -1
  243. package/dist/facts/measures.js +68 -19
  244. package/dist/facts/measures.js.map +1 -1
  245. package/dist/facts/retention-periods.d.ts +51 -0
  246. package/dist/facts/retention-periods.d.ts.map +1 -0
  247. package/dist/facts/retention-periods.js +148 -0
  248. package/dist/facts/retention-periods.js.map +1 -0
  249. package/dist/facts/unit-conflicts.d.ts +3 -2
  250. package/dist/facts/unit-conflicts.d.ts.map +1 -1
  251. package/dist/facts/unit-conflicts.js +15 -7
  252. package/dist/facts/unit-conflicts.js.map +1 -1
  253. package/dist/facts/unit-equivalents.d.ts +13 -0
  254. package/dist/facts/unit-equivalents.d.ts.map +1 -0
  255. package/dist/facts/unit-equivalents.js +56 -0
  256. package/dist/facts/unit-equivalents.js.map +1 -0
  257. package/dist/facts/unit-tolerance.d.ts +4 -0
  258. package/dist/facts/unit-tolerance.d.ts.map +1 -0
  259. package/dist/facts/unit-tolerance.js +13 -0
  260. package/dist/facts/unit-tolerance.js.map +1 -0
  261. package/dist/facts/unit-word.d.ts +8 -0
  262. package/dist/facts/unit-word.d.ts.map +1 -0
  263. package/dist/facts/unit-word.js +34 -0
  264. package/dist/facts/unit-word.js.map +1 -0
  265. package/dist/facts/written-precision.d.ts +10 -0
  266. package/dist/facts/written-precision.d.ts.map +1 -0
  267. package/dist/facts/written-precision.js +20 -0
  268. package/dist/facts/written-precision.js.map +1 -0
  269. package/dist/kana-spelling.d.ts +12 -0
  270. package/dist/kana-spelling.d.ts.map +1 -1
  271. package/dist/kana-spelling.js +23 -0
  272. package/dist/kana-spelling.js.map +1 -1
  273. package/dist/model-codes.d.ts +23 -0
  274. package/dist/model-codes.d.ts.map +1 -0
  275. package/dist/model-codes.js +81 -0
  276. package/dist/model-codes.js.map +1 -0
  277. package/dist/name-spelling-chars.d.ts +16 -0
  278. package/dist/name-spelling-chars.d.ts.map +1 -0
  279. package/dist/name-spelling-chars.js +14 -0
  280. package/dist/name-spelling-chars.js.map +1 -0
  281. package/dist/name-variants.d.ts +3 -2
  282. package/dist/name-variants.d.ts.map +1 -1
  283. package/dist/name-variants.js +4 -7
  284. package/dist/name-variants.js.map +1 -1
  285. package/dist/phone-numbers.d.ts.map +1 -1
  286. package/dist/phone-numbers.js +22 -5
  287. package/dist/phone-numbers.js.map +1 -1
  288. package/dist/place-names.d.ts +12 -5
  289. package/dist/place-names.d.ts.map +1 -1
  290. package/dist/place-names.js +34 -14
  291. package/dist/place-names.js.map +1 -1
  292. package/dist/plugin.d.ts +5 -0
  293. package/dist/plugin.d.ts.map +1 -1
  294. package/dist/preamble-paragraphs.d.ts +2 -1
  295. package/dist/preamble-paragraphs.d.ts.map +1 -1
  296. package/dist/preamble-paragraphs.js +16 -1
  297. package/dist/preamble-paragraphs.js.map +1 -1
  298. package/dist/profile/parse.d.ts.map +1 -1
  299. package/dist/profile/parse.js +11 -0
  300. package/dist/profile/parse.js.map +1 -1
  301. package/dist/spacing-code.d.ts +6 -0
  302. package/dist/spacing-code.d.ts.map +1 -0
  303. package/dist/spacing-code.js +16 -0
  304. package/dist/spacing-code.js.map +1 -0
  305. package/dist/structure/amount-range.d.ts +2 -2
  306. package/dist/structure/amount-range.d.ts.map +1 -1
  307. package/dist/structure/amount-range.js +12 -5
  308. package/dist/structure/amount-range.js.map +1 -1
  309. package/dist/structure/capacity-count.d.ts +59 -0
  310. package/dist/structure/capacity-count.d.ts.map +1 -0
  311. package/dist/structure/capacity-count.js +118 -0
  312. package/dist/structure/capacity-count.js.map +1 -0
  313. package/dist/structure/counted-amounts.d.ts +6 -0
  314. package/dist/structure/counted-amounts.d.ts.map +1 -1
  315. package/dist/structure/counted-amounts.js +4 -4
  316. package/dist/structure/counted-amounts.js.map +1 -1
  317. package/dist/structure/date-outside-period.d.ts +3 -1
  318. package/dist/structure/date-outside-period.d.ts.map +1 -1
  319. package/dist/structure/date-outside-period.js +8 -5
  320. package/dist/structure/date-outside-period.js.map +1 -1
  321. package/dist/structure/date-range.d.ts +1 -0
  322. package/dist/structure/date-range.d.ts.map +1 -1
  323. package/dist/structure/date-range.js +1 -1
  324. package/dist/structure/date-range.js.map +1 -1
  325. package/dist/structure/deadline-after-event.d.ts +23 -0
  326. package/dist/structure/deadline-after-event.d.ts.map +1 -0
  327. package/dist/structure/deadline-after-event.js +42 -0
  328. package/dist/structure/deadline-after-event.js.map +1 -0
  329. package/dist/structure/definition-use.d.ts +1 -1
  330. package/dist/structure/definition-use.d.ts.map +1 -1
  331. package/dist/structure/definition-use.js +55 -2
  332. package/dist/structure/definition-use.js.map +1 -1
  333. package/dist/structure/due-date.d.ts.map +1 -1
  334. package/dist/structure/due-date.js +5 -27
  335. package/dist/structure/due-date.js.map +1 -1
  336. package/dist/structure/labelled-date-order.d.ts +38 -0
  337. package/dist/structure/labelled-date-order.d.ts.map +1 -0
  338. package/dist/structure/labelled-date-order.js +41 -0
  339. package/dist/structure/labelled-date-order.js.map +1 -0
  340. package/dist/structure/layout-codes.d.ts +68 -0
  341. package/dist/structure/layout-codes.d.ts.map +1 -0
  342. package/dist/structure/layout-codes.js +161 -0
  343. package/dist/structure/layout-codes.js.map +1 -0
  344. package/dist/structure/measured-amounts.d.ts +17 -0
  345. package/dist/structure/measured-amounts.d.ts.map +1 -0
  346. package/dist/structure/measured-amounts.js +110 -0
  347. package/dist/structure/measured-amounts.js.map +1 -0
  348. package/dist/structure/quantity-range.d.ts +8 -0
  349. package/dist/structure/quantity-range.d.ts.map +1 -0
  350. package/dist/structure/quantity-range.js +36 -0
  351. package/dist/structure/quantity-range.js.map +1 -0
  352. package/dist/structure/range-bands.d.ts +75 -0
  353. package/dist/structure/range-bands.d.ts.map +1 -0
  354. package/dist/structure/range-bands.js +244 -0
  355. package/dist/structure/range-bands.js.map +1 -0
  356. package/dist/structure/rent-multiple.d.ts +76 -0
  357. package/dist/structure/rent-multiple.d.ts.map +1 -0
  358. package/dist/structure/rent-multiple.js +186 -0
  359. package/dist/structure/rent-multiple.js.map +1 -0
  360. package/dist/structure/scaled-quantities.d.ts +50 -0
  361. package/dist/structure/scaled-quantities.d.ts.map +1 -0
  362. package/dist/structure/scaled-quantities.js +153 -0
  363. package/dist/structure/scaled-quantities.js.map +1 -0
  364. package/dist/structure/stamp-order.d.ts +16 -0
  365. package/dist/structure/stamp-order.d.ts.map +1 -0
  366. package/dist/structure/stamp-order.js +78 -0
  367. package/dist/structure/stamp-order.js.map +1 -0
  368. package/dist/structure/step-times.d.ts +49 -0
  369. package/dist/structure/step-times.d.ts.map +1 -0
  370. package/dist/structure/step-times.js +128 -0
  371. package/dist/structure/step-times.js.map +1 -0
  372. package/dist/structure/term-deadline.d.ts +19 -0
  373. package/dist/structure/term-deadline.d.ts.map +1 -0
  374. package/dist/structure/term-deadline.js +28 -0
  375. package/dist/structure/term-deadline.js.map +1 -0
  376. package/dist/structure/time-range.d.ts +16 -0
  377. package/dist/structure/time-range.d.ts.map +1 -0
  378. package/dist/structure/time-range.js +57 -0
  379. package/dist/structure/time-range.js.map +1 -0
  380. package/dist/structure/total-line.d.ts +16 -0
  381. package/dist/structure/total-line.d.ts.map +1 -0
  382. package/dist/structure/total-line.js +44 -0
  383. package/dist/structure/total-line.js.map +1 -0
  384. package/dist/structure/total.d.ts +7 -1
  385. package/dist/structure/total.d.ts.map +1 -1
  386. package/dist/structure/total.js +28 -5
  387. package/dist/structure/total.js.map +1 -1
  388. package/dist/structure/unlisted-items.d.ts +70 -0
  389. package/dist/structure/unlisted-items.d.ts.map +1 -0
  390. package/dist/structure/unlisted-items.js +152 -0
  391. package/dist/structure/unlisted-items.js.map +1 -0
  392. package/dist/structure/walk-time.d.ts +87 -0
  393. package/dist/structure/walk-time.d.ts.map +1 -0
  394. package/dist/structure/walk-time.js +195 -0
  395. package/dist/structure/walk-time.js.map +1 -0
  396. package/package.json +3 -3
  397. package/profiles/listing.yaml +20 -0
  398. package/rules/announced-count-mismatch.yaml +2 -2
  399. package/rules/capacity-runtime-mismatch.yaml +66 -0
  400. package/rules/contact-variant.yaml +76 -0
  401. package/rules/count-over-capacity.yaml +55 -0
  402. package/rules/date-outside-period.yaml +4 -4
  403. package/rules/date-stamp-order.yaml +82 -0
  404. package/rules/deadline-after-event.yaml +67 -0
  405. package/rules/defined-name-repeated.yaml +2 -2
  406. package/rules/due-before-issue.yaml +11 -7
  407. package/rules/fact-conflict.yaml +9 -4
  408. package/rules/heading-echo.yaml +2 -2
  409. package/rules/interval-count-mismatch.yaml +54 -0
  410. package/rules/latin-spacing.yaml +2 -2
  411. package/rules/layout-code-mismatch.yaml +68 -0
  412. package/rules/name-variant.yaml +8 -2
  413. package/rules/no-em-dash.yaml +2 -2
  414. package/rules/preamble-length.yaml +2 -2
  415. package/rules/quantity-range-reversed.yaml +53 -0
  416. package/rules/range-band-mismatch.yaml +70 -0
  417. package/rules/rent-multiple-mismatch.yaml +61 -0
  418. package/rules/scaled-quantity-mismatch.yaml +69 -0
  419. package/rules/step-time-sum-mismatch.yaml +65 -0
  420. package/rules/time-range-reversed.yaml +48 -0
  421. package/rules/title-case-consistency.yaml +2 -2
  422. package/rules/total-mismatch.yaml +2 -2
  423. package/rules/unit-mismatch.yaml +12 -4
  424. package/rules/unlisted-item-used.yaml +90 -0
  425. package/rules/unused-definition.yaml +2 -2
  426. package/rules/use-before-definition.yaml +2 -2
  427. package/rules/walk-time-distance-mismatch.yaml +55 -0
  428. package/src/announced-count.ts +6 -3
  429. package/src/contacts/addresses.ts +179 -0
  430. package/src/contacts/emails.ts +63 -0
  431. package/src/contacts/variants.ts +33 -0
  432. package/src/derived/battery-runtime.ts +284 -0
  433. package/src/derived/period-counts.ts +178 -0
  434. package/src/derived/time-lengths.ts +12 -9
  435. package/src/derived/use-interval.ts +151 -0
  436. package/src/detectors/announced-count.ts +1 -0
  437. package/src/detectors/capacity-runtime.ts +128 -0
  438. package/src/detectors/contact-variant.ts +24 -0
  439. package/src/detectors/count-over-capacity.ts +37 -0
  440. package/src/detectors/date-outside-period.ts +2 -1
  441. package/src/detectors/date-stamp-order.ts +28 -0
  442. package/src/detectors/defined-term-form.ts +63 -7
  443. package/src/detectors/definition-use.ts +6 -2
  444. package/src/detectors/derived-numbers.ts +3 -3
  445. package/src/detectors/due-date.ts +10 -2
  446. package/src/detectors/en-shape.ts +11 -4
  447. package/src/detectors/event-deadline.ts +29 -0
  448. package/src/detectors/fact-consistency.ts +64 -3
  449. package/src/detectors/heading-case.ts +13 -4
  450. package/src/detectors/heading-echo.ts +17 -1
  451. package/src/detectors/layout-code.ts +174 -0
  452. package/src/detectors/measured-facts.ts +20 -0
  453. package/src/detectors/name-variant-model-codes.ts +27 -0
  454. package/src/detectors/name-variant.ts +32 -6
  455. package/src/detectors/orthographic-variant.ts +78 -9
  456. package/src/detectors/orthography.ts +16 -6
  457. package/src/detectors/quantity-range.ts +47 -0
  458. package/src/detectors/range-band.ts +125 -0
  459. package/src/detectors/registry/capacity-runtime-mismatch.ts +4 -0
  460. package/src/detectors/registry/contact-variant.ts +4 -0
  461. package/src/detectors/registry/count-over-capacity.ts +4 -0
  462. package/src/detectors/registry/date-stamp-order.ts +4 -0
  463. package/src/detectors/registry/event-deadline.ts +4 -0
  464. package/src/detectors/registry/interval-count-mismatch.ts +4 -0
  465. package/src/detectors/registry/layout-code-mismatch.ts +4 -0
  466. package/src/detectors/registry/quantity-range.ts +4 -0
  467. package/src/detectors/registry/range-band-mismatch.ts +4 -0
  468. package/src/detectors/registry/rent-multiple-mismatch.ts +4 -0
  469. package/src/detectors/registry/scaled-quantity-mismatch.ts +4 -0
  470. package/src/detectors/registry/step-time-sum-mismatch.ts +4 -0
  471. package/src/detectors/registry/time-range-reversed.ts +4 -0
  472. package/src/detectors/registry/unlisted-item-used.ts +4 -0
  473. package/src/detectors/registry/walk-time-distance-mismatch.ts +4 -0
  474. package/src/detectors/rent-multiple-mismatch.ts +56 -0
  475. package/src/detectors/scaled-quantity.ts +49 -0
  476. package/src/detectors/signals.ts +3 -1
  477. package/src/detectors/step-time-sum.ts +55 -0
  478. package/src/detectors/structure-tree.ts +30 -5
  479. package/src/detectors/structure.ts +1 -1
  480. package/src/detectors/technical-docs.ts +12 -0
  481. package/src/detectors/time-order.ts +5 -1
  482. package/src/detectors/unit-consistency.ts +50 -38
  483. package/src/detectors/unlisted-items.ts +72 -0
  484. package/src/detectors/use-count-words.ts +32 -0
  485. package/src/detectors/use-interval.ts +51 -0
  486. package/src/detectors/walk-time-distance-mismatch.ts +45 -0
  487. package/src/facts/approximate-tolerance.ts +19 -0
  488. package/src/facts/item-amounts.ts +94 -0
  489. package/src/facts/labelled-facts.ts +29 -7
  490. package/src/facts/measure-units.ts +31 -0
  491. package/src/facts/measures.ts +113 -25
  492. package/src/facts/retention-periods.ts +216 -0
  493. package/src/facts/unit-conflicts.ts +22 -9
  494. package/src/facts/unit-equivalents.ts +70 -0
  495. package/src/facts/unit-tolerance.ts +17 -0
  496. package/src/facts/unit-word.ts +35 -0
  497. package/src/facts/written-precision.ts +23 -0
  498. package/src/kana-spelling.ts +25 -0
  499. package/src/model-codes.ts +104 -0
  500. package/src/name-spelling-chars.ts +34 -0
  501. package/src/name-variants.ts +8 -7
  502. package/src/phone-numbers.ts +26 -6
  503. package/src/place-names.ts +53 -14
  504. package/src/plugin.ts +2 -0
  505. package/src/preamble-paragraphs.ts +21 -2
  506. package/src/profile/parse.ts +10 -0
  507. package/src/spacing-code.ts +26 -0
  508. package/src/structure/amount-range.ts +16 -7
  509. package/src/structure/capacity-count.ts +196 -0
  510. package/src/structure/counted-amounts.ts +5 -4
  511. package/src/structure/date-outside-period.ts +11 -6
  512. package/src/structure/date-range.ts +1 -1
  513. package/src/structure/deadline-after-event.ts +67 -0
  514. package/src/structure/definition-use.ts +59 -2
  515. package/src/structure/due-date.ts +8 -32
  516. package/src/structure/labelled-date-order.ts +84 -0
  517. package/src/structure/layout-codes.ts +210 -0
  518. package/src/structure/measured-amounts.ts +138 -0
  519. package/src/structure/quantity-range.ts +54 -0
  520. package/src/structure/range-bands.ts +316 -0
  521. package/src/structure/rent-multiple.ts +277 -0
  522. package/src/structure/scaled-quantities.ts +225 -0
  523. package/src/structure/stamp-order.ts +100 -0
  524. package/src/structure/step-times.ts +169 -0
  525. package/src/structure/term-deadline.ts +35 -0
  526. package/src/structure/time-range.ts +64 -0
  527. package/src/structure/total-line.ts +63 -0
  528. package/src/structure/total.ts +41 -6
  529. package/src/structure/unlisted-items.ts +207 -0
  530. package/src/structure/walk-time.ts +285 -0
@@ -0,0 +1,68 @@
1
+ export type LayoutPart = "living" | "dining" | "kitchen";
2
+ export type LetterGroup = LayoutPart | "storage" | "one-room";
3
+ export type RoomGroup = LayoutPart | "room" | "storage" | "unclear";
4
+ export type LayoutWords = {
5
+ /** One-letter marks written right after the number (L, D, K, S, R). */
6
+ readonly letters: ReadonlyMap<string, LetterGroup>;
7
+ /** Marks that add a room not counted (2LDK+S). */
8
+ readonly joiners: readonly string[];
9
+ /** Words after the number that say what it counts ("bedrooms", "BR"). */
10
+ readonly counted: readonly string[];
11
+ readonly rooms: readonly {
12
+ readonly pattern: string;
13
+ readonly group: RoomGroup;
14
+ }[];
15
+ /** Words after a number that make it a count of rooms (洋室2室): an entry with one is not read as one room. */
16
+ readonly counters: readonly string[];
17
+ };
18
+ export type LayoutCode = {
19
+ readonly text: string;
20
+ /** Where the code starts and ends in the text it was read from. */
21
+ readonly start: number;
22
+ readonly end: number;
23
+ readonly rooms: number;
24
+ /** The L, D and K a lettered code has. Undefined for a code that says nothing about them ("2 bedrooms", 1R). */
25
+ readonly parts: ReadonlySet<LayoutPart> | undefined;
26
+ };
27
+ export type Breakdown = {
28
+ readonly rooms: number;
29
+ /** Each L, D or K part the breakdown names, with the entry that names it. */
30
+ readonly parts: ReadonlyMap<LayoutPart, string>;
31
+ /** An entry that is a room in some listings and not in others, or names two kinds at once. */
32
+ readonly unclear: boolean;
33
+ };
34
+ export type LayoutSlip = {
35
+ readonly kind: "count";
36
+ readonly code: LayoutCode;
37
+ readonly listed: number;
38
+ } | {
39
+ readonly kind: "part";
40
+ readonly code: LayoutCode;
41
+ readonly entry: string;
42
+ };
43
+ /** Full-width ASCII (2LDK) as ASCII, one character for one, so offsets stay those of the source. */
44
+ export declare const foldWidth: (text: string) => string;
45
+ /**
46
+ * The one layout code a field value gives (2LDK, 3SLDK, 2LDK+S, "2 bedrooms", 2-bed, 2BR). A value with two codes of
47
+ * different counts ("2LDK or 3DK") gives none: which one the breakdown is for cannot be told.
48
+ */
49
+ export declare const parseLayoutCode: (value: string, words: LayoutWords) => LayoutCode | undefined;
50
+ /** The rooms a breakdown names ("LDK 11.5帖、洋室 6帖、洋室 5帖", "Bedroom 1, Bedroom 2, Bathroom"). Entries it cannot name are left out. */
51
+ export declare const parseBreakdown: (entries: readonly string[], words: LayoutWords) => Breakdown;
52
+ /**
53
+ * Where a code and the breakdown of the same listing disagree. Silent when the breakdown names no room (it may list only
54
+ * the LDK), or names one that is counted in some listings and not in others. A lettered code is also checked for an L, D or
55
+ * K part the breakdown names and the code lacks; a one-room code (1R) and a counted code ("2 bedrooms") are not.
56
+ */
57
+ export declare const layoutSlip: (code: LayoutCode, breakdown: Breakdown) => LayoutSlip | undefined;
58
+ /**
59
+ * The codes and breakdowns of one page, paired listing by listing: within one scope (a section), the first code with the
60
+ * first breakdown and so on, but only when the scope has as many of each. Any other count is several listings that cannot
61
+ * be told apart, and none is paired.
62
+ */
63
+ export declare const pairByScope: <C extends {
64
+ readonly scope: number;
65
+ }, B extends {
66
+ readonly scope: number;
67
+ }>(codes: readonly C[], breakdowns: readonly B[]) => [C, B][];
68
+ //# sourceMappingURL=layout-codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-codes.d.ts","sourceRoot":"","sources":["../../src/structure/layout-codes.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AACzD,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;AAC9D,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;AAEpE,MAAM,MAAM,WAAW,GAAG;IACxB,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACnD,kDAAkD;IAClD,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,yEAAyE;IACzE,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;KAAE,EAAE,CAAC;IACnF,4GAA4G;IAC5G,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,gHAAgH;IAChH,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAChD,8FAA8F;IAC9F,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,UAAU,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAMhK,oGAAoG;AACpG,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,KAAG,MAIrC,CAAC;AAmEL;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,EAAE,OAAO,WAAW,KAAG,UAAU,GAAG,SAMhF,CAAC;AA0CF,oIAAoI;AACpI,eAAO,MAAM,cAAc,GAAI,SAAS,SAAS,MAAM,EAAE,EAAE,OAAO,WAAW,KAAG,SAKqC,CAAC;AAEtH;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAI,MAAM,UAAU,EAAE,WAAW,SAAS,KAAG,UAAU,GAAG,SAOhF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,SAAS;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EACpG,OAAO,SAAS,CAAC,EAAE,EACnB,YAAY,SAAS,CAAC,EAAE,KACvB,CAAC,CAAC,EAAE,CAAC,CAAC,EAWR,CAAC"}
@@ -0,0 +1,161 @@
1
+ // layout-code-mismatch: a layout code (2LDK, "2 bedrooms") against the rooms a listing names. Pure: the words come in as
2
+ // LayoutWords (the layout-code and layout-room lexicons), the text as strings.
3
+ const FULLWIDTH_OFFSET = 0xfee0;
4
+ const FULLWIDTH_FIRST = 0xff01;
5
+ const FULLWIDTH_LAST = 0xff5e;
6
+ /** Full-width ASCII (2LDK) as ASCII, one character for one, so offsets stay those of the source. */
7
+ export const foldWidth = (text) => text.replace(/[!-~]/gu, (char) => {
8
+ const code = char.charCodeAt(0);
9
+ return code >= FULLWIDTH_FIRST && code <= FULLWIDTH_LAST ? String.fromCharCode(code - FULLWIDTH_OFFSET) : char;
10
+ });
11
+ const DIGITS = /\d+/uy;
12
+ const LATIN = /[a-z]/iu;
13
+ const WORD_CHAR = /[\p{L}\p{N}]/u;
14
+ /** Whether text has pattern at index, and does not run on into a longer word when the pattern is Latin (2BR is a word after a number). */
15
+ const wordAt = (text, index, pattern) => {
16
+ if (text.slice(index, index + pattern.length).toLowerCase() !== pattern.toLowerCase())
17
+ return false;
18
+ if (!LATIN.test(pattern))
19
+ return true;
20
+ return !WORD_CHAR.test(text.charAt(index + pattern.length)) && !/\p{L}/u.test(text.charAt(index - 1));
21
+ };
22
+ /** The longest code letters run (3SLDK). A longer run is a word, not a code. */
23
+ const MAX_CODE_LETTERS = 5;
24
+ /** The most "+S" a code adds (2LDK+S+納戸). */
25
+ const MAX_JOINS = 3;
26
+ /** The run of code letters at index (LDK, SLDK), with what they say; empty when the run is longer than a code. */
27
+ const lettersAt = (text, index, words) => {
28
+ const head = Array.from(text.slice(index, index + MAX_CODE_LETTERS + 1));
29
+ const stop = head.findIndex((char) => !words.letters.has(char));
30
+ const length = stop === -1 ? head.length : stop;
31
+ if (length > MAX_CODE_LETTERS)
32
+ return [];
33
+ return head.slice(0, length).flatMap((char) => words.letters.get(char) ?? []);
34
+ };
35
+ /** After a lettered code, each "+S" or "+納戸" that adds a room not counted: the index where they end. */
36
+ const joinedEnd = (text, index, words, joins = 0) => {
37
+ const joiner = words.joiners.find((mark) => text.startsWith(mark, index));
38
+ if (joiner === undefined || joins === MAX_JOINS)
39
+ return index;
40
+ const after = index + joiner.length;
41
+ const letter = words.letters.get(text.charAt(after)) === "storage" ? 1 : 0;
42
+ const word = words.rooms.find((room) => room.group === "storage" && wordAt(text, after, room.pattern))?.pattern.length ?? letter;
43
+ return word === 0 ? index : joinedEnd(text, after + word, words, joins + 1);
44
+ };
45
+ const letteredCode = (text, start, digitsEnd, words) => {
46
+ const groups = lettersAt(text, digitsEnd, words);
47
+ const lettersEnd = digitsEnd + groups.length;
48
+ if (!groups.includes("kitchen") && !groups.includes("one-room"))
49
+ return undefined;
50
+ if (LATIN.test(text.charAt(lettersEnd)))
51
+ return undefined;
52
+ const end = joinedEnd(text, lettersEnd, words);
53
+ const parts = groups.includes("one-room") ? undefined : new Set(groups.filter((group) => group !== "storage"));
54
+ return { text: text.slice(start, end), start, end, rooms: Number(text.slice(start, digitsEnd)), parts };
55
+ };
56
+ const SPACER = /[ \-‐–]?/uy;
57
+ const countedCode = (text, start, digitsEnd, words) => {
58
+ SPACER.lastIndex = digitsEnd;
59
+ const after = digitsEnd + (SPACER.exec(text)?.[0].length ?? 0);
60
+ const word = words.counted.find((pattern) => wordAt(text, after, pattern));
61
+ if (word === undefined)
62
+ return undefined;
63
+ const end = after + word.length;
64
+ return { text: text.slice(start, end), start, end, rooms: Number(text.slice(start, digitsEnd)), parts: undefined };
65
+ };
66
+ const codeAt = (text, start, words) => {
67
+ if (/[\p{L}\p{N}.,]/u.test(text.charAt(start - 1)))
68
+ return undefined;
69
+ DIGITS.lastIndex = start;
70
+ const digits = DIGITS.exec(text)?.[0];
71
+ if (digits === undefined)
72
+ return undefined;
73
+ const digitsEnd = start + digits.length;
74
+ return letteredCode(text, start, digitsEnd, words) ?? countedCode(text, start, digitsEnd, words);
75
+ };
76
+ /**
77
+ * The one layout code a field value gives (2LDK, 3SLDK, 2LDK+S, "2 bedrooms", 2-bed, 2BR). A value with two codes of
78
+ * different counts ("2LDK or 3DK") gives none: which one the breakdown is for cannot be told.
79
+ */
80
+ export const parseLayoutCode = (value, words) => {
81
+ const text = foldWidth(value);
82
+ const codes = [...text.matchAll(/\d+/gu)].flatMap((match) => codeAt(text, match.index, words) ?? []);
83
+ const first = codes[0];
84
+ if (first === undefined || codes.some((code) => code.rooms !== first.rooms))
85
+ return undefined;
86
+ return { ...first, text: value.slice(first.start, first.end) };
87
+ };
88
+ const ENTRY_SEPARATOR = /[、,,・//++;;\n]/u;
89
+ const MULTIPLIER = /(?:[×✕]|(?<=[\s\d])[xX])\s*(\d+)\s*$/u;
90
+ /** The kinds of room an entry names, by the room words in it; a lone run of code letters (LDK 12帖, S 4帖) by its letters. */
91
+ const groupsOfEntry = (entry, words) => {
92
+ const named = words.rooms.filter((room) => positions(entry).some((index) => wordAt(entry, index, room.pattern))).map((room) => room.group);
93
+ if (named.length > 0)
94
+ return [...new Set(named)];
95
+ const letters = /^[A-Z]+(?![A-Za-z])/u.exec(entry)?.[0] ?? "";
96
+ const groups = [...letters].map((letter) => words.letters.get(letter));
97
+ if (letters === "" || groups.some((group) => group === undefined || group === "one-room"))
98
+ return [];
99
+ return [...new Set(groups.flatMap((group) => (group === undefined || group === "one-room" ? [] : [group])))];
100
+ };
101
+ const positions = (entry) => Array.from({ length: entry.length }, (_, index) => index);
102
+ /** How many rooms an entry names in words (Bedroom 1 and Bedroom 2 names two). */
103
+ const roomMentions = (entry, words) => {
104
+ const rooms = words.rooms.filter((room) => room.group === "room");
105
+ return positions(entry).filter((index) => rooms.some((room) => wordAt(entry, index, room.pattern))).length;
106
+ };
107
+ /** Whether the entry counts rooms with a number (洋室2室, 和室 2間). */
108
+ const countsRooms = (entry, words) => [...entry.matchAll(/\d+\s*/gu)].some((match) => words.counters.some((counter) => entry.startsWith(counter, match.index + match[0].length)));
109
+ const isPart = (group) => group === "living" || group === "dining" || group === "kitchen";
110
+ const tallyEntry = (tally, entry, words) => {
111
+ const groups = groupsOfEntry(entry, words);
112
+ const rooms = groups.includes("room");
113
+ const several = rooms && (groups.length > 1 || roomMentions(entry, words) > 1 || countsRooms(entry, words));
114
+ if (groups.includes("unclear") || several)
115
+ return { ...tally, unclear: true };
116
+ const times = Number(MULTIPLIER.exec(entry)?.[1] ?? 1);
117
+ const parts = new Map(tally.parts);
118
+ groups.filter(isPart).forEach((part) => parts.set(part, parts.get(part) ?? entry));
119
+ return { rooms: tally.rooms + (rooms ? times : 0), parts, unclear: tally.unclear };
120
+ };
121
+ /** The rooms a breakdown names ("LDK 11.5帖、洋室 6帖、洋室 5帖", "Bedroom 1, Bedroom 2, Bathroom"). Entries it cannot name are left out. */
122
+ export const parseBreakdown = (entries, words) => entries
123
+ .flatMap((entry) => foldWidth(entry).split(ENTRY_SEPARATOR))
124
+ .map((entry) => entry.trim())
125
+ .filter((entry) => entry !== "")
126
+ .reduce((tally, entry) => tallyEntry(tally, entry, words), { rooms: 0, parts: new Map(), unclear: false });
127
+ /**
128
+ * Where a code and the breakdown of the same listing disagree. Silent when the breakdown names no room (it may list only
129
+ * the LDK), or names one that is counted in some listings and not in others. A lettered code is also checked for an L, D or
130
+ * K part the breakdown names and the code lacks; a one-room code (1R) and a counted code ("2 bedrooms") are not.
131
+ */
132
+ export const layoutSlip = (code, breakdown) => {
133
+ if (breakdown.unclear || breakdown.rooms === 0)
134
+ return undefined;
135
+ if (breakdown.rooms !== code.rooms)
136
+ return { kind: "count", code, listed: breakdown.rooms };
137
+ const parts = code.parts;
138
+ if (parts === undefined)
139
+ return undefined;
140
+ const extra = [...breakdown.parts].find(([part]) => !parts.has(part));
141
+ return extra === undefined ? undefined : { kind: "part", code, entry: extra[1] };
142
+ };
143
+ /**
144
+ * The codes and breakdowns of one page, paired listing by listing: within one scope (a section), the first code with the
145
+ * first breakdown and so on, but only when the scope has as many of each. Any other count is several listings that cannot
146
+ * be told apart, and none is paired.
147
+ */
148
+ export const pairByScope = (codes, breakdowns) => {
149
+ const scopes = [...new Set(codes.map((code) => code.scope))];
150
+ return scopes.flatMap((scope) => {
151
+ const inCodes = codes.filter((code) => code.scope === scope);
152
+ const inBreakdowns = breakdowns.filter((breakdown) => breakdown.scope === scope);
153
+ if (inCodes.length !== inBreakdowns.length)
154
+ return [];
155
+ return inCodes.flatMap((code, index) => {
156
+ const breakdown = inBreakdowns[index];
157
+ return breakdown === undefined ? [] : [[code, breakdown]];
158
+ });
159
+ });
160
+ };
161
+ //# sourceMappingURL=layout-codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-codes.js","sourceRoot":"","sources":["../../src/structure/layout-codes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Amount } from "./total.ts";
2
+ import type { MeasureUnit } from "../facts/measures.ts";
3
+ /**
4
+ * 足してよい、単位の付いた量(300 mg、0.5 g、2 L、3 cm)。単位は量の種類(dimension)と、基準の単位への倍率(factors)を持つ。
5
+ * 同じ種類の量は、その種類で一番小さい単位に直して足す(500 mg と 0.5 g は 1,000 mg)。倍率が二つある単位(cup)は換算が決まらない。
6
+ */
7
+ export type SummedMeasure = Pick<MeasureUnit, "pattern" | "dimension" | "factors" | "before" | "context">;
8
+ /** 足せない量の印。目安の印(約、about、程度)、範囲の印(〜)、何あたりかの印(数の前の $3 / 200 g、単位の後ろの 300 mg/錠、per tablet)。 */
9
+ export type MeasureMarks = {
10
+ readonly roughBefore: readonly string[];
11
+ readonly roughAfter: readonly string[];
12
+ readonly connectors: readonly string[];
13
+ readonly perMarks: readonly string[];
14
+ };
15
+ /** 文書の中の、単位の付いた量。値は量の種類で一番小さい単位に直す。木がすでに数量として読んだもの(known)とは重ねない。 */
16
+ export declare const measuredAmounts: (source: string, measures: readonly SummedMeasure[], marks: MeasureMarks, known: readonly Amount[]) => Amount[];
17
+ //# sourceMappingURL=measured-amounts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measured-amounts.d.ts","sourceRoot":"","sources":["../../src/structure/measured-amounts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAC;AAE1G,4FAA4F;AAC5F,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC,CAAC;AA8GF,oEAAoE;AACpE,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,EAAE,UAAU,SAAS,aAAa,EAAE,EAAE,OAAO,YAAY,EAAE,OAAO,SAAS,MAAM,EAAE,KAAG,MAAM,EAUzI,CAAC"}
@@ -0,0 +1,110 @@
1
+ import { CONTINUES_WORD, NUMBER, overlapsAny, valueOf } from "./counted-amounts.js";
2
+ /**
3
+ * 足せない量の単位に付ける印。量は読むが、単位に位置も入れて、ほかのどの量とも同じ単位にならないようにする。その量がある列の和は取らない。
4
+ * 読まずに捨てると、その行が空の升に見えて、残りの行の和を合計と比べてしまう。
5
+ */
6
+ const UNSUMMABLE = "?";
7
+ const LOOKAHEAD = 32;
8
+ const LATIN = /\p{Script=Latin}/u;
9
+ const DIGIT_AT_END = /\p{N}$/u;
10
+ const lineStartOf = (source, offset) => source.lastIndexOf("\n", offset - 1) + 1;
11
+ /** text が word で終わり、英字の語なら語の途中(awesome の some)でない。 */
12
+ const endsWithWord = (text, word) => {
13
+ if (!text.toLowerCase().endsWith(word.toLowerCase()))
14
+ return false;
15
+ return !LATIN.test(word.charAt(0)) || !LATIN.test(text.charAt(text.length - word.length - 1));
16
+ };
17
+ /** text が word で始まり、英字の語なら語の途中(personal の per)でない。 */
18
+ const startsWithWord = (text, word) => {
19
+ if (!text.toLowerCase().startsWith(word.toLowerCase()))
20
+ return false;
21
+ return !LATIN.test(word.at(-1) ?? "") || !LATIN.test(text.charAt(word.length));
22
+ };
23
+ /**
24
+ * 数の前の目安の印(約300mg、about 300 mg)、何あたりかの印($3 / 200 g、$3 per 200 g)、
25
+ * 範囲の後ろの端(300〜400mg、300 - 400 mg)。
26
+ */
27
+ const markedBefore = (source, start, marks) => {
28
+ const before = source.slice(lineStartOf(source, start), start);
29
+ const trimmed = before.trimEnd();
30
+ if ([...marks.roughBefore, ...marks.perMarks].some((word) => endsWithWord(trimmed, word)))
31
+ return true;
32
+ return marks.connectors.some((connector) => before.endsWith(connector) || (trimmed.endsWith(connector) && DIGIT_AT_END.test(trimmed.slice(0, -connector.length).trimEnd())));
33
+ };
34
+ /** 印の前に置かれうる、開き括弧と空白(5 mg (per tablet))。 */
35
+ const OPENING = /^[\s(([[]+/u;
36
+ /** 単位の後ろの、目安の印(300mg程度)か何あたりかの印(300 mg/tablet、300 mg per tablet、5 mg (per tablet))。 */
37
+ const markedAfter = (source, end, marks) => {
38
+ const after = source.slice(end, end + LOOKAHEAD).replace(OPENING, "");
39
+ return [...marks.roughAfter, ...marks.perMarks].some((word) => startsWithWord(after, word));
40
+ };
41
+ const lineAt = (source, offset) => {
42
+ const end = source.indexOf("\n", offset);
43
+ return source.slice(lineStartOf(source, offset), end === -1 ? source.length : end);
44
+ };
45
+ /** 文脈の語が要る単位(unit-context)は、同じ行にその語があるときだけ単位。 */
46
+ const inContext = (measure, source, offset) => {
47
+ if (measure.context.length === 0)
48
+ return true;
49
+ const line = lineAt(source, offset).toLowerCase();
50
+ return measure.context.some((word) => line.includes(word.toLowerCase()));
51
+ };
52
+ /** 数のすぐ後ろ(空白一つまで)の単位。長い単位から試す(mg を m で切らない)。大文字と小文字は区別する(mL と ML は別)。 */
53
+ const measureAfter = (source, end, measures, marks) => {
54
+ const gap = source.charAt(end) === " " ? 1 : 0;
55
+ const rest = source.slice(end + gap, end + gap + LOOKAHEAD);
56
+ const measure = measures.find((candidate) => {
57
+ if (candidate.before || !rest.startsWith(candidate.pattern) || !inContext(candidate, source, end))
58
+ return false;
59
+ const unitEnd = end + gap + candidate.pattern.length;
60
+ return markedAfter(source, unitEnd, marks) || !CONTINUES_WORD.test(rest.slice(candidate.pattern.length));
61
+ });
62
+ return measure === undefined ? undefined : { measure, end: end + gap + measure.pattern.length };
63
+ };
64
+ /** 量の種類ごとの、一番小さい倍率。倍率が一つの単位だけから取る。 */
65
+ const baseFactors = (measures) => measures.reduce((bases, measure) => {
66
+ const [factor] = measure.factors;
67
+ if (measure.factors.length !== 1 || factor === undefined || factor <= 0)
68
+ return bases;
69
+ return bases.set(measure.dimension, Math.min(bases.get(measure.dimension) ?? factor, factor));
70
+ }, new Map());
71
+ const unsummable = (offset, end, value, measure) => ({
72
+ offset,
73
+ end,
74
+ value,
75
+ unit: `${measure.dimension}${UNSUMMABLE}${String(offset)}`,
76
+ });
77
+ const amountOf = (source, start, written, found, bases, marks) => {
78
+ const value = valueOf(written);
79
+ const { measure } = found;
80
+ const [factor] = measure.factors;
81
+ const base = bases.get(measure.dimension);
82
+ const sure = measure.factors.length === 1 && factor !== undefined && base !== undefined;
83
+ if (!sure || markedBefore(source, start, marks) || markedAfter(source, found.end, marks))
84
+ return unsummable(start, found.end, value, measure);
85
+ const scale = factor / base;
86
+ return { offset: start, end: found.end, value: value * scale, unit: measure.dimension, scale };
87
+ };
88
+ /**
89
+ * 数のすぐ前(空白一つまで)の単位(大さじ1)は、足さない量として読む。読まずに捨てると、その行が空の升に見えてしまう。
90
+ */
91
+ const measureBefore = (source, start, end, measures) => {
92
+ const gap = source.charAt(start - 1) === " " ? 1 : 0;
93
+ const head = source.slice(Math.max(0, start - gap - LOOKAHEAD), start - gap);
94
+ const measure = measures.find((candidate) => candidate.before && head.endsWith(candidate.pattern) && inContext(candidate, source, start));
95
+ return measure === undefined ? undefined : unsummable(start - gap - measure.pattern.length, end, valueOf(source.slice(start, end)), measure);
96
+ };
97
+ /** 文書の中の、単位の付いた量。値は量の種類で一番小さい単位に直す。木がすでに数量として読んだもの(known)とは重ねない。 */
98
+ export const measuredAmounts = (source, measures, marks, known) => {
99
+ const longestFirst = measures.toSorted((left, right) => right.pattern.length - left.pattern.length);
100
+ const bases = baseFactors(measures);
101
+ return [...source.matchAll(NUMBER)].flatMap((match) => {
102
+ const end = match.index + match[0].length;
103
+ const found = measureAfter(source, end, longestFirst, marks);
104
+ if (found !== undefined)
105
+ return overlapsAny(match.index, found.end, known) ? [] : [amountOf(source, match.index, match[0], found, bases, marks)];
106
+ const before = measureBefore(source, match.index, end, longestFirst);
107
+ return before === undefined || overlapsAny(before.offset, before.end, known) ? [] : [before];
108
+ });
109
+ };
110
+ //# sourceMappingURL=measured-amounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measured-amounts.js","sourceRoot":"","sources":["../../src/structure/measured-amounts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Measured } from "../facts/measures.ts";
2
+ import type { StructureIssue } from "./issues.ts";
3
+ import type { RangeAmount } from "./amount-range.ts";
4
+ /** The measured quantities that can end a range, as range ends. */
5
+ export declare const quantityRangeEnds: (text: string, measured: readonly Measured[]) => RangeAmount[];
6
+ /** The reversed ranges that no lead word frames as a change. */
7
+ export declare const unledRanges: (text: string, issues: readonly StructureIssue[], leads: readonly string[]) => StructureIssue[];
8
+ //# sourceMappingURL=quantity-range.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quantity-range.d.ts","sourceRoot":"","sources":["../../src/structure/quantity-range.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA4BrD,mEAAmE;AACnE,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,EAAE,UAAU,SAAS,QAAQ,EAAE,KAAG,WAAW,EAC+B,CAAC;AAgB3H,gEAAgE;AAChE,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,EAAE,QAAQ,SAAS,cAAc,EAAE,EAAE,OAAO,SAAS,MAAM,EAAE,KAAG,cAAc,EACzD,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { escapeRegExp } from "../orthography.js";
2
+ const LATIN_EDGE = /[A-Za-z]$/u;
3
+ const LATIN_START = /^[A-Za-z]/u;
4
+ /** A Latin unit running into a word is part of that word: the t of "40 to" is not a tonne. */
5
+ const standsAlone = (text, measured) => !(LATIN_EDGE.test(measured.unit) && LATIN_START.test(text.slice(measured.end, measured.end + 1)));
6
+ /** 10 and a minus sign right before the number is a power of ten written flat ("10-8 cm" for 10⁻⁸ cm), not a range. */
7
+ const POWER_OF_TEN = /(?<![0-90-9.,,.])[11][00][-−-]$/u;
8
+ /** "10-" and the character before it, which must not be a digit (110-8 cm is a range). */
9
+ const POWER_OF_TEN_LOOKBACK = 4;
10
+ const isExponent = (text, measured) => POWER_OF_TEN.test(text.slice(Math.max(0, measured.start - POWER_OF_TEN_LOOKBACK), measured.start));
11
+ /** A quantity as one end of a range: two ends compare only in one unit, however it is spelled (℃ with °C, m with meters). */
12
+ const rangeEndOf = (text, measured) => ({
13
+ offset: measured.start,
14
+ end: measured.end,
15
+ currency: `${measured.dimension}:${measured.factors.join(",")}`,
16
+ value: measured.amount,
17
+ scale: undefined,
18
+ position: text.startsWith(measured.unit, measured.start) ? "before" : "after",
19
+ });
20
+ /** The measured quantities that can end a range, as range ends. */
21
+ export const quantityRangeEnds = (text, measured) => measured.filter((value) => standsAlone(text, value) && !isExponent(text, value)).map((value) => rangeEndOf(text, value));
22
+ const LATIN_WORD = /^[A-Za-z]/u;
23
+ /** Whether a lead word stands right before the range on its line ("went from 9 minutes to 2 minutes" tells of a change). */
24
+ const ledBy = (text, offset, leads) => {
25
+ const before = text
26
+ .slice(text.lastIndexOf("\n", offset - 1) + 1, offset)
27
+ .trimEnd()
28
+ .toLowerCase();
29
+ return leads.some((lead) => {
30
+ const edge = LATIN_WORD.test(lead) ? "(?<![a-z])" : "";
31
+ return new RegExp(`${edge}${escapeRegExp(lead.toLowerCase())}$`, "u").test(before);
32
+ });
33
+ };
34
+ /** The reversed ranges that no lead word frames as a change. */
35
+ export const unledRanges = (text, issues, leads) => issues.filter((issue) => !ledBy(text, issue.offset, leads));
36
+ //# sourceMappingURL=quantity-range.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quantity-range.js","sourceRoot":"","sources":["../../src/structure/quantity-range.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /** How an end of a band is written: 以上/以下 (inclusive), 未満/超 (exclusive), or only a range mark (7〜11, 7 to 11). */
2
+ export type BoundKind = "inclusive" | "exclusive" | "loose";
3
+ export type Bound = {
4
+ readonly value: number;
5
+ readonly kind: BoundKind;
6
+ readonly decimals: number;
7
+ };
8
+ /** Integer units (ages, people, points) have no value between 11 and 12; continuous ones (kg, yen, hours) do. */
9
+ export type UnitKind = "integer" | "continuous";
10
+ export type Band = {
11
+ readonly low: Bound | undefined;
12
+ readonly high: Bound | undefined;
13
+ readonly unit: string;
14
+ };
15
+ export type BandMarker = {
16
+ readonly pattern: string;
17
+ readonly side: "low" | "high";
18
+ readonly kind: "inclusive" | "exclusive";
19
+ readonly position: "before" | "after";
20
+ };
21
+ export type BandUnit = {
22
+ readonly pattern: string;
23
+ readonly kind: UnitKind;
24
+ readonly position: "before" | "after";
25
+ };
26
+ export type BandWords = {
27
+ /** Marks between the two ends (〜, –, to). Written after a number alone (12歳〜) it leaves the band open above. */
28
+ readonly connectors: readonly string[];
29
+ /** The marks that, before a number alone (〜6歳), close a band above. A hyphen is not one: "- 5" is a bullet or a minus. */
30
+ readonly openers: readonly string[];
31
+ readonly markers: readonly BandMarker[];
32
+ /** Words a band may open with that say nothing about its ends ("ages", "aged"). */
33
+ readonly leads: readonly string[];
34
+ readonly units: readonly BandUnit[];
35
+ /** Column headings that name what bare numbers count (年齢, Age), with the kind of that quantity. */
36
+ readonly headings: readonly {
37
+ readonly pattern: string;
38
+ readonly kind: UnitKind;
39
+ }[];
40
+ };
41
+ /** One band as written, with where it is. */
42
+ export type PlacedBand = {
43
+ readonly band: Band;
44
+ readonly start: number;
45
+ readonly end: number;
46
+ readonly text: string;
47
+ };
48
+ export type BandSlip = {
49
+ readonly kind: "overlap" | "gap";
50
+ readonly earlier: PlacedBand;
51
+ readonly later: PlacedBand;
52
+ };
53
+ export declare const normalizeBandText: (text: string) => string;
54
+ /** The band a cell or the head of a list item states, or undefined when the whole text is not one band in one unit. */
55
+ export declare const parseBand: (written: string, words: BandWords) => Band | undefined;
56
+ /** The kind of a unit, by the unit lexicon. */
57
+ export declare const unitKindOf: (unit: string, words: BandWords) => UnitKind | undefined;
58
+ /** What bare numbers under a column heading count: by a word of the heading lexicon, or a unit in brackets (体重(kg)). */
59
+ export declare const headingOf: (heading: string, words: BandWords) => {
60
+ readonly unit: string;
61
+ readonly kind: UnitKind;
62
+ } | undefined;
63
+ /**
64
+ * The overlaps and gaps between neighbouring bands of one column or list. The bands must all be counted in one unit (bare
65
+ * numbers take the column's), written in one direction; the slip is reported at the later of the two in the document. A run
66
+ * with one deliberate overlap is a scale meant to overlap, and two bands alone are reported only when the hole or overlap is
67
+ * no wider than the narrower band.
68
+ */
69
+ export declare const bandSlips: (bands: readonly PlacedBand[], kind: UnitKind) => BandSlip[];
70
+ /** The unit and kind of a run of bands: one unit for all (bare numbers take the heading's), or undefined. */
71
+ export declare const runKindOf: (bands: readonly Band[], heading: {
72
+ readonly unit: string;
73
+ readonly kind: UnitKind;
74
+ } | undefined, words: BandWords) => UnitKind | undefined;
75
+ //# sourceMappingURL=range-bands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range-bands.d.ts","sourceRoot":"","sources":["../../src/structure/range-bands.ts"],"names":[],"mappings":"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"}