diff options
author | osnola <alonso.laurent@gmail.com> | 2017-04-19 14:48:25 +0200 |
---|---|---|
committer | David Tardon <dtardon@redhat.com> | 2017-04-19 14:48:25 +0200 |
commit | 6b96e0cb63d27352b89953a3bbe29693d845578a (patch) | |
tree | d0bd60a69363fd376c439c2e39673aeb0c80605a | |
parent | 1b5518ab221a64f9c673ebd83c32ccb875ec6ee8 (diff) |
try to retrieve some image frames
Change-Id: I2d4ea674485da9afb68447af6e07a7a8eae94411
-rw-r--r-- | src/lib/ABWCollector.h | 3 | ||||
-rw-r--r-- | src/lib/ABWContentCollector.cpp | 111 | ||||
-rw-r--r-- | src/lib/ABWContentCollector.h | 4 | ||||
-rw-r--r-- | src/lib/ABWParser.cpp | 16 | ||||
-rw-r--r-- | src/lib/ABWParser.h | 2 | ||||
-rw-r--r-- | src/lib/ABWStylesCollector.h | 3 |
6 files changed, 139 insertions, 0 deletions
diff --git a/src/lib/ABWCollector.h b/src/lib/ABWCollector.h index 8b8e413..4d8a47e 100644 --- a/src/lib/ABWCollector.h +++ b/src/lib/ABWCollector.h @@ -148,6 +148,9 @@ public: virtual void openCell(const char *props) = 0; virtual void closeCell() = 0; + virtual void openFrame(const char *props, const char *imageId, const char *title, const char *alt) = 0; + virtual void closeFrame() = 0; + virtual void addMetadataEntry(const char *name, const char *value) = 0; }; diff --git a/src/lib/ABWContentCollector.cpp b/src/lib/ABWContentCollector.cpp index 79abad3..7eaf064 100644 --- a/src/lib/ABWContentCollector.cpp +++ b/src/lib/ABWContentCollector.cpp @@ -435,6 +435,7 @@ libabw::ABWContentCollector::ABWContentCollector(librevenge::RVNGTextInterface * m_tableSizes(tableSizes), m_tableCounter(0), m_outputElements(), + m_pageOutputElements(), m_listElements(listElements), m_dummyListElements() { @@ -821,6 +822,7 @@ void libabw::ABWContentCollector::endDocument() if (m_iface) { + m_pageOutputElements.write(m_iface); m_outputElements.write(m_iface); m_iface->endDocument(); } @@ -2054,6 +2056,115 @@ void libabw::ABWContentCollector::closeCell() } } +void libabw::ABWContentCollector::openFrame(const char *props, const char *imageId, const char */*title*/, const char */*alt*/) +{ + ABWPropertyMap propMap; + if (props) + parsePropString(props, propMap); + ABWPropertyMap::const_iterator iter = propMap.find("frame-type"); + if (iter==propMap.end()) + { + ABW_DEBUG_MSG(("libabw::ABWContentCollector::openFrame: can not find the frame type\n")); + } + if (iter->second=="image") + { + std::map<std::string, ABWData>::const_iterator imIter; + if (imageId) imIter= m_data.find(imageId); + if (imIter==m_data.end()) + { + ABW_DEBUG_MSG(("libabw::ABWContentCollector::openFrame: can not find the image\n")); + return; + } + + librevenge::RVNGPropertyList propList; + ABWUnit unit(ABW_NONE); + double value(0.0); + iter = propMap.find("frame-height"); + if (iter != propMap.end() && findDouble(iter->second, value, unit) && ABW_IN == unit) + propList.insert("svg:height", value); + iter = propMap.find("frame-width"); + if (iter != propMap.end() && findDouble(iter->second, value, unit) && ABW_IN == unit) + propList.insert("svg:width", value); + bool isParagraph=true; + iter = propMap.find("position-to"); + if (iter != propMap.end()) + { + if (iter->second=="page-above-text" || iter->second=="column-above-text") + isParagraph=false; + else if (iter->second!="block-above-text") + { + ABW_DEBUG_MSG(("libabw::ABWContentCollector::openFrame: sorry, unknown pos: %s asume paragraph\n", iter->second.c_str())); + } + } + iter = propMap.find(isParagraph ? "xpos" : "frame-page-xpos"); + if (iter != propMap.end() && findDouble(iter->second, value, unit) && ABW_IN == unit) + propList.insert("svg:x", value); + iter = propMap.find(isParagraph ? "ypos" : "frame-page-ypos"); + if (iter != propMap.end() && findDouble(iter->second, value, unit) && ABW_IN == unit) + propList.insert("svg:y", value); + if (isParagraph && !m_ps->m_isParagraphOpened && !m_ps->m_isListElementOpened) + { + _changeList(); + if (m_ps->m_currentListLevel == 0) + _openParagraph(); + else + _openListElement(); + } + else if (!isParagraph) + { + iter = propMap.find("frame-pref-page"); + int page=0; + if (iter != propMap.end() && findInt(iter->second, page)) + propList.insert("text:anchor-page-number", page+1); + } + propList.insert("text:anchor-type", isParagraph ? "paragraph" : "page"); + iter = propMap.find("wrap-mode"); + if (iter != propMap.end()) + { + if (iter->second=="wrapped-to-left") + propList.insert("style:wrap", "left"); + else if (iter->second=="wrapped-to-right") + propList.insert("style:wrap", "right"); + else if (iter->second=="wrapped-to-both") + propList.insert("style:wrap", "parallel"); + else if (iter->second=="above-text") + { + propList.insert("style:wrap", "dynamic"); + propList.insert("style:run-through", "foreground"); + } + else if (iter->second=="below-text") + { + propList.insert("style:wrap", "dynamic"); + propList.insert("style:run-through", "background"); + } + else + { + ABW_DEBUG_MSG(("libabw::ABWContentCollector::openFrame: sorry, unknown wrap mode: %s\n", iter->second.c_str())); + } + } + ABWOutputElements &outputElements=isParagraph ? m_outputElements : m_pageOutputElements; + outputElements.addOpenFrame(propList); + + propList.clear(); + propList.insert("librevenge:mime-type", imIter->second.m_mimeType); + propList.insert("office:binary-data", imIter->second.m_binaryData); + outputElements.addInsertBinaryObject(propList); + + outputElements.addCloseFrame(); + return; + } + if (iter->second=="textbox") + { + ABW_DEBUG_MSG(("libabw::ABWContentCollector::openFrame: sorry, opening a text box is not defined\n")); + return; + } + ABW_DEBUG_MSG(("libabw::ABWContentCollector::openFrame: sorry, unknown frame type: %s\n", iter->second.c_str())); +} + +void libabw::ABWContentCollector::closeFrame() +{ +} + void libabw::ABWContentCollector::collectData(const char *, const char *, const librevenge::RVNGBinaryData &) { } diff --git a/src/lib/ABWContentCollector.h b/src/lib/ABWContentCollector.h index dcd6b3d..07226c0 100644 --- a/src/lib/ABWContentCollector.h +++ b/src/lib/ABWContentCollector.h @@ -156,6 +156,9 @@ public: void openCell(const char *props); void closeCell(); + void openFrame(const char *props, const char *imageId, const char *title, const char *alt); + void closeFrame(); + void addMetadataEntry(const char *name, const char *value); private: @@ -225,6 +228,7 @@ private: const std::map<int, int> &m_tableSizes; int m_tableCounter; ABWOutputElements m_outputElements; + ABWOutputElements m_pageOutputElements; const std::map<int, ABWListElement *> &m_listElements; std::vector<ABWListElement *> m_dummyListElements; }; diff --git a/src/lib/ABWParser.cpp b/src/lib/ABWParser.cpp index 74d471c..f03d7b6 100644 --- a/src/lib/ABWParser.cpp +++ b/src/lib/ABWParser.cpp @@ -352,6 +352,12 @@ void libabw::ABWParser::processXmlNode(xmlTextReaderPtr reader) if (XML_READER_TYPE_ELEMENT == tokenType) readImage(reader); break; + case XML_FRAME: + if (XML_READER_TYPE_ELEMENT == tokenType) + readFrame(reader); + if (XML_READER_TYPE_END_ELEMENT == tokenType || emptyToken > 0) + m_collector->closeFrame(); + break; default: break; } @@ -657,6 +663,16 @@ void libabw::ABWParser::readImage(xmlTextReaderPtr reader) m_collector->insertImage((const char *)dataid, (const char *)props); } +void libabw::ABWParser::readFrame(xmlTextReaderPtr reader) +{ + ABWXMLString props = xmlTextReaderGetAttribute(reader, call_BAD_CAST_OnConst("props")); + ABWXMLString imageId = xmlTextReaderGetAttribute(reader, call_BAD_CAST_OnConst("strux-image-dataid")); + ABWXMLString title = xmlTextReaderGetAttribute(reader, call_BAD_CAST_OnConst("title")); + ABWXMLString alt = xmlTextReaderGetAttribute(reader, call_BAD_CAST_OnConst("alt")); + if (m_collector) + m_collector->openFrame((const char *)props, (const char *) imageId, (const char *) title, (const char *) alt); +} + void libabw::ABWParser::readL(xmlTextReaderPtr reader) { ABWXMLString id = xmlTextReaderGetAttribute(reader, call_BAD_CAST_OnConst("id")); diff --git a/src/lib/ABWParser.h b/src/lib/ABWParser.h index 565ac67..adf7d4b 100644 --- a/src/lib/ABWParser.h +++ b/src/lib/ABWParser.h @@ -63,6 +63,8 @@ private: void readTable(xmlTextReaderPtr reader); void readCell(xmlTextReaderPtr reader); + void readFrame(xmlTextReaderPtr reader); + librevenge::RVNGInputStream *m_input; librevenge::RVNGTextInterface *m_iface; ABWCollector *m_collector; diff --git a/src/lib/ABWStylesCollector.h b/src/lib/ABWStylesCollector.h index f035489..4fa76b5 100644 --- a/src/lib/ABWStylesCollector.h +++ b/src/lib/ABWStylesCollector.h @@ -87,6 +87,9 @@ public: void openCell(const char *props); void closeCell(); + void openFrame(const char *, const char *, const char *, const char *) {} + void closeFrame() {} + void addMetadataEntry(const char *, const char *) {} private: |