Files
odfstudio/svtools/source/svhtml/HtmlWriter.cxx
T
Miklos Vajna a8ca72cbcd svtools: allow writing characters with HtmlWriter
The sw HTML image export already uses HtmlWriter, so need to extend this
to support XHTML alternate text, writing the character data directly is
not an option.

Change-Id: Iac3f2b9a3828175a5f1d0fb14ab505f8de389e52
Reviewed-on: https://gerrit.libreoffice.org/50965
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Tested-by: Jenkins <ci@libreoffice.org>
2018-03-08 18:53:53 +01:00

160 lines
3.7 KiB
C++

/* -*- 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/.
*
*/
#include <svtools/HtmlWriter.hxx>
#include <tools/stream.hxx>
HtmlWriter::HtmlWriter(SvStream& rStream, const OString& rNamespace) :
mrStream(rStream),
mbElementOpen(false),
mbContentWritten(false),
mbCharactersWritten(false),
mbPrettyPrint(true)
{
if (!rNamespace.isEmpty())
{
// Convert namespace alias to a prefix.
maNamespace = rNamespace + ":";
}
}
HtmlWriter::~HtmlWriter()
{}
void HtmlWriter::prettyPrint(bool b)
{
mbPrettyPrint = b;
}
void HtmlWriter::start(const OString& aElement)
{
if (mbElementOpen)
{
mrStream.WriteChar('>');
if (!mbContentWritten && mbPrettyPrint)
mrStream.WriteChar('\n');
mbContentWritten = false;
}
maElementStack.push_back(aElement);
if (mbPrettyPrint)
{
for(size_t i = 0; i < maElementStack.size() - 1; i++)
{
mrStream.WriteCharPtr(" ");
}
}
mrStream.WriteChar('<');
mrStream.WriteOString(maNamespace + aElement);
mbElementOpen = true;
}
void HtmlWriter::single(const OString &aContent)
{
start(aContent);
end();
}
void HtmlWriter::endAttribute()
{
if (mbElementOpen)
{
mrStream.WriteCharPtr("/>");
if (mbPrettyPrint)
mrStream.WriteCharPtr("\n");
mbElementOpen = false;
}
}
void HtmlWriter::flushStack()
{
while (!maElementStack.empty())
{
end();
}
}
void HtmlWriter::end()
{
if (mbElementOpen && !mbCharactersWritten)
{
mrStream.WriteCharPtr("/>");
if (mbPrettyPrint)
mrStream.WriteCharPtr("\n");
}
else
{
if (!mbContentWritten && mbPrettyPrint)
{
for(size_t i = 0; i < maElementStack.size() - 1; i++)
{
mrStream.WriteCharPtr(" ");
}
}
mrStream.WriteCharPtr("</");
mrStream.WriteOString(maNamespace + maElementStack.back());
mrStream.WriteCharPtr(">");
if (mbPrettyPrint)
mrStream.WriteCharPtr("\n");
}
maElementStack.pop_back();
mbElementOpen = false;
mbContentWritten = false;
mbCharactersWritten = false;
}
void HtmlWriter::attribute(const OString &aAttribute, const OString& aValue)
{
if (mbElementOpen && !aAttribute.isEmpty() && !aValue.isEmpty())
{
mrStream.WriteChar(' ');
mrStream.WriteOString(aAttribute);
mrStream.WriteChar('=');
mrStream.WriteChar('"');
mrStream.WriteOString(aValue);
mrStream.WriteChar('"');
}
}
void HtmlWriter::attribute(const OString& aAttribute, const sal_Int32 aValue)
{
attribute(aAttribute, OString::number(aValue));
}
void HtmlWriter::attribute(const OString& aAttribute, const char* pValue)
{
attribute(aAttribute, OString(pValue));
}
void HtmlWriter::attribute(const OString& aAttribute, const OUString& aValue)
{
attribute(aAttribute, OUStringToOString(aValue, RTL_TEXTENCODING_UTF8));
}
void HtmlWriter::attribute(const OString& aAttribute)
{
if (mbElementOpen && !aAttribute.isEmpty())
{
mrStream.WriteChar(' ');
mrStream.WriteOString(aAttribute);
}
}
void HtmlWriter::characters(const OString& rChars)
{
if (!mbCharactersWritten)
mrStream.WriteCharPtr(">");
mrStream.WriteOString(rChars);
mbCharactersWritten = true;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */