]> git.lyx.org Git - lyx.git/blobdiff - lib/lyx2lyx/LyX.py
Spots from Abdel
[lyx.git] / lib / lyx2lyx / LyX.py
index e11be98bb5cbff222b2dde925571ded65c7b0d27..680f33c88f275ccaea2f1b91d1f608d0b54bc6fc 100644 (file)
@@ -32,7 +32,7 @@ try:
     import lyx2lyx_version
     version__ = lyx2lyx_version.version
 except: # we are running from build directory so assume the last version
-    version__ = '1.6.0svn'
+    version__ = '2.0.0svn'
 
 default_debug__ = 2
 
@@ -73,15 +73,27 @@ format_relation = [("0_06",    [200], minor_versions("0.6" , 4)),
                    ("0_12",    [215], minor_versions("0.12", 1) + ["0.11"]),
                    ("1_0",     [215], minor_versions("1.0" , 4)),
                    ("1_1",     [215], minor_versions("1.1" , 4)),
-                   ("1_1_5",   [216], ["1.1.5","1.1.5.1","1.1.5.2","1.1"]),
-                   ("1_1_6_0", [217], ["1.1.6","1.1.6.1","1.1.6.2","1.1"]),
-                   ("1_1_6_3", [218], ["1.1.6.3","1.1.6.4","1.1"]),
+                   ("1_1_5",   [216], ["1.1", "1.1.5","1.1.5.1","1.1.5.2"]),
+                   ("1_1_6_0", [217], ["1.1", "1.1.6","1.1.6.1","1.1.6.2"]),
+                   ("1_1_6_3", [218], ["1.1", "1.1.6.3","1.1.6.4"]),
                    ("1_2",     [220], minor_versions("1.2" , 4)),
                    ("1_3",     [221], minor_versions("1.3" , 7)),
                    ("1_4", range(222,246), minor_versions("1.4" , 5)),
-                   ("1_5", range(246,277), minor_versions("1.5" , 2)),
-                   ("1_6", range(277,301), minor_versions("1.6" , 0))] # Uwe: \pagebreak
+                   ("1_5", range(246,277), minor_versions("1.5" , 7)),
+                   ("1_6", range(277,346), minor_versions("1.6" , 0)),
+                   ("2_0",     [],    minor_versions("2.0", 0))]
 
+####################################################################
+# This is useful just for development versions                     #
+# if the list of supported formats is empty get it from last step  #
+if not format_relation[-1][1]:
+    step, mode = format_relation[-1][0], "convert"
+    convert = getattr(__import__("lyx_" + step), mode)
+    format_relation[-1] = (step,
+                           [conv[0] for conv in convert],
+                           format_relation[-1][2])
+#                                                                  #
+####################################################################
 
 def formats_list():
     " Returns a list with supported file formats."
@@ -93,6 +105,23 @@ def formats_list():
     return formats
 
 
+def format_info():
+    " Returns a list with supported file formats."
+    out = """Major version:
+       minor versions
+       formats
+"""
+    for version in format_relation:
+        major = str(version[2][0])
+        versions = str(version[2][1:])
+        if len(version[1]) == 1:
+            formats = str(version[1][0])
+        else:
+            formats = "%s - %s" % (version[1][-1], version[1][0])
+        out += "%s\n\t%s\n\t%s\n\n" % (major, versions, formats)
+    return out + '\n'
+
+
 def get_end_format():
     " Returns the more recent file format available."
     return format_relation[-1][1][-1]
@@ -102,7 +131,7 @@ def get_backend(textclass):
     " For _textclass_ returns its backend."
     if textclass == "linuxdoc" or textclass == "manpage":
         return "linuxdoc"
-    if textclass[:7] == "docbook":
+    if textclass.startswith("docbook") or textclass.startswith("agu-"):
         return "docbook"
     return "latex"
 
@@ -132,6 +161,8 @@ def get_encoding(language, inputencoding, format, cjk_encoding):
         return lang[language][3]
     if inputencoding == "":
         return "latin1"
+    if inputencoding == "utf8x":
+        return "utf8"
     # python does not know the alias latin9
     if inputencoding == "latin9":
         return "iso-8859-15"
@@ -142,10 +173,10 @@ def get_encoding(language, inputencoding, format, cjk_encoding):
 #
 class LyX_base:
     """This class carries all the information of the LyX file."""
