+2005-08-18 José Matos <jamatos@lyx.org>
+
+ * LyX.py (read, write): add preamble as data member of LyX_Base,
+ remove if from the header.
+
+ * lyx_0_12.py (header_update):
+ * lyx_1_1_5.py (remove_space_in_units):
+ * lyx_1_4.py (add_to_preamble, convert_frameless_box): use the new scheme.
+
+ * lyx_1_2.py (change_header): change name to reflect its content.
+
2005-07-29 José Matos <jamatos@lyx.org>
* lyx_1_4.py:
return "latex"
+def trim_eol(line):
+ " Remove end of line char(s)."
+ if line[-2:-1] == '\r':
+ return line[:-2]
+ else:
+ return line[:-1]
+
+
##
# Class
#
self.backend = "latex"
self.textclass = "article"
self.header = []
+ self.preamble = []
self.body = []
self.status = 0
def read(self):
"""Reads a file into the self.header and self.body parts, from self.input."""
- preamble = 0
while 1:
line = self.input.readline()
if not line:
self.error("Invalid LyX file.")
- line = line[:-1]
- # remove '\r' from line's end, if present
- if line[-1:] == '\r':
- line = line[:-1]
-
+ line = trim_eol(line)
if check_token(line, '\\begin_preamble'):
- preamble = 1
- if check_token(line, '\\end_preamble'):
- preamble = 0
+ while 1:
+ line = self.input.readline()
+ if not line:
+ self.error("Invalid LyX file.")
- if not preamble:
- line = string.strip(line)
+ line = trim_eol(line)
+ if check_token(line, '\\end_preamble'):
+ break
+
+ if string.split(line)[:0] in ("\\layout", "\\begin_layout", "\\begin_body"):
+ self.warning("Malformed LyX file: Missing '\\end_preamble'.")
+ self.warning("Adding it now and hoping for the best.")
- if not preamble:
- if not line:
- continue
+ self.preamble.append(line)
- if string.split(line)[0] in ("\\layout", "\\begin_layout", "\\begin_body"):
- self.body.append(line)
- break
+ if check_token(line, '\\end_preamble'):
+ continue
+
+ line = string.strip(line)
+ if not line:
+ continue
+
+ if string.split(line)[0] in ("\\layout", "\\begin_layout", "\\begin_body"):
+ self.body.append(line)
+ break
self.header.append(line)
line = self.input.readline()
if not line:
break
- # remove '\r' from line's end, if present
- if line[-2:-1] == '\r':
- self.body.append(line[:-2])
- else:
- self.body.append(line[:-1])
+ self.body.append(trim_eol(line))
self.textclass = get_value(self.header, "\\textclass", 0)
self.backend = get_backend(self.textclass)
self.set_version()
self.set_format()
- for line in self.header:
- self.output.write(line+"\n")
- self.output.write("\n")
- for line in self.body:
+ 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:]
+ else:
+ header = self.header
+
+ for line in header + [''] + self.body:
self.output.write(line+"\n")
i = 0
l = len(lines)
while i < l:
- if check_token(lines[i], '\\begin_preamble'):
- i = find_token(lines, '\\end_preamble', i)
- if i == -1:
- file.error('Unfinished preamble')
- i = i + 1
- continue
-
if lines[i][-1:] == ' ':
lines[i] = lines[i][:-1]
unit_rexp = re.compile(r'[^ ]* (.*) (.*)')
- begin_preamble = find_token(lines,"\\begin_preamble", 0)
- end_preamble = find_token(lines, "\\end_preamble", 0)
for margin in margins:
i = 0
while 1:
if i == -1:
break
- if i > begin_preamble and i < end_preamble:
- i = i + 1
- continue
-
result = unit_rexp.search(lines[i])
if result:
lines[i] = margin + " " + result.group(1) + result.group(2)
i = i+5
-def change_preamble(file):
+def change_header(file):
lines = file.header
i = find_token(lines, "\\use_amsmath", 0)
if i == -1:
"\use_numerical_citations 0"]
-convert = [[220, [change_preamble, change_listof, fix_oldfloatinset,
+convert = [[220, [change_header, change_listof, fix_oldfloatinset,
update_tabular, update_longtables, remove_pextra,
remove_oldfloat, remove_figinset, remove_oldertinset,
remove_oldert, combine_ert, change_infoinset]]]
# Add text to the preamble if it is not already there.
# Only the first line is checked!
def add_to_preamble(file, text):
- i = find_token(file.header, '\\begin_preamble', 0)
- if i == -1:
- file.header.extend(['\\begin_preamble'] + text + ['\\end_preamble'])
+ if find_token(file.preamble, text[0]) != -1:
return
- j = find_token(file.header, '\\end_preamble', i)
- if j == -1:
- file.warning("Malformed LyX file: Missing '\\end_preamble'.")
- file.warning("Adding it now and hoping for the best.")
- file.header.append('\\end_preamble')
- j = len(file.header)
-
- if find_token(file.header, text[0], i, j) != -1:
- return
- file.header[j:j] = text
+ file.preamble.extend(text)
def convert_frameless_box(file):
paperpackage = split(file.header[i])[1]
if paperpackage in ("a4", "a4wide", "widemarginsa4"):
- j = find_token(file.header, '\\begin_preamble', 0)
conv = {"a4":"\\usepackage{a4}","a4wide": "\\usepackage{a4wide}",
"widemarginsa4": "\\usepackage[widemargins]{a4}"}
- if j == -1:
- # Add preamble
- j = len(file.header) - 2
- file.header[j:j]=["\\begin_preamble",
- conv[paperpackage],"\\end_preamble"]
- i = i + 3
- else:
- file.header[j+1:j+1] = [conv[paperpackage]]
- i = i + 1
+ # for compatibility we ensure it is the first entry in preamble
+ file.preamble[0:0] = conv[paperpackage]
- print i, file.header[i]
del file.header[i]
i = find_token(file.header, '\\papersize', 0)