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