]> git.lyx.org Git - lyx.git/blobdiff - lib/configure.py
Arabic doc files: corrections by Hatim
[lyx.git] / lib / configure.py
index c55580e190c6be6f5b1bb85de442f82e1a7c8783..df07e4612962ac9b4117911f2d8cacdb96bed501 100644 (file)
@@ -9,7 +9,7 @@
 # Full author contact details are available in file CREDITS.
 
 from __future__ import print_function
 # Full author contact details are available in file CREDITS.
 
 from __future__ import print_function
-import glob, logging, os, re, shutil, subprocess, sys, stat
+import glob, logging, os, errno, re, shutil, subprocess, sys, stat
 
 # set up logging
 logging.basicConfig(level = logging.DEBUG,
 
 # set up logging
 logging.basicConfig(level = logging.DEBUG,
@@ -52,8 +52,13 @@ def removeFiles(filenames):
         try:
             os.remove(file)
             logger.debug('Removing file %s' % file)
         try:
             os.remove(file)
             logger.debug('Removing file %s' % file)
-        except:
-            logger.debug('Failed to remove file %s' % file)
+        except OSError as e:
+            if e.errno == errno.ENOENT: # no such file or directory
+                logger.debug('No need to remove file %s (it does not exists)' % file)
+            elif e.errno == errno.EISDIR: # is a directory
+                logger.debug('Failed to remove file %s (it is a directory)' % file)
+            else:
+                logger.debug('Failed to remove file %s' % file)
             pass
 
 
             pass
 
 
@@ -498,8 +503,7 @@ def checkInkscape():
     ''' The answer of the real inkscape is validated and a fake binary used if this fails '''
     if sys.platform == 'darwin':
         version_string = cmdOutput("inkscape --version")
     ''' The answer of the real inkscape is validated and a fake binary used if this fails '''
     if sys.platform == 'darwin':
         version_string = cmdOutput("inkscape --version")
-        match = re.match('^Inkscape', version_string)
-        if match:
+        if version_string.startswith('Inkscape'):
             return 'inkscape'
         else:
             return 'inkscape-binary'
             return 'inkscape'
         else:
             return 'inkscape-binary'
@@ -513,12 +517,12 @@ def checkInkscape():
     try:
         aKey = winreg.OpenKey(aReg, r"inkscape.svg\DefaultIcon")
         val = winreg.QueryValueEx(aKey, "")
     try:
         aKey = winreg.OpenKey(aReg, r"inkscape.svg\DefaultIcon")
         val = winreg.QueryValueEx(aKey, "")
-        return str(val[0]).split('"')[1].replace('.exe', '')
+        return str(val[0]).split('"')[1]
     except EnvironmentError:
         try:
             aKey = winreg.OpenKey(aReg, r"Applications\inkscape.exe\shell\open\command")
             val = winreg.QueryValueEx(aKey, "")
     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', '')
+            return str(val[0]).split('"')[1]
         except EnvironmentError:
             return 'inkscape'
 
         except EnvironmentError:
             return 'inkscape'
 
@@ -592,6 +596,10 @@ def checkModule(module):
       return False
 
 
       return False
 
 
+texteditors = ['xemacs', 'gvim', 'kedit', 'kwrite', 'kate',
+               'nedit', 'gedit', 'geany', 'leafpad', 'mousepad',
+               'xed', 'notepad', 'WinEdt', 'WinShell', 'PSPad']
+
 def checkFormatEntries(dtl_tools):
     ''' Check all formats (\Format entries) '''
     checkViewerEditor('a Tgif viewer and editor', ['tgif'],
 def checkFormatEntries(dtl_tools):
     ''' Check all formats (\Format entries) '''
     checkViewerEditor('a Tgif viewer and editor', ['tgif'],
@@ -612,7 +620,7 @@ 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_name],
+    checkViewerEditor('a SVG viewer and editor', [inkscape_gui],
         rc_entry = [r'''\Format svg        "svg" SVG                "" "%%" "%%"       "vector"        "image/svg+xml"
 \Format svgz       "svgz" "SVG (compressed)" "" "%%" "%%"      "vector,zipped=native"  ""'''],
         path = [inkscape_path])
         rc_entry = [r'''\Format svg        "svg" SVG                "" "%%" "%%"       "vector"        "image/svg+xml"
 \Format svgz       "svgz" "SVG (compressed)" "" "%%" "%%"      "vector,zipped=native"  ""'''],
         path = [inkscape_path])
@@ -636,9 +644,7 @@ def checkFormatEntries(dtl_tools):
         ['gimp-remote', 'gimp'], rc_entry = [imageformats])
     addToRC(imageformats % ((iv, ie)*10))
     #
         ['gimp-remote', 'gimp'], rc_entry = [imageformats])
     addToRC(imageformats % ((iv, ie)*10))
     #
-    checkViewerEditor('a text editor',
-        ['xemacs', 'gvim', 'kedit', 'kwrite', 'kate',
-         'nedit', 'gedit', 'geany', 'leafpad', 'mousepad', 'xed', 'notepad'],
+    checkViewerEditor('a text editor', texteditors,
         rc_entry = [r'''\Format asciichess asc    "Plain text (chess output)"  "" ""   "%%"    ""      ""
 \Format docbook    sgml    DocBook                B  ""        "%%"    "document,menu=export"  ""
 \Format docbook-xml xml   "DocBook (XML)"         "" ""        "%%"    "document,menu=export"  "application/docbook+xml"
         rc_entry = [r'''\Format asciichess asc    "Plain text (chess output)"  "" ""   "%%"    ""      ""
 \Format docbook    sgml    DocBook                B  ""        "%%"    "document,menu=export"  ""
 \Format docbook-xml xml   "DocBook (XML)"         "" ""        "%%"    "document,menu=export"  "application/docbook+xml"
@@ -666,8 +672,7 @@ def checkFormatEntries(dtl_tools):
 \Format beamer.info pdf.info   "Info (Beamer)"         "" ""   "%%"    "document,menu=export"  ""''' ])
    #Lilypond files have special editors, but fall back to plain text editors
     checkViewerEditor('a lilypond editor',
 \Format beamer.info pdf.info   "Info (Beamer)"         "" ""   "%%"    "document,menu=export"  ""''' ])
    #Lilypond files have special editors, but fall back to plain text editors
     checkViewerEditor('a lilypond editor',
-        ['frescobaldi', 'xemacs', 'gvim', 'kedit', 'kwrite', 'kate',
-         'nedit', 'gedit', 'geany', 'leafpad', 'mousepad', 'xed', 'notepad'],
+        ['frescobaldi'] + texteditors,
         rc_entry = [r'''\Format lilypond   ly     "LilyPond music"        "" ""        "%%"    "vector"        "text/x-lilypond"''' ])
    #Spreadsheets using ssconvert from gnumeric
     checkViewer('gnumeric spreadsheet software', ['gnumeric'],
         rc_entry = [r'''\Format lilypond   ly     "LilyPond music"        "" ""        "%%"    "vector"        "text/x-lilypond"''' ])
    #Spreadsheets using ssconvert from gnumeric
     checkViewer('gnumeric spreadsheet software', ['gnumeric'],
@@ -682,10 +687,8 @@ def checkFormatEntries(dtl_tools):
  #
     checkEditor('a BibTeX editor', ['jabref', 'JabRef',
         'pybliographic', 'bibdesk', 'gbib', 'kbib',
  #
     checkEditor('a BibTeX editor', ['jabref', 'JabRef',
         'pybliographic', 'bibdesk', 'gbib', 'kbib',
-        'kbibtex', 'sixpack', 'bibedit', 'tkbibtex'
-        'xemacs', 'gvim', 'kedit', 'kwrite', 'kate',
-        'jedit', 'TeXnicCenter', 'WinEdt', 'WinShell', 'PSPad',
-        'nedit', 'gedit', 'notepad', 'geany', 'leafpad', 'mousepad'],
+        'kbibtex', 'sixpack', 'bibedit', 'tkbibtex', 'TeXnicCenter'] +
+        texteditors,
         rc_entry = [r'''\Format bibtex bib    "BibTeX"         "" ""   "%%"    ""      "text/x-bibtex"''' ])
     #
     #checkProg('a Postscript interpreter', ['gs'],
         rc_entry = [r'''\Format bibtex bib    "BibTeX"         "" ""   "%%"    ""      "text/x-bibtex"''' ])
     #
     #checkProg('a Postscript interpreter', ['gs'],
@@ -751,7 +754,8 @@ def checkFormatEntries(dtl_tools):
 \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"      ""
 \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"      ""
-\Format lyx22x     22.lyx "LyX 2.2.x"             "" ""        ""      "document,menu=export"  ""
+\Format lyx22x     22.lyx "LyX 2.2.x"             "" ""        ""      "document"      ""
+\Format lyx23x     23.lyx "LyX 2.3.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"      ""
@@ -993,11 +997,11 @@ def checkConverterEntries():
 \converter fig        pdftex     "python -tt $$s/scripts/fig2pdftex.py $$i $$o"        ""
 \converter fig        pstex      "python -tt $$s/scripts/fig2pstex.py $$i $$o" ""''')
     #
 \converter fig        pdftex     "python -tt $$s/scripts/fig2pdftex.py $$i $$o"        ""
 \converter fig        pstex      "python -tt $$s/scripts/fig2pstex.py $$i $$o" ""''')
     #
-    checkProg('a SVG -> PDFTeX converter', [inkscape_name],
+    checkProg('a SVG -> PDFTeX converter', [inkscape_cl],
         rc_entry = [ r'\converter svg        pdftex     "python -tt $$s/scripts/svg2pdftex.py %% $$p$$i $$p$$o" ""'],
         path = [inkscape_path])
     #
         rc_entry = [ r'\converter svg        pdftex     "python -tt $$s/scripts/svg2pdftex.py %% $$p$$i $$p$$o" ""'],
         path = [inkscape_path])
     #
-    checkProg('a SVG -> PSTeX converter', [inkscape_name],
+    checkProg('a SVG -> PSTeX converter', [inkscape_cl],
         rc_entry = [ r'\converter svg        pstex     "python -tt $$s/scripts/svg2pstex.py %% $$p$$i $$p$$o" ""'],
         path = [inkscape_path])
     #
         rc_entry = [ r'\converter svg        pstex     "python -tt $$s/scripts/svg2pstex.py %% $$p$$i $$p$$o" ""'],
         path = [inkscape_path])
     #
@@ -1010,16 +1014,18 @@ 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', inkscape_name + ' --file=$$p$$i --export-area-drawing --without-gui --export-eps=$$p$$o'],
+    checkProg('a WMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i', inkscape_cl + ' --file=%s$$i --export-area-drawing --without-gui --export-eps=%s$$o'
+               % (inkscape_fileprefix, inkscape_fileprefix)],
         rc_entry = [ r'\converter wmf        eps        "%%"   ""'])
     #
         rc_entry = [ r'\converter wmf        eps        "%%"   ""'])
     #
