IWAParser.h
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /*
3  * This file is part of the libetonyek project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  */
9 
10 #ifndef IWAPARSER_H_INCLUDED
11 #define IWAPARSER_H_INCLUDED
12 
13 #include <deque>
14 #include <functional>
15 #include <map>
16 #include <memory>
17 #include <string>
18 #include <unordered_map>
19 
20 #include <boost/optional.hpp>
21 #include <boost/variant.hpp>
22 
23 #if defined(__GNUC__) && !defined(__clang__)
24 #pragma GCC diagnostic push
25 #pragma GCC diagnostic ignored "-Weffc++"
26 #endif
27 #include <mdds/flat_segment_tree.hpp>
28 #if defined(__GNUC__) && !defined(__clang__)
29 #pragma GCC diagnostic pop
30 #endif
31 
32 #include "libetonyek_utils.h"
33 #include "IWAMessage.h"
34 #include "IWAObjectIndex.h"
35 #include "IWORKLanguageManager.h"
36 #include "IWORKOutputElements.h"
37 #include "IWORKStyle_fwd.h"
38 #include "IWORKTypes.h"
39 
40 namespace libetonyek
41 {
42 
43 class IWORKCollector;
44 class IWORKPropertyMap;
45 class IWORKTable;
46 class IWORKText;
47 
48 class IWAParser
49 {
50  // disable copying
51  IWAParser(const IWAParser &);
52  IWAParser &operator=(const IWAParser &);
53 public:
54  IWAParser(const RVNGInputStreamPtr_t &fragments, const RVNGInputStreamPtr_t &package, IWORKCollector &collector);
55  virtual ~IWAParser()
56  {
57  }
58 
59  bool parse();
60 
61 protected:
63  {
64  public:
65  ObjectMessage(IWAParser &parser, unsigned id, unsigned type = 0);
67 
68  operator bool() const;
69  const IWAMessage &get() const;
70 
71  unsigned getType() const;
72 
73  friend const IWAMessage &get(const ObjectMessage &msg)
74  {
75  return msg.get();
76  }
77 
78  private:
80  boost::optional<IWAMessage> m_message;
81  const unsigned m_id;
82  unsigned m_type;
83  };
84  friend class ObjectMessage;
85 
86  typedef std::map<unsigned, IWORKStylePtr_t> StyleMap_t;
87  typedef std::function<void(unsigned, IWORKStylePtr_t &)> StyleParseFun_t;
88 
89 protected:
90  static boost::optional<unsigned> readRef(const IWAMessage &msg, unsigned field);
91  static std::deque<unsigned> readRefs(const IWAMessage &msg, unsigned field);
92  static boost::optional<IWORKPosition> readPosition(const IWAMessage &msg, unsigned field);
93  static boost::optional<IWORKSize> readSize(const IWAMessage &msg, unsigned field);
94  static boost::optional<IWORKColor> readColor(const IWAMessage &msg, unsigned field);
95  static void readStroke(const IWAMessage &msg, IWORKStroke &stroke);
96  bool readFill(const IWAMessage &msg, IWORKFill &fill);
97  static void readGradient(const IWAMessage &msg, IWORKGradient &gradient);
98  static void readShadow(const IWAMessage &msg, IWORKShadow &shadow);
99  static void readPadding(const IWAMessage &msg, IWORKPadding &padding);
100 
101  bool dispatchShape(unsigned id);
102  bool parseText(unsigned id, const std::function<void(unsigned, IWORKStylePtr_t)> &openPageSpan=nullptr);
103  void parseComment(unsigned id);
104 
106 
107  const IWORKStylePtr_t queryCharacterStyle(unsigned id) const;
108  const IWORKStylePtr_t queryParagraphStyle(unsigned id) const;
109  const IWORKStylePtr_t querySectionStyle(unsigned id) const;
110 
111  const IWORKStylePtr_t queryGraphicStyle(unsigned id) const;
112  const IWORKStylePtr_t queryMediaStyle(unsigned id) const;
113  const IWORKStylePtr_t queryCellStyle(unsigned id) const;
114  const IWORKStylePtr_t queryTableStyle(unsigned id) const;
115  const IWORKStylePtr_t queryListStyle(unsigned id) const;
116 
117  const IWORKStylePtr_t queryStyle(unsigned id, StyleMap_t &styleMap, StyleParseFun_t parse) const;
118 
119 protected:
121  std::shared_ptr<IWORKText> m_currentText;
122 
123 private:
124  typedef std::map<unsigned, boost::variant<std::string, unsigned> > DataList_t;
125 
126  struct PageMaster
127  {
128  PageMaster();
131  };
132 
133  struct TableHeader
134  {
135  TableHeader(unsigned count, float defValue=0);
136 
137  mdds::flat_segment_tree<unsigned, float> m_sizes;
138  mdds::flat_segment_tree<unsigned, bool> m_hidden;
139  };
140 
141  struct TableInfo
142  {
143  TableInfo(const std::shared_ptr<IWORKTable> &table, unsigned columns, unsigned rows);
144 
145  std::shared_ptr<IWORKTable> m_table;
146 
147  const unsigned m_columns;
148  const unsigned m_rows;
149 
151 
154 
155  DataList_t m_simpleTextList;
156  DataList_t m_cellStyleList;
158  DataList_t m_commentList;
159  };
160 
161 private:
162  virtual bool parseDocument() = 0;
163 
164 private:
165  void queryObject(unsigned id, unsigned &type, boost::optional<IWAMessage> &msg) const;
166  const RVNGInputStreamPtr_t queryFile(unsigned id) const;
167 
168  void parseObjectIndex();
169 
170  void parseCharacterStyle(unsigned id, IWORKStylePtr_t &style);
171  void parseParagraphStyle(unsigned id, IWORKStylePtr_t &style);
172  void parseSectionStyle(unsigned id, IWORKStylePtr_t &style);
173 
174  void parseGraphicStyle(unsigned id, IWORKStylePtr_t &style);
175  void parseMediaStyle(unsigned id, IWORKStylePtr_t &style);
176  void parseCellStyle(unsigned id, IWORKStylePtr_t &style);
177  void parseTableStyle(unsigned id, IWORKStylePtr_t &style);
178  void parseListStyle(unsigned id, IWORKStylePtr_t &style);
179 
180  void parseHeaderAndFooter(unsigned id, IWORKPageMaster &hf);
181  void parsePageMaster(unsigned id, PageMaster &pageMaster);
182 
183  void parseTabularModel(unsigned id);
184  void parseDataList(unsigned id, DataList_t &dataList);
185  void parseTile(unsigned id);
186  void parseTableHeaders(unsigned id, TableHeader &header);
187  void parseTableGridLines(unsigned id, IWORKGridLineMap_t (&gridLines)[4]);
188  void parseTableGridLine(unsigned id, IWORKGridLineMap_t &gridLines);
189 
190  void parseLink(unsigned id, std::string &url);
191 
192  bool parseAttachment(unsigned id);
193 
194  bool parseDrawableShape(const IWAMessage &msg, bool isConnectionLine=false);
195  bool parseGroup(const IWAMessage &msg);
196  bool parseShapePlacement(const IWAMessage &msg);
197  bool parseImage(const IWAMessage &msg);
198  bool parseTabularInfo(const IWAMessage &msg);
199  bool parsePath(const IWAMessage &msg, IWORKPathPtr_t &path);
200 
201  bool parseArrowProperties(const IWAMessage &msg, IWORKPropertyMap &props, bool headArrow);
202  void parseCharacterProperties(const IWAMessage &msg, IWORKPropertyMap &props);
203  void parseColumnsProperties(const IWAMessage &msg, IWORKPropertyMap &props);
204 
205 private:
207 
209 
210  std::deque<unsigned> m_visited;
211 
212  mutable StyleMap_t m_charStyles;
213  mutable StyleMap_t m_paraStyles;
214  mutable StyleMap_t m_sectionStyles;
215 
216  mutable StyleMap_t m_graphicStyles;
217  mutable StyleMap_t m_mediaStyles;
218  mutable StyleMap_t m_cellStyles;
219  mutable StyleMap_t m_tableStyles;
220  mutable StyleMap_t m_listStyles;
221 
223  std::shared_ptr<TableInfo> m_currentTable;
224 };
225 
226 }
227 
228 #endif
229 
230 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
void parseCharacterStyle(unsigned id, IWORKStylePtr_t &style)
Definition: IWAParser.cpp:1376
virtual ~IWAParser()
Definition: IWAParser.h:55
std::shared_ptr< IWORKGeometry > IWORKGeometryPtr_t
Definition: IWORKTypes_fwd.h:41
Definition: IWORKBezierElement.cpp:20
DataList_t m_commentList
Definition: IWAParser.h:158
std::shared_ptr< IWORKTable > m_table
Definition: IWAParser.h:145
static boost::optional< IWORKColor > readColor(const IWAMessage &msg, unsigned field)
Definition: IWAParser.cpp:273
Definition: IWORKTypes.h:299
Definition: IWORKToken.h:358
IWAObjectIndex m_index
Definition: IWAParser.h:208
static void readStroke(const IWAMessage &msg, IWORKStroke &stroke)
Definition: IWAParser.cpp:284
static boost::optional< unsigned > readRef(const IWAMessage &msg, unsigned field)
Definition: IWAParser.cpp:229
std::deque< unsigned > m_visited
Definition: IWAParser.h:210
const IWORKStylePtr_t queryCharacterStyle(unsigned id) const
Definition: IWAParser.cpp:792
Definition: IWORKTypes.h:277
void parseComment(unsigned id)
Definition: IWAParser.cpp:2085
StyleMap_t m_paraStyles
Definition: IWAParser.h:213
const unsigned m_columns
Definition: IWAParser.h:147
std::shared_ptr< IWORKText > m_currentText
Definition: IWAParser.h:121
const IWORKStylePtr_t queryGraphicStyle(unsigned id) const
Definition: IWAParser.cpp:807
IWAParser & m_parser
Definition: IWAParser.h:79
const unsigned m_rows
Definition: IWAParser.h:148
DataList_t m_formattedTextList
Definition: IWAParser.h:157
void parseTabularModel(unsigned id)
Definition: IWAParser.cpp:2112
Represents a (hierarchical) property map.
Definition: IWORKPropertyMap.h:24
IWORKTableNameMapPtr_t m_tableNameMap
Definition: IWAParser.h:222
const IWORKStylePtr_t queryStyle(unsigned id, StyleMap_t &styleMap, StyleParseFun_t parse) const
Definition: IWAParser.cpp:779
static boost::optional< IWORKSize > readSize(const IWAMessage &msg, unsigned field)
Definition: IWAParser.cpp:262
bool parseText(unsigned id, const std::function< void(unsigned, IWORKStylePtr_t)> &openPageSpan=nullptr)
Definition: IWAParser.cpp:483
static std::deque< unsigned > readRefs(const IWAMessage &msg, unsigned field)
Definition: IWAParser.cpp:236
Definition: IWAParser.h:133
DataList_t m_cellStyleList
Definition: IWAParser.h:156
void parseTableGridLine(unsigned id, IWORKGridLineMap_t &gridLines)
Definition: IWAParser.cpp:2516
std::shared_ptr< IWORKStyle > IWORKStylePtr_t
Definition: IWORKStyle_fwd.h:21
void parseCharacterProperties(const IWAMessage &msg, IWORKPropertyMap &props)
Definition: IWAParser.cpp:1897
bool parseShapePlacement(const IWAMessage &msg, IWORKGeometryPtr_t &geometry)
Definition: IWAParser.cpp:1293
StyleMap_t m_sectionStyles
Definition: IWAParser.h:214
void parsePageMaster(unsigned id, PageMaster &pageMaster)
Definition: IWAParser.cpp:1980
static void readShadow(const IWAMessage &msg, IWORKShadow &shadow)
Definition: IWAParser.cpp:429
bool m_headerFootersSameAsPrevious
Definition: IWAParser.h:130
IWORKCollector & m_collector
Definition: IWAParser.h:206
const RVNGInputStreamPtr_t queryFile(unsigned id) const
Definition: IWAParser.cpp:224
IWAParser(const IWAParser &)
bool parseImage(const IWAMessage &msg)
Definition: IWAParser.cpp:2052
std::function< void(unsigned, IWORKStylePtr_t &)> StyleParseFun_t
Definition: IWAParser.h:87
IWORKStylePtr_t m_style
Definition: IWAParser.h:150
TableHeader m_columnHeader
Definition: IWAParser.h:152
Definition: IWAParser.h:126
const IWORKStylePtr_t queryMediaStyle(unsigned id) const
Definition: IWAParser.cpp:812
bool parseDrawableShape(const IWAMessage &msg, bool isConnectionLine=false)
Definition: IWAParser.cpp:1045
StyleMap_t m_tableStyles
Definition: IWAParser.h:219
boost::optional< IWAMessage > m_message
Definition: IWAParser.h:80
Definition: IWAParser.h:62
bool parsePath(const IWAMessage &msg, IWORKPathPtr_t &path)
Definition: IWAParser.cpp:962
IWORKStylePtr_t m_style
Definition: IWAParser.h:129
bool parseGroup(const IWAMessage &msg)
Definition: IWAParser.cpp:1276
Definition: KEY1Token.h:198
bool parseArrowProperties(const IWAMessage &msg, IWORKPropertyMap &props, bool headArrow)
Definition: IWAParser.cpp:929
ObjectMessage(IWAParser &parser, unsigned id, unsigned type=0)
Definition: IWAParser.cpp:164
void parseHeaderAndFooter(unsigned id, IWORKPageMaster &hf)
Definition: IWAParser.cpp:2015
bool parseTabularInfo(const IWAMessage &msg)
Definition: IWAParser.cpp:2100
StyleMap_t m_cellStyles
Definition: IWAParser.h:218
static void readGradient(const IWAMessage &msg, IWORKGradient &gradient)
Definition: IWAParser.cpp:396
bool readFill(const IWAMessage &msg, IWORKFill &fill)
Definition: IWAParser.cpp:338
Definition: IWAObjectIndex.h:26
Definition: IWORKTypes.h:99
Definition: IWORKToken.h:414
unsigned m_type
Definition: IWAParser.h:82
unsigned getType() const
Definition: IWAParser.cpp:214
Definition: IWAParser.h:141
void parseMediaStyle(unsigned id, IWORKStylePtr_t &style)
Definition: IWAParser.cpp:1594
Definition: IWORKToken.h:385
Definition: IWORKCollector.h:41
void parseLink(unsigned id, std::string &url)
Definition: IWAParser.cpp:2552
StyleMap_t m_listStyles
Definition: IWAParser.h:220
const IWORKStylePtr_t querySectionStyle(unsigned id) const
Definition: IWAParser.cpp:802
Definition: IWORKToken.h:343
void parseParagraphStyle(unsigned id, IWORKStylePtr_t &style)
Definition: IWAParser.cpp:1400
Definition: IWORKTypes.h:312
std::map< unsigned, boost::variant< std::string, unsigned > > DataList_t
Definition: IWAParser.h:124
StyleMap_t m_charStyles
Definition: IWAParser.h:212
mdds::flat_segment_tree< unsigned, bool > m_hidden
Definition: IWAParser.h:138
void parseColumnsProperties(const IWAMessage &msg, IWORKPropertyMap &props)
Definition: IWAParser.cpp:1937
Definition: IWORKToken.h:154
StyleMap_t m_mediaStyles
Definition: IWAParser.h:217
std::shared_ptr< librevenge::RVNGInputStream > RVNGInputStreamPtr_t
Definition: libetonyek_utils.h:82
Definition: IWORKToken.h:232
IWORKLanguageManager m_langManager
Definition: IWAParser.h:120
Definition: KEY1Token.h:58
void parseCellStyle(unsigned id, IWORKStylePtr_t &style)
Definition: IWAParser.cpp:1642
std::shared_ptr< IWORKTableNameMap_t > IWORKTableNameMapPtr_t
Definition: IWORKTypes_fwd.h:34
std::map< unsigned, IWORKGridLine_t > IWORKGridLineMap_t
Definition: IWORKTypes.h:122
void queryObject(unsigned id, unsigned &type, boost::optional< IWAMessage > &msg) const
Definition: IWAParser.cpp:219
void parseTile(unsigned id)
Definition: IWAParser.cpp:2290
void parseListStyle(unsigned id, IWORKStylePtr_t &style)
Definition: IWAParser.cpp:1769
void parseSectionStyle(unsigned id, IWORKStylePtr_t &style)
Definition: IWAParser.cpp:1499
StyleMap_t m_graphicStyles
Definition: IWAParser.h:216
Definition: IWORKLanguageManager.h:23
void parseObjectIndex()
Definition: IWAParser.cpp:1371
Definition: IWORKTypes.h:356
Definition: IWAObjectType.h:57
Definition: IWORKToken.h:252
void parseGraphicStyle(unsigned id, IWORKStylePtr_t &style)
Definition: IWAParser.cpp:1523
void parseTableHeaders(unsigned id, TableHeader &header)
Definition: IWAParser.cpp:2470
Definition: IWORKToken.h:411
DataList_t m_simpleTextList
Definition: IWAParser.h:155
std::shared_ptr< IWORKPath > IWORKPathPtr_t
Definition: IWORKPath_fwd.h:20
std::map< unsigned, IWORKStylePtr_t > StyleMap_t
Definition: IWAParser.h:86
void parseTableStyle(unsigned id, IWORKStylePtr_t &style)
Definition: IWAParser.cpp:1725
bool dispatchShape(unsigned id)
Definition: IWAParser.cpp:453
IWAParser & operator=(const IWAParser &)
virtual bool parseDocument()=0
Definition: IWAMessage.h:21
boost::variant< IWORKColor, IWORKGradient, IWORKMediaContent > IWORKFill
Definition: IWORKTypes.h:309
TableHeader m_rowHeader
Definition: IWAParser.h:153
Definition: IWAParser.h:48
const IWORKStylePtr_t queryParagraphStyle(unsigned id) const
Definition: IWAParser.cpp:797
Definition: IWORKToken.h:486
static void readPadding(const IWAMessage &msg, IWORKPadding &padding)
Definition: IWAParser.cpp:445
void parseDataList(unsigned id, DataList_t &dataList)
Definition: IWAParser.cpp:2233
~ObjectMessage()
Definition: IWAParser.cpp:194
bool parseAttachment(unsigned id)
Definition: IWAParser.cpp:832
void parseTableGridLines(unsigned id, IWORKGridLineMap_t(&gridLines)[4])
Definition: IWAParser.cpp:2494
Definition: IWORKToken.h:412
const IWORKStylePtr_t queryListStyle(unsigned id) const
Definition: IWAParser.cpp:827
Definition: IWORKToken.h:515
static boost::optional< IWORKPosition > readPosition(const IWAMessage &msg, unsigned field)
Definition: IWAParser.cpp:251
const IWORKStylePtr_t queryTableStyle(unsigned id) const
Definition: IWAParser.cpp:822
Definition: IWORKToken.h:200
const unsigned m_id
Definition: IWAParser.h:81
bool parse()
Definition: IWAParser.cpp:158
std::shared_ptr< TableInfo > m_currentTable
Definition: IWAParser.h:223
const IWORKStylePtr_t queryCellStyle(unsigned id) const
Definition: IWAParser.cpp:817
mdds::flat_segment_tree< unsigned, float > m_sizes
Definition: IWAParser.h:137

Generated for libetonyek by doxygen 1.8.11