tr-adres 0.1.0__py3-none-any.whl

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.
tr_adres/__init__.py ADDED
@@ -0,0 +1,85 @@
1
+ """tr-adres: parse and normalise Turkish postal addresses.
2
+
3
+ >>> import tr_adres
4
+ >>> a = tr_adres.parse("Caferaga mh. Moda cd. No:12/3 Kadikoy/Istanbul")
5
+ >>> a.mahalle, a.cadde, a.bina_no, a.daire_no, a.ilce, a.il
6
+ ('Caferağa', 'Moda', '12', '3', 'Kadıköy', 'İstanbul')
7
+ >>> tr_adres.normalize("ataturk mah 1234 sk no 5 d 7 bornova izmir")
8
+ 'Atatürk Mah. 1234 Sk. No:5 D:7 Bornova/İzmir'
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import sys
14
+
15
+ from .formatter import STILLER, format_adres, normalize
16
+ from .gazetteer import (
17
+ Il,
18
+ Ilce,
19
+ il_bul,
20
+ ilce_ara,
21
+ ilce_bul,
22
+ ilceler,
23
+ iller,
24
+ is_valid_ilce,
25
+ kaynak,
26
+ merkez_ilce,
27
+ plaka,
28
+ posta_kodu_il,
29
+ posta_kodu_ilceler,
30
+ )
31
+ from .metin import ascii_fold, edit_distance, tr_lower, tr_title, tr_upper
32
+ from .model import ALANLAR, Adres
33
+ from .parser import parse, parse_many
34
+
35
+ __version__ = "0.1.0"
36
+
37
+ #: Alias of :func:`format_adres` (``tr_adres.format(adres, style="resmi")``).
38
+ format = format_adres # noqa: A001
39
+
40
+
41
+ def register_pandas_accessor() -> None:
42
+ """Register the ``Series.tradres`` accessor (requires the ``pandas`` extra).
43
+
44
+ Called automatically on import when pandas has already been imported; otherwise call
45
+ it yourself or ``import tr_adres.pandas_ext``.
46
+ """
47
+ from . import pandas_ext # noqa: F401
48
+
49
+
50
+ if "pandas" in sys.modules: # pragma: no cover - depends on import order
51
+ try:
52
+ register_pandas_accessor()
53
+ except ImportError:
54
+ pass
55
+
56
+ __all__ = [
57
+ "ALANLAR",
58
+ "Adres",
59
+ "Il",
60
+ "Ilce",
61
+ "STILLER",
62
+ "__version__",
63
+ "ascii_fold",
64
+ "edit_distance",
65
+ "format",
66
+ "format_adres",
67
+ "il_bul",
68
+ "ilce_ara",
69
+ "ilce_bul",
70
+ "ilceler",
71
+ "iller",
72
+ "is_valid_ilce",
73
+ "kaynak",
74
+ "merkez_ilce",
75
+ "normalize",
76
+ "parse",
77
+ "parse_many",
78
+ "plaka",
79
+ "posta_kodu_il",
80
+ "posta_kodu_ilceler",
81
+ "register_pandas_accessor",
82
+ "tr_lower",
83
+ "tr_title",
84
+ "tr_upper",
85
+ ]
tr_adres/__main__.py ADDED
@@ -0,0 +1,7 @@
1
+ """``python -m tr_adres`` runs the command-line interface."""
2
+
3
+ import sys
4
+
5
+ from .cli import main
6
+
7
+ sys.exit(main())
tr_adres/_sozluk.py ADDED
@@ -0,0 +1,62 @@
1
+ """Diacritic restoration for ASCII-typed words ("Ataturk" → "Atatürk").
2
+
3
+ Only words whose ASCII-folded form maps to a single Turkish spelling are restored. The
4
+ list is deliberately small: common words of street, neighbourhood and building names plus
5
+ the names of all provinces and of districts with five or more letters. Words not listed
6
+ here are left as typed.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from functools import lru_cache
12
+ from typing import Dict
13
+
14
+ from .metin import anahtar
15
+
16
+ _KELIMELER = """
17
+ Atatürk İstiklal İnönü Paşa Şehit Şehitler Şht Bağdat Büyükdere Çakmak Kazım İsmet
18
+ Yıldız Güneş Çiçek Gül Menekşe Çınar Çamlık Çamlıca Bahçe Bahçeli Bahçesi Yeşil Hürriyet
19
+ Özgürlük İstasyon Çarşı Çarşısı Köprü Köprüsü Kültür Üniversite Ömer Hüseyin Şair Hacı
20
+ Kızılay Gökalp Talatpaşa Nişantaşı Teşvikiye Maçka Kuruçeşme Caferağa Göztepe Erenköy
21
+ Bostancı Kozyatağı Ataköy Yeşilköy Şirinevler Güneşli Mecidiyeköy Karşıyaka Bostanlı
22
+ Mavişehir Batıkent Keçiören Işıklar Görükle Özlüce Çekirge Kardeşler Barış İnci Zümrüt
23
+ Çağlayan Gündoğdu Doğu Batı Güney Üçyol Beşyol Fırat Beyazıt Süleymaniye Şişhane
24
+ Gümüşsuyu Feriköy Kurtuluş Ağaçlı Çağdaş Gökkuşağı Söğüt Söğütlü Meşe Ihlamur Fındık
25
+ Üzüm İkbal İnkılap Bağlar Bağlarbaşı Güzelyalı Güzeltepe Göl Değirmen Değirmendere
26
+ Pınar Köşk Köşkü Sarayı Çıkmazı Bulvarı Sokağı Apartmanı Konutları Hanı Pasajı
27
+ Öğretmenler Öğretmen Özal Çınarlı Güzel Ağa Hanım Şeyh Ilıca Kaplıca Çeşmesi Köyü Gümüş
28
+ Altın Bakır Taşlı Topkapı Kumkapı Edirnekapı Yusufpaşa Cerrahpaşa Şehremini
29
+ Kocamustafapaşa Halkalı Sefaköy Sultançiftliği Fevzipaşa Çayyolu Ümitköy Etlik Şirinyer
30
+ Üçkuyular Kemeraltı Laleli Tarabya Yeniköy İstinye Bebek Çengelköy Kuzguncuk Beylerbeyi
31
+ Kanlıca Paşabahçe Anadoluhisarı Rumelihisarı Hisarüstü Ayazağa Gültepe Okmeydanı
32
+ Kasımpaşa Hasköy Sütlüce Eyüp Alibeyköy Mahmutbey Bahçeşehir Gürpınar Ambarlı Cihangir
33
+ Tarlabaşı Karaköy Kabataş Dolmabahçe Gayrettepe Zincirlikuyu Vişnezade Türkali Abbasağa
34
+ Hükümet Gençlik Sağlık Toptancılar Küçük Büyük Üst Aşağı Yukarı İçerenköy İçmeler
35
+ Geçit Meydanı Yokuşu Kavşağı Çıkmaz Sümer Selçuk Selçuklu Osmanlı Fatih Mehmet Ahmet
36
+ Mahmut Şükrü Rüştü Gürsel Özgür Doğan Gökhan Ümit Türk Türkmen Sakız Şeker Yaşar
37
+ Fevzi Çelebi Ertuğrul Orhangazi Kanuni Muradiye Uğur Ilgaz Şafak Şenlik Şirin
38
+ Gökçe Gökçen Göksu Aydınlık Aydınlıkevler Esenyalı Kartaltepe Şenesenevler Bağcılar
39
+ Eğitim Öğrenci Hastane Müze Kışla Kışlası Tepebaşı Ulubatlı Hasan Kocatepe Dumlupınar
40
+ Sakarya Kocaeli Gazi Mustafa Kemal Paşabahçe Ağaçlı Şükran Gülbahçe Gülistan Gülşen
41
+ """
42
+
43
+
44
+ @lru_cache(maxsize=1)
45
+ def duzeltme_sozlugu() -> Dict[str, str]:
46
+ """Folded key → Turkish spelling, for unambiguous words only."""
47
+ from .gazetteer import iller
48
+
49
+ words = list(_KELIMELER.split())
50
+ for il in iller():
51
+ words.append(il.ad)
52
+ words.extend(n for n in il.ilceler if " " not in n and len(anahtar(n)) >= 5)
53
+ out: Dict[str, str] = {}
54
+ clash = set()
55
+ for w in words:
56
+ k = anahtar(w)
57
+ if k in out and out[k] != w:
58
+ clash.add(k)
59
+ out.setdefault(k, w)
60
+ for k in clash:
61
+ del out[k]
62
+ return out
tr_adres/cli.py ADDED
@@ -0,0 +1,160 @@
1
+ """Command-line interface: ``tr-adres parse`` and ``tr-adres normalize``.
2
+
3
+ Examples::
4
+
5
+ tr-adres parse "Caferağa Mah. Moda Cad. No:12/3 Kadıköy/İstanbul"
6
+ tr-adres normalize "caferaga mh moda cd no 12 kadikoy"
7
+ tr-adres normalize musteriler.csv --column adres -o temiz.csv
8
+ tr-adres parse musteriler.csv --column adres -o ayrik.csv
9
+ cat adresler.txt | tr-adres normalize -
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import argparse
15
+ import csv
16
+ import io
17
+ import json
18
+ import os
19
+ import sys
20
+ from typing import IO, Iterator, List, Optional, Sequence
21
+
22
+ from . import __version__
23
+ from .formatter import STILLER, format_adres
24
+ from .model import ALANLAR
25
+ from .parser import parse
26
+
27
+ __all__ = ["main"]
28
+
29
+ _PARSE_COLUMNS = [*ALANLAR, "il_plaka", "confidence", "kalan"]
30
+
31
+
32
+ def _is_file(arg: str, column: Optional[str]) -> bool:
33
+ if column is not None:
34
+ return True
35
+ return arg.lower().endswith((".csv", ".tsv", ".txt")) and os.path.isfile(arg)
36
+
37
+
38
+ def _sniff(sample: str) -> str:
39
+ try:
40
+ return csv.Sniffer().sniff(sample, delimiters=",;\t|").delimiter
41
+ except csv.Error:
42
+ return ","
43
+
44
+
45
+ def _stdin_lines() -> Iterator[str]:
46
+ for line in sys.stdin:
47
+ line = line.rstrip("\r\n")
48
+ if line.strip():
49
+ yield line
50
+
51
+
52
+ def _run_text(cmd: str, texts: Sequence[str], style: str, out: IO[str]) -> None:
53
+ for text in texts:
54
+ if cmd == "parse":
55
+ d = parse(text).to_dict()
56
+ indent = 2 if len(texts) == 1 else None
57
+ out.write(json.dumps(d, ensure_ascii=False, indent=indent) + "\n")
58
+ else:
59
+ out.write(format_adres(parse(text), style) + "\n")
60
+
61
+
62
+ def _run_csv(args: argparse.Namespace, out: IO[str]) -> int:
63
+ with open(args.input, encoding=args.encoding, newline="") as fh:
64
+ sample = fh.read(65536)
65
+ fh.seek(0)
66
+ delim = args.delimiter or _sniff(sample)
67
+ reader = csv.DictReader(fh, delimiter=delim)
68
+ fields = list(reader.fieldnames or [])
69
+ column = args.column
70
+ if column is None:
71
+ column = "adres" if "adres" in fields else (fields[0] if len(fields) == 1 else None)
72
+ if column is None or column not in fields:
73
+ print(
74
+ f"tr-adres: column {column or '(none given)'!r} not found; "
75
+ f"available: {', '.join(fields)}",
76
+ file=sys.stderr,
77
+ )
78
+ return 2
79
+ if args.command == "parse":
80
+ prefix = args.prefix if args.prefix is not None else f"{column}_"
81
+ new_cols = [prefix + c for c in _PARSE_COLUMNS]
82
+ else:
83
+ new_cols = [args.output_column or f"{column}_normalize"]
84
+ writer = csv.DictWriter(
85
+ out, fieldnames=fields + [c for c in new_cols if c not in fields], delimiter=delim
86
+ )
87
+ writer.writeheader()
88
+ n = 0
89
+ for row in reader:
90
+ text = row.get(column) or ""
91
+ if args.command == "parse":
92
+ d = parse(text).to_dict()
93
+ for c, name in zip(_PARSE_COLUMNS, new_cols):
94
+ v = d[c]
95
+ row[name] = "" if v is None else v
96
+ else:
97
+ row[new_cols[0]] = format_adres(parse(text), args.style) if text.strip() else ""
98
+ writer.writerow(row)
99
+ n += 1
100
+ print(f"tr-adres: {n} satır işlendi", file=sys.stderr)
101
+ return 0
102
+
103
+
104
+ def _build_parser() -> argparse.ArgumentParser:
105
+ ap = argparse.ArgumentParser(
106
+ prog="tr-adres", description="Parse and normalise Turkish postal addresses."
107
+ )
108
+ ap.add_argument("--version", action="version", version=f"tr-adres {__version__}")
109
+ sub = ap.add_subparsers(dest="command", required=True)
110
+ for name, help_text in (
111
+ ("parse", "split an address into its components (JSON, or columns for a CSV)"),
112
+ ("normalize", "rewrite an address in canonical one-line form"),
113
+ ):
114
+ p = sub.add_parser(name, help=help_text, description=help_text)
115
+ p.add_argument("input", help="address text, a .csv file, or '-' for one address per line")
116
+ p.add_argument("--column", "-c", help="CSV column holding the address (default: adres)")
117
+ p.add_argument("-o", "--output", help="output file (default: stdout)")
118
+ p.add_argument("--style", choices=STILLER, default="kargo", help="normalize style")
119
+ p.add_argument("--delimiter", help="CSV delimiter (default: sniffed)")
120
+ p.add_argument("--encoding", default="utf-8-sig", help="input encoding")
121
+ p.add_argument(
122
+ "--output-encoding",
123
+ default="utf-8",
124
+ help="output file encoding (use utf-8-sig for Excel)",
125
+ )
126
+ if name == "parse":
127
+ p.add_argument("--prefix", help="prefix of the added CSV columns (default: COLUMN_)")
128
+ else:
129
+ p.add_argument("--output-column", help="name of the added CSV column")
130
+ return ap
131
+
132
+
133
+ def main(argv: Optional[List[str]] = None) -> int:
134
+ """Entry point of the ``tr-adres`` command; returns the exit status."""
135
+ args = _build_parser().parse_args(argv)
136
+ if args.output:
137
+ out: IO[str] = open(args.output, "w", encoding=args.output_encoding, newline="")
138
+ else:
139
+ out = sys.stdout
140
+ if isinstance(out, io.TextIOWrapper) and out.encoding.lower() not in ("utf-8", "utf8"):
141
+ try:
142
+ out.reconfigure(encoding="utf-8")
143
+ except (AttributeError, ValueError): # pragma: no cover
144
+ pass
145
+ try:
146
+ if args.input != "-" and _is_file(args.input, args.column):
147
+ if not os.path.isfile(args.input):
148
+ print(f"tr-adres: file not found: {args.input}", file=sys.stderr)
149
+ return 2
150
+ return _run_csv(args, out)
151
+ texts = list(_stdin_lines()) if args.input == "-" else [args.input]
152
+ _run_text(args.command, texts, args.style, out)
153
+ return 0
154
+ finally:
155
+ if args.output:
156
+ out.close()
157
+
158
+
159
+ if __name__ == "__main__": # pragma: no cover
160
+ sys.exit(main())
@@ -0,0 +1 @@
1
+ {"kaynak":{"ilce_adlari":"T.C. İçişleri Bakanlığı, Mülki İdare Bölümleri Envanteri","posta_kodlari":"PTT posta kodu sorgusu (ilçe başına en küçük-en büyük aralık)","derleme":"tr.wikipedia.org 'Türkiye'nin ilçeleri', revizyon 37373921","erisim":"2026-11-08"},"il_sayisi":81,"ilce_sayisi":973,"iller":[[1,"Adana",[["Aladağ",[[1720,1722]]],["Ceyhan",[[1920,1924]]],["Çukurova",[[1170,1360]]],["Feke",[[1660,1662]]],["İmamoğlu",[[1700,1702]]],["Karaisalı",[[1770,1770]]],["Karataş",[[1900,1900]]],["Kozan",[[1500,1502]]],["Pozantı",[[1470,1490]]],["Saimbeyli",[[1740,1740]]],["Sarıçam",[[1250,1790]]],["Seyhan",[[1020,1355]]],["Tufanbeyli",[[1640,1642]]],["Yumurtalık",[[1680,1682]]],["Yüreğir",[[1220,1415]]]]],[2,"Adıyaman",[["Adıyaman",[[2010,2290]]],["Besni",[[2300,2348]]],["Çelikhan",[[2600,2610]]],["Gerger",[[2702,2702]]],["Gölbaşı",[[2502,2540]]],["Kâhta",[[2402,2450]]],["Samsat",[[2802,2802]]],["Sincik",[[2900,2902]]],["Tut",[[2350,2352]]]]],[3,"Afyonkarahisar",[["Afyonkarahisar",[[3030,3215]]],["Başmakçı",[[3450,3452]]],["Bayat",[[3780,3782]]],["Bolvadin",[[3300,3350]]],["Çay",[[3700,3720]]],["Çobanlar",[[3062,3107]]],["Dazkırı",[[3950,3952]]],["Dinar",[[3400,3490]]],["Emirdağ",[[3602,3680]]],["Evciler",[[3960,3962]]],["Hocalar",[[3532,3532]]],["İhsaniye",[[3370,3384]]],["İscehisar",[[3750,3754]]],["Kızılören",[[3560,3562]]],["Sandıklı",[[3500,3510]]],["Sinanpaşa",[[3110,3880]]],["Sultandağı",[[3900,3940]]],["Şuhut",[[3800,3830]]]]],[4,"Ağrı",[["Ağrı",[[4010,4200]]],["Diyadin",[[4900,4902]]],["Doğubayazıt",[[4400,4402]]],["Eleşkirt",[[4602,4640]]],["Hamur",[[4852,4852]]],["Patnos",[[4500,4510]]],["Taşlıçay",[[4800,4802]]],["Tutak",[[4700,4702]]]]],[5,"Amasya",[["Amasya",[[5100,5240]]],["Göynücek",[[5902,5902]]],["Gümüşhacıköy",[[5700,5702]]],["Hamamözü",[[5720,5722]]],["Merzifon",[[5300,5302]]],["Suluova",[[5500,5502]]],["Taşova",[[5800,5802]]]]],[6,"Ankara",[["Akyurt",[[6750,6750]]],["Altındağ",[[6080,6360]]],["Ayaş",[[6710,6710]]],["Balâ",[[6720,6720]]],["Beypazarı",[[6730,6730]]],["Çamlıdere",[[6740,6740]]],["Çankaya",[[6420,6810]]],["Çubuk",[[6760,6760]]],["Elmadağ",[[6780,6850]]],["Etimesgut",[[6790,6827]]],["Evren",[[6770,6770]]],["Gölbaşı",[[6830,6830]]],["Güdül",[[6840,6840]]],["Haymana",[[6860,6860]]],["Kahramankazan",[[6980,6980]]],["Kalecik",[[6870,6870]]],["Keçiören",[[6010,6300]]],["Kızılcahamam",[[6890,6890]]],["Mamak",[[6260,6852]]],["Nallıhan",[[6920,6920]]],["Polatlı",[[6900,6900]]],["Pursaklar",[[6145,6145]]],["Sincan",[[6909,6946]]],["Şereflikoçhisar",[[6950,6950]]],["Yenimahalle",[[6105,6560]]]]],[7,"Antalya",[["Akseki",[[7630,7650]]],["Aksu",[[7112,7112]]],["Alanya",[[7400,7450]]],["Demre",[[7570,7572]]],["Döşemealtı",[[7190,7190]]],["Elmalı",[[7700,7700]]],["Finike",[[7740,7740]]],["Gazipaşa",[[7900,7900]]],["Gündoğmuş",[[7860,7860]]],["İbradı",[[7680,7680]]],["Kaş",[[7580,7974]]],["Kemer",[[7980,7995]]],["Kepez",[[7020,7320]]],["Konyaaltı",[[7070,7130]]],["Korkuteli",[[7800,7800]]],["Kumluca",[[7350,7350]]],["Manavgat",[[7550,7600]]],["Muratpaşa",[[7040,7300]]],["Serik",[[7500,7500]]]]],[8,"Artvin",[["Ardanuç",[[8390,8390]]],["Arhavi",[[8200,8290]]],["Artvin",[[8100,8100]]],["Borçka",[[8400,8490]]],["Hopa",[[8600,8690]]],["Kemalpaşa",[]],["Murgul",[[8500,8590]]],["Şavşat",[[8700,8790]]],["Yusufeli",[[8800,8890]]]]],[9,"Aydın",[["Bozdoğan",[[9760,9760]]],["Buharkent",[[9670,9670]]],["Çine",[[9500,9500]]],["Didim",[[9270,9270]]],["Efeler",[[9010,9630]]],["Germencik",[[9330,9700]]],["İncirliova",[[9600,9600]]],["Karacasu",[[9370,9370]]],["Karpuzlu",[[9540,9540]]],["Koçarlı",[[9970,9970]]],["Köşk",[[9570,9570]]],["Kuşadası",[[9400,9400]]],["Kuyucak",[[9930,9930]]],["Nazilli",[[9800,9800]]],["Söke",[[9200,9200]]],["Sultanhisar",[[9470,9470]]],["Yenipazar",[[9350,9350]]]]],[10,"Balıkesir",[["Altıeylül",[[10040,10195]]],["Ayvalık",[[10280,10410]]],["Balya",[[10842,10842]]],["Bandırma",[[10200,10250]]],["Bigadiç",[[10440,10463]]],["Burhaniye",[[10700,10702]]],["Dursunbey",[[10802,10802]]],["Edremit",[[10300,10870]]],["Erdek",[[10500,10502]]],["Gömeç",[[10715,10720]]],["Gönen",[[10680,10902]]],["Havran",[[10560,10562]]],["İvrindi",[[10770,10780]]],["Karesi",[[10010,10180]]],["Kepsut",[[10662,10662]]],["Manyas",[[10740,10742]]],["Marmara",[[10360,10940]]],["Savaştepe",[[10580,10582]]],["Sındırgı",[[10330,10332]]],["Susurluk",[[10600,10610]]]]],[11,"Bilecik",[["Bilecik",[[11100,11230]]],["Bozüyük",[[11300,11460]]],["Gölpazarı",[[11700,11702]]],["İnhisar",[[11640,11642]]],["Osmaneli",[[11500,11502]]],["Pazaryeri",[[11800,11802]]],["Söğüt",[[11600,11602]]],["Yenipazar",[[11780,11782]]]]],[12,"Bingöl",[["Adaklı",[[12600,12602]]],["Bingöl",[[12002,12402]]],["Genç",[[12500,12502]]],["Karlıova",[[12902,12902]]],["Kiğı",[[12800,12802]]],["Solhan",[[12700,12702]]],["Yayladere",[[12650,12652]]],["Yedisu",[[12830,12832]]]]],[13,"Bitlis",[["Adilcevaz",[[13500,13504]]],["Ahlat",[[13400,13403]]],["Bitlis",[[13001,13100]]],["Güroymak",[[13800,13810]]],["Hizan",[[13600,13602]]],["Mutki",[[13700,13705]]],["Tatvan",[[13200,13202]]]]],[14,"Bolu",[["Bolu",[[14030,14300]]],["Dörtdivan",[[14910,14912]]],["Gerede",[[14900,14902]]],["Göynük",[[14780,14782]]],["Kıbrıscık",[[14610,14612]]],["Mengen",[[14840,14850]]],["Mudurnu",[[14800,14810]]],["Seben",[[14750,14752]]],["Yeniçağa",[[14650,14652]]]]],[15,"Burdur",[["Ağlasun",[[15800,15802]]],["Altınyayla",[[15420,15422]]],["Bucak",[[15300,15325]]],["Burdur",[[15030,15200]]],["Çavdır",[[15900,15930]]],["Çeltikçi",[[15070,15072]]],["Gölhisar",[[15400,15413]]],["Karamanlı",[[15700,15702]]],["Kemer",[[15090,15092]]],["Tefenni",[[15600,15602]]],["Yeşilova",[[15500,15502]]]]],[16,"Bursa",[["Büyükorhan",[[16990,16990]]],["Gemlik",[[16600,16600]]],["Gürsu",[[16580,16580]]],["Harmancık",[[16770,16770]]],["İnegöl",[[16400,16400]]],["İznik",[[16860,16860]]],["Karacabey",[[16700,16700]]],["Keles",[[16740,16740]]],["Kestel",[[16450,16450]]],["Mudanya",[[16940,16940]]],["Mustafakemalpaşa",[[16500,16500]]],["Nilüfer",[[16215,16290]]],["Orhaneli",[[16980,16980]]],["Orhangazi",[[16800,16800]]],["Osmangazi",[[16010,16190]]],["Yenişehir",[[16900,16900]]],["Yıldırım",[[16300,16370]]]]],[17,"Çanakkale",[["Ayvacık",[[17862,17980]]],["Bayramiç",[[17720,17722]]],["Biga",[[17202,17950]]],["Bozcaada",[[17680,17680]]],["Çan",[[17400,17410]]],["Çanakkale",[[17100,17110]]],["Eceabat",[[17900,17902]]],["Ezine",[[17600,17610]]],["Gelibolu",[[17340,17502]]],["Gökçeada",[[17760,17762]]],["Lapseki",[[17800,17820]]],["Yenice",[[17550,17600]]]]],[18,"Çankırı",[["Atkaracalar",[[18310,18315]]],["Bayramören",[[18320,18322]]],["Çankırı",[[18010,18200]]],["Çerkeş",[[18600,18602]]],["Eldivan",[[18700,18702]]],["Ilgaz",[[18400,18402]]],["Kızılırmak",[[18280,18282]]],["Korgun",[[18260,18262]]],["Kurşunlu",[[18300,18302]]],["Orta",[[18800,18802]]],["Şabanözü",[[18650,18652]]],["Yapraklı",[[18900,18902]]]]],[19,"Çorum",[["Alaca",[[19600,19602]]],["Bayat",[[19800,19802]]],["Boğazkale",[[19310,19312]]],["Çorum",[[19010,19200]]],["Dodurga",[[19060,19062]]],["İskilip",[[19400,19402]]],["Kargı",[[19900,19902]]],["Laçin",[[19020,19022]]],["Mecitözü",[[19700,19702]]],["Oğuzlar",[[19070,19072]]],["Ortaköy",[[19950,19952]]],["Osmancık",[[19500,19502]]],["Sungurlu",[[19300,19302]]],["Uğurludağ",[[19410,19412]]]]],[20,"Denizli",[["Acıpayam",[[20800,20800]]],["Babadağ",[[20480,20480]]],["Baklan",[]],["Bekilli",[[20930,20930]]],["Beyağaç",[[20590,20590]]],["Bozkurt",[[20370,20370]]],["Buldan",[[20400,20400]]],["Çal",[[20700,20700]]],["Çameli",[[20980,20980]]],["Çardak",[[20350,20350]]],["Çivril",[[20600,20600]]],["Güney",[[20460,20460]]],["Honaz",[[20330,20330]]],["Kale",[[20570,20570]]],["Merkezefendi",[[20010,20060]]],["Pamukkale",[[20150,20260]]],["Sarayköy",[[20300,20300]]],["Serinhisar",[[20430,20430]]],["Tavas",[[20500,20500]]]]],[21,"Diyarbakır",[["Bağlar",[[21050,21090]]],["Bismil",[[21500,21500]]],["Çermik",[[21600,21600]]],["Çınar",[[21750,21750]]],["Çüngüş",[[21870,21870]]],["Dicle",[[21830,21830]]],["Eğil",[[21470,21470]]],["Ergani",[[21950,21950]]],["Hani",[[21800,21800]]],["Hazro",[[21560,21560]]],["Kayapınar",[[21070,21070]]],["Kocaköy",[[21450,21450]]],["Kulp",[[21900,21900]]],["Lice",[[21700,21700]]],["Silvan",[[21640,21640]]],["Sur",[[21200,21300]]],["Yenişehir",[[21010,21100]]]]],[22,"Edirne",[["Edirne",[[22100,22130]]],["Enez",[[22700,22750]]],["Havsa",[[22500,22532]]],["İpsala",[[22400,22490]]],["Keşan",[[22272,22880]]],["Lalapaşa",[[22970,22970]]],["Meriç",[[22600,22680]]],["Süloğlu",[[22560,22580]]],["Uzunköprü",[[22200,22402]]]]],[23,"Elazığ",[["Ağın",[[23960,23962]]],["Alacakaya",[[23410,23412]]],["Arıcak",[[23510,23527]]],["Baskil",[[23800,23802]]],["Elazığ",[[23050,23370]]],["Karakoçan",[[23600,23602]]],["Keban",[[23700,23702]]],["Kovancılar",[[23850,23852]]],["Maden",[[23400,23402]]],["Palu",[[23500,23502]]],["Sivrice",[[23900,23902]]]]],[24,"Erzincan",[["Çayırlı",[[24500,24503]]],["Erzincan",[[24002,24100]]],["İliç",[[24700,24710]]],["Kemah",[[24400,24402]]],["Kemaliye",[[24600,24620]]],["Otlukbeli",[[24510,24515]]],["Refahiye",[[24300,24302]]],["Tercan",[[24800,24802]]],["Üzümlü",[[24150,24160]]]]],[25,"Erzurum",[["Aşkale",[[25500,25500]]],["Aziziye",[[25700,25700]]],["Çat",[[25750,25750]]],["Hınıs",[[25600,25600]]],["Horasan",[[25800,25800]]],["İspir",[[25900,25900]]],["Karaçoban",[[25610,25610]]],["Karayazı",[[25830,25830]]],["Köprüköy",[[25320,25320]]],["Narman",[[25530,25530]]],["Oltu",[[25400,25400]]],["Olur",[[25650,25650]]],["Palandöken",[[25070,25080]]],["Pasinler",[[25300,25300]]],["Pazaryolu",[[25930,25930]]],["Şenkaya",[[25360,25360]]],["Tekman",[[25560,25560]]],["Tortum",[[25430,25430]]],["Uzundere",[[25440,25440]]],["Yakutiye",[[25050,25200]]]]],[26,"Eskişehir",[["Alpu",[[26850,26850]]],["Beylikova",[[26750,26750]]],["Çifteler",[[26700,26700]]],["Günyüzü",[[26630,26630]]],["Han",[[26710,26710]]],["İnönü",[[26670,26670]]],["Mahmudiye",[[26800,26800]]],["Mihalgazi",[[26880,26880]]],["Mihalıççık",[[26940,26940]]],["Odunpazarı",[[26004,26576]]],["Sarıcakaya",[[26870,26870]]],["Seyitgazi",[[26950,26950]]],["Sivrihisar",[[26600,26600]]],["Tepebaşı",[[26005,26563]]]]],[27,"Gaziantep",[["Araban",[[27650,27650]]],["İslahiye",[[27800,27800]]],["Karkamış",[[27880,27880]]],["Nizip",[[27700,27700]]],["Nurdağı",[[27840,27840]]],["Oğuzeli",[[27900,27900]]],["Şahinbey",[[27010,27470]]],["Şehitkamil",[[27080,27630]]],["Yavuzeli",[[27970,27970]]]]],[28,"Giresun",[["Alucra",[[28700,28702]]],["Bulancak",[[28300,28310]]],["Çamoluk",[[28710,28712]]],["Çanakçı",[[28810,28810]]],["Dereli",[[28952,28952]]],["Doğankent",[[28510,28512]]],["Espiye",[[28600,28602]]],["Eynesil",[[28850,28860]]],["Giresun",[[28100,28200]]],["Görele",[[28800,28820]]],["Güce",[[28520,28522]]],["Keşap",[[28900,28902]]],["Piraziz",[[28340,28342]]],["Şebinkarahisar",[[28400,28402]]],["Tirebolu",[[28500,28502]]],["Yağlıdere",[]]]],[29,"Gümüşhane",[["Gümüşhane",[[29010,29100]]],["Kelkit",[[29600,29620]]],["Köse",[[29650,29652]]],["Kürtün",[[29830,29832]]],["Şiran",[[29700,29750]]],["Torul",[[29800,29802]]]]],[30,"Hakkâri",[["Çukurca",[[30700,30720]]],["Derecik",[[30600,30650]]],["Hakkâri",[[30110,30110]]],["Şemdinli",[[30800,30802]]],["Yüksekova",[[30300,30400]]]]],[31,"Hatay",[["Altınözü",[[31750,31750]]],["Antakya",[[31030,31070]]],["Arsuz",[[31225,31290]]],["Belen",[[31350,31350]]],["Defne",[[31160,31160]]],["Dörtyol",[[31600,31600]]],["Erzin",[[31960,31960]]],["Hassa",[[31700,31700]]],["İskenderun",[[31200,31300]]],["Kırıkhan",[[31440,31440]]],["Kumlu",[[31520,31520]]],["Payas",[[31900,31900]]],["Reyhanlı",[[31500,31500]]],["Samandağ",[[31800,31800]]],["Yayladağı",[[31550,31550]]]]],[32,"Isparta",[["Aksu",[[32510,32512]]],["Atabey",[[32670,32672]]],["Eğirdir",[[32500,32502]]],["Gelendost",[[32900,32902]]],["Gönen",[[32090,32720]]],["Isparta",[[32005,32300]]],["Keçiborlu",[[32700,32702]]],["Senirkent",[[32600,32610]]],["Sütçüler",[[32950,32952]]],["Şarkikaraağaç",[[32800,32820]]],["Uluborlu",[[32650,32652]]],["Yalvaç",[[32400,32430]]],["Yenişarbademli",[[32850,32852]]]]],[33,"Mersin",[["Akdeniz",[[33010,33300]]],["Anamur",[[33630,33630]]],["Aydıncık",[[33840,33847]]],["Bozyazı",[[33707,33830]]],["Çamlıyayla",[[33580,33582]]],["Erdemli",[[33730,33730]]],["Gülnar",[[33700,33702]]],["Mezitli",[[33170,33210]]],["Mut",[[33600,33600]]],["Silifke",[[33900,33990]]],["Tarsus",[[33400,33800]]],["Toroslar",[[33090,33251]]],["Yenişehir",[[33110,33150]]]]],[34,"İstanbul",[["Adalar",[[34970,34977]]],["Arnavutköy",[[34275,34285]]],["Ataşehir",[[34630,34644]]],["Avcılar",[[34310,34325]]],["Bağcılar",[[34200,34218]]],["Bahçelievler",[[34180,34197]]],["Bakırköy",[[34140,34158]]],["Başakşehir",[[34480,34494]]],["Bayrampaşa",[[34030,34045]]],["Beşiktaş",[[34330,34357]]],["Beykoz",[[34800,34829]]],["Beylikdüzü",[[34520,34528]]],["Beyoğlu",[[34421,34445]]],["Büyükçekmece",[[34530,34537]]],["Çatalca",[[34540,34540]]],["Çekmeköy",[[34782,34799]]],["Esenler",[[34220,34230]]],["Esenyurt",[[34502,34519]]],["Eyüpsultan",[[34050,34077]]],["Fatih",[[34083,34134]]],["Gaziosmanpaşa",[[34240,34255]]],["Güngören",[[34160,34173]]],["Kadıköy",[[34710,34742]]],["Kâğıthane",[[34400,34418]]],["Kartal",[[34860,34882]]],["Küçükçekmece",[[34295,34307]]],["Maltepe",[[34840,34858]]],["Pendik",[[34890,34916]]],["Sancaktepe",[[34650,34656]]],["Sarıyer",[[34450,34475]]],["Silivri",[[34570,34596]]],["Sultanbeyli",[[34920,34935]]],["Sultangazi",[[34260,34270]]],["Şile",[[34980,34990]]],["Şişli",[[34363,34384]]],["Tuzla",[[34940,34959]]],["Ümraniye",[[34760,34775]]],["Üsküdar",[[34660,34700]]],["Zeytinburnu",[[34015,34025]]]]],[35,"İzmir",[["Aliağa",[[35800,35800]]],["Balçova",[[35330,35330]]],["Bayındır",[[35840,35845]]],["Bayraklı",[[35510,35540]]],["Bergama",[[35700,35700]]],["Beydağ",[[35790,35790]]],["Bornova",[[35030,35090]]],["Buca",[[35370,35400]]],["Çeşme",[[35930,35937]]],["Çiğli",[[35610,35650]]],["Dikili",[[35980,35980]]],["Foça",[[35680,35687]]],["Gaziemir",[[35410,35410]]],["Güzelbahçe",[[35310,35310]]],["Karabağlar",[[35110,35160]]],["Karaburun",[[35960,35960]]],["Karşıyaka",[[35550,35600]]],["Kemalpaşa",[[35730,35730]]],["Kınık",[[35990,35990]]],["Kiraz",[[35890,35890]]],["Konak",[[35180,35280]]],["Menderes",[]],["Menemen",[[35660,35660]]],["Narlıdere",[[35320,35320]]],["Ödemiş",[[35750,35750]]],["Seferihisar",[[35460,35485]]],["Selçuk",[[35920,35920]]],["Tire",[[35900,35900]]],["Torbalı",[[35860,35885]]],["Urla",[[35430,35450]]]]],[36,"Kars",[["Akyaka",[[36780,36782]]],["Arpaçay",[]],["Digor",[[36670,36680]]],["Kağızman",[[36700,36702]]],["Kars",[[36002,36100]]],["Sarıkamış",[[36500,36502]]],["Selim",[[36900,36902]]],["Susuz",[[36760,36762]]]]],[37,"Kastamonu",[["Abana",[[37970,37972]]],["Ağlı",[[37920,37920]]],["Araç",[[37800,37802]]],["Azdavay",[[37750,37752]]],["Bozkurt",[[37680,37682]]],["Cide",[[37600,37602]]],["Çatalzeytin",[[37940,37942]]],["Daday",[[37870,37872]]],["Devrekani",[[37700,37702]]],["Doğanyurt",[[37550,37552]]],["Hanönü",[[37450,37542]]],["İhsangazi",[[37250,37252]]],["İnebolu",[[37500,37502]]],["Kastamonu",[[37100,37210]]],["Küre",[[37900,37902]]],["Pınarbaşı",[[37770,37772]]],["Seydiler",[[37270,37272]]],["Şenpazar",[[37650,37652]]],["Taşköprü",[[37400,37402]]],["Tosya",[[37300,37302]]]]],[38,"Kayseri",[["Akkışla",[[38830,38830]]],["Bünyan",[[38600,38600]]],["Develi",[[38400,38400]]],["Felahiye",[[38750,38750]]],["Hacılar",[[38310,38315]]],["İncesu",[[38560,38560]]],["Kocasinan",[[38030,38095]]],["Melikgazi",[[38120,38195]]],["Özvatan",[[38770,38770]]],["Pınarbaşı",[[38700,38700]]],["Sarıoğlan",[[38820,38820]]],["Sarız",[[38660,38660]]],["Talas",[[38280,38300]]],["Tomarza",[[38900,38900]]],["Yahyalı",[[38500,38500]]],["Yeşilhisar",[[38800,38800]]]]],[39,"Kırklareli",[["Babaeski",[[39200,39202]]],["Demirköy",[[39500,39650]]],["Kırklareli",[[39002,39572]]],["Kofçaz",[[39700,39702]]],["Lüleburgaz",[[39750,39752]]],["Pehlivanköy",[[39600,39640]]],["Pınarhisar",[[39300,39310]]],["Vize",[[39400,39652]]]]],[40,"Kırşehir",[["Akçakent",[[40720,40723]]],["Akpınar",[[40320,40322]]],["Boztepe",[[40020,40060]]],["Çiçekdağı",[[40700,40702]]],["Kaman",[[40300,40302]]],["Kırşehir",[[40002,40100]]],["Mucur",[[40500,40502]]]]],[41,"Kocaeli",[["Başiskele",[[41030,41275]]],["Çayırova",[[41420,41420]]],["Darıca",[[41700,41700]]],["Derince",[[41900,41900]]],["Dilovası",[[41455,41455]]],["Gebze",[[41400,41400]]],["Gölcük",[[41650,41950]]],["İzmit",[[41001,41310]]],["Kandıra",[[41600,41600]]],["Karamürsel",[[41500,41500]]],["Kartepe",[[41080,41285]]],["Körfez",[[41780,41800]]]]],[42,"Konya",[["Ahırlı",[[42390,42395]]],["Akören",[[42460,42460]]],["Akşehir",[[42550,42570]]],["Altınekin",[[42450,42450]]],["Beyşehir",[[42700,42705]]],["Bozkır",[[42630,42630]]],["Cihanbeyli",[[42855,42855]]],["Çeltik",[[42920,42920]]],["Çumra",[[42505,42505]]],["Derbent",[[42900,42900]]],["Derebucak",[[42480,42480]]],["Doğanhisar",[[42930,42950]]],["Emirgazi",[[42910,42910]]],["Ereğli",[[42310,42340]]],["Güneysınır",[[42490,42490]]],["Hadim",[[42830,42830]]],["Halkapınar",[[42980,42980]]],["Hüyük",[[42690,42698]]],["Ilgın",[[42600,42620]]],["Kadınhanı",[[42800,42800]]],["Karapınar",[[42400,42400]]],["Karatay",[[42020,42290]]],["Kulu",[[42775,42780]]],["Meram",[[42010,42270]]],["Sarayönü",[[42430,42440]]],["Selçuklu",[[42060,42280]]],["Seydişehir",[[42360,42380]]],["Taşkent",[[42960,42960]]],["Tuzlukçu",[[42970,42970]]],["Yalıhüyük",[[42470,42470]]],["Yunak",[[42530,42530]]]]],[43,"Kütahya",[["Altıntaş",[[43800,43802]]],["Aslanapa",[[43210,43212]]],["Çavdarhisar",[[43710,43712]]],["Domaniç",[[43850,43852]]],["Dumlupınar",[[43820,43822]]],["Emet",[[43700,43702]]],["Gediz",[[43600,43602]]],["Hisarcık",[[43780,43782]]],["Kütahya",[[43020,43290]]],["Pazarlar",[[43530,43532]]],["Simav",[[43500,43520]]],["Şaphane",[[43950,43952]]],["Tavşanlı",[[43300,43900]]]]],[44,"Malatya",[["Akçadağ",[[44600,44600]]],["Arapgir",[[44800,44800]]],["Arguvan",[[44960,44960]]],["Battalgazi",[[44050,44320]]],["Darende",[[44700,44700]]],["Doğanşehir",[[44500,44500]]],["Doğanyol",[[44880,44880]]],["Hekimhan",[[44400,44400]]],["Kale",[[44370,44370]]],["Kuluncak",[[44760,44760]]],["Pütürge",[[44850,44850]]],["Yazıhan",[[44350,44350]]],["Yeşilyurt",[[44080,44900]]]]],[45,"Manisa",[["Ahmetli",[[45450,45450]]],["Akhisar",[[45200,45200]]],["Alaşehir",[[45600,45600]]],["Demirci",[[45900,45900]]],["Gölmarmara",[[45580,45580]]],["Gördes",[[45750,45750]]],["Kırkağaç",[[45700,45730]]],["Köprübaşı",[[45930,45930]]],["Kula",[[45170,45170]]],["Salihli",[[45300,45340]]],["Sarıgöl",[[45470,45470]]],["Saruhanlı",[[45800,45880]]],["Selendi",[[45970,45970]]],["Soma",[[45500,45540]]],["Şehzadeler",[[45010,45050]]],["Turgutlu",[[45400,45400]]],["Yunusemre",[[45030,45125]]]]],[46,"Kahramanmaraş",[["Afşin",[[46500,46500]]],["Andırın",[[46400,46430]]],["Çağlayancerit",[[46720,46720]]],["Dulkadiroğlu",[[46030,46130]]],["Ekinözü",[[46360,46360]]],["Elbistan",[[46300,46300]]],["Göksun",[[46600,46600]]],["Nurhak",[[46370,46370]]],["Onikişubat",[[46040,46140]]],["Pazarcık",[[46700,46700]]],["Türkoğlu",[[46800,46800]]]]],[47,"Mardin",[["Artuklu",[[47060,47420]]],["Dargeçit",[[47750,47750]]],["Derik",[[47800,47800]]],["Kızıltepe",[[47400,47400]]],["Mazıdağı",[[47700,47700]]],["Midyat",[[47500,47500]]],["Nusaybin",[[47300,47300]]],["Ömerli",[[47570,47570]]],["Savur",[[47860,47860]]],["Yeşilli",[[47650,47650]]]]],[48,"Muğla",[["Bodrum",[[48400,48400]]],["Dalaman",[[48770,48770]]],["Datça",[[48900,48900]]],["Fethiye",[[48300,48300]]],["Kavaklıdere",[[48570,48570]]],["Köyceğiz",[[48800,48800]]],["Marmaris",[[48700,48700]]],["Menteşe",[[48050,48050]]],["Milas",[[48200,48200]]],["Ortaca",[[48600,48600]]],["Seydikemer",[[48850,48850]]],["Ula",[[48640,48640]]],["Yatağan",[[48500,48500]]]]],[49,"Muş",[["Bulanık",[[49500,49550]]],["Hasköy",[[49700,49702]]],["Korkut",[[49800,49802]]],["Malazgirt",[[49400,49540]]],["Muş",[[49001,49300]]],["Varto",[[49600,49610]]]]],[50,"Nevşehir",[["Acıgöl",[[50140,50142]]],["Avanos",[[50500,50860]]],["Derinkuyu",[[50700,50706]]],["Gülşehir",[[50900,50902]]],["Hacıbektaş",[[50800,50802]]],["Kozaklı",[[50600,50602]]],["Nevşehir",[[50100,50240]]],["Ürgüp",[[50400,50402]]]]],[51,"Niğde",[["Altunhisar",[[51600,51602]]],["Bor",[[51700,51730]]],["Çamardı",[[51660,51662]]],["Çiftlik",[[51800,51816]]],["Niğde",[[51010,51300]]],["Ulukışla",[[51900,51902]]]]],[52,"Ordu",[["Akkuş",[[52950,52950]]],["Altınordu",[[52210,52210]]],["Aybastı",[[52500,52500]]],["Çamaş",[[52430,52430]]],["Çatalpınar",[[52420,52420]]],["Çaybaşı",[[52310,52310]]],["Fatsa",[[52400,52400]]],["Gölköy",[[52600,52600]]],["Gülyalı",[[52010,52010]]],["Gürgentepe",[[52610,52610]]],["İkizce",[[52320,52320]]],["Kabadüz",[[52020,52020]]],["Kabataş",[[52520,52520]]],["Korgan",[[52700,52700]]],["Kumru",[[52800,52800]]],["Mesudiye",[[52900,52900]]],["Perşembe",[[52750,52750]]],["Ulubey",[[52850,52850]]],["Ünye",[[52300,52300]]]]],[53,"Rize",[["Ardeşen",[[53400,53490]]],["Çamlıhemşin",[[53750,53780]]],["Çayeli",[[53210,53260]]],["Derepazarı",[[53900,53940]]],["Fındıklı",[[53700,53740]]],["Güneysu",[[53350,53390]]],["Hemşin",[[53550,53550]]],["İkizdere",[[53650,53690]]],["İyidere",[[53600,53610]]],["Kalkandere",[[53500,53540]]],["Pazar",[[53300,53340]]],["Rize",[[53020,53950]]]]],[54,"Sakarya",[["Adapazarı",[[54100,54100]]],["Akyazı",[[54400,54400]]],["Arifiye",[[54580,54580]]],["Erenler",[[54200,54200]]],["Ferizli",[[54110,54110]]],["Geyve",[[54700,54700]]],["Hendek",[[54300,54300]]],["Karapürçek",[[54430,54430]]],["Karasu",[[54500,54500]]],["Kaynarca",[[54650,54650]]],["Kocaali",[[54800,54800]]],["Pamukova",[[54900,54900]]],["Sapanca",[[54600,54600]]],["Serdivan",[[54050,54130]]],["Söğütlü",[[54160,54160]]],["Taraklı",[[54750,54750]]]]],[55,"Samsun",[["19 Mayıs",[[55420,55420]]],["Alaçam",[[55800,55800]]],["Asarcık",[[55860,55860]]],["Atakum",[[55200,55270]]],["Ayvacık",[[55550,55550]]],["Bafra",[[55400,55400]]],["Canik",[[55080,55080]]],["Çarşamba",[[55500,55500]]],["Havza",[[55700,55700]]],["İlkadım",[[55020,55100]]],["Kavak",[[55850,55850]]],["Ladik",[[55760,55760]]],["Salıpazarı",[[55530,55530]]],["Tekkeköy",[[55300,55330]]],["Terme",[[55600,55600]]],["Vezirköprü",[[55900,55900]]],["Yakakent",[[55810,55810]]]]],[56,"Siirt",[["Baykan",[[56460,56470]]],["Eruh",[[56540,56802]]],["Kurtalan",[[56500,56502]]],["Pervari",[[56700,56702]]],["Siirt",[[56100,56220]]],["Şirvan",[[56760,56763]]],["Tillo",[[56870,56872]]]]],[57,"Sinop",[["Ayancık",[[57400,57402]]],["Boyabat",[[57200,57202]]],["Dikmen",[[57660,57662]]],["Durağan",[[57700,57702]]],["Erfelek",[[57800,57802]]],["Gerze",[[57600,57602]]],["Saraydüzü",[[57300,57302]]],["Sinop",[[57002,57010]]],["Türkeli",[[57900,57902]]]]],[58,"Sivas",[["Akıncılar",[[58550,58552]]],["Altınyayla",[[58470,58475]]],["Divriği",[[58300,58302]]],["Doğanşar",[[58780,58782]]],["Gemerek",[[58801,58880]]],["Gölova",[[58640,58642]]],["Gürün",[[58800,58802]]],["Hafik",[[58760,58762]]],["İmranlı",[[58980,58982]]],["Kangal",[[58900,58902]]],["Koyulhisar",[[58660,58662]]],["Sivas",[[58010,58060]]],["Suşehri",[[58600,58602]]],["Şarkışla",[[58400,58430]]],["Ulaş",[[58380,58382]]],["Yıldızeli",[[58500,58502]]],["Zara",[[58700,58702]]]]],[59,"Tekirdağ",[["Çerkezköy",[[59500,59500]]],["Çorlu",[[59850,59850]]],["Ergene",[[59930,59930]]],["Hayrabolu",[[59400,59400]]],["Kapaklı",[[59510,59510]]],["Malkara",[[59300,59300]]],["Marmaraereğlisi",[[59740,59740]]],["Muratlı",[[59700,59700]]],["Saray",[[59600,59600]]],["Süleymanpaşa",[[59030,59200]]],["Şarköy",[[59800,59800]]]]],[60,"Tokat",[["Almus",[[60900,60950]]],["Artova",[[60670,60672]]],["Başçiftlik",[[60620,60625]]],["Erbaa",[[60500,60540]]],["Niksar",[[60600,60645]]],["Pazar",[[60800,60820]]],["Reşadiye",[[60700,60740]]],["Sulusaray",[[60870,60872]]],["Tokat",[[60010,60255]]],["Turhal",[[60300,60302]]],["Yeşilyurt",[[60860,60862]]],["Zile",[[60400,60402]]]]],[61,"Trabzon",[["Akçaabat",[[61300,61300]]],["Araklı",[[61700,61700]]],["Arsin",[[61900,61900]]],["Beşikdüzü",[[61800,61800]]],["Çarşıbaşı",[[61420,61420]]],["Çaykara",[[61940,61940]]],["Dernekpazarı",[[61950,61950]]],["Düzköy",[[61390,61390]]],["Hayrat",[[61450,61450]]],["Köprübaşı",[[61630,61630]]],["Maçka",[[61750,61750]]],["Of",[[61830,61830]]],["Ortahisar",[[61030,61080]]],["Sürmene",[[61600,61600]]],["Şalpazarı",[[61670,61670]]],["Tonya",[[61500,61500]]],["Vakfıkebir",[[61400,61400]]],["Yomra",[[61250,61250]]]]],[62,"Tunceli",[["Çemişgezek",[[62600,62602]]],["Hozat",[[62400,62402]]],["Mazgirt",[[62800,62802]]],["Nazımiye",[[62950,62952]]],["Ovacık",[[62900,62901]]],["Pertek",[[62500,62502]]],["Pülümür",[[62700,62702]]],["Tunceli",[[62002,62100]]]]],[63,"Şanlıurfa",[["Akçakale",[[63500,63500]]],["Birecik",[[63400,63400]]],["Bozova",[[63850,63853]]],["Ceylanpınar",[[63570,63570]]],["Eyyübiye",[[63200,63210]]],["Halfeti",[[63950,63950]]],["Haliliye",[[63040,63300]]],["Harran",[[63510,63510]]],["Hilvan",[[63900,63900]]],["Karaköprü",[[63320,63320]]],["Siverek",[[63600,63600]]],["Suruç",[[63800,63800]]],["Viranşehir",[[63700,63700]]]]],[64,"Uşak",[["Banaz",[[64500,64502]]],["Eşme",[[64600,64602]]],["Karahallı",[[64700,64702]]],["Sivaslı",[[64800,64802]]],["Ulubey",[[64900,64902]]],["Uşak",[[64050,64200]]]]],[65,"Van",[["Bahçesaray",[[65710,65710]]],["Başkale",[[65600,65600]]],["Çaldıran",[[65970,65970]]],["Çatak",[[65870,65870]]],["Edremit",[[65170,65300]]],["Erciş",[[65400,65400]]],["Gevaş",[[65700,65700]]],["Gürpınar",[[65900,65900]]],["İpekyolu",[[65100,65210]]],["Muradiye",[[65500,65500]]],["Özalp",[[65800,65800]]],["Saray",[[65830,65830]]],["Tuşba",[[65040,65040]]]]],[66,"Yozgat",[["Akdağmadeni",[[66300,66315]]],["Aydıncık",[[66510,66512]]],["Boğazlıyan",[[66400,66425]]],["Çandır",[[66620,66622]]],["Çayıralan",[[66600,66605]]],["Çekerek",[[66500,66502]]],["Kadışehri",[[66540,66545]]],["Saraykent",[[66320,66325]]],["Sarıkaya",[[66650,66655]]],["Sorgun",[[66700,66790]]],["Şefaatli",[[66800,66802]]],["Yenifakılı",[[66470,66472]]],["Yerköy",[[66900,66902]]],["Yozgat",[[66010,66100]]]]],[67,"Zonguldak",[["Alaplı",[[67850,67856]]],["Çaycuma",[[67900,67970]]],["Devrek",[[67800,67840]]],["Gökçebey",[[67670,67672]]],["Ereğli",[[67300,67390]]],["Kilimli",[[67150,67510]]],["Kozlu",[[67600,67602]]],["Zonguldak",[[67002,67980]]]]],[68,"Aksaray",[["Ağaçören",[[68600,68602]]],["Aksaray",[[68010,68270]]],["Eskil",[[68800,68802]]],["Gülağaç",[[68900,68950]]],["Güzelyurt",[[68470,68570]]],["Ortaköy",[[68400,68601]]],["Sarıyahşi",[[68700,68702]]],["Sultanhanı",[[68190,68190]]]]],[69,"Bayburt",[["Aydıntepe",[[69500,69502]]],["Bayburt",[[69002,69350]]],["Demirözü",[[69400,69450]]]]],[70,"Karaman",[["Ayrancı",[[70500,70502]]],["Başyayla",[[70700,70702]]],["Ermenek",[[70400,70460]]],["Karaman",[[70100,70202]]],["Kazımkarabekir",[[70600,70602]]],["Sarıveliler",[[70800,70810]]]]],[71,"Kırıkkale",[["Bahşılı",[[71460,71462]]],["Balışeyh",[[71520,71522]]],["Çelebi",[[71810,71812]]],["Delice",[[71670,71702]]],["Karakeçili",[[71500,71502]]],["Keskin",[[71800,71860]]],["Kırıkkale",[[71010,71480]]],["Sulakyurt",[[71900,71902]]],["Yahşihan",[[71450,71452]]]]],[72,"Batman",[["Batman",[[72050,72100]]],["Beşiri",[[72200,72202]]],["Gercüş",[[72300,72310]]],["Hasankeyf",[[72350,72352]]],["Kozluk",[[72400,72402]]],["Sason",[[72500,72502]]]]],[73,"Şırnak",[["Beytüşşebap",[[73800,73802]]],["Cizre",[[73200,73202]]],["Güçlükonak",[[73700,73710]]],["İdil",[[73300,73302]]],["Silopi",[[73400,73440]]],["Şırnak",[[73002,73100]]],["Uludere",[[73600,73602]]]]],[74,"Bartın",[["Amasra",[[74300,74310]]],["Bartın",[[74100,74400]]],["Kurucaşile",[[74500,74510]]],["Ulus",[[74410,74602]]]]],[75,"Ardahan",[["Ardahan",[[75002,75210]]],["Çıldır",[[75400,75402]]],["Damal",[[75600,75602]]],["Göle",[[75700,75702]]],["Hanak",[[75900,75902]]],["Posof",[[75802,75802]]]]],[76,"Iğdır",[["Aralık",[[76500,76502]]],["Iğdır",[[76002,76420]]],["Karakoyunlu",[[76700,76702]]],["Tuzluca",[[76900,76902]]]]],[77,"Yalova",[["Altınova",[[77700,77740]]],["Armutlu",[[77500,77502]]],["Çınarcık",[[77300,77340]]],["Çiftlikköy",[[77600,77602]]],["Termal",[[77400,77402]]],["Yalova",[[77200,77210]]]]],[78,"Karabük",[["Eflani",[[78300,78302]]],["Eskipazar",[[78400,78402]]],["Karabük",[[78010,78200]]],["Ovacık",[[78500,78502]]],["Safranbolu",[[78600,78602]]],["Yenice",[[78700,78702]]]]],[79,"Kilis",[["Elbeyli",[[79500,79502]]],["Kilis",[[79020,79090]]],["Musabeyli",[[79600,79602]]],["Polateli",[[79700,79702]]]]],[80,"Osmaniye",[["Bahçe",[[80500,80502]]],["Düziçi",[[80600,80740]]],["Hasanbeyli",[[80850,80852]]],["Kadirli",[[80750,80752]]],["Osmaniye",[[80010,80440]]],["Sumbas",[[80900,80940]]],["Toprakkale",[[80950,80952]]]]],[81,"Düzce",[["Akçakoca",[[81650,81652]]],["Cumayeri",[[81700,81702]]],["Çilimli",[[81750,81752]]],["Düzce",[[81010,81630]]],["Gölyaka",[[81800,81802]]],["Gümüşova",[[81850,81852]]],["Kaynaşlı",[[81900,81902]]],["Yığılca",[[81950,81952]]]]]]}
tr_adres/formatter.py ADDED
@@ -0,0 +1,96 @@
1
+ """Canonical one-line rendering of an :class:`Adres`."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import List, Optional, Union
6
+
7
+ from .metin import tr_upper
8
+ from .model import Adres
9
+
10
+ __all__ = ["STILLER", "format_adres", "normalize"]
11
+
12
+ STILLER = ("kargo", "resmi")
13
+
14
+ _CAD_KISA = {"Cadde": "Cad.", "Bulvar": "Bulv.", "Yol": "Yolu", "Meydan": "Meydanı"}
15
+ _CAD_UZUN = {"Cadde": "Caddesi", "Bulvar": "Bulvarı", "Yol": "Yolu", "Meydan": "Meydanı"}
16
+ _SOK_KISA = {"Sokak": "Sk.", "Çıkmaz": "Çıkmazı"}
17
+ _SOK_UZUN = {"Sokak": "Sokak", "Çıkmaz": "Çıkmazı"}
18
+
19
+
20
+ def _konum(a: Adres, resmi: bool) -> Optional[str]:
21
+ il = tr_upper(a.il) if (resmi and a.il) else a.il
22
+ if a.ilce and il:
23
+ yer = f"{a.ilce}/{il}"
24
+ else:
25
+ yer = a.ilce or il or ""
26
+ if a.posta_kodu:
27
+ yer = f"{a.posta_kodu} {yer}".strip()
28
+ return yer or None
29
+
30
+
31
+ def format_adres(
32
+ adres: Union[Adres, str], style: str = "kargo", include_remainder: bool = True
33
+ ) -> str:
34
+ """Render an address on one line.
35
+
36
+ ``style="kargo"`` (default) is the compact form used on shipping labels::
37
+
38
+ Caferağa Mah. Moda Cad. No:12 K:3 D:5 34710 Kadıköy/İstanbul
39
+
40
+ ``style="resmi"`` spells every type word out, separates components with commas and
41
+ writes the province in capitals, as in official correspondence::
42
+
43
+ Caferağa Mahallesi, Moda Caddesi, No: 12, Kat: 3, İç Kapı No: 5, 34710 Kadıköy/İSTANBUL
44
+
45
+ Unparsed text (``adres.kalan``) is kept just before the location unless
46
+ ``include_remainder=False``. A string argument is parsed first.
47
+ """
48
+ if style not in STILLER:
49
+ raise ValueError(f"style must be one of {STILLER}, not {style!r}")
50
+ if isinstance(adres, str):
51
+ from .parser import parse
52
+
53
+ adres = parse(adres)
54
+ a = adres
55
+ resmi = style == "resmi"
56
+ parts: List[str] = []
57
+ if a.mahalle:
58
+ parts.append(f"{a.mahalle} {'Mahallesi' if resmi else 'Mah.'}")
59
+ if a.koy:
60
+ parts.append(f"{a.koy} Köyü")
61
+ if a.cadde:
62
+ tip = a.cadde_tipi or "Cadde"
63
+ parts.append(f"{a.cadde} {(_CAD_UZUN if resmi else _CAD_KISA).get(tip, tip)}")
64
+ if a.sokak:
65
+ tip = a.sokak_tipi or "Sokak"
66
+ parts.append(f"{a.sokak} {(_SOK_UZUN if resmi else _SOK_KISA).get(tip, tip)}")
67
+ if a.site:
68
+ parts.append(a.site)
69
+ if a.apartman:
70
+ apt = a.apartman
71
+ if not resmi and apt.endswith(" Apartmanı"):
72
+ apt = apt[: -len(" Apartmanı")] + " Apt."
73
+ parts.append(apt)
74
+ if a.blok:
75
+ parts.append(f"{a.blok} Blok")
76
+ if a.bina_no:
77
+ parts.append(f"No: {a.bina_no}" if resmi else f"No:{a.bina_no}")
78
+ if a.kat:
79
+ parts.append(f"Kat: {a.kat}" if resmi else f"K:{a.kat}")
80
+ if a.daire_no:
81
+ parts.append(f"İç Kapı No: {a.daire_no}" if resmi else f"D:{a.daire_no}")
82
+ if include_remainder and a.kalan:
83
+ parts.append(a.kalan)
84
+ yer = _konum(a, resmi)
85
+ if yer:
86
+ parts.append(yer)
87
+ return (", " if resmi else " ").join(parts)
88
+
89
+
90
+ def normalize(text: str, style: str = "kargo") -> str:
91
+ """Parse ``text`` and return its canonical one-line form.
92
+
93
+ >>> normalize("caferaga mh. moda cd. no:12/3 kadikoy istanbul")
94
+ 'Caferağa Mah. Moda Cad. No:12 D:3 Kadıköy/İstanbul'
95
+ """
96
+ return format_adres(text, style)