]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetListings.cpp
Improve handling of top and bottom margin
[lyx.git] / src / insets / InsetListings.cpp
index 1f6087913ae6e6fc546023180dae86149cf178aa..848e4ae45a6bfaf2e0e8c5bffd2304e5b1726c11 100644 (file)
@@ -27,6 +27,7 @@
 #include "LaTeXFeatures.h"
 #include "Lexer.h"
 #include "output_latex.h"
+#include "output_docbook.h"
 #include "output_xhtml.h"
 #include "OutputParams.h"
 #include "TextClass.h"
@@ -66,9 +67,9 @@ InsetListings::~InsetListings()
 }
 
 
-Inset::DisplayType InsetListings::display() const
+Inset::RowFlags InsetListings::rowFlags() const
 {
-       return params().isInline() || params().isFloat() ? Inline : AlignLeft;
+       return params().isInline() || params().isFloat() ? Inline : Display | AlignLeft;
 }
 
 
@@ -150,6 +151,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;
@@ -395,21 +434,21 @@ void InsetListings::latex(otexstream & os, OutputParams const & runparams) const
 }
 
 
-docstring InsetListings::xhtml(XHTMLStream & os, OutputParams const & rp) const
+docstring InsetListings::xhtml(XMLStream & os, OutputParams const & rp) const
 {
        odocstringstream ods;
-       XHTMLStream out(ods);
+       XMLStream out(ods);
 
        bool const isInline = params().isInline();
        if (isInline)
-               out << html::CompTag("br");
+               out << xml::CompTag("br");
        else {
-               out << html::StartTag("div", "class='float-listings'");
+               out << xml::StartTag("div", "class='float-listings'");
                docstring caption = getCaptionHTML(rp);
                if (!caption.empty())
-                       out << html::StartTag("div", "class='listings-caption'")
-                           << XHTMLStream::ESCAPE_NONE
-                           << caption << html::EndTag("div");
+                       out << xml::StartTag("div", "class='listings-caption'")
+                           << XMLStream::ESCAPE_NONE
+                           << caption << xml::EndTag("div");
        }
 
        InsetLayout const & il = getLayout();
@@ -419,21 +458,21 @@ docstring InsetListings::xhtml(XHTMLStream & os, OutputParams const & rp) const
        if (!lang.empty())
                attr += " " + lang;
        attr += "'";
-       out << html::StartTag(tag, attr);
+       out << xml::StartTag(tag, attr);
        OutputParams newrp = rp;
        newrp.html_disable_captions = true;
        // We don't want to convert dashes here. That's the only conversion we
        // do for XHTML, so this is safe.
        newrp.pass_thru = true;
        docstring def = InsetText::insetAsXHTML(out, newrp, InsetText::JustText);
-       out << html::EndTag(tag);
+       out << xml::EndTag(tag);
 
        if (isInline) {
-               out << html::CompTag("br");
+               out << xml::CompTag("br");
                // escaping will already have been done
-               os << XHTMLStream::ESCAPE_NONE << ods.str();
+               os << XMLStream::ESCAPE_NONE << ods.str();
        } else {
-               out << html::EndTag("div");
+               out << xml::EndTag("div");
                // In this case, this needs to be deferred, but we'll put it
                // before anything the text itself deferred.
                def = ods.str() + '\n' + def;
@@ -442,6 +481,45 @@ docstring InsetListings::xhtml(XHTMLStream & os, OutputParams const & rp) const
 }
 
 
+void InsetListings::docbook(XMLStream & xs, OutputParams const & rp) const
+{
+       InsetLayout const & il = getLayout();
+
+       // Forge the attributes.
+       string attrs;
+       if (!il.docbookattr().empty())
+               attrs += " role=\"" + il.docbookattr() + "\"";
+       string const lang = params().getParamValue("language");
+       if (!lang.empty())
+               attrs += " language=\"" + lang + "\"";
+       xs << xml::StartTag(il.docbooktag(), attrs);
+       xs.startDivision(false);
+
+       // Deal with the caption.
+       docstring caption = getCaptionDocBook(rp);
+       if (!caption.empty()) {
+               xs << xml::StartTag("bridgehead");
+               xs << XMLStream::ESCAPE_NONE;
+               xs << caption;
+               xs << xml::EndTag("bridgehead");
+       }
+
+       // Deal with the content of the listing.
+       OutputParams newrp = rp;
+       newrp.pass_thru = true;
+       newrp.docbook_make_pars = false;
+       newrp.par_begin = 0;
+       newrp.par_end = text().paragraphs().size();
+       newrp.docbook_in_listing = true;
+
+       docbookParagraphs(text(), buffer(), xs, newrp);
+
+       // Done with the listing.
+       xs.endDivision();
+       xs << xml::EndTag(il.docbooktag());
+}
+
+
 string InsetListings::contextMenuName() const
 {
        return "context-listings";