From 56bb9961db1158250bbfe971f4556b56c0bd6581 Mon Sep 17 00:00:00 2001 From: zecke Date: Fri, 09 Jan 2004 19:13:35 +0000 Subject: Update lupdate and shared to Qt3.3 qt-copy sources Some special replacement for $$(OPIEDIR) to make ar_* happy --- (limited to 'development/translation/shared') diff --git a/development/translation/shared/metatranslator.cpp b/development/translation/shared/metatranslator.cpp index a01e1eb..51270c5 100644 --- a/development/translation/shared/metatranslator.cpp +++ b/development/translation/shared/metatranslator.cpp @@ -8,10 +8,16 @@ ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. @@ -138,11 +144,13 @@ bool TsHandler::endElement( const QString& /* namespaceURI */, comment = accum; } else { if ( contextIsUtf8 ) - tor->insert( MetaTranslatorMessage(context.utf8(), "", + tor->insert( MetaTranslatorMessage(context.utf8(), + ContextComment, accum.utf8(), QString::null, TRUE, MetaTranslatorMessage::Unfinished) ); else - tor->insert( MetaTranslatorMessage(context.ascii(), "", + tor->insert( MetaTranslatorMessage(context.ascii(), + ContextComment, accum.ascii(), QString::null, FALSE, MetaTranslatorMessage::Unfinished) ); } @@ -315,14 +323,13 @@ bool MetaTranslatorMessage::operator<( const MetaTranslatorMessage& m ) const } MetaTranslator::MetaTranslator() - : codecName( "ISO-8859-1" ), codec( 0 ) { + clear(); } MetaTranslator::MetaTranslator( const MetaTranslator& tor ) : mm( tor.mm ), codecName( tor.codecName ), codec( tor.codec ) { - } MetaTranslator& MetaTranslator::operator=( const MetaTranslator& tor ) @@ -333,10 +340,15 @@ MetaTranslator& MetaTranslator::operator=( const MetaTranslator& tor ) return *this; } -bool MetaTranslator::load( const QString& filename ) +void MetaTranslator::clear() { mm.clear(); + codecName = "ISO-8859-1"; + codec = 0; +} +bool MetaTranslator::load( const QString& filename ) +{ QFile f( filename ); if ( !f.open(IO_ReadOnly) ) return FALSE; @@ -344,7 +356,6 @@ bool MetaTranslator::load( const QString& filename ) QTextStream t( &f ); QXmlInputSource in( t ); QXmlSimpleReader reader; - // don't click on these! reader.setFeature( "http://xml.org/sax/features/namespaces", FALSE ); reader.setFeature( "http://xml.org/sax/features/namespace-prefixes", TRUE ); reader.setFeature( "http://trolltech.com/xml/features/report-whitespace" @@ -358,8 +369,6 @@ bool MetaTranslator::load( const QString& filename ) reader.setErrorHandler( 0 ); delete hand; f.close(); - if ( !ok ) - mm.clear(); return ok; } @@ -384,7 +393,7 @@ bool MetaTranslator::save( const QString& filename ) const QCString comment = ""; do { - if ( QCString(m.key().sourceText()).isEmpty() ) { + if ( QCString(m.key().sourceText()) == ContextComment ) { if ( m.key().type() != MetaTranslatorMessage::Obsolete ) { contextIsUtf8 = m.key().utf8(); comment = QCString( m.key().comment() ); @@ -437,7 +446,8 @@ bool MetaTranslator::save( const QString& filename ) const return TRUE; } -bool MetaTranslator::release( const QString& filename, bool verbose ) const +bool MetaTranslator::release( const QString& filename, bool verbose, + QTranslator::SaveMode mode ) const { QTranslator tor( 0 ); int finished = 0; @@ -479,7 +489,7 @@ bool MetaTranslator::release( const QString& filename, bool verbose ) const } } - bool saved = tor.save( filename, QTranslator::Stripped ); + bool saved = tor.save( filename, mode ); if ( saved && verbose ) fprintf( stderr, " %d finished, %d unfinished and %d untranslated messages\n", @@ -523,7 +533,7 @@ void MetaTranslator::stripEmptyContexts() TMM::Iterator m = mm.begin(); while ( m != mm.end() ) { - if ( QCString(m.key().sourceText()).isEmpty() ) { + if ( QCString(m.key().sourceText()) == ContextComment ) { TMM::Iterator n = m; ++n; // the context comment is followed by other messages diff --git a/development/translation/shared/metatranslator.h b/development/translation/shared/metatranslator.h index d35b202..a13f462 100644 --- a/development/translation/shared/metatranslator.h +++ b/development/translation/shared/metatranslator.h @@ -8,10 +8,16 @@ ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. @@ -70,9 +76,11 @@ public: MetaTranslator& operator=( const MetaTranslator& tor ); + void clear(); bool load( const QString& filename ); bool save( const QString& filename ) const; - bool release( const QString& filename, bool verbose = FALSE ) const; + bool release( const QString& filename, bool verbose = FALSE, + QTranslator::SaveMode mode = QTranslator::Stripped ) const; bool contains( const char *context, const char *sourceText, const char *comment ) const; @@ -96,4 +104,10 @@ private: QTextCodec *codec; }; +/* + This is a quick hack. The proper way to handle this would be + to extend MetaTranslator's interface. +*/ +#define ContextComment "QT_LINGUIST_INTERNAL_CONTEXT_COMMENT" + #endif diff --git a/development/translation/shared/opie.h b/development/translation/shared/opie.h index 4646bb0..28b2a61 100644 --- a/development/translation/shared/opie.h +++ b/development/translation/shared/opie.h @@ -9,7 +9,7 @@ public: static OPIE* self(); /** get the list of languages */ QStringList languageList(const QString& opiedir = QString::null)const; - QString opieDir(const QString& opieDir)const; + QString opieDir(const QString& opieDir = QString::null)const; private: OPIE(); diff --git a/development/translation/shared/proparser.cpp b/development/translation/shared/proparser.cpp index 21d2f86..f616c5a 100644 --- a/development/translation/shared/proparser.cpp +++ b/development/translation/shared/proparser.cpp @@ -8,10 +8,16 @@ ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. @@ -20,33 +26,72 @@ #include "proparser.h" +#include #include #include +#include + +#ifdef Q_OS_UNIX +#include +#endif + +#ifdef Q_OS_WIN32 +#define QT_POPEN _popen +#else +#define QT_POPEN popen +#endif + +QString loadFile( const QString &fileName ) +{ + QFile file( fileName ); + if ( !file.open(IO_ReadOnly) ) { + fprintf( stderr, "error: Cannot load '%s': %s\n", + file.name().latin1(), + file.errorString().latin1() ); + return QString(); + } + + QTextStream in( &file ); + return in.read(); +} -QMap proFileTagMap( const QString& text ) +QMap proFileTagMap( const QString& text, const QString& opieDir ) { QString t = text; /* + Process include() commands. + */ + QRegExp callToInclude("include\\s*\\(\\s*([^()\\s]+)\\s*\\)"); + int i = 0; + while ( (i = callToInclude.search(t, i)) != -1 ) { + QString after = loadFile( callToInclude.cap(1) ); + t.replace( i, callToInclude.matchedLength(), after ); + i += after.length(); + } + + /* Strip comments, merge lines ending with backslash, add spaces around '=' and '+=', replace '\n' with ';', and simplify white spaces. */ - t.replace( QRegExp(QString("#[^\n]$")), QString(" ") ); - t.replace( QRegExp(QString("\\\\\\s*\n")), QString(" ") ); + t.replace( QRegExp(QString("#[^\n]*\n")), QString(" ") ); + t.replace( QRegExp(QString("\\\\[^\n\\S]*\n")), QString(" ") ); t.replace( "=", QString(" = ") ); t.replace( "+ =", QString(" += ") ); t.replace( "\n", QString(";") ); t = t.simplifyWhiteSpace(); + /* + Populate tagMap with 'key = value' entries. + */ QMap tagMap; - QStringList lines = QStringList::split( QChar(';'), t ); QStringList::Iterator line; for ( line = lines.begin(); line != lines.end(); ++line ) { QStringList toks = QStringList::split( QChar(' '), *line ); - if ( toks.count() >= 3 && + if ( toks.count() >= 3 && (toks[1] == QString("=") || toks[1] == QString("+=")) ) { QString tag = toks.first(); int k = tag.findRev( QChar(':') ); // as in 'unix:' @@ -68,20 +113,62 @@ QMap proFileTagMap( const QString& text ) } } - QRegExp var( "\\$\\$[a-zA-Z0-9_]+" ); + /* + Expand $$variables within the 'value' part of a 'key = value' + pair. + */ + QRegExp var( "\\$\\$[({]?([a-zA-Z0-9_]+)[)}]?" ); QMap::Iterator it; for ( it = tagMap.begin(); it != tagMap.end(); ++it ) { int i = 0; - - while ( (i = var.search(it.data(), i)) != -1 ) { + while ( (i = var.search((*it), i)) != -1 ) { int len = var.matchedLength(); - QString invocation = (*it).mid( i + 2, len - 2 ); + QString invocation = var.cap(1); QString after; - if ( tagMap.contains(invocation) ) - after = tagMap[invocation]; - (*it).replace( i, len, after ); + + if ( invocation == "system" ) { + // skip system(); it will be handled in the next pass + ++i; + } else if ( invocation == "OPIEDIR") { + (*it).replace( i, len, opieDir ); + }else { + if ( tagMap.contains(invocation) ) + after = tagMap[invocation]; + (*it).replace( i, len, after ); + } + } + } + + /* + Execute system() calls. + */ + QRegExp callToSystem( "\\$\\$system\\s*\\(([^()]*)\\)" ); + for ( it = tagMap.begin(); it != tagMap.end(); ++it ) { + int i = 0; + while ( (i = callToSystem.search((*it), i)) != -1 ) { + /* + This code is stolen from qmake's project.cpp file. + Ideally we would use the same parser, so we wouldn't + have this code duplication. + */ + QString after; + char buff[256]; + FILE *proc = QT_POPEN( callToSystem.cap(1).latin1(), "r" ); + while ( proc && !feof(proc) ) { + int read_in = fread( buff, 1, 255, proc ); + if ( !read_in ) + break; + for ( int i = 0; i < read_in; i++ ) { + if ( buff[i] == '\n' || buff[i] == '\t' ) + buff[i] = ' '; + } + buff[read_in] = '\0'; + after += buff; + } + (*it).replace( i, callToSystem.matchedLength(), after ); i += after.length(); } } + return tagMap; } diff --git a/development/translation/shared/proparser.h b/development/translation/shared/proparser.h index 6a61d90..e5678d6 100644 --- a/development/translation/shared/proparser.h +++ b/development/translation/shared/proparser.h @@ -8,10 +8,16 @@ ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** +** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition +** licenses may use this file in accordance with the Qt Commercial License +** Agreement provided with the Software. +** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. +** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for +** information about Qt Commercial License Agreements. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. @@ -24,6 +30,6 @@ #include #include -QMap proFileTagMap( const QString& text ); +QMap proFileTagMap( const QString& text, const QString& = QString::null ); #endif -- cgit v0.9.0.2