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
17 #include "graphics/GraphicsParams.h"
19 #include "support/unique_ptr.h"
21 #include <boost/any.hpp>
22 #include <boost/function.hpp>
39 ClipData() : clip(false) {}
42 graphics::BoundingBox bbox;
50 std::string const get(std::string const & id) const;
51 void set(std::string const & id, std::string const & contents);
53 typedef std::map<std::string, std::string>::const_iterator const_iterator;
54 const_iterator begin() const { return data_.begin(); }
55 const_iterator end() const { return data_.end(); }
58 std::map<std::string, std::string> data_;
64 ResizeData() : scale(), keepAspectRatio(false) {}
65 bool no_resize() const;
67 bool usingScale() const;
92 RotationData() : angle("0"), origin_(DEFAULT) {}
93 bool no_rotation() const;
95 std::string const adjAngle() const;
98 void origin(OriginType o) { origin_ = o; }
99 OriginType origin() const { return origin_; }
101 void origin(std::string const &);
102 std::string const originString() const;
109 /** \c RotationDataType is a wrapper for RotationData::OriginType
110 * It can be forward-declared and passed as a function argument without
111 * having to expose this header file.
113 class RotationDataType {
114 RotationData::OriginType val_;
116 RotationDataType(RotationData::OriginType val) : val_(val) {}
117 operator RotationData::OriginType() const { return val_; }
122 * Transformers generating commands
124 class TransformCommand {
126 typedef unique_ptr<TransformCommand const> ptr_type;
127 virtual ~TransformCommand() {}
129 /// The string from the External Template that we seek to replace.
130 std::string const front_placeholder() const
131 { return front_placeholder_impl(); }
132 std::string const back_placeholder() const
133 { return back_placeholder_impl(); }
135 /// The appropriate replacements for the placeholder strings.
136 std::string const front() const { return front_impl(); }
137 std::string const back() const { return back_impl(); }
140 virtual std::string const front_placeholder_impl() const = 0;
141 virtual std::string const back_placeholder_impl() const = 0;
143 virtual std::string const front_impl() const = 0;
144 virtual std::string const back_impl() const = 0;
148 class ResizeCommand : public TransformCommand {
151 ResizeCommand(ResizeData const & data_) : data(data_) {}
154 virtual std::string const front_placeholder_impl() const
155 { return "$$ResizeFront"; }
156 virtual std::string const back_placeholder_impl() const
157 { return "$$ResizeBack"; }
161 class ResizeLatexCommand : public ResizeCommand {
163 static ptr_type factory(ResizeData const & data)
164 { return ptr_type(new ResizeLatexCommand(data)); }
167 ResizeLatexCommand(ResizeData const & data_)
168 : ResizeCommand(data_) {}
169 virtual std::string const front_impl() const;
170 virtual std::string const back_impl() const;
174 class RotationCommand : public TransformCommand {
177 RotationCommand(RotationData const & data_) : data(data_) {}
180 virtual std::string const front_placeholder_impl() const
181 { return "$$RotateFront"; }
182 virtual std::string const back_placeholder_impl() const
183 { return "$$RotateBack"; }
187 class RotationLatexCommand : public RotationCommand {
189 static ptr_type factory(RotationData const & data)
190 { return ptr_type(new RotationLatexCommand(data)); }
193 RotationLatexCommand(RotationData const & data_)
194 : RotationCommand(data_) {}
195 virtual std::string const front_impl() const;
196 virtual std::string const back_impl() const;
201 * Transformers generating options
203 class TransformOption {
205 typedef unique_ptr<TransformOption const> ptr_type;
206 virtual ~TransformOption() {}
208 /// The string from the External Template that we seek to replace.
209 std::string const placeholder() const { return placeholder_impl(); }
211 /// The appropriate replacement for the placeholder string.
212 std::string const option() const { return option_impl(); }
215 virtual std::string const placeholder_impl() const = 0;
216 virtual std::string const option_impl() const = 0;
220 class ClipOption : public TransformOption {
223 ClipOption(ClipData const & data_) : data(data_) {}
226 virtual std::string const placeholder_impl() const
231 class ClipLatexOption : public ClipOption {
233 static ptr_type factory(ClipData const & data)
234 { return ptr_type(new ClipLatexOption(data)); }
237 ClipLatexOption(ClipData const & data_)
238 : ClipOption(data_) {}
239 virtual std::string const option_impl() const;
243 class ExtraOption : public TransformOption {
245 static ptr_type factory(std::string const & data)
246 { return ptr_type(new ExtraOption(data)); }
249 ExtraOption(std::string const & data_) : data(data_) {}
251 virtual std::string const placeholder_impl() const
252 { return "$$Extra"; }
253 virtual std::string const option_impl() const
259 class ResizeOption : public TransformOption {
262 ResizeOption(ResizeData const & data_) : data(data_) {}
265 virtual std::string const placeholder_impl() const
266 { return "$$Resize"; }
270 class ResizeLatexOption : public ResizeOption {
272 static ptr_type factory(ResizeData const & data)
273 { return ptr_type(new ResizeLatexOption(data)); }
276 ResizeLatexOption(ResizeData const & data_)
277 : ResizeOption(data_) {}
278 virtual std::string const option_impl() const;
282 class RotationOption : public TransformOption {
285 RotationOption(RotationData const & data_) : data(data_) {}
288 virtual std::string const placeholder_impl() const
289 { return "$$Rotate"; }
293 class RotationLatexOption : public RotationOption {
295 static ptr_type factory(RotationData const & data)
296 { return ptr_type(new RotationLatexOption(data)); }
299 RotationLatexOption(RotationData const & data_)
300 : RotationOption(data_) {}
301 virtual std::string const option_impl() const;
308 std::string const sanitizeLatexOption(std::string const & input);
309 std::string const sanitizeDocBookOption(std::string const & input);
320 typedef boost::function<TransformOption::ptr_type(ClipData)>
322 typedef boost::function<TransformOption::ptr_type(std::string)>
324 typedef boost::function<TransformOption::ptr_type(ResizeData)>
326 typedef boost::function<TransformOption::ptr_type(RotationData)>
327 RotationOptionFactory;
328 typedef boost::function<TransformCommand::ptr_type(ResizeData)>
329 ResizeCommandFactory;
330 typedef boost::function<TransformCommand::ptr_type(RotationData)>
331 RotationCommandFactory;
337 TransformStore() : id(Rotate) {}
339 /** Stores \c factory and a reminder of what \c data this \c factory
342 template <typename Factory>
343 TransformStore(TransformID id_, Factory const & factory)
344 : id(id_), any_factory(boost::any(factory)) {}
346 typedef TransformCommand::ptr_type ComPtr;
347 typedef TransformOption::ptr_type OptPtr;
349 ComPtr getCommandTransformer(RotationData const &) const;
350 ComPtr getCommandTransformer(ResizeData const &) const;
351 OptPtr getOptionTransformer(RotationData const &) const;
352 OptPtr getOptionTransformer(ResizeData const &) const;
353 OptPtr getOptionTransformer(ClipData const &) const;
354 OptPtr getOptionTransformer(std::string const &) const;
358 boost::any any_factory;
361 } // namespace external
364 #endif // NOT EXTERNALTRANSFORMS_H