X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Flyx2lyx%2Flyx2lyx_tools.py;h=75a5c820def0b75b958f5b13505e2780ff08fcec;hb=abf38e1820a6e491fe19211538436b0680866879;hp=51412e5b31378aed4d27438b93db03c52dfdeca8;hpb=0ec295d63ef1ae59ab016214d4934585d351ccc4;p=lyx.git diff --git a/lib/lyx2lyx/lyx2lyx_tools.py b/lib/lyx2lyx/lyx2lyx_tools.py index 51412e5b31..75a5c820de 100644 --- a/lib/lyx2lyx/lyx2lyx_tools.py +++ b/lib/lyx2lyx/lyx2lyx_tools.py @@ -84,12 +84,14 @@ insert_document_option(document, option): remove_document_option(document, option): Remove _option_ as a document option. -get_language_for_line(document, i): - Return the language setting for line number i. +revert_language(document, lyxname, babelname, polyglossianame): + Reverts native language support to ERT + If babelname or polyglossianame is empty, it is assumed + this language package is not supported for the given language. ''' import re -from parser_tools import find_token, find_end_of_inset, get_containing_layout +from parser_tools import find_token, find_end_of_inset, get_containing_layout, get_value, get_bool_value from unicode_symbols import unicode_reps # This will accept either a list of lines or a single line. @@ -468,7 +470,7 @@ def revert_font_attrs(lines, name, LaTeXname): while True: i = find_token(lines, name + ' on', i) if i == -1: - return changed + break j = find_token(lines, name + ' default', i) k = find_token(lines, name + ' on', i + 1) # if there is no default set, the style ends with the layout @@ -482,6 +484,16 @@ def revert_font_attrs(lines, name, LaTeXname): changed = True i += 1 + # now delete all remaining lines that manipulate this attribute + i = 0 + while True: + i = find_token(lines, name, i) + if i == -1: + break + del lines[i] + + return changed + def revert_layout_command(lines, name, LaTeXname): " Reverts a command from a layout to TeX code " @@ -560,7 +572,7 @@ def insert_document_option(document, option): return # add it to the end of the options - document.header[options_line] += " ,%s" % option + document.header[options_line] += ",%s" % option def remove_document_option(document, option): @@ -609,13 +621,155 @@ def is_document_option(document, option): return True -def get_language_for_line(document, i): - " Return the language for line number i" - layout = get_containing_layout(document.body, i) - if not layout: - return document.language - start_of_par = layout[3] - for line in document.body[i:start_of_par:-1]: - if line.startswith('\\lang '): - return line[len('\\lang '):] - return document.language +def revert_language(document, lyxname, babelname, polyglossianame): + " Revert native language support " + + # Are we using polyglossia? + use_polyglossia = False + if get_bool_value(document.header, "\\use_non_tex_fonts"): + i = find_token(document.header, "\\language_package") + if i == -1: + document.warning("Malformed document! Missing \\language_package") + else: + pack = get_value(document.header, "\\language_package", i) + if pack == "default" or pack == "auto": + use_polyglossia = True + + # Do we use this language with polyglossia? + with_polyglossia = use_polyglossia and polyglossianame != "" + # Do we use this language with babel? + with_babel = with_polyglossia == False and babelname != "" + + # Are we dealing with a primary or secondary language? + primary = False + secondary = False + + orig_doc_language = document.language + # Main language first + if document.language == lyxname: + primary = True + document.language = "english" + i = find_token(document.header, "\\language %s" % lyxname, 0) + if i != -1: + document.header[i] = "\\language english" + j = find_token(document.header, "\\language_package default", 0) + if j != -1: + document.header[j] = "\\language_package default" + if with_polyglossia: + add_to_preamble(document, ["\\AtBeginDocument{\setotherlanguage{%s}}" % polyglossianame]) + document.body[2 : 2] = ["\\begin_layout Standard", + "\\begin_inset ERT", "status open", "", + "\\begin_layout Plain Layout", "", "", + "\\backslash", + "resetdefaultlanguage{%s}" % polyglossianame, + "\\end_layout", "", "\\end_inset", "", "", + "\\end_layout", ""] + + # Now secondary languages + i = 0 + while True: + i = find_token(document.body, '\\lang', i) + if i == -1: + break + if document.body[i].startswith('\\lang %s' % lyxname): + secondary = True + endlang = get_containing_layout(document.body, i)[2] + langswitch = find_token(document.body, '\\lang', i + 1, endlang) + startlayout = "\\begin_layout Standard" + endlayout = "\\end_layout" + if langswitch != -1: + endlang = langswitch + startlayout = "" + endlayout = "" + if with_polyglossia: + add_to_preamble(document, ["\\AtBeginDocument{\setotherlanguage{%s}}" % polyglossianame]) + document.body[endlang : endlang] = [startlayout, + "\\begin_inset ERT", "status open", "", + "\\begin_layout Plain Layout", "", "", + "\\backslash", + "end{%s}" % polyglossianame, + "\\end_layout", "", "\\end_inset", "", "", + endlayout, ""] + elif with_babel: + document.body[endlang : endlang] = [startlayout, + "\\begin_inset ERT", "status open", "", + "\\begin_layout Plain Layout", "", "", + "\\backslash", + "end{otherlanguage}", + "\\end_layout", "", "\\end_inset", "", "", + endlayout, ""] + del document.body[i] + if with_polyglossia: + document.body[i : i] = ["\\begin_inset ERT", "status open", "", + "\\begin_layout Plain Layout", "", "", + "\\backslash", + "begin{%s}" % polyglossianame, + "\\end_layout", "", "\\end_inset", "", "", + ""] + elif with_babel: + document.body[i : i] = ["\\begin_inset ERT", "status open", "", + "\\begin_layout Plain Layout", "", "", + "\\backslash", + "begin{otherlanguage}{%s}" % babelname, + "\\end_layout", "", "\\end_inset", "", "", + ""] + elif primary and document.body[i].startswith('\\lang english'): + # Since we switched the main language manually, English parts need to be marked + endlang = get_containing_layout(document.body, i)[2] + langswitch = find_token(document.body, '\\lang', i + 1, endlang) + startlayout = "\\begin_layout Standard" + endlayout = "\\end_layout" + if langswitch != -1: + endlang = langswitch + startlayout = "" + endlayout = "" + if with_polyglossia: + parent = get_containing_layout(document.body, i) + document.body[endlang : endlang] = [startlayout, + "\\begin_inset ERT", "status open", "", + "\\begin_layout Plain Layout", "", "", + "\\backslash", + "end{english}", + "\\end_layout", "", "\\end_inset", "", "", + endlayout, ""] + elif with_babel: + parent = get_containing_layout(document.body, i) + document.body[endlang : endlang] = [startlayout, + "\\begin_inset ERT", "status open", "", + "\\begin_layout Plain Layout", "", "", + "\\backslash", + "end{otherlanguage}", + "\\end_layout", "", "\\end_inset", "", "", + endlayout, ""] + del document.body[i] + if with_polyglossia: + document.body[i : i] = ["\\begin_inset ERT", "status open", "", + "\\begin_layout Plain Layout", "", "", + "\\backslash", + "begin{english}", + "\\end_layout", "", "\\end_inset", "", "", + ""] + elif with_babel: + document.body[i : i] = ["\\begin_inset ERT", "status open", "", + "\\begin_layout Plain Layout", "", "", + "\\backslash", + "begin{otherlanguage}{english}", + "\\end_layout", "", "\\end_inset", "", "", + ""] + else: + i += 1 + + # With babel, we need to add the language options + if with_babel and (primary or secondary): + insert_document_option(document, babelname) + if secondary and document.body[10] != "selectlanguage{%s}" % orig_doc_language: + # Since the user options are always placed after the babel options, + # we need to reset the main language + document.body[2 : 2] = ["\\begin_layout Standard", + "\\begin_inset ERT", "status open", "", + "\\begin_layout Plain Layout", "", "", + "\\backslash", + "selectlanguage{%s}" % orig_doc_language, + "\\end_layout", "", "\\end_inset", "", "", + "\\end_layout", ""] +