]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetListingsParams.cpp
Fix segfault after deleting monitor
[lyx.git] / src / insets / InsetListingsParams.cpp
index 4fde290d6e94cc6b916cf216c145d7a23747d360..998554c395c7f3f6e33c4798c2fb469b3b6e0c36 100644 (file)
@@ -102,7 +102,7 @@ docstring ListingsParam::validate(string const & par) const
        bool unclosed = false;
        string par2 = par;
        // braces are allowed
-       if (prefixIs(par, "{") && suffixIs(par, "}") && !suffixIs(par, "\\}"))  
+       if (prefixIs(par, "{") && suffixIs(par, "}") && !suffixIs(par, "\\}"))
                par2 = par.substr(1, par.size() - 2);
 
        // check for unmatched braces
@@ -114,7 +114,7 @@ docstring ListingsParam::validate(string const & par) const
                        --braces;
        }
        unclosed = braces != 0;
-       
+
        switch (type_) {
 
        case ALL:
@@ -269,6 +269,31 @@ char const * allowed_languages =
        "[97]VRML\nXML\nXSLT";
 
 
+/// Return language allowed in the GUI without dialect and proper casing
+string const languageonly(string const & lang)
+{
+       string const locase = ascii_lowercase(trim(lang, "{}"));
+       string const all_languages = ascii_lowercase(allowed_languages) + "\n";
+       string language = (lang.at(0) == '[') ? locase + "\n"
+                                             : string("]") + locase + "\n";
+       size_t i = all_languages.find(language);
+       if (i == string::npos && lang.at(0) != '[') {
+               language[0] = '\n';
+               i = all_languages.find(language);
+       }
+       if (i == string::npos)
+               return lang;
+       if (all_languages.at(i) == '[')
+               i = all_languages.find(']', i);
+       if (i == string::npos)
+               return lang;
+       size_t j = all_languages.find('\n', i + 1);
+       if (j == string::npos)
+               return lang;
+       return string(allowed_languages).substr(i + 1, j - i - 1);
+}
+
+
 /// ListingsParam Validator.
 /// This class is aimed to be a singleton which is instantiated in
 /// \c InsetListingsParams::addParam().
@@ -889,10 +914,10 @@ docstring ParValidator::validate(string const & name,
                                        _("Available listing parameters are %1$s"), from_ascii(param_names));
                else
                        return bformat(
-                                       _("Available listings parameters containing string \"%1$s\" are %2$s"), 
+                                       _("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_[p].find(name);
        if (it != all_params_[p].end()) {
@@ -934,7 +959,7 @@ bool ParValidator::onoff(string const & name) const
                return false;
 }
 
-} // namespace anon.
+} // namespace
 
 // define a global ParValidator
 ParValidator * par_validator = 0;
@@ -944,13 +969,13 @@ ParValidator * par_validator = 0;
 int InsetListingsParams::package_ = 0;
 
 InsetListingsParams::InsetListingsParams()
-       : inline_(false), params_(), status_(InsetCollapsable::Open)
+       : inline_(false), params_(), status_(InsetCollapsible::Open)
 {
 }
 
 
 InsetListingsParams::InsetListingsParams(string const & par, bool in,
-               InsetCollapsable::CollapseStatus s)
+               InsetCollapsible::CollapseStatus s)
        : inline_(in), params_(), status_(s)
 {
        // this will activate parameter validation.
@@ -971,9 +996,9 @@ void InsetListingsParams::write(ostream & os) const
 void InsetListingsParams::read(Lexer & lex)
 {
        lex >> inline_;
-       int s = InsetCollapsable::Collapsed;
+       int s = InsetCollapsible::Collapsed;
        lex >> s;
-       status_ = static_cast<InsetCollapsable::CollapseStatus>(s);
+       status_ = static_cast<InsetCollapsible::CollapseStatus>(s);
        string par;
        lex >> par;
        fromEncodedString(par);
@@ -1019,12 +1044,15 @@ string InsetListingsParams::getValue(string const & key) const
 }
 
 
-void InsetListingsParams::addParam(string const & key, 
-               string const & value, bool replace)
+void InsetListingsParams::addParam(string const & key,
+               string const & val, bool replace)
 {
        if (key.empty())
                return;
 
+       bool const is_minted_language = minted() && key == "language";
+       string const value = (is_minted_language && !val.empty())
+                               ? languageonly(val) : val;
        // duplicate parameters!
        string keyname = key;
        if (!replace && hasParam(key))
@@ -1049,7 +1077,7 @@ void InsetListingsParams::addParam(string const & key,
                                has_special_char = true;
                                break;
                        }
-               if (has_special_char)
+               if (has_special_char && !is_minted_language)
                        params_.push_back(make_pair(keyname, "{" + value + "}"));
                else
                        params_.push_back(make_pair(keyname, value));
@@ -1083,7 +1111,7 @@ void InsetListingsParams::addParams(string const & par)
                } else if (par[i] == '{' && i > 0 && par[i-1] != '\\')
                        // don't count a brace in first position
                        ++braces;
-               else if (par[i] == '}' && i != par.size() - 1 
+               else if (par[i] == '}' && i != par.size() - 1
                         && (i == 0 || (i > 0 && par[i-1] != '\\')))
                        --braces;