[interpolatablePlot] Add --html with SVG output

This commit is contained in:
Behdad Esfahbod 2023-11-16 17:47:57 -07:00
parent 1fb31c2cb8
commit 3fd86077e7
2 changed files with 40 additions and 2 deletions

View File

@ -442,6 +442,11 @@ def main(args=None):
action="store", action="store",
help="Output report in PDF format", help="Output report in PDF format",
) )
parser.add_argument(
"--html",
action="store",
help="Output report in HTML format",
)
parser.add_argument( parser.add_argument(
"--quiet", "--quiet",
action="store_true", action="store_true",
@ -693,6 +698,23 @@ def main(args=None):
if not problems: if not problems:
pdf.draw_cupcake() pdf.draw_cupcake()
if args.html:
from .interpolatablePlot import InterpolatableSVG
svgs = []
with InterpolatableSVG(svgs, glyphsets=glyphsets, names=names) as svg:
svg.add_problems(problems)
if not problems:
svg.draw_cupcake()
with open(args.html, "wb") as f:
f.write(b"<!DOCTYPE html>\n")
f.write(b"<html><body>\n")
for svg in svgs:
f.write(svg)
f.write(b"<hr>\n")
f.write(b"</body></html>\n")
if problems: if problems:
return problems return problems

View File

@ -5,6 +5,7 @@ from fontTools.pens.pointPen import SegmentToPointPen
from fontTools.varLib.interpolatable import PerContourOrComponentPen, RecordingPointPen from fontTools.varLib.interpolatable import PerContourOrComponentPen, RecordingPointPen
from itertools import cycle from itertools import cycle
from functools import wraps from functools import wraps
from io import BytesIO
import cairo import cairo
import math import math
@ -76,10 +77,10 @@ class InterpolatablePlot:
setattr(self, k, v) setattr(self, k, v)
def __enter__(self): def __enter__(self):
raise NotImplementedError return self
def __exit__(self, type, value, traceback): def __exit__(self, type, value, traceback):
raise NotImplementedError pass
def set_size(self, width, height): def set_size(self, width, height):
raise NotImplementedError raise NotImplementedError
@ -427,3 +428,18 @@ class InterpolatablePDF(InterpolatablePostscriptLike):
def __enter__(self): def __enter__(self):
self.surface = cairo.PDFSurface(self.out, self.width, self.height) self.surface = cairo.PDFSurface(self.out, self.width, self.height)
return self return self
class InterpolatableSVG(InterpolatablePlot):
@wraps(InterpolatablePlot.__init__)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def set_size(self, width, height):
self.sink = BytesIO()
self.surface = cairo.SVGSurface(self.sink, width, height)
def show_page(self):
self.surface.finish()
self.out.append(self.sink.getvalue())
self.surface = None