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 556 : HtmlWriter::HtmlWriter(SvStream& rStream) :
14 : mrStream(rStream),
15 : mbElementOpen(false),
16 : mbContentWritten(false),
17 : mbPrettyPrint(true),
18 556 : maEncoding(RTL_TEXTENCODING_UTF8)
19 556 : {}
20 :
21 556 : HtmlWriter::~HtmlWriter()
22 556 : {}
23 :
24 30 : void HtmlWriter::prettyPrint(bool bChoice)
25 : {
26 30 : mbPrettyPrint = bChoice;
27 30 : }
28 :
29 592 : void HtmlWriter::start(const OString& aElement)
30 : {
31 592 : if (mbElementOpen)
32 : {
33 30 : mrStream.WriteChar('>');
34 30 : if (!mbContentWritten && mbPrettyPrint)
35 8 : mrStream.WriteChar('\n');
36 30 : mbContentWritten = false;
37 : }
38 592 : maElementStack.push_back(aElement);
39 :
40 592 : if (mbPrettyPrint)
41 : {
42 550 : for(size_t i = 0; i < maElementStack.size() - 1; i++)
43 : {
44 10 : mrStream.WriteCharPtr(" ");
45 : }
46 : }
47 :
48 592 : mrStream.WriteChar('<');
49 592 : mrStream.WriteOString(aElement);
50 592 : mbElementOpen = true;
51 592 : }
52 :
53 528 : void HtmlWriter::single(const OString &aContent)
54 : {
55 528 : start(aContent);
56 528 : end();
57 528 : }
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 8 : void HtmlWriter::flushStack()
71 : {
72 36 : while (!maElementStack.empty())
73 : {
74 20 : end();
75 : }
76 8 : }
77 :
78 12 : void HtmlWriter::flushStack(const OString& aElement)
79 : {
80 12 : OString sCurrentElement;
81 24 : do
82 : {
83 24 : sCurrentElement = maElementStack.back();
84 24 : end();
85 36 : } while (!maElementStack.empty() && aElement != sCurrentElement);
86 12 : }
87 :
88 588 : void HtmlWriter::end()
89 : {
90 588 : if (mbElementOpen)
91 : {
92 556 : mrStream.WriteCharPtr("/>");
93 556 : if (mbPrettyPrint)
94 532 : mrStream.WriteCharPtr("\n");
95 : }
96 : else
97 : {
98 32 : if (!mbContentWritten && mbPrettyPrint)
99 : {
100 10 : for(size_t i = 0; i < maElementStack.size() - 1; i++)
101 : {
102 2 : mrStream.WriteCharPtr(" ");
103 : }
104 : }
105 32 : mrStream.WriteCharPtr("</");
106 32 : mrStream.WriteOString(maElementStack.back());
107 32 : mrStream.WriteCharPtr(">");
108 32 : if (mbPrettyPrint)
109 8 : mrStream.WriteCharPtr("\n");
110 : }
111 588 : maElementStack.pop_back();
112 588 : mbElementOpen = false;
113 588 : mbContentWritten = false;
114 588 : }
115 :
116 6 : void HtmlWriter::write(const OString &aContent)
117 : {
118 6 : if (mbElementOpen)
119 : {
120 6 : mrStream.WriteChar('>');
121 6 : mbElementOpen = false;
122 : }
123 6 : mbContentWritten = true;
124 6 : mrStream.WriteOString(aContent);
125 6 : }
126 :
127 74 : void HtmlWriter::attribute(const OString &aAttribute, const OString& aValue)
128 : {
129 74 : if (mbElementOpen && !aAttribute.isEmpty() && !aValue.isEmpty())
130 : {
131 74 : mrStream.WriteChar(' ');
132 74 : mrStream.WriteOString(aAttribute);
133 74 : mrStream.WriteChar('=');
134 74 : mrStream.WriteChar('"');
135 74 : mrStream.WriteOString(aValue);
136 74 : mrStream.WriteChar('"');
137 : }
138 74 : }
139 :
140 12 : void HtmlWriter::attribute(const OString& aAttribute, const sal_Int32 aValue)
141 : {
142 12 : attribute(aAttribute, OString::number(aValue));
143 12 : }
144 :
145 22 : void HtmlWriter::attribute(const OString& aAttribute, const char* pValue)
146 : {
147 22 : attribute(aAttribute, OString(pValue));
148 22 : }
149 :
150 12 : void HtmlWriter::attribute(const OString& aAttribute, const OUString& aValue)
151 : {
152 12 : attribute(aAttribute, OUStringToOString(aValue, maEncoding));
153 12 : }
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: */
|