mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-28 12:26:59 +00:00
44e0940d75
This is similar to what we have in C++ code where we order the standard includes to be easier to read. This is a readability change only.
154 lines
5.3 KiB
Python
154 lines
5.3 KiB
Python
# This file is part of lyx2lyx
|
|
# Copyright (C) 2002-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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
"""Convert files to the file format generated by lyx 1.1.6, fix3 and fix4"""
|
|
|
|
import re
|
|
|
|
from parser_tools import find_re, find_token
|
|
|
|
|
|
def bool_table(item):
|
|
"Convert 0, 1 to false, true."
|
|
if item == "0":
|
|
return "false"
|
|
# should emit a warning if item != "1"
|
|
return "true"
|
|
|
|
|
|
align_vertical = {"0": "top", "1": "bottom", "2": "center"}
|
|
align_table = {"0": "top", "2": "left", "4": "right", "8": "center"}
|
|
use_table = {"0": "none", "1": "parbox"}
|
|
table_meta_re = re.compile(r'<LyXTabular version="?1"? rows="?(\d*)"? columns="?(\d*)"?>')
|
|
|
|
|
|
def update_tabular(document):
|
|
"Update tabular format to version 2 (xml like syntax)."
|
|
regexp = re.compile(r"^\\begin_inset\s+Tabular")
|
|
lines = document.body
|
|
i = 0
|
|
while True:
|
|
i = find_re(lines, regexp, i)
|
|
if i == -1:
|
|
break
|
|
|
|
i = i + 1
|
|
|
|
# scan table header meta-info
|
|
res = table_meta_re.match(lines[i])
|
|
if res:
|
|
val = res.groups()
|
|
lines[i] = '<lyxtabular version="2" rows="%s" columns="%s">' % val
|
|
|
|
j = find_token(lines, "</LyXTabular>", i) + 1
|
|
if j == 0:
|
|
document.warning("Error: Bad lyx format i=%d j=%d" % (i, j))
|
|
break
|
|
|
|
new_table = table_update(lines[i:j])
|
|
lines[i:j] = new_table
|
|
i = i + len(new_table)
|
|
|
|
|
|
col_re = re.compile(
|
|
r'<column alignment="?(\d)"? valignment="?(\d)"? leftline="?(\d)"? rightline="?(\d)"? width="(.*)" special="(.*)">'
|
|
)
|
|
cell_re = re.compile(
|
|
r'<cell multicolumn="?(\d)"? alignment="?(\d)"? valignment="?(\d)"? topline="?(\d)"? bottomline="?(\d)"? leftline="?(\d)"? rightline="?(\d)"? rotate="?(\d)"? usebox="?(\d)"? width="(.*)" special="(.*)">'
|
|
)
|
|
features_re = re.compile(
|
|
r'<features rotate="?(\d)"? islongtable="?(\d)"? endhead="?(-?\d)"? endfirsthead="?(-?\d)"? endfoot="?(-?\d)"? endlastfoot="?(-?\d)"?>'
|
|
)
|
|
row_re = re.compile(r'<row topline="?(\d)"? bottomline="?(\d)"? newpage="?(\d)"?>')
|
|
|
|
|
|
def table_update(lines):
|
|
"Update table's internal content to format 2."
|
|
lines[1] = lines[1].replace("<Features", "<features")
|
|
res = features_re.match(lines[1])
|
|
if res:
|
|
val = res.groups()
|
|
lines[1] = (
|
|
f'<features rotate="{bool_table(val[0])}" islongtable="{bool_table(val[1])}" endhead="{val[2]}" endfirsthead="{val[3]}" endfoot="{val[4]}" endlastfoot="{val[5]}">'
|
|
)
|
|
|
|
if lines[2] == "":
|
|
del lines[2]
|
|
i = 2
|
|
col_info = []
|
|
while i < len(lines):
|
|
lines[i] = lines[i].replace("<Cell", "<cell")
|
|
lines[i] = lines[i].replace("</Cell", "</cell")
|
|
lines[i] = lines[i].replace("<Row", "<row")
|
|
lines[i] = lines[i].replace("</Row", "</row")
|
|
lines[i] = lines[i].replace("<Column", "<column")
|
|
lines[i] = lines[i].replace("</Column", "</column")
|
|
lines[i] = lines[i].replace("</LyXTabular", "</lyxtabular")
|
|
k = lines[i].find("<column ")
|
|
if k != -1:
|
|
col_info.append(lines[i])
|
|
del lines[i]
|
|
continue
|
|
|
|
if lines[i] == "</column>" or lines[i] == "<column>":
|
|
del lines[i]
|
|
continue
|
|
|
|
res = cell_re.match(lines[i])
|
|
if res:
|
|
val = res.groups()
|
|
lines[i] = (
|
|
f'<cell multicolumn="{val[0]}" alignment="{align_table[val[1]]}" valignment="{align_vertical[val[2]]}" topline="{bool_table(val[3])}" bottomline="{bool_table(val[4])}" leftline="{bool_table(val[5])}" rightline="{bool_table(val[6])}" rotate="{bool_table(val[7])}" usebox="{use_table[val[8]]}" width="{val[9]}" special="{val[10]}">'
|
|
)
|
|
|
|
res = row_re.match(lines[i])
|
|
if res:
|
|
val = res.groups()
|
|
lines[i] = (
|
|
f'<row topline="{bool_table(val[0])}" bottomline="{bool_table(val[1])}" newpage="{bool_table(val[2])}">'
|
|
)
|
|
|
|
i = i + 1
|
|
|
|
j = len(col_info)
|
|
for i in range(j):
|
|
res = col_re.match(col_info[i])
|
|
if res:
|
|
val = res.groups()
|
|
col_info[i] = (
|
|
'<column alignment="%s" valignment="%s" leftline="%s" rightline="%s" width="%s" special="%s">'
|
|
% (
|
|
align_table[val[0]],
|
|
align_vertical[val[1]],
|
|
bool_table(val[2]),
|
|
bool_table(val[3]),
|
|
val[4],
|
|
val[5],
|
|
)
|
|
)
|
|
|
|
return lines[:2] + col_info + lines[2:]
|
|
|
|
|
|
supported_versions = ["1.1.6fix3", "1.1.6fix4", "1.1"]
|
|
convert = [[218, [update_tabular]]]
|
|
revert = []
|
|
|
|
|
|
if __name__ == "__main__":
|
|
pass
|