Author: lasgouttes
Date: Sat Nov  6 16:06:19 2010
New Revision: 36163
URL: http://www.lyx.org/trac/changeset/36163

Log:
This patch implements proper ERT behaviour for normal layouts. 
In particular, it makes paragraph breaks generate single \n in latex output
when ParbreakIsNewline is true

This means that it is not necessary anymore to use newlines to break lines. 
Plain paragraph breaks can be used instead, like is done now in ERT/Listings. 
This is mainly aimed at sweave support.

lyx2lyx support courtesy of Richard Heck

Modified:
   lyx-devel/trunk/lib/layouts/chess.layout
   lyx-devel/trunk/lib/layouts/db_lyxmacros.inc
   lyx-devel/trunk/lib/layouts/db_stdlayouts.inc
   lyx-devel/trunk/lib/layouts/elsart.layout
   lyx-devel/trunk/lib/layouts/lilypond.module
   lyx-devel/trunk/lib/layouts/linguistics.module
   lyx-devel/trunk/lib/layouts/literate-scrap.inc
   lyx-devel/trunk/lib/layouts/noweb.module
   lyx-devel/trunk/lib/layouts/revtex4.layout
   lyx-devel/trunk/lib/layouts/sweave.module
   lyx-devel/trunk/lib/lyx2lyx/lyx2lyx_tools.py
   lyx-devel/trunk/lib/lyx2lyx/lyx_2_0.py
   lyx-devel/trunk/src/Buffer.cpp
   lyx-devel/trunk/src/Cursor.cpp
   lyx-devel/trunk/src/CutAndPaste.cpp
   lyx-devel/trunk/src/Text.cpp
   lyx-devel/trunk/src/output_latex.cpp

Modified: lyx-devel/trunk/lib/layouts/chess.layout
==============================================================================
--- lyx-devel/trunk/lib/layouts/chess.layout    Sat Nov  6 13:32:47 2010        
(r36162)
+++ lyx-devel/trunk/lib/layouts/chess.layout    Sat Nov  6 16:06:19 2010        
(r36163)
@@ -42,6 +42,7 @@
        LabelString           "Mainline:"
        Newline               0
        PassThru              1
+       ParbreakIsNewline     1
        TopSep                0.0
        ParSep                0.0
        LabelFont

Modified: lyx-devel/trunk/lib/layouts/db_lyxmacros.inc
==============================================================================
--- lyx-devel/trunk/lib/layouts/db_lyxmacros.inc        Sat Nov  6 13:32:47 
2010        (r36162)
+++ lyx-devel/trunk/lib/layouts/db_lyxmacros.inc        Sat Nov  6 16:06:19 
2010        (r36163)
@@ -13,6 +13,7 @@
        LatexType             Environment
        LatexName             screen
        PassThru              1
+       ParbreakIsNewline     1
 End
 
 Style LyX-Code

Modified: lyx-devel/trunk/lib/layouts/db_stdlayouts.inc
==============================================================================
--- lyx-devel/trunk/lib/layouts/db_stdlayouts.inc       Sat Nov  6 13:32:47 
2010        (r36162)
+++ lyx-devel/trunk/lib/layouts/db_stdlayouts.inc       Sat Nov  6 16:06:19 
2010        (r36163)
@@ -12,6 +12,7 @@
        LatexType             Environment
        LatexName             literallayout
        PassThru              1
+       ParbreakIsNewline     1
 End
 
 

Modified: lyx-devel/trunk/lib/layouts/elsart.layout
==============================================================================
--- lyx-devel/trunk/lib/layouts/elsart.layout   Sat Nov  6 13:32:47 2010        
(r36162)
+++ lyx-devel/trunk/lib/layouts/elsart.layout   Sat Nov  6 16:06:19 2010        
(r36163)
@@ -149,6 +149,7 @@
        LatexType             Command
        InTitle               1
        PassThru              1
+       ParbreakIsNewline     1
        LatexName             ead
        Align                 Center
        Labeltype             Static
