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 "LyXLength.h"
17 #include "graphics/GraphicsParams.h"
19 #include <boost/any.hpp>
20 #include <boost/function.hpp>
37 ClipData() : clip(false) {}
39 graphics::BoundingBox bbox;
46 std::string const get(std::string const & id) const;
47 void set(std::string const & id, std::string const & contents);
49 typedef std::map<std::string, std::string>::const_iterator const_iterator;
50 const_iterator begin() const { return data_.begin(); }
51 const_iterator end() const { return data_.end(); }
54 std::map<std::string, std::string> data_;
60 ResizeData() : scale(), keepAspectRatio(false) {}
61 bool no_resize() const;
63 bool usingScale() const;
88 RotationData() : angle("0"), origin_(DEFAULT) {}
89 bool no_rotation() const;
91 std::string const adjAngle() const;
94 void origin(OriginType o) { origin_ = o; }
95 OriginType origin() const { return origin_; }
97 void origin(std::string const &);
98 std::string const originString() const;
105 /** \c RotationDataType is a wrapper for RotationData::OriginType
106 * It can be forward-declared and passed as a function argument without
107 * having to expose this header file.
109 class RotationDataType {
110 RotationData::OriginType val_;
112 RotationDataType(RotationData::OriginType val) : val_(val) {}
113 operator RotationData::OriginType() const { return val_; }
118 * Transformers generating commands
120 class TransformCommand {
122 typedef std::auto_ptr<TransformCommand const> ptr_type;
123 virtual ~TransformCommand() {}
125 /// The string from the External Template that we seek to replace.
126 std::string const front_placeholder() const
127 { return front_placeholder_impl(); }
128 std::string const back_placeholder() const
129 { return back_placeholder_impl(); }
131 /// The appropriate replacements for the placeholder strings.
132 std::string const front() const { return front_impl(); }
133 std::string const back() const { return back_impl(); }
136 virtual std::string const front_placeholder_impl() const = 0;
137 virtual std::string const back_placeholder_impl() const = 0;
139 virtual std::string const front_impl() const = 0;
140 virtual std::string const back_impl() const = 0;
144 class ResizeCommand : public TransformCommand {
147 ResizeCommand(ResizeData const & data_) : data(data_) {}
150 virtual std::string const front_placeholder_impl() const
151 { return "$$ResizeFront"; }
152 virtual std::string const back_placeholder_impl() const
153 { return "$$ResizeBack"; }
157 class ResizeLatexCommand : public ResizeCommand {
159 static ptr_type factory(ResizeData const & data)
160 { return ptr_type(new ResizeLatexCommand(data)); }
163 ResizeLatexCommand(ResizeData const & data_)
164 : ResizeCommand(data_) {}
165 virtual std::string const front_impl() const;
166 virtual std::string const back_impl() const;
170 class RotationCommand : public TransformCommand {
173 RotationCommand(RotationData const & data_) : data(data_) {}
176 virtual std::string const front_placeholder_impl() const
177 { return "$$RotateFront"; }
178 virtual std::string const back_placeholder_impl() const
179 { return "$$RotateBack"; }
183 class RotationLatexCommand : public RotationCommand {
185 static ptr_type factory(RotationData const & data)
186 { return ptr_type(new RotationLatexCommand(data)); }
189 RotationLatexCommand(RotationData const & data_)
190 : RotationCommand(data_) {}
191 virtual std::string const front_impl() const;
192 virtual std::string const back_impl() const;
197 * Transformers generating options
199 class TransformOption {
201 typedef std::auto_ptr<TransformOption const> ptr_type;
202 virtual ~TransformOption() {}
204 /// The string from the External Template that we seek to replace.
205 std::string const placeholder() const { return placeholder_impl(); }
207 /// The appropriate replacement for the placeholder string.
208 std::string const option() const { return option_impl(); }
211 virtual std::string const placeholder_impl() const = 0;
212 virtual std::string const option_impl() const = 0;
216 class ClipOption : public TransformOption {
219 ClipOption(ClipData const & data_) : data(data_) {}
222 virtual std::string const placeholder_impl() const
227 class ClipLatexOption : public ClipOption {
229 static ptr_type factory(ClipData const & data)
230 { return ptr_type(new ClipLatexOption(data)); }
233 ClipLatexOption(ClipData const & data_)
234 : ClipOption(data_) {}
235 virtual std::string const option_impl() const;
239 class ExtraOption : public TransformOption {
241 static ptr_type factory(std::string const & data)
242 { return ptr_type(new ExtraOption(data)); }
245 ExtraOption(std::string const & data_) : data(data_) {}
247 virtual std::string const placeholder_impl() const
248 { return "$$Extra"; }
249 virtual std::string const option_impl() const
255 class ResizeOption : public TransformOption {
258 ResizeOption(ResizeData const & data_) : data(data_) {}
261 virtual std::string const placeholder_impl() const
262 { return "$$Resize"; }
266 class ResizeLatexOption : public ResizeOption {
268 static ptr_type factory(ResizeData const & data)
269 { return ptr_type(new ResizeLatexOption(data)); }
272 ResizeLatexOption(ResizeData const & data_)
273 : ResizeOption(data_) {}
274 virtual std::string const option_impl() const;
278 class RotationOption : public TransformOption {
281 RotationOption(RotationData const & data_) : data(data_) {}
284 virtual std::string const placeholder_impl() const
285 { return "$$Rotate"; }
289 class RotationLatexOption : public RotationOption {
291 static ptr_type factory(RotationData const & data)
292 { return ptr_type(new RotationLatexOption(data)); }
295 RotationLatexOption(RotationData const & data_)
296 : RotationOption(data_) {}
297 virtual std::string const option_impl() const;
304 std::string const sanitizeLatexOption(std::string const & input);
305 std::string const sanitizeDocBookOption(std::string const & input);
316 typedef boost::function<TransformOption::ptr_type(ClipData)>
318 typedef boost::function<TransformOption::ptr_type(std::string)>
320 typedef boost::function<TransformOption::ptr_type(ResizeData)>
322 typedef boost::function<TransformOption::ptr_type(RotationData)>
323 RotationOptionFactory;
324 typedef boost::function<TransformCommand::ptr_type(ResizeData)>
325 ResizeCommandFactory;
326 typedef boost::function<TransformCommand::ptr_type(RotationData)>
327 RotationCommandFactory;
335 /** Stores \c factory and a reminder of what \c data this \c factory
338 template <typename Factory>
339 TransformStore(TransformID id_, Factory const & factory)
340 : id(id_), any_factory(boost::any(factory)) {}
342 typedef TransformCommand::ptr_type ComPtr;
343 typedef TransformOption::ptr_type OptPtr;
345 ComPtr getCommandTransformer(RotationData const &) const;
346 ComPtr getCommandTransformer(ResizeData const &) const;
347 OptPtr getOptionTransformer(RotationData const &) const;
348 OptPtr getOptionTransformer(ResizeData const &) const;
349 OptPtr getOptionTransformer(ClipData const &) const;
350 OptPtr getOptionTransformer(std::string const &) const;
354 boost::any any_factory;
357 } // namespace external
360 #endif // NOT EXTERNALTRANSFORMS_H