13cd96b95SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 33cd96b95SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 43cd96b95SAndrew Rist * or more contributor license agreements. See the NOTICE file 53cd96b95SAndrew Rist * distributed with this work for additional information 63cd96b95SAndrew Rist * regarding copyright ownership. The ASF licenses this file 73cd96b95SAndrew Rist * to you under the Apache License, Version 2.0 (the 83cd96b95SAndrew Rist * "License"); you may not use this file except in compliance 93cd96b95SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 113cd96b95SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 133cd96b95SAndrew Rist * Unless required by applicable law or agreed to in writing, 143cd96b95SAndrew Rist * software distributed under the License is distributed on an 153cd96b95SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 163cd96b95SAndrew Rist * KIND, either express or implied. See the License for the 173cd96b95SAndrew Rist * specific language governing permissions and limitations 183cd96b95SAndrew Rist * under the License. 19cdf0e10cSrcweir * 203cd96b95SAndrew Rist *************************************************************/ 213cd96b95SAndrew Rist 223cd96b95SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_l10ntools.hxx" 26cdf0e10cSrcweir #include <stdio.h> 27cdf0e10cSrcweir #include <tools/string.hxx> 28cdf0e10cSrcweir #include <tools/fsys.hxx> 29cdf0e10cSrcweir 30cdf0e10cSrcweir // local includes 31cdf0e10cSrcweir #include "export.hxx" 32cdf0e10cSrcweir #include "xrmmerge.hxx" 33cdf0e10cSrcweir #include "utf8conv.hxx" 34cdf0e10cSrcweir #include "tokens.h" 35cdf0e10cSrcweir #include <iostream> 36cdf0e10cSrcweir #include <vector> 37cdf0e10cSrcweir 38cdf0e10cSrcweir using namespace std; 39cdf0e10cSrcweir 40cdf0e10cSrcweir extern "C" { int yyerror( char * ); } 41cdf0e10cSrcweir extern "C" { int YYWarning( char * ); } 42cdf0e10cSrcweir 43cdf0e10cSrcweir // defines to parse command line 44cdf0e10cSrcweir #define STATE_NON 0x0001 45cdf0e10cSrcweir #define STATE_INPUT 0x0002 46cdf0e10cSrcweir #define STATE_OUTPUT 0x0003 47cdf0e10cSrcweir #define STATE_PRJ 0x0004 48cdf0e10cSrcweir #define STATE_ROOT 0x0005 49cdf0e10cSrcweir #define STATE_MERGESRC 0x0006 50cdf0e10cSrcweir #define STATE_ERRORLOG 0x0007 51cdf0e10cSrcweir #define STATE_UTF8 0x000B 52cdf0e10cSrcweir #define STATE_LANGUAGES 0x000C 53cdf0e10cSrcweir #define STATE_ISOCODE99 0x000D 54cdf0e10cSrcweir 55cdf0e10cSrcweir // set of global variables 56cdf0e10cSrcweir sal_Bool bEnableExport; 57cdf0e10cSrcweir sal_Bool bMergeMode; 58cdf0e10cSrcweir sal_Bool bErrorLog; 59cdf0e10cSrcweir sal_Bool bUTF8; 60cdf0e10cSrcweir ByteString sPrj; 61cdf0e10cSrcweir ByteString sPrjRoot; 62cdf0e10cSrcweir ByteString sInputFileName; 63cdf0e10cSrcweir ByteString sActFileName; 64cdf0e10cSrcweir ByteString sOutputFile; 65cdf0e10cSrcweir ByteString sMergeSrc; 66cdf0e10cSrcweir String sUsedTempFile; 67cdf0e10cSrcweir XRMResParser *pParser = NULL; 68cdf0e10cSrcweir 69cdf0e10cSrcweir extern "C" { 70cdf0e10cSrcweir // the whole interface to lexer is in this extern "C" section 71cdf0e10cSrcweir 72cdf0e10cSrcweir /*****************************************************************************/ 73cdf0e10cSrcweir extern char *GetOutputFile( int argc, char* argv[]) 74cdf0e10cSrcweir /*****************************************************************************/ 75cdf0e10cSrcweir { 76cdf0e10cSrcweir bEnableExport = sal_False; 77cdf0e10cSrcweir bMergeMode = sal_False; 78cdf0e10cSrcweir bErrorLog = sal_True; 79cdf0e10cSrcweir bUTF8 = sal_True; 80cdf0e10cSrcweir sPrj = ""; 81cdf0e10cSrcweir sPrjRoot = ""; 82cdf0e10cSrcweir sInputFileName = ""; 83cdf0e10cSrcweir sActFileName = ""; 84cdf0e10cSrcweir Export::sLanguages = ""; 85cdf0e10cSrcweir sal_uInt16 nState = STATE_NON; 86cdf0e10cSrcweir sal_Bool bInput = sal_False; 87cdf0e10cSrcweir 88cdf0e10cSrcweir // parse command line 89cdf0e10cSrcweir for( int i = 1; i < argc; i++ ) { 90cdf0e10cSrcweir if ( ByteString( argv[ i ] ).ToUpperAscii() == "-I" ) { 91cdf0e10cSrcweir nState = STATE_INPUT; // next token specifies source file 92cdf0e10cSrcweir } 93cdf0e10cSrcweir else if ( ByteString( argv[ i ] ).ToUpperAscii() == "-O" ) { 94cdf0e10cSrcweir nState = STATE_OUTPUT; // next token specifies the dest file 95cdf0e10cSrcweir } 96cdf0e10cSrcweir else if ( ByteString( argv[ i ] ).ToUpperAscii() == "-P" ) { 97cdf0e10cSrcweir nState = STATE_PRJ; // next token specifies the cur. project 98cdf0e10cSrcweir } 99cdf0e10cSrcweir else if ( ByteString( argv[ i ] ).ToUpperAscii() == "-R" ) { 100cdf0e10cSrcweir nState = STATE_ROOT; // next token specifies path to project root 101cdf0e10cSrcweir } 102cdf0e10cSrcweir else if ( ByteString( argv[ i ] ).ToUpperAscii() == "-M" ) { 103cdf0e10cSrcweir nState = STATE_MERGESRC; // next token specifies the merge database 104cdf0e10cSrcweir } 105cdf0e10cSrcweir else if ( ByteString( argv[ i ] ).ToUpperAscii() == "-E" ) { 106cdf0e10cSrcweir nState = STATE_ERRORLOG; 107cdf0e10cSrcweir bErrorLog = sal_False; 108cdf0e10cSrcweir } 109cdf0e10cSrcweir else if ( ByteString( argv[ i ] ).ToUpperAscii() == "-UTF8" ) { 110cdf0e10cSrcweir nState = STATE_UTF8; 111cdf0e10cSrcweir bUTF8 = sal_True; 112cdf0e10cSrcweir } 113cdf0e10cSrcweir else if ( ByteString( argv[ i ] ).ToUpperAscii() == "-NOUTF8" ) { 114cdf0e10cSrcweir nState = STATE_UTF8; 115cdf0e10cSrcweir bUTF8 = sal_False; 116cdf0e10cSrcweir } 117cdf0e10cSrcweir else if ( ByteString( argv[ i ] ).ToUpperAscii() == "-L" ) { 118cdf0e10cSrcweir nState = STATE_LANGUAGES; 119cdf0e10cSrcweir } 120cdf0e10cSrcweir else if ( ByteString( argv[ i ] ).ToUpperAscii() == "-ISO99" ) { 121cdf0e10cSrcweir nState = STATE_ISOCODE99; 122cdf0e10cSrcweir } 123cdf0e10cSrcweir else { 124cdf0e10cSrcweir switch ( nState ) { 125cdf0e10cSrcweir case STATE_NON: { 126cdf0e10cSrcweir return NULL; // no valid command line 127cdf0e10cSrcweir } 128cdf0e10cSrcweir case STATE_INPUT: { 129cdf0e10cSrcweir sInputFileName = argv[ i ]; 130cdf0e10cSrcweir bInput = sal_True; // source file found 131cdf0e10cSrcweir } 132cdf0e10cSrcweir break; 133cdf0e10cSrcweir case STATE_OUTPUT: { 134cdf0e10cSrcweir sOutputFile = argv[ i ]; // the dest. file 135cdf0e10cSrcweir } 136cdf0e10cSrcweir break; 137cdf0e10cSrcweir case STATE_PRJ: { 138cdf0e10cSrcweir sPrj = ByteString( argv[ i ]); 139cdf0e10cSrcweir } 140cdf0e10cSrcweir break; 141cdf0e10cSrcweir case STATE_ROOT: { 142cdf0e10cSrcweir sPrjRoot = ByteString( argv[ i ]); // path to project root 143cdf0e10cSrcweir } 144cdf0e10cSrcweir break; 145cdf0e10cSrcweir case STATE_MERGESRC: { 146cdf0e10cSrcweir sMergeSrc = ByteString( argv[ i ]); 147cdf0e10cSrcweir bMergeMode = sal_True; // activate merge mode, cause merge database found 148cdf0e10cSrcweir } 149cdf0e10cSrcweir break; 150cdf0e10cSrcweir case STATE_LANGUAGES: { 151cdf0e10cSrcweir Export::sLanguages = ByteString( argv[ i ]); 152cdf0e10cSrcweir } 153cdf0e10cSrcweir break; 154cdf0e10cSrcweir } 155cdf0e10cSrcweir } 156cdf0e10cSrcweir } 157cdf0e10cSrcweir 158cdf0e10cSrcweir if ( bInput ) { 159cdf0e10cSrcweir // command line is valid 160cdf0e10cSrcweir bEnableExport = sal_True; 161cdf0e10cSrcweir char *pReturn = new char[ sOutputFile.Len() + 1 ]; 162cdf0e10cSrcweir strcpy( pReturn, sOutputFile.GetBuffer()); // #100211# - checked 163cdf0e10cSrcweir return pReturn; 164cdf0e10cSrcweir } 165cdf0e10cSrcweir 166cdf0e10cSrcweir // command line is not valid 167cdf0e10cSrcweir return NULL; 168cdf0e10cSrcweir } 169cdf0e10cSrcweir void removeTempFile(){ 170cdf0e10cSrcweir if( !sUsedTempFile.EqualsIgnoreCaseAscii( "" ) ){ 171cdf0e10cSrcweir DirEntry aTempFile( sUsedTempFile ); 172cdf0e10cSrcweir aTempFile.Kill(); 173cdf0e10cSrcweir } 174cdf0e10cSrcweir } 175cdf0e10cSrcweir /*****************************************************************************/ 176cdf0e10cSrcweir int InitXrmExport( char *pOutput , char* pFilename) 177cdf0e10cSrcweir /*****************************************************************************/ 178cdf0e10cSrcweir { 179cdf0e10cSrcweir // instanciate Export 180cdf0e10cSrcweir ByteString sOutput( pOutput ); 181cdf0e10cSrcweir ByteString sFilename( pFilename ); 182cdf0e10cSrcweir Export::InitLanguages( false ); 183cdf0e10cSrcweir 184cdf0e10cSrcweir if ( bMergeMode ) 185cdf0e10cSrcweir pParser = new XRMResMerge( sMergeSrc, sOutputFile, sFilename ); 186cdf0e10cSrcweir else if ( sOutputFile.Len()) { 187cdf0e10cSrcweir pParser = new XRMResExport( sOutputFile, sPrj, sActFileName ); 188cdf0e10cSrcweir } 189cdf0e10cSrcweir 190cdf0e10cSrcweir return 1; 191cdf0e10cSrcweir } 192cdf0e10cSrcweir 193cdf0e10cSrcweir /*****************************************************************************/ 194cdf0e10cSrcweir int EndXrmExport() 195cdf0e10cSrcweir /*****************************************************************************/ 196cdf0e10cSrcweir { 197cdf0e10cSrcweir delete pParser; 198cdf0e10cSrcweir return 1; 199cdf0e10cSrcweir } 200cdf0e10cSrcweir extern const char* getFilename() 201cdf0e10cSrcweir { 202cdf0e10cSrcweir return sInputFileName.GetBuffer(); 203cdf0e10cSrcweir } 204cdf0e10cSrcweir /*****************************************************************************/ 205cdf0e10cSrcweir extern FILE *GetXrmFile() 206cdf0e10cSrcweir /*****************************************************************************/ 207cdf0e10cSrcweir { 208cdf0e10cSrcweir FILE *pFile = 0; 209cdf0e10cSrcweir // look for valid filename 210cdf0e10cSrcweir if ( sInputFileName.Len()) { 211cdf0e10cSrcweir if( Export::fileHasUTF8ByteOrderMarker( sInputFileName ) ){ 212cdf0e10cSrcweir DirEntry aTempFile = Export::GetTempFile(); 213cdf0e10cSrcweir DirEntry aSourceFile( String( sInputFileName , RTL_TEXTENCODING_ASCII_US ) ); 214cdf0e10cSrcweir aSourceFile.CopyTo( aTempFile , FSYS_ACTION_COPYFILE ); 215cdf0e10cSrcweir String sTempFile = aTempFile.GetFull(); 216cdf0e10cSrcweir Export::RemoveUTF8ByteOrderMarkerFromFile( ByteString( sTempFile , RTL_TEXTENCODING_ASCII_US ) ); 217cdf0e10cSrcweir pFile = fopen( ByteString( sTempFile , RTL_TEXTENCODING_ASCII_US ).GetBuffer(), "r" ); 218cdf0e10cSrcweir sUsedTempFile = sTempFile; 219cdf0e10cSrcweir }else{ 220cdf0e10cSrcweir // able to open file? 221cdf0e10cSrcweir pFile = fopen( sInputFileName.GetBuffer(), "r" ); 222cdf0e10cSrcweir sUsedTempFile = String::CreateFromAscii(""); 223cdf0e10cSrcweir } 224cdf0e10cSrcweir if ( !pFile ){ 225cdf0e10cSrcweir fprintf( stderr, "Error: Could not open file %s\n", 226cdf0e10cSrcweir sInputFileName.GetBuffer()); 227cdf0e10cSrcweir } 228cdf0e10cSrcweir else { 229cdf0e10cSrcweir // this is a valid file which can be opened, so 230cdf0e10cSrcweir // create path to project root 231cdf0e10cSrcweir DirEntry aEntry( String( sInputFileName, RTL_TEXTENCODING_ASCII_US )); 232cdf0e10cSrcweir aEntry.ToAbs(); 233cdf0e10cSrcweir ByteString sFullEntry( aEntry.GetFull(), RTL_TEXTENCODING_ASCII_US ); 234cdf0e10cSrcweir aEntry += DirEntry( String( "..", RTL_TEXTENCODING_ASCII_US )); 235cdf0e10cSrcweir aEntry += DirEntry( sPrjRoot ); 236cdf0e10cSrcweir ByteString sPrjEntry( aEntry.GetFull(), RTL_TEXTENCODING_ASCII_US ); 237cdf0e10cSrcweir 238*a893be29SPedro Giffuni // create file name, beginning with project root 239cdf0e10cSrcweir // (e.g.: source\ui\src\menue.src) 240cdf0e10cSrcweir sActFileName = sFullEntry.Copy( sPrjEntry.Len() + 1 ); 241cdf0e10cSrcweir 242cdf0e10cSrcweir 243cdf0e10cSrcweir sActFileName.SearchAndReplaceAll( "/", "\\" ); 244cdf0e10cSrcweir 245cdf0e10cSrcweir return pFile; 246cdf0e10cSrcweir } 247cdf0e10cSrcweir } 248cdf0e10cSrcweir // this means the file could not be opened 249cdf0e10cSrcweir return NULL; 250cdf0e10cSrcweir } 251cdf0e10cSrcweir 252cdf0e10cSrcweir /*****************************************************************************/ 253cdf0e10cSrcweir int WorkOnTokenSet( int nTyp, char *pTokenText ) 254cdf0e10cSrcweir /*****************************************************************************/ 255cdf0e10cSrcweir { 256cdf0e10cSrcweir //printf("Typ = %d , text = '%s'\n",nTyp , pTokenText ); 257cdf0e10cSrcweir pParser->Execute( nTyp, pTokenText ); 258cdf0e10cSrcweir 259cdf0e10cSrcweir return 1; 260cdf0e10cSrcweir } 261cdf0e10cSrcweir 262cdf0e10cSrcweir /*****************************************************************************/ 263cdf0e10cSrcweir int SetError() 264cdf0e10cSrcweir /*****************************************************************************/ 265cdf0e10cSrcweir { 266cdf0e10cSrcweir pParser->SetError(); 267cdf0e10cSrcweir return 1; 268cdf0e10cSrcweir } 269cdf0e10cSrcweir } 270cdf0e10cSrcweir 271cdf0e10cSrcweir extern "C" { 272cdf0e10cSrcweir /*****************************************************************************/ 273cdf0e10cSrcweir int GetError() 274cdf0e10cSrcweir /*****************************************************************************/ 275cdf0e10cSrcweir { 276cdf0e10cSrcweir return pParser->GetError(); 277cdf0e10cSrcweir } 278cdf0e10cSrcweir } 279cdf0e10cSrcweir 280cdf0e10cSrcweir // 281cdf0e10cSrcweir // class XRMResParser 282cdf0e10cSrcweir // 283cdf0e10cSrcweir 284cdf0e10cSrcweir 285cdf0e10cSrcweir /*****************************************************************************/ 286cdf0e10cSrcweir XRMResParser::XRMResParser() 287cdf0e10cSrcweir /*****************************************************************************/ 288cdf0e10cSrcweir : bError( sal_False ), 289cdf0e10cSrcweir bText( sal_False ) 290cdf0e10cSrcweir { 291cdf0e10cSrcweir aLanguages = Export::GetLanguages(); 292cdf0e10cSrcweir } 293cdf0e10cSrcweir 294cdf0e10cSrcweir /*****************************************************************************/ 295cdf0e10cSrcweir XRMResParser::~XRMResParser() 296cdf0e10cSrcweir /*****************************************************************************/ 297cdf0e10cSrcweir { 298cdf0e10cSrcweir } 299cdf0e10cSrcweir 300cdf0e10cSrcweir /*****************************************************************************/ 301cdf0e10cSrcweir int XRMResParser::Execute( int nToken, char * pToken ) 302cdf0e10cSrcweir /*****************************************************************************/ 303cdf0e10cSrcweir { 304cdf0e10cSrcweir ByteString rToken( pToken ); 305cdf0e10cSrcweir 306cdf0e10cSrcweir switch ( nToken ) { 307cdf0e10cSrcweir case XRM_README_START: 308cdf0e10cSrcweir sLID = ""; 309cdf0e10cSrcweir sGID = GetAttribute( rToken, "name" ); 310cdf0e10cSrcweir break; 311cdf0e10cSrcweir 312cdf0e10cSrcweir case XRM_README_END: 313cdf0e10cSrcweir sGID = ""; 314cdf0e10cSrcweir break; 315cdf0e10cSrcweir 316cdf0e10cSrcweir case XRM_SECTION_START: 317cdf0e10cSrcweir sLID = ""; 318cdf0e10cSrcweir sGID += "."; 319cdf0e10cSrcweir sGID += GetAttribute( rToken, "id" ); 320cdf0e10cSrcweir //sLocalized = "1"; 321cdf0e10cSrcweir 322cdf0e10cSrcweir //sLocalized = "X:"; 323cdf0e10cSrcweir sLocalized = true; 324cdf0e10cSrcweir break; 325cdf0e10cSrcweir 326cdf0e10cSrcweir case XRM_SECTION_END: 327cdf0e10cSrcweir sGID = sGID.GetToken( 0, '.' ); 328cdf0e10cSrcweir break; 329cdf0e10cSrcweir 330cdf0e10cSrcweir case XRM_PARAGRAPH_START: 331cdf0e10cSrcweir sLID = ""; 332cdf0e10cSrcweir sGID += "."; 333cdf0e10cSrcweir sGID += GetAttribute( rToken, "id" ); 334cdf0e10cSrcweir // if ( GetAttribute( rToken, "localized" ) == "false" ) 335cdf0e10cSrcweir // sLocalized += "0"; 336cdf0e10cSrcweir // sLocalized = false; 337cdf0e10cSrcweir // else 338cdf0e10cSrcweir // sLocalized += "1"; 339cdf0e10cSrcweir sLocalized = true; 340cdf0e10cSrcweir break; 341cdf0e10cSrcweir 342cdf0e10cSrcweir case XRM_PARAGRAPH_END: { 343cdf0e10cSrcweir if ( sLID.Len()) 344cdf0e10cSrcweir EndOfText( sCurrentOpenTag, sCurrentCloseTag ); 345cdf0e10cSrcweir ByteString sTmp = sGID; 346cdf0e10cSrcweir sGID = ""; 347cdf0e10cSrcweir for ( sal_uInt16 i = 0; i + 1 < sTmp.GetTokenCount( '.' ); i++ ) { 348cdf0e10cSrcweir if ( sGID.Len()) 349cdf0e10cSrcweir sGID += "."; 350cdf0e10cSrcweir sGID += sTmp.GetToken( i, '.' ); 351cdf0e10cSrcweir } 352cdf0e10cSrcweir //sLocalized = sLocalized.Copy( 0, sLocalized.Len() - 1 ); 353cdf0e10cSrcweir } 354cdf0e10cSrcweir break; 355cdf0e10cSrcweir 356cdf0e10cSrcweir case XRM_TEXT_START:{ 357cdf0e10cSrcweir //printf("->XRM_TEXT_START\n"); 358cdf0e10cSrcweir ByteString sNewLID = GetAttribute( rToken, "id" ); 359cdf0e10cSrcweir if ( sNewLID != sLID ) { 360cdf0e10cSrcweir //EndOfText( sCurrentOpenTag, sCurrentCloseTag ); 361cdf0e10cSrcweir sLID = sNewLID; 362cdf0e10cSrcweir } 363cdf0e10cSrcweir bText = sal_True; 364cdf0e10cSrcweir sCurrentText = ""; 365cdf0e10cSrcweir sCurrentOpenTag = rToken; 366cdf0e10cSrcweir Output( rToken ); 367cdf0e10cSrcweir //printf("<-XRM_TEXT_START\n"); 368cdf0e10cSrcweir } 369cdf0e10cSrcweir break; 370cdf0e10cSrcweir 371cdf0e10cSrcweir case XRM_TEXT_END: { 372cdf0e10cSrcweir sCurrentCloseTag = rToken; 373cdf0e10cSrcweir //printf("->XRM_TEXT_END\n"); 374cdf0e10cSrcweir ByteString sLang = GetAttribute( sCurrentOpenTag, "xml:lang" ); 375cdf0e10cSrcweir WorkOnText( sCurrentOpenTag, sCurrentText ); 376cdf0e10cSrcweir Output( sCurrentText ); 377cdf0e10cSrcweir EndOfText( sCurrentOpenTag, sCurrentCloseTag );// <--- 378cdf0e10cSrcweir bText = sal_False; 379cdf0e10cSrcweir rToken = ByteString(""); 380cdf0e10cSrcweir sCurrentText = ByteString(""); 381cdf0e10cSrcweir //printf("<-XRM_TEXT_END"); 382cdf0e10cSrcweir } 383cdf0e10cSrcweir break; 384cdf0e10cSrcweir 385cdf0e10cSrcweir case XRM_LIST_START: 386cdf0e10cSrcweir sLID = ""; 387cdf0e10cSrcweir break; 388cdf0e10cSrcweir 389cdf0e10cSrcweir case XRM_LIST_END: 390cdf0e10cSrcweir if ( sLID.Len()) 391cdf0e10cSrcweir EndOfText( sCurrentOpenTag, sCurrentCloseTag ); 392cdf0e10cSrcweir break; 393cdf0e10cSrcweir 394cdf0e10cSrcweir default: 395cdf0e10cSrcweir if ( bText ) { 396cdf0e10cSrcweir sCurrentText += rToken; 397cdf0e10cSrcweir } 398cdf0e10cSrcweir break; 399cdf0e10cSrcweir } 400cdf0e10cSrcweir 401cdf0e10cSrcweir if ( !bText ) 402cdf0e10cSrcweir { 403cdf0e10cSrcweir Output( rToken ); 404cdf0e10cSrcweir } 405cdf0e10cSrcweir return 0; 406cdf0e10cSrcweir } 407cdf0e10cSrcweir 408cdf0e10cSrcweir /*****************************************************************************/ 409cdf0e10cSrcweir ByteString XRMResParser::GetAttribute( const ByteString &rToken, const ByteString &rAttribute ) 410cdf0e10cSrcweir /*****************************************************************************/ 411cdf0e10cSrcweir { 412cdf0e10cSrcweir ByteString sTmp( rToken ); 413cdf0e10cSrcweir sTmp.SearchAndReplaceAll( "\t", " " ); 414cdf0e10cSrcweir 415cdf0e10cSrcweir ByteString sSearch( " " ); 416cdf0e10cSrcweir sSearch += rAttribute; 417cdf0e10cSrcweir sSearch += "="; 418cdf0e10cSrcweir sal_uInt16 nPos = sTmp.Search( sSearch ); 419cdf0e10cSrcweir 420cdf0e10cSrcweir if ( nPos != STRING_NOTFOUND ) { 421cdf0e10cSrcweir sTmp = sTmp.Copy( nPos ); 422cdf0e10cSrcweir ByteString sId = sTmp.GetToken( 1, '\"' ); 423cdf0e10cSrcweir return sId; 424cdf0e10cSrcweir } 425cdf0e10cSrcweir return ""; 426cdf0e10cSrcweir } 427cdf0e10cSrcweir 428cdf0e10cSrcweir 429cdf0e10cSrcweir /*****************************************************************************/ 430cdf0e10cSrcweir void XRMResParser::Error( const ByteString &rError ) 431cdf0e10cSrcweir /*****************************************************************************/ 432cdf0e10cSrcweir { 433cdf0e10cSrcweir yyerror(( char * ) rError.GetBuffer()); 434cdf0e10cSrcweir } 435cdf0e10cSrcweir 436cdf0e10cSrcweir /*****************************************************************************/ 437cdf0e10cSrcweir void XRMResParser::ConvertStringToDBFormat( ByteString &rString ) 438cdf0e10cSrcweir /*****************************************************************************/ 439cdf0e10cSrcweir { 440cdf0e10cSrcweir ByteString sResult; 441cdf0e10cSrcweir do { 442cdf0e10cSrcweir sResult = rString; 443cdf0e10cSrcweir rString.EraseLeadingChars( _LF ); 444cdf0e10cSrcweir // rString.EraseLeadingChars( ' ' ); 445cdf0e10cSrcweir rString.EraseLeadingChars( '\t' ); 446cdf0e10cSrcweir // rString.EraseTrailingChars( ' ' ); 447cdf0e10cSrcweir rString.EraseTrailingChars( '\t' ); 448cdf0e10cSrcweir } while ( sResult != rString ); 449cdf0e10cSrcweir 450cdf0e10cSrcweir rString.SearchAndReplaceAll( "\t", "\\t" ); 451cdf0e10cSrcweir } 452cdf0e10cSrcweir 453cdf0e10cSrcweir /*****************************************************************************/ 454cdf0e10cSrcweir void XRMResParser::ConvertStringToXMLFormat( ByteString &rString ) 455cdf0e10cSrcweir /*****************************************************************************/ 456cdf0e10cSrcweir { 457cdf0e10cSrcweir rString.SearchAndReplaceAll( "\\t", "\t" ); 458cdf0e10cSrcweir } 459cdf0e10cSrcweir 460cdf0e10cSrcweir 461cdf0e10cSrcweir 462cdf0e10cSrcweir // 463cdf0e10cSrcweir // class XRMResOutputParser 464cdf0e10cSrcweir // 465cdf0e10cSrcweir 466cdf0e10cSrcweir /*****************************************************************************/ 467cdf0e10cSrcweir XRMResOutputParser::XRMResOutputParser ( const ByteString &rOutputFile ) 468cdf0e10cSrcweir /*****************************************************************************/ 469cdf0e10cSrcweir { 470cdf0e10cSrcweir aLanguages = Export::GetLanguages(); 471cdf0e10cSrcweir pOutputStream = 472cdf0e10cSrcweir new SvFileStream( 473cdf0e10cSrcweir String( rOutputFile, RTL_TEXTENCODING_ASCII_US ), 474cdf0e10cSrcweir STREAM_STD_WRITE | STREAM_TRUNC 475cdf0e10cSrcweir ); 476cdf0e10cSrcweir pOutputStream->SetStreamCharSet( RTL_TEXTENCODING_UTF8 ); 477cdf0e10cSrcweir if ( !pOutputStream->IsOpen()) { 478cdf0e10cSrcweir ByteString sError( "Unable to open output file: " ); 479cdf0e10cSrcweir sError += rOutputFile; 480cdf0e10cSrcweir Error( sError ); 481cdf0e10cSrcweir delete pOutputStream; 482cdf0e10cSrcweir pOutputStream = NULL; 483cdf0e10cSrcweir } 484cdf0e10cSrcweir } 485cdf0e10cSrcweir 486cdf0e10cSrcweir /*****************************************************************************/ 487cdf0e10cSrcweir XRMResOutputParser::~XRMResOutputParser() 488cdf0e10cSrcweir /*****************************************************************************/ 489cdf0e10cSrcweir { 490cdf0e10cSrcweir if ( pOutputStream ) { 491cdf0e10cSrcweir pOutputStream->Close(); 492cdf0e10cSrcweir delete pOutputStream; 493cdf0e10cSrcweir } 494cdf0e10cSrcweir } 495cdf0e10cSrcweir 496cdf0e10cSrcweir // 497cdf0e10cSrcweir // class XMLResExport 498cdf0e10cSrcweir // 499cdf0e10cSrcweir 500cdf0e10cSrcweir /*****************************************************************************/ 501cdf0e10cSrcweir XRMResExport::XRMResExport( 502cdf0e10cSrcweir const ByteString &rOutputFile, const ByteString &rProject, 503cdf0e10cSrcweir const ByteString &rFilePath ) 504cdf0e10cSrcweir /*****************************************************************************/ 505cdf0e10cSrcweir : XRMResOutputParser( rOutputFile ), 506cdf0e10cSrcweir pResData( NULL ), 507cdf0e10cSrcweir sPrj( rProject ), 508cdf0e10cSrcweir sPath( rFilePath ) 509cdf0e10cSrcweir { 510cdf0e10cSrcweir aLanguages = Export::GetLanguages(); 511cdf0e10cSrcweir } 512cdf0e10cSrcweir 513cdf0e10cSrcweir /*****************************************************************************/ 514cdf0e10cSrcweir XRMResExport::~XRMResExport() 515cdf0e10cSrcweir /*****************************************************************************/ 516cdf0e10cSrcweir { 517cdf0e10cSrcweir delete pResData; 518cdf0e10cSrcweir } 519cdf0e10cSrcweir 520cdf0e10cSrcweir void XRMResExport::Output( const ByteString& rOutput ) 521cdf0e10cSrcweir { 522cdf0e10cSrcweir // Dummy to suppress warnings caused by poor class design 523cdf0e10cSrcweir (void) rOutput; 524cdf0e10cSrcweir } 525cdf0e10cSrcweir 526cdf0e10cSrcweir /*****************************************************************************/ 527cdf0e10cSrcweir void XRMResExport::WorkOnText( 528cdf0e10cSrcweir const ByteString &rOpenTag, 529cdf0e10cSrcweir ByteString &rText 530cdf0e10cSrcweir ) 531cdf0e10cSrcweir /*****************************************************************************/ 532cdf0e10cSrcweir { 533cdf0e10cSrcweir ByteString sLang( GetAttribute( rOpenTag, "xml:lang" )); 534cdf0e10cSrcweir 535cdf0e10cSrcweir if ( !pResData ) { 536cdf0e10cSrcweir ByteString sPlatform( "" ); 537cdf0e10cSrcweir pResData = new ResData( sPlatform, GetGID() ); 538cdf0e10cSrcweir pResData->sId = GetLID(); 539cdf0e10cSrcweir } 540cdf0e10cSrcweir 541cdf0e10cSrcweir pResData->sText[ sLang ] = rText; 542cdf0e10cSrcweir ConvertStringToDBFormat( pResData->sText[ sLang ] ); 543cdf0e10cSrcweir } 544cdf0e10cSrcweir 545cdf0e10cSrcweir /*****************************************************************************/ 546cdf0e10cSrcweir void XRMResExport::EndOfText( 547cdf0e10cSrcweir const ByteString &rOpenTag, 548cdf0e10cSrcweir const ByteString &rCloseTag 549cdf0e10cSrcweir ) 550cdf0e10cSrcweir /*****************************************************************************/ 551cdf0e10cSrcweir { 552cdf0e10cSrcweir 553cdf0e10cSrcweir (void) rOpenTag; // FIXME 554cdf0e10cSrcweir (void) rCloseTag; // FIXME 555cdf0e10cSrcweir 556cdf0e10cSrcweir if ( pResData && pOutputStream ) { 557cdf0e10cSrcweir 558cdf0e10cSrcweir char cSearch = 0x00; 559cdf0e10cSrcweir ByteString sSearch( cSearch ); 560cdf0e10cSrcweir 561cdf0e10cSrcweir // if ( !pResData->sText[ ByteString("en-US") ].Len() ) 562cdf0e10cSrcweir // pResData->sText[ ByteString("en-US") ] = pResData->sText[ ByteString("de") ]; 563cdf0e10cSrcweir 564cdf0e10cSrcweir Export::FillInFallbacks( pResData ); 565cdf0e10cSrcweir 566cdf0e10cSrcweir ByteString sTimeStamp( Export::GetTimeStamp()); 567cdf0e10cSrcweir ByteString sCur; 568cdf0e10cSrcweir for( unsigned int n = 0; n < aLanguages.size(); n++ ){ 569cdf0e10cSrcweir sCur = aLanguages[ n ]; 570cdf0e10cSrcweir 571cdf0e10cSrcweir ByteString sAct = pResData->sText[ sCur ]; 572cdf0e10cSrcweir //Export::UnquotHTML( sAct ); 573cdf0e10cSrcweir sAct.EraseAllChars( 0x0A ); 574cdf0e10cSrcweir 575cdf0e10cSrcweir ByteString sOutput( sPrj ); sOutput += "\t"; 576cdf0e10cSrcweir sOutput += sPath; 577cdf0e10cSrcweir sOutput += "\t0\t"; 578cdf0e10cSrcweir sOutput += "readmeitem\t"; 579cdf0e10cSrcweir sOutput += pResData->sId; 580cdf0e10cSrcweir // USE LID AS GID OR MERGE DON'T WORK 581cdf0e10cSrcweir //sOutput += pResData->sGId; 582cdf0e10cSrcweir sOutput += "\t"; 583cdf0e10cSrcweir sOutput += pResData->sId; 584cdf0e10cSrcweir sOutput += "\t\t\t0\t"; 585cdf0e10cSrcweir sOutput += sCur; 586cdf0e10cSrcweir sOutput += "\t"; 587cdf0e10cSrcweir 588cdf0e10cSrcweir sOutput += sAct; sOutput += "\t\t\t\t"; 589cdf0e10cSrcweir sOutput += sTimeStamp; 590cdf0e10cSrcweir 591cdf0e10cSrcweir sOutput.SearchAndReplaceAll( sSearch, "_" ); 592cdf0e10cSrcweir //if( !sCur.EqualsIgnoreCaseAscii("de") ||( sCur.EqualsIgnoreCaseAscii("de") && !Export::isMergingGermanAllowed( sPrj ) ) ) 593cdf0e10cSrcweir if( sAct.Len() > 1 ) 594cdf0e10cSrcweir pOutputStream->WriteLine( sOutput ); 595cdf0e10cSrcweir } 596cdf0e10cSrcweir } 597cdf0e10cSrcweir delete pResData; 598cdf0e10cSrcweir pResData = NULL; 599cdf0e10cSrcweir } 600cdf0e10cSrcweir 601cdf0e10cSrcweir // 602cdf0e10cSrcweir // class XRMResMerge 603cdf0e10cSrcweir // 604cdf0e10cSrcweir 605cdf0e10cSrcweir /*****************************************************************************/ 606cdf0e10cSrcweir XRMResMerge::XRMResMerge( 607cdf0e10cSrcweir const ByteString &rMergeSource, const ByteString &rOutputFile, 608cdf0e10cSrcweir ByteString &rFilename) 609cdf0e10cSrcweir /*****************************************************************************/ 610cdf0e10cSrcweir : XRMResOutputParser( rOutputFile ), 611cdf0e10cSrcweir pMergeDataFile( NULL ), 612cdf0e10cSrcweir sFilename( rFilename ) , 613cdf0e10cSrcweir pResData( NULL ) 614cdf0e10cSrcweir { 615cdf0e10cSrcweir if ( rMergeSource.Len()) 616cdf0e10cSrcweir pMergeDataFile = new MergeDataFile( 617cdf0e10cSrcweir rMergeSource, sInputFileName , bErrorLog, RTL_TEXTENCODING_MS_1252);//, bUTF8 ); 618cdf0e10cSrcweir if( Export::sLanguages.EqualsIgnoreCaseAscii("ALL") ){ 619cdf0e10cSrcweir Export::SetLanguages( pMergeDataFile->GetLanguages() ); 620cdf0e10cSrcweir aLanguages = pMergeDataFile->GetLanguages(); 621cdf0e10cSrcweir } 622cdf0e10cSrcweir else aLanguages = Export::GetLanguages(); 623cdf0e10cSrcweir } 624cdf0e10cSrcweir 625cdf0e10cSrcweir /*****************************************************************************/ 626cdf0e10cSrcweir XRMResMerge::~XRMResMerge() 627cdf0e10cSrcweir /*****************************************************************************/ 628cdf0e10cSrcweir { 629cdf0e10cSrcweir delete pMergeDataFile; 630cdf0e10cSrcweir delete pResData; 631cdf0e10cSrcweir } 632cdf0e10cSrcweir 633cdf0e10cSrcweir /*****************************************************************************/ 634cdf0e10cSrcweir void XRMResMerge::WorkOnText( 635cdf0e10cSrcweir const ByteString &rOpenTag, 636cdf0e10cSrcweir ByteString &rText 637cdf0e10cSrcweir ) 638cdf0e10cSrcweir /*****************************************************************************/ 639cdf0e10cSrcweir { 640cdf0e10cSrcweir ByteString sLang( GetAttribute( rOpenTag, "xml:lang" )); 641cdf0e10cSrcweir 642cdf0e10cSrcweir if ( pMergeDataFile ) { 643cdf0e10cSrcweir if ( !pResData ) { 644cdf0e10cSrcweir ByteString sPlatform( "" ); 645cdf0e10cSrcweir // pResData = new ResData( sPlatform, GetGID() , sFilename ); 646cdf0e10cSrcweir pResData = new ResData( sPlatform, GetLID() , sFilename ); 647cdf0e10cSrcweir pResData->sId = GetLID(); 648cdf0e10cSrcweir 649cdf0e10cSrcweir pResData->sResTyp = "readmeitem"; 650cdf0e10cSrcweir } 651cdf0e10cSrcweir 652cdf0e10cSrcweir PFormEntrys *pEntrys = pMergeDataFile->GetPFormEntrys( pResData ); 653cdf0e10cSrcweir if ( pEntrys ) { 654cdf0e10cSrcweir ByteString sContent; 655cdf0e10cSrcweir if ( Export::isAllowed( sLang ) && 656cdf0e10cSrcweir ( pEntrys->GetText( 657cdf0e10cSrcweir sContent, STRING_TYP_TEXT, sLang )) && 658cdf0e10cSrcweir ( sContent != "-" ) && ( sContent.Len())) 659cdf0e10cSrcweir 660cdf0e10cSrcweir { 661cdf0e10cSrcweir rText = sContent; 662cdf0e10cSrcweir ConvertStringToXMLFormat( rText ); 663cdf0e10cSrcweir //Export::QuotHTMLXRM( rText ); 664cdf0e10cSrcweir } 665cdf0e10cSrcweir } 666cdf0e10cSrcweir } 667cdf0e10cSrcweir } 668cdf0e10cSrcweir 669cdf0e10cSrcweir /*****************************************************************************/ 670cdf0e10cSrcweir void XRMResMerge::Output( const ByteString& rOutput ) 671cdf0e10cSrcweir /*****************************************************************************/ 672cdf0e10cSrcweir { 673cdf0e10cSrcweir //printf("W: %s\n",rOutput.GetBuffer()); 674cdf0e10cSrcweir if ( pOutputStream && rOutput.Len() > 0 ) 675cdf0e10cSrcweir pOutputStream->Write( rOutput.GetBuffer(), rOutput.Len()); 676cdf0e10cSrcweir } 677cdf0e10cSrcweir 678cdf0e10cSrcweir /*****************************************************************************/ 679cdf0e10cSrcweir void XRMResMerge::EndOfText( 680cdf0e10cSrcweir const ByteString &rOpenTag, 681cdf0e10cSrcweir const ByteString &rCloseTag 682cdf0e10cSrcweir ) 683cdf0e10cSrcweir /*****************************************************************************/ 684cdf0e10cSrcweir { 685cdf0e10cSrcweir 686cdf0e10cSrcweir Output( rCloseTag ); 687cdf0e10cSrcweir if ( pMergeDataFile && pResData ) { 688cdf0e10cSrcweir PFormEntrys *pEntrys = pMergeDataFile->GetPFormEntrys( pResData ); 689cdf0e10cSrcweir if ( pEntrys ) { 690cdf0e10cSrcweir ByteString sCur; 691cdf0e10cSrcweir for( unsigned int n = 0; n < aLanguages.size(); n++ ){ 692cdf0e10cSrcweir sCur = aLanguages[ n ]; 693cdf0e10cSrcweir ByteString sContent; 694cdf0e10cSrcweir if ( !sCur.EqualsIgnoreCaseAscii("en-US") && 695cdf0e10cSrcweir ( pEntrys->GetText( 696cdf0e10cSrcweir sContent, STRING_TYP_TEXT, sCur, sal_True )) && 697cdf0e10cSrcweir ( sContent != "-" ) && ( sContent.Len())) 698cdf0e10cSrcweir { 699cdf0e10cSrcweir ByteString sText( sContent ); 700cdf0e10cSrcweir //Export::QuotHTMLXRM( sText ); 701cdf0e10cSrcweir 702cdf0e10cSrcweir ByteString sAdditionalLine( "\t" ); 703cdf0e10cSrcweir sAdditionalLine += rOpenTag; 704cdf0e10cSrcweir ByteString sSearch = "xml:lang=\""; 705cdf0e10cSrcweir ByteString sReplace( sSearch ); 706cdf0e10cSrcweir 707cdf0e10cSrcweir sSearch += GetAttribute( rOpenTag, "xml:lang" ); 708cdf0e10cSrcweir sReplace += sCur; 709cdf0e10cSrcweir 710cdf0e10cSrcweir sAdditionalLine.SearchAndReplace( sSearch, sReplace ); 711cdf0e10cSrcweir 712cdf0e10cSrcweir sAdditionalLine += sText; 713cdf0e10cSrcweir sAdditionalLine += rCloseTag; 714cdf0e10cSrcweir sAdditionalLine += "\n"; 715cdf0e10cSrcweir 716cdf0e10cSrcweir for ( sal_uInt16 i = 0; i + 1 < GetGID().GetTokenCount( '.' ); i++ ) 717cdf0e10cSrcweir sAdditionalLine += "\t"; 718cdf0e10cSrcweir 719cdf0e10cSrcweir Output( sAdditionalLine ); 720cdf0e10cSrcweir } 721cdf0e10cSrcweir } 722cdf0e10cSrcweir } 723cdf0e10cSrcweir } 724cdf0e10cSrcweir delete pResData; 725cdf0e10cSrcweir pResData = NULL; 726cdf0e10cSrcweir } 727cdf0e10cSrcweir 728