1 # This document is part of lyx2lyx
2 # -*- coding: utf-8 -*-
3 # Copyright (C) 2002-2004 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 """ Convert files to the file format generated by lyx 1.1.5"""
22 from parser_tools
import find_token
, find_token_backwards
, find_re
24 ####################################################################
25 # Private helper functions
27 def get_layout(line
, default_layout
):
28 " Get the line layout, beware of the empty layout."
35 ####################################################################
37 math_env
= ["\\[","\\begin{eqnarray*}","\\begin{eqnarray}","\\begin{equation}"]
39 def replace_protected_separator(document
):
40 " Replace protected separator. "
44 i
= find_token(lines
, "\\protected_separator", i
)
47 j
= find_token_backwards(lines
, "\\layout", i
)
48 #if j == -1: print error
49 layout
= get_layout(lines
[j
], document
.default_layout
)
51 if layout
== "LyX-Code":
53 while lines
[i
] == "\\protected_separator ":
57 lines
[i
-1] = lines
[i
-1] + result
+ lines
[i
]
59 lines
[i
-1] = lines
[i
-1]+ "\\SpecialChar ~"
64 def merge_formula_inset(document
):
65 " Merge formula insets. "
69 i
= find_token(lines
, "\\begin_inset Formula", i
)
71 if lines
[i
+1] in math_env
:
72 lines
[i
] = lines
[i
] + lines
[i
+1]
77 def update_tabular(document
):
78 " Update from tabular format 4 to 5 if necessary. "
80 lyxtable_re
= re
.compile(r
".*\\LyXTable$")
83 i
= find_re(lines
, lyxtable_re
, i
)
93 rows
= int(lines
[i
].split()[0])
94 columns
= int(lines
[i
].split()[1])
97 for j
in range(columns
):
98 col_info
= lines
[i
].split()
99 if len(col_info
) == 3:
100 lines
[i
] = lines
[i
] + '"" ""'
102 lines
[i
] = " ".join(col_info
[:3]) + ' "%s" ""' % col_info
[3]
106 lines
[i
] = lines
[i
] + ' "" ""'
110 def update_toc(document
):
111 " Update table of contents. "
112 lines
= document
.body
115 i
= find_token(lines
,
116 '\\begin_inset LatexCommand \\tableofcontents', i
)
119 lines
[i
] = lines
[i
] + '{}'
123 def remove_cursor(document
):
125 lines
= document
.body
126 i
= find_token(lines
, '\\cursor', 0)
131 def remove_vcid(document
):
132 " Remove \\lyxvcid and \\lyxrcsid. "
133 lines
= document
.header
134 i
= find_token(lines
, '\\lyxvcid', 0)
137 i
= find_token(lines
, '\\lyxrcsid', 0)
142 def first_layout(document
):
143 " Fix first layout, if empty use the default layout."
144 lines
= document
.body
145 while (lines
[0] == ""):
147 if lines
[0][:7] != "\\layout":
148 lines
[:0] = ['\\layout %s' % document
.default_layout
, '']
151 def remove_space_in_units(document
):
152 " Remove space in units. "
153 lines
= document
.header
154 margins
= ["\\topmargin","\\rightmargin",
155 "\\leftmargin","\\bottommargin"]
157 unit_rexp
= re
.compile(r
'[^ ]* (.*) (.*)')
159 for margin
in margins
:
162 i
= find_token(lines
, margin
, i
)
166 result
= unit_rexp
.search(lines
[i
])
168 lines
[i
] = margin
+ " " + result
.group(1) + result
.group(2)
172 def latexdel_getargs(document
, i
):
173 " Get arguments from latexdel insets. "
174 lines
= document
.body
176 # play safe, clean empty lines
182 j
= find_token(lines
, '\\end_inset', i
)
187 document
.warning("Unexpected end of inset.")
188 j
= find_token(lines
, '\\begin_inset LatexDel }{', i
)
190 ref
= " ".join(lines
[i
:j
])
193 # play safe, clean empty lines
199 j
= find_token(lines
, '\\end_inset', i
- 1)
203 document
.warning("Unexpected end of inset.")
204 j
= find_token(lines
, '\\begin_inset LatexDel }', i
)
205 label
= " ".join(lines
[i
:j
])
211 def update_ref(document
):
212 " Update reference inset. "
213 lines
= document
.body
216 i
= find_token(lines
, '\\begin_inset LatexCommand', i
)
220 if lines
[i
].split()[-1] == "\\ref{":
222 ref
, label
= latexdel_getargs(document
, i
)
223 lines
[i
- 1] = "%s[%s]{%s}" % (lines
[i
- 1][:-1], ref
, label
)
228 def update_latexdel(document
):
229 " Remove latexdel insets. "
230 lines
= document
.body
232 latexdel_re
= re
.compile(r
".*\\begin_inset LatexDel")
234 i
= find_re(lines
, latexdel_re
, i
)
237 lines
[i
] = lines
[i
].replace('\\begin_inset LatexDel',
238 '\\begin_inset LatexCommand')
240 j
= lines
[i
].find('\\begin_inset')
241 lines
.insert(i
+1, lines
[i
][j
:])
242 lines
[i
] = lines
[i
][:j
].strip()
245 if lines
[i
].split()[-1] in ("\\url{", "\\htmlurl{"):
248 ref
, label
= latexdel_getargs(document
, i
)
249 lines
[i
-1] = "%s[%s]{%s}" % (lines
[i
-1][:-1], label
, ref
)
254 supported_versions
= ["1.1.5","1.1.5fix1","1.1.5fix2","1.1"]
255 convert
= [[216, [first_layout
, remove_vcid
, remove_cursor
,
256 update_toc
, replace_protected_separator
,
257 merge_formula_inset
, update_tabular
,
258 remove_space_in_units
, update_ref
,
263 if __name__
== "__main__":