X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Fconfigure.py;h=f0efb0fe668d1cccbee5ccbcc9251730ad41777f;hb=refs%2Fheads%2F2.3.1-1;hp=3b88041d3c96713c2c29fa1f1624e6c38fb0d72c;hpb=52978f94d28a8f5f731e4c394b225f1a2927d3a6;p=lyx.git diff --git a/lib/configure.py b/lib/configure.py index 3b88041d3c..f0efb0fe66 100644 --- a/lib/configure.py +++ b/lib/configure.py @@ -8,6 +8,7 @@ # \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 @@ -24,6 +25,13 @@ console.setFormatter(formatter) logger = logging.getLogger('LyX') logger.addHandler(console) +def quoteIfSpace(name): + " utility function: quote name if it contains spaces " + if ' ' in name: + return '"' + name + '"' + else: + return name + def writeToFile(filename, lines, append = False): " utility function: write or append lines to filename " if append: @@ -56,22 +64,25 @@ def removeFiles(filenames): pass -def cmdOutput(cmd, async = False): +def cmdOutput(cmd, asynchronous = False): '''utility function: run a command and get its output as a string cmd: command to run - async: if False, return whole output as a string, otherwise + asynchronous: if False, return whole output as a string, otherwise return the stdout handle from which the output can be read (the caller is then responsible for closing it) ''' 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, \ + pipe = subprocess.Popen(cmd, shell=b, close_fds=b, stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True) pipe.stdin.close() - if async: + if asynchronous: return pipe.stdout output = pipe.stdout.read() pipe.stdout.close() @@ -106,30 +117,29 @@ def setEnviron(): def copy_tree(src, dst, preserve_symlinks=False, level=0): ''' Copy an entire directory tree 'src' to a new location 'dst'. - + Code inspired from distutils.copy_tree. - Copying ignores non-regular files and the cache directory. + Copying ignores non-regular files and the cache directory. Pipes may be present as leftovers from LyX for lyx-server. If 'preserve_symlinks' is true, symlinks will be copied as symlinks (on platforms that support them!); otherwise (the default), the destination of the symlink will be copied. ''' - + 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) - 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) - + outputs = [] - + for name in names: src_name = os.path.join(src, name) dst_name = os.path.join(dst, name) @@ -147,7 +157,7 @@ def copy_tree(src, dst, preserve_symlinks=False, level=0): outputs.append(dst_name) else: logger.info("Ignore non-regular file %s", src_name) - + return outputs @@ -160,20 +170,20 @@ def checkUpgrade(): logger.info('Checking for upgrade from previous version.') parent = os.path.dirname(cwd) appname = basename[:(-len(version_suffix))] - for version in ['-2.1', '-2.0', '-1.6' ]: + for version in ['-2.2', '-2.1', '-2.0', '-1.6' ]: logger.debug('Checking for upgrade from previous version ' + version) previous = os.path.join(parent, appname + version) logger.debug('previous = ' + previous) if os.path.isdir( previous ): logger.info('Found directory "%s".', previous) copy_tree( previous, cwd, True ) - logger.info('Content copied to directory "%s".', cwd) + logger.info('Content copied from directory "%s".', previous) return def createDirectories(): ''' Create the build directories if necessary ''' - for dir in ['bind', 'clipart', 'doc', 'examples', 'images', 'kbd', \ + for dir in ['bind', 'clipart', 'doc', 'examples', 'images', 'kbd', 'layouts', 'scripts', 'templates', 'ui' ]: if not os.path.isdir( dir ): try: @@ -193,20 +203,22 @@ def checkTeXPaths(): from tempfile import mkstemp fd, tmpfname = mkstemp(suffix='.ltx') if os.name == 'nt': - from locale import getdefaultlocale - language, encoding = getdefaultlocale() - if encoding == None: - encoding = 'latin1' - inpname = shortPath(unicode(tmpfname, encoding)).replace('\\', '/') + encoding = sys.getfilesystemencoding() + if sys.version_info[0] < 3: + inpname = shortPath(unicode(tmpfname, encoding)).replace('\\', '/') + else: + inpname = shortPath(tmpfname).replace('\\', '/') else: inpname = cmdOutput('cygpath -m ' + tmpfname) logname = os.path.basename(re.sub("(?i).ltx", ".log", inpname)) inpname = inpname.replace('~', '\\string~') - os.write(fd, r'\relax') + os.write(fd, b'\\relax') os.close(fd) - latex_out = cmdOutput(r'latex "\nonstopmode\input{%s}\makeatletter\@@end"' % inpname) + latex_out = cmdOutput(r'latex "\nonstopmode\input{%s}\makeatletter\@@end"' + % inpname) if 'Error' in latex_out: - latex_out = cmdOutput(r'latex "\nonstopmode\input{\"%s\"}\makeatletter\@@end"' % inpname) + latex_out = cmdOutput(r'latex "\nonstopmode\input{\"%s\"}\makeatletter\@@end"' + % inpname) if 'Error' in latex_out: logger.warning("configure: TeX engine needs posix-style paths in latex files") windows_style_tex_paths = 'false' @@ -246,7 +258,8 @@ def checkProg(description, progs, rc_entry = [], path = [], not_found = ''): ''' # one rc entry for each progs plus not_found entry if len(rc_entry) > 1 and len(rc_entry) != len(progs) + 1: - logger.error("rc entry should have one item or item for each prog and not_found.") + 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) + ')', @@ -256,10 +269,11 @@ def checkProg(description, progs, rc_entry = [], path = [], not_found = ''): if "PATHEXT" in os.environ: extlist = extlist + os.environ["PATHEXT"].split(os.pathsep) global java, perl + unquoted_space = re.compile(r'''((?:[^ "']|"[^"]*"|'[^']*')+)''') for idx in range(len(progs)): # ac_prog may have options, ac_word is the command name - ac_prog = progs[idx] - ac_word = ac_prog.split(' ')[0] + ac_prog = progs[idx].replace('"', '\\"') + ac_word = unquoted_space.split(progs[idx])[1::2][0].strip('"') if (ac_word.endswith('.class') or ac_word.endswith('.jar')) and java == '': continue if ac_word.endswith('.pl') and perl == '': @@ -273,13 +287,17 @@ def checkProg(description, progs, rc_entry = [], path = [], not_found = ''): logger.info(msg + ' yes') # deal with java and perl if ac_word.endswith('.class'): - ac_prog = ac_prog.replace(ac_word, r'%s \"%s\"' % (java, os.path.join(ac_dir, ac_word[:-6]))) + ac_prog = ac_prog.replace(ac_word, r'%s \"%s\"' + % (java, os.path.join(ac_dir, ac_word[:-6]))) elif ac_word.endswith('.jar'): - ac_prog = ac_prog.replace(ac_word, r'%s -jar \"%s\"' % (java, 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))) + 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))) + 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)) @@ -294,7 +312,8 @@ def checkProg(description, progs, rc_entry = [], path = [], not_found = ''): return ['', not_found] -def checkProgAlternatives(description, progs, rc_entry = [], alt_rc_entry = [], path = [], not_found = ''): +def checkProgAlternatives(description, progs, rc_entry = [], + alt_rc_entry = [], path = [], not_found = ''): ''' The same as checkProg, but additionally, all found programs will be added as alt_rc_entries @@ -334,13 +353,17 @@ def checkProgAlternatives(description, progs, rc_entry = [], alt_rc_entry = [], m = None # deal with java and perl if ac_word.endswith('.class'): - ac_prog = ac_prog.replace(ac_word, r'%s \"%s\"' % (java, os.path.join(ac_dir, ac_word[:-6]))) + ac_prog = ac_prog.replace(ac_word, r'%s \"%s\"' + % (java, os.path.join(ac_dir, ac_word[:-6]))) elif ac_word.endswith('.jar'): - ac_prog = ac_prog.replace(ac_word, r'%s -jar \"%s\"' % (java, 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))) + 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))) + 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: @@ -393,7 +416,7 @@ def addAlternatives(rcs, alt_type): 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]) @@ -432,33 +455,38 @@ def listAlternatives(progs, alt_type, rc_entry = []): def checkViewer(description, progs, rc_entry = [], path = []): ''' The same as checkProgAlternatives, but for viewers ''' alt_rc_entry = listAlternatives(progs, 'viewer', rc_entry) - return checkProgAlternatives(description, progs, rc_entry, alt_rc_entry, path, not_found = 'auto') + return checkProgAlternatives(description, progs, rc_entry, + alt_rc_entry, path, not_found = 'auto') def checkEditor(description, progs, rc_entry = [], path = []): ''' The same as checkProgAlternatives, but for editors ''' alt_rc_entry = listAlternatives(progs, 'editor', rc_entry) - return checkProgAlternatives(description, progs, rc_entry, alt_rc_entry, path, not_found = 'auto') + return checkProgAlternatives(description, progs, rc_entry, + alt_rc_entry, path, not_found = 'auto') def checkViewerNoRC(description, progs, rc_entry = [], path = []): ''' The same as checkViewer, but do not add rc entry ''' alt_rc_entry = listAlternatives(progs, 'viewer', rc_entry) rc_entry = [] - return checkProgAlternatives(description, progs, rc_entry, alt_rc_entry, path, not_found = 'auto') + return checkProgAlternatives(description, progs, rc_entry, + alt_rc_entry, path, not_found = 'auto') def checkEditorNoRC(description, progs, rc_entry = [], path = []): ''' The same as checkViewer, but do not add rc entry ''' alt_rc_entry = listAlternatives(progs, 'editor', rc_entry) rc_entry = [] - return checkProgAlternatives(description, progs, rc_entry, alt_rc_entry, path, not_found = 'auto') + return checkProgAlternatives(description, progs, rc_entry, + alt_rc_entry, path, not_found = 'auto') def checkViewerEditor(description, progs, rc_entry = [], path = []): ''' The same as checkProgAlternatives, but for viewers and editors ''' alt_rc_entry = listAlternatives(progs, ['editor', 'viewer'], rc_entry) - return checkProgAlternatives(description, progs, rc_entry, alt_rc_entry, path, not_found = 'auto') + return checkProgAlternatives(description, progs, rc_entry, + alt_rc_entry, path, not_found = 'auto') def checkDTLtools(): @@ -474,19 +502,31 @@ def checkDTLtools(): def checkInkscape(): ''' Check whether Inkscape is available and return the full path (Windows only) ''' - if os.name != 'nt': + ''' On Mac OS (darwin) a wrapper is used - therefore the version is checked ''' + ''' 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: + return 'inkscape' + else: + return 'inkscape-binary' + elif os.name != 'nt': return 'inkscape' - import _winreg - aReg = _winreg.ConnectRegistry(None, _winreg.HKEY_CLASSES_ROOT) + 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', '') + aKey = winreg.OpenKey(aReg, r"inkscape.svg\DefaultIcon") + val = winreg.QueryValueEx(aKey, "") + return str(val[0]).split('"')[1] 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', '') + aKey = winreg.OpenKey(aReg, r"Applications\inkscape.exe\shell\open\command") + val = winreg.QueryValueEx(aKey, "") + return str(val[0]).split('"')[1] except EnvironmentError: return 'inkscape' @@ -539,37 +579,13 @@ def checkLatex(dtl_tools): 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 != '': - # 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): @@ -604,8 +620,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_name], - rc_entry = [r'\Format svg "svg, svgz" SVG "" "%%" "%%" "vector,zipped=native" "image/svg+xml"'], + 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]) # imageformats = r'''\Format bmp bmp BMP "" "%s" "%s" "" "image/x-bmp" @@ -618,17 +635,19 @@ def checkFormatEntries(dtl_tools): \Format tiff tif TIFF "" "%s" "%s" "" "image/tiff" \Format xbm xbm XBM "" "%s" "%s" "" "image/x-xbitmap" \Format xpm xpm XPM "" "%s" "%s" "" "image/x-xpixmap"''' - path, iv = checkViewerNoRC('a raster image viewer', ['xv', 'kview', 'gimp-remote', 'gimp'], rc_entry = [imageformats]) - path, ie = checkEditorNoRC('a raster image editor', ['gimp-remote', 'gimp'], rc_entry = [imageformats]) - addToRC(imageformats % \ - (iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie, iv, ie) ) + path, iv = checkViewerNoRC('a raster image viewer', + ['xv', 'gwenview', 'kview', + 'eog', 'xviewer', 'ristretto', 'gpicview', 'lximage-qt', + 'xdg-open', 'gimp-remote', 'gimp'], + rc_entry = [imageformats]) + path, ie = checkEditorNoRC('a raster image editor', + ['gimp-remote', 'gimp'], rc_entry = [imageformats]) + addToRC(imageformats % ((iv, ie)*10)) # - checkViewerEditor('a text editor', ['xemacs', 'gvim', 'kedit', 'kwrite', 'kate', \ - 'nedit', 'gedit', 'notepad', 'geany', 'leafpad', 'mousepad'], + checkViewerEditor('a text editor', + ['xemacs', 'gvim', 'kedit', 'kwrite', 'kate', + 'nedit', 'gedit', 'geany', 'leafpad', 'mousepad', 'xed', 'notepad'], 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" @@ -636,10 +655,12 @@ def checkFormatEntries(dtl_tools): \Format platex tex "LaTeX (pLaTeX)" "" "" "%%" "document,menu=export" "" \Format literate nw NoWeb N "" "%%" "document,menu=export" "" \Format sweave Rnw "Sweave" S "" "%%" "document,menu=export" "" +\Format sweave-ja Rnw "Sweave (Japanese)" S "" "%%" "document,menu=export" "" \Format r R "R/S code" "" "" "%%" "document,menu=export" "" \Format knitr Rnw "Rnw (knitr)" "" "" "%%" "document,menu=export" "" -\Format lilypond ly "LilyPond music" "" "" "%%" "vector" "text/x-lilypond" +\Format knitr-ja Rnw "Rnw (knitr, Japanese)" "" "" "%%" "document,menu=export" "" \Format lilypond-book lytex "LilyPond book (LaTeX)" "" "" "%%" "document,menu=export" "" +\Format lilypond-book-ja lytex "LilyPond book (pLaTeX)" "" "" "%%" "document,menu=export" "" \Format latex tex "LaTeX (plain)" L "" "%%" "document,menu=export" "text/x-tex" \Format luatex tex "LaTeX (LuaTeX)" "" "" "%%" "document,menu=export" "" \Format pdflatex tex "LaTeX (pdflatex)" "" "" "%%" "document,menu=export" "" @@ -651,34 +672,48 @@ def checkFormatEntries(dtl_tools): \Format text4 txt "Plain text (catdvi)" "" "" "%%" "document" "" \Format textparagraph txt "Plain Text, Join Lines" "" "" "%%" "document" "" \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'], + 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 gnumeric gnumeric "Gnumeric spreadsheet" "" "" "%%" "document" "application/x-gnumeric" \Format excel xls "Excel spreadsheet" "" "" "%%" "document" "application/vnd.ms-excel" +\Format excel2 xlsx "MS Excel Office Open XML" "" "" "%%" "document" "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" +\Format html_table html "HTML Table (for spreadsheets)" "" "" "%%" "document" "text/html" \Format oocalc ods "OpenDocument spreadsheet" "" "" "%%" "document" "application/vnd.oasis.opendocument.spreadsheet"''']) # checkViewer('an HTML previewer', ['firefox', 'mozilla file://$$p$$i', 'netscape'], rc_entry = [r'\Format xhtml xhtml "LyXHTML" y "%%" "" "document,menu=export" "application/xhtml+xml"']) # - checkEditor('a BibTeX editor', ['jabref', 'JabRef', \ - 'pybliographic', 'bibdesk', 'gbib', 'kbib', \ - 'kbibtex', 'sixpack', 'bibedit', 'tkbibtex' \ - 'xemacs', 'gvim', 'kedit', 'kwrite', 'kate', \ - 'jedit', 'TeXnicCenter', 'WinEdt', 'WinShell', 'PSPad', \ + 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'], rc_entry = [r'''\Format bibtex bib "BibTeX" "" "" "%%" "" "text/x-bibtex"''' ]) # #checkProg('a Postscript interpreter', ['gs'], # rc_entry = [ r'\ps_command "%%"' ]) - checkViewer('a Postscript previewer', ['kghostview', 'okular', 'qpdfview --unique', 'evince', 'gv', 'ghostview -swap', 'gsview64', 'gsview32'], + checkViewer('a Postscript previewer', + ['kghostview', 'okular', 'qpdfview --unique', + 'evince', 'xreader', + 'gv', 'ghostview -swap', 'gsview64', 'gsview32'], rc_entry = [r'''\Format eps eps EPS "" "%%" "" "vector" "image/x-eps" \Format eps2 eps "EPS (uncropped)" "" "%%" "" "vector" "" \Format eps3 eps "EPS (cropped)" "" "%%" "" "document" "" \Format ps ps Postscript t "%%" "" "document,vector,menu=export" "application/postscript"''']) # for xdg-open issues look here: http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg151818.html + # maybe use "bestApplication()" from https://github.com/jleclanche/python-mime # the MIME type is set for pdf6, because that one needs to be autodetectable by libmime - checkViewer('a PDF previewer', ['pdfview', 'kpdf', 'okular', 'qpdfview --unique', 'evince', 'kghostview', 'xpdf', 'SumatraPDF', 'acrobat', 'acroread', 'mupdf', \ - 'gv', 'ghostview', 'AcroRd32', 'gsview64', 'gsview32'], + checkViewer('a PDF previewer', + ['pdfview', 'kpdf', 'okular', 'qpdfview --unique', + 'evince', 'xreader', 'kghostview', 'xpdf', 'SumatraPDF', + 'acrobat', 'acroread', 'mupdf', + 'gv', 'ghostview', 'AcroRd32', 'gsview64', 'gsview32'], rc_entry = [r'''\Format pdf pdf "PDF (ps2pdf)" P "%%" "" "document,vector,menu=export" "" \Format pdf2 pdf "PDF (pdflatex)" F "%%" "" "document,vector,menu=export" "" \Format pdf3 pdf "PDF (dvipdfm)" m "%%" "" "document,vector,menu=export" "" @@ -688,7 +723,9 @@ def checkFormatEntries(dtl_tools): \Format pdf7 pdf "PDF (cropped)" "" "%%" "" "document,vector" "" \Format pdf8 pdf "PDF (lower resolution)" "" "%%" "" "document,vector" ""''']) # - checkViewer('a DVI previewer', ['xdvi', 'kdvi', 'okular', 'yap', 'dviout -Set=!m'], + checkViewer('a DVI previewer', ['xdvi', 'kdvi', 'okular', + 'evince', 'xreader', + 'yap', 'dviout -Set=!m'], rc_entry = [r'''\Format dvi dvi DVI D "%%" "" "document,vector,menu=export" "application/x-dvi" \Format dvi3 dvi "DVI (LuaTeX)" V "%%" "" "document,vector,menu=export" ""''']) if dtl_tools: @@ -713,8 +750,7 @@ def checkFormatEntries(dtl_tools): \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 - 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" "" @@ -722,14 +758,15 @@ 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 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 lyxpreview lyxpreview "LyX Preview" "" "" "" "" "" -\Format pdftex pdftex_t PDFTEX "" "" "" "" "" +\Format pdftex "pdftex_t, pdf_tex" PDFTEX "" "" "" "" "" \Format program "" Program "" "" "" "" "" -\Format pstex pstex_t PSTEX "" "" "" "" "" +\Format pstex "pstex_t, ps_tex" PSTEX "" "" "" "" "" \Format wmf wmf "Windows Metafile" "" "" "" "vector" "image/x-wmf" \Format emf emf "Enhanced Metafile" "" "" "" "vector" "image/x-emf" \Format wordhtml "html, htm" "HTML (MS Word)" "" "" "" "document" "" @@ -739,10 +776,10 @@ def checkFormatEntries(dtl_tools): def checkConverterEntries(): ''' Check all converters (\converter entries) ''' checkProg('the pdflatex program', ['pdflatex $$i'], - rc_entry = [ r'\converter pdflatex pdf2 "%%" "latex=pdflatex"' ]) + rc_entry = [ r'\converter pdflatex pdf2 "%%" "latex=pdflatex,hyperref-driver=pdftex"' ]) checkProg('XeTeX', ['xelatex $$i'], - rc_entry = [ r'\converter xetex pdf4 "%%" "latex=xelatex"' ]) + rc_entry = [ r'\converter xetex pdf4 "%%" "latex=xelatex,hyperref-driver=xetex"' ]) checkLuatex() @@ -760,12 +797,12 @@ def checkConverterEntries(): in_binary_dir = os.path.join(lyx_binary_dir, 'tex2lyx') in_binary_dir = os.path.abspath(in_binary_dir).replace('\\', '/') - path, t2l = checkProg('a LaTeX/Noweb -> LyX converter', [in_binary_subdir, in_binary_subdir + version_suffix, in_binary_dir, in_binary_dir + version_suffix, 'tex2lyx' + version_suffix, 'tex2lyx'], + path, t2l = checkProg('a LaTeX/Noweb -> LyX converter', [quoteIfSpace(in_binary_subdir), quoteIfSpace(in_binary_subdir + version_suffix), quoteIfSpace(in_binary_dir), quoteIfSpace(in_binary_dir + version_suffix), 'tex2lyx' + version_suffix, 'tex2lyx'], rc_entry = [r'''\converter latex lyx "%% -f $$i $$o" "" \converter latexclipboard lyx "%% -fixedenc utf8 -f $$i $$o" "" \converter literate lyx "%% -n -m noweb -f $$i $$o" "" -\converter sweave lyx "%% -n -m sweave -f $$i $$o" "" -\converter knitr lyx "%% -n -m knitr -f $$i $$o" ""'''], not_found = 'tex2lyx') +\converter sweave lyx "%% -n -m sweave -f $$i $$o" "needauth" +\converter knitr lyx "%% -n -m knitr -f $$i $$o" "needauth"'''], not_found = 'tex2lyx') if path == '': logger.warning("Failed to find tex2lyx on your system.") @@ -774,31 +811,38 @@ def checkConverterEntries(): rc_entry = [r'''\converter literate latex "%%" "" \converter literate pdflatex "%%" "" \converter literate xetex "%%" "" -\converter literate luatex "%%" ""''']) +\converter literate luatex "%%" "" +\converter literate dviluatex "%%" ""''']) # checkProg('a Sweave -> LaTeX converter', ['Rscript --verbose --no-save --no-restore $$s/scripts/lyxsweave.R $$p$$i $$p$$o $$e $$r'], - rc_entry = [r'''\converter sweave latex "%%" "" -\converter sweave pdflatex "%%" "" -\converter sweave xetex "%%" "" -\converter sweave luatex "%%" ""''']) + rc_entry = [r'''\converter sweave latex "%%" "needauth" +\converter sweave pdflatex "%%" "needauth" +\converter sweave-ja platex "%%" "needauth" +\converter sweave xetex "%%" "needauth" +\converter sweave luatex "%%" "needauth" +\converter sweave dviluatex "%%" "needauth"''']) # checkProg('a knitr -> LaTeX converter', ['Rscript --verbose --no-save --no-restore $$s/scripts/lyxknitr.R $$p$$i $$p$$o $$e $$r'], - rc_entry = [r'''\converter knitr latex "%%" "" -\converter knitr pdflatex "%%" "" -\converter knitr xetex "%%" "" -\converter knitr luatex "%%" ""''']) + rc_entry = [r'''\converter knitr latex "%%" "needauth" +\converter knitr pdflatex "%%" "needauth" +\converter knitr-ja platex "%%" "needauth" +\converter knitr xetex "%%" "needauth" +\converter knitr luatex "%%" "needauth" +\converter knitr dviluatex "%%" "needauth"''']) # - checkProg('a Sweave -> R/S code converter', ['Rscript --verbose --no-save --no-restore $$s/scripts/lyxstangle.R $$i $$e $$r'], - rc_entry = [ r'\converter sweave r "%%" ""' ]) + checkProg('a Sweave -> R/S code converter', ['Rscript --verbose --no-save --no-restore $$s/scripts/lyxstangle.R $$i $$e $$r'], + rc_entry = [ r'\converter sweave r "%%" ""', + r'\converter sweave-ja r "%%" ""' ]) # checkProg('a knitr -> R/S code converter', ['Rscript --verbose --no-save --no-restore $$s/scripts/lyxknitr.R $$p$$i $$p$$o $$e $$r tangle'], - rc_entry = [ r'\converter knitr r "%%" ""' ]) + rc_entry = [ r'\converter knitr r "%%" ""', + r'\converter knitr-ja r "%%" ""' ]) # checkProg('an HTML -> LaTeX converter', ['html2latex $$i', 'gnuhtml2latex', 'htmltolatex -input $$i -output $$o', 'htmltolatex.jar -input $$i -output $$o'], - rc_entry = [ r'\converter html latex "%%" ""', \ - r'\converter html latex "python -tt $$s/scripts/html2latexwrapper.py %% $$i $$o" ""', \ - r'\converter html latex "%%" ""', \ + rc_entry = [ r'\converter html latex "%%" ""', + r'\converter html latex "python -tt $$s/scripts/html2latexwrapper.py %% $$i $$o" ""', + r'\converter html latex "%%" ""', r'\converter html latex "%%" ""', '' ]) # checkProg('an MS Word -> LaTeX converter', ['wvCleanLatex $$i $$o'], @@ -823,16 +867,16 @@ def checkConverterEntries(): else: # search for HTML converters other than eLyXer # On SuSE the scripts have a .sh suffix, and on debian they are in /usr/share/tex4ht/ - path, htmlconv = checkProg('a LaTeX -> HTML converter', ['htlatex $$i', 'htlatex.sh $$i', \ - '/usr/share/tex4ht/htlatex $$i', 'tth -t -e2 -L$$b < $$i > $$o', \ + path, htmlconv = checkProg('a LaTeX -> HTML converter', ['htlatex $$i', 'htlatex.sh $$i', + '/usr/share/tex4ht/htlatex $$i', 'tth -t -e2 -L$$b < $$i > $$o', 'latex2html -no_subdir -split 0 -show_section_numbers $$i', 'hevea -s $$i'], rc_entry = [ r'\converter latex html "%%" "needaux"' ]) if htmlconv.find('htlatex') >= 0 or htmlconv == 'latex2html': addToRC(r'''\copier html "python -tt $$s/scripts/ext_copy.py -e html,png,css $$i $$o"''') else: addToRC(r'''\copier html "python -tt $$s/scripts/ext_copy.py $$i $$o"''') - path, htmlconv = checkProg('a LaTeX -> HTML (MS Word) converter', ["htlatex $$i 'html,word' 'symbol/!' '-cvalidate'", \ - "htlatex.sh $$i 'html,word' 'symbol/!' '-cvalidate'", \ + path, htmlconv = checkProg('a LaTeX -> HTML (MS Word) converter', ["htlatex $$i 'html,word' 'symbol/!' '-cvalidate'", + "htlatex.sh $$i 'html,word' 'symbol/!' '-cvalidate'", "/usr/share/tex4ht/htlatex $$i 'html,word' 'symbol/!' '-cvalidate'"], rc_entry = [ r'\converter latex wordhtml "%%" "needaux"' ]) if htmlconv.find('htlatex') >= 0: @@ -885,9 +929,9 @@ def checkConverterEntries(): # 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 + # Do not define a converter to pdf6, ps is a pure export format checkProg('a PS to PDF converter', ['ps2pdf $$i $$o'], - rc_entry = [ r'\converter ps pdf "%%" ""' ]) + rc_entry = [ r'\converter ps pdf "%%" "hyperref-driver=dvips"' ]) # checkProg('a PS to TXT converter', ['pstotext $$i > $$o'], rc_entry = [ r'\converter ps text2 "%%" ""' ]) @@ -904,11 +948,19 @@ def checkConverterEntries(): 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 pdf6 eps "%%" ""' ]) + # Define a converter from pdf6 to png for Macs where pdftops is missing. + # The converter utility sips allows to force the dimensions of the resulting + # png image. The value of 800 pixel for the width is arbitrary and not + # related to the current screen resolution or width. + # There is no converter parameter for this information. + checkProg('a PDF to PNG converter', + ['sips --resampleWidth 800 --setProperty format png $$i --out $$o'], + rc_entry = [ r'\converter pdf6 png "%%" ""' ]) # Create one converter for a PDF produced using TeX fonts and one for a # PDF produced using non-TeX fonts. This does not produce non-unique # conversion paths, since a given document either uses TeX fonts or not. @@ -929,13 +981,13 @@ def checkConverterEntries(): rc_entry = [ r'\converter dvi text4 "%%" ""' ]) # checkProg('a DVI to PS converter', ['dvips -o $$o $$i'], - rc_entry = [ r'\converter dvi ps "%%" ""' ]) + rc_entry = [ r'\converter dvi ps "%%" "hyperref-driver=dvips"' ]) # checkProg('a DVI to cropped EPS converter', ['dvips -E -o $$o $$i'], rc_entry = [ r'\converter dvi eps3 "%%" ""' ]) # - checkProg('a DVI to PDF converter', ['dvipdfmx -o $$o $$i', 'dvipdfm -o $$o $$i'], - rc_entry = [ r'\converter dvi pdf3 "%%" ""' ]) + checkProg('a DVI to PDF converter', ['dvipdfmx', 'dvipdfm'], + rc_entry = [ r'\converter dvi pdf3 "%% -o $$o $$i" "hyperref-driver=%%"' ]) # checkProg('a fax program', ['kdeprintfax $$i', 'ksendfax $$i', 'hylapex $$i'], rc_entry = [ r'\converter ps fax "%%" ""']) @@ -944,10 +996,19 @@ def checkConverterEntries(): if fig2dev == "fig2dev": addToRC(r'''\converter fig eps "fig2dev -L eps $$i $$o" "" \converter fig ppm "fig2dev -L ppm $$i $$o" "" +\converter fig svg "fig2dev -L svg $$i $$o" "" \converter fig png "fig2dev -L png $$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_cl], + 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_cl], + rc_entry = [ r'\converter svg pstex "python -tt $$s/scripts/svg2pstex.py %% $$p$$i $$p$$o" ""'], + path = [inkscape_path]) + # checkProg('a TIFF -> PS converter', ['tiff2ps $$i > $$o'], rc_entry = [ r'\converter tiff eps "%%" ""']) # @@ -957,22 +1018,24 @@ def checkConverterEntries(): \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=$$i --export-area-drawing --without-gui --export-eps=$$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 "%%" ""']) # - checkProg('an EMF -> EPS converter', ['metafile2eps $$i $$o', 'wmf2eps -o $$o $$i', inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-eps=$$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 "%%" ""']) # - checkProg('a WMF -> PDF converter', [inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-pdf=$$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 "%%" ""']) # - checkProg('an EMF -> PDF converter', [inkscape_name + ' --file=$$i --export-area-drawing --without-gui --export-pdf=$$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 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 @@ -991,37 +1054,60 @@ def checkConverterEntries(): r'''\converter dot eps "dot -Teps $$i -o $$o" "" \converter dot png "dot -Tpng $$i -o $$o" ""''']) # - checkProg('a Dia -> PNG converter', ['dia -e $$o -t png $$i'], - rc_entry = [ r'\converter dia png "%%" ""']) + path, dia = checkProg('a Dia -> Image converter', ['dia']) + if dia == 'dia': + addToRC(r'''\converter dia png "dia -e $$o -t png $$i" "" +\converter dia eps "dia -e $$o -t eps $$i" "" +\converter dia svg "dia -e $$o -t svg $$i" ""''') + # - checkProg('a Dia -> EPS converter', ['dia -e $$o -t eps $$i'], - rc_entry = [ r'\converter dia eps "%%" ""']) # Actually, this produces EPS, but with a wrong bounding box (usually A4 or letter). # The eps2->eps converter then fixes the bounding box by cropping. # Although unoconv can convert to png and pdf as well, do not define # 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'], + 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 # 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 "%%" ""'], + 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]) # - 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 "%%" ""'], + 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]) # - 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 "%%" ""'], + 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]) - + # + checkProg('Gnuplot', ['gnuplot'], + rc_entry = [ r'''\Format gnuplot "gp, gnuplot" "Gnuplot" "" "" "" "vector" "text/plain" +\converter gnuplot pdf6 "python -tt $$s/scripts/gnuplot2pdf.py $$i $$o" "needauth"''' ]) # # gnumeric/xls/ods to tex checkProg('a spreadsheet -> latex converter', ['ssconvert'], rc_entry = [ r'''\converter gnumeric latex "ssconvert --export-type=Gnumeric_html:latex $$i $$o" "" \converter oocalc latex "ssconvert --export-type=Gnumeric_html:latex $$i $$o" "" -\converter excel latex "ssconvert --export-type=Gnumeric_html:latex $$i $$o" ""''']) +\converter excel latex "ssconvert --export-type=Gnumeric_html:latex $$i $$o" "" +\converter excel2 latex "ssconvert --export-type=Gnumeric_html:latex $$i $$o" "" +\converter gnumeric html_table "ssconvert --export-type=Gnumeric_html:html40frag $$i $$o" "" +\converter oocalc html_table "ssconvert --export-type=Gnumeric_html:html40frag $$i $$o" "" +\converter excel html_table "ssconvert --export-type=Gnumeric_html:html40frag $$i $$o" "" +\converter excel2 html_table "ssconvert --export-type=Gnumeric_html:html40frag $$i $$o" "" +''']) path, lilypond = checkProg('a LilyPond -> EPS/PDF/PNG converter', ['lilypond']) if (lilypond != ''): @@ -1063,8 +1149,10 @@ def checkConverterEntries(): # 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) @@ -1092,21 +1180,21 @@ def checkConverterEntries(): # 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 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" "" ''') @@ -1136,20 +1224,27 @@ def checkOtherEntries(): ''' entries other than Format and Converter ''' checkProg('ChkTeX', ['chktex -n1 -n3 -n6 -n9 -n22 -n25 -n30 -n38'], rc_entry = [ r'\chktex_command "%%"' ]) - checkProgAlternatives('BibTeX or alternative programs', ['bibtex', 'bibtex8', 'biber'], - rc_entry = [ r'\bibtex_command "%%"' ], + checkProgAlternatives('BibTeX or alternative programs', + ['bibtex', 'bibtex8', 'biber'], + rc_entry = [ r'\bibtex_command "automatic"' ], alt_rc_entry = [ r'\bibtex_alternatives "%%"' ]) - checkProg('a specific Japanese BibTeX variant', ['pbibtex', 'jbibtex', 'bibtex'], - rc_entry = [ r'\jbibtex_command "%%"' ]) - checkProgAlternatives('available index processors', ['texindy', 'makeindex -c -q', 'xindy'], + checkProgAlternatives('a specific Japanese BibTeX variant', + ['pbibtex', 'upbibtex', 'jbibtex', 'bibtex', 'biber'], + rc_entry = [ r'\jbibtex_command "automatic"' ], + alt_rc_entry = [ r'\jbibtex_alternatives "%%"' ]) + checkProgAlternatives('available index processors', + ['texindy', 'makeindex -c -q', 'xindy'], rc_entry = [ r'\index_command "%%"' ], alt_rc_entry = [ r'\index_alternatives "%%"' ]) - checkProg('an index processor appropriate to Japanese', ['mendex -c -q', 'jmakeindex -c -q', 'makeindex -c -q'], + checkProg('an index processor appropriate to Japanese', + ['mendex -c -q', 'jmakeindex -c -q', 'makeindex -c -q'], rc_entry = [ r'\jindex_command "%%"' ]) checkProg('the splitindex processor', ['splitindex.pl', 'splitindex', 'splitindex.class'], rc_entry = [ r'\splitindex_command "%%"' ]) checkProg('a nomenclature processor', ['makeindex'], rc_entry = [ r'\nomencl_command "makeindex -s nomencl.ist"' ]) + checkProg('a python-pygments driver command', ['pygmentize'], + rc_entry = [ r'\pygmentize_command "%%"' ]) ## FIXME: OCTAVE is not used anywhere # path, OCTAVE = checkProg('Octave', ['octave']) ## FIXME: MAPLE is not used anywhere @@ -1168,19 +1263,19 @@ def processLayoutFile(file, bool_docbook): Declare lines look like this: \DeclareLaTeXClass[]{} - + Optionally, a \DeclareCategory line follows: - + \DeclareCategory{} - + So for example (article.layout, scrbook.layout, svjog.layout) - + \DeclareLaTeXClass{article} \DeclareCategory{Articles} - + \DeclareLaTeXClass[scrbook]{book (koma-script)} \DeclareCategory{Books} - + \DeclareLaTeXClass[svjour,svjog.clo]{article (Springer - svjour/jog)} we'd expect this output: @@ -1192,42 +1287,43 @@ def processLayoutFile(file, bool_docbook): 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} - 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(): + 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.search(line) qres = q.search(line) 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: - opt = classname - prereq_latex = checkForClassExtension(classname) + opt = classname.encode('ascii') + prereq_latex = checkForClassExtension(classname.encode('ascii')) else: - prereq_list = optAll[1:-1].split(',') - prereq_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"' % (classname, opt, desc, avai, prereq) - if categorydeclaration != '""': - return classdeclaration + " " + categorydeclaration + prereq_list = optAll[1:-1].split(b',') + prereq_list = list(map(checkForClassExtension, prereq_list)) + 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)) + if categorydeclaration != b'""': + return classdeclaration + b" " + categorydeclaration 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. ") - return "" + return b"" def checkLatexConfig(check_config, bool_docbook): @@ -1245,8 +1341,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... ') - 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 @@ -1256,8 +1352,8 @@ def checkLatexConfig(check_config, bool_docbook): # build the list of available layout files and convert it to commands # for chkconfig.ltx foundClasses = [] - for file in glob.glob( os.path.join('layouts', '*.layout') ) + \ - glob.glob( os.path.join(srcdir, 'layouts', '*.layout' ) ) : + for file in (glob.glob(os.path.join('layouts', '*.layout')) + + glob.glob(os.path.join(srcdir, 'layouts', '*.layout'))): # valid file? if not os.path.isfile(file): continue @@ -1270,8 +1366,8 @@ def checkLatexConfig(check_config, 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: @@ -1294,40 +1390,44 @@ 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 - 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*$') + 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' ) ) : + for file in (glob.glob( os.path.join('layouts', '*.layout') ) + + glob.glob( os.path.join(srcdir, 'layouts', '*.layout' ) ) ): nodeclaration = False if not os.path.isfile(file): continue classname = file.split(os.sep)[-1].split('.')[0] - decline = "" - catline = "" - for line in open(file).readlines(): - if not empty.match(line) and line[0] != '#': - if decline == "": - logger.warning("Failed to find valid \Declare line for layout file `" + file + "'.\n\t=> Skipping this file!") + decline = b"" + catline = b"" + for line in open(file, 'rb').readlines(): + if not empty.match(line) and line[0] != b'#'[0]: + if decline == b"": + logger.warning("Failed to find valid \Declare line " + "for layout file `%s'.\n\t=> Skipping this file!" % file) nodeclaration = True # A class, but no category declaration. Just break. break if declare.search(line) != None: - decline = "\\TestDocClass{%s}{%s}" % (classname, line[1:].strip()) + decline = b"\\TestDocClass{%s}{%s}" \ + % (classname.encode('ascii'), line[1:].strip()) testclasses.append(decline) elif category.search(line) != None: - catline = "\\DeclareCategory{%s}{%s}" % (classname, category.search(line).groups()[0]) + catline = (b"\\DeclareCategory{%s}{%s}" + % (classname.encode('ascii'), + category.search(line).groups()[0])) testclasses.append(catline) - if catline == "" or decline == "": + if catline == b"" or decline == b"": continue break if nodeclaration: continue testclasses.sort() - cl = open('chklayouts.tex', 'w') + cl = open('chklayouts.tex', 'wb') for line in testclasses: - cl.write(line + '\n') + cl.write(line + b'\n') cl.close() # # we have chklayouts.tex, then process it @@ -1359,8 +1459,10 @@ def checkLatexConfig(check_config, bool_docbook): pass # if configure successed, move textclass.lst.tmp to textclass.lst # and packages.lst.tmp to packages.lst - if os.path.isfile('textclass.lst.tmp') and len(open('textclass.lst.tmp').read()) > 0 \ - and os.path.isfile('packages.lst.tmp') and len(open('packages.lst.tmp').read()) > 0: + if (os.path.isfile('textclass.lst.tmp') + and len(open('textclass.lst.tmp').read()) > 0 + and os.path.isfile('packages.lst.tmp') + and len(open('packages.lst.tmp').read()) > 0): shutil.move('textclass.lst.tmp', 'textclass.lst') shutil.move('packages.lst.tmp', 'packages.lst') return ret @@ -1370,8 +1472,8 @@ def checkModulesConfig(): 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. @@ -1382,8 +1484,8 @@ def checkModulesConfig(): seen = [] # note that this searches the local directory first, then the # system directory. that way, we pick up the user's version first. - for file in glob.glob( os.path.join('layouts', '*.module') ) + \ - glob.glob( os.path.join(srcdir, 'layouts', '*.module' ) ) : + for file in (glob.glob( os.path.join('layouts', '*.module') ) + + glob.glob( os.path.join(srcdir, 'layouts', '*.module' ) ) ): # valid file? logger.info(file) if not os.path.isfile(file): @@ -1395,8 +1497,8 @@ def checkModulesConfig(): 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') @@ -1417,25 +1519,25 @@ def processModuleFile(file, filename, bool_docbook): 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'\\\\DeclareLyXModule\s*(?:\[([^]]*?)\])?{(.*)}') + rereqs = re.compile(b'#+\s*Requires: (.*)') + reexcs = re.compile(b'#+\s*Excludes: (.*)') + recaty = re.compile(b'#+\s*Category: (.*)') + redbeg = re.compile(b'#+\s*DescriptionBegin\s*$') + redend = re.compile(b'#+\s*DescriptionEnd\s*$') + + modname = desc = pkgs = req = excl = catgy = b"" readingDescription = False descLines = [] - for line in open(file).readlines(): + for line in open(file, 'rb').readlines(): if readingDescription: res = redend.search(line) if res != None: readingDescription = False - desc = " ".join(descLines) + desc = b" ".join(descLines) # Escape quotes. - desc = desc.replace('"', '\\"') + desc = desc.replace(b'"', b'\\"') continue descLines.append(line[1:].strip()) continue @@ -1447,50 +1549,203 @@ def processModuleFile(file, filename, bool_docbook): if res != None: (pkgs, modname) = res.groups() if pkgs == None: - pkgs = "" + pkgs = b"" 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 res = rereqs.search(line) 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 res = reexcs.search(line) 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 res = recaty.search(line) if res != None: catgy = res.group(1) continue - if modname == "": + if modname == b"": 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() - 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 - if pkg.endswith(".sty"): + if pkg.endswith(b".sty"): 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() - return '"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename, desc, pkgs, req, excl, catgy) + return (b'"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' + % (modname, filename, desc, pkgs, req, excl, catgy)) + + +def checkCiteEnginesConfig(): + removeFiles(['lyxciteengines.lst', 'chkciteengines.tex']) + + logger.info('+checking list of cite engines... ') + 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. +## "CiteEngineName" "filename" "CiteEngineType" "CiteFramework" "DefaultBiblio" "Description" "Packages" +''') + + # build the list of available modules + seen = [] + # note that this searches the local directory first, then the + # system directory. that way, we pick up the user's version first. + for file in glob.glob( os.path.join('citeengines', '*.citeengine') ) + \ + glob.glob( os.path.join(srcdir, 'citeengines', '*.citeengine' ) ) : + # valid file? + logger.info(file) + if not os.path.isfile(file): + continue + + filename = file.split(os.sep)[-1] + filename = filename[:-11] + if seen.count(filename): + continue + + seen.append(filename) + retval = processCiteEngineFile(file, filename.encode('ascii'), bool_docbook) + if retval != b"": + tx.write(retval) + tx.close() + logger.info('\tdone') + + +def processCiteEngineFile(file, filename, bool_docbook): + ''' process cite engines file and get a line of result + + The top of a cite engine file should look like this: + #\DeclareLyXCiteEngine[LaTeX Packages]{CiteEngineName} + #DescriptionBegin + #...body of description... + #DescriptionEnd + We expect output: + "CiteEngineName" "filename" "CiteEngineType" "CiteFramework" "DefaultBiblio" "Description" "Packages" + ''' + remods = re.compile(b'\\\\DeclareLyXCiteEngine\s*(?:\[([^]]*?)\])?{(.*)}') + redbeg = re.compile(b'#+\s*DescriptionBegin\s*$') + redend = re.compile(b'#+\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 = [] + + for line in open(file, 'rb').readlines(): + if readingDescription: + res = redend.search(line) + if res != None: + readingDescription = False + desc = b" ".join(descLines) + # Escape quotes. + desc = desc.replace(b'"', b'\\"') + continue + descLines.append(line[1:].strip()) + continue + res = redbeg.search(line) + if res != None: + readingDescription = True + continue + res = remods.search(line) + if res != None: + (pkgs, modname) = res.groups() + if pkgs == None: + pkgs = b"" + else: + tmp = [s.strip() for s in pkgs.split(b",")] + pkgs = b",".join(tmp) + continue + res = recet.search(line) + if res != None: + cet = res.group(1) + continue + res = redb.search(line) + if res != None: + db = res.group(1) + continue + res = resfm.search(line) + if res != None: + cfm = res.group(1) + continue + + if modname == b"": + logger.warning("Cite Engine File file without \DeclareLyXCiteEngine line. ") + return b"" + + 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() + for pkg in pkgs.split(b","): + if b"->" in pkg: + # this is a converter dependency: skip + continue + if pkg.endswith(b".sty"): + pkg = pkg[:-4] + testpackages.append("\\TestPackage{%s}" % (pkg.decode('ascii'),)) + cm = open('chkciteengines.tex', 'a') + for line in testpackages: + cm.write(line + '\n') + cm.close() + + return (b'"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename, cet, cfm, db, desc, pkgs)) + + +def checkXTemplates(): + removeFiles(['xtemplates.lst']) + + logger.info('+checking list of external templates... ') + tx = open('xtemplates.lst', 'w') + tx.write('''## This file lists external templates. +## It has been automatically generated by configure +## Use "Options/Reconfigure" if you need to update it after a +## configuration change. +''') + + # build the list of available templates + seen = [] + # note that this searches the local directory first, then the + # system directory. that way, we pick up the user's version first. + for file in glob.glob( os.path.join('xtemplates', '*.xtemplate') ) + \ + glob.glob( os.path.join(srcdir, 'xtemplates', '*.xtemplate' ) ) : + # valid file? + logger.info(file) + if not os.path.isfile(file): + continue + + filename = file.split(os.sep)[-1] + if seen.count(filename): + continue + + seen.append(filename) + if filename != "": + tx.write(filename + "\n") + tx.close() + logger.info('\tdone') def checkTeXAllowSpaces(): @@ -1519,10 +1774,14 @@ def checkTeXAllowSpaces(): 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) - tfp = cmdOutput("python -tt " + '"' + os.path.join(srcdir, 'scripts', 'TeXFiles.py') + '"') + interpreter = sys.executable + if interpreter == '': + interpreter = "python" + tfp = cmdOutput('"%s" -tt "%s"' % (interpreter, tfscript)) logger.info(tfp) logger.info("\tdone") @@ -1531,15 +1790,15 @@ def removeTempFiles(): # Final clean-up if not lyx_keep_temps: removeFiles(['chkconfig.vars', 'chklatex.ltx', 'chklatex.log', - 'chklayouts.tex', 'chkmodules.tex', 'missfont.log', - 'wrap_chkconfig.ltx', 'wrap_chkconfig.log']) + 'chklayouts.tex', 'chkmodules.tex', 'chkciteengines.tex', + 'missfont.log', 'wrap_chkconfig.ltx', 'wrap_chkconfig.log']) if __name__ == '__main__': lyx_check_config = True lyx_kpsewhich = True outfile = 'lyxrc.defaults' - lyxrc_fileformat = 19 + lyxrc_fileformat = 24 rc_entries = '' lyx_keep_temps = False version_suffix = '' @@ -1547,7 +1806,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' ]: - print '''Usage: configure [options] + print('''Usage: configure [options] Options: --help show this help lines --keep-temps keep temporary files (for debug. purposes) @@ -1555,7 +1814,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 -''' +''') sys.exit(0) elif op == '--without-kpsewhich': lyx_kpsewhich = False @@ -1568,7 +1827,7 @@ Options: 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 @@ -1599,7 +1858,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] - (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() @@ -1611,6 +1880,8 @@ Format %i if lyx_kpsewhich: rescanTeXFiles() checkModulesConfig() + checkCiteEnginesConfig() + checkXTemplates() # --without-latex-config can disable lyx_check_config ret = checkLatexConfig(lyx_check_config and LATEX != '', bool_docbook) removeTempFiles()