X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Fscripts%2FTeXFiles.py;h=a5787eaacba4ce01fa28adb16f1bc48af073bcb6;hb=975f304185eca53d62de8b36e6fc5f95b2da4fd9;hp=48987ad9d8df51212318deb1f7a98762664ed1c0;hpb=2ae2c0db71bc88ac0c3e11c3cbd33e6a90ae8f6d;p=features.git diff --git a/lib/scripts/TeXFiles.py b/lib/scripts/TeXFiles.py index 48987ad9d8..a5787eaacb 100755 --- a/lib/scripts/TeXFiles.py +++ b/lib/scripts/TeXFiles.py @@ -1,13 +1,12 @@ -#!/usr/bin/env python -# -*- coding: iso-8859-1 -*- +# -*- coding: utf-8 -*- # file TeXFiles.py # This file is part of LyX, the document processor. # Licence details can be found in the file COPYING. -# \author Herbert Voß +# \author Herbert Voß # \author Jean-Marc Lasgouttes -# \author Jürgen Spitzmüller +# \author Jürgen Spitzmüller # \author Bo Peng # Full author contact details are available in file CREDITS. @@ -17,28 +16,34 @@ # TeX style files -> option sty # bibtex style files -> option bst # bibtex database files -> option bib +# biblatex bibstyles -> option bbx +# biblatex citestyles -> option cbx # # with the help # of kpsewhich and creates a -# bstFiles.lst, clsFiles.lst, styFiles.lst, bibFiles.lst +# bstFiles.lst, clsFiles.lst, styFiles.lst, bibFiles.lst, +# bbxFiles.lst, cbxFiles.lst # without any parameter all files are created. # # Herbert Voss # # Updates from Jean-Marc Lasgouttes. # -# bib support added by Juergen Spitzmueller (v0.3) +# bib, bbx and cbx support added by Juergen Spitzmueller (v0.4) # # translated to python by Bo Peng, so that the script only # relies on python and kpsewhich (no shell command is used). # +from __future__ import print_function import os, sys, re cls_stylefile = 'clsFiles.lst' sty_stylefile = 'styFiles.lst' bst_stylefile = 'bstFiles.lst' bib_files = 'bibFiles.lst' +bbx_files = 'bbxFiles.lst' +cbx_files = 'cbxFiles.lst' def cmdOutput(cmd): '''utility function: run a command and get its output as a string @@ -52,19 +57,19 @@ def cmdOutput(cmd): # processing command line options if len(sys.argv) > 1: if sys.argv[1] in ['--help', '-help']: - print '''Usage: TeXFiles.py [-version | cls | sty | bst | bib ] + print('''Usage: TeXFiles.py [-version | cls | sty | bst | bib | bbx| cbx ] Default is without any Parameters, - so that all files will be created''' - sye.exit(0) + so that all files will be created''') + sys.exit(0) else: types = sys.argv[1:] for type in types: - if type not in ['cls', 'sty', 'bst', 'bib']: - print 'ERROR: unknown type', type + if type not in ['cls', 'sty', 'bst', 'bib', 'bbx', 'cbx']: + print('ERROR: unknown type', type) sys.exit(1) else: # if no parameter is specified, assume all - types = ['cls', 'sty', 'bst', 'bib'] + types = ['cls', 'sty', 'bst', 'bib', 'bbx', 'cbx'] # # MS-DOS and MS-Windows define $COMSPEC or $ComSpec and use `;' to separate @@ -73,16 +78,14 @@ else: # Create a variable that holds the right character to be used by the scripts. path_sep = os.pathsep if sys.platform == 'cygwin': - # MikTeX's kpsewhich says "kpathsea emulation version x.x.x", whereas - # teTeX's simply "kpathsea version x.x.x". - if 'emulation' in cmdOutput('kpsewhich --version'): + if ';' in cmdOutput('kpsewhich --show-path=.tex'): path_sep = ';' else: path_sep = ':' # process each file type for type in types: - print "Indexing files of type", type + print("Indexing files of type", type) if type == 'cls': outfile = cls_stylefile kpsetype = '.tex' @@ -95,6 +98,12 @@ for type in types: elif type == 'bib': outfile = bib_files kpsetype = '.bib' + elif type == 'bbx': + outfile = bbx_files + kpsetype = '.tex' + elif type == 'cbx': + outfile = cbx_files + kpsetype = '.tex' dirs = cmdOutput('kpsewhich --show-path=' + kpsetype).replace('!!', '').strip() # remove excessive // @@ -102,16 +111,27 @@ for type in types: file_ext = '.' + type out = open(outfile, 'w') + visited = set() for dir in dirs.split(path_sep): # for each valid directory if not os.path.isdir(dir): continue # walk down the file hierarchy - for root,path,files in os.walk(dir): + for root,dirs,files in os.walk(dir, followlinks=True): + # prevent inifinite recursion + recurse = [] + for dir in dirs: + dirname = os.path.join(root, dir) + dirname = os.path.realpath(dirname) + dirname = os.path.normcase(dirname) + if dirname not in visited: + visited.add(dirname) + recurse.append(dir) + dirs[:] = recurse # check file type for file in files: if len(file) > 4 and file[-4:] == file_ext: # force the use of / since miktex uses / even under windows - print >> out, root.replace('\\', '/') + '/' + file + print(root.replace('\\', '/') + '/' + file, file=out) out.close()