chaffjs 0.31.0 → 0.32.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 (1263) hide show
  1. package/README.ja.md +330 -0
  2. package/README.md +119 -257
  3. package/dist/company-kana-spelling.d.ts +31 -0
  4. package/dist/company-kana-spelling.d.ts.map +1 -0
  5. package/dist/company-kana-spelling.js +79 -0
  6. package/dist/company-kana-spelling.js.map +1 -0
  7. package/dist/company-names.d.ts +32 -1
  8. package/dist/company-names.d.ts.map +1 -1
  9. package/dist/company-names.js +129 -22
  10. package/dist/company-names.js.map +1 -1
  11. package/dist/contacts/table-rows.d.ts +7 -0
  12. package/dist/contacts/table-rows.d.ts.map +1 -0
  13. package/dist/contacts/table-rows.js +42 -0
  14. package/dist/contacts/table-rows.js.map +1 -0
  15. package/dist/derived/age-on-date.d.ts +53 -0
  16. package/dist/derived/age-on-date.d.ts.map +1 -0
  17. package/dist/derived/age-on-date.js +114 -0
  18. package/dist/derived/age-on-date.js.map +1 -0
  19. package/dist/derived/durations.d.ts +17 -2
  20. package/dist/derived/durations.d.ts.map +1 -1
  21. package/dist/derived/durations.js +61 -10
  22. package/dist/derived/durations.js.map +1 -1
  23. package/dist/derived/hours-and-minutes.d.ts +26 -0
  24. package/dist/derived/hours-and-minutes.d.ts.map +1 -0
  25. package/dist/derived/hours-and-minutes.js +24 -0
  26. package/dist/derived/hours-and-minutes.js.map +1 -0
  27. package/dist/derived/hyphenated-counts.d.ts +15 -0
  28. package/dist/derived/hyphenated-counts.d.ts.map +1 -0
  29. package/dist/derived/hyphenated-counts.js +31 -0
  30. package/dist/derived/hyphenated-counts.js.map +1 -0
  31. package/dist/derived/marked-dates.d.ts +15 -0
  32. package/dist/derived/marked-dates.d.ts.map +1 -0
  33. package/dist/derived/marked-dates.js +41 -0
  34. package/dist/derived/marked-dates.js.map +1 -0
  35. package/dist/derived/money-span.d.ts +9 -0
  36. package/dist/derived/money-span.d.ts.map +1 -0
  37. package/dist/derived/money-span.js +6 -0
  38. package/dist/derived/money-span.js.map +1 -0
  39. package/dist/derived/period-parts.d.ts +55 -0
  40. package/dist/derived/period-parts.d.ts.map +1 -0
  41. package/dist/derived/period-parts.js +283 -0
  42. package/dist/derived/period-parts.js.map +1 -0
  43. package/dist/derived/readable-date.d.ts +20 -0
  44. package/dist/derived/readable-date.d.ts.map +1 -0
  45. package/dist/derived/readable-date.js +50 -0
  46. package/dist/derived/readable-date.js.map +1 -0
  47. package/dist/derived/stays.d.ts +3 -1
  48. package/dist/derived/stays.d.ts.map +1 -1
  49. package/dist/derived/stays.js +3 -0
  50. package/dist/derived/stays.js.map +1 -1
  51. package/dist/derived/timesheet-hours.d.ts +27 -0
  52. package/dist/derived/timesheet-hours.d.ts.map +1 -0
  53. package/dist/derived/timesheet-hours.js +86 -0
  54. package/dist/derived/timesheet-hours.js.map +1 -0
  55. package/dist/derived/use-maximum.d.ts +27 -0
  56. package/dist/derived/use-maximum.d.ts.map +1 -0
  57. package/dist/derived/use-maximum.js +104 -0
  58. package/dist/derived/use-maximum.js.map +1 -0
  59. package/dist/derived/working-hours.d.ts +4 -5
  60. package/dist/derived/working-hours.d.ts.map +1 -1
  61. package/dist/detectors/annual-holidays-mismatch.d.ts +3 -0
  62. package/dist/detectors/annual-holidays-mismatch.d.ts.map +1 -0
  63. package/dist/detectors/annual-holidays-mismatch.js +29 -0
  64. package/dist/detectors/annual-holidays-mismatch.js.map +1 -0
  65. package/dist/detectors/annual-pay-mismatch.d.ts +3 -0
  66. package/dist/detectors/annual-pay-mismatch.d.ts.map +1 -0
  67. package/dist/detectors/annual-pay-mismatch.js +52 -0
  68. package/dist/detectors/annual-pay-mismatch.js.map +1 -0
  69. package/dist/detectors/blank-structure.d.ts +3 -1
  70. package/dist/detectors/blank-structure.d.ts.map +1 -1
  71. package/dist/detectors/blank-structure.js +45 -12
  72. package/dist/detectors/blank-structure.js.map +1 -1
  73. package/dist/detectors/bmi-mismatch.d.ts +3 -0
  74. package/dist/detectors/bmi-mismatch.d.ts.map +1 -0
  75. package/dist/detectors/bmi-mismatch.js +70 -0
  76. package/dist/detectors/bmi-mismatch.js.map +1 -0
  77. package/dist/detectors/change-rate.d.ts.map +1 -1
  78. package/dist/detectors/change-rate.js +24 -9
  79. package/dist/detectors/change-rate.js.map +1 -1
  80. package/dist/detectors/closing-balance-mismatch.d.ts +3 -0
  81. package/dist/detectors/closing-balance-mismatch.d.ts.map +1 -0
  82. package/dist/detectors/closing-balance-mismatch.js +42 -0
  83. package/dist/detectors/closing-balance-mismatch.js.map +1 -0
  84. package/dist/detectors/contact-variant.d.ts.map +1 -1
  85. package/dist/detectors/contact-variant.js +6 -2
  86. package/dist/detectors/contact-variant.js.map +1 -1
  87. package/dist/detectors/cumulative-below-current.d.ts +3 -0
  88. package/dist/detectors/cumulative-below-current.d.ts.map +1 -0
  89. package/dist/detectors/cumulative-below-current.js +25 -0
  90. package/dist/detectors/cumulative-below-current.js.map +1 -0
  91. package/dist/detectors/currency-column.d.ts +3 -0
  92. package/dist/detectors/currency-column.d.ts.map +1 -0
  93. package/dist/detectors/currency-column.js +32 -0
  94. package/dist/detectors/currency-column.js.map +1 -0
  95. package/dist/detectors/date-any-year.d.ts +24 -0
  96. package/dist/detectors/date-any-year.d.ts.map +1 -0
  97. package/dist/detectors/date-any-year.js +103 -0
  98. package/dist/detectors/date-any-year.js.map +1 -0
  99. package/dist/detectors/date-outside-period.d.ts.map +1 -1
  100. package/dist/detectors/date-outside-period.js +4 -10
  101. package/dist/detectors/date-outside-period.js.map +1 -1
  102. package/dist/detectors/date-stamp-order.d.ts.map +1 -1
  103. package/dist/detectors/date-stamp-order.js +2 -1
  104. package/dist/detectors/date-stamp-order.js.map +1 -1
  105. package/dist/detectors/date-year.d.ts +18 -6
  106. package/dist/detectors/date-year.d.ts.map +1 -1
  107. package/dist/detectors/date-year.js +39 -11
  108. package/dist/detectors/date-year.js.map +1 -1
  109. package/dist/detectors/deductible-exceeds-limit.d.ts +4 -0
  110. package/dist/detectors/deductible-exceeds-limit.d.ts.map +1 -0
  111. package/dist/detectors/deductible-exceeds-limit.js +46 -0
  112. package/dist/detectors/deductible-exceeds-limit.js.map +1 -0
  113. package/dist/detectors/defined-term-form.d.ts.map +1 -1
  114. package/dist/detectors/defined-term-form.js +6 -20
  115. package/dist/detectors/defined-term-form.js.map +1 -1
  116. package/dist/detectors/derived-numbers.d.ts +4 -3
  117. package/dist/detectors/derived-numbers.d.ts.map +1 -1
  118. package/dist/detectors/derived-numbers.js +43 -70
  119. package/dist/detectors/derived-numbers.js.map +1 -1
  120. package/dist/detectors/discount-rate.d.ts +3 -0
  121. package/dist/detectors/discount-rate.d.ts.map +1 -0
  122. package/dist/detectors/discount-rate.js +35 -0
  123. package/dist/detectors/discount-rate.js.map +1 -0
  124. package/dist/detectors/due-date.d.ts.map +1 -1
  125. package/dist/detectors/due-date.js +11 -4
  126. package/dist/detectors/due-date.js.map +1 -1
  127. package/dist/detectors/email-letter.d.ts +10 -2
  128. package/dist/detectors/email-letter.d.ts.map +1 -1
  129. package/dist/detectors/email-letter.js +24 -5
  130. package/dist/detectors/email-letter.js.map +1 -1
  131. package/dist/detectors/event-deadline.d.ts.map +1 -1
  132. package/dist/detectors/event-deadline.js +11 -2
  133. package/dist/detectors/event-deadline.js.map +1 -1
  134. package/dist/detectors/fact-consistency.d.ts.map +1 -1
  135. package/dist/detectors/fact-consistency.js +112 -5
  136. package/dist/detectors/fact-consistency.js.map +1 -1
  137. package/dist/detectors/gloss-year.d.ts +11 -0
  138. package/dist/detectors/gloss-year.d.ts.map +1 -0
  139. package/dist/detectors/gloss-year.js +14 -0
  140. package/dist/detectors/gloss-year.js.map +1 -0
  141. package/dist/detectors/gpa-mismatch.d.ts +3 -0
  142. package/dist/detectors/gpa-mismatch.d.ts.map +1 -0
  143. package/dist/detectors/gpa-mismatch.js +39 -0
  144. package/dist/detectors/gpa-mismatch.js.map +1 -0
  145. package/dist/detectors/impossible-date.d.ts.map +1 -1
  146. package/dist/detectors/impossible-date.js +22 -6
  147. package/dist/detectors/impossible-date.js.map +1 -1
  148. package/dist/detectors/installment-total-mismatch.d.ts +3 -0
  149. package/dist/detectors/installment-total-mismatch.d.ts.map +1 -0
  150. package/dist/detectors/installment-total-mismatch.js +49 -0
  151. package/dist/detectors/installment-total-mismatch.js.map +1 -0
  152. package/dist/detectors/interest.d.ts +3 -0
  153. package/dist/detectors/interest.d.ts.map +1 -0
  154. package/dist/detectors/interest.js +38 -0
  155. package/dist/detectors/interest.js.map +1 -0
  156. package/dist/detectors/lab-columns.d.ts +4 -0
  157. package/dist/detectors/lab-columns.d.ts.map +1 -0
  158. package/dist/detectors/lab-columns.js +3 -0
  159. package/dist/detectors/lab-columns.js.map +1 -0
  160. package/dist/detectors/labelled-age.d.ts +4 -0
  161. package/dist/detectors/labelled-age.d.ts.map +1 -0
  162. package/dist/detectors/labelled-age.js +110 -0
  163. package/dist/detectors/labelled-age.js.map +1 -0
  164. package/dist/detectors/line-amount.d.ts.map +1 -1
  165. package/dist/detectors/line-amount.js +45 -2
  166. package/dist/detectors/line-amount.js.map +1 -1
  167. package/dist/detectors/measured-facts.d.ts +1 -1
  168. package/dist/detectors/measured-facts.d.ts.map +1 -1
  169. package/dist/detectors/measured-facts.js.map +1 -1
  170. package/dist/detectors/meter-usage.d.ts +3 -0
  171. package/dist/detectors/meter-usage.d.ts.map +1 -0
  172. package/dist/detectors/meter-usage.js +37 -0
  173. package/dist/detectors/meter-usage.js.map +1 -0
  174. package/dist/detectors/name-field.d.ts +13 -0
  175. package/dist/detectors/name-field.d.ts.map +1 -0
  176. package/dist/detectors/name-field.js +38 -0
  177. package/dist/detectors/name-field.js.map +1 -0
  178. package/dist/detectors/name-variant.d.ts.map +1 -1
  179. package/dist/detectors/name-variant.js +128 -14
  180. package/dist/detectors/name-variant.js.map +1 -1
  181. package/dist/detectors/net-amount-mismatch.d.ts +10 -0
  182. package/dist/detectors/net-amount-mismatch.d.ts.map +1 -0
  183. package/dist/detectors/net-amount-mismatch.js +70 -0
  184. package/dist/detectors/net-amount-mismatch.js.map +1 -0
  185. package/dist/detectors/net-gross-weight.d.ts +3 -0
  186. package/dist/detectors/net-gross-weight.d.ts.map +1 -0
  187. package/dist/detectors/net-gross-weight.js +35 -0
  188. package/dist/detectors/net-gross-weight.js.map +1 -0
  189. package/dist/detectors/nominal-step.d.ts +3 -0
  190. package/dist/detectors/nominal-step.d.ts.map +1 -0
  191. package/dist/detectors/nominal-step.js +28 -0
  192. package/dist/detectors/nominal-step.js.map +1 -0
  193. package/dist/detectors/number-style.d.ts +2 -0
  194. package/dist/detectors/number-style.d.ts.map +1 -1
  195. package/dist/detectors/number-style.js +8 -2
  196. package/dist/detectors/number-style.js.map +1 -1
  197. package/dist/detectors/order-quantity.d.ts +10 -0
  198. package/dist/detectors/order-quantity.d.ts.map +1 -0
  199. package/dist/detectors/order-quantity.js +35 -0
  200. package/dist/detectors/order-quantity.js.map +1 -0
  201. package/dist/detectors/orthographic-variant.d.ts.map +1 -1
  202. package/dist/detectors/orthographic-variant.js +35 -10
  203. package/dist/detectors/orthographic-variant.js.map +1 -1
  204. package/dist/detectors/orthography.d.ts.map +1 -1
  205. package/dist/detectors/orthography.js +15 -7
  206. package/dist/detectors/orthography.js.map +1 -1
  207. package/dist/detectors/period-label-conflict.d.ts +4 -0
  208. package/dist/detectors/period-label-conflict.d.ts.map +1 -0
  209. package/dist/detectors/period-label-conflict.js +34 -0
  210. package/dist/detectors/period-label-conflict.js.map +1 -0
  211. package/dist/detectors/period-multiple-mismatch.d.ts +3 -0
  212. package/dist/detectors/period-multiple-mismatch.d.ts.map +1 -0
  213. package/dist/detectors/period-multiple-mismatch.js +36 -0
  214. package/dist/detectors/period-multiple-mismatch.js.map +1 -0
  215. package/dist/detectors/period-part.d.ts +4 -0
  216. package/dist/detectors/period-part.d.ts.map +1 -0
  217. package/dist/detectors/period-part.js +58 -0
  218. package/dist/detectors/period-part.js.map +1 -0
  219. package/dist/detectors/range-words.d.ts +5 -0
  220. package/dist/detectors/range-words.d.ts.map +1 -0
  221. package/dist/detectors/range-words.js +14 -0
  222. package/dist/detectors/range-words.js.map +1 -0
  223. package/dist/detectors/ratio-mismatch.d.ts +7 -0
  224. package/dist/detectors/ratio-mismatch.d.ts.map +1 -0
  225. package/dist/detectors/ratio-mismatch.js +89 -0
  226. package/dist/detectors/ratio-mismatch.js.map +1 -0
  227. package/dist/detectors/readable-dates.d.ts +9 -0
  228. package/dist/detectors/readable-dates.d.ts.map +1 -0
  229. package/dist/detectors/readable-dates.js +23 -0
  230. package/dist/detectors/readable-dates.js.map +1 -0
  231. package/dist/detectors/reference-flag.d.ts +3 -0
  232. package/dist/detectors/reference-flag.d.ts.map +1 -0
  233. package/dist/detectors/reference-flag.js +31 -0
  234. package/dist/detectors/reference-flag.js.map +1 -0
  235. package/dist/detectors/reference-number-repeated.d.ts +3 -0
  236. package/dist/detectors/reference-number-repeated.d.ts.map +1 -0
  237. package/dist/detectors/reference-number-repeated.js +22 -0
  238. package/dist/detectors/reference-number-repeated.js.map +1 -0
  239. package/dist/detectors/reference-number-variant.d.ts +3 -0
  240. package/dist/detectors/reference-number-variant.d.ts.map +1 -0
  241. package/dist/detectors/reference-number-variant.js +40 -0
  242. package/dist/detectors/reference-number-variant.js.map +1 -0
  243. package/dist/detectors/reference-unit.d.ts +3 -0
  244. package/dist/detectors/reference-unit.d.ts.map +1 -0
  245. package/dist/detectors/reference-unit.js +19 -0
  246. package/dist/detectors/reference-unit.js.map +1 -0
  247. package/dist/detectors/registry/annual-holidays-mismatch.d.ts +3 -0
  248. package/dist/detectors/registry/annual-holidays-mismatch.d.ts.map +1 -0
  249. package/dist/detectors/registry/annual-holidays-mismatch.js +3 -0
  250. package/dist/detectors/registry/annual-holidays-mismatch.js.map +1 -0
  251. package/dist/detectors/registry/annual-pay-mismatch.d.ts +3 -0
  252. package/dist/detectors/registry/annual-pay-mismatch.d.ts.map +1 -0
  253. package/dist/detectors/registry/annual-pay-mismatch.js +3 -0
  254. package/dist/detectors/registry/annual-pay-mismatch.js.map +1 -0
  255. package/dist/detectors/registry/backorder-mismatch.d.ts +3 -0
  256. package/dist/detectors/registry/backorder-mismatch.d.ts.map +1 -0
  257. package/dist/detectors/registry/backorder-mismatch.js +3 -0
  258. package/dist/detectors/registry/backorder-mismatch.js.map +1 -0
  259. package/dist/detectors/registry/bmi-mismatch.d.ts +3 -0
  260. package/dist/detectors/registry/bmi-mismatch.d.ts.map +1 -0
  261. package/dist/detectors/registry/bmi-mismatch.js +3 -0
  262. package/dist/detectors/registry/bmi-mismatch.js.map +1 -0
  263. package/dist/detectors/registry/closing-balance-mismatch.d.ts +3 -0
  264. package/dist/detectors/registry/closing-balance-mismatch.d.ts.map +1 -0
  265. package/dist/detectors/registry/closing-balance-mismatch.js +3 -0
  266. package/dist/detectors/registry/closing-balance-mismatch.js.map +1 -0
  267. package/dist/detectors/registry/cumulative-below-current.d.ts +3 -0
  268. package/dist/detectors/registry/cumulative-below-current.d.ts.map +1 -0
  269. package/dist/detectors/registry/cumulative-below-current.js +3 -0
  270. package/dist/detectors/registry/cumulative-below-current.js.map +1 -0
  271. package/dist/detectors/registry/currency-column-mix.d.ts +3 -0
  272. package/dist/detectors/registry/currency-column-mix.d.ts.map +1 -0
  273. package/dist/detectors/registry/currency-column-mix.js +3 -0
  274. package/dist/detectors/registry/currency-column-mix.js.map +1 -0
  275. package/dist/detectors/registry/deductible-exceeds-limit.d.ts +3 -0
  276. package/dist/detectors/registry/deductible-exceeds-limit.d.ts.map +1 -0
  277. package/dist/detectors/registry/deductible-exceeds-limit.js +3 -0
  278. package/dist/detectors/registry/deductible-exceeds-limit.js.map +1 -0
  279. package/dist/detectors/registry/delivered-over-ordered.d.ts +3 -0
  280. package/dist/detectors/registry/delivered-over-ordered.d.ts.map +1 -0
  281. package/dist/detectors/registry/delivered-over-ordered.js +3 -0
  282. package/dist/detectors/registry/delivered-over-ordered.js.map +1 -0
  283. package/dist/detectors/registry/discount-rate.d.ts +3 -0
  284. package/dist/detectors/registry/discount-rate.d.ts.map +1 -0
  285. package/dist/detectors/registry/discount-rate.js +3 -0
  286. package/dist/detectors/registry/discount-rate.js.map +1 -0
  287. package/dist/detectors/registry/elapsed-years-mismatch.js +1 -1
  288. package/dist/detectors/registry/elapsed-years-mismatch.js.map +1 -1
  289. package/dist/detectors/registry/gpa-mismatch.d.ts +3 -0
  290. package/dist/detectors/registry/gpa-mismatch.d.ts.map +1 -0
  291. package/dist/detectors/registry/gpa-mismatch.js +3 -0
  292. package/dist/detectors/registry/gpa-mismatch.js.map +1 -0
  293. package/dist/detectors/registry/installment-total-mismatch.d.ts +3 -0
  294. package/dist/detectors/registry/installment-total-mismatch.d.ts.map +1 -0
  295. package/dist/detectors/registry/installment-total-mismatch.js +3 -0
  296. package/dist/detectors/registry/installment-total-mismatch.js.map +1 -0
  297. package/dist/detectors/registry/interest.d.ts +3 -0
  298. package/dist/detectors/registry/interest.d.ts.map +1 -0
  299. package/dist/detectors/registry/interest.js +3 -0
  300. package/dist/detectors/registry/interest.js.map +1 -0
  301. package/dist/detectors/registry/meter-usage.d.ts +3 -0
  302. package/dist/detectors/registry/meter-usage.d.ts.map +1 -0
  303. package/dist/detectors/registry/meter-usage.js +3 -0
  304. package/dist/detectors/registry/meter-usage.js.map +1 -0
  305. package/dist/detectors/registry/net-amount-mismatch.d.ts +3 -0
  306. package/dist/detectors/registry/net-amount-mismatch.d.ts.map +1 -0
  307. package/dist/detectors/registry/net-amount-mismatch.js +3 -0
  308. package/dist/detectors/registry/net-amount-mismatch.js.map +1 -0
  309. package/dist/detectors/registry/net-over-gross.d.ts +3 -0
  310. package/dist/detectors/registry/net-over-gross.d.ts.map +1 -0
  311. package/dist/detectors/registry/net-over-gross.js +3 -0
  312. package/dist/detectors/registry/net-over-gross.js.map +1 -0
  313. package/dist/detectors/registry/period-label-conflict.d.ts +3 -0
  314. package/dist/detectors/registry/period-label-conflict.d.ts.map +1 -0
  315. package/dist/detectors/registry/period-label-conflict.js +3 -0
  316. package/dist/detectors/registry/period-label-conflict.js.map +1 -0
  317. package/dist/detectors/registry/period-multiple-mismatch.d.ts +3 -0
  318. package/dist/detectors/registry/period-multiple-mismatch.d.ts.map +1 -0
  319. package/dist/detectors/registry/period-multiple-mismatch.js +3 -0
  320. package/dist/detectors/registry/period-multiple-mismatch.js.map +1 -0
  321. package/dist/detectors/registry/period-part-exceeds-whole.d.ts +3 -0
  322. package/dist/detectors/registry/period-part-exceeds-whole.d.ts.map +1 -0
  323. package/dist/detectors/registry/period-part-exceeds-whole.js +3 -0
  324. package/dist/detectors/registry/period-part-exceeds-whole.js.map +1 -0
  325. package/dist/detectors/registry/product-exceeds-maximum.d.ts +3 -0
  326. package/dist/detectors/registry/product-exceeds-maximum.d.ts.map +1 -0
  327. package/dist/detectors/registry/product-exceeds-maximum.js +3 -0
  328. package/dist/detectors/registry/product-exceeds-maximum.js.map +1 -0
  329. package/dist/detectors/registry/ratio-mismatch.d.ts +3 -0
  330. package/dist/detectors/registry/ratio-mismatch.d.ts.map +1 -0
  331. package/dist/detectors/registry/ratio-mismatch.js +3 -0
  332. package/dist/detectors/registry/ratio-mismatch.js.map +1 -0
  333. package/dist/detectors/registry/reference-flag-mismatch.d.ts +3 -0
  334. package/dist/detectors/registry/reference-flag-mismatch.d.ts.map +1 -0
  335. package/dist/detectors/registry/reference-flag-mismatch.js +3 -0
  336. package/dist/detectors/registry/reference-flag-mismatch.js.map +1 -0
  337. package/dist/detectors/registry/reference-number-repeated.d.ts +3 -0
  338. package/dist/detectors/registry/reference-number-repeated.d.ts.map +1 -0
  339. package/dist/detectors/registry/reference-number-repeated.js +3 -0
  340. package/dist/detectors/registry/reference-number-repeated.js.map +1 -0
  341. package/dist/detectors/registry/reference-number-variant.d.ts +3 -0
  342. package/dist/detectors/registry/reference-number-variant.d.ts.map +1 -0
  343. package/dist/detectors/registry/reference-number-variant.js +3 -0
  344. package/dist/detectors/registry/reference-number-variant.js.map +1 -0
  345. package/dist/detectors/registry/reference-unit.d.ts +3 -0
  346. package/dist/detectors/registry/reference-unit.d.ts.map +1 -0
  347. package/dist/detectors/registry/reference-unit.js +3 -0
  348. package/dist/detectors/registry/reference-unit.js.map +1 -0
  349. package/dist/detectors/registry/revision-direction.d.ts +3 -0
  350. package/dist/detectors/registry/revision-direction.d.ts.map +1 -0
  351. package/dist/detectors/registry/revision-direction.js +3 -0
  352. package/dist/detectors/registry/revision-direction.js.map +1 -0
  353. package/dist/detectors/registry/running-balance.d.ts +3 -0
  354. package/dist/detectors/registry/running-balance.d.ts.map +1 -0
  355. package/dist/detectors/registry/running-balance.js +3 -0
  356. package/dist/detectors/registry/running-balance.js.map +1 -0
  357. package/dist/detectors/registry/serial-range.d.ts +3 -0
  358. package/dist/detectors/registry/serial-range.d.ts.map +1 -0
  359. package/dist/detectors/registry/serial-range.js +3 -0
  360. package/dist/detectors/registry/serial-range.js.map +1 -0
  361. package/dist/detectors/registry/share-amount.d.ts +3 -0
  362. package/dist/detectors/registry/share-amount.d.ts.map +1 -0
  363. package/dist/detectors/registry/share-amount.js +3 -0
  364. package/dist/detectors/registry/share-amount.js.map +1 -0
  365. package/dist/detectors/registry/table-unit-mix.d.ts +3 -0
  366. package/dist/detectors/registry/table-unit-mix.d.ts.map +1 -0
  367. package/dist/detectors/registry/table-unit-mix.js +3 -0
  368. package/dist/detectors/registry/table-unit-mix.js.map +1 -0
  369. package/dist/detectors/registry/tier-threshold.d.ts +3 -0
  370. package/dist/detectors/registry/tier-threshold.d.ts.map +1 -0
  371. package/dist/detectors/registry/tier-threshold.js +3 -0
  372. package/dist/detectors/registry/tier-threshold.js.map +1 -0
  373. package/dist/detectors/registry/variance-mismatch.d.ts +3 -0
  374. package/dist/detectors/registry/variance-mismatch.d.ts.map +1 -0
  375. package/dist/detectors/registry/variance-mismatch.js +3 -0
  376. package/dist/detectors/registry/variance-mismatch.js.map +1 -0
  377. package/dist/detectors/relative-dates.d.ts.map +1 -1
  378. package/dist/detectors/relative-dates.js +2 -1
  379. package/dist/detectors/relative-dates.js.map +1 -1
  380. package/dist/detectors/relative-day-words.d.ts.map +1 -1
  381. package/dist/detectors/relative-day-words.js +2 -1
  382. package/dist/detectors/relative-day-words.js.map +1 -1
  383. package/dist/detectors/rent-multiple-mismatch.d.ts.map +1 -1
  384. package/dist/detectors/rent-multiple-mismatch.js.map +1 -1
  385. package/dist/detectors/request-owner.d.ts +3 -1
  386. package/dist/detectors/request-owner.d.ts.map +1 -1
  387. package/dist/detectors/request-owner.js +5 -2
  388. package/dist/detectors/request-owner.js.map +1 -1
  389. package/dist/detectors/revision-direction.d.ts +3 -0
  390. package/dist/detectors/revision-direction.d.ts.map +1 -0
  391. package/dist/detectors/revision-direction.js +32 -0
  392. package/dist/detectors/revision-direction.js.map +1 -0
  393. package/dist/detectors/row-sentence-amounts.d.ts +5 -0
  394. package/dist/detectors/row-sentence-amounts.d.ts.map +1 -0
  395. package/dist/detectors/row-sentence-amounts.js +71 -0
  396. package/dist/detectors/row-sentence-amounts.js.map +1 -0
  397. package/dist/detectors/running-balance.d.ts +3 -0
  398. package/dist/detectors/running-balance.d.ts.map +1 -0
  399. package/dist/detectors/running-balance.js +26 -0
  400. package/dist/detectors/running-balance.js.map +1 -0
  401. package/dist/detectors/scaled-quantity.js +1 -1
  402. package/dist/detectors/scaled-quantity.js.map +1 -1
  403. package/dist/detectors/serial-range.d.ts +3 -0
  404. package/dist/detectors/serial-range.d.ts.map +1 -0
  405. package/dist/detectors/serial-range.js +29 -0
  406. package/dist/detectors/serial-range.js.map +1 -0
  407. package/dist/detectors/share-amount.d.ts +3 -0
  408. package/dist/detectors/share-amount.d.ts.map +1 -0
  409. package/dist/detectors/share-amount.js +45 -0
  410. package/dist/detectors/share-amount.js.map +1 -0
  411. package/dist/detectors/structure-tree.d.ts.map +1 -1
  412. package/dist/detectors/structure-tree.js +42 -10
  413. package/dist/detectors/structure-tree.js.map +1 -1
  414. package/dist/detectors/table-scale.d.ts +3 -0
  415. package/dist/detectors/table-scale.d.ts.map +1 -0
  416. package/dist/detectors/table-scale.js +32 -0
  417. package/dist/detectors/table-scale.js.map +1 -0
  418. package/dist/detectors/tax-amount.d.ts.map +1 -1
  419. package/dist/detectors/tax-amount.js +34 -10
  420. package/dist/detectors/tax-amount.js.map +1 -1
  421. package/dist/detectors/technical-docs.d.ts +1 -1
  422. package/dist/detectors/technical-docs.d.ts.map +1 -1
  423. package/dist/detectors/technical-docs.js +3 -2
  424. package/dist/detectors/technical-docs.js.map +1 -1
  425. package/dist/detectors/tier-threshold.d.ts +3 -0
  426. package/dist/detectors/tier-threshold.d.ts.map +1 -0
  427. package/dist/detectors/tier-threshold.js +86 -0
  428. package/dist/detectors/tier-threshold.js.map +1 -0
  429. package/dist/detectors/time-order.d.ts +1 -0
  430. package/dist/detectors/time-order.d.ts.map +1 -1
  431. package/dist/detectors/time-order.js +43 -13
  432. package/dist/detectors/time-order.js.map +1 -1
  433. package/dist/detectors/use-maximum.d.ts +3 -0
  434. package/dist/detectors/use-maximum.d.ts.map +1 -0
  435. package/dist/detectors/use-maximum.js +32 -0
  436. package/dist/detectors/use-maximum.js.map +1 -0
  437. package/dist/detectors/variance.d.ts +3 -0
  438. package/dist/detectors/variance.d.ts.map +1 -0
  439. package/dist/detectors/variance.js +28 -0
  440. package/dist/detectors/variance.js.map +1 -0
  441. package/dist/detectors/whole-count-findings.d.ts +4 -0
  442. package/dist/detectors/whole-count-findings.d.ts.map +1 -0
  443. package/dist/detectors/whole-count-findings.js +38 -0
  444. package/dist/detectors/whole-count-findings.js.map +1 -0
  445. package/dist/detectors/working-hours-findings.d.ts +9 -0
  446. package/dist/detectors/working-hours-findings.d.ts.map +1 -0
  447. package/dist/detectors/working-hours-findings.js +79 -0
  448. package/dist/detectors/working-hours-findings.js.map +1 -0
  449. package/dist/facts/age-values.d.ts +22 -0
  450. package/dist/facts/age-values.d.ts.map +1 -0
  451. package/dist/facts/age-values.js +76 -0
  452. package/dist/facts/age-values.js.map +1 -0
  453. package/dist/facts/cell-keys.d.ts +12 -0
  454. package/dist/facts/cell-keys.d.ts.map +1 -0
  455. package/dist/facts/cell-keys.js +19 -0
  456. package/dist/facts/cell-keys.js.map +1 -0
  457. package/dist/facts/count-labels.d.ts +15 -0
  458. package/dist/facts/count-labels.d.ts.map +1 -0
  459. package/dist/facts/count-labels.js +19 -0
  460. package/dist/facts/count-labels.js.map +1 -0
  461. package/dist/facts/document-terms.d.ts +43 -0
  462. package/dist/facts/document-terms.d.ts.map +1 -0
  463. package/dist/facts/document-terms.js +74 -0
  464. package/dist/facts/document-terms.js.map +1 -0
  465. package/dist/facts/duration-scale.d.ts +11 -0
  466. package/dist/facts/duration-scale.d.ts.map +1 -0
  467. package/dist/facts/duration-scale.js +14 -0
  468. package/dist/facts/duration-scale.js.map +1 -0
  469. package/dist/facts/duration-values.d.ts +15 -0
  470. package/dist/facts/duration-values.d.ts.map +1 -0
  471. package/dist/facts/duration-values.js +29 -0
  472. package/dist/facts/duration-values.js.map +1 -0
  473. package/dist/facts/fact-values.d.ts +9 -1
  474. package/dist/facts/fact-values.d.ts.map +1 -1
  475. package/dist/facts/fact-values.js +19 -6
  476. package/dist/facts/fact-values.js.map +1 -1
  477. package/dist/facts/labelled-facts.d.ts +15 -1
  478. package/dist/facts/labelled-facts.d.ts.map +1 -1
  479. package/dist/facts/labelled-facts.js +51 -8
  480. package/dist/facts/labelled-facts.js.map +1 -1
  481. package/dist/facts/measure-units.d.ts.map +1 -1
  482. package/dist/facts/measure-units.js +23 -8
  483. package/dist/facts/measure-units.js.map +1 -1
  484. package/dist/facts/measures.js +11 -9
  485. package/dist/facts/measures.js.map +1 -1
  486. package/dist/facts/qualified-labels.d.ts +28 -0
  487. package/dist/facts/qualified-labels.d.ts.map +1 -0
  488. package/dist/facts/qualified-labels.js +96 -0
  489. package/dist/facts/qualified-labels.js.map +1 -0
  490. package/dist/facts/rate-values.d.ts +40 -0
  491. package/dist/facts/rate-values.d.ts.map +1 -0
  492. package/dist/facts/rate-values.js +68 -0
  493. package/dist/facts/rate-values.js.map +1 -0
  494. package/dist/facts/row-sentence-amounts.d.ts +51 -0
  495. package/dist/facts/row-sentence-amounts.d.ts.map +1 -0
  496. package/dist/facts/row-sentence-amounts.js +71 -0
  497. package/dist/facts/row-sentence-amounts.js.map +1 -0
  498. package/dist/facts/superscript-power.d.ts +3 -0
  499. package/dist/facts/superscript-power.d.ts.map +1 -0
  500. package/dist/facts/superscript-power.js +5 -0
  501. package/dist/facts/superscript-power.js.map +1 -0
  502. package/dist/facts/table-facts.d.ts +18 -2
  503. package/dist/facts/table-facts.d.ts.map +1 -1
  504. package/dist/facts/table-facts.js +16 -6
  505. package/dist/facts/table-facts.js.map +1 -1
  506. package/dist/facts/term-values.d.ts +34 -0
  507. package/dist/facts/term-values.d.ts.map +1 -0
  508. package/dist/facts/term-values.js +195 -0
  509. package/dist/facts/term-values.js.map +1 -0
  510. package/dist/facts/unit-word.d.ts +5 -0
  511. package/dist/facts/unit-word.d.ts.map +1 -1
  512. package/dist/facts/unit-word.js +9 -0
  513. package/dist/facts/unit-word.js.map +1 -1
  514. package/dist/facts/verb-quantity-facts.d.ts +22 -0
  515. package/dist/facts/verb-quantity-facts.d.ts.map +1 -0
  516. package/dist/facts/verb-quantity-facts.js +58 -0
  517. package/dist/facts/verb-quantity-facts.js.map +1 -0
  518. package/dist/facts/whole-counts.d.ts +58 -0
  519. package/dist/facts/whole-counts.d.ts.map +1 -0
  520. package/dist/facts/whole-counts.js +118 -0
  521. package/dist/facts/whole-counts.js.map +1 -0
  522. package/dist/name-char-reading.d.ts +16 -0
  523. package/dist/name-char-reading.d.ts.map +1 -0
  524. package/dist/name-char-reading.js +18 -0
  525. package/dist/name-char-reading.js.map +1 -0
  526. package/dist/name-line-block.d.ts +6 -0
  527. package/dist/name-line-block.d.ts.map +1 -0
  528. package/dist/name-line-block.js +35 -0
  529. package/dist/name-line-block.js.map +1 -0
  530. package/dist/name-lookalike-chars.d.ts +16 -0
  531. package/dist/name-lookalike-chars.d.ts.map +1 -0
  532. package/dist/name-lookalike-chars.js +41 -0
  533. package/dist/name-lookalike-chars.js.map +1 -0
  534. package/dist/name-neighbours.d.ts +7 -0
  535. package/dist/name-neighbours.d.ts.map +1 -0
  536. package/dist/name-neighbours.js +55 -0
  537. package/dist/name-neighbours.js.map +1 -0
  538. package/dist/name-ordinary-word.d.ts +13 -0
  539. package/dist/name-ordinary-word.d.ts.map +1 -0
  540. package/dist/name-ordinary-word.js +54 -0
  541. package/dist/name-ordinary-word.js.map +1 -0
  542. package/dist/name-person.d.ts +9 -0
  543. package/dist/name-person.d.ts.map +1 -0
  544. package/dist/name-person.js +25 -0
  545. package/dist/name-person.js.map +1 -0
  546. package/dist/name-separator.d.ts +14 -0
  547. package/dist/name-separator.d.ts.map +1 -0
  548. package/dist/name-separator.js +33 -0
  549. package/dist/name-separator.js.map +1 -0
  550. package/dist/name-variants.d.ts +8 -8
  551. package/dist/name-variants.d.ts.map +1 -1
  552. package/dist/name-variants.js +28 -81
  553. package/dist/name-variants.js.map +1 -1
  554. package/dist/name-weight.d.ts +10 -0
  555. package/dist/name-weight.d.ts.map +1 -0
  556. package/dist/name-weight.js +7 -0
  557. package/dist/name-weight.js.map +1 -0
  558. package/dist/person-field.d.ts +6 -0
  559. package/dist/person-field.d.ts.map +1 -0
  560. package/dist/person-field.js +40 -0
  561. package/dist/person-field.js.map +1 -0
  562. package/dist/person-full-name.d.ts +12 -0
  563. package/dist/person-full-name.d.ts.map +1 -0
  564. package/dist/person-full-name.js +52 -0
  565. package/dist/person-full-name.js.map +1 -0
  566. package/dist/phone-numbers.d.ts +23 -3
  567. package/dist/phone-numbers.d.ts.map +1 -1
  568. package/dist/phone-numbers.js +49 -21
  569. package/dist/phone-numbers.js.map +1 -1
  570. package/dist/plugin.d.ts +2 -0
  571. package/dist/plugin.d.ts.map +1 -1
  572. package/dist/product-names.d.ts +33 -0
  573. package/dist/product-names.d.ts.map +1 -0
  574. package/dist/product-names.js +74 -0
  575. package/dist/product-names.js.map +1 -0
  576. package/dist/reference-numbers.d.ts +26 -0
  577. package/dist/reference-numbers.d.ts.map +1 -0
  578. package/dist/reference-numbers.js +43 -0
  579. package/dist/reference-numbers.js.map +1 -0
  580. package/dist/spaced-person-name.d.ts +17 -0
  581. package/dist/spaced-person-name.d.ts.map +1 -0
  582. package/dist/spaced-person-name.js +82 -0
  583. package/dist/spaced-person-name.js.map +1 -0
  584. package/dist/spacing-code.d.ts +1 -0
  585. package/dist/spacing-code.d.ts.map +1 -1
  586. package/dist/spacing-code.js +15 -1
  587. package/dist/spacing-code.js.map +1 -1
  588. package/dist/structure/annual-holidays.d.ts +56 -0
  589. package/dist/structure/annual-holidays.d.ts.map +1 -0
  590. package/dist/structure/annual-holidays.js +159 -0
  591. package/dist/structure/annual-holidays.js.map +1 -0
  592. package/dist/structure/annual-pay.d.ts +97 -0
  593. package/dist/structure/annual-pay.d.ts.map +1 -0
  594. package/dist/structure/annual-pay.js +236 -0
  595. package/dist/structure/annual-pay.js.map +1 -0
  596. package/dist/structure/bmi.d.ts +63 -0
  597. package/dist/structure/bmi.d.ts.map +1 -0
  598. package/dist/structure/bmi.js +106 -0
  599. package/dist/structure/bmi.js.map +1 -0
  600. package/dist/structure/change-rate-table.d.ts +46 -0
  601. package/dist/structure/change-rate-table.d.ts.map +1 -0
  602. package/dist/structure/change-rate-table.js +110 -0
  603. package/dist/structure/change-rate-table.js.map +1 -0
  604. package/dist/structure/change-rate.d.ts +13 -1
  605. package/dist/structure/change-rate.d.ts.map +1 -1
  606. package/dist/structure/change-rate.js +51 -19
  607. package/dist/structure/change-rate.js.map +1 -1
  608. package/dist/structure/closing-balance.d.ts +24 -0
  609. package/dist/structure/closing-balance.d.ts.map +1 -0
  610. package/dist/structure/closing-balance.js +79 -0
  611. package/dist/structure/closing-balance.js.map +1 -0
  612. package/dist/structure/column-date-order.d.ts +5 -0
  613. package/dist/structure/column-date-order.d.ts.map +1 -0
  614. package/dist/structure/column-date-order.js +57 -0
  615. package/dist/structure/column-date-order.js.map +1 -0
  616. package/dist/structure/compound-hours.d.ts +5 -0
  617. package/dist/structure/compound-hours.d.ts.map +1 -0
  618. package/dist/structure/compound-hours.js +45 -0
  619. package/dist/structure/compound-hours.js.map +1 -0
  620. package/dist/structure/cumulative-below-current.d.ts +21 -0
  621. package/dist/structure/cumulative-below-current.d.ts.map +1 -0
  622. package/dist/structure/cumulative-below-current.js +48 -0
  623. package/dist/structure/cumulative-below-current.js.map +1 -0
  624. package/dist/structure/currency-column.d.ts +21 -0
  625. package/dist/structure/currency-column.d.ts.map +1 -0
  626. package/dist/structure/currency-column.js +74 -0
  627. package/dist/structure/currency-column.js.map +1 -0
  628. package/dist/structure/date-deadline-mark.d.ts +15 -0
  629. package/dist/structure/date-deadline-mark.d.ts.map +1 -0
  630. package/dist/structure/date-deadline-mark.js +22 -0
  631. package/dist/structure/date-deadline-mark.js.map +1 -0
  632. package/dist/structure/date-outside-period.d.ts +5 -1
  633. package/dist/structure/date-outside-period.d.ts.map +1 -1
  634. package/dist/structure/date-outside-period.js +13 -9
  635. package/dist/structure/date-outside-period.js.map +1 -1
  636. package/dist/structure/date-range.d.ts +2 -1
  637. package/dist/structure/date-range.d.ts.map +1 -1
  638. package/dist/structure/date-range.js +4 -6
  639. package/dist/structure/date-range.js.map +1 -1
  640. package/dist/structure/deadline-after-event.d.ts +35 -2
  641. package/dist/structure/deadline-after-event.d.ts.map +1 -1
  642. package/dist/structure/deadline-after-event.js +77 -6
  643. package/dist/structure/deadline-after-event.js.map +1 -1
  644. package/dist/structure/deductible-limit.d.ts +69 -0
  645. package/dist/structure/deductible-limit.d.ts.map +1 -0
  646. package/dist/structure/deductible-limit.js +191 -0
  647. package/dist/structure/deductible-limit.js.map +1 -0
  648. package/dist/structure/discount-rate.d.ts +35 -0
  649. package/dist/structure/discount-rate.d.ts.map +1 -0
  650. package/dist/structure/discount-rate.js +172 -0
  651. package/dist/structure/discount-rate.js.map +1 -0
  652. package/dist/structure/generic-role.d.ts +2 -0
  653. package/dist/structure/generic-role.d.ts.map +1 -0
  654. package/dist/structure/generic-role.js +8 -0
  655. package/dist/structure/generic-role.js.map +1 -0
  656. package/dist/structure/gpa.d.ts +74 -0
  657. package/dist/structure/gpa.d.ts.map +1 -0
  658. package/dist/structure/gpa.js +170 -0
  659. package/dist/structure/gpa.js.map +1 -0
  660. package/dist/structure/installment-total.d.ts +110 -0
  661. package/dist/structure/installment-total.d.ts.map +1 -0
  662. package/dist/structure/installment-total.js +224 -0
  663. package/dist/structure/installment-total.js.map +1 -0
  664. package/dist/structure/interest.d.ts +22 -0
  665. package/dist/structure/interest.d.ts.map +1 -0
  666. package/dist/structure/interest.js +107 -0
  667. package/dist/structure/interest.js.map +1 -0
  668. package/dist/structure/key-value-row.d.ts +14 -0
  669. package/dist/structure/key-value-row.d.ts.map +1 -0
  670. package/dist/structure/key-value-row.js +38 -0
  671. package/dist/structure/key-value-row.js.map +1 -0
  672. package/dist/structure/lab-columns.d.ts +12 -0
  673. package/dist/structure/lab-columns.d.ts.map +1 -0
  674. package/dist/structure/lab-columns.js +11 -0
  675. package/dist/structure/lab-columns.js.map +1 -0
  676. package/dist/structure/labelled-date-order.d.ts +33 -16
  677. package/dist/structure/labelled-date-order.d.ts.map +1 -1
  678. package/dist/structure/labelled-date-order.js +38 -30
  679. package/dist/structure/labelled-date-order.js.map +1 -1
  680. package/dist/structure/labelled-order.d.ts +59 -0
  681. package/dist/structure/labelled-order.d.ts.map +1 -0
  682. package/dist/structure/labelled-order.js +65 -0
  683. package/dist/structure/labelled-order.js.map +1 -0
  684. package/dist/structure/labelled-time-order.d.ts +17 -0
  685. package/dist/structure/labelled-time-order.d.ts.map +1 -0
  686. package/dist/structure/labelled-time-order.js +79 -0
  687. package/dist/structure/labelled-time-order.js.map +1 -0
  688. package/dist/structure/line-amount-label.d.ts +31 -0
  689. package/dist/structure/line-amount-label.d.ts.map +1 -0
  690. package/dist/structure/line-amount-label.js +77 -0
  691. package/dist/structure/line-amount-label.js.map +1 -0
  692. package/dist/structure/line-amount-rate.d.ts +47 -0
  693. package/dist/structure/line-amount-rate.d.ts.map +1 -0
  694. package/dist/structure/line-amount-rate.js +141 -0
  695. package/dist/structure/line-amount-rate.js.map +1 -0
  696. package/dist/structure/line-amount-unit.d.ts +7 -0
  697. package/dist/structure/line-amount-unit.d.ts.map +1 -1
  698. package/dist/structure/line-amount-unit.js +11 -0
  699. package/dist/structure/line-amount-unit.js.map +1 -1
  700. package/dist/structure/line-amount.d.ts +33 -7
  701. package/dist/structure/line-amount.d.ts.map +1 -1
  702. package/dist/structure/line-amount.js +152 -42
  703. package/dist/structure/line-amount.js.map +1 -1
  704. package/dist/structure/meter-usage-read.d.ts +21 -0
  705. package/dist/structure/meter-usage-read.d.ts.map +1 -0
  706. package/dist/structure/meter-usage-read.js +116 -0
  707. package/dist/structure/meter-usage-read.js.map +1 -0
  708. package/dist/structure/meter-usage.d.ts +62 -0
  709. package/dist/structure/meter-usage.d.ts.map +1 -0
  710. package/dist/structure/meter-usage.js +157 -0
  711. package/dist/structure/meter-usage.js.map +1 -0
  712. package/dist/structure/net-amount.d.ts +81 -0
  713. package/dist/structure/net-amount.d.ts.map +1 -0
  714. package/dist/structure/net-amount.js +161 -0
  715. package/dist/structure/net-amount.js.map +1 -0
  716. package/dist/structure/net-gross-weight.d.ts +30 -0
  717. package/dist/structure/net-gross-weight.d.ts.map +1 -0
  718. package/dist/structure/net-gross-weight.js +79 -0
  719. package/dist/structure/net-gross-weight.js.map +1 -0
  720. package/dist/structure/order-quantity.d.ts +38 -0
  721. package/dist/structure/order-quantity.d.ts.map +1 -0
  722. package/dist/structure/order-quantity.js +104 -0
  723. package/dist/structure/order-quantity.js.map +1 -0
  724. package/dist/structure/party-role.d.ts.map +1 -1
  725. package/dist/structure/party-role.js +4 -1
  726. package/dist/structure/party-role.js.map +1 -1
  727. package/dist/structure/percent-sum.d.ts +2 -0
  728. package/dist/structure/percent-sum.d.ts.map +1 -1
  729. package/dist/structure/percent-sum.js +2 -0
  730. package/dist/structure/percent-sum.js.map +1 -1
  731. package/dist/structure/period-label-conflict.d.ts +52 -0
  732. package/dist/structure/period-label-conflict.d.ts.map +1 -0
  733. package/dist/structure/period-label-conflict.js +105 -0
  734. package/dist/structure/period-label-conflict.js.map +1 -0
  735. package/dist/structure/period-labels.d.ts +36 -0
  736. package/dist/structure/period-labels.d.ts.map +1 -0
  737. package/dist/structure/period-labels.js +86 -0
  738. package/dist/structure/period-labels.js.map +1 -0
  739. package/dist/structure/period-multiple.d.ts +46 -0
  740. package/dist/structure/period-multiple.d.ts.map +1 -0
  741. package/dist/structure/period-multiple.js +123 -0
  742. package/dist/structure/period-multiple.js.map +1 -0
  743. package/dist/structure/quantity-range.d.ts.map +1 -1
  744. package/dist/structure/quantity-range.js +1 -5
  745. package/dist/structure/quantity-range.js.map +1 -1
  746. package/dist/structure/range-bands.d.ts +2 -0
  747. package/dist/structure/range-bands.d.ts.map +1 -1
  748. package/dist/structure/range-bands.js +1 -1
  749. package/dist/structure/range-bands.js.map +1 -1
  750. package/dist/structure/range-years.d.ts +18 -0
  751. package/dist/structure/range-years.d.ts.map +1 -0
  752. package/dist/structure/range-years.js +60 -0
  753. package/dist/structure/range-years.js.map +1 -0
  754. package/dist/structure/ratio.d.ts +136 -0
  755. package/dist/structure/ratio.d.ts.map +1 -0
  756. package/dist/structure/ratio.js +214 -0
  757. package/dist/structure/ratio.js.map +1 -0
  758. package/dist/structure/reference-flags.d.ts +55 -0
  759. package/dist/structure/reference-flags.d.ts.map +1 -0
  760. package/dist/structure/reference-flags.js +116 -0
  761. package/dist/structure/reference-flags.js.map +1 -0
  762. package/dist/structure/reference-number-repeated.d.ts +12 -0
  763. package/dist/structure/reference-number-repeated.d.ts.map +1 -0
  764. package/dist/structure/reference-number-repeated.js +43 -0
  765. package/dist/structure/reference-number-repeated.js.map +1 -0
  766. package/dist/structure/reference-unit.d.ts +24 -0
  767. package/dist/structure/reference-unit.d.ts.map +1 -0
  768. package/dist/structure/reference-unit.js +80 -0
  769. package/dist/structure/reference-unit.js.map +1 -0
  770. package/dist/structure/rent-multiple.d.ts +2 -22
  771. package/dist/structure/rent-multiple.d.ts.map +1 -1
  772. package/dist/structure/rent-multiple.js +2 -49
  773. package/dist/structure/rent-multiple.js.map +1 -1
  774. package/dist/structure/revision-direction.d.ts +51 -0
  775. package/dist/structure/revision-direction.d.ts.map +1 -0
  776. package/dist/structure/revision-direction.js +163 -0
  777. package/dist/structure/revision-direction.js.map +1 -0
  778. package/dist/structure/running-balance.d.ts +36 -0
  779. package/dist/structure/running-balance.d.ts.map +1 -0
  780. package/dist/structure/running-balance.js +126 -0
  781. package/dist/structure/running-balance.js.map +1 -0
  782. package/dist/structure/scaled-quantities.d.ts +1 -1
  783. package/dist/structure/scaled-quantities.d.ts.map +1 -1
  784. package/dist/structure/scaled-quantities.js +23 -6
  785. package/dist/structure/scaled-quantities.js.map +1 -1
  786. package/dist/structure/serial-range.d.ts +9 -0
  787. package/dist/structure/serial-range.d.ts.map +1 -0
  788. package/dist/structure/serial-range.js +41 -0
  789. package/dist/structure/serial-range.js.map +1 -0
  790. package/dist/structure/share-amount.d.ts +55 -0
  791. package/dist/structure/share-amount.d.ts.map +1 -0
  792. package/dist/structure/share-amount.js +162 -0
  793. package/dist/structure/share-amount.js.map +1 -0
  794. package/dist/structure/shift-times.d.ts +32 -0
  795. package/dist/structure/shift-times.d.ts.map +1 -0
  796. package/dist/structure/shift-times.js +112 -0
  797. package/dist/structure/shift-times.js.map +1 -0
  798. package/dist/structure/span-label.d.ts +3 -0
  799. package/dist/structure/span-label.d.ts.map +1 -0
  800. package/dist/structure/span-label.js +27 -0
  801. package/dist/structure/span-label.js.map +1 -0
  802. package/dist/structure/stated-multiple.d.ts +39 -0
  803. package/dist/structure/stated-multiple.d.ts.map +1 -0
  804. package/dist/structure/stated-multiple.js +49 -0
  805. package/dist/structure/stated-multiple.js.map +1 -0
  806. package/dist/structure/stated-period.d.ts +3 -2
  807. package/dist/structure/stated-period.d.ts.map +1 -1
  808. package/dist/structure/stated-period.js +17 -11
  809. package/dist/structure/stated-period.js.map +1 -1
  810. package/dist/structure/table-scale.d.ts +45 -0
  811. package/dist/structure/table-scale.d.ts.map +1 -0
  812. package/dist/structure/table-scale.js +188 -0
  813. package/dist/structure/table-scale.js.map +1 -0
  814. package/dist/structure/tax-price.d.ts +29 -0
  815. package/dist/structure/tax-price.d.ts.map +1 -0
  816. package/dist/structure/tax-price.js +112 -0
  817. package/dist/structure/tax-price.js.map +1 -0
  818. package/dist/structure/tax.d.ts +2 -0
  819. package/dist/structure/tax.d.ts.map +1 -1
  820. package/dist/structure/tax.js +46 -23
  821. package/dist/structure/tax.js.map +1 -1
  822. package/dist/structure/tier-threshold.d.ts +65 -0
  823. package/dist/structure/tier-threshold.d.ts.map +1 -0
  824. package/dist/structure/tier-threshold.js +170 -0
  825. package/dist/structure/tier-threshold.js.map +1 -0
  826. package/dist/structure/time-range.d.ts +2 -0
  827. package/dist/structure/time-range.d.ts.map +1 -1
  828. package/dist/structure/time-range.js +7 -2
  829. package/dist/structure/time-range.js.map +1 -1
  830. package/dist/structure/total-line.d.ts +34 -2
  831. package/dist/structure/total-line.d.ts.map +1 -1
  832. package/dist/structure/total-line.js +124 -3
  833. package/dist/structure/total-line.js.map +1 -1
  834. package/dist/structure/total-row-blank.d.ts +10 -0
  835. package/dist/structure/total-row-blank.d.ts.map +1 -0
  836. package/dist/structure/total-row-blank.js +15 -0
  837. package/dist/structure/total-row-blank.js.map +1 -0
  838. package/dist/structure/total.d.ts +13 -3
  839. package/dist/structure/total.d.ts.map +1 -1
  840. package/dist/structure/total.js +80 -7
  841. package/dist/structure/total.js.map +1 -1
  842. package/dist/structure/variance-table.d.ts +34 -0
  843. package/dist/structure/variance-table.d.ts.map +1 -0
  844. package/dist/structure/variance-table.js +130 -0
  845. package/dist/structure/variance-table.js.map +1 -0
  846. package/dist/table-names.d.ts +4 -3
  847. package/dist/table-names.d.ts.map +1 -1
  848. package/dist/table-names.js +6 -6
  849. package/dist/table-names.js.map +1 -1
  850. package/dist/unlabelled-references.d.ts +16 -0
  851. package/dist/unlabelled-references.d.ts.map +1 -0
  852. package/dist/unlabelled-references.js +73 -0
  853. package/dist/unlabelled-references.js.map +1 -0
  854. package/dist/vehicle-plates.d.ts +28 -0
  855. package/dist/vehicle-plates.d.ts.map +1 -0
  856. package/dist/vehicle-plates.js +116 -0
  857. package/dist/vehicle-plates.js.map +1 -0
  858. package/dist/whole-word-runs.d.ts +24 -0
  859. package/dist/whole-word-runs.d.ts.map +1 -0
  860. package/dist/whole-word-runs.js +26 -0
  861. package/dist/whole-word-runs.js.map +1 -0
  862. package/package.json +4 -3
  863. package/rules/absolute-exception.yaml +1 -1
  864. package/rules/ai-generated-composite.yaml +1 -1
  865. package/rules/ai-tell.yaml +1 -1
  866. package/rules/amount-range-reversed.yaml +1 -1
  867. package/rules/amount-scale-consistency.yaml +1 -1
  868. package/rules/announcing-opener.yaml +1 -1
  869. package/rules/annual-holidays-mismatch.yaml +65 -0
  870. package/rules/annual-pay-mismatch.yaml +64 -0
  871. package/rules/article-sound.yaml +1 -1
  872. package/rules/assistant-residue.yaml +1 -1
  873. package/rules/attachment-not-attached.yaml +1 -1
  874. package/rules/backorder-mismatch.yaml +57 -0
  875. package/rules/bmi-mismatch.yaml +63 -0
  876. package/rules/bold-label-list.yaml +1 -1
  877. package/rules/broken-link.yaml +1 -1
  878. package/rules/capacity-runtime-mismatch.yaml +1 -1
  879. package/rules/change-rate-mismatch.yaml +6 -6
  880. package/rules/chat-citation-residue.yaml +2 -2
  881. package/rules/cliche.yaml +2 -2
  882. package/rules/closing-balance-mismatch.yaml +63 -0
  883. package/rules/colon-lead-in.yaml +1 -1
  884. package/rules/comparative-without-baseline.yaml +1 -1
  885. package/rules/concrete-evidence-density.yaml +1 -1
  886. package/rules/connection-time-short.yaml +1 -1
  887. package/rules/contact-variant.yaml +4 -4
  888. package/rules/contrast-framing.yaml +2 -2
  889. package/rules/cross-doc-broken-link.yaml +1 -1
  890. package/rules/cross-doc-fact-conflict.yaml +1 -1
  891. package/rules/cross-doc-term-variant.yaml +1 -1
  892. package/rules/cumulative-below-current.yaml +59 -0
  893. package/rules/currency-column-mix.yaml +70 -0
  894. package/rules/currency-notation-consistency.yaml +2 -2
  895. package/rules/cushion-phrase-density.yaml +1 -1
  896. package/rules/dangling-participle.yaml +2 -2
  897. package/rules/dangling-reference.yaml +1 -1
  898. package/rules/date-format-consistency.yaml +1 -1
  899. package/rules/date-outside-period.yaml +5 -5
  900. package/rules/date-range-reversed.yaml +2 -2
  901. package/rules/date-stamp-order.yaml +2 -2
  902. package/rules/date-without-year.yaml +12 -12
  903. package/rules/deadline-after-event.yaml +11 -6
  904. package/rules/deductible-exceeds-limit.yaml +54 -0
  905. package/rules/defined-name-repeated.yaml +3 -3
  906. package/rules/defined-term-form.yaml +2 -2
  907. package/rules/delivered-over-ordered.yaml +57 -0
  908. package/rules/demonstrative-opener-run.yaml +1 -1
  909. package/rules/discount-rate-mismatch.yaml +66 -0
  910. package/rules/due-before-issue.yaml +33 -12
  911. package/rules/duration-mismatch.yaml +16 -7
  912. package/rules/duration-product-mismatch.yaml +11 -3
  913. package/rules/elapsed-years-mismatch.yaml +11 -6
  914. package/rules/email-greeting-closing.yaml +2 -2
  915. package/rules/empty-conclusion.yaml +1 -1
  916. package/rules/empty-intensifier.yaml +1 -1
  917. package/rules/empty-list-item.yaml +1 -1
  918. package/rules/empty-section.yaml +1 -1
  919. package/rules/empty-table-cell.yaml +2 -2
  920. package/rules/expletive-construction.yaml +1 -1
  921. package/rules/fact-conflict.yaml +16 -4
  922. package/rules/figurative-density.yaml +1 -1
  923. package/rules/figure-reference-order.yaml +1 -1
  924. package/rules/footnote-mismatch.yaml +1 -1
  925. package/rules/fullwidth-alnum-consistency.yaml +1 -1
  926. package/rules/gpa-mismatch.yaml +80 -0
  927. package/rules/heading-end-punctuation-mix.yaml +1 -1
  928. package/rules/heading-level-skip.yaml +1 -1
  929. package/rules/heading-numbering-mix.yaml +3 -3
  930. package/rules/homophone-slip.yaml +1 -1
  931. package/rules/humble-for-others.yaml +1 -1
  932. package/rules/idiom-misuse.yaml +1 -1
  933. package/rules/ime-residue.yaml +1 -1
  934. package/rules/impossible-date.yaml +10 -6
  935. package/rules/installment-total-mismatch.yaml +58 -0
  936. package/rules/interest-mismatch.yaml +50 -0
  937. package/rules/interval-count-mismatch.yaml +1 -1
  938. package/rules/invisible-character.yaml +1 -1
  939. package/rules/kana-function-word.yaml +2 -2
  940. package/rules/katakana-density.yaml +1 -1
  941. package/rules/katakana-long-vowel.yaml +2 -2
  942. package/rules/kutoten-consistency.yaml +1 -1
  943. package/rules/latin-spacing.yaml +20 -6
  944. package/rules/layout-code-mismatch.yaml +1 -1
  945. package/rules/less-for-fewer.yaml +1 -1
  946. package/rules/line-amount-mismatch.yaml +8 -7
  947. package/rules/link-text-url-mismatch.yaml +1 -1
  948. package/rules/list-item-form-mix.yaml +1 -1
  949. package/rules/lookalike-character.yaml +1 -1
  950. package/rules/max-kanji-continuous.yaml +1 -1
  951. package/rules/meter-usage-mismatch.yaml +64 -0
  952. package/rules/misconversion.yaml +1 -1
  953. package/rules/modal-conflict.yaml +1 -1
  954. package/rules/name-variant.yaml +12 -3
  955. package/rules/net-amount-mismatch.yaml +57 -0
  956. package/rules/net-over-gross.yaml +57 -0
  957. package/rules/no-doubled-joshi.yaml +1 -1
  958. package/rules/no-mixed-desumasu.yaml +1 -1
  959. package/rules/no-nakaguro-parallel.yaml +1 -1
  960. package/rules/nominalization.yaml +1 -1
  961. package/rules/nonstandard-word.yaml +1 -1
  962. package/rules/number-style-consistency.yaml +3 -3
  963. package/rules/number-without-unit.yaml +1 -1
  964. package/rules/number-word-figure-mismatch.yaml +1 -1
  965. package/rules/numbering-gap.yaml +1 -1
  966. package/rules/obligation-without-deadline.yaml +1 -1
  967. package/rules/ordinal-suffix-mismatch.yaml +1 -1
  968. package/rules/orthographic-variant.yaml +2 -2
  969. package/rules/outside-announced-list.yaml +1 -1
  970. package/rules/padded-intro.yaml +1 -1
  971. package/rules/paragraph-restatement.yaml +1 -1
  972. package/rules/party-role-name.yaml +3 -3
  973. package/rules/percent-sum-mismatch.yaml +2 -2
  974. package/rules/period-label-conflict.yaml +68 -0
  975. package/rules/period-multiple-mismatch.yaml +61 -0
  976. package/rules/period-part-exceeds-whole.yaml +62 -0
  977. package/rules/person-consistency.yaml +1 -1
  978. package/rules/phone-number-variant.yaml +3 -3
  979. package/rules/preferred-term.yaml +2 -2
  980. package/rules/prerequisite-after-step.yaml +1 -1
  981. package/rules/product-exceeds-maximum.yaml +49 -0
  982. package/rules/proper-noun-density.yaml +1 -1
  983. package/rules/quantity-range-reversed.yaml +2 -2
  984. package/rules/range-band-mismatch.yaml +1 -1
  985. package/rules/ratio-mismatch.yaml +64 -0
  986. package/rules/reference-flag-mismatch.yaml +74 -0
  987. package/rules/reference-number-repeated.yaml +63 -0
  988. package/rules/reference-number-variant.yaml +81 -0
  989. package/rules/reference-title-mismatch.yaml +1 -1
  990. package/rules/reference-topic-missing.yaml +1 -1
  991. package/rules/reference-unit-mismatch.yaml +62 -0
  992. package/rules/relative-date-mismatch.yaml +1 -1
  993. package/rules/request-without-deadline.yaml +3 -3
  994. package/rules/required-listed-as-preferred.yaml +1 -1
  995. package/rules/required-sections.yaml +2 -2
  996. package/rules/requirement-modal.yaml +2 -2
  997. package/rules/requirement-smell.yaml +1 -1
  998. package/rules/revision-direction-mismatch.yaml +66 -0
  999. package/rules/risk-disclosure.yaml +1 -1
  1000. package/rules/running-balance-mismatch.yaml +59 -0
  1001. package/rules/scaled-quantity-mismatch.yaml +1 -1
  1002. package/rules/serial-range-reversed.yaml +52 -0
  1003. package/rules/share-amount-mismatch.yaml +58 -0
  1004. package/rules/share-over-hundred.yaml +1 -1
  1005. package/rules/shell-prompt-mix.yaml +1 -1
  1006. package/rules/space-before-punctuation.yaml +1 -1
  1007. package/rules/spelling-consistency.yaml +1 -1
  1008. package/rules/step-statement-mix.yaml +3 -3
  1009. package/rules/stock-transition.yaml +1 -1
  1010. package/rules/summary-fact-mismatch.yaml +1 -1
  1011. package/rules/table-header-variant.yaml +1 -1
  1012. package/rules/table-unit-mix.yaml +82 -0
  1013. package/rules/taigen-dome-in-prose.yaml +1 -1
  1014. package/rules/tax-mismatch.yaml +13 -7
  1015. package/rules/tier-threshold-mismatch.yaml +73 -0
  1016. package/rules/time-order.yaml +7 -4
  1017. package/rules/time-range-reversed.yaml +9 -4
  1018. package/rules/toc-heading-mismatch.yaml +1 -1
  1019. package/rules/topic-predicate-distance.yaml +1 -1
  1020. package/rules/total-mismatch.yaml +5 -5
  1021. package/rules/ui-label-variant.yaml +1 -1
  1022. package/rules/unclosed-code-fence.yaml +1 -1
  1023. package/rules/uncomparable-graded.yaml +2 -2
  1024. package/rules/undefined-term.yaml +2 -2
  1025. package/rules/unfilled-placeholder.yaml +2 -2
  1026. package/rules/unit-mismatch.yaml +1 -1
  1027. package/rules/unit-spacing-consistency.yaml +1 -1
  1028. package/rules/unknown-word.yaml +1 -1
  1029. package/rules/url-run-on.yaml +1 -1
  1030. package/rules/vague-deadline.yaml +1 -1
  1031. package/rules/vague-figure-reference.yaml +1 -1
  1032. package/rules/vague-word-density.yaml +2 -2
  1033. package/rules/variance-mismatch.yaml +67 -0
  1034. package/rules/very-adjective.yaml +1 -1
  1035. package/rules/walk-time-distance-mismatch.yaml +1 -1
  1036. package/rules/warning-without-action.yaml +1 -1
  1037. package/rules/weasel-word.yaml +2 -2
  1038. package/rules/wordy-phrase.yaml +2 -2
  1039. package/rules/yori-as-from.yaml +1 -1
  1040. package/skills/chaff/SKILL.md +59 -9
  1041. package/src/company-kana-spelling.ts +105 -0
  1042. package/src/company-names.ts +159 -26
  1043. package/src/contacts/table-rows.ts +51 -0
  1044. package/src/derived/age-on-date.ts +161 -0
  1045. package/src/derived/durations.ts +83 -12
  1046. package/src/derived/hours-and-minutes.ts +41 -0
  1047. package/src/derived/hyphenated-counts.ts +38 -0
  1048. package/src/derived/marked-dates.ts +61 -0
  1049. package/src/derived/money-span.ts +10 -0
  1050. package/src/derived/period-parts.ts +360 -0
  1051. package/src/derived/readable-date.ts +63 -0
  1052. package/src/derived/stays.ts +7 -2
  1053. package/src/derived/timesheet-hours.ts +112 -0
  1054. package/src/derived/use-maximum.ts +158 -0
  1055. package/src/derived/working-hours.ts +2 -2
  1056. package/src/detectors/annual-holidays-mismatch.ts +41 -0
  1057. package/src/detectors/annual-pay-mismatch.ts +71 -0
  1058. package/src/detectors/blank-structure.ts +54 -14
  1059. package/src/detectors/bmi-mismatch.ts +82 -0
  1060. package/src/detectors/change-rate.ts +27 -4
  1061. package/src/detectors/closing-balance-mismatch.ts +52 -0
  1062. package/src/detectors/contact-variant.ts +8 -2
  1063. package/src/detectors/cumulative-below-current.ts +30 -0
  1064. package/src/detectors/currency-column.ts +37 -0
  1065. package/src/detectors/date-any-year.ts +130 -0
  1066. package/src/detectors/date-outside-period.ts +4 -10
  1067. package/src/detectors/date-stamp-order.ts +2 -1
  1068. package/src/detectors/date-year.ts +55 -13
  1069. package/src/detectors/deductible-exceeds-limit.ts +55 -0
  1070. package/src/detectors/defined-term-form.ts +6 -23
  1071. package/src/detectors/derived-numbers.ts +50 -89
  1072. package/src/detectors/discount-rate.ts +41 -0
  1073. package/src/detectors/due-date.ts +21 -7
  1074. package/src/detectors/email-letter.ts +45 -15
  1075. package/src/detectors/event-deadline.ts +13 -3
  1076. package/src/detectors/fact-consistency.ts +145 -7
  1077. package/src/detectors/gloss-year.ts +21 -0
  1078. package/src/detectors/gpa-mismatch.ts +43 -0
  1079. package/src/detectors/impossible-date.ts +25 -3
  1080. package/src/detectors/installment-total-mismatch.ts +68 -0
  1081. package/src/detectors/interest.ts +43 -0
  1082. package/src/detectors/lab-columns.ts +9 -0
  1083. package/src/detectors/labelled-age.ts +154 -0
  1084. package/src/detectors/line-amount.ts +58 -3
  1085. package/src/detectors/measured-facts.ts +1 -1
  1086. package/src/detectors/meter-usage.ts +49 -0
  1087. package/src/detectors/name-field.ts +43 -0
  1088. package/src/detectors/name-variant.ts +160 -16
  1089. package/src/detectors/net-amount-mismatch.ts +86 -0
  1090. package/src/detectors/net-gross-weight.ts +39 -0
  1091. package/src/detectors/nominal-step.ts +35 -0
  1092. package/src/detectors/number-style.ts +11 -2
  1093. package/src/detectors/order-quantity.ts +46 -0
  1094. package/src/detectors/orthographic-variant.ts +40 -10
  1095. package/src/detectors/orthography.ts +27 -11
  1096. package/src/detectors/period-label-conflict.ts +43 -0
  1097. package/src/detectors/period-multiple-mismatch.ts +54 -0
  1098. package/src/detectors/period-part.ts +71 -0
  1099. package/src/detectors/range-words.ts +17 -0
  1100. package/src/detectors/ratio-mismatch.ts +116 -0
  1101. package/src/detectors/readable-dates.ts +36 -0
  1102. package/src/detectors/reference-flag.ts +36 -0
  1103. package/src/detectors/reference-number-repeated.ts +25 -0
  1104. package/src/detectors/reference-number-variant.ts +44 -0
  1105. package/src/detectors/reference-unit.ts +24 -0
  1106. package/src/detectors/registry/annual-holidays-mismatch.ts +4 -0
  1107. package/src/detectors/registry/annual-pay-mismatch.ts +4 -0
  1108. package/src/detectors/registry/backorder-mismatch.ts +4 -0
  1109. package/src/detectors/registry/bmi-mismatch.ts +4 -0
  1110. package/src/detectors/registry/closing-balance-mismatch.ts +4 -0
  1111. package/src/detectors/registry/cumulative-below-current.ts +4 -0
  1112. package/src/detectors/registry/currency-column-mix.ts +4 -0
  1113. package/src/detectors/registry/deductible-exceeds-limit.ts +4 -0
  1114. package/src/detectors/registry/delivered-over-ordered.ts +4 -0
  1115. package/src/detectors/registry/discount-rate.ts +4 -0
  1116. package/src/detectors/registry/elapsed-years-mismatch.ts +1 -1
  1117. package/src/detectors/registry/gpa-mismatch.ts +4 -0
  1118. package/src/detectors/registry/installment-total-mismatch.ts +4 -0
  1119. package/src/detectors/registry/interest.ts +4 -0
  1120. package/src/detectors/registry/meter-usage.ts +4 -0
  1121. package/src/detectors/registry/net-amount-mismatch.ts +4 -0
  1122. package/src/detectors/registry/net-over-gross.ts +4 -0
  1123. package/src/detectors/registry/period-label-conflict.ts +4 -0
  1124. package/src/detectors/registry/period-multiple-mismatch.ts +4 -0
  1125. package/src/detectors/registry/period-part-exceeds-whole.ts +4 -0
  1126. package/src/detectors/registry/product-exceeds-maximum.ts +4 -0
  1127. package/src/detectors/registry/ratio-mismatch.ts +4 -0
  1128. package/src/detectors/registry/reference-flag-mismatch.ts +4 -0
  1129. package/src/detectors/registry/reference-number-repeated.ts +4 -0
  1130. package/src/detectors/registry/reference-number-variant.ts +4 -0
  1131. package/src/detectors/registry/reference-unit.ts +4 -0
  1132. package/src/detectors/registry/revision-direction.ts +4 -0
  1133. package/src/detectors/registry/running-balance.ts +4 -0
  1134. package/src/detectors/registry/serial-range.ts +4 -0
  1135. package/src/detectors/registry/share-amount.ts +4 -0
  1136. package/src/detectors/registry/table-unit-mix.ts +4 -0
  1137. package/src/detectors/registry/tier-threshold.ts +4 -0
  1138. package/src/detectors/registry/variance-mismatch.ts +4 -0
  1139. package/src/detectors/relative-dates.ts +2 -1
  1140. package/src/detectors/relative-day-words.ts +2 -1
  1141. package/src/detectors/rent-multiple-mismatch.ts +3 -2
  1142. package/src/detectors/request-owner.ts +5 -2
  1143. package/src/detectors/revision-direction.ts +44 -0
  1144. package/src/detectors/row-sentence-amounts.ts +96 -0
  1145. package/src/detectors/running-balance.ts +31 -0
  1146. package/src/detectors/scaled-quantity.ts +1 -1
  1147. package/src/detectors/serial-range.ts +37 -0
  1148. package/src/detectors/share-amount.ts +51 -0
  1149. package/src/detectors/structure-tree.ts +58 -10
  1150. package/src/detectors/table-scale.ts +37 -0
  1151. package/src/detectors/tax-amount.ts +45 -13
  1152. package/src/detectors/technical-docs.ts +4 -2
  1153. package/src/detectors/tier-threshold.ts +108 -0
  1154. package/src/detectors/time-order.ts +52 -18
  1155. package/src/detectors/use-maximum.ts +38 -0
  1156. package/src/detectors/variance.ts +33 -0
  1157. package/src/detectors/whole-count-findings.ts +48 -0
  1158. package/src/detectors/working-hours-findings.ts +100 -0
  1159. package/src/facts/age-values.ts +124 -0
  1160. package/src/facts/cell-keys.ts +21 -0
  1161. package/src/facts/count-labels.ts +28 -0
  1162. package/src/facts/document-terms.ts +107 -0
  1163. package/src/facts/duration-scale.ts +22 -0
  1164. package/src/facts/duration-values.ts +44 -0
  1165. package/src/facts/fact-values.ts +36 -7
  1166. package/src/facts/labelled-facts.ts +66 -9
  1167. package/src/facts/measure-units.ts +28 -10
  1168. package/src/facts/measures.ts +11 -11
  1169. package/src/facts/qualified-labels.ts +126 -0
  1170. package/src/facts/rate-values.ts +117 -0
  1171. package/src/facts/row-sentence-amounts.ts +113 -0
  1172. package/src/facts/superscript-power.ts +5 -0
  1173. package/src/facts/table-facts.ts +35 -7
  1174. package/src/facts/term-values.ts +236 -0
  1175. package/src/facts/unit-word.ts +13 -0
  1176. package/src/facts/verb-quantity-facts.ts +84 -0
  1177. package/src/facts/whole-counts.ts +183 -0
  1178. package/src/name-char-reading.ts +24 -0
  1179. package/src/name-line-block.ts +40 -0
  1180. package/src/name-lookalike-chars.ts +53 -0
  1181. package/src/name-neighbours.ts +58 -0
  1182. package/src/name-ordinary-word.ts +68 -0
  1183. package/src/name-person.ts +31 -0
  1184. package/src/name-separator.ts +48 -0
  1185. package/src/name-variants.ts +42 -86
  1186. package/src/name-weight.ts +12 -0
  1187. package/src/person-field.ts +43 -0
  1188. package/src/person-full-name.ts +70 -0
  1189. package/src/phone-numbers.ts +54 -18
  1190. package/src/plugin.ts +2 -0
  1191. package/src/product-names.ts +98 -0
  1192. package/src/reference-numbers.ts +55 -0
  1193. package/src/spaced-person-name.ts +97 -0
  1194. package/src/spacing-code.ts +22 -1
  1195. package/src/structure/annual-holidays.ts +222 -0
  1196. package/src/structure/annual-pay.ts +339 -0
  1197. package/src/structure/bmi.ts +133 -0
  1198. package/src/structure/change-rate-table.ts +135 -0
  1199. package/src/structure/change-rate.ts +54 -17
  1200. package/src/structure/closing-balance.ts +104 -0
  1201. package/src/structure/column-date-order.ts +73 -0
  1202. package/src/structure/compound-hours.ts +49 -0
  1203. package/src/structure/cumulative-below-current.ts +66 -0
  1204. package/src/structure/currency-column.ts +97 -0
  1205. package/src/structure/date-deadline-mark.ts +30 -0
  1206. package/src/structure/date-outside-period.ts +17 -9
  1207. package/src/structure/date-range.ts +6 -9
  1208. package/src/structure/deadline-after-event.ts +125 -8
  1209. package/src/structure/deductible-limit.ts +255 -0
  1210. package/src/structure/discount-rate.ts +209 -0
  1211. package/src/structure/generic-role.ts +8 -0
  1212. package/src/structure/gpa.ts +218 -0
  1213. package/src/structure/installment-total.ts +343 -0
  1214. package/src/structure/interest.ts +133 -0
  1215. package/src/structure/key-value-row.ts +45 -0
  1216. package/src/structure/lab-columns.ts +21 -0
  1217. package/src/structure/labelled-date-order.ts +68 -52
  1218. package/src/structure/labelled-order.ts +122 -0
  1219. package/src/structure/labelled-time-order.ts +100 -0
  1220. package/src/structure/line-amount-label.ts +100 -0
  1221. package/src/structure/line-amount-rate.ts +178 -0
  1222. package/src/structure/line-amount-unit.ts +16 -0
  1223. package/src/structure/line-amount.ts +200 -48
  1224. package/src/structure/meter-usage-read.ts +139 -0
  1225. package/src/structure/meter-usage.ts +224 -0
  1226. package/src/structure/net-amount.ts +243 -0
  1227. package/src/structure/net-gross-weight.ts +97 -0
  1228. package/src/structure/order-quantity.ts +125 -0
  1229. package/src/structure/party-role.ts +4 -1
  1230. package/src/structure/percent-sum.ts +3 -0
  1231. package/src/structure/period-label-conflict.ts +174 -0
  1232. package/src/structure/period-labels.ts +147 -0
  1233. package/src/structure/period-multiple.ts +186 -0
  1234. package/src/structure/quantity-range.ts +1 -8
  1235. package/src/structure/range-bands.ts +1 -1
  1236. package/src/structure/range-years.ts +75 -0
  1237. package/src/structure/ratio.ts +296 -0
  1238. package/src/structure/reference-flags.ts +156 -0
  1239. package/src/structure/reference-number-repeated.ts +57 -0
  1240. package/src/structure/reference-unit.ts +105 -0
  1241. package/src/structure/rent-multiple.ts +12 -82
  1242. package/src/structure/revision-direction.ts +214 -0
  1243. package/src/structure/running-balance.ts +157 -0
  1244. package/src/structure/scaled-quantities.ts +20 -6
  1245. package/src/structure/serial-range.ts +52 -0
  1246. package/src/structure/share-amount.ts +206 -0
  1247. package/src/structure/shift-times.ts +136 -0
  1248. package/src/structure/span-label.ts +26 -0
  1249. package/src/structure/stated-multiple.ts +82 -0
  1250. package/src/structure/stated-period.ts +23 -11
  1251. package/src/structure/table-scale.ts +239 -0
  1252. package/src/structure/tax-price.ts +136 -0
  1253. package/src/structure/tax.ts +55 -20
  1254. package/src/structure/tier-threshold.ts +218 -0
  1255. package/src/structure/time-range.ts +9 -3
  1256. package/src/structure/total-line.ts +174 -5
  1257. package/src/structure/total-row-blank.ts +23 -0
  1258. package/src/structure/total.ts +122 -13
  1259. package/src/structure/variance-table.ts +167 -0
  1260. package/src/table-names.ts +6 -6
  1261. package/src/unlabelled-references.ts +83 -0
  1262. package/src/vehicle-plates.ts +142 -0
  1263. package/src/whole-word-runs.ts +38 -0
