]> git.lyx.org Git - features.git/commitdiff
Do not show previews of snippets that produce latex errors
authorEnrico Forestieri <forenr@lyx.org>
Wed, 29 Apr 2015 22:35:28 +0000 (00:35 +0200)
committerEnrico Forestieri <forenr@lyx.org>
Wed, 29 Apr 2015 22:37:05 +0000 (00:37 +0200)
lib/scripts/legacy_lyxpreview2ppm.py
lib/scripts/lyxpreview2bitmap.py
lib/scripts/lyxpreview_tools.py

index 2519f75636fed0fcbec1b0c5066eaa24912431cd..38dc825fdd23beac6aa0d76b7c1cf957cca2f398 100644 (file)
@@ -81,8 +81,8 @@
 
 import glob, os, pipes, re, string, sys
 
-from lyxpreview_tools import copyfileobj, error, filter_pages, find_exe, \
-     find_exe_or_terminate, join_metrics_and_rename, latex_commands, \
+from lyxpreview_tools import 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, warning, write_metrics_info
 
@@ -325,7 +325,10 @@ def legacy_conversion_pdflatex(latex_file, failed_pages, legacy_metrics,
         filter_pages(latex_file, pdf_latex_file, failed_pages)
 
         # pdflatex call
+        error_pages = []
         pdflatex_status, pdflatex_stdout = run_latex(pdflatex, pdf_latex_file)
+        if pdflatex_status:
+            error_pages = check_latex_log(latex_file_re.sub(".log", pdf_latex_file))
 
         pdf_file = latex_file_re.sub(".pdf", pdf_latex_file)
         latex_file_root = latex_file_re.sub("", pdf_latex_file)
@@ -359,6 +362,12 @@ def legacy_conversion_pdflatex(latex_file, failed_pages, legacy_metrics,
             pdf_log_file = latex_file_re.sub(".log", pdf_latex_file)
             pdf_metrics = legacy_extract_metrics_info(pdf_log_file)
 
+            # Invalidate metrics for pages that produced errors
+            if len(error_pages) > 0:
+                for index in error_pages:
+                    pdf_metrics.pop(index - 1)
+                    pdf_metrics.insert(index - 1, (index, -1.0))
+
             original_bitmap = latex_file_re.sub("%d." + output_format, pdf_latex_file)
             destination_bitmap = latex_file_re.sub("%d." + output_format, latex_file)
 
@@ -414,6 +423,9 @@ def legacy_conversion_step3(latex_file, dpi, output_format, dvips_failed, skipMe
     log_file = latex_file_re.sub(".log", latex_file)
     resolution = extract_resolution(log_file, dpi)
 
+    # Check whether some pages produced errors
+    error_pages = check_latex_log(log_file)
+
     # Older versions of gs have problems with a large degree of
     # anti-aliasing at high resolutions
     alpha = 4
@@ -505,6 +517,13 @@ def legacy_conversion_step3(latex_file, dpi, output_format, dvips_failed, skipMe
             use_pdftocairo, conv, gs_device, gs_ext, alpha, resolution,
             output_format)
 
+    # Invalidate metrics for pages that produced errors
+    if len(error_pages) > 0:
+        for index in error_pages:
+            if index not in failed_pages:
+                legacy_metrics.pop(index - 1)
+                legacy_metrics.insert(index - 1, (index, -1.0))
+
     # Crop the ppm images
     if pnmcrop != None and output_format == "ppm":
         crop_files(pnmcrop, latex_file_root)
index 90deec813c0f71b321d377de1497906354da2bdb..c647abbbd6e24c7a3a8773d40832a5bdab082930 100755 (executable)
@@ -79,10 +79,11 @@ import getopt, glob, os, re, shutil, string, sys
 
 from legacy_lyxpreview2ppm import legacy_conversion_step1
 
-from lyxpreview_tools import bibtex_commands, 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, warning, write_metrics_info
+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, \
+     warning, write_metrics_info
 
 
 def usage(prog_name):
@@ -441,9 +442,11 @@ def main(argv):
                 fg_color, bg_color, latex, pdf_output)
 
     # Compile the latex file.
+    error_pages = []
     latex_status, latex_stdout = run_latex(latex, latex_file, bibtex)
     if latex_status:
         warning("trying to recover from failed compilation")
+        error_pages = check_latex_log(latex_file_re.sub(".log", latex_file))
 
     # The dvi output file name
     dvi_file = latex_file_re.sub(".dvi", latex_file)
@@ -537,6 +540,13 @@ def main(argv):
         join_metrics_and_rename(dvipng_metrics, legacy_metrics, pdf_pages,
             original_bitmap, destination_bitmap)
 
+    # Invalidate metrics for pages that produced errors
+    if len(error_pages) > 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))
+
     # Convert images to ppm format if necessary.
     if output_format == "ppm":
         convert_to_ppm_format(pngtopnm, latex_file_re.sub("", latex_file))
index 0f595e2bf35cd7b7c2c0089f2c858bc412be5c7e..4b18227746b037351a93694305c744d803c22e4b 100644 (file)
@@ -363,3 +363,39 @@ def string_in_file(string, infile):
             return True
     f.close()
     return False
+
+
+# Returns a list of indexes of pages giving errors extracted from the latex log
+def check_latex_log(log_file):
+
+    error_re = re.compile("^! ")
+    snippet_re = re.compile("^Preview: Snippet ")
+    data_re = re.compile("([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+)")
+
+    found_error = False
+    error_pages = []
+
+    try:
+        for line in open(log_file, 'r').readlines():
+            if not found_error:
+                match = error_re.match(line)
+                if match != None:
+                    found_error = True
+                continue
+            else:
+                match = snippet_re.match(line)
+                if match == None:
+                    continue
+
+                found_error = False
+                match = data_re.search(line)
+                if match == None:
+                    error("Unexpected data in %s\n%s" % (log_file, line))
+
+                error_pages.append(int(match.group(1)))
+
+    except:
+        warning('check_latex_log: Unable to open "%s"' % log_file)
+        warning(`sys.exc_type` + ',' + `sys.exc_value`)
+
+    return error_pages