X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetListings.cpp;h=bec33b12cb44ee86ce28d927a1757a21a34cb99d;hb=239b9919ffe28338d789e6dc9122228f77ab77a7;hp=e4b8c7f1eef81d86f710b3203403afe96ea536b2;hpb=670efa8f646218f2a378f0cc614c4c37a9f6b89a;p=lyx.git diff --git a/src/insets/InsetListings.cpp b/src/insets/InsetListings.cpp index e4b8c7f1ee..bec33b12cb 100644 --- a/src/insets/InsetListings.cpp +++ b/src/insets/InsetListings.cpp @@ -30,6 +30,7 @@ #include "output_xhtml.h" #include "OutputParams.h" #include "TextClass.h" +#include "TexRow.h" #include "texstream.h" #include "support/debug.h" @@ -127,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()) { @@ -157,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! @@ -222,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 << ','; } @@ -273,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"); } @@ -372,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"); @@ -387,17 +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(); - odocstringstream ods; - otexstream os(ods, false); + 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 @@ -419,7 +432,11 @@ 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)); + // 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; }