diff options
author | Zolnai Tamás <zolnaitamas2000@gmail.com> | 2013-03-27 20:08:50 +0100 |
---|---|---|
committer | Zolnai Tamás <zolnaitamas2000@gmail.com> | 2013-03-27 20:09:31 +0100 |
commit | 8e26b4783f1f47ff5d489e7df5869240eefd1071 (patch) | |
tree | 80c4c9899fb3b05fcadc845444b06e1e3221e1c2 | |
parent | 239fb4cb41cb0d1ed42bf5cf8ecdabdca4a28a68 (diff) |
Refactor l10ntools
Delete unused functions.
Make Export class more encapsulated.
Move to local that functions which are used only in one file.
Common contans method which are used by all executables.
Helper contains methods belong to xml parsing.
Change-Id: I28773a2c7eea90da7df7f32720fd38de2cb661ac
28 files changed, 714 insertions, 948 deletions
diff --git a/l10ntools/StaticLibrary_transex.mk b/l10ntools/StaticLibrary_transex.mk index 033358ac76bd..0c3bbff42970 100644 --- a/l10ntools/StaticLibrary_transex.mk +++ b/l10ntools/StaticLibrary_transex.mk @@ -43,7 +43,8 @@ $(eval $(call gb_StaticLibrary_use_externals,transex,\ )) $(eval $(call gb_StaticLibrary_add_exception_objects,transex,\ - l10ntools/source/export2 \ + l10ntools/source/helper \ + l10ntools/source/common \ l10ntools/source/merge \ l10ntools/source/po \ )) diff --git a/l10ntools/inc/common.hxx b/l10ntools/inc/common.hxx new file mode 100644 index 000000000000..93f2d008cb82 --- /dev/null +++ b/l10ntools/inc/common.hxx @@ -0,0 +1,53 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +/// Methods used by all of executables + +#ifndef INCLUDED_L10NTOOLS_SOURCE_COMMON_HXX +#define INCLUDED_L10NTOOLS_SOURCE_COMMON_HXX + +#include "sal/config.h" + +#include <iostream> +#include <rtl/string.hxx> +#include "po.hxx" + +namespace common { + +//result type of handleArguments() +struct HandledArgs +{ + OString m_sInputFile; + OString m_sOutputFile; + OString m_sMergeSrc; + OString m_sLanguage; + bool m_bMergeMode; + HandledArgs() + : m_sInputFile( OString() ) + , m_sOutputFile( OString() ) + , m_sMergeSrc( OString() ) + , m_sLanguage( OString() ) + , m_bMergeMode( false ) + {} +}; + +bool handleArguments(int argc, char * argv[], HandledArgs& o_aHandledArgs); + +void writeUsage(const OString& rName, const OString& rFileType); + +void writePoEntry( + const OString& rExecutable, PoOfstream& rPoStream, const OString& rSourceFile, + const OString& rResType, const OString& rGroupId, const OString& rLocalId, + const OString& rHelpText, const OString& rText, const PoEntry::TYPE eType = PoEntry::TTEXT ); + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/l10ntools/inc/export.hxx b/l10ntools/inc/export.hxx index fbe7adac497c..e3a0913515e6 100644 --- a/l10ntools/inc/export.hxx +++ b/l10ntools/inc/export.hxx @@ -109,6 +109,8 @@ public: class ResData { public: + ResData(const rtl::OString &rPF, const rtl::OString &rGId); + ResData(const rtl::OString &rPF, const rtl::OString &rGId , const rtl::OString &rFilename); ~ResData(); sal_Bool SetId(const rtl::OString &rId, sal_uInt16 nLevel); @@ -153,67 +155,6 @@ public: ExportList *pPairedList; rtl::OString sPForm; - - ResData(const rtl::OString &rPF, const rtl::OString &rGId) - : - nWidth( 0 ), - nChildIndex( 0 ), - nIdLevel( ID_LEVEL_NULL ), - bChild( sal_False ), - bChildWithText( sal_False ), - bText( sal_False ), - bHelpText( sal_False ), - bQuickHelpText( sal_False ), - bTitle( sal_False ), - bList( sal_False ), - bRestMerged( sal_False ), - sGId( rGId ), - nTextRefId( REFID_NONE ), - nHelpTextRefId( REFID_NONE ), - nQuickHelpTextRefId( REFID_NONE ), - nTitleRefId( REFID_NONE ), - sTextTyp( "Text" ), - pStringList( NULL ), - pUIEntries( NULL ), - pItemList( NULL ), - pFilterList( NULL ), - pPairedList( NULL ), - sPForm( rPF ) - { - sGId = sGId.replaceAll("\r", rtl::OString()); - sPForm = sPForm.replaceAll("\r", rtl::OString()); - } - - ResData(const rtl::OString &rPF, const rtl::OString &rGId , const rtl::OString &rFilename) - : - nWidth( 0 ), - nChildIndex( 0 ), - nIdLevel( ID_LEVEL_NULL ), - bChild( sal_False ), - bChildWithText( sal_False ), - bText( sal_False ), - bHelpText( sal_False ), - bQuickHelpText( sal_False ), - bTitle( sal_False ), - bList( sal_False ), - bRestMerged( sal_False ), - sGId( rGId ), - sFilename( rFilename ), - nTextRefId( REFID_NONE ), - nHelpTextRefId( REFID_NONE ), - nQuickHelpTextRefId( REFID_NONE ), - nTitleRefId( REFID_NONE ), - sTextTyp( "Text" ), - pStringList( NULL ), - pUIEntries( NULL ), - pItemList( NULL ), - pFilterList( NULL ), - pPairedList( NULL ), - sPForm( rPF ) - { - sGId = sGId.replaceAll("\r", rtl::OString()); - sPForm = sPForm.replaceAll("\r", rtl::OString()); - } }; @@ -244,23 +185,6 @@ typedef ::std::vector< ResData* > ResStack; class WordTransformer; class ParserQueue; -//result type of handleArguments() -struct HandledArgs -{ - OString m_sInputFile; - OString m_sOutputFile; - OString m_sMergeSrc; - OString m_sLanguage; - bool m_bMergeMode; - HandledArgs() - : m_sInputFile( OString() ) - , m_sOutputFile( OString() ) - , m_sMergeSrc( OString() ) - , m_sLanguage( OString() ) - , m_bMergeMode( false ) - {} -}; - class Export { private: @@ -292,40 +216,11 @@ private: sal_Bool bReadOver; sal_Bool bDontWriteOutput; rtl::OString sLastTextTyp; - static bool isInitialized; + bool isInitialized; rtl::OString sFilename; + rtl::OString sLanguages; - -public: - ParserQueue* pParseQueue; // public ? - static rtl::OString sLanguages; // public ? - - static bool handleArguments(int argc, char * argv[], HandledArgs& o_aHandledArgs); - static void writeUsage(const OString& rName, const OString& rFileType); - static void writePoEntry(const OString& rExecutable, PoOfstream& rPoStream, const OString& rSourceFile, - const OString& rResType, const OString& rGroupId, const OString& rLocalId, - const OString& rHelpText, const OString& rText, - const PoEntry::TYPE eType = PoEntry::TTEXT); - - static void InitLanguages( bool bMergeMode = false ); - static void InitForcedLanguages( bool bMergeMode = false ); - static std::vector<rtl::OString> GetLanguages(); - - static void SetLanguages( std::vector<rtl::OString> val ); - static void RemoveUTF8ByteOrderMarker( rtl::OString &rString ); - static bool hasUTF8ByteOrderMarker( const rtl::OString &rString ); - static rtl::OString QuoteHTML( rtl::OString const &rString ); - - static rtl::OString UnquoteHTML( rtl::OString const &rString ); - - static bool isSourceLanguage(const rtl::OString &rLanguage); - static bool isAllowed(const rtl::OString &rLanguage); - - static void Languages( std::vector<rtl::OString>::const_iterator& begin , std::vector<rtl::OString>::const_iterator& end ); - -private: - static std::vector<rtl::OString> aLanguages; - static std::vector<rtl::OString> aForcedLanguages; + std::vector<rtl::OString> aLanguages; sal_Bool WriteData( ResData *pResData, sal_Bool bCreateNew = sal_False );// called befor dest. cur ResData sal_Bool WriteExportList( ResData *pResData, ExportList *pExportList, @@ -352,17 +247,20 @@ private: void WriteToMerged(const rtl::OString &rText , bool bSDFContent); void SetChildWithText(); + void InitLanguages( bool bMergeMode = false ); + void CutComment( rtl::OString &rText ); public: - Export(const rtl::OString &rOutput); - Export(const rtl::OString &rMergeSource, const rtl::OString &rOutput); + Export(const OString &rOutput, const OString &rLanguage); + Export(const OString &rMergeSource, const OString &rOutput, const OString &rLanguage); ~Export(); void Init(); int Execute( int nToken, const char * pToken ); // called from lexer void SetError() { bError = sal_True; } sal_Bool GetError() { return bError; } + ParserQueue* pParseQueue; // public!! }; diff --git a/l10ntools/inc/helper.hxx b/l10ntools/inc/helper.hxx new file mode 100644 index 000000000000..4dd2dd137937 --- /dev/null +++ b/l10ntools/inc/helper.hxx @@ -0,0 +1,39 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +/// Helper methods to work with xml files + +#ifndef INCLUDED_L10NTOOLS_SOURCE_HELPER_HXX +#define INCLUDED_L10NTOOLS_SOURCE_HELPER_HXX + +#include "sal/config.h" +#include "sal/types.h" + +#include <cassert> + +#include <libxml/parser.h> + +#include <rtl/string.hxx> +#include <rtl/strbuf.hxx> + + +namespace helper { + +OString QuotHTML(const rtl::OString &rString); + +bool isWellFormedXML( OString const & text ); + +//Convert xmlChar* to OString +OString xmlStrToOString( const xmlChar* pString ); + +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/l10ntools/inc/helpmerge.hxx b/l10ntools/inc/helpmerge.hxx index fd11609a9a59..1f11726182f6 100644 --- a/l10ntools/inc/helpmerge.hxx +++ b/l10ntools/inc/helpmerge.hxx @@ -17,7 +17,6 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#include "export.hxx" #include "xmlparse.hxx" #include <rtl/ustring.hxx> #include <rtl/ustrbuf.hxx> diff --git a/l10ntools/inc/lngmerge.hxx b/l10ntools/inc/lngmerge.hxx index 4631bb3536f8..8c5940cbdfee 100644 --- a/l10ntools/inc/lngmerge.hxx +++ b/l10ntools/inc/lngmerge.hxx @@ -22,8 +22,8 @@ #include <iosfwd> #include <vector> +#include "common.hxx" #include "export.hxx" -#include "po.hxx" typedef std::vector< rtl::OString* > LngLineList; diff --git a/l10ntools/inc/xrmmerge.hxx b/l10ntools/inc/xrmmerge.hxx index 83736263796c..8659fe1f4f19 100644 --- a/l10ntools/inc/xrmmerge.hxx +++ b/l10ntools/inc/xrmmerge.hxx @@ -20,7 +20,6 @@ #include "sal/config.h" #include <fstream> -#include "po.hxx" // // XRMResParser diff --git a/l10ntools/source/cfgmerge.cxx b/l10ntools/source/cfgmerge.cxx index 4586e7192d4f..695620004e5e 100644 --- a/l10ntools/source/cfgmerge.cxx +++ b/l10ntools/source/cfgmerge.cxx @@ -47,10 +47,10 @@ extern "C" { FILE * init(int argc, char ** argv) { - HandledArgs aArgs; - if ( !Export::handleArguments(argc, argv, aArgs) ) + common::HandledArgs aArgs; + if ( !common::handleArguments(argc, argv, aArgs) ) { - Export::writeUsage("cfgex","*.xcu"); + common::writeUsage("cfgex","*.xcu"); std::exit(EXIT_FAILURE); } global::inputPathname = aArgs.m_sInputFile; @@ -83,6 +83,88 @@ void workOnTokenSet(int nTyp, char * pTokenText) { } +namespace +{ + +static OString lcl_QuoteHTML( const OString& rString ) +{ + rtl::OStringBuffer sReturn; + for ( sal_Int32 i = 0; i < rString.getLength(); i++ ) { + rtl::OString sTemp = rString.copy( i ); + if ( sTemp.match( "<Arg n=" ) ) { + while ( i < rString.getLength() && rString[i] != '>' ) { + sReturn.append(rString[i]); + i++; + } + if ( rString[i] == '>' ) { + sReturn.append('>'); + i++; + } + } + if ( i < rString.getLength()) { + switch ( rString[i]) { + case '<': + sReturn.append("<"); + break; + + case '>': + sReturn.append(">"); + break; + + case '\"': + sReturn.append("""); + break; + + case '\'': + sReturn.append("'"); + break; + + case '&': + if ((( i + 4 ) < rString.getLength()) && + ( rString.copy( i, 5 ) == "&" )) + sReturn.append(rString[i]); + else + sReturn.append("&"); + break; + + default: + sReturn.append(rString[i]); + break; + } + } + } + return sReturn.makeStringAndClear(); +} + +static OString lcl_UnquoteHTML( const OString& rString ) +{ + rtl::OStringBuffer sReturn; + for (sal_Int32 i = 0; i != rString.getLength();) { + if (rString.match("&", i)) { + sReturn.append('&'); + i += RTL_CONSTASCII_LENGTH("&"); + } else if (rString.match("<", i)) { + sReturn.append('<'); + i += RTL_CONSTASCII_LENGTH("<"); + } else if (rString.match(">", i)) { + sReturn.append('>'); + i += RTL_CONSTASCII_LENGTH(">"); + } else if (rString.match(""", i)) { + sReturn.append('"'); + i += RTL_CONSTASCII_LENGTH("""); + } else if (rString.match("'", i)) { + sReturn.append('\''); + i += RTL_CONSTASCII_LENGTH("'"); + } else { + sReturn.append(rString[i]); + ++i; + } + } + return sReturn.makeStringAndClear(); +} + +} // anonymous namespace + // // class CfgStackData // @@ -407,9 +489,9 @@ void CfgExport::WorkOnResourceEnd() if ( sText.isEmpty()) sText = sFallback; - sText = Export::UnquoteHTML( sText ); + sText = lcl_UnquoteHTML( sText ); - Export::writePoEntry( + common::writePoEntry( "Cfgex", pOutputStream, sPath, pStackData->sResTyp, sGroupId, sLocalId, sXComment, sText); } @@ -422,7 +504,7 @@ void CfgExport::WorkOnText( const rtl::OString &rIsoLang ) { - if( rIsoLang.getLength() ) rText = Export::UnquoteHTML( rText ); + if( rIsoLang.getLength() ) rText = lcl_UnquoteHTML( rText ); } @@ -499,10 +581,10 @@ void CfgMerge::WorkOnText(rtl::OString &rText, const rtl::OString& rLangIndex) rtl::OString sContent; pEntrys->GetText( sContent, STRING_TYP_TEXT, rLangIndex ); - if ( Export::isAllowed( rLangIndex ) && + if ( !rLangIndex.equalsIgnoreAsciiCase("en-US") && ( sContent != "-" ) && !sContent.isEmpty()) { - rText = Export::QuoteHTML( rText ); + rText = lcl_QuoteHTML( rText ); } } } @@ -534,7 +616,7 @@ void CfgMerge::WorkOnResourceEnd() ( sContent != "-" ) && !sContent.isEmpty()) { - rtl::OString sText = Export::QuoteHTML( sContent); + rtl::OString sText = lcl_QuoteHTML( sContent); rtl::OString sAdditionalLine( "\t" ); diff --git a/l10ntools/source/common.cxx b/l10ntools/source/common.cxx new file mode 100644 index 000000000000..35302117a984 --- /dev/null +++ b/l10ntools/source/common.cxx @@ -0,0 +1,153 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "common.hxx" +#include "po.cxx" + +//flags for handleArguments() +#define STATE_NON 0x0001 +#define STATE_INPUT 0x0002 +#define STATE_OUTPUT 0x0003 +#define STATE_MERGESRC 0x0005 +#define STATE_LANGUAGES 0x0006 + +namespace common { + +bool handleArguments( + int argc, char * argv[], HandledArgs& o_aHandledArgs) +{ + o_aHandledArgs = HandledArgs(); + sal_uInt16 nState = STATE_NON; + + for( int i = 1; i < argc; i++ ) + { + if ( OString( argv[ i ] ).toAsciiUpperCase() == "-I" ) + { + nState = STATE_INPUT; // next token specifies source file + } + else if ( OString( argv[ i ] ).toAsciiUpperCase() == "-O" ) + { + nState = STATE_OUTPUT; // next token specifies the dest file + } + else if ( OString( argv[ i ] ).toAsciiUpperCase() == "-M" ) + { + nState = STATE_MERGESRC; // next token specifies the merge database + } + else if ( OString( argv[ i ] ).toAsciiUpperCase() == "-L" ) + { + nState = STATE_LANGUAGES; + } + else + { + switch ( nState ) + { + case STATE_NON: + { + return false; // no valid command line + } + case STATE_INPUT: + { + o_aHandledArgs.m_sInputFile = OString( argv[i] ); + } + break; + case STATE_OUTPUT: + { + o_aHandledArgs.m_sOutputFile = OString( argv[i] ); + } + break; + case STATE_MERGESRC: + { + o_aHandledArgs.m_sMergeSrc = OString( argv[i] ); + o_aHandledArgs.m_bMergeMode = true; + } + break; + case STATE_LANGUAGES: + { + o_aHandledArgs.m_sLanguage = OString( argv[i] ); + } + break; + } + } + } + if( !o_aHandledArgs.m_sInputFile.isEmpty() && + !o_aHandledArgs.m_sOutputFile.isEmpty() ) + { + return true; + } + else + { + o_aHandledArgs = HandledArgs(); + return false; + } +} + +void writeUsage(const OString& rName, const OString& rFileType) +{ + std::cout + << " Syntax: " << rName.getStr() + << " -i FileIn -o FileOut [-m DataBase] [-l Lang]\n" + << " FileIn: Source files (" << rFileType.getStr() << ")\n" + << " FileOut: Destination file (*.*)\n" + << " DataBase: Mergedata (*.po)\n" + << " Lang: Restrict the handled languag; one element of\n" + << " (de, en-US, ...) or all\n"; +} + +void writePoEntry( + const OString& rExecutable, PoOfstream& rPoStream, const OString& rSourceFile, + const OString& rResType, const OString& rGroupId, const OString& rLocalId, + const OString& rHelpText, const OString& rText, const PoEntry::TYPE eType ) +{ + try + { + PoEntry aPO(rSourceFile, rResType, rGroupId, rLocalId, rHelpText, rText, eType); + rPoStream.writeEntry( aPO ); + } + catch( PoEntry::Exception& aException ) + { + if(aException == PoEntry::NOSOURCFILE) + { + std::cerr << rExecutable << " warning: no sourcefile specified for po entry\n"; + } + else + { + std::cerr << rExecutable << " warning: inavlid po attributes extracted from " << rSourceFile << "\n"; + if(aException == PoEntry::NOGROUPID) + { + std::cerr << "No groupID specified!\n"; + std::cerr << "String: " << rText << "\n"; + } + else if (aException == PoEntry::NOSTRING) + { + std::cerr << "No string specified!\n"; + std::cerr << "GroupID: " << rGroupId << "\n"; + if( !rLocalId.isEmpty() ) std::cerr << "LocalID: " << rLocalId << "\n"; + } + else + { + if (aException == PoEntry::NORESTYPE) + { + std::cerr << "No resource type specified!\n"; + } + else if (aException == PoEntry::WRONGHELPTEXT) + { + std::cerr << "x-comment length is 5 characters:" << rHelpText << "\n"; + } + + std::cerr << "GroupID: " << rGroupId << "\n"; + if( !rLocalId.isEmpty() ) std::cerr << "LocalID: " << rLocalId << "\n"; + std::cerr << "String: " << rText << "\n"; + } + } + } +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/l10ntools/source/common.hxx b/l10ntools/source/common.hxx deleted file mode 100644 index 6c2d2c71f472..000000000000 --- a/l10ntools/source/common.hxx +++ /dev/null @@ -1,76 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * Version: MPL 1.1 / GPLv3+ / LGPLv3+ - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License or as specified alternatively below. You may obtain a copy of - * the License at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * Major Contributor(s): - * [ Copyright (C) 2012 Red Hat, Inc., Stephan Bergmann <sbergman@redhat.com> - * (initial developer) ] - * - * All Rights Reserved. - * - * For minor contributions see the git repository. - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 3 or later (the "GPLv3+"), or - * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), - * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable - * instead of those above. - */ - -#ifndef INCLUDED_L10NTOOLS_SOURCE_COMMON_HXX -#define INCLUDED_L10NTOOLS_SOURCE_COMMON_HXX - -#include "sal/config.h" - -#include <cstdlib> -#include <iostream> - -#include "osl/file.hxx" -#include "osl/process.h" -#include "osl/thread.h" -#include "rtl/string.h" -#include "rtl/string.hxx" -#include "rtl/textcvt.h" -#include "rtl/uri.hxx" -#include "rtl/ustring.h" -#include "rtl/ustring.hxx" - -namespace common { - -inline rtl::OUString pathnameToAbsoluteUrl(rtl::OUString const & pathname) { - rtl::OUString url; - if (osl::FileBase::getFileURLFromSystemPath(pathname, url) - != osl::FileBase::E_None) - { - std::cerr << "Error: Cannot convert input pathname to URL\n"; - std::exit(EXIT_FAILURE); - } - rtl::OUString cwd; - if (osl_getProcessWorkingDir(&cwd.pData) != osl_Process_E_None) { - std::cerr << "Error: Cannot determine cwd\n"; - std::exit(EXIT_FAILURE); - } - if (osl::FileBase::getAbsoluteFileURL(cwd, url, url) - != osl::FileBase::E_None) - { - std::cerr << "Error: Cannot convert input URL to absolute URL\n"; - std::exit(EXIT_FAILURE); - } - return url; -} - -} - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/l10ntools/source/export.cxx b/l10ntools/source/export.cxx index 912f80b4c392..900e850d13b4 100644 --- a/l10ntools/source/export.cxx +++ b/l10ntools/source/export.cxx @@ -27,7 +27,6 @@ #include <stdlib.h> #include "common.hxx" #include "export.hxx" -#include "helper.hxx" #include "tokens.h" #include <iostream> #include <rtl/strbuf.hxx> @@ -45,20 +44,19 @@ OString inputPathname; boost::scoped_ptr< Export > exporter; } + } extern "C" { FILE * init(int argc, char ** argv) { - HandledArgs aArgs; - if ( !Export::handleArguments(argc, argv, aArgs) ) + common::HandledArgs aArgs; + if ( !common::handleArguments(argc, argv, aArgs) ) { - Export::writeUsage("transex3","*.src/*.hrc"); + common::writeUsage("transex3","*.src/*.hrc"); std::exit(EXIT_FAILURE); } - Export::sLanguages = aArgs.m_sLanguage; - Export::InitLanguages(); global::inputPathname = aArgs.m_sInputFile; FILE * pFile = std::fopen(global::inputPathname.getStr(), "r"); @@ -71,9 +69,9 @@ FILE * init(int argc, char ** argv) { if (aArgs.m_bMergeMode) { global::exporter.reset( - new Export(aArgs.m_sMergeSrc.getStr(), aArgs.m_sOutputFile.getStr())); + new Export(aArgs.m_sMergeSrc, aArgs.m_sOutputFile, aArgs.m_sLanguage)); } else { - global::exporter.reset(new Export(aArgs.m_sOutputFile.getStr())); + global::exporter.reset(new Export(aArgs.m_sOutputFile, aArgs.m_sLanguage)); } global::exporter->Init(); @@ -159,7 +157,25 @@ sal_Bool ResData::SetId( const rtl::OString& rId, sal_uInt16 nLevel ) // class Export // -Export::Export(const rtl::OString &rOutput) +namespace +{ + +static sal_Int32 lcl_countOccurrences(const OString& text, char c) +{ + sal_Int32 n = 0; + for (sal_Int32 i = 0;; ++i) { + i = text.indexOf(c, i); + if (i == -1) { + break; + } + ++n; + } + return n; +} + +} + +Export::Export(const OString &rOutput, const OString &rLanguage) : pWordTransformer( NULL ), bDefine( sal_False ), @@ -173,11 +189,12 @@ Export::Export(const rtl::OString &rOutput) bError( sal_False ), bReadOver( sal_False ), bDontWriteOutput( sal_False ), - sFilename( global::inputPathname ) + isInitialized( false ), + sFilename( global::inputPathname ), + sLanguages( rLanguage ), + pParseQueue( new ParserQueue( *this ) ) { - pParseQueue = new ParserQueue( *this ); - - if( !isInitialized ) InitLanguages(); + InitLanguages(); // used when export is enabled // open output stream @@ -188,7 +205,9 @@ Export::Export(const rtl::OString &rOutput) } } -Export::Export(const rtl::OString &rMergeSource, const rtl::OString &rOutput) +Export::Export( + const OString &rMergeSource, const OString &rOutput, + const OString &rLanguage ) : pWordTransformer( NULL ), bDefine( sal_False ), @@ -203,10 +222,12 @@ Export::Export(const rtl::OString &rMergeSource, const rtl::OString &rOutput) bError( sal_False ), bReadOver( sal_False ), bDontWriteOutput( sal_False ), - sFilename( global::inputPathname ) + isInitialized( false ), + sFilename( global::inputPathname ), + sLanguages( rLanguage ), + pParseQueue( new ParserQueue( *this ) ) { - pParseQueue = new ParserQueue( *this ); - if( !isInitialized ) InitLanguages( bMergeMode ); + InitLanguages( bMergeMode ); // used when merge is enabled // open output stream @@ -544,8 +565,8 @@ int Export::Execute( int nToken, const char * pToken ) nListLevel = 0; } if (sToken.indexOf( '{' ) != -1 - && (helper::countOccurrences(sToken, '{') - > helper::countOccurrences(sToken, '}'))) + && (lcl_countOccurrences(sToken, '{') + > lcl_countOccurrences(sToken, '}'))) { Parse( LEVELUP, "" ); } @@ -642,7 +663,7 @@ int Export::Execute( int nToken, const char * pToken ) SetChildWithText(); sal_Int32 n = 0; rtl::OString sEntry(sToken.getToken(1, '"', n)); - if ( helper::countOccurrences(sToken, '"') > 2 ) + if ( lcl_countOccurrences(sToken, '"') > 2 ) sEntry += "\""; if ( sEntry == "\\\"" ) sEntry = "\""; @@ -686,7 +707,7 @@ int Export::Execute( int nToken, const char * pToken ) sKey.equalsL(RTL_CONSTASCII_STRINGPARAM("UINAME"))) { SetChildWithText(); - if ( Export::isSourceLanguage( sLangIndex ) ) + if ( sLangIndex.equalsIgnoreAsciiCase("en-US") ) pResData->SetId( sText, ID_LEVEL_TEXT ); pResData->bText = sal_True; @@ -935,16 +956,16 @@ sal_Bool Export::WriteData( ResData *pResData, sal_Bool bCreateNew ) if (sXText.isEmpty()) sXText = "-"; - writePoEntry( + common::writePoEntry( "Transex3", *aOutput.mPo, global::inputPathname, pResData->sResTyp, sGID, sLID, sXHText, sXText); if( !sXQHText.isEmpty() ) - writePoEntry( + common::writePoEntry( "Transex3", *aOutput.mPo, global::inputPathname, pResData->sResTyp, sGID, sLID, OString(), sXQHText, PoEntry::TQUICKHELPTEXT ); if( !sXTitle.isEmpty() ) - writePoEntry( + common::writePoEntry( "Transex3", *aOutput.mPo, global::inputPathname, pResData->sResTyp, sGID, sLID, OString(), sXTitle, PoEntry::TTITLE ); @@ -1051,7 +1072,7 @@ sal_Bool Export::WriteExportList(ResData *pResData, ExportList *pExportList, if( sText == "\\\"" ) sText = "\""; } - writePoEntry( + common::writePoEntry( "Transex3", *aOutput.mPo, global::inputPathname, rTyp, sGID, sLID, OString(), sText); } @@ -1150,7 +1171,7 @@ void Export::InsertListEntry(const rtl::OString &rText, const rtl::OString &rLin }else (*pCurEntry)[ m_sListLang ] = rText; - if ( Export::isSourceLanguage( m_sListLang ) ) { + if ( m_sListLang.equalsIgnoreAsciiCase("en-US") ) { (*pCurEntry)[ SOURCE_LANGUAGE ] = rLine; pList->NewSourceLanguageListEntry(); @@ -1204,7 +1225,7 @@ rtl::OString Export::GetText(const rtl::OString &rSource, int nToken) replaceAll("\\0x7F", "-=<[0x7F]>=-"); sal_uInt16 nState = TXT_STATE_TEXT; - for (sal_Int32 i = 1; i <= helper::countOccurrences(sTmp, '"'); ++i) + for (sal_Int32 i = 1; i <= lcl_countOccurrences(sTmp, '"'); ++i) { rtl::OString sToken(sTmp.getToken(i, '"')); if (!sToken.isEmpty()) { @@ -1501,7 +1522,10 @@ sal_Bool Export::PrepareTextToMerge(rtl::OString &rText, sal_uInt16 nTyp, // Init Languages if( Export::sLanguages.equalsIgnoreAsciiCase("ALL") ) - SetLanguages( pMergeDataFile->GetLanguages() ); + { + aLanguages = pMergeDataFile->GetLanguages(); + isInitialized = true; + } else if( !isInitialized )InitLanguages(); } @@ -1518,13 +1542,13 @@ sal_Bool Export::PrepareTextToMerge(rtl::OString &rText, sal_uInt16 nTyp, rtl::OString sContent; pEntrys->GetTransex3Text(sContent, nTyp, rLangIndex); - if (sContent.isEmpty() && (!Export::isSourceLanguage(rLangIndex))) + if (sContent.isEmpty() && !rLangIndex.equalsIgnoreAsciiCase("en-US")) { rText = sOrigText; return sal_False; // no data found } - if (Export::isSourceLanguage(rLangIndex)) + if (rLangIndex.equalsIgnoreAsciiCase("en-US")) return sal_False; rtl::OString sPostFix( rText.copy( ++nEnd )); @@ -1565,7 +1589,7 @@ void Export::ResData2Output( PFormEntrys *pEntry, sal_uInt16 nType, const rtl::O sOutput += rTextType; - if ( ! Export::isSourceLanguage( sCur ) ) { + if ( !sCur.equalsIgnoreAsciiCase("en-US") ) { sOutput += "[ "; sOutput += sCur; sOutput += " ] "; @@ -1602,7 +1626,10 @@ void Export::MergeRest( ResData *pResData, sal_uInt16 nMode ) // Init Languages if (Export::sLanguages.equalsIgnoreAsciiCase("ALL")) - SetLanguages( pMergeDataFile->GetLanguages() ); + { + aLanguages = pMergeDataFile->GetLanguages(); + isInitialized = true; + } else if( !isInitialized )InitLanguages(); } @@ -1898,6 +1925,29 @@ void Export::SetChildWithText() } } +void Export::InitLanguages( bool bMerge ){ + + if( !isInitialized ) + { + rtl::OString sTmp; + OStringBoolHashMap aEnvLangs; + + sal_Int32 nIndex = 0; + do + { + rtl::OString aToken = sLanguages.getToken(0, ',', nIndex); + sTmp = aToken.getToken(0, '=').trim(); + if( bMerge && sTmp.equalsIgnoreAsciiCase("en-US") ){} + else if( !( (sTmp[0]=='x' || sTmp[0]=='X') && sTmp[1]=='-' ) ){ + aLanguages.push_back( sTmp ); + } + } + while ( nIndex >= 0 ); + + isInitialized = true; + } +} + void ParserQueue::Push( const QueueEntry& aEntry ) { sal_Int32 nLen = aEntry.sLine.getLength(); diff --git a/l10ntools/source/export2.cxx b/l10ntools/source/export2.cxx deleted file mode 100644 index 9e69db245a47..000000000000 --- a/l10ntools/source/export2.cxx +++ /dev/null @@ -1,364 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed - * with this work for additional information regarding copyright - * ownership. The ASF licenses this file to you under the Apache - * License, Version 2.0 (the "License"); you may not use this file - * except in compliance with the License. You may obtain a copy of - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ - -#include "sal/config.h" - -#include "export.hxx" -#include <stdio.h> -#include <osl/time.h> -#include <osl/process.h> -#include <rtl/strbuf.hxx> -#include <rtl/ustring.hxx> -#include <sal/macros.h> -#include <iostream> -#include <iomanip> -#include <time.h> -#include <stdlib.h> - -//flags for handleArguments() -#define STATE_NON 0x0001 -#define STATE_INPUT 0x0002 -#define STATE_OUTPUT 0x0003 -#define STATE_MERGESRC 0x0006 -#define STATE_LANGUAGES 0x0007 - -// -// class ResData(); -// - -/*****************************************************************************/ -ResData::~ResData() -/*****************************************************************************/ -{ - if ( pStringList ) { - // delete existing res. of type StringList - for ( size_t i = 0; i < pStringList->size(); i++ ) { - ExportListEntry* test = (*pStringList)[ i ]; - if( test != NULL ) delete test; - } - delete pStringList; - } - if ( pFilterList ) { - // delete existing res. of type FilterList - for ( size_t i = 0; i < pFilterList->size(); i++ ) { - ExportListEntry* test = (*pFilterList)[ i ]; - delete test; - } - delete pFilterList; - } - if ( pItemList ) { - // delete existing res. of type ItemList - for ( size_t i = 0; i < pItemList->size(); i++ ) { - ExportListEntry* test = (*pItemList)[ i ]; - delete test; - } - delete pItemList; - } - if ( pUIEntries ) { - // delete existing res. of type UIEntries - for ( size_t i = 0; i < pUIEntries->size(); i++ ) { - ExportListEntry* test = (*pUIEntries)[ i ]; - delete test; - } - delete pUIEntries; - } -} - -// -// class Export -// - -/*****************************************************************************/ -rtl::OString Export::sLanguages; -/*****************************************************************************/ - -bool Export::handleArguments( - int argc, char * argv[], HandledArgs& o_aHandledArgs) -{ - o_aHandledArgs = HandledArgs(); - sal_uInt16 nState = STATE_NON; - - for( int i = 1; i < argc; i++ ) - { - if ( OString( argv[ i ] ).toAsciiUpperCase() == "-I" ) - { - nState = STATE_INPUT; // next token specifies source file - } - else if ( OString( argv[ i ] ).toAsciiUpperCase() == "-O" ) - { - nState = STATE_OUTPUT; // next token specifies the dest file - } - else if ( OString( argv[ i ] ).toAsciiUpperCase() == "-M" ) - { - nState = STATE_MERGESRC; // next token specifies the merge database - } - else if ( OString( argv[ i ] ).toAsciiUpperCase() == "-L" ) - { - nState = STATE_LANGUAGES; - } - else - { - switch ( nState ) - { - case STATE_NON: - { - return false; // no valid command line - } - case STATE_INPUT: - { - o_aHandledArgs.m_sInputFile = OString( argv[i] ); - } - break; - case STATE_OUTPUT: - { - o_aHandledArgs.m_sOutputFile = OString( argv[i] ); - } - break; - case STATE_MERGESRC: - { - o_aHandledArgs.m_sMergeSrc = OString( argv[i] ); - o_aHandledArgs.m_bMergeMode = true; - } - break; - case STATE_LANGUAGES: - { - o_aHandledArgs.m_sLanguage = OString( argv[i] ); - } - break; - } - } - } - if( !o_aHandledArgs.m_sInputFile.isEmpty() && - !o_aHandledArgs.m_sOutputFile.isEmpty() ) - { - return true; - } - else - { - o_aHandledArgs = HandledArgs(); - return false; - } -} - -void Export::writeUsage(const OString& rName, const OString& rFileType) -{ - std::cout - << " Syntax: " << rName.getStr() - << " -i FileIn -o FileOut [-m DataBase] [-l Lang]\n" - << " FileIn: Source files (" << rFileType.getStr() << ")\n" - << " FileOut: Destination file (*.*)\n" - << " DataBase: Mergedata (*.po)\n" - << " Lang: Restrict the handled languag; one element of\n" - << " (de, en-US, ...) or all\n"; -} - -void Export::writePoEntry( - const OString& rExecutable, PoOfstream& rPoStream, const OString& rSourceFile, - const OString& rResType, const OString& rGroupId, const OString& rLocalId, - const OString& rHelpText, const OString& rText, const PoEntry::TYPE eType ) -{ - try - { - PoEntry aPO(rSourceFile, rResType, rGroupId, rLocalId, rHelpText, rText, eType); - rPoStream.writeEntry( aPO ); - } - catch( PoEntry::Exception& aException ) - { - if(aException == PoEntry::NOSOURCFILE) - { - std::cerr << rExecutable << " warning: no sourcefile specified for po entry\n"; - } - else - { - std::cerr << rExecutable << " warning: inavlid po attributes extracted from " << rSourceFile << "\n"; - if(aException == PoEntry::NOGROUPID) - { - std::cerr << "No groupID specified!\n"; - std::cerr << "String: " << rText << "\n"; - } - else if (aException == PoEntry::NOSTRING) - { - std::cerr << "No string specified!\n"; - std::cerr << "GroupID: " << rGroupId << "\n"; - if( !rLocalId.isEmpty() ) std::cerr << "LocalID: " << rLocalId << "\n"; - } - else - { - if (aException == PoEntry::NORESTYPE) - { - std::cerr << "No resource type specified!\n"; - } - else if (aException == PoEntry::WRONGHELPTEXT) - { - std::cerr << "x-comment length is 5 characters:" << rHelpText << "\n"; - } - - std::cerr << "GroupID: " << rGroupId << "\n"; - if( !rLocalId.isEmpty() ) std::cerr << "LocalID: " << rLocalId << "\n"; - std::cerr << "String: " << rText << "\n"; - } - } - } -} - - -/*****************************************************************************/ -void Export::SetLanguages( std::vector<rtl::OString> val ){ -/*****************************************************************************/ - aLanguages = val; - isInitialized = true; -} -/*****************************************************************************/ -std::vector<rtl::OString> Export::GetLanguages(){ -/*****************************************************************************/ - return aLanguages; -} -std::vector<rtl::OString> Export::aLanguages = std::vector<rtl::OString>(); -std::vector<rtl::OString> Export::aForcedLanguages = std::vector<rtl::OString>(); - -/*****************************************************************************/ -rtl::OString Export::QuoteHTML( rtl::OString const &rString ) -/*****************************************************************************/ -{ - rtl::OStringBuffer sReturn; - for ( sal_Int32 i = 0; i < rString.getLength(); i++ ) { - rtl::OString sTemp = rString.copy( i ); - if ( sTemp.match( "<Arg n=" ) ) { - while ( i < rString.getLength() && rString[i] != '>' ) { - sReturn.append(rString[i]); - i++; - } - if ( rString[i] == '>' ) { - sReturn.append('>'); - i++; - } - } - if ( i < rString.getLength()) { - switch ( rString[i]) { - case '<': - sReturn.append("<"); - break; - - case '>': - sReturn.append(">"); - break; - - case '\"': - sReturn.append("""); - break; - - case '\'': - sReturn.append("'"); - break; - - case '&': - if ((( i + 4 ) < rString.getLength()) && - ( rString.copy( i, 5 ) == "&" )) - sReturn.append(rString[i]); - else - sReturn.append("&"); - break; - - default: - sReturn.append(rString[i]); - break; - } - } - } - return sReturn.makeStringAndClear(); -} - -void Export::RemoveUTF8ByteOrderMarker( rtl::OString &rString ) -{ - if( hasUTF8ByteOrderMarker( rString ) ) - rString = rString.copy(3); -} - -bool Export::hasUTF8ByteOrderMarker( const rtl::OString &rString ) -{ - return rString.getLength() >= 3 && rString[0] == '\xEF' && - rString[1] == '\xBB' && rString[2] == '\xBF' ; -} - -/*****************************************************************************/ -rtl::OString Export::UnquoteHTML( rtl::OString const &rString ) -/*****************************************************************************/ -{ - rtl::OStringBuffer sReturn; - for (sal_Int32 i = 0; i != rString.getLength();) { - if (rString.match("&", i)) { - sReturn.append('&'); - i += RTL_CONSTASCII_LENGTH("&"); - } else if (rString.match("<", i)) { - sReturn.append('<'); - i += RTL_CONSTASCII_LENGTH("<"); - } else if (rString.match(">", i)) { - sReturn.append('>'); - i += RTL_CONSTASCII_LENGTH(">"); - } else if (rString.match(""", i)) { - sReturn.append('"'); - i += RTL_CONSTASCII_LENGTH("""); - } else if (rString.match("'", i)) { - sReturn.append('\''); - i += RTL_CONSTASCII_LENGTH("'"); - } else { - sReturn.append(rString[i]); - ++i; - } - } - return sReturn.makeStringAndClear(); -} - -bool Export::isSourceLanguage(const rtl::OString &rLanguage) -{ - return !isAllowed(rLanguage); -} - -bool Export::isAllowed(const rtl::OString &rLanguage) -{ - return !rLanguage.equalsIgnoreAsciiCaseL(RTL_CONSTASCII_STRINGPARAM("en-US")); -} - -bool Export::isInitialized = false; - -/*****************************************************************************/ -void Export::InitLanguages( bool bMergeMode ){ -/*****************************************************************************/ - if( !isInitialized ) - { - rtl::OString sTmp; - OStringBoolHashMap aEnvLangs; - - sal_Int32 nIndex = 0; - do - { - rtl::OString aToken = sLanguages.getToken(0, ',', nIndex); - sTmp = aToken.getToken(0, '=').trim(); - if( bMergeMode && !isAllowed( sTmp ) ){} - else if( !( (sTmp[0]=='x' || sTmp[0]=='X') && sTmp[1]=='-' ) ){ - aLanguages.push_back( sTmp ); - } - } - while ( nIndex >= 0 ); - - isInitialized = true; - } -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/l10ntools/source/helper.cxx b/l10ntools/source/helper.cxx new file mode 100644 index 000000000000..cbcf6d1572fb --- /dev/null +++ b/l10ntools/source/helper.cxx @@ -0,0 +1,88 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "helper.hxx" + +namespace helper { + +rtl::OString QuotHTML(const rtl::OString &rString) +{ + rtl::OStringBuffer sReturn; + for (sal_Int32 i = 0; i < rString.getLength(); ++i) { + switch (rString[i]) { + case '\\': + if (i < rString.getLength()) { + switch (rString[i + 1]) { + case '"': + case '<': + case '>': + case '\\': + ++i; + break; + } + } + // fall through + default: + sReturn.append(rString[i]); + break; + + case '<': + sReturn.append("<"); + break; + + case '>': + sReturn.append(">"); + break; + + case '"': + sReturn.append("""); + break; + + case '&': + if (rString.match("&", i)) + sReturn.append('&'); + else + sReturn.append("&"); + break; + } + } + return sReturn.makeStringAndClear(); +} + +bool isWellFormedXML( OString const & text ) +{ + xmlDocPtr doc; + OString content; + bool result = true; + + content = "<root>"; + content += text; + content += "</root>"; + doc = xmlParseMemory(content.getStr(),(int)content.getLength()); + if (doc == NULL) { + result = false; + } + xmlFreeDoc(doc); + xmlCleanupParser(); + return result; +} + +//Convert xmlChar* to OString +OString xmlStrToOString( const xmlChar* pString ) +{ + xmlChar* pTemp = xmlStrdup( pString ); + OString sResult = + static_cast<OString>(reinterpret_cast<sal_Char*>( pTemp )); + xmlFree( pTemp ); + return sResult; +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/l10ntools/source/helper.hxx b/l10ntools/source/helper.hxx deleted file mode 100644 index 1d268dd1c0f7..000000000000 --- a/l10ntools/source/helper.hxx +++ /dev/null @@ -1,181 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * Version: MPL 1.1 / GPLv3+ / LGPLv3+ - * - * The contents of this file are subject to the Mozilla Public License Version - * 1.1 (the "License"); you may not use this file except in compliance with - * the License or as specified alternatively below. You may obtain a copy of - * the License at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. - * - * Major Contributor(s): - * [ Copyright (C) 2012 Red Hat, Inc., Stephan Bergmann <sbergman@redhat.com> - * (initial developer) ] - * - * All Rights Reserved. - * - * For minor contributions see the git repository. - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 3 or later (the "GPLv3+"), or - * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), - * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable - * instead of those above. - */ - -#ifndef INCLUDED_L10NTOOLS_SOURCE_HELPER_HXX -#define INCLUDED_L10NTOOLS_SOURCE_HELPER_HXX - -#include "sal/config.h" - -#include <algorithm> -#include <cassert> - -#include <libxml/parser.h> - -#include "rtl/string.hxx" -#include "rtl/ustring.hxx" -#include "rtl/strbuf.hxx" -#include "sal/types.h" - -namespace helper { - -// cf. comphelper::string::isdigitAsciiString: -inline bool isAllAsciiDigits(rtl::OString const & text) { - for (sal_Int32 i = 0; i != text.getLength(); ++i) { - if (text[i] < '0' || text[i] > '9') { - return false; - } - } - return true; -} - -// cf. comphelper::string::isupperAsciiString: -inline bool isAllAsciiUpperCase(rtl::OString const & text) { - for (sal_Int32 i = 0; i != text.getLength(); ++i) { - if (text[i] < 'A' || text[i] > 'Z') { - return false; - } - } - return true; -} - -// cf. comphelper::string::islowerAsciiString: -inline bool isAllAsciiLowerCase(rtl::OString const & text) { - for (sal_Int32 i = 0; i != text.getLength(); ++i) { - if (text[i] < 'a' || text[i] > 'z') { - return false; - } - } - return true; -} - -inline sal_Int32 countOccurrences(rtl::OString const & text, char c) { - sal_Int32 n = 0; - for (sal_Int32 i = 0;; ++i) { - i = text.indexOf(c, i); - if (i == -1) { - break; - } - ++n; - } - return n; -} - -inline sal_Int32 indexOfAnyAsciiL( - rtl::OUString const & text, char const * chars, sal_Int32 charsLen, - sal_Int32 index = 0) -{ - for (; index != text.getLength(); ++index) { - sal_Unicode c = text[index]; - if (c <= 0x7F - && (rtl_str_indexOfChar_WithLength( - chars, charsLen, static_cast< char >(c)) - != -1)) - { - return index; - } - } - return -1; -} - -rtl::OString QuotHTML(const rtl::OString &rString) -{ - rtl::OStringBuffer sReturn; - for (sal_Int32 i = 0; i < rString.getLength(); ++i) { - switch (rString[i]) { - case '\\': - if (i < rString.getLength()) { - switch (rString[i + 1]) { - case '"': - case '<': - case '>': - case '\\': - ++i; - break; - } - } - // fall through - default: - sReturn.append(rString[i]); - break; - - case '<': - sReturn.append("<"); - break; - - case '>': - sReturn.append(">"); - break; - - case '"': - sReturn.append("""); - break; - - case '&': - if (rString.matchL(RTL_CONSTASCII_STRINGPARAM("&"), i)) - sReturn.append('&'); - else - sReturn.append(RTL_CONSTASCII_STRINGPARAM("&")); - break; - } - } - return sReturn.makeStringAndClear(); -} - -inline bool isWellFormedXML( OString const & text ) -{ - xmlDocPtr doc; - OString content; - bool result = true; - - content = "<root>"; - content += text; - content += "</root>"; - doc = xmlParseMemory(content.getStr(),(int)content.getLength()); - if (doc == NULL) { - result = false; - } - xmlFreeDoc(doc); - xmlCleanupParser(); - return result; -} - - -template< typename T > inline T abbreviate( - T const & text, sal_Int32 start, sal_Int32 length) -{ - start = std::max(sal_Int32(0), start); - assert(start <= text.getLength()); - return text.copy(start, std::min(text.getLength() - start, length)); -} - -} - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/l10ntools/source/helpex.cxx b/l10ntools/source/helpex.cxx index 5d46262d80b4..35aec5e3b8d9 100644 --- a/l10ntools/source/helpex.cxx +++ b/l10ntools/source/helpex.cxx @@ -30,6 +30,7 @@ #include "sal/main.h" #include "helpmerge.hxx" +#include "common.hxx" #ifndef TESTDRIVER @@ -60,8 +61,8 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) { } } - HandledArgs aArgs; - if ( !Export::handleArguments( argc, argv, aArgs) ) + common::HandledArgs aArgs; + if ( !common::handleArguments( argc, argv, aArgs) ) { WriteUsage(); return 1; diff --git a/l10ntools/source/helpmerge.cxx b/l10ntools/source/helpmerge.cxx index ddcece2b492c..60ae8ed21962 100644 --- a/l10ntools/source/helpmerge.cxx +++ b/l10ntools/source/helpmerge.cxx @@ -40,6 +40,7 @@ #include <direct.h> #endif +#include "export.hxx" #include "common.hxx" #include "helper.hxx" #include "po.hxx" @@ -135,7 +136,7 @@ bool HelpParser::CreatePO( replaceAll("\n",OString()). replaceAll("\t",OString()).trim()); - Export::writePoEntry( + common::writePoEntry( "Helpex", aPoOutput, sHelpFile, rGsi1, posm->first, pXMLElement->GetOldref(), OString(), data); diff --git a/l10ntools/source/lngex.cxx b/l10ntools/source/lngex.cxx index 0677e8a2172a..957ebd4645a9 100644 --- a/l10ntools/source/lngex.cxx +++ b/l10ntools/source/lngex.cxx @@ -27,10 +27,10 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) { - HandledArgs aArgs; - if ( !Export::handleArguments(argc, argv, aArgs) ) + common::HandledArgs aArgs; + if ( !common::handleArguments(argc, argv, aArgs) ) { - Export::writeUsage("ulfex","*.ulf"); + common::writeUsage("ulfex","*.ulf"); return 1; } diff --git a/l10ntools/source/lngmerge.cxx b/l10ntools/source/lngmerge.cxx index 8586a8a84914..052f9705ab1e 100644 --- a/l10ntools/source/lngmerge.cxx +++ b/l10ntools/source/lngmerge.cxx @@ -24,7 +24,7 @@ #include <iterator> #include <string> -#include "common.hxx" +#include "po.hxx" #include "lngmerge.hxx" namespace { @@ -33,6 +33,15 @@ rtl::OString getBracketedContent(rtl::OString text) { return text.getToken(1, '[').getToken(0, ']'); } +static void lcl_RemoveUTF8ByteOrderMarker( OString &rString ) +{ + if( rString.getLength() >= 3 && rString[0] == '\xEF' && + rString[1] == '\xBB' && rString[2] == '\xBF' ) + { + rString = rString.copy(3); + } +} + } // @@ -59,7 +68,7 @@ LngParser::LngParser(const rtl::OString &rLngFile, if( bFirstLine ) { // Always remove UTF8 BOM from the first line - Export::RemoveUTF8ByteOrderMarker( sLine ); + lcl_RemoveUTF8ByteOrderMarker( sLine ); bFirstLine = false; } @@ -129,7 +138,7 @@ void LngParser::WritePO(PoOfstream &aPOStream, if ( sAct.isEmpty() && !sCur.isEmpty() ) sAct = rText_inout[ rtl::OString("en-US") ]; - Export::writePoEntry( + common::writePoEntry( "Ulfex", aPOStream, rActFileName, "LngText", rID, OString(), OString(), sAct); } diff --git a/l10ntools/source/merge.cxx b/l10ntools/source/merge.cxx index 34f590c4bccf..46c7828d969c 100644 --- a/l10ntools/source/merge.cxx +++ b/l10ntools/source/merge.cxx @@ -60,6 +60,108 @@ namespace } // +// class ResData +// + +ResData::ResData(const rtl::OString &rPF, const rtl::OString &rGId) + : + nWidth( 0 ), + nChildIndex( 0 ), + nIdLevel( ID_LEVEL_NULL ), + bChild( sal_False ), + bChildWithText( sal_False ), + bText( sal_False ), + bHelpText( sal_False ), + bQuickHelpText( sal_False ), + bTitle( sal_False ), + bList( sal_False ), + bRestMerged( sal_False ), + sGId( rGId ), + nTextRefId( REFID_NONE ), + nHelpTextRefId( REFID_NONE ), + nQuickHelpTextRefId( REFID_NONE ), + nTitleRefId( REFID_NONE ), + sTextTyp( "Text" ), + pStringList( NULL ), + pUIEntries( NULL ), + pItemList( NULL ), + pFilterList( NULL ), + pPairedList( NULL ), + sPForm( rPF ) +{ + sGId = sGId.replaceAll("\r", rtl::OString()); + sPForm = sPForm.replaceAll("\r", rtl::OString()); +} + +ResData::ResData(const rtl::OString &rPF, const rtl::OString &rGId , const rtl::OString &rFilename) + : + nWidth( 0 ), + nChildIndex( 0 ), + nIdLevel( ID_LEVEL_NULL ), + bChild( sal_False ), + bChildWithText( sal_False ), + bText( sal_False ), + bHelpText( sal_False ), + bQuickHelpText( sal_False ), + bTitle( sal_False ), + bList( sal_False ), + bRestMerged( sal_False ), + sGId( rGId ), + sFilename( rFilename ), + nTextRefId( REFID_NONE ), + nHelpTextRefId( REFID_NONE ), + nQuickHelpTextRefId( REFID_NONE ), + nTitleRefId( REFID_NONE ), + sTextTyp( "Text" ), + pStringList( NULL ), + pUIEntries( NULL ), + pItemList( NULL ), + pFilterList( NULL ), + pPairedList( NULL ), + sPForm( rPF ) +{ + sGId = sGId.replaceAll("\r", rtl::OString()); + sPForm = sPForm.replaceAll("\r", rtl::OString()); +} + + +ResData::~ResData() +{ + if ( pStringList ) { + // delete existing res. of type StringList + for ( size_t i = 0; i < pStringList->size(); i++ ) { + ExportListEntry* test = (*pStringList)[ i ]; + if( test != NULL ) delete test; + } + delete pStringList; + } + if ( pFilterList ) { + // delete existing res. of type FilterList + for ( size_t i = 0; i < pFilterList->size(); i++ ) { + ExportListEntry* test = (*pFilterList)[ i ]; + delete test; + } + delete pFilterList; + } + if ( pItemList ) { + // delete existing res. of type ItemList + for ( size_t i = 0; i < pItemList->size(); i++ ) { + ExportListEntry* test = (*pItemList)[ i ]; + delete test; + } + delete pItemList; + } + if ( pUIEntries ) { + // delete existing res. of type UIEntries + for ( size_t i = 0; i < pUIEntries->size(); i++ ) { + ExportListEntry* test = (*pUIEntries)[ i ]; + delete test; + } + delete pUIEntries; + } +} + +// // class PFormEntrys // diff --git a/l10ntools/source/propex.cxx b/l10ntools/source/propex.cxx index 8517bfb3bdd4..b12f4d32d6f6 100644 --- a/l10ntools/source/propex.cxx +++ b/l10ntools/source/propex.cxx @@ -9,15 +9,15 @@ #include "sal/main.h" -#include "export.hxx" +#include "common.hxx" #include "propmerge.hxx" SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) { - HandledArgs aArgs; - if( !Export::handleArguments(argc, argv, aArgs) ) + common::HandledArgs aArgs; + if( !common::handleArguments(argc, argv, aArgs) ) { - Export::writeUsage("propex","*.properties"); + common::writeUsage("propex","*.properties"); return 1; } diff --git a/l10ntools/source/propmerge.cxx b/l10ntools/source/propmerge.cxx index 6f87a4efb7d4..72affe367d6d 100644 --- a/l10ntools/source/propmerge.cxx +++ b/l10ntools/source/propmerge.cxx @@ -144,7 +144,7 @@ void PropParser::Extract( const OString& rPOFile ) OString sID = sLine.copy( 0, nEqualSign ).trim(); OString sText = lcl_ConvertToUTF8( sLine.copy( nEqualSign + 1 ).trim() ); - Export::writePoEntry( + common::writePoEntry( "Propex", aPOStream, m_sSource, "property", sID, OString(), OString(), sText); } diff --git a/l10ntools/source/stringex.cxx b/l10ntools/source/stringex.cxx index cf4a227c7a5a..1b507f82eca3 100644 --- a/l10ntools/source/stringex.cxx +++ b/l10ntools/source/stringex.cxx @@ -10,15 +10,15 @@ #include <iostream> #include "sal/main.h" -#include "export.hxx" +#include "common.hxx" #include "stringmerge.hxx" SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) { - HandledArgs aArgs; - if( !Export::handleArguments(argc, argv, aArgs) ) + common::HandledArgs aArgs; + if( !common::handleArguments(argc, argv, aArgs) ) { - Export::writeUsage("stringex","string.xml"); + common::writeUsage("stringex","string.xml"); return 1; } diff --git a/l10ntools/source/stringmerge.cxx b/l10ntools/source/stringmerge.cxx index bc7417d0721f..b81ea71f4d05 100644 --- a/l10ntools/source/stringmerge.cxx +++ b/l10ntools/source/stringmerge.cxx @@ -18,24 +18,11 @@ #include <libxml/xmlstring.h> #include "export.hxx" +#include "helper.hxx" #include "common.hxx" #include "po.hxx" #include "stringmerge.hxx" - -namespace -{ - //Convert xmlChar* to OString - static OString lcl_xmlStrToOString( const xmlChar* pString ) - { - xmlChar* pTemp = xmlStrdup( pString ); - OString sResult = - static_cast<OString>(reinterpret_cast<sal_Char*>( pTemp )); - xmlFree( pTemp ); - return sResult; - } -} - //Parse strings.xml file StringParser::StringParser( const OString& rInputFile, const OString& rLang ) @@ -84,10 +71,10 @@ void StringParser::Extract( const OString& rPOFile ) xmlChar* pID = xmlGetProp(pCurrent, (const xmlChar*)("name")); xmlChar* pText = xmlNodeGetContent(pCurrent); - Export::writePoEntry( + common::writePoEntry( "Stringex", aPOStream, m_pSource->name, "string", - lcl_xmlStrToOString( pID ), OString(), OString(), - lcl_xmlStrToOString( pText )); + helper::xmlStrToOString( pID ), OString(), OString(), + helper::xmlStrToOString( pText )); xmlFree( pID ); xmlFree( pText ); @@ -134,7 +121,7 @@ void StringParser::Merge( { xmlChar* pID = xmlGetProp(pCurrent, (const xmlChar*)("name")); ResData aResData( - "", lcl_xmlStrToOString( pID ), + "", helper::xmlStrToOString( pID ), static_cast<OString>(m_pSource->name) ); xmlFree( pID ); aResData.sResTyp = "string"; diff --git a/l10ntools/source/treemerge.cxx b/l10ntools/source/treemerge.cxx index d259efcd9d46..b340ebea170d 100644 --- a/l10ntools/source/treemerge.cxx +++ b/l10ntools/source/treemerge.cxx @@ -18,22 +18,14 @@ #include <libxml/xmlstring.h> #include "export.hxx" +#include "helper.hxx" #include "common.hxx" +#include "po.hxx" #include "treemerge.hxx" namespace { - //Convert xmlChar* to OString - static OString lcl_xmlStrToOString( const xmlChar* pString ) - { - xmlChar* pTemp = xmlStrdup( pString ); - OString sResult = - static_cast<OString>(reinterpret_cast<sal_Char*>( pTemp )); - xmlFree( pTemp ); - return sResult; - } - //Extract strings from nodes on all level recursively static void lcl_ExtractLevel( const xmlDocPtr pSource, const xmlNodePtr pRoot, @@ -52,9 +44,9 @@ namespace xmlChar* pText = xmlGetProp(pCurrent, (const xmlChar*)("title")); - Export::writePoEntry( - "Treex", rPOStream, pSource->name, lcl_xmlStrToOString( pNodeName ), - lcl_xmlStrToOString( pID ), OString(), OString(), lcl_xmlStrToOString( pText )); + common::writePoEntry( + "Treex", rPOStream, pSource->name, helper::xmlStrToOString( pNodeName ), + helper::xmlStrToOString( pID ), OString(), OString(), helper::xmlStrToOString( pText )); xmlFree( pID ); xmlFree( pText ); @@ -73,7 +65,7 @@ namespace xmlNodePtr pReturn = pCurrent; xmlChar* pID = xmlGetProp(pReturn, (const xmlChar*)("id")); const OString sID = - lcl_xmlStrToOString( pID ); + helper::xmlStrToOString( pID ); xmlFree( pID ); const sal_Int32 nFirstSlash = sID.indexOf("/"); @@ -122,7 +114,7 @@ namespace xmlChar* sTitle = xmlNodeListGetString(pXhpFile, pXhpNode->children, 1); OString sNewTitle = - lcl_xmlStrToOString( sTitle ). + helper::xmlStrToOString( sTitle ). replaceAll("$[officename]","%PRODUCTNAME"). replaceAll("$[officeversion]","%PRODUCTVERSION"); xmlNodeSetContent( @@ -165,10 +157,10 @@ namespace { xmlChar* pID = xmlGetProp(pCurrent, (const xmlChar*)("id")); ResData aResData( - "", lcl_xmlStrToOString( pID ), + "", helper::xmlStrToOString( pID ), static_cast<OString>(io_pSource->name) ); xmlFree( pID ); - aResData.sResTyp = lcl_xmlStrToOString( pNodeName ); + aResData.sResTyp = helper::xmlStrToOString( pNodeName ); PFormEntrys* pEntrys = pMergeDataFile->GetPFormEntrys( &aResData ); if( pEntrys ) diff --git a/l10ntools/source/treex.cxx b/l10ntools/source/treex.cxx index 51874808b71e..7c572309b2d4 100644 --- a/l10ntools/source/treex.cxx +++ b/l10ntools/source/treex.cxx @@ -11,7 +11,7 @@ #include <cstring> #include "sal/main.h" -#include "export.hxx" +#include "common.hxx" #include "treemerge.hxx" void WriteUsage() @@ -45,8 +45,8 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) break; } } - HandledArgs aArgs; - if( !Export::handleArguments(argc, argv, aArgs) ) + common::HandledArgs aArgs; + if( !common::handleArguments(argc, argv, aArgs) ) { WriteUsage(); return 1; diff --git a/l10ntools/source/uimerge.cxx b/l10ntools/source/uimerge.cxx index 6e0ec03b33ca..76fc9ef8b400 100644 --- a/l10ntools/source/uimerge.cxx +++ b/l10ntools/source/uimerge.cxx @@ -21,6 +21,7 @@ #include <stdio.h> #include "common.hxx" +#include "helper.hxx" #include "export.hxx" #include "tokens.h" #include "po.hxx" @@ -31,19 +32,6 @@ rtl::OString sInputFileName; rtl::OString sOutputFile; -namespace -{ - //Convert xmlChar* to OString - static OString lcl_xmlStrToOString( const xmlChar* pString ) - { - xmlChar* pTemp = xmlStrdup( pString ); - OString sResult = - static_cast<OString>(reinterpret_cast<sal_Char*>( pTemp )); - xmlFree( pTemp ); - return sResult; - } -} - int extractTranslations() { PoOfstream aPOStream( sOutputFile, PoOfstream::APP); @@ -73,11 +61,11 @@ int extractTranslations() for(xmlAttrPtr attribute = nodeLevel2->properties; attribute != NULL; attribute = attribute->next) { xmlChar *content = xmlNodeListGetString(res, attribute->children, 1); - vIDs.push_back(lcl_xmlStrToOString(content)); + vIDs.push_back(helper::xmlStrToOString(content)); xmlFree(content); } - OString sText = lcl_xmlStrToOString(xmlNodeGetContent(nodeLevel2)); - Export::writePoEntry( + OString sText = helper::xmlStrToOString(xmlNodeGetContent(nodeLevel2)); + common::writePoEntry( "Uiex", aPOStream, sInputFileName, vIDs[0], (vIDs.size()>=2) ? vIDs[1] : OString(), (vIDs.size()>=3) ? vIDs[2] : OString(), @@ -99,50 +87,6 @@ int extractTranslations() namespace { - rtl::OString QuotHTML(const rtl::OString &rString) - { - rtl::OStringBuffer sReturn; - for (sal_Int32 i = 0; i < rString.getLength(); ++i) { - switch (rString[i]) { - case '\\': - if (i < rString.getLength()) { - switch (rString[i + 1]) { - case '"': - case '<': - case '>': - case '\\': - ++i; - break; - } - } - // fall through - default: - sReturn.append(rString[i]); - break; - - case '<': - sReturn.append("<"); - break; - - case '>': - sReturn.append(">"); - break; - - case '"': - sReturn.append("""); - break; - - case '&': - if (rString.matchL(RTL_CONSTASCII_STRINGPARAM("&"), i)) - sReturn.append('&'); - else - sReturn.append(RTL_CONSTASCII_STRINGPARAM("&")); - break; - } - } - return sReturn.makeStringAndClear(); - } - bool lcl_MergeLang( const MergeDataHashMap &rMap, const rtl::OString &rLanguage, @@ -172,7 +116,7 @@ namespace aDestination << " <e " << "g=\"" << aI->second->sGID.getStr() << "\" " << "i=\"" << aI->second->sLID.getStr() << "\">" - << QuotHTML(sOut).getStr() << "</e>\n"; + << helper::QuotHTML(sOut).getStr() << "</e>\n"; } aDestination << "</t>"; @@ -240,10 +184,10 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) { int nRetValue = 0; - HandledArgs aArgs; - if ( !Export::handleArguments(argc, argv, aArgs) ) + common::HandledArgs aArgs; + if ( !common::handleArguments(argc, argv, aArgs) ) { - Export::writeUsage("uiex","*.ui"); + common::writeUsage("uiex","*.ui"); return 1; } diff --git a/l10ntools/source/xmlparse.cxx b/l10ntools/source/xmlparse.cxx index f91cc1eb7c26..8ba715d48f62 100644 --- a/l10ntools/source/xmlparse.cxx +++ b/l10ntools/source/xmlparse.cxx @@ -16,7 +16,6 @@ * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ - #include "sal/config.h" #include <iterator> /* std::iterator*/ @@ -24,12 +23,14 @@ #include <stdio.h> #include <sal/alloca.h> +#include "helper.hxx" #include "common.hxx" #include "xmlparse.hxx" #include <fstream> #include <iostream> #include <osl/mutex.hxx> #include <osl/thread.hxx> +#include <osl/process.h> #include <rtl/strbuf.hxx> using namespace std; @@ -868,6 +869,32 @@ XMLDefault& XMLDefault::operator=(const XMLDefault& obj){ #define XML_CHAR_TO_OUSTRING(x) OStringToOUString(OString(x), RTL_TEXTENCODING_UTF8) #define XML_CHAR_N_TO_OUSTRING(x,n) OStringToOUString(OString(x,n), RTL_TEXTENCODING_UTF8 ) +namespace +{ + +static OUString lcl_pathnameToAbsoluteUrl(const OUString& rPathname) { + OUString sUrl; + if (osl::FileBase::getFileURLFromSystemPath(rPathname, sUrl) + != osl::FileBase::E_None) + { + std::cerr << "Error: Cannot convert input pathname to URL\n"; + std::exit(EXIT_FAILURE); + } + OUString sCwd; + if (osl_getProcessWorkingDir(&sCwd.pData) != osl_Process_E_None) { + std::cerr << "Error: Cannot determine cwd\n"; + std::exit(EXIT_FAILURE); + } + if (osl::FileBase::getAbsoluteFileURL(sCwd, sUrl, sUrl) + != osl::FileBase::E_None) + { + std::cerr << "Error: Cannot convert input URL to absolute URL\n"; + std::exit(EXIT_FAILURE); + } + return sUrl; +} +} + /*****************************************************************************/ SimpleXMLParser::SimpleXMLParser() @@ -1008,7 +1035,7 @@ XMLFile *SimpleXMLParser::Execute( const rtl::OUString &rFileName, XMLFile* pXML aErrorInformation.sMessage = rtl::OUString( "ERROR: Unable to open file "); aErrorInformation.sMessage += rFileName; - rtl::OUString aFileURL(common::pathnameToAbsoluteUrl(rFileName)); + rtl::OUString aFileURL(lcl_pathnameToAbsoluteUrl(rFileName)); oslFileHandle h; if (osl_openFile(aFileURL.pData, &h, osl_File_OpenFlag_Read) @@ -1145,50 +1172,11 @@ XMLFile *SimpleXMLParser::Execute( const rtl::OUString &rFileName, XMLFile* pXML return pXMLFile; } -/*****************************************************************************/ -void XMLUtil::QuotHTML( rtl::OUString &rString ) -/*****************************************************************************/ -{ - OUStringBuffer sReturn; - for (sal_Int32 i = 0; i < rString.getLength(); ++i) { - switch (rString[i]) { - case '\\': - if (i < rString.getLength()) { - switch (rString[i + 1]) { - case '"': - case '<': - case '>': - case '\\': - ++i; - break; - } - } - // fall through - default: - sReturn.append(rString[i]); - break; - - case '<': - sReturn.appendAscii(RTL_CONSTASCII_STRINGPARAM("<")); - break; - case '>': - sReturn.appendAscii(RTL_CONSTASCII_STRINGPARAM(">")); - break; - - case '"': - sReturn.appendAscii(RTL_CONSTASCII_STRINGPARAM(""")); - break; - - case '&': - if (rString.matchAsciiL(RTL_CONSTASCII_STRINGPARAM("&"), i)) - sReturn.append('&'); - else - sReturn.appendAscii(RTL_CONSTASCII_STRINGPARAM("&")); - break; - } - } - rString = sReturn.makeStringAndClear(); +void XMLUtil::QuotHTML( OUString &rString ) +{ + const OString sString(OUStringToOString(rString, RTL_TEXTENCODING_UTF8)); + rString = OStringToOUString(helper::QuotHTML( sString ), RTL_TEXTENCODING_UTF8); } void XMLUtil::UnQuotHTML( rtl::OUString &rString ){ diff --git a/l10ntools/source/xrmmerge.cxx b/l10ntools/source/xrmmerge.cxx index ed0896e038be..d531db496ca1 100644 --- a/l10ntools/source/xrmmerge.cxx +++ b/l10ntools/source/xrmmerge.cxx @@ -25,6 +25,7 @@ #include "common.hxx" #include "export.hxx" +#include "po.hxx" #include "xrmmerge.hxx" #include "tokens.h" #include "helper.hxx" @@ -59,8 +60,8 @@ extern char *GetOutputFile( int argc, char* argv[]) bDisplayName = sal_False; bExtensionDescription = sal_False; - HandledArgs aArgs; - if ( Export::handleArguments(argc, argv, aArgs) ) + common::HandledArgs aArgs; + if ( common::handleArguments(argc, argv, aArgs) ) { // command line is valid bMergeMode = aArgs.m_bMergeMode; @@ -75,7 +76,7 @@ extern char *GetOutputFile( int argc, char* argv[]) else { // command line is not valid - Export::writeUsage("xrmex","*.xrm/*.xml"); + common::writeUsage("xrmex","*.xrm/*.xml"); return NULL; } } @@ -421,7 +422,7 @@ void XRMResExport::EndOfText( pResData->sText[sCur].replaceAll("\x0A", rtl::OString())); if( !sAct.isEmpty() ) - Export::writePoEntry( + common::writePoEntry( "Xrmex", pOutputStream, sPath, sResourceType, pResData->sGId, OString(), OString(), sAct ); } @@ -565,7 +566,7 @@ void XRMResMerge::WorkOnText( PFormEntrys *pEntrys = pMergeDataFile->GetPFormEntrys( pResData ); if ( pEntrys ) { rtl::OString sContent; - if ( Export::isAllowed( sLang ) && + if ( !sLang.equalsIgnoreAsciiCase("en-US") && ( pEntrys->GetText( sContent, STRING_TYP_TEXT, sLang )) && ( sContent != "-" ) && !sContent.isEmpty() && |