X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Fconfigure.py;h=be47cea7a08252a0b0ccc61a186854204dd66678;hb=50e21b71;hp=3b88041d3c96713c2c29fa1f1624e6c38fb0d72c;hpb=52978f94d28a8f5f731e4c394b225f1a2927d3a6;p=lyx.git diff --git a/lib/configure.py b/lib/configure.py index 3b88041d3c..be47cea7a0 100644 --- a/lib/configure.py +++ b/lib/configure.py @@ -8,7 +8,8 @@ # \author Bo Peng # Full author contact details are available in file CREDITS. -import glob, logging, os, re, shutil, subprocess, sys, stat +from __future__ import print_function +import glob, logging, os, re, shutil, subprocess, sys, stat, io # set up logging logging.basicConfig(level = logging.DEBUG, @@ -65,10 +66,13 @@ def cmdOutput(cmd, async = False): ''' 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: @@ -106,30 +110,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 +150,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 @@ -173,7 +176,7 @@ def checkUpgrade(): 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 +196,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 +251,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) + ')', @@ -273,13 +279,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 +304,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 +345,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 +408,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 +447,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(): @@ -476,16 +496,19 @@ 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) + 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, "") + 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, "") + 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' @@ -539,37 +562,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): @@ -605,7 +604,8 @@ def checkFormatEntries(dtl_tools): 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"'], + 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 +618,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" @@ -655,30 +657,39 @@ def checkFormatEntries(dtl_tools): 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 +699,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 +726,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 +734,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" "" @@ -764,8 +777,8 @@ def checkConverterEntries(): 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 +787,34 @@ 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 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 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 "%%" "needauth"' ]) # 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 "%%" "needauth"' ]) # 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 +839,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,7 +901,7 @@ 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 "%%" ""' ]) # @@ -904,7 +920,7 @@ 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'], @@ -944,7 +960,10 @@ 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 svg pdftex "python -tt $$s/scripts/svg2pdftex.py $$i $$o" "" +\converter svg pstex "python -tt $$s/scripts/svg2pstex.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" ""''') # @@ -972,7 +991,7 @@ def checkConverterEntries(): 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,29 +1010,40 @@ 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'], 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 "%%" ""'], + 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 "%%" ""'], + 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 "%%" ""'], + rc_entry = [ r'''\converter svg png "%%" "", +\converter svgz png "%%" ""'''], path = ['', inkscape_path]) # @@ -1021,7 +1051,13 @@ def checkConverterEntries(): 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 != ''): @@ -1065,6 +1101,7 @@ def checkConverterEntries(): addToRC(r'\converter lilypond-book pdflatex "lilypond-book --safe --pdf --latex-program=pdflatex --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 +1129,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,15 +1173,20 @@ 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 "%%"' ]) @@ -1168,19 +1210,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: @@ -1213,11 +1255,12 @@ def processLayoutFile(file, bool_docbook): prereq_latex = checkForClassExtension(classname) else: prereq_list = optAll[1:-1].split(',') - prereq_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"' % (classname, opt, desc, avai, prereq) + classdeclaration = ('"%s" "%s" "%s" "%s" "%s"' + % (classname, opt, desc, avai, prereq)) if categorydeclaration != '""': return classdeclaration + " " + categorydeclaration if qres != None: @@ -1256,8 +1299,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 @@ -1298,18 +1341,23 @@ def checkLatexConfig(check_config, bool_docbook): category = re.compile(r'^\s*#\s*\\DeclareCategory{(.*)}\s*$') empty = re.compile(r'^\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 os.name == 'nt': + enco = sys.getfilesystemencoding() + else: + enco="utf8" + for line in io.open(file, encoding=enco).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!") + 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 @@ -1317,7 +1365,8 @@ def checkLatexConfig(check_config, bool_docbook): decline = "\\TestDocClass{%s}{%s}" % (classname, line[1:].strip()) testclasses.append(decline) elif category.search(line) != None: - catline = "\\DeclareCategory{%s}{%s}" % (classname, category.search(line).groups()[0]) + catline = ("\\DeclareCategory{%s}{%s}" + % (classname, category.search(line).groups()[0])) testclasses.append(catline) if catline == "" or decline == "": continue @@ -1359,8 +1408,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 @@ -1382,8 +1433,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): @@ -1490,7 +1541,160 @@ def processModuleFile(file, filename, bool_docbook): cm.write(line + '\n') cm.close() - return '"%s" "%s" "%s" "%s" "%s" "%s" "%s"\n' % (modname, filename, desc, pkgs, req, excl, catgy) + return ('"%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', 'w') + tx.write('''## 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, bool_docbook) + if retval != "": + 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(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*(.*)') + + modname = desc = pkgs = cet = db = cfm = "" + readingDescription = False + descLines = [] + + for line in open(file).readlines(): + if readingDescription: + res = redend.search(line) + if res != None: + readingDescription = False + desc = " ".join(descLines) + # Escape quotes. + desc = desc.replace('"', '\\"') + 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 = "" + else: + tmp = [s.strip() for s in pkgs.split(",")] + pkgs = ",".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 == "": + logger.warning("Cite Engine File file without \DeclareLyXCiteEngine line. ") + return "" + + if pkgs != "": + # 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: + # this is a converter dependency: skip + continue + if pkg.endswith(".sty"): + pkg = pkg[:-4] + testpackages.append("\\TestPackage{%s}" % (pkg,)) + 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) + + +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(): @@ -1522,7 +1726,11 @@ def rescanTeXFiles(): if not os.path.isfile( os.path.join(srcdir, 'scripts', 'TeXFiles.py') ): 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(interpreter + " -tt " + '"' + + os.path.join(srcdir, 'scripts', 'TeXFiles.py') + '"') logger.info(tfp) logger.info("\tdone") @@ -1531,15 +1739,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 = 21 rc_entries = '' lyx_keep_temps = False version_suffix = '' @@ -1547,7 +1755,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 +1763,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 +1776,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 @@ -1611,6 +1819,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()