-    checkProg('an EMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i', inkscape_name + ' --file=$$p$$i --export-area-drawing --without-gui --export-eps=$$p$$o'],
+    checkProg('an EMF -> EPS converter', ['metafile2eps $$i $$o', inkscape_cl + ' --file=%s$$i --export-area-drawing --without-gui --export-eps=%s$$o'
+               % (inkscape_fileprefix, inkscape_fileprefix)],
         rc_entry = [ r'\converter emf        eps        "%%"   ""'])
     #
         rc_entry = [ r'\converter emf        eps        "%%"   ""'])
     #
-    checkProg('a WMF -> PDF converter', [inkscape_name + ' --file=$$p$$i --export-area-drawing --without-gui --export-pdf=$$p$$o'],
+    checkProg('a WMF -> PDF converter', [inkscape_cl + ' --file=%s$$i --export-area-drawing --without-gui --export-pdf=%s$$o' % (inkscape_fileprefix, inkscape_fileprefix)],
         rc_entry = [ r'\converter wmf        pdf6        "%%"  ""'])
     #
         rc_entry = [ r'\converter wmf        pdf6        "%%"  ""'])
     #
-    checkProg('an EMF -> PDF converter', [inkscape_name + ' --file=$$p$$i --export-area-drawing --without-gui --export-pdf=$$p$$o'],
+    checkProg('an EMF -> PDF converter', [inkscape_cl + ' --file=%s$$i --export-area-drawing --without-gui --export-pdf=%s$$o' % (inkscape_fileprefix, inkscape_fileprefix)],
         rc_entry = [ r'\converter emf        pdf6        "%%"  ""'])
     # Only define a converter to pdf6 for graphics
     checkProg('an EPS -> PDF converter', ['epstopdf'],
         rc_entry = [ r'\converter emf        pdf6        "%%"  ""'])
     # Only define a converter to pdf6 for graphics
     checkProg('an EPS -> PDF converter', ['epstopdf'],
@@ -1065,17 +1071,20 @@ def checkConverterEntries():
         rc_entry = [ r'\converter svg        svgz       "%%"   ""'])
     # Only define a converter to pdf6 for graphics
     # Prefer rsvg-convert over inkscape since it is faster (see http://www.lyx.org/trac/ticket/9891)
         rc_entry = [ r'\converter svg        svgz       "%%"   ""'])
     # Only define a converter to pdf6 for graphics
     # 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=$$p$$i --export-area-drawing --without-gui --export-pdf=$$p$$o'],
+    checkProg('a SVG -> PDF converter', ['rsvg-convert -f pdf -o $$o $$i', inkscape_cl + ' --file=%s$$i --export-area-drawing --without-gui --export-pdf=%s$$o'
+               % (inkscape_fileprefix, inkscape_fileprefix)],
         rc_entry = [ r'''\converter svg        pdf6       "%%"    ""
 \converter svgz       pdf6       "%%"    ""'''],
         path = ['', inkscape_path])
     #
         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_name + ' --file=$$p$$i --export-area-drawing --without-gui --export-eps=$$p$$o'],
+    checkProg('a SVG -> EPS converter', ['rsvg-convert -f ps -o $$o $$i', inkscape_cl + ' --file=%s$$i --export-area-drawing --without-gui --export-eps=%s$$o'
+               % (inkscape_fileprefix, inkscape_fileprefix)],
         rc_entry = [ r'''\converter svg        eps        "%%"    ""
 \converter svgz       eps        "%%"    ""'''],
         path = ['', inkscape_path])
     #
         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_name + ' --without-gui --file=$$i --export-png=$$o'],
+    checkProg('a SVG -> PNG converter', ['rsvg-convert -f png -o $$o $$i', inkscape_cl + ' --without-gui --file=%s$$i --export-png=%s$$o'
+               % (inkscape_fileprefix, inkscape_fileprefix)],
         rc_entry = [ r'''\converter svg        png        "%%"    "",
 \converter svgz       png        "%%"    ""'''],
         path = ['', inkscape_path])
         rc_entry = [ r'''\converter svg        png        "%%"    "",
 \converter svgz       png        "%%"    ""'''],
         path = ['', inkscape_path])
