]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetListings.cpp
Merge branch 'master' into biblatex2
[lyx.git] / src / insets / InsetListings.cpp
index 9c7daf22198cfa05cd3d0c1c206fc7a332139dcc..bec33b12cb44ee86ce28d927a1757a21a34cb99d 100644 (file)
@@ -30,6 +30,8 @@
 #include "output_xhtml.h"
 #include "OutputParams.h"
 #include "TextClass.h"
+#include "TexRow.h"
+#include "texstream.h"
 
 #include "support/debug.h"
 #include "support/docstream.h"
@@ -126,7 +128,7 @@ void InsetListings::latex(otexstream & os, OutputParams const & runparams) const
        // glyphs, except if full-unicode aware backends
        // such as XeTeX or LuaTeX are used, and with pLaTeX.
        bool const multibyte_possible = runparams.isFullUnicode()
-           || (buffer().params().bufferFormat() == "platex"
+           || (buffer().params().encoding().package() == Encoding::japanese
                && runparams.encoding->package() == Encoding::japanese);
 
        if (!multibyte_possible && !runparams.encoding->hasFixedWidth()) {
@@ -156,8 +158,20 @@ void InsetListings::latex(otexstream & os, OutputParams const & runparams) const
                        if (i == 0 && par->isInset(i) && i + 1 == siz)
                                captionline = true;
                        // ignore all struck out text and (caption) insets
-                       if (par->isDeleted(i) || par->isInset(i))
+                       if (par->isDeleted(i)
+                           || (par->isInset(i) && par->getInset(i)->lyxCode() == CAPTION_CODE))
                                continue;
+                       if (par->isInset(i)) {
+                               // Currently, this can only be a quote inset
+                               // that is output as plain quote here, but
+                               // we use more generic code anyway.
+                               otexstringstream ots;
+                               OutputParams rp = runparams;
+                               rp.pass_thru = true;
+                               par->getInset(i)->latex(ots, rp);
+                               code += ots.str();
+                               continue;
+                       }
                        char_type c = par->getChar(i);
                        // we can only output characters covered by the current
                        // encoding!
@@ -221,13 +235,16 @@ void InsetListings::latex(otexstream & os, OutputParams const & runparams) const
        } else {
                OutputParams rp = runparams;
                rp.moving_arg = true;
-               docstring const caption = getCaption(rp);
-               if (param_string.empty() && caption.empty())
-                       os << breakln << "\\begin{lstlisting}\n";
+               TexString caption = getCaption(rp);
+               os << breakln << "\\begin{lstlisting}";
+               if (param_string.empty() && caption.str.empty())
+                       os << "\n";
                else {
-                       os << breakln << "\\begin{lstlisting}[";
-                       if (!caption.empty()) {
-                               os << "caption={" << caption << '}';
+                       if (!runparams.nice)
+                               os << safebreakln;
+                       os << "[";
+                       if (!caption.str.empty()) {
+                               os << "caption={" << move(caption) << '}';
                                if (!param_string.empty())
                                        os << ',';
                        }
@@ -272,10 +289,10 @@ docstring InsetListings::xhtml(XHTMLStream & os, OutputParams const & rp) const
        if (isInline)
                out << html::CompTag("br");
        else {
-               out << html::StartTag("div", "class='float float-listings'");
+               out << html::StartTag("div", "class='float-listings'");
                docstring caption = getCaptionHTML(rp);
                if (!caption.empty())
-                       out << html::StartTag("div", "class='float-caption'")
+                       out << html::StartTag("div", "class='listings-caption'")
                            << XHTMLStream::ESCAPE_NONE
                            << caption << html::EndTag("div");
        }
@@ -371,6 +388,7 @@ docstring const InsetListings::buttonLabel(BufferView const & bv) const
 void InsetListings::validate(LaTeXFeatures & features) const
 {
        features.require("listings");
+       features.useInsetLayout(getLayout());
        string param_string = params().params();
        if (param_string.find("\\color") != string::npos)
                features.require("color");
@@ -386,18 +404,13 @@ bool InsetListings::showInsetDialog(BufferView * bv) const
 }
 
 
-docstring InsetListings::getCaption(OutputParams const & runparams) const
+TexString InsetListings::getCaption(OutputParams const & runparams) const
 {
-       if (paragraphs().empty())
-               return docstring();
-
        InsetCaption const * ins = getCaptionInset();
        if (ins == 0)
-               return docstring();
+               return TexString();
 
-       TexRow texrow;
-       odocstringstream ods;
-       otexstream os(ods, texrow);
+       otexstringstream os;
        ins->getArgs(os, runparams);
        ins->getArgument(os, runparams);
 
@@ -406,8 +419,8 @@ docstring InsetListings::getCaption(OutputParams const & runparams) const
 
        // the caption may contain \label{} but the listings
        // package prefer caption={}, label={}
-       docstring cap = ods.str();
-       if (!contains(to_utf8(cap), "\\label{"))
+       TexString cap = os.release();
+       if (!contains(cap.str, from_ascii("\\label{")))
                return cap;
        // convert from
        //     blah1\label{blah2} blah3
@@ -418,8 +431,12 @@ docstring InsetListings::getCaption(OutputParams const & runparams) const
        //
        // NOTE that } is not allowed in blah2.
        regex const reg("(.*)\\\\label\\{(.*?)\\}(.*)");
-       string const new_cap("\\1\\3},label={\\2");
-       return from_utf8(regex_replace(to_utf8(cap), reg, new_cap));
+       string const new_cap("$1$3},label={$2");
+       // TexString validity: the substitution preserves the number of newlines.
+       // Moreover we assume that $2 does not contain newlines, so that the texrow
+       // information remains accurate.
+       cap.str = from_utf8(regex_replace(to_utf8(cap.str), reg, new_cap));
+       return cap;
 }