Skip to content

Instantly share code, notes, and snippets.

@henriquemoody
Last active January 19, 2018 20:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save henriquemoody/ec404f994a87b18c7771 to your computer and use it in GitHub Desktop.
Save henriquemoody/ec404f994a87b18c7771 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
set -e
declare DIRECTORY=$(dirname "${BASH_SOURCE}")
declare URL="${1}"
declare ENTRY=$(echo "${1}" | cut -d '/' -f 4)
declare FILE_HTML="${DIRECTORY}/html/${ENTRY}.html"
declare FILE_TEXT="${DIRECTORY}/text/${ENTRY}.text"
declare NAME_RULE="$(echo ${ENTRY} | sed -E 's,^(.)(.)$,\1\l\2,g')SubdivisionCode"
declare NAME_EXCEPTION="${NAME_RULE}Exception"
declare FILE_RULE="library/Rules/SubdivisionCode/${NAME_RULE}.php"
declare FILE_EXCEPTION="library/Exceptions/SubdivisionCode/${NAME_EXCEPTION}.php"
mkdir -p \
"${DIRECTORY}/html" \
"${DIRECTORY}/text" \
library/Exceptions/SubdivisionCode \
library/Rules/SubdivisionCode
echo "${1}" >> "${DIRECTORY}/history.list"
html_download()
{
curl -sl "${URL}" -o "${FILE_HTML}"
}
text_generate()
{
egrep '(subdivtable\d|isoSpan|no longer exists|^</table>)' "${FILE_HTML}" |
sed -E 's,^.+(subdivtable[0-9]+).+$,\1,g; s,</table>,endtable,g;s,no longer exists:,endtable,g' |
sed -E 's#<td>#:#g' |
sed -E 's#(<[^>]+>|&nbsp\;)##g' |
cat > "${FILE_TEXT}"
}
table1_parse()
{
sed "1d" "${FILE_TEXT}" |
sed -nE "/^subdivtable1/,/^endtable/p" |
cut -d ':' -f 3,6 |
egrep -v '^(subdivtable1|endtable)$'
}
table2_parse()
{
sed -nE "/^subdivtable2/,/^endtable/p" "${FILE_TEXT}" |
cut -d ':' -f 3,7 |
egrep -v '^(subdivtable2|endtable)$'
}
php_array_generate()
{
{
table1_parse
table2_parse
} | egrep '^[^ ]+:.+$' |
sed -E 's#^([^:]+):(.+)$# "\1", // \2#g' |
sort -u |
tr '"' "'"
}
php_exception_generate()
{
echo '<?php'
echo
echo '/*'
echo ' * This file is part of Respect/Validation.'
echo ' *'
echo ' * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net>'
echo ' *'
echo ' * For the full copyright and license information, please view the "LICENSE.md"'
echo ' * file that was distributed with this source code.'
echo ' */'
echo
echo 'declare(strict_types=1);'
echo
echo 'namespace Respect\Validation\Exceptions\SubdivisionCode;'
echo
echo 'use Respect\Validation\Exceptions\SubdivisionCodeException;'
echo
echo '/**'
echo " * Exception class for subdivision codes of ${COUNTRY}."
echo " *"
echo " * ISO 3166-1 alpha-2: ${ENTRY}"
echo " *"
echo " * @author Henrique Moody <henriquemoody@gmail.com>"
echo " */"
echo "final class ${NAME_EXCEPTION} extends SubdivisionCodeException"
echo "{"
echo " /**"
echo " * {@inheritdoc}"
echo " */"
echo " public static \$defaultTemplates = ["
echo " self::MODE_DEFAULT => ["
echo " self::STANDARD => '{{name}} must be a subdivision code of ${COUNTRY}',"
echo " ],"
echo " self::MODE_NEGATIVE => ["
echo " self::STANDARD => '{{name}} must not be a subdivision code of ${COUNTRY}',"
echo " ],"
echo " ];"
echo "}"
}
php_rule_generate()
{
declare haystack="";
declare generated=$(php_array_generate);
if [[ ! -z "${generated}" ]]; then
haystack="\n${generated}\n "
fi
echo '<?php'
echo
echo '/*'
echo ' * This file is part of Respect/Validation.'
echo ' *'
echo ' * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net>'
echo ' *'
echo ' * For the full copyright and license information, please view the "LICENSE.md"'
echo ' * file that was distributed with this source code.'
echo ' */'
echo
echo 'declare(strict_types=1);'
echo
echo 'namespace Respect\Validation\Rules\SubdivisionCode;'
echo
echo 'use Respect\Validation\Rules\AbstractSearcher;'
echo
echo '/**'
echo " * Validates whether an input is subdivision code of ${COUNTRY} or not."
echo " *"
echo " * ISO 3166-1 alpha-2: ${ENTRY}"
echo " *"
echo " * @see ${URL}"
echo " *"
echo " * @author Henrique Moody <henriquemoody@gmail.com>"
echo " */"
echo "final class ${NAME_RULE} extends AbstractSearcher"
echo "{"
echo " /**"
echo " * {@inheritdoc}"
echo " */"
echo " protected function getDataSource(): array"
echo " {"
echo -e " return [${haystack}];"
echo " }"
echo "}"
}
if [[ ! -f "${FILE_HTML}" ]]; then
html_download
fi
declare COUNTRY=$(grep '<title>' "${FILE_HTML}" | sed -E 's,<title>Administrative Division of (.*)</title>,\1,g')
if [[ -z "${COUNTRY}" ]]; then
COUNTRY=$(echo "${1}" | sed -E 's,^.+administrative-division-([^.]+).html$,\u\1,g; s,-(.), \u\1,g')
fi
text_generate
php_rule_generate > "${FILE_RULE}"
php_exception_generate > "${FILE_EXCEPTION}"
php -l "${FILE_RULE}"
php -l "${FILE_EXCEPTION}"
http://www.geonames.org/AD/administrative-division-andorra.html
http://www.geonames.org/AE/administrative-division-united-arab-emirates.html
http://www.geonames.org/AF/administrative-division-afghanistan.html
http://www.geonames.org/AG/administrative-division-antigua-and-barbuda.html
http://www.geonames.org/AI/administrative-division-anguilla.html
http://www.geonames.org/AL/administrative-division-albania.html
http://www.geonames.org/AM/administrative-division-armenia.html
http://www.geonames.org/AN/administrative-division-netherlands-antilles.html
http://www.geonames.org/AO/administrative-division-angola.html
http://www.geonames.org/AQ/administrative-division-antarctica.html
http://www.geonames.org/AR/administrative-division-argentina.html
http://www.geonames.org/AS/administrative-division-american-samoa.html
http://www.geonames.org/AT/administrative-division-austria.html
http://www.geonames.org/AU/administrative-division-australia.html
http://www.geonames.org/AW/administrative-division-aruba.html
http://www.geonames.org/AX/administrative-division-aland.html
http://www.geonames.org/AZ/administrative-division-azerbaijan.html
http://www.geonames.org/BA/administrative-division-bosnia-and-herzegovina.html
http://www.geonames.org/BB/administrative-division-barbados.html
http://www.geonames.org/BD/administrative-division-bangladesh.html
http://www.geonames.org/BE/administrative-division-belgium.html
http://www.geonames.org/BF/administrative-division-burkina-faso.html
http://www.geonames.org/BG/administrative-division-bulgaria.html
http://www.geonames.org/BH/administrative-division-bahrain.html
http://www.geonames.org/BI/administrative-division-burundi.html
http://www.geonames.org/BJ/administrative-division-benin.html
http://www.geonames.org/BL/administrative-division-saint-barthelemy.html
http://www.geonames.org/BM/administrative-division-bermuda.html
http://www.geonames.org/BN/administrative-division-brunei.html
http://www.geonames.org/BO/administrative-division-bolivia.html
http://www.geonames.org/BQ/administrative-division-bonaire.html
http://www.geonames.org/BR/administrative-division-brazil.html
http://www.geonames.org/BS/administrative-division-bahamas.html
http://www.geonames.org/BT/administrative-division-bhutan.html
http://www.geonames.org/BV/administrative-division-bouvet-island.html
http://www.geonames.org/BW/administrative-division-botswana.html
http://www.geonames.org/BY/administrative-division-belarus.html
http://www.geonames.org/BZ/administrative-division-belize.html
http://www.geonames.org/CA/administrative-division-canada.html
http://www.geonames.org/CC/administrative-division-cocos-islands.html
http://www.geonames.org/CD/administrative-division-democratic-republic-of-the-congo.html
http://www.geonames.org/CF/administrative-division-central-african-republic.html
http://www.geonames.org/CG/administrative-division-republic-of-the-congo.html
http://www.geonames.org/CH/administrative-division-switzerland.html
http://www.geonames.org/CI/administrative-division-ivory-coast.html
http://www.geonames.org/CK/administrative-division-cook-islands.html
http://www.geonames.org/CL/administrative-division-chile.html
http://www.geonames.org/CM/administrative-division-cameroon.html
http://www.geonames.org/CN/administrative-division-china.html
http://www.geonames.org/CO/administrative-division-colombia.html
http://www.geonames.org/CR/administrative-division-costa-rica.html
http://www.geonames.org/CS/administrative-division-serbia-and-montenegro.html
http://www.geonames.org/CU/administrative-division-cuba.html
http://www.geonames.org/CV/administrative-division-cape-verde.html
http://www.geonames.org/CW/administrative-division-curacao.html
http://www.geonames.org/CX/administrative-division-christmas-island.html
http://www.geonames.org/CY/administrative-division-cyprus.html
http://www.geonames.org/CZ/administrative-division-czech-republic.html
http://www.geonames.org/DE/administrative-division-germany.html
http://www.geonames.org/DJ/administrative-division-djibouti.html
http://www.geonames.org/DK/administrative-division-denmark.html
http://www.geonames.org/DM/administrative-division-dominica.html
http://www.geonames.org/DO/administrative-division-dominican-republic.html
http://www.geonames.org/DZ/administrative-division-algeria.html
http://www.geonames.org/EC/administrative-division-ecuador.html
http://www.geonames.org/EE/administrative-division-estonia.html
http://www.geonames.org/EG/administrative-division-egypt.html
http://www.geonames.org/EH/administrative-division-western-sahara.html
http://www.geonames.org/ER/administrative-division-eritrea.html
http://www.geonames.org/ES/administrative-division-spain.html
http://www.geonames.org/ET/administrative-division-ethiopia.html
http://www.geonames.org/FI/administrative-division-finland.html
http://www.geonames.org/FJ/administrative-division-fiji.html
http://www.geonames.org/FK/administrative-division-falkland-islands.html
http://www.geonames.org/FM/administrative-division-micronesia.html
http://www.geonames.org/FO/administrative-division-faroe-islands.html
http://www.geonames.org/FR/administrative-division-france.html
http://www.geonames.org/GA/administrative-division-gabon.html
http://www.geonames.org/GB/administrative-division-united-kingdom.html
http://www.geonames.org/GD/administrative-division-grenada.html
http://www.geonames.org/GE/administrative-division-georgia.html
http://www.geonames.org/GF/administrative-division-french-guiana.html
http://www.geonames.org/GG/administrative-division-guernsey.html
http://www.geonames.org/GH/administrative-division-ghana.html
http://www.geonames.org/GI/administrative-division-gibraltar.html
http://www.geonames.org/GL/administrative-division-greenland.html
http://www.geonames.org/GM/administrative-division-gambia.html
http://www.geonames.org/GN/administrative-division-guinea.html
http://www.geonames.org/GP/administrative-division-guadeloupe.html
http://www.geonames.org/GQ/administrative-division-equatorial-guinea.html
http://www.geonames.org/GR/administrative-division-greece.html
http://www.geonames.org/GS/administrative-division-south-georgia-and-the-south-sandwich-islands.html
http://www.geonames.org/GT/administrative-division-guatemala.html
http://www.geonames.org/GU/administrative-division-guam.html
http://www.geonames.org/GW/administrative-division-guinea-bissau.html
http://www.geonames.org/GY/administrative-division-guyana.html
http://www.geonames.org/HK/administrative-division-hong-kong.html
http://www.geonames.org/HM/administrative-division-heard-island-and-mcdonald-islands.html
http://www.geonames.org/HN/administrative-division-honduras.html
http://www.geonames.org/HR/administrative-division-croatia.html
http://www.geonames.org/HT/administrative-division-haiti.html
http://www.geonames.org/HU/administrative-division-hungary.html
http://www.geonames.org/ID/administrative-division-indonesia.html
http://www.geonames.org/IE/administrative-division-ireland.html
http://www.geonames.org/IL/administrative-division-israel.html
http://www.geonames.org/IM/administrative-division-isle-of-man.html
http://www.geonames.org/IN/administrative-division-india.html
http://www.geonames.org/IO/administrative-division-british-indian-ocean-territory.html
http://www.geonames.org/IQ/administrative-division-iraq.html
http://www.geonames.org/IR/administrative-division-iran.html
http://www.geonames.org/IS/administrative-division-iceland.html
http://www.geonames.org/IT/administrative-division-italy.html
http://www.geonames.org/JE/administrative-division-jersey.html
http://www.geonames.org/JM/administrative-division-jamaica.html
http://www.geonames.org/JO/administrative-division-jordan.html
http://www.geonames.org/JP/administrative-division-japan.html
http://www.geonames.org/KE/administrative-division-kenya.html
http://www.geonames.org/KG/administrative-division-kyrgyzstan.html
http://www.geonames.org/KH/administrative-division-cambodia.html
http://www.geonames.org/KI/administrative-division-kiribati.html
http://www.geonames.org/KM/administrative-division-comoros.html
http://www.geonames.org/KN/administrative-division-saint-kitts-and-nevis.html
http://www.geonames.org/KP/administrative-division-north-korea.html
http://www.geonames.org/KR/administrative-division-south-korea.html
http://www.geonames.org/KW/administrative-division-kuwait.html
http://www.geonames.org/KY/administrative-division-cayman-islands.html
http://www.geonames.org/KZ/administrative-division-kazakhstan.html
http://www.geonames.org/LA/administrative-division-laos.html
http://www.geonames.org/LB/administrative-division-lebanon.html
http://www.geonames.org/LC/administrative-division-saint-lucia.html
http://www.geonames.org/LI/administrative-division-liechtenstein.html
http://www.geonames.org/LK/administrative-division-sri-lanka.html
http://www.geonames.org/LR/administrative-division-liberia.html
http://www.geonames.org/LS/administrative-division-lesotho.html
http://www.geonames.org/LT/administrative-division-lithuania.html
http://www.geonames.org/LU/administrative-division-luxembourg.html
http://www.geonames.org/LV/administrative-division-latvia.html
http://www.geonames.org/LY/administrative-division-libya.html
http://www.geonames.org/MA/administrative-division-morocco.html
http://www.geonames.org/MC/administrative-division-monaco.html
http://www.geonames.org/MD/administrative-division-moldova.html
http://www.geonames.org/ME/administrative-division-montenegro.html
http://www.geonames.org/MF/administrative-division-saint-martin.html
http://www.geonames.org/MG/administrative-division-madagascar.html
http://www.geonames.org/MH/administrative-division-marshall-islands.html
http://www.geonames.org/MK/administrative-division-macedonia.html
http://www.geonames.org/ML/administrative-division-mali.html
http://www.geonames.org/MM/administrative-division-myanmar.html
http://www.geonames.org/MN/administrative-division-mongolia.html
http://www.geonames.org/MO/administrative-division-macao.html
http://www.geonames.org/MP/administrative-division-northern-mariana-islands.html
http://www.geonames.org/MQ/administrative-division-martinique.html
http://www.geonames.org/MR/administrative-division-mauritania.html
http://www.geonames.org/MS/administrative-division-montserrat.html
http://www.geonames.org/MT/administrative-division-malta.html
http://www.geonames.org/MU/administrative-division-mauritius.html
http://www.geonames.org/MV/administrative-division-maldives.html
http://www.geonames.org/MW/administrative-division-malawi.html
http://www.geonames.org/MX/administrative-division-mexico.html
http://www.geonames.org/MY/administrative-division-malaysia.html
http://www.geonames.org/MZ/administrative-division-mozambique.html
http://www.geonames.org/NA/administrative-division-namibia.html
http://www.geonames.org/NC/administrative-division-new-caledonia.html
http://www.geonames.org/NE/administrative-division-niger.html
http://www.geonames.org/NF/administrative-division-norfolk-island.html
http://www.geonames.org/NG/administrative-division-nigeria.html
http://www.geonames.org/NI/administrative-division-nicaragua.html
http://www.geonames.org/NL/administrative-division-netherlands.html
http://www.geonames.org/NO/administrative-division-norway.html
http://www.geonames.org/NP/administrative-division-nepal.html
http://www.geonames.org/NR/administrative-division-nauru.html
http://www.geonames.org/NU/administrative-division-niue.html
http://www.geonames.org/NZ/administrative-division-new-zealand.html
http://www.geonames.org/OM/administrative-division-oman.html
http://www.geonames.org/PA/administrative-division-panama.html
http://www.geonames.org/PE/administrative-division-peru.html
http://www.geonames.org/PF/administrative-division-french-polynesia.html
http://www.geonames.org/PG/administrative-division-papua-new-guinea.html
http://www.geonames.org/PH/administrative-division-philippines.html
http://www.geonames.org/PK/administrative-division-pakistan.html
http://www.geonames.org/PL/administrative-division-poland.html
http://www.geonames.org/PM/administrative-division-saint-pierre-and-miquelon.html
http://www.geonames.org/PN/administrative-division-pitcairn-islands.html
http://www.geonames.org/PR/administrative-division-puerto-rico.html
http://www.geonames.org/PS/administrative-division-palestine.html
http://www.geonames.org/PT/administrative-division-portugal.html
http://www.geonames.org/PW/administrative-division-palau.html
http://www.geonames.org/PY/administrative-division-paraguay.html
http://www.geonames.org/QA/administrative-division-qatar.html
http://www.geonames.org/RE/administrative-division-reunion.html
http://www.geonames.org/RO/administrative-division-romania.html
http://www.geonames.org/RS/administrative-division-serbia.html
http://www.geonames.org/RU/administrative-division-russia.html
http://www.geonames.org/RW/administrative-division-rwanda.html
http://www.geonames.org/SA/administrative-division-saudi-arabia.html
http://www.geonames.org/SB/administrative-division-solomon-islands.html
http://www.geonames.org/SC/administrative-division-seychelles.html
http://www.geonames.org/SD/administrative-division-sudan.html
http://www.geonames.org/SE/administrative-division-sweden.html
http://www.geonames.org/SG/administrative-division-singapore.html
http://www.geonames.org/SH/administrative-division-saint-helena.html
http://www.geonames.org/SI/administrative-division-slovenia.html
http://www.geonames.org/SJ/administrative-division-svalbard-and-jan-mayen.html
http://www.geonames.org/SK/administrative-division-slovakia.html
http://www.geonames.org/SL/administrative-division-sierra-leone.html
http://www.geonames.org/SM/administrative-division-san-marino.html
http://www.geonames.org/SN/administrative-division-senegal.html
http://www.geonames.org/SO/administrative-division-somalia.html
http://www.geonames.org/SR/administrative-division-suriname.html
http://www.geonames.org/SS/administrative-division-south-sudan.html
http://www.geonames.org/ST/administrative-division-sao-tome-and-principe.html
http://www.geonames.org/SV/administrative-division-el-salvador.html
http://www.geonames.org/SX/administrative-division-sint-maarten.html
http://www.geonames.org/SY/administrative-division-syria.html
http://www.geonames.org/SZ/administrative-division-swaziland.html
http://www.geonames.org/TC/administrative-division-turks-and-caicos-islands.html
http://www.geonames.org/TD/administrative-division-chad.html
http://www.geonames.org/TF/administrative-division-french-southern-territories.html
http://www.geonames.org/TG/administrative-division-togo.html
http://www.geonames.org/TH/administrative-division-thailand.html
http://www.geonames.org/TJ/administrative-division-tajikistan.html
http://www.geonames.org/TK/administrative-division-tokelau.html
http://www.geonames.org/TL/administrative-division-east-timor.html
http://www.geonames.org/TM/administrative-division-turkmenistan.html
http://www.geonames.org/TN/administrative-division-tunisia.html
http://www.geonames.org/TO/administrative-division-tonga.html
http://www.geonames.org/TR/administrative-division-turkey.html
http://www.geonames.org/TT/administrative-division-trinidad-and-tobago.html
http://www.geonames.org/TV/administrative-division-tuvalu.html
http://www.geonames.org/TW/administrative-division-taiwan.html
http://www.geonames.org/TZ/administrative-division-tanzania.html
http://www.geonames.org/UA/administrative-division-ukraine.html
http://www.geonames.org/UG/administrative-division-uganda.html
http://www.geonames.org/UM/administrative-division-united-states-minor-outlying-islands.html
http://www.geonames.org/US/administrative-division-united-states.html
http://www.geonames.org/UY/administrative-division-uruguay.html
http://www.geonames.org/UZ/administrative-division-uzbekistan.html
http://www.geonames.org/VA/administrative-division-vatican-city.html
http://www.geonames.org/VC/administrative-division-saint-vincent-and-the-grenadines.html
http://www.geonames.org/VE/administrative-division-venezuela.html
http://www.geonames.org/VG/administrative-division-british-virgin-islands.html
http://www.geonames.org/VI/administrative-division-u-s-virgin-islands.html
http://www.geonames.org/VN/administrative-division-vietnam.html
http://www.geonames.org/VU/administrative-division-vanuatu.html
http://www.geonames.org/WF/administrative-division-wallis-and-futuna.html
http://www.geonames.org/WS/administrative-division-samoa.html
http://www.geonames.org/XK/administrative-division-kosovo.html
http://www.geonames.org/YE/administrative-division-yemen.html
http://www.geonames.org/YT/administrative-division-mayotte.html
http://www.geonames.org/ZA/administrative-division-south-africa.html
http://www.geonames.org/ZM/administrative-division-zambia.html
http://www.geonames.org/ZW/administrative-division-zimbabwe.html
@henriquemoody
Copy link
Author

while read url; do
  ./crawler $url;
done < country-subdivision.list

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment