X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Fconfigure.py;h=26af8e37c74c24799a9e11110a18e70a0eb81466;hb=1fde43b690157964774490bb46c606a5dd9ed38b;hp=9b2d3f6971b13bd00a6930dcaf26a2c3110e40e5;hpb=fb45a49daee8064d0655f30c8dc4aad69120aac9;p=lyx.git diff --git a/lib/configure.py b/lib/configure.py index 9b2d3f6971..26af8e37c7 100644 --- a/lib/configure.py +++ b/lib/configure.py @@ -56,23 +56,40 @@ def removeFiles(filenames): pass -def cmdOutput(cmd): +def cmdOutput(cmd, async = 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 + 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 ' + os.getcwd() + '&' + cmd + cmd = 'cmd /d /c pushd ' + shortPath(os.getcwdu()) + '&' + cmd else: b = True pipe = subprocess.Popen(cmd, shell=b, close_fds=b, stdin=subprocess.PIPE, \ stdout=subprocess.PIPE, universal_newlines=True) pipe.stdin.close() + if async: + return pipe.stdout output = pipe.stdout.read() pipe.stdout.close() return output.strip() +def shortPath(path): + ''' On Windows, return the short version of "path" if possible ''' + if os.name == 'nt': + from ctypes import windll, create_unicode_buffer + GetShortPathName = windll.kernel32.GetShortPathNameW + shortlen = GetShortPathName(path, 0, 0) + shortpath = create_unicode_buffer(shortlen) + if GetShortPathName(path, shortpath, shortlen): + return shortpath.value + return path + + def setEnviron(): ''' I do not really know why this is useful, but we might as well keep it. NLS nuisances. @@ -110,18 +127,10 @@ def checkTeXPaths(): fd, tmpfname = mkstemp(suffix='.ltx') if os.name == 'nt': from locale import getdefaultlocale - from ctypes import windll, create_unicode_buffer - GetShortPathName = windll.kernel32.GetShortPathNameW language, encoding = getdefaultlocale() if encoding == None: encoding = 'latin1' - longname = unicode(tmpfname, encoding) - shortlen = GetShortPathName(longname, 0, 0) - shortname = create_unicode_buffer(shortlen) - if GetShortPathName(longname, shortname, shortlen): - inpname = shortname.value.replace('\\', '/') - else: - inpname = tmpfname.replace('\\', '/') + inpname = shortPath(unicode(tmpfname, encoding)).replace('\\', '/') else: inpname = cmdOutput('cygpath -m ' + tmpfname) logname = os.path.basename(re.sub("(?i).ltx", ".log", inpname)) @@ -559,6 +568,7 @@ def checkFormatEntries(dtl_tools): '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"''' ]) # @@ -569,7 +579,7 @@ def checkFormatEntries(dtl_tools): \Format eps2 eps "EPS (uncropped)" "" "%%" "" "vector" "" \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 - checkViewer('a PDF previewer', ['kpdf', 'okular', 'evince', 'kghostview', 'xpdf', 'acrobat', 'acroread', \ + checkViewer('a PDF previewer', ['pdfview', 'kpdf', 'okular', 'evince', 'kghostview', 'xpdf', 'acrobat', 'acroread', \ 'gv', 'ghostview'], rc_entry = [r'''\Format pdf pdf "PDF (ps2pdf)" P "%%" "" "document,vector,menu=export" "application/pdf" \Format pdf2 pdf "PDF (pdflatex)" F "%%" "" "document,vector,menu=export" "" @@ -590,11 +600,11 @@ def checkFormatEntries(dtl_tools): checkViewerEditor('Noteedit', ['noteedit'], rc_entry = [r'\Format noteedit not Noteedit "" "%%" "%%" "vector" ""']) # - checkViewerEditor('an OpenDocument/OpenOffice viewer', ['libreoffice', 'lwriter', 'swriter', 'oowriter', 'abiword'], + checkViewerEditor('an OpenDocument/OpenOffice viewer', ['libreoffice', 'lwriter', 'lowriter', 'oowriter', 'swriter', 'abiword'], rc_entry = [r'''\Format odt odt OpenDocument "" "%%" "%%" "document,vector,menu=export" "application/vnd.oasis.opendocument.text" \Format sxw sxw "OpenOffice.Org (sxw)" "" "" "" "document,vector" "application/vnd.sun.xml.writer"''']) # - checkViewerEditor('a Rich Text and Word viewer', ['libreoffice', 'lwriter', 'swriter', 'oowriter', 'abiword'], + checkViewerEditor('a Rich Text and Word viewer', ['libreoffice', 'lwriter', 'lowriter', 'oowriter', 'swriter', 'abiword'], rc_entry = [r'''\Format rtf rtf "Rich Text Format" "" "%%" "%%" "document,vector,menu=export" "application/rtf" \Format word doc "MS Word" W "%%" "%%" "document,vector,menu=export" "application/msword"''']) # @@ -642,7 +652,7 @@ def checkConverterEntries(): path, t2l = checkProg('a LaTeX/Noweb -> LyX converter', [in_place, 'tex2lyx' + version_suffix, 'tex2lyx'], rc_entry = [r'''\converter latex lyx "%% -f $$i $$o" "" -\converter literate lyx "%% -n -f $$i $$o" ""'''], not_found = 'tex2lyx') +\converter literate lyx "%% -n -m noweb -f $$i $$o" ""'''], not_found = 'tex2lyx') if path == '': logger.warning("Failed to find tex2lyx on your system.") @@ -710,7 +720,7 @@ def checkConverterEntries(): # Check if LyXBlogger is installed lyxblogger_found = checkModule('lyxblogger') if lyxblogger_found: - addToRC(r'\Format blog blog "LyXBlogger" "" "" "" "document"') + addToRC(r'\Format blog blog "LyXBlogger" "" "" "" "document" ""') addToRC(r'\converter xhtml blog "python -m lyxblogger $$i" ""') # @@ -1002,17 +1012,29 @@ def checkOtherEntries(): def processLayoutFile(file, bool_docbook): ''' process layout file and get a line of result - Declare lines look like this: (article.layout, scrbook.layout, svjog.layout) + 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 expect output: + we'd expect this output: - "article" "article" "article" "false" "article.cls" - "scrbook" "scrbook" "book (koma-script)" "false" "scrbook.cls" - "svjog" "svjour" "article (Springer - svjour/jog)" "false" "svjour.cls,svjog.clo" + "article" "article" "article" "false" "article.cls" "Articles" + "scrbook" "scrbook" "book (koma-script)" "false" "scrbook.cls" "Books" + "svjog" "svjour" "article (Springer - svjour/jog)" "false" "svjour.cls,svjog.clo" "" ''' def checkForClassExtension(x): '''if the extension for a latex class is not @@ -1024,8 +1046,12 @@ def processLayoutFile(file, bool_docbook): 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'\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}') + q = re.compile(r'\DeclareCategory{(.*)}') + classdeclaration = "" + categorydeclaration = '""' for line in open(file).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] @@ -1038,7 +1064,15 @@ def processLayoutFile(file, bool_docbook): prereq_latex = ','.join(prereq_list) prereq_docbook = {'true':'', 'false':'docbook'}[bool_docbook] prereq = {'LaTeX':prereq_latex, 'DocBook':prereq_docbook}[classtype] - return '"%s" "%s" "%s" "%s" "%s"\n' % (classname, opt, desc, avai, prereq) + classdeclaration = '"%s" "%s" "%s" "%s" "%s"' % (classname, opt, desc, avai, prereq) + if categorydeclaration != '""': + return classdeclaration + " " + categorydeclaration + if qres != None: + categorydeclaration = '"%s"' % (qres.groups()[0]) + if classdeclaration != "": + return classdeclaration + " " + categorydeclaration + if classdeclaration != "": + return classdeclaration + " " + categorydeclaration logger.warning("Layout file " + file + " has no \DeclareXXClass line. ") return "" @@ -1108,6 +1142,7 @@ def checkLatexConfig(check_config, bool_docbook): # build the list of available layout files and convert it to commands # for chkconfig.ltx declare = re.compile(r'\Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)}') + category = re.compile(r'\DeclareCategory{(.*)}') empty = re.compile(r'^\s*$') testclasses = list() for file in glob.glob( os.path.join('layouts', '*.layout') ) + \ @@ -1116,14 +1151,23 @@ def checkLatexConfig(check_config, bool_docbook): 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] != '#': - logger.warning("Failed to find valid \Declare line for layout file `" + file + "'.\n\t=> Skipping this file!") - nodeclaration = True + if decline == "": + logger.warning("Failed to find valid \Declare line for layout file `" + file + "'.\n\t=> Skipping this file!") + nodeclaration = True + # A class, but no category declaration. Just break. break - if declare.search(line) == None: + if declare.search(line) != None: + 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]) + testclasses.append(catline) + if catline == "" or decline == "": continue - testclasses.append("\\TestDocClass{%s}{%s}" % (classname, line[1:].strip())) break if nodeclaration: continue @@ -1134,20 +1178,21 @@ def checkLatexConfig(check_config, bool_docbook): cl.close() # # we have chklayouts.tex, then process it - ret = 1 - latex_out = cmdOutput(LATEX + ' wrap_chkconfig.ltx') - for line in latex_out.splitlines(): + latex_out = cmdOutput(LATEX + ' wrap_chkconfig.ltx', True) + while True: + line = latex_out.readline() + if not line: + break; if re.match('^\+', line): logger.info(line.strip()) - # return None if the command succeeds - if line == "+Inspection done.": - ret = None + # if the command succeeds, None will be returned + ret = latex_out.close() # # remove the copied file if rmcopy: removeFiles( [ 'chkconfig.ltx' ] ) # - # currently, values in chhkconfig are only used to set + # currently, values in chkconfig are only used to set # \font_encoding values = {} for line in open('chkconfig.vars').readlines(): @@ -1318,6 +1363,17 @@ def checkTeXAllowSpaces(): removeFiles( [ 'a b.tex', 'a b.log', 'texput.log' ]) +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') ): + logger.error("configure: error: cannot find TeXFiles.py script") + sys.exit(1) + tfp = cmdOutput("python -tt " + os.path.join(srcdir, 'scripts', 'TeXFiles.py')) + logger.info(tfp) + logger.info("\tdone") + + def removeTempFiles(): # Final clean-up if not lyx_keep_temps: @@ -1328,6 +1384,7 @@ def removeTempFiles(): if __name__ == '__main__': lyx_check_config = True + lyx_kpsewhich = True outfile = 'lyxrc.defaults' lyxrc_fileformat = 7 rc_entries = '' @@ -1340,10 +1397,13 @@ if __name__ == '__main__': Options: --help show this help lines --keep-temps keep temporary files (for debug. purposes) + --without-kpsewhich do not update TeX files information via kpsewhich --without-latex-config do not run LaTeX to determine configuration --with-version-suffix=suffix suffix of binary installed files ''' sys.exit(0) + elif op == '--without-kpsewhich': + lyx_kpsewhich = False elif op == '--without-latex-config': lyx_check_config = False elif op == '--keep-temps': @@ -1388,6 +1448,8 @@ Format %i if windows_style_tex_paths != '': addToRC(r'\tex_expects_windows_paths %s' % windows_style_tex_paths) checkOtherEntries() + if lyx_kpsewhich: + rescanTeXFiles() checkModulesConfig() # --without-latex-config can disable lyx_check_config ret = checkLatexConfig(lyx_check_config and LATEX != '', bool_docbook)