]> git.lyx.org Git - lyx.git/blobdiff - lib/lyx2lyx/lyx_2_2.py
Added Adobe Source Pro fonts to lyx-GUI
[lyx.git] / lib / lyx2lyx / lyx_2_2.py
index 342bb06119fcb1805390746cfca349a08345f857..d8d9ab65b55d00b5afa586e76771aa5a6af99668 100644 (file)
@@ -24,19 +24,12 @@ import sys, os
 
 # Uncomment only what you need to import, please.
 
-#from parser_tools import find_token, find_end_of, find_tokens, \
-#  find_token_exact, find_end_of_inset, find_end_of_layout, \
-#  find_token_backwards, is_in_inset, get_value, get_quoted_value, \
-#  del_token, check_token, get_option_value
-
 from lyx2lyx_tools import (add_to_preamble, put_cmd_in_ert, get_ert,
-    lyx2latex, lyx2verbatim, length_in_bp, convert_info_insets)
-#   insert_to_preamble, latex_length, revert_flex_inset,
-#   revert_font_attrs, hex2ratio, str2bool
+    lyx2latex, lyx2verbatim, length_in_bp, convert_info_insets, insert_document_option)
 
 from parser_tools import (check_token, del_complete_lines,
     find_end_of_inset, find_end_of_layout, find_nonempty_line, find_re,
-    find_token, find_token_backwards, get_containing_layout,
+    find_substring, find_token, find_token_backwards, get_containing_layout,
     get_containing_inset, get_quoted_value, get_value, is_in_inset,
     get_bool_value, set_bool_value)
 
@@ -189,6 +182,13 @@ def convert_separator(document):
 
         j = find_token_backwards(document.body, "\\end_layout", i-1)
         if j != -1:
+            # Very old LyX files do not have Plain Layout in insets (but Standard).
+            # So we additionally check here if there is no inset boundary
+            # between the previous layout and this one.
+            n = find_token(document.body, "\\end_inset", j, lay[1])
+            if n != -1:
+                i = i + 1
+                continue
             lay = get_containing_layout(document.body, j-1)
             if lay != False and lay[0] == "Standard" \
                and find_token(document.body, "\\align", lay[1], lay[2]) == -1 \
@@ -618,19 +618,18 @@ def convert_dashes(document):
     if document.backend != "latex":
         return
 
-    lines = document.body
     i = 0
-    while i+1 < len(lines):
-        i += 1
-        line = lines[i]
-        if "--" not in line:
-            continue
+    while True:
+        i = find_substring(document.body, "--", i+1)
+        if i == -1:
+            break
+        line = document.body[i]
         # skip label width string (bug 10243):
         if line.startswith("\\labelwidthstring"):
             continue
         # Do not touch hyphens in some insets:
         try:
-            value, start, end = get_containing_inset(lines, i)
+            value, start, end = get_containing_inset(document.body, i)
         except TypeError:
             # False means no (or malformed) containing inset
             value, start, end = "no inset", -1, -1
@@ -644,7 +643,7 @@ def convert_dashes(document):
             i = end
             continue
         try:
-            layout, start, end, j = get_containing_layout(lines, i)
+            layout, start, end, j = get_containing_layout(document.body, i)
         except TypeError: # no (or malformed) containing layout
             document.warning("Malformed LyX document: "
                              "Can't find layout at line %d" % i)
@@ -656,18 +655,18 @@ def convert_dashes(document):
         # Replace as LaTeX does: First try emdash, then endash
         line = line.replace("---", "\\threehyphens\n")
         line = line.replace("--", "\\twohyphens\n")
-        lines[i:i+1] = line.splitlines()
+        document.body[i:i+1] = line.split('\n')
 
     # remove ligature breaks between dashes
-    i = 1
-    while i < len(lines):
-        line = lines[i]
-        if (line.endswith(r"-\SpecialChar \textcompwordmark{}") and
-            lines[i+1].startswith("-")):
-            lines[i] = line.replace(r"\SpecialChar \textcompwordmark{}",
-                                    lines.pop(i+1))
-        else:
-            i += 1
+    i = 0
+    while True:
+        i = find_substring(document.body,
+                           r"-\SpecialChar \textcompwordmark{}", i+1)
+        if i == -1:
+            break
+        if document.body[i+1].startswith("-"):
+            document.body[i] = document.body[i].replace(
+                r"\SpecialChar \textcompwordmark{}", document.body.pop(i+1))
 
 
 def revert_dashes(document):
@@ -682,19 +681,18 @@ def revert_dashes(document):
                         r'\renewcommand{\textemdash}{---}'])
 
     # Insert ligature breaks to prevent ligation of hyphens to dashes:
-    lines = document.body
     i = 0
