]> git.lyx.org Git - features.git/blob - lib/lyx2lyx/lyx2lyx
Convert vertical spaces to new format
[features.git] / lib / lyx2lyx / lyx2lyx
1 #! /usr/bin/env python
2 # -*- coding: iso-8859-1 -*-
3 # Copyright (C) 2002-2003 José Matos <jamatos@lyx.org>
4 #
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.
9 #
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.
14 #
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.
18
19 import getopt, sys, string, re
20 from error import error, warning
21 from parser_tools import set_comment, set_format, check_token
22 import gzip
23
24 version = "1.4.0cvs"
25
26 # Allow the dummy object to be able to carry related data
27 # like a C struct
28 class struct:
29     pass
30
31 # options object, with default values
32 opt = struct()
33
34 opt.output = sys.stdout
35 opt.input = sys.stdin
36 opt.start = None
37 opt.end = None
38 opt.quiet = 0
39
40 format = re.compile(r"(\d)[\.,]?(\d\d)")
41 fileformat = re.compile(r"\\lyxformat\s*(\S*)")
42 lst_ft = [210, 215, 216, 217,  218, 220, 221, 223, 224, 225]
43
44 def usage():
45     print """Usage: lyx2lyx [options] [file]
46 Convert old lyx file <file> to newer format, files can be compressed with gzip.
47 If there no file is specified then the standard input is assumed, in this case
48 gziped files are not handled.
49 Options:
50     -h, --help                  this information
51     -v, --version               output version information and exit
52     -l, --list                  list all available formats
53     -d, --debug level           level=0..2 (O_ no debug information,2_verbose)
54                                 default: level=1
55     -f, --from version          initial version (optional)
56     -t, --to version            final version (optional)
57     -o, --output name           name of the output file or else goes to stdout
58     -q, --quiet                 same as --debug=0"""
59
60
61 def parse_options(argv):
62     _options =  ["help", "version", "list", "debug=", "from=", "to=", "output=", "quiet"]
63     try:
64        opts, args = getopt.getopt(argv[1:], "d:f:hlo:qt:v", _options)
65     except getopt.error:
66         usage()
67         sys.exit(2)
68
69     for o, a in opts:
70         if o in ("-h", "--help"):
71             usage()
72             sys.exit()
73         if o in ("-v", "--version"):
74             print "lyxconvert, version %s" %(version)
75             print "Copyright (C) 2002-2003 José Matos and Dekel Tsur"
76             sys.exit()
77         if o in ("-d", "--debug"):
78             opt.debug = int(a)
79         if o in ("-q", "--quiet"):
80             opt.debug = 0
81         if o in ("-l", "--list"):
82             print lst_ft
83             sys.exit()
84         if o in ("-o", "--output"):
85             opt.output = open(a, "w")
86         if o in ("-f", "--from"):
87             opt.start = lyxformat(a)
88         if o in ("-t", "--to"):
89             opt.end = lyxformat(a)
90
91     if not opt.end:
92         opt.end = lst_ft[len(lst_ft)-1]
93
94     if args:
95         file = args[0]
96         try:
97             gzip.open(file).readline()
98             opt.output = gzip.GzipFile("","wb",6,opt.output)
99             opt.input = gzip.open(file)
100         except:
101             opt.input = open(file)
102
103 def lyxformat(fmt):
104     result = format.match(fmt)
105     if result:
106         fmt = int(result.group(1) + result.group(2))
107     else:
108         sys.stderr.write(str(fmt) + ": " + error.invalid_format)
109         sys.exit(2)
110
111     if fmt in lst_ft:
112         return fmt
113
114     sys.stderr.write(fmt + ": " + error.format_not_supported)
115     sys.exit(1)
116
117 def read_file(file, header, body):
118     """Reads a file into the header and body parts"""
119     fmt = None
120     preamble = 0
121
122     while 1:
123         line = file.readline()
124         if not line:
125             sys.stderr.write(error.invalid_file)
126             sys.exit(3)
127
128         line = line[:-1]
129         if check_token(line, '\\begin_preamble'):
130             preamble = 1
131         if check_token(line, '\\end_preamble'):
132             preamble = 0
133
134         if not preamble:
135             line = string.strip(line)
136
137         if not line and not preamble:
138             break
139
140         header.append(line)
141         result = fileformat.match(line)
142         if result:
143             fmt = lyxformat(result.group(1))
144
145     while 1:
146         line = file.readline()
147         if not line:
148             break
149         body.append(line[:-1])
150
151     if not fmt:
152         sys.stderr.write(error.invalid_file)
153         sys.exit(3)
154     return fmt
155
156 def write_file(file, header, body):
157     for line in header:
158         file.write(line+"\n")
159     file.write("\n")
160     for line in body:
161         file.write(line+"\n")
162
163 def main(argv):
164     parse_options(argv)
165
166     header, body = [], []
167     fmt =  read_file(opt.input, header, body)
168
169     if opt.start:
170         if opt.start != fmt:
171             sys.stderr.write("%s: %s %s\n" % (warning.dont_match, opt.start, fmt))
172     else:
173         opt.start = fmt
174
175     # Convertion chain
176     if opt.start < opt.end:
177         mode = "lyxconvert_"
178     else:
179         lst_ft.reverse()
180         mode = "lyxrevert_"
181
182     start = lst_ft.index(opt.start)
183     end = lst_ft.index(opt.end)
184
185     for fmt in lst_ft[start:end]:
186         __import__(mode + str(fmt)).convert(header,body)
187
188     set_comment(header, version)
189     set_format(header, opt.end)
190     write_file(opt.output, header, body)
191
192 if __name__ == "__main__":
193     main(sys.argv)