]> git.lyx.org Git - lyx.git/blobdiff - lib/lyx2lyx/lyx_2_3.py
whitespace.
[lyx.git] / lib / lyx2lyx / lyx_2_3.py
index 3a1b292cc2adeb35f8a075cf9fed06d1e6056044..322f495991e508d8088ce018642f56d0e9662940 100644 (file)
@@ -25,13 +25,14 @@ import sys, os
 
 # Uncomment only what you need to import, please.
 
-from parser_tools import find_end_of#, find_token, find_tokens, \
-#  find_token_exact, find_end_of_inset, find_end_of_layout, \
-#  find_token_backwards, is_in_inset, get_value, get_quoted_value, \
+from parser_tools import find_end_of, find_token_backwards, find_end_of_layout#,
+#  find_token, find_tokens, \
+#  find_token_exact, find_end_of_inset, \
+#  is_in_inset, get_value, get_quoted_value, \
 #  del_token, check_token, get_option_value, get_bool_value
 
 from parser_tools import find_token, find_end_of_inset, get_value, \
-     get_bool_value
+     get_bool_value, get_containing_layout
 
 from lyx2lyx_tools import add_to_preamble, put_cmd_in_ert
 #  get_ert, lyx2latex, \
@@ -96,6 +97,15 @@ def convert_dateinset(document):
         continue
 
 
+def convert_inputenc(document):
+    " Replace no longer supported input encoding settings. "
+    i = find_token(document.header, "\\inputenc", 0)
+    if i == -1:
+        return
+    if get_value(document.header, "\\inputencoding", i) == "pt254":
+        document.header[i] = "\\inputencoding pt154"
+    
+
 def convert_ibranches(document):
     ' Add "inverted 0" to branch insets'
     i = 0
@@ -190,47 +200,48 @@ def revert_beamer_article_styles(document):
     if document.textclass == "scrarticle-beamer":
         inclusion = "scrartcl.layout"
 
-    while True:
-        i = find_token(document.header, "\\begin_local_layout", 0)
-        if i == -1:
-            k = find_token(document.header, "\\language", 0)
-            if k == -1:
-                # this should not happen
-                document.warning("Malformed LyX document! No \\language header found!")
-                break
-            document.header[k-1 : k-1] = ["\\begin_local_layout", "\\end_local_layout"]
-            i = find_token(document.header, "\\begin_local_layout", 0)
-        if i != -1:
-            j = find_end_of(document.header, i, "\\begin_local_layout", "\\end_local_layout")
-            if j == -1:
-                # this should not happen
-                break
-
-            document.header[i+1 : i+1] = ["### Inserted by lyx2lyx (more [scr]article styles) ###",
-                                          "Input " + inclusion,
-                                          "Input beamer.layout",
-                                          "Provides geometry 0",
-                                          "Provides hyperref 0",
-                                          "DefaultFont",
-                                          "    Family                Roman",
-                                          "    Series                Medium",
-                                          "    Shape                 Up",
-                                          "    Size                  Normal",
-                                          "    Color                 None",
-                                          "EndFont",
-                                          "Preamble",
-                                          "    \\usepackage{beamerarticle,pgf}",
-                                          "    % this default might be overridden by plain title style",
-                                          "    \\newcommand\makebeamertitle{\\frame{\\maketitle}}%",
-                                          "    \\AtBeginDocument{",
-                                          "            \\let\\origtableofcontents=\\tableofcontents",
-                                          "            \\def\\tableofcontents{\\@ifnextchar[{\\origtableofcontents}{\\gobbletableofcontents}}",
-                                          "            \\def\\gobbletableofcontents#1{\\origtableofcontents}",
-                                          "    }",
-                                          "EndPreamble",
-                                          "### End of insertion by lyx2lyx (more [scr]article styles) ###"]
+    i = find_token(document.header, "\\begin_local_layout", 0)
+    if i == -1:
+        k = find_token(document.header, "\\language", 0)
+        if k == -1:
+            # this should not happen
+            document.warning("Malformed LyX document! No \\language header found!")
+            return
+        document.header[k-1 : k-1] = ["\\begin_local_layout", "\\end_local_layout"]
+        i = k - 1
+
+    j = find_end_of(document.header, i, "\\begin_local_layout", "\\end_local_layout")
+    if j == -1:
+        # this should not happen
+        document.warning("Malformed LyX document: Can't find end of local layout!")
         return
 
