xref: /trunk/main/l10ntools/source/xrmmerge.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
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 /*****************************************************************************/
GetOutputFile(int argc,char * argv[])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 }
removeTempFile()169cdf0e10cSrcweir void removeTempFile(){
170cdf0e10cSrcweir     if( !sUsedTempFile.EqualsIgnoreCaseAscii( "" ) ){
171cdf0e10cSrcweir         DirEntry aTempFile( sUsedTempFile );
172cdf0e10cSrcweir         aTempFile.Kill();
173cdf0e10cSrcweir     }
174cdf0e10cSrcweir }
175cdf0e10cSrcweir /*****************************************************************************/
InitXrmExport(char * pOutput,char * pFilename)176cdf0e10cSrcweir int InitXrmExport( char *pOutput , char* pFilename)
177cdf0e10cSrcweir /*****************************************************************************/
178cdf0e10cSrcweir {
179*5e7dbebbSJohn Bampton     // instantiate 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 /*****************************************************************************/
EndXrmExport()194cdf0e10cSrcweir int EndXrmExport()
195cdf0e10cSrcweir /*****************************************************************************/
196cdf0e10cSrcweir {
197cdf0e10cSrcweir     delete pParser;
198cdf0e10cSrcweir     return 1;
199cdf0e10cSrcweir }
getFilename()200cdf0e10cSrcweir extern const char* getFilename()
201cdf0e10cSrcweir {
202cdf0e10cSrcweir     return sInputFileName.GetBuffer();
203cdf0e10cSrcweir }
204cdf0e10cSrcweir /*****************************************************************************/
GetXrmFile()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 
238a893be29SPedro 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 /*****************************************************************************/
WorkOnTokenSet(int nTyp,char * pTokenText)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 /*****************************************************************************/
SetError()263cdf0e10cSrcweir int SetError()
264cdf0e10cSrcweir /*****************************************************************************/
265cdf0e10cSrcweir {
266cdf0e10cSrcweir     pParser->SetError();
267cdf0e10cSrcweir     return 1;
268cdf0e10cSrcweir }
269cdf0e10cSrcweir }
270cdf0e10cSrcweir 
271cdf0e10cSrcweir extern "C" {
272cdf0e10cSrcweir /*****************************************************************************/
GetError()273cdf0e10cSrcweir int GetError()
274cdf0e10cSrcweir /*****************************************************************************/
275cdf0e10cSrcweir {
276cdf0e10cSrcweir     return pParser->GetError();
277cdf0e10cSrcweir }
278cdf0e10cSrcweir }
279cdf0e10cSrcweir 
280cdf0e10cSrcweir //
281cdf0e10cSrcweir // class XRMResParser
282cdf0e10cSrcweir //
283cdf0e10cSrcweir 
284cdf0e10cSrcweir 
285cdf0e10cSrcweir /*****************************************************************************/
XRMResParser()286cdf0e10cSrcweir XRMResParser::XRMResParser()
287cdf0e10cSrcweir /*****************************************************************************/
288cdf0e10cSrcweir                 : bError( sal_False ),
289cdf0e10cSrcweir                 bText( sal_False )
290cdf0e10cSrcweir {
291cdf0e10cSrcweir     aLanguages = Export::GetLanguages();
292cdf0e10cSrcweir }
293cdf0e10cSrcweir 
294cdf0e10cSrcweir /*****************************************************************************/
~XRMResParser()295cdf0e10cSrcweir XRMResParser::~XRMResParser()
296cdf0e10cSrcweir /*****************************************************************************/
297cdf0e10cSrcweir {
298cdf0e10cSrcweir }
299cdf0e10cSrcweir 
300cdf0e10cSrcweir /*****************************************************************************/
Execute(int nToken,char * pToken)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 /*****************************************************************************/
GetAttribute(const ByteString & rToken,const ByteString & rAttribute)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 /*****************************************************************************/
Error(const ByteString & rError)430cdf0e10cSrcweir void XRMResParser::Error( const ByteString &rError )
431cdf0e10cSrcweir /*****************************************************************************/
432cdf0e10cSrcweir {
433cdf0e10cSrcweir     yyerror(( char * ) rError.GetBuffer());
434cdf0e10cSrcweir }
435cdf0e10cSrcweir 
436cdf0e10cSrcweir /*****************************************************************************/
ConvertStringToDBFormat(ByteString & rString)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 /*****************************************************************************/
ConvertStringToXMLFormat(ByteString & rString)454cdf0e10cSrcweir void XRMResParser::ConvertStringToXMLFormat( ByteString &rString )
455cdf0e10cSrcweir /*****************************************************************************/
456cdf0e10cSrcweir {
457cdf0e10cSrcweir     rString.SearchAndReplaceAll( "\\t", "\t" );
458cdf0e10cSrcweir }
459cdf0e10cSrcweir 
460cdf0e10cSrcweir 
461cdf0e10cSrcweir 
462cdf0e10cSrcweir //
463cdf0e10cSrcweir // class XRMResOutputParser
464cdf0e10cSrcweir //
465cdf0e10cSrcweir 
466cdf0e10cSrcweir /*****************************************************************************/
XRMResOutputParser(const ByteString & rOutputFile)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 /*****************************************************************************/
~XRMResOutputParser()487cdf0e10cSrcweir XRMResOutputParser::~XRMResOutputParser()
488cdf0e10cSrcweir /*****************************************************************************/
489cdf0e10cSrcweir {
490cdf0e10cSrcweir     if ( pOutputStream ) {
491cdf0e10cSrcweir         pOutputStream->Close();
492cdf0e10cSrcweir         delete pOutputStream;
493cdf0e10cSrcweir     }
494cdf0e10cSrcweir }
495cdf0e10cSrcweir 
496cdf0e10cSrcweir //
497cdf0e10cSrcweir // class XMLResExport
498cdf0e10cSrcweir //
499cdf0e10cSrcweir 
500cdf0e10cSrcweir /*****************************************************************************/
XRMResExport(const ByteString & rOutputFile,const ByteString & rProject,const ByteString & rFilePath)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 /*****************************************************************************/
~XRMResExport()514cdf0e10cSrcweir XRMResExport::~XRMResExport()
515cdf0e10cSrcweir /*****************************************************************************/
516cdf0e10cSrcweir {
517cdf0e10cSrcweir     delete pResData;
518cdf0e10cSrcweir }
519cdf0e10cSrcweir 
Output(const ByteString & rOutput)520cdf0e10cSrcweir void XRMResExport::Output( const ByteString& rOutput )
521cdf0e10cSrcweir {
522cdf0e10cSrcweir     // Dummy to suppress warnings caused by poor class design
523cdf0e10cSrcweir     (void) rOutput;
524cdf0e10cSrcweir }
525cdf0e10cSrcweir 
526cdf0e10cSrcweir /*****************************************************************************/
WorkOnText(const ByteString & rOpenTag,ByteString & rText)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 /*****************************************************************************/
EndOfText(const ByteString & rOpenTag,const ByteString & rCloseTag)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 /*****************************************************************************/
XRMResMerge(const ByteString & rMergeSource,const ByteString & rOutputFile,ByteString & rFilename)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 /*****************************************************************************/
~XRMResMerge()626cdf0e10cSrcweir XRMResMerge::~XRMResMerge()
627cdf0e10cSrcweir /*****************************************************************************/
628cdf0e10cSrcweir {
629cdf0e10cSrcweir     delete pMergeDataFile;
630cdf0e10cSrcweir     delete pResData;
631cdf0e10cSrcweir }
632cdf0e10cSrcweir 
633cdf0e10cSrcweir /*****************************************************************************/
WorkOnText(const ByteString & rOpenTag,ByteString & rText)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 /*****************************************************************************/
Output(const ByteString & rOutput)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 /*****************************************************************************/
EndOfText(const ByteString & rOpenTag,const ByteString & rCloseTag)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 }
727