text-to-map 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +20 -0
  3. package/dist/bin/address-points-import-only.d.ts +1 -0
  4. package/dist/bin/address-points-import-only.js +14 -0
  5. package/dist/bin/address-points.d.ts +1 -0
  6. package/dist/bin/address-points.js +14 -0
  7. package/dist/bin/clear-all.d.ts +1 -0
  8. package/dist/bin/clear-all.js +5 -0
  9. package/dist/bin/generate-syntax-diagrams.d.ts +1 -0
  10. package/dist/bin/generate-syntax-diagrams.js +19 -0
  11. package/dist/bin/parse-ordinance.d.ts +1 -0
  12. package/dist/bin/parse-ordinance.js +20 -0
  13. package/dist/bin/schools.d.ts +1 -0
  14. package/dist/bin/schools.js +8 -0
  15. package/dist/bin/streets.d.ts +1 -0
  16. package/dist/bin/streets.js +14 -0
  17. package/dist/db/address-points.d.ts +38 -0
  18. package/dist/db/address-points.js +312 -0
  19. package/dist/db/db.d.ts +23 -0
  20. package/dist/db/db.js +90 -0
  21. package/dist/db/founders.d.ts +9 -0
  22. package/dist/db/founders.js +191 -0
  23. package/dist/db/meta.d.ts +3 -0
  24. package/dist/db/meta.js +17 -0
  25. package/dist/db/schools.d.ts +6 -0
  26. package/dist/db/schools.js +61 -0
  27. package/dist/db/street-sync.d.ts +5 -0
  28. package/dist/db/street-sync.js +18 -0
  29. package/dist/db/types.d.ts +34 -0
  30. package/dist/db/types.js +12 -0
  31. package/dist/index.d.ts +4 -0
  32. package/dist/index.js +4 -0
  33. package/dist/open-data-sync/address-points.d.ts +4 -0
  34. package/dist/open-data-sync/address-points.js +73 -0
  35. package/dist/open-data-sync/schools.d.ts +3 -0
  36. package/dist/open-data-sync/schools.js +308 -0
  37. package/dist/open-data-sync/streets.d.ts +2 -0
  38. package/dist/open-data-sync/streets.js +77 -0
  39. package/dist/smd-to-csv/json-to-csv.d.ts +1 -0
  40. package/dist/smd-to-csv/json-to-csv.js +153 -0
  41. package/dist/smd-to-csv/ordinance-to-csv-rules.d.ts +1 -0
  42. package/dist/smd-to-csv/ordinance-to-csv-rules.js +31 -0
  43. package/dist/smd-to-csv/txt-to-json.d.ts +1 -0
  44. package/dist/smd-to-csv/txt-to-json.js +102 -0
  45. package/dist/street-markdown/municipality.d.ts +5 -0
  46. package/dist/street-markdown/municipality.js +44 -0
  47. package/dist/street-markdown/roman-numerals.d.ts +1 -0
  48. package/dist/street-markdown/roman-numerals.js +67 -0
  49. package/dist/street-markdown/smd-line-parser.d.ts +4 -0
  50. package/dist/street-markdown/smd-line-parser.js +29 -0
  51. package/dist/street-markdown/smd-parser.d.ts +21 -0
  52. package/dist/street-markdown/smd-parser.js +343 -0
  53. package/dist/street-markdown/smd.d.ts +9 -0
  54. package/dist/street-markdown/smd.js +182 -0
  55. package/dist/street-markdown/token-definition.d.ts +23 -0
  56. package/dist/street-markdown/token-definition.js +154 -0
  57. package/dist/street-markdown/types.d.ts +83 -0
  58. package/dist/street-markdown/types.js +18 -0
  59. package/dist/utils/addressBuilder.d.ts +8 -0
  60. package/dist/utils/addressBuilder.js +101 -0
  61. package/dist/utils/atom.d.ts +2 -0
  62. package/dist/utils/atom.js +65 -0
  63. package/dist/utils/helpers.d.ts +34 -0
  64. package/dist/utils/helpers.js +157 -0
  65. package/package.json +82 -0
