@whiteslove/parsing-lexicon 0.3.4 → 0.3.7
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/package.json +1 -1
- package/src/geo.js +7 -4
- package/src/housing-listing-enrichment.d.ts +1 -0
- package/src/housing-listing-enrichment.js +13 -6
- package/src/housing-structured.js +12 -0
- package/src/locations.js +37 -1
- package/src/tashkent-housing-geography.d.ts +1 -0
- package/src/tashkent-housing-geography.js +22 -0
- package/src/tashkent-pois.js +19 -0
- package/src/ua-location-extensions-regional.js +2 -2
package/package.json
CHANGED
package/src/geo.js
CHANGED
|
@@ -20,7 +20,7 @@ export const TASHKENT_DISTRICTS = Object.freeze([
|
|
|
20
20
|
entity('Yunusabad', { uzLatn: ['Yunusobod', 'Yunusobod tumani', 'Yunusabad'], uzCyrl: ['Юнусобод', 'Юнусобод тумани'], ru: ['Юнусабад', 'Юнусабадский район'], en: ['Yunusabad', 'Yunusobod'] }),
|
|
21
21
|
entity('Yakkasaray', { uzLatn: ['Yakkasaroy', 'Yakkasaroy tumani', 'Yakkasaray'], uzCyrl: ['Яккасарой', 'Яккасарой тумани'], ru: ['Яккасарай', 'Яккасарайский район'], en: ['Yakkasaray', 'Yakkasaroy'] }),
|
|
22
22
|
entity('Yangihayot', { uzLatn: ['Yangihayot', 'Yangihayot tumani'], uzCyrl: ['Янгиҳаёт', 'Янгиҳаёт тумани', 'Янгихаёт'], ru: ['Янгихаётский район', 'Янгихаёт'], en: ['Yangihayot'] }),
|
|
23
|
-
entity('Yashnobod', { uzLatn: ['Yashnobod', 'Yashnobod tumani'], uzCyrl: ['Яшнобод', 'Яшнобод тумани'], ru: ['Яшнабад', 'Яшнабадский район'], en: ['Yashnobod', 'Yashnabad'] }),
|
|
23
|
+
entity('Yashnobod', { uzLatn: ['Yashnobod', 'Yashnobod tumani', 'Yashnabod', 'Yashnabod tumani'], uzCyrl: ['Яшнобод', 'Яшнобод тумани'], ru: ['Яшнабад', 'Яшнабадский район'], en: ['Yashnobod', 'Yashnabad'] }),
|
|
24
24
|
]);
|
|
25
25
|
|
|
26
26
|
export function canonicalTashkentDistrict(value) {
|
|
@@ -123,7 +123,7 @@ export const TASHKENT_AREAS = Object.freeze({
|
|
|
123
123
|
area('Karakamysh-2/4', ['каракамыш 2 4', 'қорақамиш 2 4', 'qoraqamish 2 4', 'karakamish 2 4']),
|
|
124
124
|
area('Karakamysh-2/5', ['каракамыш 2 5', 'қорақамиш 2 5', 'qoraqamish 2 5', 'karakamish 2 5']),
|
|
125
125
|
area('Olympia', ['олимпия', 'olimpiya', 'olympia'], 'microdistrict'), area('Vuzgorodok', ['вузгородок', 'вуз городок', 'vuzgorodok']),
|
|
126
|
-
area('Medgorodok', ['медгородок', 'мед городок', 'medgorodok']),
|
|
126
|
+
area('Medgorodok', ['медгородок', 'мед городок', 'medgorodok']),
|
|
127
127
|
area('Chimbay', ['чимбай', 'chimboy', 'chimbay']),
|
|
128
128
|
]),
|
|
129
129
|
Mirobod: Object.freeze([
|
|
@@ -140,14 +140,17 @@ export const TASHKENT_AREAS = Object.freeze({
|
|
|
140
140
|
]),
|
|
141
141
|
Sergeli: Object.freeze([
|
|
142
142
|
area('Yangi Sergeli', ['янги сергели', 'yangi sergeli']), area('Stroygorod', ['стройгород', 'stroygorod']),
|
|
143
|
+
area('Uzgarish', ['узгарыш', 'ўзгариш', "o'zgarish", 'uzgarish']),
|
|
143
144
|
]),
|
|
144
145
|
Chilanzar: Object.freeze([
|
|
145
146
|
area('Nakkoshlik', ['наккошлык', 'наққошлик', 'naqqoshlik']), area('Al-Khorezmi-1', ['аль хорезми 1', 'ал хорезми 1', 'al xorazmiy 1', 'al khorezmi 1']),
|
|
147
|
+
area('Beshagach', ['бешагач', "beshyog'och", 'beshagach']),
|
|
146
148
|
]),
|
|
147
149
|
Shaykhantahur: Object.freeze([
|
|
148
150
|
area('Labzak', ['лабзак', 'labzak', 'ц 13', 'c 13']), area('Khadra', ['хадра', 'xadra', 'khadra', 'ц 14', 'c 14']),
|
|
149
151
|
area('Jangoh', ['джангох', 'жангох', 'jangoh', 'ц 15', 'c 15']), area('Karatash', ['караташ', 'қоратош', 'qoratosh', 'karatash']),
|
|
150
|
-
area('Chorsu', ['чорсу', 'chorsu']), area('
|
|
152
|
+
area('Chorsu', ['чорсу', 'chorsu']), area('Beltepa', ['белтепа', 'beltepa']),
|
|
153
|
+
area('Takhtapul', ['тахтапуль', 'тахтапул', 'taxtapul', 'takhtapul']),
|
|
151
154
|
]),
|
|
152
155
|
Yunusabad: Object.freeze([
|
|
153
156
|
area('Kashgar', ['кашгар', 'қашқар', 'qashqar', 'kashgar', 'ц 4', 'c 4']), area('Kiyot', ['киёт', 'қиёт', 'qiyot', 'kiyot', 'ц 5', 'c 5']),
|
|
@@ -158,7 +161,7 @@ export const TASHKENT_AREAS = Object.freeze({
|
|
|
158
161
|
area('Rakat', ['ракат', 'rakat']), area('Rakatboshi', ['ракатбоши', 'rakatboshi']),
|
|
159
162
|
]),
|
|
160
163
|
Yangihayot: Object.freeze([
|
|
161
|
-
area('
|
|
164
|
+
area('Dustlik-1', ['дустлик 1', 'дўстлик 1', "do'stlik 1", 'dustlik 1'], 'microdistrict'),
|
|
162
165
|
area('Dustlik-2', ['дустлик 2', 'дўстлик 2', "do'stlik 2", 'dustlik 2'], 'microdistrict'), area('Yangi Choshtepa', ['янги чоштепа', 'yangi choshtepa'], 'microdistrict'), area('Sputnik', ['спутник', 'йўлдош', "yo'ldosh", 'yoldosh'], 'microdistrict'),
|
|
163
166
|
]),
|
|
164
167
|
Yashnobod: Object.freeze([
|
|
@@ -44,6 +44,7 @@ export interface HousingListingEnrichment {
|
|
|
44
44
|
nearby?: readonly string[];
|
|
45
45
|
amenities?: readonly string[];
|
|
46
46
|
district?: string | null;
|
|
47
|
+
quarter?: { number: number; suffix: string } | null;
|
|
47
48
|
metro?: string | null;
|
|
48
49
|
residenceComplex?: string | null;
|
|
49
50
|
address?: string | null;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { deepFreeze } from './lexicon-core.js';
|
|
2
2
|
import { findAllCanonical, normalizeUnicode } from './normalization.js';
|
|
3
3
|
import { GENERIC_LANDMARK_TERMS } from './landmarks.js';
|
|
4
|
-
import { matchTashkentHousingDistrict, matchTashkentHousingMetro } from './tashkent-housing-geography.js';
|
|
4
|
+
import { matchTashkentHousingDistrict, matchTashkentHousingMetro, matchTashkentHousingQuarter } from './tashkent-housing-geography.js';
|
|
5
5
|
import { TASHKENT_LANDMARKS } from './tashkent-pois.js';
|
|
6
6
|
import { parseHousingRoomCount, parseHousingFloor, parseHousingAreas } from './housing-structured.js';
|
|
7
7
|
import { parseHousingListingFields } from './housing-listing-fields.js';
|
|
@@ -18,10 +18,10 @@ const GENERIC_CATEGORY = Object.freeze({
|
|
|
18
18
|
});
|
|
19
19
|
|
|
20
20
|
const APPLIANCE_PATTERNS = Object.freeze([
|
|
21
|
-
['Washing machine', /(?:кир\s
|
|
22
|
-
['Microwave', /(
|
|
23
|
-
['Vacuum cleaner', /(
|
|
24
|
-
['Oven', /(
|
|
21
|
+
['Washing machine', /(?:кир\s*машин|кирмошин\p{L}*|стиральн\p{L}*\s+машин|washing\s+machine|kir\s*moshina|kirmoshina|kir\s*yuvish\s+mashin)/iu],
|
|
22
|
+
['Microwave', /(?:микроволнов|микравалноф\p{L}*|microwave|mikrovolnov|mikravolnof)/iu],
|
|
23
|
+
['Vacuum cleaner', /(?:пылесос|педесос|vacuum\s+cleaner|pilesos|pedesos)/iu],
|
|
24
|
+
['Oven', /(?:духовк|дхофк\p{L}*|oven|duxovka|duhofka|dxofka)/iu],
|
|
25
25
|
['Kitchen', /(?:кухн|kitchen|oshxona|kuxn\p{L}*)/iu],
|
|
26
26
|
]);
|
|
27
27
|
|
|
@@ -141,6 +141,11 @@ const COMMISSION_AMOUNT_LEADING_RE = /(\d{1,3}(?:[\s.,]\d{3})*|\d+(?:[.,]\d+)?)\
|
|
|
141
141
|
|
|
142
142
|
export function parseHousingCommissionAmount(value) {
|
|
143
143
|
const text = normalizeUnicode(value ?? '');
|
|
144
|
+
// A listing that explicitly says "no broker/commission" cannot also have a
|
|
145
|
+
// commission amount — without this guard, an unrelated number near the
|
|
146
|
+
// negated broker word (e.g. a room count in "2 xonali ... maklersiz")
|
|
147
|
+
// could be misread as the commission amount.
|
|
148
|
+
if (NO_BROKER_RE.test(text)) return null;
|
|
144
149
|
const match = text.match(COMMISSION_AMOUNT_RE) || text.match(COMMISSION_AMOUNT_LEADING_RE);
|
|
145
150
|
if (!match) return null;
|
|
146
151
|
const amount = Number(String(match[1]).replace(/\s+/g, '').replace(',', '.'));
|
|
@@ -193,7 +198,8 @@ export function parseHousingListingEnrichment(value, { country = '' } = {}) {
|
|
|
193
198
|
const audience = parseHousingAudience(text);
|
|
194
199
|
const perPersonPrice = parseHousingPerPersonPrice(text, { country });
|
|
195
200
|
const observedAmenities = parseHousingObservedAmenities(text);
|
|
196
|
-
const
|
|
201
|
+
const quarter = matchTashkentHousingQuarter(text);
|
|
202
|
+
const district = matchTashkentHousingDistrict(text)?.name || quarter?.district || null;
|
|
197
203
|
const metro = matchTashkentHousingMetro(text)?.name || null;
|
|
198
204
|
const parsedRc = specificResidentialComplex(text) || parseHousingResidentialComplex(text);
|
|
199
205
|
const commission = parseHousingCommission(text);
|
|
@@ -243,6 +249,7 @@ export function parseHousingListingEnrichment(value, { country = '' } = {}) {
|
|
|
243
249
|
nearby: parseHousingNearby(text),
|
|
244
250
|
amenities: observedAmenities,
|
|
245
251
|
district: district || null,
|
|
252
|
+
quarter: quarter ? { number: quarter.number, suffix: quarter.suffix } : null,
|
|
246
253
|
metro: metro || null,
|
|
247
254
|
residenceComplex: parsedRc || null,
|
|
248
255
|
address: address.address,
|
|
@@ -49,6 +49,18 @@ function currencyNear(text) {
|
|
|
49
49
|
export function parseHousingRoomCount(value) {
|
|
50
50
|
const text = normalizeUnicode(value ?? '');
|
|
51
51
|
if (!text) return null;
|
|
52
|
+
|
|
53
|
+
// Uzbek market shorthand: a unit formally registered as N rooms that was
|
|
54
|
+
// physically converted into a different count ("1 xonali ... 2 xona
|
|
55
|
+
// qilingan" — nominally 1-room, made into 2). The converted count is the
|
|
56
|
+
// one that matters and must win over the nominal count mentioned earlier
|
|
57
|
+
// in the same text.
|
|
58
|
+
const converted = text.match(/(\d{1,2})\s*(?:ta\s*)?xona(?:ga)?\s+(?:qilingan|aylantirilgan|bo['’ʻʼ‘`]?lingan)(?=$|[^\p{L}\p{N}_])/iu);
|
|
59
|
+
if (converted) {
|
|
60
|
+
const rooms = toNumber(converted[1]);
|
|
61
|
+
if (rooms != null && rooms >= 1 && rooms <= 20) return rooms;
|
|
62
|
+
}
|
|
63
|
+
|
|
52
64
|
const describedRooms = [...text.matchAll(/(?:^|[^\p{L}\p{N}_])(\d{1,2})\s*ta\s+(?:katta|kichkina)\s+xona(?=$|[^\p{L}\p{N}_])/giu)];
|
|
53
65
|
if (describedRooms.length > 1) {
|
|
54
66
|
const total = describedRooms.reduce((sum, match) => sum + Number(match[1]), 0);
|
package/src/locations.js
CHANGED
|
@@ -88,11 +88,47 @@ function normalizeUzSemanticLocations(country) {
|
|
|
88
88
|
});
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
+
const ODESA_FONTAN_STATION_RE = /^(?:[5-9]|1[0-6]) Fontan Station$/u;
|
|
92
|
+
|
|
93
|
+
function normalizeUaSemanticLocations(country) {
|
|
94
|
+
const odesa = country?.Odesa;
|
|
95
|
+
if (!odesa) return country;
|
|
96
|
+
|
|
97
|
+
// “5–16 station of Velykyi Fontan” are traditional listing/locality zones
|
|
98
|
+
// anchored to the Fontanska Road transit stops, not twelve standalone city
|
|
99
|
+
// microdistricts. Keep their parsing value but expose them as local areas.
|
|
100
|
+
const fontanStationAreas = Object.freeze(
|
|
101
|
+
(odesa.microdistricts || [])
|
|
102
|
+
.filter(({ name }) => ODESA_FONTAN_STATION_RE.test(name))
|
|
103
|
+
.map((entry) => Object.freeze({
|
|
104
|
+
...entry,
|
|
105
|
+
type: 'local_area',
|
|
106
|
+
entityType: 'local_area',
|
|
107
|
+
})),
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
return Object.freeze({
|
|
111
|
+
...country,
|
|
112
|
+
Odesa: Object.freeze({
|
|
113
|
+
...odesa,
|
|
114
|
+
microdistricts: Object.freeze(
|
|
115
|
+
(odesa.microdistricts || []).filter(({ name }) => !ODESA_FONTAN_STATION_RE.test(name)),
|
|
116
|
+
),
|
|
117
|
+
localAreas: Object.freeze([
|
|
118
|
+
...(odesa.localAreas || []),
|
|
119
|
+
...fontanStationAreas,
|
|
120
|
+
]),
|
|
121
|
+
}),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
91
125
|
const UZ_LOCATION_DICTIONARIES = normalizeUzSemanticLocations(mergeLocationCountries(
|
|
92
126
|
UZ_BASE_LOCATION_DICTIONARIES,
|
|
93
127
|
UZ_LOCATION_EXTENSIONS,
|
|
94
128
|
));
|
|
95
129
|
|
|
130
|
+
const UA_SEMANTIC_LOCATION_EXTENSIONS = normalizeUaSemanticLocations(UA_MAJOR_LOCATION_EXTENSIONS);
|
|
131
|
+
|
|
96
132
|
const COUNTRY_LOCATION_DICTIONARIES = Object.freeze({
|
|
97
133
|
...BASE_LOCATION_DICTIONARIES,
|
|
98
134
|
KZ: mergeLocationCountries(
|
|
@@ -102,7 +138,7 @@ const COUNTRY_LOCATION_DICTIONARIES = Object.freeze({
|
|
|
102
138
|
UZ: UZ_LOCATION_DICTIONARIES,
|
|
103
139
|
UA: mergeLocationCountries(
|
|
104
140
|
UA_EXTRA_LOCATION_DICTIONARIES,
|
|
105
|
-
|
|
141
|
+
UA_SEMANTIC_LOCATION_EXTENSIONS,
|
|
106
142
|
UA_REGIONAL_LOCATION_EXTENSIONS,
|
|
107
143
|
UA_SECONDARY_LOCATION_EXTENSIONS,
|
|
108
144
|
UA_METRO_LOCATION_EXTENSIONS,
|
|
@@ -44,5 +44,6 @@ export function matchTashkentNumberedArea(value: unknown, canonical: string): Ta
|
|
|
44
44
|
export function hasTashkentAreaAlias(value: unknown, canonical: string): boolean;
|
|
45
45
|
export function hasExplicitTashkentDistrict(value: unknown, canonical: string): boolean;
|
|
46
46
|
export function matchTashkentHousingDistrict(value: unknown): TashkentDistrictEntry | null;
|
|
47
|
+
export function matchTashkentHousingQuarter(value: unknown): Readonly<{ district: string; number: number; suffix: string }> | null;
|
|
47
48
|
export function matchTashkentHousingMetro(value: unknown): TashkentMetroEntry | null;
|
|
48
49
|
export function matchTashkentHousingTransit(value: unknown): TashkentHousingLocationEntry | null;
|
|
@@ -252,6 +252,23 @@ export function matchTashkentHousingDistrict(value) {
|
|
|
252
252
|
return null;
|
|
253
253
|
}
|
|
254
254
|
|
|
255
|
+
/**
|
|
256
|
+
* Resolve a numbered massif/quarter mention (e.g. "Юнусабад-7 кв",
|
|
257
|
+
* "Yunusabad-7") that matchTashkentHousingDistrict() deliberately defers,
|
|
258
|
+
* returning the district it belongs to alongside the quarter number.
|
|
259
|
+
*/
|
|
260
|
+
export function matchTashkentHousingQuarter(value) {
|
|
261
|
+
const text = String(value ?? '');
|
|
262
|
+
if (!text) return null;
|
|
263
|
+
for (const canonical of Object.keys(TASHKENT_NUMBERED_AREA_ALIASES)) {
|
|
264
|
+
const numbered = matchTashkentNumberedArea(text, canonical);
|
|
265
|
+
if (!numbered) continue;
|
|
266
|
+
const district = TASHKENT_HOUSING_DISTRICTS.find((entry) => entry.name === canonical) || null;
|
|
267
|
+
return Object.freeze({ district: district?.name || canonical, number: numbered.number, suffix: numbered.suffix });
|
|
268
|
+
}
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
|
|
255
272
|
const EXTRA_METRO_ALIASES = Object.freeze({
|
|
256
273
|
Sergeli: Object.freeze(['Sergile', 'Sergele']),
|
|
257
274
|
});
|
|
@@ -272,6 +289,11 @@ export function matchTashkentHousingMetro(value) {
|
|
|
272
289
|
const match = text.match(station.re);
|
|
273
290
|
if (!match) continue;
|
|
274
291
|
if (hasExplicitMetroContext(text, match)) return station;
|
|
292
|
+
// "Toshkent" is both a metro station and the city's own name, so a bare
|
|
293
|
+
// mention ("Toshkent shahri") is not evidence of the station the way a
|
|
294
|
+
// bare mention of any other station name would be. Require an explicit
|
|
295
|
+
// metro context for this one station specifically.
|
|
296
|
+
if (station.name === 'Toshkent') continue;
|
|
275
297
|
if (station.name === 'Qoyliq' && QOYLIQ_MASSIF_RE.test(text)) continue;
|
|
276
298
|
const areaCanonical = METRO_NUMBERED_AREA[station.name];
|
|
277
299
|
if (areaCanonical && matchTashkentNumberedArea(text, areaCanonical)) continue;
|
package/src/tashkent-pois.js
CHANGED
|
@@ -52,6 +52,7 @@ export const TASHKENT_MARKETS = Object.freeze([
|
|
|
52
52
|
poi('Eski Juva Bazaar', 'market', ['Эски Жува', 'Eski Juva']),
|
|
53
53
|
poi('Alay Bazaar', 'market', ['Алайский рынок', 'Алайский базар', 'Oloy bozori', 'Олой бозори']),
|
|
54
54
|
poi('Qoyliq Bazaar', 'market', ['Куйлюк базар', 'Куйлик базар', "Qo'yliq bozori", 'Qo‘yliq bozori', 'Qoʻyliq bozori']),
|
|
55
|
+
poi('Kuyluk Bazaar', 'market', ['Куйлюкский рынок', 'Куйлыкский базар', 'Kuyluk bazar']),
|
|
55
56
|
poi('Yunusobod Bazaar', 'market', ['Юнусабадский рынок', 'Yunusobod bozori']),
|
|
56
57
|
poi('Farhod Bazaar', 'market', ['Фархадский рынок', 'Фархадский базар', 'Farhod bozori']),
|
|
57
58
|
poi('Uch Qahramon Bazaar', 'market', ['Уч Кахрамон', 'Уч Кахрамон базар']),
|
|
@@ -85,6 +86,8 @@ export const TASHKENT_MALLS = Object.freeze([
|
|
|
85
86
|
poi('HT Mall', 'mall', ['HT Молл', 'HT savdo markazi']),
|
|
86
87
|
poi('Seoul Mun Mall', 'mall', ['Seoul Mun', 'Сеул Мун Молл', 'Seoul Mun savdo markazi'], { contextRequired: true, context: MALL_CONTEXT }),
|
|
87
88
|
poi('Ecobozor', 'mall', ['Eco Bozor', 'Ekobozor', 'Эко Бозор', 'Экобозор']),
|
|
89
|
+
poi('Magnum Samarkand Darvoza', 'mall', ['Magnum super', 'Magnum Supermarket', 'Магнум Самарканд Дарвоза']),
|
|
90
|
+
poi('Baraka Market', 'mall', ['Baraka market', 'Baraka Supermarket', 'Baraka Savdo', 'Барака маркет', 'Барака Савдо']),
|
|
88
91
|
]);
|
|
89
92
|
|
|
90
93
|
export const TASHKENT_ATTRACTIONS = Object.freeze([
|
|
@@ -150,6 +153,14 @@ export const TASHKENT_UNIVERSITIES = Object.freeze([
|
|
|
150
153
|
poi('New Uzbekistan University', 'university', ['Новый университет Узбекистана']),
|
|
151
154
|
]);
|
|
152
155
|
|
|
156
|
+
export const TASHKENT_SCHOOLS = Object.freeze([
|
|
157
|
+
poi('Tashkent International School', 'school', ['TIS', 'American School Tashkent', 'Международная школа Ташкента', 'Ташкентская международная школа']),
|
|
158
|
+
poi('Academic Lyceum under WIUT', 'school', ['ALWIUT', 'Westminster Academic Lyceum', 'Академический лицей при Вестминстерском университете', 'Лицей Вестминстер']),
|
|
159
|
+
poi('Academic Lyceum under TMA', 'school', ['TMA Academic Lyceum', 'Академический лицей при ТМА', 'Лицей Ташкентской медицинской академии']),
|
|
160
|
+
poi('Tashkent Ulugbek International School', 'school', ['Ulugbek International School', 'Улугбекская международная школа', 'Международная школа Улугбека']),
|
|
161
|
+
poi('Uzbek International School Invento', 'school', ['Invento International School', 'Invento School', 'Международная школа Invento', 'Школа Invento']),
|
|
162
|
+
]);
|
|
163
|
+
|
|
153
164
|
export const TASHKENT_MEDICAL_POIS = Object.freeze([
|
|
154
165
|
TASHKENT_MEDICAL_ACADEMY,
|
|
155
166
|
poi('Tashkent City Hospital No. 1', 'medical', ['1-я городская больница']),
|
|
@@ -160,6 +171,13 @@ export const TASHKENT_MEDICAL_POIS = Object.freeze([
|
|
|
160
171
|
poi('Republican Oncology Center', 'medical', ['Республиканский онкоцентр', 'Онкология']),
|
|
161
172
|
poi('Republican Cardiology Center', 'medical', ['Республиканский кардиоцентр', 'Кардиоцентр']),
|
|
162
173
|
poi('Republican Emergency Medical Center', 'medical', ['Республиканский центр экстренной медицинской помощи']),
|
|
174
|
+
poi('Republican Research Centre of Emergency Medicine', 'medical', ['Tashkent Emergency Medicine Center', 'Республиканский научный центр экстренной медицинской помощи', 'Республиканский центр экстренной медицины', '16-я городская больница']),
|
|
175
|
+
poi('Republican Ophthalmology Hospital', 'medical', ['Republican Eye Hospital', 'Республиканская офтальмологическая больница', 'Республиканская глазная больница']),
|
|
176
|
+
poi('Republican Hematology Center', 'medical', ['Tashkent Hematology Center', 'Республиканский гематологический центр', 'Центр гематологии']),
|
|
177
|
+
poi('Republican Thoracic Surgery Center Vakhidov', 'medical', ['Vakhidov Thoracic Surgery Center', 'Республиканский центр грудной хирургии им. Вахидова', 'Центр грудной хирургии Вахидова']),
|
|
178
|
+
poi('Tashkent International Clinic', 'medical', ['TIMC', 'Tashkent International Medical Clinic', 'Ташкентская международная клиника']),
|
|
179
|
+
poi('Republican Pathological Anatomy Center', 'medical', ['Republican Pathology Center', 'Республиканский патологоанатомический центр', 'Центр патологической анатомии']),
|
|
180
|
+
poi('Republic Specialized Nephrology and Transplantation Centre', 'medical', ['Republican Nephrology Center', 'Республиканский нефрологический центр', 'Центр нефрологии и трансплантации']),
|
|
163
181
|
poi('Republican Perinatal Center', 'medical', ['Республиканский перинатальный центр', 'Перинатальный центр']),
|
|
164
182
|
poi('Institute of Obstetrics and Gynecology', 'medical', ['Институт акушерства и гинекологии']),
|
|
165
183
|
]);
|
|
@@ -177,6 +195,7 @@ export const TASHKENT_POI_GROUPS = Object.freeze({
|
|
|
177
195
|
malls: TASHKENT_MALLS,
|
|
178
196
|
attractions: TASHKENT_ATTRACTIONS,
|
|
179
197
|
culture: TASHKENT_CULTURAL_POIS,
|
|
198
|
+
schools: TASHKENT_SCHOOLS,
|
|
180
199
|
transport: TASHKENT_TRANSPORT_POIS,
|
|
181
200
|
universities: TASHKENT_UNIVERSITIES,
|
|
182
201
|
medical: TASHKENT_MEDICAL_POIS,
|
|
@@ -177,10 +177,10 @@ export const UA_REGIONAL_LOCATION_EXTENSIONS = Object.freeze({
|
|
|
177
177
|
|
|
178
178
|
Chernivtsi: city({
|
|
179
179
|
microdistricts: [
|
|
180
|
-
['Tsentr','Центр'],['Prospekt','Проспект'],['Komarova','Комарова'],['Pivdenno-Kiltseva','Південно-Кільцева','Южно-Кольцевая'],['Hraviton','Гравітон','Гравитон'],['Kalichanka','Калічанка','Каличанка'],['Sadgora','Садгора','Садгірський','Садгірський район'],['Roscha','Роша'],['Klokuchka','Клокучка'],['Roscha-Stynka','Роша-Стинка'],['Tsetsyno','Цецино'],['Lenkivtsi','Ленківці','Ленковцы'],['
|
|
180
|
+
['Tsentr','Центр'],['Prospekt','Проспект'],['Komarova','Комарова'],['Pivdenno-Kiltseva','Південно-Кільцева','Южно-Кольцевая'],['Hraviton','Гравітон','Гравитон'],['Kalichanka','Калічанка','Каличанка'],['Sadgora','Садгора','Садгірський','Садгірський район'],['Roscha','Роша'],['Klokuchka','Клокучка'],['Roscha-Stynka','Роша-Стинка'],['Tsetsyno','Цецино'],['Lenkivtsi','Ленківці','Ленковцы'],['Fastivska','Фастівська'],
|
|
181
181
|
],
|
|
182
182
|
residentialComplexes: [
|
|
183
|
-
['Vodohrai','ЖК Водограй'],['Compass','ЖК Compass','ЖК Компас'],['
|
|
183
|
+
['Vodohrai','ЖК Водограй'],['Compass','ЖК Compass','ЖК Компас'],['Comfort Hall','ЖК Comfort Hall'],['Kyivskyi','ЖК Київський','ЖК Киевский'],['Rodynnyi','ЖК Родинний','ЖК Родинный'],['Panorama','ЖК Panorama'],['Park Avenue','ЖК Park Avenue'],['Central','ЖК Central'],
|
|
184
184
|
],
|
|
185
185
|
landmarks: [
|
|
186
186
|
['Metropolitan Residence','Резиденція митрополитів','Резиденция митрополитов'],['Chernivtsi University','ЧНУ','університет Федьковича'],['Teatralna Square','Театральна площа'],['Central Square','Центральна площа'],['Turkish Square','Турецька площа','Турецька криниця'],['Kobylianska Street','Ольги Кобилянської','вулиця Кобилянської'],['Shevchenko Park','парк Шевченка'],['Botanical Garden','Ботанічний сад'],['City Hall','Ратуша'],
|