Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit a6f15f2

Browse filesBrowse files
tacaswellQuLogic
authored andcommitted
TST: add a test of font families in svg text-as-text mode
This tests: 1. all of the fonts from the generic lists Matplotlib maintains ends up in the svg 2. the generic family is included and un-escaped 3. the specific fonts are escaped 4. glyph fallback will happen in fonts found via generic family names
1 parent 7a25f50 commit a6f15f2
Copy full SHA for a6f15f2

File tree

Expand file treeCollapse file tree

1 file changed

+61
-0
lines changed
Filter options
Expand file treeCollapse file tree

1 file changed

+61
-0
lines changed

‎lib/matplotlib/tests/test_backend_svg.py

Copy file name to clipboardExpand all lines: lib/matplotlib/tests/test_backend_svg.py
+61Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,3 +527,64 @@ def test_svg_escape():
527527
fig.savefig(fd, format='svg')
528528
buf = fd.getvalue().decode()
529529
assert '<'"&>"' in buf
530+
531+
532+
@pytest.mark.parametrize("font_str", [
533+
"'DejaVu Sans', 'WenQuanYi Zen Hei', 'Arial', sans-serif",
534+
"'DejaVu Serif', 'WenQuanYi Zen Hei', 'Times New Roman', serif",
535+
"'Arial', 'WenQuanYi Zen Hei', cursive",
536+
"'Impact', 'WenQuanYi Zen Hei', fantasy",
537+
"'DejaVu Sans Mono', 'WenQuanYi Zen Hei', 'Courier New', monospace",
538+
# These do not work because the logic to get the font metrics will not find
539+
# WenQuanYi as the fallback logic stops with the first fallback font:
540+
# "'DejaVu Sans Mono', 'Courier New', 'WenQuanYi Zen Hei', monospace",
541+
# "'DejaVu Sans', 'Arial', 'WenQuanYi Zen Hei', sans-serif",
542+
# "'DejaVu Serif', 'Times New Roman', 'WenQuanYi Zen Hei', serif",
543+
])
544+
@pytest.mark.parametrize("include_generic", [True, False])
545+
def test_svg_font_string(font_str, include_generic):
546+
fp = fm.FontProperties(family=["WenQuanYi Zen Hei"])
547+
if Path(fm.findfont(fp)).name != "wqy-zenhei.ttc":
548+
pytest.skip("Font may be missing")
549+
550+
explicit, *rest, generic = map(
551+
lambda x: x.strip("'"), font_str.split(", ")
552+
)
553+
size = len(generic)
554+
if include_generic:
555+
rest = rest + [generic]
556+
plt.rcParams[f"font.{generic}"] = rest
557+
plt.rcParams["font.size"] = size
558+
plt.rcParams["svg.fonttype"] = "none"
559+
560+
fig, ax = plt.subplots()
561+
if generic == "sans-serif":
562+
generic_options = ["sans", "sans-serif", "sans serif"]
563+
else:
564+
generic_options = [generic]
565+
566+
for generic_name in generic_options:
567+
# test that fallback works
568+
ax.text(0.5, 0.5, "There are 几个汉字 in between!",
569+
family=[explicit, generic_name], ha="center")
570+
# test deduplication works
571+
ax.text(0.5, 0.1, "There are 几个汉字 in between!",
572+
family=[explicit, *rest, generic_name], ha="center")
573+
ax.axis("off")
574+
575+
with BytesIO() as fd:
576+
fig.savefig(fd, format="svg")
577+
buf = fd.getvalue()
578+
579+
tree = xml.etree.ElementTree.fromstring(buf)
580+
ns = "http://www.w3.org/2000/svg"
581+
text_count = 0
582+
for text_element in tree.findall(f".//{{{ns}}}text"):
583+
text_count += 1
584+
font_info = dict(
585+
map(lambda x: x.strip(), _.strip().split(":"))
586+
for _ in dict(text_element.items())["style"].split(";")
587+
)["font"]
588+
589+
assert font_info == f"{size}px {font_str}"
590+
assert text_count == len(ax.texts)

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.