]> git.lyx.org Git - features.git/commitdiff
Fix some listings/minted incompatibilities
authorJuergen Spitzmueller <spitz@lyx.org>
Fri, 19 Apr 2019 17:03:29 +0000 (19:03 +0200)
committerJuergen Spitzmueller <spitz@lyx.org>
Fri, 19 Apr 2019 17:03:29 +0000 (19:03 +0200)
The basic problem here is that rather than using an abstract syntax,
backend-specific param strings are produced in the listings dialog,
depending on whether listings or minted is used.

Of course this breaks if a user switches backends inbetween (s/he would
have to open and re-apply each and every listings inset!)

Do at least the most basic translations in InsetListings::latex().
A sane solution would imply the use of only one param syntax with
respective interpretation for each backend. But this would be a file
format change.

src/frontends/qt4/GuiListings.cpp
src/insets/InsetListings.cpp

index 1ed2cddde287fa1e85755e5959d1e021167ff9a0..c957cb0b75bf0857e9cef14c3c9a4adce6f2f521 100644 (file)
@@ -297,6 +297,9 @@ string GuiListings::construct_params()
        string fontstyle = font_styles[qMax(0, fontstyleCO->currentIndex())];
        string basicstyle;
        string mintedsize;
+       // FIXME: We should not compose listings- or minted-dependant string here
+       //        This breaks if a users switches the backend without opening and
+       //        re-applying all listings insets. Use a backend-abstract syntax!
        bool const use_minted = buffer().params().use_minted;
        if (fontsize != "default") {
                if (use_minted)
index 1f6087913ae6e6fc546023180dae86149cf178aa..f2af5813bd625e30bde7c0729fb8476526a491d8 100644 (file)
@@ -150,6 +150,44 @@ void InsetListings::latex(otexstream & os, OutputParams const & runparams) const
        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;