LCOV - code coverage report
Current view: top level - editeng/source/editeng - eehtml.cxx (source / functions) Hit Total Coverage
Test: commit 0e63ca4fde4e446f346e35849c756a30ca294aab Lines: 131 322 40.7 %
Date: 2014-04-11 Functions: 12 18 66.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : 
      21             : #include <vcl/wrkwin.hxx>
      22             : #include <vcl/dialog.hxx>
      23             : #include <vcl/msgbox.hxx>
      24             : #include <vcl/svapp.hxx>
      25             : #include <eehtml.hxx>
      26             : #include <editeng/adjustitem.hxx>
      27             : #include <editeng/flditem.hxx>
      28             : #include <tools/urlobj.hxx>
      29             : #include <editeng/fhgtitem.hxx>
      30             : #include <editeng/fontitem.hxx>
      31             : #include <editeng/ulspitem.hxx>
      32             : #include <editeng/wghtitem.hxx>
      33             : #include <svtools/htmltokn.h>
      34             : #include <svtools/htmlkywd.hxx>
      35             : #include <tools/tenccvt.hxx>
      36             : 
      37             : #include "editeng/editeng.hxx"
      38             : 
      39             : #define STYLE_PRE               101
      40             : 
      41           1 : EditHTMLParser::EditHTMLParser( SvStream& rIn, const OUString& rBaseURL, SvKeyValueIterator* pHTTPHeaderAttrs )
      42             :     : HTMLParser( rIn, true ),
      43             :     aBaseURL( rBaseURL ),
      44             :     mpEditEngine(NULL),
      45             :     pCurAnchor(NULL),
      46             :     bInPara(false),
      47             :     bWasInPara(false),
      48             :     bFieldsInserted(false),
      49             :     bInTitle(false),
      50             :     nInTable(0),
      51             :     nInCell(0),
      52           1 :     nDefListLevel(0)
      53             : {
      54             :     DBG_ASSERT( RTL_TEXTENCODING_DONTKNOW == GetSrcEncoding( ), "EditHTMLParser::EditHTMLParser: Where does the encoding come from?" );
      55             :     DBG_ASSERT( !IsSwitchToUCS2(), "EditHTMLParser::::EditHTMLParser: Switch to UCS2?" );
      56             : 
      57             :     // Altough the real default encoding is ISO8859-1, we use MS-1252
      58             :     // als default encoding.
      59           1 :     SetSrcEncoding( GetExtendedCompatibilityTextEncoding(  RTL_TEXTENCODING_ISO_8859_1 ) );
      60             : 
      61             :     // If the file starts with a BOM, switch to UCS2.
      62           1 :     SetSwitchToUCS2( true );
      63             : 
      64           1 :     if ( pHTTPHeaderAttrs )
      65           1 :         SetEncodingByHTTPHeader( pHTTPHeaderAttrs );
      66           1 : }
      67             : 
      68           3 : EditHTMLParser::~EditHTMLParser()
      69             : {
      70           1 :     delete pCurAnchor;
      71           2 : }
      72             : 
      73           1 : SvParserState EditHTMLParser::CallParser(EditEngine* pEE, const EditPaM& rPaM)
      74             : {
      75             :     DBG_ASSERT(pEE, "CallParser: ImpEditEngine ?!");
      76           1 :     mpEditEngine = pEE;
      77           1 :     SvParserState _eState = SVPAR_NOTSTARTED;
      78           1 :     if ( mpEditEngine )
      79             :     {
      80             :         // Build in wrap mimic in RTF import?
      81           1 :         aCurSel = EditSelection( rPaM, rPaM );
      82             : 
      83           1 :         if (mpEditEngine->IsImportHandlerSet())
      84             :         {
      85           1 :             ImportInfo aImportInfo(HTMLIMP_START, this, mpEditEngine->CreateESelection(aCurSel));
      86           1 :             mpEditEngine->CallImportHandler(aImportInfo);
      87             :         }
      88             : 
      89           1 :         ImpSetStyleSheet( 0 );
      90           1 :         _eState = HTMLParser::CallParser();
      91             : 
      92           1 :         if (mpEditEngine->IsImportHandlerSet())
      93             :         {
      94           1 :             ImportInfo aImportInfo(HTMLIMP_END, this, mpEditEngine->CreateESelection(aCurSel));
      95           1 :             mpEditEngine->CallImportHandler(aImportInfo);
      96             :         }
      97             : 
      98           1 :         if ( bFieldsInserted )
      99           0 :             mpEditEngine->UpdateFieldsOnly();
     100             :     }
     101           1 :     return _eState;
     102             : }
     103             : 
     104          34 : void EditHTMLParser::NextToken( int nToken )
     105             : {
     106             :     #ifdef DBG_UTIL
     107             :         HTML_TOKEN_IDS xID = (HTML_TOKEN_IDS)nToken;
     108             :         (void)xID;
     109             :     #endif
     110             : 
     111          34 :     switch( nToken )
     112             :     {
     113             :     case HTML_META:
     114             :     {
     115           0 :         const HTMLOptions& aOptions = GetOptions();
     116           0 :         size_t nArrLen = aOptions.size();
     117           0 :         bool bEquiv = false;
     118           0 :         for ( size_t i = 0; i < nArrLen; i++ )
     119             :         {
     120           0 :             const HTMLOption& aOption = aOptions[i];
     121           0 :             switch( aOption.GetToken() )
     122             :             {
     123             :                 case HTML_O_HTTPEQUIV:
     124             :                 {
     125           0 :                     bEquiv = true;
     126             :                 }
     127           0 :                 break;
     128             :                 case HTML_O_CONTENT:
     129             :                 {
     130           0 :                     if ( bEquiv )
     131             :                     {
     132           0 :                         rtl_TextEncoding eEnc = GetEncodingByMIME( aOption.GetString() );
     133           0 :                         if ( eEnc != RTL_TEXTENCODING_DONTKNOW )
     134           0 :                             SetSrcEncoding( eEnc );
     135             :                     }
     136             :                 }
     137           0 :                 break;
     138             :             }
     139             :         }
     140             : 
     141             :     }
     142           0 :     break;
     143             :     case HTML_PLAINTEXT_ON:
     144             :     case HTML_PLAINTEXT2_ON:
     145           0 :         bInPara = true;
     146           0 :     break;
     147             :     case HTML_PLAINTEXT_OFF:
     148             :     case HTML_PLAINTEXT2_OFF:
     149           0 :         bInPara = false;
     150           0 :     break;
     151             : 
     152             :     case HTML_LINEBREAK:
     153             :     case HTML_NEWPARA:
     154             :     {
     155           0 :         if ( ( bInPara || nInTable ) &&
     156           0 :             ( ( nToken == HTML_LINEBREAK ) || HasTextInCurrentPara() ) )
     157             :         {
     158           0 :             ImpInsertParaBreak();
     159             :         }
     160             :     }
     161           0 :     break;
     162             :     case HTML_HORZRULE:
     163             :     {
     164           0 :         if ( HasTextInCurrentPara() )
     165           0 :             ImpInsertParaBreak();
     166           0 :         ImpInsertParaBreak();
     167             :     }
     168             :     case HTML_NONBREAKSPACE:
     169             :     {
     170           0 :         if ( bInPara )
     171             :         {
     172           0 :             ImpInsertText( OUString( " " ) );
     173             :         }
     174             :     }
     175           0 :     break;
     176             :     case HTML_RAWDATA:
     177           0 :         if (IsReadStyle() && !aToken.isEmpty())
     178             :         {
     179             :             // Each token represents a single line.
     180           0 :             maStyleSource.append(aToken);
     181           0 :             maStyleSource.append('\n');
     182             :         }
     183           0 :     break;
     184             :     case HTML_TEXTTOKEN:
     185             :     {
     186             :         // #i110937# for <title> content, call aImportHdl (no SkipGroup), but don't insert the text into the EditEngine
     187          13 :         if (!bInTitle)
     188             :         {
     189          13 :             if ( !bInPara )
     190           3 :                 StartPara( false );
     191             : 
     192          13 :             OUString aText = aToken;
     193          13 :             if ( aText.startsWith(" ") && ThrowAwayBlank() && !IsReadPRE() )
     194           7 :                 aText = aText.copy( 1 );
     195             : 
     196          13 :             if ( pCurAnchor )
     197             :             {
     198           0 :                 pCurAnchor->aText += aText;
     199             :             }
     200             :             else
     201             :             {
     202             :                 // Only written until HTML with 319?
     203          13 :                 if ( IsReadPRE() )
     204             :                 {
     205           0 :                     sal_Int32 nTabPos = aText.indexOf( '\t');
     206           0 :                     while ( nTabPos != -1 )
     207             :                     {
     208           0 :                         aText = aText.replaceAt( nTabPos, 1, "        " );
     209           0 :                         nTabPos = aText.indexOf( '\t', nTabPos+8 );
     210             :                     }
     211             :                 }
     212          13 :                 ImpInsertText( aText );
     213          13 :             }
     214             :         }
     215             :     }
     216          13 :     break;
     217             : 
     218             :     case HTML_CENTER_ON:
     219             :     case HTML_CENTER_OFF:
     220             :                             {
     221           0 :                                 sal_Int32 nNode = mpEditEngine->GetEditDoc().GetPos( aCurSel.Max().GetNode() );
     222           0 :                                 SfxItemSet aItems( aCurSel.Max().GetNode()->GetContentAttribs().GetItems() );
     223           0 :                                 aItems.ClearItem( EE_PARA_JUST );
     224           0 :                                 if ( nToken == HTML_CENTER_ON )
     225           0 :                                     aItems.Put( SvxAdjustItem( SVX_ADJUST_CENTER, EE_PARA_JUST ) );
     226           0 :                                 mpEditEngine->SetParaAttribsOnly(nNode, aItems);
     227             :                             }
     228           0 :                             break;
     229             : 
     230           0 :     case HTML_ANCHOR_ON:    AnchorStart();
     231           0 :                             break;
     232           0 :     case HTML_ANCHOR_OFF:   AnchorEnd();
     233           0 :                             break;
     234             : 
     235             :     case HTML_PARABREAK_ON:
     236           0 :         if( bInPara && HasTextInCurrentPara() )
     237           0 :             EndPara( true );
     238           0 :         StartPara( true );
     239           0 :         break;
     240             : 
     241             :     case HTML_PARABREAK_OFF:
     242           0 :         if( bInPara )
     243           0 :             EndPara( true );
     244           0 :         break;
     245             : 
     246             :     case HTML_HEAD1_ON:
     247             :     case HTML_HEAD2_ON:
     248             :     case HTML_HEAD3_ON:
     249             :     case HTML_HEAD4_ON:
     250             :     case HTML_HEAD5_ON:
     251             :     case HTML_HEAD6_ON:
     252             :     {
     253           0 :         HeadingStart( nToken );
     254             :     }
     255           0 :     break;
     256             : 
     257             :     case HTML_HEAD1_OFF:
     258             :     case HTML_HEAD2_OFF:
     259             :     case HTML_HEAD3_OFF:
     260             :     case HTML_HEAD4_OFF:
     261             :     case HTML_HEAD5_OFF:
     262             :     case HTML_HEAD6_OFF:
     263             :     {
     264           0 :         HeadingEnd( nToken );
     265             :     }
     266           0 :     break;
     267             : 
     268             :     case HTML_PREFORMTXT_ON:
     269             :     case HTML_XMP_ON:
     270             :     case HTML_LISTING_ON:
     271             :     {
     272           0 :         StartPara( true );
     273           0 :         ImpSetStyleSheet( STYLE_PRE );
     274             :     }
     275           0 :     break;
     276             : 
     277             :     case HTML_DEFLIST_ON:
     278             :     {
     279           0 :         nDefListLevel++;
     280             :     }
     281           0 :     break;
     282             : 
     283             :     case HTML_DEFLIST_OFF:
     284             :     {
     285           0 :         if( nDefListLevel )
     286           0 :             nDefListLevel--;
     287             :     }
     288           0 :     break;
     289             : 
     290           1 :     case HTML_TABLE_ON:     nInTable++;
     291           1 :                             break;
     292             :     case HTML_TABLE_OFF:    DBG_ASSERT( nInTable, "Not in Table, but TABLE_OFF?" );
     293           1 :                             nInTable--;
     294           1 :                             break;
     295             : 
     296             :     case HTML_TABLEHEADER_ON:
     297             :     case HTML_TABLEDATA_ON:
     298           6 :         nInCell++;
     299             :     // fall through
     300             :     case HTML_BLOCKQUOTE_ON:
     301             :     case HTML_BLOCKQUOTE_OFF:
     302             :     case HTML_BLOCKQUOTE30_ON:
     303             :     case HTML_BLOCKQUOTE30_OFF:
     304             :     case HTML_LISTHEADER_ON:
     305             :     case HTML_LI_ON:
     306             :     case HTML_DD_ON:
     307             :     case HTML_DT_ON:
     308             :     case HTML_ORDERLIST_ON:
     309             :     case HTML_UNORDERLIST_ON:
     310             :     {
     311           6 :         bool bHasText = HasTextInCurrentPara();
     312           6 :         if ( bHasText )
     313           0 :             ImpInsertParaBreak();
     314           6 :         StartPara( false );
     315             :     }
     316           6 :     break;
     317             : 
     318             :     case HTML_TABLEHEADER_OFF:
     319             :     case HTML_TABLEDATA_OFF:
     320             :     {
     321           6 :         if ( nInCell )
     322           6 :             nInCell--;
     323             :     }
     324             :     // fall through
     325             :     case HTML_LISTHEADER_OFF:
     326             :     case HTML_LI_OFF:
     327             :     case HTML_DD_OFF:
     328             :     case HTML_DT_OFF:
     329             :     case HTML_ORDERLIST_OFF:
     330           6 :     case HTML_UNORDERLIST_OFF:  EndPara( false );
     331           6 :                                 break;
     332             : 
     333             :     case HTML_TABLEROW_ON:
     334             :     case HTML_TABLEROW_OFF: // A RETURN only after a CELL, for Calc
     335             : 
     336             :     case HTML_COL_ON:
     337             :     case HTML_COLGROUP_ON:
     338           4 :     case HTML_COLGROUP_OFF: break;
     339             : 
     340             :     case HTML_FONT_ON:
     341           0 :                             break;
     342             :     case HTML_FONT_OFF:
     343           0 :                             break;
     344             : 
     345             :     case HTML_TITLE_ON:
     346           0 :         bInTitle = true;
     347           0 :         break;
     348             :     case HTML_TITLE_OFF:
     349           0 :         bInTitle = false;
     350           0 :         break;
     351             : 
     352             :     // globals
     353             :     case HTML_HTML_ON:
     354             :     case HTML_HTML_OFF:
     355             :     case HTML_STYLE_ON:
     356             :     case HTML_STYLE_OFF:
     357             :     case HTML_BODY_ON:
     358             :     case HTML_BODY_OFF:
     359             :     case HTML_HEAD_ON:
     360             :     case HTML_HEAD_OFF:
     361             :     case HTML_FORM_ON:
     362             :     case HTML_FORM_OFF:
     363             :     case HTML_THEAD_ON:
     364             :     case HTML_THEAD_OFF:
     365             :     case HTML_TBODY_ON:
     366             :     case HTML_TBODY_OFF:
     367             :     // inline elements, structural markup
     368             :     // HTML 3.0
     369             :     case HTML_BANNER_ON:
     370             :     case HTML_BANNER_OFF:
     371             :     case HTML_DIVISION_ON:
     372             :     case HTML_DIVISION_OFF:
     373             : //  case HTML_LISTHEADER_ON:        //! special handling
     374             : //  case HTML_LISTHEADER_OFF:
     375             :     case HTML_NOTE_ON:
     376             :     case HTML_NOTE_OFF:
     377             :     // inline elements, logical markup
     378             :     // HTML 2.0
     379             :     case HTML_ADDRESS_ON:
     380             :     case HTML_ADDRESS_OFF:
     381             : //  case HTML_BLOCKQUOTE_ON:        //! special handling
     382             : //  case HTML_BLOCKQUOTE_OFF:
     383             :     case HTML_CITIATION_ON:
     384             :     case HTML_CITIATION_OFF:
     385             :     case HTML_CODE_ON:
     386             :     case HTML_CODE_OFF:
     387             :     case HTML_DEFINSTANCE_ON:
     388             :     case HTML_DEFINSTANCE_OFF:
     389             :     case HTML_EMPHASIS_ON:
     390             :     case HTML_EMPHASIS_OFF:
     391             :     case HTML_KEYBOARD_ON:
     392             :     case HTML_KEYBOARD_OFF:
     393             :     case HTML_SAMPLE_ON:
     394             :     case HTML_SAMPLE_OFF:
     395             :     case HTML_STRIKE_ON:
     396             :     case HTML_STRIKE_OFF:
     397             :     case HTML_STRONG_ON:
     398             :     case HTML_STRONG_OFF:
     399             :     case HTML_VARIABLE_ON:
     400             :     case HTML_VARIABLE_OFF:
     401             :     // HTML 3.0
     402             :     case HTML_ABBREVIATION_ON:
     403             :     case HTML_ABBREVIATION_OFF:
     404             :     case HTML_ACRONYM_ON:
     405             :     case HTML_ACRONYM_OFF:
     406             :     case HTML_AUTHOR_ON:
     407             :     case HTML_AUTHOR_OFF:
     408             : //  case HTML_BLOCKQUOTE30_ON:      //! special handling
     409             : //  case HTML_BLOCKQUOTE30_OFF:
     410             :     case HTML_DELETEDTEXT_ON:
     411             :     case HTML_DELETEDTEXT_OFF:
     412             :     case HTML_INSERTEDTEXT_ON:
     413             :     case HTML_INSERTEDTEXT_OFF:
     414             :     case HTML_LANGUAGE_ON:
     415             :     case HTML_LANGUAGE_OFF:
     416             :     case HTML_PERSON_ON:
     417             :     case HTML_PERSON_OFF:
     418             :     case HTML_SHORTQUOTE_ON:
     419             :     case HTML_SHORTQUOTE_OFF:
     420             :     case HTML_SUBSCRIPT_ON:
     421             :     case HTML_SUBSCRIPT_OFF:
     422             :     case HTML_SUPERSCRIPT_ON:
     423             :     case HTML_SUPERSCRIPT_OFF:
     424             :     // inline elements, visual markup
     425             :     // HTML 2.0
     426             :     case HTML_BOLD_ON:
     427             :     case HTML_BOLD_OFF:
     428             :     case HTML_ITALIC_ON:
     429             :     case HTML_ITALIC_OFF:
     430             :     case HTML_TELETYPE_ON:
     431             :     case HTML_TELETYPE_OFF:
     432             :     case HTML_UNDERLINE_ON:
     433             :     case HTML_UNDERLINE_OFF:
     434             :     // HTML 3.0
     435             :     case HTML_BIGPRINT_ON:
     436             :     case HTML_BIGPRINT_OFF:
     437             :     case HTML_STRIKETHROUGH_ON:
     438             :     case HTML_STRIKETHROUGH_OFF:
     439             :     case HTML_SMALLPRINT_ON:
     440             :     case HTML_SMALLPRINT_OFF:
     441             :     // figures
     442             :     case HTML_FIGURE_ON:
     443             :     case HTML_FIGURE_OFF:
     444             :     case HTML_CAPTION_ON:
     445             :     case HTML_CAPTION_OFF:
     446             :     case HTML_CREDIT_ON:
     447             :     case HTML_CREDIT_OFF:
     448             :     // misc
     449             :     case HTML_DIRLIST_ON:
     450             :     case HTML_DIRLIST_OFF:
     451             :     case HTML_FOOTNOTE_ON:          //! land so im Text
     452             :     case HTML_FOOTNOTE_OFF:
     453             :     case HTML_MENULIST_ON:
     454             :     case HTML_MENULIST_OFF:
     455             : //  case HTML_PLAINTEXT_ON:         //! special handling
     456             : //  case HTML_PLAINTEXT_OFF:
     457             : //  case HTML_PREFORMTXT_ON:        //! special handling
     458             : //  case HTML_PREFORMTXT_OFF:
     459             :     case HTML_SPAN_ON:
     460             :     case HTML_SPAN_OFF:
     461             :     // obsolete
     462             : //  case HTML_XMP_ON:               //! special handling
     463             : //  case HTML_XMP_OFF:
     464             : //  case HTML_LISTING_ON:           //! special handling
     465             : //  case HTML_LISTING_OFF:
     466             :     // Netscape
     467             :     case HTML_BLINK_ON:
     468             :     case HTML_BLINK_OFF:
     469             :     case HTML_NOBR_ON:
     470             :     case HTML_NOBR_OFF:
     471             :     case HTML_NOEMBED_ON:
     472             :     case HTML_NOEMBED_OFF:
     473             :     case HTML_NOFRAMES_ON:
     474             :     case HTML_NOFRAMES_OFF:
     475             :     // Internet Explorer
     476             :     case HTML_MARQUEE_ON:
     477             :     case HTML_MARQUEE_OFF:
     478             : //  case HTML_PLAINTEXT2_ON:        //! special handling
     479             : //  case HTML_PLAINTEXT2_OFF:
     480           3 :     break;
     481             : 
     482             :     default:
     483             :     {
     484           0 :         if ( nToken & HTML_TOKEN_ONOFF )
     485             :         {
     486           0 :             if ( ( nToken == HTML_UNKNOWNCONTROL_ON ) || ( nToken == HTML_UNKNOWNCONTROL_OFF ) )
     487             :             {
     488             :                 ;
     489             :             }
     490           0 :             else if ( !(nToken & 1) )
     491             :             {
     492             :                 DBG_ASSERT( !( nToken & 1 ), "No Start-Token ?!" );
     493           0 :                 SkipGroup( nToken + 1 );
     494             :             }
     495             :         }
     496             :     }
     497             :     }   // SWITCH
     498             : 
     499          34 :     if (mpEditEngine->IsImportHandlerSet())
     500             :     {
     501          34 :         ImportInfo aImportInfo(HTMLIMP_NEXTTOKEN, this, mpEditEngine->CreateESelection(aCurSel));
     502          34 :         aImportInfo.nToken = nToken;
     503          34 :         aImportInfo.nTokenValue = (short)nTokenValue;
     504          34 :         if ( nToken == HTML_TEXTTOKEN )
     505          13 :             aImportInfo.aText = aToken;
     506          21 :         else if (nToken == HTML_STYLE_OFF)
     507           0 :             aImportInfo.aText = maStyleSource.makeStringAndClear();
     508          34 :         mpEditEngine->CallImportHandler(aImportInfo);
     509             :     }
     510             : 
     511          34 : }
     512             : 
     513           6 : void EditHTMLParser::ImpInsertParaBreak()
     514             : {
     515           6 :     if (mpEditEngine->IsImportHandlerSet())
     516             :     {
     517           6 :         ImportInfo aImportInfo(HTMLIMP_INSERTPARA, this, mpEditEngine->CreateESelection(aCurSel));
     518           6 :         mpEditEngine->CallImportHandler(aImportInfo);
     519             :     }
     520           6 :     aCurSel = mpEditEngine->InsertParaBreak(aCurSel);
     521           6 : }
     522             : 
     523           0 : void EditHTMLParser::ImpSetAttribs( const SfxItemSet& rItems, EditSelection* pSel )
     524             : {
     525             :     // pSel, when character attributes, otherwise paragraph attributes for
     526             :     // the current paragraph.
     527             :     DBG_ASSERT( pSel || ( aCurSel.Min().GetNode() == aCurSel.Max().GetNode() ), "ImpInsertAttribs: Selection?" );
     528             : 
     529           0 :     EditPaM aStartPaM( pSel ? pSel->Min() : aCurSel.Min() );
     530           0 :     EditPaM aEndPaM( pSel ? pSel->Max() : aCurSel.Max() );
     531             : 
     532           0 :     if ( !pSel )
     533             :     {
     534           0 :         aStartPaM.SetIndex( 0 );
     535           0 :         aEndPaM.SetIndex( aEndPaM.GetNode()->Len() );
     536             :     }
     537             : 
     538           0 :     if (mpEditEngine->IsImportHandlerSet())
     539             :     {
     540           0 :         EditSelection aSel( aStartPaM, aEndPaM );
     541           0 :         ImportInfo aImportInfo(HTMLIMP_SETATTR, this, mpEditEngine->CreateESelection(aSel));
     542           0 :         aImportInfo.pAttrs = (void*)&rItems;
     543           0 :         mpEditEngine->CallImportHandler(aImportInfo);
     544             :     }
     545             : 
     546           0 :     ContentNode* pSN = aStartPaM.GetNode();
     547           0 :     sal_Int32 nStartNode = mpEditEngine->GetEditDoc().GetPos( pSN );
     548             : 
     549             :     // If an attribute goes from 0 to current Paragraph length,
     550             :     // then it should be a paragraph attribute!
     551             : 
     552             :     // Note: Selection can reach over several Paragraphs.
     553             :     // All complete paragraphs are paragraph attributes ...
     554             : 
     555             :     // not really HTML:
     556             : #ifdef DBG_UTIL
     557             :     ContentNode* pEN = aEndPaM.GetNode();
     558             :     sal_Int32 nEndNode = mpEditEngine->GetEditDoc().GetPos( pEN );
     559             :     DBG_ASSERT( nStartNode == nEndNode, "ImpSetAttribs: Several paragraphs?" );
     560             : #endif
     561             : 
     562           0 :     if ( ( aStartPaM.GetIndex() == 0 ) && ( aEndPaM.GetIndex() == aEndPaM.GetNode()->Len() ) )
     563             :     {
     564             :         // Has to be merged:
     565           0 :         SfxItemSet aItems = mpEditEngine->GetBaseParaAttribs(nStartNode);
     566           0 :         aItems.Put( rItems );
     567           0 :         mpEditEngine->SetParaAttribsOnly(nStartNode, aItems);
     568             :     }
     569             :     else
     570           0 :         mpEditEngine->SetAttribs( EditSelection( aStartPaM, aEndPaM ), rItems );
     571           0 : }
     572             : 
     573           1 : void EditHTMLParser::ImpSetStyleSheet( sal_uInt16 nHLevel )
     574             : {
     575             :     /*
     576             :         nHLevel:    0:          Turn off
     577             :                     1-6:        Heading
     578             :                     STYLE_PRE:  Preformatted
     579             :     */
     580             :     // Create hard attributes ...
     581             :     // Enough for Calc, would have to be clarified with StyleSheets
     582             :     // that they should also be in the app so that when they are feed
     583             :     // in a different engine still are here ...
     584           1 :     sal_Int32 nNode = mpEditEngine->GetEditDoc().GetPos( aCurSel.Max().GetNode() );
     585             : 
     586           1 :     SfxItemSet aItems( aCurSel.Max().GetNode()->GetContentAttribs().GetItems() );
     587             : 
     588           1 :     aItems.ClearItem( EE_PARA_ULSPACE );
     589             : 
     590           1 :     aItems.ClearItem( EE_CHAR_FONTHEIGHT );
     591           1 :     aItems.ClearItem( EE_CHAR_FONTINFO );
     592           1 :     aItems.ClearItem( EE_CHAR_WEIGHT );
     593             : 
     594           1 :     aItems.ClearItem( EE_CHAR_FONTHEIGHT_CJK );
     595           1 :     aItems.ClearItem( EE_CHAR_FONTINFO_CJK );
     596           1 :     aItems.ClearItem( EE_CHAR_WEIGHT_CJK );
     597             : 
     598           1 :     aItems.ClearItem( EE_CHAR_FONTHEIGHT_CTL );
     599           1 :     aItems.ClearItem( EE_CHAR_FONTINFO_CTL );
     600           1 :     aItems.ClearItem( EE_CHAR_WEIGHT_CTL );
     601             : 
     602             :     // Bold in the first 3 Headings
     603           1 :     if ( ( nHLevel >= 1 ) && ( nHLevel <= 3 ) )
     604             :     {
     605           0 :         SvxWeightItem aWeightItem( WEIGHT_BOLD, EE_CHAR_WEIGHT );
     606           0 :         aItems.Put( aWeightItem );
     607             : 
     608           0 :         SvxWeightItem aWeightItemCJK( WEIGHT_BOLD, EE_CHAR_WEIGHT_CJK );
     609           0 :         aItems.Put( aWeightItem );
     610             : 
     611           0 :         SvxWeightItem aWeightItemCTL( WEIGHT_BOLD, EE_CHAR_WEIGHT_CTL );
     612           0 :         aItems.Put( aWeightItem );
     613             :     }
     614             : 
     615             :     // Font hight and margins, when LogicToLogic is possible:
     616           1 :     MapUnit eUnit = mpEditEngine->GetRefMapMode().GetMapUnit();
     617           1 :     if ( ( eUnit != MAP_PIXEL ) && ( eUnit != MAP_SYSFONT ) &&
     618           1 :          ( eUnit != MAP_APPFONT ) && ( eUnit != MAP_RELATIVE ) )
     619             :     {
     620           1 :         long nPoints = 10;
     621           1 :         if ( nHLevel == 1 )
     622           0 :             nPoints = 22;
     623           1 :         else if ( nHLevel == 2 )
     624           0 :             nPoints = 16;
     625           1 :         else if ( nHLevel == 3 )
     626           0 :             nPoints = 12;
     627           1 :         else if ( nHLevel == 4 )
     628           0 :             nPoints = 11;
     629             : 
     630           1 :         nPoints = OutputDevice::LogicToLogic( nPoints, MAP_POINT, eUnit );
     631             : 
     632           1 :         SvxFontHeightItem aHeightItem( nPoints, 100, EE_CHAR_FONTHEIGHT );
     633           1 :         aItems.Put( aHeightItem );
     634             : 
     635           2 :         SvxFontHeightItem aHeightItemCJK( nPoints, 100, EE_CHAR_FONTHEIGHT_CJK );
     636           1 :         aItems.Put( aHeightItemCJK );
     637             : 
     638           2 :         SvxFontHeightItem aHeightItemCTL( nPoints, 100, EE_CHAR_FONTHEIGHT_CTL );
     639           1 :         aItems.Put( aHeightItemCTL );
     640             : 
     641             :         // Paragraph margins, when Heading:
     642           1 :         if ( !nHLevel || ((nHLevel >= 1) && (nHLevel <= 6)) )
     643             :         {
     644           1 :             SvxULSpaceItem aULSpaceItem( EE_PARA_ULSPACE );
     645           1 :             aULSpaceItem.SetUpper( (sal_uInt16)OutputDevice::LogicToLogic( 42, MAP_10TH_MM, eUnit ) );
     646           1 :             aULSpaceItem.SetLower( (sal_uInt16)OutputDevice::LogicToLogic( 35, MAP_10TH_MM, eUnit ) );
     647           1 :             aItems.Put( aULSpaceItem );
     648           1 :         }
     649             :     }
     650             : 
     651             :     // Choose a proportional Font for Pre
     652           1 :     if ( nHLevel == STYLE_PRE )
     653             :     {
     654           0 :         Font aFont = OutputDevice::GetDefaultFont( DEFAULTFONT_FIXED, LANGUAGE_SYSTEM, 0 );
     655           0 :         SvxFontItem aFontItem( aFont.GetFamily(), aFont.GetName(), OUString(), aFont.GetPitch(), aFont.GetCharSet(), EE_CHAR_FONTINFO );
     656           0 :         aItems.Put( aFontItem );
     657             : 
     658           0 :         SvxFontItem aFontItemCJK( aFont.GetFamily(), aFont.GetName(), OUString(), aFont.GetPitch(), aFont.GetCharSet(), EE_CHAR_FONTINFO_CJK );
     659           0 :         aItems.Put( aFontItemCJK );
     660             : 
     661           0 :         SvxFontItem aFontItemCTL( aFont.GetFamily(), aFont.GetName(), OUString(), aFont.GetPitch(), aFont.GetCharSet(), EE_CHAR_FONTINFO_CTL );
     662           0 :         aItems.Put( aFontItemCTL );
     663             :     }
     664             : 
     665           1 :     mpEditEngine->SetParaAttribsOnly(nNode, aItems);
     666           1 : }
     667             : 
     668          13 : void EditHTMLParser::ImpInsertText( const OUString& rText )
     669             : {
     670          13 :     OUString aText( rText );
     671          13 :     if (mpEditEngine->IsImportHandlerSet())
     672             :     {
     673          13 :         ImportInfo aImportInfo(HTMLIMP_INSERTTEXT, this, mpEditEngine->CreateESelection(aCurSel));
     674          13 :         aImportInfo.aText = aText;
     675          13 :         mpEditEngine->CallImportHandler(aImportInfo);
     676             :     }
     677             : 
     678          13 :     aCurSel = mpEditEngine->InsertText(aCurSel, aText);
     679          13 : }
     680             : 
     681           0 : void EditHTMLParser::SkipGroup( int nEndToken )
     682             : {
     683             :     // groups in cells are closed upon leaving the cell, because those
     684             :     // ******* web authors don't know their job
     685             :     // for example: <td><form></td>   lacks a closing </form>
     686           0 :     sal_uInt8 nCellLevel = nInCell;
     687             :     int nToken;
     688           0 :     while( nCellLevel <= nInCell && ( (nToken = GetNextToken() ) != nEndToken ) && nToken )
     689             :     {
     690           0 :         switch ( nToken )
     691             :         {
     692             :             case HTML_TABLEHEADER_ON:
     693             :             case HTML_TABLEDATA_ON:
     694           0 :                 nInCell++;
     695           0 :             break;
     696             :             case HTML_TABLEHEADER_OFF:
     697             :             case HTML_TABLEDATA_OFF:
     698           0 :                 if ( nInCell )
     699           0 :                     nInCell--;
     700           0 :             break;
     701             :         }
     702             :     }
     703           0 : }
     704             : 
     705           9 : void EditHTMLParser::StartPara( bool bReal )
     706             : {
     707           9 :     if ( bReal )
     708             :     {
     709           0 :         const HTMLOptions& aOptions = GetOptions();
     710           0 :         SvxAdjust eAdjust = SVX_ADJUST_LEFT;
     711           0 :         for ( size_t i = 0, n = aOptions.size(); i < n; ++i )
     712             :         {
     713           0 :             const HTMLOption& aOption = aOptions[i];
     714           0 :             switch( aOption.GetToken() )
     715             :             {
     716             :                 case HTML_O_ALIGN:
     717             :                 {
     718           0 :                     OUString const& rTmp(aOption.GetString());
     719           0 :                     if (rTmp.equalsIgnoreAsciiCase(OOO_STRING_SVTOOLS_HTML_AL_right))
     720           0 :                         eAdjust = SVX_ADJUST_RIGHT;
     721           0 :                     else if (rTmp.equalsIgnoreAsciiCase(OOO_STRING_SVTOOLS_HTML_AL_middle))
     722           0 :                         eAdjust = SVX_ADJUST_CENTER;
     723           0 :                     else if (rTmp.equalsIgnoreAsciiCase(OOO_STRING_SVTOOLS_HTML_AL_center))
     724           0 :                         eAdjust = SVX_ADJUST_CENTER;
     725             :                     else
     726           0 :                         eAdjust = SVX_ADJUST_LEFT;
     727             :                 }
     728           0 :                 break;
     729             :             }
     730             :         }
     731           0 :         SfxItemSet aItemSet = mpEditEngine->GetEmptyItemSet();
     732           0 :         aItemSet.Put( SvxAdjustItem( eAdjust, EE_PARA_JUST ) );
     733           0 :         ImpSetAttribs( aItemSet );
     734             :     }
     735           9 :     bInPara = true;
     736           9 : }
     737             : 
     738           6 : void EditHTMLParser::EndPara( bool )
     739             : {
     740           6 :     if ( bInPara )
     741             :     {
     742           6 :         bool bHasText = HasTextInCurrentPara();
     743           6 :         if ( bHasText )
     744           6 :             ImpInsertParaBreak();
     745             :     }
     746           6 :     bInPara = false;
     747           6 : }
     748             : 
     749           7 : bool EditHTMLParser::ThrowAwayBlank()
     750             : {
     751             :     // A blank must be thrown away if the new text begins with a Blank and
     752             :     // if the current paragraph is empty or ends with a Blank...
     753           7 :     ContentNode* pNode = aCurSel.Max().GetNode();
     754           7 :     if ( pNode->Len() && ( pNode->GetChar( pNode->Len()-1 ) != ' ' ) )
     755           0 :         return false;
     756           7 :     return true;
     757             : }
     758             : 
     759          12 : bool EditHTMLParser::HasTextInCurrentPara()
     760             : {
     761          12 :     return aCurSel.Max().GetNode()->Len() ? true : false;
     762             : }
     763             : 
     764           0 : void EditHTMLParser::AnchorStart()
     765             : {
     766             :     // ignore anchor in anchor
     767           0 :     if ( !pCurAnchor )
     768             :     {
     769           0 :         const HTMLOptions& aOptions = GetOptions();
     770           0 :         OUString aRef;
     771             : 
     772           0 :         for ( size_t i = 0, n = aOptions.size(); i < n; ++i )
     773             :         {
     774           0 :             const HTMLOption& aOption = aOptions[i];
     775           0 :             switch( aOption.GetToken() )
     776             :             {
     777             :                 case HTML_O_HREF:
     778           0 :                     aRef = aOption.GetString();
     779           0 :                 break;
     780             :             }
     781             :         }
     782             : 
     783           0 :         if ( !aRef.isEmpty() )
     784             :         {
     785           0 :             OUString aURL = aRef;
     786           0 :             if ( !aURL.isEmpty() && ( aURL[ 0 ] != '#' ) )
     787             :             {
     788           0 :                 INetURLObject aTargetURL;
     789           0 :                 INetURLObject aRootURL( aBaseURL );
     790           0 :                 aRootURL.GetNewAbsURL( aRef, &aTargetURL );
     791           0 :                 aURL = aTargetURL.GetMainURL( INetURLObject::DECODE_TO_IURI );
     792             :             }
     793           0 :             pCurAnchor = new AnchorInfo;
     794           0 :             pCurAnchor->aHRef = aURL;
     795           0 :         }
     796             :     }
     797           0 : }
     798             : 
     799           0 : void EditHTMLParser::AnchorEnd()
     800             : {
     801           0 :     if ( pCurAnchor )
     802             :     {
     803             :         // Insert as URL-Field...
     804           0 :         SvxFieldItem aFld( SvxURLField( pCurAnchor->aHRef, pCurAnchor->aText, SVXURLFORMAT_REPR ), EE_FEATURE_FIELD  );
     805           0 :         aCurSel = mpEditEngine->InsertField(aCurSel, aFld);
     806           0 :         bFieldsInserted = true;
     807           0 :         delete pCurAnchor;
     808           0 :         pCurAnchor = NULL;
     809             : 
     810           0 :         if (mpEditEngine->IsImportHandlerSet())
     811             :         {
     812           0 :             ImportInfo aImportInfo(HTMLIMP_INSERTFIELD, this, mpEditEngine->CreateESelection(aCurSel));
     813           0 :             mpEditEngine->CallImportHandler(aImportInfo);
     814           0 :         }
     815             :     }
     816           0 : }
     817             : 
     818           0 : void EditHTMLParser::HeadingStart( int nToken )
     819             : {
     820           0 :     bWasInPara = bInPara;
     821           0 :     StartPara( false );
     822             : 
     823           0 :     if ( bWasInPara && HasTextInCurrentPara() )
     824           0 :         ImpInsertParaBreak();
     825             : 
     826             :     sal_uInt16 nId = sal::static_int_cast< sal_uInt16 >(
     827           0 :         1 + ( ( nToken - HTML_HEAD1_ON ) / 2 ) );
     828             :     DBG_ASSERT( (nId >= 1) && (nId <= 9), "HeadingStart: ID can not be correct!" );
     829           0 :     ImpSetStyleSheet( nId );
     830           0 : }
     831             : 
     832           0 : void EditHTMLParser::HeadingEnd( int )
     833             : {
     834           0 :     EndPara( false );
     835           0 :     ImpSetStyleSheet( 0 );
     836             : 
     837           0 :     if ( bWasInPara )
     838             :     {
     839           0 :         bInPara = true;
     840           0 :         bWasInPara = false;
     841             :     }
     842           0 : }
     843             : 
     844             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10