src/lib/VDXParser.cpp | 84 +++++++++++++++++++++++++++++++++++++ src/lib/VDXParser.h | 2 src/lib/VSDCollector.h | 1 src/lib/VSDContentCollector.cpp | 68 +++++++++++++++++++++++++++++- src/lib/VSDContentCollector.h | 2 src/lib/VSDParser.cpp | 17 ++++--- src/lib/VSDParser.h | 1 src/lib/VSDStencils.cpp | 9 ++-- src/lib/VSDStencils.h | 3 - src/lib/VSDStylesCollector.cpp | 5 ++ src/lib/VSDStylesCollector.h | 1 src/lib/VSDTypes.h | 16 +++++-- src/lib/VSDXMLParserBase.cpp | 13 +++++ src/lib/VSDXMLParserBase.h | 2 src/lib/VSDXParser.cpp | 89 ++++++++++++++++++++++++++++++++++++++++ src/lib/VSDXParser.h | 3 + src/lib/tokens.txt | 1 17 files changed, 298 insertions(+), 19 deletions(-)
New commits: commit 9593bbf3b9ea47ccc864536c94f154ce68bad22f Author: Fridrich Å trba <[email protected]> Date: Wed Dec 16 15:42:35 2015 +0100 Collect and output tab stops Change-Id: I6ab0b673b1f11b204ab0fbd4087b8a4dddad6027 diff --git a/src/lib/VSDCollector.h b/src/lib/VSDCollector.h index 81914b6..fd4adeb 100644 --- a/src/lib/VSDCollector.h +++ b/src/lib/VSDCollector.h @@ -104,6 +104,7 @@ public: virtual void collectMisc(unsigned level, const VSDMisc &misc) = 0; virtual void collectLayer(unsigned id, unsigned level, const VSDLayer &layer) = 0; virtual void collectLayerMem(unsigned level, const VSDName &layerMem) = 0; + virtual void collectTabsDataList(unsigned level, const std::map<unsigned, VSDTabSet> &tabSets) = 0; // Style collectors virtual void collectStyleSheet(unsigned id, unsigned level,unsigned parentLineStyle, unsigned parentFillStyle, unsigned parentTextStyle) = 0; diff --git a/src/lib/VSDContentCollector.cpp b/src/lib/VSDContentCollector.cpp index be5fa13..c736f0e 100644 --- a/src/lib/VSDContentCollector.cpp +++ b/src/lib/VSDContentCollector.cpp @@ -60,7 +60,7 @@ libvisio::VSDContentCollector::VSDContentCollector( m_backgroundPageID(MINUS_ONE), m_currentPageID(0), m_currentPage(), m_pages(), m_layerList(), m_splineControlPoints(), m_splineKnotVector(), m_splineX(0.0), m_splineY(0.0), m_splineLastKnot(0.0), m_splineDegree(0), m_splineLevel(0), m_currentShapeLevel(0), - m_isBackgroundPage(false), m_currentLayerList(), m_currentLayerMem() + m_isBackgroundPage(false), m_currentLayerList(), m_currentLayerMem(), m_tabSets() { } @@ -441,11 +441,22 @@ void libvisio::VSDContentCollector::_flushText() m_paraFormats[iPara].charCount = numCharsInText; } + numCharsInText = (unsigned)(m_textFormat == VSD_TEXT_UTF16 ? m_textStream.size() / 2 : m_textStream.size()); + + for (unsigned iTab = 0; iTab < m_tabSets.size(); iTab++) + { + if (m_tabSets[iTab].m_numChars) + numCharsInText -= m_tabSets[iTab].m_numChars; + else + m_tabSets[iTab].m_numChars = numCharsInText; + } + _appendVisibleAndPrintable(textBlockProps); m_shapeOutputText->addStartTextObject(textBlockProps); unsigned charIndex = 0; + unsigned tabIndex = 0; unsigned paraCharCount = 0; unsigned long textBufferPosition = 0; const unsigned char *pTextBuffer = m_textStream.getDataBuffer(); @@ -492,10 +503,50 @@ void libvisio::VSDContentCollector::_flushText() else paraProps.insert("fo:line-height", -(*paraIt).spLine, librevenge::RVNG_PERCENT); - m_shapeOutputText->addOpenParagraph(paraProps); - paraCharCount = (*paraIt).charCount; + if (!m_tabSets.empty()) + { + if (paraCharCount < m_tabSets[tabIndex].m_numChars) + { + // Insert duplicate + std::vector<VSDTabSet>::iterator tabIt = m_tabSets.begin() + tabIndex; + VSDTabSet tmpTabSet = m_tabSets[tabIndex]; + m_tabSets.insert(tabIt, tmpTabSet); + m_tabSets[tabIndex].m_numChars = paraCharCount; + m_tabSets[tabIndex+1].m_numChars -= paraCharCount; + } + + librevenge::RVNGPropertyListVector tmpTabSet; + for (std::map<unsigned, VSDTabStop>::const_iterator iterTS = m_tabSets[tabIndex].m_tabStops.begin(); + iterTS != m_tabSets[tabIndex].m_tabStops.end(); ++iterTS) + { + librevenge::RVNGPropertyList tmpTabStop; + tmpTabStop.insert("style:position", iterTS->second.m_position); + switch (iterTS->second.m_alignment) + { + case 0: + tmpTabStop.insert("style:type", "left"); + break; + case 1: + tmpTabStop.insert("style:type", "center"); + break; + case 2: + tmpTabStop.insert("style:type", "right"); + break; + default: + tmpTabStop.insert("style:type", "char"); + tmpTabStop.insert("style:char", "."); + break; + } + tmpTabSet.append(tmpTabStop); + } + if (!tmpTabSet.empty()) + paraProps.insert("style:tab-stops", tmpTabSet); + } + + m_shapeOutputText->addOpenParagraph(paraProps); + // Find char format that overlaps while (charIndex < m_charFormats.size() && paraCharCount) { @@ -634,6 +685,7 @@ void libvisio::VSDContentCollector::_flushText() charIndex++; } m_shapeOutputText->addCloseParagraph(); + tabIndex++; } m_shapeOutputText->addEndTextObject(); @@ -2123,6 +2175,16 @@ void libvisio::VSDContentCollector::collectCharIX(unsigned /* id */ , unsigned l m_charFormats.push_back(format); } +void libvisio::VSDContentCollector::collectTabsDataList(unsigned level, const std::map<unsigned, VSDTabSet> &tabSets) +{ + _handleLevelChange(level); + + m_tabSets.clear(); + for (std::map<unsigned, VSDTabSet>::const_iterator iter = tabSets.begin(); iter != tabSets.end(); ++iter) + if (tabSets.begin() == iter || iter->second.m_numChars) + m_tabSets.push_back(iter->second); +} + void libvisio::VSDContentCollector::collectDefaultCharStyle(unsigned charCount, const boost::optional<VSDName> &font, const boost::optional<Colour> &fontColour, const boost::optional<double> &fontSize, const boost::optional<bool> &bold, const boost::optional<bool> &italic, const boost::optional<bool> &underline, const boost::optional<bool> &doubleunderline, const boost::optional<bool> &strikeout, diff --git a/src/lib/VSDContentCollector.h b/src/lib/VSDContentCollector.h index cb4a636..503cead 100644 --- a/src/lib/VSDContentCollector.h +++ b/src/lib/VSDContentCollector.h @@ -124,6 +124,7 @@ public: void collectMisc(unsigned level, const VSDMisc &misc); void collectLayer(unsigned id, unsigned level, const VSDLayer &layer); void collectLayerMem(unsigned level, const VSDName &layerMem); + void collectTabsDataList(unsigned level, const std::map<unsigned, VSDTabSet> &tabSets); // Style collectors void collectStyleSheet(unsigned id, unsigned level, unsigned parentLineStyle, unsigned parentFillStyle, unsigned parentTextStyle); @@ -307,6 +308,7 @@ private: VSDLayerList m_currentLayerList; std::vector<unsigned> m_currentLayerMem; + std::vector<VSDTabSet> m_tabSets; }; } // namespace libvisio diff --git a/src/lib/VSDParser.cpp b/src/lib/VSDParser.cpp index c24227a..72dfe00 100644 --- a/src/lib/VSDParser.cpp +++ b/src/lib/VSDParser.cpp @@ -660,6 +660,8 @@ void libvisio::VSDParser::_flushShape() if (m_shape.m_foreign && m_shape.m_foreign->data.size()) m_collector->collectForeignData(m_currentShapeLevel+1, m_shape.m_foreign->data); + m_collector->collectTabsDataList(m_currentShapeLevel+1, m_shape.m_tabSets); + if (!m_shape.m_fields.empty()) m_shape.m_fields.handle(m_collector); diff --git a/src/lib/VSDStylesCollector.cpp b/src/lib/VSDStylesCollector.cpp index 0fefbb7..5df617a 100644 --- a/src/lib/VSDStylesCollector.cpp +++ b/src/lib/VSDStylesCollector.cpp @@ -294,6 +294,11 @@ void libvisio::VSDStylesCollector::collectCharIX(unsigned /* id */, unsigned lev _handleLevelChange(level); } +void libvisio::VSDStylesCollector::collectTabsDataList(unsigned level, const std::map<unsigned, VSDTabSet> & /* tabSets */) +{ + _handleLevelChange(level); +} + void libvisio::VSDStylesCollector::collectDefaultCharStyle(unsigned /* charCount */, const boost::optional<VSDName> & /* font */, const boost::optional<Colour> & /* fontColour */, const boost::optional<double> & /* fontSize */, const boost::optional<bool> & /* bold */, const boost::optional<bool> & /* italic */, const boost::optional<bool> & /* underline */, diff --git a/src/lib/VSDStylesCollector.h b/src/lib/VSDStylesCollector.h index 65304fc..7457e2a 100644 --- a/src/lib/VSDStylesCollector.h +++ b/src/lib/VSDStylesCollector.h @@ -117,6 +117,7 @@ public: void collectMisc(unsigned level, const VSDMisc &misc); void collectLayer(unsigned id, unsigned level, const VSDLayer &layer); void collectLayerMem(unsigned level, const VSDName &layerMem); + void collectTabsDataList(unsigned level, const std::map<unsigned, VSDTabSet> &tabSets); // Style collectors void collectStyleSheet(unsigned id, unsigned level,unsigned parentLineStyle, unsigned parentFillStyle, unsigned parentTextStyle); diff --git a/src/lib/VSDXMLParserBase.cpp b/src/lib/VSDXMLParserBase.cpp index f95ac87..a8a7b68 100644 --- a/src/lib/VSDXMLParserBase.cpp +++ b/src/lib/VSDXMLParserBase.cpp @@ -1084,6 +1084,7 @@ void libvisio::VSDXMLParserBase::readText(xmlTextReaderPtr reader) unsigned cp = 0; unsigned pp = 0; + unsigned tp = 0; m_shape.m_text.clear(); m_shape.m_charList.resetCharCount(); m_shape.m_paraList.resetCharCount(); @@ -1109,6 +1110,9 @@ void libvisio::VSDXMLParserBase::readText(xmlTextReaderPtr reader) case XML_PP: pp = getIX(reader); break; + case XML_TP: + tp = getIX(reader); + break; default: if (XML_READER_TYPE_TEXT == tokenType || XML_READER_TYPE_SIGNIFICANT_WHITESPACE == tokenType) { @@ -1152,6 +1156,8 @@ void libvisio::VSDXMLParserBase::readText(xmlTextReaderPtr reader) m_shape.m_paraList.setCharCount(pp, charCount); } + m_shape.m_tabSets[tp].m_numChars += (unsigned)tmpText.size(); + m_shape.m_text.append(tmpText); m_shape.m_textFormat = VSD_TEXT_UTF8; } @@ -1740,6 +1746,8 @@ void libvisio::VSDXMLParserBase::_flushShape() if (m_shape.m_foreign && m_shape.m_foreign->data.size()) m_collector->collectForeignData(m_currentShapeLevel+1, m_shape.m_foreign->data); + m_collector->collectTabsDataList(m_currentShapeLevel+1, m_shape.m_tabSets); + if (!m_shape.m_fields.empty()) m_shape.m_fields.handle(m_collector); diff --git a/src/lib/tokens.txt b/src/lib/tokens.txt index d732a47..590944a 100644 --- a/src/lib/tokens.txt +++ b/src/lib/tokens.txt @@ -207,6 +207,7 @@ TextBlock TextDirection TextXForm TopMargin +tp TxtAngle TxtHeight TxtLocPinX commit 2004a9be46f6a2e31e3da9889d365b546feb63b0 Author: Fridrich Å trba <[email protected]> Date: Wed Dec 16 11:04:57 2015 +0100 Parse the tabs in VSD and account for character count Change-Id: I7e4f41cf87986ffa6a573ebe821ec0e87c3846a8 diff --git a/src/lib/VDXParser.cpp b/src/lib/VDXParser.cpp index b5f6b8c..cc59b8b 100644 --- a/src/lib/VDXParser.cpp +++ b/src/lib/VDXParser.cpp @@ -995,7 +995,7 @@ void libvisio::VDXParser::readTabs(xmlTextReaderPtr reader) int tokenId = XML_TOKEN_INVALID; int tokenType = -1; unsigned ix = getIX(reader); - m_currentTabSet = &(m_shape.m_tabSets[ix]); + m_currentTabSet = &(m_shape.m_tabSets[ix].m_tabStops); if (xmlTextReaderIsEmptyElement(reader)) { diff --git a/src/lib/VSDParser.cpp b/src/lib/VSDParser.cpp index 0429dd1..c24227a 100644 --- a/src/lib/VSDParser.cpp +++ b/src/lib/VSDParser.cpp @@ -771,17 +771,15 @@ void libvisio::VSDParser::readOLEData(librevenge::RVNGInputStream *input) void libvisio::VSDParser::readTabsData(librevenge::RVNGInputStream *input) { - /* unsigned charCount = */ readU32(input); + m_shape.m_tabSets[m_header.id].m_numChars = readU32(input); unsigned char numStops = readU8(input); - std::vector<VSDTabStop> tabStops; + m_shape.m_tabSets[m_header.id].m_tabStops.clear(); for (unsigned char i = 0; i < numStops; ++i) { - VSDTabStop tabStop; input->seek(1, librevenge::RVNG_SEEK_CUR); - tabStop.m_position = readDouble(input); - tabStop.m_alignment = readU8(input); - tabStop.m_leader = readU8(input); - tabStops.push_back(tabStop); + m_shape.m_tabSets[m_header.id].m_tabStops[i].m_position = readDouble(input); + m_shape.m_tabSets[m_header.id].m_tabStops[i].m_alignment = readU8(input); + m_shape.m_tabSets[m_header.id].m_tabStops[i].m_leader = readU8(input); } } diff --git a/src/lib/VSDStencils.h b/src/lib/VSDStencils.h index cad4b30..03dae0d 100644 --- a/src/lib/VSDStencils.h +++ b/src/lib/VSDStencils.h @@ -46,7 +46,7 @@ public: VSDCharacterList m_charList; VSDOptionalParaStyle m_paraStyle; VSDParagraphList m_paraList; - std::map<unsigned, std::map<unsigned, VSDTabStop> > m_tabSets; + std::map<unsigned, VSDTabSet> m_tabSets; librevenge::RVNGBinaryData m_text; std::map<unsigned, VSDName> m_names; TextFormat m_textFormat; diff --git a/src/lib/VSDTypes.h b/src/lib/VSDTypes.h index 214db21..3a4fce4 100644 --- a/src/lib/VSDTypes.h +++ b/src/lib/VSDTypes.h @@ -11,6 +11,7 @@ #define VSDTYPES_H #include <vector> +#include <map> #include <librevenge/librevenge.h> #define FROM_OPTIONAL(t, u) !!t ? t.get() : u @@ -220,6 +221,15 @@ struct VSDTabStop m_leader(tabStop.m_leader) {} }; +struct VSDTabSet +{ + unsigned m_numChars; + std::map<unsigned, VSDTabStop> m_tabStops; + VSDTabSet() : m_numChars(0), m_tabStops() {} + VSDTabSet(const VSDTabSet &tabSet) : + m_numChars(tabSet.m_numChars), m_tabStops(tabSet.m_tabStops) {} +}; + } // namespace libvisio #endif /* VSDTYPES_H */ diff --git a/src/lib/VSDXParser.cpp b/src/lib/VSDXParser.cpp index 22d20ac..22aa719 100644 --- a/src/lib/VSDXParser.cpp +++ b/src/lib/VSDXParser.cpp @@ -1372,7 +1372,7 @@ void libvisio::VSDXParser::readTabRow(xmlTextReaderPtr reader) int tokenType = -1; unsigned ix = getIX(reader); - m_currentTabSet = &(m_shape.m_tabSets[ix]); + m_currentTabSet = &(m_shape.m_tabSets[ix].m_tabStops); if (xmlTextReaderIsEmptyElement(reader)) { commit 20237fd6975368400d97fbf7ac18eae4fce98239 Author: Fridrich Å trba <[email protected]> Date: Wed Dec 16 10:36:19 2015 +0100 Parse tab sets in VSDX parser Change-Id: Iffdf1981a525607d216daee0507775236dbd9593 diff --git a/src/lib/VSDXParser.cpp b/src/lib/VSDXParser.cpp index 55b2d20..22d20ac 100644 --- a/src/lib/VSDXParser.cpp +++ b/src/lib/VSDXParser.cpp @@ -1279,6 +1279,10 @@ void libvisio::VSDXParser::readShapeProperties(xmlTextReaderPtr reader) if (XML_READER_TYPE_ELEMENT == tokenType) ret = readStringData(m_shape.m_layerMem, reader); break; + case XML_TABS: + if (XML_READER_TYPE_ELEMENT == tokenType) + readTabs(reader); + break; default: if (XML_SECTION == tokenClass && XML_READER_TYPE_ELEMENT == tokenType) ret = skipSection(reader); @@ -1333,6 +1337,91 @@ void libvisio::VSDXParser::readParagraph(xmlTextReaderPtr reader) while ((XML_SECTION != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret && (!m_watcher || !m_watcher->isError())); } +void libvisio::VSDXParser::readTabs(xmlTextReaderPtr reader) +{ + int ret = 1; + int tokenId = XML_TOKEN_INVALID; + int tokenType = -1; + + if (xmlTextReaderIsEmptyElement(reader)) + { + m_shape.m_tabSets.clear(); + } + else + { + do + { + ret = xmlTextReaderRead(reader); + tokenId = getElementToken(reader); + if (XML_TOKEN_INVALID == tokenId) + { + VSD_DEBUG_MSG(("VSDXParser::readTabs: unknown token %s\n", xmlTextReaderConstName(reader))); + } + tokenType = xmlTextReaderNodeType(reader); + if (XML_ROW == tokenId && XML_READER_TYPE_ELEMENT == tokenType) + readTabRow(reader); + } + while ((XML_SECTION != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret && (!m_watcher || !m_watcher->isError())); + } +} + +void libvisio::VSDXParser::readTabRow(xmlTextReaderPtr reader) +{ + int ret = 1; + int tokenId = XML_TOKEN_INVALID; + int tokenType = -1; + unsigned ix = getIX(reader); + + m_currentTabSet = &(m_shape.m_tabSets[ix]); + + if (xmlTextReaderIsEmptyElement(reader)) + { + m_currentTabSet->clear(); + } + else + { + do + { + ret = xmlTextReaderRead(reader); + tokenId = getElementToken(reader); + if (XML_TOKEN_INVALID == tokenId) + { + VSD_DEBUG_MSG(("VSDXParser::readTabs: unknown token %s\n", xmlTextReaderConstName(reader))); + } + tokenType = xmlTextReaderNodeType(reader); + switch (tokenId) + { + case XML_POSITION: + if (XML_READER_TYPE_ELEMENT == tokenType) + { + const boost::shared_ptr<xmlChar> stringValue(xmlTextReaderGetAttribute(reader, BAD_CAST("N")), xmlFree); + if (stringValue) + { + unsigned idx = xmlStringToLong(stringValue.get()+8); + ret = readDoubleData((*m_currentTabSet)[idx].m_position, reader); + } + } + break; + case XML_ALIGNMENT: + if (XML_READER_TYPE_ELEMENT == tokenType) + { + const boost::shared_ptr<xmlChar> stringValue(xmlTextReaderGetAttribute(reader, BAD_CAST("N")), xmlFree); + if (stringValue) + { + unsigned idx = xmlStringToLong(stringValue.get()+9); + ret = readByteData((*m_currentTabSet)[idx].m_alignment, reader); + } + } + break; + default: + break; + } + } + while ((XML_ROW != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret && (!m_watcher || !m_watcher->isError())); + } + m_currentTabSet = 0; +} + void libvisio::VSDXParser::readCharacter(xmlTextReaderPtr reader) { int ret = 1; diff --git a/src/lib/VSDXParser.h b/src/lib/VSDXParser.h index 661f128..53624dc 100644 --- a/src/lib/VSDXParser.h +++ b/src/lib/VSDXParser.h @@ -27,6 +27,7 @@ class VSDXParser : public VSDXMLParserBase using VSDXMLParserBase::readLongData; using VSDXMLParserBase::readStringData; + public: explicit VSDXParser(librevenge::RVNGInputStream *input, librevenge::RVNGDrawingInterface *painter); virtual ~VSDXParser(); @@ -75,6 +76,8 @@ private: void readParagraph(xmlTextReaderPtr reader); void readCharacter(xmlTextReaderPtr reader); void readFonts(xmlTextReaderPtr reader); + void readTabs(xmlTextReaderPtr reader); + void readTabRow(xmlTextReaderPtr reader); // Private data commit cf26b74d7aba1f6e764c31cfb4c7009d4e16f762 Author: Fridrich Å trba <[email protected]> Date: Wed Dec 16 10:34:20 2015 +0100 Parse tab sets in VDX parser Change-Id: Ic2f735f02c99046798867dae8d6a60821bb148b2 diff --git a/src/lib/VDXParser.cpp b/src/lib/VDXParser.cpp index d09aff1..b5f6b8c 100644 --- a/src/lib/VDXParser.cpp +++ b/src/lib/VDXParser.cpp @@ -273,6 +273,10 @@ void libvisio::VDXParser::processXmlNode(xmlTextReaderPtr reader) if (XML_READER_TYPE_ELEMENT == tokenType) readLayerMem(reader); break; + case XML_TABS: + if (XML_READER_TYPE_ELEMENT == tokenType) + readTabs(reader); + break; default: break; } @@ -985,6 +989,86 @@ void libvisio::VDXParser::readForeignInfo(xmlTextReaderPtr reader) while ((XML_FOREIGN != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret && (!m_watcher || !m_watcher->isError())); } +void libvisio::VDXParser::readTabs(xmlTextReaderPtr reader) +{ + int ret = 1; + int tokenId = XML_TOKEN_INVALID; + int tokenType = -1; + unsigned ix = getIX(reader); + m_currentTabSet = &(m_shape.m_tabSets[ix]); + + if (xmlTextReaderIsEmptyElement(reader)) + { + m_currentTabSet->clear(); + } + else + { + do + { + ret = xmlTextReaderRead(reader); + tokenId = getElementToken(reader); + if (XML_TOKEN_INVALID == tokenId) + { + VSD_DEBUG_MSG(("VDXParser::readTabs: unknown token %s\n", xmlTextReaderConstName(reader))); + } + tokenType = xmlTextReaderNodeType(reader); + if (XML_TAB == tokenId && XML_READER_TYPE_ELEMENT == tokenType) + readTab(reader); + } + while ((XML_TABS != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret && (!m_watcher || !m_watcher->isError())); + } + m_currentTabSet = 0; +} + +void libvisio::VDXParser::readTab(xmlTextReaderPtr reader) +{ + int ret = 1; + int tokenId = XML_TOKEN_INVALID; + int tokenType = -1; + unsigned ix = getIX(reader); + + if (xmlTextReaderIsEmptyElement(reader)) + { + m_currentTabSet->erase(ix); + } + else + { + do + { + ret = xmlTextReaderRead(reader); + tokenId = getElementToken(reader); + if (XML_TOKEN_INVALID == tokenId) + { + VSD_DEBUG_MSG(("VDXParser::readTab: unknown token %s\n", xmlTextReaderConstName(reader))); + } + tokenType = xmlTextReaderNodeType(reader); + switch (tokenId) + { + case XML_POSITION: + if (XML_READER_TYPE_ELEMENT == tokenType) + { + ret = readDoubleData((*m_currentTabSet)[ix].m_position, reader); + } + break; + case XML_ALIGNMENT: + if (XML_READER_TYPE_ELEMENT == tokenType) + { + ret = readByteData((*m_currentTabSet)[ix].m_alignment, reader); + } + break; + case XML_LEADER: + if (XML_READER_TYPE_ELEMENT == tokenType) + { + ret = readByteData((*m_currentTabSet)[ix].m_leader, reader); + } + break; + default: + break; + } + } + while ((XML_TAB != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret && (!m_watcher || !m_watcher->isError())); + } +} /* vim:set shiftwidth=2 softtabstop=2 expandtab: */ diff --git a/src/lib/VDXParser.h b/src/lib/VDXParser.h index a56954d..0293911 100644 --- a/src/lib/VDXParser.h +++ b/src/lib/VDXParser.h @@ -62,6 +62,8 @@ private: void readTextBlock(xmlTextReaderPtr reader); void readForeignInfo(xmlTextReaderPtr reader); void readLayerMem(xmlTextReaderPtr reader); + void readTabs(xmlTextReaderPtr reader); + void readTab(xmlTextReaderPtr reader); void getBinaryData(xmlTextReaderPtr reader); commit 577575d95a81777156639c8831cffcd20c335c8e Author: Fridrich Å trba <[email protected]> Date: Wed Dec 16 10:31:08 2015 +0100 Add some variables to VSDXMLParserBase Change-Id: Iaeb3444d0fb9cc256744f8df6ac725b06ceffeec diff --git a/src/lib/VSDXMLParserBase.cpp b/src/lib/VSDXMLParserBase.cpp index 89e09d4..f95ac87 100644 --- a/src/lib/VSDXMLParserBase.cpp +++ b/src/lib/VSDXMLParserBase.cpp @@ -31,7 +31,8 @@ libvisio::VSDXMLParserBase::VSDXMLParserBase() m_currentShapeLevel(0), m_colours(), m_fieldList(), m_shapeList(), m_currentBinaryData(), m_shapeStack(), m_shapeLevelStack(), m_isShapeStarted(false), m_isPageStarted(false), m_currentGeometryList(0), - m_currentGeometryListIndex(MINUS_ONE), m_fonts(), m_watcher(0) + m_currentGeometryListIndex(MINUS_ONE), m_fonts(), m_currentTabSet(0), + m_watcher(0) { initColours(); } @@ -973,7 +974,9 @@ void libvisio::VSDXMLParserBase::readShape(xmlTextReaderPtr reader) m_shape.m_geometries = tmpShape->m_geometries; m_shape.m_charList = tmpShape->m_charList; m_shape.m_paraList = tmpShape->m_paraList; + m_shape.m_tabSets = tmpShape->m_tabSets; m_shape.m_text = tmpShape->m_text; + m_shape.m_textFormat = tmpShape->m_textFormat; m_shape.m_misc = tmpShape->m_misc; } } diff --git a/src/lib/VSDXMLParserBase.h b/src/lib/VSDXMLParserBase.h index 6116584..2ee13ec 100644 --- a/src/lib/VSDXMLParserBase.h +++ b/src/lib/VSDXMLParserBase.h @@ -60,6 +60,8 @@ protected: std::map<unsigned, VSDName> m_fonts; + std::map<unsigned, VSDTabStop> *m_currentTabSet; + XMLErrorWatcher *m_watcher; // Helper functions commit ecd9ebd303cda2dd4ca9fac85823d69e2f24e93b Author: Fridrich Å trba <[email protected]> Date: Wed Dec 16 10:26:26 2015 +0100 Add some variables to VSDParser Change-Id: I7ca310269244e0ee1db616847d27a847c26a4a0c diff --git a/src/lib/VSDParser.cpp b/src/lib/VSDParser.cpp index c935a59..0429dd1 100644 --- a/src/lib/VSDParser.cpp +++ b/src/lib/VSDParser.cpp @@ -27,7 +27,7 @@ libvisio::VSDParser::VSDParser(librevenge::RVNGInputStream *input, librevenge::R m_currentShapeLevel(0), m_currentShapeID(MINUS_ONE), m_currentLayerListLevel(0), m_extractStencils(false), m_colours(), m_isBackgroundPage(false), m_isShapeStarted(false), m_shadowOffsetX(0.0), m_shadowOffsetY(0.0), m_currentGeometryList(0), m_currentGeomListCount(0), m_fonts(), m_names(), m_namesMapMap(), - m_currentPageName() + m_currentPageName(), m_currentTabSet() {} libvisio::VSDParser::~VSDParser() @@ -1278,6 +1278,7 @@ void libvisio::VSDParser::readShape(librevenge::RVNGInputStream *input) { if (tmpShape->m_foreign) m_shape.m_foreign = new ForeignData(*(tmpShape->m_foreign)); + m_shape.m_tabSets = tmpShape->m_tabSets; m_shape.m_text = tmpShape->m_text; m_shape.m_textFormat = tmpShape->m_textFormat; m_shape.m_misc = tmpShape->m_misc; diff --git a/src/lib/VSDParser.h b/src/lib/VSDParser.h index 8cec7f3..df81d4f 100644 --- a/src/lib/VSDParser.h +++ b/src/lib/VSDParser.h @@ -176,6 +176,7 @@ protected: std::map<unsigned, std::map<unsigned, VSDName> > m_namesMapMap; VSDName m_currentPageName; + std::map<unsigned, VSDTabStop> *m_currentTabSet; private: VSDParser(); commit afd15e87c3a85d2c5e86d5703a5f3ccf50d97002 Author: Fridrich Å trba <[email protected]> Date: Wed Dec 16 10:21:03 2015 +0100 m_lead -> m_leader to correspond to the Visio terminology Change-Id: I0944e0f3329f6761720048b0c9d0cc0bce698647 diff --git a/src/lib/VSDParser.cpp b/src/lib/VSDParser.cpp index c332963..c935a59 100644 --- a/src/lib/VSDParser.cpp +++ b/src/lib/VSDParser.cpp @@ -780,7 +780,7 @@ void libvisio::VSDParser::readTabsData(librevenge::RVNGInputStream *input) input->seek(1, librevenge::RVNG_SEEK_CUR); tabStop.m_position = readDouble(input); tabStop.m_alignment = readU8(input); - tabStop.m_lead = readU8(input); + tabStop.m_leader = readU8(input); tabStops.push_back(tabStop); } } diff --git a/src/lib/VSDTypes.h b/src/lib/VSDTypes.h index 6790fa4..214db21 100644 --- a/src/lib/VSDTypes.h +++ b/src/lib/VSDTypes.h @@ -213,11 +213,11 @@ struct VSDTabStop { double m_position; unsigned char m_alignment; - unsigned char m_lead; - VSDTabStop() : m_position(0.0), m_alignment(0), m_lead(0) {} + unsigned char m_leader; + VSDTabStop() : m_position(0.0), m_alignment(0), m_leader(0) {} VSDTabStop(const VSDTabStop &tabStop) : m_position(tabStop.m_position), m_alignment(tabStop.m_alignment), - m_lead(tabStop.m_lead) {} + m_leader(tabStop.m_leader) {} }; } // namespace libvisio commit ccfc261d411d6be27967d28833bad633c06282eb Author: Fridrich Å trba <[email protected]> Date: Wed Dec 16 10:13:35 2015 +0100 Add tab sets to the VSDShape Change-Id: I5648ab8d97cea6fd9ba1f5d2bcca796396cdf172 diff --git a/src/lib/VSDStencils.cpp b/src/lib/VSDStencils.cpp index 099fcbf..20a3788 100644 --- a/src/lib/VSDStencils.cpp +++ b/src/lib/VSDStencils.cpp @@ -14,7 +14,7 @@ libvisio::VSDShape::VSDShape() : m_geometries(), m_shapeList(), m_fields(), m_foreign(0), m_parent(0), m_masterPage(MINUS_ONE), m_masterShape(MINUS_ONE), m_shapeId(MINUS_ONE), m_lineStyleId(MINUS_ONE), m_fillStyleId(MINUS_ONE), m_textStyleId(MINUS_ONE), m_lineStyle(), m_fillStyle(), m_textBlockStyle(), m_charStyle(), - m_themeRef(), m_charList(), m_paraStyle(), m_paraList(), m_text(), m_names(), + m_themeRef(), m_charList(), m_paraStyle(), m_paraList(), m_tabSets(), m_text(), m_names(), m_textFormat(libvisio::VSD_TEXT_UTF16), m_nurbsData(), m_polylineData(), m_xform(), m_txtxform(0), m_xform1d(0), m_misc(), m_layerMem() { @@ -27,8 +27,9 @@ libvisio::VSDShape::VSDShape(const libvisio::VSDShape &shape) m_lineStyleId(shape.m_lineStyleId), m_fillStyleId(shape.m_fillStyleId), m_textStyleId(shape.m_textStyleId), m_lineStyle(shape.m_lineStyle), m_fillStyle(shape.m_fillStyle), m_textBlockStyle(shape.m_textBlockStyle), m_charStyle(shape.m_charStyle), m_themeRef(shape.m_themeRef), m_charList(shape.m_charList), - m_paraStyle(shape.m_paraStyle), m_paraList(shape.m_paraList), m_text(shape.m_text), m_names(shape.m_names), - m_textFormat(shape.m_textFormat), m_nurbsData(shape.m_nurbsData), m_polylineData(shape.m_polylineData), + m_paraStyle(shape.m_paraStyle), m_paraList(shape.m_paraList), m_tabSets(shape.m_tabSets), + m_text(shape.m_text), m_names(shape.m_names), m_textFormat(shape.m_textFormat), + m_nurbsData(shape.m_nurbsData), m_polylineData(shape.m_polylineData), m_xform(shape.m_xform), m_txtxform(shape.m_txtxform ? new XForm(*(shape.m_txtxform)) : 0), m_xform1d(shape.m_xform1d ? new XForm1D(*(shape.m_xform1d)) : 0), m_misc(shape.m_misc), m_layerMem(shape.m_layerMem) @@ -65,6 +66,7 @@ libvisio::VSDShape &libvisio::VSDShape::operator=(const libvisio::VSDShape &shap m_charList = shape.m_charList; m_paraStyle = shape.m_paraStyle; m_paraList = shape.m_paraList; + m_tabSets = shape.m_tabSets; m_text = shape.m_text; m_names = shape.m_names; m_textFormat = shape.m_textFormat; @@ -106,6 +108,7 @@ void libvisio::VSDShape::clear() m_charList.clear(); m_paraStyle = VSDOptionalParaStyle(); m_paraList.clear(); + m_tabSets.clear(); m_text.clear(); m_names.clear(); m_nurbsData.clear(); diff --git a/src/lib/VSDStencils.h b/src/lib/VSDStencils.h index c3596d5..cad4b30 100644 --- a/src/lib/VSDStencils.h +++ b/src/lib/VSDStencils.h @@ -46,8 +46,9 @@ public: VSDCharacterList m_charList; VSDOptionalParaStyle m_paraStyle; VSDParagraphList m_paraList; + std::map<unsigned, std::map<unsigned, VSDTabStop> > m_tabSets; librevenge::RVNGBinaryData m_text; - std::map< unsigned, VSDName > m_names; + std::map<unsigned, VSDName> m_names; TextFormat m_textFormat; std::map<unsigned, NURBSData> m_nurbsData; std::map<unsigned, PolylineData> m_polylineData;
_______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