-    
+
     def __init__(self, end_format = 0, input = "", output = "", error = "",
                  debug = default_debug__, try_hard = 0, cjk_encoding = '',
-                 language = "english", encoding = "auto"):
+                 final_version = "", language = "english", encoding = "auto"):
 
         """Arguments:
         end_format: final format that the file should be converted. (integer)
@@ -167,9 +198,37 @@ class LyX_base:
 
         if end_format:
             self.end_format = self.lyxformat(end_format)
+
+            # In case the target version and format are both specified
+            # verify that they are compatible. If not send a warning
+            # and ignore the version.
+            if final_version:
+                message = "Incompatible version %s for specified format %d" % (
+                    final_version, self.end_format)
+                for version in format_relation:
+                    if self.end_format in version[1]:
+                        if final_version not in version[2]:
+                            self.warning(message)
+                            final_version = ""
+        elif final_version:
+            for version in format_relation:
+                if final_version in version[2]:
+                    # set the last format for that version
+                    self.end_format = version[1][-1]
+                    break
+            else:
+                final_version = ""
         else:
             self.end_format = get_end_format()
 
+        if not final_version:
+            for step in format_relation:
+                if self.end_format in step[1]:
+                    final_version = step[2][1]
+        self.final_version = final_version
+        self.warning("Final version: %s" % self.final_version, 10)
+        self.warning("Final format: %d" % self.end_format, 10)
+
         self.backend = "latex"
         self.textclass = "article"
         # This is a hack: We use '' since we don't know the default
@@ -220,10 +279,10 @@ class LyX_base:
                     line = trim_eol(line)
                     if check_token(line, '\\end_preamble'):
                         break
-                    
+
                     if line.split()[:0] in ("\\layout",
                                             "\\begin_layout", "\\begin_body"):
-                        
+
                         self.warning("Malformed LyX file:"
                                      "Missing '\\end_preamble'."
                                      "\nAdding it now and hoping"
@@ -245,6 +304,12 @@ class LyX_base:
 
             self.header.append(line)
 
+        i = find_token(self.header, '\\textclass', 0)
+        if i == -1:
+            self.warning("Malformed LyX file: Missing '\\textclass'.")
+            i = find_token(self.header, '\\lyxformat', 0) + 1
+            self.header[i:i] = ['\\textclass article']
+
         self.textclass = get_value(self.header, "\\textclass", 0)
         self.backend = get_backend(self.textclass)
         self.format  = self.read_format()
@@ -282,10 +347,7 @@ class LyX_base:
         if self.preamble:
             i = find_token(self.header, '\\textclass', 0) + 1
             preamble = ['\\begin_preamble'] + self.preamble + ['\\end_preamble']
-            if i == 0:
-                self.error("Malformed LyX file: Missing '\\textclass'.")
-            else:
-                header = self.header[:i] + preamble + self.header[i:]
+            header = self.header[:i] + preamble + self.header[i:]
         else:
             header = self.header
 
@@ -307,7 +369,7 @@ class LyX_base:
             try:
                 gzip.open(input).readline()
                 self.input = gzip.open(input)
-                self.output = gzip.GzipFile(mode="wb", fileobj=self.output) 
+                self.output = gzip.GzipFile(mode="wb", fileobj=self.output)
             except:
                 self.input = open(input)
         else:
@@ -390,6 +452,56 @@ class LyX_base:
         self.header[i] = "\\textclass %s" % self.textclass
 
 
+    #Note that the module will be added at the END of the extant ones
+    def add_module(self, module):
+      i = find_token(self.header, "\\begin_modules", 0)
+      if i == -1:
+        #No modules yet included
+        i = find_token(self.header, "\\textclass", 0)
+        if i == -1:
+          self.warning("Malformed LyX document: No \\textclass!!")
+          return
+        modinfo = ["\\begin_modules", module, "\\end_modules"]
+        self.header[i + 1: i + 1] = modinfo
+        return
+      j = find_token(self.header, "\\end_modules", i)
+      if j == -1:
+        self.warning("(add_module)Malformed LyX document: No \\end_modules.")
+        return
+      k = find_token(self.header, module, i)
+      if k != -1 and k < j:
+        return
+      self.header.insert(j, module)
+
+
+    def get_module_list(self):
+      i = find_token(self.header, "\\begin_modules", 0)
+      if (i == -1):
+        return []
+      j = find_token(self.header, "\\end_modules", i)
+      return self.header[i + 1 : j]
+
+
+    def set_module_list(self, mlist):
+      modbegin = find_token(self.header, "\\begin_modules", 0)
+      newmodlist = ['\\begin_modules'] + mlist + ['\\end_modules']
+      if (modbegin == -1):
+        #No modules yet included
+        tclass = find_token(self.header, "\\textclass", 0)
+        if tclass == -1:
+          self.warning("Malformed LyX document: No \\textclass!!")
+          return
+        modbegin = tclass + 1
+        self.header[modbegin:modbegin] = newmodlist
+        return
+      modend = find_token(self.header, "\\end_modules", modbegin)
+      if modend == -1:
+        self.warning("(set_module_list)Malformed LyX document: No \\end_modules.")
+        return
+      newmodlist = ['\\begin_modules'] + mlist + ['\\end_modules']
+      self.header[modbegin:modend + 1] = newmodlist
+
+
     def set_parameter(self, param, value):
         " Set the value of the header parameter."
         i = find_token(self.header, '\\' + param, 0)
@@ -490,13 +602,14 @@ class LyX_base:
         steps = []
         if (initial_step, self.start) < (final_step, self.end_format):
             mode = "convert"
-            first_step = 1
+            full_steps = []
             for step in format_relation:
-                if  initial_step <= step[0] <= final_step:
-                    if first_step and len(step[1]) == 1:
-                        first_step = 0
-                        continue
-                    steps.append(step[0])
+                if  initial_step <= step[0] <= final_step and step[2][0] <= self.final_version:
+                    full_steps.append(step)
+            if full_steps[0][1][-1] == self.format:
+                full_steps = full_steps[1:]
+            for step in full_steps:
+                steps.append(step[0])
         else:
             mode = "revert"
             relation_format = format_relation[:]
@@ -549,7 +662,7 @@ class LyX_base:
             # skip paragraph parameters
             while not self.body[k].strip() or self.body[k].split()[0] \
                       in allowed_parameters:
-                k += 1 
+                k += 1
 
             while k < j:
                 if check_token(self.body[k], '\\begin_inset'):
@@ -580,9 +693,10 @@ class File(LyX_base):
     " This class reads existing LyX files."
 
     def __init__(self, end_format = 0, input = "", output = "", error = "",
-                 debug = default_debug__, try_hard = 0, cjk_encoding = ''):
+                 debug = default_debug__, try_hard = 0, cjk_encoding = '',
+                 final_version = ''):
         LyX_base.__init__(self, end_format, input, output, error,
-                          debug, try_hard, cjk_encoding)
+                          debug, try_hard, cjk_encoding, final_version)
         self.read()