@@ -169,6 +170,7 @@
        LatexType             Command
        InTitle               1
        PassThru              1
+       ParbreakIsNewline     1
        LatexName             ead
        LatexParam            "[url]"
        Align                 Center

Modified: lyx-devel/trunk/lib/layouts/lilypond.module
==============================================================================
--- lyx-devel/trunk/lib/layouts/lilypond.module Sat Nov  6 13:32:47 2010        
(r36162)
+++ lyx-devel/trunk/lib/layouts/lilypond.module Sat Nov  6 16:06:19 2010        
(r36163)
@@ -28,5 +28,6 @@
        ForcePlain            true
        FreeSpacing           true
        PassThru              true
+       ParbreakIsNewline     true
        ForceLTR              true
 End

Modified: lyx-devel/trunk/lib/layouts/linguistics.module
==============================================================================
--- lyx-devel/trunk/lib/layouts/linguistics.module      Sat Nov  6 13:32:47 
2010        (r36162)
+++ lyx-devel/trunk/lib/layouts/linguistics.module      Sat Nov  6 16:06:19 
2010        (r36163)
@@ -75,6 +75,7 @@
        CustomPars            false
        ForcePlain            true
        PassThru              true
+       ParbreakIsNewline     true
        FreeSpacing           true
        ForceLTR              true
        Requires              covington
@@ -103,6 +104,7 @@
        CustomPars            false
        ForcePlain            true
        PassThru              true
+       ParbreakIsNewline     true
        FreeSpacing           true
        ForceLTR              true
        InToc                 true

Modified: lyx-devel/trunk/lib/layouts/literate-scrap.inc
==============================================================================
--- lyx-devel/trunk/lib/layouts/literate-scrap.inc      Sat Nov  6 13:32:47 
2010        (r36162)
+++ lyx-devel/trunk/lib/layouts/literate-scrap.inc      Sat Nov  6 16:06:19 
2010        (r36163)
@@ -13,14 +13,10 @@
        Margin                First_Dynamic
        LatexType             Paragraph
        LatexName             dummy
-       NewLine               0
        LeftMargin            MMM
-       ParSep                0.4
-       TopSep                0.4
-       BottomSep             0.4
-       ItemSep               0.4
        Align                 Left
        AlignPossible         Block,Left
+       NewLine               0
        FreeSpacing           1
        PassThru              1
        ParbreakIsNewline     1

Modified: lyx-devel/trunk/lib/layouts/noweb.module
==============================================================================
--- lyx-devel/trunk/lib/layouts/noweb.module    Sat Nov  6 13:32:47 2010        
(r36162)
+++ lyx-devel/trunk/lib/layouts/noweb.module    Sat Nov  6 16:06:19 2010        
(r36163)
@@ -4,14 +4,6 @@
 #DescriptionEnd
 #Category: literate
 
-# Suggested style to write your code:
-# Within same scrap, lines are separated by newlines (Ctrl-Return), use:
-#  ItemSep               0.4
-#    . disavantage: must type ctrl-return every single line
-#    . advantage:   looks better (IMHO)
-#                   resembles more closely the produced paper doc (more 
WYSIWYG)
-#
-
 Format 30
 OutputType              literate
 
@@ -20,14 +12,10 @@
        Margin                First_Dynamic
        LatexType             Paragraph
        LatexName             dummy
-       NewLine               0
        LeftMargin            MMM
-       ParSep                0.4
-       TopSep                0.4
-       BottomSep             0.4
-       ItemSep               0.4
        Align                 Left
        AlignPossible         Block,Left
+       NewLine               0
        FreeSpacing           1
        PassThru              1
        ParbreakIsNewline     1

Modified: lyx-devel/trunk/lib/layouts/revtex4.layout
==============================================================================
--- lyx-devel/trunk/lib/layouts/revtex4.layout  Sat Nov  6 13:32:47 2010        
(r36162)
+++ lyx-devel/trunk/lib/layouts/revtex4.layout  Sat Nov  6 16:06:19 2010        
(r36163)
@@ -171,6 +171,7 @@
 Style AltAffiliation
        CopyStyle             Affiliation
        PassThru              1