@@ -1122,7 +1131,7 @@ def checkConverterEntries():
     path, lilypond_book = checkProg('a LilyPond book (LaTeX) -> LaTeX converter', ['lilypond-book'])
     if (lilypond_book != ''):
         version_string = cmdOutput("lilypond-book --version")
     path, lilypond_book = checkProg('a LilyPond book (LaTeX) -> LaTeX converter', ['lilypond-book'])
     if (lilypond_book != ''):
         version_string = cmdOutput("lilypond-book --version")
-        match = re.match('^(\S+)$', version_string)
+        match = re.match('(\S+)$', version_string)
         if match:
             version_number = match.groups()[0]
             version = version_number.split('.')
         if match:
             version_number = match.groups()[0]
             version = version_number.split('.')
@@ -1176,6 +1185,7 @@ def checkConverterEntries():
 \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        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        lyx23x     "python -tt $$s/lyx2lyx/lyx2lyx -V 2.3 -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 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"  ""
@@ -1274,43 +1284,43 @@ def processLayoutFile(file, bool_docbook):
     def checkForClassExtension(x):
         '''if the extension for a latex class is not
            provided, add .cls to the classname'''
     def checkForClassExtension(x):
         '''if the extension for a latex class is not
            provided, add .cls to the classname'''
-        if not '.' in x:
-            return x.strip() + '.cls'
+        if not b'.' in x:
+            return x.strip() + b'.cls'
         else:
             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}
         else:
             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'^\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():
-        res = p.search(line)
-        qres = q.search(line)
+    p = re.compile(b'\s*#\s*\\\\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}\s*$')
+    q = re.compile(b'\s*#\s*\\\\DeclareCategory{(.*)}\s*$')
+    classdeclaration = b""
+    categorydeclaration = b'""'
+    for line in open(file, 'rb').readlines():
+        res = p.match(line)
+        qres = q.match(line)
         if res != None:
             (classtype, optAll, opt, opt1, desc) = res.groups()
         if res != None:
             (classtype, optAll, opt, opt1, desc) = res.groups()
-            avai = {'LaTeX':'false', 'DocBook':bool_docbook}[classtype]
+            avai = {b'LaTeX':b'false', b'DocBook':bool_docbook.encode('ascii')}[classtype]
             if opt == None:
             if opt == None:
-                opt = classname
-                prereq_latex = checkForClassExtension(classname)
+                opt = classname.encode('ascii')
+                prereq_latex = checkForClassExtension(classname.encode('ascii'))
             else:
             else:
-                prereq_list = optAll[1:-1].split(',')
+                prereq_list = optAll[1:-1].split(b',')
                 prereq_list = 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]
-            classdeclaration = ('"%s" "%s" "%s" "%s" "%s"'
+                prereq_latex = b','.join(prereq_list)
+            prereq_docbook = {'true':b'', 'false':b'docbook'}[bool_docbook]
+            prereq = {b'LaTeX':prereq_latex, b'DocBook':prereq_docbook}[classtype]
+            classdeclaration = (b'"%s" "%s" "%s" "%s" "%s"'
                                % (classname, opt, desc, avai, prereq))
                                % (classname, opt, desc, avai, prereq))
-            if categorydeclaration != '""':
-                return classdeclaration + " " + categorydeclaration
+            if categorydeclaration != b'""':
+                return classdeclaration + b" " + categorydeclaration
         if qres != None:
         if qres != None:
-             categorydeclaration = '"%s"' % (qres.groups()[0])
-             if classdeclaration != "":
-                 return classdeclaration + " " + categorydeclaration
-    if classdeclaration != "":
-        return classdeclaration + " " + categorydeclaration
+             categorydeclaration = b'"%s"' % (qres.groups()[0])
+             if classdeclaration != b"":
+                 return classdeclaration + b" " + categorydeclaration
+    if classdeclaration != b"":
+        return classdeclaration + b" " + categorydeclaration
     logger.warning("Layout file " + file + " has no \DeclareXXClass line. ")
     logger.warning("Layout file " + file + " has no \DeclareXXClass line. ")
-    return ""
+    return b""
 
 
 def checkLatexConfig(check_config, bool_docbook):
 
 
 def checkLatexConfig(check_config, bool_docbook):
@@ -1328,8 +1338,8 @@ def checkLatexConfig(check_config, bool_docbook):
         # fails, we still have something to start lyx.
         logger.info(msg + ' default values')
         logger.info('+checking list of textclasses... ')
         # fails, we still have something to start lyx.
         logger.info(msg + ' default values')
         logger.info('+checking list of textclasses... ')
