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 : */
10 :
11 : #include <svtools/HtmlWriter.hxx>
12 :
13 281 : HtmlWriter::HtmlWriter(SvStream& rStream) :
14 : mrStream(rStream),
15 : mbElementOpen(false),
16 : mbContentWritten(false),
17 : mbPrettyPrint(true),
18 281 : maEncoding(RTL_TEXTENCODING_UTF8)
19 281 : {}
20 :
21 281 : HtmlWriter::~HtmlWriter()
22 281 : {}
23 :
24 15 : void HtmlWriter::prettyPrint(bool bChoice)
25 : {
26 15 : mbPrettyPrint = bChoice;
27 15 : }
28 :
29 299 : void HtmlWriter::start(const OString& aElement)
30 : {
31 299 : if (mbElementOpen)
32 : {
33 14 : mrStream.WriteChar('>');
34 14 : if (!mbContentWritten && mbPrettyPrint)
35 3 : mrStream.WriteChar('\n');
36 14 : mbContentWritten = false;
37 : }
38 299 : maElementStack.push_back(aElement);
39 :
40 299 : if (mbPrettyPrint)
41 : {
42 277 : for(size_t i = 0; i < maElementStack.size() - 1; i++)
43 : {
44 4 : mrStream.WriteCharPtr(" ");
45 : }
46 : }
47 :
48 299 : mrStream.WriteChar('<');
49 299 : mrStream.WriteOString(aElement);
50 299 : mbElementOpen = true;
51 299 : }
52 :
53 268 : void HtmlWriter::single(const OString &aContent)
54 : {
55 268 : start(aContent);
56 268 : end();
57 268 : }
58 :
59 0 : void HtmlWriter::endAttribute()
60 : {
61 0 : if (mbElementOpen)
62 : {
63 0 : mrStream.WriteCharPtr("/>");
64 0 : if (mbPrettyPrint)
65 0 : mrStream.WriteCharPtr("\n");
66 0 : mbElementOpen = false;
67 : }
68 0 : }
69 :
70 4 : void HtmlWriter::flushStack()
71 : {
72 17 : while (!maElementStack.empty())
73 : {
74 9 : end();
75 : }
76 4 : }
77 :
78 6 : void HtmlWriter::flushStack(const OString& aElement)
79 : {
80 6 : OString sCurrentElement;
81 12 : do
82 : {
83 12 : sCurrentElement = maElementStack.back();
84 12 : end();
85 18 : } while (!maElementStack.empty() && aElement != sCurrentElement);
86 6 : }
87 :
88 297 : void HtmlWriter::end()
89 : {
90 297 : if (mbElementOpen)
91 : {
92 282 : mrStream.WriteCharPtr("/>");
93 282 : if (mbPrettyPrint)
94 270 : mrStream.WriteCharPtr("\n");
95 : }
96 : else
97 : {
98 15 : if (!mbContentWritten && mbPrettyPrint)
99 : {
100 4 : for(size_t i = 0; i < maElementStack.size() - 1; i++)
101 : {
102 1 : mrStream.WriteCharPtr(" ");
103 : }
104 : }
105 15 : mrStream.WriteCharPtr("</");
106 15 : mrStream.WriteOString(maElementStack.back());
107 15 : mrStream.WriteCharPtr(">");
108 15 : if (mbPrettyPrint)
109 3 : mrStream.WriteCharPtr("\n");
110 : }
111 297 : maElementStack.pop_back();
112 297 : mbElementOpen = false;
113 297 : mbContentWritten = false;
114 297 : }
115 :
116 3 : void HtmlWriter::write(const OString &aContent)
117 : {
118 3 : if (mbElementOpen)
119 : {
120 3 : mrStream.WriteChar('>');
121 3 : mbElementOpen = false;
122 : }
123 3 : mbContentWritten = true;
124 3 : mrStream.WriteOString(aContent);
125 3 : }
126 :
127 36 : void HtmlWriter::attribute(const OString &aAttribute, const OString& aValue)
128 : {
129 36 : if (mbElementOpen && !aAttribute.isEmpty() && !aValue.isEmpty())
130 : {
131 36 : mrStream.WriteChar(' ');
132 36 : mrStream.WriteOString(aAttribute);
133 36 : mrStream.WriteChar('=');
134 36 : mrStream.WriteChar('"');
135 36 : mrStream.WriteOString(aValue);
136 36 : mrStream.WriteChar('"');
137 : }
138 36 : }
139 :
140 6 : void HtmlWriter::attribute(const OString& aAttribute, const sal_Int32 aValue)
141 : {
142 6 : attribute(aAttribute, OString::number(aValue));
143 6 : }
144 :
145 11 : void HtmlWriter::attribute(const OString& aAttribute, const char* pValue)
146 : {
147 11 : attribute(aAttribute, OString(pValue));
148 11 : }
149 :
150 6 : void HtmlWriter::attribute(const OString& aAttribute, const OUString& aValue)
151 : {
152 6 : attribute(aAttribute, OUStringToOString(aValue, maEncoding));
153 6 : }
154 :
155 0 : void HtmlWriter::attribute(const OString& aAttribute)
156 : {
157 0 : if (mbElementOpen && !aAttribute.isEmpty())
158 : {
159 0 : mrStream.WriteChar(' ');
160 0 : mrStream.WriteOString(aAttribute);
161 : }
162 0 : }
163 :
164 :
165 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|