@pubid/pubid 0.1.3 → 0.1.5

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 (185) hide show
  1. package/artifact/corpus.json.gz +0 -0
  2. package/dist/conformance/cli.js +5 -1
  3. package/dist/flavors/amca/grammar.d.ts +4 -0
  4. package/dist/flavors/amca/grammar.js +87 -0
  5. package/dist/flavors/amca/index.d.ts +4 -0
  6. package/dist/flavors/amca/index.js +76 -0
  7. package/dist/flavors/amca/model.d.ts +29 -0
  8. package/dist/flavors/amca/model.js +146 -0
  9. package/dist/flavors/ansi/index.d.ts +24 -0
  10. package/dist/flavors/ansi/index.js +147 -0
  11. package/dist/flavors/api/grammar.d.ts +4 -0
  12. package/dist/flavors/api/grammar.js +79 -0
  13. package/dist/flavors/api/index.d.ts +4 -0
  14. package/dist/flavors/api/index.js +71 -0
  15. package/dist/flavors/api/model.d.ts +27 -0
  16. package/dist/flavors/api/model.js +114 -0
  17. package/dist/flavors/ashrae/grammar.d.ts +2 -0
  18. package/dist/flavors/ashrae/grammar.js +667 -0
  19. package/dist/flavors/ashrae/index.d.ts +4 -0
  20. package/dist/flavors/ashrae/index.js +306 -0
  21. package/dist/flavors/ashrae/model.d.ts +87 -0
  22. package/dist/flavors/ashrae/model.js +335 -0
  23. package/dist/flavors/ashrae/preprocessor.d.ts +7 -0
  24. package/dist/flavors/ashrae/preprocessor.js +44 -0
  25. package/dist/flavors/asme/grammar.d.ts +2 -0
  26. package/dist/flavors/asme/grammar.js +200 -0
  27. package/dist/flavors/asme/index.d.ts +4 -0
  28. package/dist/flavors/asme/index.js +138 -0
  29. package/dist/flavors/asme/model.d.ts +34 -0
  30. package/dist/flavors/asme/model.js +123 -0
  31. package/dist/flavors/astm/grammar.d.ts +2 -0
  32. package/dist/flavors/astm/grammar.js +110 -0
  33. package/dist/flavors/astm/index.d.ts +2 -0
  34. package/dist/flavors/astm/index.js +127 -0
  35. package/dist/flavors/astm/model.d.ts +42 -0
  36. package/dist/flavors/astm/model.js +263 -0
  37. package/dist/flavors/bipm/index.d.ts +30 -0
  38. package/dist/flavors/bipm/index.js +434 -0
  39. package/dist/flavors/bsi/grammar.d.ts +4 -0
  40. package/dist/flavors/bsi/grammar.js +535 -0
  41. package/dist/flavors/bsi/index.d.ts +4 -0
  42. package/dist/flavors/bsi/index.js +941 -0
  43. package/dist/flavors/bsi/model.d.ts +127 -0
  44. package/dist/flavors/bsi/model.js +863 -0
  45. package/dist/flavors/calconnect/index.d.ts +21 -0
  46. package/dist/flavors/calconnect/index.js +113 -0
  47. package/dist/flavors/cen_cenelec/grammar.d.ts +4 -0
  48. package/dist/flavors/cen_cenelec/grammar.js +107 -0
  49. package/dist/flavors/cen_cenelec/index.d.ts +5 -0
  50. package/dist/flavors/cen_cenelec/index.js +263 -0
  51. package/dist/flavors/cen_cenelec/model.d.ts +45 -0
  52. package/dist/flavors/cen_cenelec/model.js +490 -0
  53. package/dist/flavors/cie/grammar.d.ts +5 -0
  54. package/dist/flavors/cie/grammar.js +127 -0
  55. package/dist/flavors/cie/index.d.ts +2 -0
  56. package/dist/flavors/cie/index.js +311 -0
  57. package/dist/flavors/cie/model.d.ts +122 -0
  58. package/dist/flavors/cie/model.js +464 -0
  59. package/dist/flavors/csa/grammar.d.ts +6 -0
  60. package/dist/flavors/csa/grammar.js +239 -0
  61. package/dist/flavors/csa/index.d.ts +2 -0
  62. package/dist/flavors/csa/index.js +634 -0
  63. package/dist/flavors/csa/model.d.ts +33 -0
  64. package/dist/flavors/csa/model.js +505 -0
  65. package/dist/flavors/doi/index.d.ts +13 -0
  66. package/dist/flavors/doi/index.js +65 -0
  67. package/dist/flavors/easc/index.d.ts +4 -0
  68. package/dist/flavors/easc/index.js +107 -0
  69. package/dist/flavors/ecma/index.d.ts +4 -0
  70. package/dist/flavors/ecma/index.js +117 -0
  71. package/dist/flavors/etsi/index.d.ts +14 -0
  72. package/dist/flavors/etsi/index.js +307 -0
  73. package/dist/flavors/evs/grammar.d.ts +2 -0
  74. package/dist/flavors/evs/grammar.js +22 -0
  75. package/dist/flavors/evs/index.d.ts +2 -0
  76. package/dist/flavors/evs/index.js +24 -0
  77. package/dist/flavors/evs/model.d.ts +19 -0
  78. package/dist/flavors/evs/model.js +36 -0
  79. package/dist/flavors/gb/index.d.ts +31 -0
  80. package/dist/flavors/gb/index.js +159 -0
  81. package/dist/flavors/gost/grammar.d.ts +2 -0
  82. package/dist/flavors/gost/grammar.js +46 -0
  83. package/dist/flavors/gost/index.d.ts +2 -0
  84. package/dist/flavors/gost/index.js +165 -0
  85. package/dist/flavors/gost/model.d.ts +61 -0
  86. package/dist/flavors/gost/model.js +147 -0
  87. package/dist/flavors/gost/prefix_routes.d.ts +15 -0
  88. package/dist/flavors/gost/prefix_routes.js +192 -0
  89. package/dist/flavors/iala/index.d.ts +32 -0
  90. package/dist/flavors/iala/index.js +300 -0
  91. package/dist/flavors/iana/index.d.ts +19 -0
  92. package/dist/flavors/iana/index.js +71 -0
  93. package/dist/flavors/idf/grammar.d.ts +2 -0
  94. package/dist/flavors/idf/grammar.js +71 -0
  95. package/dist/flavors/idf/index.d.ts +2 -0
  96. package/dist/flavors/idf/index.js +100 -0
  97. package/dist/flavors/idf/model.d.ts +54 -0
  98. package/dist/flavors/idf/model.js +359 -0
  99. package/dist/flavors/iec/grammar.d.ts +3 -0
  100. package/dist/flavors/iec/grammar.js +187 -0
  101. package/dist/flavors/iec/index.d.ts +4 -0
  102. package/dist/flavors/iec/index.js +507 -0
  103. package/dist/flavors/iec/model.d.ts +54 -0
  104. package/dist/flavors/iec/model.js +437 -0
  105. package/dist/flavors/ieee/grammar.d.ts +2 -0
  106. package/dist/flavors/ieee/grammar.js +697 -0
  107. package/dist/flavors/ieee/index.d.ts +3 -0
  108. package/dist/flavors/ieee/index.js +1258 -0
  109. package/dist/flavors/ieee/model.d.ts +144 -0
  110. package/dist/flavors/ieee/model.js +1237 -0
  111. package/dist/flavors/ieee/preprocessor.d.ts +8 -0
  112. package/dist/flavors/ieee/preprocessor.js +410 -0
  113. package/dist/flavors/ieee/update_codes.d.ts +8 -0
  114. package/dist/flavors/ieee/update_codes.js +197 -0
  115. package/dist/flavors/ietf/index.d.ts +30 -0
  116. package/dist/flavors/ietf/index.js +151 -0
  117. package/dist/flavors/iho/index.d.ts +4 -0
  118. package/dist/flavors/iho/index.js +126 -0
  119. package/dist/flavors/index.d.ts +9 -0
  120. package/dist/flavors/index.js +136 -0
  121. package/dist/flavors/isbn/index.d.ts +13 -0
  122. package/dist/flavors/isbn/index.js +97 -0
  123. package/dist/flavors/iso/grammar.d.ts +2 -0
  124. package/dist/flavors/iso/grammar.js +207 -0
  125. package/dist/flavors/iso/index.d.ts +2 -0
  126. package/dist/flavors/iso/index.js +343 -0
  127. package/dist/flavors/iso/model.d.ts +159 -0
  128. package/dist/flavors/iso/model.js +802 -0
  129. package/dist/flavors/iso/stages.generated.d.ts +13 -0
  130. package/dist/flavors/iso/stages.generated.js +391 -0
  131. package/dist/flavors/itu/grammar.d.ts +4 -0
  132. package/dist/flavors/itu/grammar.js +205 -0
  133. package/dist/flavors/itu/index.d.ts +2 -0
  134. package/dist/flavors/itu/index.js +224 -0
  135. package/dist/flavors/itu/model.d.ts +184 -0
  136. package/dist/flavors/itu/model.js +599 -0
  137. package/dist/flavors/jcgm/index.d.ts +7 -0
  138. package/dist/flavors/jcgm/index.js +300 -0
  139. package/dist/flavors/jis/index.d.ts +4 -0
  140. package/dist/flavors/jis/index.js +267 -0
  141. package/dist/flavors/nist/grammar.d.ts +2 -0
  142. package/dist/flavors/nist/grammar.js +287 -0
  143. package/dist/flavors/nist/index.d.ts +2 -0
  144. package/dist/flavors/nist/index.js +1244 -0
  145. package/dist/flavors/nist/model.d.ts +155 -0
  146. package/dist/flavors/nist/model.js +823 -0
  147. package/dist/flavors/nist/preprocessor.d.ts +11 -0
  148. package/dist/flavors/nist/preprocessor.js +281 -0
  149. package/dist/flavors/oasis/index.d.ts +23 -0
  150. package/dist/flavors/oasis/index.js +110 -0
  151. package/dist/flavors/ogc/index.d.ts +20 -0
  152. package/dist/flavors/ogc/index.js +75 -0
  153. package/dist/flavors/oiml/grammar.d.ts +2 -0
  154. package/dist/flavors/oiml/grammar.js +206 -0
  155. package/dist/flavors/oiml/implementation.d.ts +9 -0
  156. package/dist/flavors/oiml/implementation.js +45 -0
  157. package/dist/flavors/oiml/model.d.ts +23 -0
  158. package/dist/flavors/oiml/model.js +592 -0
  159. package/dist/flavors/omg/index.d.ts +14 -0
  160. package/dist/flavors/omg/index.js +73 -0
  161. package/dist/flavors/plateau/index.d.ts +4 -0
  162. package/dist/flavors/plateau/index.js +97 -0
  163. package/dist/flavors/tgpp/index.d.ts +4 -0
  164. package/dist/flavors/tgpp/index.js +122 -0
  165. package/dist/flavors/un/index.d.ts +13 -0
  166. package/dist/flavors/un/index.js +90 -0
  167. package/dist/flavors/w3c/index.d.ts +14 -0
  168. package/dist/flavors/w3c/index.js +148 -0
  169. package/dist/flavors/xsf/index.d.ts +18 -0
  170. package/dist/flavors/xsf/index.js +65 -0
  171. package/dist/grammar/engine.d.ts +78 -0
  172. package/dist/grammar/engine.js +351 -0
  173. package/dist/index.d.ts +1 -0
  174. package/dist/index.js +3 -0
  175. package/dist/model/attribute.d.ts +54 -0
  176. package/dist/model/attribute.js +53 -0
  177. package/dist/model/builder.d.ts +39 -0
  178. package/dist/model/builder.js +124 -0
  179. package/dist/model/component.d.ts +70 -0
  180. package/dist/model/component.js +170 -0
  181. package/dist/model/identifier.d.ts +84 -0
  182. package/dist/model/identifier.js +270 -0
  183. package/dist/model/urn-generator.d.ts +27 -0
  184. package/dist/model/urn-generator.js +91 -0
  185. package/package.json +1 -1
