commit f8bfc8405ef3216e76e27c30755aa89af16b9554
Author: Enrico Forestieri <[email protected]>
Date:   Mon Nov 2 23:46:14 2015 +0100

    Fix bug #7657: Detect inkscape from the configure script
    
    On Windows, if inkscape is not found in the PATH, search for it
    in the registry and store its full path in lyxrc.defaults.

diff --git a/lib/configure.py b/lib/configure.py
index 0096a91..32fd278 100644
--- a/lib/configure.py
+++ b/lib/configure.py
@@ -229,7 +229,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.
 
-        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
@@ -278,6 +278,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)))
+                    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))
@@ -337,6 +339,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)))
+                    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:
@@ -468,6 +472,23 @@ def checkDTLtools():
         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'
+    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 '''
@@ -583,8 +604,9 @@ def checkFormatEntries(dtl_tools):
     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, svgz" SVG                "" 
"%%" "%%"   "vector,zipped=native"  "image/svg+xml"'],
+        path = [inkscape_path])
     #
     imageformats = r'''\Format bmp        bmp     BMP                    "" 
"%s"       "%s"    ""      "image/x-bmp"
 \Format gif        gif     GIF                    "" "%s"      "%s"    ""      
"image/gif"
@@ -972,14 +994,17 @@ def checkConverterEntries():
     checkProg('an OpenDocument -> EPS converter', ['libreoffice -headless 
-nologo -convert-to eps $$i', 'unoconv -f eps --stdout $$i > $$o'],
         rc_entry = [ r'\converter odg        eps2       "%%"   ""'])
     # 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       "%%"   ""'])
+    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       "%%"    ""'],
+        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        "%%"    ""'],
+        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        "%%"    ""'],
+        path = ['', inkscape_path])
 
     #
     # gnumeric/xls/ods to tex
@@ -1564,6 +1589,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]
+    (inkscape_path, inkscape_name) = os.path.split(checkInkscape())
     checkFormatEntries(dtl_tools)
     checkConverterEntries()
     (chk_docbook, bool_docbook, docbook_cmd) = checkDocBook()
diff --git a/src/LyXRC.cpp b/src/LyXRC.cpp
index 4fb1b02..e18a9d6 100644
--- a/src/LyXRC.cpp
+++ b/src/LyXRC.cpp
@@ -1055,16 +1055,18 @@ LyXRC::ReturnValues LyXRC::read(Lexer & lexrc, bool 
check_format)
                }
                case RC_VIEWER_ALTERNATIVES:  {
                        string format, command;
-                       lexrc >> format;
-                       lexrc >> command;
-                       viewer_alternatives[format].insert(command);
+                       if ((lexrc >> format) && lexrc.next(true)) {
+                               command  = lexrc.getString();
+                               viewer_alternatives[format].insert(command);
+                       }
                        break;
                }
                case RC_EDITOR_ALTERNATIVES:  {
                        string format, command;
-                       lexrc >> format;
-                       lexrc >> command;
-                       editor_alternatives[format].insert(command);
+                       if ((lexrc >> format) && lexrc.next(true)) {
+                               command  = lexrc.getString();
+                               editor_alternatives[format].insert(command);
+                       }
                        break;
                }
 

Reply via email to