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(), keepAspectRatio(false) {}
60 bool no_resize() const;
62 bool usingScale() const;
87 RotationData() : angle("0"), origin_(DEFAULT) {}
88 bool no_rotation() const;
90 std::string const adjAngle() const;
93 void origin(OriginType o) { origin_ = o; }
94 OriginType origin() const { return origin_; }
96 void origin(std::string const &);
97 std::string const originString() const;
104 /** \c RotationDataType is a wrapper for RotationData::OriginType
105 * It can be forward-declared and passed as a function argument without
106 * having to expose this header file.
108 class RotationDataType {
109 RotationData::OriginType val_;
111 RotationDataType(RotationData::OriginType val) : val_(val) {}
112 operator RotationData::OriginType() const { return val_; }
117 * Transformers generating commands
119 class TransformCommand {
121 typedef std::auto_ptr<TransformCommand const> ptr_type;
122 virtual ~TransformCommand() {}
124 /// The string from the External Template that we seek to replace.
125 std::string const front_placeholder() const
126 { return front_placeholder_impl(); }
127 std::string const back_placeholder() const
128 { return back_placeholder_impl(); }
130 /// The appropriate replacements for the placeholder strings.
131 std::string const front() const { return front_impl(); }
132 std::string const back() const { return back_impl(); }
135 virtual std::string const front_placeholder_impl() const = 0;
136 virtual std::string const back_placeholder_impl() const = 0;
138 virtual std::string const front_impl() const = 0;
139 virtual std::string const back_impl() const = 0;
143 class ResizeCommand : public TransformCommand {
146 ResizeCommand(ResizeData const & data_) : data(data_) {}
149 virtual std::string const front_placeholder_impl() const
150 { return "$$ResizeFront"; }
151 virtual std::string const back_placeholder_impl() const
152 { return "$$ResizeBack"; }
156 class ResizeLatexCommand : public ResizeCommand {
158 static ptr_type factory(ResizeData const & data)
159 { return ptr_type(new ResizeLatexCommand(data)); }
162 ResizeLatexCommand(ResizeData const & data_)
163 : ResizeCommand(data_) {}
164 virtual std::string const front_impl() const;
165 virtual std::string const back_impl() const;
169 class RotationCommand : public TransformCommand {
172 RotationCommand(RotationData const & data_) : data(data_) {}
175 virtual std::string const front_placeholder_impl() const
176 { return "$$RotateFront"; }
177 virtual std::string const back_placeholder_impl() const
178 { return "$$RotateBack"; }
182 class RotationLatexCommand : public RotationCommand {
184 static ptr_type factory(RotationData const & data)
185 { return ptr_type(new RotationLatexCommand(data)); }
188 RotationLatexCommand(RotationData const & data_)
189 : RotationCommand(data_) {}
190 virtual std::string const front_impl() const;
191 virtual std::string const back_impl() const;
196 * Transformers generating options
198 class TransformOption {
200 typedef std::auto_ptr<TransformOption const> ptr_type;
201 virtual ~TransformOption() {}
203 /// The string from the External Template that we seek to replace.
204 std::string const placeholder() const { return placeholder_impl(); }
206 /// The appropriate replacement for the placeholder string.
207 std::string const option() const { return option_impl(); }
210 virtual std::string const placeholder_impl() const = 0;
211 virtual std::string const option_impl() const = 0;
215 class ClipOption : public TransformOption {
218 ClipOption(ClipData const & data_) : data(data_) {}
221 virtual std::string const placeholder_impl() const
226 class ClipLatexOption : public ClipOption {
228 static ptr_type factory(ClipData const & data)
229 { return ptr_type(new ClipLatexOption(data)); }
232 ClipLatexOption(ClipData const & data_)
233 : ClipOption(data_) {}
234 virtual std::string const option_impl() const;
238 class ExtraOption : public TransformOption {
240 static ptr_type factory(std::string const & data)
241 { return ptr_type(new ExtraOption(data)); }
244 ExtraOption(std::string const & data_) : data(data_) {}
246 virtual std::string const placeholder_impl() const
247 { return "$$Extra"; }
248 virtual std::string const option_impl() const
254 class ResizeOption : public TransformOption {
257 ResizeOption(ResizeData const & data_) : data(data_) {}
260 virtual std::string const placeholder_impl() const
261 { return "$$Resize"; }
265 class ResizeLatexOption : public ResizeOption {
267 static ptr_type factory(ResizeData const & data)
268 { return ptr_type(new ResizeLatexOption(data)); }
271 ResizeLatexOption(ResizeData const & data_)
272 : ResizeOption(data_) {}
273 virtual std::string const option_impl() const;
277 class RotationOption : public TransformOption {
280 RotationOption(RotationData const & data_) : data(data_) {}
283 virtual std::string const placeholder_impl() const
284 { return "$$Rotate"; }
288 class RotationLatexOption : public RotationOption {
290 static ptr_type factory(RotationData const & data)
291 { return ptr_type(new RotationLatexOption(data)); }
294 RotationLatexOption(RotationData const & data_)
295 : RotationOption(data_) {}
296 virtual std::string const option_impl() const;
303 std::string const sanitizeLatexOption(std::string const & input);
304 std::string const sanitizeDocBookOption(std::string const & input);
315 typedef boost::function<TransformOption::ptr_type(ClipData)>
317 typedef boost::function<TransformOption::ptr_type(std::string)>
319 typedef boost::function<TransformOption::ptr_type(ResizeData)>
321 typedef boost::function<TransformOption::ptr_type(RotationData)>
322 RotationOptionFactory;
323 typedef boost::function<TransformCommand::ptr_type(ResizeData)>
324 ResizeCommandFactory;
325 typedef boost::function<TransformCommand::ptr_type(RotationData)>
326 RotationCommandFactory;
334 /** Stores \c factory and a reminder of what \c data this \c factory
337 template <typename Factory>
338 TransformStore(TransformID id_, Factory const & factory)
339 : id(id_), any_factory(boost::any(factory)) {}
341 typedef TransformCommand::ptr_type ComPtr;
342 typedef TransformOption::ptr_type OptPtr;
344 ComPtr getCommandTransformer(RotationData const &) const;
345 ComPtr getCommandTransformer(ResizeData const &) const;
346 OptPtr getOptionTransformer(RotationData const &) const;
347 OptPtr getOptionTransformer(ResizeData const &) const;
348 OptPtr getOptionTransformer(ClipData const &) const;
349 OptPtr getOptionTransformer(std::string const &) const;
353 boost::any any_factory;
356 } // namespace external
359 #endif // NOT EXTERNALTRANSFORMS_H