Am Freitag, den 21.08.2020, 09:56 +0200 schrieb Pavel Sanda: > I am not entirely against pythonic solution, but I think at this > stage it's really for win users to step up. I can make the linux part > working if they come up with a solution.
Humble attempt attached. Works for me (on Linux) and is surprisingly fast (though arguably a bit slower than locate). Some advantages over the bash script apart from portability: * No hardcoded viewer. This checks for the same set of viewers than configure.py and takes the first match. Also, there are options to specify a custom pdf/ps viewer (-v and -w) * Handles filenames with spaces (can be easily fixed in the bash script though) I suppose if the python find method turns out to be too slow, we can also use locate on *nix and the equivalent (dir?) on windows and only fall back to the python method if none of these is available. Pavel, what do you think? Jürgen
#! /usr/bin/python3 # -*- coding: utf-8 -*- # file lyxpaperview.py # This file is part of LyX, the document processor. # Licence details can be found in the file COPYING. # author Jürgen Spitzmüller # Full author contact details are available in file CREDITS # This script searches the home directory for a PDF or PS # file with a name containing year and author. If found, # it opens the file in a viewer. import getopt, os, sys, subprocess pdf_viewers = ('pdfview', 'kpdf', 'okular', 'qpdfview --unique', 'evince', 'xreader', 'kghostview', 'xpdf', 'SumatraPDF', 'acrobat', 'acroread', 'mupdf', 'gv', 'ghostview', 'AcroRd32', 'gsview64', 'gsview32') ps_viewers = ("kghostview", "okular", "qpdfview --unique", "evince", "xreader", "gv", "ghostview -swap", "gsview64", "gsview32") def message(message): sys.stderr.write("lyxpaperview: %s\n" % message) def error(message): sys.stderr.write("lyxpaperview error: %s\n" % message) exit(1) def usage(prog_name): msg = "Usage: %s [-v pdfviewer] [-w psviewer] year author" return msg % prog_name # Copied from lyxpreview_tools.py # PATH and PATHEXT environment variables path = os.environ["PATH"].split(os.pathsep) extlist = [''] if "PATHEXT" in os.environ: extlist += os.environ["PATHEXT"].split(os.pathsep) extlist.append('.py') def find_exe(candidates): global extlist, path for command in candidates: prog = command.split()[0] for directory in path: for ext in extlist: full_path = os.path.join(directory, prog + ext) if os.access(full_path, os.X_OK): # The thing is in the PATH already (or we wouldn't # have found it). Return just the basename to avoid # problems when the path to the executable contains # spaces. if full_path.lower().endswith('.py'): return command.replace(prog, '"%s" "%s"' % (sys.executable, full_path)) return command return None def find_exe_or_terminate(candidates): exe = find_exe(candidates) if exe == None: error("Unable to find executable from '%s'" % " ".join(candidates)) return exe def find(year, author, path): result = [] for root, dirs, files in os.walk(path): for fname in files: lfname = fname.lower() if lfname.endswith(('.pdf', '.ps')) and lfname.find(author) != -1 and lfname.find(year) != -1: return os.path.join(root, fname) return "" def main(argv): progname = argv[0] opts, args = getopt.getopt(sys.argv[1:], "v:w:") pdfviewer = "" psviewer = "" for o, v in opts: if o == "-v": pdfviewer = v if o == "-w": psviewer = v if len(args) != 2: error(usage(progname)) year = args[0] author = args[1] result = find(year, author.lower(), path = os.environ["HOME"]) if result == "": message("no document found!") return 0 else: message("found document %s" % result) viewer = "" if result.lower().endswith('.ps'): if psviewer == "": viewer = find_exe_or_terminate(ps_viewers) else: viewer = psviewer else: if pdfviewer == "": viewer = find_exe_or_terminate(pdf_viewers) else: viewer = pdfviewer subprocess.call([viewer, result]) return 0 if __name__ == "__main__": main(sys.argv)
signature.asc
Description: This is a digitally signed message part
-- lyx-devel mailing list lyx-devel@lists.lyx.org http://lists.lyx.org/mailman/listinfo/lyx-devel