]> git.lyx.org Git - lyx.git/blobdiff - lib/configure.py
Amend 47f1fec9
[lyx.git] / lib / configure.py
index 4f4977c08b761ccc3eb2622abb0747b2ff75e1e6..68bdc09d3b95187ab9717ab007627ae9b42c380e 100644 (file)
@@ -275,7 +275,7 @@ def checkProg(description, progs, rc_entry=None, path=None, not_found =''):
                      "for each prog and not_found.")
         sys.exit(2)
     logger.info('checking for ' + description + '...')
-    ## print '(' + ','.join(progs) + ')',
+    logger.debug('(' + ','.join(progs) + ')')
     additional_path = path
     path = os.environ["PATH"].split(os.pathsep) + additional_path
     extlist = ['']
@@ -318,13 +318,45 @@ def checkProg(description, progs, rc_entry=None, path=None, not_found =''):
                         addToRC(rc_entry[idx].replace('%%', ac_prog))
                     return [ac_dir, ac_word]
         # if not successful
-        logger.info(msg + ' no')
+        logger.info(msg + ' not in path')
     # write rc entries for 'not found'
     if len(rc_entry) > 0:  # the last one.
         addToRC(rc_entry[-1].replace('%%', not_found))
     return ['', not_found]
 
 
+def check_java():
+    """ Check for Java, don't give up as often as checkProg, using platform-dependent techniques """
+    if os.name == 'nt':
+        # Check in the registry.
+        try:  # Python 3.
+            import winreg
+        except ImportError:  # Python 2.
+            import _winreg as winreg
+
+        potential_keys_64b = ["SOFTWARE\\JavaSoft\\Java Runtime Environment", "SOFTWARE\\JavaSoft\\Java Development Kit",
+                              "SOFTWARE\\JavaSoft\\JDK", "SOFTWARE\\JavaSoft\\JRE"]
+        potential_keys_32b = [k.replace('SOFTWARE', 'SOFTWARE\\WOW6432Node') for k in potential_keys_64b]
+        potential_keys = potential_keys_64b + potential_keys_32b
+
+        reg_hive = winreg.HKEY_LOCAL_MACHINE
+        for key in potential_keys:
+            try:
+                with winreg.OpenKey(reg_hive, key) as reg_key:
+                    version = winreg.QueryValueEx(reg_key, "CurrentVersion")[0]
+                with winreg.OpenKey(reg_hive, key + '\\' + version) as reg_key:
+                    java_bin = winreg.QueryValueEx(reg_key, "JavaHome")[0] + '\\bin\\java.exe'
+                    logger.info('+checking for java: found in Windows registry, ' + str(java_bin))
+                    return java_bin
+            except OSError:
+                pass
+
+        # The test failed, no Java found.
+        return ''
+    else:
+        return ''
+
+
 def checkProgAlternatives(description, progs, rc_entry=None,
                           alt_rc_entry=None, path=None, not_found=''):
     '''
@@ -343,7 +375,7 @@ def checkProgAlternatives(description, progs, rc_entry=None,
         logger.error("rc entry should have one item or item for each prog and not_found.")
         sys.exit(2)
     logger.info('checking for ' + description + '...')
-    ## print '(' + ','.join(progs) + ')',
+    logger.debug('(' + ','.join(progs) + ')')
     additional_path = path
     path = os.environ["PATH"].split(os.pathsep) + additional_path
     extlist = ['']
@@ -413,7 +445,7 @@ def checkProgAlternatives(description, progs, rc_entry=None,
                     break
             if found_alt:
                 break
-        if found_alt == False:
+        if not found_alt:
             # if not successful
             logger.info(msg + ' no')
     if found_prime:
@@ -721,6 +753,7 @@ def checkFormatEntries(dtl_tools):
 \Format docbook5   xml    "DocBook 5"             "" ""        "%%"    "document,menu=export"  "application/docbook+xml"
 \Format dot        dot    "Graphviz Dot"          "" ""        "%%"    "vector"        "text/vnd.graphviz"
 \Format dviluatex  tex    "LaTeX (dviluatex)"     "" "" "%%"   "document,menu=export"  ""
+\Format epub       epub    ePub                   "" "" "%%"    "document,menu=export"  "application/epub+zip"
 \Format platex     tex    "LaTeX (pLaTeX)"        "" "" "%%"   "document,menu=export"  ""
 \Format literate   nw      NoWeb                  N  ""        "%%"    "document,menu=export"  ""
 \Format sweave     Rnw    "Sweave"                S  "" "%%"   "document,menu=export"  ""
@@ -970,8 +1003,21 @@ def checkConverterEntries():
     checkProg('an Open Document (Pandoc) -> LaTeX converter', ['pandoc -s -f odt -o $$o -t latex $$i'],
         rc_entry = [ r'\converter odt3        latex      "%%"  ""' ])
     #
-    checkProg('DocBook converter -> PDF (docbook)', ['pandoc -f docbook -t latex --latex-engine=lualatex --toc -o $$o $$i'],
-        rc_entry = [ r'\converter docbook5      pdf9      "%%" ""' ])
+    checkProg('DocBook converter -> PDF (docbook)',
+              ['pandoc -f docbook -t latex --pdf-engine=lualatex --toc -o $$o $$i',  # Since Pandoc 2.0
+               'pandoc -f docbook -t latex --latex-engine=lualatex --toc -o $$o $$i'],  # Up to Pandoc 1.19
+              rc_entry = [ r'\converter docbook5      pdf9      "%%"   ""' ])
+    #
+    xpath, xslt_sheet = checkProg('XSLT stylesheets for ePub', ['chunk.xsl'], '', ['/usr/share/xml/docbook/stylesheet/docbook-xsl-ns/epub3'])
+    if xslt_sheet == 'chunk.xsl':
+        xpath = '/usr/share/xml/docbook/stylesheet/docbook-xsl-ns'
+    else:
+        xpath = 'none'
+    global java
+    if xsltproc != '':
+        addToRC(r'\converter docbook5 epub "python $$s/scripts/docbook2epub.py none none \"' + xsltproc + r'\" ' + xpath + ' $$i $$r $$o" ""')
+    elif java != '':
+        addToRC(r'\converter docbook5 epub "python $$s/scripts/docbook2epub.py \"' + java + r'\" none none ' + xpath + ' $$i $$r $$o" ""')
     #
     checkProg('a MS Word Office Open XML converter -> LaTeX', ['pandoc -s -f docx -o $$o -t latex $$i'],
         rc_entry = [ r'\converter word2      latex      "%%"   ""' ])
@@ -1244,30 +1290,49 @@ def checkConverterEntries():
             logger.info('+  found LilyPond, but could not extract version number.')
     #
     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)
-        if match:
-            version_number = match.groups()[0]
-            version = version_number.split('.')
-            if int(version[0]) > 2 or (len(version) > 1 and int(version[0]) == 2 and int(version[1]) >= 13):
-                # Note: The --lily-output-dir flag is required because lilypond-book
-                #       does not process input again unless the input has changed,
-                #       even if the output format being requested is different. So
-                #       once a .eps file exists, lilypond-book won't create a .pdf
-                #       even when requested with --pdf. This is a problem if a user
-                #       clicks View PDF after having done a View DVI. To circumvent
-                #       this, use different output folders for eps and pdf outputs.
-                addToRC(r'\converter lilypond-book latex    "lilypond-book --safe --lily-output-dir=ly-eps $$i"                                ""')
-                addToRC(r'\converter lilypond-book pdflatex "lilypond-book --safe --pdf --latex-program=pdflatex --lily-output-dir=ly-pdf $$i" ""')
-                addToRC(r'\converter lilypond-book-ja platex "lilypond-book --safe --pdf --latex-program=platex --lily-output-dir=ly-pdf $$i" ""')
-                addToRC(r'\converter lilypond-book xetex    "lilypond-book --safe --pdf --latex-program=xelatex --lily-output-dir=ly-pdf $$i"  ""')
-                addToRC(r'\converter lilypond-book luatex   "lilypond-book --safe --pdf --latex-program=lualatex --lily-output-dir=ly-pdf $$i" ""')
-                addToRC(r'\converter lilypond-book dviluatex "lilypond-book --safe --latex-program=dvilualatex --lily-output-dir=ly-eps $$i" ""')
-                logger.info('+  found LilyPond-book version %s.' % version_number)
-            else:
-                logger.info('+  found LilyPond-book, but version %s is too old.' % version_number)
-        else:
+    if lilypond_book:
+        found_lilypond_book = False
+        # On Windows, the file lilypond-book is not directly callable, it must be passed as argument to python.
+        for cmd in ["lilypond-book", "python \"" + path + "/lilypond-book\""]:
+            version_string = cmdOutput(cmd + " --version")
+            if len(version_string) == 0:
+                continue
+            found_lilypond_book = True
+
+            match = re.match('(\S+)$', version_string)
+            if match:
+                version_number = match.groups()[0]
+                version = version_number.split('.')
+                if int(version[0]) > 2 or (len(version) > 1 and int(version[0]) == 2 and int(version[1]) >= 13):
+                    # Note: The --lily-output-dir flag is required because lilypond-book
+                    #       does not process input again unless the input has changed,
+                    #       even if the output format being requested is different. So
+                    #       once a .eps file exists, lilypond-book won't create a .pdf
+                    #       even when requested with --pdf. This is a problem if a user
+                    #       clicks View PDF after having done a View DVI. To circumvent
+                    #       this, use different output folders for eps and pdf outputs.
+                    cmd = cmd.replace('"', r'\"')
+                    addToRC(r'\converter lilypond-book latex     "' + cmd + ' --safe --lily-output-dir=ly-eps $$i"                                ""')
+                    addToRC(r'\converter lilypond-book pdflatex  "' + cmd + ' --safe --pdf --latex-program=pdflatex --lily-output-dir=ly-pdf $$i" ""')
+                    addToRC(r'\converter lilypond-book-ja platex "' + cmd + ' --safe --pdf --latex-program=platex --lily-output-dir=ly-pdf $$i" ""')
+                    addToRC(r'\converter lilypond-book xetex     "' + cmd + ' --safe --pdf --latex-program=xelatex --lily-output-dir=ly-pdf $$i"  ""')
+                    addToRC(r'\converter lilypond-book luatex    "' + cmd + ' --safe --pdf --latex-program=lualatex --lily-output-dir=ly-pdf $$i" ""')
+                    addToRC(r'\converter lilypond-book dviluatex "' + cmd + ' --safe --latex-program=dvilualatex --lily-output-dir=ly-eps $$i" ""')
+
+                    # Also create the entry to apply LilyPond on DocBook files. However,
+                    # command must be passed as argument, and it might already have
+                    # quoted parts. LyX doesn't yet handle double-quoting of commands.
+                    # Hence, pass as argument either cmd (if it's a simple command) or
+                    # the Python file that should be called (typical on Windows).
+                    docbook_lilypond_cmd = cmd
+                    if "python" in docbook_lilypond_cmd:
+                        docbook_lilypond_cmd = '"' + path + '/lilypond-book"'
+                    addToRC(r'\copier docbook5 "python $$s/scripts/docbook_copy.py ' + docbook_lilypond_cmd.replace('"', r'\"') + r' $$i $$o"')
+
+                    logger.info('+  found LilyPond-book version %s.' % version_number)
+                else:
+                    logger.info('+  found LilyPond-book, but version %s is too old.' % version_number)
+        if not found_lilypond_book:
             logger.info('+  found LilyPond-book, but could not extract version number.')
     #
     checkProg('a Noteedit -> LilyPond converter', ['noteedit --export-lilypond $$i'],
@@ -1900,7 +1965,7 @@ if __name__ == '__main__':
     lyx_check_config = True
     lyx_kpsewhich = True
     outfile = 'lyxrc.defaults'
-    lyxrc_fileformat = 34
+    lyxrc_fileformat = 36
     rc_entries = ''
     lyx_keep_temps = False
     version_suffix = ''
@@ -1960,7 +2025,10 @@ Format %i
     LATEX = checkLatex(dtl_tools)
     # check java and perl before any checkProg that may require them
     java = checkProg('a java interpreter', ['java'])[1]
+    if java == '':
+        java = check_java()
     perl = checkProg('a perl interpreter', ['perl'])[1]
+    xsltproc = checkProg('xsltproc', ['xsltproc'])[1]
     (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.