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 #pragma once
21 
22 #include <rtl/textenc.h>
23 #include <tools/gen.hxx>
24 #include <tools/color.hxx>
25 #include <vcl/vclptr.hxx>
26 #include <vector>
27 #include <memory>
28 #include <map>
29 #include <svx/xoutbmp.hxx>
30 
31 #include "expbase.hxx"
32 
33 class ScDocument;
34 class SfxItemSet;
35 class SdrPage;
36 class Graphic;
37 class SdrObject;
38 class OutputDevice;
39 class ScDrawLayer;
40 class EditTextObject;
41 enum class SvtScriptType;
42 namespace editeng { class SvxBorderLine; }
43 
44 namespace sc {
45 struct ColumnBlockPosition;
46 }
47 
48 struct ScHTMLStyle
49 {   // Defaults from stylesheet
50     Color               aBackgroundColor;
51     OUString            aFontFamilyName;
52     sal_uInt32          nFontHeight;        // Item-Value
53     sal_uInt16          nFontSizeNumber;    // HTML value 1-7
54     SvtScriptType       nDefaultScriptType; // Font values are valid for the default script type
55     bool                bInitialized;
56 
ScHTMLStyleScHTMLStyle57     ScHTMLStyle() :
58         nFontHeight(0),
59         nFontSizeNumber(2),
60         nDefaultScriptType(),
61         bInitialized(false)
62     {}
63 
operator =ScHTMLStyle64     const ScHTMLStyle& operator=( const ScHTMLStyle& rScHTMLStyle )
65     {
66         aBackgroundColor   = rScHTMLStyle.aBackgroundColor;
67         aFontFamilyName    = rScHTMLStyle.aFontFamilyName;
68         nFontHeight        = rScHTMLStyle.nFontHeight;
69         nFontSizeNumber    = rScHTMLStyle.nFontSizeNumber;
70         nDefaultScriptType = rScHTMLStyle.nDefaultScriptType;
71         bInitialized       = rScHTMLStyle.bInitialized;
72         return *this;
73     }
74 };
75 
76 struct ScHTMLGraphEntry
77 {
78     ScRange             aRange;         // mapped range
79     Size                aSize;          // size in pixels
80     Size                aSpace;         // spacing in pixels
81     SdrObject*          pObject;
82     bool                bInCell;        // if output is in cell
83     bool                bWritten;
84 
ScHTMLGraphEntryScHTMLGraphEntry85     ScHTMLGraphEntry( SdrObject* pObj, const ScRange& rRange,
86                       const Size& rSize,  bool bIn, const Size& rSpace ) :
87         aRange( rRange ),
88         aSize( rSize ),
89         aSpace( rSpace ),
90         pObject( pObj ),
91         bInCell( bIn ),
92         bWritten( false )
93     {}
94 };
95 
96 #define SC_HTML_FONTSIZES 7
97 const short nIndentMax = 23;
98 
99 class ScHTMLExport : public ScExportBase
100 {
101     // default HtmlFontSz[1-7]
102     static const sal_uInt16 nDefaultFontSize[SC_HTML_FONTSIZES];
103     // HtmlFontSz[1-7] in s*3.ini [user]
104     static sal_uInt16       nFontSize[SC_HTML_FONTSIZES];
105     static const char*  pFontSizeCss[SC_HTML_FONTSIZES];
106     static const sal_uInt16 nCellSpacing;
107     static const char sIndentSource[];
108 
109     typedef std::unique_ptr<std::map<OUString, OUString> > FileNameMapPtr;
110     typedef std::vector<ScHTMLGraphEntry> GraphEntryList;
111 
112     GraphEntryList   aGraphList;
113     ScHTMLStyle      aHTMLStyle;
114     OUString         aBaseURL;
115     OUString         aStreamPath;
116     VclPtr<OutputDevice> pAppWin;        // for Pixel-work
117     FileNameMapPtr   pFileNameMap;        // for CopyLocalFileToINet
118     OUString         aNonConvertibleChars;   // collect nonconvertible characters
119     rtl_TextEncoding eDestEnc;
120     SCTAB            nUsedTables;
121     short            nIndent;
122     char             sIndent[nIndentMax+1];
123     bool             bAll;           // whole document
124     bool             bTabHasGraphics;
125     bool             bTabAlignedLeft;
126     bool             bCalcAsShown;
127     bool             bCopyLocalFileToINet;
128     bool             bTableDataHeight;
129     bool             mbSkipImages;
130     /// If HTML header and footer should be written as well, or just the content itself.
131     bool             mbSkipHeaderFooter;
132 
133     const SfxItemSet& PageDefaults( SCTAB nTab );
134 
135     void WriteBody();
136     void WriteHeader();
137     void WriteOverview();
138     void WriteTables();
139     void WriteCell( sc::ColumnBlockPosition& rBlockPos, SCCOL nCol, SCROW nRow, SCTAB nTab );
140     void WriteGraphEntry( ScHTMLGraphEntry* );
141     void WriteImage( OUString& rLinkName,
142                      const Graphic&, std::string_view rImgOptions,
143                      XOutFlags nXOutFlags = XOutFlags::NONE );
144             // nXOutFlags for XOutBitmap::WriteGraphic
145 
146     // write to stream if and only if URL fields in edit cell
147     bool WriteFieldText( const EditTextObject* pData );
148 
149     // copy a local file to internet if needed
150     void CopyLocalFileToINet( OUString& rFileNm, const OUString& rTargetNm );
151 
152     void PrepareGraphics( ScDrawLayer*, SCTAB nTab,
153                           SCCOL nStartCol, SCROW nStartRow,
154                           SCCOL nEndCol, SCROW nEndRow );
155 
156     void FillGraphList( const SdrPage*, SCTAB nTab,
157                         SCCOL nStartCol, SCROW nStartRow,
158                         SCCOL nEndCol, SCROW nEndRow );
159 
160     static OString BorderToStyle(const char* pBorderName,
161                           const editeng::SvxBorderLine* pLine,
162                           bool& bInsertSemicolon);
163 
164     static sal_uInt16  GetFontSizeNumber( sal_uInt16 nHeight );
165     static const char* GetFontSizeCss( sal_uInt16 nHeight );
166     sal_uInt16  ToPixel( sal_uInt16 nTwips );
167     Size        MMToPixel( const Size& r100thMMSize );
168     void        IncIndent( short nVal );
169 
GetIndentStr() const170     const char* GetIndentStr() const
171     {
172         return sIndent;
173     }
174 
175 public:
176                         ScHTMLExport( SvStream&, const OUString&, ScDocument*, const ScRange&,
177                                       bool bAll, const OUString& aStreamPath, std::u16string_view rFilterOptions );
178     virtual             ~ScHTMLExport() override;
179     void                Write();
GetNonConvertibleChars() const180     const OUString&     GetNonConvertibleChars() const
181     {
182         return aNonConvertibleChars;
183     }
184 };
185 
186 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
187