# -*- coding: utf-8 -*- from __future__ import division import hashlib import os import urllib2 from urllib import urlencode import Image from oxlib.cache import getUrl, getUrlUnicode from oxlib.text import findRe flags = [ # pass ["CH", "Switzerland", "pass()"], # ["CH-AG", "Aargau", "pass()"], ["CH-GE", "Canton of Geneva", "pass()"], ["VA", "Holy See", "pass()"], # crop ["AL", "Albania", "crop()"], ["AM", "Armenia", "crop()"], ["AN", "Netherlands Antilles", "crop()"], ["AO", "Angola", "crop()"], ["AR", "Argentina", "crop()"], ["AT", "Austria", "crop()"], ["BF", "Burkina Faso", "crop()"], ["BG", "Bulgaria", "crop()"], ["BN", "Brunei Darussalam", "crop()"], ["BO", "Bolivia", "crop()"], ["BW", "Botswana", "crop()"], ["BZ", "Belize", "crop()"], ["CO", "Colombia", "crop()"], ["CY", "Cyprus", "crop()"], ["DE", "Germany", "crop()"], ["DM", "Dominica", "crop()"], ["DO", "Dominican Republic", "crop()"], ["DZ", "Algeria", "crop()"], ["EA", "Ceuta and Melilla", "crop()"], ["EC", "Ecuador", "crop()"], ["EE", "Estonia", "crop()"], ["EG", "Egypt", "crop()"], ["ET", "Ethiopia", "crop()"], ["EU", "European Union", "crop()"], ["FM", "Micronesia", "crop()"], ["GA", "Gabon", "crop()"], ["GF", "French Guiana", "crop()"], ["GG", "Guernsey", "crop()"], ["GH", "Ghana", "crop()"], ["GI", "Gibraltar", "crop()"], ["GM", "Gambia", "crop()"], ["HK", "Hong Kong", "crop()"], ["HN", "Honduras", "crop()"], ["HR", "Croatia", "crop()"], ["HT", "Haiti", "crop()"], ["HU", "Hungary", "crop()"], ["ID", "Indonesia", "crop()"], ["IL", "Israel", "crop()"], ["IM", "Isle of Man", "crop()"], ["IN", "India", "crop()"], ["IQ", "Iraq", "crop()"], ["IR", "Iran", "crop()"], ["JP", "Japan", "crop()"], ["KE", "Kenya", "crop()"], ["KG", "Kyrgyzstan", "crop()"], ["KH", "Cambodia", "crop()"], ["KI", "Kiribati", "crop()"], ["KN", "Saint Kitts and Nevis", "crop()"], ["LA", "Laos", "crop()"], ["LB", "Lebanon", "crop()"], ["LC", "Saint Lucia", "crop()"], ["LS", "Lesotho", "crop()"], ["LT", "Lithuania", "crop()"], ["LU", "Luxembourg", "crop()"], ["LV", "Latvia", "crop()"], ["LY", "Libya", "crop()"], ["MA", "Morocco", "crop()"], ["MC", "Monaco", "crop()"], ["MO", "Macau", "crop()"], ["MP", "Northern Mariana Islands", "crop()"], ["MR", "Mauritania", "crop()"], ["MU", "Mauritius", "crop()"], ["MW", "Malawi", "crop()"], ["NE", "Niger", "crop()"], ["NI", "Nicaragua", "crop()"], ["NL", "Netherlands", "crop()"], ["PF", "French Polynesia", "crop()"], ["PL", "Poland", "crop()"], ["PY", "Paraguay", "crop()"], ["RU", "Russia", "crop()"], ["SA", "Saudi Arabia", "crop()"], ["SL", "Sierra Leone", "crop()"], ["SM", "San Marino", "crop()"], ["SO", "Somalia", "crop()"], ["SR", "Suriname", "crop()"], ["SV", "El Salvador", "crop()"], ["TH", "Thailand", "crop()"], ["TJ", "Tajikistan", "crop()"], ["TN", "Tunisia", "crop()"], ["UA", "Ukraine", "crop()"], ["UG", "Uganda", "crop()"], ["VN", "Vietnam", "crop()"], ["YE", "Yemen", "crop()"], ["CSXX", "Serbia and Montenegro", "crop()"], ["DDDE", "East Germany", "crop()"], ["HVBF", "Upper Volta", "crop()"], ["NHVU", "New Hebrides", "crop()"], ["NTHH", "Neutral Zone", "crop()"], ["PCHH", "Pacific Islands", "crop()"], ["PZPA", "Panama Canal Zone", "crop()"], ["YUCS", "Yugoslavia", "crop()"], ["ZRCD", "Zaire", "crop()"], ["SITH-", "Siam", "crop()"], # ["AT-1", "Burgenland", "crop()"], # interlaced # ["AT-2", "Carinthia", "crop()"], # ["AT-3", "Lower Austria", "crop()"], # ["AT-4", "Upper Austria", "crop()"], # ["AT-5", "Salzburg", "crop()"], # ["AT-6", "Styria", "crop()"], # ["AT-7", "Tyrol", "crop()"], # ["AT-8", "Vorarlberg", "crop()"], # ["AT-9", "Vienna", "crop()"], ["BA-SRP", "Republika Srpska", "crop()"], ["BE-V", "Flemish Region", "crop()"], ["BE-W", "Walloon Region", "crop()"], ["BO-C", "Cochabamba", "crop()"], ["CA-AB", "Alberta", "crop()"], ["CA-NS", "Nova Scotia", "crop()"], ["CA-NU", "Nunavut", "crop()"], # wrong ["CO-HUI", "Huila Department", "crop()"], ["CZ-10", "Prague", "crop()"], ["DE-BB", "Brandenburg", "crop()"], ["DE-BW", "Baden-Württemberg", "crop()"], ["DE-BY", "Bavaria", "crop()"], ["DE-HE", "Hesse", "crop()"], ["DE-HH", "Hamburg", "crop()"], ["DE-MV", "Mecklenburg-Vorpommern", "crop()"], ["DE-NW", "North Rhine-Westphalia", "crop()"], ["DE-SH", "Schleswig-Holstein", "crop()"], ["DE-SL", "Saarland", "crop()"], ["DE-SN", "Saxony", "crop()"], ["DE-ST", "Saxony-Anhalt", "crop()"], ["DE-TH", "Thuringia", "crop()"], ["EC-S", "Morona-Santiago Province", "crop()"], ["EE-74", "Saare County", "crop()"], ["ES-AN", "Andalucía", "crop()"], ["ES-CT", "Catalonia", "crop()"], ["ES-GA", "Galicia", "crop()"], ["ES-LO", "La Rioja", "crop()"], ["ES-ML", "Melilla", "crop()"], ["ES-NA", "Navarre", "crop()"], ["ES-S", "Cantabria", "crop()"], ["FM-KSA", "Kosrae", "crop()"], ["FM-PNI", "Pohnpei", "crop()"], ["FM-TRK", "Chuuk", "crop()"], ["FM-YAP", "Yap", "crop()"], ["FR-C", "Auvergne", "crop()"], ["FR-P", "Lower Normandy", "crop()"], ["GB-ENG", "England", "crop()"], ["GB-NIR", "Northern Ireland", "crop()"], ["GE-SO", "South Ossetia", "crop()"], ["IE-L", "Leinster", "crop()"], ["IE-U", "Ulster", "crop()"], ["IT-23", "Aosta Valley", "crop()"], ["IT-25", "Lombardy", "crop()"], ["IT-32", "Trentino-Alto Adige", "crop()"], ["IT-36", "Friuli-Venezia Giulia", "crop()"], ["IT-45", "Emilia Romagna", "crop()"], ["IT-52", "Tuscany", "crop()"], ["IT-55", "Umbria", "crop()"], ["IT-57", "Marche", "crop()"], ["IT-65", "Abruzzo", "crop()"], ["IT-67", "Molise", "crop()"], ["IT-72", "Campania", "crop()"], ["IT-77", "Basilicata", "crop()"], ["IT-78", "Calabria", "crop()"], ["IT-82", "Sicily", "crop()"], ["JP-01", "Hokkaido Prefecture", "crop()"], ["JP-03", "Iwate Prefecture", "crop()"], ["JP-04", "Miyagi Prefecture", "crop()"], ["JP-08", "Ibaraki Prefecture", "crop()"], ["JP-09", "Tochigi Prefecture", "crop()"], ["JP-10", "Gunma Prefecture", "crop()"], ["JP-11", "Saitama Prefecture", "crop()"], ["JP-12", "Chiba Prefecture", "crop()"], ["JP-13", "Tokyo Prefecture", "crop()"], ["JP-14", "Kanagawa Prefecture", "crop()"], ["JP-15", "Niigata Prefecture", "cut(7, 4, 7, 4); crop()"], ["JP-16", "Toyama Prefecture", "crop()"], ["JP-18", "Fukui Prefecture", "crop()"], ["JP-21", "Gifu Prefecture", "crop()"], ["JP-22", "Shizuoka Prefecture", "crop()"], ["JP-23", "Aichi Prefecture", "crop()"], ["JP-26", "Kyoto Prefecture", "crop()"], ["JP-27", "Osaka Prefecture", "crop()"], ["JP-29", "Nara Prefecture", "crop()"], ["JP-30", "Wakayama Prefecture", "crop()"], ["JP-32", "Shimane Prefecture", "crop()"], ["JP-33", "Okayama Prefecture", "crop()"], ["JP-34", "Hiroshima Prefecture", "crop()"], ["JP-35", "Yamaguchi Prefecture", "crop()"], # ? ["JP-37", "Kagawa Prefecture", "crop()"], ["JP-39", "Kochi Prefecture", "crop()"], ["JP-40", "Fukuoka Prefecture", "crop()"], ["JP-41", "Saga Prefecture", "crop()"], ["JP-42", "Nagasaki Prefecture", "crop()"], ["JP-44", "Oita Prefecture", "crop()"], ["JP-46", "Kagoshima Prefecture", "crop()"], ["JP-47", "Okinawa Prefecture", "crop()"], ["KM-A", "Anjouan", "crop()"], ["MD-TR", "Transnistria", "crop()"], ["MX-AGU", "Aguascalientes", "crop()"], ["MX-BCN", "Baja California", "crop()"], ["MX-BCS", "Baja California Sur", "crop()"], ["MX-CAM", "Campeche", "crop()"], ["MX-CHH", "Chihuahua", "crop()"], ["MX-CHP", "Chiapas", "crop()"], ["MX-COA", "Coahuila", "crop()"], ["MX-COL", "Colima", "crop()"], ["MX-DUR", "Durango", "crop()"], ["MX-GRO", "Guerrero", "crop()"], ["MX-GUA", "Guanajuato", "crop()"], ["MX-JAL", "Jalisco", "crop()"], ["MX-MEX", "State of Mexico", "crop()"], ["MX-MIC", "Michoacán", "crop()"], ["MX-MOR", "Morelos", "crop()"], ["MX-NAY", "Nayarit", "crop()"], ["MX-NLE", "Nuevo León", "crop()"], ["MX-OAX", "Oaxaca", "crop()"], ["MX-PUE", "Puebla", "crop()"], ["MX-QUE", "Querétaro", "crop()"], ["MX-ROO", "Quintana Roo", "crop()"], ["MX-SIN", "Sinaloa", "crop()"], ["MX-SLP", "San Luis Potosí", "crop()"], ["MX-SON", "Sonora", "crop()"], ["MX-TAB", "Tabasco", "crop()"], ["MX-TAM", "Tamaulipas", "crop()"], ["MX-TLA", "Tlaxcala", "crop()"], ["MX-VER", "Veracruz", "crop()"], ["MX-YUK", "Yucatán", "crop()"], ["MX-ZAC", "Zacatecas", "crop()"], ["NL-GE", "Gelderland", "crop()"], ["NL-GR", "Groningen", "crop()"], ["NL-NH", "North Holland", "crop()"], ["NL-OV", "Overijssel", "crop()"], ["NL-ZE", "Zeeland", "crop()"], ["PL-PM", "Pomeranian Voivodeship", "crop()"], ["RS-KM", "Kosovo", "crop()"], ["RS-VO", "Vojvodina", "crop()"], ["RU-AL", "Altai", "crop()"], # spelling? ["RU-AST", "Astrakhan Oblast", "crop()"], ["RU-AMU", "Amur Oblast", "crop()"], ["RU-BA", "Bashkortostan", "crop()"], ["RU-CHE", "Chelyabinsk Oblast", "crop()"], ["RU-CU", "Chuvashia", "crop()"], ["RU-DA", "Dagestan", "crop()"], ["RU-IN", "Ingushetia", "crop()"], ["RU-KB", "Kabardino-Balkaria", "crop()"], ["RU-KC", "Karachay-Cherkessia", "crop()"], ["RU-KGN", "Kurgan Oblast", "crop()"], ["RU-KL", "Kalmykia", "crop()"], ["RU-KO", "Komi", "crop()"], ["RU-KR", "Karelia", "crop()"], ["RU-KYA", "Krasnoyarsk Krai", "crop()"], ["RU-ME", "Mari El", "crop()"], ["RU-MO", "Mordovia", "crop()"], ["RU-MOW", "Moscow", "crop()"], ["RU-NIZ", "Nizhni Novgorod Oblast", "crop()"], ["RU-RYA", "Ryazan Oblast", "crop()"], ["RU-SA", "Sakha", "crop()"], ["RU-SAK", "Sakhalin Oblast", "crop()"], ["RU-SAM", "Samara Oblast", "crop()"], ["RU-SE", "North Ossetia-Alania", "crop()"], ["RU-SPE", "Saint Petersburg", "crop()"], ["RU-SVE", "Sverdlovsk Oblast", "crop()"], ["RU-TA", "Tatarstan", "crop()"], ["RU-TAM", "Tambov Oblast", "crop()"], ["RU-TUL", "Tula Oblast", "crop()"], ["RU-ULY", "Ulyanovsk Oblast", "crop()"], ["RU-YAR", "Yaroslavl Oblast", "crop()"], ["RU-YEV", "Jewish Autonomous Oblast", "crop()"], ["SK-PV", "Prešov Region", "crop()"], ["SK-TC", "Trenčín Region", "crop()"], ["SK-TR", "Trnava Region", "crop()"], ["SM-03", "Domagnano", "crop()"], # ? ["SO-SO-", "Somaliland", "crop()"], ["SV-SO", "Sonsonate", "crop()"], ["TW-TPE", "Taipei", "crop()"], ["UM-95", "Palmyra Atoll", "crop()"], ["US-AZ", "Arizona", "crop()"], ["US-ID", "Idaho", "crop()"], ["US-IL", "Illinois", "cut(2, 2, 2, 2); crop()"], ["US-KS", "Kansas", "crop()"], ["US-KY", "Kentucky", "crop()"], ["US-MA", "Massachusetts", "crop()"], ["US-ME", "Maine", "crop()"], ["US-MI", "Michigan", "crop()"], ["US-MN", "Minnesota", "crop()"], ["US-MO", "Missouri", "crop()"], ["US-NE", "Nebraska", "crop()"], ["US-NH", "New Hampshire", "crop()"], ["US-NJ", "New Jersey", "crop()"], ["US-NJ", "New Mexico", "crop()"], ["US-NJ", "New York", "crop()"], ["US-OK", "Oklahoma", "crop()"], ["US-RI", "Rhode Island", "crop()"], ["US-SD", "South Dakota", "crop()"], ["US-UT", "Utah", "crop()"], ["US-VA", "Virginia", "crop()"], ["US-VT", "Vermont", "crop()"], ["US-WA", "Washington", "crop()"], ["US-WI", "Wisconsin", "crop()"], # crop (scandinavia) ["AX", "Åland Islands", "crop(525)"], ["DK", "Denmark", "crop(left)"], ["FI", "Finland", "crop(650)"], ["IS", "Iceland", "crop(left)"], ["FO", "Faroe Islands", "crop(400)"], ["NO", "Norway", "crop(left)"], ["SE", "Sweden", "crop(600)"], # crop (left) ["AW", "Aruba", "crop(left)"], ["BY", "Belarus", "crop(left)"], ["CL", "Chile", "crop(left)"], ["CR", "Costa Rica", "crop(left)"], ["ES", "Spain", "crop(left)"], ["GR", "Greece", "crop(left)"], ["LR", "Liberia", "crop(left)"], ["MG", "Madagascar", "crop(left)"], ["NR", "Nauru", "crop(left)"], ["PH", "Philippines", "crop(left)"], ["SI", "Slovenia", "crop(left)"], ["TG", "Togo", "crop(left)"], ["TM", "Turkmenistan", "crop(left)"], ["UY", "Uruguay", "crop(left)"], ["UZ", "Uzbekistan", "crop(left)"], ["DE-HB", "Bremen", "crop(left)"], ["ES-O", "Asturias", "crop(left)"], ["ES-VC", "Valencian Community", "crop(left)"], ["IT-34", "Veneto", "crop(left); copy(0, 0, 214, 217, 217, 217, 0, 0)"], ["JP-20", "Nagano Prefecture", "crop(left)"], ["KM-G", "Grande Comore", "crop(left)"], # ? ["NL-FL", "Flevoland", "crop(left)"], # ? # ["NL-LI", "Limburg", "crop(left)"], ["NL-NB", "North Brabant", "crop(left)"], # ? ["NL-UT", "Utrecht", "crop(left)"], ["NL-ZH", "South Holland", "crop(left)"], # wrong ["RU-KGD", "Kaliningrad Oblast", "crop(left)"], ["RU-BU", "Buryatia", "crop(left)"], ["RU-CE", "Chechnya", "crop(left)"], ["RU-KHA", "Khabarovsk Krai", "crop(left)"], ["RU-KK", "Khakassia", "crop(left)"], ["RU-MOS", "Moscow Oblast", "crop(left)"], ["RU-TU", "Tuva", "crop(left)"], ["RU-VOR", "Voronezh Oblast", "crop(left)"], ["SK-BC", "Banská Bystrica Region", "crop(left)"], ["SK-BL", "Bratislava Region", "crop(left)"], ["SK-KI", "Košice Region", "crop(left)"], ["SK-NI", "Nitra Region", "crop(left)"], ["SK-ZI", "Žilina Region", "crop(left)"], ["US-GA", "Georgia ", "crop(left)"], ["US-MS", "Mississippi", "crop(left)"], ["US-NC", "North Carolina", "crop(left)"], ["US-NV", "Nevada", "crop(left)"], ["US-TX", "Texas", "crop(left)"], # crop (right) ["RW", "Rwanda", "crop(right)"], ["ZM", "Zambia", "crop(right)"], ["US-TN", "Tennessee", "crop(right); copy(100, 0, 362, 300, 262, 300, 0, 0)"], # crop (irregular) ["AE", "United Arab Emirates", "crop(400)"], ["AZ", "Azerbaijan", "crop(583)"], # same padding ["BA", "Bosnia and Herzegovina", "crop(515)"], ["BD", "Bangladesh", "crop(450)"], ["BH", "Bahrain", "crop(325)"], ["BJ", "Benin", "crop(600)"], ["CN", "China", "crop(757)"], # same padding ["CV", "Cape Verde", "crop(191)"], ["GL", "Greenland", "crop(350)"], ["KP", "North Korea", "crop(480)"], ["NC", "New Caledonia", "crop(300)"], ["PS", "Palestine", "crop(300)"], ["PT", "Portugal", "crop(240)"], ["PW", "Palau", "crop(350)"], ["QA", "Qatar", "crop(243)"], ["RE", "Réunion", "crop(281)"], # same padding ["RS", "Serbia", "crop(320)"], ["PM", "Saint Pierre and Miquelon", "crop(668)"], ["SG", "Singapore", "crop(788)"], # same padding ["TR", "Turkey", "crop(406)"], ["MIUM", "Midway Islands", "crop(456)"], ["YDYE", "South Yemen", "crop(600)"], ["CY-NC", "Northern Cyprus", "crop(406)"], # same padding ["DE-BE", "Berlin", "crop(416)"], # fixme: this is just a guess, check coat of arms ["DE-NI", "Lower Saxony", "crop(420)"], ["ES-AR", "Aragón", "crop(321)"], ["ES-EX", "Extremadura", "crop(251)"], ["JP-07", "Fukushima Prefecture", "crop(189)"], ["JP-31", "Tottori Prefecture", "crop(480)"], ["JP-38", "Ehime Prefecture", "crop(161)"], ["PT-20", "Azores ", "crop(299); copy(0, 49, 140, 140, 140, 91, 0, 49)"], ["US-CO", "Colorado", "crop(760)"], # extend ["AD", "Andorra", "extend()"], ["AF", "Afghanistan", "extend()"], ["AQ", "Antarctica", "extend()"], ["BB", "Barbados", "extend()"], ["BE", "Belgium", "extend()"], ["BL", "Saint Barthélemy", "extend()"], ["BR", "Brazil", "extend()"], ["CA", "Canada", "extend()"], ["CC", "Cocos Islands", "extend()"], ["CI", "Côte d'Ivoire", "extend()"], ["CM", "Cameroon", "extend()"], ["FR", "France", "extend()"], ["GN", "Guinea", "extend()"], ["GT", "Guatemala", "extend()"], ["IC", "Canary Islands", "extend()"], ["IE", "Ireland", "extend()"], ["IT", "Italy", "extend()"], ["KR", "South Korea", "extend()"], ["MD", "Moldova", "extend()"], ["ML", "Mali", "extend()"], ["MN", "Mongolia", "extend()"], ["MX", "Mexico", "cut(2, 0, 2, 0); extend()"], ["NF", "Norfolk Island", "extend()"], ["NG", "Nigeria", "extend()"], ["PE", "Peru", "extend()"], ["PK", "Pakistan", "extend()"], ["RO", "Romania", "extend()"], ["SN", "Senegal", "extend()"], ["SZ", "Swaziland", "extend()"], ["TD", "Chad", "extend()"], ["YT", "Mayotte", "cut(2, 2, 2, 2); extend()"], ["VC", "Saint Vincent and the Grenadines", "extend()"], ["VI", "United States Virgin Islands", "extend()"], ["JTUM", "Johnston Island", "extend()"], ["RHZW", "Rhodesia", "cut(0, 1, 0, 1); extend()"], ["KOHH-", "Korea", "extend()"], ["AU-ACT", "Australian Capital Territory", "extend()"], # ? ["AU-NT", "Northern Territory", "extend()"], # ? ["BA-BIH", "Federation of Bosnia and Herzegovina", "cut(2, 3, 2, 3); extend()"], ["BR-PE", "Pernambuco", "extend()"], ["CA-NB", "New Brunswick", "cut(0, 1, 0, 1); extend()"], ["CA-PE", "Prince Edward Island", "extend()"], # wrong ["CA-NT", "Northwest Territories", "extend()"], ["CA-YT", "Yukon", "extend()"], ["ES-CM", "Castile-La Mancha", "extend()"], ["ES-CN", "Canary Islands", "extend()"], ["ES-M", "Community of Madrid", "extend()"], ["FR-B", "Aquitaine", "cut(0, 2, 0, 2); extend()"], ["FR-J", "Île-de-France", "cut(0, 1, 0, 1); extend()"], ["FR-H", "Corsica", "extend()"], ["GB-WLS", "Wales", "extend()"], ["IE-C", "Connacht", "cut(0, 1, 0, 1); extend()"], ["IE-M", "Munster", "extend()"], ["IT-42", "Liguria", "extend()"], # ["IT-62", "Lazio", "extend()"], # fixme: interlaced ["IT-75", "Apulia", "extend()"], ["JP-02", "Aomori Prefecture", "extend()"], ["JP-05", "Akita Prefecture", "extend()"], ["JP-06", "Yamagata Prefecture", "extend()"], ["JP-17", "Ishikawa Prefecture", "extend()"], ["JP-19", "Yamanashi Prefecture", "extend()"], ["JP-25", "Shiga Prefecture", "cut(0, 1, 0, 1); extend()"], ["JP-28", "Hyogo Prefecture", "extend()"], ["JP-36", "Tokushima Prefecture", "extend()"], ["JP-45", "Miyazaki Prefecture", "extend()"], ["MX-HID", "Hidalgo", "extend()"], ["NL-DR", "Drenthe", "extend()"], ["PT-30", "Madeira", "extend()"], ["RU-AD", "Adygeya", "extend()"], ["UM-76", "Navassa Island", "extend()"], ["UA-05", "Vinnytsia Oblast", "extend()"], ["US-AK", "Alaska", "extend()"], ["US-AR", "Arkansas", "extend()"], ["US-CA", "California", "extend()"], ["US-CT", "Connecticut", "extend()"], ["US-DC", "District of Columbia", "extend()"], ["US-DE", "Delaware", "extend()"], ["US-IA", "Iowa", "cut(2, 2, 2, 2); extend()"], ["US-IN", "Indiana", "extend()"], ["US-LA", "Lousiana", "extend()"], ["US-MT", "Montana", "extend()"], ["US-ND", "North Dakota", "extend()"], # check (subjective)... ["US-OR", "Oregon", "extend()"], ["US-PA", "Pennsylvania", "extend()"], ["US-SC", "South Carolina", "extend()"], # ["UY-DU", "Durazno", "extend()"], # interlaced # extend (commonwealth) ["AI", "Anguilla", "extend(right, left)"], ["AU", "Australia", "extend(right, left)"], ["BM", "Bermuda", "extend(right, left)"], ["CK", "Cook Islands", "extend(right, left)"], ["FJ", "Fiji", "extend(right, left)"], ["FK", "Falkland Islands", "extend(right, left)"], ["GS", "South Georgia and the South Sandwich Islands", "extend(right, left)"], ["IO", "British Indian Ocean Territory", "extend(right, left)"], ["KY", "Cayman Islands", "extend(right, left)"], ["MS", "Montserrat", "extend(right, left)"], ["NZ", "New Zealand", "extend(right, left)"], ["NU", "Niue", "extend(right, left)"], ["PN", "Pitcairn", "extend(right, left)"], ["SH", "Saint Helena", "extend(right, left)"], ["TA", "Tristan da Cunha", "extend(right, left)"], ["TC", "Turks and Caicos Islands", "extend(right, left)"], ["TF", "French Southern Territories", "extend(right, left); copy(0, 158, 242, 162, 242, 4, 0, 96)"], ["TV", "Tuvalu", "extend(right, left)"], ["VG", "British Virgin Islands", "extend(right, left)"], ["WF", "Wallis and Futuna", "extend(right, left); copy(0, 395, 605, 405, 605, 10, 0, 240)"], ["BQAQ", "British Antarctic Territory", "extend(right, left)"], ["GEHH", "Gilbert and Ellice Islands", "extend(right, left)"], ["AU-NSW", "New South Wales", "extend(right, left)"], ["AU-QLD", "Queensland", "extend(right, left)"], ["AU-SA", "South Australia", "extend(right, left)"], ["AU-TAS", "Tasmania", "extend(right, left)"], ["AU-VIC", "Victoria", "extend(right, left)"], ["CA-MB", "Manitoba", "extend(right, left)"], ["CA-ON", "Ontario", "extend(right, left)"], ["US-HI", "Hawaii", "extend(); copy(1200, 160, 1280, 240, 1280, 320, 0, 0); copy(1200, 160, 1280, 240, 1280, 320, 0, 960)"], # extend (irregular) ["BT", "Bhutan", "extend(left, right)"], ["CX", "Christmas Island", "cut(1, 1, 1, 1); extend(right, left)"], ["PG", "Papua New Guinea", "extend(right, left)"], # resize ["CG", "Republic of the Congo", "resize()"], ["CZ", "Czech Republic", "resize()"], ["GY", "Guyana", "resize()"], ["JM", "Jamaica", "resize()"], ["SC", "Seychelles", "resize()"], ["TT", "Trinidad and Tobago", "resize()"], ["TZ", "Tanzania", "resize()"], ["ZA", "South Africa", "resize()"], ["AZ-NK", "Nagorno-Karabakh", "resize()"], ["CA-BC", "British Columbia", "resize()"], ["CA-NL", "Newfoundland and Labrador", "resize()"], # wrong ["FR-A", "Alsace", "resize()"], # ? ["GB-SCT", "Scotland", "resize()"], ["NL-FR", "Friesland", "resize()"], # ? ["US-AL", "Alabama", "resize()"], # cut, resize ["BS", "Bahamas", "cut(0, 0, 100, 0); resize()"], ["KW", "Kuwait", "cut(0, 0, 300, 0); resize()"], ["SD", "Sudan", "cut(0, 0, 200, 0); resize()"], # resize, circle ["BI", "Burundi", "resize(); copy(265, 105, 535, 375, 272, 272, 104, 104, circle)"], ["MK", "Macedonia", "resize(); copy(329, 129, 471, 271, 142, 142, 129, 129, circle)"], ["US-FL", "Florida", "cut(0, 1, 0, 1); resize(); copy(246, 120, 504, 378, 258, 258, 120, 120, circle)"], # border ["GU", "Guam", "border(37)"], ["ME", "Montenegro", "border(16)"], ["MT", "Malta", "border(210)"], ["MV", "Maldives", "border(120)"], ["SKIN", "Sikkim", "border(54)"], ["IT-21", "Piedmont", "border(40)"], ["RU-PNZ", "Penza Oblast", "border(125)"], # wrong ["US-WV", "West Virginia", "border(44)"], ["US-WY", "Wyoming", "border(75)"], # corner ["GW", "Guinea-Bissau", "corner(200)"], ["LI", "Liechtenstein", "corner(200)"], ["MM", "Myanmar", "corner(195)"], ["PA", "Panama", "corner(112)"], ["SY", "Syria", "corner(240)"], ["TO", "Tonga", "corner(200)"], ["TW", "Taiwan", "corner(225)"], ["WS", "Samoa", "corner(216)"], ["SUHH", "Soviet Union", "corner(100)"], ["CA-SK", "Saskatchewan", "corner(189)"], # check ... ["ES-CL", "Castile and León", "corner(162)"], ["ES-MU", "Region of Murcia", "corner(125)"], # cross ["GB", "United Kingdom", "cross(200, resize, 400)"], ["GE", "Georgia", "cross(120, crop)"], ["MQ", "Martinique", "cross(74, crop)"], ["CA-QC", "Quebec", "cross(100, crop)"], ["ES-BA", "Basque Country", "resize(); copy(457, 0, 543, 560, 86, 560, 237, 0)"], ["IT-88", "Sardinia", "cut(0, 0, 1, 1); cross(80, crop)"], # check if correct ["RU-BEL", "Belgorod Oblast", "cross(44, crop)"], # ["ES-BA", "Basque Country", "cross(86, resize, 420)"], # fixme: the 420 are just an estimate, there must be a formula # symbol (rectangle) ["MY", "Malaysia", "crop(416); copy(0, 0, 64, 64, 256, 256, 0, 0); copy(88, 32, 358, 224, 203, 144, 26, 56)"], # *3/4 ["US", "United States", "crop(469); copy(134, 0, 484, 350, 350, 350, 0, 0); copy(0, 0, 10, 10, 10, 350, 0, 0)"], ["ES-IB", "Balearic Islands", "resize(); copy(1, 1, 374, 249, 248, 166, 1, 42)"], # *2/3 ["GE-AB", "Abkhazia", "crop(233); copy(0, 0, 40, 40, 120, 120, 0, 0); copy(0, 0, 212, 120, 120, 68, 0, 26)"], # symbol (triangle) ["CU", "Cuba", "cut(0, 0, 108, 0); resize(); copy(0, 120, 40, 260, 70, 140, 20, 120); copy(57, 140, 173, 260, 86, 90, 33, 157)"], # *3/4 ["DJ", "Djibouti", "resize(); copy(77, 160, 154, 233, 77, 73, 51, 160)"], # *1 ... wrong ["ER", "Eritrea", "resize(); copy(0, 104, 50, 392, 144, 288, 50, 104); copy(100, 104, 388, 392, 216, 216, 50, 142)"], # *3/4, ["JO", "Jordan", "resize(); copy(71, 128, 114, 170, 43, 42, 35, 128)"], # *1 ["KM", "Comoros", "resize(); copy(0, 80, 8, 220, 60, 140, 8, 80); copy(16, 82, 112, 218, 72, 102, 16, 99)"], # * 3/4 ["MZ", "Mozambique", "cut(0, 0, 112, 0); resize(); copy(290, 290, 310, 310, 180, 300, 0, 150, circle); copy(0, 160, 280, 440, 210, 210, 0, 195, circle)"], # *3/4 ["PR", "Puerto Rico", "resize(); copy(0, 200, 78, 391, 128, 191, 52, 200); copy(78, 200, 269, 391, 143, 143, 52, 228)"], # *3/4 ... wrong ["TL", "Timor-Leste", "resize(); copy(0, 290, 20, 310, 110, 200, 20, 200); copy(45, 200, 246, 400, 100, 100, 30, 250)"], # *1/2 ["VU", "Vanuatu", "cut(0, 0, 50, 0); resize(); copy(0, 270, 30, 300, 90, 180, 30, 195); copy(50, 185, 210, 385, 120, 150, 30, 210)"], # *3/4 ["ZW", "Zimbabwe", "cut(0, 0, 336, 0); resize()"], # *1/2 ... still wrong ["WKUM", "Wake Island", "crop(left)"], # still wrong # ["YDYE", "South Yemen", "resize(); copy(0, 550, 100, 650, 200, 300, 92, 450); copy(139, 450, 439, 750, 226, 226, 92, 487)"], # * 3/4 # symbol (diagonal) ["CD", "Democratic Republic of the Congo", "resize(); copy(0, 0, 100, 100, 180, 240, 20, 20); copy(36, 41, 252, 257, 162, 162, 41, 41)"], # *3/4 ["MH", "Marshall Islands", "resize(); copy(0, 0, 50, 50, 97, 185, 9, 17, circle); copy(17, 17, 202, 202, 139, 139, 17, 17, circle)"], # *3/4 ["SB", "Solomon Islands", "resize(); copy(0, 0, 10, 10, 143, 275, 16, 8); copy(35, 8, 315, 283, 210, 206, 18, 18)"], # *3/4 ["NA", "Namibia", "resize(); copy(0, 65, 50, 265, 140, 200, 50, 65); copy(80, 65, 280, 265, 200, 200, 33, 33)"], # symbol (other) ["AG", "Antigua and Barbuda", "resize(); copy(147, 0, 603, 196, 304, 131, 98, 65); copy(147, 0, 603, 20, 304, 80, 98, 0)"], ["CF", "Central African Republic", "crop(); copy(50, 0, 350, 200, 300, 200, 0, 0)"], ["EH", "Western Sahara", "resize(); copy(340, 134, 460, 266, 120, 132, 140, 134)"], # *1 ["GQ", "Equatorial Guinea", "resize(); copy(312, 168, 438, 332, 126, 164, 187, 168)"], ["JE", "Jersey", "resize(); copy(234, 357, 366, 589, 132, 232, 234, 11, circle); copy(392, 11, 608, 243, 162, 174, 219, 11, circle)"], # *3/4 ["KZ", "Kazakhstan", "border(180); copy(670, 0, 1490, 1000, 820, 1000, 180, 0)"], ["OM", "Oman", "crop(400); copy(0, 300, 200, 600, 200, 300, 0, 0); copy(60, 32, 238, 206, 132, 132, 34, 34)"], # *3/4 ["SK", "Slovakia", "crop(left); copy(0, 140, 540, 460, 540, 320, 30, 140)"], ["ST", "São Tomé and Príncipe", "resize(); copy(884, 296, 1164, 728, 210, 324, 407, 350); copy(1396, 296, 1676, 728, 210, 324, 663, 350)"], # *3/4 ["VE", "Venezuela", "crop(); copy(0, 0, 200, 200, 200, 200, 0, 0)"], ["BYAA", "Byelorussian Soviet Socialist Republic", "crop(left); copy(92, 0, 209, 200, 117, 200, 66, 0)"], # like soviet union ["DE-RP", "Rhineland-Palatinate", "crop(left); copy(0, 0, 250, 400, 250, 400, 10, 0)"], ["JP-24", "Mie Prefecture", "extend(); copy(0, 0, 506, 400, 506, 400, 47, 100)"], ["JP-43", "Kumamoto Prefecture", "extend(); copy(0, 0, 720, 600, 720, 600, 90, 150); copy(0, 0, 90, 90, 90, 900, 0, 0)"], # other ["AS", "American Samoa", "special()"], # *3/4 ["GD", "Grenada", "border(42); copy(215, 115, 285, 185, 70, 70, 115, 115, circle); copy(59, 120, 99, 180, 40, 60, 50, 120); copy(54, 0, 170, 42, 116, 42, 0, 0); copy(330, 0, 446, 42, 116, 42, 184, 0); copy(54, 258, 170, 300, 116, 42, 0, 258); copy(330, 258, 446, 300, 116, 42, 184, 258)"], ["GP", "Guadeloupe", "crop(right); copy(0, 70, 292, 330, 292, 260, 54, 70)"], ["LK", "Sri Lanka", "cut(359, 0, 0, 0); border(108); copy(112, 100, 528, 398, 416, 298, 42, 100)"], ["NP", "Nepal", "resize(); copy(27, 744, 28, 745, 770, 770, 0, 0); copy(27, 743, 28, 744, 726, 726, 22, 22); copy(27, 742, 28, 743, 724, 724, 23, 23); copy(53, 232, 262, 354, 209, 122, 280, 232); copy(45, 446, 270, 670, 225, 224, 272, 446, circle)"], ["TK", "Tokelau", "cut(0, 0, 0, 2); resize(); copy(0, 0, 100, 100, 150, 400, 0, 0); copy(44, 41, 287, 361, 182, 240, 44, 41)"], # *3/4 ["MF", "Saint Martin", "construct()"], ["US-MD", "Maryland", "resize(); copy(375, 0, 450, 250, 75, 250, 250, 0); copy(375, 0, 450, 250, 75, 250, 0, 250); copy(515, 0, 610, 250, 95, 250, 328, 0); copy(515, 0, 610, 250, 95, 250, 77, 250); copy(675, 0, 750, 250, 75, 250, 425, 0); copy(675, 0, 750, 250, 75, 250, 175, 250)"], ["US-OH", "Ohio", "crop(left); copy(59, 149, 61, 151, 300, 300, 0, 0); copy(0, 0, 300, 300, 300, 300, 0, 0)"], # wrong # other flag ["AC", "Ascension Island", "United Kingdom"], ["BV", "Bouvet Island", "Norway"], ["CP", "Clipperton Island", "France"], ["DG", "Diego Garcia", "British Indian Ocean Territory"], ["HM", "Heard Island and McDonald Islands", "Australia"], ["SJ", "Svalbard and Jan Mayen", "Norway"], ["UK", "United Kingdom", "United Kingdom"], ["UM", "United States Minor Outlying Islands", "United States"], ["AIDJ", "French Afar and Issas", "France"], ["BUMM", "Burma", "Myanmar"], ["CSHH", "Czechoslovakia", "Czech Republic"], ["CTKI", "Canton and Enderbury Islands", "Gilbert and Ellice Islands"], ["DYBJ", "Dahomey", "Benin"], ["FQHH", "French Southern and Antarctic Territories", "French Southern Territories"], ["FXFR", "France, Metropolitan", "France"], ["NQAQ", "Dronning Maud Land", "Norway"], ["PUUM", "United States Miscellaneous Pacific Islands", "United States"], ["TPTL", "East Timor", "Timor-Leste"], ["VDVN", "North Vietnam", "Vietnam"], ["ES-CE", "Ceuta", "Ceuta and Melilla"], ["FR-CP", "Clipperton", "France"] ] translate = { "Ceuta and Melilla": "Ceuta", "China": "People's Republic of China", "Congo": "Republic of the Congo", "Holy See": "Vatican City", "Neutral Zone": "United Nations", "Pacific Islands": "Trust Territory of the Pacific Islands", "Taiwan": "Republic of China", "Yugoslavia": "Socialist Federal Republic of Yugoslavia" } flags_ = { "Åland Islands": "Flag of %C5land", # unicode bug in getUrlUnicode ... sha.sha(url).hexdigest() doesn't take unicode urls "Altai": "Flag of Altai Republic", "Aquitaine": "Aquitaine flag", "Arizona": "Flag of Arizona", "Australian Capital Territory": "Flag of the Australian Capital Territory", "Auvergne": "Auvergne flag", "Baden-Württemberg": "Flag of Baden-W%FCrttemberg", # see Åland "Basque Country": "Flag of the Basque Country", "Burgenland": "Burgenland_Landesflagge.PNG", "Castile and León": "Bandera de Castilla y Le%F3n", # see Åland "Chechnya": "Flag of the Chechen Republic", "Cochabamba": "Flag of cochabamba", "Domagnano": "Castello_di_Domagnano.jpg", "Durazno": "Flag_of_Durazno_Department.png", "European Union": "Flag of Europe", "Federation of Bosnia and Herzegovina": "Flag of the Federation of Bosnia and Herzegovina", "French Guiana": "Flag of French Guiana", "Georgia ": "Flag of Georgia (U.S. state)", # fix this... "Guadeloupe": "Flag of Guadeloupe (UPLG)", "Guanajuato": "Mexico_stateflags_Guanajuato.png", "Hokkaido Prefecture": "Flag of Hokkaido Prefecture", # fix this ... "Honduras": "Flag of Honduras", # someone temporarily linked to a JPEG, so this exception can hopefully be removed later "Île-de-France": "%CEle-de-France flag", # see Åland "Ishikawa Prefecture": "Flag of Ishikawa", # fix this ... "Jewish Autonomous Oblast": "Flag of the Jewish Autonomous Oblast", "Johnston Island": "Flag of Johnston Atoll (local)", "Kagoshima Prefecture": "Flag of Kagoshima.png", # fix this ... "Kanagawa Prefecture": "Flag of Kanagawa", # fix this ... "Kochi Prefecture": "Flag of Kochi", # fix this ... "Korea": "Flag of Korea 1882", "Kosovo": "Flag of Kosovo", "Kosrae": "Flag of Kosrae.png", "Krasnoyarsk Krai": "KrasnoyarskKray-Flag", "La Rioja": "Flag of La Rioja (with coat of arms)", "Lower Normandy": "Normandy-flag.gif", "Mayotte": "Flag of Mayotte (local)", "Midway Islands": "Flag of the Midway Islands (local)", "Miyagi Prefecture": "Flag of Miyagi", # fix this ... "Morona-Santiago Province": "Morona-Santiago Flag.png", "Moscow Oblast": "Flag of Moscow Oblast.png", "Navassa Island": "Flag of Navassa Island (local)", "New Caledonia": "Kanak flag", "New Hebrides": "Flag of Anglo-French Joint Naval Commission", "Niigata Prefecture": "Prefectural_Logo_of_Niigata.png", "Nizhni Novgorod Oblast": "Flag of Nizhny Novgorod Region", "North Ossetia-Alania": "Flag of North Ossetia", "Northern Ireland": "Ulster banner", "Northern Territory": "Flag of the Northern Territory", "Northwest Territories": "Flag of the Northwest Territories", "Oita Prefecture": "Flag of Oita", # fix this ... "Okayama Prefecture": "Flag of Okayama", # fix this ... "Osaka Prefecture": "Flag of Osaka", # fix this ... "Palmyra Atoll": "Flag of Palmyra Atoll (local)", "Penza Oblast": "Flag of Penza Oblast.png", "Pohnpei": "Flag of Pohnpei.png", "Pomeranian Voivodeship": "POL wojew%F3dztwo pomorskie flag alt", # see Åland "Réunion": "Drapo nasion.jpg", "Ryazan Oblast": "Flag of Ryazan Oblast.png", "Saarland": "Flag of Saarland.png", "Saga Prefecture": "Flag of Saga", # fix this ... "Saint Barthélemy": "Flag of Saint Barthelemy (local)", "Saint Martin": "StMartinCoat.png", "Saint Petersburg": "Flag of Saint Petersburg Russia", "Sikkim": "Sikkimflag", "Shimane Prefecture": "Flag of Shimane", # fix this ... "Shizuoka Prefecture": "Flag of Shizuoka", # fix this ... "Sonsonate": "Flag of Sonsonate.png", "State of Mexico": "Mexico_stateflags_Estado_de_Mexico.png", "Tochigi Prefecture": "Flag of Tochigi", # fix this ... "Tokushima Prefecture": "Flag of Tokushima", # fix this ... "Tottori Prefecture": "Flag of Tottori", # fix this ... "Toyama Prefecture": "Flag of Toyama", # fix this ... "Tokelau": "Flag of Tokelau", # someone linked a JPEG "Ulyanovsk Oblast": "Flag of Ulyanovsk Oblast.png", "Utrecht": "Utrecht (province)-Flag", "Victoria": "Flag of Victoria (Australia)", "Wake Island": "Flag of Wake Island", "Yamanashi Prefecture": "Flag of Yamanashi prefecture.png", "Yaroslavl Oblast": "Flag of Yaroslavl Oblast.png" } def getFlagUrl(country): if flags_.has_key(country): flag = flags_[country] if flags_[country][-4] != ".": flag = "%s.svg" % flag else: if translate.has_key(country): country = translate[country] # country = country.replace("Å", "A").replace("é", "e") url = "http://en.wikipedia.org/wiki/%s" % country.replace(" ", "_") print "reading", url html = getUrlUnicode(url) country = findRe(html, "

