From 07176c1a457c49715f09616534f2882b768357f6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Uwe=20St=C3=B6hr?= Date: Tue, 9 Nov 2010 05:35:51 +0000 Subject: [PATCH] lyx_2_0.py: correct reversion of multirows with offsets the same ways as for "standard" multirows git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@36221 a592a061-630c-0410-9148-cb99ea01b6c8 --- lib/lyx2lyx/lyx_2_0.py | 179 ++++++++++++++++++++++++++++------------- 1 file changed, 124 insertions(+), 55 deletions(-) diff --git a/lib/lyx2lyx/lyx_2_0.py b/lib/lyx2lyx/lyx_2_0.py index 4a0cb64819..a8351e872d 100644 --- a/lib/lyx2lyx/lyx_2_0.py +++ b/lib/lyx2lyx/lyx_2_0.py @@ -1007,7 +1007,6 @@ def revert_multirow(document): # cell type 4 is multirow-part cell begin_cell2 = find_token(document.body, ' -1: span += 1 # remove bottom line of previous multirow-part cell @@ -1046,7 +1045,7 @@ def revert_multirow(document): # so before the end of the layout... document.body[bend:bend] = put_cmd_in_ert("}") # ...and after the beginning - document.body[blay+1:blay+1] = put_cmd_in_ert("\\multirow{" + str(span) + "}{" + col_width + "}{") + document.body[blay + 1:blay + 1] = put_cmd_in_ert("\\multirow{" + str(span) + "}{" + col_width + "}{") # set index to end of current cell (that is now much bigger due to the ERT addition) begin_cell = find_token(document.body, '', begin_cell) + 1 begin_row = find_token(document.body, '', begin_row) + 1 @@ -2161,63 +2160,133 @@ def revert_passthru(document): def revert_multirowOffset(document): " Revert multirow cells with offset in tables to TeX-code" + # this routine is the same as the revert_multirow routine except that + # it checks additionally for the offset i = 0 + begin_table = 0 + bottom_index = 0 multirowOffset = False + # cell type 3 is multirow begin cell + i = find_token(document.body, '", i) - if cend == -1: - document.warning("Malformed LyX document: Could not find end of tabular cell.") - i += 1 - continue - blay = find_token(document.body, "\\begin_layout", i, cend) - if blay == -1: - document.warning("Can't find layout for cell!") - i = j - continue - bend = find_end_of_layout(document.body, blay) - if blay == -1: - document.warning("Can't find end of layout for cell!") - i = cend - continue - # do the later one first, so as not to mess up the numbering - # we are wrapping the whole cell in this ert - # so before the end of the layout... - document.body[bend:bend] = put_cmd_in_ert("}") - # ...and after the beginning - document.body[blay+1:blay+1] = put_cmd_in_ert("\\multirow{2}{2cm}[" + offset + "]{") - while True: - # cell type 4 is multirow part cell - k = find_token(document.body, '', begin_table) + if end_table == -1: + document.warning("Malformed LyX document: Could not find end of table.") + break + # store the number of rows + begin = document.body[begin_table].find('rows="') + end = document.body[begin_table].find('" ', begin) + rows = document.body[begin_table][begin + 6:end] + # store the number of columns + begin = document.body[begin_table].find('columns="') + end = document.body[begin_table].find('">', begin) + columns = document.body[begin_table][begin + 9:end] + # find column number of the multirows with offset + begin_row = begin_table + for row in range(int(rows)): + begin_row = find_token(document.body, '', begin_row) + begin_cell = begin_row + for column in range(int(columns)): + begin_cell = find_token(document.body, '', begin) + col_width = document.body[begin_table + 2 + column][begin + 7:end] + # "0pt" means that no width is specified + if col_width == "0pt": + col_width = "*" + # determine the number of cells that are part of the multirow + begin_row2 = begin_table + # we have the multirow begin cell as minimal span + span = 1 + # go one row behind the row where we found the multirow begin + row2 = -1 + while row2 < row: + begin_row2 = find_token(document.body, '', begin_row2) + row2 += 1 + begin_row2 += 1 + # step now through all rows until we reach the last table row + rows2 = row + while row2 < rows: + begin_row2 = find_token(document.body, '', begin_row2) + begin_cell2 = begin_row2 + # look now for the column-th cell in the row + column2 = 0 + while column2 < column: + begin_cell2 = find_token(document.body, ' -1: + span += 1 + # remove bottom line of previous multirow-part cell + if span > 1: + document.body[bottom_index] = document.body[bottom_index].replace(' bottomline="true" ', ' ') + # save index to be later able to remove bottom line + bottom_index = begin_cell2 + # remove the multirow tag, set the valignment to top + # and remove the top line + document.body[begin_cell2] = document.body[begin_cell2].replace(' multirow="4" ', ' ') + document.body[begin_cell2] = document.body[begin_cell2].replace('valignment="middle"', 'valignment="top"') + document.body[begin_cell2] = document.body[begin_cell2].replace(' topline="true" ', ' ') + else: + break + begin_row2 = find_token(document.body, '', begin_row2) + # remove the multirow tag, set the valignment to top, + # remove the the bottom line and offset + document.body[begin_cell] = document.body[begin_cell].replace(' multirow="3" ', ' ') + document.body[begin_cell] = document.body[begin_cell].replace('valignment="middle"', 'valignment="top"') + # only remove the bottom line if it is not a single cell as multirow + if span > 1: + document.body[begin_cell] = document.body[begin_cell].replace(' bottomline="true" ', ' ') + document.body[begin_cell] = document.body[begin_cell].replace(' mroffset=', '') + # store the offset and remove it + begin = document.body[begin_cell].find('"') + end = document.body[begin_cell].find('" ', begin) + offset = document.body[begin_cell][begin + 1:end] + document.body[begin_cell] = document.body[begin_cell].replace(document.body[begin_cell][begin:end + 1], '') + # write ERT to create the multirow cell + cend = find_token(document.body, "", begin_cell) + if cend == -1: + document.warning("Malformed LyX document: Could not find end of tabular cell.") + i += 1 + continue + blay = find_token(document.body, "\\begin_layout", begin_cell, cend) + if blay == -1: + document.warning("Can't find layout for cell!") + i = j + continue + bend = find_end_of_layout(document.body, blay) + if bend == -1: + document.warning("Can't find end of layout for cell!") + i = cend + continue + # do the later one first, so as not to mess up the numbering + # we are wrapping the whole cell in this ert + # so before the end of the layout... + document.body[bend:bend] = put_cmd_in_ert("}") + # ...and after the beginning + document.body[blay + 1:blay + 1] = put_cmd_in_ert("\\multirow{" + str(span) + "}{" + col_width + "}[" + offset + "]{") + # set index to end of current cell (that is now much bigger due to the ERT addition) + begin_cell = find_token(document.body, '', begin_cell) + 1 + begin_row = find_token(document.body, '', begin_row) + 1 + + # go to the next table + begin_table = end_table + 1 + if multirowOffset == True: add_to_preamble(document, ["\\usepackage{multirow}"]) -- 2.39.2