]> git.lyx.org Git - lyx.git/blobdiff - lib/scripts/layout2layout.py
sweave.lyx: generate both pdf files and eps files
[lyx.git] / lib / scripts / layout2layout.py
index 112bf4e9fde4878cb1671d79cd8e1e9cb12a756d..bded39d315df49dad8025aa3e0ce36f47c63bac7 100644 (file)
@@ -125,6 +125,35 @@ import os, re, string, sys
 # Incremented to format 36, 7 December 2011, by rgh
 # Added HTMLStyles and AddToHTMLStyles tags.
 
+# Incremented to format 37, 29 February 2012 by jrioux
+# Implement the citation engine machinery in layouts.
+# Change CiteFormat to CiteFormat (default|authoryear|numerical).
+
+# Incremented to format 38, 08 April 2012 by gb
+# Introduce LangPreamble and BabelPreamble for InsetLayout.
+
+# Incremented to format 39, 15 April 2012 by sanda
+# Introduce styling of branches via "InsetLayout Branch:".
+
+# Incremented to format 40, 10 October 2012 by rgh
+# Re-do layout names for layout categories
+
+# Incremented to format 41, 20 November 2012 by spitz
+# New Argument syntax
+
+# Incremented to format 42, 22 December 2012 by spitz
+# New Style tag "ItemCommand"
+
+# Incremented to format 43, 30 December 2012 by spitz
+# Extended InsetCaption format
+
+# Incremented to format 44, 9 February 2013 by rgh
+# Remove COUNTER label style; rename as STATIC
+# Rename TOP_ENVIRONMENT to ABOVE and CENTERED_TOP_ENVIRONMENT to CENTERED
+
+# Incremented to format 45, 12 February 2013 by rgh
+# New Tag "NoInsetLayout"
+
 # Do not forget to document format change in Customization
 # Manual (section "Declaring a new text class").
 
@@ -132,7 +161,7 @@ import os, re, string, sys
 # development/tools/updatelayouts.sh script to update all
 # layout files to the new format.
 
-currentFormat = 36
+currentFormat = 44
 
 
 def usage(prog_name):
@@ -206,6 +235,7 @@ def convert(lines):
     re_End = re.compile(r'^(\s*)(End)(\s*)$', re.IGNORECASE)
     re_Provides = re.compile(r'^(\s*)Provides(\S+)(\s+)(\S+)', re.IGNORECASE)
     re_CharStyle = re.compile(r'^(\s*)CharStyle(\s+)(\S+)$', re.IGNORECASE)
+    re_CiteFormat = re.compile(r'^(\s*)(CiteFormat)(?:(\s*)()|(\s+)(default|authoryear|numerical))', re.IGNORECASE)
     re_AMSMaths = re.compile(r'^\s*Input ams(?:math|def)s.inc\s*')
     re_AMSMathsPlain = re.compile(r'^\s*Input amsmaths-plain.inc\s*')
     re_AMSMathsSeq = re.compile(r'^\s*Input amsmaths-seq.inc\s*')
@@ -228,6 +258,21 @@ def convert(lines):
     re_QInsetLayout2 = re.compile(r'^\s*InsetLayout\s+"([^"]+)"\s*$', re.IGNORECASE)
     re_IsFlex = re.compile(r'\s*LyXType.*$', re.IGNORECASE)
     re_CopyStyle2 = re.compile(r'(\s*CopyStyle\s+)"?([^"]+)"?\s*$')
