]> git.lyx.org Git - lyx.git/blobdiff - lib/configure.py
Check path of Qt tools if qtchooser is detected
[lyx.git] / lib / configure.py
index 9a817c8ea0600139f1cfdbdeacdef8c3bac57662..a8515f30e6ed5c4dccd2851becd2107b80414336 100644 (file)
@@ -8,6 +8,7 @@
 # \author Bo Peng
 # Full author contact details are available in file CREDITS.
 
 # \author Bo Peng
 # Full author contact details are available in file CREDITS.
 
+from __future__ import print_function
 import glob, logging, os, re, shutil, subprocess, sys, stat
 
 # set up logging
 import glob, logging, os, re, shutil, subprocess, sys, stat
 
 # set up logging
@@ -65,7 +66,10 @@ def cmdOutput(cmd, async = False):
     '''
     if os.name == 'nt':
         b = False
     '''
     if os.name == 'nt':
         b = False
-        cmd = 'cmd /d /c pushd ' + shortPath(os.getcwdu()) + '&' + cmd
+        if sys.version_info[0] < 3:
+            cmd = 'cmd /d /c pushd ' + shortPath(os.getcwdu()) + '&' + cmd
+        else:
+            cmd = 'cmd /d /c pushd ' + shortPath(os.getcwd()) + '&' + cmd
     else:
         b = True
     pipe = subprocess.Popen(cmd, shell=b, close_fds=b, stdin=subprocess.PIPE, \
     else:
         b = True
     pipe = subprocess.Popen(cmd, shell=b, close_fds=b, stdin=subprocess.PIPE, \
@@ -117,13 +121,12 @@ def copy_tree(src, dst, preserve_symlinks=False, level=0):
     '''
  
     if not os.path.isdir(src):
     '''
  
     if not os.path.isdir(src):
-        raise FileError, \
-              "cannot copy tree '%s': not a directory" % src
+        raise FileError("cannot copy tree '%s': not a directory" % src)
     try:
         names = os.listdir(src)
     try:
         names = os.listdir(src)
-    except os.error, (errno, errstr):
-        raise FileError, \
-              "error listing files in '%s': %s" % (src, errstr)
+    except os.error as oserror:
+        (errno, errstr) = oserror.args
+        raise FileError("error listing files in '%s': %s" % (src, errstr))
  
     if not os.path.isdir(dst):
         os.makedirs(dst)
  
     if not os.path.isdir(dst):
         os.makedirs(dst)
@@ -166,7 +169,7 @@ def checkUpgrade():
             logger.debug('previous = ' + previous)
             if os.path.isdir( previous ):
                 logger.info('Found directory "%s".', previous)
             logger.debug('previous = ' + previous)
             if os.path.isdir( previous ):
                 logger.info('Found directory "%s".', previous)
-                copy_tree( previous, cwd )
+                copy_tree( previous, cwd, True )
                 logger.info('Content copied to directory "%s".', cwd)
                 return
 
                 logger.info('Content copied to directory "%s".', cwd)
                 return
 
@@ -197,7 +200,10 @@ def checkTeXPaths():
             language, encoding = getdefaultlocale()
             if encoding == None:
                 encoding = 'latin1'
             language, encoding = getdefaultlocale()
             if encoding == None:
                 encoding = 'latin1'
-            inpname = shortPath(unicode(tmpfname, encoding)).replace('\\', '/')
+            if sys.version_info[0] < 3:
+                inpname = shortPath(unicode(tmpfname, encoding)).replace('\\', '/')
+            else:
+                inpname = shortPath(str(tmpfname, encoding)).replace('\\', '/')
         else:
             inpname = cmdOutput('cygpath -m ' + tmpfname)
         logname = os.path.basename(re.sub("(?i).ltx", ".log", inpname))
         else:
             inpname = cmdOutput('cygpath -m ' + tmpfname)
         logname = os.path.basename(re.sub("(?i).ltx", ".log", inpname))
@@ -229,7 +235,7 @@ def checkProg(description, progs, rc_entry = [], path = [], not_found = ''):
             for searching but the whole string is used to replace
             %% for a rc_entry. So, feel free to add '$$i' etc for programs.
 
             for searching but the whole string is used to replace
             %% for a rc_entry. So, feel free to add '$$i' etc for programs.
 
-        path: additional pathes
+        path: additional paths (will be prepended to the program name)
 
         rc_entry: entry to outfile, can be
             1. emtpy: no rc entry will be added
 
         rc_entry: entry to outfile, can be
             1. emtpy: no rc entry will be added
@@ -250,6 +256,11 @@ def checkProg(description, progs, rc_entry = [], path = [], not_found = ''):
         sys.exit(2)
     logger.info('checking for ' + description + '...')
     ## print '(' + ','.join(progs) + ')',
         sys.exit(2)
     logger.info('checking for ' + description + '...')
     ## print '(' + ','.join(progs) + ')',
+    additional_path = path
+    path = os.environ["PATH"].split(os.pathsep) + additional_path
+    extlist = ['']
+    if "PATHEXT" in os.environ:
+        extlist = extlist + os.environ["PATHEXT"].split(os.pathsep)
     global java, perl
     for idx in range(len(progs)):
         # ac_prog may have options, ac_word is the command name
     global java, perl
     for idx in range(len(progs)):
         # ac_prog may have options, ac_word is the command name
@@ -260,10 +271,6 @@ def checkProg(description, progs, rc_entry = [], path = [], not_found = ''):
         if ac_word.endswith('.pl') and perl == '':
             continue
         msg = '+checking for "' + ac_word + '"... '
         if ac_word.endswith('.pl') and perl == '':
             continue
         msg = '+checking for "' + ac_word + '"... '
-        path = os.environ["PATH"].split(os.pathsep) + path
-        extlist = ['']
-        if "PATHEXT" in os.environ:
-            extlist = extlist + os.environ["PATHEXT"].split(os.pathsep)
         for ac_dir in path:
             if hasattr(os, "access") and not os.access(ac_dir, os.F_OK):
                 continue
         for ac_dir in path:
             if hasattr(os, "access") and not os.access(ac_dir, os.F_OK):
                 continue
@@ -277,6 +284,8 @@ def checkProg(description, progs, rc_entry = [], path = [], not_found = ''):
                         ac_prog = ac_prog.replace(ac_word, r'%s -jar \"%s\"' % (java, os.path.join(ac_dir, ac_word)))
                     elif ac_word.endswith('.pl'):
                         ac_prog = ac_prog.replace(ac_word, r'%s -w \"%s\"' % (perl, os.path.join(ac_dir, ac_word)))
                         ac_prog = ac_prog.replace(ac_word, r'%s -jar \"%s\"' % (java, os.path.join(ac_dir, ac_word)))
                     elif ac_word.endswith('.pl'):
                         ac_prog = ac_prog.replace(ac_word, r'%s -w \"%s\"' % (perl, os.path.join(ac_dir, ac_word)))
+                    elif ac_dir in additional_path:
+                        ac_prog = ac_prog.replace(ac_word, r'\"%s\"' % (os.path.join(ac_dir, ac_word)))
                     # write rc entries for this command
                     if len(rc_entry) == 1:
                         addToRC(rc_entry[0].replace('%%', ac_prog))
                     # write rc entries for this command
                     if len(rc_entry) == 1:
                         addToRC(rc_entry[0].replace('%%', ac_prog))
@@ -302,6 +311,11 @@ def checkProgAlternatives(description, progs, rc_entry = [], alt_rc_entry = [],
         sys.exit(2)
     logger.info('checking for ' + description + '...')
     ## print '(' + ','.join(progs) + ')',
         sys.exit(2)
     logger.info('checking for ' + description + '...')
     ## print '(' + ','.join(progs) + ')',
+    additional_path = path
+    path = os.environ["PATH"].split(os.pathsep) + additional_path
+    extlist = ['']
+    if "PATHEXT" in os.environ:
+        extlist = extlist + os.environ["PATHEXT"].split(os.pathsep)
     found_prime = False
     real_ac_dir = ''
     real_ac_word = not_found
     found_prime = False
     real_ac_dir = ''
     real_ac_word = not_found
@@ -315,10 +329,6 @@ def checkProgAlternatives(description, progs, rc_entry = [], alt_rc_entry = [],
         if ac_word.endswith('.pl') and perl == '':
             continue
         msg = '+checking for "' + ac_word + '"... '
         if ac_word.endswith('.pl') and perl == '':
             continue
         msg = '+checking for "' + ac_word + '"... '
-        path = os.environ["PATH"].split(os.pathsep) + path
-        extlist = ['']
-        if "PATHEXT" in os.environ:
-            extlist = extlist + os.environ["PATHEXT"].split(os.pathsep)
         found_alt = False
         for ac_dir in path:
             if hasattr(os, "access") and not os.access(ac_dir, os.F_OK):
         found_alt = False
         for ac_dir in path:
             if hasattr(os, "access") and not os.access(ac_dir, os.F_OK):
@@ -335,6 +345,8 @@ def checkProgAlternatives(description, progs, rc_entry = [], alt_rc_entry = [],
                         ac_prog = ac_prog.replace(ac_word, r'%s -jar \"%s\"' % (java, os.path.join(ac_dir, ac_word)))
                     elif ac_word.endswith('.pl'):
                         ac_prog = ac_prog.replace(ac_word, r'%s -w \"%s\"' % (perl, os.path.join(ac_dir, ac_word)))
                         ac_prog = ac_prog.replace(ac_word, r'%s -jar \"%s\"' % (java, os.path.join(ac_dir, ac_word)))
                     elif ac_word.endswith('.pl'):
                         ac_prog = ac_prog.replace(ac_word, r'%s -w \"%s\"' % (perl, os.path.join(ac_dir, ac_word)))
+                    elif ac_dir in additional_path:
+                        ac_prog = ac_prog.replace(ac_word, r'\"%s\"' % (os.path.join(ac_dir, ac_word)))
                     # write rc entries for this command
                     if found_prime == False:
                         if len(rc_entry) == 1:
                     # write rc entries for this command
                     if found_prime == False:
                         if len(rc_entry) == 1:
@@ -387,7 +399,7 @@ def addAlternatives(rcs, alt_type):
     if isinstance(alt_type, str):
         alt_tokens = [alt_token % alt_type]
     else:
     if isinstance(alt_type, str):
         alt_tokens = [alt_token % alt_type]
     else:
-        alt_tokens = map(lambda s: alt_token % s, alt_type)
+        alt_tokens = [alt_token % s for s in alt_type]
     for idxx in range(len(rcs)):
         if len(rcs) == 1:
             m = r.match(rcs[0])
     for idxx in range(len(rcs)):
         if len(rcs) == 1:
             m = r.match(rcs[0])
@@ -466,6 +478,26 @@ def checkDTLtools():
         dtl_tools = False
     return dtl_tools
 
         dtl_tools = False
     return dtl_tools
 
+def checkInkscape():
+    ''' Check whether Inkscape is available and return the full path (Windows only) '''
+    if os.name != 'nt':
+        return 'inkscape'
+    if sys.version_info[0] < 3:
+        import _winreg as winreg
+    else:
+        import winreg
+    aReg = winreg.ConnectRegistry(None, winreg.HKEY_CLASSES_ROOT)
+    try:
+        aKey = winreg.OpenKey(aReg, r"inkscape.svg\DefaultIcon")
+        val = winreg.QueryValueEx(aKey, "")
+        return str(val[0]).split('"')[1].replace('.exe', '')
+    except EnvironmentError:
+        try:
+            aKey = winreg.OpenKey(aReg, r"Applications\inkscape.exe\shell\open\command")
+            val = winreg.QueryValueEx(aKey, "")
+            return str(val[0]).split('"')[1].replace('.exe', '')
+        except EnvironmentError:
+            return 'inkscape'
 
 def checkLatex(dtl_tools):
     ''' Check latex, return lyx_check_config '''
 
 def checkLatex(dtl_tools):
     ''' Check latex, return lyx_check_config '''
@@ -516,37 +548,13 @@ def checkLatex(dtl_tools):
 
 
 def checkLuatex():
 
 
 def checkLuatex():
-    ''' Check if luatex is there and usable '''
+    ''' Check if luatex is there '''
     path, LUATEX = checkProg('LuaTeX', ['lualatex $$i'])
     path, DVILUATEX = checkProg('LuaTeX (DVI)', ['dvilualatex $$i'])
     if LUATEX != '':
     path, LUATEX = checkProg('LuaTeX', ['lualatex $$i'])
     path, DVILUATEX = checkProg('LuaTeX (DVI)', ['dvilualatex $$i'])
     if LUATEX != '':
-    # luatex binary is there
-        msg = "checking if LuaTeX is usable ..."
-        # Check if luatex is usable
-        writeToFile('luatest.tex', r'''
-\nonstopmode
-\documentclass{minimal}
-\usepackage{fontspec}
-\begin{document}
-.
-\end{document}
-''')
-        # run lualatex on luatest.tex and check result
-        luatest = cmdOutput(LUATEX + ' luatest.tex')
-        if luatest.find('XeTeX is required to compile this document') != -1:
-            # fontspec/luatex too old! We do not support this version.
-            logger.info(msg + ' no (probably not recent enough)')
-        elif luatest.find('! LaTeX Error: File `fontspec.sty\' not found') != -1:
-            # fontspec missing
-            logger.info(msg + ' no (missing fontspec)')
-        else:
-            # working luatex
-            logger.info(msg + ' yes')
-            addToRC(r'\converter luatex      pdf5       "%s"   "latex=lualatex"' % LUATEX)
-            if DVILUATEX != '':
-                addToRC(r'\converter luatex      dvi3        "%s"      "latex=dvilualatex"' % DVILUATEX)
-        # remove temporary files
-        removeFiles(['luatest.tex', 'luatest.log', 'luatest.aux', 'luatest.pdf'])
+        addToRC(r'\converter luatex      pdf5       "%s"       "latex=lualatex"' % LUATEX)
+    if DVILUATEX != '':
+        addToRC(r'\converter dviluatex   dvi3        "%s"      "latex=dvilualatex"' % DVILUATEX)
 
 
 def checkModule(module):
 
 
 def checkModule(module):
@@ -581,8 +589,10 @@ def checkFormatEntries(dtl_tools):
     checkViewerEditor('a FEN viewer and editor', ['xboard -lpf $$i -mode EditPosition'],
         rc_entry = [r'\Format fen        fen     FEN                    "" "%%"        "%%"    ""      ""'])
     #
     checkViewerEditor('a FEN viewer and editor', ['xboard -lpf $$i -mode EditPosition'],
         rc_entry = [r'\Format fen        fen     FEN                    "" "%%"        "%%"    ""      ""'])
     #
-    checkViewerEditor('a SVG viewer and editor', ['inkscape'],
-        rc_entry = [r'\Format svg        "svg, svgz" SVG                "" "%%" "%%"   "vector,zipped=native"  "image/svg+xml"'])
+    checkViewerEditor('a SVG viewer and editor', [inkscape_name],
+        rc_entry = [r'''\Format svg        "svg" SVG                "" "%%" "%%"       "vector"        "image/svg+xml"
+\Format svgz       "svgz" "SVG (compressed)" "" "%%" "%%"      "vector,zipped=native"  ""'''],
+        path = [inkscape_path])
     #
     imageformats = r'''\Format bmp        bmp     BMP                    "" "%s"       "%s"    ""      "image/x-bmp"
 \Format gif        gif     GIF                    "" "%s"      "%s"    ""      "image/gif"
     #
     imageformats = r'''\Format bmp        bmp     BMP                    "" "%s"       "%s"    ""      "image/x-bmp"
 \Format gif        gif     GIF                    "" "%s"      "%s"    ""      "image/gif"
@@ -602,9 +612,6 @@ def checkFormatEntries(dtl_tools):
     checkViewerEditor('a text editor', ['xemacs', 'gvim', 'kedit', 'kwrite', 'kate', \
         'nedit', 'gedit', 'notepad', 'geany', 'leafpad', 'mousepad'],
         rc_entry = [r'''\Format asciichess asc    "Plain text (chess output)"  "" ""   "%%"    ""      ""
     checkViewerEditor('a text editor', ['xemacs', 'gvim', 'kedit', 'kwrite', 'kate', \
         'nedit', 'gedit', 'notepad', 'geany', 'leafpad', 'mousepad'],
         rc_entry = [r'''\Format asciichess asc    "Plain text (chess output)"  "" ""   "%%"    ""      ""
-\Format asciiimage asc    "Plain text (image)"         "" ""   "%%"    ""      ""
-\Format asciixfig  asc    "Plain text (Xfig output)"   "" ""   "%%"    ""      ""
-\Format dateout    tmp    "date (output)"         "" ""        "%%"    ""      ""
 \Format docbook    sgml    DocBook                B  ""        "%%"    "document,menu=export"  ""
 \Format docbook-xml xml   "DocBook (XML)"         "" ""        "%%"    "document,menu=export"  "application/docbook+xml"
 \Format dot        dot    "Graphviz Dot"          "" ""        "%%"    "vector"        "text/vnd.graphviz"
 \Format docbook    sgml    DocBook                B  ""        "%%"    "document,menu=export"  ""
 \Format docbook-xml xml   "DocBook (XML)"         "" ""        "%%"    "document,menu=export"  "application/docbook+xml"
 \Format dot        dot    "Graphviz Dot"          "" ""        "%%"    "vector"        "text/vnd.graphviz"
@@ -678,16 +685,18 @@ def checkFormatEntries(dtl_tools):
         rc_entry = [r'\Format noteedit   not     Noteedit               "" "%%"        "%%"    "vector"        ""'])
     #
     checkViewerEditor('an OpenDocument viewer', ['libreoffice', 'lwriter', 'lowriter', 'oowriter', 'swriter', 'abiword'],
         rc_entry = [r'\Format noteedit   not     Noteedit               "" "%%"        "%%"    "vector"        ""'])
     #
     checkViewerEditor('an OpenDocument viewer', ['libreoffice', 'lwriter', 'lowriter', 'oowriter', 'swriter', 'abiword'],
-        rc_entry = [r'''\Format odt        odt     "OpenDocument"  "" "%%"     "%%"    "document,vector,menu=export"   "application/vnd.oasis.opendocument.text"
+        rc_entry = [r'''\Format odt        odt     "OpenDocument (tex4ht)"  "" "%%"    "%%"    "document,vector,menu=export"   "application/vnd.oasis.opendocument.text"
+\Format odt2       odt    "OpenDocument (eLyXer)"  "" "%%"     "%%"    "document,vector,menu=export"   "application/vnd.oasis.opendocument.text"
+\Format odt3       odt    "OpenDocument (Pandoc)"  "" "%%"     "%%"    "document,vector,menu=export"   "application/vnd.oasis.opendocument.text"
 \Format sxw        sxw    "OpenOffice.Org (sxw)"  "" ""        ""      "document,vector"       "application/vnd.sun.xml.writer"'''])
     #
     checkViewerEditor('a Rich Text and Word viewer', ['libreoffice', 'lwriter', 'lowriter', 'oowriter', 'swriter', 'abiword'],
         rc_entry = [r'''\Format rtf        rtf    "Rich Text Format"      "" "%%"      "%%"    "document,vector,menu=export"   "application/rtf"
 \Format sxw        sxw    "OpenOffice.Org (sxw)"  "" ""        ""      "document,vector"       "application/vnd.sun.xml.writer"'''])
     #
     checkViewerEditor('a Rich Text and Word viewer', ['libreoffice', 'lwriter', 'lowriter', 'oowriter', 'swriter', 'abiword'],
         rc_entry = [r'''\Format rtf        rtf    "Rich Text Format"      "" "%%"      "%%"    "document,vector,menu=export"   "application/rtf"
-\Format word       doc    "MS Word"               W  "%%"      "%%"    "document,vector,menu=export"   "application/msword"'''])
+\Format word       doc    "MS Word"               W  "%%"      "%%"    "document,vector,menu=export"   "application/msword"
+\Format word2      docx    "MS Word Office Open XML"               O  "%%"     "%%"    "document,vector,menu=export"   "application/vnd.openxmlformats-officedocument.wordprocessingml.document"'''])
     #
     # entries that do not need checkProg
     #
     # entries that do not need checkProg
-    addToRC(r'''\Format date       ""     "date command"          "" ""        ""      ""      ""
-\Format csv        csv    "Table (CSV)"           "" ""        ""      "document"      "text/csv"
+    addToRC(r'''\Format csv        csv    "Table (CSV)"           "" ""        ""      "document"      "text/csv"
 \Format fax        ""      Fax                    "" ""        ""      "document"      ""
 \Format lyx        lyx     LyX                    "" ""        ""      ""      "application/x-lyx"
 \Format lyx13x     13.lyx "LyX 1.3.x"             "" ""        ""      "document"      ""
 \Format fax        ""      Fax                    "" ""        ""      "document"      ""
 \Format lyx        lyx     LyX                    "" ""        ""      ""      "application/x-lyx"
 \Format lyx13x     13.lyx "LyX 1.3.x"             "" ""        ""      "document"      ""
@@ -695,7 +704,8 @@ def checkFormatEntries(dtl_tools):
 \Format lyx15x     15.lyx "LyX 1.5.x"             "" ""        ""      "document"      ""
 \Format lyx16x     16.lyx "LyX 1.6.x"             "" ""        ""      "document"      ""
 \Format lyx20x     20.lyx "LyX 2.0.x"             "" ""        ""      "document"      ""
 \Format lyx15x     15.lyx "LyX 1.5.x"             "" ""        ""      "document"      ""
 \Format lyx16x     16.lyx "LyX 1.6.x"             "" ""        ""      "document"      ""
 \Format lyx20x     20.lyx "LyX 2.0.x"             "" ""        ""      "document"      ""
-\Format lyx21x     21.lyx "LyX 2.1.x"             "" ""        ""      "document,menu=export"  ""
+\Format lyx21x     21.lyx "LyX 2.1.x"             "" ""        ""      "document"      ""
+\Format lyx22x     22.lyx "LyX 2.2.x"             "" ""        ""      "document,menu=export"  ""
 \Format clyx       cjklyx "CJK LyX 1.4.x (big5)"  "" ""        ""      "document"      ""
 \Format jlyx       cjklyx "CJK LyX 1.4.x (euc-jp)" "" ""       ""      "document"      ""
 \Format klyx       cjklyx "CJK LyX 1.4.x (euc-kr)" "" ""       ""      "document"      ""
 \Format clyx       cjklyx "CJK LyX 1.4.x (big5)"  "" ""        ""      "document"      ""
 \Format jlyx       cjklyx "CJK LyX 1.4.x (euc-jp)" "" ""       ""      "document"      ""
 \Format klyx       cjklyx "CJK LyX 1.4.x (euc-kr)" "" ""       ""      "document"      ""
@@ -779,11 +789,17 @@ def checkConverterEntries():
 
     # eLyXer: search as an executable (elyxer.py, elyxer)
     path, elyxer = checkProg('a LyX -> HTML converter',
 
     # eLyXer: search as an executable (elyxer.py, elyxer)
     path, elyxer = checkProg('a LyX -> HTML converter',
-        ['elyxer.py --nofooter --directory $$r $$i $$o'],
+        ['elyxer.py --nofooter --directory $$r $$i $$o', 'elyxer --nofooter --directory $$r $$i $$o'],
         rc_entry = [ r'\converter lyx      html       "%%"     ""' ])
     path, elyxer = checkProg('a LyX -> HTML (MS Word) converter',
         rc_entry = [ r'\converter lyx      html       "%%"     ""' ])
     path, elyxer = checkProg('a LyX -> HTML (MS Word) converter',
-        ['elyxer.py --nofooter --html --directory $$r $$i $$o'],
+        ['elyxer.py --nofooter --html --directory $$r $$i $$o', 'elyxer --nofooter --html --directory $$r $$i $$o'],
         rc_entry = [ r'\converter lyx      wordhtml       "%%" ""' ])
         rc_entry = [ r'\converter lyx      wordhtml       "%%" ""' ])
+    path, elyxer = checkProg('a LyX -> OpenDocument (eLyXer) converter',
+        ['elyxer.py --html --nofooter --unicode --directory $$r $$i $$o', 'elyxer --html --nofooter --unicode --directory $$r $$i $$o'],
+        rc_entry = [ r'\converter lyx      odt2       "%%"     ""' ])
+    path, elyxer = checkProg('a LyX -> Word converter',
+        ['elyxer.py --html --nofooter --unicode --directory $$r $$i $$o', 'elyxer --html --nofooter --unicode --directory $$r $$i $$o'],
+        rc_entry = [ r'\converter lyx      word      "%%"      ""' ])
     if elyxer.find('elyxer') >= 0:
       addToRC(r'''\copier    html       "python -tt $$s/scripts/ext_copy.py -e html,png,jpg,jpeg,css $$i $$o"''')
       addToRC(r'''\copier    wordhtml       "python -tt $$s/scripts/ext_copy.py -e html,png,jpg,jpeg,css $$i $$o"''')
     if elyxer.find('elyxer') >= 0:
       addToRC(r'''\copier    html       "python -tt $$s/scripts/ext_copy.py -e html,png,jpg,jpeg,css $$i $$o"''')
       addToRC(r'''\copier    wordhtml       "python -tt $$s/scripts/ext_copy.py -e html,png,jpg,jpeg,css $$i $$o"''')
@@ -820,6 +836,12 @@ def checkConverterEntries():
     #
     checkProg('an OpenDocument -> LaTeX converter', ['w2l -clean $$i'],
         rc_entry = [ r'\converter odt        latex      "%%"   ""' ])
     #
     checkProg('an OpenDocument -> LaTeX converter', ['w2l -clean $$i'],
         rc_entry = [ r'\converter odt        latex      "%%"   ""' ])
+    #
+    checkProg('an Open Document (Pandoc) -> LaTeX converter', ['pandoc -s -f odt -o $$o -t latex $$i'],
+        rc_entry = [ r'\converter odt3        latex      "%%"  ""' ])
+    #
+    checkProg('a MS Word Office Open XML converter -> LaTeX', ['pandoc -s -f docx -o $$o -t latex $$i'],
+        rc_entry = [ r'\converter word2      latex      "%%"   ""' ])
     # Only define a converter to pdf6, otherwise the odt format could be
     # used as an intermediate step for export to pdf, which is not wanted.
     checkProg('an OpenDocument -> PDF converter', ['unoconv -f pdf --stdout $$i > $$o'],
     # Only define a converter to pdf6, otherwise the odt format could be
     # used as an intermediate step for export to pdf, which is not wanted.
     checkProg('an OpenDocument -> PDF converter', ['unoconv -f pdf --stdout $$i > $$o'],
@@ -830,7 +852,7 @@ def checkConverterEntries():
     # directly available as application.
     # On SuSE the scripts have a .sh suffix, and on debian they are in /usr/share/tex4ht/
     # Both SuSE and debian have oolatex
     # directly available as application.
     # On SuSE the scripts have a .sh suffix, and on debian they are in /usr/share/tex4ht/
     # Both SuSE and debian have oolatex
-    checkProg('a LaTeX -> Open Document converter', [
+    checkProg('a LaTeX -> Open Document (tex4ht) converter', [
         'oolatex $$i', 'mk4ht oolatex $$i', 'oolatex.sh $$i', '/usr/share/tex4ht/oolatex $$i',
         'htlatex $$i \'xhtml,ooffice\' \'ooffice/! -cmozhtf\' \'-coo\' \'-cvalidate\''],
         rc_entry = [ r'\converter latex      odt        "%%"   "needaux"' ])
         'oolatex $$i', 'mk4ht oolatex $$i', 'oolatex.sh $$i', '/usr/share/tex4ht/oolatex $$i',
         'htlatex $$i \'xhtml,ooffice\' \'ooffice/! -cmozhtf\' \'-coo\' \'-cvalidate\''],
         rc_entry = [ r'\converter latex      odt        "%%"   "needaux"' ])
@@ -838,6 +860,12 @@ def checkConverterEntries():
     checkProg('a LaTeX -> RTF converter', ['latex2rtf -p -S -o $$o $$i', 'latex2rt -p -S -o $$o $$i'],
         rc_entry = [ r'\converter latex      rtf        "%%"   "needaux"' ])
     #
     checkProg('a LaTeX -> RTF converter', ['latex2rtf -p -S -o $$o $$i', 'latex2rt -p -S -o $$o $$i'],
         rc_entry = [ r'\converter latex      rtf        "%%"   "needaux"' ])
     #
+    checkProg('a LaTeX -> Open Document (Pandoc) converter', ['pandoc -s -f latex -o $$o -t odt $$i'],
+        rc_entry = [ r'\converter latex      odt3        "%%"  ""' ])
+    #
+    checkProg('a LaTeX -> MS Word Office Open XML converter', ['pandoc -s -f latex -o $$o -t docx $$i'],
+        rc_entry = [ r'\converter latex      word2       "%%"  ""' ])
+    #
     checkProg('a RTF -> HTML converter', ['unrtf --html  $$i > $$o'],
         rc_entry = [ r'\converter rtf      html        "%%"    ""' ])
     # Do not define a converter to pdf6, ps is a pure export format 
     checkProg('a RTF -> HTML converter', ['unrtf --html  $$i > $$o'],
         rc_entry = [ r'\converter rtf      html        "%%"    ""' ])
     # Do not define a converter to pdf6, ps is a pure export format 
@@ -859,7 +887,7 @@ def checkConverterEntries():
     checkProg('a PS to EPS converter', ['ps2eps -- < $$i > $$o'],
         rc_entry = [ r'\converter eps2       eps      "%%"     ""' ])
     #
     checkProg('a PS to EPS converter', ['ps2eps -- < $$i > $$o'],
         rc_entry = [ r'\converter eps2       eps      "%%"     ""' ])
     #
-    checkProg('a PDF to PS converter', ['pdf2ps $$i $$o', 'pdftops $$i $$o'],
+    checkProg('a PDF to PS converter', ['pdftops $$i $$o', 'pdf2ps $$i $$o'],
         rc_entry = [ r'\converter pdf         ps        "%%"   ""' ])
     # Only define a converter from pdf6 for graphics
     checkProg('a PDF to EPS converter', ['pdftops -eps -f 1 -l 1 $$i $$o'],
         rc_entry = [ r'\converter pdf         ps        "%%"   ""' ])
     # Only define a converter from pdf6 for graphics
     checkProg('a PDF to EPS converter', ['pdftops -eps -f 1 -l 1 $$i $$o'],
@@ -912,16 +940,22 @@ def checkConverterEntries():
 \converter tgif       png        "tgif -print -color -png -o $$d $$i"  ""
 \converter tgif       pdf6       "tgif -print -color -pdf -stdout $$i > $$o"   ""'''])
     #
 \converter tgif       png        "tgif -print -color -png -o $$d $$i"  ""
 \converter tgif       pdf6       "tgif -print -color -pdf -stdout $$i > $$o"   ""'''])
     #
-    checkProg('a WMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i'],
+    checkProg('a WMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i', inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-eps=$$o'],
         rc_entry = [ r'\converter wmf        eps        "%%"   ""'])
     #
         rc_entry = [ r'\converter wmf        eps        "%%"   ""'])
     #
-    checkProg('an EMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i'],
+    checkProg('an EMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i', inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-eps=$$o'],
         rc_entry = [ r'\converter emf        eps        "%%"   ""'])
         rc_entry = [ r'\converter emf        eps        "%%"   ""'])
+    #
+    checkProg('a WMF -> PDF converter', [inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-pdf=$$o'],
+        rc_entry = [ r'\converter wmf        pdf6        "%%"  ""'])
+    #
+    checkProg('an EMF -> PDF converter', [inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-pdf=$$o'],
+        rc_entry = [ r'\converter emf        pdf6        "%%"  ""'])
     # Only define a converter to pdf6 for graphics
     checkProg('an EPS -> PDF converter', ['epstopdf'],
         rc_entry = [ r'\converter eps        pdf6       "epstopdf --outfile=$$o $$i"   ""'])
     #
     # Only define a converter to pdf6 for graphics
     checkProg('an EPS -> PDF converter', ['epstopdf'],
         rc_entry = [ r'\converter eps        pdf6       "epstopdf --outfile=$$o $$i"   ""'])
     #
-    checkProg('an EPS -> PNG converter', ['convert $$i $$o'],
+    checkProg('an EPS -> PNG converter', ['magick $$i $$o', 'convert $$i $$o'],
         rc_entry = [ r'\converter eps        png        "%%"   ""'])
     #
     # no agr -> pdf6 converter, since the pdf library used by gracebat is not
         rc_entry = [ r'\converter eps        png        "%%"   ""'])
     #
     # no agr -> pdf6 converter, since the pdf library used by gracebat is not
@@ -951,15 +985,28 @@ def checkConverterEntries():
     # odg->png and odg->pdf converters, since the bb would be too large as well.
     checkProg('an OpenDocument -> EPS converter', ['libreoffice -headless -nologo -convert-to eps $$i', 'unoconv -f eps --stdout $$i > $$o'],
         rc_entry = [ r'\converter odg        eps2       "%%"   ""'])
     # odg->png and odg->pdf converters, since the bb would be too large as well.
     checkProg('an OpenDocument -> EPS converter', ['libreoffice -headless -nologo -convert-to eps $$i', 'unoconv -f eps --stdout $$i > $$o'],
         rc_entry = [ r'\converter odg        eps2       "%%"   ""'])
+    #
+    checkProg('a SVG (compressed) -> SVG converter', ['gunzip -c $$i > $$o'],
+        rc_entry = [ r'\converter svgz       svg        "%%"   ""'])
+    #
+    checkProg('a SVG -> SVG (compressed) converter', ['gzip -c $$i > $$o'],
+        rc_entry = [ r'\converter svg        svgz       "%%"   ""'])
     # Only define a converter to pdf6 for graphics
     # Only define a converter to pdf6 for graphics
-    checkProg('a SVG -> PDF converter', ['rsvg-convert -f pdf -o $$o $$i', 'inkscape --file=$$i --export-area-drawing --without-gui --export-pdf=$$o'],
-        rc_entry = [ r'\converter svg        pdf6       "%%"   ""'])
+    # Prefer rsvg-convert over inkscape since it is faster (see http://www.lyx.org/trac/ticket/9891)
+    checkProg('a SVG -> PDF converter', ['rsvg-convert -f pdf -o $$o $$i', inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-pdf=$$o'],
+        rc_entry = [ r'''\converter svg        pdf6       "%%"    ""
+\converter svgz       pdf6       "%%"    ""'''],
+        path = ['', inkscape_path])
     #
     #
-    checkProg('a SVG -> EPS converter', ['rsvg-convert -f ps -o $$o $$i', 'inkscape --file=$$i --export-area-drawing --without-gui --export-eps=$$o'],
-        rc_entry = [ r'\converter svg        eps        "%%"   ""'])
+    checkProg('a SVG -> EPS converter', ['rsvg-convert -f ps -o $$o $$i', inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-eps=$$o'],
+        rc_entry = [ r'''\converter svg        eps        "%%"    ""
+\converter svgz       eps        "%%"    ""'''],
+        path = ['', inkscape_path])
     #
     #
-    checkProg('a SVG -> PNG converter', ['rsvg-convert -f png -o $$o $$i', 'inkscape --without-gui --file=$$i --export-png=$$o'],
-        rc_entry = [ r'\converter svg        png        "%%"   ""'])
+    checkProg('a SVG -> PNG converter', ['rsvg-convert -f png -o $$o $$i', inkscape_name + ' --without-gui --file=$$i --export-png=$$o'],
+        rc_entry = [ r'''\converter svg        png        "%%"    "",
+\converter svgz       png        "%%"    ""'''],
+        path = ['', inkscape_path])
 
     #
     # gnumeric/xls/ods to tex
 
     #
     # gnumeric/xls/ods to tex
@@ -1037,21 +1084,21 @@ def checkConverterEntries():
     # Entries that do not need checkProg
     addToRC(r'''
 \converter csv        lyx        "python -tt $$s/scripts/csv2lyx.py $$i $$o"   ""
     # Entries that do not need checkProg
     addToRC(r'''
 \converter csv        lyx        "python -tt $$s/scripts/csv2lyx.py $$i $$o"   ""
-\converter date       dateout    "python -tt $$s/scripts/date.py %d-%m-%Y > $$o"       ""
 \converter docbook    docbook-xml "cp $$i $$o" "xml"
 \converter fen        asciichess "python -tt $$s/scripts/fen2ascii.py $$i $$o" ""
 \converter docbook    docbook-xml "cp $$i $$o" "xml"
 \converter fen        asciichess "python -tt $$s/scripts/fen2ascii.py $$i $$o" ""
-\converter lyx        lyx13x     "python -tt $$s/lyx2lyx/lyx2lyx -t 221 $$i > $$o"     ""
-\converter lyx        lyx14x     "python -tt $$s/lyx2lyx/lyx2lyx -t 245 $$i > $$o"     ""
-\converter lyx        lyx15x     "python -tt $$s/lyx2lyx/lyx2lyx -t 276 $$i > $$o"     ""
-\converter lyx        lyx16x     "python -tt $$s/lyx2lyx/lyx2lyx -t 345 $$i > $$o"     ""
-\converter lyx        lyx20x     "python -tt $$s/lyx2lyx/lyx2lyx -t 413 $$i > $$o"     ""
-\converter lyx        lyx21x     "python -tt $$s/lyx2lyx/lyx2lyx -t 474 $$i > $$o"     ""
-\converter lyx        clyx       "python -tt $$s/lyx2lyx/lyx2lyx -c big5 -t 245 $$i > $$o"     ""
-\converter lyx        jlyx       "python -tt $$s/lyx2lyx/lyx2lyx -c euc_jp -t 245 $$i > $$o"   ""
-\converter lyx        klyx       "python -tt $$s/lyx2lyx/lyx2lyx -c euc_kr -t 245 $$i > $$o"   ""
-\converter clyx       lyx        "python -tt $$s/lyx2lyx/lyx2lyx -c big5 $$i > $$o"    ""
-\converter jlyx       lyx        "python -tt $$s/lyx2lyx/lyx2lyx -c euc_jp $$i > $$o"  ""
-\converter klyx       lyx        "python -tt $$s/lyx2lyx/lyx2lyx -c euc_kr $$i > $$o"  ""
+\converter lyx        lyx13x     "python -tt $$s/lyx2lyx/lyx2lyx -V 1.3 -o $$o $$i"    ""
+\converter lyx        lyx14x     "python -tt $$s/lyx2lyx/lyx2lyx -V 1.4 -o $$o $$i"    ""
+\converter lyx        lyx15x     "python -tt $$s/lyx2lyx/lyx2lyx -V 1.5 -o $$o $$i"    ""
+\converter lyx        lyx16x     "python -tt $$s/lyx2lyx/lyx2lyx -V 1.6 -o $$o $$i"    ""
+\converter lyx        lyx20x     "python -tt $$s/lyx2lyx/lyx2lyx -V 2.0 -o $$o $$i"    ""
+\converter lyx        lyx21x     "python -tt $$s/lyx2lyx/lyx2lyx -V 2.1 -o $$o $$i"    ""
+\converter lyx        lyx22x     "python -tt $$s/lyx2lyx/lyx2lyx -V 2.2 -o $$o $$i"    ""
+\converter lyx        clyx       "python -tt $$s/lyx2lyx/lyx2lyx -V 1.4 -o $$o -c big5   $$i"  ""
+\converter lyx        jlyx       "python -tt $$s/lyx2lyx/lyx2lyx -V 1.4 -o $$o -c euc_jp $$i"  ""
+\converter lyx        klyx       "python -tt $$s/lyx2lyx/lyx2lyx -V 1.4 -o $$o -c euc_kr $$i"  ""
+\converter clyx       lyx        "python -tt $$s/lyx2lyx/lyx2lyx -c big5   -o $$o $$i" ""
+\converter jlyx       lyx        "python -tt $$s/lyx2lyx/lyx2lyx -c euc_jp -o $$o $$i" ""
+\converter klyx       lyx        "python -tt $$s/lyx2lyx/lyx2lyx -c euc_kr -o $$o $$i" ""
 \converter lyxpreview png        "python -tt $$s/scripts/lyxpreview2bitmap.py --png"   ""
 \converter lyxpreview ppm        "python -tt $$s/scripts/lyxpreview2bitmap.py --ppm"   ""
 ''')
 \converter lyxpreview png        "python -tt $$s/scripts/lyxpreview2bitmap.py --png"   ""
 \converter lyxpreview ppm        "python -tt $$s/scripts/lyxpreview2bitmap.py --ppm"   ""
 ''')
@@ -1143,8 +1190,8 @@ def processLayoutFile(file, bool_docbook):
             return x.strip()
     classname = file.split(os.sep)[-1].split('.')[0]
     # return ('LaTeX', '[a,b]', 'a', ',b,c', 'article') for \DeclareLaTeXClass[a,b,c]{article}
             return x.strip()
     classname = file.split(os.sep)[-1].split('.')[0]
     # return ('LaTeX', '[a,b]', 'a', ',b,c', 'article') for \DeclareLaTeXClass[a,b,c]{article}
-    p = re.compile(r'\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}')
-    q = re.compile(r'\DeclareCategory{(.*)}')
+    p = re.compile(r'^\s*#\s*\\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}\s*$')
+    q = re.compile(r'^\s*#\s*\\DeclareCategory{(.*)}\s*$')
     classdeclaration = ""
     categorydeclaration = '""'
     for line in open(file).readlines():
     classdeclaration = ""
     categorydeclaration = '""'
     for line in open(file).readlines():
@@ -1158,7 +1205,7 @@ def processLayoutFile(file, bool_docbook):
                 prereq_latex = checkForClassExtension(classname)
             else:
                 prereq_list = optAll[1:-1].split(',')
                 prereq_latex = checkForClassExtension(classname)
             else:
                 prereq_list = optAll[1:-1].split(',')
-                prereq_list = map(checkForClassExtension, prereq_list)
+                prereq_list = list(map(checkForClassExtension, prereq_list))
                 prereq_latex = ','.join(prereq_list)
             prereq_docbook = {'true':'', 'false':'docbook'}[bool_docbook]
             prereq = {'LaTeX':prereq_latex, 'DocBook':prereq_docbook}[classtype]
                 prereq_latex = ','.join(prereq_list)
             prereq_docbook = {'true':'', 'false':'docbook'}[bool_docbook]
             prereq = {'LaTeX':prereq_latex, 'DocBook':prereq_docbook}[classtype]
@@ -1239,8 +1286,8 @@ def checkLatexConfig(check_config, bool_docbook):
     # Construct the list of classes to test for.
     # build the list of available layout files and convert it to commands
     # for chkconfig.ltx
     # Construct the list of classes to test for.
     # build the list of available layout files and convert it to commands
     # for chkconfig.ltx
-    declare = re.compile(r'\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}')
-    category = re.compile(r'\DeclareCategory{(.*)}')
+    declare = re.compile(r'^\s*#\s*\\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}\s*$')
+    category = re.compile(r'^\s*#\s*\\DeclareCategory{(.*)}\s*$')
     empty = re.compile(r'^\s*$')
     testclasses = list()
     for file in glob.glob( os.path.join('layouts', '*.layout') ) + \
     empty = re.compile(r'^\s*$')
     testclasses = list()
     for file in glob.glob( os.path.join('layouts', '*.layout') ) + \
@@ -1467,7 +1514,10 @@ def rescanTeXFiles():
     if not os.path.isfile( os.path.join(srcdir, 'scripts', 'TeXFiles.py') ):
         logger.error("configure: error: cannot find TeXFiles.py script")
         sys.exit(1)
     if not os.path.isfile( os.path.join(srcdir, 'scripts', 'TeXFiles.py') ):
         logger.error("configure: error: cannot find TeXFiles.py script")
         sys.exit(1)
-    tfp = cmdOutput("python -tt " + '"' + os.path.join(srcdir, 'scripts', 'TeXFiles.py') + '"')
+    interpreter = sys.executable
+    if interpreter == '':
+        interpreter = "python"
+    tfp = cmdOutput(interpreter + " -tt " + '"' + os.path.join(srcdir, 'scripts', 'TeXFiles.py') + '"')
     logger.info(tfp)
     logger.info("\tdone")
 
     logger.info(tfp)
     logger.info("\tdone")
 
@@ -1492,7 +1542,7 @@ if __name__ == '__main__':
     ## Parse the command line
     for op in sys.argv[1:]:   # default shell/for list is $*, the options
         if op in [ '-help', '--help', '-h' ]:
     ## Parse the command line
     for op in sys.argv[1:]:   # default shell/for list is $*, the options
         if op in [ '-help', '--help', '-h' ]:
-            print '''Usage: configure [options]
+            print('''Usage: configure [options]
 Options:
     --help                   show this help lines
     --keep-temps             keep temporary files (for debug. purposes)
 Options:
     --help                   show this help lines
     --keep-temps             keep temporary files (for debug. purposes)
@@ -1500,7 +1550,7 @@ Options:
     --without-latex-config   do not run LaTeX to determine configuration
     --with-version-suffix=suffix suffix of binary installed files
     --binary-dir=directory   directory of binary installed files
     --without-latex-config   do not run LaTeX to determine configuration
     --with-version-suffix=suffix suffix of binary installed files
     --binary-dir=directory   directory of binary installed files
-'''
+''')
             sys.exit(0)
         elif op == '--without-kpsewhich':
             lyx_kpsewhich = False
             sys.exit(0)
         elif op == '--without-kpsewhich':
             lyx_kpsewhich = False
@@ -1513,7 +1563,7 @@ Options:
         elif op[0:13] == '--binary-dir=':
             lyx_binary_dir = op[13:]
         else:
         elif op[0:13] == '--binary-dir=':
             lyx_binary_dir = op[13:]
         else:
-            print "Unknown option", op
+            print("Unknown option %s" % op)
             sys.exit(1)
     #
     # check if we run from the right directory
             sys.exit(1)
     #
     # check if we run from the right directory
@@ -1544,6 +1594,7 @@ Format %i
     # check java and perl before any checkProg that may require them
     java = checkProg('a java interpreter', ['java'])[1]
     perl = checkProg('a perl interpreter', ['perl'])[1]
     # check java and perl before any checkProg that may require them
     java = checkProg('a java interpreter', ['java'])[1]
     perl = checkProg('a perl interpreter', ['perl'])[1]
+    (inkscape_path, inkscape_name) = os.path.split(checkInkscape())
     checkFormatEntries(dtl_tools)
     checkConverterEntries()
     (chk_docbook, bool_docbook, docbook_cmd) = checkDocBook()
     checkFormatEntries(dtl_tools)
     checkConverterEntries()
     (chk_docbook, bool_docbook, docbook_cmd) = checkDocBook()