@@ -0,0 +1,100 @@
1
+ import type { StructureIssue } from "./issues.ts";
2
+ import { linesOf, type Line } from "./lines.ts";
3
+ import { escapeRegExp } from "../orthography.ts";
4
+ import { roundedMatches } from "./tax.ts";
5
+ import { hasSuperscriptPower } from "../facts/superscript-power.ts";
6
+ import { cellNumber, cellsOf, plain, shownExpected, tablesOf, type Cell, type CellNumber } from "./line-amount.ts";
7
+
8
+ /**
9
+ * line-amount-mismatch, the product written in an item cell: 「| 会費(3,000円×24名) | 72,000円 |」,
10
+ * "| Membership dues (24 members × $40) | $960.00 |". The bracket must be exactly one price and one count joined by one
11
+ * times mark, in either order: the price one amount of money, the count a whole number in a counting word. The row must
12
+ * hold that one amount besides the item cell, written with the price's marks. A bracket with two marks, a %, or factors
13
+ * that are not one price and one count, and a row with a second number, are not read. Pure.
14
+ */
15
+ export type LabelProductWords = {
16
+ /** Marks that multiply (×); one in letters (x) counts only between spaces. */
17
+ readonly times: readonly string[];
18
+ /** Words a count multiplied by a price counts (名, members). */
19
+ readonly counts: readonly string[];
20
+ /** Whether a text is one amount of money and nothing else (currency-notation). */
21
+ readonly isMoney: (text: string) => boolean;
22
+ };
23
+
24
+ type LabelProduct = { readonly price: CellNumber; readonly count: number; readonly countWritten: string };
25
+
26
+ const CENTS = 100;
27
+ const BRACKETED = /\(([^()]*)\)/gu;
28
+ const COUNT = /^(?:\d{1,3}(?:,\d{3})+|\d+)(?![\d,.])/u;
29
+ const LATIN = /[A-Za-z]/u;
30
+
31
+ const timesPattern = (marks: readonly string[]): RegExp | undefined =>
32
+ marks.length === 0
33
+ ? undefined
34
+ : new RegExp(marks.map((mark) => (LATIN.test(mark) ? `(?<=\\s)${escapeRegExp(mark)}(?=\\s)` : escapeRegExp(mark))).join("|"), "gu");
35
+
36
+ /** The bracket split at its one times mark, undefined when it holds none, more, or a %. */
37
+ export const factorsOf = (content: string, marks: readonly string[]): [string, string] | undefined => {
38
+ const pattern = timesPattern(marks);
39
+ if (pattern === undefined || content.includes("%")) return undefined;
40
+ const found = [...content.matchAll(pattern)];
41
+ const [only] = found;
42
+ if (found.length !== 1 || only === undefined) return undefined;
43
+ return [content.slice(0, only.index).trim(), content.slice(only.index + only[0].length).trim()];
44
+ };
45
+
46
+ /** A whole count in a counting word ("24名", "24 members"), undefined for anything else. */
47
+ export const countOf = (factor: string, counts: readonly string[]): number | undefined => {
48
+ const number = COUNT.exec(factor)?.[0];
49
+ const word = number === undefined ? "" : factor.slice(number.length).trim().toLowerCase();
50
+ if (number === undefined || !counts.some((count) => count.toLowerCase() === word)) return undefined;
51
+ return Number(number.replaceAll(",", ""));
52
+ };
53
+
54
+ const priceOf = (factor: string, words: LabelProductWords): CellNumber | undefined =>
55
+ words.isMoney(factor) ? cellNumber({ start: 0, text: factor }) : undefined;
56
+
57
+ const productOf = (factors: readonly [string, string], words: LabelProductWords): LabelProduct | undefined => {
58
+ const orders: readonly (readonly [string, string])[] = [factors, [factors[1], factors[0]]];
59
+ const readings = orders.flatMap(([priceText, countText]) => {
60
+ const [price, count] = [priceOf(priceText, words), countOf(countText, words.counts)];
61
+ return price === undefined || count === undefined ? [] : [{ price, count, countWritten: countText }];
62
+ });
63
+ return readings.length === 1 ? readings[0] : undefined;
64
+ };
65
+
66
+ /** The one product written in brackets in the item cell, undefined when there is none, more than one, or a footnote mark NFKC would join to a number (24¹). */
67
+ export const labelProductOf = (label: string, words: LabelProductWords): LabelProduct | undefined => {
68
+ if (hasSuperscriptPower(label)) return undefined;
69
+ const products = [...plain(label).matchAll(BRACKETED)].flatMap((match) => {
70
+ const factors = factorsOf(match[1] ?? "", words.times);
71
+ const product = factors === undefined ? undefined : productOf(factors, words);
72
+ return product === undefined ? [] : [product];
73
+ });
74
+ return products.length === 1 ? products[0] : undefined;
75
+ };
76
+
77
+ /** The row's one amount besides the item cell, undefined when no other cell or more than one holds a number. */
78
+ const amountOf = (cells: readonly Cell[], words: LabelProductWords): CellNumber | undefined => {
79
+ const numbered = cells.slice(1).filter((cell) => /\d/u.test(plain(cell.text)));
80
+ const [only] = numbered;
81
+ if (numbered.length !== 1 || only === undefined || !words.isMoney(plain(only.text))) return undefined;
82
+ return cellNumber(only);
83
+ };
84
+
85
+ const rowIssue = (row: Line, words: LabelProductWords): StructureIssue[] => {
86
+ const cells = cellsOf(row);
87
+ const [label] = cells;
88
+ const product = label === undefined ? undefined : labelProductOf(label.text, words);
89
+ const amount = product === undefined ? undefined : amountOf(cells, words);
90
+ if (product === undefined || amount === undefined) return [];
91
+ const { price, count, countWritten } = product;
92
+ if (price.before !== amount.before || price.after !== amount.after) return [];
93
+ const exactCents = count * price.value * CENTS;
94
+ if (roundedMatches(Math.round(amount.value * CENTS), exactCents, amount.decimals === 0)) return [];
95
+ const values = { written: amount.written, quantity: countWritten, price: price.written, expected: shownExpected(amount, exactCents) };
96
+ return [{ offset: amount.offset, values }];
97
+ };
98
+
99
+ export const labelProductMismatches = (source: string, words: LabelProductWords): StructureIssue[] =>
100
+ tablesOf(linesOf(source)).flatMap(({ rows }) => rows.flatMap((row) => rowIssue(row, words)));
@@ -0,0 +1,178 @@
1
+ /**
2
+ * ポイントの明細で、利用金額 × 還元率が獲得ポイントと合わない行。見出しの語(points-earned-column)から利用金額・還元率・
3
+ * 獲得ポイントの列を見つける。還元率は 3%(利用金額の 3/100)か、見出しが何あたりかを言う数(Points per $1 の 3)で、
4
+ * 還元率の列が無い表は、表の前の同じ節の文が言う率(100円ごとに10ポイント)を使う。利用金額と獲得ポイントは単位が違ってよい
5
+ * のは、獲得ポイントの升がポイントの単位(points-unit)で書かれたときだけ。端数は切り捨て・四捨五入・切り上げのどれでもよく、
6
+ * 何円ごとに何ポイントと数える切り捨て(18,450円の 3% を 184 × 3)も合っていると読む。Pure.
7
+ */
8
+ import type { StructureIssue } from "./issues.ts";
9
+ import { linesOf, type Line } from "./lines.ts";
10
+ import { TABLE_ROW } from "./runs.ts";
11
+ import { cellsOf, tablesOf, type Cell } from "../facts/table-facts.ts";
12
+ import { cellNumber } from "./line-amount.ts";
13
+ import { roundedMatches } from "./tax.ts";
14
+ import { escapeRegExp } from "../orthography.ts";
15
+
16
+ export type PointsRole = "base" | "rate" | "earned";
17
+ /** A column heading and its role; a rate heading's per is the amount a bare rate is per (Points per $1: 1). */
18
+ export type PointsColumnWord = { readonly pattern: string; readonly role: PointsRole; readonly per: number | undefined };
19
+ export type PointsWords = {
20
+ readonly columns: readonly PointsColumnWord[];
21
+ /** What a points amount is written in (ポイント, points). */
22
+ readonly units: readonly string[];
23
+ /** What joins a points amount to the money it is per in a sentence (ごとに, for every). */
24
+ readonly joiners: readonly string[];
25
+ };
26
+
27
+ /**
28
+ * value points per `per` of the base's unit: 3% is 3 per 100, 10 points for every $1 is 10 per 1. A rate stated in a
29
+ * sentence keeps the marks of its money ("$|"), and goes only with a base written with the same ones.
30
+ */
31
+ export type PointsRate = { readonly value: number; readonly per: number; readonly written: string; readonly marks?: string };
32
+
33
+ type Columns = { readonly base: number; readonly earned: number; readonly rate: (PointsColumnWord & { readonly index: number }) | undefined };
34
+ type CellNumber = NonNullable<ReturnType<typeof cellNumber>>;
35
+
36
+ const CENTS = 100;
37
+ const PERCENT = 100;
38
+ const NUMBER = /\d[\d,]*(?:\.\d+)?/u;
39
+
40
+ const key = (text: string): string => text.normalize("NFKC").replace(/[*_`]/gu, "").trim().toLowerCase();
41
+
42
+ const valueOf = (written: string): number => Number(written.replaceAll(",", ""));
43
+
44
+ /**
45
+ * Whether the written points are the base times the rate: rounded down, to nearest or up, or counted per whole step of
46
+ * the base (100円ごとに3ポイント gives 184 × 3 for 18,450円).
47
+ */
48
+ export const pointsMatch = (written: number, base: number, rate: PointsRate): boolean => {
49
+ const writtenCents = Math.round(written * CENTS);
50
+ if (roundedMatches(writtenCents, (base * rate.value * CENTS) / rate.per)) return true;
51
+ return Math.abs(Math.floor(base / rate.per) * rate.value * CENTS - writtenCents) < 1;
52
+ };
53
+
54
+ const columnOf = (header: readonly Cell[], words: PointsWords, role: PointsRole): (PointsColumnWord & { index: number })[] =>
55
+ header.flatMap((cell, index) => {
56
+ const word = words.columns.find((entry) => entry.role === role && key(entry.pattern) === key(cell.text));
57
+ return word === undefined ? [] : [{ ...word, index }];
58
+ });
59
+
60
+ /** The base and earned columns (one each) and the rate column (one or none); undefined when the table is not one. */
61
+ const columnsOf = (header: readonly Cell[], words: PointsWords): Columns | undefined => {
62
+ const [bases, earned, rates] = [columnOf(header, words, "base"), columnOf(header, words, "earned"), columnOf(header, words, "rate")];
63
+ const [base, points] = [bases[0], earned[0]];
64
+ if (bases.length !== 1 || earned.length !== 1 || rates.length > 1 || base === undefined || points === undefined) return undefined;
65
+ return { base: base.index, earned: points.index, rate: rates[0] };
66
+ };
67
+
68
+ const isPointsUnit = (mark: string, words: PointsWords): boolean => words.units.some((unit) => key(unit) === key(mark));
69
+
70
+ /** Points written bare or in a points unit, or in the base's own unit (a cashback in yen); a base in points is not money. */
71
+ const unitsFit = (base: CellNumber, earned: CellNumber, words: PointsWords): boolean => {
72
+ if (isPointsUnit(base.after, words) || isPointsUnit(base.before, words)) return false;
73
+ if (earned.before === base.before && earned.after === base.after) return true;
74
+ return earned.before === "" && (earned.after === "" || isPointsUnit(earned.after, words));
75
+ };
76
+
77
+ /** A rate cell: 3% is per 100; a bare number (or one in points) is per what its heading says, and unread when it says nothing. */
78
+ export const rateIn = (written: string, per: number | undefined, words: PointsWords): PointsRate | undefined => {
79
+ const rate = cellNumber({ start: 0, text: written });
80
+ if (rate === undefined || rate.before !== "" || rate.value <= 0) return undefined;
81
+ if (rate.after === "%") return { value: rate.value, per: PERCENT, written: rate.written };
82
+ const bare = rate.after === "" || isPointsUnit(rate.after, words);
83
+ return bare && per !== undefined ? { value: rate.value, per, written: rate.written } : undefined;
84
+ };
85
+
86
+ /** Another cell in a points unit (a bonus): the earned points may not be the base times the rate alone. */
87
+ const hasOtherPoints = (cells: readonly Cell[], columns: Columns, words: PointsWords): boolean =>
88
+ cells.some((cell, index) => {
89
+ if (index === columns.base || index === columns.earned || index === columns.rate?.index) return false;
90
+ const number = cellNumber(cell);
91
+ return number !== undefined && isPointsUnit(number.after, words);
92
+ });
93
+
94
+ const shownLike = (earned: CellNumber, exact: number): string => {
95
+ const decimals = earned.decimals;
96
+ const number = (Math.floor(exact * 10 ** decimals) / 10 ** decimals).toLocaleString("en-US", {
97
+ minimumFractionDigits: decimals,
98
+ maximumFractionDigits: decimals,
99
+ useGrouping: earned.grouped,
100
+ });
101
+ return earned.written.replace(NUMBER, number);
102
+ };
103
+
104
+ /** The row's rate: its rate cell's, or with no rate column the one the section states. */
105
+ const rowRate = (cells: readonly Cell[], columns: Columns, stated: PointsRate | undefined, words: PointsWords): PointsRate | undefined => {
106
+ if (columns.rate === undefined) return stated;
107
+ const cell = cells[columns.rate.index];
108
+ return cell === undefined ? undefined : rateIn(cell.text, columns.rate.per, words);
109
+ };
110
+
111
+ const rowIssue = (cells: readonly Cell[], columns: Columns, stated: PointsRate | undefined, words: PointsWords): StructureIssue[] => {
112
+ const [baseCell, earnedCell] = [cells[columns.base], cells[columns.earned]];
113
+ const base = baseCell === undefined ? undefined : cellNumber(baseCell);
114
+ const earned = earnedCell === undefined ? undefined : cellNumber(earnedCell);
115
+ const rate = rowRate(cells, columns, stated, words);
116
+ if (base === undefined || earned === undefined || rate === undefined || !unitsFit(base, earned, words)) return [];
117
+ if (rate.marks !== undefined && rate.marks !== marksOf(base)) return [];
118
+ if (hasOtherPoints(cells, columns, words) || pointsMatch(earned.value, base.value, rate)) return [];
119
+ const expected = shownLike(earned, (base.value * rate.value) / rate.per);
120
+ return [{ offset: earned.offset, values: { written: earned.written, quantity: base.written, price: rate.written, expected } }];
121
+ };
122
+
123
+ const WHOLE = "\\d{1,3}(?:,\\d{3})+|\\d+";
124
+ /** What may stand between the money, the joiner and the points: spaces and a comma. */
125
+ const GAP = "[\\s、,]*";
126
+
127
+ const marksOf = (money: CellNumber): string => `${money.before}|${money.after}`;
128
+
129
+ const alternatives = (words: readonly string[]): string =>
130
+ words
131
+ .toSorted((left, right) => right.length - left.length)
132
+ .map(escapeRegExp)
133
+ .join("|");
134
+
135
+ /** "100円ごとに10ポイント" (money, joiner, points) and "10 points for every $1" (points, joiner, money), next to each other. */
136
+ const statementPatterns = (base: CellNumber, words: PointsWords): RegExp[] => {
137
+ const money = `${escapeRegExp(base.before)}\\s*(?<money>${WHOLE})(?![.,]?\\d)\\s*${escapeRegExp(base.after)}`;
138
+ const points = `(?<pointsText>(?<![\\d,.])(?<points>${WHOLE})\\s*(?:${alternatives(words.units)}))`;
139
+ const joiner = `(?:${alternatives(words.joiners)})`;
140
+ return [`${money}${GAP}${joiner}${GAP}${points}`, `${points}${GAP}${joiner}${GAP}${money}`].map((pattern) => new RegExp(pattern, "giu"));
141
+ };
142
+
143
+ /** The one rate a line states (10 points for every $1), undefined when it states none or more than one. */
144
+ export const statedRateIn = (text: string, base: CellNumber, words: PointsWords): PointsRate | undefined => {
145
+ if ((base.before === "" && base.after === "") || words.units.length === 0 || words.joiners.length === 0) return undefined;
146
+ const statements = statementPatterns(base, words).flatMap((pattern) => [...text.normalize("NFKC").matchAll(pattern)]);
147
+ const groups = statements.length === 1 ? statements[0]?.groups : undefined;
148
+ const [value, per, written] = [groups?.["points"], groups?.["money"], groups?.["pointsText"]];
149
+ if (value === undefined || per === undefined || written === undefined || valueOf(per) <= 0) return undefined;
150
+ return { value: valueOf(value), per: valueOf(per), written: `${written}/${base.before}${per}${base.after}`, marks: marksOf(base) };
151
+ };
152
+
153
+ /** The rate the prose of the table's section states before it, when every statement there gives the same one. */
154
+ const sectionRate = (prose: readonly Line[], from: number, to: number, base: CellNumber, words: PointsWords): PointsRate | undefined => {
155
+ const rates = prose.filter((line) => line.start >= from && line.start < to).flatMap((line) => statedRateIn(line.text, base, words) ?? []);
156
+ return new Set(rates.map((rate) => `${String(rate.value)}/${String(rate.per)}`)).size === 1 ? rates[0] : undefined;
157
+ };
158
+
159
+ const firstBase = (rows: readonly Line[], columns: Columns): CellNumber | undefined =>
160
+ rows.flatMap((row) => {
161
+ const cell = cellsOf(row)[columns.base];
162
+ return cell === undefined ? [] : (cellNumber(cell) ?? []);
163
+ })[0];
164
+
165
+ /** Each row of a points table whose earned points are not the base times the rate. headings: where each heading starts. */
166
+ export const pointsMismatches = (source: string, headings: readonly number[], words: PointsWords): StructureIssue[] => {
167
+ if (words.columns.length === 0) return [];
168
+ const lines = linesOf(source);
169
+ const prose = lines.filter((line) => !TABLE_ROW.test(line.text) && line.text.trim() !== "");
170
+ return tablesOf(lines).flatMap(({ header, rows }) => {
171
+ const columns = columnsOf(cellsOf(header), words);
172
+ if (columns === undefined) return [];
173
+ const from = Math.max(0, ...headings.filter((start) => start <= header.start));
174
+ const base = firstBase(rows, columns);
175
+ const stated = columns.rate === undefined && base !== undefined ? sectionRate(prose, from, header.start, base, words) : undefined;
176
+ return rows.flatMap((row) => rowIssue(cellsOf(row), columns, stated, words));
177
+ });
178
+ };
@@ -33,3 +33,19 @@ export const quantityUnit = (word: string, units: readonly UnitWord[]): string |
33
33
  */
34
34
  export const unitsAgree = (quantity: string | undefined, pricePer: string | undefined): boolean =>
35
35
  pricePer === undefined || quantity === "" || quantity === pricePer;
36
+
37
+ /**
38
+ * The unit a price heading is per. A heading that names no unit a quantity counts (Rate, whose period is unstated) is per
39
+ * the quantity heading's unit when that is one a price can be per (Hours, Miles); otherwise it stays as it is, so a bare
40
+ * Rate beside a plain Quantity column is still not multiplied by "2 days". A unit only a quantity heading counts (a
41
+ * head count: Per student beside Students) is stated too, so Per student beside Days stays per a person.
42
+ */
43
+ export const priceHeadingUnit = (
44
+ priceUnit: string | undefined,
45
+ quantityHeadingUnit: string | undefined,
46
+ rateUnits: readonly string[],
47
+ headingUnits: readonly string[],
48
+ ): string | undefined => {
49
+ if (priceUnit === undefined || rateUnits.includes(priceUnit) || headingUnits.includes(priceUnit)) return priceUnit;
50
+ return quantityHeadingUnit !== undefined && rateUnits.includes(quantityHeadingUnit) ? quantityHeadingUnit : priceUnit;
51
+ };
@@ -3,13 +3,18 @@ import { linesOf, type Line } from "./lines.ts";
3
3
  import { CELL_SEPARATOR } from "./bare-numbers.ts";
4
4
  import { TABLE_RULE } from "./runs.ts";
5
5
  import { roundedMatches } from "./tax.ts";
6
- import { perUnitPrice, quantityUnit, unitsAgree, type UnitWord } from "./line-amount-unit.ts";
6
+ import { holds } from "./change-rate-table.ts";
7
+ import { roleOf, type QuantityRole, type QuantityWord } from "./order-quantity.ts";
8
+ import { hasSuperscriptPower } from "../facts/superscript-power.ts";
9
+ import { perUnitPrice, priceHeadingUnit, quantityUnit, unitsAgree, type UnitWord } from "./line-amount-unit.ts";
7
10
 
8
11
  /**
9
12
  * 明細の表で、数量 × 単価が金額と合わない行。見出しの行から数量・単価・金額の列を語(quantity-column、unit-price-column、
10
13
  * line-amount-column)で見つけ、本体の行ごとに数量の升の頭の数と単価の升の数を掛け、金額の升の数と比べる。
11
14
  * 単価と金額は、数の前後に書いた印($、円、万円)が同じときだけ比べる。端数は切り捨て・四捨五入・切り上げのどれでもよい。
12
- * 単価が何かあたり($100/hour、月額、Rate の列)なら、数量がその単位か単位の無い数のときだけ比べる。Pure.
15
+ * 単価が何かあたり($100/hour、月額、Rate の列)なら、数量がその単位か単位の無い数のときだけ比べる。何あたりか言わない
16
+ * Rate の列は、数量の見出しが単位を言えば(Hours、Miles)その単位あたりと読む。発注・納品・残の数量の列(order-quantity-column)
17
+ * が並ぶ納品書では、どれか一つの数量で金額になれば合っていると読む。商品カタログでは入数 × 単価を1箱の価格と比べる。Pure.
13
18
  */
14
19
  export type LineAmountWords = {
15
20
  readonly quantity: readonly string[];
@@ -19,14 +24,25 @@ export type LineAmountWords = {
19
24
  readonly units: readonly UnitWord[];
20
25
  /** Marks saying a price is per a unit (per-unit-mark). */
21
26
  readonly perUnitMarks: readonly UnitWord[];
22
- /** Column headings that say the unit of their column (Hours, Rate). */
27
+ /** Column headings that say the unit of their column (Hours, Rate, 年額). */
23
28
  readonly headerUnits: readonly UnitWord[];
29
+ /** Measure units written after a number (m³, km²): a quantity cell may end in one even when it holds a digit. */
30
+ readonly measureUnits: readonly string[];
31
+ /** Heading words of a delivery note's ordered, delivered and backordered counts (order-quantity-column). */
32
+ readonly orderRoles: readonly QuantityWord[];
33
+ /** Headings of a catalog's count per pack (入数, Pack of) and of its pack price (1箱の価格, Pack price). */
34
+ readonly packCount: readonly string[];
35
+ readonly packPrice: readonly string[];
36
+ /** Headings of the column naming the goods (品名, Description): a number in a name is no discount. */
37
+ readonly itemName: readonly string[];
38
+ /** Words saying an amount includes tax (税込, incl.): such a column restates the amount and does not change it. */
39
+ readonly taxIncluded: readonly string[];
24
40
  };
25
41
 
26
- type Cell = { readonly start: number; readonly text: string };
42
+ export type Cell = { readonly start: number; readonly text: string };
27
43
 
28
44
  /** A number with what is written before and after it in one cell: "$1,500.00" is $ 1500 "", "15万円" is "" 15 万円. */
29
- type CellNumber = {
45
+ export type CellNumber = {
30
46
  readonly before: string;
31
47
  readonly value: number;
32
48
  readonly after: string;
@@ -41,7 +57,7 @@ const ONE_NUMBER = /^([^\d]*?)(\d{1,3}(?:,\d{3})+|\d+)(\.\d+)?([^\d]*)$/u;
41
57
  const LEADING_NUMBER = /^(\d{1,3}(?:,\d{3})+|\d+)(\.\d+)?(?![\d,])/u;
42
58
  const NEGATIVE = /[-−▲△((]/u;
43
59
 
44
- const cellsOf = (line: Line): Cell[] => {
60
+ export const cellsOf = (line: Line): Cell[] => {
45
61
  const bounds = [-1, ...[...line.text.matchAll(CELL_SEPARATOR)].map((match) => match.index), line.text.length];
46
62
  const cells = bounds.slice(1).map((end, index) => {
47
63
  const from = (bounds[index] ?? 0) + 1;
@@ -51,7 +67,7 @@ const cellsOf = (line: Line): Cell[] => {
51
67
  return cells.slice(trimmed.startsWith("|") ? 1 : 0, trimmed.endsWith("|") ? cells.length - 1 : cells.length);
52
68
  };
53
69
 
54
- const plain = (text: string): string => text.normalize("NFKC").replace(/[*_`]/gu, "").trim();
70
+ export const plain = (text: string): string => text.normalize("NFKC").replace(/[*_`]/gu, "").trim();
55
71
 
56
72
  /** The one number of a price cell with its marks, undefined when the cell holds none, more, or a negative one. */
57
73
  export const cellNumber = (cell: Cell): CellNumber | undefined => {
@@ -71,11 +87,19 @@ export const cellNumber = (cell: Cell): CellNumber | undefined => {
71
87
  };
72
88
  };
73
89
 
74
- /** The number a quantity cell starts with ("4", "3人日", "2.5 hours"), undefined when it does not, or holds another ("2 x 3"). */
75
- export const quantityOf = (cell: Cell): number | undefined => {
90
+ const isMeasureUnit = (word: string, measureUnits: readonly string[]): boolean => measureUnits.some((unit) => plain(unit).toLowerCase() === word.toLowerCase());
91
+
92
+ /**
93
+ * The number a quantity cell starts with ("4", "3人日", "2.5 hours", "16m³"), undefined when it does not, or holds another
94
+ * ("2 x 3", "10³"). A digit after the number is allowed only as part of a measure unit (m³ and ㎥ normalise to m3).
95
+ */
96
+ export const quantityOf = (cell: Cell, measureUnits: readonly string[]): number | undefined => {
97
+ if (hasSuperscriptPower(cell.text)) return undefined;
76
98
  const text = plain(cell.text);
77
99
  const match = LEADING_NUMBER.exec(text);
78
- if (match === null || /\d/u.test(text.slice(match[0].length))) return undefined;
100
+ if (match === null) return undefined;
101
+ const rest = text.slice(match[0].length).trim();
102
+ if (/\d/u.test(rest) && !isMeasureUnit(rest, measureUnits)) return undefined;
79
103
  return Number(`${(match[1] ?? "").replaceAll(",", "")}${match[2] ?? ""}`);
80
104
  };
81
105
 
@@ -83,70 +107,198 @@ export const quantityOf = (cell: Cell): number | undefined => {
83
107
  const quantityWord = (cell: Cell): string => plain(cell.text).replace(LEADING_NUMBER, "").trim();
84
108
 
85
109
  const columnNamed = (header: readonly Cell[], names: readonly string[]): number => {
86
- const wanted = names.map((name) => name.toLowerCase());
110
+ const wanted = names.map((name) => plain(name).toLowerCase());
87
111
  return header.findIndex((cell) => wanted.includes(plain(cell.text).toLowerCase()));
88
112
  };
89
113
 
90
- type Columns = { readonly quantity: number; readonly unitPrice: number; readonly amount: number };
114
+ /** What a quantity column counts: a plain quantity (数量), or a delivery note's ordered, delivered or backordered count. */
115
+ type QuantityKind = "quantity" | QuantityRole;
116
+
117
+ /** A quantity column, the unit its heading says (Hours), and the unit the price is per beside it (undefined when none is said). */
118
+ type QuantityColumn = { readonly index: number; readonly kind: QuantityKind; readonly unit: string | undefined; readonly priceUnit: string | undefined };
119
+
120
+ type Table = {
121
+ readonly quantities: readonly QuantityColumn[];
122
+ readonly unitPrice: number;
123
+ readonly amount: number;
124
+ /** The unit an amount heading says its quantity must count (年額 is months × a monthly price), undefined when it says none. */
125
+ readonly amountCounts: string | undefined;
126
+ /** Columns whose numbers do not change the amount (an item's name, the amount restated with tax, an order beside a pack price). */
127
+ readonly ignored: readonly number[];
128
+ };
91
129
 
92
- /** A table's columns, and the units its quantity and price headings say (undefined when they say none). */
93
- type Table = { readonly columns: Columns; readonly quantityUnit: string | undefined; readonly priceUnit: string | undefined };
130
+ /** The column a mismatch is shown against: a delivery note bills what was delivered, then a plain quantity, then what was ordered. */
131
+ const SHOWN_FIRST: readonly QuantityKind[] = ["delivered", "quantity", "ordered", "backordered"];
94
132
 
95
133
  const headerUnit = (cell: Cell | undefined, words: LineAmountWords): string | undefined =>
96
- cell === undefined ? undefined : words.headerUnits.find((word) => word.pattern.toLowerCase() === plain(cell.text).toLowerCase())?.unit;
134
+ cell === undefined ? undefined : words.headerUnits.find((word) => plain(word.pattern).toLowerCase() === plain(cell.text).toLowerCase())?.unit;
135
+
136
+ const kindOf = (cell: Cell, words: LineAmountWords): QuantityKind | undefined => {
137
+ if (columnNamed([cell], words.quantity) === 0) return "quantity";
138
+ const role = roleOf(cell.text, words.orderRoles);
139
+ return role === "both" ? undefined : role;
140
+ };
141
+
142
+ const namesQuantity = (cell: Cell, words: LineAmountWords): boolean => words.quantity.some((word) => holds(plain(cell.text).toLowerCase(), word));
143
+
144
+ /**
145
+ * The quantity columns: each heading named as a quantity (数量), and each naming an ordered, delivered or backordered
146
+ * count (発注数量, Qty delivered). A role word alone ("Ordered", "Delivered") may head a date, so it is read only in a
147
+ * table with a backordered column, which is always a count. Two columns of one kind leave no way to choose, so such a
148
+ * table is not read.
149
+ */
150
+ const quantityColumnsOf = (header: readonly Cell[], words: LineAmountWords): Omit<QuantityColumn, "priceUnit">[] | undefined => {
151
+ const kinds = header.map((cell) => kindOf(cell, words));
152
+ const countsRemainder = kinds.includes("backordered");
153
+ const columns = header.flatMap((cell, index) => {
154
+ const kind = kinds[index];
155
+ if (kind === undefined || (kind !== "quantity" && !countsRemainder && !namesQuantity(cell, words))) return [];
156
+ return [{ index, kind, unit: headerUnit(cell, words) }];
157
+ });
158
+ return columns.length === 0 || new Set(columns.map((column) => column.kind)).size < columns.length ? undefined : columns;
159
+ };
160
+
161
+ const headingHolds = (cell: Cell, names: readonly string[]): boolean => names.some((name) => holds(plain(cell.text).toLowerCase(), name));
162
+
163
+ /** A heading without its bracketed note: "1箱の価格(税込・10%)" and "Pack price (excl. tax)" are "1箱の価格" and "pack price". */
164
+ const headingBase = (cell: Cell): string =>
165
+ plain(cell.text)
166
+ .replace(/\([^()]*\)/gu, "")
167
+ .trim()
168
+ .toLowerCase();
169
+
170
+ /**
171
+ * The columns whose numbers say nothing about the amount: an item's name (A5), and the amount again with tax — a heading
172
+ * that says tax is included and is the amount heading but for its bracketed note (1箱の価格(税込) beside 1箱の価格(税抜)).
173
+ * "金額のうち値引き" is no such heading, so its numbers still keep the row from being compared.
174
+ */
175
+ const ignoredColumnsOf = (header: readonly Cell[], amount: number, words: LineAmountWords): number[] => {
176
+ const amountCell = header[amount];
177
+ return header.flatMap((cell, index) => {
178
+ const restated = amountCell !== undefined && index !== amount && headingHolds(cell, words.taxIncluded) && headingBase(cell) === headingBase(amountCell);
179
+ return restated || columnNamed([cell], words.itemName) === 0 ? [index] : [];
180
+ });
181
+ };
182
+
183
+ const distinct = (indexes: readonly number[]): boolean => indexes.every((index) => index >= 0) && new Set(indexes).size === indexes.length;
184
+
185
+ /** The units quantity headings count (Hours: hour, Students: person). */
186
+ const quantityHeadingUnits = (words: LineAmountWords): string[] =>
187
+ words.headerUnits.flatMap((word) => (columnNamed([{ start: 0, text: word.pattern }], words.quantity) === 0 ? [word.unit] : []));
97
188
 
98
189
  const tableOf = (header: readonly Cell[], words: LineAmountWords): Table | undefined => {
99
- const columns = { quantity: columnNamed(header, words.quantity), unitPrice: columnNamed(header, words.unitPrice), amount: columnNamed(header, words.amount) };
100
- if (Object.values(columns).some((index) => index < 0) || new Set(Object.values(columns)).size < 3) return undefined;
101
- return { columns, quantityUnit: headerUnit(header[columns.quantity], words), priceUnit: headerUnit(header[columns.unitPrice], words) };
190
+ const quantities = quantityColumnsOf(header, words);
191
+ const [unitPrice, amount] = [columnNamed(header, words.unitPrice), columnNamed(header, words.amount)];
192
+ if (quantities === undefined || !distinct([unitPrice, amount])) return undefined;
193
+ if (quantities.some((column) => column.index === unitPrice || column.index === amount)) return undefined;
194
+ const priceUnit = headerUnit(header[unitPrice], words);
195
+ const rateUnits = words.units.map((word) => word.unit);
196
+ const headingUnits = quantityHeadingUnits(words);
197
+ const columns = quantities.map((column) => ({ ...column, priceUnit: priceHeadingUnit(priceUnit, column.unit, rateUnits, headingUnits) }));
198
+ return { quantities: columns, unitPrice, amount, amountCounts: headerUnit(header[amount], words), ignored: ignoredColumnsOf(header, amount, words) };
199
+ };
200
+
201
+ /**
202
+ * A catalog's pack: count per pack × unit price = pack price. The count is no order quantity, so it is read only beside
203
+ * a pack price heading; an order's quantity and amount columns beside them (数量 × 1箱の価格 = 金額) do not change the pack price.
204
+ * An amount column without an order quantity is not known to be an order's, so its numbers still keep the row out.
205
+ */
206
+ const packTableOf = (header: readonly Cell[], words: LineAmountWords): Table | undefined => {
207
+ const [count, unitPrice, amount] = [columnNamed(header, words.packCount), columnNamed(header, words.unitPrice), columnNamed(header, words.packPrice)];
208
+ if (!distinct([count, unitPrice, amount])) return undefined;
209
+ const quantities = header.flatMap((cell, index) => (kindOf(cell, words) === undefined ? [] : [index]));
210
+ const lineAmount = columnNamed(header, words.amount);
211
+ const order = quantities.length > 0 && lineAmount >= 0 ? [...quantities, lineAmount] : quantities;
212
+ const priceUnit = headerUnit(header[unitPrice], words);
213
+ const quantity: QuantityColumn = { index: count, kind: "quantity", unit: undefined, priceUnit };
214
+ return { quantities: [quantity], unitPrice, amount, amountCounts: undefined, ignored: [...order, ...ignoredColumnsOf(header, amount, words)] };
102
215
  };
103
216
 
104
217
  /** The unit the quantity cell counts: its own word, else its heading's ("Hours"). */
105
- const rowQuantityUnit = (cell: Cell, table: Table, words: LineAmountWords): string | undefined => {
218
+ const rowQuantityUnit = (cell: Cell, column: QuantityColumn, words: LineAmountWords): string | undefined => {
106
219
  const unit = quantityUnit(quantityWord(cell), words.units);
107
- return unit === "" && table.quantityUnit !== undefined ? table.quantityUnit : unit;
220
+ return unit === "" && column.unit !== undefined ? column.unit : unit;
108
221
  };
109
222
 
110
223
  /** quantity × price, written the way the amount cell writes its number (grouping, decimals, marks). */
111
- const shownExpected = (amount: CellNumber, exactCents: number): string => {
224
+ export const shownExpected = (amount: CellNumber, exactCents: number): string => {
112
225
  const exact = exactCents / CENTS;
113
226
  const decimals = Number.isInteger(Math.round(exact * CENTS) / CENTS) && amount.decimals === 0 ? 0 : Math.max(amount.decimals, 2);
114
227
  const number = exact.toLocaleString("en-US", { minimumFractionDigits: decimals, maximumFractionDigits: decimals, useGrouping: amount.grouped });
115
228
  return `${amount.before}${number}${amount.after}`;
116
229
  };
117
230
 
231
+ /**
232
+ * Whether the row's quantity can turn its price into the amount. A price per a unit goes with a quantity in that unit
233
+ * or a bare number; an amount heading that says what its quantity counts (年額: months) takes only a quantity in that
234
+ * unit, so 5 seats or 2 hours beside a monthly or hourly price is not compared with a year's amount.
235
+ */
236
+ const quantityFits = (reading: Reading, table: Table, perUnit: string | undefined, words: LineAmountWords): boolean => {
237
+ const unit = rowQuantityUnit(reading.cell, reading.column, words);
238
+ return unitsAgree(unit, perUnit ?? reading.column.priceUnit) && (table.amountCounts === undefined || unit === table.amountCounts);
239
+ };
240
+
241
+ const usedColumns = (table: Table): number[] => [...table.quantities.map((column) => column.index), table.unitPrice, table.amount];
242
+
243
+ const hasDigit = (cell: Cell): boolean => /\d/u.test(plain(cell.text));
244
+
118
245
  /** Another cell than the item name with a number in it (a discount, a tax rate): the amount may not be quantity × price alone. */
119
- const hasOtherNumber = (cells: readonly Cell[], columns: Columns): boolean =>
120
- cells.some((cell, index) => index > 0 && !Object.values(columns).includes(index) && /\d/u.test(plain(cell.text)));
246
+ const hasOtherNumber = (cells: readonly Cell[], table: Table): boolean =>
247
+ cells.some((cell, index) => index > 0 && !usedColumns(table).includes(index) && !table.ignored.includes(index) && hasDigit(cell));
121
248
 
122
- const rowIssue = (row: Line, table: Table, words: LineAmountWords): StructureIssue[] => {
123
- const { columns } = table;
124
- const cells = cellsOf(row);
125
- if (hasOtherNumber(cells, columns)) return [];
126
- const quantityCell = cells[columns.quantity];
127
- const priceCell = cells[columns.unitPrice];
128
- const amountCell = cells[columns.amount];
129
- if (quantityCell === undefined || priceCell === undefined || amountCell === undefined) return [];
130
- const quantity = quantityOf(quantityCell);
131
- const price = cellNumber(priceCell);
132
- const amount = cellNumber(amountCell);
133
- if (quantity === undefined || price === undefined || amount === undefined) return [];
249
+ type Reading = { readonly column: QuantityColumn; readonly cell: Cell; readonly quantity: number };
250
+
251
+ /**
252
+ * The row's quantities, one per quantity column whose cell holds one; a cell without a number (an empty remainder) is
253
+ * skipped. Undefined when a cell holds digits that are no quantity ("6 x 2"), or when no column holds one.
254
+ */
255
+ const readingsOf = (cells: readonly Cell[], table: Table, words: LineAmountWords): Reading[] | undefined => {
256
+ const readings = table.quantities.flatMap((column) => {
257
+ const cell = cells[column.index];
258
+ return cell === undefined ? [] : [{ column, cell, quantity: quantityOf(cell, words.measureUnits) }];
259
+ });
260
+ if (readings.some(({ cell, quantity }) => quantity === undefined && hasDigit(cell))) return undefined;
261
+ const read = readings.flatMap(({ column, cell, quantity }) => (quantity === undefined ? [] : [{ column, cell, quantity }]));
262
+ return read.length === 0 ? undefined : read;
263
+ };
264
+
265
+ const shownFirst = (readings: readonly Reading[]): Reading | undefined =>
266
+ readings.toSorted((left, right) => SHOWN_FIRST.indexOf(left.column.kind) - SHOWN_FIRST.indexOf(right.column.kind))[0];
267
+
268
+ type Priced = { readonly price: CellNumber; readonly amount: CellNumber; readonly perUnit: string | undefined };
269
+
270
+ /** The row's price and amount, when both are one number written with the same marks (a per-unit mark taken off the price). */
271
+ const pricedOf = (cells: readonly Cell[], table: Table, words: LineAmountWords): Priced | undefined => {
272
+ const [priceCell, amountCell] = [cells[table.unitPrice], cells[table.amount]];
273
+ const price = priceCell === undefined ? undefined : cellNumber(priceCell);
274
+ const amount = amountCell === undefined ? undefined : cellNumber(amountCell);
275
+ if (price === undefined || amount === undefined) return undefined;
134
276
  const perUnit = perUnitPrice(price.before, price.after, words.perUnitMarks);
135
277
  const marks = perUnit ?? price;
136
- if (marks.before !== amount.before || marks.after !== amount.after) return [];
137
- if (!unitsAgree(rowQuantityUnit(quantityCell, table, words), perUnit?.unit ?? table.priceUnit)) return [];
138
- const exactCents = quantity * price.value * CENTS;
139
- if (roundedMatches(Math.round(amount.value * CENTS), exactCents, amount.decimals === 0)) return [];
140
- return [
141
- {
142
- offset: amount.offset,
143
- values: { written: amount.written, quantity: plain(quantityCell.text), price: price.written, expected: shownExpected(amount, exactCents) },
144
- },
145
- ];
278
+ return marks.before === amount.before && marks.after === amount.after ? { price, amount, perUnit: perUnit?.unit } : undefined;
279
+ };
280
+
281
+ /**
282
+ * A row is reported only when no quantity column times the price gives the amount: a delivery note may bill what was
283
+ * ordered or what was delivered, and either is right. The finding shows the column SHOWN_FIRST names.
284
+ */
285
+ const rowIssue = (row: Line, table: Table, words: LineAmountWords): StructureIssue[] => {
286
+ const cells = cellsOf(row);
287
+ const readings = hasOtherNumber(cells, table) ? undefined : readingsOf(cells, table, words);
288
+ const priced = readings === undefined ? undefined : pricedOf(cells, table, words);
289
+ if (readings === undefined || priced === undefined) return [];
290
+ const { price, amount, perUnit } = priced;
291
+ if (!readings.every((reading) => quantityFits(reading, table, perUnit, words))) return [];
292
+ const centsOf = (reading: Reading): number => reading.quantity * price.value * CENTS;
293
+ if (readings.some((reading) => roundedMatches(Math.round(amount.value * CENTS), centsOf(reading), amount.decimals === 0))) return [];
294
+ const shown = shownFirst(readings);
295
+ if (shown === undefined) return [];
296
+ const values = { written: amount.written, quantity: plain(shown.cell.text), price: price.written, expected: shownExpected(amount, centsOf(shown)) };
297
+ return [{ offset: amount.offset, values }];
146
298
  };
147
299
 
148
300
  /** Each table: its header row and its body rows. */
149
- const tablesOf = (lines: readonly Line[]): { header: Line; rows: Line[] }[] =>
301
+ export const tablesOf = (lines: readonly Line[]): { header: Line; rows: Line[] }[] =>
150
302
  lines.flatMap((line, index) => {
151
303
  const header = lines[index - 1];
152
304
  if (!TABLE_RULE.test(line.text) || header === undefined || !header.text.includes("|")) return [];
@@ -157,6 +309,6 @@ const tablesOf = (lines: readonly Line[]): { header: Line; rows: Line[] }[] =>
157
309
 
158
310
  export const lineAmountMismatches = (source: string, words: LineAmountWords): StructureIssue[] =>
159
311
  tablesOf(linesOf(source)).flatMap(({ header, rows }) => {
160
- const table = tableOf(cellsOf(header), words);
161
- return table === undefined ? [] : rows.flatMap((row) => rowIssue(row, table, words));
312
+ const readings = [tableOf(cellsOf(header), words), packTableOf(cellsOf(header), words)];
313
+ return readings.flatMap((table) => (table === undefined ? [] : rows.flatMap((row) => rowIssue(row, table, words))));
162
314
  });