]> git.lyx.org Git - features.git/commitdiff
Enhance revert_language function
authorJuergen Spitzmueller <spitz@lyx.org>
Sun, 10 Mar 2019 11:36:06 +0000 (12:36 +0100)
committerJuergen Spitzmueller <spitz@lyx.org>
Sun, 10 Mar 2019 11:36:06 +0000 (12:36 +0100)
This should now consider all cases (many of which were not handled so far)

lib/lyx2lyx/lyx2lyx_tools.py

index 099f62f29b22b0f99f1f922b3e709ce23c337ba5..a2930dee43899f6a6636bb9df83a6be8f5ba2cff 100644 (file)
@@ -635,8 +635,18 @@ def revert_language(document, lyxname, babelname, polyglossianame):
             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
+
     # Main language first
     if document.language == lyxname:
+        primary = True
         document.language = "english"
         i = find_token(document.header, "\\language %s" % lyxname, 0)
         if i != -1:
@@ -644,7 +654,7 @@ def revert_language(document, lyxname, babelname, polyglossianame):
         j = find_token(document.header, "\\language_package default", 0)
         if j != -1:
             document.header[j] = "\\language_package default"
-        if use_polyglossia and polyglossianame != "":
+        if with_polyglossia:
             add_to_preamble(document, ["\\AtBeginDocument{\setotherlanguage{%s}}" % polyglossianame])
             document.body[2 : 2] = ["\\begin_layout Standard",
                                     "\\begin_inset ERT", "status open", "",
@@ -653,42 +663,104 @@ def revert_language(document, lyxname, babelname, polyglossianame):
                                     "resetdefaultlanguage{%s}" % polyglossianame,
                                     "\\end_layout", "", "\\end_inset", "", "",
                                     "\\end_layout", ""]
-        elif babelname != "":
-            k = find_token(document.header, "\\options")
-            if k != -1:
-                document.header[k] = document.header[k].replace("\\options",
-                                    "\\options %s," % babelname)
-            else:
-                l = find_token(document.header, "\\use_default_options")
-                document.header.insert(l + 1, "\\options %s," % babelname)
 
-    # now inline switches
-    envname = babelname
-    if use_polyglossia:
-        envname = polyglossianame
+    # Now secondary languages
     i = 0
     while True:
         i = find_token(document.body, '\\lang', i)
         if i == -1:
             return
         if document.body[i].startswith('\\lang %s' % lyxname):
-            if use_polyglossia and polyglossianame != "":
+            secondary = True
+            if with_polyglossia:
                 add_to_preamble(document, ["\\AtBeginDocument{\setotherlanguage{%s}}" % polyglossianame])
-            if (use_polyglossia and polyglossianame != "") or (use_polyglossia == False and babelname != ""):
                 parent = get_containing_layout(document.body, i)
                 document.body[parent[2] : parent[2]] = ["\\begin_layout Standard",
                                         "\\begin_inset ERT", "status open", "",
                                         "\\begin_layout Plain Layout", "", "",
                                         "\\backslash",
-                                        "end{%s}" % envname,
+                                        "end{%s}" % polyglossianame,
+                                        "\\end_layout", "", "\\end_inset", "", "",
+                                        "\\end_layout", ""]
+            elif with_babel:
+                parent = get_containing_layout(document.body, i)
+                document.body[parent[2] : parent[2]] = ["\\begin_layout Standard",
+                                        "\\begin_inset ERT", "status open", "",
+                                        "\\begin_layout Plain Layout", "", "",
+                                        "\\backslash",
+                                        "end{otherlanguage}",
+                                        "\\end_layout", "", "\\end_inset", "", "",
+                                        "\\end_layout", ""]
+            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
+            if with_polyglossia:
+                parent = get_containing_layout(document.body, i)
+                document.body[parent[2] : parent[2]] = ["\\begin_layout Standard",
+                                        "\\begin_inset ERT", "status open", "",
+                                        "\\begin_layout Plain Layout", "", "",
+                                        "\\backslash",
+                                        "end{english}",
+                                        "\\end_layout", "", "\\end_inset", "", "",
+                                        "\\end_layout", ""]
+            elif with_babel:
+                parent = get_containing_layout(document.body, i)
+                document.body[parent[2] : parent[2]] = ["\\begin_layout Standard",
+                                        "\\begin_inset ERT", "status open", "",
+                                        "\\begin_layout Plain Layout", "", "",
+                                        "\\backslash",
+                                        "end{otherlanguage}",
                                         "\\end_layout", "", "\\end_inset", "", "",
                                         "\\end_layout", ""]
             del document.body[i]
-            if (use_polyglossia and polyglossianame != "") or (use_polyglossia == False and babelname != ""):
+            if with_polyglossia:
                 document.body[i : i] = ["\\begin_inset ERT", "status open", "",
                                         "\\begin_layout Plain Layout", "", "",
                                         "\\backslash",
-                                        "begin{%s}" % envname,
+                                        "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):
+            k = find_token(document.header, "\\options")
+            if k != -1:
+                opts = get_value(document.header, "\\options", i)
+                document.header[k] = "\\options %s,%s" % (opts, babelname)
+            else:
+                l = find_token(document.header, "\\use_default_options")
+                document.header.insert(l + 1, "\\options %s" % babelname)
+            if secondary:
+                # 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}" % document.language,
+                                        "\\end_layout", "", "\\end_inset", "", "",
+                                        "\\end_layout", ""]