void ParamInfo::add(std::string const & name, ParamType type,
- ParamHandling handling, bool ignore,
+ ParamHandling handling, bool ignoreval,
docstring default_value)
{
- info_.push_back(ParamData(name, type, handling, ignore, default_value));
+ info_.push_back(ParamData(name, type, handling, ignoreval, default_value));
}
docstring const & command,
ParamInfo::ParamHandling handling) const
{
- if (handling == ParamInfo::HANDLING_LATEXIFY)
+ docstring result;
+ bool ltrimmed = false;
+ // Trimming can be done on top of any of the other handlings
+ // We check this here since handling might be changed below.
+ if (handling & ParamInfo::HANDLING_LTRIM) {
+ // this is used if no other handling is done
+ result = command;
+ ltrimmed = true;
+ }
+ if (handling & ParamInfo::HANDLING_LATEXIFY
+ || handling & ParamInfo::HANDLING_INDEX_ESCAPE)
if ((*this)["literal"] == "true")
handling = ParamInfo::HANDLING_NONE;
- docstring result;
- switch (handling) {
- case ParamInfo::HANDLING_LATEXIFY: {
+
+ // LATEXIFY, ESCAPE and NONE are mutually exclusive
+ if (handling & ParamInfo::HANDLING_LATEXIFY) {
// First handle backslash
result = subst(command, from_ascii("\\"), from_ascii("\\textbackslash{}"));
// Then get LaTeX macros
}
// Now escape special commands
static docstring const backslash = from_ascii("\\");
- static char_type const chars_escape[6] = {
- '&', '_', '$', '%', '#', '^'};
+ int const nchars_escape = 8;
+ static char_type const chars_escape[nchars_escape] = {
+ '&', '_', '$', '%', '#', '^', '{', '}'};
if (!result.empty()) {
int previous;
// The characters in chars_name[] need to be changed to a command when
// they are LaTeXified.
- for (int k = 0; k < 6; k++)
+ for (int k = 0; k < nchars_escape; k++)
for (size_t i = 0, pos;
(pos = result.find(chars_escape[k], i)) != string::npos;
i = pos + 2) {
result.replace(pos, 1, backslash + chars_escape[k] + term);
}
}
- break;
}
- case ParamInfo::HANDLING_ESCAPE:
+ else if (handling & ParamInfo::HANDLING_ESCAPE)
result = escape(command);
- break;
- case ParamInfo::HANDLING_NONE:
+ else if (handling & ParamInfo::HANDLING_NONE)
result = command;
- break;
- } // switch
+ // INDEX_ESCAPE is independent of the others
+ if (handling & ParamInfo::HANDLING_INDEX_ESCAPE) {
+ // Now escape special commands
+ static docstring const quote = from_ascii("\"");
+ int const nchars_escape = 4;
+ static char_type const chars_escape[nchars_escape] = { '"', '@', '|', '!' };
+
+ if (!result.empty()) {
+ // The characters in chars_name[] need to be changed to a command when
+ // they are LaTeXified.
+ for (int k = 0; k < nchars_escape; k++)
+ for (size_t i = 0, pos;
+ (pos = result.find(chars_escape[k], i)) != string::npos;
+ i = pos + 2)
+ result.replace(pos, 1, quote + chars_escape[k]);
+ }
+ }
- return result;
+ return ltrimmed ? ltrim(result) : result;
}