X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Flyx2lyx%2Flyx2lyx_tools.py;h=8f3e8a3960e96029def440d3ae02636c95ad63bb;hb=13c6350155b5941b76dddad8893003f345844535;hp=35da97f643ab0b4b171f02a90898829c8346d66b;hpb=f3ae1e2641a8f32201f7728a19945088f1c1dce7;p=lyx.git diff --git a/lib/lyx2lyx/lyx2lyx_tools.py b/lib/lyx2lyx/lyx2lyx_tools.py index 35da97f643..8f3e8a3960 100644 --- a/lib/lyx2lyx/lyx2lyx_tools.py +++ b/lib/lyx2lyx/lyx2lyx_tools.py @@ -1,6 +1,6 @@ # This file is part of lyx2lyx # -*- coding: utf-8 -*- -# Copyright (C) 2010 The LyX team +# Copyright (C) 2011 The LyX team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -14,10 +14,10 @@ # # 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. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ''' -This modules offer several free functions to help with lyx2lyx'ing. +This module offers several free functions to help with lyx2lyx'ing. More documentaton is below, but here is a quick guide to what they do. Optional arguments are marked by brackets. @@ -27,12 +27,15 @@ add_to_preamble(document, text): we will handle that properly. The routine checks to see whether the provided material is already in the preamble. If not, it adds it. + Prepends a comment "% Added by lyx2lyx" to text. -insert_to_preamble(index, document, text): +insert_to_preamble(document, text[, index]): Here, text can be either a single line or a list of lines. It is bad practice to pass something with embedded newlines, but we will handle that properly. - The routine inserts text at document.preamble[index]. + The routine inserts text at document.preamble[index], where by + default index is 0, so the material is inserted at the beginning. + Prepends a comment "% Added by lyx2lyx" to text. put_cmd_in_ert(arg): Here arg should be a list of strings (lines), which we want to @@ -56,13 +59,14 @@ latex_length(slen): ''' +import re import string -from parser_tools import find_token +from parser_tools import find_token, find_end_of_inset from unicode_symbols import unicode_reps # This will accept either a list of lines or a single line. -# It is bad practice to pass something with embedded newlines, +# It is bad practice to pass something with embedded newlines, # though we will handle that. def add_to_preamble(document, text): " Add text to the preamble if it is not already there. " @@ -89,12 +93,13 @@ def add_to_preamble(document, text): if matched: return + document.preamble.extend(["% Added by lyx2lyx"]) document.preamble.extend(text) # Note that text can be either a list of lines or a single line. # It should really be a list. -def insert_to_preamble(index, document, text): +def insert_to_preamble(document, text, index = 0): """ Insert text to the preamble at a given line""" if not type(text) is list: @@ -102,7 +107,8 @@ def insert_to_preamble(index, document, text): # it'll give us the one element list we want # if there's no \n, too text = text.split('\n') - + + text.insert(0, "% Added by lyx2lyx") document.preamble[index:index] = text @@ -112,7 +118,7 @@ def put_cmd_in_ert(arg): Returns a list of strings, with the lines so wrapped. ''' - ret = ["\\begin_inset ERT", "status collapsed", "\\begin_layout Plain Layout", ""] + ret = ["\\begin_inset ERT", "status collapsed", "", "\\begin_layout Plain Layout", ""] # It will be faster for us to work with a single string internally. # That way, we only go through the unicode_reps loop once. if type(arg) is list: @@ -120,13 +126,44 @@ def put_cmd_in_ert(arg): else: s = arg for rep in unicode_reps: - s = s.replace(rep[1], rep[0].replace('\\\\', '\\')) + s = s.replace(rep[1], rep[0]) s = s.replace('\\', "\\backslash\n") ret += s.splitlines() - ret += ["\\end_layout", "\\end_inset"] + ret += ["\\end_layout", "", "\\end_inset"] + return ret + + +def get_ert(lines, i): + 'Convert an ERT inset into LaTeX.' + if not lines[i].startswith("\\begin_inset ERT"): + return "" + j = find_end_of_inset(lines, i) + if j == -1: + return "" + while i < j and not lines[i].startswith("status"): + i = i + 1 + i = i + 1 + ret = "" + first = True + while i < j: + if lines[i] == "\\begin_layout Plain Layout": + if first: + first = False + else: + ret = ret + "\n" + while i + 1 < j and lines[i+1] == "": + i = i + 1 + elif lines[i] == "\\end_layout": + while i + 1 < j and lines[i+1] == "": + i = i + 1 + elif lines[i] == "\\backslash": + ret = ret + "\\" + else: + ret = ret + lines[i] + i = i + 1 return ret - + def lyx2latex(document, lines): 'Convert some LyX stuff into corresponding LaTeX stuff, as best we can.' @@ -168,6 +205,10 @@ def lyx2latex(document, lines): line = "''" else: line = "'" + elif line.startswith("\\begin_inset Newline newline"): + line = "\\\\ " + elif line.startswith("\\noindent"): + line = "\\noindent " # we need the space behind the command elif line.startswith("\\begin_inset space"): line = line[18:].strip() if line.startswith("\\hspace"): @@ -214,7 +255,7 @@ def lyx2latex(document, lines): # Do the LyX text --> LaTeX conversion for rep in unicode_reps: - line = line.replace(rep[1], rep[0] + "{}") + line = line.replace(rep[1], rep[0]) line = line.replace(r'\backslash', r'\textbackslash{}') line = line.replace(r'\series bold', r'\bfseries{}').replace(r'\series default', r'\mdseries{}') line = line.replace(r'\shape italic', r'\itshape{}').replace(r'\shape smallcaps', r'\scshape{}') @@ -247,7 +288,7 @@ def latex_length(slen): units = {"text%":"\\textwidth", "col%":"\\columnwidth", "page%":"\\paperwidth", "line%":"\\linewidth", "theight%":"\\textheight", "pheight%":"\\paperheight"} - for unit in units.keys(): + for unit in list(units.keys()): i = slen.find(unit) if i == -1: continue @@ -283,6 +324,44 @@ def latex_length(slen): return (percent, slen) +def length_in_bp(length): + " Convert a length in LyX format to its value in bp units " + + em_width = 10.0 / 72.27 # assume 10pt font size + text_width = 8.27 / 1.7 # assume A4 with default margins + # scale factors are taken from Length::inInch() + scales = {"bp" : 1.0, + "cc" : (72.0 / (72.27 / (12.0 * 0.376 * 2.845))), + "cm" : (72.0 / 2.54), + "dd" : (72.0 / (72.27 / (0.376 * 2.845))), + "em" : (72.0 * em_width), + "ex" : (72.0 * em_width * 0.4305), + "in" : 72.0, + "mm" : (72.0 / 25.4), + "mu" : (72.0 * em_width / 18.0), + "pc" : (72.0 / (72.27 / 12.0)), + "pt" : (72.0 / (72.27)), + "sp" : (72.0 / (72.27 * 65536.0)), + "text%" : (72.0 * text_width / 100.0), + "col%" : (72.0 * text_width / 100.0), # assume 1 column + "page%" : (72.0 * text_width * 1.7 / 100.0), + "line%" : (72.0 * text_width / 100.0), + "theight%" : (72.0 * text_width * 1.787 / 100.0), + "pheight%" : (72.0 * text_width * 2.2 / 100.0)} + + rx = re.compile(r'^\s*([^a-zA-Z%]+)([a-zA-Z%]+)\s*$') + m = rx.match(length) + if not m: + document.warning("Invalid length value: " + length + ".") + return 0 + value = m.group(1) + unit = m.group(2) + if not unit in scales.keys(): + document.warning("Unknown length unit: " + unit + ".") + return value + return "%g" % (float(value) * scales[unit]) + + def revert_flex_inset(lines, name, LaTeXname): " Convert flex insets to TeX code " i = 0