From 74299850bc9200703575b026a03fdfa74315e61d Mon Sep 17 00:00:00 2001 From: deathaxe Date: Fri, 19 Dec 2025 11:49:59 +0100 Subject: [PATCH] Output written pages in build summary Resolves #107 --- LaTeXTools Build Output.sublime-syntax | 2 +- latextools/make_pdf.py | 4 ++-- latextools/preview/preview_math.py | 2 +- latextools/utils/tex_log.py | 12 ++++++++++-- tests/syntax/syntax_test_build.log | 8 ++++---- 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/LaTeXTools Build Output.sublime-syntax b/LaTeXTools Build Output.sublime-syntax index f120bad3..d2574f56 100644 --- a/LaTeXTools Build Output.sublime-syntax +++ b/LaTeXTools Build Output.sublime-syntax @@ -106,5 +106,5 @@ contexts: scope: meta.summary.failure.build.latextools message.error.build.latextools - match: ^\[Build cancelled by user!\]$\n? scope: meta.summary.failure.build.latextools message.warning.build.latextools - - match: ^\[(?:Build skipped!|Finished in .+)\]$\n? + - match: ^\[(?:Build skipped!|Finished\b.+)\]$\n? scope: meta.summary.success.build.latextools message.info.build.latextools diff --git a/latextools/make_pdf.py b/latextools/make_pdf.py index 56a2f3aa..05ff9750 100644 --- a/latextools/make_pdf.py +++ b/latextools/make_pdf.py @@ -169,7 +169,7 @@ def worker(self, activity_indicator): else: log_file = os.path.join(self.caller.builder.tex_dir, log_filename) - errors, warnings, badboxes = parse_log_file(log_file) + errors, warnings, badboxes, num_pages = parse_log_file(log_file) except FileNotFoundError: # If no log file was created, and all processes finished with exit code 0, @@ -292,7 +292,7 @@ def worker(self, activity_indicator): elapsed = time.strftime("%M:%S", time.gmtime(elapsed)) else: elapsed = f"{elapsed:0.1f}s" - self.caller.output(f"\n\n[Finished in {elapsed}]") + self.caller.output(f"\n\n[Finished, {num_pages} pages written in {elapsed}]") self.caller.errors = errors self.caller.warnings = warnings diff --git a/latextools/preview/preview_math.py b/latextools/preview/preview_math.py index 2a88ba23..03d51dda 100644 --- a/latextools/preview/preview_math.py +++ b/latextools/preview/preview_math.py @@ -223,7 +223,7 @@ def _create_image( err_log.append("No log file found.") else: try: - errors, warnings, _ = parse_log_file(log_file) + errors, warnings, *_ = parse_log_file(log_file) except Exception as e: err_log.append(f"Error while parsing log file: {e}") errors = warnings = [] diff --git a/latextools/utils/tex_log.py b/latextools/utils/tex_log.py index de3ab801..58f9c245 100644 --- a/latextools/utils/tex_log.py +++ b/latextools/utils/tex_log.py @@ -125,7 +125,7 @@ class WarningLogRule(ErrorLogRule): selector = "meta.warning.log - markup.warning" -def parse_log_view(view: sublime.View) -> tuple[list[str], list[str], list[str]]: +def parse_log_view(view: sublime.View) -> tuple[list[str], list[str], list[str], int]: """ Extract errors, warnings and badbox messages from a `sublime.View`. @@ -175,15 +175,23 @@ def format_items(items): for fname, line, msg in sorted(items) ] + pattern = r"Output written on [^\(]+\(([\d\n]+) pages?\b" + region = view.find(pattern, 0) + if region and (match := re.match(pattern, view.substr(region).replace("\n", ""))): + pages = int(match.group(1)) + else: + pages = 0 + # gather log items return ( format_items(chain(*map(extract_items, (ExceptionLogRule, ErrorLogRule)))), format_items(extract_items(WarningLogRule)), format_items(extract_items(BadboxLogRule)), + pages, ) -def parse_log_file(logfile: str | os.PathLike[str]) -> tuple[list[str], list[str], list[str]]: +def parse_log_file(logfile: str | os.PathLike[str]) -> tuple[list[str], list[str], list[str], int]: """ Extract errors, warnings and badbox messages from tex build log. diff --git a/tests/syntax/syntax_test_build.log b/tests/syntax/syntax_test_build.log index a400c836..0b782bce 100644 --- a/tests/syntax/syntax_test_build.log +++ b/tests/syntax/syntax_test_build.log @@ -82,10 +82,10 @@ C:\Data\LaTeX\test-1400\.aux\test-index.log:1: Double-click here to open the ful # <- meta.summary.success.build.latextools message.info.build.latextools - meta.messages - meta.logfile #^^^^^^^^^^^^^^^^ meta.summary.success.build.latextools message.info.build.latextools - meta.messages - meta.logfile -[Finished in 3.4s] +[Finished, 3 pages written in 3.4s] # <- meta.summary.success.build.latextools message.info.build.latextools - meta.messages - meta.logfile -#^^^^^^^^^^^^^^^^^ meta.summary.success.build.latextools message.info.build.latextools - meta.messages - meta.logfile +#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.summary.success.build.latextools message.info.build.latextools - meta.messages - meta.logfile -[Finished in 14:25] +[Finished, 152 pages written in 14:25] # <- meta.summary.success.build.latextools message.info.build.latextools - meta.messages - meta.logfile -#^^^^^^^^^^^^^^^^^^ meta.summary.success.build.latextools message.info.build.latextools - meta.messages - meta.logfile +#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.summary.success.build.latextools message.info.build.latextools - meta.messages - meta.logfile