Fix bug 518 (thanks to Jean Marc and Martin for the help)

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@19455 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
José Matox 2007-08-12 13:25:36 +00:00
parent 8622ebaa4d
commit ca81b43f03
5 changed files with 102 additions and 19 deletions

View File

@ -30,7 +30,7 @@ try:
import lyx2lyx_version import lyx2lyx_version
version_lyx2lyx = lyx2lyx_version.version version_lyx2lyx = lyx2lyx_version.version
except: # we are running from build directory so assume the last version except: # we are running from build directory so assume the last version
version_lyx2lyx = '1.5.0svn' version_lyx2lyx = '1.6.0svn'
default_debug_level = 2 default_debug_level = 2
@ -77,7 +77,8 @@ format_relation = [("0_06", [200], generate_minor_versions("0.6" , 4)),
("1_2", [220], generate_minor_versions("1.2" , 4)), ("1_2", [220], generate_minor_versions("1.2" , 4)),
("1_3", [221], generate_minor_versions("1.3" , 7)), ("1_3", [221], generate_minor_versions("1.3" , 7)),
("1_4", range(222,246), generate_minor_versions("1.4" , 5)), ("1_4", range(222,246), generate_minor_versions("1.4" , 5)),
("1_5", range(246,277), generate_minor_versions("1.5" , 0))] ("1_5", range(246,277), generate_minor_versions("1.5" , 1)),
("1_6", range(277,278), generate_minor_versions("1.6" , 0))]
def formats_list(): def formats_list():
@ -470,7 +471,7 @@ class LyX_Base:
first_step = 1 first_step = 1
for step in format_relation: for step in format_relation:
if initial_step <= step[0] <= final_step: if initial_step <= step[0] <= final_step:
if first_step and len(step[1]) == 1: if first_step:
first_step = 0 first_step = 0
continue continue
steps.append(step[0]) steps.append(step[0])
@ -488,6 +489,7 @@ class LyX_Base:
if last_step[1][-1] == self.end_format: if last_step[1][-1] == self.end_format:
steps.pop() steps.pop()
self.warning("Convertion mode: %s\tsteps%s" %(mode, steps), 10)
return mode, steps return mode, steps

View File

@ -27,6 +27,7 @@ dist_lyx2lyx_PYTHON = \
lyx_1_3.py \ lyx_1_3.py \
lyx_1_4.py \ lyx_1_4.py \
lyx_1_5.py \ lyx_1_5.py \
lyx_1_6.py \
profiling.py \ profiling.py \
test_parser_tools.py test_parser_tools.py

85
lib/lyx2lyx/lyx_1_6.py Normal file
View File

@ -0,0 +1,85 @@
# This file is part of lyx2lyx
# -*- coding: utf-8 -*-
# Copyright (C) 2007 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 1.6"""
import re
import unicodedata
import sys, os
from parser_tools import find_token, find_end_of
####################################################################
# Private helper functions
def find_end_of_inset(lines, i):
" Find end of inset, where lines[i] is included."
return find_end_of(lines, i, "\\begin_inset", "\\end_inset")
####################################################################
def fix_wrong_tables(document):
i = 0
while True:
i = find_token(document.body, "\\begin_inset Tabular", i)
if i == -1:
return
j = find_end_of_inset(document.body, i + 1)
if j == -1:
document.warning("Malformed LyX document: Could not find end of tabular.")
continue
m = i + 1
nrows = int(document.body[i+1].split('"')[3])
ncols = int(document.body[i+1].split('"')[5])
for l in range(nrows):
prev_multicolumn = 0
for k in range(ncols):
m = find_token(document.body, '<cell', m)
if document.body[m].find('multicolumn') != -1:
multicol_cont = int(document.body[m].split('"')[1])
if multicol_cont == 2 and (k == 0 or prev_multicolumn == 0):
document.body[m] = document.body[m][:5] + document.body[m][21:]
prev_multicolumn = 0
else:
prev_multicolumn = multicol_cont
else:
prev_multicolumn = 0
i = j + 1
##
# Conversion hub
#
supported_versions = ["1.6.0","1.6"]
convert = [
[277, [fix_wrong_tables]],
]
revert = [
[276, []],
]
if __name__ == "__main__":
pass

View File

@ -135,7 +135,7 @@ namespace fs = boost::filesystem;
namespace { namespace {
int const LYX_FORMAT = 276; int const LYX_FORMAT = 277;
} // namespace anon } // namespace anon

View File

@ -721,8 +721,15 @@ void Tabular::deleteColumn(col_type const column)
return; return;
column_info.erase(column_info.begin() + column); column_info.erase(column_info.begin() + column);
for (row_type i = 0; i < rows_; ++i) for (row_type i = 0; i < rows_; ++i) {
// Care about multicolumn cells
if (column + 1 < columns_ &&
cell_info[i][column].multicolumn == CELL_BEGIN_OF_MULTICOLUMN &&
cell_info[i][column + 1].multicolumn == CELL_PART_OF_MULTICOLUMN) {
cell_info[i][column + 1].multicolumn = CELL_BEGIN_OF_MULTICOLUMN;
}
cell_info[i].erase(cell_info[i].begin() + column); cell_info[i].erase(cell_info[i].begin() + column);
}
--columns_; --columns_;
fixCellNums(); fixCellNums();
} }
@ -747,22 +754,10 @@ void Tabular::copyColumn(BufferParams const & bp, col_type const column)
void Tabular::set_row_column_number_info() void Tabular::set_row_column_number_info()
{ {
numberofcells = 0; numberofcells = 0;
// Count only non-multicol cells plus begin multicol
// cells, ignore non-begin multicol cells:
for (row_type row = 0; row < rows_; ++row) { for (row_type row = 0; row < rows_; ++row) {
for (col_type column = 0; column < columns_; ++column) { for (col_type column = 0; column < columns_; ++column) {
// If on its left is either the edge, or a normal cell,
// then this cannot be a non-begin multicol cell.
// Clean up as well as we can:
if (cell_info[row][column].multicolumn
== CELL_PART_OF_MULTICOLUMN) {
if (column == 0 ||
cell_info[row][column - 1]
.multicolumn == CELL_NORMAL)
cell_info[row][column].multicolumn =
CELL_NORMAL;
}
// Count only non-multicol cells plus begin multicol
// cells, ignore non-begin multicol cells:
if (cell_info[row][column].multicolumn if (cell_info[row][column].multicolumn
!= Tabular::CELL_PART_OF_MULTICOLUMN) != Tabular::CELL_PART_OF_MULTICOLUMN)
++numberofcells; ++numberofcells;