-    while i+1 < len(lines):
-        i += 1
-        line = lines[i]
-        if "--" not in line:
-            continue
+    while True:
+        i = find_substring(document.body, "--", i+1)
+        if i == -1:
+            break
+        line = document.body[i]
         # skip label width string (bug 10243):
         if line.startswith("\\labelwidthstring"):
             continue
         # do not touch hyphens in some insets (cf. convert_dashes):
         try:
-            value, start, end = get_containing_inset(lines, i)
+            value, start, end = get_containing_inset(document.body, i)
         except TypeError:
             # False means no (or malformed) containing inset
             value, start, end = "no inset", -1, -1
@@ -708,14 +706,14 @@ def revert_dashes(document):
 
     # Revert \twohyphens and \threehyphens:
     i = 1
-    while i < len(lines):
-        line = lines[i]
+    while i < len(document.body):
+        line = document.body[i]
         if not line.endswith("hyphens"):
             i +=1
         elif line.endswith("\\twohyphens") or line.endswith("\\threehyphens"):
             line = line.replace("\\twohyphens", "--")
             line = line.replace("\\threehyphens", "---")
-            lines[i] = line + lines.pop(i+1)
+            document.body[i] = line + document.body.pop(i+1)
         else:
             i += 1
 
@@ -740,27 +738,26 @@ def convert_phrases(document):
     if document.backend != "latex":
         return
 
-    for phrase in phrases:
-        i = 0
-        while i < len(document.body):
+    i = 0
+    while i < len(document.body):
+        if document.body[i] and document.body[i][0] == "\\":
             words = document.body[i].split()
             if len(words) > 1 and words[0] == "\\begin_inset" and \
-               words[1] in ["CommandInset", "External", "Formula", "Graphics", "listings"]:
+            words[1] in ["CommandInset", "External", "Formula", "Graphics", "listings"]:
                 # must not replace anything in insets that store LaTeX contents in .lyx files
                 # (math and command insets without overridden read() and write() methods)
                 j = find_end_of_inset(document.body, i)
                 if j == -1:
-                    document.warning("Malformed LyX document: Can't find end of inset at line " + str(i))
+                    document.warning("Malformed LyX document: Can't find end of inset at line %d" % (i))
                     i += 1
                 else:
                     i = j
-                continue
-            if document.body[i].find("\\") == 0:
+            else:
                 i += 1
-                continue
+            continue
+        for phrase in phrases:
             j = document.body[i].find(phrase)
             if j == -1:
-                i += 1
                 continue
             if not is_part_of_converted_phrase(document.body[i], j, phrase):
                 front = document.body[i][:j]
@@ -769,11 +766,11 @@ def convert_phrases(document):
                     document.body.insert(i+1, back)
                 # We cannot use SpecialChar since we do not know whether we are outside passThru
                 document.body[i] = front + "\\SpecialCharNoPassThru \\" + phrase
-            i += 1
+        i += 1
 
 
 def revert_phrases(document):
-    "convert special phrases to plain text"
+    "revert special phrases to plain text"
 
     i = 0
     while i < len(document.body):
@@ -818,16 +815,21 @@ def convert_specialchar_internal(document, forward):
 
     i = 0
     while i < len(document.body):
-        words = document.body[i].split()
-        if len(words) > 1 and words[0] == "\\begin_inset" and \
-           words[1] in ["CommandInset", "External", "Formula", "Graphics", "listings"]:
-            # see convert_phrases
-            j = find_end_of_inset(document.body, i)
-            if j == -1:
-                document.warning("Malformed LyX document: Can't find end of Formula inset at line " + str(i))
-                i += 1
-            else:
-                i = j
+        if document.body[i] and document.body[i][0] == "\\":
+            words = document.body[i].split()
+            if len(words) > 1 and words[0] == "\\begin_inset" and \
+            words[1] in ["CommandInset", "External", "Formula", "Graphics", "listings"]:
+                # see convert_phrases
+                j = find_end_of_inset(document.body, i)
+                if j == -1:
+                    document.warning("Malformed LyX document: Can't find end of %s inset at line %d" % (words[1], i))
+                    i += 1
+                else:
+                    i = j
+                continue
+            # else...
+        if not "\\SpecialChar" in document.body[i]:
+            i += 1
             continue
         for key, value in specialchars.items():
             if forward:
@@ -860,12 +862,7 @@ def revert_georgian(document):
         j = find_token(document.header, "\\language_package default", 0)
         if j != -1:
             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 georgian,")
-        else:
-            l = find_token(document.header, "\\use_default_options", 0)
-            document.header.insert(l + 1, "\\options georgian")
+        insert_document_option(document, "georgian")
 
 
 def revert_sigplan_doi(document):
@@ -1288,7 +1285,7 @@ def revert_colorbox(document):
         if framecolor == "black" and backcolor == "none": # default values
             i += 15 # skip box option lines
             continue
-        
+
         # Emulate non-default colours with LaTeX code:
         einset = find_end_of_inset(document.body, i)
         if einset == -1: