/************************************************************** * * 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. * *************************************************************/ #include "layoutparse.hxx" #define STRING( str ) String( str, RTL_TEXTENCODING_UTF8 ) #define BSTRING( str ) ByteString( str, RTL_TEXTENCODING_UTF8 ) LayoutXMLFile::LayoutXMLFile( bool mergeMode ) : XMLFile() , mMergeMode( mergeMode ) { } void LayoutXMLFile::SearchL10NElements( XMLParentNode* pCur, int ) { if ( !pCur ) pCur = this; /* Recurse int children, SearchL10NElements does not do that for us. */ if ( XMLChildNodeList* lst = pCur->GetChildList() ) for ( sal_uLong i = 0; i < lst->Count(); i++ ) if ( lst->GetObject( i )->GetNodeType() == XML_NODE_TYPE_ELEMENT ) HandleElement( ( XMLElement* )lst->GetObject( i ) ); else if ( lst->GetObject( i )->GetNodeType() == XML_NODE_TYPE_COMMENT ) lst->Remove( i-- ); } std::vector interestingAttributes( XMLAttributeList* lst ) { std::vector interesting; if ( lst ) for ( sal_uLong i = 0; i < lst->Count(); i++ ) if ( lst->GetObject( i )->Equals( STRING( "id" ) ) ) interesting.insert( interesting.begin(), lst->GetObject( i ) ); else if ( ! BSTRING( *lst->GetObject( i ) ).CompareTo( "_", 1 ) ) interesting.push_back( lst->GetObject( i ) ); return interesting; } void LayoutXMLFile::HandleElement( XMLElement* element ) { std::vector interesting = interestingAttributes( element->GetAttributeList() ); if ( interesting.size() ) { std::vector::iterator i = interesting.begin(); ByteString id = BSTRING( (*i++)->GetValue() ); if ( mMergeMode ) InsertL10NElement( id, element ); else for ( ; i != interesting.end(); ++i ) { ByteString attributeId = id; ByteString value = BSTRING( ( *i )->GetValue() ); XMLElement *e = new XMLElement( *element ); e->RemoveAndDeleteAllChilds(); /* Copy translatable text to CONTENT. */ //new XMLData( STRING( ( *i )->GetValue() ), e, true ); new XMLData( STRING( value ), e, true ); attributeId += BSTRING ( **i ); InsertL10NElement( attributeId, e ); } } SearchL10NElements( (XMLParentNode*) element ); } void LayoutXMLFile::InsertL10NElement( ByteString const& id, XMLElement* element ) { ByteString const language = "en-US"; LangHashMap* languageMap = 0; XMLHashMap::iterator pos = XMLStrings->find( id ); if ( pos != XMLStrings->end() ) { languageMap = pos->second; fprintf( stderr, "error:%s:duplicate translation found, id=%s\n", id.GetBuffer(), BSTRING( sFileName ).GetBuffer() ); exit( 1 ); } else { languageMap = new LangHashMap(); XMLStrings->insert( XMLHashMap::value_type( id , languageMap ) ); order.push_back( id ); } (*languageMap)[ language ] = element; } sal_Bool LayoutXMLFile::Write( ByteString &aFilename ) { if ( aFilename.Len() ) { ofstream aFStream( aFilename.GetBuffer() , ios::out | ios::trunc ); if ( !aFStream ) fprintf( stderr, "ERROR: cannot open file:%s\n", aFilename.GetBuffer() ); else { XMLFile::Write( aFStream ); aFStream.close(); return true; } } return false; }