@@ -0,0 +1,287 @@
1
+ import { match, ref, str } from "../../grammar/engine.js";
2
+ /**
3
+ * Port of lib/pubid/nist/parser.rb — 1:1 translation. The identifier
4
+ * alternation order is load-bearing: circ_supplement | dated | mr |
5
+ * research_library | compound_series | publisher+series | bare series.
6
+ */
7
+ const COMPOUND_SERIES = [
8
+ "NBS BRPD-CRPL-D", "NBS CRPL-F-A", "NBS CRPL-F-B",
9
+ "NBS CS-E", "CSRC Building Block", "CSRC Use Case", "CSRC Book",
10
+ "ITL Bulletin", "NSRDS-NBS",
11
+ "NIST LCIRC", "NBS LCIRC", "NIST.LCIRC", "NBS.LCIRC", "NBS RPT",
12
+ "NIST PS", "NIST DCI", "NIST Other",
13
+ "NISTPUB",
14
+ "NBS CSM", "NBS CIRC", "NBS.CRPL", "NBS CRPL", "NBS CS",
15
+ "NBS CIS", "NBS HR", "NBS IRPL", "NBS IP", "NBS PS",
16
+ "NBS BH",
17
+ ];
18
+ const SIMPLE_SERIES = [
19
+ "AMS", "VTS", "BSS", "BMS", "BH",
20
+ "FIPS", "GCR", "HB", "MONO", "MP", "NCSTAR", "NSRDS", "IR",
21
+ "SP", "TN", "CSWP",
22
+ "AI", "CIRC", "CS", "CSM",
23
+ "CRPL", "LCIRC", "OWMWP", "PC", "RPT",
24
+ "SIBS", "TIBM", "TTB", "EAB",
25
+ "JPCRD", "JRES",
26
+ "CHIPS", "NWIRP", "RB",
27
+ ];
28
+ const MONTHS = [
29
+ "January", "February", "March", "April", "May", "June", "July",
30
+ "August", "September", "October", "November", "December",
31
+ "Jan", "Feb", "Mar", "Apr", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
32
+ ];
33
+ function literalAlternation(tokens) {
34
+ const sorted = [...new Set(tokens)].sort((a, b) => b.length - a.length);
35
+ return sorted.map((t) => str(t)).reduce((a, b) => a.or(b));
36
+ }
37
+ function buildRules() {
38
+ const rules = {};
39
+ const rule = (name, build) => {
40
+ rules[name] = build();
41
+ };
42
+ const space = str(" ");
43
+ const dot = str(".");
44
+ const dash = str("-");
45
+ const slash = str("/");
46
+ const digit = match("[0-9]");
47
+ const digits = digit.repeat(1, Infinity);
48
+ const upperLetter = match("[A-Z]");
49
+ const lowerLetter = match("[a-z]");
50
+ const letter = match("[A-Za-z]");
51
+ const monthAbbrev = () => literalAlternation(MONTHS);
52
+ const anyChar = match("[\\s\\S]");
53
+ rule("hash_prefix", () => str("#"));
54
+ rule("month_abbrev", () => monthAbbrev());
55
+ rule("language_code", () => (space.or(dot))
56
+ .maybe()
57
+ .then(literalAlternation(["es", "pt", "chi", "viet", "port", "esp"]).or(match("[a-z]").repeat(2, 4)))
58
+ .as("translation"));
59
+ const stageId = () => str("i").or(str("I"), str("f"), str("F"), str("1"), str("2"), str("3"), str("4"), str("5"), str("6"), str("7"), str("8"), str("9"));
60
+ const stageType = () => str("pd").or(str("PD"), str("wd"), str("WD"), str("prd"), str("PRD"));
61
+ rule("old_stage", () => str("(")
62
+ .then(stageId().as("stage_id"), stageType().as("stage_type"))
63
+ .as("stage")
64
+ .then(str(")")));
65
+ rule("new_stage", () => (space.or(dot))
66
+ .then(stageId().as("stage_id"), stageType().as("stage_type"))
67
+ .as("stage"));
68
+ rule("publisher", () => str("NBS").or(str("NIST")).as("publisher"));
69
+ rule("compound_series", () => literalAlternation(COMPOUND_SERIES).as("series"));
70
+ rule("simple_series", () => literalAlternation(SIMPLE_SERIES).as("series"));
71
+ rule("number_suffix", () => str("U")
72
+ .then(lowerLetter)
73
+ .or(letter.then(literalAlternation([
74
+ "ec", "ndex", "nsert", "rrata", "raft", "pp", "s", "t",
75
+ "hi", "iet", "ort", "r", "p",
76
+ ]).absent(), digits.maybe())));
77
+ rule("digits_with_suffix", () => digits.then(ref(rules, "number_suffix").then(digit.absent()).maybe()));
78
+ rule("first_number", () => ref(rules, "owmwp_date_number")
79
+ .or(str("ADHOC"), str("div").then(digits), monthAbbrev().then(dash, monthAbbrev(), digits), digits
80
+ .as("number")
81
+ .then(str("v"), digits.as("volume_suffix"))
82
+ .as("number_with_volume"), digits
83
+ .then(dash, literalAlternation(["III", "II", "IV", "I", "V", "VI", "VII", "VIII", "IX", "X"]), dash, digits, dot.then(digits).maybe()), digits.then(str("GB"), dash, digits, upperLetter.maybe()), digits.then(upperLetter, dash, digits), str("v")
84
+ .then(digits.as("volume_number"), str("n"), digits.as("issue_number")), digits.then(str("supprev")), digits.then(str("e"), digits, str("rev"), digits), digits
85
+ .as("number")
86
+ .then(str("rv"), digits.as("revision_year"))
87
+ .as("number_with_rev_year"), digits.then(str("e"), digits, str("rev"), monthAbbrev(), digits), digits.then(str("e"), digits, str("supp"), digits.maybe()), str("e").then(digits, str("rev"), monthAbbrev(), digits), str("e").then(digits, str("supp"), digits.maybe()), digits.then(str("e"), digits), str("e").then(digits, dash.then(digits).absent()), lowerLetter.then(digits), digits.then(str("supp"), monthAbbrev(), digits), digits.then(str("supp"), digits.maybe()), digits.then(str("sup"), monthAbbrev(), digits), digits.then(str("sup")), digits
88
+ .as("number")
89
+ .then(literalAlternation(["sp", "pt", "es", "SP", "PT", "ES"]).as("language_code"), upperLetter.absent(), digit.absent(), letter.absent(), dash.absent(), dot.absent()), digits
90
+ .as("number")
91
+ .then(str("pt"), digits.as("part_number"), str("e"), digits.as("edition_year")), digits
92
+ .as("number")
93
+ .then(str("("), literalAlternation(["SP", "PT", "ES"]).as("language_code"), str(")")), digits
94
+ .as("number")
95
+ .then(upperLetter.as("letter_suffix"), str("r"), digits.as("revision_id"))
96
+ .as("number_with_letter_revision"), rules["digits_with_suffix"])
97
+ .as("first_number"));
98
+ // OWMWP date number: MM-DD-YYYY — must precede the other shapes.
99
+ rule("owmwp_date_number", () => match("[0-9]")
100
+ .repeat(2, 2)
101
+ .as("owmwp_month")
102
+ .then(dash, match("[0-9]").repeat(2, 2).as("owmwp_day"), dash, match("[0-9]").repeat(4, 4).as("owmwp_year"))
103
+ .as("owmwp_date_number"));
104
+ rule("second_number", () => monthAbbrev()
105
+ .absent()
106
+ .then(str("draft").absent(), (digits
107
+ .then(literalAlternation(["supp", "sup"]), digit.absent(), letter.absent())
108
+ .or(digits.then(str("r"), digits, str("U"), lowerLetter), digits.then(str("r"), digits, letter), digits.as("number_only").then(str("r"), digits.as("edition_id")), digits.then(str("_"), digits, dash, digits, upperLetter.maybe()), lowerLetter.then(dash, digits), digits.then(str("pt"), digits, dash.absent()), digits.then(upperLetter), digits
109
+ .as("number_only")
110
+ .then(str("r"), letter.as("letter"))
111
+ .as("revision_letter"), str("r").then(letter).as("revision_letter_suffix"), str("r").then(digits.as("edition_id")).as("revision_simple"), str("NCNR"), str("PERMIS"), str("BFRL"), upperLetter.repeat(1, 3), rules["digits_with_suffix"]
112
+ .then(dash.then(monthAbbrev(), digits, slash).absent()), lowerLetter.then(digit.absent()))).as("second_number")));
113
+ const editionInner = () => space
114
+ .maybe()
115
+ .then(str("e"), digits.as("edition_id"))
116
+ .as("edition_e")
117
+ .or(space
118
+ .then(str("r"), digits.as("edition_id"), letter.as("edition_letter"))
119
+ .as("edition_r_with_space_letter"), space.then(str("r"), digits.as("edition_id")).as("edition_r_with_space"), str("r")
120
+ .then(digits.as("edition_id"), letter.as("edition_letter"))
121
+ .as("edition_r_no_space_letter"), str("r").then(digits.as("edition_id")).as("edition_r_no_space"), space
122
+ .maybe()
123
+ .then(str("rev"), space.maybe(), digits.as("edition_id"))
124
+ .as("edition_rev"), dash.then(match("[1-9]").as("edition_id"), digit.absent()).as("edition_historical"), dash
125
+ .then(match("[0-9]").repeat(4, 4).as("dash_year"))
126
+ .as("edition_dash_year"));
127
+ rule("edition", () => editionInner());
128
+ rule("date", () => dash
129
+ .then(match("[0-9]").repeat(4, 4).as("date_year"), match("[0-9]").repeat(2, 2).as("date_month"), match("[0-9]").repeat(2, 2).as("date_day"))
130
+ .as("date")
131
+ .or(dash
132
+ .then(match("[0-9]").repeat(4, 4).as("date_year"), match("[0-9]").repeat(2, 2).as("date_month"))
133
+ .as("date"), dash.then(match("[0-9]").repeat(4, 4).as("date_year")).as("date"), dash
134
+ .then(monthAbbrev().as("date_month"), digits.as("date_year"))
135
+ .as("date")));
136
+ rule("iso_date", () => match("[0-9]")
137
+ .repeat(4, 4)
138
+ .as("date_year")
139
+ .then(dash, match("[0-9]").repeat(2, 2).as("date_month"), dash, match("[0-9]").repeat(2, 2).as("date_day")));
140
+ rule("dated_identifier", () => rules["hash_prefix"]
141
+ .maybe()
142
+ .then(rules["publisher"], space.or(dot), rules["iso_date"].as("dated_date"), space.or(dot), digits.as("dated_seq")));
143
+ rule("research_library_identifier", () => rules["publisher"]
144
+ .then(space, str("Research Library").as("series"), space.then(str("("), match("[0-9]").repeat(4, 4).as("year"), str(")")).maybe()));
145
+ rule("legacy_edition", () => (str("r").or(str(" R")))
146
+ .then(match("[0-9]").repeat(1, 2).as("edition"), lowerLetter.as("edition_letter"))
147
+ .or(str("rev").then(space.maybe(), digits.as("edition_year")), (str("e").or(str(" E"))).then(match("[0-9]").repeat(1, 3).as("edition"), str("rev"), match("[A-Za-z]").repeat(3, 9).as("edition_month"), digits.as("edition_year")), str("e").then(match("[0-9]").repeat(4, 4).as("edition_year"), match("[0-9]").repeat(2, 2).as("edition_month").maybe()), str("rev").then(match("[A-Za-z]").repeat(3, 9).as("edition_month"), digits.as("edition_year"))));
148
+ rule("crpl_range", () => digits
149
+ .then(str("_"), digits, dash, digits, upperLetter.maybe())
150
+ .as("crpl_range"));
151
+ rule("report_number", () => rules["first_number"].then(str("_").then(digits.as("edition_year"))
152
+ .or(dash.then(monthAbbrev().as("edition_month"), digits.as("edition_year")),
153
+ // FIPS date: -1-Sep30/1977
154
+ dash.then(digits.as("fips_part"), dash, monthAbbrev().as("edition_month"), digits.as("edition_day"), slash, digits.as("edition_year")),
155
+ // Decimal: -2073.3
156
+ dash
157
+ .then(digits.as("decimal_base"), dot, digits.as("decimal_suffix"))
158
+ .as("decimal_number"),
159
+ // Letter: -1A / -197Ur
160
+ dash
161
+ .then(digits.as("letter_base"), (str("U").then(lowerLetter.as("letter_suffix_extra"))).or(upperLetter).as("letter_suffix"))
162
+ .as("letter_number"),
163
+ // Dash-separated letter: -4-B
164
+ dash
165
+ .then(digits.as("letter_base"), dash, monthAbbrev().absent(), upperLetter.as("letter_suffix"), letter.or(digit).absent())
166
+ .as("letter_number"),
167
+ // Edition dash-year
168
+ dash
169
+ .then(match("[0-9]").repeat(4, 4).as("dash_year"), space.or(dot).or(ref(rules, "part")).or(ref(rules, "crpl_range")).or(ref(rules, "second_number")).or(dash).absent())
170
+ .as("edition_dash_year"),
171
+ // Second number + edition dash-year
172
+ dash
173
+ .then(rules["second_number"], dash, match("[0-9]").repeat(4, 4).as("dash_year"), space.or(dot).or(ref(rules, "part")).or(ref(rules, "crpl_range")).or(ref(rules, "revision")).or(ref(rules, "draft")).absent())
174
+ .as("second_number_edition_year"),
175
+ // FIPS month+year after part
176
+ dash
177
+ .then(rules["second_number"], dash, monthAbbrev().as("edition_month"), digits.as("edition_year"), space
178
+ .or(dot)
179
+ .or(ref(rules, "part"))
180
+ .or(ref(rules, "crpl_range"))
181
+ .or(editionInner())
182
+ .or(ref(rules, "revision"))
183
+ .or(ref(rules, "draft"))
184
+ .absent())
185
+ .as("fips_month_year_after_part"),
186
+ // GCR multi-dash
187
+ dash.then(rules["second_number"], dash, digits.then(upperLetter.maybe()).as("part_number")),
188
+ // Dot-separated part
189
+ dot.then(rules["second_number"]),
190
+ // Dash + (crpl_range | second_number) + edition?
191
+ dash.then(rules["crpl_range"].or(rules["second_number"]), editionInner().maybe()), dash.then(editionInner()))
192
+ .maybe()));
193
+ rule("volume", () => space
194
+ .maybe()
195
+ .then(literalAlternation(["Vol. ", "Vol.", "v"]))
196
+ .then(digits
197
+ .then(literalAlternation(["a-l", "m-z", "A-L", "M-Z"]).maybe())
198
+ .then(upperLetter.repeat(0, 2))
199
+ .as("volume")));
200
+ rule("part", () => literalAlternation([" Part. ", " Part.", " Part "])
201
+ .or(space.maybe().then(literalAlternation(["pt", "p", "P"])))
202
+ .then(digits
203
+ .then((space.maybe().then(str("r"), digits)).maybe())
204
+ .then((str("add").then((str("e").then(digits)).maybe())).maybe())
205
+ .then((dash.then(digits)).maybe())
206
+ .as("part")));
207
+ rule("revision", () => space
208
+ .maybe()
209
+ .then(str("r").or(str("rev")), space.maybe(), monthAbbrev().as("revision_month"), digits.as("revision_year"))
210
+ .or(space
211
+ .maybe()
212
+ .then(str("r").or(str("rev")), digits.as("revision"), slash, digits.as("revision_year")), (str(" r").or(str("r"))).then(space.maybe(), match("[0-9]").repeat(4, 4).as("revision_year")), str("rev").then(space.maybe(), digits.as("revision_year")), literalAlternation([" rev ", "rev", " r", "r", " Rev. ", " Rev.", " Revision (r)"])
213
+ .as("revision_prefix")
214
+ .then(space.maybe(), (digits.then(letter.maybe())).or(letter.repeat(1, Infinity)).as("revision_id"))
215
+ .as("revision"), str(" r").then(anyChar.absent()).as("revision_standalone")));
216
+ rule("version", () => (space.or(dot))
217
+ .maybe()
218
+ .then(str("ver"), space.maybe(), digits.then(dot.then(digits).repeat(0, Infinity)).as("version"))
219
+ .or((str(" Ver. ").or(str(" Version "))).then(digits, dot, digits, (dot.then(digits)).maybe()).as("version"), (dash.or(space))
220
+ .maybe()
221
+ .then(str("v"), digits.then(dot, digits, (dot.then(digits)).maybe()).as("version"))));
222
+ rule("update", () => str("/Upd")
223
+ .as("update_prefix")
224
+ .or(space.maybe().then(str("/upd").or(str("-upd"))).as("update_prefix"))
225
+ .then(digits
226
+ .as("update_number")
227
+ .maybe()
228
+ .then(dash
229
+ .then(match("[0-9]").repeat(4, 4).as("update_year").then(match("[0-9]").repeat(2, 2).as("update_month")).or(match("[0-9]").repeat(4, Infinity).as("update_year")))
230
+ .maybe())
231
+ .as("update")));
232
+ rule("addendum", () => (str("-add").or(str(".add")).or(str(" Add.")))
233
+ .then((space.or(dash)).maybe(), digits.or(str("")).as("addendum_number"))
234
+ .as("addendum"));
235
+ rule("supplement", () => space
236
+ .maybe()
237
+ .then(str("supp").or(str("sup")))
238
+ .then(str("rev")
239
+ .as("supplement_with_rev")
240
+ .or(monthAbbrev()
241
+ .as("supp_month_start")
242
+ .then(digits.as("supp_year_start"), dash, monthAbbrev().as("supp_month_end"), digits.as("supp_year_end"))
243
+ .as("supplement_date_range"), monthAbbrev().as("supp_month").then(digits.as("supp_year")).as("supplement_date"), digits.as("supp_number").then(slash, digits.as("supp_year")).as("supplement_slash_year"), digits.as("supp_year"), match("[A-Za-z0-9]").repeat(1, Infinity).as("supplement_suffix"))
244
+ .maybe()));
245
+ rule("errata", () => dash.maybe().then(str("errata").or(str("err"))).as("errata"));
246
+ rule("index", () => str("index").or(str("indx")).as("index"));
247
+ rule("insert", () => str("insert").or(str("ins")).as("insert"));
248
+ rule("appendix", () => str("app").as("appendix"));
249
+ rule("section", () => str("sec").then(digits.as("section").maybe()));
250
+ rule("translation", () => str("(")
251
+ .then(match("\\w").repeat(3, 3).as("translation"), str(")"))
252
+ .or(space.then(match("\\w").repeat(3, 3).as("translation")), space.maybe().then(dot, match("\\w").repeat(3, 3).as("translation"))));
253
+ rule("pd_suffix", () => space.then(digits, str("pd")).as("public_draft"));
254
+ rule("draft", () => space
255
+ .then(str("(Draft)"))
256
+ .or(space.maybe().then(dash, str("draft"), (space.then(digits)).or(digits).maybe()), rules["pd_suffix"])
257
+ .as("draft"));
258
+ rule("fips_date", () => dash.then(digits.as("fips_part"), dash, monthAbbrev().as("fips_month"), digits.as("fips_day"), slash, digits.as("fips_year")));
259
+ rule("parts", () => rules["new_stage"].or(rules["section"], rules["index"], rules["insert"], rules["appendix"], rules["pd_suffix"], rules["edition"], rules["date"], rules["legacy_edition"], rules["revision"], rules["version"], rules["volume"], rules["part"], rules["update"], rules["addendum"], rules["supplement"], rules["errata"], rules["language_code"]));
260
+ rule("mr_identifier", () => rules["hash_prefix"]
261
+ .maybe()
262
+ .then(rules["publisher"], dot, rules["simple_series"],
263
+ // The catalogue also lists bare series identities with no
264
+ // report number ("NBS.CIRC").
265
+ dot.maybe(), rules["report_number"].maybe(), str("_").then(digits.as("edition_year")).maybe(), upperLetter.maybe(), rules["edition"].maybe(), rules["update"].maybe(), dot.then(digits.or(upperLetter)).repeat(0, 3), rules["parts"].repeat(0, Infinity), rules["draft"].maybe()));
266
+ rule("identifier", () => ref(rules, "circ_supplement_identifier").or(rules["dated_identifier"], rules["mr_identifier"], rules["research_library_identifier"], rules["compound_series"]
267
+ .then(space.or(dot), rules["old_stage"].maybe(), rules["report_number"].maybe(), rules["fips_date"].maybe(), rules["parts"].repeat(0, Infinity), rules["draft"].maybe(), rules["translation"].maybe(), rules["new_stage"].maybe()), rules["publisher"]
268
+ .then(space.or(dot), rules["simple_series"], rules["old_stage"].maybe(), space.or(dot), rules["report_number"].maybe(), rules["fips_date"].maybe(), rules["parts"].repeat(0, Infinity), rules["draft"].maybe(), rules["translation"].maybe(), rules["new_stage"].maybe()), rules["simple_series"]
269
+ .then(rules["old_stage"].maybe(), space.or(dot), rules["report_number"].maybe(), rules["fips_date"].maybe(), rules["parts"].repeat(0, Infinity), rules["draft"].maybe(), rules["translation"].maybe(), rules["new_stage"].maybe())));
270
+ rule("circ_supplement_identifier", () => literalAlternation(["NBS CIRC", "NBS LCIRC", "NBS.CIRC", "NBS.LCIRC"])
271
+ .as("series")
272
+ .then(space.or(dot))
273
+ .as("circ_series")
274
+ .then(str("supp")
275
+ .then(monthAbbrev().as("supp_month_start"), digits.as("supp_year_start"), dash, monthAbbrev().as("supp_month_end"), digits.as("supp_year_end"))
276
+ .as("supplement_date_range")
277
+ .or((str("supp").or(str("sup")))
278
+ .then(match("[0-9]").repeat(4, 4).as("supp_year_start"), dash, match("[0-9]").repeat(4, 4).as("supp_year_end"))
279
+ .as("supplement_date_range"), (digits.as("base_number").then(str("e"), digits.as("edition_number")).or(digits
280
+ .as("base_number")
281
+ .then(lowerLetter.as("revision_letter"), digits.as("revision_number")), digits.as("base_number").then(upperLetter.as("letter_suffix")), digits.as("simple_number")))
282
+ .as("base_portion")
283
+ .then(((str("supp").or(str("sup"))).then((monthAbbrev().then(digits).as("supplement_month_year").or(dash.then(digits.as("supp_number"), slash, digits.as("supp_year")).as("supplement_dash_slash_year"), dash.then(digits.as("supplement_year")), digits.as("supp_number").then(slash, digits.as("supp_year")).as("supplement_slash_year"), str("").as("supplement_empty"))).maybe())).or(slash.then(digits.as("implicit_supplement_year")).as("implicit_supplement"))))));
284
+ rule("root", () => rules["identifier"]);
285
+ return rules;
286
+ }
287
+ export const nistGrammar = { rules: buildRules(), root: "root" };
@@ -0,0 +1,2 @@
1
+ import type { FlavorImplementation } from "../../conformance/implementation.js";
2
+ export declare function nistGrammarImplementation(): FlavorImplementation;