logo.py

In source/

Preview

Code3.2 KiB
import xml.etree.ElementTree as E
from .design import UNO_BLUE, FACE_OUTLINES, SPHERE, GRADIENTS, BORDER, K, I, T

NS = "{http://www.w3.org/2000/svg}"
E.register_namespace("", NS[1:-1])

def element(parent, name, **attributes):
    return E.SubElement(parent, NS + name, {k.replace("_", "-"): str(v) for k, v in attributes.items()})

def draw_face(parent, gradient, outline):
    return element(parent, "path", d=outline, fill=f"url(#{gradient})", stroke=f"url(#{gradient})", stroke_width=".12", stroke_linejoin="round")

def render(grid=True):
    root = E.Element(NS + "svg", {"width": "1000", "height": "1000", "viewBox": "0 0 80 80", "role": "img", "aria-labelledby": "title desc"})
    element(root, "title", id="title").text = "KIT geometric logo"
    element(root, "desc", id="desc").text = "A blue sphere, red pyramid, yellow cube, and green cylinder above wide KIT lettering in a blue square border."
    defs = element(root, "defs")
    for definition in GRADIENTS.values():
        gradient = E.SubElement(defs, NS + "linearGradient", definition["coordinates"])
        for stop in definition["stops"]:
            E.SubElement(gradient, NS + "stop", stop)
    element(root, "rect", width=80, height=80, fill="white")
    if grid:
        fade = element(defs, "radialGradient", id="grid-fade", gradientUnits="userSpaceOnUse", cx=0, cy=0, r=1, gradientTransform="translate(40 27.7) scale(33.2 19.7)")
        for offset, opacity in [("0", "1"), (".50", "1"), (".76", ".64"), (".91", ".20"), ("1", "0")]:
            element(fade, "stop", offset=offset, stop_color="white", stop_opacity=opacity)
        mask = element(defs, "mask", id="grid-fade-mask", maskUnits="userSpaceOnUse", x="6.8", y=8, width="66.4", height="39.4")
        element(mask, "rect", x="6.8", y=8, width="66.4", height="39.4", fill="url(#grid-fade)")
        clip = element(defs, "clipPath", id="design-grid-clip")
        element(clip, "rect", x="6.8", y=8, width="66.4", height="39.4")
        lines = element(root, "g", id="design-grid", clip_path="url(#design-grid-clip)", mask="url(#grid-fade-mask)", fill="none", stroke=UNO_BLUE, stroke_width=".085", stroke_opacity=".40")
        commands = []
        for offset in range(-44, 92, 4):
            commands.extend([f"M0 {offset} 80 {offset+40}", f"M0 {offset+40} 80 {offset}"])
        element(lines, "path", d=" ".join(commands))
    shapes = element(root, "svg", x=0, y=0, width=80, height=80, viewBox="-500 -500 1000 1000")
    for name in ["pyramid", "cylinder", "sphere", "cube"]:
        group = element(shapes, "g", aria_label=name.title())
        if name == "sphere":
            cx, cy, radius, gradient = SPHERE
            element(group, "circle", cx=cx, cy=cy, r=radius, fill=f"url(#{gradient})")
        for gradient, outline in FACE_OUTLINES[name]:
            if name == "sphere":
                element(group, "path", d=outline, fill=f"url(#{gradient})")
            else:
                draw_face(group, gradient, outline)
    element(root, "path", d=BORDER, fill="none", stroke=UNO_BLUE, stroke_width="1.682")
    element(root, "path", d=K, fill=UNO_BLUE)
    E.SubElement(root, NS + "rect", I)
    element(root, "path", d=T, fill=UNO_BLUE)
    return E.tostring(root, encoding="unicode")

Files

Loading files