diff options
Diffstat (limited to 'sw/source/filter/html/htmlbas.cxx')
-rw-r--r-- | sw/source/filter/html/htmlbas.cxx | 361 |
1 files changed, 361 insertions, 0 deletions
diff --git a/sw/source/filter/html/htmlbas.cxx b/sw/source/filter/html/htmlbas.cxx new file mode 100644 index 000000000000..339b4da73042 --- /dev/null +++ b/sw/source/filter/html/htmlbas.cxx @@ -0,0 +1,361 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sw.hxx" + + +#include <hintids.hxx> + +#include <sfx2/sfx.hrc> + +#define _SVSTDARR_STRINGSSORTDTOR +#include <svl/svstdarr.hxx> +#include <basic/sbx.hxx> +#include <basic/basmgr.hxx> +#include <basic/sbmod.hxx> +#include <sfx2/evntconf.hxx> +#include <sfx2/app.hxx> +#include <svtools/htmlout.hxx> +#include <svtools/htmltokn.h> +#include <svtools/htmlkywd.hxx> + +#include <com/sun/star/document/XEventsSupplier.hpp> +#include <com/sun/star/uno/Reference.hxx> + +#include <fmtornt.hxx> +#include <fmtfld.hxx> + +#include "doc.hxx" +#include "docsh.hxx" +#include "docufld.hxx" +#include "wrthtml.hxx" +#include "swhtml.hxx" + + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::container; + + +static HTMLOutEvent aBodyEventTable[] = +{ + { OOO_STRING_SVTOOLS_HTML_O_SDonload, OOO_STRING_SVTOOLS_HTML_O_onload, SFX_EVENT_OPENDOC }, + { OOO_STRING_SVTOOLS_HTML_O_SDonunload, OOO_STRING_SVTOOLS_HTML_O_onunload, SFX_EVENT_PREPARECLOSEDOC }, + { OOO_STRING_SVTOOLS_HTML_O_SDonfocus, OOO_STRING_SVTOOLS_HTML_O_onfocus, SFX_EVENT_ACTIVATEDOC }, + { OOO_STRING_SVTOOLS_HTML_O_SDonblur, OOO_STRING_SVTOOLS_HTML_O_onblur, SFX_EVENT_DEACTIVATEDOC }, + { 0, 0, 0 } +}; + + +void SwHTMLParser::NewScript() +{ + ParseScriptOptions( aScriptType, sBaseURL, eScriptLang, aScriptURL, + aBasicLib, aBasicModule ); + + if( aScriptURL.Len() ) + { + // Den Inhalt des Script-Tags ignorieren + bIgnoreRawData = sal_True; + } +} + +void SwHTMLParser::EndScript() +{ + sal_Bool bInsIntoBasic = sal_False, + bInsSrcIntoFld = sal_False; + + switch( eScriptLang ) + { + case HTML_SL_STARBASIC: + bInsIntoBasic = sal_True; + break; + default: + bInsSrcIntoFld = sal_True; + break; + } + + bIgnoreRawData = sal_False; + aScriptSource.ConvertLineEnd(); + + // Ausser StarBasic und unbenutzem JavaScript jedes Script oder den + // Modulnamen in einem Feld merken merken + if( bInsSrcIntoFld && !bIgnoreHTMLComments ) + { + SwScriptFieldType *pType = + (SwScriptFieldType*)pDoc->GetSysFldType( RES_SCRIPTFLD ); + + SwScriptField aFld( pType, aScriptType, + aScriptURL.Len() ? aScriptURL : aScriptSource, + aScriptURL.Len()!=0 ); + InsertAttr( SwFmtFld( aFld ) ); + } + + SwDocShell *pDocSh = pDoc->GetDocShell(); + if( aScriptSource.Len() && pDocSh && + bInsIntoBasic && IsNewDoc() ) + { + // Fuer JavaScript und StarBasic noch ein Basic-Modul anlegen + // Das Basic entfernt natuerlich weiterhin keine SGML-Kommentare + RemoveSGMLComment( aScriptSource, sal_True ); + + // get library name + ::rtl::OUString aLibName; + if( aBasicLib.Len() ) + aLibName = aBasicLib; + else + aLibName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Standard")); + + // get module library container + Reference< script::XLibraryContainer > xModLibContainer( pDocSh->GetBasicContainer(), UNO_QUERY ); + + if ( xModLibContainer.is() ) + { + Reference< container::XNameContainer > xModLib; + if ( xModLibContainer->hasByName( aLibName ) ) + { + // get module library + Any aElement = xModLibContainer->getByName( aLibName ); + aElement >>= xModLib; + } + else + { + // create module library + xModLib = xModLibContainer->createLibrary( aLibName ); + } + + if ( xModLib.is() ) + { + if( !aBasicModule.Len() ) + { + // create module name + sal_Bool bFound = sal_True; + while( bFound ) + { + aBasicModule.AssignAscii( "Modul" ); + aBasicModule += String::CreateFromInt32( (sal_Int32)(++nSBModuleCnt) ); + bFound = xModLib->hasByName( ::rtl::OUString( aBasicModule ) ); + } + } + + // create module + ::rtl::OUString aModName( aBasicModule ); + if ( !xModLib->hasByName( aModName ) ) + { + Any aElement; + aElement <<= ::rtl::OUString( aScriptSource ); + xModLib->insertByName( aModName , aElement ); + } + } + } + + // get dialog library container + Reference< script::XLibraryContainer > xDlgLibContainer( pDocSh->GetDialogContainer(), UNO_QUERY ); + + if ( xDlgLibContainer.is() ) + { + if ( !xDlgLibContainer->hasByName( aLibName ) ) + { + // create dialog library + xDlgLibContainer->createLibrary( aLibName ); + } + } + } + + aScriptSource.Erase(); + aScriptType.Erase(); + aScriptURL.Erase(); + + aBasicLib.Erase(); + aBasicModule.Erase(); +} + +void SwHTMLParser::AddScriptSource() +{ + // Hier merken wir und nur ein par Strings + if( aToken.Len() > 2 && + (HTML_SL_STARBASIC==eScriptLang && aToken.GetChar( 0 ) == '\'') ) + { + xub_StrLen nPos = STRING_NOTFOUND; + if( !aBasicLib.Len() ) + { + nPos = aToken.SearchAscii( OOO_STRING_SVTOOLS_HTML_SB_library ); + if( nPos != STRING_NOTFOUND ) + { + aBasicLib = + aToken.Copy( nPos + sizeof(OOO_STRING_SVTOOLS_HTML_SB_library) - 1 ); + aBasicLib.EraseLeadingChars().EraseTrailingChars(); + } + } + + if( !aBasicModule.Len() && nPos==STRING_NOTFOUND ) + { + nPos = aToken.SearchAscii( OOO_STRING_SVTOOLS_HTML_SB_module ); + if( nPos != STRING_NOTFOUND ) + { + aBasicModule = + aToken.Copy( nPos + sizeof(OOO_STRING_SVTOOLS_HTML_SB_module) - 1 ); + aBasicModule.EraseLeadingChars().EraseTrailingChars(); + } + } + + if( nPos==STRING_NOTFOUND ) + { + if( aScriptSource.Len() ) + aScriptSource += '\n'; + (aScriptSource += aToken); + } + } + else if( aScriptSource.Len() || aToken.Len() ) + { + // Leerzeilen am Anfang werden ignoriert + if( aScriptSource.Len() ) + { + aScriptSource += '\n'; + } + else + { + // Wir stehen hinter dem CR/LF der Zeile davor + nScriptStartLineNr = GetLineNr() - 1; + } + aScriptSource += aToken; + } +} + +void SwHTMLParser::InsertBasicDocEvent( rtl::OUString aEvent, const String& rName, + ScriptType eScrType, + const String& rScrType ) +{ + OSL_ENSURE( rName.Len(), "InsertBasicDocEvent() ohne Macro gerufen" ); + if( !rName.Len() ) + return; + + SwDocShell *pDocSh = pDoc->GetDocShell(); + OSL_ENSURE( pDocSh, "Wo ist die DocShell?" ); + if( !pDocSh ) + return; + + String sEvent( rName ); + sEvent.ConvertLineEnd(); + String sScriptType; + if( EXTENDED_STYPE == eScrType ) + sScriptType = rScrType; + + rtl::OUString aEventName; + + SfxEventConfiguration::ConfigureEvent( aEvent, SvxMacro( sEvent, sScriptType, eScrType ), + pDocSh ); +} + +void SwHTMLWriter::OutBasic() +{ + if( !bCfgStarBasic ) + return; + + BasicManager *pBasicMan = pDoc->GetDocShell()->GetBasicManager(); + OSL_ENSURE( pBasicMan, "Wo ist der Basic-Manager?" ); + // nur das DocumentBasic schreiben + if( !pBasicMan || pBasicMan == SFX_APP()->GetBasicManager() ) + { + return; + } + + // und jetzt alle StarBasic-Module und alle unbenutzen JavaSrript-Module + // ausgeben + for( sal_uInt16 i=0; i<pBasicMan->GetLibCount(); i++ ) + { + StarBASIC *pBasic = pBasicMan->GetLib( i ); + const String& rLibName = pBasic->GetName(); + + SbxArray *pModules = pBasic->GetModules(); + for( sal_uInt16 j=0; j<pModules->Count(); j++ ) + { + const SbModule *pModule = PTR_CAST( SbModule, pModules->Get(j) ); + OSL_ENSURE( pModule, "Wo ist das Modul?" ); + + String sLang( + String::CreateFromAscii( SVX_MACRO_LANGUAGE_STARBASIC ) ); + ScriptType eType = STARBASIC; + + if( 0==i && 0==j ) + { + OutNewLine(); + ByteString sOut( '<' ); + sOut.Append( OOO_STRING_SVTOOLS_HTML_meta ); + sOut.Append( ' ' ); + sOut.Append( OOO_STRING_SVTOOLS_HTML_O_httpequiv ); + sOut.Append( "=\"" ); + sOut.Append( OOO_STRING_SVTOOLS_HTML_META_content_script_type ); + sOut.Append( "\" " ); + sOut.Append( OOO_STRING_SVTOOLS_HTML_O_content ); + sOut.Append( "=\"text/x-" ); + Strm() << sOut.GetBuffer(); + // Entities aren't welcome here + ByteString sLang8( sLang, eDestEnc ); + Strm() << sLang8.GetBuffer() << "\">"; + } + + const String& rModName = pModule->GetName(); + Strm() << SwHTMLWriter::sNewLine; // nicht einruecken! + HTMLOutFuncs::OutScript( Strm(), GetBaseURL(), pModule->GetSource(), + sLang, eType, aEmptyStr, + &rLibName, &rModName, + eDestEnc, &aNonConvertableCharacters ); + } + } +} + +static const char* aEventNames[] = +{ + "OnLoad", "OnPrepareUnload", "OnFocus", "OnUnfocus" +}; + +void SwHTMLWriter::OutBasicBodyEvents() +{ + SwDocShell *pDocSh = pDoc->GetDocShell(); + if( !pDocSh ) + return; + + SvxMacroTableDtor *pDocTable = new SvxMacroTableDtor; + + uno::Reference< document::XEventsSupplier > xSup( pDocSh->GetModel(), uno::UNO_QUERY ); + uno::Reference < container::XNameReplace > xEvents = xSup->getEvents(); + for ( sal_Int32 i=0; i<4; i++ ) + { + SvxMacro* pMacro = SfxEventConfiguration::ConvertToMacro( xEvents->getByName( ::rtl::OUString::createFromAscii(aEventNames[i]) ), pDocSh, sal_True ); + if ( pMacro ) + pDocTable->Insert( aBodyEventTable[i].nEvent, pMacro ); + } + + if( pDocTable && pDocTable->Count() ) + HTMLOutFuncs::Out_Events( Strm(), *pDocTable, aBodyEventTable, + bCfgStarBasic, eDestEnc, &aNonConvertableCharacters ); +} + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |