]> git.lyx.org Git - lyx.git/blobdiff - lib/lyx2lyx/lyx_2_0.py
Length.cpp: add new unit representing \baselineskip
[lyx.git] / lib / lyx2lyx / lyx_2_0.py
index 51acf91d038c0d1f8f0e5d64eb7b172ee9fa410e..ad5636421bb23d16acfd4e9772b17a748bb62243 100644 (file)
@@ -1,6 +1,5 @@
 # -*- coding: utf-8 -*-
 # This file is part of lyx2lyx
-# -*- coding: utf-8 -*-
 # Copyright (C) 2011 The LyX team
 #
 # This program is free software; you can redistribute it and/or
@@ -15,7 +14,7 @@
 #
 # 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
 
 """ Convert files to the file format generated by lyx 2.0"""
 
@@ -27,7 +26,7 @@ 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, insert_to_preamble, \
   put_cmd_in_ert, lyx2latex, latex_length, revert_flex_inset, \
   revert_font_attrs, hex2ratio, str2bool
@@ -45,17 +44,6 @@ def remove_option(lines, m, option):
     return True
 
 
-# DO NOT USE THIS ROUTINE ANY MORE. Better yet, replace the uses that
-# have been made of it with uses of put_cmd_in_ert.
-def old_put_cmd_in_ert(string):
-    for rep in unicode_reps:
-        string = string.replace(rep[1], rep[0].replace('\\\\', '\\'))
-    string = string.replace('\\', "\\backslash\n")
-    string = "\\begin_inset ERT\nstatus collapsed\n\\begin_layout Plain Layout\n" \
-      + string + "\n\\end_layout\n\\end_inset"
-    return string
-
-
 ###############################################################################
 ###
 ### Conversion and reversion routines
@@ -100,10 +88,7 @@ def revert_tabularvalign(document):
       if p != -1:
           q = document.body[fline].find("tabularvalignment")
           if q != -1:
-              # FIXME
-              # This seems wrong: It removes everything after 
-              # tabularvalignment, too.
-              document.body[fline] = document.body[fline][:q - 1] + '>'
+              document.body[fline] = re.sub(r' tabularvalignment=\"[a-z]+\"', "", document.body[fline])
           i += 1
           continue
 
@@ -119,16 +104,13 @@ def revert_tabularvalign(document):
       # delete tabularvalignment
       q = document.body[fline].find("tabularvalignment")
       if q != -1:
-          # FIXME
-          # This seems wrong: It removes everything after 
-          # tabularvalignment, too.
-          document.body[fline] = document.body[fline][:q - 1] + '>'
+          document.body[fline] = re.sub(r' tabularvalignment=\"[a-z]+\"', "", document.body[fline])
 
       # don't add a box when centered
       if tabularvalignment == 'c':
           i = end
           continue
-      subst = ['\\end_layout', '\\end_inset']
+      subst = ['\\end_inset', '\\end_layout']
       document.body[end:end] = subst # just inserts those lines
       subst = ['\\begin_inset Box Frameless',
           'position "' + tabularvalignment +'"',
@@ -173,7 +155,7 @@ def revert_phantom_types(document, ptype, cmd):
           i = end
           continue
       substi = ["\\begin_inset ERT", "status collapsed", "",
-                "\\begin_layout Plain Layout", "", "", "\\backslash", 
+                "\\begin_layout Plain Layout", "", "", "\\backslash",
                 cmd + "{", "\\end_layout", "", "\\end_inset"]
       substj = ["\\size default", "", "\\begin_inset ERT", "status collapsed", "",
                 "\\begin_layout Plain Layout", "", "}", "\\end_layout", "", "\\end_inset"]
@@ -185,7 +167,7 @@ def revert_phantom_types(document, ptype, cmd):
 
 def revert_phantom(document):
     revert_phantom_types(document, "Phantom", "phantom")
-    
+
 def revert_hphantom(document):
     revert_phantom_types(document, "HPhantom", "hphantom")
 
@@ -217,7 +199,7 @@ def revert_xetex(document):
     roman = sans = typew = "default"
     osf = False
     sf_scale = tt_scale = 100.0
-    
+
     i = find_token(document.header, "\\font_roman", 0)
     if i == -1:
         document.warning("Malformed LyX document: Missing \\font_roman.")
@@ -231,7 +213,7 @@ def revert_xetex(document):
     else:
         sans = get_value(document.header, "\\font_sans", i)
         document.header[i] = "\\font_sans default"
-    
+
     i = find_token(document.header, "\\font_typewriter", 0)
     if i == -1:
         document.warning("Malformed LyX document: Missing \\font_typewriter.")
@@ -252,7 +234,7 @@ def revert_xetex(document):
     else:
         # we do not need this value.
         document.header[i] = "\\font_sc false"
-    
+
     i = find_token(document.header, "\\font_sf_scale", 0)
     if i == -1:
         document.warning("Malformed LyX document: Missing \\font_sf_scale.")
@@ -296,14 +278,14 @@ def revert_xetex(document):
         pretext.append(tw)
     if osf:
         pretext.append('\\defaultfontfeatures{Numbers=OldStyle}')
-    pretext.append('\usepackage{xunicode}')
-    pretext.append('\usepackage{xltxtra}')
+    pretext.append('\\usepackage{xunicode}')
+    pretext.append('\\usepackage{xltxtra}')
     insert_to_preamble(document, pretext)
 
 
 def revert_outputformat(document):
     " Remove default output format param "
-    
+
     if not del_token(document.header, '\\default_output_format', 0):
         document.warning("Malformed LyX document: Missing \\default_output_format.")
 
@@ -328,18 +310,40 @@ def revert_backgroundcolor(document):
         '\\pagecolor{page_backgroundcolor}'])
 
 
-def revert_splitindex(document):
-    " Reverts splitindex-aware documents "
+def add_use_indices(document):
+    " Add \\use_indices if it is missing "
     i = find_token(document.header, '\\use_indices', 0)
+    if i != -1:
+        return i
+    i = find_token(document.header, '\\use_bibtopic', 0)
+    if i == -1:
+        i = find_token(document.header, '\\cite_engine', 0)
+    if i == -1:
+        i = find_token(document.header, '\\use_mathdots', 0)
+    if i == -1:
+        i = find_token(document.header, '\\use_mhchem', 0)
+    if i == -1:
+        i = find_token(document.header, '\\use_esint', 0)
+    if i == -1:
+        i = find_token(document.header, '\\use_amsmath', 0)
     if i == -1:
         document.warning("Malformed LyX document: Missing \\use_indices.")
+        return -1
+    document.header.insert(i + 1, '\\use_indices 0')
+    return i + 1
+
+
+def revert_splitindex(document):
+    " Reverts splitindex-aware documents "
+    i = add_use_indices(document)
+    if i == -1:
         return
     useindices = str2bool(get_value(document.header, "\\use_indices", i))
     del document.header[i]
     preamble = []
     if useindices:
          preamble.append("\\usepackage{splitidx})")
-    
+
     # deal with index declarations in the preamble
     i = 0
     while True:
@@ -350,7 +354,7 @@ def revert_splitindex(document):
         if k == -1:
             document.warning("Malformed LyX document: Missing \\end_index.")
             return
-        if useindices:    
+        if useindices:
           line = document.header[i]
           l = re.compile(r'\\index (.*)$')
           m = l.match(line)
@@ -361,7 +365,7 @@ def revert_splitindex(document):
         del document.header[i:k + 1]
     if preamble:
         insert_to_preamble(document, preamble)
-        
+
     # deal with index insets
     # these need to have the argument removed
     i = 0
@@ -387,7 +391,7 @@ def revert_splitindex(document):
             subst = put_cmd_in_ert("\\sindex[" + itype + "]{" + content + "}")
             document.body[i:k + 1] = subst
         i = i + 1
-        
+
     # deal with index_print insets
     i = 0
     while True:
@@ -409,6 +413,7 @@ def revert_splitindex(document):
 
 def convert_splitindex(document):
     " Converts index and printindex insets to splitindex-aware format "
+    add_use_indices(document)
     i = 0
     while True:
         i = find_token(document.body, "\\begin_inset Index", i)
@@ -425,7 +430,7 @@ def convert_splitindex(document):
         if document.body[i + 1].find('LatexCommand printindex') == -1:
             document.warning("Malformed LyX document: Incomplete printindex inset.")
             return