+    # for categories
+    re_Declaration = re.compile(r'^#\s*\\Declare\w+Class.*$')
+    re_ExtractCategory = re.compile(r'^(#\s*\\Declare\w+Class(?:\[[^]]*?\])?){([^(]+?)\s+\(([^)]+?)\)\s*}\s*$')
+    ConvDict = {"article": "Articles", "book" : "Books", "letter" : "Letters", "report": "Reports", \
+                "presentation" : "Presentations", "curriculum vitae" : "Curricula Vitae", "handout" : "Handouts"}
+    # Arguments
+    re_OptArgs = re.compile(r'^(\s*)OptionalArgs(\s+)(\d+)\D*$', re.IGNORECASE)
+    re_ReqArgs = re.compile(r'^(\s*)RequiredArgs(\s+)(\d+)\D*$', re.IGNORECASE)
+    
+    # various changes associated with changing how chapters are handled
+    re_LabelTypeIsCounter = re.compile(r'^(\s*)LabelType(\s*)Counter\s*$', re.IGNORECASE)
+    re_TopEnvironment = re.compile(r'^(\s*)LabelType(\s+)Top_Environment\s*$', re.IGNORECASE)
+    re_CenteredEnvironment = re.compile(r'^(\s*)LabelType(\s+)Centered_Top_Environment\s*$', re.IGNORECASE)
+    re_ChapterStyle = re.compile(r'^\s*Style\s+Chapter\s*$', re.IGNORECASE)
+
 
     # counters for sectioning styles (hardcoded in 1.3)
     counters = {"part"          : "\\Roman{part}",
@@ -274,12 +319,28 @@ def convert(lines):
     formatline = 0
     usemodules = []
     flexstyles = []
+    opts = 0
+    reqs = 0
+    inchapter = False
 
     while i < len(lines):
         # Skip comments and empty lines
-        if re_Comment.match(lines[i]) or re_Empty.match(lines[i]):
-            i += 1
-            continue
+        if (re_Comment.match(lines[i]) or re_Empty.match(lines[i])):
+          # We need to deal with this conversion here, because it happens
+          # inside the initial comment block.
+          if only_comment and format == 39:
+              match = re_ExtractCategory.match(lines[i])
+              if match:
+                  lpre = match.group(1)
+                  lcat = match.group(2)
+                  lnam = match.group(3)
+                  if lcat in ConvDict:
+                      lcat = ConvDict[lcat]
+                  lines[i] = lpre + "{" + lnam + "}"
+                  lines.insert(i+1, "#  \\DeclareCategory{" + lcat + "}")
+                  i += 1 
+          i += 1
+          continue
 
         # insert file format if not already there
         if (only_comment):
@@ -316,15 +377,140 @@ def convert(lines):
             while i < len(lines) and not re_EndBabelPreamble.match(lines[i]):
                 i += 1
             continue
+        
+        if format == 44:
+            # nothing to do.
+            i += 1
+            continue
+
+        if format == 43:
+          match = re_LabelTypeIsCounter.match(lines[i])
+          if match:
+            if inchapter:
+             lines[i] = match.group(1) + "LabelType" + match.group(2) + "Above"              
+            else:
+              lines[i] = match.group(1) + "LabelType" + match.group(2) + "Static"
+
+          match = re_TopEnvironment.match(lines[i])
+          if match:
+            lines[i] = match.group(1) + "LabelType" + match.group(2) + "Above"
+
+          match = re_CenteredEnvironment.match(lines[i])
+          if match:
+            lines[i] = match.group(1) + "LabelType" + match.group(2) + "Centered"
+
+          if inchapter:
+            match = re_Style.match(lines[i])
+            if match:
+              inchapter = False
+          else:
+            match = re_ChapterStyle.match(lines[i])
+            if match:
+              inchapter = True
+
+          i += 1
+          continue
+
+        if format == 42:
+          if lines[i] == "InsetLayout Caption":
+            lines[i] = "InsetLayout Caption:Standard"
+          i += 1
+          continue
+        
+        if format == 41:
+            # nothing to do.
+            i += 1
+            continue
+
+        if format == 40:
+            # reset counters on Style beginning
+            match = re_Style.match(lines[i])
+            if match:
+                opts = 0
+                reqs = 0
+                i += 1
+                continue
+            match = re_OptArgs.match(lines[i])
+            if match:
+                # Save number of optional arguments
+                space1 = match.group(1)
+                opts = int(match.group(3))
+                # OptionalArgs 0 > ResetArgs 1
+                if opts == 0:
+                    lines[i] = space1 + "ResetArgs\t1"
+                    i += 1
+                else:
+                    del lines[i]
+                continue
+            match = re_ReqArgs.match(lines[i])
+            if match:
+                # Save number of required arguments
+                space1 = match.group(1)
+                reqs = int(match.group(3))
+                del lines[i]
+                continue
+            # Insert the required number of arguments at the end of the style definition
+            match = re_End.match(lines[i])
+            if match:
+                newarg = ['']
+                # First the optionals (this is the required order pre 2.1)
+                if opts > 0:
+                    if opts == 1:
+                        newarg = [ '%sArgument 1' % (space1),
+                                   '%s\tLabelString\t\"Optional Layout Argument\"' % (space1),
+                                   '%sEndArgument' % (space1)]
+                    elif opts > 1:
+                        actopt = 1
+                        while actopt < (opts + 1):
+                            newarg += [ '%sArgument %d' % (space1, actopt),
+                               '%s\tLabelString\t\"Optional Layout Argument %d\"' % (space1, actopt),
+                               '%sEndArgument' % (space1)]
+                            actopt += 1
+                # Now the mandatories
+                if reqs > 0:
+                    actopt = opts + 1
+                    while actopt < (opts +  reqs + 1):
+                        newarg += [ '%sArgument %d' % (space1, actopt),
+                           '%s\tLabelString\t"Required Layout Argument %d"' % (space1, actopt - opts),
+                           '%s\tMandatory\t1' % (space1),
+                           '%sEndArgument' % (space1)]
+                        actopt += 1
+                # Since we replace the "End" line, re-add this line
+                if len(newarg) > 1:
+                    newarg += ['End']
+                    lines[i:i+1] = newarg
+                    i += len(newarg)
+                # Reset the counters
+                opts = 0
+                reqs = 0
+            i += 1
+            continue
+        
+        if format == 39:
+            # There is a conversion with format 40, but it is done within the
+            # initial comment block and so is above.
+            i += 1
+            continue
+
+        if format == 37 or format == 38:
+            i += 1
+            continue
+
+        if format == 36:
+            match = re_CiteFormat.match(lines[i]);
+            if match and match.group(4) == "":
+                lines[i] = match.group(0) + " default"
+            i += 1
+            continue
 
         if format == 35:
           i += 1
           continue
 
         if format == 34:
-          match = re_InsetLayout2.match(lines[i])
+          match = re_QInsetLayout2.match(lines[i])
           if not match:
-            match = re_QInsetLayout2.match(lines[i])
+            match = re_InsetLayout2.match(lines[i])
           if not match:
             match = re_CopyStyle2.match(lines[i])
             if not match: