X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Fscripts%2Flyxpak.py;h=f3b8078be3a74a425aa92b70a7174c7458982f2e;hb=5cb4e119324dd7346aad7f6cfe94f6c9636c127e;hp=a47e2927e12158c9ba1dfc651e0b9d7e5d8d9a7f;hpb=495558b5fd0cf7e6c6630688fba35f6022d3717c;p=lyx.git diff --git a/lib/scripts/lyxpak.py b/lib/scripts/lyxpak.py index a47e2927e1..f3b8078be3 100755 --- a/lib/scripts/lyxpak.py +++ b/lib/scripts/lyxpak.py @@ -1,4 +1,3 @@ -#! /usr/bin/env python # -*- coding: utf-8 -*- # file lyxpak.py @@ -21,17 +20,17 @@ if sys.version_info < (2, 4, 0): from sets import Set as set from getopt import getopt -lyx2lyx = None - # Pre-compiled regular expressions. re_lyxfile = re.compile("\.lyx$") -re_input = re.compile(r'^(.*)\\(input|include){(\s*)(\S+)(\s*)}.*$') -re_package = re.compile(r'^(.*)\\(usepackage){(\s*)(\S+)(\s*)}.*$') -re_class = re.compile(r'^(\\)(textclass)(\s+)(\S+)$') -re_norecur = re.compile(r'^(.*)\\(verbatiminput|lstinputlisting|includegraphics\[*.*\]*){(\s*)(\S+)(\s*)}.*$') -re_filename = re.compile(r'^(\s*)(filename)(\s+)(\S+)$') -re_options = re.compile(r'^(\s*)options(\s+)(\S+)$') -re_bibfiles = re.compile(r'^(\s*)bibfiles(\s+)(\S+)$') +re_input = re.compile(r'^(.*)\\(input|include){(\s*)(.+)(\s*)}.*$') +re_ertinput = re.compile(r'^(input|include)({)(\s*)(.+)(\s*)}.*$') +re_package = re.compile(r'^(.*)\\(usepackage){(\s*)(.+)(\s*)}.*$') +re_class = re.compile(r'^(\\)(textclass)(\s+)(.+)\s*$') +re_norecur = re.compile(r'^(.*)\\(verbatiminput|lstinputlisting|includegraphics\[*.*\]*){(\s*)(.+)(\s*)}.*$') +re_ertnorecur = re.compile(r'^(verbatiminput|lstinputlisting|includegraphics\[*.*\]*)({)(\s*)(.+)(\s*)}.*$') +re_filename = re.compile(r'^(\s*)(filename)(\s+)(.+)\s*$') +re_options = re.compile(r'^(\s*)options(\s+)(.+)\s*$') +re_bibfiles = re.compile(r'^(\s*)bibfiles(\s+)(.+)\s*$') def usage(prog_name): @@ -79,7 +78,7 @@ def abspath(name): return newname -def gather_files(curfile, incfiles): +def gather_files(curfile, incfiles, lyx2lyx): " Recursively gather files." curdir = os.path.dirname(abspath(curfile)) is_lyxfile = re_lyxfile.search(curfile) @@ -94,6 +93,7 @@ def gather_files(curfile, incfiles): lines = input.readlines() input.close() + maybe_in_ert = False i = 0 while i < len(lines): # Gather used files. @@ -101,7 +101,10 @@ def gather_files(curfile, incfiles): extlist = [''] match = re_filename.match(lines[i]) if not match: - match = re_input.match(lines[i]) + if maybe_in_ert: + match = re_ertinput.match(lines[i]) + else: + match = re_input.match(lines[i]) if not match: match = re_package.match(lines[i]) extlist = ['.sty'] @@ -109,23 +112,28 @@ def gather_files(curfile, incfiles): match = re_class.match(lines[i]) extlist = ['.cls'] if not match: - match = re_norecur.match(lines[i]) + if maybe_in_ert: + match = re_ertnorecur.match(lines[i]) + else: + match = re_norecur.match(lines[i]) extlist = ['', '.eps', '.pdf', '.png', '.jpg'] recursive = False + maybe_in_ert = is_lyxfile and lines[i] == "\\backslash" if match: file = match.group(4).strip('"') if not os.path.isabs(file): file = os.path.join(curdir, file) file_exists = False - for ext in extlist: - if os.path.exists(file + ext): - file = file + ext - file_exists = True - break - if file_exists: + if not os.path.isdir(file): + for ext in extlist: + if os.path.exists(file + ext): + file = file + ext + file_exists = True + break + if file_exists and not abspath(file) in incfiles: incfiles.append(abspath(file)) if recursive: - gather_files(file, incfiles) + gather_files(file, incfiles, lyx2lyx) i += 1 continue @@ -151,7 +159,7 @@ def gather_files(curfile, incfiles): j = 0 while j < len(bibfiles): if os.path.isabs(bibfiles[j]): - file = bibfiles[j] + file = bibfiles[j] + '.bib' else: file = os.path.join(curdir, bibfiles[j] + '.bib') if os.path.exists(file): @@ -165,7 +173,8 @@ def gather_files(curfile, incfiles): return 0 -def find_lyx2lyx(progloc): +def find_lyx2lyx(progloc, path): + " Find a usable version of the lyx2lyx script. " # first we will see if the script is roughly where we are # i.e., we will assume we are in $SOMEDIR/scripts and look # for $SOMEDIR/lyx2lyx/lyx2lyx. @@ -177,7 +186,7 @@ def find_lyx2lyx(progloc): # now we will try to query LyX itself to find the path. extlist = [''] - if os.environ.has_key("PATHEXT"): + if "PATHEXT" in os.environ: extlist = extlist + os.environ["PATHEXT"].split(os.pathsep) lyx_exe, full_path = find_exe(["lyxc", "lyx"], extlist, path) if lyx_exe == None: @@ -221,7 +230,7 @@ def main(args): makezip = (os.name == 'nt') outdir = "" - global lyx2lyx + lyx2lyx = None for (opt, param) in options: if opt == "-h": @@ -254,7 +263,6 @@ def main(args): else: import tarfile - # Create a tar archive on *nix and a zip archive on Windows ar_ext = ".tar.gz" if makezip: ar_ext = ".zip" @@ -265,18 +273,21 @@ def main(args): path = string.split(os.environ["PATH"], os.pathsep) - # Try to find the location of the lyx2lyx script if lyx2lyx == None: - lyx2lyx = find_lyx2lyx(ourprog) + lyx2lyx = find_lyx2lyx(ourprog, path) # Initialize the list with the specified LyX file and recursively # gather all required files (also from child documents). incfiles = [abspath(lyxfile)] - gather_files(lyxfile, incfiles) + gather_files(lyxfile, incfiles, lyx2lyx) # Find the topmost dir common to all files if len(incfiles) > 1: topdir = os.path.commonprefix(incfiles) + # Check whether topdir is valid, as os.path.commonprefix() works on + # a character by character basis, rather than on path elements. + if not os.path.exists(topdir): + topdir = os.path.dirname(topdir) + os.path.sep else: topdir = os.path.dirname(incfiles[0]) + os.path.sep @@ -295,7 +306,7 @@ def main(args): # Create the archive try: - if os.name == 'nt': + if makezip: zip = zipfile.ZipFile(ar_name, "w", zipfile.ZIP_DEFLATED) for file in incfiles: zip.write(file)