You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by ja...@apache.org on 2013/01/24 13:21:39 UTC

svn commit: r1437973 [11/11] - in /openoffice/branches/l10n/main/l10ntools/source: ./ filter/ filter/merge/ filter/utils/ help/

Added: openoffice/branches/l10n/main/l10ntools/source/xrmmerge.cxx
URL: http://svn.apache.org/viewvc/openoffice/branches/l10n/main/l10ntools/source/xrmmerge.cxx?rev=1437973&view=auto
==============================================================================
--- openoffice/branches/l10n/main/l10ntools/source/xrmmerge.cxx (added)
+++ openoffice/branches/l10n/main/l10ntools/source/xrmmerge.cxx Thu Jan 24 12:21:38 2013
@@ -0,0 +1,727 @@
+/**************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ *************************************************************/
+
+
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_l10ntools.hxx"
+#include <stdio.h>
+#include <tools/string.hxx>
+#include <tools/fsys.hxx>
+
+// local includes
+#include "export.hxx"
+#include "xrmmerge.hxx"
+#include "utf8conv.hxx"
+#include "tokens.h"
+#include <iostream>
+#include <vector>
+
+using namespace std;
+
+extern "C" { int yyerror( char * ); }
+extern "C" { int YYWarning( char * ); }
+
+// defines to parse command line
+#define STATE_NON  		0x0001
+#define STATE_INPUT		0x0002
+#define STATE_OUTPUT	0x0003
+#define STATE_PRJ		0x0004
+#define STATE_ROOT		0x0005
+#define STATE_MERGESRC	0x0006
+#define STATE_ERRORLOG	0x0007
+#define STATE_UTF8		0x000B
+#define STATE_LANGUAGES	0x000C
+#define STATE_ISOCODE99	0x000D
+
+// set of global variables
+sal_Bool bEnableExport;
+sal_Bool bMergeMode;
+sal_Bool bErrorLog;
+sal_Bool bUTF8;
+ByteString sPrj;
+ByteString sPrjRoot;
+ByteString sInputFileName;
+ByteString sActFileName;
+ByteString sOutputFile;
+ByteString sMergeSrc;
+String sUsedTempFile;
+XRMResParser *pParser = NULL;
+
+extern "C" {
+// the whole interface to lexer is in this extern "C" section
+
+/*****************************************************************************/
+extern char *GetOutputFile( int argc, char* argv[])
+/*****************************************************************************/
+{
+	bEnableExport = sal_False;
+	bMergeMode = sal_False;
+	bErrorLog = sal_True;
+	bUTF8 = sal_True;
+	sPrj = "";
+	sPrjRoot = "";
+	sInputFileName = "";
+	sActFileName = "";
+	Export::sLanguages = "";
+	sal_uInt16 nState = STATE_NON;
+	sal_Bool bInput = sal_False;
+
+	// parse command line
+	for( int i = 1; i < argc; i++ ) {
+		if ( ByteString( argv[ i ] ).ToUpperAscii() == "-I" ) {
+			nState = STATE_INPUT; // next token specifies source file
+		}
+		else if ( ByteString( argv[ i ] ).ToUpperAscii() == "-O" ) {
+			nState = STATE_OUTPUT; // next token specifies the dest file
+		}
+		else if ( ByteString( argv[ i ] ).ToUpperAscii() == "-P" ) {
+			nState = STATE_PRJ; // next token specifies the cur. project
+		}
+		else if ( ByteString( argv[ i ] ).ToUpperAscii() == "-R" ) {
+			nState = STATE_ROOT; // next token specifies path to project root
+		}
+		else if ( ByteString( argv[ i ] ).ToUpperAscii() == "-M" ) {
+			nState = STATE_MERGESRC; // next token specifies the merge database
+		}
+        else if ( ByteString( argv[ i ] ).ToUpperAscii() == "-E" ) {
+			nState = STATE_ERRORLOG;
+			bErrorLog = sal_False;
+		}
+		else if ( ByteString( argv[ i ] ).ToUpperAscii() == "-UTF8" ) {
+			nState = STATE_UTF8;
+			bUTF8 = sal_True;
+		}
+		else if ( ByteString( argv[ i ] ).ToUpperAscii() == "-NOUTF8" ) {
+			nState = STATE_UTF8;
+			bUTF8 = sal_False;
+		}
+		else if ( ByteString( argv[ i ] ).ToUpperAscii() == "-L" ) {
+			nState = STATE_LANGUAGES;
+		}
+		else if ( ByteString( argv[ i ] ).ToUpperAscii() == "-ISO99" ) {
+			nState = STATE_ISOCODE99;
+		}
+		else {
+			switch ( nState ) {
+				case STATE_NON: {
+					return NULL;	// no valid command line
+				}
+				case STATE_INPUT: {
+					sInputFileName = argv[ i ];
+					bInput = sal_True; // source file found
+				}
+				break;
+				case STATE_OUTPUT: {
+					sOutputFile = argv[ i ]; // the dest. file
+				}
+				break;
+				case STATE_PRJ: {
+					sPrj = ByteString( argv[ i ]);
+				}
+				break;
+				case STATE_ROOT: {
+					sPrjRoot = ByteString( argv[ i ]); // path to project root
+				}
+				break;
+				case STATE_MERGESRC: {
+					sMergeSrc = ByteString( argv[ i ]);
+					bMergeMode = sal_True; // activate merge mode, cause merge database found
+				}
+				break;
+				case STATE_LANGUAGES: {
+					Export::sLanguages = ByteString( argv[ i ]);
+				}
+				break;
+			}
+		}
+	}
+
+	if ( bInput ) {
+		// command line is valid
+		bEnableExport = sal_True;
+		char *pReturn = new char[ sOutputFile.Len() + 1 ];
+		strcpy( pReturn, sOutputFile.GetBuffer());  // #100211# - checked
+		return pReturn;
+	}
+
+	// command line is not valid
+	return NULL;
+}
+void removeTempFile(){
+    if( !sUsedTempFile.EqualsIgnoreCaseAscii( "" ) ){
+        DirEntry aTempFile( sUsedTempFile );
+        aTempFile.Kill();
+    }
+}
+/*****************************************************************************/
+int InitXrmExport( char *pOutput , char* pFilename)
+/*****************************************************************************/
+{
+	// instanciate Export
+	ByteString sOutput( pOutput );
+	ByteString sFilename( pFilename );
+    Export::InitLanguages( false );
+ 
+	if ( bMergeMode )
+        pParser = new XRMResMerge( sMergeSrc, sOutputFile, sFilename );
+  	else if ( sOutputFile.Len()) {
+		pParser = new XRMResExport( sOutputFile, sPrj, sActFileName );
+	}
+
+	return 1;
+}
+
+/*****************************************************************************/
+int EndXrmExport()
+/*****************************************************************************/
+{
+	delete pParser;
+	return 1;
+}
+extern const char* getFilename()
+{
+	return sInputFileName.GetBuffer();
+}
+/*****************************************************************************/
+extern FILE *GetXrmFile()
+/*****************************************************************************/
+{
+    FILE *pFile = 0;
+    // look for valid filename
+	if ( sInputFileName.Len()) {
+        if( Export::fileHasUTF8ByteOrderMarker( sInputFileName ) ){
+            DirEntry aTempFile = Export::GetTempFile();
+            DirEntry aSourceFile( String( sInputFileName , RTL_TEXTENCODING_ASCII_US ) );
+            aSourceFile.CopyTo( aTempFile , FSYS_ACTION_COPYFILE );
+            String sTempFile = aTempFile.GetFull();
+            Export::RemoveUTF8ByteOrderMarkerFromFile( ByteString( sTempFile , RTL_TEXTENCODING_ASCII_US ) );
+            pFile = fopen( ByteString( sTempFile , RTL_TEXTENCODING_ASCII_US ).GetBuffer(), "r" );
+            sUsedTempFile = sTempFile;
+        }else{
+		    // able to open file?
+		    pFile = fopen( sInputFileName.GetBuffer(), "r" );
+            sUsedTempFile = String::CreateFromAscii("");
+        }
+		if ( !pFile ){
+			fprintf( stderr, "Error: Could not open file %s\n",
+				sInputFileName.GetBuffer());
+        }
+        else {
+			// this is a valid file which can be opened, so
+			// create path to project root
+			DirEntry aEntry( String( sInputFileName, RTL_TEXTENCODING_ASCII_US ));
+			aEntry.ToAbs();
+			ByteString sFullEntry( aEntry.GetFull(), RTL_TEXTENCODING_ASCII_US );
+			aEntry += DirEntry( String( "..", RTL_TEXTENCODING_ASCII_US ));
+			aEntry += DirEntry( sPrjRoot );
+			ByteString sPrjEntry( aEntry.GetFull(), RTL_TEXTENCODING_ASCII_US );
+
+			// create file name, beginnig with project root
+			// (e.g.: source\ui\src\menue.src)
+			sActFileName = sFullEntry.Copy( sPrjEntry.Len() + 1 );
+
+
+			sActFileName.SearchAndReplaceAll( "/", "\\" );
+
+			return pFile;
+		}
+	}
+	// this means the file could not be opened
+	return NULL;
+}
+
+/*****************************************************************************/
+int WorkOnTokenSet( int nTyp, char *pTokenText )
+/*****************************************************************************/
+{
+	//printf("Typ = %d , text = '%s'\n",nTyp , pTokenText );
+    pParser->Execute( nTyp, pTokenText );
+
+	return 1;
+}
+
+/*****************************************************************************/
+int SetError()
+/*****************************************************************************/
+{
+	pParser->SetError();
+	return 1;
+}
+}
+
+extern "C" {
+/*****************************************************************************/
+int GetError()
+/*****************************************************************************/
+{
+	return pParser->GetError();
+}
+}
+
+//
+// class XRMResParser
+//
+
+
+/*****************************************************************************/
+XRMResParser::XRMResParser()
+/*****************************************************************************/
+				: bError( sal_False ),
+		        bText( sal_False )
+{
+    aLanguages = Export::GetLanguages();
+}
+
+/*****************************************************************************/
+XRMResParser::~XRMResParser()
+/*****************************************************************************/
+{
+}
+
+/*****************************************************************************/
+int XRMResParser::Execute( int nToken, char * pToken )
+/*****************************************************************************/
+{
+	ByteString rToken( pToken );
+
+	switch ( nToken ) {
+		case XRM_README_START:
+			sLID = "";
+			sGID = GetAttribute( rToken, "name" );
+		break;
+
+		case XRM_README_END:
+			sGID = "";
+		break;
+
+		case XRM_SECTION_START:
+			sLID = "";
+			sGID += ".";
+			sGID += GetAttribute( rToken, "id" );
+			//sLocalized = "1";
+            
+            //sLocalized = "X:";
+            sLocalized = true;
+		break;
+
+		case XRM_SECTION_END:
+			sGID = sGID.GetToken( 0, '.' );
+			break;
+
+		case XRM_PARAGRAPH_START:
+			sLID = "";
+			sGID += ".";
+			sGID += GetAttribute( rToken, "id" );
+//			if ( GetAttribute( rToken, "localized" ) == "false" )
+//				sLocalized += "0";
+//                sLocalized = false;
+//			else
+//				sLocalized += "1";
+                sLocalized = true;				
+		break;
+
+		case XRM_PARAGRAPH_END: {
+			if ( sLID.Len())
+				EndOfText( sCurrentOpenTag, sCurrentCloseTag );
+			ByteString sTmp = sGID;
+			sGID = "";
+			for ( sal_uInt16 i = 0; i + 1 < sTmp.GetTokenCount( '.' ); i++ ) {
+				if ( sGID.Len())
+					sGID += ".";
+				sGID += sTmp.GetToken( i, '.' );
+			}
+			//sLocalized = sLocalized.Copy( 0, sLocalized.Len() - 1 );
+	   	}
+		break;
+
+		case XRM_TEXT_START:{
+                //printf("->XRM_TEXT_START\n");
+                ByteString sNewLID = GetAttribute( rToken, "id" );
+				if ( sNewLID != sLID ) {
+					//EndOfText( sCurrentOpenTag, sCurrentCloseTag );
+					sLID = sNewLID;
+				}
+				bText = sal_True;
+				sCurrentText = "";
+				sCurrentOpenTag = rToken;
+				Output( rToken );
+                //printf("<-XRM_TEXT_START\n");
+			}
+		break;
+
+		case XRM_TEXT_END: {
+				sCurrentCloseTag = rToken;
+                //printf("->XRM_TEXT_END\n");
+				ByteString sLang = GetAttribute( sCurrentOpenTag, "xml:lang" );
+				WorkOnText( sCurrentOpenTag, sCurrentText );
+				Output( sCurrentText );
+                EndOfText( sCurrentOpenTag, sCurrentCloseTag );// <---
+				bText = sal_False;
+                rToken = ByteString("");
+                sCurrentText  = ByteString("");
+                //printf("<-XRM_TEXT_END");
+		}
+		break;
+
+		case XRM_LIST_START:
+			sLID = "";
+		break;
+
+		case XRM_LIST_END:
+			if ( sLID.Len())
+				EndOfText( sCurrentOpenTag, sCurrentCloseTag );
+		break;
+
+		default:
+			if ( bText ) {
+				sCurrentText += rToken;
+			}
+		break;
+	}
+
+	if ( !bText )
+    {
+        Output( rToken );
+    }
+	return 0;
+}
+
+/*****************************************************************************/
+ByteString XRMResParser::GetAttribute( const ByteString &rToken, const ByteString &rAttribute )
+/*****************************************************************************/
+{
+	ByteString sTmp( rToken );
+	sTmp.SearchAndReplaceAll( "\t", " " );
+
+	ByteString sSearch( " " );
+	sSearch += rAttribute;
+	sSearch += "=";
+	sal_uInt16 nPos = sTmp.Search( sSearch );
+
+	if ( nPos != STRING_NOTFOUND ) {
+		sTmp = sTmp.Copy( nPos );
+		ByteString sId = sTmp.GetToken( 1, '\"' );
+		return sId;
+	}
+	return "";
+}
+
+
+/*****************************************************************************/
+void XRMResParser::Error( const ByteString &rError )
+/*****************************************************************************/
+{
+	yyerror(( char * ) rError.GetBuffer());
+}
+
+/*****************************************************************************/
+void XRMResParser::ConvertStringToDBFormat( ByteString &rString )
+/*****************************************************************************/
+{
+	ByteString sResult;
+    do {
+		sResult = rString;
+		rString.EraseLeadingChars( _LF );
+	//	rString.EraseLeadingChars( ' ' );
+		rString.EraseLeadingChars( '\t' );
+	//	rString.EraseTrailingChars( ' ' );
+		rString.EraseTrailingChars( '\t' );
+	} while ( sResult != rString );
+
+	rString.SearchAndReplaceAll( "\t", "\\t" );
+}
+
+/*****************************************************************************/
+void XRMResParser::ConvertStringToXMLFormat( ByteString &rString )
+/*****************************************************************************/
+{
+	rString.SearchAndReplaceAll( "\\t", "\t" );
+}
+
+
+
+//
+// class XRMResOutputParser
+//
+
+/*****************************************************************************/
+XRMResOutputParser::XRMResOutputParser ( const ByteString &rOutputFile )
+/*****************************************************************************/
+{
+	aLanguages = Export::GetLanguages();
+    pOutputStream =
+		new SvFileStream(
+			String( rOutputFile, RTL_TEXTENCODING_ASCII_US ),
+			STREAM_STD_WRITE | STREAM_TRUNC
+		);
+    pOutputStream->SetStreamCharSet( RTL_TEXTENCODING_UTF8 );
+	if ( !pOutputStream->IsOpen()) {
+		ByteString sError( "Unable to open output file: " );
+		sError += rOutputFile;
+		Error( sError );
+		delete pOutputStream;
+		pOutputStream = NULL;
+	}
+}
+
+/*****************************************************************************/
+XRMResOutputParser::~XRMResOutputParser()
+/*****************************************************************************/
+{
+	if ( pOutputStream ) {
+		pOutputStream->Close();
+		delete pOutputStream;
+	}
+}
+
+//
+// class XMLResExport
+//
+
+/*****************************************************************************/
+XRMResExport::XRMResExport(
+	const ByteString &rOutputFile, const ByteString &rProject,
+	const ByteString &rFilePath )
+/*****************************************************************************/
+				: XRMResOutputParser( rOutputFile ),
+				pResData( NULL ),
+				sPrj( rProject ),
+				sPath( rFilePath )
+{
+    aLanguages = Export::GetLanguages();
+}
+
+/*****************************************************************************/
+XRMResExport::~XRMResExport()
+/*****************************************************************************/
+{
+	delete pResData;
+}
+
+void XRMResExport::Output( const ByteString& rOutput )
+{
+    // Dummy to suppress warnings caused by poor class design
+    (void) rOutput;
+}
+
+/*****************************************************************************/
+void XRMResExport::WorkOnText(
+	const ByteString &rOpenTag,
+	ByteString &rText
+)
+/*****************************************************************************/
+{
+	ByteString sLang( GetAttribute( rOpenTag, "xml:lang" ));
+
+		if ( !pResData ) {
+			ByteString sPlatform( "" );
+			pResData = new ResData( sPlatform, GetGID() );
+			pResData->sId = GetLID();
+		}
+
+        pResData->sText[ sLang ] = rText;
+        ConvertStringToDBFormat( pResData->sText[ sLang ] );
+}
+
+/*****************************************************************************/
+void XRMResExport::EndOfText(
+	const ByteString &rOpenTag,
+	const ByteString &rCloseTag
+)
+/*****************************************************************************/
+{
+	
+    (void) rOpenTag;        // FIXME
+    (void) rCloseTag;       // FIXME
+
+    if ( pResData && pOutputStream ) {
+
+		char cSearch = 0x00;
+		ByteString sSearch( cSearch );
+
+ 	//	if ( !pResData->sText[ ByteString("en-US") ].Len() ) 
+    //        pResData->sText[ ByteString("en-US") ] = pResData->sText[ ByteString("de") ];
+
+		Export::FillInFallbacks( pResData );
+
+		ByteString sTimeStamp( Export::GetTimeStamp());
+        ByteString sCur;
+        for( unsigned int n = 0; n < aLanguages.size(); n++ ){
+            sCur = aLanguages[ n ];
+        
+            ByteString sAct = pResData->sText[ sCur ];
+				//Export::UnquotHTML( sAct );
+				sAct.EraseAllChars( 0x0A );
+
+				ByteString sOutput( sPrj ); sOutput += "\t";
+				sOutput += sPath;
+				sOutput += "\t0\t";
+				sOutput += "readmeitem\t";
+				sOutput += pResData->sId; 
+                // USE LID AS GID OR MERGE DON'T WORK
+                //sOutput += pResData->sGId; 
+                sOutput += "\t";
+                sOutput += pResData->sId; 
+                sOutput += "\t\t\t0\t";
+                sOutput += sCur;
+                sOutput += "\t";
+	            
+                sOutput += sAct; sOutput += "\t\t\t\t";
+				sOutput += sTimeStamp;
+
+				sOutput.SearchAndReplaceAll( sSearch, "_" );
+                //if( !sCur.EqualsIgnoreCaseAscii("de") ||( sCur.EqualsIgnoreCaseAscii("de") && !Export::isMergingGermanAllowed( sPrj ) ) )
+			    if( sAct.Len() > 1 )
+                    pOutputStream->WriteLine( sOutput );
+			}
+	}
+	delete pResData;
+	pResData = NULL;
+}
+
+//
+// class XRMResMerge
+//
+
+/*****************************************************************************/
+XRMResMerge::XRMResMerge(
+	const ByteString &rMergeSource, const ByteString &rOutputFile,
+	ByteString &rFilename)
+/*****************************************************************************/
+				: XRMResOutputParser( rOutputFile ),
+				pMergeDataFile( NULL ),
+				sFilename( rFilename ) ,
+				pResData( NULL )
+{
+    if ( rMergeSource.Len())
+		pMergeDataFile = new MergeDataFile(
+			rMergeSource, sInputFileName , bErrorLog, RTL_TEXTENCODING_MS_1252);//, bUTF8 );
+    if( Export::sLanguages.EqualsIgnoreCaseAscii("ALL") ){
+        Export::SetLanguages( pMergeDataFile->GetLanguages() );
+        aLanguages = pMergeDataFile->GetLanguages();
+    }
+    else aLanguages = Export::GetLanguages();
+}
+
+/*****************************************************************************/
+XRMResMerge::~XRMResMerge()
+/*****************************************************************************/
+{
+	delete pMergeDataFile;
+	delete pResData;
+}
+
+/*****************************************************************************/
+void XRMResMerge::WorkOnText(
+	const ByteString &rOpenTag,
+	ByteString &rText
+)
+/*****************************************************************************/
+{
+	ByteString sLang( GetAttribute( rOpenTag, "xml:lang" ));
+
+	if ( pMergeDataFile ) {
+		if ( !pResData ) {
+			ByteString sPlatform( "" );
+//			pResData = new ResData( sPlatform, GetGID() , sFilename );
+			pResData = new ResData( sPlatform, GetLID() , sFilename );
+            pResData->sId = GetLID();
+
+			pResData->sResTyp = "readmeitem";
+		}
+
+        PFormEntrys *pEntrys = pMergeDataFile->GetPFormEntrys( pResData );
+			if ( pEntrys ) {
+                ByteString sContent;
+				if ( Export::isAllowed( sLang ) && 
+                    ( pEntrys->GetText(
+                        sContent, STRING_TYP_TEXT, sLang )) &&
+					( sContent != "-" ) && ( sContent.Len()))
+
+				{
+                    rText = sContent;
+                    ConvertStringToXMLFormat( rText );
+					//Export::QuotHTMLXRM( rText );
+				}
+			}
+	}
+}
+
+/*****************************************************************************/
+void XRMResMerge::Output( const ByteString& rOutput )
+/*****************************************************************************/
+{
+    //printf("W: %s\n",rOutput.GetBuffer());
+    if ( pOutputStream && rOutput.Len() > 0 )
+		pOutputStream->Write( rOutput.GetBuffer(), rOutput.Len());
+}
+
+/*****************************************************************************/
+void XRMResMerge::EndOfText(
+	const ByteString &rOpenTag,
+	const ByteString &rCloseTag
+)
+/*****************************************************************************/
+{
+
+    Output( rCloseTag );
+    if ( pMergeDataFile && pResData ) {
+		PFormEntrys *pEntrys = pMergeDataFile->GetPFormEntrys( pResData );
+		if ( pEntrys ) {
+            ByteString sCur;
+            for( unsigned int n = 0; n < aLanguages.size(); n++ ){
+                sCur = aLanguages[ n ];
+				ByteString sContent;
+                if ( !sCur.EqualsIgnoreCaseAscii("en-US")  &&
+					( pEntrys->GetText(
+                        sContent, STRING_TYP_TEXT, sCur, sal_True )) &&
+					( sContent != "-" ) && ( sContent.Len()))
+				{
+                    ByteString sText( sContent );
+					//Export::QuotHTMLXRM( sText );
+
+					ByteString sAdditionalLine( "\t" );
+					sAdditionalLine += rOpenTag;
+					ByteString sSearch = "xml:lang=\"";
+					ByteString sReplace( sSearch );
+
+					sSearch += GetAttribute( rOpenTag, "xml:lang" );
+                    sReplace += sCur;
+
+					sAdditionalLine.SearchAndReplace( sSearch, sReplace );
+
+					sAdditionalLine += sText;
+					sAdditionalLine += rCloseTag;
+					sAdditionalLine += "\n";
+
+					for ( sal_uInt16 i = 0; i + 1 < GetGID().GetTokenCount( '.' ); i++ )
+						sAdditionalLine += "\t";
+
+					Output( sAdditionalLine );
+				}
+			}
+		}
+	}
+	delete pResData;
+	pResData = NULL;
+}
+

Propchange: openoffice/branches/l10n/main/l10ntools/source/xrmmerge.cxx
------------------------------------------------------------------------------
    svn:executable = *