@@ -0,0 +1,157 @@
1
+ import { existsSync, mkdirSync } from "fs";
2
+ import { tmpdir } from "os";
3
+ import { join } from "path";
4
+ import { MunicipalityType } from "../db/types";
5
+ import { setDbConfig } from "../db/db";
6
+ const appName = "text-to-map";
7
+ export const getAppDataDirPath = () => join(process.env.APPDATA ||
8
+ (process.platform == "darwin"
9
+ ? process.env.HOME + "/Library/Preferences"
10
+ : process.env.HOME + "/.local/share"), appName);
11
+ export const prepareOptions = (options) => {
12
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
13
+ const dataDir = (_a = options.dataDir) !== null && _a !== void 0 ? _a : getAppDataDirPath();
14
+ if (!existsSync(dataDir)) {
15
+ mkdirSync(dataDir);
16
+ }
17
+ const tmpAppDir = join(tmpdir(), appName);
18
+ if (!existsSync(tmpAppDir)) {
19
+ mkdirSync(tmpAppDir);
20
+ }
21
+ return {
22
+ tmpDir: (_b = options.tmpDir) !== null && _b !== void 0 ? _b : tmpAppDir,
23
+ dataDir: dataDir,
24
+ dbFilePath: (_c = options.dbFilePath) !== null && _c !== void 0 ? _c : join(dataDir, "address_points.db"),
25
+ dbInitFilePath: (_d = options.dbInitFilePath) !== null && _d !== void 0 ? _d : join("src", "address_points_init.db"),
26
+ addressPointsAtomUrl: (_e = options.addressPointsAtomUrl) !== null && _e !== void 0 ? _e : "https://atom.cuzk.cz/RUIAN-CSV-ADR-ST/RUIAN-CSV-ADR-ST.xml",
27
+ addressPointsZipFileName: (_f = options.addressPointsZipFileName) !== null && _f !== void 0 ? _f : "ruian_csv.zip",
28
+ addressPointsCsvFolderName: (_g = options.addressPointsCsvFolderName) !== null && _g !== void 0 ? _g : "CSV",
29
+ streetsAtomUrl: (_h = options.streetsAtomUrl) !== null && _h !== void 0 ? _h : "https://atom.cuzk.cz/RUIAN-OBCE-SHP/RUIAN-OBCE-SHP.xml",
30
+ streetFolderName: (_j = options.streetZipFolderName) !== null && _j !== void 0 ? _j : "streets",
31
+ streetDbfFileName: (_k = options.streetDbfFileName) !== null && _k !== void 0 ? _k : "UL_L.dbf",
32
+ schoolsXmlUrl: (_l = options.schoolsXmlUrl) !== null && _l !== void 0 ? _l : "https://rejstriky.msmt.cz/opendata/vrejcelk.xml",
33
+ schoolsXmlFileName: (_m = options.schoolsXmlFileName) !== null && _m !== void 0 ? _m : "school-register.xml",
34
+ };
35
+ };
36
+ export const initDb = (options) => {
37
+ setDbConfig({
38
+ filePath: options.dbFilePath,
39
+ initFilePath: options.dbInitFilePath,
40
+ });
41
+ };
42
+ const cityPatterns = [
43
+ /^[sS]tatutární město +(.*)$/,
44
+ /^[oO]bec +(.*)$/,
45
+ /^[mM]ěsto +(.*)$/,
46
+ /^[mM]ěstys +(.*)$/,
47
+ ];
48
+ const districtPatterns = [
49
+ /^[mM]ěstská část +(.*)$/,
50
+ /^[mM]ěstský obvod +(.*)$/,
51
+ /^[sS]tatutární město +.*, [mM]ěstská část +(.*)$/,
52
+ /^[sS]tatutární město +.*, [mM]ěstský obvod +(.*)$/,
53
+ ];
54
+ export const extractMunicipalityName = (founder) => {
55
+ const patterns = founder.municipalityType === MunicipalityType.City
56
+ ? cityPatterns
57
+ : districtPatterns;
58
+ const correctPattern = patterns.filter((pattern) => pattern.test(founder.name));
59
+ if (correctPattern.length > 0) {
60
+ const result = correctPattern[0].exec(founder.name);
61
+ if (typeof result[1] !== "undefined") {
62
+ return result[1]
63
+ .replace(" - ", "-")
64
+ .replace(/\s{2,}/g, " ")
65
+ .trim();
66
+ }
67
+ }
68
+ return founder.name;
69
+ };
70
+ export const findClosestString = (str, arr) => {
71
+ let closestStr = "";
72
+ let closestDistance = Number.MAX_SAFE_INTEGER;
73
+ for (let i = 0; i < arr.length; i++) {
74
+ const currentStr = arr[i];
75
+ const distance = interpunctionDistance(str, currentStr);
76
+ if (distance < closestDistance) {
77
+ closestStr = currentStr;
78
+ closestDistance = distance;
79
+ }
80
+ // exact match found, exit loop
81
+ if (closestDistance === 0) {
82
+ break;
83
+ }
84
+ }
85
+ return closestStr;
86
+ };
87
+ const interpunctionDistance = (str1, str2) => {
88
+ let distance = levenshteinDistance(str1, str2);
89
+ const interpunctionMistakes = {
90
+ a: ["á"],
91
+ á: ["a"],
92
+ e: ["é", "ě"],
93
+ é: ["e", "ě"],
94
+ ě: ["e", "é"],
95
+ i: ["í"],
96
+ í: ["i"],
97
+ y: ["ý"],
98
+ ý: ["y"],
99
+ o: ["ó"],
100
+ ó: ["o"],
101
+ u: ["ú", "ů"],
102
+ ů: ["u", "ú"],
103
+ ú: ["u", "ů"],
104
+ c: ["č"],
105
+ č: ["c"],
106
+ d: ["ď"],
107
+ ď: ["d"],
108
+ n: ["ň"],
109
+ ň: ["n"],
110
+ r: ["ř"],
111
+ ř: ["r"],
112
+ s: ["š"],
113
+ š: ["s"],
114
+ t: ["ť"],
115
+ ť: ["t"],
116
+ z: ["ž"],
117
+ ž: ["z"],
118
+ };
119
+ const str1Chars = str1.split("");
120
+ const str2Chars = str2.split("");
121
+ for (let i = 0; i < str1Chars.length; i++) {
122
+ const char1 = str1Chars[i];
123
+ const char2 = str2Chars[i];
124
+ if (interpunctionMistakes[char1] &&
125
+ interpunctionMistakes[char1].includes(char2)) {
126
+ // Subtract a penalty from the distance for interpunction mistakes
127
+ distance -= 0.5;
128
+ }
129
+ }
130
+ return distance;
131
+ };
132
+ const levenshteinDistance = (str1, str2) => {
133
+ const matrix = Array(str2.length + 1)
134
+ .fill(null)
135
+ .map(() => Array(str1.length + 1).fill(null));
136
+ for (let i = 0; i <= str1.length; i++) {
137
+ matrix[0][i] = i;
138
+ }
139
+ for (let j = 0; j <= str2.length; j++) {
140
+ matrix[j][0] = j;
141
+ }
142
+ for (let j = 1; j <= str2.length; j++) {
143
+ for (let i = 1; i <= str1.length; i++) {
144
+ if (str1[i - 1] === str2[j - 1]) {
145
+ matrix[j][i] = matrix[j - 1][i - 1];
146
+ }
147
+ else {
148
+ matrix[j][i] =
149
+ Math.min(matrix[j][i - 1], // deletion
150
+ matrix[j - 1][i], // insertion
151
+ matrix[j - 1][i - 1] // substitution
152
+ ) + 1;
153
+ }
154
+ }
155
+ }
156
+ return matrix[str2.length][str1.length];
157
+ };
package/package.json ADDED
@@ -0,0 +1,82 @@
1
+ {
2
+ "type": "module",
3
+ "dependencies": {
4
+ "@arodax/jtsk2wgs84": "^1.0.2",
5
+ "@chevrotain/types": "^10.4.2",
6
+ "adm-zip": "^0.5.9",
7
+ "better-sqlite3": "^8.0.1",
8
+ "chevrotain": "^10.4.2",
9
+ "csv-parse": "^5.3.3",
10
+ "feedparser": "^2.2.10",
11
+ "iconv-lite": "^0.6.3",
12
+ "jtsk2wgs84": "^1.0.0",
13
+ "node-fetch": "^3.3.0",
14
+ "parsedbf": "^1.1.1",
15
+ "sax": "^1.2.4",
16
+ "superagent": "^8.0.6",
17
+ "typescript": "^4.9.4"
18
+ },
19
+ "devDependencies": {
20
+ "@jest/globals": "^29.3.1",
21
+ "@types/adm-zip": "^0.5.0",
22
+ "@types/better-sqlite3": "^7.6.3",
23
+ "@types/feedparser": "^2.2.5",
24
+ "@types/node": "^18.11.17",
25
+ "@types/superagent": "^4.1.16",
26
+ "jest": "^29.3.1",
27
+ "npm-run-all": "^4.1.5",
28
+ "rimraf": "^5.0.1",
29
+ "ts-jest": "^29.0.3",
30
+ "ts-node": "^10.9.1"
31
+ },
32
+ "scripts": {
33
+ "address-points": "ts-node --experimental-specifier-resolution=node --esm src/bin/address-points.ts",
34
+ "address-points-import-only": "ts-node --experimental-specifier-resolution=node --esm src/bin/address-points-import-only.ts",
35
+ "schools": "ts-node --experimental-specifier-resolution=node --esm src/bin/schools.ts",
36
+ "clear-all": "ts-node --experimental-specifier-resolution=node --esm src/bin/clear-all.ts",
37
+ "parse-ordinance": "ts-node --experimental-specifier-resolution=node --esm src/bin/parse-ordinance.ts",
38
+ "diagrams": "ts-node --experimental-specifier-resolution=node --esm src/bin/generate-syntax-diagrams.ts",
39
+ "streets": "ts-node --experimental-specifier-resolution=node --esm src/bin/streets.ts",
40
+ "dbf": "ts-node --experimental-specifier-resolution=node --esm src/bin/dbf.ts",
41
+ "test": "jest",
42
+ "ordinance-to-csv-rules": "node src/smd-to-csv/ordinance-to-csv-rules.js",
43
+ "clean": "rimraf dist",
44
+ "build": "npm-run-all clean -p build:*",
45
+ "build:types": "tsc --declaration --emitDeclarationOnly --outDir dist",
46
+ "build:js": "tsc --outDir dist",
47
+ "prepare": "npm run build"
48
+ },
49
+ "name": "text-to-map",
50
+ "description": "Text To Map usiluje o lepší, strojově zpracovatelné využití částí vyhlášek s výčtem ulic a dalších lokací. Jde o rozšiřitelnou sadu konceptů a nástrojů, které zajistí hladký převod výčtu ulic a jejich rozsahů v lidsky srozumitelném jazyce do strojově zpracovatelného, uchopitelného formátu.",
51
+ "version": "1.0.0",
52
+ "main": "dist/index.js",
53
+ "types": "dist/index.d.ts",
54
+ "files": [
55
+ "dist/**/*",
56
+ "LICENSE",
57
+ "README.md"
58
+ ],
59
+ "directories": {
60
+ "example": "examples",
61
+ "test": "tests"
62
+ },
63
+ "repository": {
64
+ "type": "git",
65
+ "url": "git+https://github.com/maral/text-to-map.git"
66
+ },
67
+ "keywords": [
68
+ "streets",
69
+ "catchment areas",
70
+ "schools",
71
+ "map",
72
+ "geodata",
73
+ "address points",
74
+ "polygons"
75
+ ],
76
+ "author": "Marek Lisý",
77
+ "license": "MIT",
78
+ "bugs": {
79
+ "url": "https://github.com/maral/text-to-map/issues"
80
+ },
81
+ "homepage": "https://github.com/maral/text-to-map#readme"
82
+ }