From f8bfc8405ef3216e76e27c30755aa89af16b9554 Mon Sep 17 00:00:00 2001 From: Enrico Forestieri Date: Mon, 2 Nov 2015 23:46:14 +0100 Subject: [PATCH] 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. --- lib/configure.py | 44 +++++++++++++++++++++++++++++++++++--------- src/LyXRC.cpp | 14 ++++++++------ 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/lib/configure.py b/lib/configure.py index 0096a9151e..32fd278a02 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 4fb1b027c0..e18a9d6f62 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; }