3 * \file ExternalTransforms.h
4 * This file is part of LyX, the document processor.
5 * Licence details can be found in the file COPYING.
7 * \author Angus Leeming
9 * Full author contact details are available in file CREDITS.
12 #ifndef EXTERNALTRANSFORMS_H
13 #define EXTERNALTRANSFORMS_H
17 #include "graphics/GraphicsParams.h"
19 #include "support/unique_ptr.h"
21 #include <boost/any.hpp>
40 ClipData() : clip(false) {}
43 graphics::BoundingBox bbox;
51 std::string const get(std::string const & id) const;
52 void set(std::string const & id, std::string const & contents);
54 typedef std::map<std::string, std::string>::const_iterator const_iterator;
55 const_iterator begin() const { return data_.begin(); }
56 const_iterator end() const { return data_.end(); }
59 std::map<std::string, std::string> data_;
65 ResizeData() : scale(), keepAspectRatio(false) {}
66 bool no_resize() const;
68 bool usingScale() const;
93 RotationData() : angle("0"), origin_(DEFAULT) {}
94 bool no_rotation() const;
96 std::string const adjAngle() const;
99 void origin(OriginType o) { origin_ = o; }
100 OriginType origin() const { return origin_; }
102 void origin(std::string const &);
103 std::string const originString() const;
110 /** \c RotationDataType is a wrapper for RotationData::OriginType
111 * It can be forward-declared and passed as a function argument without
112 * having to expose this header file.
114 class RotationDataType {
115 RotationData::OriginType val_;
117 RotationDataType(RotationData::OriginType val) : val_(val) {}
118 operator RotationData::OriginType() const { return val_; }
123 * Transformers generating commands
125 class TransformCommand {
127 typedef unique_ptr<TransformCommand const> ptr_type;
128 virtual ~TransformCommand() {}
130 /// The string from the External Template that we seek to replace.
131 std::string const front_placeholder() const
132 { return front_placeholder_impl(); }
133 std::string const back_placeholder() const
134 { return back_placeholder_impl(); }
136 /// The appropriate replacements for the placeholder strings.
137 std::string const front() const { return front_impl(); }
138 std::string const back() const { return back_impl(); }
141 virtual std::string const front_placeholder_impl() const = 0;
142 virtual std::string const back_placeholder_impl() const = 0;
144 virtual std::string const front_impl() const = 0;
145 virtual std::string const back_impl() const = 0;
149 class ResizeCommand : public TransformCommand {
152 ResizeCommand(ResizeData const & data_) : data(data_) {}
155 virtual std::string const front_placeholder_impl() const
156 { return "$$ResizeFront"; }
157 virtual std::string const back_placeholder_impl() const
158 { return "$$ResizeBack"; }
162 class ResizeLatexCommand : public ResizeCommand {
164 static ptr_type factory(ResizeData const & data)
165 { return ptr_type(new ResizeLatexCommand(data)); }
168 ResizeLatexCommand(ResizeData const & data_)
169 : ResizeCommand(data_) {}
170 virtual std::string const front_impl() const;
171 virtual std::string const back_impl() const;
175 class RotationCommand : public TransformCommand {
178 RotationCommand(RotationData const & data_) : data(data_) {}
181 virtual std::string const front_placeholder_impl() const
182 { return "$$RotateFront"; }
183 virtual std::string const back_placeholder_impl() const
184 { return "$$RotateBack"; }
188 class RotationLatexCommand : public RotationCommand {
190 static ptr_type factory(RotationData const & data)
191 { return ptr_type(new RotationLatexCommand(data)); }
194 RotationLatexCommand(RotationData const & data_)
195 : RotationCommand(data_) {}
196 virtual std::string const front_impl() const;
197 virtual std::string const back_impl() const;
202 * Transformers generating options
204 class TransformOption {
206 typedef unique_ptr<TransformOption const> ptr_type;
207 virtual ~TransformOption() {}
209 /// The string from the External Template that we seek to replace.
210 std::string const placeholder() const { return placeholder_impl(); }
212 /// The appropriate replacement for the placeholder string.
213 std::string const option() const { return option_impl(); }
216 virtual std::string const placeholder_impl() const = 0;
217 virtual std::string const option_impl() const = 0;
221 class ClipOption : public TransformOption {
224 ClipOption(ClipData const & data_) : data(data_) {}
227 virtual std::string const placeholder_impl() const
232 class ClipLatexOption : public ClipOption {
234 static ptr_type factory(ClipData const & data)
235 { return ptr_type(new ClipLatexOption(data)); }
238 ClipLatexOption(ClipData const & data_)
239 : ClipOption(data_) {}
240 virtual std::string const option_impl() const;
244 class ExtraOption : public TransformOption {
246 static ptr_type factory(std::string const & data)
247 { return ptr_type(new ExtraOption(data)); }
250 ExtraOption(std::string const & data_) : data(data_) {}
252 virtual std::string const placeholder_impl() const
253 { return "$$Extra"; }
254 virtual std::string const option_impl() const
260 class ResizeOption : public TransformOption {
263 ResizeOption(ResizeData const & data_) : data(data_) {}
266 virtual std::string const placeholder_impl() const
267 { return "$$Resize"; }
271 class ResizeLatexOption : public ResizeOption {
273 static ptr_type factory(ResizeData const & data)
274 { return ptr_type(new ResizeLatexOption(data)); }
277 ResizeLatexOption(ResizeData const & data_)
278 : ResizeOption(data_) {}
279 virtual std::string const option_impl() const;
283 class RotationOption : public TransformOption {
286 RotationOption(RotationData const & data_) : data(data_) {}
289 virtual std::string const placeholder_impl() const
290 { return "$$Rotate"; }
294 class RotationLatexOption : public RotationOption {
296 static ptr_type factory(RotationData const & data)
297 { return ptr_type(new RotationLatexOption(data)); }
300 RotationLatexOption(RotationData const & data_)
301 : RotationOption(data_) {}
302 virtual std::string const option_impl() const;
309 std::string const sanitizeLatexOption(std::string const & input);
310 std::string const sanitizeDocBookOption(std::string const & input);
321 typedef std::function<TransformOption::ptr_type(ClipData)>
323 typedef std::function<TransformOption::ptr_type(std::string)>
325 typedef std::function<TransformOption::ptr_type(ResizeData)>
327 typedef std::function<TransformOption::ptr_type(RotationData)>
328 RotationOptionFactory;
329 typedef std::function<TransformCommand::ptr_type(ResizeData)>
330 ResizeCommandFactory;
331 typedef std::function<TransformCommand::ptr_type(RotationData)>
332 RotationCommandFactory;
338 TransformStore() : id(Rotate) {}
340 /** Stores \c factory and a reminder of what \c data this \c factory
343 template <typename Factory>
344 TransformStore(TransformID id_, Factory const & factory)
345 : id(id_), any_factory(boost::any(factory)) {}
347 typedef TransformCommand::ptr_type ComPtr;
348 typedef TransformOption::ptr_type OptPtr;
350 ComPtr getCommandTransformer(RotationData const &) const;
351 ComPtr getCommandTransformer(ResizeData const &) const;
352 OptPtr getOptionTransformer(RotationData const &) const;
353 OptPtr getOptionTransformer(ResizeData const &) const;
354 OptPtr getOptionTransformer(ClipData const &) const;
355 OptPtr getOptionTransformer(std::string const &) const;
359 boost::any any_factory;
362 } // namespace external
365 #endif // NOT EXTERNALTRANSFORMS_H