Chris@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@0: Chris@0: #include "ImportHoboken.h" Chris@0: Chris@0: #include Chris@0: Chris@0: #include Chris@0: #include Chris@0: #include Chris@0: #include Chris@0: #include Chris@0: Chris@0: #include Chris@0: Chris@0: using namespace Dataquay; Chris@0: Chris@0: namespace ClassicalData { Chris@0: Chris@0: void Chris@0: HobokenImporter::setSource(QUrl source) Chris@0: { Chris@0: DEBUG << "HobokenImporter::setSource: " << source << endl; Chris@0: import(source); Chris@0: } Chris@0: Chris@0: QString Chris@0: hobToForm(QString hob) Chris@0: { Chris@0: QStringList bits = hob.split(':'); Chris@0: QString group = bits[0]; Chris@0: int num = bits[1].toInt(); Chris@0: if (group == "I") return "symphony"; Chris@0: if (group == "II" && (num <= 24 || !bits[1][0].isDigit())) return "divertimento"; Chris@0: if (group == "III") return "string quartet"; Chris@0: if (group == "IV") return "divertimento"; Chris@0: if (group == "V") return "string trio;trio"; Chris@0: if (group == "VI") return "string duo;duo;sonata"; Chris@0: if (group == "VII") return "concerto"; Chris@0: if (group == "VIII") return "march"; Chris@0: if (group == "IX") return "dance"; Chris@0: if (group == "X") return "divertimento"; Chris@0: if (group == "XI") return "trio"; Chris@0: if (group == "XII") return "duo"; Chris@0: if (group == "XIII") return "concerto"; Chris@0: if (group == "XIV") return "divertimento"; Chris@0: if (group == "XV") return "piano trio;trio"; Chris@0: if (group == "XVI") return "piano sonata;sonata"; Chris@0: if (group == "XVII") return "work for piano"; Chris@0: if (group == "XVIIa") return "work for piano"; Chris@0: if (group == "XVIII") return "piano concerto;concerto"; Chris@0: if (group == "XXII") return "mass"; Chris@0: if (group == "XXIIa") return "requiem"; Chris@0: //!!! choral works Chris@0: return ""; Chris@0: } Chris@0: Chris@0: void Chris@0: HobokenImporter::import(QUrl source) Chris@0: { Chris@0: //!!! for now Chris@0: QString filename = source.toLocalFile(); Chris@0: Chris@0: QFile file(filename); Chris@0: if (!file.open(QFile::ReadOnly | QFile::Text)) { Chris@0: throw std::exception(); Chris@0: } Chris@0: Chris@0: QTextStream stream(&file); Chris@0: stream.setCodec("UTF-8"); Chris@0: Chris@0: QString composerName = "Joseph Haydn"; Chris@0: Chris@0: DEBUG << "composerName = " << composerName << endl; Chris@0: Chris@0: QMap hobMap; Chris@0: QMap opusMap; Chris@0: Chris@0: while (!stream.atEnd()) { Chris@0: Chris@0: QString line = stream.readLine(); Chris@0: Chris@0: QString hob = ""; Chris@0: Chris@0: QRegExp hobre("^([\\d][^ _]+_([A-Za-z]*)[^ ]+) "); Chris@0: Chris@0: if (hobre.indexIn(line) >= 0) { Chris@0: Chris@0: hob = hobre.cap(1); Chris@0: Work *w = 0; Chris@0: Composition *cn = 0; Chris@0: Chris@0: if (!hobMap.contains(hob)) { Chris@0: w = new Work(); Chris@0: QString key = hobre.cap(2); Chris@0: if (key != "") { Chris@0: if (key.length() > 1 && key[1] == 's') { Chris@0: key = key[0] + "-flat"; Chris@0: } Chris@0: if (key[0].isLower()) { Chris@0: key[0] = key[0].toUpper(); Chris@0: key += " minor"; Chris@0: } else { Chris@0: key += " major"; Chris@0: } Chris@0: w->setKey(key); Chris@0: } Chris@0: cn = new Composition(); Chris@0: cn->setComposerName(composerName); Chris@0: cn->addWork(w); Chris@0: w->setComposition(cn); Chris@0: hobMap[hob] = w; Chris@0: } else { Chris@0: w = hobMap[hob]; Chris@0: cn = w->composition(); Chris@0: } Chris@0: Chris@0: QRegExp hobre2("^[^ ]+ # (Hob [^ ]*)"); Chris@0: if (hobre2.indexIn(line) >= 0) { Chris@0: QString hobtext = hobre2.cap(1); Chris@0: w->setCatalogue(hobtext); Chris@0: QStringList forms = hobToForm(hobtext).split(";"); Chris@0: foreach (QString f, forms) { Chris@0: if (f != "") { Chris@0: w->addForm(Form::getFormByName(f)); Chris@0: } Chris@0: } Chris@0: continue; Chris@0: } Chris@0: Chris@0: QRegExp titlere("^[^ ]+ @([^ ]+) (.*)"); Chris@0: if (titlere.indexIn(line) >= 0) { Chris@0: QString title = titlere.cap(2).trimmed(); Chris@0: if (titlere.cap(1) == "en") { Chris@0: if (w->name() != "") { Chris@0: w->addAlias(w->name()); Chris@0: } Chris@0: w->setName(title); Chris@0: } else { Chris@0: if (w->name() == "") { Chris@0: w->setName(title); Chris@0: } else { Chris@0: w->addAlias(title); Chris@0: } Chris@0: } Chris@0: continue; Chris@0: } Chris@0: Chris@0: QRegExp httpre("^[^ ]+ (http:[^ ]*) *$"); Chris@0: if (httpre.indexIn(line) >= 0) { Chris@0: QString url = httpre.cap(1).trimmed(); Chris@0: Document *d = new Document; Chris@18: d->setUri(Uri(url)); Chris@0: d->setTopic(w); Chris@0: if (url.contains("wikipedia")) d->setSiteName("Wikipedia"); Chris@0: else if (url.contains("klassika.info")) { Chris@0: d->setSiteName("Klassika - Die deutschsprachigen Klassikseiten"); Chris@0: } Chris@0: w->addPage(d); Chris@0: continue; Chris@0: } Chris@0: Chris@0: QRegExp datere("^[^ ]+ \\[[^]]*(\\d{4})[^]]*\\]"); Chris@0: if (datere.indexIn(line) >= 0) { Chris@0: cn->setYear(datere.cap(1).toInt()); Chris@0: continue; Chris@0: } Chris@0: Chris@0: QRegExp opre("^[^ ]+ -> ([^ ]+)"); Chris@0: if (opre.indexIn(line) >= 0) { Chris@0: QString optext = opre.cap(1); Chris@0: w->setOpus(optext); Chris@0: if (optext.contains('/')) { Chris@0: QStringList ops = optext.split('/'); Chris@0: int opno = ops[0].toInt(); Chris@0: if (opno == 0) { Chris@0: DEBUG << "Failed to convert " << optext << " to op no" << endl; Chris@0: } else { Chris@0: if (!opusMap.contains(opno)) { Chris@0: opusMap[opno] = new Work(); Chris@0: opusMap[opno]->setOpus(ops[0]); Chris@0: opusMap[opno]->setComposition(new Composition()); Chris@0: opusMap[opno]->composition()->setComposerName(composerName); Chris@0: } Chris@0: opusMap[opno]->addPart(w); Chris@0: w->setPartOf(opusMap[opno]); Chris@0: w->setOpus(ops[0]); Chris@0: w->setNumber(ops[1]); Chris@0: } Chris@0: } Chris@0: continue; Chris@0: } Chris@0: Chris@0: continue; Chris@0: } Chris@0: Chris@0: QRegExp opre("^Opus ([\\d][^ ]*): (.*)"); Chris@0: if (opre.indexIn(line) >= 0) { Chris@0: QString optext = opre.cap(1); Chris@0: int opno = optext.toInt(); Chris@0: if (!opusMap.contains(opno)) { Chris@0: opusMap[opno] = new Work(); Chris@0: opusMap[opno]->setOpus(optext); Chris@0: opusMap[opno]->setComposition(new Composition()); Chris@0: opusMap[opno]->composition()->setComposerName(composerName); Chris@0: } Chris@0: QString title = opre.cap(2); Chris@0: title.replace("
", " - "); Chris@0: opusMap[opno]->setName(title); Chris@0: continue; Chris@0: } Chris@0: Chris@0: DEBUG << "Failed to match line: " << line << endl; Chris@0: } Chris@0: Chris@0: foreach (Work *w, hobMap) m_objects.push_back(w); Chris@0: foreach (Work *w, opusMap) m_objects.push_back(w); Chris@0: Chris@0: Chris@0: DEBUG << "Found " << m_objects.size() << " things" << endl; Chris@0: } Chris@0: Chris@0: Chris@0: } Chris@0: Chris@0: