mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-22 18:08:10 +00:00
6785e442cf
Support all lyx files (support goes to lyx-0.6 the first public available lyx version). Fine tune the guessing of the lyx version used to produce the document (only useful for 2.10 and 2.15 documents). Support to convertion to utf-8 encoding was added but it is not (yet) active. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@14558 a592a061-630c-0410-9148-cb99ea01b6c8
342 lines
9.5 KiB
Python
342 lines
9.5 KiB
Python
# This file is part of lyx2lyx
|
|
# -*- coding: utf-8 -*-
|
|
# Copyright (C) 2003-2004 José Matos <jamatos@lyx.org>
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
""" Convert files to the file format generated by lyx 0.12"""
|
|
|
|
import re
|
|
from parser_tools import find_token, find_re, check_token
|
|
|
|
|
|
def space_before_layout(document):
|
|
" Remove empty line before \\layout. "
|
|
lines = document.body
|
|
i = 2 # skip first layout
|
|
while 1:
|
|
i = find_token(lines, '\\layout', i)
|
|
if i == -1:
|
|
break
|
|
|
|
prot_space = lines[i-2].find('\\protected_separator')
|
|
if lines[i - 1] == '' and prot_space == -1:
|
|
del lines[i-1]
|
|
i = i + 1
|
|
|
|
|
|
def formula_inset_space_eat(document):
|
|
" Remove space after inset formula."
|
|
lines = document.body
|
|
i = 0
|
|
while 1:
|
|
i = find_token(lines, "\\begin_inset Formula", i)
|
|
if i == -1:
|
|
break
|
|
|
|
if len(lines[i]) > 22 and lines[i][21] == ' ':
|
|
lines[i] = lines[i][:20] + lines[i][21:]
|
|
i = i + 1
|
|
|
|
|
|
def update_tabular(document):
|
|
" Update from tabular format 1 or 2 to 4."
|
|
lines = document.body
|
|
lyxtable_re = re.compile(r".*\\LyXTable$")
|
|
i = 0
|
|
while 1:
|
|
i = find_re(lines, lyxtable_re, i)
|
|
if i == -1:
|
|
break
|
|
i = i + 1
|
|
format = lines[i][8:]
|
|
|
|
lines[i] = 'multicol4'
|
|
i = i + 1
|
|
rows = int(lines[i].split()[0])
|
|
columns = int(lines[i].split()[1])
|
|
|
|
lines[i] = lines[i] + ' 0 0 -1 -1 -1 -1'
|
|
i = i + 1
|
|
|
|
for j in range(rows):
|
|
lines[i] = lines[i] + ' 0 0'
|
|
i = i + 1
|
|
|
|
for j in range(columns):
|
|
lines[i] = lines[i] + ' '
|
|
i = i + 1
|
|
|
|
while lines[i].strip():
|
|
if not format:
|
|
lines[i] = lines[i] + ' 1 1'
|
|
lines[i] = lines[i] + ' 0 0 0'
|
|
i = i + 1
|
|
|
|
lines[i] = lines[i].strip()
|
|
|
|
|
|
def final_dot(document):
|
|
" Merge lines if the dot is the final character."
|
|
lines = document.body
|
|
i = 0
|
|
while i < len(lines):
|
|
|
|
if lines[i][-1:] == '.' and lines[i+1][:1] != '\\' and \
|
|
lines[i+1][:1] != ' ' and len(lines[i]) + len(lines[i+1])<= 72 \
|
|
and lines[i+1] != '':
|
|
|
|
lines[i] = lines[i] + lines[i+1]
|
|
del lines[i+1]
|
|
else:
|
|
i = i + 1
|
|
|
|
|
|
def update_inset_label(document):
|
|
" Update inset Label."
|
|
lines = document.body
|
|
i = 0
|
|
while 1:
|
|
i = find_token(lines, '\\begin_inset Label', i)
|
|
if i == -1:
|
|
return
|
|
lines[i] = '\\begin_inset LatexCommand \label{' + lines[i][19:] + '}'
|
|
i = i + 1
|
|
|
|
|
|
def update_latexdel(document):
|
|
" Update inset LatexDel."
|
|
lines = document.body
|
|
i = 0
|
|
while 1:
|
|
i = find_token(lines, '\\begin_inset LatexDel', i)
|
|
if i == -1:
|
|
return
|
|
lines[i] = lines[i].replace('\\begin_inset LatexDel',
|
|
'\\begin_inset LatexCommand')
|
|
i = i + 1
|
|
|
|
|
|
def update_vfill(document):
|
|
" Update fill_top and fill_bottom."
|
|
lines = document.body
|
|
for i in range(len(lines)):
|
|
lines[i] = lines[i].replace('\\fill_top',
|
|
'\\added_space_top vfill')
|
|
lines[i] = lines[i].replace('\\fill_bottom',
|
|
'\\added_space_bottom vfill')
|
|
|
|
|
|
def update_space_units(document):
|
|
" Update space units."
|
|
lines = document.body
|
|
added_space_bottom = re.compile(r'\\added_space_bottom ([^ ]*)')
|
|
added_space_top = re.compile(r'\\added_space_top ([^ ]*)')
|
|
for i in range(len(lines)):
|
|
result = added_space_bottom.search(lines[i])
|
|
if result:
|
|
old = '\\added_space_bottom ' + result.group(1)
|
|
new = '\\added_space_bottom ' + str(float(result.group(1))) + 'cm'
|
|
lines[i] = lines[i].replace(old, new)
|
|
|
|
result = added_space_top.search(lines[i])
|
|
if result:
|
|
old = '\\added_space_top ' + result.group(1)
|
|
new = '\\added_space_top ' + str(float(result.group(1))) + 'cm'
|
|
lines[i] = lines[i].replace(old, new)
|
|
|
|
|
|
def remove_cursor(document):
|
|
" Remove cursor, it is not saved on the file anymore."
|
|
lines = document.body
|
|
i = 0
|
|
cursor_re = re.compile(r'.*(\\cursor \d*)')
|
|
while 1:
|
|
i = find_re(lines, cursor_re, i)
|
|
if i == -1:
|
|
break
|
|
cursor = cursor_re.search(lines[i]).group(1)
|
|
lines[i] = lines[i].replace(cursor, '')
|
|
i = i + 1
|
|
|
|
|
|
def remove_empty_insets(document):
|
|
" Remove empty insets."
|
|
lines = document.body
|
|
i = 0
|
|
while 1:
|
|
i = find_token(lines, '\\begin_inset ', i)
|
|
if i == -1:
|
|
break
|
|
if lines[i] == '\\begin_inset ' and lines[i+1] == '\\end_inset ':
|
|
del lines[i]
|
|
del lines[i]
|
|
i = i + 1
|
|
|
|
|
|
def remove_formula_latex(document):
|
|
" Remove formula latex."
|
|
lines = document.body
|
|
i = 0
|
|
while 1:
|
|
i = find_token(lines, '\\latex formula_latex ', i)
|
|
if i == -1:
|
|
break
|
|
del lines[i]
|
|
|
|
i = find_token(lines, '\\latex default', i)
|
|
if i == -1:
|
|
break
|
|
del lines[i]
|
|
|
|
|
|
def add_end_document(document):
|
|
" Add \\the_end to the end of the document."
|
|
lines = document.body
|
|
i = find_token(lines, '\\the_end', 0)
|
|
if i == -1:
|
|
lines.append('\\the_end')
|
|
|
|
|
|
def header_update(document):
|
|
" Update document header."
|
|
lines = document.header
|
|
i = 0
|
|
l = len(lines)
|
|
while i < l:
|
|
if lines[i][-1:] == ' ':
|
|
lines[i] = lines[i][:-1]
|
|
|
|
if check_token(lines[i], '\\epsfig'):
|
|
lines[i] = lines[i].replace('\\epsfig', '\\graphics')
|
|
i = i + 1
|
|
continue
|
|
|
|
if check_token(lines[i], '\\papersize'):
|
|
size = lines[i].split()[1]
|
|
new_size = size
|
|
paperpackage = ""
|
|
|
|
if size == 'usletter':
|
|
new_size = 'letterpaper'
|
|
if size == 'a4wide':
|
|
new_size = 'Default'
|
|
paperpackage = "widemarginsa4"
|
|
|
|
lines[i] = '\\papersize ' + new_size
|
|
i = i + 1
|
|
if paperpackage:
|
|
lines.insert(i, '\\paperpackage ' + paperpackage)
|
|
i = i + 1
|
|
|
|
lines.insert(i,'\\use_geometry 0')
|
|
lines.insert(i + 1,'\\use_amsmath 0')
|
|
i = i + 2
|
|
continue
|
|
|
|
|
|
if check_token(lines[i], '\\baselinestretch'):
|
|
size = lines[i].split()[1]
|
|
if size == '1.00':
|
|
name = 'single'
|
|
elif size == '1.50':
|
|
name = 'onehalf'
|
|
elif size == '2.00':
|
|
name = 'double'
|
|
else:
|
|
name = 'other ' + size
|
|
lines[i] = '\\spacing %s ' % name
|
|
i = i + 1
|
|
continue
|
|
|
|
i = i + 1
|
|
|
|
|
|
def update_latexaccents(document):
|
|
" Update latex accent insets."
|
|
body = document.body
|
|
i = 1
|
|
while 1:
|
|
i = find_token(body, '\\i ', i)
|
|
if i == -1:
|
|
return
|
|
|
|
contents = body[i][2:].strip()
|
|
|
|
if contents.find('{') != -1 and contents.find('}') != -1:
|
|
i = i + 1
|
|
continue
|
|
|
|
if len(contents) == 2:
|
|
contents = contents + '{}'
|
|
elif len(contents) == 3:
|
|
contents = contents[:2] + '{' + contents[2] + '}'
|
|
elif len(contents) == 4:
|
|
if contents[2] == ' ':
|
|
contents = contents[:2] + '{' + contents[3] + '}'
|
|
elif contents[2:4] == '\\i' or contents[2:4] == '\\j':
|
|
contents = contents[:2] + '{' + contents[2:] + '}'
|
|
|
|
body[i] = '\\i ' + contents
|
|
i = i + 1
|
|
|
|
|
|
def obsolete_latex_title(document):
|
|
" Replace layout Latex_Title with Title."
|
|
body = document.body
|
|
i = 0
|
|
while 1:
|
|
i = find_token(body, '\\layout', i)
|
|
if i == -1:
|
|
return
|
|
|
|
if body[i].lower().find('latex_title') != -1:
|
|
body[i] = '\\layout Title'
|
|
|
|
i = i + 1
|
|
|
|
|
|
def remove_inset_latex(document):
|
|
"Replace inset latex with layout LaTeX"
|
|
body = document.body
|
|
|
|
i = 0
|
|
while 1:
|
|
i = find_token(body, '\\begin_inset Latex', i)
|
|
if i == -1:
|
|
return
|
|
|
|
body[i] = body[i].replace('\\begin_inset Latex', '\\layout LaTeX')
|
|
i = find_token(body, '\\end_inset', i)
|
|
if i == -1:
|
|
#this should not happen
|
|
return
|
|
del body[i]
|
|
|
|
|
|
supported_versions = ["0.12.0","0.12.1","0.12"]
|
|
convert = [[215, [header_update, add_end_document, remove_cursor,
|
|
final_dot, update_inset_label, update_latexdel,
|
|
update_space_units, space_before_layout,
|
|
formula_inset_space_eat, update_tabular,
|
|
update_vfill, remove_empty_insets,
|
|
remove_formula_latex, update_latexaccents,
|
|
obsolete_latex_title, remove_inset_latex]]]
|
|
revert = []
|
|
|
|
|
|
if __name__ == "__main__":
|
|
pass
|