text-to-map 1.1.46 → 1.1.48
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/LICENSE +21 -21
- package/README.md +69 -69
- package/dist/bin/address-points.d.ts +1 -1
- package/dist/bin/address-points.js +16 -16
- package/dist/bin/cities.d.ts +1 -1
- package/dist/bin/cities.js +10 -10
- package/dist/bin/clear-all.d.ts +1 -1
- package/dist/bin/clear-all.js +13 -13
- package/dist/bin/constants.d.ts +2 -2
- package/dist/bin/constants.js +4 -4
- package/dist/bin/generate-syntax-diagrams.d.ts +1 -1
- package/dist/bin/generate-syntax-diagrams.js +20 -20
- package/dist/bin/init-db.d.ts +1 -1
- package/dist/bin/init-db.js +8 -8
- package/dist/bin/knex.d.ts +1 -1
- package/dist/bin/knex.js +10 -10
- package/dist/bin/parse-ordinance.d.ts +1 -1
- package/dist/bin/parse-ordinance.js +74 -74
- package/dist/bin/polygons.d.ts +1 -1
- package/dist/bin/polygons.js +27 -27
- package/dist/bin/regions.d.ts +1 -1
- package/dist/bin/regions.js +10 -10
- package/dist/bin/schools.d.ts +1 -1
- package/dist/bin/schools.js +10 -10
- package/dist/bin/streets.d.ts +1 -1
- package/dist/bin/streets.js +19 -19
- package/dist/bin/sync-all.d.ts +1 -1
- package/dist/bin/sync-all.js +4 -4
- package/dist/db/address-points.d.ts +59 -59
- package/dist/db/address-points.js +406 -399
- package/dist/db/cities.d.ts +7 -7
- package/dist/db/cities.js +95 -95
- package/dist/db/db.d.ts +45 -37
- package/dist/db/db.js +212 -191
- package/dist/db/founders.d.ts +14 -14
- package/dist/db/founders.js +461 -461
- package/dist/db/meta.d.ts +4 -4
- package/dist/db/meta.js +26 -26
- package/dist/db/migrations/20230704125715_initial.js +304 -304
- package/dist/db/migrations/20230731232915_city_positions.js +13 -13
- package/dist/db/migrations/20240106224603_city_polygon.js +11 -11
- package/dist/db/migrations/20240320200534_district_polygon.js +11 -11
- package/dist/db/migrations/20250316162700_kindergartens.js +12 -12
- package/dist/db/regions.d.ts +31 -31
- package/dist/db/regions.js +81 -81
- package/dist/db/schools.d.ts +7 -7
- package/dist/db/schools.js +95 -95
- package/dist/db/street-sync.d.ts +6 -6
- package/dist/db/street-sync.js +24 -22
- package/dist/db/sync-log.d.ts +9 -9
- package/dist/db/sync-log.js +66 -66
- package/dist/db/types.d.ts +59 -59
- package/dist/db/types.js +26 -26
- package/dist/index.d.ts +23 -23
- package/dist/index.js +32 -32
- package/dist/open-data-sync/address-points.d.ts +2 -2
- package/dist/open-data-sync/address-points.js +68 -68
- package/dist/open-data-sync/cities.d.ts +2 -2
- package/dist/open-data-sync/cities.js +32 -32
- package/dist/open-data-sync/common.d.ts +2 -2
- package/dist/open-data-sync/common.js +22 -22
- package/dist/open-data-sync/regions.d.ts +2 -2
- package/dist/open-data-sync/regions.js +37 -37
- package/dist/open-data-sync/schools.d.ts +3 -3
- package/dist/open-data-sync/schools.js +207 -207
- package/dist/open-data-sync/streets.d.ts +2 -2
- package/dist/open-data-sync/streets.js +132 -132
- package/dist/smd-to-csv/json-to-csv.d.ts +1 -1
- package/dist/smd-to-csv/json-to-csv.js +154 -154
- package/dist/smd-to-csv/ordinance-to-csv-rules.d.ts +1 -1
- package/dist/smd-to-csv/ordinance-to-csv-rules.js +23 -23
- package/dist/smd-to-csv/txt-to-json.d.ts +1 -1
- package/dist/smd-to-csv/txt-to-json.js +92 -92
- package/dist/souradnice.csv +6260 -6260
- package/dist/street-markdown/municipality.d.ts +11 -11
- package/dist/street-markdown/municipality.js +116 -116
- package/dist/street-markdown/polygons.d.ts +7 -7
- package/dist/street-markdown/polygons.js +261 -261
- package/dist/street-markdown/roman-numerals.d.ts +1 -1
- package/dist/street-markdown/roman-numerals.js +68 -68
- package/dist/street-markdown/smd-line-parser.d.ts +4 -4
- package/dist/street-markdown/smd-line-parser.js +40 -40
- package/dist/street-markdown/smd-parser.d.ts +23 -23
- package/dist/street-markdown/smd-parser.js +393 -393
- package/dist/street-markdown/smd.d.ts +24 -24
- package/dist/street-markdown/smd.js +440 -440
- package/dist/street-markdown/token-definition.d.ts +25 -25
- package/dist/street-markdown/token-definition.js +168 -168
- package/dist/street-markdown/types.d.ts +148 -148
- package/dist/street-markdown/types.js +13 -13
- package/dist/utils/atom.d.ts +2 -2
- package/dist/utils/atom.js +57 -57
- package/dist/utils/helpers.d.ts +28 -28
- package/dist/utils/helpers.js +176 -176
- package/dist/utils/jtsk2wgs84.d.ts +17 -17
- package/dist/utils/jtsk2wgs84.js +82 -82
- package/package.json +109 -109
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import { TokenVocabulary } from "chevrotain";
|
|
2
|
-
export declare const resetTokenState: () => void;
|
|
3
|
-
export declare const prepareLine: (text: string) => string;
|
|
4
|
-
export declare const nameMatcherFactory: (pattern: RegExp) => (text: string, startOffset: number) => RegExpExecArray | [string] | null;
|
|
5
|
-
export declare const streetNameMatcher: (text: string, startOffset: number) => RegExpExecArray | [string] | null;
|
|
6
|
-
declare const MainSeparator: import("chevrotain").TokenType;
|
|
7
|
-
declare const From: import("chevrotain").TokenType;
|
|
8
|
-
declare const To: import("chevrotain").TokenType;
|
|
9
|
-
declare const AndAbove: import("chevrotain").TokenType;
|
|
10
|
-
declare const AndBelow: import("chevrotain").TokenType;
|
|
11
|
-
declare const Separator: import("chevrotain").TokenType;
|
|
12
|
-
declare const DescriptiveType: import("chevrotain").TokenType;
|
|
13
|
-
declare const AllType: import("chevrotain").TokenType;
|
|
14
|
-
declare const OddType: import("chevrotain").TokenType;
|
|
15
|
-
declare const EvenType: import("chevrotain").TokenType;
|
|
16
|
-
declare const Without: import("chevrotain").TokenType;
|
|
17
|
-
declare const MunicipalityPartName: import("chevrotain").TokenType;
|
|
18
|
-
declare const StreetName: import("chevrotain").TokenType;
|
|
19
|
-
declare const Number: import("chevrotain").TokenType;
|
|
20
|
-
declare const Hyphen: import("chevrotain").TokenType;
|
|
21
|
-
declare const Slash: import("chevrotain").TokenType;
|
|
22
|
-
declare const Space: import("chevrotain").TokenType;
|
|
23
|
-
declare const smdTokens: import("chevrotain").TokenType[];
|
|
24
|
-
declare const tokenVocabulary: TokenVocabulary;
|
|
25
|
-
export { MainSeparator, Separator, OddType, EvenType, DescriptiveType, AllType, Number, From, To, AndAbove, AndBelow, Without, Hyphen, Slash, Space, StreetName, MunicipalityPartName, smdTokens, tokenVocabulary, };
|
|
1
|
+
import { TokenVocabulary } from "chevrotain";
|
|
2
|
+
export declare const resetTokenState: () => void;
|
|
3
|
+
export declare const prepareLine: (text: string) => string;
|
|
4
|
+
export declare const nameMatcherFactory: (pattern: RegExp) => (text: string, startOffset: number) => RegExpExecArray | [string] | null;
|
|
5
|
+
export declare const streetNameMatcher: (text: string, startOffset: number) => RegExpExecArray | [string] | null;
|
|
6
|
+
declare const MainSeparator: import("chevrotain").TokenType;
|
|
7
|
+
declare const From: import("chevrotain").TokenType;
|
|
8
|
+
declare const To: import("chevrotain").TokenType;
|
|
9
|
+
declare const AndAbove: import("chevrotain").TokenType;
|
|
10
|
+
declare const AndBelow: import("chevrotain").TokenType;
|
|
11
|
+
declare const Separator: import("chevrotain").TokenType;
|
|
12
|
+
declare const DescriptiveType: import("chevrotain").TokenType;
|
|
13
|
+
declare const AllType: import("chevrotain").TokenType;
|
|
14
|
+
declare const OddType: import("chevrotain").TokenType;
|
|
15
|
+
declare const EvenType: import("chevrotain").TokenType;
|
|
16
|
+
declare const Without: import("chevrotain").TokenType;
|
|
17
|
+
declare const MunicipalityPartName: import("chevrotain").TokenType;
|
|
18
|
+
declare const StreetName: import("chevrotain").TokenType;
|
|
19
|
+
declare const Number: import("chevrotain").TokenType;
|
|
20
|
+
declare const Hyphen: import("chevrotain").TokenType;
|
|
21
|
+
declare const Slash: import("chevrotain").TokenType;
|
|
22
|
+
declare const Space: import("chevrotain").TokenType;
|
|
23
|
+
declare const smdTokens: import("chevrotain").TokenType[];
|
|
24
|
+
declare const tokenVocabulary: TokenVocabulary;
|
|
25
|
+
export { MainSeparator, Separator, OddType, EvenType, DescriptiveType, AllType, Number, From, To, AndAbove, AndBelow, Without, Hyphen, Slash, Space, StreetName, MunicipalityPartName, smdTokens, tokenVocabulary, };
|
|
@@ -1,168 +1,168 @@
|
|
|
1
|
-
import { createToken, Lexer } from "chevrotain";
|
|
2
|
-
let nameWasMatched = false;
|
|
3
|
-
export const resetTokenState = () => {
|
|
4
|
-
nameWasMatched = false;
|
|
5
|
-
};
|
|
6
|
-
export const prepareLine = (text) => {
|
|
7
|
-
return text
|
|
8
|
-
.replace(/([IVXLCDM]+) - ([IVXLCDM]+)/, "$1-$2")
|
|
9
|
-
.replace(/;/g, ",")
|
|
10
|
-
.replace(/,$/, "");
|
|
11
|
-
};
|
|
12
|
-
// this function prevents numbers that make part of the street name to be matched before the
|
|
13
|
-
// street/municipality part name is completely matched
|
|
14
|
-
const tokenBlockerFactory = (pattern) => {
|
|
15
|
-
const stickyPattern = new RegExp(pattern, "y");
|
|
16
|
-
return (text, startOffset) => {
|
|
17
|
-
if (nameWasMatched) {
|
|
18
|
-
stickyPattern.lastIndex = startOffset;
|
|
19
|
-
return stickyPattern.exec(text);
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
return null;
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
};
|
|
26
|
-
const interruptPatterns = [
|
|
27
|
-
"lichá",
|
|
28
|
-
"sudá",
|
|
29
|
-
"č.",
|
|
30
|
-
"od",
|
|
31
|
-
"do",
|
|
32
|
-
"pouze",
|
|
33
|
-
"všechna",
|
|
34
|
-
"bez",
|
|
35
|
-
"vyjma",
|
|
36
|
-
"mimo",
|
|
37
|
-
"s výjimkou",
|
|
38
|
-
"kromě",
|
|
39
|
-
];
|
|
40
|
-
// this pattern allows a single space or a single hyphen (without an adjacent space) between words
|
|
41
|
-
const streetNamePattern = /[^ -]+([ -]?[^ -]+)*/;
|
|
42
|
-
// same but with a prefix of municipality part
|
|
43
|
-
const municipalityPartNamePattern = /část (obce|města) [^ -]+([ -]?[^ -]+)*/;
|
|
44
|
-
export const nameMatcherFactory = (pattern) => {
|
|
45
|
-
return (text, startOffset) => {
|
|
46
|
-
if (nameWasMatched || startOffset > 0) {
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
const result = pattern.exec(text);
|
|
51
|
-
if (result !== null) {
|
|
52
|
-
nameWasMatched = true;
|
|
53
|
-
const firstIndex = interruptPatterns.reduce((currentMin, pattern) => {
|
|
54
|
-
const index = text.search(new RegExp(` ${pattern}( |$)`));
|
|
55
|
-
return index >= 0 ? Math.min(index, currentMin) : currentMin;
|
|
56
|
-
}, Infinity);
|
|
57
|
-
if (firstIndex < Infinity) {
|
|
58
|
-
return [result[0].substring(0, firstIndex).trim()];
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return result;
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
};
|
|
65
|
-
export const streetNameMatcher = nameMatcherFactory(streetNamePattern);
|
|
66
|
-
const MainSeparator = createToken({ name: "MainSeparator", pattern: / - / });
|
|
67
|
-
const From = createToken({ name: "From", pattern: /od/ });
|
|
68
|
-
const To = createToken({ name: "To", pattern: /do/ });
|
|
69
|
-
const AndAbove = createToken({
|
|
70
|
-
name: "AndAbove",
|
|
71
|
-
pattern: / (a )?(výše?|vyšší)/,
|
|
72
|
-
});
|
|
73
|
-
const AndBelow = createToken({
|
|
74
|
-
name: "AndBelow",
|
|
75
|
-
pattern: / a (níže?|nižší)/,
|
|
76
|
-
});
|
|
77
|
-
const Separator = createToken({
|
|
78
|
-
name: "Separator",
|
|
79
|
-
pattern: /,| a /,
|
|
80
|
-
longer_alt: [AndAbove, AndBelow],
|
|
81
|
-
});
|
|
82
|
-
const DescriptiveType = createToken({
|
|
83
|
-
name: "CPType",
|
|
84
|
-
pattern: /(pouze |všechna )?č. ?p./,
|
|
85
|
-
});
|
|
86
|
-
const AllType = createToken({
|
|
87
|
-
name: "AllType",
|
|
88
|
-
pattern: /(pouze |všechna )?(č(\.|ísla)( ?o\.)?|lichá i sudá)/,
|
|
89
|
-
longer_alt: DescriptiveType,
|
|
90
|
-
});
|
|
91
|
-
const OddType = createToken({
|
|
92
|
-
name: "OddType",
|
|
93
|
-
pattern: /(pouze |všechna )?(lich([áé]|ých)( č(\.|ísla))?( ?o\.)?|č(\.|ísla)( ?o\.)? lich[áé])/,
|
|
94
|
-
longer_alt: AllType,
|
|
95
|
-
});
|
|
96
|
-
const EvenType = createToken({
|
|
97
|
-
name: "EvenType",
|
|
98
|
-
pattern: /(pouze |všechna )?(sud([áé]|ých)( č(\.|ísla))?( ?o\.)?|č(\.|ísla)( ?o\.)? sud[áé])/,
|
|
99
|
-
});
|
|
100
|
-
const Without = createToken({
|
|
101
|
-
name: "Without",
|
|
102
|
-
pattern: /bez|vyjma|mimo|s výjimkou|kromě/,
|
|
103
|
-
});
|
|
104
|
-
const MunicipalityPartName = createToken({
|
|
105
|
-
name: "MunicipalityPartName",
|
|
106
|
-
pattern: nameMatcherFactory(municipalityPartNamePattern),
|
|
107
|
-
});
|
|
108
|
-
const StreetName = createToken({
|
|
109
|
-
name: "StreetName",
|
|
110
|
-
pattern: nameMatcherFactory(streetNamePattern),
|
|
111
|
-
});
|
|
112
|
-
const Number = createToken({
|
|
113
|
-
name: "Number",
|
|
114
|
-
pattern: tokenBlockerFactory(/\d+[a-zA-Z]?/),
|
|
115
|
-
});
|
|
116
|
-
const Hyphen = createToken({ name: "Hyphen", pattern: /-|až/ });
|
|
117
|
-
const Slash = createToken({ name: "Hyphen", pattern: /\// });
|
|
118
|
-
const Space = createToken({
|
|
119
|
-
name: "Space",
|
|
120
|
-
pattern: / +/,
|
|
121
|
-
longer_alt: [MainSeparator, Separator],
|
|
122
|
-
group: Lexer.SKIPPED,
|
|
123
|
-
});
|
|
124
|
-
// const Colon = createToken({
|
|
125
|
-
// name: "Colon",
|
|
126
|
-
// pattern: /:/,
|
|
127
|
-
// group: Lexer.SKIPPED,
|
|
128
|
-
// });
|
|
129
|
-
const smdTokens = [
|
|
130
|
-
MainSeparator,
|
|
131
|
-
Separator,
|
|
132
|
-
OddType,
|
|
133
|
-
EvenType,
|
|
134
|
-
DescriptiveType,
|
|
135
|
-
AllType,
|
|
136
|
-
Number,
|
|
137
|
-
From,
|
|
138
|
-
To,
|
|
139
|
-
AndAbove,
|
|
140
|
-
AndBelow,
|
|
141
|
-
Without,
|
|
142
|
-
Hyphen,
|
|
143
|
-
Slash,
|
|
144
|
-
Space,
|
|
145
|
-
// Colon,
|
|
146
|
-
MunicipalityPartName,
|
|
147
|
-
StreetName,
|
|
148
|
-
];
|
|
149
|
-
MainSeparator.LABEL = "' - '";
|
|
150
|
-
Separator.LABEL = "','";
|
|
151
|
-
Hyphen.LABEL = "'-'";
|
|
152
|
-
Slash.LABEL = "'/'";
|
|
153
|
-
From.LABEL = "'od'";
|
|
154
|
-
To.LABEL = "'do'";
|
|
155
|
-
AndAbove.LABEL = "'a výše'";
|
|
156
|
-
AndBelow.LABEL = "'a níže'";
|
|
157
|
-
Space.LABEL = "' '";
|
|
158
|
-
OddType.LABEL = "'lichá č.'";
|
|
159
|
-
EvenType.LABEL = "'sudá č.'";
|
|
160
|
-
DescriptiveType.LABEL = "'č. p.'";
|
|
161
|
-
AllType.LABEL = "'č.'";
|
|
162
|
-
Without.LABEL = "'bez'";
|
|
163
|
-
const tokenVocabulary = {};
|
|
164
|
-
smdTokens.forEach((tokenType) => {
|
|
165
|
-
tokenVocabulary[tokenType.name] = tokenType;
|
|
166
|
-
});
|
|
167
|
-
export { MainSeparator, Separator, OddType, EvenType, DescriptiveType, AllType, Number, From, To, AndAbove, AndBelow, Without, Hyphen, Slash, Space, StreetName, MunicipalityPartName, smdTokens, tokenVocabulary, };
|
|
168
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tZGVmaW5pdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlZXQtbWFya2Rvd24vdG9rZW4tZGVmaW5pdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBbUIsTUFBTSxZQUFZLENBQUM7QUFFakUsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDO0FBRTNCLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxHQUFTLEVBQUU7SUFDeEMsY0FBYyxHQUFHLEtBQUssQ0FBQztBQUN6QixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRTtJQUMxQyxPQUFPLElBQUk7U0FDUixPQUFPLENBQUMsNkJBQTZCLEVBQUUsT0FBTyxDQUFDO1NBQy9DLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1NBQ2xCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDdkIsQ0FBQyxDQUFDO0FBRUYsNEZBQTRGO0FBQzVGLHNEQUFzRDtBQUN0RCxNQUFNLG1CQUFtQixHQUFHLENBQzFCLE9BQWUsRUFDa0QsRUFBRTtJQUNuRSxNQUFNLGFBQWEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDL0MsT0FBTyxDQUFDLElBQVksRUFBRSxXQUFtQixFQUEwQixFQUFFO1FBQ25FLElBQUksY0FBYyxFQUFFO1lBQ2xCLGFBQWEsQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDO1lBQ3RDLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQzthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUM7U0FDYjtJQUNILENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLE1BQU0saUJBQWlCLEdBQUc7SUFDeEIsT0FBTztJQUNQLE1BQU07SUFDTixJQUFJO0lB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OUIsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUM7QUFDOUMsQ0FBQyxDQUFDLENBQUM7QUFFSCxPQUFPLEVBQ0wsYUFBYSxFQUNiLFNBQVMsRUFDVCxPQUFPLEVBQ1AsUUFBUSxFQUNSLGVBQWUsRUFDZixPQUFPLEVBQ1AsTUFBTSxFQUNOLElBQUksRUFDSixFQUFFLEVBQ0YsUUFBUSxFQUNSLFFBQVEsRUFDUixPQUFPLEVBQ1AsTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQ0wsVUFBVSxFQUNWLG9CQUFvQixFQUNwQixTQUFTLEVBQ1QsZUFBZSxHQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlVG9rZW4sIExleGVyLCBUb2tlblZvY2FidWxhcnkgfSBmcm9tIFwiY2hldnJvdGFpblwiO1xyXG5cclxubGV0IG5hbWVXYXNNYXRjaGVkID0gZmFsc2U7XHJcblxyXG5leHBvcnQgY29uc3QgcmVzZXRUb2tlblN0YXRlID0gKCk6IHZvaWQgPT4ge1xyXG4gIG5hbWVXYXNNYXRjaGVkID0gZmFsc2U7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgcHJlcGFyZUxpbmUgPSAodGV4dDogc3RyaW5nKSA9PiB7XHJcbiAgcmV0dXJuIHRleHRcclxuICAgIC5yZXBsYWNlKC8oW0lWWExDRE1dKykgLSAoW0lWWExDRE1dKykvLCBcIiQxLSQyXCIpXHJcbiAgICAucmVwbGFjZSgvOy9nLCBcIixcIilcclxuICAgIC5yZXBsYWNlKC8sJC8sIFwiXCIpO1xyXG59O1xyXG5cclxuLy8gdGhpcyBmdW5jdGlvbiBwcmV2ZW50cyBudW1iZXJzIHRoYXQgbWFrZSBwYXJ0IG9mIHRoZSBzdHJlZXQgbmFtZSB0byBiZSBtYXRjaGVkIGJlZm9yZSB0aGVcclxuLy8gc3RyZWV0L211bmljaXBhbGl0eSBwYXJ0IG5hbWUgaXMgY29tcGxldGVseSBtYXRjaGVkXHJcbmNvbnN0IHRva2VuQmxvY2tlckZhY3RvcnkgPSAoXHJcbiAgcGF0dGVybjogUmVnRXhwXHJcbik6ICgodGV4dDogc3RyaW5nLCBzdGFydE9mZnNldDogbnVtYmVyKSA9PiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsKSA9PiB7XHJcbiAgY29uc3Qgc3RpY2t5UGF0dGVybiA9IG5ldyBSZWdFeHAocGF0dGVybiwgXCJ5XCIpO1xyXG4gIHJldHVybiAodGV4dDogc3RyaW5nLCBzdGFydE9mZnNldDogbnVtYmVyKTogUmVnRXhwRXhlY0FycmF5IHwgbnVsbCA9PiB7XHJcbiAgICBpZiAobmFtZVdhc01hdGNoZWQpIHtcclxuICAgICAgc3RpY2t5UGF0dGVybi5sYXN0SW5kZXggPSBzdGFydE9mZnNldDtcclxuICAgICAgcmV0dXJuIHN0aWNreVBhdHRlcm4uZXhlYyh0ZXh0KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH07XHJcbn07XHJcblxyXG5jb25zdCBpbnRlcnJ1cHRQYXR0ZXJucyA9IFtcclxuICBcImxpY2jDoVwiLFxyXG4gIFwic3Vkw6FcIixcclxuICBcIsSNLlwiLFxyXG4gIFwib2RcIixcclxuICBcImRvXCIsXHJcbiAgXCJwb3V6ZVwiLFxyXG4gIFwidsWhZWNobmFcIixcclxuICBcImJlelwiLFxyXG4gIFwidnlqbWFcIixcclxuICBcIm1pbW9cIixcclxuICBcInMgdsO9amlta291XCIsXHJcbiAgXCJrcm9txJtcIixcclxuXTtcclxuLy8gdGhpcyBwYXR0ZXJuIGFsbG93cyBhIHNpbmdsZSBzcGFjZSBvciBhIHNpbmdsZSBoeXBoZW4gKHdpdGhvdXQgYW4gYWRqYWNlbnQgc3BhY2UpIGJldHdlZW4gd29yZHNcclxuY29uc3Qgc3RyZWV0TmFtZVBhdHRlcm4gPSAvW14gLV0rKFsgLV0/W14gLV0rKSovO1xyXG5cclxuLy8gc2FtZSBidXQgd2l0aCBhIHByZWZpeCBvZiBtdW5pY2lwYWxpdHkgcGFydFxyXG5jb25zdCBtdW5pY2lwYWxpdHlQYXJ0TmFtZVBhdHRlcm4gPSAvxI3DoXN0IChvYmNlfG3Em3N0YSkgW14gLV0rKFsgLV0/W14gLV0rKSovO1xyXG5cclxuZXhwb3J0IGNvbnN0IG5hbWVNYXRjaGVyRmFjdG9yeSA9IChwYXR0ZXJuOiBSZWdFeHApID0+IHtcclxuICByZXR1cm4gKFxyXG4gICAgdGV4dDogc3RyaW5nLFxyXG4gICAgc3RhcnRPZmZzZXQ6IG51bWJlclxyXG4gICk6IFJlZ0V4cEV4ZWNBcnJheSB8IFtzdHJpbmddIHwgbnVsbCA9PiB7XHJcbiAgICBpZiAobmFtZVdhc01hdGNoZWQgfHwgc3RhcnRPZmZzZXQgPiAwKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gcGF0dGVybi5leGVjKHRleHQpO1xyXG4gICAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB7XHJcbiAgICAgICAgbmFtZVdhc01hdGNoZWQgPSB0cnVlO1xyXG4gICAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSBpbnRlcnJ1cHRQYXR0ZXJucy5yZWR1Y2UoXHJcbiAgICAgICAgICAoY3VycmVudE1pbjogbnVtYmVyLCBwYXR0ZXJuOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0ZXh0LnNlYXJjaChuZXcgUmVnRXhwKGAgJHtwYXR0ZXJufSggfCQpYCkpO1xyXG4gICAgICAgICAgICByZXR1cm4gaW5kZXggPj0gMCA/IE1hdGgubWluKGluZGV4LCBjdXJyZW50TWluKSA6IGN1cnJlbnRNaW47XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgSW5maW5pdHlcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChmaXJzdEluZGV4IDwgSW5maW5pdHkpIHtcclxuICAgICAgICAgIHJldHVybiBbcmVzdWx0WzBdLnN1YnN0cmluZygwLCBmaXJzdEluZGV4KS50cmltKCldO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gIH07XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3Qgc3RyZWV0TmFtZU1hdGNoZXIgPSBuYW1lTWF0Y2hlckZhY3Rvcnkoc3RyZWV0TmFtZVBhdHRlcm4pO1xyXG5cclxuY29uc3QgTWFpblNlcGFyYXRvciA9IGNyZWF0ZVRva2VuKHsgbmFtZTogXCJNYWluU2VwYXJhdG9yXCIsIHBhdHRlcm46IC8gLSAvIH0pO1xyXG5jb25zdCBGcm9tID0gY3JlYXRlVG9rZW4oeyBuYW1lOiBcIkZyb21cIiwgcGF0dGVybjogL29kLyB9KTtcclxuY29uc3QgVG8gPSBjcmVhdGVUb2tlbih7IG5hbWU6IFwiVG9cIiwgcGF0dGVybjogL2RvLyB9KTtcclxuY29uc3QgQW5kQWJvdmUgPSBjcmVhdGVUb2tlbih7XHJcbiAgbmFtZTogXCJBbmRBYm92ZVwiLFxyXG4gIHBhdHRlcm46IC8gKGEgKT8odsO9xaFlP3x2ecWhxaHDrSkvLFxyXG59KTtcclxuY29uc3QgQW5kQmVsb3cgPSBjcmVhdGVUb2tlbih7XHJcbiAgbmFtZTogXCJBbmRCZWxvd1wiLFxyXG4gIHBhdHRlcm46IC8gYSAobsOtxb5lP3xuacW+xaHDrSkvLFxyXG59KTtcclxuY29uc3QgU2VwYXJhdG9yID0gY3JlYXRlVG9rZW4oe1xyXG4gIG5hbWU6IFwiU2VwYXJhdG9yXCIsXHJcbiAgcGF0dGVybjogLyx8IGEgLyxcclxuICBsb25nZXJfYWx0OiBbQW5kQWJvdmUsIEFuZEJlbG93XSxcclxufSk7XHJcbmNvbnN0IERlc2NyaXB0aXZlVHlwZSA9IGNyZWF0ZVRva2VuKHtcclxuICBuYW1lOiBcIkNQVHlwZVwiLFxyXG4gIHBhdHRlcm46IC8ocG91emUgfHbFoWVjaG5hICk/xI0uID9wLi8sXHJcbn0pO1xyXG5jb25zdCBBbGxUeXBlID0gY3JlYXRlVG9rZW4oe1xyXG4gIG5hbWU6IFwiQWxsVHlwZVwiLFxyXG4gIHBhdHRlcm46IC8ocG91emUgfHbFoWVjaG5hICk/KMSNKFxcLnzDrXNsYSkoID9vXFwuKT98bGljaMOhIGkgc3Vkw6EpLyxcclxuICBsb25nZXJfYWx0OiBEZXNjcmlwdGl2ZVR5cGUsXHJcbn0pO1xyXG5jb25zdCBPZGRUeXBlID0gY3JlYXRlVG9rZW4oe1xyXG4gIG5hbWU6IFwiT2RkVHlwZVwiLFxyXG4gIHBhdHRlcm46XHJcbiAgICAvKHBvdXplIHx2xaFlY2huYSApPyhsaWNoKFvDocOpXXzDvWNoKSggxI0oXFwufMOtc2xhKSk/KCA/b1xcLik/fMSNKFxcLnzDrXNsYSkoID9vXFwuKT8gbGljaFvDocOpXSkvLFxyXG4gIGxvbmdlcl9hbHQ6IEFsbFR5cGUsXHJcbn0pO1xyXG5jb25zdCBFdmVuVHlwZSA9IGNyZWF0ZVRva2VuKHtcclxuICBuYW1lOiBcIkV2ZW5UeXBlXCIsXHJcbiAgcGF0dGVybjpcclxuICAgIC8ocG91emUgfHbFoWVjaG5hICk/KHN1ZChbw6HDqV18w71jaCkoIMSNKFxcLnzDrXNsYSkpPyggP29cXC4pP3zEjShcXC58w61zbGEpKCA/b1xcLik/IHN1ZFvDocOpXSkvLFxyXG59KTtcclxuY29uc3QgV2l0aG91dCA9IGNyZWF0ZVRva2VuKHtcclxuICBuYW1lOiBcIldpdGhvdXRcIixcclxuICBwYXR0ZXJuOiAvYmV6fHZ5am1hfG1pbW98cyB2w71qaW1rb3V8a3JvbcSbLyxcclxufSk7XHJcbmNvbnN0IE11bmljaXBhbGl0eVBhcnROYW1lID0gY3JlYXRlVG9rZW4oe1xyXG4gIG5hbWU6IFwiTXVuaWNpcGFsaXR5UGFydE5hbWVcIixcclxuICBwYXR0ZXJuOiBuYW1lTWF0Y2hlckZhY3RvcnkobXVuaWNpcGFsaXR5UGFydE5hbWVQYXR0ZXJuKSxcclxufSk7XHJcbmNvbnN0IFN0cmVldE5hbWUgPSBjcmVhdGVUb2tlbih7XHJcbiAgbmFtZTogXCJTdHJlZXROYW1lXCIsXHJcbiAgcGF0dGVybjogbmFtZU1hdGNoZXJGYWN0b3J5KHN0cmVldE5hbWVQYXR0ZXJuKSxcclxufSk7XHJcblxyXG5jb25zdCBOdW1iZXIgPSBjcmVhdGVUb2tlbih7XHJcbiAgbmFtZTogXCJOdW1iZXJcIixcclxuICBwYXR0ZXJuOiB0b2tlbkJsb2NrZXJGYWN0b3J5KC9cXGQrW2EtekEtWl0/LyksXHJcbn0pO1xyXG5jb25zdCBIeXBoZW4gPSBjcmVhdGVUb2tlbih7IG5hbWU6IFwiSHlwaGVuXCIsIHBhdHRlcm46IC8tfGHFvi8gfSk7XHJcbmNvbnN0IFNsYXNoID0gY3JlYXRlVG9rZW4oeyBuYW1lOiBcIkh5cGhlblwiLCBwYXR0ZXJuOiAvXFwvLyB9KTtcclxuY29uc3QgU3BhY2UgPSBjcmVhdGVUb2tlbih7XHJcbiAgbmFtZTogXCJTcGFjZVwiLFxyXG4gIHBhdHRlcm46IC8gKy8sXHJcbiAgbG9uZ2VyX2FsdDogW01haW5TZXBhcmF0b3IsIFNlcGFyYXRvcl0sXHJcbiAgZ3JvdXA6IExleGVyLlNLSVBQRUQsXHJcbn0pO1xyXG4vLyBjb25zdCBDb2xvbiA9IGNyZWF0ZVRva2VuKHtcclxuLy8gICBuYW1lOiBcIkNvbG9uXCIsXHJcbi8vICAgcGF0dGVybjogLzovLFxyXG4vLyAgIGdyb3VwOiBMZXhlci5TS0lQUEVELFxyXG4vLyB9KTtcclxuXHJcbmNvbnN0IHNtZFRva2VucyA9IFtcclxuICBNYWluU2VwYXJhdG9yLFxyXG4gIFNlcGFyYXRvcixcclxuICBPZGRUeXBlLFxyXG4gIEV2ZW5UeXBlLFxyXG4gIERlc2NyaXB0aXZlVHlwZSxcclxuICBBbGxUeXBlLFxyXG4gIE51bWJlcixcclxuICBGcm9tLFxyXG4gIFRvLFxyXG4gIEFuZEFib3ZlLFxyXG4gIEFuZEJlbG93LFxyXG4gIFdpdGhvdXQsXHJcbiAgSHlwaGVuLFxyXG4gIFNsYXNoLFxyXG4gIFNwYWNlLFxyXG4gIC8vIENvbG9uLFxyXG4gIE11bmljaXBhbGl0eVBhcnROYW1lLFxyXG4gIFN0cmVldE5hbWUsXHJcbl07XHJcblxyXG5NYWluU2VwYXJhdG9yLkxBQkVMID0gXCInIC0gJ1wiO1xyXG5TZXBhcmF0b3IuTEFCRUwgPSBcIicsJ1wiO1xyXG5IeXBoZW4uTEFCRUwgPSBcIictJ1wiO1xyXG5TbGFzaC5MQUJFTCA9IFwiJy8nXCI7XHJcbkZyb20uTEFCRUwgPSBcIidvZCdcIjtcclxuVG8uTEFCRUwgPSBcIidkbydcIjtcclxuQW5kQWJvdmUuTEFCRUwgPSBcIidhIHbDvcWhZSdcIjtcclxuQW5kQmVsb3cuTEFCRUwgPSBcIidhIG7DrcW+ZSdcIjtcclxuU3BhY2UuTEFCRUwgPSBcIicgJ1wiO1xyXG5PZGRUeXBlLkxBQkVMID0gXCInbGljaMOhIMSNLidcIjtcclxuRXZlblR5cGUuTEFCRUwgPSBcIidzdWTDoSDEjS4nXCI7XHJcbkRlc2NyaXB0aXZlVHlwZS5MQUJFTCA9IFwiJ8SNLiBwLidcIjtcclxuQWxsVHlwZS5MQUJFTCA9IFwiJ8SNLidcIjtcclxuV2l0aG91dC5MQUJFTCA9IFwiJ2JleidcIjtcclxuXHJcbmNvbnN0IHRva2VuVm9jYWJ1bGFyeTogVG9rZW5Wb2NhYnVsYXJ5ID0ge307XHJcblxyXG5zbWRUb2tlbnMuZm9yRWFjaCgodG9rZW5UeXBlKSA9PiB7XHJcbiAgdG9rZW5Wb2NhYnVsYXJ5W3Rva2VuVHlwZS5uYW1lXSA9IHRva2VuVHlwZTtcclxufSk7XHJcblxyXG5leHBvcnQge1xyXG4gIE1haW5TZXBhcmF0b3IsXHJcbiAgU2VwYXJhdG9yLFxyXG4gIE9kZFR5cGUsXHJcbiAgRXZlblR5cGUsXHJcbiAgRGVzY3JpcHRpdmVUeXBlLFxyXG4gIEFsbFR5cGUsXHJcbiAgTnVtYmVyLFxyXG4gIEZyb20sXHJcbiAgVG8sXHJcbiAgQW5kQWJvdmUsXHJcbiAgQW5kQmVsb3csXHJcbiAgV2l0aG91dCxcclxuICBIeXBoZW4sXHJcbiAgU2xhc2gsXHJcbiAgU3BhY2UsXHJcbiAgU3RyZWV0TmFtZSxcclxuICBNdW5pY2lwYWxpdHlQYXJ0TmFtZSxcclxuICBzbWRUb2tlbnMsXHJcbiAgdG9rZW5Wb2NhYnVsYXJ5LFxyXG59O1xyXG4iXX0=
|
|
1
|
+
import { createToken, Lexer } from "chevrotain";
|
|
2
|
+
let nameWasMatched = false;
|
|
3
|
+
export const resetTokenState = () => {
|
|
4
|
+
nameWasMatched = false;
|
|
5
|
+
};
|
|
6
|
+
export const prepareLine = (text) => {
|
|
7
|
+
return text
|
|
8
|
+
.replace(/([IVXLCDM]+) - ([IVXLCDM]+)/, "$1-$2")
|
|
9
|
+
.replace(/;/g, ",")
|
|
10
|
+
.replace(/,$/, "");
|
|
11
|
+
};
|
|
12
|
+
// this function prevents numbers that make part of the street name to be matched before the
|
|
13
|
+
// street/municipality part name is completely matched
|
|
14
|
+
const tokenBlockerFactory = (pattern) => {
|
|
15
|
+
const stickyPattern = new RegExp(pattern, "y");
|
|
16
|
+
return (text, startOffset) => {
|
|
17
|
+
if (nameWasMatched) {
|
|
18
|
+
stickyPattern.lastIndex = startOffset;
|
|
19
|
+
return stickyPattern.exec(text);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
const interruptPatterns = [
|
|
27
|
+
"lichá",
|
|
28
|
+
"sudá",
|
|
29
|
+
"č.",
|
|
30
|
+
"od",
|
|
31
|
+
"do",
|
|
32
|
+
"pouze",
|
|
33
|
+
"všechna",
|
|
34
|
+
"bez",
|
|
35
|
+
"vyjma",
|
|
36
|
+
"mimo",
|
|
37
|
+
"s výjimkou",
|
|
38
|
+
"kromě",
|
|
39
|
+
];
|
|
40
|
+
// this pattern allows a single space or a single hyphen (without an adjacent space) between words
|
|
41
|
+
const streetNamePattern = /[^ -]+([ -]?[^ -]+)*/;
|
|
42
|
+
// same but with a prefix of municipality part
|
|
43
|
+
const municipalityPartNamePattern = /část (obce|města) [^ -]+([ -]?[^ -]+)*/;
|
|
44
|
+
export const nameMatcherFactory = (pattern) => {
|
|
45
|
+
return (text, startOffset) => {
|
|
46
|
+
if (nameWasMatched || startOffset > 0) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
const result = pattern.exec(text);
|
|
51
|
+
if (result !== null) {
|
|
52
|
+
nameWasMatched = true;
|
|
53
|
+
const firstIndex = interruptPatterns.reduce((currentMin, pattern) => {
|
|
54
|
+
const index = text.search(new RegExp(` ${pattern}( |$)`));
|
|
55
|
+
return index >= 0 ? Math.min(index, currentMin) : currentMin;
|
|
56
|
+
}, Infinity);
|
|
57
|
+
if (firstIndex < Infinity) {
|
|
58
|
+
return [result[0].substring(0, firstIndex).trim()];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
export const streetNameMatcher = nameMatcherFactory(streetNamePattern);
|
|
66
|
+
const MainSeparator = createToken({ name: "MainSeparator", pattern: / - / });
|
|
67
|
+
const From = createToken({ name: "From", pattern: /od/ });
|
|
68
|
+
const To = createToken({ name: "To", pattern: /do/ });
|
|
69
|
+
const AndAbove = createToken({
|
|
70
|
+
name: "AndAbove",
|
|
71
|
+
pattern: / (a )?(výše?|vyšší)/,
|
|
72
|
+
});
|
|
73
|
+
const AndBelow = createToken({
|
|
74
|
+
name: "AndBelow",
|
|
75
|
+
pattern: / a (níže?|nižší)/,
|
|
76
|
+
});
|
|
77
|
+
const Separator = createToken({
|
|
78
|
+
name: "Separator",
|
|
79
|
+
pattern: /,| a /,
|
|
80
|
+
longer_alt: [AndAbove, AndBelow],
|
|
81
|
+
});
|
|
82
|
+
const DescriptiveType = createToken({
|
|
83
|
+
name: "CPType",
|
|
84
|
+
pattern: /(pouze |všechna )?č. ?p./,
|
|
85
|
+
});
|
|
86
|
+
const AllType = createToken({
|
|
87
|
+
name: "AllType",
|
|
88
|
+
pattern: /(pouze |všechna )?(č(\.|ísla)( ?o\.)?|lichá i sudá)/,
|
|
89
|
+
longer_alt: DescriptiveType,
|
|
90
|
+
});
|
|
91
|
+
const OddType = createToken({
|
|
92
|
+
name: "OddType",
|
|
93
|
+
pattern: /(pouze |všechna )?(lich([áé]|ých)( č(\.|ísla))?( ?o\.)?|č(\.|ísla)( ?o\.)? lich[áé])/,
|
|
94
|
+
longer_alt: AllType,
|
|
95
|
+
});
|
|
96
|
+
const EvenType = createToken({
|
|
97
|
+
name: "EvenType",
|
|
98
|
+
pattern: /(pouze |všechna )?(sud([áé]|ých)( č(\.|ísla))?( ?o\.)?|č(\.|ísla)( ?o\.)? sud[áé])/,
|
|
99
|
+
});
|
|
100
|
+
const Without = createToken({
|
|
101
|
+
name: "Without",
|
|
102
|
+
pattern: /bez|vyjma|mimo|s výjimkou|kromě/,
|
|
103
|
+
});
|
|
104
|
+
const MunicipalityPartName = createToken({
|
|
105
|
+
name: "MunicipalityPartName",
|
|
106
|
+
pattern: nameMatcherFactory(municipalityPartNamePattern),
|
|
107
|
+
});
|
|
108
|
+
const StreetName = createToken({
|
|
109
|
+
name: "StreetName",
|
|
110
|
+
pattern: nameMatcherFactory(streetNamePattern),
|
|
111
|
+
});
|
|
112
|
+
const Number = createToken({
|
|
113
|
+
name: "Number",
|
|
114
|
+
pattern: tokenBlockerFactory(/\d+[a-zA-Z]?/),
|
|
115
|
+
});
|
|
116
|
+
const Hyphen = createToken({ name: "Hyphen", pattern: /-|až/ });
|
|
117
|
+
const Slash = createToken({ name: "Hyphen", pattern: /\// });
|
|
118
|
+
const Space = createToken({
|
|
119
|
+
name: "Space",
|
|
120
|
+
pattern: / +/,
|
|
121
|
+
longer_alt: [MainSeparator, Separator],
|
|
122
|
+
group: Lexer.SKIPPED,
|
|
123
|
+
});
|
|
124
|
+
// const Colon = createToken({
|
|
125
|
+
// name: "Colon",
|
|
126
|
+
// pattern: /:/,
|
|
127
|
+
// group: Lexer.SKIPPED,
|
|
128
|
+
// });
|
|
129
|
+
const smdTokens = [
|
|
130
|
+
MainSeparator,
|
|
131
|
+
Separator,
|
|
132
|
+
OddType,
|
|
133
|
+
EvenType,
|
|
134
|
+
DescriptiveType,
|
|
135
|
+
AllType,
|
|
136
|
+
Number,
|
|
137
|
+
From,
|
|
138
|
+
To,
|
|
139
|
+
AndAbove,
|
|
140
|
+
AndBelow,
|
|
141
|
+
Without,
|
|
142
|
+
Hyphen,
|
|
143
|
+
Slash,
|
|
144
|
+
Space,
|
|
145
|
+
// Colon,
|
|
146
|
+
MunicipalityPartName,
|
|
147
|
+
StreetName,
|
|
148
|
+
];
|
|
149
|
+
MainSeparator.LABEL = "' - '";
|
|
150
|
+
Separator.LABEL = "','";
|
|
151
|
+
Hyphen.LABEL = "'-'";
|
|
152
|
+
Slash.LABEL = "'/'";
|
|
153
|
+
From.LABEL = "'od'";
|
|
154
|
+
To.LABEL = "'do'";
|
|
155
|
+
AndAbove.LABEL = "'a výše'";
|
|
156
|
+
AndBelow.LABEL = "'a níže'";
|
|
157
|
+
Space.LABEL = "' '";
|
|
158
|
+
OddType.LABEL = "'lichá č.'";
|
|
159
|
+
EvenType.LABEL = "'sudá č.'";
|
|
160
|
+
DescriptiveType.LABEL = "'č. p.'";
|
|
161
|
+
AllType.LABEL = "'č.'";
|
|
162
|
+
Without.LABEL = "'bez'";
|
|
163
|
+
const tokenVocabulary = {};
|
|
164
|
+
smdTokens.forEach((tokenType) => {
|
|
165
|
+
tokenVocabulary[tokenType.name] = tokenType;
|
|
166
|
+
});
|
|
167
|
+
export { MainSeparator, Separator, OddType, EvenType, DescriptiveType, AllType, Number, From, To, AndAbove, AndBelow, Without, Hyphen, Slash, Space, StreetName, MunicipalityPartName, smdTokens, tokenVocabulary, };
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tZGVmaW5pdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlZXQtbWFya2Rvd24vdG9rZW4tZGVmaW5pdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBbUIsTUFBTSxZQUFZLENBQUM7QUFFakUsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDO0FBRTNCLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxHQUFTLEVBQUU7SUFDeEMsY0FBYyxHQUFHLEtBQUssQ0FBQztBQUN6QixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRTtJQUMxQyxPQUFPLElBQUk7U0FDUixPQUFPLENBQUMsNkJBQTZCLEVBQUUsT0FBTyxDQUFDO1NBQy9DLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1NBQ2xCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDdkIsQ0FBQyxDQUFDO0FBRUYsNEZBQTRGO0FBQzVGLHNEQUFzRDtBQUN0RCxNQUFNLG1CQUFtQixHQUFHLENBQzFCLE9BQWUsRUFDa0QsRUFBRTtJQUNuRSxNQUFNLGFBQWEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDL0MsT0FBTyxDQUFDLElBQVksRUFBRSxXQUFtQixFQUEwQixFQUFFO1FBQ25FLElBQUksY0FBYyxFQUFFO1lBQ2xCLGFBQWEsQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDO1lBQ3RDLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqQzthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUM7U0FDYjtJQUNILENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLE1BQU0saUJBQWlCLEdBQUc7SUFDeEIsT0FBTztJQUNQLE1BQU07SUFDTixJQUFJO0lB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OUIsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUM7QUFDOUMsQ0FBQyxDQUFDLENBQUM7QUFFSCxPQUFPLEVBQ0wsYUFBYSxFQUNiLFNBQVMsRUFDVCxPQUFPLEVBQ1AsUUFBUSxFQUNSLGVBQWUsRUFDZixPQUFPLEVBQ1AsTUFBTSxFQUNOLElBQUksRUFDSixFQUFFLEVBQ0YsUUFBUSxFQUNSLFFBQVEsRUFDUixPQUFPLEVBQ1AsTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQ0wsVUFBVSxFQUNWLG9CQUFvQixFQUNwQixTQUFTLEVBQ1QsZUFBZSxHQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlVG9rZW4sIExleGVyLCBUb2tlblZvY2FidWxhcnkgfSBmcm9tIFwiY2hldnJvdGFpblwiO1xuXG5sZXQgbmFtZVdhc01hdGNoZWQgPSBmYWxzZTtcblxuZXhwb3J0IGNvbnN0IHJlc2V0VG9rZW5TdGF0ZSA9ICgpOiB2b2lkID0+IHtcbiAgbmFtZVdhc01hdGNoZWQgPSBmYWxzZTtcbn07XG5cbmV4cG9ydCBjb25zdCBwcmVwYXJlTGluZSA9ICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIHRleHRcbiAgICAucmVwbGFjZSgvKFtJVlhMQ0RNXSspIC0gKFtJVlhMQ0RNXSspLywgXCIkMS0kMlwiKVxuICAgIC5yZXBsYWNlKC87L2csIFwiLFwiKVxuICAgIC5yZXBsYWNlKC8sJC8sIFwiXCIpO1xufTtcblxuLy8gdGhpcyBmdW5jdGlvbiBwcmV2ZW50cyBudW1iZXJzIHRoYXQgbWFrZSBwYXJ0IG9mIHRoZSBzdHJlZXQgbmFtZSB0byBiZSBtYXRjaGVkIGJlZm9yZSB0aGVcbi8vIHN0cmVldC9tdW5pY2lwYWxpdHkgcGFydCBuYW1lIGlzIGNvbXBsZXRlbHkgbWF0Y2hlZFxuY29uc3QgdG9rZW5CbG9ja2VyRmFjdG9yeSA9IChcbiAgcGF0dGVybjogUmVnRXhwXG4pOiAoKHRleHQ6IHN0cmluZywgc3RhcnRPZmZzZXQ6IG51bWJlcikgPT4gUmVnRXhwRXhlY0FycmF5IHwgbnVsbCkgPT4ge1xuICBjb25zdCBzdGlja3lQYXR0ZXJuID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBcInlcIik7XG4gIHJldHVybiAodGV4dDogc3RyaW5nLCBzdGFydE9mZnNldDogbnVtYmVyKTogUmVnRXhwRXhlY0FycmF5IHwgbnVsbCA9PiB7XG4gICAgaWYgKG5hbWVXYXNNYXRjaGVkKSB7XG4gICAgICBzdGlja3lQYXR0ZXJuLmxhc3RJbmRleCA9IHN0YXJ0T2Zmc2V0O1xuICAgICAgcmV0dXJuIHN0aWNreVBhdHRlcm4uZXhlYyh0ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xufTtcblxuY29uc3QgaW50ZXJydXB0UGF0dGVybnMgPSBbXG4gIFwibGljaMOhXCIsXG4gIFwic3Vkw6FcIixcbiAgXCLEjS5cIixcbiAgXCJvZFwiLFxuICBcImRvXCIsXG4gIFwicG91emVcIixcbiAgXCJ2xaFlY2huYVwiLFxuICBcImJlelwiLFxuICBcInZ5am1hXCIsXG4gIFwibWltb1wiLFxuICBcInMgdsO9amlta291XCIsXG4gIFwia3JvbcSbXCIsXG5dO1xuLy8gdGhpcyBwYXR0ZXJuIGFsbG93cyBhIHNpbmdsZSBzcGFjZSBvciBhIHNpbmdsZSBoeXBoZW4gKHdpdGhvdXQgYW4gYWRqYWNlbnQgc3BhY2UpIGJldHdlZW4gd29yZHNcbmNvbnN0IHN0cmVldE5hbWVQYXR0ZXJuID0gL1teIC1dKyhbIC1dP1teIC1dKykqLztcblxuLy8gc2FtZSBidXQgd2l0aCBhIHByZWZpeCBvZiBtdW5pY2lwYWxpdHkgcGFydFxuY29uc3QgbXVuaWNpcGFsaXR5UGFydE5hbWVQYXR0ZXJuID0gL8SNw6FzdCAob2JjZXxtxJtzdGEpIFteIC1dKyhbIC1dP1teIC1dKykqLztcblxuZXhwb3J0IGNvbnN0IG5hbWVNYXRjaGVyRmFjdG9yeSA9IChwYXR0ZXJuOiBSZWdFeHApID0+IHtcbiAgcmV0dXJuIChcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgc3RhcnRPZmZzZXQ6IG51bWJlclxuICApOiBSZWdFeHBFeGVjQXJyYXkgfCBbc3RyaW5nXSB8IG51bGwgPT4ge1xuICAgIGlmIChuYW1lV2FzTWF0Y2hlZCB8fCBzdGFydE9mZnNldCA+IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBwYXR0ZXJuLmV4ZWModGV4dCk7XG4gICAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICAgIG5hbWVXYXNNYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgZmlyc3RJbmRleCA9IGludGVycnVwdFBhdHRlcm5zLnJlZHVjZShcbiAgICAgICAgICAoY3VycmVudE1pbjogbnVtYmVyLCBwYXR0ZXJuOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGV4dC5zZWFyY2gobmV3IFJlZ0V4cChgICR7cGF0dGVybn0oIHwkKWApKTtcbiAgICAgICAgICAgIHJldHVybiBpbmRleCA+PSAwID8gTWF0aC5taW4oaW5kZXgsIGN1cnJlbnRNaW4pIDogY3VycmVudE1pbjtcbiAgICAgICAgICB9LFxuICAgICAgICAgIEluZmluaXR5XG4gICAgICAgICk7XG4gICAgICAgIGlmIChmaXJzdEluZGV4IDwgSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4gW3Jlc3VsdFswXS5zdWJzdHJpbmcoMCwgZmlyc3RJbmRleCkudHJpbSgpXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH07XG59O1xuXG5leHBvcnQgY29uc3Qgc3RyZWV0TmFtZU1hdGNoZXIgPSBuYW1lTWF0Y2hlckZhY3Rvcnkoc3RyZWV0TmFtZVBhdHRlcm4pO1xuXG5jb25zdCBNYWluU2VwYXJhdG9yID0gY3JlYXRlVG9rZW4oeyBuYW1lOiBcIk1haW5TZXBhcmF0b3JcIiwgcGF0dGVybjogLyAtIC8gfSk7XG5jb25zdCBGcm9tID0gY3JlYXRlVG9rZW4oeyBuYW1lOiBcIkZyb21cIiwgcGF0dGVybjogL29kLyB9KTtcbmNvbnN0IFRvID0gY3JlYXRlVG9rZW4oeyBuYW1lOiBcIlRvXCIsIHBhdHRlcm46IC9kby8gfSk7XG5jb25zdCBBbmRBYm92ZSA9IGNyZWF0ZVRva2VuKHtcbiAgbmFtZTogXCJBbmRBYm92ZVwiLFxuICBwYXR0ZXJuOiAvIChhICk/KHbDvcWhZT98dnnFocWhw60pLyxcbn0pO1xuY29uc3QgQW5kQmVsb3cgPSBjcmVhdGVUb2tlbih7XG4gIG5hbWU6IFwiQW5kQmVsb3dcIixcbiAgcGF0dGVybjogLyBhIChuw63FvmU/fG5pxb7FocOtKS8sXG59KTtcbmNvbnN0IFNlcGFyYXRvciA9IGNyZWF0ZVRva2VuKHtcbiAgbmFtZTogXCJTZXBhcmF0b3JcIixcbiAgcGF0dGVybjogLyx8IGEgLyxcbiAgbG9uZ2VyX2FsdDogW0FuZEFib3ZlLCBBbmRCZWxvd10sXG59KTtcbmNvbnN0IERlc2NyaXB0aXZlVHlwZSA9IGNyZWF0ZVRva2VuKHtcbiAgbmFtZTogXCJDUFR5cGVcIixcbiAgcGF0dGVybjogLyhwb3V6ZSB8dsWhZWNobmEgKT/EjS4gP3AuLyxcbn0pO1xuY29uc3QgQWxsVHlwZSA9IGNyZWF0ZVRva2VuKHtcbiAgbmFtZTogXCJBbGxUeXBlXCIsXG4gIHBhdHRlcm46IC8ocG91emUgfHbFoWVjaG5hICk/KMSNKFxcLnzDrXNsYSkoID9vXFwuKT98bGljaMOhIGkgc3Vkw6EpLyxcbiAgbG9uZ2VyX2FsdDogRGVzY3JpcHRpdmVUeXBlLFxufSk7XG5jb25zdCBPZGRUeXBlID0gY3JlYXRlVG9rZW4oe1xuICBuYW1lOiBcIk9kZFR5cGVcIixcbiAgcGF0dGVybjpcbiAgICAvKHBvdXplIHx2xaFlY2huYSApPyhsaWNoKFvDocOpXXzDvWNoKSggxI0oXFwufMOtc2xhKSk/KCA/b1xcLik/fMSNKFxcLnzDrXNsYSkoID9vXFwuKT8gbGljaFvDocOpXSkvLFxuICBsb25nZXJfYWx0OiBBbGxUeXBlLFxufSk7XG5jb25zdCBFdmVuVHlwZSA9IGNyZWF0ZVRva2VuKHtcbiAgbmFtZTogXCJFdmVuVHlwZVwiLFxuICBwYXR0ZXJuOlxuICAgIC8ocG91emUgfHbFoWVjaG5hICk/KHN1ZChbw6HDqV18w71jaCkoIMSNKFxcLnzDrXNsYSkpPyggP29cXC4pP3zEjShcXC58w61zbGEpKCA/b1xcLik/IHN1ZFvDocOpXSkvLFxufSk7XG5jb25zdCBXaXRob3V0ID0gY3JlYXRlVG9rZW4oe1xuICBuYW1lOiBcIldpdGhvdXRcIixcbiAgcGF0dGVybjogL2Jlenx2eWptYXxtaW1vfHMgdsO9amlta291fGtyb23Emy8sXG59KTtcbmNvbnN0IE11bmljaXBhbGl0eVBhcnROYW1lID0gY3JlYXRlVG9rZW4oe1xuICBuYW1lOiBcIk11bmljaXBhbGl0eVBhcnROYW1lXCIsXG4gIHBhdHRlcm46IG5hbWVNYXRjaGVyRmFjdG9yeShtdW5pY2lwYWxpdHlQYXJ0TmFtZVBhdHRlcm4pLFxufSk7XG5jb25zdCBTdHJlZXROYW1lID0gY3JlYXRlVG9rZW4oe1xuICBuYW1lOiBcIlN0cmVldE5hbWVcIixcbiAgcGF0dGVybjogbmFtZU1hdGNoZXJGYWN0b3J5KHN0cmVldE5hbWVQYXR0ZXJuKSxcbn0pO1xuXG5jb25zdCBOdW1iZXIgPSBjcmVhdGVUb2tlbih7XG4gIG5hbWU6IFwiTnVtYmVyXCIsXG4gIHBhdHRlcm46IHRva2VuQmxvY2tlckZhY3RvcnkoL1xcZCtbYS16QS1aXT8vKSxcbn0pO1xuY29uc3QgSHlwaGVuID0gY3JlYXRlVG9rZW4oeyBuYW1lOiBcIkh5cGhlblwiLCBwYXR0ZXJuOiAvLXxhxb4vIH0pO1xuY29uc3QgU2xhc2ggPSBjcmVhdGVUb2tlbih7IG5hbWU6IFwiSHlwaGVuXCIsIHBhdHRlcm46IC9cXC8vIH0pO1xuY29uc3QgU3BhY2UgPSBjcmVhdGVUb2tlbih7XG4gIG5hbWU6IFwiU3BhY2VcIixcbiAgcGF0dGVybjogLyArLyxcbiAgbG9uZ2VyX2FsdDogW01haW5TZXBhcmF0b3IsIFNlcGFyYXRvcl0sXG4gIGdyb3VwOiBMZXhlci5TS0lQUEVELFxufSk7XG4vLyBjb25zdCBDb2xvbiA9IGNyZWF0ZVRva2VuKHtcbi8vICAgbmFtZTogXCJDb2xvblwiLFxuLy8gICBwYXR0ZXJuOiAvOi8sXG4vLyAgIGdyb3VwOiBMZXhlci5TS0lQUEVELFxuLy8gfSk7XG5cbmNvbnN0IHNtZFRva2VucyA9IFtcbiAgTWFpblNlcGFyYXRvcixcbiAgU2VwYXJhdG9yLFxuICBPZGRUeXBlLFxuICBFdmVuVHlwZSxcbiAgRGVzY3JpcHRpdmVUeXBlLFxuICBBbGxUeXBlLFxuICBOdW1iZXIsXG4gIEZyb20sXG4gIFRvLFxuICBBbmRBYm92ZSxcbiAgQW5kQmVsb3csXG4gIFdpdGhvdXQsXG4gIEh5cGhlbixcbiAgU2xhc2gsXG4gIFNwYWNlLFxuICAvLyBDb2xvbixcbiAgTXVuaWNpcGFsaXR5UGFydE5hbWUsXG4gIFN0cmVldE5hbWUsXG5dO1xuXG5NYWluU2VwYXJhdG9yLkxBQkVMID0gXCInIC0gJ1wiO1xuU2VwYXJhdG9yLkxBQkVMID0gXCInLCdcIjtcbkh5cGhlbi5MQUJFTCA9IFwiJy0nXCI7XG5TbGFzaC5MQUJFTCA9IFwiJy8nXCI7XG5Gcm9tLkxBQkVMID0gXCInb2QnXCI7XG5Uby5MQUJFTCA9IFwiJ2RvJ1wiO1xuQW5kQWJvdmUuTEFCRUwgPSBcIidhIHbDvcWhZSdcIjtcbkFuZEJlbG93LkxBQkVMID0gXCInYSBuw63FvmUnXCI7XG5TcGFjZS5MQUJFTCA9IFwiJyAnXCI7XG5PZGRUeXBlLkxBQkVMID0gXCInbGljaMOhIMSNLidcIjtcbkV2ZW5UeXBlLkxBQkVMID0gXCInc3Vkw6EgxI0uJ1wiO1xuRGVzY3JpcHRpdmVUeXBlLkxBQkVMID0gXCInxI0uIHAuJ1wiO1xuQWxsVHlwZS5MQUJFTCA9IFwiJ8SNLidcIjtcbldpdGhvdXQuTEFCRUwgPSBcIidiZXonXCI7XG5cbmNvbnN0IHRva2VuVm9jYWJ1bGFyeTogVG9rZW5Wb2NhYnVsYXJ5ID0ge307XG5cbnNtZFRva2Vucy5mb3JFYWNoKCh0b2tlblR5cGUpID0+IHtcbiAgdG9rZW5Wb2NhYnVsYXJ5W3Rva2VuVHlwZS5uYW1lXSA9IHRva2VuVHlwZTtcbn0pO1xuXG5leHBvcnQge1xuICBNYWluU2VwYXJhdG9yLFxuICBTZXBhcmF0b3IsXG4gIE9kZFR5cGUsXG4gIEV2ZW5UeXBlLFxuICBEZXNjcmlwdGl2ZVR5cGUsXG4gIEFsbFR5cGUsXG4gIE51bWJlcixcbiAgRnJvbSxcbiAgVG8sXG4gIEFuZEFib3ZlLFxuICBBbmRCZWxvdyxcbiAgV2l0aG91dCxcbiAgSHlwaGVuLFxuICBTbGFzaCxcbiAgU3BhY2UsXG4gIFN0cmVldE5hbWUsXG4gIE11bmljaXBhbGl0eVBhcnROYW1lLFxuICBzbWRUb2tlbnMsXG4gIHRva2VuVm9jYWJ1bGFyeSxcbn07XG4iXX0=
|