+// Empty template, specialised below.
+template <typename TransformType>
+string const substituteIt(string const &,
+ TransformID,
+ string const &,
+ Template::Format const &,
+ InsetExternalParams const &);
+
+
+template <>
+string const substituteIt<TransformCommand>(string const & input,
+ TransformID id,
+ string const & /* formatname */,
+ Template::Format const & format,
+ InsetExternalParams const & params)
+{
+ typedef std::map<TransformID, TransformStore> Transformers;
+ Transformers::const_iterator it = format.command_transformers.find(id);
+ if (it == format.command_transformers.end())
+ return input;
+
+ TransformStore const & store = it->second;
+
+ TransformCommand::ptr_type ptr;
+ if (id == Rotate)
+ ptr = store.getCommandTransformer(params.rotationdata);
+ else if (id == Resize)
+ ptr = store.getCommandTransformer(params.resizedata);
+
+ if (!ptr.get())
+ return input;
+
+ string result =
+ support::subst(input, ptr->front_placeholder(), ptr->front());
+ return support::subst(result, ptr->back_placeholder(), ptr->back());
+}
+
+
+template <>
+string const substituteIt<TransformOption>(string const & input,
+ TransformID id,
+ string const & fname,
+ Template::Format const & format,
+ InsetExternalParams const & params)
+{
+ typedef std::map<TransformID, TransformStore> Transformers;
+ Transformers::const_iterator it = format.option_transformers.find(id);
+ if (it == format.option_transformers.end())
+ return input;
+
+ TransformStore const & store = it->second;
+
+ TransformOption::ptr_type ptr;
+ switch (id) {
+ case Clip:
+ ptr = store.getOptionTransformer(params.clipdata);
+ break;
+ case Extra:
+ ptr = store.getOptionTransformer(params.extradata.get(fname));
+ break;
+ case Rotate:
+ ptr = store.getOptionTransformer(params.rotationdata);
+ break;
+ case Resize:
+ ptr = store.getOptionTransformer(params.resizedata);
+ break;
+ }
+
+ if (!ptr.get())
+ return input;
+
+ return support::subst(input, ptr->placeholder(), ptr->option());
+}
+
+
+template <typename TransformerType>
+string const transformIt(InsetExternalParams const & params,
+ string const & s, string const & formatname)