/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
// Although the real default encoding is ISO8859-1, we use MS-1252 // as default encoding.
SetSrcEncoding( GetExtendedCompatibilityTextEncoding( RTL_TEXTENCODING_ISO_8859_1 ) );
// If the file starts with a BOM, switch to UCS2.
SetSwitchToUCS2( true );
} break; case HtmlTokenId::PLAINTEXT_ON: case HtmlTokenId::PLAINTEXT2_ON:
bInPara = true; break; case HtmlTokenId::PLAINTEXT_OFF: case HtmlTokenId::PLAINTEXT2_OFF:
bInPara = false; break;
case HtmlTokenId::LINEBREAK: case HtmlTokenId::NEWPARA:
{ if ( ( bInPara || nInTable ) &&
( ( nToken == HtmlTokenId::LINEBREAK ) || HasTextInCurrentPara() ) )
{
ImpInsertParaBreak();
}
} break; case HtmlTokenId::HORZRULE:
{ if ( HasTextInCurrentPara() )
ImpInsertParaBreak();
ImpInsertParaBreak();
} break; case HtmlTokenId::NONBREAKSPACE:
{ if ( bInPara )
{
ImpInsertText( u" "_ustr );
}
} break; case HtmlTokenId::RAWDATA: if (IsReadStyle() && !aToken.isEmpty())
{ // Each token represents a single line.
maStyleSource.append(aToken);
maStyleSource.append('\n');
} break; case HtmlTokenId::TEXTTOKEN:
{ // #i110937# for <title> content, call aImportHdl (no SkipGroup), but don't insert the text into the EditEngine if (!bInTitle)
{ if ( !bInPara )
StartPara( false );
if ( moCurAnchor )
{
moCurAnchor->aText += aText;
} else
{ // Only written until HTML with 319? if ( IsReadPRE() )
aText = aText.replaceAll(u"\t", u" ");
ImpInsertText( aText );
}
}
} break;
case HtmlTokenId::PARABREAK_OFF: if( bInPara )
EndPara(); break;
case HtmlTokenId::HEAD1_ON: case HtmlTokenId::HEAD2_ON: case HtmlTokenId::HEAD3_ON: case HtmlTokenId::HEAD4_ON: case HtmlTokenId::HEAD5_ON: case HtmlTokenId::HEAD6_ON:
{
HeadingStart( nToken );
} break;
case HtmlTokenId::HEAD1_OFF: case HtmlTokenId::HEAD2_OFF: case HtmlTokenId::HEAD3_OFF: case HtmlTokenId::HEAD4_OFF: case HtmlTokenId::HEAD5_OFF: case HtmlTokenId::HEAD6_OFF:
{
HeadingEnd();
} break;
case HtmlTokenId::PREFORMTXT_ON: case HtmlTokenId::XMP_ON: case HtmlTokenId::LISTING_ON:
{
StartPara( true );
ImpSetStyleSheet( STYLE_PRE );
} break;
case HtmlTokenId::DEFLIST_ON:
{
nDefListLevel++;
} break;
case HtmlTokenId::DEFLIST_OFF:
{ if( nDefListLevel )
nDefListLevel--;
} break;
case HtmlTokenId::TABLE_ON: nInTable++; break; case HtmlTokenId::TABLE_OFF: DBG_ASSERT( nInTable, "Not in Table, but TABLE_OFF?" );
nInTable--; break;
case HtmlTokenId::TABLEHEADER_ON: case HtmlTokenId::TABLEDATA_ON:
nInCell++;
Newline(); break;
case HtmlTokenId::DIVISION_ON: case HtmlTokenId::DIVISION_OFF:
{
mbNewBlockNeeded = true; break;
}
case HtmlTokenId::BLOCKQUOTE_ON: case HtmlTokenId::BLOCKQUOTE_OFF: case HtmlTokenId::BLOCKQUOTE30_ON: case HtmlTokenId::BLOCKQUOTE30_OFF: case HtmlTokenId::LISTHEADER_ON: case HtmlTokenId::LI_ON: case HtmlTokenId::DD_ON: case HtmlTokenId::DT_ON: case HtmlTokenId::ORDERLIST_ON: case HtmlTokenId::UNORDERLIST_ON:
Newline(); break;
case HtmlTokenId::TABLEHEADER_OFF: case HtmlTokenId::TABLEDATA_OFF: if ( nInCell )
nInCell--;
EndPara(); break; case HtmlTokenId::LISTHEADER_OFF: case HtmlTokenId::LI_OFF: case HtmlTokenId::DD_OFF: case HtmlTokenId::DT_OFF: case HtmlTokenId::ORDERLIST_OFF: case HtmlTokenId::UNORDERLIST_OFF:
EndPara(); break;
case HtmlTokenId::TABLEROW_ON: case HtmlTokenId::TABLEROW_OFF: // A RETURN only after a CELL, for Calc
case HtmlTokenId::COL_ON: case HtmlTokenId::COLGROUP_ON: case HtmlTokenId::COLGROUP_OFF: break;
case HtmlTokenId::FONT_ON: break; case HtmlTokenId::FONT_OFF: break;
case HtmlTokenId::TITLE_ON:
bInTitle = true; break; case HtmlTokenId::TITLE_OFF:
bInTitle = false; break;
// globals case HtmlTokenId::HTML_ON: case HtmlTokenId::HTML_OFF: case HtmlTokenId::STYLE_ON: case HtmlTokenId::STYLE_OFF: case HtmlTokenId::BODY_ON: case HtmlTokenId::BODY_OFF: case HtmlTokenId::HEAD_ON: case HtmlTokenId::HEAD_OFF: case HtmlTokenId::FORM_ON: case HtmlTokenId::FORM_OFF: case HtmlTokenId::THEAD_ON: case HtmlTokenId::THEAD_OFF: case HtmlTokenId::TBODY_ON: case HtmlTokenId::TBODY_OFF: // inline elements, structural markup // HTML 3.0 case HtmlTokenId::BANNER_ON: case HtmlTokenId::BANNER_OFF: // case HtmlTokenId::LISTHEADER_ON: //! special handling // case HtmlTokenId::LISTHEADER_OFF: case HtmlTokenId::NOTE_ON: case HtmlTokenId::NOTE_OFF: // inline elements, logical markup // HTML 2.0 case HtmlTokenId::ADDRESS_ON: case HtmlTokenId::ADDRESS_OFF: // case HtmlTokenId::BLOCKQUOTE_ON: //! special handling // case HtmlTokenId::BLOCKQUOTE_OFF: case HtmlTokenId::CITATION_ON: case HtmlTokenId::CITATION_OFF: case HtmlTokenId::CODE_ON: case HtmlTokenId::CODE_OFF: case HtmlTokenId::DEFINSTANCE_ON: case HtmlTokenId::DEFINSTANCE_OFF: case HtmlTokenId::EMPHASIS_ON: case HtmlTokenId::EMPHASIS_OFF: case HtmlTokenId::KEYBOARD_ON: case HtmlTokenId::KEYBOARD_OFF: case HtmlTokenId::SAMPLE_ON: case HtmlTokenId::SAMPLE_OFF: case HtmlTokenId::STRIKE_ON: case HtmlTokenId::STRIKE_OFF: case HtmlTokenId::STRONG_ON: case HtmlTokenId::STRONG_OFF: case HtmlTokenId::VARIABLE_ON: case HtmlTokenId::VARIABLE_OFF: // HTML 3.0 case HtmlTokenId::ABBREVIATION_ON: case HtmlTokenId::ABBREVIATION_OFF: case HtmlTokenId::ACRONYM_ON: case HtmlTokenId::ACRONYM_OFF: case HtmlTokenId::AUTHOR_ON: case HtmlTokenId::AUTHOR_OFF: // case HtmlTokenId::BLOCKQUOTE30_ON: //! special handling // case HtmlTokenId::BLOCKQUOTE30_OFF: case HtmlTokenId::DELETEDTEXT_ON: case HtmlTokenId::DELETEDTEXT_OFF: case HtmlTokenId::INSERTEDTEXT_ON: case HtmlTokenId::INSERTEDTEXT_OFF: case HtmlTokenId::LANGUAGE_ON: case HtmlTokenId::LANGUAGE_OFF: case HtmlTokenId::PERSON_ON: case HtmlTokenId::PERSON_OFF: case HtmlTokenId::SHORTQUOTE_ON: case HtmlTokenId::SHORTQUOTE_OFF: case HtmlTokenId::SUBSCRIPT_ON: case HtmlTokenId::SUBSCRIPT_OFF: case HtmlTokenId::SUPERSCRIPT_ON: case HtmlTokenId::SUPERSCRIPT_OFF: // inline elements, visual markup // HTML 2.0 case HtmlTokenId::BOLD_ON: case HtmlTokenId::BOLD_OFF: case HtmlTokenId::ITALIC_ON: case HtmlTokenId::ITALIC_OFF: case HtmlTokenId::TELETYPE_ON: case HtmlTokenId::TELETYPE_OFF: case HtmlTokenId::UNDERLINE_ON: case HtmlTokenId::UNDERLINE_OFF: // HTML 3.0 case HtmlTokenId::BIGPRINT_ON: case HtmlTokenId::BIGPRINT_OFF: case HtmlTokenId::STRIKETHROUGH_ON: case HtmlTokenId::STRIKETHROUGH_OFF: case HtmlTokenId::SMALLPRINT_ON: case HtmlTokenId::SMALLPRINT_OFF: // figures case HtmlTokenId::FIGURE_ON: case HtmlTokenId::FIGURE_OFF: case HtmlTokenId::CAPTION_ON: case HtmlTokenId::CAPTION_OFF: case HtmlTokenId::CREDIT_ON: case HtmlTokenId::CREDIT_OFF: // misc case HtmlTokenId::DIRLIST_ON: case HtmlTokenId::DIRLIST_OFF: case HtmlTokenId::FOOTNOTE_ON: //! they land so in the text case HtmlTokenId::FOOTNOTE_OFF: case HtmlTokenId::MENULIST_ON: case HtmlTokenId::MENULIST_OFF: // case HtmlTokenId::PLAINTEXT_ON: //! special handling // case HtmlTokenId::PLAINTEXT_OFF: // case HtmlTokenId::PREFORMTXT_ON: //! special handling // case HtmlTokenId::PREFORMTXT_OFF: case HtmlTokenId::SPAN_ON: case HtmlTokenId::SPAN_OFF: // obsolete // case HtmlTokenId::XMP_ON: //! special handling // case HtmlTokenId::XMP_OFF: // case HtmlTokenId::LISTING_ON: //! special handling // case HtmlTokenId::LISTING_OFF: // Netscape case HtmlTokenId::BLINK_ON: case HtmlTokenId::BLINK_OFF: case HtmlTokenId::NOBR_ON: case HtmlTokenId::NOBR_OFF: case HtmlTokenId::NOEMBED_ON: case HtmlTokenId::NOEMBED_OFF: case HtmlTokenId::NOFRAMES_ON: case HtmlTokenId::NOFRAMES_OFF: // Internet Explorer case HtmlTokenId::MARQUEE_ON: case HtmlTokenId::MARQUEE_OFF: // case HtmlTokenId::PLAINTEXT2_ON: //! special handling // case HtmlTokenId::PLAINTEXT2_OFF: break;
if ( ( aStartPaM.GetIndex() == 0 ) && ( aEndPaM.GetIndex() == aEndPaM.GetNode()->Len() ) )
{ // Has to be merged:
SfxItemSet aItems = mpEditEngine->GetBaseParaAttribs(nStartNode);
aItems.Put( rItems );
mpEditEngine->SetParaAttribsOnly(nStartNode, aItems);
} else
mpEditEngine->SetAttribs( EditSelection( aStartPaM, aEndPaM ), rItems );
}
void EditHTMLParser::ImpSetStyleSheet( sal_uInt16 nHLevel )
{ /* nHLevel: 0: Turn off 1-6: Heading STYLE_PRE: Preformatted
*/ // Create hard attributes ... // Enough for Calc, would have to be clarified with StyleSheets // that they should also be in the app so that when they are feed // in a different engine still are here ...
sal_Int32 nNode = mpEditEngine->GetEditDoc().GetPos( aCurSel.Max().GetNode() );
void EditHTMLParser::SkipGroup( HtmlTokenId nEndToken )
{ // groups in cells are closed upon leaving the cell, because those // ******* web authors don't know their job // for example: <td><form></td> lacks a closing </form>
sal_uInt8 nCellLevel = nInCell;
HtmlTokenId nToken; while( nCellLevel <= nInCell )
{
nToken = GetNextToken(); if (nToken == nEndToken || nToken == HtmlTokenId::NONE) break; switch ( nToken )
{ case HtmlTokenId::TABLEHEADER_ON: case HtmlTokenId::TABLEDATA_ON:
nInCell++; break; case HtmlTokenId::TABLEHEADER_OFF: case HtmlTokenId::TABLEDATA_OFF: if ( nInCell )
nInCell--; break; default: break;
}
}
}
bool EditHTMLParser::ThrowAwayBlank()
{ // A blank must be thrown away if the new text begins with a Blank and // if the current paragraph is empty or ends with a Blank...
ContentNode* pNode = aCurSel.Max().GetNode(); return !(pNode->Len() && ( pNode->GetChar( pNode->Len()-1 ) != ' ' ));
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.