+       ParbreakIsNewline     1
        LatexName             altaffiliation
        OptionalArgs          1
        LabelString           "AltAffiliation"
@@ -196,6 +197,7 @@
 Style Author_Email
        CopyStyle             Affiliation
        PassThru              1
+       ParbreakIsNewline     1
        LatexName             email
        OptionalArgs          1
        LabelString           "Electronic Address:"
@@ -211,6 +213,7 @@
 Style Author_URL
        CopyStyle             Author_Email
        PassThru              1
+       ParbreakIsNewline     1
        LatexName             homepage
        OptionalArgs          1
        LabelString           "URL:"

Modified: lyx-devel/trunk/lib/layouts/sweave.module
==============================================================================
--- lyx-devel/trunk/lib/layouts/sweave.module   Sat Nov  6 13:32:47 2010        
(r36162)
+++ lyx-devel/trunk/lib/layouts/sweave.module   Sat Nov  6 16:06:19 2010        
(r36163)
@@ -22,10 +22,6 @@
        LatexType             Paragraph
        LatexName             dummy
        Margin                static
-       ParSep                0.4
-       TopSep                0.4
-       BottomSep             0.4
-       ItemSep               0.4
        Align                 Left
        AlignPossible         Block, Left, Right, Center
        NewLine               0
@@ -59,7 +55,8 @@
          Size                Small
        EndFont
        MultiPar              false
-       PassThru              true
+       PassThru              1
+       ParbreakIsNewline     1
        FreeSpacing           true
        ForceLTR              true
 End
@@ -79,7 +76,8 @@
          Size                Small
        EndFont
        MultiPar              false
-       PassThru              true
+       PassThru              1
+       ParbreakIsNewline     1
        FreeSpacing           true
        ForceLTR              true
 End
@@ -99,7 +97,8 @@
          Size                Small
        EndFont
        MultiPar              false
-       PassThru              true
+       PassThru              1
+       ParbreakIsNewline     1
        FreeSpacing           true
        ForceLTR              true
 End

Modified: lyx-devel/trunk/lib/lyx2lyx/lyx2lyx_tools.py
==============================================================================
--- lyx-devel/trunk/lib/lyx2lyx/lyx2lyx_tools.py        Sat Nov  6 13:32:47 
2010        (r36162)
+++ lyx-devel/trunk/lib/lyx2lyx/lyx2lyx_tools.py        Sat Nov  6 16:06:19 
2010        (r36163)
@@ -65,7 +65,7 @@
 
 
 # This will accept either a list of lines or a single line.
-# It is bad practice to pass something with embedded newlines, 
+# It is bad practice to pass something with embedded newlines,
 # though we will handle that.
 def add_to_preamble(document, text):
     " Add text to the preamble if it is not already there. "

Modified: lyx-devel/trunk/lib/lyx2lyx/lyx_2_0.py
==============================================================================
--- lyx-devel/trunk/lib/lyx2lyx/lyx_2_0.py      Sat Nov  6 13:32:47 2010        
(r36162)
+++ lyx-devel/trunk/lib/lyx2lyx/lyx_2_0.py      Sat Nov  6 16:06:19 2010        
(r36163)
@@ -1952,6 +1952,142 @@
     j = k + len(subst)
 
 
