2 # -*- coding: iso-8859-1 -*-
3 # Copyright (C) 2002-2003 José Matos <jamatos@lyx.org>
5 # This program is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU General Public License
7 # as published by the Free Software Foundation; either version 2
8 # of the License, or (at your option) any later version.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 import getopt, sys, string, re
20 from error import error, warning
21 from parser_tools import set_comment, set_format, check_token
26 # Allow the dummy object to be able to carry related data
31 # options object, with default values
34 opt.output = sys.stdout
41 format = re.compile(r"(\d)[\.,]?(\d\d)")
42 fileformat = re.compile(r"\\lyxformat\s*(\S*)")
43 lst_ft = [210, 215, 216, 217, 218, 220, 221, 223, 224, 225, 226, 227, 228]
46 print """Usage: lyx2lyx [options] [file]
47 Convert old lyx file <file> to newer format, files can be compressed with gzip.
48 If there no file is specified then the standard input is assumed, in this case
49 gziped files are not handled.
51 -h, --help this information
52 -v, --version output version information and exit
53 -l, --list list all available formats
54 -d, --debug level level=0..2 (O_ no debug information,2_verbose)
56 -e, --err error_file name of the error file or else goes to stderr
57 -f, --from version initial version (optional)
58 -t, --to version final version (optional)
59 -o, --output name name of the output file or else goes to stdout
60 -q, --quiet same as --debug=0"""
63 def parse_options(argv):
64 _options = ["help", "version", "list", "debug=", "err=", "from=", "to=", "output=", "quiet"]
66 opts, args = getopt.getopt(argv[1:], "d:e:f:hlo:qt:v", _options)
72 if o in ("-h", "--help"):
75 if o in ("-v", "--version"):
76 print "lyxconvert, version %s" %(version)
77 print "Copyright (C) 2002-2003 José Matos and Dekel Tsur"
79 if o in ("-d", "--debug"):
81 if o in ("-q", "--quiet"):
83 if o in ("-l", "--list"):
86 if o in ("-o", "--output"):
87 opt.output = open(a, "w")
88 if o in ("-f", "--from"):
89 opt.start = lyxformat(a)
90 if o in ("-t", "--to"):
91 opt.end = lyxformat(a)
92 if o in ("-e","--err"):
93 opt.err = open(a, "w")
96 opt.end = lst_ft[len(lst_ft)-1]
101 gzip.open(file).readline()
102 opt.output = gzip.GzipFile("","wb",6,opt.output)
103 opt.input = gzip.open(file)
105 opt.input = open(file)
108 result = format.match(fmt)
110 fmt = int(result.group(1) + result.group(2))
112 opt.err.write(str(fmt) + ": " + error.invalid_format)
118 opt.err.write(str(fmt) + ": " + error.format_not_supported)
121 def read_file(file, header, body):
122 """Reads a file into the header and body parts"""
127 line = file.readline()
129 opt.err.write(error.invalid_file)
133 if check_token(line, '\\begin_preamble'):
135 if check_token(line, '\\end_preamble'):
139 line = string.strip(line)
141 if not line and not preamble:
145 result = fileformat.match(line)
147 fmt = lyxformat(result.group(1))
150 line = file.readline()
153 body.append(line[:-1])
156 opt.err.write(error.invalid_file)
160 def write_file(file, header, body):
162 file.write(line+"\n")
165 file.write(line+"\n")
170 header, body = [], []
171 fmt = read_file(opt.input, header, body)
175 opt.err.write("%s: %s %s\n" % (warning.dont_match, opt.start, fmt))
180 if opt.start < opt.end:
186 start = lst_ft.index(opt.start)
187 end = lst_ft.index(opt.end)
189 for fmt in lst_ft[start:end]:
190 __import__(mode + str(fmt)).convert(header,body)
192 set_comment(header, version)
193 set_format(header, opt.end)
194 write_file(opt.output, header, body)
196 if __name__ == "__main__":