X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetListingsParams.cpp;h=5b744063343f1a715a53db51f456ed6467a8205f;hb=2c357c1d23b7b83839a9beb8225d4f1ae4f793b4;hp=003fe876f076d04f6466e3716ca15e8e8502b193;hpb=78b71f98637c3a7419d082c6f3cfd91f1ecd258e;p=lyx.git diff --git a/src/insets/InsetListingsParams.cpp b/src/insets/InsetListingsParams.cpp index 003fe876f0..5b74406334 100644 --- a/src/insets/InsetListingsParams.cpp +++ b/src/insets/InsetListingsParams.cpp @@ -12,7 +12,7 @@ #include "InsetListingsParams.h" -#include "gettext.h" +#include "support/gettext.h" #include "Length.h" #include "Lexer.h" @@ -24,22 +24,10 @@ #include -using std::map; -using std::vector; -using std::ostream; -using std::string; -using std::exception; +using namespace std; +using namespace lyx::support; -namespace lyx -{ - -using support::bformat; -using support::trim; -using support::subst; -using support::isStrInt; -using support::prefixIs; -using support::suffixIs; -using support::getVectorFromString; +namespace lyx { namespace { @@ -162,10 +150,10 @@ docstring ListingsParam::validate(string const & par) const if (!hint_.empty()) return hint_; else - return _("Please specify a latex length expression."); + return _("Please specify a LaTeX length expression."); } if (!isValidLength(par2)) - return _("Invalid latex length expression."); + return _("Invalid LaTeX length expression."); if (unclosed) return _("Unbalanced braces!"); return docstring(); @@ -192,7 +180,7 @@ docstring ListingsParam::validate(string const & par) const lists.push_back(v); // good, find the string - if (std::find(lists.begin(), lists.end(), par2) != lists.end()) { + if (find(lists.begin(), lists.end(), par2) != lists.end()) { if (unclosed) return _("Unbalanced braces!"); return docstring(); @@ -230,6 +218,7 @@ docstring ListingsParam::validate(string const & par) const return _("Unbalanced braces!"); return docstring(); } + return docstring(); } @@ -243,7 +232,7 @@ char const * allowed_languages = "[Sharp]C\nC++\n[ANSI]C++\n[GNU]C++\n[ISO]C++\n[Visual]C++\nCaml\n" "[light]Caml\n[Objective]Caml\nClean\nCobol\n[1974]Cobol\n[1985]Cobol\n" "[ibm]Cobol\nComal 80\ncommand.com\n[WinXP]command.com\nComsol\ncsh\n" - "Delphi\nEiffel\nElan\nEuphoria\nFortran\n[77]Fortran\n[90]Fortran\n" + "Delphi\nEiffel\nElan\nerlang\nEuphoria\nFortran\n[77]Fortran\n[90]Fortran\n" "[95]Fortran\nGCL\nGnuplot\nHaskell\nHTML\nIDL\n[CORBA]IDL\ninform\n" "Java\n[AspectJ]Java\nJVMIS\nksh\nLingo\nLisp\n[Auto]Lisp\nLogo\n" "make\n[gnu]make\nMathematica\n[1.0]Mathematica\n[3.0]Mathematica\n" @@ -268,22 +257,18 @@ class ParValidator public: ParValidator(); - /// \return the associated \c ListingsParam. - /// \warning an \c invalidParamexception will be thrown - /// if the key is not found. - ListingsParam const & param(string const & key) const; + /// validate a parameter for a given name. + /// return an error message if \c par is an invalid parameter. + docstring validate(string const & name, string const & par) const; - /// validate a parameter for a given key. - /// \warning an \c invalidParam exception will be thrown if - /// \c par is an invalid parameter. - ListingsParam const & validate(string const & key, string const & par) const; + /// return the onoff status of a parameter \c key, if \c key is not found + /// return false + bool onoff(string const & key) const; private: /// key is the name of the parameter typedef map ListingsParams; ListingsParams all_params_; - /// - string all_param_names_; }; @@ -319,6 +304,8 @@ ParValidator::ParValidator() ListingsParam("", false, INTEGER, "", empty_hint); all_params_["lastline"] = ListingsParam("", false, INTEGER, "", empty_hint); + all_params_["linerange"] = + ListingsParam("", false, ALL, "", empty_hint); all_params_["showlines"] = ListingsParam("", false, TRUEFALSE, "", empty_hint); all_params_["emptylines"] = @@ -417,13 +404,15 @@ ParValidator::ParValidator() // this option is not handled in the parameter box all_params_["caption"] = ListingsParam("", false, ALL, "", _( - "This parameter should not be entered here. Please use caption " - "editbox (Include dialog) or insert->caption (listing inset)")); + "This parameter should not be entered here. Please use the caption " + "edit box (when using the child document dialog) or " + "menu Insert->Caption (when defining a listing inset)")); // this option is not handled in the parameter box all_params_["label"] = ListingsParam("", false, ALL, "",_( - "This parameter should not be entered here. Please use label " - "editbox (Include dialog) or insert->caption (listing inset)")); + "This parameter should not be entered here. Please use the label " + "edit box (when using the child document dialog) or " + "menu Insert->Label (when defining a listing inset)")); all_params_["nolol"] = ListingsParam("", false, TRUEFALSE, "", empty_hint); all_params_["captionpos"] = @@ -576,62 +565,122 @@ ParValidator::ParValidator() ListingsParam("", false, ALL, "", empty_hint); all_params_["podcomment"] = ListingsParam("", false, ALL, "", empty_hint); - - ListingsParams::const_iterator it = all_params_.begin(); - ListingsParams::const_iterator end = all_params_.end(); - for (; it != end; ++it) { - if (!all_param_names_.empty()) - all_param_names_ += ", "; - all_param_names_ += it->first; - } + // the following are experimental listings features + all_params_["procnamekeys"] = + ListingsParam("", false, ALL, "", empty_hint); + all_params_["moreprocnamekeys"] = + ListingsParam("", false, ALL, "", empty_hint); + all_params_["deleteprocnamekeys"] = + ListingsParam("", false, ALL, "", empty_hint); + all_params_["procnamestyle"] = + ListingsParam("", false, ALL, "", style_hint); + all_params_["indexprocnames"] = + ListingsParam("", false, TRUEFALSE, "", empty_hint); + all_params_["hyperref"] = + ListingsParam("", false, ALL, "", empty_hint); + all_params_["morehyperref"] = + ListingsParam("", false, ALL, "", empty_hint); + all_params_["deletehyperref"] = + ListingsParam("", false, ALL, "", empty_hint); + all_params_["hyperanchor"] = + ListingsParam("", false, ALL, "", empty_hint); + all_params_["hyperlink"] = + ListingsParam("", false, ALL, "", empty_hint); + all_params_["literate"] = + ListingsParam("", false, ALL, "", empty_hint); + all_params_["lgrindef"] = + ListingsParam("", false, ALL, "", empty_hint); + all_params_["rangebeginprefix"] = + ListingsParam("", false, ALL, "", empty_hint); + all_params_["rangebeginsuffix"] = + ListingsParam("", false, ALL, "", empty_hint); + all_params_["rangeendprefix"] = + ListingsParam("", false, ALL, "", empty_hint); + all_params_["rangeendsuffix"] = + ListingsParam("", false, ALL, "", empty_hint); + all_params_["rangeprefix"] = + ListingsParam("", false, ALL, "", empty_hint); + all_params_["rangesuffix"] = + ListingsParam("", false, ALL, "", empty_hint); + all_params_["includerangemarker"] = + ListingsParam("", false, TRUEFALSE, "", empty_hint); + all_params_["multicols"] = + ListingsParam("", false, INTEGER, "", empty_hint); } -ListingsParam const & ParValidator::validate(string const & key, +docstring ParValidator::validate(string const & name, string const & par) const { - ListingsParam const & lparam = param(key); - docstring s = lparam.validate(par); - if (!s.empty()) - throw invalidParam(bformat(_("Parameter %1$s: "), from_utf8(key)) + s); - return lparam; + if (name.empty()) + return _("Invalid (empty) listing parameter name."); + + if (name[0] == '?') { + string suffix = trim(string(name, 1)); + string param_names; + ListingsParams::const_iterator it = all_params_.begin(); + ListingsParams::const_iterator end = all_params_.end(); + for (; it != end; ++it) { + if (suffix.empty() || contains(it->first, suffix)) { + if (!param_names.empty()) + param_names += ", "; + param_names += it->first; + } + } + if (suffix.empty()) + return bformat( + _("Available listing parameters are %1$s"), from_ascii(param_names)); + else + return bformat( + _("Available listings parameters containing string \"%1$s\" are %2$s"), + from_utf8(suffix), from_utf8(param_names)); + } + + // locate name in parameter table + ListingsParams::const_iterator it = all_params_.find(name); + if (it != all_params_.end()) { + docstring msg = it->second.validate(par); + if (msg.empty()) + return msg; + else + return bformat(_("Parameter %1$s: "), from_utf8(name)) + msg; + } else { + // otherwise, produce a meaningful error message. + string matching_names; + ListingsParams::const_iterator end = all_params_.end(); + for (it = all_params_.begin(); it != end; ++it) { + if (prefixIs(it->first, name)) { + if (!matching_names.empty()) + matching_names += ", "; + matching_names += it->first; + } + } + if (matching_names.empty()) + return bformat(_("Unknown listing parameter name: %1$s"), + from_utf8(name)); + else + return bformat(_("Parameters starting with '%1$s': %2$s"), + from_utf8(name), from_utf8(matching_names)); + } + return docstring(); } -ListingsParam const & ParValidator::param(string const & name) const +bool ParValidator::onoff(string const & name) const { - if (name.empty()) - throw invalidParam(_("Invalid (empty) listing parameter name.")); - - if (name == "?") - throw invalidParam(bformat( - _("Available listing parameters are %1$s"), from_ascii(all_param_names_))); - // locate name in parameter table ListingsParams::const_iterator it = all_params_.find(name); if (it != all_params_.end()) - return it->second; - - // otherwise, produce a meaningful error message. - string matching_names; - ListingsParams::const_iterator end = all_params_.end(); - for (it = all_params_.begin(); it != end; ++it) { - if (prefixIs(it->first, name)) { - if (!matching_names.empty()) - matching_names += ", "; - matching_names += it->first; - } - } - if (matching_names.empty()) - throw invalidParam(bformat(_("Unknown listing parameter name: %1$s"), - from_utf8(name))); + return it->second.onoff_; else - throw invalidParam(bformat(_("Parameters starting with '%1$s': %2$s"), - from_utf8(name), from_utf8(matching_names))); + return false; } } // namespace anon. +// define a global ParValidator +ParValidator * par_validator = NULL; + InsetListingsParams::InsetListingsParams() : inline_(false), params_(), status_(InsetCollapsable::Open) { @@ -677,10 +726,11 @@ string InsetListingsParams::params(string const & sep) const it != params_.end(); ++it) { if (!par.empty()) par += sep; + // key=value,key=value1 is stored in params_ as key=value,key_=value1. if (it->second.empty()) - par += it->first; + par += rtrim(it->first, "_"); else - par += it->first + '=' + it->second; + par += rtrim(it->first, "_") + '=' + it->second; } return par; } @@ -691,21 +741,21 @@ void InsetListingsParams::addParam(string const & key, string const & value) if (key.empty()) return; - static ParValidator par_validator; - - // exception may be thown. - ListingsParam const & lparam = par_validator.validate(key, value); // duplicate parameters! + string keyname = key; if (params_.find(key) != params_.end()) - throw invalidParam(bformat(_("Parameter %1$s has already been defined"), - from_utf8(key))); + // key=value,key=value1 is allowed in listings + // use key_, key__, key___ etc to avoid name conflict + while (params_.find(keyname += '_') != params_.end()) { } // check onoff flag // onoff parameter with value false - if (lparam.onoff_ && (value == "false" || value == "{false}")) - params_[key] = string(); + if (!par_validator) + par_validator = new ParValidator(); + if (par_validator->onoff(key) && (value == "false" || value == "{false}")) + params_[keyname] = string(); // if the parameter is surrounded with {}, good else if (prefixIs(value, "{") && suffixIs(value, "}")) - params_[key] = value; + params_[keyname] = value; // otherwise, check if {} is needed. Add {} to all values with // non-ascii/number characters, just to be safe else { @@ -716,9 +766,9 @@ void InsetListingsParams::addParam(string const & key, string const & value) break; } if (has_special_char) - params_[key] = "{" + value + "}"; + params_[keyname] = "{" + value + "}"; else - params_[key] = value; + params_[keyname] = value; } } @@ -814,8 +864,26 @@ string InsetListingsParams::getParamValue(string const & param) const { // is this parameter defined? map::const_iterator it = params_.find(param); - return (it == params_.end()) ? string() : it->second; + string par = (it == params_.end()) ? string() : it->second; + if (prefixIs(par, "{") && suffixIs(par, "}")) + return par.substr(1, par.size() - 2); + else + return par; } +docstring InsetListingsParams::validate() const +{ + docstring msg; + if (!par_validator) + par_validator = new ParValidator(); + for (map::const_iterator it = params_.begin(); + it != params_.end(); ++it) { + msg = par_validator->validate(it->first, it->second); + if (!msg.empty()) + return msg; + } + return msg; +} + } // namespace lyx