]> git.lyx.org Git - features.git/blob - lib/lyx2lyx/lyxconvert_217.py
become more liberal with accepted values, fix table cases
[features.git] / lib / lyx2lyx / lyxconvert_217.py
1 # This file is part of lyx2lyx
2 # Copyright (C) 2002 José Matos <jamatos@lyx.org>
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
17
18 import re, string, sys
19 from parser_tools import *
20
21 def bool_table(item):
22     if item == "0":
23         return "false"
24     # should emit a warning if item != "1"
25     return "true"
26
27 align_table = {"0": "top", "2": "left", "4": "right", "8": "center"}
28 use_table = {"0": "none", "1": "parbox"}
29
30 #table_meta_re = re.compile(r'<LyXTabular version="1" rows="(\d*)" columns="(\d*)">')
31 def update_tabular(lines):
32     i=0
33     while 1:
34         i = find_token(lines, '\\begin_inset  Tabular', i)
35         if i == -1:
36             break
37
38         i = i +1
39
40         # scan table header meta-info
41         lines[i] = string.replace(lines[i], 'LyXTabular version="1"', 'lyxtabular version="2"')
42
43         j = find_token(lines, '</LyXTabular>', i) + 1
44         if j == 0:
45             sys.stderr.write( "Error: Bad lyx format i=%d j=%d\n" % (i,j))
46             break
47
48         new_table = table_update(lines[i:j])
49         lines[i:j] = new_table
50         i = i + len(new_table)
51
52 col_re = re.compile(r'<column alignment="(\d)" valignment="(\d)" leftline="(\d)" rightline="(\d)" width="(.*)" special="(.*)">')
53 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="(.*)">')
54 features_re = re.compile(r'<features rotate="(\d)" islongtable="(\d)" endhead="(\d)" endfirsthead="(\d)" endfoot="(\d)" endlastfoot="(\d)">')
55 row_re = re.compile(r'<row topline="(\d)" bottomline="(\d)" newpage="(\d)">')
56
57 def table_update(lines):
58     lines[1] = string.replace(lines[1], '<Features', '<features')
59     res = features_re.match( lines[1] )
60     if res:
61         val = res.groups()
62         lines[1] = '<features rotate="%s" islongtable="%s" endhead="%s" endfirsthead="%s" endfoot="%s" endlastfoot="%s">' % (bool_table(val[0]), bool_table(val[1]), val[2], val[3], val[4], val[5])
63         
64     if lines[2]=="":
65         del lines[2]
66     i = 2
67     col_info = []
68     while i < len(lines):
69         lines[i] = string.replace(lines[i], '<Cell', '<cell')
70         lines[i] = string.replace(lines[i], '</Cell', '</cell')
71         lines[i] = string.replace(lines[i], '<Row', '<row')
72         lines[i] = string.replace(lines[i], '</Row', '</row')
73         lines[i] = string.replace(lines[i], '<Column', '<column')
74         lines[i] = string.replace(lines[i], '</Column', '</column')
75         lines[i] = string.replace(lines[i], '</LyXTabular', '</lyxtabular')
76         k = string.find (lines[i], '<column ')
77         if k != -1:
78             col_info.append(lines[i])
79             del lines[i]
80             continue
81         
82         if lines[i] == '</column>' or lines[i] == '<column>':
83             del lines[i]
84             continue
85
86         res = cell_re.match(lines[i])
87         if res:
88             val = res.groups()
89             lines[i] = '<cell multicolumn="%s" alignment="%s" valignment="%s" topline="%s" bottomline="%s" leftline="%s" rightline="%s" rotate="%s" usebox="%s" width="%s" special="%s">' % ( val[0], align_table[val[1]], align_table[val[2]], bool_table(val[3]), bool_table(val[4]), bool_table(val[5]), bool_table(val[6]), bool_table(val[7]), use_table[val[8]], val[9], val[10])
90
91         res = row_re.match(lines[i])
92         if res:
93             val = res.groups()
94             lines[i] = '<row topline="%s" bottomline="%s" newpage="%s">' % (bool_table(val[0]), bool_table(val[1]), bool_table(val[2]))
95
96         i = i + 1
97
98     j = len(col_info)
99     for i in range(j):
100         res = col_re.match(col_info[i])
101         if res:
102             val = res.groups()
103             col_info[i] = '<column alignment="%s" valignment="%s" leftline="%s" rightline="%s" width="%s" special="%s">' \
104                           % ( align_table[val[0]], align_table[val[1]], bool_table(val[2]), bool_table(val[3]), val[4],val[5])
105
106     return lines[:2] + col_info + lines[2:]
107
108 def convert(header,body):
109     update_tabular(body)
110
111 if __name__ == "__main__":
112     pass
113