commit 521d7c2e0b31883facd003604393dfd458385a3e
Author: Juergen Spitzmueller <sp...@lyx.org>
Date:   Sat Aug 11 16:55:44 2018 +0200

    tex2lyx: fix option parsing of listings
    
    the tricky thing was to decide whether [foo] is taken as option or as
    verbatim content.
    
    Candidate for stable.
---
 src/tex2lyx/text.cpp |   33 +++++++++++++++++++++++++--------
 1 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/src/tex2lyx/text.cpp b/src/tex2lyx/text.cpp
index c334de5..54db8f6 100644
--- a/src/tex2lyx/text.cpp
+++ b/src/tex2lyx/text.cpp
@@ -729,7 +729,8 @@ InsetLayout const * findInsetLayout(TextClass const & 
textclass, string const &
 }
 
 
-void eat_whitespace(Parser &, ostream &, Context &, bool);
+void eat_whitespace(Parser &, ostream &, Context &, bool eatParagraph,
+                   bool eatNewline = true);
 
 
 /*!
@@ -1998,7 +1999,21 @@ void parse_environment(Parser & p, ostream & os, bool 
outer,
 
        else if (name == "lstlisting" || name == "minted") {
                bool use_minted = name == "minted";
-               eat_whitespace(p, os, parent_context, false);
+               // with listings, we do not eat newlines here since
+               // \begin{lstlistings}
+               // [foo]
+               // and
+               // // \begin{lstlistings}%
+               //
+               // [foo]
+               // reads [foo] as content, whereas
+               // // \begin{lstlistings}%
+               // [foo]
+               // or
+               // \begin{lstlistings}[foo,
+               // bar]
+               // reads [foo...] as argument.
+               eat_whitespace(p, os, parent_context, false, use_minted);
                if (use_minted && minted_float.empty()) {
                        // look ahead for a bottom caption
                        p.pushPosition();
@@ -2235,7 +2250,8 @@ void parse_environment(Parser & p, ostream & os, bool 
outer,
 
 
 /// parses a comment and outputs it to \p os.
-void parse_comment(Parser & p, ostream & os, Token const & t, Context & 
context)
+void parse_comment(Parser & p, ostream & os, Token const & t, Context & 
context,
+                  bool skipNewlines = false)
 {
        LASSERT(t.cat() == catComment, return);
        if (!t.cs().empty()) {
@@ -2253,7 +2269,7 @@ void parse_comment(Parser & p, ostream & os, Token const 
& t, Context & context)
                                output_ert_inset(os, "\n", context);
                        eat_whitespace(p, os, context, true);
                }
-       } else {
+       } else if (!skipNewlines) {
                // "%\n" combination
                p.skip_spaces();
        }
@@ -2264,17 +2280,18 @@ void parse_comment(Parser & p, ostream & os, Token 
const & t, Context & context)
  * Reads spaces and comments until the first non-space, non-comment token.
  * New paragraphs (double newlines or \\par) are handled like simple spaces
  * if \p eatParagraph is true.
+ * If \p eatNewline is false, newlines won't be treated as whitespace.
  * Spaces are skipped, but comments are written to \p os.
  */
 void eat_whitespace(Parser & p, ostream & os, Context & context,
-                   bool eatParagraph)
+                   bool eatParagraph, bool eatNewline)
 {
        while (p.good()) {
                Token const & t = p.get_token();
                if (t.cat() == catComment)
-                       parse_comment(p, os, t, context);
-               else if ((! eatParagraph && p.isParagraph()) ||
-                        (t.cat() != catSpace && t.cat() != catNewline)) {
+                       parse_comment(p, os, t, context, !eatNewline);
+               else if ((!eatParagraph && p.isParagraph()) ||
+                        (t.cat() != catSpace && (t.cat() != catNewline || 
!eatNewline))) {
                        p.putback();
                        return;
                }

Reply via email to