/* -*- 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 "xmlfmt.hxx" #include "XMLBase64ImportContext.hxx" #include "txtstyli.hxx" #include "xmlimp.hxx" using namespace com::sun::star; namespace writerperfect { namespace exp { XMLStylesContext::XMLStylesContext(XMLImport &rImport, bool bAutomatic) : XMLImportContext(rImport), m_rParagraphStyles(bAutomatic ? mrImport.GetAutomaticParagraphStyles() : mrImport.GetParagraphStyles()), m_rTextStyles(bAutomatic ? mrImport.GetAutomaticTextStyles() : mrImport.GetTextStyles()), m_rCellStyles(bAutomatic ? mrImport.GetAutomaticCellStyles() : mrImport.GetCellStyles()), m_rColumnStyles(bAutomatic ? mrImport.GetAutomaticColumnStyles() : mrImport.GetColumnStyles()), m_rRowStyles(bAutomatic ? mrImport.GetAutomaticRowStyles() : mrImport.GetRowStyles()), m_rTableStyles(bAutomatic ? mrImport.GetAutomaticTableStyles() : mrImport.GetTableStyles()), m_rGraphicStyles(bAutomatic ? mrImport.GetAutomaticGraphicStyles() : mrImport.GetGraphicStyles()) { } rtl::Reference XMLStylesContext::CreateChildContext(const OUString &rName, const css::uno::Reference &/*xAttribs*/) { if (rName == "style:style") return new XMLStyleContext(mrImport, *this); return nullptr; } std::map &XMLStylesContext::GetCurrentParagraphStyles() { return m_rParagraphStyles; } std::map &XMLStylesContext::GetCurrentTextStyles() { return m_rTextStyles; } std::map &XMLStylesContext::GetCurrentCellStyles() { return m_rCellStyles; } std::map &XMLStylesContext::GetCurrentColumnStyles() { return m_rColumnStyles; } std::map &XMLStylesContext::GetCurrentRowStyles() { return m_rRowStyles; } std::map &XMLStylesContext::GetCurrentTableStyles() { return m_rTableStyles; } std::map &XMLStylesContext::GetCurrentGraphicStyles() { return m_rGraphicStyles; } /// Handler for . class XMLFontFaceContext : public XMLImportContext { public: XMLFontFaceContext(XMLImport &rImport); void SAL_CALL startElement(const OUString &rName, const css::uno::Reference &xAttribs) override; rtl::Reference CreateChildContext(const OUString &rName, const css::uno::Reference &xAttribs) override; OUString maName; }; /// Handler for . class XMLFontFaceSrcContext : public XMLImportContext { public: XMLFontFaceSrcContext(XMLImport &rImport, XMLFontFaceContext &rFontFace); rtl::Reference CreateChildContext(const OUString &rName, const css::uno::Reference &xAttribs) override; private: XMLFontFaceContext &mrFontFace; }; /// Handler for . class XMLFontFaceUriContext : public XMLImportContext { public: XMLFontFaceUriContext(XMLImport &rImport, XMLFontFaceContext &rFontFace); void SAL_CALL startElement(const OUString &rName, const css::uno::Reference &xAttribs) override; void SAL_CALL endElement(const OUString &rName) override; rtl::Reference CreateChildContext(const OUString &rName, const css::uno::Reference &xAttribs) override; librevenge::RVNGPropertyList maPropertyList; private: rtl::Reference mxBinaryData; }; /// Handler for . class XMLFontFaceFormatContext : public XMLImportContext { public: XMLFontFaceFormatContext(XMLImport &rImport, XMLFontFaceUriContext &rFontUri); void SAL_CALL startElement(const OUString &rName, const css::uno::Reference &xAttribs) override; private: XMLFontFaceUriContext &mrFontFaceUri; }; XMLFontFaceFormatContext::XMLFontFaceFormatContext(XMLImport &rImport, XMLFontFaceUriContext &rFontFaceUri) : XMLImportContext(rImport) , mrFontFaceUri(rFontFaceUri) { } void XMLFontFaceFormatContext::startElement(const OUString &/*rName*/, const css::uno::Reference &xAttribs) { for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i) { const OUString &rAttributeName = xAttribs->getNameByIndex(i); const OUString &rAttributeValue = xAttribs->getValueByIndex(i); if (rAttributeName == "svg:string") { OString aAttributeValueU8 = OUStringToOString(rAttributeValue, RTL_TEXTENCODING_UTF8); mrFontFaceUri.maPropertyList.insert("librevenge:mime-type", aAttributeValueU8.getStr()); } } } XMLFontFaceUriContext::XMLFontFaceUriContext(XMLImport &rImport, XMLFontFaceContext &rFontFace) : XMLImportContext(rImport) { OString aNameU8 = OUStringToOString(rFontFace.maName, RTL_TEXTENCODING_UTF8); maPropertyList.insert("librevenge:name", aNameU8.getStr()); } void XMLFontFaceUriContext::startElement(const OUString &/*rName*/, const css::uno::Reference &xAttribs) { for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i) { const OUString &rAttributeName = xAttribs->getNameByIndex(i); const OUString &rAttributeValue = xAttribs->getValueByIndex(i); if (rAttributeName == "loext:font-style") { OString aAttributeValueU8 = OUStringToOString(rAttributeValue, RTL_TEXTENCODING_UTF8); maPropertyList.insert("librevenge:font-style", aAttributeValueU8.getStr()); } else if (rAttributeName == "loext:font-weight") { OString aAttributeValueU8 = OUStringToOString(rAttributeValue, RTL_TEXTENCODING_UTF8); maPropertyList.insert("librevenge:font-weight", aAttributeValueU8.getStr()); } } } void XMLFontFaceUriContext::endElement(const OUString &/*rName*/) { if (mxBinaryData.is()) maPropertyList.insert("office:binary-data", mxBinaryData->getBinaryData()); mrImport.GetGenerator().defineEmbeddedFont(maPropertyList); } rtl::Reference XMLFontFaceUriContext::CreateChildContext(const OUString &rName, const css::uno::Reference &/*xAttribs*/) { if (rName == "office:binary-data") { mxBinaryData = new XMLBase64ImportContext(mrImport); return mxBinaryData.get(); } if (rName == "svg:font-face-format") return new XMLFontFaceFormatContext(mrImport, *this); SAL_WARN("writerperfect", "XMLFontFaceUriContext::CreateChildContext: unhandled " << rName); return nullptr; } XMLFontFaceSrcContext::XMLFontFaceSrcContext(XMLImport &rImport, XMLFontFaceContext &rFontFace) : XMLImportContext(rImport) , mrFontFace(rFontFace) { } rtl::Reference XMLFontFaceSrcContext::CreateChildContext(const OUString &rName, const css::uno::Reference &/*xAttribs*/) { if (rName == "svg:font-face-uri") return new XMLFontFaceUriContext(mrImport, mrFontFace); SAL_WARN("writerperfect", "XMLFontFaceSrcContext::CreateChildContext: unhandled " << rName); return nullptr; } XMLFontFaceContext::XMLFontFaceContext(XMLImport &rImport) : XMLImportContext(rImport) { } void XMLFontFaceContext::startElement(const OUString &/*rName*/, const css::uno::Reference &xAttribs) { for (sal_Int16 i = 0; i < xAttribs->getLength(); ++i) { const OUString &rAttributeName = xAttribs->getNameByIndex(i); const OUString &rAttributeValue = xAttribs->getValueByIndex(i); if (rAttributeName == "style:name") maName = rAttributeValue; } } rtl::Reference XMLFontFaceContext::CreateChildContext(const OUString &rName, const css::uno::Reference &/*xAttribs*/) { if (rName == "svg:font-face-src") return new XMLFontFaceSrcContext(mrImport, *this); SAL_WARN("writerperfect", "XMLFontFaceContext::CreateChildContext: unhandled " << rName); return nullptr; } XMLFontFaceDeclsContext::XMLFontFaceDeclsContext(XMLImport &rImport) : XMLImportContext(rImport) { } rtl::Reference XMLFontFaceDeclsContext::CreateChildContext(const OUString &rName, const css::uno::Reference &/*xAttribs*/) { if (rName == "style:font-face") return new XMLFontFaceContext(mrImport); return nullptr; } } // namespace exp } // namespace writerperfect /* vim:set shiftwidth=4 softtabstop=4 expandtab: */