" The LyX module has all the rules related with different lyx file formats."
-from parser_tools import get_value, check_token, find_token, \
- find_tokens, find_end_of
+from parser_tools import (get_value, check_token, find_token, find_tokens,
+ find_end_of, find_complete_lines)
import os.path
import gzip
import locale
try:
import lyx2lyx_version
version__ = lyx2lyx_version.version
+ stable_version = True
except: # we are running from build directory so assume the last version
- version__ = '2.3'
+ version__ = '2.4'
+ stable_version = False
default_debug__ = 2
# Regular expressions used
format_re = re.compile(r"(\d)[\.,]?(\d\d)")
fileformat = re.compile(r"\\lyxformat\s*(\S*)")
-original_version = re.compile(r".*?LyX ([\d.]*)")
-original_tex2lyx_version = re.compile(r".*?tex2lyx ([\d.]*)")
+original_version = re.compile(b".*?LyX ([\\d.]*)")
+original_tex2lyx_version = re.compile(b".*?tex2lyx ([\\d.]*)")
##
# file format information:
def format_info():
- " Returns a list with supported file formats."
- out = """Major version:
- minor versions
- formats
+ " Returns a list with the supported file formats."
+ template = """
+%s\tstable format: %s
+ \tstable versions: %s
+ \tdevelopment formats: %s
"""
+
+ out = "version: formats and versions"
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])
+ stable_format = str(version[1][0])
+ elif not stable_version and major == version__:
+ stable_format = "-- not yet --"
+ versions = "-- not yet --"
+ formats = "%s - %s" % (version[1][0], version[1][-1])
else:
- formats = "%s - %s" % (version[1][-1], version[1][0])
- out += "%s\n\t%s\n\t%s\n\n" % (major, versions, formats)
+ formats = "%s - %s" % (version[1][0], version[1][-2])
+ stable_format = str(version[1][-1])
+
+ out += template % (major, stable_format, versions, formats)
return out + '\n'
else:
header = self.header
- for line in header + [''] + self.body:
- self.output.write(line+u"\n")
+ for line in header + [u''] + self.body:
+ self.output.write(line+u'\n')
def choose_output(self, output):
file, returns the most likely value, or None otherwise."""
for line in self.header:
- if line[0] != "#":
+ if line[0:1] != b"#":
return None
- line = line.replace("fix",".")
+ line = line.replace(b"fix",b".")
# need to test original_tex2lyx_version first because tex2lyx
# writes "#LyX file created by tex2lyx 2.2"
result = original_tex2lyx_version.match(line)
result = original_version.match(line)
if result:
# Special know cases: reLyX and KLyX
- if line.find("reLyX") != -1 or line.find("KLyX") != -1:
+ if line.find(b"reLyX") != -1 or line.find(b"KLyX") != -1:
return "0.12"
if result:
res = result.group(1)
if not res:
self.warning(line)
#self.warning("Version %s" % result.group(1))
- return res
+ return res.decode('ascii') if not PY2 else res
self.warning(str(self.header[:2]))
return None
#Note that the module will be added at the END of the extant ones
def add_module(self, module):
+ " Append module to the modules list."
i = find_token(self.header, "\\begin_modules", 0)
if i == -1:
#No modules yet included
self.header.insert(j, module)
+ def del_module(self, module):
+ " Delete `module` from module list, return success."
+ modlist = self.get_module_list()
+ if module not in modlist:
+ return False
+ self.set_module_list([line for line in modlist if line != module])
+ return True
+
def get_module_list(self):
+ " Return list of modules."
i = find_token(self.header, "\\begin_modules", 0)
if (i == -1):
return []
def set_module_list(self, mlist):
- modbegin = find_token(self.header, "\\begin_modules", 0)
- newmodlist = ['\\begin_modules'] + mlist + ['\\end_modules']
- if (modbegin == -1):
+ i = find_token(self.header, "\\begin_modules", 0)
+ if (i == -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
+ i = j = tclass + 1
+ else:
+ j = find_token(self.header, "\\end_modules", i)
+ if j == -1:
+ self.warning("(set_module_list) Malformed LyX document: No \\end_modules.")
+ return
+ j += 1
+ if mlist:
+ mlist = ['\\begin_modules'] + mlist + ['\\end_modules']
+ self.header[i:j] = mlist
def set_parameter(self, param, value):
return mode, steps
+ def append_local_layout(self, new_layout):
+ " Append `new_layout` to the local layouts."
+ # new_layout may be a string or a list of strings (lines)
+ try:
+ new_layout = new_layout.splitlines()
+ except AttributeError:
+ pass
+ i = find_token(self.header, "\\begin_local_layout", 0)
+ if i == -1:
+ k = find_token(self.header, "\\language", 0)
+ if k == -1:
+ # this should not happen
+ self.warning("Malformed LyX document! No \\language header found!")
+ return
+ self.header[k : k] = ["\\begin_local_layout", "\\end_local_layout"]
+ i = k
+
+ j = find_end_of(self.header, i, "\\begin_local_layout", "\\end_local_layout")
+ if j == -1:
+ # this should not happen
+ self.warning("Malformed LyX document: Can't find end of local layout!")
+ return
+
+ self.header[i+1 : i+1] = new_layout
+
+ def del_local_layout(self, layout_def):
+ " Delete `layout_def` from local layouts, return success."
+ i = find_complete_lines(self.header, layout_def)
+ if i == -1:
+ return False
+ j = i+len(layout_def)
+ if (self.header[i-1] == "\\begin_local_layout" and
+ self.header[j] == "\\end_local_layout"):
+ i -=1
+ j +=1
+ self.header[i:j] = []
+ return True
+
+ def del_from_header(self, lines):
+ " Delete `lines` from the document header, return success."
+ i = find_complete_lines(self.header, lines)
+ if i == -1:
+ return False
+ j = i + len(lines)
+ self.header[i:j] = []
+ return True
+
# Part of an unfinished attempt to make lyx2lyx gave a more
# structured view of the document.
# def get_toc(self, depth = 4):