wallside poast

This commit is contained in:
Jade Lovelace 2022-05-29 20:15:09 -07:00
parent 8e64a09f01
commit 61d04f2321
5 changed files with 519 additions and 0 deletions

View file

@ -0,0 +1,174 @@
import contextlib
class Periods:
y = 106
x = {
'en': 106,
'fr': 106,
'es': 146,
'jp': 82,
}
DEFS = """
"""
HEADER = """
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="17in" width="11in" onload="makeDraggable(evt)">
<style>
.text {
font-family: "Source Han Sans";
font-size: 14pt;
font-weight: bolder;
letter-spacing: -1.5px;
}
.text.japanese {
font-size: 16pt;
letter-spacing: -0.8px;
}
.wallside {
transform: rotate(-45deg)translate(-13in, 1.2in);
}
.draggable, .draggable-group {
cursor: move;
}
</style>
<!--<image href="./wallsideref.jpg" x="0" y="0" transform="scale(0.4, 0.4)" /> -->
<clipPath id="viewRect">
<rect height="17in" width="11in" />
</clipPath>
<rect height="17in" width="11in" stroke="black" fill="none" />
"""
FOOTER = """
<script type="text/javascript"><![CDATA[
function makeDraggable(evt) {
var svg = evt.target;
svg.addEventListener('mousedown', startDrag);
svg.addEventListener('mousemove', drag);
svg.addEventListener('mouseup', endDrag);
svg.addEventListener('mouseleave', endDrag);
svg.addEventListener('touchstart', startDrag);
svg.addEventListener('touchmove', drag);
svg.addEventListener('touchend', endDrag);
svg.addEventListener('touchleave', endDrag);
svg.addEventListener('touchcancel', endDrag);
function getMousePosition(evt) {
var CTM = svg.getScreenCTM();
if (evt.touches) { evt = evt.touches[0]; }
return {
x: (evt.clientX - CTM.e) / CTM.a,
y: (evt.clientY - CTM.f) / CTM.d
};
}
var selectedElement, offset, transform;
function initialiseDragging(evt) {
offset = getMousePosition(evt);
// Make sure the first transform on the element is a translate transform
var transforms = selectedElement.transform.baseVal;
if (transforms.length === 0 || transforms.getItem(0).type !== SVGTransform.SVG_TRANSFORM_TRANSLATE) {
// Create an transform that translates by (0, 0)
var translate = svg.createSVGTransform();
translate.setTranslate(0, 0);
selectedElement.transform.baseVal.insertItemBefore(translate, 0);
}
// Get initial translation
transform = transforms.getItem(0);
offset.x -= transform.matrix.e;
offset.y -= transform.matrix.f;
}
function startDrag(evt) {
if (evt.target.classList.contains('draggable')) {
selectedElement = evt.target;
initialiseDragging(evt);
} else if (evt.target.parentNode.classList.contains('draggable-group')) {
selectedElement = evt.target.parentNode;
initialiseDragging(evt);
}
}
function drag(evt) {
if (selectedElement) {
evt.preventDefault();
var coord = getMousePosition(evt);
transform.setTranslate(coord.x - offset.x, coord.y - offset.y);
}
}
function endDrag(evt) {
selectedElement = false;
}
}
]]></script>
</svg>
"""
BODY = """
<defs>
<text id="en" x="0" y="0" transform="translate(0, -80)" class="text">WALL side</text>
<text id="fr" x="0" y="0" transform="translate(-25, -56)" class="text">Côté MUR</text>
<text id="es" x="0" y="0" transform="translate(-28, 0)" class="text">lado de la PARED</text>
<text id="jp" x="0" y="0" transform="translate(-20, -27)" class="text japanese">かベ面</text>
</defs>
<g class="wallside">
<!--
<use href="#en" />
<use href="#en" x="106" class="draggable" />
<use href="#en" y="106" class="draggable" />
<use href="#fr" />
<use href="#fr" x="106" class="draggable" />
<use href="#es" />
<use href="#es" x="146" class="draggable" />
<use href="#jp" />
<use href="#jp" x="82" class="draggable" />
-->
</g>
"""
def make_line_def(id):
print(f'<defs><g id="{id}">')
for (lang, per) in Periods.x.items():
for i in range(30 if lang == 'jp' else 20):
print(f'<use x="{i * per}" xlink:href="#{lang}" />')
print('</g></defs>')
def make_wallside():
# 96px/in * {13in, 1.2in}
print('<g clip-path="url(#viewRect)"><g transform="rotate(-45) translate(-1248, 115)">')
for i in range(20):
print(f'<use xlink:href="#line-10" y="{Periods.y * i}" />')
print('</g></g>')
def main():
f = open('./wallside.svg', 'w')
with contextlib.redirect_stdout(f):
build()
print('built svg')
def build():
print(HEADER)
print(DEFS)
make_line_def('line-10')
make_wallside()
print(BODY)
print(FOOTER)
if __name__ == '__main__':
main()