+def check_passthru(document):
+  tc = document.textclass
+  ok = (tc == "literate-article" or tc == "literate-book" or tc == 
"literate-report")
+  if not ok:
+    mods = document.get_module_list()
+    for mod in mods:
+      if mod == "sweave" or mod == "noweb":
+        ok = True
+        break
+  return ok
+
+
+def convert_passthru(document):
+    " http://www.mail-archive.com/[email protected]/msg161298.html "
+    if not check_passthru:
+      return
+    
+    rx = re.compile("\\\\begin_layout \s*(\w+)")
+    beg = 0
+    for lay in ["Chunk", "Scrap"]:
+      while True:
+        beg = find_token(document.body, "\\begin_layout " + lay, beg)
+        if beg == -1:
+          break
+        end = find_end_of_layout(document.body, beg)
+        if end == -1:
+          document.warning("Can't find end of layout at line " + str(beg))
+          beg += 1
+          continue
+        # we are now going to replace newline insets within this layout
+        # by new instances of this layout. so we have repeated layouts
+        # instead of newlines.
+        ns = beg
+        while True:
+          ns = find_token(document.body, "\\begin_inset Newline newline", ns, 
end)
+          if ns == -1:
+            break
+          ne = find_end_of_inset(document.body, ns)
+          if ne == -1 or ne > end:
+            document.warning("Can't find end of inset at line " + str(nb))
+            ns += 1
+            continue
+          if document.body[ne + 1] == "":
+            ne += 1
+          subst = ["\\end_layout", "", "\\begin_layout " + lay]
+          document.body[ns:ne + 1] = subst
+          # now we need to adjust end, in particular, but might as well
+          # do ns properly, too
+          newlines = (ne - ns) - len(subst)
+          ns += newlines + 2
+          end += newlines + 1
+        # ok, we now want to find out if the next layout is the
+        # same as this one. if so, we will insert an extra copy of it
+        didit = False
+        next = find_token(document.body, "\\begin_layout", end)
+        if next != -1:
+          m = rx.match(document.body[next])
+          if m:
+            nextlay = m.group(1)
+            if nextlay == lay:
+              subst = ["\\begin_layout " + lay, "", "\\end_layout", ""]
+              document.body[next:next] = subst
+              didit = True
+        beg = end + 1
+        if didit:
+          beg += 4 # for the extra layout
+    
+
+def revert_passthru(document):
+    " http://www.mail-archive.com/[email protected]/msg161298.html "
+    if not check_passthru:
+      return
+    rx = re.compile("\\\\begin_layout \s*(\w+)")
+    beg = 0
+    for lay in ["Chunk", "Scrap"]:
+      while True:
+        beg = find_token(document.body, "\\begin_layout " + lay, beg)
+        if beg == -1:
+          break
+        end = find_end_of_layout(document.body, beg)
+        if end == -1:
+          document.warning("Can't find end of layout at line " + str(beg))
+          beg += 1
+          continue
+        
+        # we now want to find out if the next layout is the
+        # same as this one. but we will need to do this over and
+        # over again.
+        while True:
+          next = find_token(document.body, "\\begin_layout", end)
+          if next == -1:
+            break
+          m = rx.match(document.body[next])
+          if not m:
+            break
+          nextlay = m.group(1)
+          if nextlay != lay:
+            break
+          # so it is the same layout again. we now want to know if it is empty.
+          # but first let's check and make sure there is no content between the
+          # two layouts. i'm not sure if that can happen or not.
+          for l in range(end + 1, next):
+            document.warning("c'" + document.body[l] + "'")
+            if document.body[l] != "":
+              document.warning("Found content between adjacent " + lay + " 
layouts!")
+              break
+          nextend = find_end_of_layout(document.body, next)
+          if nextend == -1:
+            document.warning("Can't find end of layout at line " + str(next))
+            break
+          empty = True
+          for l in range(next + 1, nextend):
+            document.warning("e'" + document.body[l] + "'")
+            if document.body[l] != "":
+              empty = False
+              break
+          if empty:
+            # empty layouts just get removed
+            # should we check if it's before yet another such layout?
+            del document.body[next : nextend + 1]
+            # and we do not want to check again. we know the next layout
+            # should be another Chunk and should be left as is.
+            break
+          else:
+            # if it's not empty, then we want to insert a newline in place
+            # of the layout switch
+            subst = ["\\begin_inset Newline newline", "\\end_inset", ""]
+            document.body[end : next + 1] = subst
+            # and now we have to find the end of the new, larger layout
+            newend = find_end_of_layout(document.body, beg)
+            if newend == -1:
+              document.warning("Can't find end of new layout at line " + 
str(beg))
+              break
+            end = newend
+        beg = end + 1
+
 ##
 # Conversion hub
 #
@@ -2016,10 +2152,12 @@
            [402, [convert_bibtex_clearpage]],
            [403, [convert_flexnames]],
            [404, [convert_prettyref]],
-           [405, []]
+           [405, []],
+           [406, [convert_passthru]]
 ]
 
