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/any.h"
18 #include "support/Length.h"
19 #include "support/unique_ptr.h"
36 ClipData() : clip(false) {}
39 graphics::BoundingBox bbox;
47 std::string const get(std::string const & id) const;
48 void set(std::string const & id, std::string const & data);
50 typedef std::map<std::string, std::string>::const_iterator const_iterator;
51 const_iterator begin() const { return data_.begin(); }
52 const_iterator end() const { return data_.end(); }
55 std::map<std::string, std::string> data_;
61 ResizeData() : scale(), keepAspectRatio(false) {}
62 bool no_resize() const;
64 bool usingScale() const;
89 RotationData() : angle("0"), origin_(DEFAULT) {}
90 bool no_rotation() const;
92 std::string const adjAngle() const;
95 void origin(OriginType o) { origin_ = o; }
96 OriginType origin() const { return origin_; }
98 void origin(std::string const &);
99 std::string const originString() const;
106 /** \c RotationDataType is a wrapper for RotationData::OriginType
107 * It can be forward-declared and passed as a function argument without
108 * having to expose this header file.
110 class RotationDataType {
111 RotationData::OriginType val_;
113 RotationDataType(RotationData::OriginType val) : val_(val) {}
114 operator RotationData::OriginType() const { return val_; }
119 * Transformers generating commands
121 class TransformCommand {
123 typedef unique_ptr<TransformCommand const> ptr_type;
124 virtual ~TransformCommand() {}
126 /// The string from the External Template that we seek to replace.
127 std::string const front_placeholder() const
128 { return front_placeholder_impl(); }
129 std::string const back_placeholder() const
130 { return back_placeholder_impl(); }
132 /// The appropriate replacements for the placeholder strings.
133 std::string const front() const { return front_impl(); }
134 std::string const back() const { return back_impl(); }
137 virtual std::string const front_placeholder_impl() const = 0;
138 virtual std::string const back_placeholder_impl() const = 0;
140 virtual std::string const front_impl() const = 0;
141 virtual std::string const back_impl() const = 0;
145 class ResizeCommand : public TransformCommand {
148 explicit ResizeCommand(ResizeData const & data_) : data(data_) {}
151 std::string const front_placeholder_impl() const override
152 { return "$$ResizeFront"; }
153 std::string const back_placeholder_impl() const override
154 { return "$$ResizeBack"; }
158 class ResizeLatexCommand : public ResizeCommand {
160 static ptr_type factory(ResizeData const & data)
161 { return ptr_type(new ResizeLatexCommand(data)); }
164 explicit ResizeLatexCommand(ResizeData const & data_)
165 : ResizeCommand(data_) {}
166 std::string const front_impl() const override;
167 std::string const back_impl() const override;
171 class RotationCommand : public TransformCommand {
174 explicit RotationCommand(RotationData const & data_) : data(data_) {}
177 std::string const front_placeholder_impl() const override
178 { return "$$RotateFront"; }
179 std::string const back_placeholder_impl() const override
180 { return "$$RotateBack"; }
184 class RotationLatexCommand : public RotationCommand {
186 static ptr_type factory(RotationData const & data)
187 { return ptr_type(new RotationLatexCommand(data)); }
190 explicit RotationLatexCommand(RotationData const & data_)
191 : RotationCommand(data_) {}
192 std::string const front_impl() const override;
193 std::string const back_impl() const override;
198 * Transformers generating options
200 class TransformOption {
202 typedef unique_ptr<TransformOption const> ptr_type;
203 virtual ~TransformOption() {}
205 /// The string from the External Template that we seek to replace.
206 std::string const placeholder() const { return placeholder_impl(); }
208 /// The appropriate replacement for the placeholder string.
209 std::string const option() const { return option_impl(); }
212 virtual std::string const placeholder_impl() const = 0;
213 virtual std::string const option_impl() const = 0;
217 class ClipOption : public TransformOption {
220 explicit ClipOption(ClipData const & data_) : data(data_) {}
223 std::string const placeholder_impl() const override
228 class ClipLatexOption : public ClipOption {
230 static ptr_type factory(ClipData const & data)
231 { return ptr_type(new ClipLatexOption(data)); }
234 explicit ClipLatexOption(ClipData const & data_)
235 : ClipOption(data_) {}
236 std::string const option_impl() const override;
240 class ExtraOption : public TransformOption {
242 static ptr_type factory(std::string const & data)
243 { return ptr_type(new ExtraOption(data)); }
246 explicit ExtraOption(std::string const & data_) : data(data_) {}
248 std::string const placeholder_impl() const override
249 { return "$$Extra"; }
250 std::string const option_impl() const override
256 class ResizeOption : public TransformOption {
259 explicit ResizeOption(ResizeData const & data_) : data(data_) {}
262 std::string const placeholder_impl() const override
263 { return "$$Resize"; }
267 class ResizeLatexOption : public ResizeOption {
269 static ptr_type factory(ResizeData const & data)
270 { return ptr_type(new ResizeLatexOption(data)); }
273 explicit ResizeLatexOption(ResizeData const & data_)
274 : ResizeOption(data_) {}
275 std::string const option_impl() const override;
279 class RotationOption : public TransformOption {
282 explicit RotationOption(RotationData const & data_) : data(data_) {}
285 std::string const placeholder_impl() const override
286 { return "$$Rotate"; }
290 class RotationLatexOption : public RotationOption {
292 static ptr_type factory(RotationData const & data)
293 { return ptr_type(new RotationLatexOption(data)); }
296 explicit RotationLatexOption(RotationData const & data_)
297 : RotationOption(data_) {}
298 std::string const option_impl() const override;
305 std::string const sanitizeLatexOption(std::string const & input);
306 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(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;
359 } // namespace external
362 #endif // NOT EXTERNALTRANSFORMS_H