From c635535050206de1e41a5c5813e8fff46ef7a883 Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Wed, 9 Aug 2023 13:22:46 -0400 Subject: [PATCH 01/28] Added ability to remove latex junk (default True) --- manim/_config/utils.py | 9 +++++++++ manim/cli/render/global_options.py | 8 +++++++- manim/scene/scene.py | 5 +++++ manim/scene/scene_file_writer.py | 30 ++++++++++++++++++++++++++++++ 4 files changed, 51 insertions(+), 1 deletion(-) diff --git a/manim/_config/utils.py b/manim/_config/utils.py index a96440ba3b..bb6d7476f7 100644 --- a/manim/_config/utils.py +++ b/manim/_config/utils.py @@ -309,6 +309,7 @@ class MyScene(Scene): "write_to_movie", "zero_pad", "force_window", + "no_latex_cleanup", } def __init__(self) -> None: @@ -580,6 +581,7 @@ def digest_parser(self, parser: configparser.ConfigParser) -> ManimConfig: "use_projection_stroke_shaders", "enable_wireframe", "force_window", + "no_latex_cleanup", ]: setattr(self, key, parser["CLI"].getboolean(key, fallback=False)) @@ -756,6 +758,7 @@ def digest_args(self, args: argparse.Namespace) -> ManimConfig: "enable_wireframe", "force_window", "dry_run", + "no_latex_cleanup", ]: if hasattr(args, key): attr = getattr(args, key) @@ -959,6 +962,12 @@ def digest_file(self, filename: str | os.PathLike) -> ManimConfig: lambda self, val: self._set_boolean("force_window", val), doc="Set to force window when using the opengl renderer", ) + + no_latex_cleanup = property( + lambda self: self._d["no_latex_cleanup"], + lambda self, val: self._set_boolean("no_latex_cleanup", val), + doc="Deletes .aux, .dvi, .log, and .tex files produced by Tex and MathTex." + ) @property def verbosity(self): diff --git a/manim/cli/render/global_options.py b/manim/cli/render/global_options.py index b17e4671c2..b7789b052b 100644 --- a/manim/cli/render/global_options.py +++ b/manim/cli/render/global_options.py @@ -102,4 +102,10 @@ def validate_gui_location(ctx, param, value): help="Renders animations without outputting image or video files and disables the window", default=False, ), -) + option( + "--no_latex_cleanup", + is_flag=True, + help="Deletes .aux, .dvi, .log, and .tex files produced by Tex and MathTex.", + default=False + ), +) \ No newline at end of file diff --git a/manim/scene/scene.py b/manim/scene/scene.py index 5f3fb99247..6b34fa61b0 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -209,6 +209,9 @@ def __deepcopy__(self, clone_from_id): result.mobject_updater_lists.append((mobject_clone, cloned_updaters)) return result + def delete_old_latex(self) -> int: + return self.renderer.file_writer.delete_tex_files() + def render(self, preview: bool = False): """ Renders this Scene. @@ -232,12 +235,14 @@ def render(self, preview: bool = False): # We have to reset these settings in case of multiple renders. self.renderer.scene_finished(self) + deleted_latex = self.delete_old_latex() if not config["no_latex_cleanup"] else 0 # Show info only if animations are rendered or to get image if ( self.renderer.num_plays or config["format"] == "png" or config["save_last_frame"] ): + logger.info(f"{deleted_latex} non-essential LaTeX files deleted.{' To keep these LaTeX files, try passing in `--no_latex_cleanup`' if deleted_latex else ''}") logger.info( f"Rendered {str(self)}\nPlayed {self.renderer.num_plays} animations", ) diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index d9e509de89..fe71e94393 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -126,6 +126,14 @@ def init_output_directories(self, scene_name): self.image_file_path = image_dir / add_extension_if_not_present( self.output_name, ".png" ) + + self.tex_files_directory = guarantee_existence( + config.get_dir( + "tex_dir", + module_name=module_name, + scene_name=scene_name + ) + ) if write_to_movie(): movie_dir = guarantee_existence( @@ -172,6 +180,28 @@ def init_output_directories(self, scene_name): scene_name=scene_name, module_name=module_name, log_dir=log_dir ) + def delete_tex_files(self, additional_endings: list[str] = ()) -> int: + '''Deletes the .dvi, .aux, .log, and .tex files produced when using `Tex` or `MathTex` + + Parameters: + ----------- + additional_endings + Additional Endings to remove in Tex folder + + Returns: + -------- + :class:`int` + How many files were deleted + ''' + file_endings = (".dvi", ".aux", ".log", ".tex", *additional_endings) + files_deleted = 0 + for file_name in self.tex_files_directory.iterdir(): + file = self.tex_files_directory / file_name + if any(file.suffix==s for s in file_endings): + file.unlink() + files_deleted+=1 + return files_deleted + def finish_last_section(self) -> None: """Delete current section if it is empty.""" if len(self.sections) and self.sections[-1].is_empty(): From c80168382d96a041517c970c0b22aa524fc30926 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 9 Aug 2023 17:30:10 +0000 Subject: [PATCH 02/28] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/_config/utils.py | 4 ++-- manim/cli/render/global_options.py | 4 ++-- manim/scene/scene.py | 6 ++++-- manim/scene/scene_file_writer.py | 22 +++++++++------------- 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/manim/_config/utils.py b/manim/_config/utils.py index bb6d7476f7..ebc686189d 100644 --- a/manim/_config/utils.py +++ b/manim/_config/utils.py @@ -962,11 +962,11 @@ def digest_file(self, filename: str | os.PathLike) -> ManimConfig: lambda self, val: self._set_boolean("force_window", val), doc="Set to force window when using the opengl renderer", ) - + no_latex_cleanup = property( lambda self: self._d["no_latex_cleanup"], lambda self, val: self._set_boolean("no_latex_cleanup", val), - doc="Deletes .aux, .dvi, .log, and .tex files produced by Tex and MathTex." + doc="Deletes .aux, .dvi, .log, and .tex files produced by Tex and MathTex.", ) @property diff --git a/manim/cli/render/global_options.py b/manim/cli/render/global_options.py index b7789b052b..ad0feaca4e 100644 --- a/manim/cli/render/global_options.py +++ b/manim/cli/render/global_options.py @@ -106,6 +106,6 @@ def validate_gui_location(ctx, param, value): "--no_latex_cleanup", is_flag=True, help="Deletes .aux, .dvi, .log, and .tex files produced by Tex and MathTex.", - default=False + default=False, ), -) \ No newline at end of file +) diff --git a/manim/scene/scene.py b/manim/scene/scene.py index 6b34fa61b0..af7d5bdd8f 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -209,7 +209,7 @@ def __deepcopy__(self, clone_from_id): result.mobject_updater_lists.append((mobject_clone, cloned_updaters)) return result - def delete_old_latex(self) -> int: + def delete_old_latex(self) -> int: return self.renderer.file_writer.delete_tex_files() def render(self, preview: bool = False): @@ -242,7 +242,9 @@ def render(self, preview: bool = False): or config["format"] == "png" or config["save_last_frame"] ): - logger.info(f"{deleted_latex} non-essential LaTeX files deleted.{' To keep these LaTeX files, try passing in `--no_latex_cleanup`' if deleted_latex else ''}") + logger.info( + f"{deleted_latex} non-essential LaTeX files deleted.{' To keep these LaTeX files, try passing in `--no_latex_cleanup`' if deleted_latex else ''}" + ) logger.info( f"Rendered {str(self)}\nPlayed {self.renderer.num_plays} animations", ) diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index fe71e94393..1459875edf 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -126,14 +126,10 @@ def init_output_directories(self, scene_name): self.image_file_path = image_dir / add_extension_if_not_present( self.output_name, ".png" ) - + self.tex_files_directory = guarantee_existence( - config.get_dir( - "tex_dir", - module_name=module_name, - scene_name=scene_name - ) - ) + config.get_dir("tex_dir", module_name=module_name, scene_name=scene_name) + ) if write_to_movie(): movie_dir = guarantee_existence( @@ -181,25 +177,25 @@ def init_output_directories(self, scene_name): ) def delete_tex_files(self, additional_endings: list[str] = ()) -> int: - '''Deletes the .dvi, .aux, .log, and .tex files produced when using `Tex` or `MathTex` - + """Deletes the .dvi, .aux, .log, and .tex files produced when using `Tex` or `MathTex` + Parameters: ----------- additional_endings Additional Endings to remove in Tex folder - + Returns: -------- :class:`int` How many files were deleted - ''' + """ file_endings = (".dvi", ".aux", ".log", ".tex", *additional_endings) files_deleted = 0 for file_name in self.tex_files_directory.iterdir(): file = self.tex_files_directory / file_name - if any(file.suffix==s for s in file_endings): + if any(file.suffix == s for s in file_endings): file.unlink() - files_deleted+=1 + files_deleted += 1 return files_deleted def finish_last_section(self) -> None: From 7f1c735d1b3519e9f2a634743af80498960354f2 Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Wed, 9 Aug 2023 15:43:15 -0400 Subject: [PATCH 03/28] Fixed tests (hopefully), and whitelisted .tex --- manim/_config/utils.py | 2 +- manim/cli/render/global_options.py | 2 +- manim/scene/scene.py | 2 +- manim/scene/scene_file_writer.py | 46 ++++++++++++++++++------------ testing.py | 12 ++++++++ 5 files changed, 43 insertions(+), 21 deletions(-) create mode 100644 testing.py diff --git a/manim/_config/utils.py b/manim/_config/utils.py index bb6d7476f7..a807a28c3d 100644 --- a/manim/_config/utils.py +++ b/manim/_config/utils.py @@ -966,7 +966,7 @@ def digest_file(self, filename: str | os.PathLike) -> ManimConfig: no_latex_cleanup = property( lambda self: self._d["no_latex_cleanup"], lambda self, val: self._set_boolean("no_latex_cleanup", val), - doc="Deletes .aux, .dvi, .log, and .tex files produced by Tex and MathTex." + doc="Deletes .aux, .dvi, and .log files produced by Tex and MathTex." ) @property diff --git a/manim/cli/render/global_options.py b/manim/cli/render/global_options.py index b7789b052b..de16bd1472 100644 --- a/manim/cli/render/global_options.py +++ b/manim/cli/render/global_options.py @@ -105,7 +105,7 @@ def validate_gui_location(ctx, param, value): option( "--no_latex_cleanup", is_flag=True, - help="Deletes .aux, .dvi, .log, and .tex files produced by Tex and MathTex.", + help="Deletes .aux, .dvi, and .log files produced by Tex and MathTex.", default=False ), ) \ No newline at end of file diff --git a/manim/scene/scene.py b/manim/scene/scene.py index 6b34fa61b0..26e88a00cc 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -210,7 +210,7 @@ def __deepcopy__(self, clone_from_id): return result def delete_old_latex(self) -> int: - return self.renderer.file_writer.delete_tex_files() + return self.renderer.file_writer.delete_tex_files(self.__class__.__name__) def render(self, preview: bool = False): """ diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index fe71e94393..7f0f41e623 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -92,7 +92,7 @@ def __init__(self, renderer, scene_name, **kwargs): "or set path to the ffmpeg executable under the ffmpeg header in Manim's configuration." ) - def init_output_directories(self, scene_name): + def init_output_directories(self, scene_name: str): """Initialise output directories. Notes @@ -127,13 +127,6 @@ def init_output_directories(self, scene_name): self.output_name, ".png" ) - self.tex_files_directory = guarantee_existence( - config.get_dir( - "tex_dir", - module_name=module_name, - scene_name=scene_name - ) - ) if write_to_movie(): movie_dir = guarantee_existence( @@ -180,11 +173,13 @@ def init_output_directories(self, scene_name): scene_name=scene_name, module_name=module_name, log_dir=log_dir ) - def delete_tex_files(self, additional_endings: list[str] = ()) -> int: - '''Deletes the .dvi, .aux, .log, and .tex files produced when using `Tex` or `MathTex` + def delete_tex_files(self, scene_name: str, additional_endings: tuple[str] = ()) -> int: + '''Deletes the .dvi, .aux, and .log files produced when using `Tex` or `MathTex` Parameters: ----------- + scene_name + Name of class inheriting from `Scene` additional_endings Additional Endings to remove in Tex folder @@ -193,14 +188,29 @@ def delete_tex_files(self, additional_endings: list[str] = ()) -> int: :class:`int` How many files were deleted ''' - file_endings = (".dvi", ".aux", ".log", ".tex", *additional_endings) - files_deleted = 0 - for file_name in self.tex_files_directory.iterdir(): - file = self.tex_files_directory / file_name - if any(file.suffix==s for s in file_endings): - file.unlink() - files_deleted+=1 - return files_deleted + # ideally placed in self.init_output_directories, but when running tests that method isn't called? + # resulting in an AttributeError. Instead, just get directory here. + try: + tex_files_directory = guarantee_existence( + config.get_dir( + "tex_dir", + module_name=config.get_dir("input_file").stem if config["input_file"] else '', + scene_name=scene_name + ) + ) + + + file_endings = (".dvi", ".aux", ".log", *additional_endings) + files_deleted = 0 + for file_name in tex_files_directory.iterdir(): + file = tex_files_directory / file_name + if any(file.suffix==s for s in file_endings): + file.unlink() + files_deleted+=1 + return files_deleted + except Exception as e: + logger.info("An error occured while trying to clean up LaTeX files") + return 0 def finish_last_section(self) -> None: """Delete current section if it is empty.""" diff --git a/testing.py b/testing.py new file mode 100644 index 0000000000..90504ba8e3 --- /dev/null +++ b/testing.py @@ -0,0 +1,12 @@ +from manim import * + + +class T(Scene): + def construct(self): + banner = ManimBanner() + self.play(banner.create(), run_time=0.5) + self.play(banner.expand(), run_time=0.5) + +if __name__ == "__main__": + with tempconfig({}): + T().render() From e2b848937641547dff85ded89683fe8484d6ffbc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 9 Aug 2023 19:48:31 +0000 Subject: [PATCH 04/28] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/scene/scene.py | 2 +- manim/scene/scene_file_writer.py | 11 +++++------ testing.py | 1 + 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manim/scene/scene.py b/manim/scene/scene.py index e84045bdd3..e1d7266b5e 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -209,7 +209,7 @@ def __deepcopy__(self, clone_from_id): result.mobject_updater_lists.append((mobject_clone, cloned_updaters)) return result - def delete_old_latex(self) -> int: + def delete_old_latex(self) -> int: return self.renderer.file_writer.delete_tex_files(self.__class__.__name__) def render(self, preview: bool = False): diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index b0b7cbb1b5..4c55663d14 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -126,7 +126,6 @@ def init_output_directories(self, scene_name: str): self.image_file_path = image_dir / add_extension_if_not_present( self.output_name, ".png" ) - if write_to_movie(): movie_dir = guarantee_existence( @@ -174,8 +173,8 @@ def init_output_directories(self, scene_name: str): ) def delete_tex_files(self, additional_endings: list[str] = ()) -> int: - '''Deletes the .dvi, .aux, .log, and .tex files produced when using `Tex` or `MathTex` - + """Deletes the .dvi, .aux, .log, and .tex files produced when using `Tex` or `MathTex` + Parameters: ----------- scene_name @@ -187,14 +186,14 @@ def delete_tex_files(self, additional_endings: list[str] = ()) -> int: -------- :class:`int` How many files were deleted - ''' + """ file_endings = (".dvi", ".aux", ".log", ".tex", *additional_endings) files_deleted = 0 for file_name in self.tex_files_directory.iterdir(): file = self.tex_files_directory / file_name - if any(file.suffix==s for s in file_endings): + if any(file.suffix == s for s in file_endings): file.unlink() - files_deleted+=1 + files_deleted += 1 return files_deleted def finish_last_section(self) -> None: diff --git a/testing.py b/testing.py index 90504ba8e3..3501047772 100644 --- a/testing.py +++ b/testing.py @@ -7,6 +7,7 @@ def construct(self): self.play(banner.create(), run_time=0.5) self.play(banner.expand(), run_time=0.5) + if __name__ == "__main__": with tempconfig({}): T().render() From e29473b990de3dc5ad87087c26fcf2fe7e6ffda9 Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Wed, 9 Aug 2023 15:51:45 -0400 Subject: [PATCH 05/28] reverted weird changes from merge --- manim/mobject/opengl/opengl_image_mobject.py | 2 +- manim/mobject/opengl/opengl_surface.py | 2 +- manim/mobject/svg/svg_mobject.py | 2 +- testing.py | 13 ------------- 4 files changed, 3 insertions(+), 16 deletions(-) delete mode 100644 testing.py diff --git a/manim/mobject/opengl/opengl_image_mobject.py b/manim/mobject/opengl/opengl_image_mobject.py index 96d69e4a18..7f2828712f 100644 --- a/manim/mobject/opengl/opengl_image_mobject.py +++ b/manim/mobject/opengl/opengl_image_mobject.py @@ -29,7 +29,7 @@ def __init__( ): self.image = filename_or_array self.resampling_algorithm = resampling_algorithm - if type(filename_or_array) == np.ndarray: + if isinstance(filename_or_array, np.ndarray): self.size = self.image.shape[1::-1] elif isinstance(filename_or_array, (str, Path)): path = get_full_raster_image_path(filename_or_array) diff --git a/manim/mobject/opengl/opengl_surface.py b/manim/mobject/opengl/opengl_surface.py index 6a1672b59b..adb4fe2d6d 100644 --- a/manim/mobject/opengl/opengl_surface.py +++ b/manim/mobject/opengl/opengl_surface.py @@ -380,7 +380,7 @@ def __init__( if not isinstance(uv_surface, OpenGLSurface): raise Exception("uv_surface must be of type OpenGLSurface") - if type(image_file) == np.ndarray: + if isinstance(image_file, np.ndarray): image_file = change_to_rgba_array(image_file) # Set texture information diff --git a/manim/mobject/svg/svg_mobject.py b/manim/mobject/svg/svg_mobject.py index 8793275b6d..18d0a54aa9 100644 --- a/manim/mobject/svg/svg_mobject.py +++ b/manim/mobject/svg/svg_mobject.py @@ -280,7 +280,7 @@ def get_mobjects_from(self, svg: se.SVG) -> list[VMobject]: mob = self.polyline_to_mobject(shape) elif isinstance(shape, se.Text): mob = self.text_to_mobject(shape) - elif isinstance(shape, se.Use) or type(shape) == se.SVGElement: + elif isinstance(shape, se.Use) or type(shape) is se.SVGElement: continue else: logger.warning(f"Unsupported element type: {type(shape)}") diff --git a/testing.py b/testing.py deleted file mode 100644 index 3501047772..0000000000 --- a/testing.py +++ /dev/null @@ -1,13 +0,0 @@ -from manim import * - - -class T(Scene): - def construct(self): - banner = ManimBanner() - self.play(banner.create(), run_time=0.5) - self.play(banner.expand(), run_time=0.5) - - -if __name__ == "__main__": - with tempconfig({}): - T().render() From b23c30dee6addcbac51de44bf3b2efc09575f948 Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Wed, 9 Aug 2023 16:03:55 -0400 Subject: [PATCH 06/28] See previous commit message --- manim/_config/utils.py | 2 +- manim/scene/scene.py | 4 +--- manim/scene/scene_file_writer.py | 41 ++++++++++++++++++++++---------- testing.py | 9 +++++++ 4 files changed, 39 insertions(+), 17 deletions(-) create mode 100644 testing.py diff --git a/manim/_config/utils.py b/manim/_config/utils.py index 840f323dcf..b57b33500a 100644 --- a/manim/_config/utils.py +++ b/manim/_config/utils.py @@ -966,7 +966,7 @@ def digest_file(self, filename: str | os.PathLike) -> ManimConfig: no_latex_cleanup = property( lambda self: self._d["no_latex_cleanup"], lambda self, val: self._set_boolean("no_latex_cleanup", val), - doc="Deletes .aux, .dvi, and .log files produced by Tex and MathTex.", + doc="Deletes .aux, .dvi, and .log files produced by Tex and MathTex." ) @property diff --git a/manim/scene/scene.py b/manim/scene/scene.py index e1d7266b5e..7756fbcb1b 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -242,9 +242,7 @@ def render(self, preview: bool = False): or config["format"] == "png" or config["save_last_frame"] ): - logger.info( - f"{deleted_latex} non-essential LaTeX files deleted.{' To keep these LaTeX files, try passing in `--no_latex_cleanup`' if deleted_latex else ''}" - ) + logger.info(f"{deleted_latex} non-essential LaTeX files deleted.{' To keep these LaTeX files, try passing in `--no_latex_cleanup`' if deleted_latex else ''}") logger.info( f"Rendered {str(self)}\nPlayed {self.renderer.num_plays} animations", ) diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index 4c55663d14..003ef9e26d 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -172,29 +172,44 @@ def init_output_directories(self, scene_name: str): scene_name=scene_name, module_name=module_name, log_dir=log_dir ) - def delete_tex_files(self, additional_endings: list[str] = ()) -> int: - """Deletes the .dvi, .aux, .log, and .tex files produced when using `Tex` or `MathTex` - + def delete_tex_files(self, scene_name: str, additional_endings: tuple[str] = ()) -> int: + '''Deletes the .dvi, .aux, and .log files produced when using `Tex` or `MathTex` + Parameters: ----------- scene_name Name of class inheriting from `Scene` additional_endings Additional Endings to remove in Tex folder - + Returns: -------- :class:`int` How many files were deleted - """ - file_endings = (".dvi", ".aux", ".log", ".tex", *additional_endings) - files_deleted = 0 - for file_name in self.tex_files_directory.iterdir(): - file = self.tex_files_directory / file_name - if any(file.suffix == s for s in file_endings): - file.unlink() - files_deleted += 1 - return files_deleted + ''' + # ideally placed in self.init_output_directories, but when running tests that method isn't called? + # resulting in an AttributeError. Instead, just get directory here. + try: + tex_files_directory = guarantee_existence( + config.get_dir( + "tex_dir", + module_name=config.get_dir("input_file").stem if config["input_file"] else '', + scene_name=scene_name + ) + ) + + + file_endings = (".dvi", ".aux", ".log", *additional_endings) + files_deleted = 0 + for file_name in tex_files_directory.iterdir(): + file = tex_files_directory / file_name + if any(file.suffix==s for s in file_endings): + file.unlink() + files_deleted+=1 + return files_deleted + except Exception as e: + logger.info("An error occured while trying to clean up LaTeX files") + return 0 def finish_last_section(self) -> None: """Delete current section if it is empty.""" diff --git a/testing.py b/testing.py new file mode 100644 index 0000000000..2e95dca561 --- /dev/null +++ b/testing.py @@ -0,0 +1,9 @@ +from manim import * + + +class T(Scene): + def construct(self): + self.play(Write(MathTex("x^n+1"))) + +if __name__ == "__main__": + T().render() \ No newline at end of file From 5c39ce18d234750d2360918d9e8a3aa84be28d88 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 9 Aug 2023 20:04:38 +0000 Subject: [PATCH 07/28] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/_config/utils.py | 2 +- manim/scene/scene.py | 4 +++- manim/scene/scene_file_writer.py | 31 +++++++++++++++++-------------- testing.py | 5 +++-- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/manim/_config/utils.py b/manim/_config/utils.py index b57b33500a..840f323dcf 100644 --- a/manim/_config/utils.py +++ b/manim/_config/utils.py @@ -966,7 +966,7 @@ def digest_file(self, filename: str | os.PathLike) -> ManimConfig: no_latex_cleanup = property( lambda self: self._d["no_latex_cleanup"], lambda self, val: self._set_boolean("no_latex_cleanup", val), - doc="Deletes .aux, .dvi, and .log files produced by Tex and MathTex." + doc="Deletes .aux, .dvi, and .log files produced by Tex and MathTex.", ) @property diff --git a/manim/scene/scene.py b/manim/scene/scene.py index 7756fbcb1b..e1d7266b5e 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -242,7 +242,9 @@ def render(self, preview: bool = False): or config["format"] == "png" or config["save_last_frame"] ): - logger.info(f"{deleted_latex} non-essential LaTeX files deleted.{' To keep these LaTeX files, try passing in `--no_latex_cleanup`' if deleted_latex else ''}") + logger.info( + f"{deleted_latex} non-essential LaTeX files deleted.{' To keep these LaTeX files, try passing in `--no_latex_cleanup`' if deleted_latex else ''}" + ) logger.info( f"Rendered {str(self)}\nPlayed {self.renderer.num_plays} animations", ) diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index 003ef9e26d..6d8e89d3a4 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -172,40 +172,43 @@ def init_output_directories(self, scene_name: str): scene_name=scene_name, module_name=module_name, log_dir=log_dir ) - def delete_tex_files(self, scene_name: str, additional_endings: tuple[str] = ()) -> int: - '''Deletes the .dvi, .aux, and .log files produced when using `Tex` or `MathTex` - + def delete_tex_files( + self, scene_name: str, additional_endings: tuple[str] = () + ) -> int: + """Deletes the .dvi, .aux, and .log files produced when using `Tex` or `MathTex` + Parameters: ----------- scene_name Name of class inheriting from `Scene` additional_endings Additional Endings to remove in Tex folder - + Returns: -------- :class:`int` How many files were deleted - ''' + """ # ideally placed in self.init_output_directories, but when running tests that method isn't called? # resulting in an AttributeError. Instead, just get directory here. try: tex_files_directory = guarantee_existence( - config.get_dir( - "tex_dir", - module_name=config.get_dir("input_file").stem if config["input_file"] else '', - scene_name=scene_name - ) + config.get_dir( + "tex_dir", + module_name=config.get_dir("input_file").stem + if config["input_file"] + else "", + scene_name=scene_name, ) - - + ) + file_endings = (".dvi", ".aux", ".log", *additional_endings) files_deleted = 0 for file_name in tex_files_directory.iterdir(): file = tex_files_directory / file_name - if any(file.suffix==s for s in file_endings): + if any(file.suffix == s for s in file_endings): file.unlink() - files_deleted+=1 + files_deleted += 1 return files_deleted except Exception as e: logger.info("An error occured while trying to clean up LaTeX files") diff --git a/testing.py b/testing.py index 2e95dca561..d6d2384653 100644 --- a/testing.py +++ b/testing.py @@ -4,6 +4,7 @@ class T(Scene): def construct(self): self.play(Write(MathTex("x^n+1"))) - + + if __name__ == "__main__": - T().render() \ No newline at end of file + T().render() From 57503606c6df8a801d9bc9d6cd609280689a4f60 Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Wed, 9 Aug 2023 16:14:49 -0400 Subject: [PATCH 08/28] Fixed logs-too-long test --- manim/scene/scene.py | 5 +---- testing.py | 10 ---------- 2 files changed, 1 insertion(+), 14 deletions(-) delete mode 100644 testing.py diff --git a/manim/scene/scene.py b/manim/scene/scene.py index e1d7266b5e..0d48e433f5 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -243,10 +243,7 @@ def render(self, preview: bool = False): or config["save_last_frame"] ): logger.info( - f"{deleted_latex} non-essential LaTeX files deleted.{' To keep these LaTeX files, try passing in `--no_latex_cleanup`' if deleted_latex else ''}" - ) - logger.info( - f"Rendered {str(self)}\nPlayed {self.renderer.num_plays} animations", + f"Rendered {str(self)}\nPlayed {self.renderer.num_plays} animations\n{deleted_latex} non-essential LaTeX files deleted.{' To keep these LaTeX files, try passing in `--no_latex_cleanup`' if deleted_latex else ''}", ) # If preview open up the render after rendering. diff --git a/testing.py b/testing.py deleted file mode 100644 index d6d2384653..0000000000 --- a/testing.py +++ /dev/null @@ -1,10 +0,0 @@ -from manim import * - - -class T(Scene): - def construct(self): - self.play(Write(MathTex("x^n+1"))) - - -if __name__ == "__main__": - T().render() From 227c269e7a6425034b7a4844aa28eda57fe9afcf Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Wed, 9 Aug 2023 16:23:35 -0400 Subject: [PATCH 09/28] Fixed log output --- manim/scene/scene.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/manim/scene/scene.py b/manim/scene/scene.py index 0d48e433f5..fa147d33e0 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -242,8 +242,10 @@ def render(self, preview: bool = False): or config["format"] == "png" or config["save_last_frame"] ): + # Maybe add this logging output to tests? + # logger.info(f"{deleted_latex} non-essential LaTeX files deleted.{' To keep these LaTeX files, try passing in `--no_latex_cleanup`' if deleted_latex else ''}") logger.info( - f"Rendered {str(self)}\nPlayed {self.renderer.num_plays} animations\n{deleted_latex} non-essential LaTeX files deleted.{' To keep these LaTeX files, try passing in `--no_latex_cleanup`' if deleted_latex else ''}", + f"Rendered {str(self)}\nPlayed {self.renderer.num_plays} animations", ) # If preview open up the render after rendering. From 7958f5f2b0216f01a7ed6d136f584d9f573c6f56 Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Wed, 9 Aug 2023 16:31:51 -0400 Subject: [PATCH 10/28] Fixed typo ;) --- manim/scene/scene_file_writer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index 6d8e89d3a4..af96e1d80b 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -211,7 +211,7 @@ def delete_tex_files( files_deleted += 1 return files_deleted except Exception as e: - logger.info("An error occured while trying to clean up LaTeX files") + logger.info("An error occurred while trying to clean up LaTeX files") return 0 def finish_last_section(self) -> None: From e4b2e01fedb9a397345c7dc7e928bb93c722dbba Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Wed, 9 Aug 2023 19:37:02 -0400 Subject: [PATCH 11/28] deleted unused variable --- manim/scene/scene.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manim/scene/scene.py b/manim/scene/scene.py index fa147d33e0..fea0186158 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -235,15 +235,15 @@ def render(self, preview: bool = False): # We have to reset these settings in case of multiple renders. self.renderer.scene_finished(self) - deleted_latex = self.delete_old_latex() if not config["no_latex_cleanup"] else 0 + if not config["no_latex_cleanup"]: + self.delete_old_latex() + # Show info only if animations are rendered or to get image if ( self.renderer.num_plays or config["format"] == "png" or config["save_last_frame"] ): - # Maybe add this logging output to tests? - # logger.info(f"{deleted_latex} non-essential LaTeX files deleted.{' To keep these LaTeX files, try passing in `--no_latex_cleanup`' if deleted_latex else ''}") logger.info( f"Rendered {str(self)}\nPlayed {self.renderer.num_plays} animations", ) From 7d1cccb48f2d94144d5d34b6db93780ebd5f5ad7 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 9 Aug 2023 23:37:44 +0000 Subject: [PATCH 12/28] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/scene/scene.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/scene/scene.py b/manim/scene/scene.py index fea0186158..6f3c60d4aa 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -237,7 +237,7 @@ def render(self, preview: bool = False): if not config["no_latex_cleanup"]: self.delete_old_latex() - + # Show info only if animations are rendered or to get image if ( self.renderer.num_plays From 03560b813a7aabaee192e0ce463652372b669d25 Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Thu, 10 Aug 2023 22:41:30 -0400 Subject: [PATCH 13/28] moved latex deletion to tex_file_writing.py --- manim/scene/scene.py | 3 --- manim/scene/scene_file_writer.py | 42 -------------------------------- manim/utils/tex_file_writing.py | 27 +++++++++++++++++++- 3 files changed, 26 insertions(+), 46 deletions(-) diff --git a/manim/scene/scene.py b/manim/scene/scene.py index 6f3c60d4aa..e98702ed7b 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -235,9 +235,6 @@ def render(self, preview: bool = False): # We have to reset these settings in case of multiple renders. self.renderer.scene_finished(self) - if not config["no_latex_cleanup"]: - self.delete_old_latex() - # Show info only if animations are rendered or to get image if ( self.renderer.num_plays diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index af96e1d80b..8ce285567d 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -172,48 +172,6 @@ def init_output_directories(self, scene_name: str): scene_name=scene_name, module_name=module_name, log_dir=log_dir ) - def delete_tex_files( - self, scene_name: str, additional_endings: tuple[str] = () - ) -> int: - """Deletes the .dvi, .aux, and .log files produced when using `Tex` or `MathTex` - - Parameters: - ----------- - scene_name - Name of class inheriting from `Scene` - additional_endings - Additional Endings to remove in Tex folder - - Returns: - -------- - :class:`int` - How many files were deleted - """ - # ideally placed in self.init_output_directories, but when running tests that method isn't called? - # resulting in an AttributeError. Instead, just get directory here. - try: - tex_files_directory = guarantee_existence( - config.get_dir( - "tex_dir", - module_name=config.get_dir("input_file").stem - if config["input_file"] - else "", - scene_name=scene_name, - ) - ) - - file_endings = (".dvi", ".aux", ".log", *additional_endings) - files_deleted = 0 - for file_name in tex_files_directory.iterdir(): - file = tex_files_directory / file_name - if any(file.suffix == s for s in file_endings): - file.unlink() - files_deleted += 1 - return files_deleted - except Exception as e: - logger.info("An error occurred while trying to clean up LaTeX files") - return 0 - def finish_last_section(self) -> None: """Delete current section if it is empty.""" if len(self.sections) and self.sections[-1].is_empty(): diff --git a/manim/utils/tex_file_writing.py b/manim/utils/tex_file_writing.py index 0f419bb9e9..940962d1bf 100644 --- a/manim/utils/tex_file_writing.py +++ b/manim/utils/tex_file_writing.py @@ -56,7 +56,10 @@ def tex_to_svg_file( tex_template.tex_compiler, tex_template.output_format, ) - return convert_to_svg(dvi_file, tex_template.output_format) + svg_file = convert_to_svg(dvi_file, tex_template.output_format) + if not config["no_latex_cleanup"]: + delete_tex_files() + return svg_file def generate_tex_file( @@ -250,6 +253,28 @@ def convert_to_svg(dvi_file: Path, extension: str, page: int = 1): return result +def delete_tex_files(additional_endings: tuple[str] = ()) -> None: + """Deletes the .dvi, .aux, and .log files produced when using `Tex` or `MathTex` + + Parameters: + ----------- + additional_endings + Additional Endings to remove in Tex folder + """ + def delete_file(f: Path): + f2 = Path(str(f)) + try: + f.unlink() + except FileNotFoundError: + newdir = tex_files_directory / f2 + newdir.unlink() + + tex_files_directory = config.get_dir("tex_dir") + + file_endings = (".dvi", ".aux", ".log", *additional_endings) + for file_name in tex_files_directory.iterdir(): + if any(file_name.suffix == s for s in file_endings): + file_name.unlink() def print_all_tex_errors(log_file: Path, tex_compiler: str, tex_file: Path) -> None: if not log_file.exists(): From 7f044cb622907a088fa7de03f85812600d0b23b9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 11 Aug 2023 02:42:10 +0000 Subject: [PATCH 14/28] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/utils/tex_file_writing.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/manim/utils/tex_file_writing.py b/manim/utils/tex_file_writing.py index 940962d1bf..5219ccc87a 100644 --- a/manim/utils/tex_file_writing.py +++ b/manim/utils/tex_file_writing.py @@ -253,6 +253,7 @@ def convert_to_svg(dvi_file: Path, extension: str, page: int = 1): return result + def delete_tex_files(additional_endings: tuple[str] = ()) -> None: """Deletes the .dvi, .aux, and .log files produced when using `Tex` or `MathTex` @@ -261,6 +262,7 @@ def delete_tex_files(additional_endings: tuple[str] = ()) -> None: additional_endings Additional Endings to remove in Tex folder """ + def delete_file(f: Path): f2 = Path(str(f)) try: @@ -268,7 +270,7 @@ def delete_file(f: Path): except FileNotFoundError: newdir = tex_files_directory / f2 newdir.unlink() - + tex_files_directory = config.get_dir("tex_dir") file_endings = (".dvi", ".aux", ".log", *additional_endings) @@ -276,6 +278,7 @@ def delete_file(f: Path): if any(file_name.suffix == s for s in file_endings): file_name.unlink() + def print_all_tex_errors(log_file: Path, tex_compiler: str, tex_file: Path) -> None: if not log_file.exists(): raise RuntimeError( From f888c5171029dac8e374d3654bda6d9aa79b85ea Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Thu, 10 Aug 2023 22:43:15 -0400 Subject: [PATCH 15/28] removed changes in scene files --- manim/scene/scene.py | 3 --- manim/scene/scene_file_writer.py | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/manim/scene/scene.py b/manim/scene/scene.py index e98702ed7b..5f3fb99247 100644 --- a/manim/scene/scene.py +++ b/manim/scene/scene.py @@ -209,9 +209,6 @@ def __deepcopy__(self, clone_from_id): result.mobject_updater_lists.append((mobject_clone, cloned_updaters)) return result - def delete_old_latex(self) -> int: - return self.renderer.file_writer.delete_tex_files(self.__class__.__name__) - def render(self, preview: bool = False): """ Renders this Scene. diff --git a/manim/scene/scene_file_writer.py b/manim/scene/scene_file_writer.py index 8ce285567d..d9e509de89 100644 --- a/manim/scene/scene_file_writer.py +++ b/manim/scene/scene_file_writer.py @@ -92,7 +92,7 @@ def __init__(self, renderer, scene_name, **kwargs): "or set path to the ffmpeg executable under the ffmpeg header in Manim's configuration." ) - def init_output_directories(self, scene_name: str): + def init_output_directories(self, scene_name): """Initialise output directories. Notes From 133ae4d1c6390d3a4c182f395ccd0052af7d0a1c Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Thu, 10 Aug 2023 23:40:59 -0400 Subject: [PATCH 16/28] Added caching based on LaTeX expression .svg --- manim/utils/tex_file_writing.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/manim/utils/tex_file_writing.py b/manim/utils/tex_file_writing.py index 5219ccc87a..ffe94cd015 100644 --- a/manim/utils/tex_file_writing.py +++ b/manim/utils/tex_file_writing.py @@ -50,7 +50,12 @@ def tex_to_svg_file( """ if tex_template is None: tex_template = config["tex_template"] - tex_file = generate_tex_file(expression, environment, tex_template) + tex_file, svg = generate_tex_file(expression, environment, tex_template) + + # check if svg already exists + if isinstance(svg, Path): + return svg + dvi_file = compile_tex( tex_file, tex_template.tex_compiler, @@ -66,9 +71,10 @@ def generate_tex_file( expression: str, environment: str | None = None, tex_template: TexTemplate | None = None, -): +) -> tuple[Path, Path | None]: """Takes a tex expression (and an optional tex environment), and returns a fully formed tex file ready for compilation. + Along the way, checks if an svg file for the expression already exists. Parameters ---------- @@ -83,6 +89,9 @@ def generate_tex_file( ------- :class:`Path` Path to generated TeX file + + :class:`Path` | `None` + Path to svg file if it exists, else None """ if tex_template is None: tex_template = config["tex_template"] @@ -95,14 +104,21 @@ def generate_tex_file( if not tex_dir.exists(): tex_dir.mkdir() - result = tex_dir / (tex_hash(output) + ".tex") + output_hash = tex_hash(output) + # check if svg for expression already exists + svg_path = tex_dir / (output_hash + ".svg") + if svg_path.exists(): + # svg for expression found + return "_", svg_path + + result = tex_dir / (output_hash + ".tex") if not result.exists(): logger.info( "Writing %(expression)s to %(path)s", {"expression": expression, "path": f"{result}"}, ) result.write_text(output, encoding="utf-8") - return result + return result, None def tex_compilation_command( From 5a14356ddf7dda055e0231809801ae86ab35dfb8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 11 Aug 2023 03:41:40 +0000 Subject: [PATCH 17/28] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/utils/tex_file_writing.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/manim/utils/tex_file_writing.py b/manim/utils/tex_file_writing.py index ffe94cd015..cb1edeefb4 100644 --- a/manim/utils/tex_file_writing.py +++ b/manim/utils/tex_file_writing.py @@ -51,11 +51,11 @@ def tex_to_svg_file( if tex_template is None: tex_template = config["tex_template"] tex_file, svg = generate_tex_file(expression, environment, tex_template) - + # check if svg already exists if isinstance(svg, Path): return svg - + dvi_file = compile_tex( tex_file, tex_template.tex_compiler, @@ -89,7 +89,7 @@ def generate_tex_file( ------- :class:`Path` Path to generated TeX file - + :class:`Path` | `None` Path to svg file if it exists, else None """ @@ -110,7 +110,7 @@ def generate_tex_file( if svg_path.exists(): # svg for expression found return "_", svg_path - + result = tex_dir / (output_hash + ".tex") if not result.exists(): logger.info( From 009d551a2d851de7610c53ebc40469951f66ea61 Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Fri, 11 Aug 2023 09:54:45 -0400 Subject: [PATCH 18/28] Deleted unused function in delete_old_tex --- manim/utils/tex_file_writing.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/manim/utils/tex_file_writing.py b/manim/utils/tex_file_writing.py index cb1edeefb4..a994edaaba 100644 --- a/manim/utils/tex_file_writing.py +++ b/manim/utils/tex_file_writing.py @@ -63,7 +63,7 @@ def tex_to_svg_file( ) svg_file = convert_to_svg(dvi_file, tex_template.output_format) if not config["no_latex_cleanup"]: - delete_tex_files() + delete_nonsvg_files() return svg_file @@ -270,7 +270,7 @@ def convert_to_svg(dvi_file: Path, extension: str, page: int = 1): return result -def delete_tex_files(additional_endings: tuple[str] = ()) -> None: +def delete_nonsvg_files(additional_endings: tuple[str] = ()) -> None: """Deletes the .dvi, .aux, and .log files produced when using `Tex` or `MathTex` Parameters: @@ -279,14 +279,6 @@ def delete_tex_files(additional_endings: tuple[str] = ()) -> None: Additional Endings to remove in Tex folder """ - def delete_file(f: Path): - f2 = Path(str(f)) - try: - f.unlink() - except FileNotFoundError: - newdir = tex_files_directory / f2 - newdir.unlink() - tex_files_directory = config.get_dir("tex_dir") file_endings = (".dvi", ".aux", ".log", *additional_endings) From bf9f12c5bba6e7a39350733a1e0b5bc1936e5f85 Mon Sep 17 00:00:00 2001 From: Jason Grace <110117391+JasonGrace2282@users.noreply.github.com> Date: Fri, 11 Aug 2023 17:27:11 -0400 Subject: [PATCH 19/28] make if condition more readable Co-authored-by: Benjamin Hackl --- manim/utils/tex_file_writing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/utils/tex_file_writing.py b/manim/utils/tex_file_writing.py index a994edaaba..8597fb7b91 100644 --- a/manim/utils/tex_file_writing.py +++ b/manim/utils/tex_file_writing.py @@ -283,7 +283,7 @@ def delete_nonsvg_files(additional_endings: tuple[str] = ()) -> None: file_endings = (".dvi", ".aux", ".log", *additional_endings) for file_name in tex_files_directory.iterdir(): - if any(file_name.suffix == s for s in file_endings): + if file_name.suffix in file_endings: file_name.unlink() From d6bab492328c3752cb7d8f5ab0799db4e3b62a27 Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Fri, 11 Aug 2023 18:05:51 -0400 Subject: [PATCH 20/28] cleaned up svg file check --- manim/utils/tex_file_writing.py | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/manim/utils/tex_file_writing.py b/manim/utils/tex_file_writing.py index a994edaaba..4e91a20dbb 100644 --- a/manim/utils/tex_file_writing.py +++ b/manim/utils/tex_file_writing.py @@ -50,11 +50,12 @@ def tex_to_svg_file( """ if tex_template is None: tex_template = config["tex_template"] - tex_file, svg = generate_tex_file(expression, environment, tex_template) + tex_file = generate_tex_file(expression, environment, tex_template) # check if svg already exists - if isinstance(svg, Path): - return svg + svg_file = tex_file.with_suffix(".svg") + if svg_file.exists(): + return svg_file dvi_file = compile_tex( tex_file, @@ -71,7 +72,7 @@ def generate_tex_file( expression: str, environment: str | None = None, tex_template: TexTemplate | None = None, -) -> tuple[Path, Path | None]: +) -> Path: """Takes a tex expression (and an optional tex environment), and returns a fully formed tex file ready for compilation. Along the way, checks if an svg file for the expression already exists. @@ -89,9 +90,6 @@ def generate_tex_file( ------- :class:`Path` Path to generated TeX file - - :class:`Path` | `None` - Path to svg file if it exists, else None """ if tex_template is None: tex_template = config["tex_template"] @@ -104,21 +102,14 @@ def generate_tex_file( if not tex_dir.exists(): tex_dir.mkdir() - output_hash = tex_hash(output) - # check if svg for expression already exists - svg_path = tex_dir / (output_hash + ".svg") - if svg_path.exists(): - # svg for expression found - return "_", svg_path - - result = tex_dir / (output_hash + ".tex") + result = tex_dir / (tex_hash(output) + ".tex") if not result.exists(): logger.info( "Writing %(expression)s to %(path)s", {"expression": expression, "path": f"{result}"}, ) result.write_text(output, encoding="utf-8") - return result, None + return result def tex_compilation_command( From 9a0240e69bc1a9cf47b9351e086269cd637cd3eb Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Sat, 12 Aug 2023 08:43:00 -0400 Subject: [PATCH 21/28] changed blacklist -> whitelist for file endings --- manim/utils/tex_file_writing.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/manim/utils/tex_file_writing.py b/manim/utils/tex_file_writing.py index f48bf7514a..61ef38d96e 100644 --- a/manim/utils/tex_file_writing.py +++ b/manim/utils/tex_file_writing.py @@ -13,6 +13,7 @@ import re import unicodedata from pathlib import Path +from typing import Iterable from manim.utils.tex import TexTemplate @@ -261,21 +262,21 @@ def convert_to_svg(dvi_file: Path, extension: str, page: int = 1): return result -def delete_nonsvg_files(additional_endings: tuple[str] = ()) -> None: - """Deletes the .dvi, .aux, and .log files produced when using `Tex` or `MathTex` +def delete_nonsvg_files(additional_endings: Iterable[str] = ()) -> None: + """Deletes every file that does not have a suffix in ``(".svg", ".log", *additional_endings)`` Parameters: ----------- additional_endings - Additional Endings to remove in Tex folder + Additional endings to whitelist """ - tex_files_directory = config.get_dir("tex_dir") - - file_endings = (".dvi", ".aux", ".log", *additional_endings) - for file_name in tex_files_directory.iterdir(): - if file_name.suffix in file_endings: - file_name.unlink() + tex_dir = config.get_dir("tex_dir") + file_suffix_whitelist = (".svg", ".tex", *additional_endings) + + for f in tex_dir.iterdir(): + if f.suffix not in file_suffix_whitelist: + f.unlink() def print_all_tex_errors(log_file: Path, tex_compiler: str, tex_file: Path) -> None: From 205b8045f0f8690df21029367beec25fb85fd712 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 12 Aug 2023 12:43:42 +0000 Subject: [PATCH 22/28] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- manim/utils/tex_file_writing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/utils/tex_file_writing.py b/manim/utils/tex_file_writing.py index 61ef38d96e..c9cbd91d3d 100644 --- a/manim/utils/tex_file_writing.py +++ b/manim/utils/tex_file_writing.py @@ -273,7 +273,7 @@ def delete_nonsvg_files(additional_endings: Iterable[str] = ()) -> None: tex_dir = config.get_dir("tex_dir") file_suffix_whitelist = (".svg", ".tex", *additional_endings) - + for f in tex_dir.iterdir(): if f.suffix not in file_suffix_whitelist: f.unlink() From e323c08d39ae41535f5c5d69adb4913ef65c99aa Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Sat, 12 Aug 2023 08:44:22 -0400 Subject: [PATCH 23/28] Reverted docstring change --- manim/utils/tex_file_writing.py | 1 - 1 file changed, 1 deletion(-) diff --git a/manim/utils/tex_file_writing.py b/manim/utils/tex_file_writing.py index 61ef38d96e..c5f7c4305c 100644 --- a/manim/utils/tex_file_writing.py +++ b/manim/utils/tex_file_writing.py @@ -76,7 +76,6 @@ def generate_tex_file( ) -> Path: """Takes a tex expression (and an optional tex environment), and returns a fully formed tex file ready for compilation. - Along the way, checks if an svg file for the expression already exists. Parameters ---------- From 6be5927e0c935f6965203575685b103ae0658f0c Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Sat, 12 Aug 2023 08:45:19 -0400 Subject: [PATCH 24/28] Updated delete_non_svg files docstring --- manim/utils/tex_file_writing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/utils/tex_file_writing.py b/manim/utils/tex_file_writing.py index c3382988bf..402452080d 100644 --- a/manim/utils/tex_file_writing.py +++ b/manim/utils/tex_file_writing.py @@ -262,7 +262,7 @@ def convert_to_svg(dvi_file: Path, extension: str, page: int = 1): def delete_nonsvg_files(additional_endings: Iterable[str] = ()) -> None: - """Deletes every file that does not have a suffix in ``(".svg", ".log", *additional_endings)`` + """Deletes every file that does not have a suffix in ``(".svg", ".tex", *additional_endings)`` Parameters: ----------- From 40257f72715291914154f1d2ca5e4c6b2d3fd597 Mon Sep 17 00:00:00 2001 From: JasonGrace2282 Date: Sat, 12 Aug 2023 08:47:39 -0400 Subject: [PATCH 25/28] Changed list to a set --- manim/utils/tex_file_writing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/utils/tex_file_writing.py b/manim/utils/tex_file_writing.py index 402452080d..c7758f899e 100644 --- a/manim/utils/tex_file_writing.py +++ b/manim/utils/tex_file_writing.py @@ -271,7 +271,7 @@ def delete_nonsvg_files(additional_endings: Iterable[str] = ()) -> None: """ tex_dir = config.get_dir("tex_dir") - file_suffix_whitelist = (".svg", ".tex", *additional_endings) + file_suffix_whitelist = {".svg", ".tex", *additional_endings} for f in tex_dir.iterdir(): if f.suffix not in file_suffix_whitelist: From 613bea2e660bafa5e7b3013262d3d0f26b6256e9 Mon Sep 17 00:00:00 2001 From: Tristan Schulz Date: Sat, 4 Nov 2023 13:55:30 +0100 Subject: [PATCH 26/28] Update manim/_config/utils.py --- manim/_config/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/_config/utils.py b/manim/_config/utils.py index 840f323dcf..0d86ee7818 100644 --- a/manim/_config/utils.py +++ b/manim/_config/utils.py @@ -966,7 +966,7 @@ def digest_file(self, filename: str | os.PathLike) -> ManimConfig: no_latex_cleanup = property( lambda self: self._d["no_latex_cleanup"], lambda self, val: self._set_boolean("no_latex_cleanup", val), - doc="Deletes .aux, .dvi, and .log files produced by Tex and MathTex.", + doc="Prevents deletion of .aux, .dvi, and .log files produced by Tex and MathTex.", ) @property From fd81de72d6025b111e86cba38eefedfdbc53ad06 Mon Sep 17 00:00:00 2001 From: Tristan Schulz Date: Sat, 4 Nov 2023 13:55:36 +0100 Subject: [PATCH 27/28] Update manim/cli/render/global_options.py --- manim/cli/render/global_options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manim/cli/render/global_options.py b/manim/cli/render/global_options.py index 37ac886aab..17c754e623 100644 --- a/manim/cli/render/global_options.py +++ b/manim/cli/render/global_options.py @@ -105,7 +105,7 @@ def validate_gui_location(ctx, param, value): option( "--no_latex_cleanup", is_flag=True, - help="Deletes .aux, .dvi, and .log files produced by Tex and MathTex.", + help="Prevents deletion of .aux, .dvi, and .log files produced by Tex and MathTex.", default=False, ), ) From a91cf074cff044b2f4333e25dd276d691637bec2 Mon Sep 17 00:00:00 2001 From: Benjamin Hackl Date: Sat, 4 Nov 2023 14:52:13 +0100 Subject: [PATCH 28/28] added one test for the no_latex_cleanup config option --- tests/module/mobject/text/test_texmobject.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/module/mobject/text/test_texmobject.py b/tests/module/mobject/text/test_texmobject.py index 9103345d18..a3cf26c355 100644 --- a/tests/module/mobject/text/test_texmobject.py +++ b/tests/module/mobject/text/test_texmobject.py @@ -212,3 +212,17 @@ def test_tempconfig_resetting_tex_template(): assert config.tex_template.preamble == "Custom preamble!" assert config.tex_template.preamble != "Custom preamble!" + + +def test_tex_garbage_collection(tmpdir, monkeypatch): + monkeypatch.chdir(tmpdir) + Path(tmpdir, "media").mkdir() + + with tempconfig({"media_dir": "media"}): + tex_without_log = Tex("Hello World!") # f7bc61042256dea9.tex + assert Path("media", "Tex", "f7bc61042256dea9.tex").exists() + assert not Path("media", "Tex", "f7bc61042256dea9.log").exists() + + with tempconfig({"media_dir": "media", "no_latex_cleanup": True}): + tex_with_log = Tex("Hello World, again!") # 3ef79eaaa2d0b15b.tex + assert Path("media", "Tex", "3ef79eaaa2d0b15b.log").exists()