Fix dependency on manim for tests This fixes a circular dependency between manim and manimpango. Extracted from upstream: https://github.com/ManimCommunity/ManimPango/commit/7e2b17aa14b10bd58af0598cc2de51a406682797 diff --git a/tests/_manim.py b/tests/_manim.py index 3ea4676..b11d3e9 100644 --- a/tests/_manim.py +++ b/tests/_manim.py @@ -2,11 +2,12 @@ """This file contains helpers for the tests copied and modified from Manim. """ - +import copy import os +import re from pathlib import Path -from manimpango import Alignment, MarkupUtils +from manimpango import Alignment, MarkupUtils, TextSetting, text2svg class MarkupText: @@ -104,3 +105,115 @@ class MarkupText: def __repr__(self): return f"MarkupText({repr(self.original_text)})" + + +class Text: + def __init__( + self, + text: str, + fill_opacity: float = 1.0, + stroke_width: int = 0, + size: int = 1, + line_spacing: int = -1, + font: str = "", + slant: str = "NORMAL", + weight: str = "NORMAL", + gradient: tuple = None, + tab_width: int = 4, + disable_ligatures: bool = False, + filename: str = "text.svg", + **kwargs, + ) -> None: + self.size = size + self.filename = filename + self.line_spacing = line_spacing + self.font = font + self.slant = slant + self.weight = weight + self.gradient = gradient + self.tab_width = tab_width + self.original_text = text + self.disable_ligatures = disable_ligatures + text_without_tabs = text + self.t2f = self.t2s = self.t2w = {} + if text.find("\t") != -1: + text_without_tabs = text.replace("\t", " " * self.tab_width) + self.text = text_without_tabs + if self.line_spacing == -1: + self.line_spacing = self.size + self.size * 0.3 + else: + self.line_spacing = self.size + self.size * self.line_spacing + self.text2svg() + + def text2settings(self): + """Internally used function. Converts the texts and styles + to a setting for parsing.""" + settings = [] + t2x = [self.t2f, self.t2s, self.t2w] + for i in range(len(t2x)): + fsw = [self.font, self.slant, self.weight] + if t2x[i]: + for word, x in list(t2x[i].items()): + for start, end in self.find_indexes(word, self.text): + fsw[i] = x + settings.append(TextSetting(start, end, *fsw)) + # Set all text settings (default font, slant, weight) + fsw = [self.font, self.slant, self.weight] + settings.sort(key=lambda setting: setting.start) + temp_settings = settings.copy() + start = 0 + for setting in settings: + if setting.start != start: + temp_settings.append(TextSetting(start, setting.start, *fsw)) + start = setting.end + if start != len(self.text): + temp_settings.append(TextSetting(start, len(self.text), *fsw)) + settings = sorted(temp_settings, key=lambda setting: setting.start) + + if re.search(r"\n", self.text): + line_num = 0 + for start, end in self.find_indexes("\n", self.text): + for setting in settings: + if setting.line_num == -1: + setting.line_num = line_num + if start < setting.end: + line_num += 1 + new_setting = copy.copy(setting) + setting.end = end + new_setting.start = end + new_setting.line_num = line_num + settings.append(new_setting) + settings.sort(key=lambda setting: setting.start) + break + for setting in settings: + if setting.line_num == -1: + setting.line_num = 0 + return settings + + def text2svg(self): + """Internally used function. + Convert the text to SVG using Pango + """ + size = self.size * 10 + line_spacing = self.line_spacing * 10 + dir_name = Path(self.filename).parent + disable_liga = self.disable_ligatures + if not os.path.exists(dir_name): + os.makedirs(dir_name) + file_name = self.filename + settings = self.text2settings() + width = 600 + height = 400 + + return text2svg( + settings, + size, + line_spacing, + disable_liga, + file_name, + 30, + 30, + width, + height, + self.text, + ) diff --git a/tests/test_fonts.py b/tests/test_fonts.py index 51e7eb4..da42895 100644 --- a/tests/test_fonts.py +++ b/tests/test_fonts.py @@ -3,13 +3,12 @@ import sys from pathlib import Path from shutil import copyfile -import manim import pytest import manimpango from . import FONT_DIR -from ._manim import MarkupText +from ._manim import MarkupText, Text font_lists = { (FONT_DIR / "AdobeVFPrototype.ttf").absolute(): "Adobe Variable Font Prototype", @@ -38,7 +37,7 @@ def test_register_font(font_name): @pytest.mark.parametrize("font_name", font_lists.values()) def test_warning(capfd, font_name): print(font_name) - manim.Text("Testing", font=font_name) + Text("Testing", font=font_name) captured = capfd.readouterr() assert "Pango-WARNING **" not in captured.err, "Looks like pango raised a warning?" -- 2.32.0