35 #include <QXmlSimpleReader>
36 #include <QXmlStreamReader>
38 #include <QApplication>
40 using namespace GlossaryNS;
44 static const QString
ntig=
"ntig";
45 static const QString
tig=
"tig";
48 static const QString
term=
"term";
49 static const QString
id=
"id";
55 return idsByLangWord[lang].values(word);
70 QIODevice* device=
new QFile(newPath);
71 if (!device->open(QFile::ReadOnly | QFile::Text))
76 static_cast<QBuffer*
>(device)->setData(QByteArray(
77 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
78 "<!DOCTYPE martif PUBLIC \"ISO 12200:1999A//DTD MARTIF core (DXFcdV04)//EN\" \"TBXcdv04.dtd\">\n"
79 "<martif type=\"TBX\" xml:lang=\"en_US\">\n"
88 QXmlSimpleReader reader;
90 reader.setFeature(
"http://xml.org/sax/features/namespaces",
false);
91 QXmlInputSource source(device);
96 bool success=newDoc.setContent(&source, &reader, &errorMsg, &errorLine);
102 kWarning()<<errorMsg;
110 m_entries=m_doc.elementsByTagName(
"termEntry");
111 for(
int i=0;i<m_entries.size();i++)
113 m_idsForEntriesById=m_entriesById.keys();
118 QXmlSimpleReader reader1;
119 reader1.setContentHandler(&parser);
122 if (!file.open(QFile::ReadOnly | QFile::Text))
124 QXmlInputSource xmlInputSource(&file);
125 if (!reader1.parse(xmlInputSource))
126 kWarning() <<
"failed to load "<<
path;
130 qDebug()<<
"glossary loaded in"<<a.elapsed();
137 if (m_path.isEmpty())
140 QFile* device=
new QFile(m_path);
141 if (!device->open(QFile::WriteOnly | QFile::Truncate))
143 device->deleteLater();
146 QTextStream stream(device);
147 m_doc.save(stream,2);
149 device->deleteLater();
164 #define FETCH_SIZE 128
172 QSortFilterProxyModel::setFilterRegExp(s);
180 while (rowCount(QModelIndex())<expectedCount && sourceModel()->canFetchMore(QModelIndex()))
182 sourceModel()->fetchMore(QModelIndex());
184 qApp->processEvents();
191 , m_glossary(
Project::instance()->glossary())
193 connect(m_glossary, SIGNAL(loaded()),
this, SLOT(
forceReset()));
210 int newVisibleCount=qMin(m_visibleCount+
FETCH_SIZE,m_glossary->
size());
211 beginInsertRows(parent, m_visibleCount, newVisibleCount-1);
212 m_visibleCount=newVisibleCount;
218 if (parent.isValid())
220 return m_glossary->
size();
225 if (role!=Qt::DisplayRole)
231 case English:
return i18nc(
"@title:column Original text",
"Source");;
232 case Target:
return i18nc(
"@title:column Text in target language",
"Target");
233 case SubjectField:
return i18nc(
"@title:column",
"Subject Field");
243 if (role!=Qt::DisplayRole)
246 static const QString nl=QString(
" ")+QChar(0x00B7)+
' ';
250 QByteArray
id=glossary->
id(index.row());
251 switch (index.column())
292 QList<int> busyIdNumbers;
295 authorId.replace(
' ',
'_');
296 QRegExp rx(
'^'+authorId+
"\\-([0-9]*)$");
299 foreach(
const QByteArray&
id, m_idsForEntriesById)
301 if (rx.exactMatch(QString::fromLatin1(
id)))
302 busyIdNumbers.append(rx.cap(1).toInt());
305 int i=removedIds.size();
308 if (rx.exactMatch(QString::fromLatin1(removedIds.at(i))))
309 busyIdNumbers.append(rx.cap(1).toInt());
312 if (!busyIdNumbers.isEmpty())
314 qSort(busyIdNumbers);
315 while (busyIdNumbers.contains(idNumber))
319 return QString(authorId+
"-%1").arg(idNumber).toLatin1();
324 QSet<QString> result;
325 foreach(
const QByteArray&
id, m_idsForEntriesById)
327 return result.toList();
332 if (index<m_idsForEntriesById.size())
333 return m_idsForEntriesById.at(index);
339 QString minusLang=language; minusLang.replace(
'_',
'-');
340 QStringRef soleLang=language.leftRef(2);
342 QDomElement n = m_entriesById.value(
id).firstChildElement(
langSet);
347 if (language==lang || minusLang==lang || soleLang==lang)
349 QDomElement ntigElem=n.firstChildElement(
ntig);
350 while (!ntigElem.isNull())
352 result<<ntigElem.firstChildElement(
termGrp).firstChildElement(
term).text();
353 ntigElem=ntigElem.nextSiblingElement(
ntig);
355 QDomElement tigElem=n.firstChildElement(
tig);
356 while (!tigElem.isNull())
358 result<<tigElem.firstChildElement(
term).text();
359 tigElem=tigElem.nextSiblingElement(
tig);
363 n = n.nextSiblingElement(
langSet);
371 QDomElement& ourLangSetElement,
372 QDomElement& tigElement,
373 QDomElement& termElement)
375 QString minusLang=lang; minusLang.replace(
'_',
'-');
376 QStringRef soleLang=lang.leftRef(2);
379 QDomElement n = termEntry.firstChildElement(
langSet);
380 QDomDocument document=n.ownerDocument();
386 if (lang==nLang || minusLang==nLang || soleLang==nLang)
389 QDomElement ntigElem=n.firstChildElement(
ntig);
390 while(!ntigElem.isNull())
396 termElement=ntigElem.firstChildElement(
termGrp).firstChildElement(
term);
399 ntigElem = ntigElem.nextSiblingElement(
ntig);
402 QDomElement tigElem=n.firstChildElement(
tig);
403 while(!tigElem.isNull())
409 termElement=tigElem.firstChildElement(
term);
412 tigElem = tigElem.nextSiblingElement(
tig);
416 n = n.nextSiblingElement(
langSet);
425 QDomElement ourLangSetElement;
426 QDomElement tigElement;
427 QDomElement termElement;
429 ourLangSetElement, tigElement, termElement);
431 if (!termElement.isNull())
436 QDomElement entry=m_entriesById.value(
id);
437 QDomDocument document=entry.ownerDocument();
438 if (ourLangSetElement.isNull())
440 ourLangSetElement=entry.appendChild( document.createElement(
langSet)).toElement();
441 lang.replace(
'_',
'-');
442 ourLangSetElement.setAttribute(
xmlLang,lang);
450 tigElement=ourLangSetElement.appendChild( document.createElement(
tig)).toElement();
451 termElement=tigElement.appendChild( document.createElement(
term)).toElement();
452 termElement.appendChild( document.createTextNode(termText));
459 QDomElement ourLangSetElement;
460 QDomElement tigElement;
461 QDomElement termElement;
463 ourLangSetElement, tigElement, termElement);
465 if (!tigElement.isNull())
466 ourLangSetElement.removeChild(tigElement);
473 return termEntry.firstChildElement(
"descrip");
475 QString minusLang=lang;
476 minusLang.replace(
'_',
'-');
482 QDomElement n=termEntry.firstChildElement(
langSet);
485 const QString& curLang=n.attribute(
xmlLang);
486 if (curLang==lang || curLang==minusLang
490 return n.firstChildElement(
"descrip");
492 n = n.nextSiblingElement(
langSet);
494 return QDomElement();
498 QString Glossary::descrip(
const QByteArray&
id,
const QString& lang,
const QString& type)
const
506 if (n.attribute(
"type")==type)
509 n = n.nextSiblingElement(
"descrip");
514 void Glossary::setDescrip(
const QByteArray&
id, QString lang,
const QString& type,
const QString& value)
520 QDomDocument document=descripElem.ownerDocument();
521 while (!descripElem.isNull())
523 if (descripElem.attribute(
"type")==type)
524 return setText(descripElem,value);;
526 descripElem = descripElem.nextSiblingElement(
"descrip");
530 QDomElement parentForDescrip = m_entriesById.value(
id);
534 QDomElement langSetElem = m_entriesById.value(
id).firstChildElement(
langSet);
535 while (!langSetElem.isNull())
538 nLang.replace(
'-',
'_');
542 nLang.replace(
'_',
'-');
549 langSetElem = langSetElem.nextSiblingElement(
langSet);
551 if (!langSetElem.isNull())
552 parentForDescrip=langSetElem;
555 parentForDescrip=parentForDescrip.appendChild( document.createElement(
langSet)).toElement();
556 lang.replace(
'_',
'-');
557 parentForDescrip.setAttribute(
xmlLang,lang);
560 QDomElement descrip=parentForDescrip.insertBefore( document.createElement(
"descrip"), parentForDescrip.firstChild() ).toElement();
561 descrip.setAttribute(
"type",type);
562 descrip.appendChild( document.createTextNode(value));
567 return descrip(
id, lang,
"subjectField");
572 return descrip(
id, lang,
"definition");
577 setDescrip(
id, lang,
"subjectField", value);
582 setDescrip(
id, lang,
"definition", value);
593 QByteArray entryId=termEntry.attribute(::
id).toLatin1();
594 if (entryId.isEmpty())
597 m_entriesById.insert(entryId,termEntry);
600 foreach(
const QString& termText,
terms(entryId, sourceLangCode))
602 foreach(
const QString& word, termText.split(
' ',QString::SkipEmptyParts))
603 idsByLangWord[sourceLangCode].insert(
stem(sourceLangCode,word),entryId);
609 QByteArray entryId=termEntry.attribute(::
id).toLatin1();
610 m_entriesById.remove(entryId);
613 foreach(
const QString& termText,
terms(entryId, sourceLangCode))
615 foreach(
const QString& word, termText.split(
' ',QString::SkipEmptyParts))
616 idsByLangWord[sourceLangCode].
remove(
stem(sourceLangCode,word),entryId);
623 Q_ASSERT(index<termList.size());
624 foreach(
const QString&
term, termList_.at(index).english)
626 foreach(
const QString& word, term.split(
' ',QString::SkipEmptyParts))
633 Q_ASSERT(index<termList.size());
634 foreach(
const QString& term, termList_.at(index).english)
636 foreach(
const QString& word, term.split(
' ',QString::SkipEmptyParts))
644 if (!m_entriesById.contains(
id))
647 QDomElement entry = m_entriesById.value(
id);
648 if (entry.nextSibling().isCharacterData())
649 entry.parentNode().removeChild(entry.nextSibling());
650 entry.parentNode().removeChild(entry);
651 m_entriesById.remove(
id);
654 m_idsForEntriesById=m_entriesById.keys();
655 removedIds.append(
id);
660 static void appendTerm(QDomElement langSetElem,
const QString& termText)
662 QDomDocument doc=langSetElem.ownerDocument();
669 QDomElement tigElement=doc.createElement(
tig); langSetElem.appendChild(tigElement);
670 QDomElement termElement=doc.createElement(term); tigElement.appendChild(termElement);
671 termElement.appendChild(doc.createTextNode(termText));
674 QByteArray
Glossary::append(
const QStringList& sourceTerms,
const QStringList& targetTerms)
676 if (!m_doc.elementsByTagName(
"body").count())
680 QDomElement termEntry=m_doc.createElement(
"termEntry");
681 m_doc.elementsByTagName(
"body").at(0).appendChild(termEntry);
686 termEntry.setAttribute(::
id, QString::fromLatin1(newId));
688 QDomElement sourceElem=m_doc.createElement(
langSet); termEntry.appendChild(sourceElem);
690 foreach (QString sourceTerm, sourceTerms)
693 QDomElement targetElem=m_doc.createElement(
langSet); termEntry.appendChild(targetElem);
695 foreach (QString targetTerm, targetTerms)
699 m_idsForEntriesById=m_entriesById.keys();
706 append(QStringList(_english), QStringList(_target));
713 idsByLangWord.clear();
714 m_entriesById.clear();
715 m_idsForEntriesById.clear();
722 langWordEntry_.clear();
723 subjectFields_=QStringList(QLatin1String(
""));
731 beginRemoveRows(parent,row,row+count-1);
752 QByteArray
id=m_glossary->
append(QStringList(_english), QStringList(_target));
764 #include "glossary.moc"
void setSubjectField(const QByteArray &id, const QString &lang, const QString &value)
QVariant headerData(int section, Qt::Orientation, int role=Qt::DisplayRole) const
loads only data we need to store in memory e.g.
QByteArray appendRow(const QString &_english, const QString &_target)
QString subjectField(const QByteArray &id, const QString &lang=QString()) const
QString stem(const QString &langCode, const QString &word)
void fetchMore(const QModelIndex &parent)
GlossaryModel(QObject *parent)
QByteArray id(int index) const
static Project * instance()
int columnCount(const QModelIndex &parent=QModelIndex()) const
void setFilterRegExp(const QString &s)
static const QString term
static const QString xmlLang
Glossary(QObject *parent)
void rmTerm(const QByteArray &id, QString lang, int i)
static QString authorName()
Get authorName.
QVariant data(const QModelIndex &, int role=Qt::DisplayRole) const
Singleton object that represents project.
Internal representation of glossary.
bool load(const QString &)
void setText(QDomElement element, QString text)
void hashTermEntry(const QDomElement &)
GlossaryNS::Glossary * glossary() const
void unhashTermEntry(const QDomElement &)
Q_SCRIPTABLE QString targetLangCode() const
void removeEntry(const QByteArray &id)
QList< QByteArray > idsForLangWord(const QString &lang, const QString &word) const
void setTerm(const QByteArray &id, QString lang, int i, const QString &term)
QStringList terms(const QByteArray &id, const QString &lang) const
static QDomElement firstDescripElemForLang(QDomElement termEntry, const QString &lang)
static void appendTerm(QDomElement langSetElem, const QString &termText)
static void getElementsForTermLangIndex(QDomElement termEntry, QString &lang, int index, QDomElement &ourLangSetElement, QDomElement &tigElement, QDomElement &termElement)
void fetchMore(const QModelIndex &parent)
bool canFetchMore(const QModelIndex &parent) const
bool removeRows(int row, int count, const QModelIndex &parent=QModelIndex())
QStringList subjectFields() const
QByteArray generateNewId()
void append(const QString &_english, const QString &_target)
static const QString termGrp
static const QString ntig
QString definition(const QByteArray &id, const QString &lang=QString()) const
void setDefinition(const QByteArray &id, const QString &lang, const QString &value)
static const QString defaultLang
static const QString langSet
Q_SCRIPTABLE QString sourceLangCode() const
int rowCount(const QModelIndex &parent=QModelIndex()) const