@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.
- package/artifact/corpus.json.gz +0 -0
- package/dist/conformance/cli.js +5 -1
- package/dist/flavors/amca/grammar.d.ts +4 -0
- package/dist/flavors/amca/grammar.js +87 -0
- package/dist/flavors/amca/index.d.ts +4 -0
- package/dist/flavors/amca/index.js +76 -0
- package/dist/flavors/amca/model.d.ts +29 -0
- package/dist/flavors/amca/model.js +146 -0
- package/dist/flavors/ansi/index.d.ts +24 -0
- package/dist/flavors/ansi/index.js +147 -0
- package/dist/flavors/api/grammar.d.ts +4 -0
- package/dist/flavors/api/grammar.js +79 -0
- package/dist/flavors/api/index.d.ts +4 -0
- package/dist/flavors/api/index.js +71 -0
- package/dist/flavors/api/model.d.ts +27 -0
- package/dist/flavors/api/model.js +114 -0
- package/dist/flavors/ashrae/grammar.d.ts +2 -0
- package/dist/flavors/ashrae/grammar.js +667 -0
- package/dist/flavors/ashrae/index.d.ts +4 -0
- package/dist/flavors/ashrae/index.js +306 -0
- package/dist/flavors/ashrae/model.d.ts +87 -0
- package/dist/flavors/ashrae/model.js +335 -0
- package/dist/flavors/ashrae/preprocessor.d.ts +7 -0
- package/dist/flavors/ashrae/preprocessor.js +44 -0
- package/dist/flavors/asme/grammar.d.ts +2 -0
- package/dist/flavors/asme/grammar.js +200 -0
- package/dist/flavors/asme/index.d.ts +4 -0
- package/dist/flavors/asme/index.js +138 -0
- package/dist/flavors/asme/model.d.ts +34 -0
- package/dist/flavors/asme/model.js +123 -0
- package/dist/flavors/astm/grammar.d.ts +2 -0
- package/dist/flavors/astm/grammar.js +110 -0
- package/dist/flavors/astm/index.d.ts +2 -0
- package/dist/flavors/astm/index.js +127 -0
- package/dist/flavors/astm/model.d.ts +42 -0
- package/dist/flavors/astm/model.js +263 -0
- package/dist/flavors/bipm/index.d.ts +30 -0
- package/dist/flavors/bipm/index.js +434 -0
- package/dist/flavors/bsi/grammar.d.ts +4 -0
- package/dist/flavors/bsi/grammar.js +535 -0
- package/dist/flavors/bsi/index.d.ts +4 -0
- package/dist/flavors/bsi/index.js +941 -0
- package/dist/flavors/bsi/model.d.ts +127 -0
- package/dist/flavors/bsi/model.js +863 -0
- package/dist/flavors/calconnect/index.d.ts +21 -0
- package/dist/flavors/calconnect/index.js +113 -0
- package/dist/flavors/cen_cenelec/grammar.d.ts +4 -0
- package/dist/flavors/cen_cenelec/grammar.js +107 -0
- package/dist/flavors/cen_cenelec/index.d.ts +5 -0
- package/dist/flavors/cen_cenelec/index.js +263 -0
- package/dist/flavors/cen_cenelec/model.d.ts +45 -0
- package/dist/flavors/cen_cenelec/model.js +490 -0
- package/dist/flavors/cie/grammar.d.ts +5 -0
- package/dist/flavors/cie/grammar.js +127 -0
- package/dist/flavors/cie/index.d.ts +2 -0
- package/dist/flavors/cie/index.js +311 -0
- package/dist/flavors/cie/model.d.ts +122 -0
- package/dist/flavors/cie/model.js +464 -0
- package/dist/flavors/csa/grammar.d.ts +6 -0
- package/dist/flavors/csa/grammar.js +239 -0
- package/dist/flavors/csa/index.d.ts +2 -0
- package/dist/flavors/csa/index.js +634 -0
- package/dist/flavors/csa/model.d.ts +33 -0
- package/dist/flavors/csa/model.js +505 -0
- package/dist/flavors/doi/index.d.ts +13 -0
- package/dist/flavors/doi/index.js +65 -0
- package/dist/flavors/easc/index.d.ts +4 -0
- package/dist/flavors/easc/index.js +107 -0
- package/dist/flavors/ecma/index.d.ts +4 -0
- package/dist/flavors/ecma/index.js +117 -0
- package/dist/flavors/etsi/index.d.ts +14 -0
- package/dist/flavors/etsi/index.js +307 -0
- package/dist/flavors/evs/grammar.d.ts +2 -0
- package/dist/flavors/evs/grammar.js +22 -0
- package/dist/flavors/evs/index.d.ts +2 -0
- package/dist/flavors/evs/index.js +24 -0
- package/dist/flavors/evs/model.d.ts +19 -0
- package/dist/flavors/evs/model.js +36 -0
- package/dist/flavors/gb/index.d.ts +31 -0
- package/dist/flavors/gb/index.js +159 -0
- package/dist/flavors/gost/grammar.d.ts +2 -0
- package/dist/flavors/gost/grammar.js +46 -0
- package/dist/flavors/gost/index.d.ts +2 -0
- package/dist/flavors/gost/index.js +165 -0
- package/dist/flavors/gost/model.d.ts +61 -0
- package/dist/flavors/gost/model.js +147 -0
- package/dist/flavors/gost/prefix_routes.d.ts +15 -0
- package/dist/flavors/gost/prefix_routes.js +192 -0
- package/dist/flavors/iala/index.d.ts +32 -0
- package/dist/flavors/iala/index.js +300 -0
- package/dist/flavors/iana/index.d.ts +19 -0
- package/dist/flavors/iana/index.js +71 -0
- package/dist/flavors/idf/grammar.d.ts +2 -0
- package/dist/flavors/idf/grammar.js +71 -0
- package/dist/flavors/idf/index.d.ts +2 -0
- package/dist/flavors/idf/index.js +100 -0
- package/dist/flavors/idf/model.d.ts +54 -0
- package/dist/flavors/idf/model.js +359 -0
- package/dist/flavors/iec/grammar.d.ts +3 -0
- package/dist/flavors/iec/grammar.js +187 -0
- package/dist/flavors/iec/index.d.ts +4 -0
- package/dist/flavors/iec/index.js +507 -0
- package/dist/flavors/iec/model.d.ts +54 -0
- package/dist/flavors/iec/model.js +437 -0
- package/dist/flavors/ieee/grammar.d.ts +2 -0
- package/dist/flavors/ieee/grammar.js +697 -0
- package/dist/flavors/ieee/index.d.ts +3 -0
- package/dist/flavors/ieee/index.js +1258 -0
- package/dist/flavors/ieee/model.d.ts +144 -0
- package/dist/flavors/ieee/model.js +1237 -0
- package/dist/flavors/ieee/preprocessor.d.ts +8 -0
- package/dist/flavors/ieee/preprocessor.js +410 -0
- package/dist/flavors/ieee/update_codes.d.ts +8 -0
- package/dist/flavors/ieee/update_codes.js +197 -0
- package/dist/flavors/ietf/index.d.ts +30 -0
- package/dist/flavors/ietf/index.js +151 -0
- package/dist/flavors/iho/index.d.ts +4 -0
- package/dist/flavors/iho/index.js +126 -0
- package/dist/flavors/index.d.ts +9 -0
- package/dist/flavors/index.js +136 -0
- package/dist/flavors/isbn/index.d.ts +13 -0
- package/dist/flavors/isbn/index.js +97 -0
- package/dist/flavors/iso/grammar.d.ts +2 -0
- package/dist/flavors/iso/grammar.js +207 -0
- package/dist/flavors/iso/index.d.ts +2 -0
- package/dist/flavors/iso/index.js +343 -0
- package/dist/flavors/iso/model.d.ts +159 -0
- package/dist/flavors/iso/model.js +802 -0
- package/dist/flavors/iso/stages.generated.d.ts +13 -0
- package/dist/flavors/iso/stages.generated.js +391 -0
- package/dist/flavors/itu/grammar.d.ts +4 -0
- package/dist/flavors/itu/grammar.js +205 -0
- package/dist/flavors/itu/index.d.ts +2 -0
- package/dist/flavors/itu/index.js +224 -0
- package/dist/flavors/itu/model.d.ts +184 -0
- package/dist/flavors/itu/model.js +599 -0
- package/dist/flavors/jcgm/index.d.ts +7 -0
- package/dist/flavors/jcgm/index.js +300 -0
- package/dist/flavors/jis/index.d.ts +4 -0
- package/dist/flavors/jis/index.js +267 -0
- package/dist/flavors/nist/grammar.d.ts +2 -0
- package/dist/flavors/nist/grammar.js +287 -0
- package/dist/flavors/nist/index.d.ts +2 -0
- package/dist/flavors/nist/index.js +1244 -0
- package/dist/flavors/nist/model.d.ts +155 -0
- package/dist/flavors/nist/model.js +823 -0
- package/dist/flavors/nist/preprocessor.d.ts +11 -0
- package/dist/flavors/nist/preprocessor.js +281 -0
- package/dist/flavors/oasis/index.d.ts +23 -0
- package/dist/flavors/oasis/index.js +110 -0
- package/dist/flavors/ogc/index.d.ts +20 -0
- package/dist/flavors/ogc/index.js +75 -0
- package/dist/flavors/oiml/grammar.d.ts +2 -0
- package/dist/flavors/oiml/grammar.js +206 -0
- package/dist/flavors/oiml/implementation.d.ts +9 -0
- package/dist/flavors/oiml/implementation.js +45 -0
- package/dist/flavors/oiml/model.d.ts +23 -0
- package/dist/flavors/oiml/model.js +592 -0
- package/dist/flavors/omg/index.d.ts +14 -0
- package/dist/flavors/omg/index.js +73 -0
- package/dist/flavors/plateau/index.d.ts +4 -0
- package/dist/flavors/plateau/index.js +97 -0
- package/dist/flavors/tgpp/index.d.ts +4 -0
- package/dist/flavors/tgpp/index.js +122 -0
- package/dist/flavors/un/index.d.ts +13 -0
- package/dist/flavors/un/index.js +90 -0
- package/dist/flavors/w3c/index.d.ts +14 -0
- package/dist/flavors/w3c/index.js +148 -0
- package/dist/flavors/xsf/index.d.ts +18 -0
- package/dist/flavors/xsf/index.js +65 -0
- package/dist/grammar/engine.d.ts +78 -0
- package/dist/grammar/engine.js +351 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -0
- package/dist/model/attribute.d.ts +54 -0
- package/dist/model/attribute.js +53 -0
- package/dist/model/builder.d.ts +39 -0
- package/dist/model/builder.js +124 -0
- package/dist/model/component.d.ts +70 -0
- package/dist/model/component.js +170 -0
- package/dist/model/identifier.d.ts +84 -0
- package/dist/model/identifier.js +270 -0
- package/dist/model/urn-generator.d.ts +27 -0
- package/dist/model/urn-generator.js +91 -0
- 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" };
|