From ad54bdeecc904dd1a984561a8ef013e2803e8c84 Mon Sep 17 00:00:00 2001 From: vng Date: Fri, 18 Nov 2011 21:22:44 +0300 Subject: [PATCH] Add languages getter utility. It uses wikipedia as source. --- lang_getter/debug/lang_getter | Bin 0 -> 185228 bytes lang_getter/lang_getter.pro | 28 +++ lang_getter/logging.cpp | 30 ++++ lang_getter/logging.h | 16 ++ lang_getter/main.cpp | 13 ++ lang_getter/mainmanager.cpp | 304 ++++++++++++++++++++++++++++++++ lang_getter/mainmanager.h | 64 +++++++ lang_getter/pagedownloader.cpp | 62 +++++++ lang_getter/pagedownloader.h | 37 ++++ lang_getter/release/lang_getter | Bin 0 -> 60852 bytes lang_getter/stringparser.cpp | 36 ++++ lang_getter/stringparser.h | 39 ++++ 12 files changed, 629 insertions(+) create mode 100755 lang_getter/debug/lang_getter create mode 100644 lang_getter/lang_getter.pro create mode 100644 lang_getter/logging.cpp create mode 100644 lang_getter/logging.h create mode 100644 lang_getter/main.cpp create mode 100644 lang_getter/mainmanager.cpp create mode 100644 lang_getter/mainmanager.h create mode 100644 lang_getter/pagedownloader.cpp create mode 100644 lang_getter/pagedownloader.h create mode 100755 lang_getter/release/lang_getter create mode 100644 lang_getter/stringparser.cpp create mode 100644 lang_getter/stringparser.h diff --git a/lang_getter/debug/lang_getter b/lang_getter/debug/lang_getter new file mode 100755 index 0000000000000000000000000000000000000000..95df683fa45baaee29c03591d2b23d842758e99b GIT binary patch literal 185228 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 F{{i!ENc#W) literal 0 HcmV?d00001 diff --git a/lang_getter/lang_getter.pro b/lang_getter/lang_getter.pro new file mode 100644 index 0000000000..e3dc4cc0af --- /dev/null +++ b/lang_getter/lang_getter.pro @@ -0,0 +1,28 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2011-11-18T08:50:14 +# +#------------------------------------------------- + +QT += core network xml + +QT -= gui + +TARGET = lang_getter +CONFIG += console +CONFIG -= app_bundle + +TEMPLATE = app + + +SOURCES += main.cpp \ + pagedownloader.cpp \ + logging.cpp \ + mainmanager.cpp \ + stringparser.cpp + +HEADERS += \ + pagedownloader.h \ + logging.h \ + mainmanager.h \ + stringparser.h diff --git a/lang_getter/logging.cpp b/lang_getter/logging.cpp new file mode 100644 index 0000000000..22250fca96 --- /dev/null +++ b/lang_getter/logging.cpp @@ -0,0 +1,30 @@ +#include "logging.h" + +#include + + +using namespace std; + +Logging::Logging() +{ +} + +void Logging::Print(STATUS s, QString const & msg) +{ + cout << StatusToString(s).toStdString() << " " << msg.toStdString() << endl; +} + +void Logging::Percent(qint64 curr, qint64 total) +{ +} + +QString Logging::StatusToString(STATUS s) const +{ + switch (s) + { + case INFO: return "INFO"; + case WARNING: return "WARNING"; + case ERROR: return "ERROR"; + default: return "NONE"; + } +} diff --git a/lang_getter/logging.h b/lang_getter/logging.h new file mode 100644 index 0000000000..86c1fcfc9e --- /dev/null +++ b/lang_getter/logging.h @@ -0,0 +1,16 @@ +#pragma once + +#include + +class Logging +{ +public: + Logging(); + + enum STATUS { INFO, WARNING, ERROR }; + + void Print(STATUS s, QString const & msg); + void Percent(qint64 curr, qint64 total); + + QString StatusToString(STATUS s) const; +}; diff --git a/lang_getter/main.cpp b/lang_getter/main.cpp new file mode 100644 index 0000000000..7aa0e9dfa8 --- /dev/null +++ b/lang_getter/main.cpp @@ -0,0 +1,13 @@ +#include + +#include "mainmanager.h" + +int main(int argc, char *argv[]) +{ + QCoreApplication a(argc, argv); + + MainManager manager("/Users/alena/omim/omim/data/metainfo/"); + manager.ProcessCountryList("/Users/alena/omim/omim/data/polygons.lst"); + + return a.exec(); +} diff --git a/lang_getter/mainmanager.cpp b/lang_getter/mainmanager.cpp new file mode 100644 index 0000000000..5f8df4bbb9 --- /dev/null +++ b/lang_getter/mainmanager.cpp @@ -0,0 +1,304 @@ +#include "mainmanager.h" + +#include + +#include +#include +#include + + +using namespace std; + +void MainManager::Country::AddCode(QString const & code) +{ + if (m_codes.end() == find(m_codes.begin(), m_codes.end(), code)) + m_codes.push_back(code); +} + +void MainManager::Country::AddUrl(size_t url) +{ + if (m_langUrls.end() == find(m_langUrls.begin(), m_langUrls.end(), url)) + m_langUrls.push_back(url); +} + +namespace +{ + void append(QString & res, QString const & s) + { + if (res.isEmpty()) res = s; + else res = res + "|" + s; + } +} + +bool MainManager::Country::GetResult(QString & res, MainManager const & m) const +{ + res.clear(); + + for (size_t i = 0; i < m_codes.size(); ++i) + append(res, m_codes[i]); + + for (size_t i = 0; i < m_langUrls.size(); ++i) + { + QString const code = m.m_langUrls[m_langUrls[i]]; + if (!code.isEmpty()) + append(res, code); + } + + return !res.isEmpty(); +} + + +MainManager::MainManager(QString const & outDir) + : m_downloader(m_log), m_parser(m_log), m_outDir(outDir) +{ +} + +char const * MainManager::LangNameToCode(QString const & name) +{ + if (name.contains("English", Qt::CaseInsensitive)) return "en"; + if (name.contains("Spanish", Qt::CaseInsensitive)) return "es"; + if (name.contains("French", Qt::CaseInsensitive)) return "fr"; + if (name.contains("Mandarin", Qt::CaseInsensitive)) return "zh"; + return 0; +} + +void MainManager::ProcessCountryList(QString const & file) +{ + ifstream s(file.toStdString().c_str()); + if (!s.is_open() || !s.good()) + { + m_log.Print(Logging::ERROR, QString("Can't open file: ") + file); + return; + } + + char buffer[256]; + while (s.good()) + { + s.getline(buffer, 256); + if (strlen(buffer) > 0) + m_countries.push_back(buffer); + } + + m_downloader.ConnectFinished(this, SLOT(countryDownloaded(QString const &))); + + m_index = 0; + ProcessNextCountry(); +} + +namespace +{ + void get_country_url(QString & name) + { + int const i = name.indexOf('_'); + if (i != -1) + name = name.mid(0, i); // for regions return country name + + name.replace(' ', '_'); // make correct wiki url + } +} + +void MainManager::ProcessNextCountry() +{ + if (m_index >= m_countries.size()) + { + m_downloader.ConnectFinished(this, SLOT(languageDownloaded(QString const &))); + + m_index = 0; + ProcessNextLanguage(); + return; + } + + QString url = m_countries[m_index].m_name; + get_country_url(url); + + m_downloader.Download(QString("http://en.wikipedia.org/wiki/") + url); +} + +namespace +{ + class append_result + { + MainManager & m_manager; + public: + append_result(MainManager & m) : m_manager(m) {} + void operator() (QString const & s) + { + char const * code = m_manager.LangNameToCode(s); + if (code) + m_manager.AppendResult(code); + } + }; + + class nodes_iterator + { + QDomElement m_node; + bool m_isList; + + public: + nodes_iterator(QDomElement const & root) : m_isList(false) + { + // process single elements ... + m_node = root.firstChildElement("a"); + if (m_node.isNull()) + { + // ... or compound list + m_node = root.firstChildElement("ul"); + if (!m_node.isNull()) + { + m_node = m_node.firstChildElement("li"); + m_isList = true; + } + } + } + + bool valid() const { return !m_node.isNull(); } + + QDomElement get() const + { + return (m_isList ? m_node.firstChildElement("a") : m_node); + } + + void next() + { + m_node = m_node.nextSiblingElement(m_isList ? "li" : "a"); + } + }; +} + +void MainManager::ProcessLangEntry(QString const & xml, QString const & entry) +{ + if (m_parser.InitSubDOM(xml, entry, "td")) + { + nodes_iterator it(m_parser.Root()); + + if (!it.valid()) + { + // try to get language from root node + TokenizeString(m_parser.Root().text(), ", ", append_result(*this)); + } + + // iterate through child nodes + while (it.valid()) + { + QDomElement e = it.get(); + + char const * code = LangNameToCode(e.text()); + if (code) + { + AppendResult(code); + } + else + { + QString const url = e.attribute("href"); + if (!url.isEmpty()) + AppendLangUrl(url); + else + m_log.Print(Logging::WARNING, QString("Undefined language without url: ") + e.text()); + } + + it.next(); + } + } +} + +void MainManager::countryDownloaded(QString const & s) +{ + ProcessLangEntry(s, "Official language(s)"); + ProcessLangEntry(s, "National language"); + + ++m_index; + ProcessNextCountry(); +} + +void MainManager::AppendResult(QString const & code) +{ + m_countries[m_index].AddCode(code); +} + +void MainManager::AppendLangUrl(QString url) +{ + { + int const i = url.lastIndexOf("/"); + if (i != -1) + url = url.mid(i+1); + } + + size_t index; + { + vector::iterator i = find(m_langUrls.begin(), m_langUrls.end(), url); + if (i == m_langUrls.end()) + { + m_langUrls.push_back(url); + index = m_langUrls.size()-1; + } + else + index = std::distance(m_langUrls.begin(), i); + } + + m_countries[m_index].AddUrl(index); +} + +void MainManager::ProcessNextLanguage() +{ + if (m_index >= m_langUrls.size()) + { + CreateResultFiles(); + m_log.Print(Logging::INFO, "Done!"); + + exit(0); + return; + } + + m_downloader.Download(QString("http://en.wikipedia.org/wiki/") + m_langUrls[m_index]); +} + +bool MainManager::ProcessCodeEntry(QString const & xml, QString const & entry) +{ + if (m_parser.InitSubDOM(xml, entry, "td")) + { + QDomElement e = m_parser.Root().firstChildElement("tt"); + if (!e.isNull()) + { + QString const name = e.text(); + if (!name.isEmpty()) + { + m_langUrls[m_index] = name; + return true; + } + } + } + + return false; +} + +void MainManager::languageDownloaded(QString const & s) +{ + if (!ProcessCodeEntry(s, "ISO 639-1")) + if (!ProcessCodeEntry(s, "ISO 639-2")) + if (!ProcessCodeEntry(s, "ISO 639-3")) + { + m_log.Print(Logging::WARNING, QString("Can't find code for url: ") + m_langUrls[m_index]); + m_langUrls[m_index] = QString(); + } + + ++m_index; + ProcessNextLanguage(); +} + +void MainManager::CreateResultFiles() +{ + m_log.Print(Logging::INFO, "Results:"); + + for (size_t i = 0; i < m_countries.size(); ++i) + { + QString s; + if (m_countries[i].GetResult(s, *this)) + { + QFile f(m_outDir + m_countries[i].m_name + QString(".meta")); + f.open(QFile::WriteOnly); + f.write(s.toStdString().c_str()); + } + else + m_log.Print(Logging::WARNING, QString("No languages for country: ") + m_countries[i].m_name); + } +} diff --git a/lang_getter/mainmanager.h b/lang_getter/mainmanager.h new file mode 100644 index 0000000000..5c80403ff1 --- /dev/null +++ b/lang_getter/mainmanager.h @@ -0,0 +1,64 @@ +#pragma once +#include "logging.h" +#include "pagedownloader.h" +#include "stringparser.h" + +#include +#include + + +class MainManager : public QObject +{ + Q_OBJECT + + Logging m_log; + PageDownloader m_downloader; + ContentParser m_parser; + + QString m_outDir; + + class Country + { + std::vector m_codes; + std::vector m_langUrls; + + public: + QString m_name; + + Country(char const * name) : m_name(name) {} + + void AddCode(QString const & code); + void AddUrl(size_t url); + + bool GetResult(QString & res, MainManager const & m) const; + }; + + std::vector m_countries; + std::vector m_langUrls; + + size_t m_index; + +public: + MainManager(QString const & outDir); + + void ProcessCountryList(QString const & file); + +protected: + void ProcessNextCountry(); + void ProcessLangEntry(QString const & xml, QString const & entry); + +public: // need for functor + char const * LangNameToCode(QString const & name); + void AppendResult(QString const & code); +protected: + void AppendLangUrl(QString url); + + void ProcessNextLanguage(); + bool ProcessCodeEntry(QString const & xml, QString const & entry); + + void CreateResultFiles(); + +private slots: + void countryDownloaded(QString const & s); + void languageDownloaded(QString const & s); +}; diff --git a/lang_getter/pagedownloader.cpp b/lang_getter/pagedownloader.cpp new file mode 100644 index 0000000000..87e089e13d --- /dev/null +++ b/lang_getter/pagedownloader.cpp @@ -0,0 +1,62 @@ +#include "pagedownloader.h" +#include "logging.h" + +#include +#include + + +void PageDownloader::ConnectFinished(QObject * obj, char const * slot) +{ + disconnect(SIGNAL(finished(QString const &))); + connect(this, SIGNAL(finished(QString const &)), obj, slot); +} + +void PageDownloader::Download(QUrl const & url) +{ + m_res.clear(); + + m_reply = m_manager.get(QNetworkRequest(url)); + connect(m_reply, SIGNAL(finished()), this, SLOT(httpFinished())); + connect(m_reply, SIGNAL(readyRead()), this, SLOT(httpReadyRead())); + connect(m_reply, SIGNAL(downloadProgress(qint64,qint64)), this, + SLOT(updateDataReadProgress(qint64,qint64))); +} + +void PageDownloader::Download(QString const & url) +{ + Download(QUrl(url)); +} + +void PageDownloader::httpFinished() +{ + QString const s = QString::fromUtf8(m_res.constData()); + QString const url = m_reply->url().toString(); + + if (s.isEmpty()) + { + m_log.Print(Logging::WARNING, QString("Downloading of ") + + url + + QString(" failed.")); + } + else + { + m_log.Print(Logging::INFO, QString("Downloading of ") + + url + + QString(" finished successfully.")); + } + + m_reply->deleteLater(); + m_reply = 0; + + emit finished(s); +} + +void PageDownloader::httpReadyRead() +{ + m_res += m_reply->readAll(); +} + +void PageDownloader::updateDataReadProgress(qint64 read, qint64 total) +{ + m_log.Percent(read, total); +} diff --git a/lang_getter/pagedownloader.h b/lang_getter/pagedownloader.h new file mode 100644 index 0000000000..8884818c57 --- /dev/null +++ b/lang_getter/pagedownloader.h @@ -0,0 +1,37 @@ +#pragma once + +#include +#include + + +class Logging; +class QUrl; +class QNetworkReply; + +class PageDownloader : public QObject +{ + Q_OBJECT + + QNetworkAccessManager m_manager; + QNetworkReply * m_reply; + + Logging & m_log; + + QByteArray m_res; + +public: + PageDownloader(Logging & log) : m_log(log) {} + + void ConnectFinished(QObject * obj, char const * slot); + + void Download(QUrl const & url); + void Download(QString const & url); + +signals: + void finished(QString const &); + +private slots: + void httpFinished(); + void httpReadyRead(); + void updateDataReadProgress(qint64 read, qint64 total); +}; diff --git a/lang_getter/release/lang_getter b/lang_getter/release/lang_getter new file mode 100755 index 0000000000000000000000000000000000000000..147f9c40a1b4678a8affa64e1226d97b315a9f24 GIT binary patch literal 60852 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 M;8o`}D>|7x0me#PwEzGB literal 0 HcmV?d00001 diff --git a/lang_getter/stringparser.cpp b/lang_getter/stringparser.cpp new file mode 100644 index 0000000000..e74530dcdc --- /dev/null +++ b/lang_getter/stringparser.cpp @@ -0,0 +1,36 @@ +#include "stringparser.h" +#include "logging.h" + + +bool ContentParser::InitSubDOM(QString const & xml, QString const & entry, QString const & tag) +{ + int const i = xml.indexOf(entry); + if (i == -1) + { + m_log.Print(Logging::INFO, QString("Can't find entry: ") + entry); + return false; + } + + int const beg = xml.indexOf(QString("<") + tag, i); + if (beg == -1 || beg < i) + { + m_log.Print(Logging::INFO, QString("Can't find tag: ") + tag); + return false; + } + + QString last = QString("/") + tag + QString(">"); + int const end = xml.indexOf(last, beg); + Q_ASSERT ( end != -1 && beg < end ); + + if (!m_doc.setContent(xml.mid(beg, end - beg + last.length()))) + { + m_log.Print(Logging::ERROR, QString("QDomDocument::setContent error")); + return false; + } + + m_node = m_doc.documentElement(); + Q_ASSERT ( !m_node.isNull() ); + Q_ASSERT ( m_node.tagName() == tag ); + + return true; +} diff --git a/lang_getter/stringparser.h b/lang_getter/stringparser.h new file mode 100644 index 0000000000..adbbb991de --- /dev/null +++ b/lang_getter/stringparser.h @@ -0,0 +1,39 @@ +#pragma once + +#include + + +class Logging; + +class ContentParser +{ + Logging & m_log; + + QDomDocument m_doc; + QDomElement m_node; + +public: + ContentParser(Logging & log) : m_log(log) {} + + bool InitSubDOM(QString const & xml, QString const & entry, QString const & tag); + QDomElement Root() const { return m_node; } +}; + +template +void TokenizeString(QString const & s, QString const & delim, ToDo toDo) +{ + int beg = 0; + int i = 0; + for (; i < s.length(); ++i) + { + if (delim.indexOf(s[i]) != -1) + { + if (i > beg) + toDo(s.mid(beg, i-beg)); + beg = i+1; + } + } + + if (i > beg) + toDo(s.mid(beg, i-beg)); +}