X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetInclude.cpp;h=7c0d6ce5505a3f86d7b1cc15f2b9ed4cdf662b03;hb=7986ac2f322aeb9c764d1c518cedd159d62f32d7;hp=d6e3ae2c63f9a7e808b6d0f62dd557b17528cc43;hpb=4947476da8d7e42ded2c53ee984dc4c38db1d528;p=lyx.git diff --git a/src/insets/InsetInclude.cpp b/src/insets/InsetInclude.cpp index d6e3ae2c63..7c0d6ce550 100644 --- a/src/insets/InsetInclude.cpp +++ b/src/insets/InsetInclude.cpp @@ -165,6 +165,23 @@ InsetLabel * createLabel(Buffer * buf, docstring const & label_str) return new InsetLabel(buf, icp); } + +char_type replaceCommaInBraces(docstring & params) +{ + // Code point from private use area + char_type private_char = 0xE000; + int count = 0; + for (char_type & c : params) { + if (c == '{') + ++count; + else if (c == '}') + --count; + else if (c == ',' && count) + c = private_char; + } + return private_char; +} + } // namespace @@ -197,11 +214,6 @@ InsetInclude::InsetInclude(InsetInclude const & other) InsetInclude::~InsetInclude() { - if (isBufferLoaded()) - /* We do not use buffer() because Coverity believes that this - * may throw an exception. Actually this code path is not - * taken when buffer_ == 0 */ - buffer_->invalidateBibfileCache(); delete label_; } @@ -354,8 +366,6 @@ void InsetInclude::setParams(InsetCommandParams const & p) if (type(params()) == INPUT) add_preview(*preview_, *this, buffer()); - - buffer().invalidateBibfileCache(); } @@ -618,43 +628,57 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const string const opt = to_utf8(params()["lstparams"]); // opt is set in QInclude dialog and should have passed validation. InsetListingsParams lstparams(opt); - string parameters = lstparams.params(); - string language; - string caption; - string label; - string placement; + docstring parameters = from_utf8(lstparams.params()); + docstring language; + docstring caption; + docstring label; + docstring placement; bool isfloat = lstparams.isFloat(); - if (use_minted) { - // Get float placement, language, caption, and - // label, then remove the relative options. - vector opts = - getVectorFromString(parameters, ",", false); - for (size_t i = 0; i < opts.size(); ++i) { - if (prefixIs(opts[i], "float")) { - if (prefixIs(opts[i], "float=")) - placement = opts[i].substr(6); - opts.erase(opts.begin() + i--); - } else if (prefixIs(opts[i], "language=")) { - language = opts[i].substr(9); - opts.erase(opts.begin() + i--); - } else if (prefixIs(opts[i], "caption=")) { - caption = opts[i].substr(8); - opts.erase(opts.begin() + i--); - } else if (prefixIs(opts[i], "label=")) { - label = opts[i].substr(6); - opts.erase(opts.begin() + i--); - } + // We are going to split parameters at commas, so + // replace commas that are not parameter separators + // with a code point from the private use area + char_type comma = replaceCommaInBraces(parameters); + // Get float placement, language, caption, and + // label, then remove the relative options if minted. + vector opts = + getVectorFromString(parameters, from_ascii(","), false); + vector latexed_opts; + for (size_t i = 0; i < opts.size(); ++i) { + // Restore replaced commas + opts[i] = subst(opts[i], comma, ','); + if (use_minted && prefixIs(opts[i], from_ascii("float"))) { + if (prefixIs(opts[i], from_ascii("float="))) + placement = opts[i].substr(6); + opts.erase(opts.begin() + i--); + } else if (use_minted && prefixIs(opts[i], from_ascii("language="))) { + language = opts[i].substr(9); + opts.erase(opts.begin() + i--); + } else if (prefixIs(opts[i], from_ascii("caption="))) { + // FIXME We should use HANDLING_LATEXIFY here, + // but that's a file format change (see #10455). + caption = opts[i].substr(8); + opts.erase(opts.begin() + i--); + if (!use_minted) + latexed_opts.push_back(from_ascii("caption=") + caption); + } else if (prefixIs(opts[i], from_ascii("label="))) { + label = params().prepareCommand(runparams, trim(opts[i].substr(6), "{}"), + ParamInfo::HANDLING_ESCAPE); + opts.erase(opts.begin() + i--); + if (!use_minted) + latexed_opts.push_back(from_ascii("label={") + label + "}"); } - if (!label.empty()) { + if (use_minted && !label.empty()) { if (isfloat || !caption.empty()) label = trim(label, "{}"); else - opts.push_back("label=" + label); + opts.push_back(from_ascii("label=") + label); } - parameters = getStringFromVector(opts, ","); } + if (!latexed_opts.empty()) + opts.insert(opts.end(), latexed_opts.begin(), latexed_opts.end()); + parameters = getStringFromVector(opts, from_ascii(",")); if (language.empty()) - language = "TeX"; + language = from_ascii("TeX"); if (use_minted && isfloat) { os << breakln << "\\begin{listing}"; if (!placement.empty()) @@ -761,7 +785,7 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const "uses module `%2$s'\n" "which is not used in parent file."), included_file.displayName(), from_utf8(module)); - Alert::warning(_("Module not found"), text); + Alert::warning(_("Module not found"), text, true); } } }