X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetCommandParams.cpp;h=606fd10d8fb3f2803141c998cd152371ae9c212b;hb=ebc2b1295a0464dde6c20a09ddc249c463a21c79;hp=aa2458ce87100d2e16f614210f7f1f45f3c6caba;hpb=76f49fad78db5ed768db163feef4e3b3c062228f;p=lyx.git diff --git a/src/insets/InsetCommandParams.cpp b/src/insets/InsetCommandParams.cpp index aa2458ce87..606fd10d8f 100644 --- a/src/insets/InsetCommandParams.cpp +++ b/src/insets/InsetCommandParams.cpp @@ -132,10 +132,10 @@ bool ParamInfo::hasParam(std::string const & name) const 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)); } @@ -441,7 +441,8 @@ docstring InsetCommandParams::prepareCommand(OutputParams const & runparams, result = command; ltrimmed = true; } - if (handling & ParamInfo::HANDLING_LATEXIFY) + if (handling & ParamInfo::HANDLING_LATEXIFY + || handling & ParamInfo::HANDLING_INDEX_ESCAPE) if ((*this)["literal"] == "true") handling = ParamInfo::HANDLING_NONE; @@ -463,14 +464,15 @@ docstring InsetCommandParams::prepareCommand(OutputParams const & runparams, } // 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) { @@ -488,8 +490,58 @@ docstring InsetCommandParams::prepareCommand(OutputParams const & runparams, } else if (handling & ParamInfo::HANDLING_ESCAPE) result = escape(command); - else if (handling & ParamInfo::HANDLING_NONE) - result = command; + else if (handling & ParamInfo::HANDLING_NONE) { + // we can only output characters covered by the current + // encoding! + docstring uncodable; + for (size_type i = 0 ; i < command.size() ; ++i) { + char_type c = command[i]; + try { + if (runparams.encoding->encodable(c)) + result += c; + else if (runparams.dryrun) { + result += "<" + _("LyX Warning: ") + + _("uncodable character") + " '"; + result += docstring(1, c); + result += "'>"; + } else + uncodable += c; + } catch (EncodingException & /* e */) { + if (runparams.dryrun) { + result += "<" + _("LyX Warning: ") + + _("uncodable character") + " '"; + result += docstring(1, c); + result += "'>"; + } else + uncodable += c; + } + } + if (!uncodable.empty() && !runparams.silent) { + // issue a warning about omitted characters + // FIXME: should be passed to the error dialog + frontend::Alert::warning(_("Uncodable characters in nomenclature inset"), + bformat(_("The following characters in one of the nomenclature listings are\n" + "not representable in the current encoding and have been omitted:\n%1$s."), + uncodable)); + } + } + // 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 ltrimmed ? ltrim(result) : result; }