(.*?)").encode("utf-8") url = "http://en.wikipedia.org/w/index.php?title=%s&action=edit" % country.replace(" ", "_") print "reading", url html = getUrlUnicode(url) flag = findRe(html, "image_flag\s*?=\s*?(.*?\.svg)") # Gilbert and Ellice Islands has an empty "flag =" entry, so we can't just find "flag" if not flag: flag = findRe(html, "flag\s*?=\s*?(.*?\.svg)") if not flag: flag = findRe(html, "flag\s*?=\s*?(.*?\.png)") # Panama Canal Zone has a PNG if not flag: no_flag.append(country) flag = "Flag of %s.svg" % country url = "http://en.wikipedia.org/wiki/File:%s" % flag.replace(" ", "_") print "reading", url html = getUrlUnicode(url) url = findRe(html, " 2 and code[2] == "-": targetFile = "../png/square/%s/%s.png" % (code[:2], code) else: targetFile = "../png/square/%s.png" % code if not os.path.exists(targetFile): sourceFile = targetFile.replace("/square/", "/originals/") sourceImage = Image.open(sourceFile) for function in functions.split("; "): pos = function.find("(") args = function[pos + 1:-1].split(", ") function = function[:pos] if function == "border": targetImage = borderImage(sourceImage, args) elif function == "construct": targetImage = constructImage(sourceImage, args) elif function == "copy": targetImage = copyImage(sourceImage, targetImage, args) elif function == "corner": targetImage = cornerImage(sourceImage, args) elif function == "crop": targetImage = cropImage(sourceImage, args) elif function == "cross": targetImage = crossImage(sourceImage, args) elif function == "cut": targetImage = cutImage(sourceImage, args) sourceImage = targetImage elif function == "extend": targetImage = extendImage(sourceImage, args) elif function == "pass": targetImage = sourceImage elif function == "resize": targetImage = resizeImage(sourceImage, args) elif function == "special": targetImage = specialImage(sourceImage, args) writeImage(targetFile, targetImage) targetImage = targetImage.resize((16, 16), Image.ANTIALIAS) writeImage(targetFile.replace("/square/", "/16/"), targetImage) def borderImage(image, args): args = map(lambda x: int(x), args) if len(args) == 1: args.append(args[0]) new = Image.new("RGBA", (image.size[1], image.size[1])) left = int((image.size[0] - image.size[1] + args[0] + args[1]) / 2) right = left + image.size[1] - args[0] - args[1] cropLeft = image.crop((0, 0, args[0], image.size[1])) cropCenter = image.crop((left, 0, right, image.size[1])) cropRight = image.crop((image.size[0] - args[1], 0, image.size[0], image.size[1])) new.paste(cropLeft, (0, 0)) new.paste(cropCenter, (args[0], 0)) new.paste(cropRight, (image.size[1] - args[1], 0)) return new def constructImage(image, args): new = Image.new("RGBA", (256, 256)) for y in range(256): for x in range(256): new.putpixel((x, y), (255, 255, 255)) new.paste(image.resize((128, 160), Image.ANTIALIAS), (64, 56)) return new def copyImage(image, new, args): for i in range(8): args[i] = int(args[i]) if len(args) == 8: args.append("rect") image = image.crop((args[0], args[1], args[2], args[3])) image = image.resize((args[4], args[5]), Image.ANTIALIAS) if args[8] == "rect": new.paste(image, (args[6], args[7])) else: if args[8] == "circle": mask_ = Image.open("../png/maskCircle.png") mask = Image.new("L", (mask_.size[0], mask_.size[1])) mask.paste(mask_, (0, 0)) mask = mask.resize((image.size[0], image.size[1]), Image.ANTIALIAS) new.paste(image, (args[6], args[7]), mask) return new def cornerImage(image, args): args[0] = int(args[0]) new = Image.new("RGBA", (image.size[1], image.size[1])) width = int(image.size[1] / 2) left = int(args[0] - width / 2) right = int(args[0] + width / 2) cropLeft = image.crop((left, 0, right, image.size[1])) cropRight = image.crop((image.size[0] - right, 0, image.size[0] - left, image.size[1])) new.paste(cropLeft, (0, 0)) new.paste(cropRight, (width, 0)) return new def cropImage(image, args): new = Image.new("RGBA", (image.size[1], image.size[1])) if args[0] == "": left = int((image.size[0] - image.size[1]) / 2) elif args[0] == "left": left = 0 elif args[0] == "right": left = image.size[0] - image.size[1] else: left = int(args[0]) - int(image.size[1] / 2) new.paste(image.crop((left, 0, left + image.size[1], image.size[1])), (0, 0)) return new def crossImage(image, args): args[0] = int(args[0]) new = cropImage(image, [""]) if args[1] == "crop": left = int((image.size[0] - args[0]) / 4 - (image.size[1] - args[0]) / 4) right = left + int((image.size[1] - args[0]) / 2) crop = image.crop((left, 0, right, image.size[1])) new.paste(crop, (0, 0)) crop = image.crop((image.size[0] - right, 0, image.size[0] - left, image.size[1])) new.paste(crop, (int((image.size[1] + args[0]) / 2), 0)) elif args[1] == "resize": width = int(args[2]) height = int((image.size[1] - args[0]) / 2) offset = int((image.size[1] + args[0]) / 2) crop = image.crop((0, 0, width, height)).resize((height, height), Image.ANTIALIAS) new.paste(crop, (0, 0)) crop = image.crop((image.size[0] - width, 0, image.size[0], height)).resize((height, height), Image.ANTIALIAS) new.paste(crop, (int((image.size[1] + args[0]) / 2), 0)) crop = image.crop((0, offset, width, image.size[1])).resize((height, height), Image.ANTIALIAS) new.paste(crop, (0, offset)) crop = image.crop((image.size[0] - width, offset, image.size[0], image.size[1])).resize((height, height), Image.ANTIALIAS) new.paste(crop, (offset, offset)) return new def cutImage(image, args): args = map(lambda x: int(x), args) return image.crop((args[0], args[1], image.size[0] - args[2], image.size[1] - args[3])) def extendImage(image, args): new = Image.new("RGBA", (image.size[0], image.size[0])) top = int((image.size[0] - image.size[1]) / 2) new.paste(image, (0, top)) if args[0] == "": cropTop = image.crop((0, 0, image.size[0], 1)) cropBottom = image.crop((0, image.size[1] - 1, image.size[0], image.size[1])) else: if args[0] == "left": pixel = image.crop((1, 1, 2, 2)) else: pixel = image.crop((image.size[0] - 2, 1, image.size[0] - 1, 2)) cropTop = Image.new("RGBA", (image.size[0], 1)) for x in range(image.size[0]): cropTop.paste(pixel, (x, 0)) if args[1] == "left": pixel = image.crop((1, image.size[1] - 2, 2, image.size[1] - 1)) else: pixel = image.crop((image.size[0] - 2, image.size[1] - 2, image.size[0] - 1, image.size[1] - 1)) cropBottom = Image.new("RGBA", (image.size[0], 1)) for x in range(image.size[0]): cropBottom.paste(pixel, (x, 0)) for y in range(top): new.paste(cropTop, (0, y)) new.paste(cropBottom, (0, top + image.size[1] + y)) return new def resizeImage(image, args): new = Image.new("RGBA", (image.size[1], image.size[1])) new.paste(image.resize((image.size[1], image.size[1]), Image.ANTIALIAS)) return new def specialImage(image, args): tmp = Image.new("RGBA", (270, 270)) tmp.paste(image.crop((632, 68, 992, 428)).resize((270, 270), Image.ANTIALIAS)) white = tmp.crop((269, 269, 270, 270)) tmp.paste(white.resize((80, 40)), (0, 0)) tmp.paste(white.resize((80, 40)), (0, 230)) tmp.paste(white.resize((80, 20)), (80, 0)) tmp.paste(white.resize((80, 20)), (80, 250)) new = Image.new("RGBA", (496, 496)) new.paste(image.resize((496, 496), Image.ANTIALIAS)) tmp.paste(new.crop((226, 113, 276, 163)), (0, 0)) tmp.paste(new.crop((276, 113, 326, 138)), (50, 0)) tmp.paste(new.crop((226, 333, 276, 383)), (0, 220)) tmp.paste(new.crop((276, 358, 326, 383)), (50, 245)) new.paste(tmp, (226, 113)) new.paste(white.resize((80, 40)), (409, 73)) new.paste(white.resize((50, 20)), (390, 383)) return new def hashFile(filename): h = hashlib.sha1() f = open(filename) h.update(f.read()) f.close() return h.hexdigest() def writeFile(filename, data): print "writing", filename writePath(filename) f = open(filename, "w") f.write(data) f.close() def writeImage(filename, image): print "writing", filename writePath(filename) image.save(filename) def writePath(filename): path = os.path.split(filename)[0] if path and not os.path.exists(path): os.makedirs(path) debug = True # if true, existing originals are not re-downloaded no_flag = [] # flags.sort(lambda x, y: cmp(x[1], y[1])) for flag in flags: if flag[2][0] == flag[2][0].upper(): print flag[0], flag[1], "-->", flag[2] else: print flag[0], flag[1] if len(flag[0]) > 2 and flag[0][2] == "-": filename = "../png/originals/%s/%s.png" % (flag[0][:2], flag[0]) else: filename = "../png/originals/%s.png" % flag[0] filename_ = "../png/originals/_tmp.png" if not debug or not os.path.exists(filename): url = getFlagUrl(flag[1]) print "reading", url try: data = getUrl(url) except: data = getUrl(url.replace("_Prefecture", "")) writeFile(filename_, data) if not os.path.exists(filename) or hashFile(filename) != hashFile(filename_): writeFile(filename, data) os.remove(filename_) square(flag[0], flag[2]) print "no flag", no_flag