-        subst = ["LatexCommand printindex", 
+        subst = ["LatexCommand printindex",
             "type \"idx\""]
         document.body[i + 1:i + 2] = subst
         i = i + 1
@@ -433,9 +438,8 @@ def convert_splitindex(document):
 
 def revert_subindex(document):
     " Reverts \\printsubindex CommandInset types "
-    i = find_token(document.header, '\\use_indices', 0)
+    i = add_use_indices(document)
     if i == -1:
-        document.warning("Malformed LyX document: Missing \\use_indices.")
         return
     useindices = str2bool(get_value(document.header, "\\use_indices", i))
     i = 0
@@ -459,9 +463,8 @@ def revert_subindex(document):
 
 def revert_printindexall(document):
     " Reverts \\print[sub]index* CommandInset types "
-    i = find_token(document.header, '\\use_indices', 0)
+    i = add_use_indices(document)
     if i == -1:
-        document.warning("Malformed LyX document: Missing \\use_indices.")
         return
     useindices = str2bool(get_value(document.header, "\\use_indices", i))
     i = 0
@@ -511,10 +514,10 @@ def revert_ulinelatex(document):
 
 def revert_custom_processors(document):
     " Remove bibtex_command and index_command params "
-    
+
     if not del_token(document.header, '\\bibtex_command', 0):
         document.warning("Malformed LyX document: Missing \\bibtex_command.")
-    
+
     if not del_token(document.header, '\\index_command', 0):
         document.warning("Malformed LyX document: Missing \\index_command.")
 
@@ -553,7 +556,6 @@ def revert_nomencl_cwidth(document):
       j = find_end_of_inset(document.body, i)
       l = find_token(document.body, "width", i, j)
       if l == -1:
-        document.warning("Can't find width option for nomencl_print!")
         i = j
         continue
       width = get_quoted_value(document.body, "width", i, j)
@@ -593,10 +595,10 @@ def revert_longtable_align(document):
       if j == -1:
           i += 1
           continue
-      # FIXME Is this correct? It wipes out everything after the 
+      # FIXME Is this correct? It wipes out everything after the
       # one we found.
       document.body[fline] = document.body[fline][:j - 1] + '>'
-      # since there could be a tabular inside this one, we 
+      # since there could be a tabular inside this one, we
       # cannot jump to end.
       i += 1
 
@@ -740,7 +742,7 @@ def convert_author_id(document):
     i = 0
     anum = 1
     re_author = re.compile(r'(\\author) (\".*\")\s*(.*)$')
-    
+
     while True:
         i = find_token(document.header, "\\author", i)
         if i == -1:
@@ -752,7 +754,7 @@ def convert_author_id(document):
             document.header[i] = "\\author %i %s %s" % (anum, name, email)
         anum += 1
         i += 1
-        
+
     i = 0
     while True:
         i = find_token(document.body, "\\change_", i)
@@ -771,7 +773,7 @@ def revert_author_id(document):
     " Remove the author_id from the \\author definition "
     i = 0
     anum = 0
-    rx = re.compile(r'(\\author)\s+(\d+)\s+(\".*\")\s*(.*)$')
+    rx = re.compile(r'(\\author)\s+(-?\d+)\s+(\".*\")\s*(.*)$')
     idmap = dict()
 
     while True:
@@ -818,7 +820,7 @@ def revert_suppress_date(document):
 
 def convert_mhchem(document):
     "Set mhchem to off for versions older than 1.6.x"
-    if document.start < 277:
+    if document.initial_format < 277:
         # LyX 1.5.x and older did never load mhchem.
         # Therefore we must switch it off: Documents that use mhchem have
         # a manual \usepackage anyway, and documents not using mhchem but
@@ -856,7 +858,7 @@ def revert_mhchem(document):
 
     if mhchem == "off":
       # don't load case
-      return 
+      return
 
     if mhchem == "auto":
         i = 0
@@ -871,9 +873,9 @@ def revert_mhchem(document):
             i += 1
 
     if mhchem == "on":
-        pre = ["\\PassOptionsToPackage{version=3}{mhchem}", 
+        pre = ["\\PassOptionsToPackage{version=3}{mhchem}",
           "\\usepackage{mhchem}"]
-        insert_to_preamble(document, pre) 
+        insert_to_preamble(document, pre)
 
 
 def revert_fontenc(document):
@@ -913,7 +915,7 @@ def merge_gbrief(document):
                     "Verteiler":       "cc",
                     "Gruss":           "Closing"}
     i = 0
-    while 1:
+    while True:
         i = find_token(document.body, "\\begin_layout", i)
         if i == -1:
             break
@@ -923,7 +925,7 @@ def merge_gbrief(document):
             document.body[i] = "\\begin_layout " + obsoletedby[layout]
 
         i += 1
-        
+
     document.textclass = "g-brief"
     document.set_textclass()
 
@@ -986,7 +988,7 @@ def revert_multirow(document):
         if i == -1:
             begin_table = end_table
             continue
-        
+
         # store the number of rows and columns
         numrows = get_option_value(document.body[begin_table], "rows")
         numcols = get_option_value(document.body[begin_table], "columns")
@@ -994,7 +996,6 @@ def revert_multirow(document):
           numrows = int(numrows)
           numcols = int(numcols)
         except:
-          document.warning(numrows)
           document.warning("Unable to determine rows and columns!")
           begin_table = end_table
           continue
@@ -1014,13 +1015,13 @@ def revert_multirow(document):
               break
             begin_cell = begin_row
             multirows.append([])
-            for column in range(numcols):            
+            for column in range(numcols):
                 begin_cell = find_token(document.body, '<cell ', begin_cell, end_row)
                 if begin_cell == -1:
                   document.warning("Can't find column " + str(column + 1) + \
                     "in row " + str(row + 1))
                   break
-                # NOTE 
+                # NOTE
                 # this will fail if someone puts "</cell>" in a cell, but
                 # that seems fairly unlikely.
                 end_cell = find_end_of(document.body, begin_cell, '<cell', '</cell>')
@@ -1120,7 +1121,7 @@ def revert_math_output(document):
     else:
         document.warning("Unable to match " + document.header[i])
     document.header[i] = "\\html_use_mathml " + newval
-                
+
 
 
 def revert_inset_preview(document):
@@ -1135,7 +1136,7 @@ def revert_inset_preview(document):
           document.warning("Malformed LyX document: Could not find end of Preview inset.")
           i += 1
           continue
-      
+
       # This has several issues.
       # We need to do something about the layouts inside InsetPreview.
       # If we just leave the first one, then we have something like:
@@ -1144,16 +1145,16 @@ def revert_inset_preview(document):
       # \begin_layout Standard
       # and we get a "no \end_layout" error. So something has to be done.
       # Ideally, we would check if it is the same as the layout we are in.
-      # If so, we just remove it; if not, we end the active one. But it is 
+      # If so, we just remove it; if not, we end the active one. But it is
       # not easy to know what layout we are in, due to depth changes, etc,
       # and it is not clear to me how much work it is worth doing. In most
       # cases, the layout will probably be the same.
-      # 
+      #
       # For the same reason, we have to remove the \end_layout tag at the
       # end of the last layout in the inset. Again, that will sometimes be
       # wrong, but it will usually be right. To know what to do, we would
       # again have to know what layout the inset is in.
-      
+
       blay = find_token(document.body, "\\begin_layout", i, iend)
       if blay == -1:
           document.warning("Can't find layout for preview inset!")
@@ -1165,13 +1166,13 @@ def revert_inset_preview(document):
 
       # This is where we would check what layout we are in.
       # The check for Standard is definitely wrong.
-      # 
+      #
       # lay = document.body[blay].split(None, 1)[1]
       # if lay != oldlayout:
       #     # record a boolean to tell us what to do later....
       #     # better to do it later, since (a) it won't mess up
       #     # the numbering and (b) we only modify at the end.
-        
+
       # we want to delete the last \\end_layout in this inset, too.
       # note that this may not be the \\end_layout that goes with blay!!
       bend = find_end_of_layout(document.body, blay)
@@ -1191,7 +1192,7 @@ def revert_inset_preview(document):
       del document.body[bend]
       del document.body[i:blay + 1]
       # we do not need to reset i
-                
+
 
 def revert_equalspacing_xymatrix(document):
     " Revert a Formula with xymatrix@! to an ERT inset "
@@ -1208,12 +1209,12 @@ def revert_equalspacing_xymatrix(document):
           document.warning("Malformed LyX document: Could not find end of Formula inset.")
           i += 1
           continue
-      
+
       for curline in range(i,j):
           found = document.body[curline].find("\\xymatrix@!")
           if found != -1:
               break
+
       if found != -1:
           has_equal_spacing = True
           content = [document.body[i][21:]]
@@ -1228,7 +1229,7 @@ def revert_equalspacing_xymatrix(document):
                   has_preamble = True;
                   break;
           i = j + 1
-  
+
     if has_equal_spacing and not has_preamble:
         add_to_preamble(document, ['\\usepackage[all]{xy}'])
 
@@ -1245,7 +1246,7 @@ def revert_notefontcolor(document):
 
     # are there any grey notes?
     if find_token(document.body, "\\begin_inset Note Greyedout", 0) == -1:
-        # no need to do anything else, and \renewcommand will throw 
+        # no need to do anything else, and \renewcommand will throw
         # an error since lyxgreyedout will not exist.
         return
 
@@ -1263,21 +1264,21 @@ def revert_notefontcolor(document):
 
 
 def revert_turkmen(document):
-    "Set language Turkmen to English" 
+    "Set language Turkmen to English"
 
-    if document.language == "turkmen": 
-        document.language = "english" 
-        i = find_token(document.header, "\\language", 0) 
-        if i != -1: 
-            document.header[i] = "\\language english" 
+    if document.language == "turkmen":
+        document.language = "english"
+        i = find_token(document.header, "\\language", 0)
+        if i != -1:
+            document.header[i] = "\\language english"
 
-    j = 0 
-    while True: 
-        j = find_token(document.body, "\\lang turkmen", j) 
-        if j == -1: 
-            return 
-        document.body[j] = document.body[j].replace("\\lang turkmen", "\\lang english") 
-        j += 1 
+    j = 0
+    while True:
+        j = find_token(document.body, "\\lang turkmen", j)
+        if j == -1:
+            return
+        document.body[j] = document.body[j].replace("\\lang turkmen", "\\lang english")
+        j += 1
 
 
 def revert_fontcolor(document):
@@ -1330,7 +1331,7 @@ def revert_lyx_version(document):
         pass
 
     i = 0
-    while 1:
+    while True:
         i = find_token(document.body, '\\begin_inset Info', i)
         if i == -1:
             return
@@ -1404,7 +1405,7 @@ def convert_html_quotes(document):
     m = l.match(line)
     if m:
       document.header[i] = "\\html_latex_start " + m.group(1)
-      
+
   i = find_token(document.header, '\\html_latex_end', 0)
   if i != -1:
     line = document.header[i]
@@ -1412,11 +1413,11 @@ def convert_html_quotes(document):
     m = l.match(line)
     if m:
       document.header[i] = "\\html_latex_end " + m.group(1)
-      
+
 
 def revert_html_quotes(document):
   " Remove quotes around html_latex_start and html_latex_end "
-  
+
   i = find_token(document.header, '\\html_latex_start', 0)
   if i != -1:
     line = document.header[i]
@@ -1427,7 +1428,7 @@ def revert_html_quotes(document):
         del document.header[i]
     else:
         document.header[i] = "\\html_latex_start \"" + m.group(1) + "\""
-      
+
   i = find_token(document.header, '\\html_latex_end', 0)
   if i != -1:
     line = document.header[i]
@@ -1479,7 +1480,7 @@ def revert_align_decimal(document):
 def convert_optarg(document):
   " Convert \\begin_inset OptArg to \\begin_inset Argument "
   i = 0
-  while 1:
+  while True:
     i = find_token(document.body, '\\begin_inset OptArg', i)
     if i == -1:
       return
@@ -1490,7 +1491,7 @@ def convert_optarg(document):
 def revert_argument(document):
   " Convert \\begin_inset Argument to \\begin_inset OptArg "
   i = 0
-  while 1:
+  while True:
     i = find_token(document.body, '\\begin_inset Argument', i)
     if i == -1:
       return
@@ -1501,7 +1502,7 @@ def revert_argument(document):
 def revert_makebox(document):
   " Convert \\makebox to TeX code "
   i = 0
-  while 1:
+  while True:
     i = find_token(document.body, '\\begin_inset Box', i)
     if i == -1:
       break
@@ -1521,7 +1522,7 @@ def revert_makebox(document):
     if j == -1:
         i = z
         continue
-    
+
     if not check_token(document.body[i], "\\begin_inset Box Frameless") \
       or get_value(document.body, 'use_makebox', j) != 1:
         del document.body[j]
@@ -1548,7 +1549,7 @@ def revert_makebox(document):
 def convert_use_makebox(document):
   " Adds use_makebox option for boxes "
   i = 0
-  while 1:
+  while True:
     i = find_token(document.body, '\\begin_inset Box', i)
     if i == -1:
       return
@@ -1576,10 +1577,13 @@ def convert_use_makebox(document):
 
 def revert_IEEEtran(document):
   " Convert IEEEtran layouts and styles to TeX code "
+
   if document.textclass != "IEEEtran":
     return
+
   revert_flex_inset(document.body, "IEEE membership", "\\IEEEmembership")
   revert_flex_inset(document.body, "Lowercase", "\\MakeLowercase")
+
   layouts = ("Special Paper Notice", "After Title Text", "Publication ID",
              "Page headings", "Biography without photo")
   latexcmd = {"Special Paper Notice": "\\IEEEspecialpapernotice",
@@ -1587,6 +1591,7 @@ def revert_IEEEtran(document):
               "Publication ID":       "\\IEEEpubid"}
   obsoletedby = {"Page headings":            "MarkBoth",
                  "Biography without photo":  "BiographyNoPhoto"}
+
   for layout in layouts:
     i = 0
     while True:
@@ -1598,7 +1603,7 @@ def revert_IEEEtran(document):
           document.warning("Malformed LyX document: Can't find end of " + layout + " layout.")
           i += 1
           continue
-        if layout in obsoletedby:
+        if layout in list(obsoletedby.keys()):
           document.body[i] = "\\begin_layout " + obsoletedby[layout]
           i = j
           continue
@@ -1628,8 +1633,8 @@ def convert_prettyref(document):
                        document.body[k] = "LatexCommand formatted"
                i = j + 1
        document.header.insert(-1, "\\use_refstyle 0")
-               
+
+
 def revert_refstyle(document):
        " Reverts neutral formatted refs to prettyref "
        re_ref = re.compile("^reference\s+\"(\w+):(\S+)\"")
@@ -1652,7 +1657,7 @@ def revert_refstyle(document):
        i = find_token(document.header, "\\use_refstyle", 0)
        if i != -1:
                document.header.pop(i)
+
 
 def revert_nameref(document):
   " Convert namerefs to regular references "
@@ -1662,7 +1667,7 @@ def revert_nameref(document):
   for cmd in cmds:
     i = 0
     oldcmd = "LatexCommand " + cmd
-    while 1:
+    while True:
       # It seems better to look for this, as most of the reference
       # insets won't be ones we care about.
       i = find_token(document.body, oldcmd, i)
@@ -1693,13 +1698,13 @@ def revert_nameref(document):
       document.body[stins:endins + 1] = newcontent
 
   if foundone:
-    add_to_preamble(document, ["\usepackage{nameref}"])
+    add_to_preamble(document, ["\\usepackage{nameref}"])
 
 
 def remove_Nameref(document):
   " Convert Nameref commands to nameref commands "
   i = 0
-  while 1:
+  while True:
     # It seems better to look for this, as most of the reference
     # insets won't be ones we care about.
     i = find_token(document.body, "LatexCommand Nameref" , i)
@@ -1707,7 +1712,7 @@ def remove_Nameref(document):
       break
     cmdloc = i
     i += 1
-    
+
     # Make sure it is actually in an inset!
     val = is_in_inset(document.body, cmdloc, \
         "\\begin_inset CommandInset ref")
@@ -1727,7 +1732,7 @@ def revert_mathrsfs(document):
 
 def convert_flexnames(document):
     "Convert \\begin_inset Flex Custom:Style to \\begin_inset Flex Style and similarly for CharStyle and Element."
-    
+
     i = 0
     rx = re.compile(r'^\\begin_inset Flex (?:Custom|CharStyle|Element):(.+)$')
     while True:
@@ -1807,7 +1812,7 @@ def revert_flexnames(document):
     flexlist = flex_insets
   else:
     flexlist = flex_elements
-  
+
   rx = re.compile(r'^\\begin_inset Flex\s+(.+)$')
   i = 0
   while True:
@@ -1829,9 +1834,16 @@ def convert_mathdots(document):
     " Load mathdots automatically "
     i = find_token(document.header, "\\use_mhchem" , 0)
     if i == -1:
-      i = find_token(document.header, "\\use_esint" , 0)
-    if i != -1:
-      document.header.insert(i + 1, "\\use_mathdots 1")
+        i = find_token(document.header, "\\use_esint" , 0)
+    if i == -1:
+        document.warning("Malformed LyX document: Can't find \\use_mhchem.")
+        return;
+    j = find_token(document.preamble, "\\usepackage{mathdots}", 0)
+    if j == -1:
+        document.header.insert(i + 1, "\\use_mathdots 0")
+    else:
+        document.header.insert(i + 1, "\\use_mathdots 2")
+        del document.preamble[j]
 
 
 def revert_mathdots(document):
@@ -1839,7 +1851,7 @@ def revert_mathdots(document):
 
     mathdots = find_token(document.header, "\\use_mathdots" , 0)
     if mathdots == -1:
-      document.warning("No \\usemathdots line. Assuming auto.")
+      document.warning("No \\use_mathdots line. Assuming auto.")
     else:
       val = get_value(document.header, "\\use_mathdots", mathdots)
       del document.header[mathdots]
@@ -1855,9 +1867,9 @@ def revert_mathdots(document):
         return
       if usedots == 2:
         # force load case
-        add_to_preamble(["\\usepackage{mathdots}"])
+        add_to_preamble(document, ["\\usepackage{mathdots}"])
         return
-    
+
     # so we are in the auto case. we want to load mathdots if \iddots is used.
     i = 0
     while True:
@@ -1879,7 +1891,7 @@ def revert_mathdots(document):
 def convert_rule(document):
     " Convert \\lyxline to CommandInset line. "
     i = 0
-    
+
     inset = ['\\begin_inset CommandInset line',
       'LatexCommand rule',
       'offset "0.5ex"',
@@ -1934,7 +1946,7 @@ def convert_rule(document):
 def revert_rule(document):
     " Revert line insets to Tex code "
     i = 0
-    while 1:
+    while True:
       i = find_token(document.body, "\\begin_inset CommandInset line" , i)
       if i == -1:
         return
@@ -1969,7 +1981,7 @@ def revert_diagram(document):
     j = find_end_of_inset(document.body, i)
     if j == -1:
         document.warning("Malformed LyX document: Can't find end of Formula inset.")
-        return 
+        return
     lines = "\n".join(document.body[i:j])
     if lines.find("\\Diagram") == -1:
       i = j
@@ -1978,9 +1990,9 @@ def revert_diagram(document):
     # only need to do it once!
     return
 
-chapters = ("amsbook", "book", "docbook-book", "elsart", "extbook", "extreport", 
-    "jbook", "jreport", "jsbook", "literate-book", "literate-report", "memoir", 
-    "mwbk", "mwrep", "recipebook", "report", "scrbook", "scrreprt", "svmono", 
+chapters = ("amsbook", "book", "docbook-book", "elsart", "extbook", "extreport",
+    "jbook", "jreport", "jsbook", "literate-book", "literate-report", "memoir",
+    "mwbk", "mwrep", "recipebook", "report", "scrbook", "scrreprt", "svmono",
     "svmult", "tbook", "treport", "tufte-book")
 
 def convert_bibtex_clearpage(document):
@@ -2024,13 +2036,13 @@ def convert_bibtex_clearpage(document):
       document.warning("Can't find options for bibliography inset at line " + str(j))
       j = k
       continue
-    
+
     if val.find("bibtotoc") == -1:
       j = k
       continue
-    
+
     # so we want to insert a new page right before the paragraph that
-    # this bibliography thing is in. 
+    # this bibliography thing is in.
     lay = find_token_backwards(document.body, "\\begin_layout", j)
     if lay == -1:
       document.warning("Can't find layout containing bibliography inset at line " + str(j))
@@ -2065,7 +2077,7 @@ def convert_passthru(document):
     " http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg161298.html "
     if not check_passthru:
       return
-    
+
     rx = re.compile("\\\\begin_layout \s*(\w+)")
     beg = 0
     for lay in ["Chunk", "Scrap"]:
@@ -2078,19 +2090,16 @@ def convert_passthru(document):
           document.warning("Can't find end of layout at line " + str(beg))
           beg += 1
           continue
-        document.warning(str(end))
 
         # we are now going to replace newline insets within this layout
         # by new instances of this layout. so we have repeated layouts
         # instead of newlines.
 
-        # first, though, we need to find out if the paragraph has any
-        # customization, so those can be propogated.
-        custom = []
-        i = beg + 1
-        while document.body[i].startswith("\\"):
-          custom.append(document.body[i])
-          i += 1
+        # if the paragraph has any customization, however, we do not want to
+        # do the replacement.
+        if document.body[beg + 1].startswith("\\"):
+          beg = end + 1
+          continue
 
         ns = beg
         while True:
@@ -2104,11 +2113,11 @@ def convert_passthru(document):
             continue
           if document.body[ne + 1] == "":
             ne += 1
-          subst = ["\\end_layout", "", "\\begin_layout " + lay] + custom
+          subst = ["\\end_layout", "", "\\begin_layout " + lay]
           document.body[ns:ne + 1] = subst
           # now we need to adjust end, in particular, but might as well
           # do ns properly, too
-          newlines = (ne - ns) - len(subst) + len(custom)
+          newlines = (ne - ns) - len(subst)
           ns += newlines + 2
           end += newlines + 2
 
@@ -2127,7 +2136,7 @@ def convert_passthru(document):
         beg = end + 1
         if didit:
           beg += 4 # for the extra layout
-    
+
 
 def revert_passthru(document):
     " http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg161298.html "
@@ -2145,7 +2154,7 @@ def revert_passthru(document):
           document.warning("Can't find end of layout at line " + str(beg))
           beg += 1
           continue
-        
+
         # we now want to find out if the next layout is the
         # same as this one. but we will need to do this over and
         # over again.
@@ -2163,7 +2172,6 @@ def revert_passthru(document):
           # but first let's check and make sure there is no content between the
           # two layouts. i'm not sure if that can happen or not.
           for l in range(end + 1, next):
-            document.warning("c'" + document.body[l] + "'")
             if document.body[l] != "":
               document.warning("Found content between adjacent " + lay + " layouts!")
               break
@@ -2173,7 +2181,6 @@ def revert_passthru(document):
             break
           empty = True
           for l in range(next + 1, nextend):
-            document.warning("e'" + document.body[l] + "'")
             if document.body[l] != "":
               empty = False
               break
@@ -2228,7 +2235,7 @@ def revert_multirowOffset(document):
         if i == -1:
             begin_table = end_table
             continue
-        
+
         # store the number of rows and columns
         numrows = get_option_value(document.body[begin_table], "rows")
         numcols = get_option_value(document.body[begin_table], "columns")
@@ -2236,7 +2243,6 @@ def revert_multirowOffset(document):
           numrows = int(numrows)
           numcols = int(numcols)
         except:
-          document.warning(numrows)
           document.warning("Unable to determine rows and columns!")
           begin_table = end_table
           continue
@@ -2256,13 +2262,13 @@ def revert_multirowOffset(document):
               break
             begin_cell = begin_row
             multirows.append([])
-            for column in range(numcols):            
+            for column in range(numcols):
                 begin_cell = find_token(document.body, '<cell ', begin_cell, end_row)
                 if begin_cell == -1:
                   document.warning("Can't find column " + str(column + 1) + \
                     "in row " + str(row + 1))
                   break
-                # NOTE 
+                # NOTE
                 # this will fail if someone puts "</cell>" in a cell, but
                 # that seems fairly unlikely.
                 end_cell = find_end_of(document.body, begin_cell, '<cell', '</cell>')
@@ -2314,7 +2320,7 @@ def revert_multirowOffset(document):
               replace('valignment="middle"', 'valignment="top"')
             # remove mroffset option
             document.body[bcell] = rgx.sub('', document.body[bcell])
-            
+
             blay = find_token(document.body, "\\begin_layout", bcell, ecell)
             if blay == -1:
               document.warning("Can't find layout for cell!")
@@ -2340,7 +2346,7 @@ def revert_script(document):
     " Convert subscript/superscript inset to TeX code "
     i = 0
     foundsubscript = False
-    while 1:
+    while True:
         i = find_token(document.body, '\\begin_inset script', i)
         if i == -1:
             break
@@ -2382,13 +2388,12 @@ def revert_script(document):
 
 def convert_use_xetex(document):
     " convert \\use_xetex to \\use_non_tex_fonts "
-    i = 0
     i = find_token(document.header, "\\use_xetex", 0)
     if i == -1:
-        return
-    
-    val = get_value(document.header, "\\use_xetex", 0)
-    document.header[i] = "\\use_non_tex_fonts " + val
+        document.header.insert(-1, "\\use_non_tex_fonts 0")
+    else:
+        val = get_value(document.header, "\\use_xetex", 0)
+        document.header[i] = "\\use_non_tex_fonts " + val
 
 
 def revert_use_xetex(document):
@@ -2457,6 +2462,10 @@ def revert_tabularwidth(document):
     if document.body[features].find('alignment="tabularwidth"') != -1:
       remove_option(document.body, features, 'tabularwidth')
 
+def revert_html_css_as_file(document):
+  if not del_token(document.header, '\\html_css_as_file', 0):
+    document.warning("Malformed LyX document: Missing \\html_css_as_file.")
+
 
 ##
 # Conversion hub
@@ -2529,10 +2538,12 @@ convert = [[346, []],
            [409, [convert_use_xetex]],
            [410, []],
            [411, [convert_langpack]],
-           [412, []]
+           [412, []],
+           [413, []]
 ]
 
-revert =  [[411, [revert_tabularwidth]],
+revert =  [[412, [revert_html_css_as_file]],
+           [411, [revert_tabularwidth]],
            [410, [revert_langpack]],
            [409, [revert_labeling]],
            [408, [revert_use_xetex]],