+    document.header[i+1 : i+1] = [
+        "### Inserted by lyx2lyx (more [scr]article styles) ###",
+        "Input " + inclusion,
+        "Input beamer.layout",
+        "Provides geometry 0",
+        "Provides hyperref 0",
+        "DefaultFont",
+        "     Family                Roman",
+        "     Series                Medium",
+        "     Shape                 Up",
+        "     Size                  Normal",
+        "     Color                 None",
+        "EndFont",
+        "Preamble",
+        "     \\usepackage{beamerarticle,pgf}",
+        "     % this default might be overridden by plain title style",
+        "     \\newcommand\makebeamertitle{\\frame{\\maketitle}}%",
+        "     \\AtBeginDocument{",
+        "             \\let\\origtableofcontents=\\tableofcontents",
+        "             \\def\\tableofcontents{\\@ifnextchar[{\\origtableofcontents}{\\gobbletableofcontents}}",
+        "             \\def\\gobbletableofcontents#1{\\origtableofcontents}",
+        "     }",
+        "EndPreamble",
+        "### End of insertion by lyx2lyx (more [scr]article styles) ###"
+    ]
+
 
 def convert_beamer_article_styles(document):
     " Remove included (scr)article styles in beamer article "
@@ -239,28 +250,30 @@ def convert_beamer_article_styles(document):
     if document.textclass not in beamer_articles:
         return
 
-    while True:
-        i = find_token(document.header, "\\begin_local_layout", 0)
-        if i == -1:
-            return
+    i = find_token(document.header, "\\begin_local_layout", 0)
+    if i == -1:
+        return
 
-        j = find_end_of(document.header, i, "\\begin_local_layout", "\\end_local_layout")
-        if j == -1:
-            # this should not happen
-            break
+    j = find_end_of(document.header, i, "\\begin_local_layout", "\\end_local_layout")
+    if j == -1:
+        # this should not happen
+        document.warning("Malformed LyX document: Can't find end of local layout!")
+        return
 
-        k = find_token(document.header, "### Inserted by lyx2lyx (more [scr]article styles) ###", i, j)
-        if k != -1:
-            l = find_token(document.header, "### End of insertion by lyx2lyx (more [scr]article styles) ###", i, j)
-            if l == -1:
-                # this should not happen
-                document.warning("End of lyx2lyx local layout insertion not found!")
-                break
+    k = find_token(document.header, "### Inserted by lyx2lyx (more [scr]article styles) ###", i, j)
+    if k != -1:
+        l = find_token(document.header, "### End of insertion by lyx2lyx (more [scr]article styles) ###", i, j)
+        if l == -1:
+            # this should not happen
+            document.warning("End of lyx2lyx local layout insertion not found!")
+            return
 
+        if k == i + 1 and l == j - 1:
+            # that was all the local layout there was
+            document.header[i : j + 1] = []
+        else:
             document.header[k : l + 1] = []
 
-        return
-
 
 def revert_bosnian(document):
     "Set the document language to English but assure Bosnian output"
@@ -269,16 +282,16 @@ def revert_bosnian(document):
         document.language = "english"
         i = find_token(document.header, "\\language bosnian", 0)
         if i != -1:
-           document.header[i] = "\\language english"
+            document.header[i] = "\\language english"
         j = find_token(document.header, "\\language_package default", 0)
         if j != -1:
-           document.header[j] = "\\language_package babel"
+            document.header[j] = "\\language_package babel"
         k = find_token(document.header, "\\options", 0)
         if k != -1:
-           document.header[k] = document.header[k].replace("\\options", "\\options bosnian,")
+            document.header[k] = document.header[k].replace("\\options", "\\options bosnian,")
         else:
-           l = find_token(document.header, "\\use_default_options", 0)
-           document.header.insert(l + 1, "\\options bosnian")
+            l = find_token(document.header, "\\use_default_options", 0)
+            document.header.insert(l + 1, "\\options bosnian")
 
 
 def revert_friulan(document):
@@ -288,16 +301,16 @@ def revert_friulan(document):
         document.language = "english"
         i = find_token(document.header, "\\language friulan", 0)
         if i != -1:
-           document.header[i] = "\\language english"
+            document.header[i] = "\\language english"
         j = find_token(document.header, "\\language_package default", 0)
         if j != -1:
-           document.header[j] = "\\language_package babel"
+            document.header[j] = "\\language_package babel"
         k = find_token(document.header, "\\options", 0)
         if k != -1:
-           document.header[k] = document.header[k].replace("\\options", "\\options friulan,")
+            document.header[k] = document.header[k].replace("\\options", "\\options friulan,")
         else:
-           l = find_token(document.header, "\\use_default_options", 0)
-           document.header.insert(l + 1, "\\options friulan")
+            l = find_token(document.header, "\\use_default_options", 0)
+            document.header.insert(l + 1, "\\options friulan")
 
 
 def revert_macedonian(document):
@@ -307,16 +320,16 @@ def revert_macedonian(document):
         document.language = "english"
         i = find_token(document.header, "\\language macedonian", 0)
         if i != -1:
-           document.header[i] = "\\language english"
+            document.header[i] = "\\language english"
         j = find_token(document.header, "\\language_package default", 0)
         if j != -1:
-           document.header[j] = "\\language_package babel"
+            document.header[j] = "\\language_package babel"
         k = find_token(document.header, "\\options", 0)
         if k != -1:
-           document.header[k] = document.header[k].replace("\\options", "\\options macedonian,")
+            document.header[k] = document.header[k].replace("\\options", "\\options macedonian,")
         else:
-           l = find_token(document.header, "\\use_default_options", 0)
-           document.header.insert(l + 1, "\\options macedonian")
+            l = find_token(document.header, "\\use_default_options", 0)
+            document.header.insert(l + 1, "\\options macedonian")
 
 
 def revert_piedmontese(document):
@@ -326,16 +339,16 @@ def revert_piedmontese(document):
         document.language = "english"
         i = find_token(document.header, "\\language piedmontese", 0)
         if i != -1:
-           document.header[i] = "\\language english"
+            document.header[i] = "\\language english"
         j = find_token(document.header, "\\language_package default", 0)
         if j != -1:
-           document.header[j] = "\\language_package babel"
+            document.header[j] = "\\language_package babel"
         k = find_token(document.header, "\\options", 0)
         if k != -1:
-           document.header[k] = document.header[k].replace("\\options", "\\options piedmontese,")
+            document.header[k] = document.header[k].replace("\\options", "\\options piedmontese,")
         else:
-           l = find_token(document.header, "\\use_default_options", 0)
-           document.header.insert(l + 1, "\\options piedmontese")
+            l = find_token(document.header, "\\use_default_options", 0)
+            document.header.insert(l + 1, "\\options piedmontese")
 
 
 def revert_romansh(document):
@@ -345,16 +358,16 @@ def revert_romansh(document):
         document.language = "english"
         i = find_token(document.header, "\\language romansh", 0)
         if i != -1:
-           document.header[i] = "\\language english"
+            document.header[i] = "\\language english"
         j = find_token(document.header, "\\language_package default", 0)
         if j != -1:
-           document.header[j] = "\\language_package babel"
+            document.header[j] = "\\language_package babel"
         k = find_token(document.header, "\\options", 0)
         if k != -1:
-           document.header[k] = document.header[k].replace("\\options", "\\options romansh,")
+            document.header[k] = document.header[k].replace("\\options", "\\options romansh,")
         else:
-           l = find_token(document.header, "\\use_default_options", 0)
-           document.header.insert(l + 1, "\\options romansh")
+            l = find_token(document.header, "\\use_default_options", 0)
+            document.header.insert(l + 1, "\\options romansh")
 
 
 def revert_amharic(document):
@@ -364,10 +377,10 @@ def revert_amharic(document):
         document.language = "english"
         i = find_token(document.header, "\\language amharic", 0)
         if i != -1:
-           document.header[i] = "\\language english"
+            document.header[i] = "\\language english"
         j = find_token(document.header, "\\language_package default", 0)
         if j != -1:
-           document.header[j] = "\\language_package default"
+            document.header[j] = "\\language_package default"
         add_to_preamble(document, ["\\AtBeginDocument{\setotherlanguage{amharic}}"])
         document.body[2 : 2] = ["\\begin_layout Standard",
                                 "\\begin_inset ERT", "status open", "",
@@ -385,10 +398,10 @@ def revert_asturian(document):
         document.language = "english"
         i = find_token(document.header, "\\language asturian", 0)
         if i != -1:
-           document.header[i] = "\\language english"
+            document.header[i] = "\\language english"
         j = find_token(document.header, "\\language_package default", 0)
         if j != -1:
-           document.header[j] = "\\language_package default"
+            document.header[j] = "\\language_package default"
         add_to_preamble(document, ["\\AtBeginDocument{\setotherlanguage{asturian}}"])
         document.body[2 : 2] = ["\\begin_layout Standard",
                                 "\\begin_inset ERT", "status open", "",
@@ -406,10 +419,10 @@ def revert_kannada(document):
         document.language = "english"
         i = find_token(document.header, "\\language kannada", 0)
         if i != -1:
-           document.header[i] = "\\language english"
+            document.header[i] = "\\language english"
         j = find_token(document.header, "\\language_package default", 0)
         if j != -1:
-           document.header[j] = "\\language_package default"
+            document.header[j] = "\\language_package default"
         add_to_preamble(document, ["\\AtBeginDocument{\setotherlanguage{kannada}}"])
         document.body[2 : 2] = ["\\begin_layout Standard",
                                 "\\begin_inset ERT", "status open", "",
@@ -427,10 +440,10 @@ def revert_khmer(document):
         document.language = "english"
         i = find_token(document.header, "\\language khmer", 0)
         if i != -1:
-           document.header[i] = "\\language english"
+            document.header[i] = "\\language english"
         j = find_token(document.header, "\\language_package default", 0)
         if j != -1:
-           document.header[j] = "\\language_package default"
+            document.header[j] = "\\language_package default"
         add_to_preamble(document, ["\\AtBeginDocument{\setotherlanguage{khmer}}"])
         document.body[2 : 2] = ["\\begin_layout Standard",
                                 "\\begin_inset ERT", "status open", "",
@@ -441,6 +454,198 @@ def revert_khmer(document):
                                 "\\end_layout", ""]
 
 
+def revert_urdu(document):
+    "Set the document language to English but assure Urdu output"
+
+    if document.language == "urdu":
+        document.language = "english"
+        i = find_token(document.header, "\\language urdu", 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"
+        add_to_preamble(document, ["\\AtBeginDocument{\setotherlanguage{urdu}}"])
+        document.body[2 : 2] = ["\\begin_layout Standard",
+                                "\\begin_inset ERT", "status open", "",
+                                "\\begin_layout Plain Layout", "", "",
+                                "\\backslash",
+                                "resetdefaultlanguage{urdu}",
+                                "\\end_layout", "", "\\end_inset", "", "",
+                                "\\end_layout", ""]
+
+
+def revert_syriac(document):
+    "Set the document language to English but assure Syriac output"
+
+    if document.language == "syriac":
+        document.language = "english"
+        i = find_token(document.header, "\\language syriac", 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"
+        add_to_preamble(document, ["\\AtBeginDocument{\setotherlanguage{syriac}}"])
+        document.body[2 : 2] = ["\\begin_layout Standard",
+                                "\\begin_inset ERT", "status open", "",
+                                "\\begin_layout Plain Layout", "", "",
+                                "\\backslash",
+                                "resetdefaultlanguage{syriac}",
+                                "\\end_layout", "", "\\end_inset", "", "",
+                                "\\end_layout", ""]
+
+
+def revert_quotes(document):
+    " Revert Quote Insets in verbatim or Hebrew context to plain quotes "
+
+    # First handle verbatim insets
+    i = 0
+    j = 0
+    while i < len(document.body):
+        words = document.body[i].split()
+        if len(words) > 1 and words[0] == "\\begin_inset" and \
+           ( words[1] in ["ERT", "listings"] or ( len(words) > 2 and words[2] in ["URL", "Chunk", "Sweave", "S/R"]) ):
+            j = find_end_of_inset(document.body, i)
+            if j == -1:
+                document.warning("Malformed LyX document: Can't find end of " + words[1] + " inset at line " + str(i))
+                i += 1
+                continue
+            while True:
+                k = find_token(document.body, '\\begin_inset Quotes', i, j)
+                if k == -1:
+                    i += 1
+                    break
+                l = find_end_of_inset(document.body, k)
+                if l == -1:
+                    document.warning("Malformed LyX document: Can't find end of Quote inset at line " + str(k))
+                    i = k
+                    continue
+                replace = "\""
+                if document.body[k].endswith("s"):
+                    replace = "'"
+                document.body[k:l+1] = [replace]
+        else:
+            i += 1
+            continue
+
+    # Now verbatim layouts
+    i = 0
+    j = 0
+    while i < len(document.body):
+        words = document.body[i].split()
+        if len(words) > 1 and words[0] == "\\begin_layout" and \
+           words[1] in ["Verbatim", "Verbatim*", "Code", "Author_Email", "Author_URL"]:
+            j = find_end_of_layout(document.body, i)
+            if j == -1:
+                document.warning("Malformed LyX document: Can't find end of " + words[1] + " layout at line " + str(i))
+                i += 1
+                continue
+            while True:
+                k = find_token(document.body, '\\begin_inset Quotes', i, j)
+                if k == -1:
+                    i += 1
+                    break
+                l = find_end_of_inset(document.body, k)
+                if l == -1:
+                    document.warning("Malformed LyX document: Can't find end of Quote inset at line " + str(k))
+                    i = k
+                    continue
+                replace = "\""
+                if document.body[k].endswith("s"):
+                    replace = "'"
+                document.body[k:l+1] = [replace]
+        else:
+            i += 1
+            continue
+
+    # Now handle Hebrew
+    if not document.language == "hebrew" and find_token(document.body, '\\lang hebrew', 0) == -1:
+        return
+
+    i = 0
+    j = 0
+    while True:
+        k = find_token(document.body, '\\begin_inset Quotes', i)
+        if k == -1:
+            return
+        l = find_end_of_inset(document.body, k)
+        if l == -1:
+            document.warning("Malformed LyX document: Can't find end of Quote inset at line " + str(k))
+            i = k
+            continue
+        hebrew = False
+        parent = get_containing_layout(document.body, k)
+        ql = find_token_backwards(document.body, "\\lang", k)
+        if ql == -1 or ql < parent[1]:
+            hebrew = document.language == "hebrew"
+        elif document.body[ql] == "\\lang hebrew":
+            hebrew = True
+        if hebrew:
+            replace = "\""
+            if document.body[k].endswith("s"):
+                replace = "'"
+            document.body[k:l+1] = [replace]
+        i = l
+    
+
+def revert_iopart(document):
+    " Input new styles via local layout "
+    if document.textclass != "iopart":
+        return
+
+    i = find_token(document.header, "\\begin_local_layout", 0)
+    if i == -1:
+        k = find_token(document.header, "\\language", 0)
+        if k == -1:
+            # this should not happen
+            document.warning("Malformed LyX document! No \\language header found!")
+            return
+        document.header[k-1 : k-1] = ["\\begin_local_layout", "\\end_local_layout"]
+        i = k-1
+
+    j = find_end_of(document.header, i, "\\begin_local_layout", "\\end_local_layout")
+    if j == -1:
+        # this should not happen
+        document.warning("Malformed LyX document! Can't find end of local layout!")
+        return
+
+    document.header[i+1 : i+1] = [
+        "### Inserted by lyx2lyx (stdlayouts) ###",
+        "Input stdlayouts.inc",
+        "### End of insertion by lyx2lyx (stdlayouts) ###"
+    ]
+
+
+def convert_iopart(document):
+    " Remove local layout we added, if it is there "
+    if document.textclass != "iopart":
+        return
+
+    i = find_token(document.header, "\\begin_local_layout", 0)
+    if i == -1:
+        return
+
+    j = find_end_of(document.header, i, "\\begin_local_layout", "\\end_local_layout")
+    if j == -1:
+        # this should not happen
+        document.warning("Malformed LyX document! Can't find end of local layout!")
+        return
+
+    k = find_token(document.header, "### Inserted by lyx2lyx (stdlayouts) ###", i, j)
+    if k != -1:
+        l = find_token(document.header, "### End of insertion by lyx2lyx (stdlayouts) ###", i, j)
+        if l == -1:
+            # this should not happen
+            document.warning("End of lyx2lyx local layout insertion not found!")
+            return
+        if k == i + 1 and l == j - 1:
+            # that was all the local layout there was
+            document.header[i : j + 1] = []
+        else:
+            document.header[k : l + 1] = []
+
+
 ##
 # Conversion hub
 #
@@ -452,10 +657,18 @@ convert = [
            [511, [convert_ibranches]],
            [512, [convert_beamer_article_styles]],
            [513, []],
-           [514, []]
+           [514, []],
+           [515, []],
+           [516, [convert_inputenc]],
+           [517, []],
+           [518, [convert_iopart]]
           ]
 
 revert =  [
+           [517, [revert_iopart]],
+           [516, [revert_quotes]],
+           [515, []],
+           [514, [revert_urdu, revert_syriac]],
            [513, [revert_amharic, revert_asturian, revert_kannada, revert_khmer]],
            [512, [revert_bosnian, revert_friulan, revert_macedonian, revert_piedmontese, revert_romansh]],
            [511, [revert_beamer_article_styles]],