]> git.lyx.org Git - lyx.git/blob - lib/lyx2lyx/lyx_1_6.py
- increase fileformat to 286: this has been forgotten in Pavel's PDF-support patch
[lyx.git] / lib / lyx2lyx / lyx_1_6.py
1 # This file is part of lyx2lyx
2 # -*- coding: utf-8 -*-
3 # Copyright (C) 2007 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 """ Convert files to the file format generated by lyx 1.6"""
20
21 import re
22 import unicodedata
23 import sys, os
24
25 from parser_tools import find_token, find_end_of, find_tokens
26
27 ####################################################################
28 # Private helper functions
29
30 def find_end_of_inset(lines, i):
31     " Find end of inset, where lines[i] is included."
32     return find_end_of(lines, i, "\\begin_inset", "\\end_inset")
33
34
35 ####################################################################
36
37 def fix_wrong_tables(document):
38     i = 0
39     while True:
40         i = find_token(document.body, "\\begin_inset Tabular", i)
41         if i == -1:
42             return
43         j = find_end_of_inset(document.body, i + 1)
44         if j == -1:
45             document.warning("Malformed LyX document: Could not find end of tabular.")
46             continue
47
48         m = i + 1
49         nrows = int(document.body[i+1].split('"')[3])
50         ncols = int(document.body[i+1].split('"')[5])
51
52         for l in range(nrows):
53             prev_multicolumn = 0
54             for k in range(ncols):
55                 m = find_token(document.body, '<cell', m)
56
57                 if document.body[m].find('multicolumn') != -1:
58                     multicol_cont = int(document.body[m].split('"')[1])
59
60                     if multicol_cont == 2 and (k == 0 or prev_multicolumn == 0):
61                         document.body[m] = document.body[m][:5] + document.body[m][21:]
62                         prev_multicolumn = 0
63                     else:
64                         prev_multicolumn = multicol_cont
65                 else:
66                     prev_multicolumn = 0
67
68         i = j + 1
69
70
71 def close_begin_deeper(document):
72     i = 0
73     depth = 0
74     while True:
75         i = find_tokens(document.body, ["\\begin_deeper", "\\end_deeper"], i)
76
77         if i == -1:
78             break
79
80         if document.body[i][:13] == "\\begin_deeper":
81             depth += 1
82         else:
83             depth -= 1
84
85         i += 1
86
87     document.body[-2:-2] = ['\\end_deeper' for i in range(depth)]
88
89
90 def long_charstyle_names(document):
91     i = 0
92     while True:
93         i = find_token(document.body, "\\begin_inset CharStyle", i)
94         if i == -1:
95             return
96         document.body[i] = document.body[i].replace("CharStyle ", "CharStyle CharStyle:")
97         i += 1
98
99 def revert_long_charstyle_names(document):
100     i = 0
101     while True:
102         i = find_token(document.body, "\\begin_inset CharStyle", i)
103         if i == -1:
104             return
105         document.body[i] = document.body[i].replace("CharStyle CharStyle:", "CharStyle")
106         i += 1
107
108
109 def axe_show_label(document):
110     i = 0
111     while True:
112         i = find_token(document.body, "\\begin_inset CharStyle", i)
113         if i == -1:
114             return
115         if document.body[i + 1].find("show_label") != -1:
116             if document.body[i + 1].find("true") != -1:
117                 document.body[i + 1] = "status open"
118                 del document.body[ i + 2]
119             else:
120                 if document.body[i + 1].find("false") != -1:
121                     document.body[i + 1] = "status collapsed"
122                     del document.body[ i + 2]
123                 else:
124                     document.warning("Malformed LyX document: show_label neither false nor true.")
125         else:
126             document.warning("Malformed LyX document: show_label missing in CharStyle.")
127             
128         i += 1
129
130
131 def revert_show_label(document):
132     i = 0
133     while True:
134         i = find_token(document.body, "\\begin_inset CharStyle", i)
135         if i == -1:
136             return
137         if document.body[i + 1].find("status open") != -1:
138             document.body.insert(i + 1, "show_label true")
139         else:
140             if document.body[i + 1].find("status collapsed") != -1:
141                 document.body.insert(i + 1, "show_label false")
142             else:
143                 document.warning("Malformed LyX document: no legal status line in CharStyle.")
144         i += 1
145
146 def revert_begin_modules(document):
147     i = 0
148     while True:
149         i = find_token(document.header, "\\begin_modules", i)
150         if i == -1:
151             return
152         j = find_end_of(document.header, i, "\\begin_modules", "\\end_modules")
153         if j == -1:
154             # this should not happen
155             break
156         document.header[i : j + 1] = []
157
158 def convert_flex(document):
159     "Convert CharStyle to Flex"
160     i = 0
161     while True:
162         i = find_token(document.body, "\\begin_inset CharStyle", i)
163         if i == -1:
164             return
165         document.body[i] = document.body[i].replace('\\begin_inset CharStyle', '\\begin_inset Flex')
166
167 def revert_flex(document):
168     "Convert Flex to CharStyle"
169     i = 0
170     while True:
171         i = find_token(document.body, "\\begin_inset Flex", i)
172         if i == -1:
173             return
174         document.body[i] = document.body[i].replace('\\begin_inset Flex', '\\begin_inset CharStyle')
175
176
177 def remove_manifest(document):
178     "Remove the manifest section"
179     document.manifest = None
180
181 ##
182 #  Discard PDF options for hyperref
183 #
184
185 def revert_pdf_options(document):
186         "Revert PDF options for hyperref. "
187         i = 0
188         i = find_token(document.header, "\\use_hyperref", i)
189         if i != -1:
190             del document.header[i]
191         i = find_token(document.header, "\\pdf_store_options", i)
192         if i != -1:
193             del document.header[i]
194         i = find_token(document.header, "\\pdf_title", 0)
195         if i != -1:
196             del document.header[i]
197         i = find_token(document.header, "\\pdf_author", 0)
198         if i != -1:
199             del document.header[i]
200         i = find_token(document.header, "\\pdf_subject", 0)
201         if i != -1:
202             del document.header[i]
203         i = find_token(document.header, "\\pdf_keywords", 0)
204         if i != -1:
205             del document.header[i]
206         i = find_token(document.header, "\\pdf_bookmarks", 0)
207         if i != -1:
208             del document.header[i]
209         i = find_token(document.header, "\\pdf_bookmarksnumbered", i)
210         if i != -1:
211             del document.header[i]
212         i = find_token(document.header, "\\pdf_bookmarksopen", i)
213         if i != -1:
214             del document.header[i]
215         i = find_token(document.header, "\\pdf_bookmarksopenlevel", i)
216         if i != -1:
217             del document.header[i]
218         i = find_token(document.header, "\\pdf_breaklinks", i)
219         if i != -1:
220             del document.header[i]
221         i = find_token(document.header, "\\pdf_pdfborder", i)
222         if i != -1:
223             del document.header[i]
224         i = find_token(document.header, "\\pdf_colorlinks", i)
225         if i != -1:
226             del document.header[i]
227         i = find_token(document.header, "\\pdf_backref", i)
228         if i != -1:
229             del document.header[i]
230         i = find_token(document.header, "\\pdf_pagebackref", i)
231         if i != -1:
232             del document.header[i]
233         i = find_token(document.header, "\\pdf_pagemode", 0)
234         if i != -1:
235             del document.header[i]
236         i = find_token(document.header, "\\pdf_quoted_options", 0)
237         if i != -1:
238             del document.header[i]
239
240
241 def remove_inzip_options(document):
242     "Remove inzipName and embed options from the Graphics inset"
243     i = 0
244     while 1:
245         i = find_token(document.body, "\\begin_inset Graphics", i)
246         if i == -1:
247             return
248         j = find_end_of_inset(document.body, i + 1)
249         if j == -1:
250             # should not happen
251             document.warning("Malformed LyX document: Could not find end of graphics inset.")
252         # If there's a inzip param, just remove that
253         k = find_token(document.body, "\tinzipName", i + 1, j)
254         if k != -1:
255             del document.body[k]
256             # embed option must follow the inzipName option
257             del document.body[k+1]
258         i = i + 1
259
260
261 ##
262 # Conversion hub
263 #
264
265 supported_versions = ["1.6.0","1.6"]
266 convert = [
267            [277, [fix_wrong_tables]],
268            [278, [close_begin_deeper]],
269            [279, [long_charstyle_names]],
270            [280, [axe_show_label]],
271            [281, []],
272            [282, []],
273            [283, [convert_flex]],
274            [284, []],
275            [285, []], # an empty manifest is automatically added
276            [286, []]
277           ]
278
279 revert =  [
280            [285, [revert_pdf_options]],
281            [284, [remove_manifest, remove_inzip_options]],
282            [283, []],
283            [282, [revert_flex]],
284            [281, []],
285            [280, [revert_begin_modules]],
286            [279, [revert_show_label]],
287            [278, [revert_long_charstyle_names]],
288            [277, []],
289            [276, []]
290           ]
291
292
293 if __name__ == "__main__":
294     pass