+ 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)
+{
+ Template const * const et = getTemplatePtr(params);
+ if (!et || et->transformIds.empty())
+ return s;
+
+ Template::Formats::const_iterator fit = et->formats.find(formatname);
+ if (fit == et->formats.end())
+ return s;
+
+ string result = s;
+ Template::Format const & format = fit->second;
+
+ typedef vector<TransformID> TransformsIDs;
+ TransformsIDs::const_iterator it = et->transformIds.begin();
+ TransformsIDs::const_iterator end = et->transformIds.end();
+ for (; it != end; ++it) {
+ result = substituteIt<TransformerType>(result, *it, formatname,
+ format, params);
+ }
+ return result;
+}
+
+
+string const substituteCommands(InsetExternalParams const & params,
+ string const & input, string const & format)
+{
+ return transformIt<TransformCommand>(params, input, format);
+}
+
+
+string const substituteOption(InsetExternalParams const & params,
+ string const & input, string const & format)
+{
+ string opt = transformIt<TransformOption>(params, input, format);
+
+ if (format == "LaTeX" || format == "PDFLaTeX")
+ return sanitizeLatexOption(opt);
+ if (format == "DocBook")
+ return sanitizeDocBookOption(opt);
+ if (format == "LinuxDoc")
+ return sanitizeLinuxDocOption(opt);
+ return opt;