xref: /AOO41X/main/l10ntools/source/xrmmerge.cxx (revision 3cd96b95fb0ad23ccdd883f9b15a685c459d45ca)
1*3cd96b95SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*3cd96b95SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*3cd96b95SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*3cd96b95SAndrew Rist  * distributed with this work for additional information
6*3cd96b95SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*3cd96b95SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*3cd96b95SAndrew Rist  * "License"); you may not use this file except in compliance
9*3cd96b95SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*3cd96b95SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*3cd96b95SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*3cd96b95SAndrew Rist  * software distributed under the License is distributed on an
15*3cd96b95SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*3cd96b95SAndrew Rist  * KIND, either express or implied.  See the License for the
17*3cd96b95SAndrew Rist  * specific language governing permissions and limitations
18*3cd96b95SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*3cd96b95SAndrew Rist  *************************************************************/
21*3cd96b95SAndrew Rist 
22*3cd96b95SAndrew 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 {
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 /*****************************************************************************/
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 
238cdf0e10cSrcweir 			// create file name, beginnig 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 }
727cdf0e10cSrcweir 
728