X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Fscripts%2Flyxpreview2bitmap.py;h=ac425f14d272a6aea3df419f8917769224d3da7a;hb=76ffbd136ae935861e8b98a9e47b3ad0957924be;hp=aab77997597960a6d8912292a9e406d6dd80393e;hpb=37dc5aeabe851b30f9c2d0f2952992515e572e36;p=lyx.git diff --git a/lib/scripts/lyxpreview2bitmap.py b/lib/scripts/lyxpreview2bitmap.py index aab7799759..ac425f14d2 100755 --- a/lib/scripts/lyxpreview2bitmap.py +++ b/lib/scripts/lyxpreview2bitmap.py @@ -30,13 +30,14 @@ # Example usage: # lyxpreview2bitmap.py png 0lyxpreview.tex 128 000000 faf0e6 -# This script takes five arguments: +# This script takes six arguments: # FORMAT: The desired output format. Either 'png' or 'ppm'. # TEXFILE: the name of the .tex file to be converted. # DPI: a scale factor, used to ascertain the resolution of the # generated image which is then passed to gs. # FG_COLOR: the foreground color as a hexadecimal string, eg '000000'. # BG_COLOR: the background color as a hexadecimal string, eg 'faf0e6'. +# CONVERTER: the converter (optional). Default is latex. # Decomposing TEXFILE's name as DIR/BASE.tex, this script will, # if executed successfully, leave in DIR: @@ -47,14 +48,14 @@ import glob, os, re, string, sys -from legacy_lyxpreview2ppm import legacy_conversion +from legacy_lyxpreview2ppm import legacy_conversion, \ + legacy_conversion_step2 -from lyxpreview_tools import error, find_exe, \ - find_exe_or_terminate, run_command +from lyxpreview_tools import copyfileobj, error, find_exe, \ + find_exe_or_terminate, make_texcolor, mkstemp, run_command, warning # Pre-compiled regular expressions. -hexcolor_re = re.compile("^[0-9a-fA-F]{6}$") latex_file_re = re.compile("\.tex$") @@ -64,18 +65,6 @@ def usage(prog_name): % prog_name -def make_texcolor(hexcolor): - # Test that the input string contains 6 hexadecimal chars. - if not hexcolor_re.match(hexcolor): - error("Cannot convert color '%s'" % hexcolor) - - red = float(string.atoi(hexcolor[0:2], 16)) / 255.0 - green = float(string.atoi(hexcolor[2:4], 16)) / 255.0 - blue = float(string.atoi(hexcolor[4:6], 16)) / 255.0 - - return "rgb %f %f %f" % (red, green, blue) - - def extract_metrics_info(dvipng_stdout, metrics_file): metrics = open(metrics_file, 'w') # "\[[0-9]+" can match two kinds of numbers: page numbers from dvipng @@ -117,6 +106,37 @@ def extract_metrics_info(dvipng_stdout, metrics_file): return success +def color_pdf(latex_file, bg_color): + use_preview_pdf_re = re.compile("(\s*\\\\usepackage\[[^]]+)(pdftex\]{preview})") + + tmp = mkstemp() + + success = 0 + try: + for line in open(latex_file, 'r').readlines(): + match = use_preview_pdf_re.match(line) + if match == None: + tmp.write(line) + continue + success = 1 + tmp.write(" \\usepackage{color}\n" \ + " \\pagecolor[rgb]{%s}\n" \ + "%s\n" \ + % (bg_color, match.group())) + continue + + except: + # Unable to open the file, but do nothing here because + # the calling function will act on the value of 'success'. + warning('Warning in color_pdf! Unable to open "%s"' % latex_file) + warning(`sys.exc_type` + ',' + `sys.exc_value`) + + if success: + copyfileobj(tmp, open(latex_file,"wb"), 1) + + return success + + def convert_to_ppm_format(pngtopnm, basename): png_file_re = re.compile("\.png$") @@ -135,7 +155,7 @@ def convert_to_ppm_format(pngtopnm, basename): def main(argv): # Parse and manipulate the command line arguments. - if len(argv) != 6: + if len(argv) != 6 and len(argv) != 7: error(usage(argv[0])) output_format = string.lower(argv[1]) @@ -145,38 +165,48 @@ def main(argv): os.chdir(dir) dpi = string.atoi(argv[3]) - fg_color = make_texcolor(argv[4]) - bg_color = make_texcolor(argv[5]) + fg_color = make_texcolor(argv[4], False) + bg_color = make_texcolor(argv[5], False) + + bg_color_gr = make_texcolor(argv[5], True) # External programs used by the script. path = string.split(os.environ["PATH"], os.pathsep) - latex = find_exe_or_terminate(["pplatex", "latex2e", "latex"], path) + if len(argv) == 7: + latex = argv[6] + else: + latex = find_exe_or_terminate(["latex", "pplatex", "platex", "latex2e"], path) # This can go once dvipng becomes widespread. dvipng = find_exe(["dvipng"], path) if dvipng == None: - if output_format == "ppm": - # The data is input to legacy_conversion in as similar - # as possible a manner to that input to the code used in - # LyX 1.3.x. - vec = [ argv[0], argv[2], argv[3], argv[1], argv[4], argv[5] ] - return legacy_conversion(vec) - else: - error("The old 'dvi->ps->ppm' conversion requires " - "ppm as the output format") + # The data is input to legacy_conversion in as similar + # as possible a manner to that input to the code used in + # LyX 1.3.x. + vec = [ argv[0], argv[2], argv[3], argv[1], argv[4], argv[5], latex ] + return legacy_conversion(vec) pngtopnm = "" if output_format == "ppm": pngtopnm = find_exe_or_terminate(["pngtopnm"], path) + # Move color information for PDF into the latex file. + if not color_pdf(latex_file, bg_color_gr): + error("Unable to move color info into the latex file") + # Compile the latex file. latex_call = '%s "%s"' % (latex, latex_file) latex_status, latex_stdout = run_command(latex_call) if latex_status != None: - error("%s failed to compile %s" \ + warning("%s failed to compile %s" \ % (os.path.basename(latex), latex_file)) + if latex == "xelatex": + warning("Using XeTeX") + # FIXME: skip unnecessary dvips trial in legacy_conversion_step2 + return legacy_conversion_step2(latex_file, dpi, output_format) + # Run the dvi file through dvipng. dvi_file = latex_file_re.sub(".dvi", latex_file) dvipng_call = '%s -Ttight -depth -height -D %d -fg "%s" -bg "%s" "%s"' \ @@ -184,8 +214,10 @@ def main(argv): dvipng_status, dvipng_stdout = run_command(dvipng_call) if dvipng_status != None: - error("%s failed to generate images from %s" \ + warning("%s failed to generate images from %s ... looking for PDF" \ % (os.path.basename(dvipng), dvi_file)) + # FIXME: skip unnecessary dvips trial in legacy_conversion_step2 + return legacy_conversion_step2(latex_file, dpi, output_format) # Extract metrics info from dvipng_stdout. metrics_file = latex_file_re.sub(".metrics", latex_file)