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
("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,307), minor_versions("1.6" , 0))] # Uwe: support for Interlingua
+ ("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."
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]
" 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"
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"
#
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)
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
" Emits a warning and exits if not in try_hard mode."
self.warning(message)
if not self.try_hard:
- self.warning("Quiting.")
+ self.warning("Quitting.")
sys.exit(1)
self.status = 2
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"
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()
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
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:
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)
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[:]
# 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'):
" 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()