From 30f1fd59ae06de6a5f39b6ccf9a4f1033b396bd5 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Wed, 7 Jan 2004 14:36:43 +0000 Subject: [PATCH] status tag patch from Georg git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8315 a592a061-630c-0410-9148-cb99ea01b6c8 --- development/FORMAT | 6 +- lib/lyx2lyx/ChangeLog | 9 ++ lib/lyx2lyx/lyxconvert_227.py | 36 +++++- lib/lyx2lyx/lyxconvert_228.py | 11 ++ lib/lyx2lyx/lyxrevert_223.py | 2 +- lib/lyx2lyx/lyxrevert_224.py | 2 +- lib/lyx2lyx/lyxrevert_225.py | 233 +++++++++++++++++++++++++++++++++- lib/lyx2lyx/lyxrevert_226.py | 2 +- lib/lyx2lyx/lyxrevert_227.py | 2 +- lib/lyx2lyx/lyxrevert_228.py | 40 +++++- src/insets/ChangeLog | 4 + src/insets/insetnote.C | 1 - src/tex2lyx/ChangeLog | 5 +- src/tex2lyx/text.C | 4 +- 14 files changed, 335 insertions(+), 22 deletions(-) diff --git a/development/FORMAT b/development/FORMAT index aaf9e3e036..f50a4146c2 100644 --- a/development/FORMAT +++ b/development/FORMAT @@ -11,9 +11,13 @@ LyX file-format changes * format incremented to 228. * Change the output of all insets derived from InsetCollapsable - except for InsetERT (which has this output already), changing lines + except for InsetERT (which has a similar output already), changing lines "collapsed true" -> "status collapsed" "collapsed false" -> "status open". + * Change the output of InsetERT, changing lines + "status Collapsed" -> "status collapsed" + "status Open" -> "status open". + "status Inlined" -> "status inlined". 2003-12-10 Angus Leeming diff --git a/lib/lyx2lyx/ChangeLog b/lib/lyx2lyx/ChangeLog index c609e0b3d8..47b069ffc3 100644 --- a/lib/lyx2lyx/ChangeLog +++ b/lib/lyx2lyx/ChangeLog @@ -1,3 +1,12 @@ +2004-01-06 Georg Baum + + * lyxrevert_228.py: convert ERT status, too + * lyxconvert_227.py: ditto, also stop at \\begin_alyout and not + \\layout in convert_collapsable() + * lyxconvert_228.py (convert_minipage): Add status tag conversion + * lyxrevert_225.py: Convert vspace and frameless box insets + * lyxrevert_22[3-8].py: fix the 'é' in José's name + 2003-12-29 Jürgen Spitzmüller * lyx2lyx: up the format to 229. diff --git a/lib/lyx2lyx/lyxconvert_227.py b/lib/lyx2lyx/lyxconvert_227.py index 5ea38b2225..e6e39d6408 100644 --- a/lib/lyx2lyx/lyxconvert_227.py +++ b/lib/lyx2lyx/lyxconvert_227.py @@ -16,7 +16,7 @@ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import sys -from parser_tools import find_tokens +from parser_tools import find_token, find_tokens def convert_collapsable(lines): i = 0 @@ -34,8 +34,8 @@ def convert_collapsable(lines): break # Seach for a line starting 'collapsed' - # If, however, we find a line starting '\layout' (_always_ present) - # then break with a warning message + # If, however, we find a line starting '\begin_layout' + # (_always_ present) then break with a warning message i = i + 1 while 1: if (lines[i] == "collapsed false"): @@ -44,16 +44,44 @@ def convert_collapsable(lines): elif (lines[i] == "collapsed true"): lines[i] = "status collapsed" break - elif (lines[i][:7] == "\\layout"): + elif (lines[i][:13] == "\\begin_layout"): sys.stderr.write("Malformed lyx file\n") break i = i + 1 i = i + 1 +def convert_ert(lines): + i = 0 + while 1: + i = find_token(lines, "\\begin_inset ERT", i) + if i == -1: + break + + # Seach for a line starting 'status' + # If, however, we find a line starting '\begin_layout' + # (_always_ present) then break with a warning message + i = i + 1 + while 1: + if (lines[i] == "status Open"): + lines[i] = "status open" + break + elif (lines[i] == "status Collapsed"): + lines[i] = "status collapsed" + break + elif (lines[i] == "status Inlined"): + lines[i] = "status inlined" + break + elif (lines[i][:13] == "\\begin_layout"): + sys.stderr.write("Malformed lyx file\n") + break + i = i + 1 + + i = i + 1 def convert(header, body): convert_collapsable(body) + convert_ert(body) if __name__ == "__main__": pass diff --git a/lib/lyx2lyx/lyxconvert_228.py b/lib/lyx2lyx/lyxconvert_228.py index 33e5af6585..4f6443aaf4 100644 --- a/lib/lyx2lyx/lyxconvert_228.py +++ b/lib/lyx2lyx/lyxconvert_228.py @@ -73,6 +73,15 @@ def convert_minipage(lines): else: width = ' "0"' + if lines[i][:9] == "collapsed": + if lines[i][9:] == "true": + status = "collapsed" + else: + status = "open" + del lines[i] + else: + status = "collapsed" + lines.insert(i, 'use_parbox 0') i = i + 1 lines.insert(i, 'width' + width) @@ -83,6 +92,8 @@ def convert_minipage(lines): i = i + 1 lines.insert(i, 'height_special "totalheight"') i = i + 1 + lines.insert(i, 'status ' + status) + i = i + 1 def convert(header, body): convert_minipage(body) diff --git a/lib/lyx2lyx/lyxrevert_223.py b/lib/lyx2lyx/lyxrevert_223.py index 7e9fc2c393..e9c0849382 100644 --- a/lib/lyx2lyx/lyxrevert_223.py +++ b/lib/lyx2lyx/lyxrevert_223.py @@ -1,5 +1,5 @@ # This file is part of lyx2lyx -# Copyright (C) 2003 José Matos +# Copyright (C) 2003 José Matos # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/lyx2lyx/lyxrevert_224.py b/lib/lyx2lyx/lyxrevert_224.py index 1c15914565..b563284672 100644 --- a/lib/lyx2lyx/lyxrevert_224.py +++ b/lib/lyx2lyx/lyxrevert_224.py @@ -1,5 +1,5 @@ # This file is part of lyx2lyx -# Copyright (C) 2003 José Matos +# Copyright (C) 2003 José Matos # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/lyx2lyx/lyxrevert_225.py b/lib/lyx2lyx/lyxrevert_225.py index 2a953dbc8d..c6d39649ab 100644 --- a/lib/lyx2lyx/lyxrevert_225.py +++ b/lib/lyx2lyx/lyxrevert_225.py @@ -1,5 +1,6 @@ # This file is part of lyx2lyx -# Copyright (C) 2003 José Matos +# Copyright (C) 2003 José Matos +# Copyright (C) 2003 Georg Baum # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -16,8 +17,10 @@ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import re -from parser_tools import find_token, find_end_of_inset -from string import replace +from parser_tools import find_token, find_end_of_inset, get_next_paragraph, \ + get_paragraph, get_value, del_token, is_nonempty_line +from string import find, replace, split +import sys def rm_end_layout(lines): i = 0 @@ -65,11 +68,235 @@ def end_document(lines): return lines[i] = "\\the_end" +# Convert backslashes into valid ERT code, append the converted text to +# lines[i] and return the (maybe incremented) line index i +def convert_ertbackslash(lines, i, ert): + for c in ert: + if c == '\\': + lines[i] = lines[i] + '\\backslash ' + lines.insert(i, '') + i = i + 1 + else: + lines[i] = lines[i] + c + return i + +def convert_vspace(header, lines): + + # Get default spaceamount + i = find_token(header, '\\defskip', 0) + if i == -1: + defskipamount = 'medskip' + else: + defskipamount = split(header[i])[1] + + # Convert the insets + i = 0 + while 1: + i = find_token(lines, '\\begin_inset VSpace', i) + if i == -1: + return + spaceamount = split(lines[i])[2] + + # Are we at the beginning or end of a paragraph? + paragraph_start = 1 + start = get_paragraph(lines, i) + 1 + for k in range(start, i): + if is_nonempty_line(lines[k]): + paragraph_start = 0 + break + paragraph_end = 1 + j = find_end_of_inset(lines, i) + if j == -1: + sys.stderr.write("Malformed lyx file: Missing '\\end_inset'\n") + i = i + 1 + continue + end = get_next_paragraph(lines, i) + for k in range(j + 1, end): + if is_nonempty_line(lines[k]): + paragraph_end = 0 + break + + # Convert to paragraph formatting if we are at the beginning or end + # of a paragraph and the resulting paragraph would not be empty + if ((paragraph_start and not paragraph_end) or + (paragraph_end and not paragraph_start)): + # The order is important: del and insert invalidate some indices + del lines[j] + del lines[i] + if paragraph_start: + lines.insert(start, '\\added_space_top ' + spaceamount + ' ') + else: + lines.insert(start, '\\added_space_bottom ' + spaceamount + ' ') + continue + + # Convert to ERT + lines[i:i+1] = ['\\begin_inset ERT', 'status Collapsed', '', + '\\layout Standard', '', '\\backslash '] + i = i + 6 + if spaceamount[-1] == '*': + spaceamount = spaceamount[:-1] + keep = 1 + else: + keep = 0 + + # Replace defskip by the actual value + if spaceamount == 'defskip': + spaceamount = defskipamount + + # LaTeX does not know \\smallskip* etc + if keep: + if spaceamount == 'smallskip': + spaceamount = '\\smallskipamount' + elif spaceamount == 'medskip': + spaceamount = '\\medskipamount' + elif spaceamount == 'bigskip': + spaceamount = '\\bigskipamount' + elif spaceamount == 'vfill': + spaceamount = '\\fill' + + # Finally output the LaTeX code + if (spaceamount == 'smallskip' or spaceamount == 'medskip' or + spaceamount == 'bigskip' or spaceamount == 'vfill'): + lines.insert(i, spaceamount) + else : + if keep: + lines.insert(i, 'vspace*{') + else: + lines.insert(i, 'vspace{') + i = convert_ertbackslash(lines, i, spaceamount) + lines[i] = lines[i] + '}' + i = i + 1 + +# Convert a LyX length into valid ERT code and append it to lines[i] +# Return the (maybe incremented) line index i +def convert_ertlen(lines, i, len, special): + units = {"text%":"\\textwidth", "col%":"\\columnwidth", + "page%":"\\pagewidth", "line%":"\\linewidth", + "theight%":"\\textheight", "pheight%":"\\pageheight"} + + # Convert special lengths + if special != 'none': + len = '%f\\' % len2value(len) + special + + # Convert LyX units to LaTeX units + for unit in units.keys(): + if find(len, unit) != -1: + len = '%f' % (len2value(len) / 100) + units[unit] + break + + # Convert backslashes and insert the converted length into lines + return convert_ertbackslash(lines, i, len) + +# Return the value of len without the unit in numerical form +def len2value(len): + result = re.search('([+-]?[0-9.]+)', len) + if result: + return float(result.group(1)) + # No number means 1.0 + return 1.0 + +def convert_frameless_box(lines): + pos = ['t', 'c', 'b'] + inner_pos = ['c', 't', 'b', 's'] + i = 0 + while 1: + i = find_token(lines, '\\begin_inset Frameless', i) + if i == -1: + return + j = find_end_of_inset(lines, i) + if j == -1: + sys.stderr.write("Malformed lyx file: Missing '\\end_inset'\n") + i = i + 1 + continue + del lines[i] + + # Gather parameters + params = {'position':'0', 'hor_pos':'c', 'has_inner_box':'1', + 'inner_pos':'1', 'use_parbox':'0', 'width':'100col%', + 'special':'none', 'height':'1in', + 'height_special':'totalheight', 'collapsed':'false'} + for key in params.keys(): + value = replace(get_value(lines, key, i, j), '"', '') + if value != "": + if key == 'position': + # convert new to old position: 'position "t"' -> 0 + value = find_token(pos, value, 0) + if value != -1: + params[key] = value + elif key == 'inner_pos': + # convert inner position + value = find_token(inner_pos, value, 0) + if value != -1: + params[key] = value + else: + params[key] = value + j = del_token(lines, key, i, j) + i = i + 1 + + # Convert to minipage or ERT? + # Note that the inner_position and height parameters of a minipage + # inset are ignored and not accessible for the user, although they + # are present in the file format and correctly read in and written. + # Therefore we convert to ERT if they do not have their LaTeX + # defaults. These are: + # - the value of "position" for "inner_pos" + # - "\totalheight" for "height" + if (params['use_parbox'] != '0' or + params['has_inner_box'] != '1' or + params['special'] != 'none' or + inner_pos[params['inner_pos']] != pos[params['position']] or + params['height_special'] != 'totalheight' or + len2value(params['height']) != 1.0): + + # Convert to ERT + if params['collapsed'] == 'true': + params['collapsed'] = 'Collapsed' + else: + params['collapsed'] = 'Open' + lines[i : i] = ['\\begin_inset ERT', 'status ' + params['collapsed'], + '', '\\layout Standard', '', '\\backslash '] + i = i + 6 + if params['use_parbox'] == '1': + lines.insert(i, 'parbox') + else: + lines.insert(i, 'begin{minipage}') + lines[i] = lines[i] + '[' + pos[params['position']] + '][' + i = convert_ertlen(lines, i, params['height'], params['height_special']) + lines[i] = lines[i] + '][' + inner_pos[params['inner_pos']] + ']{' + i = convert_ertlen(lines, i, params['width'], params['special']) + lines[i] = lines[i] + '}{' + i = i + 1 + lines[i:i] = ['', '\\end_inset '] + i = i + 2 + j = find_end_of_inset(lines, i) + if j == -1: + sys.stderr.write("Malformed lyx file: Missing '\\end_inset'\n") + break + lines[j-1:j-1] += ['\\begin_inset ERT', 'status ' + params['collapsed'], + '', '\\layout Standard', ''] + j = j + 4 + if params['use_parbox'] == '1': + lines.insert(j, '}') + else: + lines[j:j] = ['\\backslash ', 'end{minipage}'] + else: + + # Convert to minipage + lines[i:i] = ['\\begin_inset Minipage', + 'position %d' % params['position'], + 'inner_position %d' % params['inner_pos'], + 'height "' + params['height'] + '"', + 'width "' + params['width'] + '"', + 'collapsed ' + params['collapsed']] + i = i + 6 + def convert(header, body): rm_end_layout(body) begin_layout2layout(body) end_document(body) valignment_middle(body) + convert_vspace(header, body) + convert_frameless_box(body) if __name__ == "__main__": pass diff --git a/lib/lyx2lyx/lyxrevert_226.py b/lib/lyx2lyx/lyxrevert_226.py index f0d04e5fba..e8db766a82 100644 --- a/lib/lyx2lyx/lyxrevert_226.py +++ b/lib/lyx2lyx/lyxrevert_226.py @@ -1,5 +1,5 @@ # This file is part of lyx2lyx -# Copyright (C) 2003 José Matos +# Copyright (C) 2003 José Matos # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/lyx2lyx/lyxrevert_227.py b/lib/lyx2lyx/lyxrevert_227.py index 6aa93635ad..5b79b20ed5 100644 --- a/lib/lyx2lyx/lyxrevert_227.py +++ b/lib/lyx2lyx/lyxrevert_227.py @@ -1,5 +1,5 @@ # This file is part of lyx2lyx -# Copyright (C) 2003 José Matos +# Copyright (C) 2003 José Matos # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License diff --git a/lib/lyx2lyx/lyxrevert_228.py b/lib/lyx2lyx/lyxrevert_228.py index 1f74e9812c..42352a2829 100644 --- a/lib/lyx2lyx/lyxrevert_228.py +++ b/lib/lyx2lyx/lyxrevert_228.py @@ -1,5 +1,5 @@ # This file is part of lyx2lyx -# Copyright (C) 2003 José Matos +# Copyright (C) 2003 José Matos # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -16,7 +16,7 @@ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import sys -from parser_tools import find_tokens +from parser_tools import find_token, find_tokens def convert_collapsable(lines): i = 0 @@ -33,13 +33,12 @@ def convert_collapsable(lines): if i == -1: break - # Seach for a line starting 'collapsed' - # If, however, we find a line starting '\layout' (_always_ present) - # then break with a warning message + # Seach for a line starting 'status' + # If, however, we find a line starting '\begin_layout' + # (_always_ present) then break with a warning message i = i + 1 while 1: if (lines[i] == "status open"): - lines[i] = "collapsed false" lines[i] = "collapsed false" break elif (lines[i] == "status collapsed" or @@ -53,8 +52,37 @@ def convert_collapsable(lines): i = i + 1 +def convert_ert(lines): + i = 0 + while 1: + i = find_token(lines, "\\begin_inset ERT", i) + if i == -1: + break + + # Seach for a line starting 'status' + # If, however, we find a line starting '\begin_layout' + # (_always_ present) then break with a warning message + i = i + 1 + while 1: + if (lines[i] == "status open"): + lines[i] = "status Open" + break + elif (lines[i] == "status collapsed"): + lines[i] = "status Collapsed" + break + elif (lines[i] == "status inlined"): + lines[i] = "status Inlined" + break + elif (lines[i][:13] == "\\begin_layout"): + sys.stderr.write("Malformed lyx file\n") + break + i = i + 1 + + i = i + 1 + def convert(header, body): convert_collapsable(body) + convert_ert(body) if __name__ == "__main__": pass diff --git a/src/insets/ChangeLog b/src/insets/ChangeLog index 9e265a198f..8d45e2940e 100644 --- a/src/insets/ChangeLog +++ b/src/insets/ChangeLog @@ -1,3 +1,7 @@ +2004-01-06 Georg Baum + + * insetnote.C (InsetNoteParams::write): write label only once + 2004-01-05 Lars Gullik Bjonnes * insetbranch.C (isBranchSelected): use the BranchNamesEqual diff --git a/src/insets/insetnote.C b/src/insets/insetnote.C index c2bd5767fa..3a8c38a2d3 100644 --- a/src/insets/insetnote.C +++ b/src/insets/insetnote.C @@ -82,7 +82,6 @@ void InsetNoteParams::write(ostream & os) const { string const label = notetranslator().find(type); os << "Note " << label << "\n"; - os << label << "\n"; } diff --git a/src/tex2lyx/ChangeLog b/src/tex2lyx/ChangeLog index 9a58ad4aab..e9aa267f95 100644 --- a/src/tex2lyx/ChangeLog +++ b/src/tex2lyx/ChangeLog @@ -1,3 +1,7 @@ +2004-01-06 Georg Baum + + * text.C: fix status tag output for ERT inset + 2003-12-17 Georg Baum * preamble.C: Change file format from 225 to 228 @@ -5,7 +9,6 @@ * text.C: Changes for format 228 (see ../../development/FORMAT) * text.C: Add lyxgreyedout environment * context.[Ch]: New function Context::add_extra_stuff() - * context.[Ch]: Add ~Context() with warning message 2003-12-08 Georg Baum diff --git a/src/tex2lyx/text.C b/src/tex2lyx/text.C index 5177d30762..e8a651270f 100644 --- a/src/tex2lyx/text.C +++ b/src/tex2lyx/text.C @@ -253,7 +253,7 @@ void handle_ert(ostream & os, string const & s, Context & context, bool check_la } Context newcontext(true, context.textclass); begin_inset(os, "ERT"); - os << "\nstatus Collapsed\n"; + os << "\nstatus collapsed\n"; newcontext.check_layout(os); for (string::const_iterator it = s.begin(), et = s.end(); it != et; ++it) { if (*it == '\\') @@ -271,7 +271,7 @@ void handle_comment(ostream & os, string const & s, Context & context) // TODO: Handle this better Context newcontext(true, context.textclass); begin_inset(os, "ERT"); - os << "\nstatus Collapsed\n"; + os << "\nstatus collapsed\n"; newcontext.check_layout(os); for (string::const_iterator it = s.begin(), et = s.end(); it != et; ++it) { if (*it == '\\')