whitespace, bugfixes, and convertions dependent on the document type, if need.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8749 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
José Matox 2004-05-11 16:13:33 +00:00
parent d8c5a828fa
commit 34b9ed8ac9
6 changed files with 186 additions and 32 deletions

View File

@ -1,3 +1,7 @@
2004-05-11 José Matos <jamatos@lyx.org>
* layouts/db_stdtitle.inc: obsolete FirstName and Surname.
2004-05-03 José Matos <jamatos@lyx.org>
* scripts/legacy_lyxpreview2ppm.py: bug fix for temporary file

View File

@ -20,7 +20,6 @@ End
Style Author
LatexType Environment
LatexName author
KeepEmpty 1
End
@ -32,30 +31,6 @@ Style Authorgroup
End
Style FirstName
Margin Static
LatexType Paragraph
LatexName firstname
ParIndent MM
ParSkip 0.4
Align Center
AlignPossible Center
LabelType No_Label
End
Style Surname
Margin Static
LatexType Paragraph
LatexName surname
ParIndent MM
ParSkip 0.4
Align Center
AlignPossible Center
LabelType No_Label
End
Style Date
LatexType Paragraph
LatexName date
@ -116,3 +91,12 @@ Style RevisionRemark
AlignPossible Block
LabelType No_Label
End
Style FirstName
ObsoletedBy Standard
End
Style Surname
ObsoletedBy Standard
End

View File

@ -1,3 +1,16 @@
2004-05-11 José Matos <jamatos@lyx.org>
* parser_tools.py (get_backend): get the document backend.
* lyx2lyx (main): new member of the document structure,
the textclass and backend, that default to article and latex.
* lyx_1_4.py (add_end_layout): fix bug of mixed \begin_deeper
and \end_layout
(insert_tracking_changes): insert \tracking_changes 0, if not present
in the header.
(convert_names, revert_names): for docbook documents transform
the styles FirstName and Surname into character styles.
2004-05-03 José Matos <jamatos@lyx.org>
* lyx_1_4.py (convert_graphics):

View File

