/* -*- 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/.
*/
namespace writerperfect::exp
{ namespace
{ /// Looks up mime type for a given image extension.
OUString GetMimeType(const OUString& rExtension)
{ staticconst std::unordered_map<OUString, OUString> vMimeTypes = {
{ "gif", "image/gif" },
{ "jpg", "image/jpeg" },
{ "png", "image/png" },
{ "svg", "image/svg+xml" },
};
auto it = vMimeTypes.find(rExtension); return it == vMimeTypes.end() ? OUString() : it->second;
}
/// Determines the base directory for cover images, XMP metadata, popup images.
OUString FindMediaDir(const OUString& rDocumentBaseURL, const uno::Sequence<beans::PropertyValue>& rFilterData)
{
OUString aMediaDir;
// See if filter data contains a media directory explicitly. auto pProp = std::find_if(
rFilterData.begin(), rFilterData.end(),
[](const beans::PropertyValue& rProp) { return rProp.Name == "RVNGMediaDir"; }); if (pProp != rFilterData.end())
pProp->Value >>= aMediaDir;
if (!aMediaDir.isEmpty()) return aMediaDir + "/";
// Not set explicitly, try to pick it up from the base directory.
INetURLObject aURL(rDocumentBaseURL); try
{
aMediaDir = rtl::Uri::convertRelToAbs(rDocumentBaseURL, aURL.GetBase()) + "/";
} catch (const rtl::MalformedUriException&)
{
DBG_UNHANDLED_EXCEPTION("writerperfect");
} return aMediaDir;
}
/// Picks up a cover image from the base directory.
OUString FindCoverImage(const OUString& rDocumentBaseURL, OUString& rMimeType, const uno::Sequence<beans::PropertyValue>& rFilterData)
{
OUString aRet;
// See if filter data contains a cover image explicitly. auto pProp = std::find_if(
rFilterData.begin(), rFilterData.end(),
[](const beans::PropertyValue& rProp) { return rProp.Name == "RVNGCoverImage"; }); if (pProp != rFilterData.end())
pProp->Value >>= aRet;
rtl::Reference<XMLImportContext> XMLOfficeDocContext::CreateChildContext( const OUString& rName, const uno::Reference<xml::sax::XAttributeList>& /*xAttribs*/)
{ if (rName == "office:meta") returnnew XMLMetaDocumentContext(GetImport()); if (rName == "office:automatic-styles") returnnew XMLStylesContext(GetImport(), XMLStylesContext::StyleType_AUTOMATIC); if (rName == "office:styles") returnnew XMLStylesContext(GetImport(), XMLStylesContext::StyleType_NONE); if (rName == "office:master-styles") returnnew XMLStylesContext(GetImport(), XMLStylesContext::StyleType_NONE); if (rName == "office:font-face-decls") returnnew XMLFontFaceDeclsContext(GetImport()); if (rName == "office:body")
{ if (GetImport().GetPageMetafiles().empty()) returnnew XMLBodyContext(GetImport());
// Ignore text from doc model in the fixed layout case, instead // insert the page metafiles. bool bFirst = true; for (constauto& rPage : GetImport().GetPageMetafiles())
{
HandleFixedLayoutPage(rPage, bFirst); if (bFirst)
bFirst = false;
}
} return nullptr;
}
// Have all the info, invoke the generator.
librevenge::RVNGPropertyList aPageProperties; // Pixel -> inch. double fWidth = rPage.aCssPixels.getWidth();
fWidth /= 96;
aPageProperties.insert("fo:page-width", fWidth); double fHeight = rPage.aCssPixels.getHeight();
fHeight /= 96;
aPageProperties.insert("fo:page-height", fHeight);
if (!rPage.aChapterNames.empty())
{ // Name of chapters starting on this page.
librevenge::RVNGPropertyListVector aChapterNames; for (constauto& rName : rPage.aChapterNames)
{
librevenge::RVNGPropertyList aChapter;
aChapter.insert("librevenge:name", rName.toUtf8().getStr());
aChapterNames.append(aChapter);
}
aPageProperties.insert("librevenge:chapter-names", aChapterNames);
}
GetImport().GetGenerator().openPageSpan(aPageProperties);
librevenge::RVNGPropertyList aParagraphProperties; if (!bFirst) // All pages except the first one needs a page break before the page // metafile.
aParagraphProperties.insert("fo:break-before", "page");
GetImport().GetGenerator().openParagraph(aParagraphProperties);
librevenge::RVNGPropertyList aImageProperties;
aImageProperties.insert("librevenge:mime-type", "image/svg+xml");
librevenge::RVNGBinaryData aBinaryData;
aBinaryData.append(static_cast<constunsignedchar*>(aMemoryStream.GetData()),
aMemoryStream.GetSize());
aImageProperties.insert("office:binary-data", aBinaryData);
GetImport().GetGenerator().insertBinaryObject(aImageProperties);
GetImport().GetGenerator().closeParagraph();
GetImport().GetGenerator().closePageSpan();
}
// Default case: relative URL, popup data was in the same directory as the // document at insertion time.
OUString aAbs = maMediaDir + rURL; if (!FileURLExists(aAbs)) // Fallback case: relative URL, popup data was in the default media // directory at insertion time.
aAbs = maMediaDir + "../" + rURL;
if (!FileURLExists(aAbs)) // Relative link, but points to non-existing file: don't emit that to // librevenge, since it will be invalid anyway. return PopupState::Ignore;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.