-revert =  [[404, []],
+revert =  [[405, [revert_passthru]],
+           [404, []],
            [403, [revert_refstyle]],
            [402, [revert_flexnames]],
            [401, []],

Modified: lyx-devel/trunk/src/Buffer.cpp
==============================================================================
--- lyx-devel/trunk/src/Buffer.cpp      Sat Nov  6 13:32:47 2010        (r36162)
+++ lyx-devel/trunk/src/Buffer.cpp      Sat Nov  6 16:06:19 2010        (r36163)
@@ -128,7 +128,7 @@
 
 // Do not remove the comment below, so we get merge conflict in
 // independent branches. Instead add your own.
-int const LYX_FORMAT = 405; // vfr: author hash
+int const LYX_FORMAT = 406; // rgh: passthru changes
 
 typedef map<string, bool> DepClean;
 typedef map<docstring, pair<InsetLabel const *, Buffer::References> > RefCache;

Modified: lyx-devel/trunk/src/Cursor.cpp
==============================================================================
--- lyx-devel/trunk/src/Cursor.cpp      Sat Nov  6 13:32:47 2010        (r36162)
+++ lyx-devel/trunk/src/Cursor.cpp      Sat Nov  6 16:06:19 2010        (r36163)
@@ -26,6 +26,7 @@
 #include "FuncCode.h"
 #include "FuncRequest.h"
 #include "Language.h"
+#include "Layout.h"
 #include "LyXAction.h"
 #include "LyXRC.h"
 #include "Paragraph.h"
@@ -2016,15 +2017,18 @@
 }
 
 
-static docstring parbreak(InsetCode code)
+namespace {
+docstring parbreak(Cursor const * cur)
 {
        odocstringstream os;
        os << '\n';
-       // only add blank line if we're not in an ERT or Listings inset
-       if (code != ERT_CODE && code != LISTINGS_CODE)
+       // only add blank line if we're not in a ParbreakIsNewline situation
+       if (!cur->inset().getLayout().parbreakIsNewline() 
+           && !cur->paragraph().layout().parbreak_is_newline)
                os << '\n';
        return os.str();
 }
+}
 
 
 docstring Cursor::selectionAsString(bool with_label) const
@@ -2060,13 +2064,13 @@
        // First paragraph in selection
        docstring result = pars[startpit].
                asString(startpos, pars[startpit].size(), label)
-               + parbreak(inset().lyxCode());
+               + parbreak(this);
 
        // The paragraphs in between (if any)
        for (pit_type pit = startpit + 1; pit != endpit; ++pit) {
                Paragraph const & par = pars[pit];
                result += par.asString(0, par.size(), label)
-                       + parbreak(inset().lyxCode());
+                       + parbreak(this);
        }
 
        // Last paragraph in selection

Modified: lyx-devel/trunk/src/CutAndPaste.cpp
==============================================================================
--- lyx-devel/trunk/src/CutAndPaste.cpp Sat Nov  6 13:32:47 2010        (r36162)
+++ lyx-devel/trunk/src/CutAndPaste.cpp Sat Nov  6 16:06:19 2010        (r36163)
@@ -124,10 +124,9 @@
        // Now remove all out of the pars which is NOT allowed in the
        // new environment and set also another font if that is required.
 
-       // Convert newline to paragraph break in ERT inset.
-       // This should not be here!
-       InsetCode const code = target_inset->lyxCode();
-       if (code == ERT_CODE || code == LISTINGS_CODE) {
+       // Convert newline to paragraph break in ParbreakIsNewline
+       if (target_inset->getLayout().parbreakIsNewline()
+           || pars[pit].layout().parbreak_is_newline) {
                for (size_t i = 0; i != insertion.size(); ++i) {
                        for (pos_type j = 0; j != insertion[i].size(); ++j) {
                                if (insertion[i].isNewline(j)) {

Modified: lyx-devel/trunk/src/Text.cpp
==============================================================================
--- lyx-devel/trunk/src/Text.cpp        Sat Nov  6 13:32:47 2010        (r36162)
+++ lyx-devel/trunk/src/Text.cpp        Sat Nov  6 16:06:19 2010        (r36163)
@@ -599,7 +599,6 @@
        // end of a paragraph
        tmp->setPlainOrDefaultLayout(bparams.documentClass());
 
-       // layout stays the same with latex-environments
        if (keep_layout) {
                tmp->setLayout(par.layout());
                tmp->setLabelWidthString(par.params().labelWidthString());
@@ -665,7 +664,6 @@
                par.setPlainOrDefaultLayout(bparams.documentClass());
        }
 
-       // layout stays the same with latex-environments
        if (keep_layout) {
                par.setLayout(tmp->layout());
                par.setLabelWidthString(tmp->params().labelWidthString());
@@ -701,9 +699,10 @@
                cpar.eraseChar(cur.pos(), cur.buffer()->params().trackChanges);
 
        // What should the layout for the new paragraph be?
-       bool keep_layout = inverse_logic ? 
-               !layout.isEnvironment() 
-               : layout.isEnvironment();
+       bool keep_layout = layout.isEnvironment() 
+               || (layout.isParagraph() && layout.parbreak_is_newline);
+       if (inverse_logic)
+               keep_layout = !keep_layout;
 
        // We need to remember this before we break the paragraph, because
        // that invalidates the layout variable

Modified: lyx-devel/trunk/src/output_latex.cpp
==============================================================================
--- lyx-devel/trunk/src/output_latex.cpp        Sat Nov  6 13:32:47 2010        
(r36162)
+++ lyx-devel/trunk/src/output_latex.cpp        Sat Nov  6 16:06:19 2010        
(r36163)
@@ -374,14 +374,18 @@
                open_encoding_ = none;
        }
 
-       if (runparams.pass_thru) {
+       if (text.inset().getLayout().isPassThru()) {
                int const dist = distance(paragraphs.begin(), pit);
                Font const outerfont = text.outerFont(dist);
 
-               // No newline if only one paragraph in this lyxtext
+               // No newline before first paragraph in this lyxtext
                if (dist > 0) {
                        os << '\n';
                        texrow.newline();
+                       if (!text.inset().getLayout().parbreakIsNewline()) {
+                               os << '\n';
+                               texrow.newline();
+                       }
                }
 
                pit->latex(bparams, outerfont, os, texrow,
@@ -389,6 +393,28 @@
                return nextpit;
        }
 
+       if (style.pass_thru) {
+               int const dist = distance(paragraphs.begin(), pit);
+               Font const outerfont = text.outerFont(dist);
+               pit->latex(bparams, outerfont, os, texrow,
+                          runparams, start_pos, end_pos);
+               os << '\n';
+               texrow.newline();
+               if (!style.parbreak_is_newline) {
+                       os << '\n';
+                       texrow.newline();
+               } else if (nextpit != paragraphs.end()) {
+                       Layout const nextstyle = 
text.inset().forcePlainLayout() ?
+                               bparams.documentClass().plainLayout() : 
nextpit->layout();
+                       if (nextstyle.name() != style.name()) {
+                               os << '\n';
+                               texrow.newline();
+                       }
+               }
+
+               return nextpit;
+       }
+
        // This paragraph's language
        Language const * const par_language = pit->getParLanguage(bparams);
        // The document's language

Reply via email to