]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetListings.cpp
de.po
[lyx.git] / src / insets / InsetListings.cpp
index b50e92623e4489181489cbf73f23737aa85be4f5..f2af5813bd625e30bde7c0729fb8476526a491d8 100644 (file)
@@ -127,8 +127,7 @@ Encoding const * InsetListings::forcedEncoding(Encoding const * inner_enc,
        // Minted can deal with all encodings.
        if (buffer().params().use_minted
                || inner_enc->name() == "utf8-plain"
-               || (buffer().params().encoding().package() == Encoding::japanese
-                       && inner_enc->package() == Encoding::japanese)
+               || inner_enc->package() == Encoding::japanese
                || inner_enc->hasFixedWidth())
                return 0;
 
@@ -148,6 +147,60 @@ void InsetListings::latex(otexstream & os, OutputParams const & runparams) const
        // of the listings package (see page 25 of the manual)
        bool const isInline = params().isInline();
        bool const use_minted = buffer().params().use_minted;
+       static regex const reg1("(.*)(basicstyle=\\{)([^\\}]*)(\\\\ttfamily)([^\\}]*)(\\})(.*)");
+       static regex const reg2("(.*)(basicstyle=\\{)([^\\}]*)(\\\\rmfamily)([^\\}]*)(\\})(.*)");
+       static regex const reg3("(.*)(basicstyle=\\{)([^\\}]*)(\\\\sffamily)([^\\}]*)(\\})(.*)");
+       static regex const reg4("(.*)(basicstyle=\\{)([^\\}]*)(\\\\(tiny|scriptsize|footnotesize|small|normalsize|large|Large))([^\\}]*)(\\})(.*)");
+       static regex const reg5("(.*)(fontfamily=)(tt|sf|rm)(.*)");
+       static regex const reg6("(.*)(fontsize=\\{)(\\\\(tiny|scriptsize|footnotesize|small|normalsize|large|Large))(\\})(.*)");
+       if (use_minted) {
+               // If params have been entered with "listings", and then the user switched to "minted",
+               // we have params that need to be translated.
+               // FIXME: We should use a backend-abstract syntax in listings params instead!
+               // Substitute fontstyle option
+               smatch sub;
+               if (regex_match(param_string, sub, reg1))
+                       param_string = sub.str(1) + "fontfamily=tt," + sub.str(2) + sub.str(3)
+                                       + sub.str(5) + sub.str(6) + sub.str(7);
+               if (regex_match(param_string, sub, reg2))
+                       param_string = sub.str(1) + "fontfamily=rm," + sub.str(2) + sub.str(3)
+                                       + sub.str(5) + sub.str(6) + sub.str(7);
+               if (regex_match(param_string, sub, reg3))
+                       param_string = sub.str(1) + "fontfamily=sf," + sub.str(2) + sub.str(3)
+                                       + sub.str(5) + sub.str(6) + sub.str(7);
+               // as well as fontsize option
+               if (regex_match(param_string, sub, reg4))
+                       param_string = sub.str(1) + "fontsize={" + sub.str(4) + sub.str(3) + sub.str(7) + sub.str(8);
+       } else {
+               // And the same vice versa
+               // Substitute fontstyle option
+               smatch sub;
+               string basicstyle;
+               if (regex_match(param_string, sub, reg5)) {
+                       basicstyle = "\\" + sub.str(3) + "family";
+                       param_string = sub.str(1) + sub.str(4);
+               }
+               // as well as fontsize option
+               if (regex_match(param_string, sub, reg6)) {
+                       basicstyle += sub.str(3);
+                       param_string = sub.str(1) + sub.str(6);
+               }
+               if (!basicstyle.empty())
+                       param_string = rtrim(param_string, ",") + ",basicstyle={" + basicstyle + "}";
+       }
+       if (runparams.use_polyglossia && runparams.local_font->isRightToLeft()) {
+               // We need to use the *latin switches (#11554)
+               smatch sub;
+               if (regex_match(param_string, sub, reg1))
+                       param_string = sub.str(1) + sub.str(2) + sub.str(3) + sub.str(4)
+                                       + "latin"  + sub.str(5) + sub.str(6) + sub.str(7);
+               if (regex_match(param_string, sub, reg2))
+                       param_string = sub.str(1) + sub.str(2) + sub.str(3) + sub.str(4)
+                                       + "latin"  + sub.str(5) + sub.str(6) + sub.str(7);
+               if (regex_match(param_string, sub, reg3))
+                       param_string = sub.str(1) + sub.str(2) + sub.str(3) + sub.str(4)
+                                       + "latin"  + sub.str(5) + sub.str(6) + sub.str(7);
+       }
        string minted_language;
        string float_placement;
        bool const isfloat = params().isFloat();
@@ -160,11 +213,11 @@ void InsetListings::latex(otexstream & os, OutputParams const & runparams) const
                        if (prefixIs(opts[i], "float")) {
                                if (prefixIs(opts[i], "float="))
                                        float_placement = opts[i].substr(6);
-                               opts.erase(opts.begin() + i--);
+                               opts.erase(opts.begin() + int(i--));
                        }
                        else if (prefixIs(opts[i], "language=")) {
                                minted_language = opts[i].substr(9);
-                               opts.erase(opts.begin() + i--);
+                               opts.erase(opts.begin() + int(i--));
                        }
                }
                param_string = getStringFromVector(opts, ",");
@@ -495,6 +548,10 @@ void InsetListings::validate(LaTeXFeatures & features) const
                OutputParams rp = features.runparams();
                if (!params().isFloat() && !getCaption(rp).str.empty())
                        features.require("lyxmintcaption");
+               if (features.usePolyglossia() && features.hasRTLLanguage())
+                       // minted loads color, but color must be loaded before bidi
+                       // (i.e., polyglossia)
+                       features.require("color");
        } else {
                features.require("listings");
                if (contains(param_string, "\\color"))