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>
36 ClipData() : clip(false) {}
38 lyx::graphics::BoundingBox bbox;
45 std::string const get(std::string const & id) const;
46 void set(std::string const & id, std::string const & contents);
48 typedef std::map<std::string, std::string>::const_iterator const_iterator;
49 const_iterator begin() const { return data_.begin(); }
50 const_iterator end() const { return data_.end(); }
53 std::map<std::string, std::string> data_;
59 ResizeData() : scale(0), keepAspectRatio(false) {}
60 bool no_resize() const;
85 RotationData() : angle_(0), origin_(DEFAULT) {}
86 bool no_rotation() const;
89 double angle() const { return angle_; }
91 void origin(OriginType o) { origin_ = o; }
92 OriginType origin() const { return origin_; }
94 void origin(std::string const &);
95 std::string const originString() const;
104 * Transformers generating commands
106 class TransformCommand {
108 typedef std::auto_ptr<TransformCommand const> ptr_type;
109 virtual ~TransformCommand() {}
111 /// The string from the External Template that we seek to replace.
112 std::string const front_placeholder() const
113 { return front_placeholder_impl(); }
114 std::string const back_placeholder() const
115 { return back_placeholder_impl(); }
117 /// The appropriate replacements for the placeholder strings.
118 std::string const front() const { return front_impl(); }
119 std::string const back() const { return back_impl(); }
122 virtual std::string const front_placeholder_impl() const = 0;
123 virtual std::string const back_placeholder_impl() const = 0;
125 virtual std::string const front_impl() const = 0;
126 virtual std::string const back_impl() const = 0;
130 class ResizeCommand : public TransformCommand {
133 ResizeCommand(ResizeData const & data_) : data(data_) {}
136 virtual std::string const front_placeholder_impl() const
137 { return "$$ResizeFront"; }
138 virtual std::string const back_placeholder_impl() const
139 { return "$$ResizeBack"; }
143 class ResizeLatexCommand : public ResizeCommand {
145 static ptr_type factory(ResizeData const & data)
146 { return ptr_type(new ResizeLatexCommand(data)); }
149 ResizeLatexCommand(ResizeData const & data_)
150 : ResizeCommand(data_) {}
151 virtual std::string const front_impl() const;
152 virtual std::string const back_impl() const;
156 class RotationCommand : public TransformCommand {
159 RotationCommand(RotationData const & data_) : data(data_) {}
162 virtual std::string const front_placeholder_impl() const
163 { return "$$RotateFront"; }
164 virtual std::string const back_placeholder_impl() const
165 { return "$$RotateBack"; }
169 class RotationLatexCommand : public RotationCommand {
171 static ptr_type factory(RotationData const & data)
172 { return ptr_type(new RotationLatexCommand(data)); }
175 RotationLatexCommand(RotationData const & data_)
176 : RotationCommand(data_) {}
177 virtual std::string const front_impl() const;
178 virtual std::string const back_impl() const;
183 * Transformers generating options
185 class TransformOption {
187 typedef std::auto_ptr<TransformOption const> ptr_type;
188 virtual ~TransformOption() {}
190 /// The string from the External Template that we seek to replace.
191 std::string const placeholder() const { return placeholder_impl(); }
193 /// The appropriate replacement for the placeholder string.
194 std::string const option() const { return option_impl(); }
197 virtual std::string const placeholder_impl() const = 0;
198 virtual std::string const option_impl() const = 0;
202 class ClipOption : public TransformOption {
205 ClipOption(ClipData const & data_) : data(data_) {}
208 virtual std::string const placeholder_impl() const
213 class ClipLatexOption : public ClipOption {
215 static ptr_type factory(ClipData const & data)
216 { return ptr_type(new ClipLatexOption(data)); }
219 ClipLatexOption(ClipData const & data_)
220 : ClipOption(data_) {}
221 virtual std::string const option_impl() const;
225 class ExtraOption : public TransformOption {
227 static ptr_type factory(std::string const & data)
228 { return ptr_type(new ExtraOption(data)); }
231 ExtraOption(std::string const & data_) : data(data_) {}
233 virtual std::string const placeholder_impl() const
234 { return "$$Extra"; }
235 virtual std::string const option_impl() const
241 class ResizeOption : public TransformOption {
244 ResizeOption(ResizeData const & data_) : data(data_) {}
247 virtual std::string const placeholder_impl() const
248 { return "$$Resize"; }
252 class ResizeLatexOption : public ResizeOption {
254 static ptr_type factory(ResizeData const & data)
255 { return ptr_type(new ResizeLatexOption(data)); }
258 ResizeLatexOption(ResizeData const & data_)
259 : ResizeOption(data_) {}
260 virtual std::string const option_impl() const;
264 class RotationOption : public TransformOption {
267 RotationOption(RotationData const & data_) : data(data_) {}
270 virtual std::string const placeholder_impl() const
271 { return "$$Rotate"; }
275 class RotationLatexOption : public RotationOption {
277 static ptr_type factory(RotationData const & data)
278 { return ptr_type(new RotationLatexOption(data)); }
281 RotationLatexOption(RotationData const & data_)
282 : RotationOption(data_) {}
283 virtual std::string const option_impl() const;
290 std::string const sanitizeLatexOption(std::string const & input);
291 std::string const sanitizeDocBookOption(std::string const & input);
292 std::string const sanitizeLinuxDocOption(std::string const & input);
303 typedef boost::function1<TransformOption::ptr_type, ClipData>
305 typedef boost::function1<TransformOption::ptr_type, std::string>
307 typedef boost::function1<TransformOption::ptr_type, ResizeData>
309 typedef boost::function1<TransformOption::ptr_type, RotationData>
310 RotationOptionFactory;
311 typedef boost::function1<TransformCommand::ptr_type, ResizeData>
312 ResizeCommandFactory;
313 typedef boost::function1<TransformCommand::ptr_type, RotationData>
314 RotationCommandFactory;
317 struct TransformStore
321 /** Stores \c factory and a reminder of what \c data this \c factory
324 template <typename Factory>
325 TransformStore(TransformID id_, Factory const & factory)
326 : id(id_), any_factory(boost::any(factory)) {}
328 typedef TransformCommand::ptr_type ComPtr;
329 typedef TransformOption::ptr_type OptPtr;
331 ComPtr getCommandTransformer(RotationData const &) const;
332 ComPtr getCommandTransformer(ResizeData const &) const;
333 OptPtr getOptionTransformer(RotationData const &) const;
334 OptPtr getOptionTransformer(ResizeData const &) const;
335 OptPtr getOptionTransformer(ClipData const &) const;
336 OptPtr getOptionTransformer(std::string const &) const;
340 boost::any any_factory;
343 } // namespace external
346 #endif // NOT EXTERNALTRANSFORMS_H