commit c0f734bcef837ae5936f63f59c66b0c94030d748
Author: Juergen Spitzmueller <[email protected]>
Date:   Fri Apr 19 19:03:29 2019 +0200

    Fix some listings/minted incompatibilities
    
    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 |    3 ++
 src/insets/InsetListings.cpp      |   38 +++++++++++++++++++++++++++++++++++++
 2 files changed, 41 insertions(+), 0 deletions(-)

diff --git a/src/frontends/qt4/GuiListings.cpp 
b/src/frontends/qt4/GuiListings.cpp
index 1ed2cdd..c957cb0 100644
--- a/src/frontends/qt4/GuiListings.cpp
+++ b/src/frontends/qt4/GuiListings.cpp
@@ -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)
diff --git a/src/insets/InsetListings.cpp b/src/insets/InsetListings.cpp
index 1f60879..f2af581 100644
--- a/src/insets/InsetListings.cpp
+++ b/src/insets/InsetListings.cpp
@@ -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;

Reply via email to