-        tx = open('textclass.lst', 'w')
-        tx.write('''
+        tx = open('textclass.lst', 'wb')
+        tx.write(b'''
 # This file declares layouts and their associated definition files
 # (include dir. relative to the place where this file is).
 # It contains only default values, since chkconfig.ltx could not be run
 # This file declares layouts and their associated definition files
 # (include dir. relative to the place where this file is).
 # It contains only default values, since chkconfig.ltx could not be run
@@ -1353,8 +1363,8 @@ def checkLatexConfig(check_config, bool_docbook):
             if foundClasses.count(cleanclass) == 0: # not found before
                 foundClasses.append(cleanclass)
                 retval = processLayoutFile(file, bool_docbook)
             if foundClasses.count(cleanclass) == 0: # not found before
                 foundClasses.append(cleanclass)
                 retval = processLayoutFile(file, bool_docbook)
-                if retval != "":
-                    tx.write(retval)
+                if retval != b"":
+                    tx.write(retval + os.linesep)
         tx.close()
         logger.info('\tdone')
     if not os.path.isfile('packages.lst') or not check_config:
         tx.close()
         logger.info('\tdone')
     if not os.path.isfile('packages.lst') or not check_config:
@@ -1377,9 +1387,9 @@ 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(b'^\\s*#\\s*\\\\Declare(LaTeX|DocBook)Class\\s*(\[([^,]*)(,.*)*\])*\\s*{(.*)}\\s*$')
-    category = re.compile(b'^\\s*#\\s*\\\\DeclareCategory{(.*)}\\s*$')
-    empty = re.compile(b'^\\s*$')
+    declare = re.compile(b'\\s*#\\s*\\\\Declare(LaTeX|DocBook)Class\\s*(\[([^,]*)(,.*)*\])*\\s*{(.*)}\\s*$')
+    category = re.compile(b'\\s*#\\s*\\\\DeclareCategory{(.*)}\\s*$')
+    empty = re.compile(b'\\s*$')
     testclasses = list()
     for file in (glob.glob( os.path.join('layouts', '*.layout') )
                  + glob.glob( os.path.join(srcdir, 'layouts', '*.layout' ) ) ):
     testclasses = list()
     for file in (glob.glob( os.path.join('layouts', '*.layout') )
                  + glob.glob( os.path.join(srcdir, 'layouts', '*.layout' ) ) ):
@@ -1397,14 +1407,14 @@ def checkLatexConfig(check_config, bool_docbook):
                     nodeclaration = True
                 # A class, but no category declaration. Just break.
                 break
                     nodeclaration = True
                 # A class, but no category declaration. Just break.
                 break
-            if declare.search(line) != None:
+            if declare.match(line) != None:
                 decline = b"\\TestDocClass{%s}{%s}" \
                            % (classname.encode('ascii'), line[1:].strip())
                 testclasses.append(decline)
                 decline = b"\\TestDocClass{%s}{%s}" \
                            % (classname.encode('ascii'), line[1:].strip())
                 testclasses.append(decline)
-            elif category.search(line) != None:
+            elif category.match(line) != None:
                 catline = (b"\\DeclareCategory{%s}{%s}"
                            % (classname.encode('ascii'),
                 catline = (b"\\DeclareCategory{%s}{%s}"
                            % (classname.encode('ascii'),
-                              category.search(line).groups()[0]))
+                              category.match(line).groups()[0]))
                 testclasses.append(catline)
             if catline == b"" or decline == b"":
                 continue
                 testclasses.append(catline)
             if catline == b"" or decline == b"":
                 continue
@@ -1423,7 +1433,7 @@ def checkLatexConfig(check_config, bool_docbook):
         line = latex_out.readline()
         if not line:
             break;
         line = latex_out.readline()
         if not line:
             break;
-        if re.match('^\+', line):
+        if line.startswith('+'):
             logger.info(line.strip())
     # if the command succeeds, None will be returned
     ret = latex_out.close()
             logger.info(line.strip())
     # if the command succeeds, None will be returned
     ret = latex_out.close()
@@ -1459,8 +1469,8 @@ def checkModulesConfig():
   removeFiles(['lyxmodules.lst', 'chkmodules.tex'])
 
   logger.info('+checking list of modules... ')
   removeFiles(['lyxmodules.lst', 'chkmodules.tex'])
 
   logger.info('+checking list of modules... ')
-  tx = open('lyxmodules.lst', 'w')
-  tx.write('''## This file declares modules and their associated definition files.
+  tx = open('lyxmodules.lst', 'wb')
+  tx.write(b'''## This file declares modules and their associated definition files.
 ## It has been automatically generated by configure
 ## Use "Options/Reconfigure" if you need to update it after a
 ## configuration change.
 ## It has been automatically generated by configure
 ## Use "Options/Reconfigure" if you need to update it after a
 ## configuration change.
@@ -1484,8 +1494,8 @@ def checkModulesConfig():
           continue
 
       seen.append(filename)
           continue
 
       seen.append(filename)
-      retval = processModuleFile(file, filename, bool_docbook)
-      if retval != "":
+      retval = processModuleFile(file, filename.encode('ascii'), bool_docbook)
+      if retval != b"":
           tx.write(retval)
   tx.close()
   logger.info('\tdone')
           tx.write(retval)
   tx.close()
   logger.info('\tdone')
@@ -1506,80 +1516,80 @@ def processModuleFile(file, filename, bool_docbook):
         We expect output:
           "ModuleName" "filename" "Description" "Packages" "Requires" "Excludes" "Category"
     '''
         We expect output:
           "ModuleName" "filename" "Description" "Packages" "Requires" "Excludes" "Category"
     '''
-    remods = re.compile(r'\DeclareLyXModule\s*(?:\[([^]]*?)\])?{(.*)}')
-    rereqs = re.compile(r'#+\s*Requires: (.*)')
-    reexcs = re.compile(r'#+\s*Excludes: (.*)')
-    recaty = re.compile(r'#+\s*Category: (.*)')
-    redbeg = re.compile(r'#+\s*DescriptionBegin\s*$')
-    redend = re.compile(r'#+\s*DescriptionEnd\s*$')
-
-    modname = desc = pkgs = req = excl = catgy = ""
+    remods = re.compile(b'\s*#\s*\\\\DeclareLyXModule\s*(?:\[([^]]*?)\])?{(.*)}')
+    rereqs = re.compile(b'\s*#+\s*Requires: (.*)')
+    reexcs = re.compile(b'\s*#+\s*Excludes: (.*)')
+    recaty = re.compile(b'\s*#+\s*Category: (.*)')
+    redbeg = re.compile(b'\s*#+\s*DescriptionBegin\s*$')
+    redend = re.compile(b'\s*#+\s*DescriptionEnd\s*$')
+
+    modname = desc = pkgs = req = excl = catgy = b""
     readingDescription = False
     descLines = []
 
     readingDescription = False
     descLines = []
 
-    for line in open(file).readlines():
+    for line in open(file, 'rb').readlines():
       if readingDescription:
       if readingDescription:
-        res = redend.search(line)
+        res = redend.match(line)
         if res != None:
           readingDescription = False
         if res != None:
           readingDescription = False
-          desc = " ".join(descLines)
+          desc = b" ".join(descLines)
           # Escape quotes.
           # Escape quotes.
-          desc = desc.replace('"', '\\"')
+          desc = desc.replace(b'"', b'\\"')
           continue
         descLines.append(line[1:].strip())
         continue
           continue
         descLines.append(line[1:].strip())
         continue
-      res = redbeg.search(line)
+      res = redbeg.match(line)
       if res != None:
         readingDescription = True
         continue
       if res != None:
         readingDescription = True
         continue
-      res = remods.search(line)
+      res = remods.match(line)
       if res != None:
           (pkgs, modname) = res.groups()
           if pkgs == None:
       if res != None:
           (pkgs, modname) = res.groups()
           if pkgs == None:
-            pkgs = ""
+            pkgs = b""
           else:
           else:
-            tmp = [s.strip() for s in pkgs.split(",")]
-            pkgs = ",".join(tmp)
+            tmp = [s.strip() for s in pkgs.split(b",")]
+            pkgs = b",".join(tmp)
           continue
           continue
-      res = rereqs.search(line)
+      res = rereqs.match(line)
       if res != None:
         req = res.group(1)
       if res != None:
         req = res.group(1)
-        tmp = [s.strip() for s in req.split("|")]
-        req = "|".join(tmp)
+        tmp = [s.strip() for s in req.split(b"|")]
+        req = b"|".join(tmp)
         continue
         continue
-      res = reexcs.search(line)
+      res = reexcs.match(line)
       if res != None:
         excl = res.group(1)
       if res != None:
         excl = res.group(1)
-        tmp = [s.strip() for s in excl.split("|")]
-        excl = "|".join(tmp)
+        tmp = [s.strip() for s in excl.split(b"|")]
+        excl = b"|".join(tmp)
         continue
         continue
-      res = recaty.search(line)
+      res = recaty.match(line)
       if res != None:
         catgy = res.group(1)
         continue
 
       if res != None:
         catgy = res.group(1)
         continue
 
-    if modname == "":
+    if modname == b"":
       logger.warning("Module file without \DeclareLyXModule line. ")
       logger.warning("Module file without \DeclareLyXModule line. ")
-      return ""
+      return b""
 
 
-    if pkgs != "":
+    if pkgs != b"":
         # this module has some latex dependencies:
         # append the dependencies to chkmodules.tex,
         # which is \input'ed by chkconfig.ltx
         testpackages = list()
         # this module has some latex dependencies:
         # append the dependencies to chkmodules.tex,
         # which is \input'ed by chkconfig.ltx
         testpackages = list()
-        for pkg in pkgs.split(","):
-            if "->" in pkg:
+        for pkg in pkgs.split(b","):
+            if b"->" in pkg:
                 # this is a converter dependency: skip
                 continue
                 # this is a converter dependency: skip
                 continue
-            if pkg.endswith(".sty"):
+            if pkg.endswith(b".sty"):
                 pkg = pkg[:-4]
                 pkg = pkg[:-4]
-            testpackages.append("\\TestPackage{%s}" % (pkg,))
+            testpackages.append("\\TestPackage{%s}" % (pkg.decode('ascii'),))
         cm = open('chkmodules.tex', 'a')
         for line in testpackages:
             cm.write(line + '\n')
         cm.close()
 
         cm = open('chkmodules.tex', 'a')
         for line in testpackages:
             cm.write(line + '\n')
         cm.close()
 
-    return ('"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n'
+    return (b'"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n'
             % (modname, filename, desc, pkgs, req, excl, catgy))
 
 
             % (modname, filename, desc, pkgs, req, excl, catgy))
 
 
@@ -1587,8 +1597,8 @@ def checkCiteEnginesConfig():
   removeFiles(['lyxciteengines.lst', 'chkciteengines.tex'])
 
   logger.info('+checking list of cite engines... ')
   removeFiles(['lyxciteengines.lst', 'chkciteengines.tex'])
 
   logger.info('+checking list of cite engines... ')
-  tx = open('lyxciteengines.lst', 'w')
-  tx.write('''## This file declares cite engines and their associated definition files.
+  tx = open('lyxciteengines.lst', 'wb')
+  tx.write(b'''## This file declares cite engines and their associated definition files.
 ## It has been automatically generated by configure
 ## Use "Options/Reconfigure" if you need to update it after a
 ## configuration change.
 ## It has been automatically generated by configure
 ## Use "Options/Reconfigure" if you need to update it after a
 ## configuration change.
@@ -1612,8 +1622,8 @@ def checkCiteEnginesConfig():
           continue
 
       seen.append(filename)
           continue
 
       seen.append(filename)
-      retval = processCiteEngineFile(file, filename, bool_docbook)
-      if retval != "":
+      retval = processCiteEngineFile(file, filename.encode('ascii'), bool_docbook)
+      if retval != b"":
           tx.write(retval)
   tx.close()
   logger.info('\tdone')
           tx.write(retval)
   tx.close()
   logger.info('\tdone')
@@ -1630,76 +1640,76 @@ def processCiteEngineFile(file, filename, bool_docbook):
         We expect output:
           "CiteEngineName" "filename" "CiteEngineType" "CiteFramework" "DefaultBiblio" "Description" "Packages"
     '''
         We expect output:
           "CiteEngineName" "filename" "CiteEngineType" "CiteFramework" "DefaultBiblio" "Description" "Packages"
     '''
-    remods = re.compile(r'\DeclareLyXCiteEngine\s*(?:\[([^]]*?)\])?{(.*)}')
-    redbeg = re.compile(r'#+\s*DescriptionBegin\s*$')
-    redend = re.compile(r'#+\s*DescriptionEnd\s*$')
-    recet = re.compile(r'\s*CiteEngineType\s*(.*)')
-    redb = re.compile(r'\s*DefaultBiblio\s*(.*)')
-    resfm = re.compile(r'\s*CiteFramework\s*(.*)')
+    remods = re.compile(b'\s*#\s*\\\\DeclareLyXCiteEngine\s*(?:\[([^]]*?)\])?{(.*)}')
+    redbeg = re.compile(b'\s*#+\s*DescriptionBegin\s*$')
+    redend = re.compile(b'\s*#+\s*DescriptionEnd\s*$')
+    recet = re.compile(b'\s*CiteEngineType\s*(.*)')
+    redb = re.compile(b'\s*DefaultBiblio\s*(.*)')
+    resfm = re.compile(b'\s*CiteFramework\s*(.*)')
 
     modname = desc = pkgs = cet = db = cfm = ""
     readingDescription = False
     descLines = []
 
 
     modname = desc = pkgs = cet = db = cfm = ""
     readingDescription = False
     descLines = []
 
-    for line in open(file).readlines():
+    for line in open(file, 'rb').readlines():
       if readingDescription:
       if readingDescription:
-        res = redend.search(line)
+        res = redend.match(line)
         if res != None:
           readingDescription = False
         if res != None:
           readingDescription = False
-          desc = " ".join(descLines)
+          desc = b" ".join(descLines)
           # Escape quotes.
           # Escape quotes.
-          desc = desc.replace('"', '\\"')
+          desc = desc.replace(b'"', b'\\"')
           continue
         descLines.append(line[1:].strip())
         continue
           continue
         descLines.append(line[1:].strip())
         continue
-      res = redbeg.search(line)
+      res = redbeg.match(line)
       if res != None:
         readingDescription = True
         continue
       if res != None:
         readingDescription = True
         continue
-      res = remods.search(line)
+      res = remods.match(line)
       if res != None:
           (pkgs, modname) = res.groups()
           if pkgs == None:
       if res != None:
           (pkgs, modname) = res.groups()
           if pkgs == None:
-            pkgs = ""
+            pkgs = b""
           else:
           else:
-            tmp = [s.strip() for s in pkgs.split(",")]
-            pkgs = ",".join(tmp)
+            tmp = [s.strip() for s in pkgs.split(b",")]
+            pkgs = b",".join(tmp)
           continue
           continue
-      res = recet.search(line)
+      res = recet.match(line)
       if res != None:
         cet = res.group(1)
         continue
       if res != None:
         cet = res.group(1)
         continue
-      res = redb.search(line)
+      res = redb.match(line)
       if res != None:
         db = res.group(1)
         continue
       if res != None:
         db = res.group(1)
         continue
-      res = resfm.search(line)
+      res = resfm.match(line)
       if res != None:
         cfm = res.group(1)
         continue
 
       if res != None:
         cfm = res.group(1)
         continue
 
-    if modname == "":
+    if modname == b"":
       logger.warning("Cite Engine File file without \DeclareLyXCiteEngine line. ")
       logger.warning("Cite Engine File file without \DeclareLyXCiteEngine line. ")
-      return ""
+      return b""
 
 
-    if pkgs != "":
+    if pkgs != b"":
         # this cite engine has some latex dependencies:
         # append the dependencies to chkciteengines.tex,
         # which is \input'ed by chkconfig.ltx
         testpackages = list()
         # this cite engine has some latex dependencies:
         # append the dependencies to chkciteengines.tex,
         # which is \input'ed by chkconfig.ltx
         testpackages = list()
-        for pkg in pkgs.split(","):
-            if "->" in pkg:
+        for pkg in pkgs.split(b","):
+            if b"->" in pkg:
                 # this is a converter dependency: skip
                 continue
                 # this is a converter dependency: skip
                 continue
-            if pkg.endswith(".sty"):
+            if pkg.endswith(b".sty"):
                 pkg = pkg[:-4]
                 pkg = pkg[:-4]
-            testpackages.append("\\TestPackage{%s}" % (pkg,))
+            testpackages.append("\\TestPackage{%s}" % (pkg.decode('ascii'),))
         cm = open('chkciteengines.tex', 'a')
         for line in testpackages:
             cm.write(line + '\n')
         cm.close()
 
         cm = open('chkciteengines.tex', 'a')
         for line in testpackages:
             cm.write(line + '\n')
         cm.close()
 
-    return '"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename, cet, cfm, db, desc, pkgs)
+    return (b'"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename, cet, cfm, db, desc, pkgs))
 
 
 def checkXTemplates():
 
 
 def checkXTemplates():
@@ -1761,14 +1771,14 @@ def checkTeXAllowSpaces():
 def rescanTeXFiles():
     ''' Run kpsewhich to update information about TeX files '''
     logger.info("+Indexing TeX files... ")
 def rescanTeXFiles():
     ''' Run kpsewhich to update information about TeX files '''
     logger.info("+Indexing TeX files... ")
-    if not os.path.isfile( os.path.join(srcdir, 'scripts', 'TeXFiles.py') ):
+    tfscript = os.path.join(srcdir, 'scripts', 'TeXFiles.py')
+    if not os.path.isfile(tfscript):
         logger.error("configure: error: cannot find TeXFiles.py script")
         sys.exit(1)
     interpreter = sys.executable
     if interpreter == '':
         interpreter = "python"
         logger.error("configure: error: cannot find TeXFiles.py script")
         sys.exit(1)
     interpreter = sys.executable
     if interpreter == '':
         interpreter = "python"
-    tfp = cmdOutput(interpreter + " -tt " + '"'
-                    + os.path.join(srcdir, 'scripts', 'TeXFiles.py') + '"')
+    tfp = cmdOutput('"%s" -tt "%s"' % (interpreter, tfscript))
     logger.info(tfp)
     logger.info("\tdone")
 
     logger.info(tfp)
     logger.info("\tdone")
 
@@ -1785,7 +1795,7 @@ if __name__ == '__main__':
     lyx_check_config = True
     lyx_kpsewhich = True
     outfile = 'lyxrc.defaults'
     lyx_check_config = True
     lyx_kpsewhich = True
     outfile = 'lyxrc.defaults'
-    lyxrc_fileformat = 24
+    lyxrc_fileformat = 25
     rc_entries = ''
     lyx_keep_temps = False
     version_suffix = ''
     rc_entries = ''
     lyx_keep_temps = False
     version_suffix = ''
@@ -1845,7 +1855,17 @@ 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())
+    (inkscape_path, inkscape_gui) = os.path.split(checkInkscape())
+    # On Windows, we need to call the "inkscape.com" wrapper
+    # for command line purposes. Other OSes do not differentiate.
+    inkscape_cl = inkscape_gui
+    if os.name == 'nt':
+        inkscape_cl = inkscape_gui.replace('.exe', '.com')
+    # On MacOSX, Inkscape requires full path file arguments. This
+    # is not needed on Linux and Win and even breaks the latter.
+    inkscape_fileprefix = ""
+    if sys.platform == 'darwin':
+        inkscape_fileprefix = "$$p"
     checkFormatEntries(dtl_tools)
     checkConverterEntries()
     (chk_docbook, bool_docbook, docbook_cmd) = checkDocBook()
     checkFormatEntries(dtl_tools)
     checkConverterEntries()
     (chk_docbook, bool_docbook, docbook_cmd) = checkDocBook()