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
15 #include "graphics/GraphicsParams.h"
17 #include "support/Length.h"
18 #include "support/unique_ptr.h"
20 #include <boost/any.hpp>
37 ClipData() : clip(false) {}
40 graphics::BoundingBox bbox;
48 std::string const get(std::string const & id) const;
49 void set(std::string const & id, std::string const & contents);
51 typedef std::map<std::string, std::string>::const_iterator const_iterator;
52 const_iterator begin() const { return data_.begin(); }
53 const_iterator end() const { return data_.end(); }
56 std::map<std::string, std::string> data_;
62 ResizeData() : scale(), keepAspectRatio(false) {}
63 bool no_resize() const;
65 bool usingScale() const;
90 RotationData() : angle("0"), origin_(DEFAULT) {}
91 bool no_rotation() const;
93 std::string const adjAngle() const;
96 void origin(OriginType o) { origin_ = o; }
97 OriginType origin() const { return origin_; }
99 void origin(std::string const &);
100 std::string const originString() const;
107 /** \c RotationDataType is a wrapper for RotationData::OriginType
108 * It can be forward-declared and passed as a function argument without
109 * having to expose this header file.
111 class RotationDataType {
112 RotationData::OriginType val_;
114 RotationDataType(RotationData::OriginType val) : val_(val) {}
115 operator RotationData::OriginType() const { return val_; }
120 * Transformers generating commands
122 class TransformCommand {
124 typedef unique_ptr<TransformCommand const> ptr_type;
125 virtual ~TransformCommand() {}
127 /// The string from the External Template that we seek to replace.
128 std::string const front_placeholder() const
129 { return front_placeholder_impl(); }
130 std::string const back_placeholder() const
131 { return back_placeholder_impl(); }
133 /// The appropriate replacements for the placeholder strings.
134 std::string const front() const { return front_impl(); }
135 std::string const back() const { return back_impl(); }
138 virtual std::string const front_placeholder_impl() const = 0;
139 virtual std::string const back_placeholder_impl() const = 0;
141 virtual std::string const front_impl() const = 0;
142 virtual std::string const back_impl() const = 0;
146 class ResizeCommand : public TransformCommand {
149 explicit ResizeCommand(ResizeData const & data_) : data(data_) {}
152 std::string const front_placeholder_impl() const override
153 { return "$$ResizeFront"; }
154 std::string const back_placeholder_impl() const override
155 { return "$$ResizeBack"; }
159 class ResizeLatexCommand : public ResizeCommand {
161 static ptr_type factory(ResizeData const & data)
162 { return ptr_type(new ResizeLatexCommand(data)); }
165 explicit ResizeLatexCommand(ResizeData const & data_)
166 : ResizeCommand(data_) {}
167 std::string const front_impl() const override;
168 std::string const back_impl() const override;
172 class RotationCommand : public TransformCommand {
175 explicit RotationCommand(RotationData const & data_) : data(data_) {}
178 std::string const front_placeholder_impl() const override
179 { return "$$RotateFront"; }
180 std::string const back_placeholder_impl() const override
181 { return "$$RotateBack"; }
185 class RotationLatexCommand : public RotationCommand {
187 static ptr_type factory(RotationData const & data)
188 { return ptr_type(new RotationLatexCommand(data)); }
191 explicit RotationLatexCommand(RotationData const & data_)
192 : RotationCommand(data_) {}
193 std::string const front_impl() const override;
194 std::string const back_impl() const override;
199 * Transformers generating options
201 class TransformOption {
203 typedef unique_ptr<TransformOption const> ptr_type;
204 virtual ~TransformOption() {}
206 /// The string from the External Template that we seek to replace.
207 std::string const placeholder() const { return placeholder_impl(); }
209 /// The appropriate replacement for the placeholder string.
210 std::string const option() const { return option_impl(); }
213 virtual std::string const placeholder_impl() const = 0;
214 virtual std::string const option_impl() const = 0;
218 class ClipOption : public TransformOption {
221 explicit ClipOption(ClipData const & data_) : data(data_) {}
224 std::string const placeholder_impl() const override
229 class ClipLatexOption : public ClipOption {
231 static ptr_type factory(ClipData const & data)
232 { return ptr_type(new ClipLatexOption(data)); }
235 explicit ClipLatexOption(ClipData const & data_)
236 : ClipOption(data_) {}
237 std::string const option_impl() const override;
241 class ExtraOption : public TransformOption {
243 static ptr_type factory(std::string const & data)
244 { return ptr_type(new ExtraOption(data)); }
247 explicit ExtraOption(std::string const & data_) : data(data_) {}
249 std::string const placeholder_impl() const override
250 { return "$$Extra"; }
251 std::string const option_impl() const override
257 class ResizeOption : public TransformOption {
260 explicit ResizeOption(ResizeData const & data_) : data(data_) {}
263 std::string const placeholder_impl() const override
264 { return "$$Resize"; }
268 class ResizeLatexOption : public ResizeOption {
270 static ptr_type factory(ResizeData const & data)
271 { return ptr_type(new ResizeLatexOption(data)); }
274 explicit ResizeLatexOption(ResizeData const & data_)
275 : ResizeOption(data_) {}
276 std::string const option_impl() const override;
280 class RotationOption : public TransformOption {
283 explicit RotationOption(RotationData const & data_) : data(data_) {}
286 std::string const placeholder_impl() const override
287 { return "$$Rotate"; }
291 class RotationLatexOption : public RotationOption {
293 static ptr_type factory(RotationData const & data)
294 { return ptr_type(new RotationLatexOption(data)); }
297 explicit RotationLatexOption(RotationData const & data_)
298 : RotationOption(data_) {}
299 std::string const option_impl() const override;
306 std::string const sanitizeLatexOption(std::string const & input);
307 std::string const sanitizeDocBookOption(std::string const & input);
318 typedef std::function<TransformOption::ptr_type(ClipData)>
320 typedef std::function<TransformOption::ptr_type(std::string)>
322 typedef std::function<TransformOption::ptr_type(ResizeData)>
324 typedef std::function<TransformOption::ptr_type(RotationData)>
325 RotationOptionFactory;
326 typedef std::function<TransformCommand::ptr_type(ResizeData)>
327 ResizeCommandFactory;
328 typedef std::function<TransformCommand::ptr_type(RotationData)>
329 RotationCommandFactory;
335 TransformStore() : id(Rotate) {}
337 /** Stores \c factory and a reminder of what \c data this \c factory
340 template <typename Factory>
341 TransformStore(TransformID id_, Factory const & factory)
342 : id(id_), any_factory(boost::any(factory)) {}
344 typedef TransformCommand::ptr_type ComPtr;
345 typedef TransformOption::ptr_type OptPtr;
347 ComPtr getCommandTransformer(RotationData const &) const;
348 ComPtr getCommandTransformer(ResizeData const &) const;
349 OptPtr getOptionTransformer(RotationData const &) const;
350 OptPtr getOptionTransformer(ResizeData const &) const;
351 OptPtr getOptionTransformer(ClipData const &) const;
352 OptPtr getOptionTransformer(std::string const &) const;
356 boost::any any_factory;
359 } // namespace external
362 #endif // NOT EXTERNALTRANSFORMS_H