LCOV - code coverage report
Current view: top level - editeng/source/editeng - eehtml.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 131 323 40.6 %
Date: 2015-06-13 12:38:46 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             :     // Although 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           0 :     break;
     169             :     case HTML_NONBREAKSPACE:
     170             :     {
     171           0 :         if ( bInPara )
     172             :         {
     173           0 :             ImpInsertText( OUString( " " ) );
     174             :         }
     175             :     }
     176           0 :     break;
     177             :     case HTML_RAWDATA:
     178           0 :         if (IsReadStyle() && !aToken.isEmpty())
     179             :         {
     180             :             // Each token represents a single line.
     181           0 :             maStyleSource.append(aToken);
     182           0 :             maStyleSource.append('\n');
     183             :         }
     184           0 :     break;
     185             :     case HTML_TEXTTOKEN:
     186             :     {
     187             :         // #i110937# for <title> content, call aImportHdl (no SkipGroup), but don't insert the text into the EditEngine
     188          13 :         if (!bInTitle)
     189             :         {
     190          13 :             if ( !bInPara )
     191           3 :                 StartPara( false );
     192             : 
     193          13 :             OUString aText = aToken;
     194          13 :             if ( aText.startsWith(" ") && ThrowAwayBlank() && !IsReadPRE() )
     195           7 :                 aText = aText.copy( 1 );
     196             : 
     197          13 :             if ( pCurAnchor )
     198             :             {
     199           0 :                 pCurAnchor->aText += aText;
     200             :             }
     201             :             else
     202             :             {
     203             :                 // Only written until HTML with 319?
     204          13 :                 if ( IsReadPRE() )
     205             :                 {
     206           0 :                     sal_Int32 nTabPos = aText.indexOf( '\t');
     207           0 :                     while ( nTabPos != -1 )
     208             :                     {
     209           0 :                         aText = aText.replaceAt( nTabPos, 1, "        " );
     210           0 :                         nTabPos = aText.indexOf( '\t', nTabPos+8 );
     211             :                     }
     212             :                 }
     213          13 :                 ImpInsertText( aText );
     214          13 :             }
     215             :         }
     216             :     }
     217          13 :     break;
     218             : 
     219             :     case HTML_CENTER_ON:
     220             :     case HTML_CENTER_OFF:
     221             :                             {
     222           0 :                                 sal_Int32 nNode = mpEditEngine->GetEditDoc().GetPos( aCurSel.Max().GetNode() );
     223           0 :                                 SfxItemSet aItems( aCurSel.Max().GetNode()->GetContentAttribs().GetItems() );
     224           0 :                                 aItems.ClearItem( EE_PARA_JUST );
     225           0 :                                 if ( nToken == HTML_CENTER_ON )
     226           0 :                                     aItems.Put( SvxAdjustItem( SVX_ADJUST_CENTER, EE_PARA_JUST ) );
     227           0 :                                 mpEditEngine->SetParaAttribsOnly(nNode, aItems);
     228             :                             }
     229           0 :                             break;
     230             : 
     231           0 :     case HTML_ANCHOR_ON:    AnchorStart();
     232           0 :                             break;
     233           0 :     case HTML_ANCHOR_OFF:   AnchorEnd();
     234           0 :                             break;
     235             : 
     236             :     case HTML_PARABREAK_ON:
     237           0 :         if( bInPara && HasTextInCurrentPara() )
     238           0 :             EndPara( true );
     239           0 :         StartPara( true );
     240           0 :         break;
     241             : 
     242             :     case HTML_PARABREAK_OFF:
     243           0 :         if( bInPara )
     244           0 :             EndPara( true );
     245           0 :         break;
     246             : 
     247             :     case HTML_HEAD1_ON:
     248             :     case HTML_HEAD2_ON:
     249             :     case HTML_HEAD3_ON:
     250             :     case HTML_HEAD4_ON:
     251             :     case HTML_HEAD5_ON:
     252             :     case HTML_HEAD6_ON:
     253             :     {
     254           0 :         HeadingStart( nToken );
     255             :     }
     256           0 :     break;
     257             : 
     258             :     case HTML_HEAD1_OFF:
     259             :     case HTML_HEAD2_OFF:
     260             :     case HTML_HEAD3_OFF:
     261             :     case HTML_HEAD4_OFF:
     262             :     case HTML_HEAD5_OFF:
     263             :     case HTML_HEAD6_OFF:
     264             :     {
     265           0 :         HeadingEnd( nToken );
     266             :     }
     267           0 :     break;
     268             : 
     269             :     case HTML_PREFORMTXT_ON:
     270             :     case HTML_XMP_ON:
     271             :     case HTML_LISTING_ON:
     272             :     {
     273           0 :         StartPara( true );
     274           0 :         ImpSetStyleSheet( STYLE_PRE );
     275             :     }
     276           0 :     break;
     277             : 
     278             :     case HTML_DEFLIST_ON:
     279             :     {
     280           0 :         nDefListLevel++;
     281             :     }
     282           0 :     break;
     283             : 
     284             :     case HTML_DEFLIST_OFF:
     285             :     {
     286           0 :         if( nDefListLevel )
     287           0 :             nDefListLevel--;
     288             :     }
     289           0 :     break;
     290             : 
     291           1 :     case HTML_TABLE_ON:     nInTable++;
     292           1 :                             break;
     293             :     case HTML_TABLE_OFF:    DBG_ASSERT( nInTable, "Not in Table, but TABLE_OFF?" );
     294           1 :                             nInTable--;
     295           1 :                             break;
     296             : 
     297             :     case HTML_TABLEHEADER_ON:
     298             :     case HTML_TABLEDATA_ON:
     299           6 :         nInCell++;
     300             :     // fall through
     301             :     case HTML_BLOCKQUOTE_ON:
     302             :     case HTML_BLOCKQUOTE_OFF:
     303             :     case HTML_BLOCKQUOTE30_ON:
     304             :     case HTML_BLOCKQUOTE30_OFF:
     305             :     case HTML_LISTHEADER_ON:
     306             :     case HTML_LI_ON:
     307             :     case HTML_DD_ON:
     308             :     case HTML_DT_ON:
     309             :     case HTML_ORDERLIST_ON:
     310             :     case HTML_UNORDERLIST_ON:
     311             :     {
     312           6 :         bool bHasText = HasTextInCurrentPara();
     313           6 :         if ( bHasText )
     314           0 :             ImpInsertParaBreak();
     315           6 :         StartPara( false );
     316             :     }
     317           6 :     break;
     318             : 
     319             :     case HTML_TABLEHEADER_OFF:
     320             :     case HTML_TABLEDATA_OFF:
     321             :     {
     322           6 :         if ( nInCell )
     323           6 :             nInCell--;
     324             :     }
     325             :     // fall through
     326             :     case HTML_LISTHEADER_OFF:
     327             :     case HTML_LI_OFF:
     328             :     case HTML_DD_OFF:
     329             :     case HTML_DT_OFF:
     330             :     case HTML_ORDERLIST_OFF:
     331           6 :     case HTML_UNORDERLIST_OFF:  EndPara( false );
     332           6 :                                 break;
     333             : 
     334             :     case HTML_TABLEROW_ON:
     335             :     case HTML_TABLEROW_OFF: // A RETURN only after a CELL, for Calc
     336             : 
     337             :     case HTML_COL_ON:
     338             :     case HTML_COLGROUP_ON:
     339           4 :     case HTML_COLGROUP_OFF: break;
     340             : 
     341             :     case HTML_FONT_ON:
     342           0 :                             break;
     343             :     case HTML_FONT_OFF:
     344           0 :                             break;
     345             : 
     346             :     case HTML_TITLE_ON:
     347           0 :         bInTitle = true;
     348           0 :         break;
     349             :     case HTML_TITLE_OFF:
     350           0 :         bInTitle = false;
     351           0 :         break;
     352             : 
     353             :     // globals
     354             :     case HTML_HTML_ON:
     355             :     case HTML_HTML_OFF:
     356             :     case HTML_STYLE_ON:
     357             :     case HTML_STYLE_OFF:
     358             :     case HTML_BODY_ON:
     359             :     case HTML_BODY_OFF:
     360             :     case HTML_HEAD_ON:
     361             :     case HTML_HEAD_OFF:
     362             :     case HTML_FORM_ON:
     363             :     case HTML_FORM_OFF:
     364             :     case HTML_THEAD_ON:
     365             :     case HTML_THEAD_OFF:
     366             :     case HTML_TBODY_ON:
     367             :     case HTML_TBODY_OFF:
     368             :     // inline elements, structural markup
     369             :     // HTML 3.0
     370             :     case HTML_BANNER_ON:
     371             :     case HTML_BANNER_OFF:
     372             :     case HTML_DIVISION_ON:
     373             :     case HTML_DIVISION_OFF:
     374             : //  case HTML_LISTHEADER_ON:        //! special handling
     375             : //  case HTML_LISTHEADER_OFF:
     376             :     case HTML_NOTE_ON:
     377             :     case HTML_NOTE_OFF:
     378             :     // inline elements, logical markup
     379             :     // HTML 2.0
     380             :     case HTML_ADDRESS_ON:
     381             :     case HTML_ADDRESS_OFF:
     382             : //  case HTML_BLOCKQUOTE_ON:        //! special handling
     383             : //  case HTML_BLOCKQUOTE_OFF:
     384             :     case HTML_CITIATION_ON:
     385             :     case HTML_CITIATION_OFF:
     386             :     case HTML_CODE_ON:
     387             :     case HTML_CODE_OFF:
     388             :     case HTML_DEFINSTANCE_ON:
     389             :     case HTML_DEFINSTANCE_OFF:
     390             :     case HTML_EMPHASIS_ON:
     391             :     case HTML_EMPHASIS_OFF:
     392             :     case HTML_KEYBOARD_ON:
     393             :     case HTML_KEYBOARD_OFF:
     394             :     case HTML_SAMPLE_ON:
     395             :     case HTML_SAMPLE_OFF:
     396             :     case HTML_STRIKE_ON:
     397             :     case HTML_STRIKE_OFF:
     398             :     case HTML_STRONG_ON:
     399             :     case HTML_STRONG_OFF:
     400             :     case HTML_VARIABLE_ON:
     401             :     case HTML_VARIABLE_OFF:
     402             :     // HTML 3.0
     403             :     case HTML_ABBREVIATION_ON:
     404             :     case HTML_ABBREVIATION_OFF:
     405             :     case HTML_ACRONYM_ON:
     406             :     case HTML_ACRONYM_OFF:
     407             :     case HTML_AUTHOR_ON:
     408             :     case HTML_AUTHOR_OFF:
     409             : //  case HTML_BLOCKQUOTE30_ON:      //! special handling
     410             : //  case HTML_BLOCKQUOTE30_OFF:
     411             :     case HTML_DELETEDTEXT_ON:
     412             :     case HTML_DELETEDTEXT_OFF:
     413             :     case HTML_INSERTEDTEXT_ON:
     414             :     case HTML_INSERTEDTEXT_OFF:
     415             :     case HTML_LANGUAGE_ON:
     416             :     case HTML_LANGUAGE_OFF:
     417             :     case HTML_PERSON_ON:
     418             :     case HTML_PERSON_OFF:
     419             :     case HTML_SHORTQUOTE_ON:
     420             :     case HTML_SHORTQUOTE_OFF:
     421             :     case HTML_SUBSCRIPT_ON:
     422             :     case HTML_SUBSCRIPT_OFF:
     423             :     case HTML_SUPERSCRIPT_ON:
     424             :     case HTML_SUPERSCRIPT_OFF:
     425             :     // inline elements, visual markup
     426             :     // HTML 2.0
     427             :     case HTML_BOLD_ON:
     428             :     case HTML_BOLD_OFF:
     429             :     case HTML_ITALIC_ON:
     430             :     case HTML_ITALIC_OFF:
     431             :     case HTML_TELETYPE_ON:
     432             :     case HTML_TELETYPE_OFF:
     433             :     case HTML_UNDERLINE_ON:
     434             :     case HTML_UNDERLINE_OFF:
     435             :     // HTML 3.0
     436             :     case HTML_BIGPRINT_ON:
     437             :     case HTML_BIGPRINT_OFF:
     438             :     case HTML_STRIKETHROUGH_ON:
     439             :     case HTML_STRIKETHROUGH_OFF:
     440             :     case HTML_SMALLPRINT_ON:
     441             :     case HTML_SMALLPRINT_OFF:
     442             :     // figures
     443             :     case HTML_FIGURE_ON:
     444             :     case HTML_FIGURE_OFF:
     445             :     case HTML_CAPTION_ON:
     446             :     case HTML_CAPTION_OFF:
     447             :     case HTML_CREDIT_ON:
     448             :     case HTML_CREDIT_OFF:
     449             :     // misc
     450             :     case HTML_DIRLIST_ON:
     451             :     case HTML_DIRLIST_OFF:
     452             :     case HTML_FOOTNOTE_ON:          //! land so im Text
     453             :     case HTML_FOOTNOTE_OFF:
     454             :     case HTML_MENULIST_ON:
     455             :     case HTML_MENULIST_OFF:
     456             : //  case HTML_PLAINTEXT_ON:         //! special handling
     457             : //  case HTML_PLAINTEXT_OFF:
     458             : //  case HTML_PREFORMTXT_ON:        //! special handling
     459             : //  case HTML_PREFORMTXT_OFF:
     460             :     case HTML_SPAN_ON:
     461             :     case HTML_SPAN_OFF:
     462             :     // obsolete
     463             : //  case HTML_XMP_ON:               //! special handling
     464             : //  case HTML_XMP_OFF:
     465             : //  case HTML_LISTING_ON:           //! special handling
     466             : //  case HTML_LISTING_OFF:
     467             :     // Netscape
     468             :     case HTML_BLINK_ON:
     469             :     case HTML_BLINK_OFF:
     470             :     case HTML_NOBR_ON:
     471             :     case HTML_NOBR_OFF:
     472             :     case HTML_NOEMBED_ON:
     473             :     case HTML_NOEMBED_OFF:
     474             :     case HTML_NOFRAMES_ON:
     475             :     case HTML_NOFRAMES_OFF:
     476             :     // Internet Explorer
     477             :     case HTML_MARQUEE_ON:
     478             :     case HTML_MARQUEE_OFF:
     479             : //  case HTML_PLAINTEXT2_ON:        //! special handling
     480             : //  case HTML_PLAINTEXT2_OFF:
     481           3 :     break;
     482             : 
     483             :     default:
     484             :     {
     485           0 :         if ( nToken & HTML_TOKEN_ONOFF )
     486             :         {
     487           0 :             if ( ( nToken == HTML_UNKNOWNCONTROL_ON ) || ( nToken == HTML_UNKNOWNCONTROL_OFF ) )
     488             :             {
     489             :                 ;
     490             :             }
     491           0 :             else if ( !(nToken & 1) )
     492             :             {
     493             :                 DBG_ASSERT( !( nToken & 1 ), "No Start-Token ?!" );
     494           0 :                 SkipGroup( nToken + 1 );
     495             :             }
     496             :         }
     497             :     }
     498             :     }   // SWITCH
     499             : 
     500          34 :     if (mpEditEngine->IsImportHandlerSet())
     501             :     {
     502          34 :         ImportInfo aImportInfo(HTMLIMP_NEXTTOKEN, this, mpEditEngine->CreateESelection(aCurSel));
     503          34 :         aImportInfo.nToken = nToken;
     504          34 :         aImportInfo.nTokenValue = (short)nTokenValue;
     505          34 :         if ( nToken == HTML_TEXTTOKEN )
     506          13 :             aImportInfo.aText = aToken;
     507          21 :         else if (nToken == HTML_STYLE_OFF)
     508           0 :             aImportInfo.aText = maStyleSource.makeStringAndClear();
     509          34 :         mpEditEngine->CallImportHandler(aImportInfo);
     510             :     }
     511             : 
     512          34 : }
     513             : 
     514           6 : void EditHTMLParser::ImpInsertParaBreak()
     515             : {
     516           6 :     if (mpEditEngine->IsImportHandlerSet())
     517             :     {
     518           6 :         ImportInfo aImportInfo(HTMLIMP_INSERTPARA, this, mpEditEngine->CreateESelection(aCurSel));
     519           6 :         mpEditEngine->CallImportHandler(aImportInfo);
     520             :     }
     521           6 :     aCurSel = mpEditEngine->InsertParaBreak(aCurSel);
     522           6 : }
     523             : 
     524           0 : void EditHTMLParser::ImpSetAttribs( const SfxItemSet& rItems, EditSelection* pSel )
     525             : {
     526             :     // pSel, when character attributes, otherwise paragraph attributes for
     527             :     // the current paragraph.
     528             :     DBG_ASSERT( pSel || ( aCurSel.Min().GetNode() == aCurSel.Max().GetNode() ), "ImpInsertAttribs: Selection?" );
     529             : 
     530           0 :     EditPaM aStartPaM( pSel ? pSel->Min() : aCurSel.Min() );
     531           0 :     EditPaM aEndPaM( pSel ? pSel->Max() : aCurSel.Max() );
     532             : 
     533           0 :     if ( !pSel )
     534             :     {
     535           0 :         aStartPaM.SetIndex( 0 );
     536           0 :         aEndPaM.SetIndex( aEndPaM.GetNode()->Len() );
     537             :     }
     538             : 
     539           0 :     if (mpEditEngine->IsImportHandlerSet())
     540             :     {
     541           0 :         EditSelection aSel( aStartPaM, aEndPaM );
     542           0 :         ImportInfo aImportInfo(HTMLIMP_SETATTR, this, mpEditEngine->CreateESelection(aSel));
     543           0 :         aImportInfo.pAttrs = const_cast<SfxItemSet *>(&rItems);
     544           0 :         mpEditEngine->CallImportHandler(aImportInfo);
     545             :     }
     546             : 
     547           0 :     ContentNode* pSN = aStartPaM.GetNode();
     548           0 :     sal_Int32 nStartNode = mpEditEngine->GetEditDoc().GetPos( pSN );
     549             : 
     550             :     // If an attribute goes from 0 to current Paragraph length,
     551             :     // then it should be a paragraph attribute!
     552             : 
     553             :     // Note: Selection can reach over several Paragraphs.
     554             :     // All complete paragraphs are paragraph attributes ...
     555             : 
     556             :     // not really HTML:
     557             : #ifdef DBG_UTIL
     558             :     ContentNode* pEN = aEndPaM.GetNode();
     559             :     sal_Int32 nEndNode = mpEditEngine->GetEditDoc().GetPos( pEN );
     560             :     DBG_ASSERT( nStartNode == nEndNode, "ImpSetAttribs: Several paragraphs?" );
     561             : #endif
     562             : 
     563           0 :     if ( ( aStartPaM.GetIndex() == 0 ) && ( aEndPaM.GetIndex() == aEndPaM.GetNode()->Len() ) )
     564             :     {
     565             :         // Has to be merged:
     566           0 :         SfxItemSet aItems = mpEditEngine->GetBaseParaAttribs(nStartNode);
     567           0 :         aItems.Put( rItems );
     568           0 :         mpEditEngine->SetParaAttribsOnly(nStartNode, aItems);
     569             :     }
     570             :     else
     571           0 :         mpEditEngine->SetAttribs( EditSelection( aStartPaM, aEndPaM ), rItems );
     572           0 : }
     573             : 
     574           1 : void EditHTMLParser::ImpSetStyleSheet( sal_uInt16 nHLevel )
     575             : {
     576             :     /*
     577             :         nHLevel:    0:          Turn off
     578             :                     1-6:        Heading
     579             :                     STYLE_PRE:  Preformatted
     580             :     */
     581             :     // Create hard attributes ...
     582             :     // Enough for Calc, would have to be clarified with StyleSheets
     583             :     // that they should also be in the app so that when they are feed
     584             :     // in a different engine still are here ...
     585           1 :     sal_Int32 nNode = mpEditEngine->GetEditDoc().GetPos( aCurSel.Max().GetNode() );
     586             : 
     587           1 :     SfxItemSet aItems( aCurSel.Max().GetNode()->GetContentAttribs().GetItems() );
     588             : 
     589           1 :     aItems.ClearItem( EE_PARA_ULSPACE );
     590             : 
     591           1 :     aItems.ClearItem( EE_CHAR_FONTHEIGHT );
     592           1 :     aItems.ClearItem( EE_CHAR_FONTINFO );
     593           1 :     aItems.ClearItem( EE_CHAR_WEIGHT );
     594             : 
     595           1 :     aItems.ClearItem( EE_CHAR_FONTHEIGHT_CJK );
     596           1 :     aItems.ClearItem( EE_CHAR_FONTINFO_CJK );
     597           1 :     aItems.ClearItem( EE_CHAR_WEIGHT_CJK );
     598             : 
     599           1 :     aItems.ClearItem( EE_CHAR_FONTHEIGHT_CTL );
     600           1 :     aItems.ClearItem( EE_CHAR_FONTINFO_CTL );
     601           1 :     aItems.ClearItem( EE_CHAR_WEIGHT_CTL );
     602             : 
     603             :     // Bold in the first 3 Headings
     604           1 :     if ( ( nHLevel >= 1 ) && ( nHLevel <= 3 ) )
     605             :     {
     606           0 :         SvxWeightItem aWeightItem( WEIGHT_BOLD, EE_CHAR_WEIGHT );
     607           0 :         aItems.Put( aWeightItem );
     608             : 
     609           0 :         SvxWeightItem aWeightItemCJK( WEIGHT_BOLD, EE_CHAR_WEIGHT_CJK );
     610           0 :         aItems.Put( aWeightItem );
     611             : 
     612           0 :         SvxWeightItem aWeightItemCTL( WEIGHT_BOLD, EE_CHAR_WEIGHT_CTL );
     613           0 :         aItems.Put( aWeightItem );
     614             :     }
     615             : 
     616             :     // Font hight and margins, when LogicToLogic is possible:
     617           1 :     MapUnit eUnit = mpEditEngine->GetRefMapMode().GetMapUnit();
     618           1 :     if ( ( eUnit != MAP_PIXEL ) && ( eUnit != MAP_SYSFONT ) &&
     619           1 :          ( eUnit != MAP_APPFONT ) && ( eUnit != MAP_RELATIVE ) )
     620             :     {
     621           1 :         long nPoints = 10;
     622           1 :         if ( nHLevel == 1 )
     623           0 :             nPoints = 22;
     624           1 :         else if ( nHLevel == 2 )
     625           0 :             nPoints = 16;
     626           1 :         else if ( nHLevel == 3 )
     627           0 :             nPoints = 12;
     628           1 :         else if ( nHLevel == 4 )
     629           0 :             nPoints = 11;
     630             : 
     631           1 :         nPoints = OutputDevice::LogicToLogic( nPoints, MAP_POINT, eUnit );
     632             : 
     633           1 :         SvxFontHeightItem aHeightItem( nPoints, 100, EE_CHAR_FONTHEIGHT );
     634           1 :         aItems.Put( aHeightItem );
     635             : 
     636           2 :         SvxFontHeightItem aHeightItemCJK( nPoints, 100, EE_CHAR_FONTHEIGHT_CJK );
     637           1 :         aItems.Put( aHeightItemCJK );
     638             : 
     639           2 :         SvxFontHeightItem aHeightItemCTL( nPoints, 100, EE_CHAR_FONTHEIGHT_CTL );
     640           1 :         aItems.Put( aHeightItemCTL );
     641             : 
     642             :         // Paragraph margins, when Heading:
     643           1 :         if ( !nHLevel || ((nHLevel >= 1) && (nHLevel <= 6)) )
     644             :         {
     645           1 :             SvxULSpaceItem aULSpaceItem( EE_PARA_ULSPACE );
     646           1 :             aULSpaceItem.SetUpper( (sal_uInt16)OutputDevice::LogicToLogic( 42, MAP_10TH_MM, eUnit ) );
     647           1 :             aULSpaceItem.SetLower( (sal_uInt16)OutputDevice::LogicToLogic( 35, MAP_10TH_MM, eUnit ) );
     648           1 :             aItems.Put( aULSpaceItem );
     649           1 :         }
     650             :     }
     651             : 
     652             :     // Choose a proportional Font for Pre
     653           1 :     if ( nHLevel == STYLE_PRE )
     654             :     {
     655           0 :         vcl::Font aFont = OutputDevice::GetDefaultFont( DefaultFontType::FIXED, LANGUAGE_SYSTEM, GetDefaultFontFlags::NONE );
     656           0 :         SvxFontItem aFontItem( aFont.GetFamily(), aFont.GetName(), OUString(), aFont.GetPitch(), aFont.GetCharSet(), EE_CHAR_FONTINFO );
     657           0 :         aItems.Put( aFontItem );
     658             : 
     659           0 :         SvxFontItem aFontItemCJK( aFont.GetFamily(), aFont.GetName(), OUString(), aFont.GetPitch(), aFont.GetCharSet(), EE_CHAR_FONTINFO_CJK );
     660           0 :         aItems.Put( aFontItemCJK );
     661             : 
     662           0 :         SvxFontItem aFontItemCTL( aFont.GetFamily(), aFont.GetName(), OUString(), aFont.GetPitch(), aFont.GetCharSet(), EE_CHAR_FONTINFO_CTL );
     663           0 :         aItems.Put( aFontItemCTL );
     664             :     }
     665             : 
     666           1 :     mpEditEngine->SetParaAttribsOnly(nNode, aItems);
     667           1 : }
     668             : 
     669          13 : void EditHTMLParser::ImpInsertText( const OUString& rText )
     670             : {
     671          13 :     OUString aText( rText );
     672          13 :     if (mpEditEngine->IsImportHandlerSet())
     673             :     {
     674          13 :         ImportInfo aImportInfo(HTMLIMP_INSERTTEXT, this, mpEditEngine->CreateESelection(aCurSel));
     675          13 :         aImportInfo.aText = aText;
     676          13 :         mpEditEngine->CallImportHandler(aImportInfo);
     677             :     }
     678             : 
     679          13 :     aCurSel = mpEditEngine->InsertText(aCurSel, aText);
     680          13 : }
     681             : 
     682           0 : void EditHTMLParser::SkipGroup( int nEndToken )
     683             : {
     684             :     // groups in cells are closed upon leaving the cell, because those
     685             :     // ******* web authors don't know their job
     686             :     // for example: <td><form></td>   lacks a closing </form>
     687           0 :     sal_uInt8 nCellLevel = nInCell;
     688             :     int nToken;
     689           0 :     while( nCellLevel <= nInCell && ( (nToken = GetNextToken() ) != nEndToken ) && nToken )
     690             :     {
     691           0 :         switch ( nToken )
     692             :         {
     693             :             case HTML_TABLEHEADER_ON:
     694             :             case HTML_TABLEDATA_ON:
     695           0 :                 nInCell++;
     696           0 :             break;
     697             :             case HTML_TABLEHEADER_OFF:
     698             :             case HTML_TABLEDATA_OFF:
     699           0 :                 if ( nInCell )
     700           0 :                     nInCell--;
     701           0 :             break;
     702             :         }
     703             :     }
     704           0 : }
     705             : 
     706           9 : void EditHTMLParser::StartPara( bool bReal )
     707             : {
     708           9 :     if ( bReal )
     709             :     {
     710           0 :         const HTMLOptions& aOptions = GetOptions();
     711           0 :         SvxAdjust eAdjust = SVX_ADJUST_LEFT;
     712           0 :         for ( size_t i = 0, n = aOptions.size(); i < n; ++i )
     713             :         {
     714           0 :             const HTMLOption& aOption = aOptions[i];
     715           0 :             switch( aOption.GetToken() )
     716             :             {
     717             :                 case HTML_O_ALIGN:
     718             :                 {
     719           0 :                     OUString const& rTmp(aOption.GetString());
     720           0 :                     if (rTmp.equalsIgnoreAsciiCase(OOO_STRING_SVTOOLS_HTML_AL_right))
     721           0 :                         eAdjust = SVX_ADJUST_RIGHT;
     722           0 :                     else if (rTmp.equalsIgnoreAsciiCase(OOO_STRING_SVTOOLS_HTML_AL_middle))
     723           0 :                         eAdjust = SVX_ADJUST_CENTER;
     724           0 :                     else if (rTmp.equalsIgnoreAsciiCase(OOO_STRING_SVTOOLS_HTML_AL_center))
     725           0 :                         eAdjust = SVX_ADJUST_CENTER;
     726             :                     else
     727           0 :                         eAdjust = SVX_ADJUST_LEFT;
     728             :                 }
     729           0 :                 break;
     730             :             }
     731             :         }
     732           0 :         SfxItemSet aItemSet = mpEditEngine->GetEmptyItemSet();
     733           0 :         aItemSet.Put( SvxAdjustItem( eAdjust, EE_PARA_JUST ) );
     734           0 :         ImpSetAttribs( aItemSet );
     735             :     }
     736           9 :     bInPara = true;
     737           9 : }
     738             : 
     739           6 : void EditHTMLParser::EndPara( bool )
     740             : {
     741           6 :     if ( bInPara )
     742             :     {
     743           6 :         bool bHasText = HasTextInCurrentPara();
     744           6 :         if ( bHasText )
     745           6 :             ImpInsertParaBreak();
     746             :     }
     747           6 :     bInPara = false;
     748           6 : }
     749             : 
     750           7 : bool EditHTMLParser::ThrowAwayBlank()
     751             : {
     752             :     // A blank must be thrown away if the new text begins with a Blank and
     753             :     // if the current paragraph is empty or ends with a Blank...
     754           7 :     ContentNode* pNode = aCurSel.Max().GetNode();
     755           7 :     if ( pNode->Len() && ( pNode->GetChar( pNode->Len()-1 ) != ' ' ) )
     756           0 :         return false;
     757           7 :     return true;
     758             : }
     759             : 
     760          12 : bool EditHTMLParser::HasTextInCurrentPara()
     761             : {
     762          12 :     return aCurSel.Max().GetNode()->Len() != 0;
     763             : }
     764             : 
     765           0 : void EditHTMLParser::AnchorStart()
     766             : {
     767             :     // ignore anchor in anchor
     768           0 :     if ( !pCurAnchor )
     769             :     {
     770           0 :         const HTMLOptions& aOptions = GetOptions();
     771           0 :         OUString aRef;
     772             : 
     773           0 :         for ( size_t i = 0, n = aOptions.size(); i < n; ++i )
     774             :         {
     775           0 :             const HTMLOption& aOption = aOptions[i];
     776           0 :             switch( aOption.GetToken() )
     777             :             {
     778             :                 case HTML_O_HREF:
     779           0 :                     aRef = aOption.GetString();
     780           0 :                 break;
     781             :             }
     782             :         }
     783             : 
     784           0 :         if ( !aRef.isEmpty() )
     785             :         {
     786           0 :             OUString aURL = aRef;
     787           0 :             if ( !aURL.isEmpty() && ( aURL[ 0 ] != '#' ) )
     788             :             {
     789           0 :                 INetURLObject aTargetURL;
     790           0 :                 INetURLObject aRootURL( aBaseURL );
     791           0 :                 aRootURL.GetNewAbsURL( aRef, &aTargetURL );
     792           0 :                 aURL = aTargetURL.GetMainURL( INetURLObject::DECODE_TO_IURI );
     793             :             }
     794           0 :             pCurAnchor = new AnchorInfo;
     795           0 :             pCurAnchor->aHRef = aURL;
     796           0 :         }
     797             :     }
     798           0 : }
     799             : 
     800           0 : void EditHTMLParser::AnchorEnd()
     801             : {
     802           0 :     if ( pCurAnchor )
     803             :     {
     804             :         // Insert as URL-Field...
     805           0 :         SvxFieldItem aFld( SvxURLField( pCurAnchor->aHRef, pCurAnchor->aText, SVXURLFORMAT_REPR ), EE_FEATURE_FIELD  );
     806           0 :         aCurSel = mpEditEngine->InsertField(aCurSel, aFld);
     807           0 :         bFieldsInserted = true;
     808           0 :         delete pCurAnchor;
     809           0 :         pCurAnchor = NULL;
     810             : 
     811           0 :         if (mpEditEngine->IsImportHandlerSet())
     812             :         {
     813           0 :             ImportInfo aImportInfo(HTMLIMP_INSERTFIELD, this, mpEditEngine->CreateESelection(aCurSel));
     814           0 :             mpEditEngine->CallImportHandler(aImportInfo);
     815           0 :         }
     816             :     }
     817           0 : }
     818             : 
     819           0 : void EditHTMLParser::HeadingStart( int nToken )
     820             : {
     821           0 :     bWasInPara = bInPara;
     822           0 :     StartPara( false );
     823             : 
     824           0 :     if ( bWasInPara && HasTextInCurrentPara() )
     825           0 :         ImpInsertParaBreak();
     826             : 
     827             :     sal_uInt16 nId = sal::static_int_cast< sal_uInt16 >(
     828           0 :         1 + ( ( nToken - HTML_HEAD1_ON ) / 2 ) );
     829             :     DBG_ASSERT( (nId >= 1) && (nId <= 9), "HeadingStart: ID can not be correct!" );
     830           0 :     ImpSetStyleSheet( nId );
     831           0 : }
     832             : 
     833           0 : void EditHTMLParser::HeadingEnd( int )
     834             : {
     835           0 :     EndPara( false );
     836           0 :     ImpSetStyleSheet( 0 );
     837             : 
     838           0 :     if ( bWasInPara )
     839             :     {
     840           0 :         bInPara = true;
     841           0 :         bWasInPara = false;
     842             :     }
     843           0 : }
     844             : 
     845             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11