X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=lib%2Fscripts%2Flyxpreview2bitmap.py;h=eee000deeae33840f085d6554a0a82305b811850;hb=dcf06fdb22bf39637aa7e11e59ca281d921fcbc7;hp=5eca9599908f6c6faccb97dec0c79e23dfef2a11;hpb=bc47054be88467f01fd2f6e437d555743bd8a7c9;p=lyx.git diff --git a/lib/scripts/lyxpreview2bitmap.py b/lib/scripts/lyxpreview2bitmap.py index 5eca959990..eee000deea 100755 --- a/lib/scripts/lyxpreview2bitmap.py +++ b/lib/scripts/lyxpreview2bitmap.py @@ -75,16 +75,21 @@ # Moreover dvipng can't work with PDF files, so, if the CONVERTER # paramter is pdflatex we have to fallback to legacy route (step 2). -import getopt, glob, os, re, shutil, string, sys +from __future__ import print_function -from legacy_lyxpreview2ppm import legacy_conversion_step1 +import getopt, glob, os, re, shutil, sys, tempfile + +import lyxpreview_tools + +from legacy_lyxpreview2ppm import extract_resolution, legacy_conversion_step1 from lyxpreview_tools import bibtex_commands, check_latex_log, copyfileobj, \ error, filter_pages, find_exe, find_exe_or_terminate, \ join_metrics_and_rename, latex_commands, latex_file_re, make_texcolor, \ - mkstemp, pdflatex_commands, progress, run_command, run_latex, run_tex, \ + pdflatex_commands, progress, run_command, run_latex, run_tex, \ warning, write_metrics_info +PY2 = sys.version_info[0] == 2 def usage(prog_name): msg = """ @@ -134,8 +139,8 @@ def extract_metrics_info(dvipng_stdout): success = 1 # Calculate the 'ascent fraction'. - descent = string.atof(match.group(1)) - ascent = string.atof(match.group(2)) + descent = float(match.group(1)) + ascent = float(match.group(2)) frac = 0.5 if ascent < 0: @@ -158,20 +163,32 @@ def extract_metrics_info(dvipng_stdout): return results -def fix_latex_file(latex_file): - documentclass_re = re.compile("(\\\\documentclass\[)(1[012]pt,?)(.+)") +def fix_latex_file(latex_file, pdf_output): + # python 2 does not allow to declare a string as raw byte so we double + # the backslashes and remove the r preffix + def_re = re.compile(b"(\\\\newcommandx|\\\\global\\\\long\\\\def)" + b"(\\\\[a-zA-Z]+)") - tmp = mkstemp() + tmp = tempfile.TemporaryFile() - changed = 0 - for line in open(latex_file, 'r').readlines(): - match = documentclass_re.match(line) - if match == None: - tmp.write(line) - continue - - changed = 1 - tmp.write("%s%s\n" % (match.group(1), match.group(3))) + changed = False + macros = [] + for line in open(latex_file, 'rb').readlines(): + if not pdf_output and line.startswith(b"\\documentclass"): + changed = True + line += b"\\PassOptionsToPackage{draft}{microtype}\n" + else: + match = def_re.match(line) + if match != None: + macroname = match.group(2) + if macroname in macros: + definecmd = match.group(1) + if definecmd == b"\\newcommandx": + changed = True + line = line.replace(definecmd, b"\\renewcommandx") + else: + macros.append(macroname) + tmp.write(line) if changed: copyfileobj(tmp, open(latex_file,"wb"), 1) @@ -206,7 +223,7 @@ def find_ps_pages(dvi_file): error("No DVI output.") # Check for PostScript specials in the dvi, badly supported by dvipng, - # and inclusion of PDF/PNG/JPG files. + # and inclusion of PDF/PNG/JPG files. # This is required for correct rendering of PSTricks and TikZ dv2dt = find_exe_or_terminate(["dv2dt"]) dv2dt_call = '%s "%s"' % (dv2dt, dvi_file) @@ -268,7 +285,7 @@ def find_ps_pages(dvi_file): # Use page ranges, as a list of pages could exceed command line # maximum length (especially under Win32) - for index in xrange(1, page_index + 1): + for index in range(1, page_index + 1): if (not index in ps_or_pdf_pages) and skip: # We were skipping pages but current page shouldn't be skipped. # Add this page to -pp, it could stay alone or become the @@ -315,24 +332,23 @@ def main(argv): (opts, args) = getopt.gnu_getopt(argv[1:], "dhv", ["bibtex=", "bg=", "debug", "dpi=", "fg=", "help", "latex=", "lilypond", "lilypond-book=", "png", "ppm", "verbose"]) - except getopt.GetoptError, err: + except getopt.GetoptError as err: error("%s\n%s" % (err, usage(script_name))) opts.reverse() for opt, val in opts: if opt in ("-h", "--help"): - print usage(script_name) + print(usage(script_name)) sys.exit(0) elif opt == "--bibtex": bibtex = [val] elif opt == "--bg": bg_color = val elif opt in ("-d", "--debug"): - import lyxpreview_tools lyxpreview_tools.debug = True elif opt == "--dpi": try: - dpi = string.atoi(val) + dpi = int(val) except: error("Cannot convert %s to an integer value" % val) elif opt == "--fg": @@ -346,7 +362,6 @@ def main(argv): elif opt in ("--png", "--ppm"): output_format = opt[2:] elif opt in ("-v", "--verbose"): - import lyxpreview_tools lyxpreview_tools.verbose = True # Determine input file @@ -357,23 +372,41 @@ def main(argv): input_path = args[0] dir, latex_file = os.path.split(input_path) + # Check for the input file + if not os.path.exists(input_path): + error('File "%s" not found.' % input_path) + if len(dir) != 0: + os.chdir(dir) + + if lyxpreview_tools.verbose: + f_out = open('verbose.txt', 'a') + sys.stdout = f_out + sys.stderr = f_out + # Echo the settings + progress("Running Python %s" % str(sys.version_info[:3])) progress("Starting %s..." % script_name) + if os.name == "nt": + progress("Use win32_modules: %d" % lyxpreview_tools.use_win32_modules) progress("Output format: %s" % output_format) progress("Foreground color: %s" % fg_color) progress("Background color: %s" % bg_color) progress("Resolution (dpi): %s" % dpi) progress("File to process: %s" % input_path) - # Check for the input file - if not os.path.exists(input_path): - error('File "%s" not found.' % input_path) - if len(dir) != 0: - os.chdir(dir) + # For python > 2 convert strings to bytes + if not PY2: + fg_color = bytes(fg_color, 'ascii') + bg_color = bytes(bg_color, 'ascii') fg_color_dvipng = make_texcolor(fg_color, False) bg_color_dvipng = make_texcolor(bg_color, False) + # For python > 2 convert bytes to string + if not PY2: + fg_color_dvipng = fg_color_dvipng.decode('ascii') + bg_color_dvipng = bg_color_dvipng.decode('ascii') + # External programs used by the script. latex = find_exe_or_terminate(latex or latex_commands) bibtex = find_exe(bibtex or bibtex_commands) @@ -391,9 +424,9 @@ def main(argv): progress("Preprocess through lilypond-book: %s" % lilypond) progress("Altering the latex file for font size and colors") - # Omit font size specification in latex file and make sure multiple - # defined macros are not an issue. - fix_latex_file(latex_file) + # Make sure that multiple defined macros and the microtype package + # don't cause issues in the latex file. + fix_latex_file(latex_file, pdf_output) if lilypond: progress("Preprocess the latex file through %s" % lilypond_book) @@ -437,9 +470,10 @@ def main(argv): # Compile the latex file. error_pages = [] latex_status, latex_stdout = run_latex(latex, latex_file, bibtex) + latex_log = latex_file_re.sub(".log", latex_file) if latex_status: - warning("trying to recover from failed compilation") - error_pages = check_latex_log(latex_file_re.sub(".log", latex_file)) + progress("Will try to recover from %s failure" % latex) + error_pages = check_latex_log(latex_log) # The dvi output file name dvi_file = latex_file_re.sub(".dvi", latex_file) @@ -475,9 +509,12 @@ def main(argv): return legacy_conversion_step1(latex_file, dpi, output_format, fg_color, bg_color, "pdflatex", True) + # Retrieve resolution + resolution = extract_resolution(latex_log, dpi) + # Run the dvi file through dvipng. dvipng_call = '%s -Ttight -depth -height -D %d -fg "%s" -bg "%s" %s "%s"' \ - % (dvipng, dpi, fg_color_dvipng, bg_color_dvipng, pages_parameter, dvi_file) + % (dvipng, resolution, fg_color_dvipng, bg_color_dvipng, pages_parameter, dvi_file) dvipng_status, dvipng_stdout = run_command(dvipng_call) if dvipng_status: @@ -535,10 +572,14 @@ def main(argv): # Invalidate metrics for pages that produced errors if len(error_pages) > 0: + error_count = 0 for index in error_pages: if index not in ps_pages and index not in pdf_pages: dvipng_metrics.pop(index - 1) dvipng_metrics.insert(index - 1, (index, -1.0)) + error_count += 1 + if error_count: + warning("Failed to produce %d preview snippet(s)" % error_count) # Convert images to ppm format if necessary. if output_format == "ppm":