@ -21,7 +21,8 @@ import gzip
import sys
import os.path
from parser_tools import read_file, write_file, read_version, set_version, \
read_format, set_format, chain, lyxformat, get_value
read_format, set_format, chain, lyxformat, get_value, get_backend
# Allow the dummy object to be able to carry related data
# like a C struct
@ -34,6 +35,8 @@ class struct:
self.dir = ""
self.start = None
self.end = None
self.backend = "latex"
self.textclass = "article"
def warning(self, message, debug_level= 1):
if debug_level <= self.debug:
@ -44,6 +47,7 @@ class struct:
self.warning("Quiting.")
sys.exit(1)
def usage():
print """Usage: lyx2lyx [options] [file]
Convert old lyx file <file> to newer format, files can be compressed with gzip.
@ -104,6 +108,7 @@ def parse_options(argv, version, opt):
except:
opt.input = open(file)
def main(argv):
version = "1.4.0cvs"
@ -117,6 +122,9 @@ def main(argv):
read_file(header, body, opt)
initial_version = read_version(header)
opt.textclass = get_value(header, "\\textclass", 0)
opt.backend = get_backend( opt.textclass)
opt.format = read_format(header, opt)
opt.language = get_value(header, "\\language", 0)
if opt.language == "":
@ -133,5 +141,6 @@ def main(argv):
set_format(header, opt.format)
write_file(header, body, opt)
if __name__ == "__main__":
main(sys.argv)

View File

@ -248,6 +248,7 @@ def add_end_layout(lines):
i = i + 1
struct_stack = ["\\layout"]
while 1:
i = find_tokens(lines, ["\\begin_inset", "\\end_inset", "\\layout",
"\\begin_deeper", "\\end_deeper", "\\the_end"], i)
@ -262,8 +263,9 @@ def add_end_layout(lines):
if token == "\\end_inset":
tail = struct_stack.pop()
if tail == "\\layout":
lines.insert(i,"")
lines.insert(i,"\\end_layout")
i = i + 1
i = i + 2
#Check if it is the correct tag
struct_stack.pop()
i = i + 1
@ -272,20 +274,32 @@ def add_end_layout(lines):
if token == "\\layout":
tail = struct_stack.pop()
if tail == token:
lines.insert(i,"")
lines.insert(i,"\\end_layout")
i = i + 2
i = i + 3
else:
struct_stack.append(tail)
i = i + 1
struct_stack.append(token)
continue
if token == "\\begin_deeper" or token == "\\end_deeper":
if token == "\\begin_deeper":
lines.insert(i,"")
lines.insert(i,"\\end_layout")
i = i + 2
i = i + 3
struct_stack.append(token)
continue
if token == "\\end_deeper":
lines.insert(i,"")
lines.insert(i,"\\end_layout")
i = i + 3
while struct_stack[-1] != "\\begin_deeper":
struct_stack.pop()
continue
#case \end_document
lines.insert(i, "")
lines.insert(i, "\\end_layout")
return
@ -302,8 +316,13 @@ def rm_end_layout(lines):
##
# Remove change tracking keywords
# Handle change tracking keywords
#
def insert_tracking_changes(lines):
i = find_token(lines, "\\tracking_changes", 0)
if i == -1:
lines.append("\\tracking_changes 0")
def rm_tracking_changes(lines):
i = find_token(lines, "\\author", 0)
if i != -1:
@ -1118,6 +1137,7 @@ def revert_float(lines, opt):
del_token(lines, 'sideways', i, j)
i = i + 1
def convert_graphics(lines, opt):
""" Add extension to filenames of insetgraphics if necessary.
"""
@ -1138,7 +1158,7 @@ def convert_graphics(lines, opt):
# We could use a heuristic and take the current directory,
# and we could try to find out if filename has an extension,
# but that would be just guesses and could be wrong.
opt.warning("""Warning: Can not determine wether file
opt.warning("""Warning: Can not determine whether file
%s
needs an extension when reading from standard input.
You may need to correct the file manually or run
@ -1154,12 +1174,98 @@ def convert_graphics(lines, opt):
lines[j] = replace(lines[j], filename, filename + ".eps")
##
# Convert firstname and surname from styles -> char styles
#
def convert_names(lines, opt):
""" Convert in the docbook backend from firstname and surname style
to charstyles.
"""
if opt.backend != "docbook":
return
i = 0
while 1:
i = find_token(lines, "\\begin_layout Author", i)
if i == -1:
return
i = i + 1
while lines[i] == "":
i = i + 1
if lines[i][:11] != "\\end_layout" or lines[i+2][:13] != "\\begin_deeper":
i = i + 1
continue
k = i
i = find_end_of( lines, i+3, "\\begin_deeper","\\end_deeper")
if i == -1:
# something is really wrong, abort
opt.warning("Missing \\end_deeper,after style Author")
opt.warning("Aborted attempt to parse FirstName and Surname")
return
firstname, surname = "", ""
name = lines[k:i]
j = find_token(name, "\\begin_layout FirstName", 0)
if j != -1:
j = j + 1
while(name[j] != "\\end_layout"):
firstname = firstname + name[j]
j = j + 1
j = find_token(name, "\\begin_layout Surname", 0)
if j != -1:
j = j + 1
while(name[j] != "\\end_layout"):
surname = surname + name[j]
j = j + 1
# delete name
del lines[k+2:i+1]
lines[k-1:k-1] = ["", "",
"\\begin_inset CharStyle Firstname",
"status inlined",
"",
"\\begin_layout Standard",
"",
"%s" % firstname,
"\end_layout",
"",
"\end_inset ",
"",
"",
"\\begin_inset CharStyle Surname",
"status inlined",
"",
"\\begin_layout Standard",
"",
"%s" % surname,
"\\end_layout",
"",
"\\end_inset ",
""]
def revert_names(lines, opt):
""" Revert in the docbook backend from firstname and surname char style
to styles.
"""
if opt.backend != "docbook":
return
##
# Convertion hub
#
def convert(header, body, opt):
if opt.format < 223:
insert_tracking_changes(header)
add_end_header(header)
convert_spaces(body)
convert_bibtex(body)
@ -1220,10 +1326,12 @@ def convert(header, body, opt):
if opt.format < 233:
convert_graphics(body, opt)
convert_names(body, opt)
opt.format = 233
def revert(header, body, opt):
if opt.format > 232:
revert_names(body, opt)
opt.format = 232
if opt.end == opt.format: return

View File

@ -19,11 +19,13 @@
import string
import re
def check_token(line, token):
if line[:len(token)] == token:
return 1
return 0
# We need to check that the char after the token is space, but I think
# we can ignore this
def find_token(lines, token, start, end = 0):
@ -35,6 +37,7 @@ def find_token(lines, token, start, end = 0):
return i
return -1
def find_token2(lines, token, start, end = 0):
if end == 0:
end = len(lines)
@ -44,6 +47,7 @@ def find_token2(lines, token, start, end = 0):
return i
return -1
def find_tokens(lines, tokens, start, end = 0):
if end == 0:
end = len(lines)
@ -54,6 +58,7 @@ def find_tokens(lines, tokens, start, end = 0):
return i
return -1
def find_re(lines, rexp, start, end = 0):
if end == 0:
end = len(lines)
@ -62,6 +67,7 @@ def find_re(lines, rexp, start, end = 0):
return i
return -1
def find_token_backwards(lines, token, start):
m = len(token)
for i in xrange(start, -1, -1):
@ -70,6 +76,7 @@ def find_token_backwards(lines, token, start):
return i
return -1
def find_tokens_backwards(lines, tokens, start):
for i in xrange(start, -1, -1):
line = lines[i]
@ -78,6 +85,7 @@ def find_tokens_backwards(lines, tokens, start):
return i
return -1
def get_value(lines, token, start, end = 0):
i = find_token2(lines, token, start, end)
if i == -1:
@ -87,6 +95,7 @@ def get_value(lines, token, start, end = 0):
else:
return ""
def del_token(lines, token, i, j):
k = find_token2(lines, token, i, j)
if k == -1:
@ -95,6 +104,7 @@ def del_token(lines, token, i, j):
del lines[k]
return j-1
# Finds the paragraph that contains line i.
def get_paragraph(lines, i):
while i != -1:
@ -105,6 +115,7 @@ def get_paragraph(lines, i):
i = find_beginning_of_inset(lines, i)
return -1
# Finds the paragraph after the paragraph that contains line i.
def get_next_paragraph(lines, i):
while i != -1:
@ -114,6 +125,7 @@ def get_next_paragraph(lines, i):
i = find_end_of_inset(lines, i)
return -1
def find_end_of(lines, i, start_token, end_token):
count = 1
n = len(lines)
@ -127,6 +139,7 @@ def find_end_of(lines, i, start_token, end_token):
return i
return -1
# Finds the matching \end_inset
def find_beginning_of(lines, i, start_token, end_token):
count = 1
@ -140,17 +153,21 @@ def find_beginning_of(lines, i, start_token, end_token):
return i
return -1
# Finds the matching \end_inset
def find_end_of_inset(lines, i):
return find_end_of(lines, i, "\\begin_inset", "\\end_inset")
# Finds the matching \end_inset
def find_beginning_of_inset(lines, i):
return find_beginning_of(lines, i, "\\begin_inset", "\\end_inset")
def find_end_of_tabular(lines, i):
return find_end_of(lines, i, "<lyxtabular", "</lyxtabular")
def get_tabular_lines(lines, i):
result = []
i = i+1
@ -166,9 +183,11 @@ def get_tabular_lines(lines, i):
i = i+1
return result
def is_nonempty_line(line):
return line != " "*len(line)
def find_nonempty_line(lines, start, end = 0):
if end == 0:
end = len(lines)
@ -177,6 +196,7 @@ def find_nonempty_line(lines, start, end = 0):
return i
return -1
##
# Tools for file reading
#
@ -209,6 +229,7 @@ def read_file(header, body, opt):
break
body.append(line[:-1])
def write_file(header, body, opt):
for line in header:
opt.output.write(line+"\n")
@ -216,6 +237,7 @@ def write_file(header, body, opt):
for line in body:
opt.output.write(line+"\n")
##
# lyx version
#
@ -231,6 +253,7 @@ def read_version(header):
return result.group(1)
return None
def set_version(lines, version):
lines[0] = "#LyX %s created this file. For more info see http://www.lyx.org/" % version
if lines[1][0] == '#':
@ -256,6 +279,7 @@ format_relation = [("0_10", [210], ["0.10.7","0.10"]),
("1_3", [221], ["1.3.0","1.3.1","1.3.2","1.3.3","1.3.4","1.3"]),
("1_4", [223,224,225,226,227,228,229,230,231,232,233], ["1.4.0cvs","1.4"])]
def lyxformat(format, opt):
result = format_re.match(format)
if result:
@ -269,6 +293,7 @@ def lyxformat(format, opt):
opt.error(str(format) + ": " + "Format no supported.")
return None
def read_format(header, opt):
for line in header:
result = fileformat.match(line)
@ -278,15 +303,26 @@ def read_format(header, opt):
opt.error("Invalid LyX File.")
return None
def set_format(lines, number):
if int(number) <= 217:
number = float(number)/100
i = find_token(lines, "\\lyxformat", 0)
lines[i] = "\\lyxformat %s" % number
def get_end_format():
return format_relation[-1:][0][1][-1:][0]
def get_backend(textclass):
if textclass == "linuxdoc" or textclass == "manpage":
return "linuxdoc"
if textclass[:7] == "docbook":
return "docbook"
return "latex"
def chain(opt, initial_version):
""" This is where all the decisions related with the convertion are taken"""