summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorosnola <alonso.laurent@gmail.com>2017-04-19 14:48:25 +0200
committerDavid Tardon <dtardon@redhat.com>2017-04-19 14:48:25 +0200
commit6b96e0cb63d27352b89953a3bbe29693d845578a (patch)
treed0bd60a69363fd376c439c2e39673aeb0c80605a
parent1b5518ab221a64f9c673ebd83c32ccb875ec6ee8 (diff)
try to retrieve some image frames
Change-Id: I2d4ea674485da9afb68447af6e07a7a8eae94411
-rw-r--r--src/lib/ABWCollector.h3
-rw-r--r--src/lib/ABWContentCollector.cpp111
-rw-r--r--src/lib/ABWContentCollector.h4
-rw-r--r--src/lib/ABWParser.cpp16
-rw-r--r--src/lib/ABWParser.h2
-rw-r--r--src/lib/ABWStylesCollector.h3
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: