Add wsdiff article

This commit is contained in:
jaseg 2025-07-28 14:08:30 +02:00
parent 3fd0c107e0
commit d2891b448a
2 changed files with 1016 additions and 0 deletions

View file

@ -0,0 +1,127 @@
---
title: "wsdiff: Responsive diffs in plain HTML"
date: 2025-07-25T23:42:00+01:00
summary: >
There's many tools that render diffs on the web, but almost none that work well on small screens such as phones. I
fixed this by publishing wsdiff, a diffing tool written in Python that produces diffs as beautiful, responsive,
static, self-contained HTML pages. wsdiffs wrap text to fit the window, and dynamically switch between unified and
split diffs based on screen size using only CSS.
---
Demo
----
First off, have a demo. Because of the width of this page, the output will show an unified diff. To try out the split
diff layout, make sure your browser window is wide enough and open the demo in a separate tab using `this link
</wsdiff-example.html>`__.
wsdiff supports dark mode, try it out by toggling dark mode in your operating system!
.. raw:: html
<iframe src="/wsdiff-example.html" style="width: 100%; height: 30em; border: 1px #d0d0d0 solid" id="wsdiff example diff"></iframe>
Core Features
-------------
There's many tools that render diffs on the web, but almost none that work well on small screens such as phones. I fixed
this by publishing `wsdiff <https://pypi.org/project/wsdiff/>`__, a diffing tool written in Python that produces diffs
as beautiful, responsive, static, self-contained HTML pages. wsdiffs wrap text to fit the window, and dynamically switch
between unified and split diffs based on screen size using only CSS.
Responsive Line Wrapping
........................
The first challenge I solved was wrapping source code lines to match the available screen space. Other tools often just
show horizontal scroll bars, which is an okay workaround when you're mostly working with hard-wrapped source code on a
laptop or desktop screen, but which results in catastrophic UX on any phone.
I solved line breaking with a combination of CSS-controlled, web-standard word breaking rules: ``overflow-wrap:
anywhere`` for source code (`MDN link <https://developer.mozilla.org/en-US/docs/Web/CSS/overflow-wrap>`__) and
``white-space: pre-wrap`` to preserve whitespace accurately (`MDN link
<https://developer.mozilla.org/en-US/docs/Web/CSS/white-space>`__). To make both sides of the split diff align, and to
align line numbers with wrapped source code lines, the diff is laid out using a `CSS grid layout`_. In side-by-side
view, the layout has four columns: two for line numbers and two for the content. In unified view, the left ("old")
content column is dropped, and the deleted or modified lines that are highlighted in it in side-by-side view are slotted
into the remaining right column.
When soft-wrapping source code, text editors will often display a little curved arrow marker to indicate that a line was
soft-wrapped, and that there is not actually a newline character in the file at that location. wsdiff solves this
using the same technique I used for the soft-wrapping code blocks in this blog, described `here <{{<ref
"blog/css-only-code-blocks/index.rst">}}>`__. It inserts a string of ``"\a↳\a↳\a↳\a↳\a↳..."`` into the line number
element's ``::after`` pseudo-element. This string evaluates to a sequence of unicode arrows separated by line breaks,
and starting with an empty line. The ``::after`` pseudo-element is positioned using ``position: absolute``, and the
parent ``<span class="lineno">`` has ``position: relative`` set. This way, the arrow pseudo-element gets placed on top
of the lineno span without affecting the layout at all. By setting ``overflow: clip`` on the parent ``<span
class="lineno">``, the arrow pseudo-element gets cut off vertically wherever the parent line number element naturally
ends. Since both the line and the line number element share a grid row, the line number element always matches the
height of the soft-wrapped line.
Responsive Split/Unified Layout Selection
.........................................
To dynamically change between unified and side-by-side views, wsdiff uses a web-standard `Media Query`_. By default, the
page is laid out for side-by-side view. In the HTML source, the diff is listed as it is displayed in side-by-side view,
with the old and new lines along with their line numbers interleaved.
The magic happens when the media query gets triggered by a narrow screen width. The media query re-adjusts the layout in
four core steps:
1. All unchanged lines in the left (old) column are hidden.
2. The left content column of the grid layout is hidden, so that now there are three columns: old line number, new line
number, and unified content.
3. All deleted or changed lines from the left (old) column are re-located to the right column. They naturally slot in
in the right spot because they already appear in the right order in the HTML source.
4. By slotting in the old lines in the right column, we have created gaps in the line number columns. Every deleted
line has an empty cell in the new line number column, and every inserted line has one in the old line number column.
The CSS adjusts the layout of these empty cells such that the border lines align nicely, and it overrides the
newline markers so that they only show in the right (new) line number column, not both.
Since this is all CSS, it happens automatically and near-instantly. Since it is using only web standard features, it
works across browsers and platforms.
Unchanged Line Folding in CSS
.............................
When showing the diff of a large file, it is usually best to hide large runs of unchanged lines. wsdiff does this
similar to code folding in text editors. When a long run of unchanged lines is detected, a marker is placed spanning the
diff. This marker contains a checkbox that can be toggled to hide the unchanged lines. This feature is done completely
in CSS using a ``:has(input[type="checkbox"]:checked)`` selector.
The actual mechanics are quite simple. To cleanly hide the lines, they must be placed in a container ``<div>``. That div
has a CSS subgrid layout using ``display: grid; grid-template-columns: subgrid;``, meaning that its contents align to
the surrounding diff grid.
Dark Mode
.........
Integrating a website with the OS-level dark mode is surprisingly easy. All you need is a `Media Query`_ that selects
for ``@media (prefers-color-scheme: dark)`` and you're good. wsdiff uses named colors using `CSS Custom Properties`_, so
the actual dark mode media query only needs to override these color properties, and the rest of the CSS will be
re-computed automatically.
Limitations: Text selection
...........................
A limitation in having a combined, single HTML source for both side-by-side and unified diffs is that text selection
only works naturally in either mode. You can't make text selection work in both simultaneously without re-sorting the
lines in the HTML source, since there is no way to override the text selection order from pure CSS. In wsdiff, I worked
around this issue by just disabling text selection on the unchanged lines in the left (old) column, so selecting text in
the right column copies the unified diff as one would expect.
Try it yourself!
----------------
You can find the demo from above at `this link </wsdiff-example.html>`__.
You can install wsdiff yourself `from PyPI <https://pypi.org/project/wsdiff/>`__:
.. code:: sh
$ pip install -U wsdiff
Successfully installed wsdiff-0.3.1
$ wsdiff old.py new.py -o diff.html
.. _`CSS grid layout`: https://css-tricks.com/snippets/css/complete-guide-grid/
.. _`Media Query`: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_media_queries/Using_media_queries
.. _`CSS Custom Properties`: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_cascading_variables/Using_CSS_custom_properties

889
static/wsdiff-example.html Normal file
View file

@ -0,0 +1,889 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>diff: example_old.py / example.py</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="mobile-web-app-capable" content="yes">
<style id="wsd-main-style">
html, body {
margin: 0;
padding: 0;
font-family: sans-serif;
}
@media (prefers-color-scheme: light) {
html {
--c-bg-primary: #ffffff;
--c-fg-primary: #000000;
--c-bg-auxiliary: #f8f8f8;
--c-fg-auxiliary: #a0a0a0;
--c-border-line: #e0e0e0;
--c-bg-insert: #ecfdf0;
--c-bg-delete: #fbe9eb;
--c-bg-delete-lineno: #f9d7dc;
--c-fg-delete-lineno: #ae969a;
--c-bg-delete-word: #fac5cd;
--c-fg-delete-word: #400000;
--c-fg-insert-word: #004000;
--c-bg-insert-word: #c7f0d2;
--c-fg-insert-lineno: #9bb0a1;
--c-bg-insert-lineno: #ddfbe6;
--c-bg-empty: #f0f0f0;
--c-fg-foldline: #bbbbbb;
--c-border-delete: #e0c8c8; /* pick a darker border color inside the light red gutter */
}
}
@media (prefers-color-scheme: dark) {
html {
--c-bg-primary: #010409;
--c-fg-primary: #a0a0a0;
--c-bg-auxiliary: #0d1117;
--c-fg-auxiliary: #f0f6fc;
--c-fg-foldline: #bbbbbb;
--c-border-line: #3d444d;
--c-bg-insert: #223738;
--c-bg-delete: #280d1f;
--c-bg-delete-lineno: #421632;
--c-fg-delete-lineno: #ae969a;
--c-bg-delete-word: #421632;
--c-fg-delete-word: #fac5cd;
--c-fg-insert-word: #c7f0d2;
--c-bg-insert-word: #325148;
--c-fg-insert-lineno: #9bb0a1;
--c-bg-insert-lineno: #325148;
--c-bg-empty: #080b0f;
--c-border-delete: #e0c8c8;
}
}
@media print {
html {
/* Copy of the light theme, but we clip all light gray backgrounds to white. */
--c-bg-primary: #ffffff;
--c-fg-primary: #000000;
--c-bg-auxiliary: #ffffff;
--c-fg-auxiliary: #a0a0a0;
--c-border-line: #e0e0e0;
--c-bg-insert: #ecfdf0;
--c-bg-delete: #fbe9eb;
--c-bg-delete-lineno: #f9d7dc;
--c-fg-delete-lineno: #ae969a;
--c-bg-delete-word: #fac5cd;
--c-fg-delete-word: #400000;
--c-fg-insert-word: #004000;
--c-bg-insert-word: #c7f0d2;
--c-fg-insert-lineno: #9bb0a1;
--c-bg-insert-lineno: #ddfbe6;
--c-bg-empty: #ffffff;
--c-fg-foldline: #bbbbbb;
--c-border-delete: #e0c8c8;
}
}
@layer wsd-base-style {
html {
background-color: var(--c-bg-primary);
height: 100%;
width: 100%;
}
#wsd-js-controls {
display: none;
color: var(--c-fg-primary);
background-color: var(--c-bg-auxiliary);
padding: 5px 20px;
font-size: 10pt;
font-weight: bold;
border: 1px solid var(--c-border-line);
position: sticky;
top: 0;
z-index: 1;
flex-direction: row-reverse;
}
@media screen and (max-width: 40em) {
#wsd-js-controls {
position: initial;
}
.wsd-diff {
border-top: none;
}
.wsd-file-title {
background-color: var(--c-bg-auxiliary);
border-bottom: solid 1px var(--c-border-line);
}
}
#wsd-js-controls input[type="checkbox"] {
width: 20px;
height: 20px;
}
#wsd-js-controls input, #wsd-js-controls label, #wsd-js-controls .control-label {
vertical-align: middle;
}
.wsd-field-group {
display: inline-block;
}
.wsd-field {
white-space: nowrap;
display: inline-block;
}
#wsd-js-controls label {
font-weight: normal;
margin-right: .5em;
margin-left: 5px;
}
.wsd-control-label {
margin-right: .5em;
margin-left: 5px;
padding-bottom: 3px;
}
.wsd-file-container {
font-family: monospace;
font-size: 9pt;
background-color: var(--c-bg-auxiliary);
border: solid 1px var(--c-border-line);
margin: 15px;
}
.wsd-file-title {
padding: 10px 20px;
font-size: 10pt;
font-weight: bold;
position: sticky;
top: 0;
z-index: 1;
display: flex;
}
.wsd-filename {
max-width: 30em;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
direction: rtl;
}
.wsd-diff-files {
color: var(--c-fg-primary);
}
.wsd-diff {
background-color: var(--c-bg-primary);
overflow-x: auto;
display: grid;
align-items: start;
border-top: 1px solid var(--c-border-line);
}
.wsd-line {
padding-left: calc(4em + 5px);
text-indent: -4em;
padding-top: 2px;
align-self: stretch; /* Make sure empty lines don't collapse */
}
/* Make individual syntax tokens wrap anywhere */
.wsd-line > span {
overflow-wrap: anywhere;
white-space: pre-wrap;
}
.wsd-line {
min-width: 15em;
}
.wsd-line.wsd-left.wsd-change, .wsd-line.wsd-left.wsd-insert {
background-color: var(--c-bg-delete);
}
.wsd-line.wsd-right.wsd-change, .wsd-line.wsd-right.wsd-insert {
background-color: var(--c-bg-insert);
}
.wsd-lineno.wsd-left.wsd-change, .wsd-lineno.wsd-left.wsd-insert {
background-color: var(--c-bg-delete-lineno);
color: var(--c-fg-delete-lineno);
}
.wsd-lineno.wsd-right.wsd-change, .wsd-lineno.wsd-right.wsd-insert {
background-color: var(--c-bg-insert-lineno);
color: var(--c-fg-insert-lineno);
}
.wsd-right > .wsd-word-change {
background-color: var(--c-bg-insert-word);
color: var(--c-fg-insert-word);
}
.wsd-left > .wsd-word-change {
background-color: var(--c-bg-delete-word);
color: var(--c-fg-delete-word);
}
.wsd-lineno {
word-break: keep-all;
margin: 0;
padding-left: 30px;
padding-right: 5px;
overflow: clip;
position: relative;
text-align: right;
color: var(--c-fg-auxiliary);
background-color: var(--c-bg-auxiliary);
border-right: 1px solid var(--c-border-line);
align-self: stretch;
}
.wsd-lineno::after {
position: absolute;
right: 0;
content: "\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳\a↳";
white-space: pre;
color: var(--c-fg-auxiliary);
}
/* Default rules for split diff for wide screens (laptops) */
.wsd-diff {
grid-template-columns: min-content 1fr min-content 1fr;
}
.wsd-empty {
background-color: var(--c-bg-empty);
align-self: stretch;
}
/* line continuation arrows only in non-empty lines */
.wsd-lineno.wsd-empty::after {
content: "";
}
.wsd-lineno, .wsd-left {
user-select: none;
}
/* Collapsing runs of unchanged lines */
.wsd-collapse {
grid-column: 1 / span 4;
display: grid;
grid-template-columns: subgrid;
}
.wsd-collapse-controls {
grid-column: 1 / span 4;
display: flex;
justify-content: center;
color: var(--c-fg-auxiliary);
background-image: radial-gradient(var(--c-fg-foldline) 1px, transparent 0);
background-size: 10px 10px;
background-position: center;
background-repeat: repeat-x;
background-color: var(--c-bg-auxiliary)
}
.wsd-collapse-controls > label {
background-color: var(--c-bg-auxiliary);
}
.wsd-collapse:has(input[type="checkbox"]:checked) > span {
display: none;
}
}
@layer wsd-automatic-media-rule {
/* Unified diff for narrow screens (phones) */
@media screen and (max-width: 70em) {
.wsd-diff {
grid-auto-flow: dense;
grid-template-columns: min-content min-content 1fr;
}
.wsd-collapse, .wsd-collapse-controls {
grid-column: 1 / span 3;
}
.wsd-lineno {
padding-left: 1em;
}
.wsd-lineno.wsd-left {
grid-column: 1;
}
.wsd-lineno.wsd-left.wsd-change, .wsd-lineno.wsd-right.wsd-change {
grid-column: 1 / span 2;
display: grid;
grid-template-columns: 1fr 1fr;
padding-left: 0;
padding-right: 0;
grid-auto-flow: dense;
/* To make alignment of left line number work, since we loose margin and padding control using ::before. */
column-gap: 10px;
}
.wsd-lineno.wsd-right.wsd-change::before {
content: "";
align-self: stretch;
grid-column: 1;
border-right: 1px solid var(--c-border-line);
margin-right: -6px; /* move border into column gap, and 1px over to align with other borders */
}
.wsd-lineno.wsd-left.wsd-change::before {
content: "";
align-self: stretch;
grid-column: 2;
border-left: 1px solid var(--c-border-delete);
margin-left: -5px;
}
.wsd-lineno.wsd-left.wsd-insert {
border-right: 1px solid var(--c-border-delete);
}
.wsd-lineno.wsd-right.wsd-change::after {
grid-column: 2;
}
.wsd-lineno.wsd-left.wsd-insert {
grid-column: 1 / span 2;
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-flow: dense;
column-gap: 10px;
padding-left: 0;
padding-right: 0;
}
.wsd-lineno.wsd-right {
grid-column: 2;
}
.wsd-lineno.wsd-right.wsd-insert {
grid-column: 2;
}
.wsd-line.wsd-left, .wsd-line.wsd-right.wsd-empty {
display: none;
}
.wsd-line {
grid-column: 3;
}
.wsd-line.wsd-left.wsd-insert {
display: block;
}
.wsd-line.wsd-left.wsd-change {
display: block;
}
.wsd-lineno.wsd-right.wsd-empty {
display: none;
}
.wsd-lineno.wsd-left.wsd-empty {
background-color: var(--c-bg-insert-lineno);
}
/* line continuation arrows only in right line number column */
.wsd-lineno.wsd-left.wsd-insert::after {
}
.wsd-lineno.wsd-left.wsd-insert::before {
content: "";
grid-column: 2;
border-left: 1px solid var(--c-border-delete); /* pick a darker border color inside the light red gutter */
margin-left: -5px;
}
}
}
</style>
<style>
@media print, (prefers-color-scheme: light) {
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.hll { background-color: #ffffcc }
.wsd-c { color: #177500 } /* Comment */
.wsd-err { color: #000 } /* Error */
.wsd-k { color: #A90D91 } /* Keyword */
.wsd-l { color: #1C01CE } /* Literal */
.wsd-n { color: #000 } /* Name */
.wsd-o { color: #000 } /* Operator */
.wsd-ch { color: #177500 } /* Comment.Hashbang */
.wsd-cm { color: #177500 } /* Comment.Multiline */
.wsd-cp { color: #633820 } /* Comment.Preproc */
.wsd-cpf { color: #177500 } /* Comment.PreprocFile */
.wsd-c1 { color: #177500 } /* Comment.Single */
.wsd-cs { color: #177500 } /* Comment.Special */
.wsd-kc { color: #A90D91 } /* Keyword.Constant */
.wsd-kd { color: #A90D91 } /* Keyword.Declaration */
.wsd-kn { color: #A90D91 } /* Keyword.Namespace */
.wsd-kp { color: #A90D91 } /* Keyword.Pseudo */
.wsd-kr { color: #A90D91 } /* Keyword.Reserved */
.wsd-kt { color: #A90D91 } /* Keyword.Type */
.wsd-ld { color: #1C01CE } /* Literal.Date */
.wsd-m { color: #1C01CE } /* Literal.Number */
.wsd-s { color: #C41A16 } /* Literal.String */
.wsd-na { color: #836C28 } /* Name.Attribute */
.wsd-nb { color: #A90D91 } /* Name.Builtin */
.wsd-nc { color: #3F6E75 } /* Name.Class */
.wsd-no { color: #000 } /* Name.Constant */
.wsd-nd { color: #000 } /* Name.Decorator */
.wsd-ni { color: #000 } /* Name.Entity */
.wsd-ne { color: #000 } /* Name.Exception */
.wsd-nf { color: #000 } /* Name.Function */
.wsd-nl { color: #000 } /* Name.Label */
.wsd-nn { color: #000 } /* Name.Namespace */
.wsd-nx { color: #000 } /* Name.Other */
.wsd-py { color: #000 } /* Name.Property */
.wsd-nt { color: #000 } /* Name.Tag */
.wsd-nv { color: #000 } /* Name.Variable */
.wsd-ow { color: #000 } /* Operator.Word */
.wsd-mb { color: #1C01CE } /* Literal.Number.Bin */
.wsd-mf { color: #1C01CE } /* Literal.Number.Float */
.wsd-mh { color: #1C01CE } /* Literal.Number.Hex */
.wsd-mi { color: #1C01CE } /* Literal.Number.Integer */
.wsd-mo { color: #1C01CE } /* Literal.Number.Oct */
.wsd-sa { color: #C41A16 } /* Literal.String.Affix */
.wsd-sb { color: #C41A16 } /* Literal.String.Backtick */
.wsd-sc { color: #2300CE } /* Literal.String.Char */
.wsd-dl { color: #C41A16 } /* Literal.String.Delimiter */
.wsd-sd { color: #C41A16 } /* Literal.String.Doc */
.wsd-s2 { color: #C41A16 } /* Literal.String.Double */
.wsd-se { color: #C41A16 } /* Literal.String.Escape */
.wsd-sh { color: #C41A16 } /* Literal.String.Heredoc */
.wsd-si { color: #C41A16 } /* Literal.String.Interpol */
.wsd-sx { color: #C41A16 } /* Literal.String.Other */
.wsd-sr { color: #C41A16 } /* Literal.String.Regex */
.wsd-s1 { color: #C41A16 } /* Literal.String.Single */
.wsd-ss { color: #C41A16 } /* Literal.String.Symbol */
.wsd-bp { color: #5B269A } /* Name.Builtin.Pseudo */
.wsd-fm { color: #000 } /* Name.Function.Magic */
.wsd-vc { color: #000 } /* Name.Variable.Class */
.wsd-vg { color: #000 } /* Name.Variable.Global */
.wsd-vi { color: #000 } /* Name.Variable.Instance */
.wsd-vm { color: #000 } /* Name.Variable.Magic */
.wsd-il { color: #1C01CE } /* Literal.Number.Integer.Long */
}
@media (prefers-color-scheme: dark) {
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.hll { background-color: #716799 }
.wsd-c { color: #B0BEC5 } /* Comment */
.wsd-err { color: #960050; background-color: #1E0010 } /* Error */
.wsd-k { color: #C2FFDF } /* Keyword */
.wsd-l { color: #AE81FF } /* Literal */
.wsd-n { color: #F8F8F2 } /* Name */
.wsd-o { color: #FFB8D1 } /* Operator */
.wsd-p { color: #F8F8F2 } /* Punctuation */
.wsd-ch { color: #B0BEC5 } /* Comment.Hashbang */
.wsd-cm { color: #B0BEC5 } /* Comment.Multiline */
.wsd-cp { color: #B0BEC5 } /* Comment.Preproc */
.wsd-cpf { color: #B0BEC5 } /* Comment.PreprocFile */
.wsd-c1 { color: #B0BEC5 } /* Comment.Single */
.wsd-cs { color: #B0BEC5 } /* Comment.Special */
.wsd-gd { color: #F92672 } /* Generic.Deleted */
.wsd-ge { font-style: italic } /* Generic.Emph */
.wsd-gi { color: #A6E22E } /* Generic.Inserted */
.wsd-gs { font-weight: bold } /* Generic.Strong */
.wsd-gu { color: #75715E } /* Generic.Subheading */
.wsd-kc { color: #C2FFDF } /* Keyword.Constant */
.wsd-kd { color: #C2FFDF } /* Keyword.Declaration */
.wsd-kn { color: #FFB8D1 } /* Keyword.Namespace */
.wsd-kp { color: #C2FFDF } /* Keyword.Pseudo */
.wsd-kr { color: #C2FFDF } /* Keyword.Reserved */
.wsd-kt { color: #C2FFDF } /* Keyword.Type */
.wsd-ld { color: #E6DB74 } /* Literal.Date */
.wsd-m { color: #C5A3FF } /* Literal.Number */
.wsd-s { color: #1BC5E0 } /* Literal.String */
.wsd-na { color: #CEB1FF } /* Name.Attribute */
.wsd-nb { color: #F8F8F2 } /* Name.Builtin */
.wsd-nc { color: #CEB1FF } /* Name.Class */
.wsd-no { color: #C5A3FF } /* Name.Constant */
.wsd-nd { color: #CEB1FF } /* Name.Decorator */
.wsd-ni { color: #F8F8F2 } /* Name.Entity */
.wsd-ne { color: #CEB1FF } /* Name.Exception */
.wsd-nf { color: #CEB1FF } /* Name.Function */
.wsd-nl { color: #F8F8F2 } /* Name.Label */
.wsd-nn { color: #F8F8F2 } /* Name.Namespace */
.wsd-nx { color: #F8F8F2 } /* Name.Other */
.wsd-py { color: #F8F8F2 } /* Name.Property */
.wsd-nt { color: #FFB8D1 } /* Name.Tag */
.wsd-nv { color: #F8F8F2 } /* Name.Variable */
.wsd-ow { color: #FFB8D1 } /* Operator.Word */
.wsd-pm { color: #F8F8F2 } /* Punctuation.Marker */
.wsd-w { color: #A8757B } /* Text.Whitespace */
.wsd-mb { color: #C5A3FF } /* Literal.Number.Bin */
.wsd-mf { color: #C5A3FF } /* Literal.Number.Float */
.wsd-mh { color: #C5A3FF } /* Literal.Number.Hex */
.wsd-mi { color: #C5A3FF } /* Literal.Number.Integer */
.wsd-mo { color: #C5A3FF } /* Literal.Number.Oct */
.wsd-sa { color: #1BC5E0 } /* Literal.String.Affix */
.wsd-sb { color: #1BC5E0 } /* Literal.String.Backtick */
.wsd-sc { color: #1BC5E0 } /* Literal.String.Char */
.wsd-dl { color: #1BC5E0 } /* Literal.String.Delimiter */
.wsd-sd { color: #1BC5E0 } /* Literal.String.Doc */
.wsd-s2 { color: #1BC5E0 } /* Literal.String.Double */
.wsd-se { color: #1BC5E0 } /* Literal.String.Escape */
.wsd-sh { color: #1BC5E0 } /* Literal.String.Heredoc */
.wsd-si { color: #1BC5E0 } /* Literal.String.Interpol */
.wsd-sx { color: #1BC5E0 } /* Literal.String.Other */
.wsd-sr { color: #1BC5E0 } /* Literal.String.Regex */
.wsd-s1 { color: #1BC5E0 } /* Literal.String.Single */
.wsd-ss { color: #1BC5E0 } /* Literal.String.Symbol */
.wsd-bp { color: #80CBC4 } /* Name.Builtin.Pseudo */
.wsd-fm { color: #CEB1FF } /* Name.Function.Magic */
.wsd-vc { color: #F8F8F2 } /* Name.Variable.Class */
.wsd-vg { color: #F8F8F2 } /* Name.Variable.Global */
.wsd-vi { color: #F8F8F2 } /* Name.Variable.Instance */
.wsd-vm { color: #F8F8F2 } /* Name.Variable.Magic */
.wsd-il { color: #C5A3FF } /* Literal.Number.Integer.Long */
}
</style>
</head>
<body>
<div id="wsd-js-controls">
<div class="wsd-single-control">
<span class="wsd-control-label">Split view</span>
<span class="wsd-three-way-toggle">
<div class="wsd-field-group">
<div class="wsd-field"><input type="checkbox" id="wsd-toggle-split-auto" checked></input><label for="wsd-toggle-split-auto">Auto</label></div>
<div class="wsd-field"><input type="checkbox" id="wsd-toggle-split-force" disabled></input><label for="wsd-toggle-split-force">Split view</label></div>
</div>
</span>
</div>
</div>
<script>
const findStylesheet = (id => Array.from(document.styleSheets).find(element => element.ownerNode && element.ownerNode.id == id));
const findRule = ((stylesheet, name) => Array.from(stylesheet.cssRules).find(
element => (element instanceof CSSLayerBlockRule && element.name == name)).cssRules[0]);
const automaticMediaElement = findRule(findStylesheet('wsd-main-style'), 'wsd-automatic-media-rule');
const automaticMediaRule = automaticMediaElement.media[0];
const impossibleMediaRule = "screen and (max-width: 0px)";
const tautologicalMediaRule = "screen and (min-width: 0px)";
const toggleAuto = document.getElementById("wsd-toggle-split-auto");
const toggleForce = document.getElementById("wsd-toggle-split-force");
toggleAuto.checked = true;
toggleForce.disabled = true;
toggleAuto.addEventListener('change', (event) => {
const automatic = toggleAuto.checked;
toggleForce.disabled = automatic;
if (automatic) {
automaticMediaElement.media.deleteMedium(automaticMediaElement.media[0]);
automaticMediaElement.media.appendMedium(automaticMediaRule);
} else {
automaticMediaElement.media.deleteMedium(automaticMediaRule);
if (toggleForce.checked) {
automaticMediaElement.media.appendMedium(impossibleMediaRule);
} else {
automaticMediaElement.media.appendMedium(tautologicalMediaRule);
}
}
});
toggleForce.addEventListener('change', (event) => {
const automatic = toggleAuto.checked;
if (!automatic) {
automaticMediaElement.media.deleteMedium(automaticMediaElement.media[0]);
if (toggleForce.checked) {
automaticMediaElement.media.appendMedium(impossibleMediaRule);
} else {
automaticMediaElement.media.appendMedium(tautologicalMediaRule);
}
}
});
const mediaMatch = window.matchMedia(automaticMediaRule);
mediaMatch.addEventListener('change', (event) => {
const automatic = toggleAuto.checked;
if (automatic) {
toggleForce.checked = !event.matches;
}
});
toggleForce.checked = !mediaMatch.matches;
document.getElementById('wsd-js-controls').style = 'display: flex';
</script>
<div class="wsd-diff-files">
<div class="wsd-file-container">
<div class="wsd-file-title"><div class="wsd-filename">&#x202D;example.py</div></div>
<div class="wsd-diff">
<span class="wsd-lineno wsd-left">1</span><span class="wsd-line wsd-left"><span class="wsd-ch">#!/usr/bin/env python3</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">1</span><span class="wsd-line wsd-right"><span class="wsd-ch">#!/usr/bin/env python3</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">2</span><span class="wsd-line wsd-left"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">2</span><span class="wsd-line wsd-right"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">3</span><span class="wsd-line wsd-left"><span class="wsd-kn">import</span><span class="wsd-w"> </span><span class="wsd-nn">math</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">3</span><span class="wsd-line wsd-right"><span class="wsd-kn">import</span><span class="wsd-w"> </span><span class="wsd-nn">math</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">4</span><span class="wsd-line wsd-left"><span class="wsd-kn">import</span><span class="wsd-w"> </span><span class="wsd-nn">itertools</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">4</span><span class="wsd-line wsd-right"><span class="wsd-kn">import</span><span class="wsd-w"> </span><span class="wsd-nn">itertools</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">5</span><span class="wsd-line wsd-left"><span class="wsd-kn">import</span><span class="wsd-w"> </span><span class="wsd-nn">textwrap</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">5</span><span class="wsd-line wsd-right"><span class="wsd-kn">import</span><span class="wsd-w"> </span><span class="wsd-nn">textwrap</span><span class="wsd-w"></span></span></span>
<div class="wsd-collapse"><div class="wsd-collapse-controls"><label><input type="checkbox" checked> Collapse 24 unchanged lines</label></div>
<span class="wsd-lineno wsd-left">6</span><span class="wsd-line wsd-left"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">6</span><span class="wsd-line wsd-right"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">7</span><span class="wsd-line wsd-left"><span class="wsd-kn">import</span><span class="wsd-w"> </span><span class="wsd-nn">click</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">7</span><span class="wsd-line wsd-right"><span class="wsd-kn">import</span><span class="wsd-w"> </span><span class="wsd-nn">click</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">8</span><span class="wsd-line wsd-left"><span class="wsd-kn">from</span><span class="wsd-w"> </span><span class="wsd-nn">reedmuller</span><span class="wsd-w"> </span><span class="wsd-kn">import</span><span class="n"> </span><span class="wsd-n">reedmuller</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">8</span><span class="wsd-line wsd-right"><span class="wsd-kn">from</span><span class="wsd-w"> </span><span class="wsd-nn">reedmuller</span><span class="wsd-w"> </span><span class="wsd-kn">import</span><span class="n"> </span><span class="wsd-n">reedmuller</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">9</span><span class="wsd-line wsd-left"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">9</span><span class="wsd-line wsd-right"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">10</span><span class="wsd-line wsd-left"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">10</span><span class="wsd-line wsd-right"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">11</span><span class="wsd-line wsd-left"><span class="wsd-k">class</span><span class="wsd-w"> </span><span class="wsd-nc">Tag</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">11</span><span class="wsd-line wsd-right"><span class="wsd-k">class</span><span class="wsd-w"> </span><span class="wsd-nc">Tag</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">12</span><span class="wsd-line wsd-left"><span class="wsd-w"> </span><span class="wsd-sd">&quot;&quot;&quot; Helper class to ease creation of SVG. All API functions that create SVG allow you to substitute this with your</span></span></span>
<span class="wsd-lineno wsd-right">12</span><span class="wsd-line wsd-right"><span class="wsd-w"> </span><span class="wsd-sd">&quot;&quot;&quot; Helper class to ease creation of SVG. All API functions that create SVG allow you to substitute this with your</span></span></span>
<span class="wsd-lineno wsd-left">13</span><span class="wsd-line wsd-left"><span class="wsd-sd"> own implementation by passing a ``tag`` parameter. &quot;&quot;&quot;</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">13</span><span class="wsd-line wsd-right"><span class="wsd-sd"> own implementation by passing a ``tag`` parameter. &quot;&quot;&quot;</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">14</span><span class="wsd-line wsd-left"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">14</span><span class="wsd-line wsd-right"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">15</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-k">def</span><span class="wsd-w"> </span><span class="wsd-fm">__init__</span><span class="wsd-p">(</span><span class="wsd-bp">self</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">name</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">children</span><span class="wsd-o">=</span><span class="wsd-kc">None</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">root</span><span class="wsd-o">=</span><span class="wsd-kc">False</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-o">*</span><span class="wsd-o">*</span><span class="wsd-n">attrs</span><span class="wsd-p">)</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">15</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-k">def</span><span class="wsd-w"> </span><span class="wsd-fm">__init__</span><span class="wsd-p">(</span><span class="wsd-bp">self</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">name</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">children</span><span class="wsd-o">=</span><span class="wsd-kc">None</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">root</span><span class="wsd-o">=</span><span class="wsd-kc">False</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-o">*</span><span class="wsd-o">*</span><span class="wsd-n">attrs</span><span class="wsd-p">)</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">16</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-k">if</span><span class="n"> </span><span class="wsd-p">(</span><span class="wsd-n">fill</span><span class="n"> </span><span class="wsd-o">:=</span><span class="n"> </span><span class="wsd-n">attrs</span><span class="wsd-o">.</span><span class="wsd-n">get</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">fill</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-p">)</span><span class="n"> </span><span class="wsd-ow">and</span><span class="n"> </span><span class="wsd-nb">isinstance</span><span class="wsd-p">(</span><span class="wsd-n">fill</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-nb">tuple</span><span class="wsd-p">)</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">16</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-k">if</span><span class="n"> </span><span class="wsd-p">(</span><span class="wsd-n">fill</span><span class="n"> </span><span class="wsd-o">:=</span><span class="n"> </span><span class="wsd-n">attrs</span><span class="wsd-o">.</span><span class="wsd-n">get</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">fill</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-p">)</span><span class="n"> </span><span class="wsd-ow">and</span><span class="n"> </span><span class="wsd-nb">isinstance</span><span class="wsd-p">(</span><span class="wsd-n">fill</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-nb">tuple</span><span class="wsd-p">)</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">17</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">attrs</span><span class="wsd-p">[</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">fill</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">]</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">attrs</span><span class="wsd-p">[</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">fill-opacity</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">]</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">fill</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">17</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">attrs</span><span class="wsd-p">[</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">fill</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">]</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">attrs</span><span class="wsd-p">[</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">fill-opacity</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">]</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">fill</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">18</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-k">if</span><span class="n"> </span><span class="wsd-p">(</span><span class="wsd-n">stroke</span><span class="n"> </span><span class="wsd-o">:=</span><span class="n"> </span><span class="wsd-n">attrs</span><span class="wsd-o">.</span><span class="wsd-n">get</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">stroke</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-p">)</span><span class="n"> </span><span class="wsd-ow">and</span><span class="n"> </span><span class="wsd-nb">isinstance</span><span class="wsd-p">(</span><span class="wsd-n">stroke</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-nb">tuple</span><span class="wsd-p">)</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">18</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-k">if</span><span class="n"> </span><span class="wsd-p">(</span><span class="wsd-n">stroke</span><span class="n"> </span><span class="wsd-o">:=</span><span class="n"> </span><span class="wsd-n">attrs</span><span class="wsd-o">.</span><span class="wsd-n">get</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">stroke</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-p">)</span><span class="n"> </span><span class="wsd-ow">and</span><span class="n"> </span><span class="wsd-nb">isinstance</span><span class="wsd-p">(</span><span class="wsd-n">stroke</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-nb">tuple</span><span class="wsd-p">)</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">19</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">attrs</span><span class="wsd-p">[</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">stroke</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">]</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">attrs</span><span class="wsd-p">[</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">stroke-opacity</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">]</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">stroke</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">19</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">attrs</span><span class="wsd-p">[</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">stroke</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">]</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">attrs</span><span class="wsd-p">[</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">stroke-opacity</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">]</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">stroke</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">20</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-bp">self</span><span class="wsd-o">.</span><span class="wsd-n">name</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-bp">self</span><span class="wsd-o">.</span><span class="wsd-n">attrs</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">name</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">attrs</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">20</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-bp">self</span><span class="wsd-o">.</span><span class="wsd-n">name</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-bp">self</span><span class="wsd-o">.</span><span class="wsd-n">attrs</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">name</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">attrs</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">21</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-bp">self</span><span class="wsd-o">.</span><span class="wsd-n">children</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">children</span><span class="n"> </span><span class="wsd-ow">or</span><span class="n"> </span><span class="wsd-p">[</span><span class="wsd-p">]</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">21</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-bp">self</span><span class="wsd-o">.</span><span class="wsd-n">children</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">children</span><span class="n"> </span><span class="wsd-ow">or</span><span class="n"> </span><span class="wsd-p">[</span><span class="wsd-p">]</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">22</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-bp">self</span><span class="wsd-o">.</span><span class="wsd-n">root</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">root</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">22</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-bp">self</span><span class="wsd-o">.</span><span class="wsd-n">root</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">root</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">23</span><span class="wsd-line wsd-left"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">23</span><span class="wsd-line wsd-right"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">24</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-k">def</span><span class="wsd-w"> </span><span class="wsd-fm">__str__</span><span class="wsd-p">(</span><span class="wsd-bp">self</span><span class="wsd-p">)</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">24</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-k">def</span><span class="wsd-w"> </span><span class="wsd-fm">__str__</span><span class="wsd-p">(</span><span class="wsd-bp">self</span><span class="wsd-p">)</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">25</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">prefix</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">&lt;?xml version=</span><span class="wsd-s1">&quot;</span><span class="wsd-s1">1.0</span><span class="wsd-s1">&quot;</span><span class="wsd-s1"> encoding=</span><span class="wsd-s1">&quot;</span><span class="wsd-s1">utf-8</span><span class="wsd-s1">&quot;</span><span class="wsd-s1">?&gt;</span><span class="wsd-se">\n</span><span class="wsd-s1">&#x27;</span><span class="n"> </span><span class="wsd-k">if</span><span class="n"> </span><span class="wsd-bp">self</span><span class="wsd-o">.</span><span class="wsd-n">root</span><span class="n"> </span><span class="wsd-k">else</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">&#x27;</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">25</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">prefix</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">&lt;?xml version=</span><span class="wsd-s1">&quot;</span><span class="wsd-s1">1.0</span><span class="wsd-s1">&quot;</span><span class="wsd-s1"> encoding=</span><span class="wsd-s1">&quot;</span><span class="wsd-s1">utf-8</span><span class="wsd-s1">&quot;</span><span class="wsd-s1">?&gt;</span><span class="wsd-se">\n</span><span class="wsd-s1">&#x27;</span><span class="n"> </span><span class="wsd-k">if</span><span class="n"> </span><span class="wsd-bp">self</span><span class="wsd-o">.</span><span class="wsd-n">root</span><span class="n"> </span><span class="wsd-k">else</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">&#x27;</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">26</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">opening</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-o">.</span><span class="wsd-n">join</span><span class="wsd-p">(</span><span class="wsd-p">[</span><span class="wsd-bp">self</span><span class="wsd-o">.</span><span class="wsd-n">name</span><span class="wsd-p">]</span><span class="n"> </span><span class="wsd-o">+</span><span class="n"> </span><span class="wsd-p">[</span><span class="wsd-sa">f</span><span class="wsd-s1">&#x27;</span><span class="wsd-si">{</span><span class="wsd-n">key</span><span class="wsd-o">.</span><span class="wsd-n">replace</span><span class="wsd-p">(</span><span class="wsd-s2">&quot;</span><span class="wsd-s2">__</span><span class="wsd-s2">&quot;</span><span class="wsd-p">,</span><span class="wsd-w"> </span><span class="wsd-s2">&quot;</span><span class="wsd-s2">:</span><span class="wsd-s2">&quot;</span><span class="wsd-p">)</span><span class="wsd-o">.</span><span class="wsd-n">replace</span><span class="wsd-p">(</span><span class="wsd-s2">&quot;</span><span class="wsd-s2">_</span><span class="wsd-s2">&quot;</span><span class="wsd-p">,</span><span class="wsd-w"> </span><span class="wsd-s2">&quot;</span><span class="wsd-s2">-</span><span class="wsd-s2">&quot;</span><span class="wsd-p">)</span><span class="wsd-si">}</span><span class="wsd-s1">=</span><span class="wsd-s1">&quot;</span><span class="wsd-si">{</span><span class="wsd-n">value</span><span class="wsd-si">}</span><span class="wsd-s1">&quot;</span><span class="wsd-s1">&#x27;</span><span class="n"> </span><span class="wsd-k">for</span><span class="n"> </span><span class="wsd-n">key</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">value</span><span class="n"> </span><span class="wsd-ow">in</span><span class="n"> </span><span class="wsd-bp">self</span><span class="wsd-o">.</span><span class="wsd-n">attrs</span><span class="wsd-o">.</span><span class="wsd-n">items</span><span class="wsd-p">(</span><span class="wsd-p">)</span><span class="wsd-p">]</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">26</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">opening</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-o">.</span><span class="wsd-n">join</span><span class="wsd-p">(</span><span class="wsd-p">[</span><span class="wsd-bp">self</span><span class="wsd-o">.</span><span class="wsd-n">name</span><span class="wsd-p">]</span><span class="n"> </span><span class="wsd-o">+</span><span class="n"> </span><span class="wsd-p">[</span><span class="wsd-sa">f</span><span class="wsd-s1">&#x27;</span><span class="wsd-si">{</span><span class="wsd-n">key</span><span class="wsd-o">.</span><span class="wsd-n">replace</span><span class="wsd-p">(</span><span class="wsd-s2">&quot;</span><span class="wsd-s2">__</span><span class="wsd-s2">&quot;</span><span class="wsd-p">,</span><span class="wsd-w"> </span><span class="wsd-s2">&quot;</span><span class="wsd-s2">:</span><span class="wsd-s2">&quot;</span><span class="wsd-p">)</span><span class="wsd-o">.</span><span class="wsd-n">replace</span><span class="wsd-p">(</span><span class="wsd-s2">&quot;</span><span class="wsd-s2">_</span><span class="wsd-s2">&quot;</span><span class="wsd-p">,</span><span class="wsd-w"> </span><span class="wsd-s2">&quot;</span><span class="wsd-s2">-</span><span class="wsd-s2">&quot;</span><span class="wsd-p">)</span><span class="wsd-si">}</span><span class="wsd-s1">=</span><span class="wsd-s1">&quot;</span><span class="wsd-si">{</span><span class="wsd-n">value</span><span class="wsd-si">}</span><span class="wsd-s1">&quot;</span><span class="wsd-s1">&#x27;</span><span class="n"> </span><span class="wsd-k">for</span><span class="n"> </span><span class="wsd-n">key</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">value</span><span class="n"> </span><span class="wsd-ow">in</span><span class="n"> </span><span class="wsd-bp">self</span><span class="wsd-o">.</span><span class="wsd-n">attrs</span><span class="wsd-o">.</span><span class="wsd-n">items</span><span class="wsd-p">(</span><span class="wsd-p">)</span><span class="wsd-p">]</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">27</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-k">if</span><span class="n"> </span><span class="wsd-bp">self</span><span class="wsd-o">.</span><span class="wsd-n">children</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">27</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-k">if</span><span class="n"> </span><span class="wsd-bp">self</span><span class="wsd-o">.</span><span class="wsd-n">children</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">28</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">children</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-se">\n</span><span class="wsd-s1">&#x27;</span><span class="wsd-o">.</span><span class="wsd-n">join</span><span class="wsd-p">(</span><span class="wsd-n">textwrap</span><span class="wsd-o">.</span><span class="wsd-n">indent</span><span class="wsd-p">(</span><span class="wsd-nb">str</span><span class="wsd-p">(</span><span class="wsd-n">c</span><span class="wsd-p">)</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="n"> </span><span class="wsd-k">for</span><span class="n"> </span><span class="wsd-n">c</span><span class="n"> </span><span class="wsd-ow">in</span><span class="n"> </span><span class="wsd-bp">self</span><span class="wsd-o">.</span><span class="wsd-n">children</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">28</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">children</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-se">\n</span><span class="wsd-s1">&#x27;</span><span class="wsd-o">.</span><span class="wsd-n">join</span><span class="wsd-p">(</span><span class="wsd-n">textwrap</span><span class="wsd-o">.</span><span class="wsd-n">indent</span><span class="wsd-p">(</span><span class="wsd-nb">str</span><span class="wsd-p">(</span><span class="wsd-n">c</span><span class="wsd-p">)</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="n"> </span><span class="wsd-k">for</span><span class="n"> </span><span class="wsd-n">c</span><span class="n"> </span><span class="wsd-ow">in</span><span class="n"> </span><span class="wsd-bp">self</span><span class="wsd-o">.</span><span class="wsd-n">children</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">29</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-k">return</span><span class="n"> </span><span class="wsd-sa">f</span><span class="wsd-s1">&#x27;</span><span class="wsd-si">{</span><span class="wsd-n">prefix</span><span class="wsd-si">}</span><span class="wsd-s1">&lt;</span><span class="wsd-si">{</span><span class="wsd-n">opening</span><span class="wsd-si">}</span><span class="wsd-s1">&gt;</span><span class="wsd-se">\n</span><span class="wsd-si">{</span><span class="wsd-n">children</span><span class="wsd-si">}</span><span class="wsd-se">\n</span><span class="wsd-s1">&lt;/</span><span class="wsd-si">{</span><span class="wsd-bp">self</span><span class="wsd-o">.</span><span class="wsd-n">name</span><span class="wsd-si">}</span><span class="wsd-s1">&gt;</span><span class="wsd-s1">&#x27;</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">29</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-k">return</span><span class="n"> </span><span class="wsd-sa">f</span><span class="wsd-s1">&#x27;</span><span class="wsd-si">{</span><span class="wsd-n">prefix</span><span class="wsd-si">}</span><span class="wsd-s1">&lt;</span><span class="wsd-si">{</span><span class="wsd-n">opening</span><span class="wsd-si">}</span><span class="wsd-s1">&gt;</span><span class="wsd-se">\n</span><span class="wsd-si">{</span><span class="wsd-n">children</span><span class="wsd-si">}</span><span class="wsd-se">\n</span><span class="wsd-s1">&lt;/</span><span class="wsd-si">{</span><span class="wsd-bp">self</span><span class="wsd-o">.</span><span class="wsd-n">name</span><span class="wsd-si">}</span><span class="wsd-s1">&gt;</span><span class="wsd-s1">&#x27;</span><span class="wsd-w"></span></span></span>
</div>
<span class="wsd-lineno wsd-left">30</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-k">else</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">30</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-k">else</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">31</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-k">return</span><span class="n"> </span><span class="wsd-sa">f</span><span class="wsd-s1">&#x27;</span><span class="wsd-si">{</span><span class="wsd-n">prefix</span><span class="wsd-si">}</span><span class="wsd-s1">&lt;</span><span class="wsd-si">{</span><span class="wsd-n">opening</span><span class="wsd-si">}</span><span class="wsd-s1">/&gt;</span><span class="wsd-s1">&#x27;</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">31</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-k">return</span><span class="n"> </span><span class="wsd-sa">f</span><span class="wsd-s1">&#x27;</span><span class="wsd-si">{</span><span class="wsd-n">prefix</span><span class="wsd-si">}</span><span class="wsd-s1">&lt;</span><span class="wsd-si">{</span><span class="wsd-n">opening</span><span class="wsd-si">}</span><span class="wsd-s1">/&gt;</span><span class="wsd-s1">&#x27;</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">32</span><span class="wsd-line wsd-left"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">32</span><span class="wsd-line wsd-right"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">33</span><span class="wsd-line wsd-left"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">33</span><span class="wsd-line wsd-right"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">34</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-nd">@classmethod</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">34</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-nd">@classmethod</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left wsd-change">35</span><span class="wsd-line wsd-left wsd-change"><span class="n"> </span><span class="wsd-k">def</span><span class="wsd-w"> </span><span class="wsd-nf">setup_svg</span><span class="wsd-p">(</span><span class="wsd-n">kls</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">tags</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">bounds</span><span class="wsd-p">,</span><span class="wsd-n"></span><span class="n wsd-word-change"> </span><span class="wsd-n wsd-word-change">margin</span><span class="wsd-o wsd-word-change">=</span><span class="wsd-mi wsd-word-change">0</span><span class="wsd-p wsd-word-change">,</span><span class="wsd-n wsd-word-change"></span><span class="n"> </span><span class="wsd-n">unit</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">mm</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">pagecolor</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">white</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right wsd-change">35</span><span class="wsd-line wsd-right wsd-change"><span class="n"> </span><span class="wsd-k">def</span><span class="wsd-w"> </span><span class="wsd-nf">setup_svg</span><span class="wsd-p">(</span><span class="wsd-n">kls</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">tags</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">bounds</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">unit</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">mm</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">pagecolor</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">white</span><span class="wsd-s1">&#x27;</span><span class="wsd-wsd-p"></span><span class="wsd-p wsd-word-change">,</span><span class="n wsd-word-change"> </span><span class="wsd-n wsd-word-change">inkscape</span><span class="wsd-o wsd-word-change">=</span><span class="wsd-kc wsd-word-change">False</span><span class="wsd-wsd-p wsd-word-change"></span><span class="wsd-p">)</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">36</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-p">(</span><span class="wsd-n">min_x</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">min_y</span><span class="wsd-p">)</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-p">(</span><span class="wsd-n">max_x</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">max_y</span><span class="wsd-p">)</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">bounds</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">36</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-p">(</span><span class="wsd-n">min_x</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">min_y</span><span class="wsd-p">)</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-p">(</span><span class="wsd-n">max_x</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">max_y</span><span class="wsd-p">)</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">bounds</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left wsd-insert">37</span><span class="wsd-line wsd-left wsd-insert"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right wsd-empty"></span><span class="wsd-line wsd-right wsd-empty"></span>
<span class="wsd-lineno wsd-left wsd-insert">38</span><span class="wsd-line wsd-left wsd-insert"><span class="n"> </span><span class="wsd-k">if</span><span class="n"> </span><span class="wsd-n">margin</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right wsd-empty"></span><span class="wsd-line wsd-right wsd-empty"></span>
<span class="wsd-lineno wsd-left wsd-insert">39</span><span class="wsd-line wsd-left wsd-insert"><span class="n"> </span><span class="wsd-n">min_x</span><span class="n"> </span><span class="wsd-o">-</span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">margin</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right wsd-empty"></span><span class="wsd-line wsd-right wsd-empty"></span>
<span class="wsd-lineno wsd-left wsd-insert">40</span><span class="wsd-line wsd-left wsd-insert"><span class="n"> </span><span class="wsd-n">min_y</span><span class="n"> </span><span class="wsd-o">-</span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">margin</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right wsd-empty"></span><span class="wsd-line wsd-right wsd-empty"></span>
<span class="wsd-lineno wsd-left wsd-insert">41</span><span class="wsd-line wsd-left wsd-insert"><span class="n"> </span><span class="wsd-n">max_x</span><span class="n"> </span><span class="wsd-o">+</span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">margin</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right wsd-empty"></span><span class="wsd-line wsd-right wsd-empty"></span>
<span class="wsd-lineno wsd-left wsd-insert">42</span><span class="wsd-line wsd-left wsd-insert"><span class="n"> </span><span class="wsd-n">max_y</span><span class="n"> </span><span class="wsd-o">+</span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">margin</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right wsd-empty"></span><span class="wsd-line wsd-right wsd-empty"></span>
<span class="wsd-lineno wsd-left">43</span><span class="wsd-line wsd-left"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">37</span><span class="wsd-line wsd-right"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">44</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">w</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">h</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">max_x</span><span class="n"> </span><span class="wsd-o">-</span><span class="n"> </span><span class="wsd-n">min_x</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">max_y</span><span class="n"> </span><span class="wsd-o">-</span><span class="n"> </span><span class="wsd-n">min_y</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">38</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">w</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">h</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">max_x</span><span class="n"> </span><span class="wsd-o">-</span><span class="n"> </span><span class="wsd-n">min_x</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">max_y</span><span class="n"> </span><span class="wsd-o">-</span><span class="n"> </span><span class="wsd-n">min_y</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">45</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">w</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-mf">1.0</span><span class="n"> </span><span class="wsd-k">if</span><span class="n"> </span><span class="wsd-n">math</span><span class="wsd-o">.</span><span class="wsd-n">isclose</span><span class="wsd-p">(</span><span class="wsd-n">w</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-mf">0.0</span><span class="wsd-p">)</span><span class="n"> </span><span class="wsd-k">else</span><span class="n"> </span><span class="wsd-n">w</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">39</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">w</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-mf">1.0</span><span class="n"> </span><span class="wsd-k">if</span><span class="n"> </span><span class="wsd-n">math</span><span class="wsd-o">.</span><span class="wsd-n">isclose</span><span class="wsd-p">(</span><span class="wsd-n">w</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-mf">0.0</span><span class="wsd-p">)</span><span class="n"> </span><span class="wsd-k">else</span><span class="n"> </span><span class="wsd-n">w</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">46</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">h</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-mf">1.0</span><span class="n"> </span><span class="wsd-k">if</span><span class="n"> </span><span class="wsd-n">math</span><span class="wsd-o">.</span><span class="wsd-n">isclose</span><span class="wsd-p">(</span><span class="wsd-n">h</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-mf">0.0</span><span class="wsd-p">)</span><span class="n"> </span><span class="wsd-k">else</span><span class="n"> </span><span class="wsd-n">h</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">40</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">h</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-mf">1.0</span><span class="n"> </span><span class="wsd-k">if</span><span class="n"> </span><span class="wsd-n">math</span><span class="wsd-o">.</span><span class="wsd-n">isclose</span><span class="wsd-p">(</span><span class="wsd-n">h</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-mf">0.0</span><span class="wsd-p">)</span><span class="n"> </span><span class="wsd-k">else</span><span class="n"> </span><span class="wsd-n">h</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">47</span><span class="wsd-line wsd-left"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">41</span><span class="wsd-line wsd-right"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left wsd-empty"></span><span class="wsd-line wsd-left wsd-empty"></span>
<span class="wsd-lineno wsd-right wsd-insert">42</span><span class="wsd-line wsd-right wsd-insert"><span class="n"> </span><span class="wsd-k">if</span><span class="n"> </span><span class="wsd-n">inkscape</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left wsd-empty"></span><span class="wsd-line wsd-left wsd-empty"></span>
<span class="wsd-lineno wsd-right wsd-insert">43</span><span class="wsd-line wsd-right wsd-insert"><span class="n"> </span><span class="wsd-n">tags</span><span class="wsd-o">.</span><span class="wsd-n">insert</span><span class="wsd-p">(</span><span class="wsd-mi">0</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">kls</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">sodipodi:namedview</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-p">[</span><span class="wsd-p">]</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-nb">id</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">namedview1</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">pagecolor</span><span class="wsd-o">=</span><span class="wsd-n">pagecolor</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left wsd-empty"></span><span class="wsd-line wsd-left wsd-empty"></span>
<span class="wsd-lineno wsd-right wsd-insert">44</span><span class="wsd-line wsd-right wsd-insert"><span class="n"> </span><span class="wsd-n">inkscape__document_units</span><span class="wsd-o">=</span><span class="wsd-n">unit</span><span class="wsd-p">)</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left wsd-change">48</span><span class="wsd-line wsd-left wsd-change"><span class="n"> </span><span class="wsd-n">namespaces</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-nb">dict</span><span class="wsd-p">(</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right wsd-change">45</span><span class="wsd-line wsd-right wsd-change"><span class="wsd-n"></span><span class="wsd-n wsd-word-change"> </span><span class="n"> </span><span class="wsd-n">namespaces</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-nb">dict</span><span class="wsd-p">(</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left wsd-change">49</span><span class="wsd-line wsd-left wsd-change"><span class="n"> </span><span class="wsd-n">xmlns</span><span class="wsd-o">=</span><span class="wsd-s2">&quot;</span><span class="wsd-s2">http://www.w3.org/2000/svg</span><span class="wsd-s2">&quot;</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right wsd-change">46</span><span class="wsd-line wsd-right wsd-change"><span class="wsd-n"></span><span class="wsd-n wsd-word-change"> </span><span class="n"> </span><span class="wsd-n">xmlns</span><span class="wsd-o">=</span><span class="wsd-s2">&quot;</span><span class="wsd-s2">http://www.w3.org/2000/svg</span><span class="wsd-s2">&quot;</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left wsd-empty"></span><span class="wsd-line wsd-left wsd-empty"></span>
<span class="wsd-lineno wsd-right wsd-insert">47</span><span class="wsd-line wsd-right wsd-insert"><span class="n"> </span><span class="wsd-n">xmlns__xlink</span><span class="wsd-o">=</span><span class="wsd-s2">&quot;</span><span class="wsd-s2">http://www.w3.org/1999/xlink</span><span class="wsd-s2">&quot;</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left wsd-empty"></span><span class="wsd-line wsd-left wsd-empty"></span>
<span class="wsd-lineno wsd-right wsd-insert">48</span><span class="wsd-line wsd-right wsd-insert"><span class="n"> </span><span class="wsd-n">xmlns__sodipodi</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left wsd-empty"></span><span class="wsd-line wsd-left wsd-empty"></span>
<span class="wsd-lineno wsd-right wsd-insert">49</span><span class="wsd-line wsd-right wsd-insert"><span class="n"> </span><span class="wsd-n">xmlns__inkscape</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">http://www.inkscape.org/namespaces/inkscape</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left wsd-empty"></span><span class="wsd-line wsd-left wsd-empty"></span>
<span class="wsd-lineno wsd-right wsd-insert">50</span><span class="wsd-line wsd-right wsd-insert"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left wsd-empty"></span><span class="wsd-line wsd-left wsd-empty"></span>
<span class="wsd-lineno wsd-right wsd-insert">51</span><span class="wsd-line wsd-right wsd-insert"><span class="n"> </span><span class="wsd-k">else</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left wsd-empty"></span><span class="wsd-line wsd-left wsd-empty"></span>
<span class="wsd-lineno wsd-right wsd-insert">52</span><span class="wsd-line wsd-right wsd-insert"><span class="n"> </span><span class="wsd-n">namespaces</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-nb">dict</span><span class="wsd-p">(</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left wsd-empty"></span><span class="wsd-line wsd-left wsd-empty"></span>
<span class="wsd-lineno wsd-right wsd-insert">53</span><span class="wsd-line wsd-right wsd-insert"><span class="n"> </span><span class="wsd-n">xmlns</span><span class="wsd-o">=</span><span class="wsd-s2">&quot;</span><span class="wsd-s2">http://www.w3.org/2000/svg</span><span class="wsd-s2">&quot;</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left wsd-change">50</span><span class="wsd-line wsd-left wsd-change"><span class="n"> </span><span class="wsd-n">xmlns__xlink</span><span class="wsd-o">=</span><span class="wsd-s2">&quot;</span><span class="wsd-s2">http://www.w3.org/1999/xlink</span><span class="wsd-s2">&quot;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right wsd-change">54</span><span class="wsd-line wsd-right wsd-change"><span class="wsd-n"></span><span class="wsd-n wsd-word-change"> </span><span class="n"> </span><span class="wsd-n">xmlns__xlink</span><span class="wsd-o">=</span><span class="wsd-s2">&quot;</span><span class="wsd-s2">http://www.w3.org/1999/xlink</span><span class="wsd-s2">&quot;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">51</span><span class="wsd-line wsd-left"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">55</span><span class="wsd-line wsd-right"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">52</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-k">return</span><span class="n"> </span><span class="wsd-n">kls</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">svg</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">tags</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">56</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-k">return</span><span class="n"> </span><span class="wsd-n">kls</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">svg</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">tags</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">53</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">width</span><span class="wsd-o">=</span><span class="wsd-sa">f</span><span class="wsd-s1">&#x27;</span><span class="wsd-si">{</span><span class="wsd-n">w</span><span class="wsd-si">}</span><span class="wsd-si">{</span><span class="wsd-n">unit</span><span class="wsd-si">}</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">height</span><span class="wsd-o">=</span><span class="wsd-sa">f</span><span class="wsd-s1">&#x27;</span><span class="wsd-si">{</span><span class="wsd-n">h</span><span class="wsd-si">}</span><span class="wsd-si">{</span><span class="wsd-n">unit</span><span class="wsd-si">}</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">57</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">width</span><span class="wsd-o">=</span><span class="wsd-sa">f</span><span class="wsd-s1">&#x27;</span><span class="wsd-si">{</span><span class="wsd-n">w</span><span class="wsd-si">}</span><span class="wsd-si">{</span><span class="wsd-n">unit</span><span class="wsd-si">}</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">height</span><span class="wsd-o">=</span><span class="wsd-sa">f</span><span class="wsd-s1">&#x27;</span><span class="wsd-si">{</span><span class="wsd-n">h</span><span class="wsd-si">}</span><span class="wsd-si">{</span><span class="wsd-n">unit</span><span class="wsd-si">}</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">54</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">viewBox</span><span class="wsd-o">=</span><span class="wsd-sa">f</span><span class="wsd-s1">&#x27;</span><span class="wsd-si">{</span><span class="wsd-n">min_x</span><span class="wsd-si">}</span><span class="wsd-s1"> </span><span class="wsd-si">{</span><span class="wsd-n">min_y</span><span class="wsd-si">}</span><span class="wsd-s1"> </span><span class="wsd-si">{</span><span class="wsd-n">w</span><span class="wsd-si">}</span><span class="wsd-s1"> </span><span class="wsd-si">{</span><span class="wsd-n">h</span><span class="wsd-si">}</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">58</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">viewBox</span><span class="wsd-o">=</span><span class="wsd-sa">f</span><span class="wsd-s1">&#x27;</span><span class="wsd-si">{</span><span class="wsd-n">min_x</span><span class="wsd-si">}</span><span class="wsd-s1"> </span><span class="wsd-si">{</span><span class="wsd-n">min_y</span><span class="wsd-si">}</span><span class="wsd-s1"> </span><span class="wsd-si">{</span><span class="wsd-n">w</span><span class="wsd-si">}</span><span class="wsd-s1"> </span><span class="wsd-si">{</span><span class="wsd-n">h</span><span class="wsd-si">}</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">55</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">style</span><span class="wsd-o">=</span><span class="wsd-sa">f</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">background-color:</span><span class="wsd-si">{</span><span class="wsd-n">pagecolor</span><span class="wsd-si">}</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">59</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">style</span><span class="wsd-o">=</span><span class="wsd-sa">f</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">background-color:</span><span class="wsd-si">{</span><span class="wsd-n">pagecolor</span><span class="wsd-si">}</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<div class="wsd-collapse"><div class="wsd-collapse-controls"><label><input type="checkbox" checked> Collapse 49 unchanged lines</label></div>
<span class="wsd-lineno wsd-left">56</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-o">*</span><span class="wsd-o">*</span><span class="wsd-n">namespaces</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">60</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-o">*</span><span class="wsd-o">*</span><span class="wsd-n">namespaces</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">57</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">root</span><span class="wsd-o">=</span><span class="wsd-kc">True</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">61</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">root</span><span class="wsd-o">=</span><span class="wsd-kc">True</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">58</span><span class="wsd-line wsd-left"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">62</span><span class="wsd-line wsd-right"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">59</span><span class="wsd-line wsd-left"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">63</span><span class="wsd-line wsd-right"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">60</span><span class="wsd-line wsd-left"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">command</span><span class="wsd-p">(</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">64</span><span class="wsd-line wsd-right"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">command</span><span class="wsd-p">(</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">61</span><span class="wsd-line wsd-left"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">option</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">-h</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">--height</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-nb">type</span><span class="wsd-o">=</span><span class="wsd-nb">float</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">default</span><span class="wsd-o">=</span><span class="wsd-mi">20</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">help</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">Bar height in mm</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">65</span><span class="wsd-line wsd-right"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">option</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">-h</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">--height</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-nb">type</span><span class="wsd-o">=</span><span class="wsd-nb">float</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">default</span><span class="wsd-o">=</span><span class="wsd-mi">20</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">help</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">Bar height in mm</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">62</span><span class="wsd-line wsd-left"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">option</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">-t/-n</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">--text/--no-text</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">default</span><span class="wsd-o">=</span><span class="wsd-kc">True</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">help</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">Whether to add text containing the data under the bar code</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">66</span><span class="wsd-line wsd-right"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">option</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">-t/-n</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">--text/--no-text</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">default</span><span class="wsd-o">=</span><span class="wsd-kc">True</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">help</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">Whether to add text containing the data under the bar code</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">63</span><span class="wsd-line wsd-left"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">option</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">-f</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">--font</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">default</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">sans-serif</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">help</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">Font for the text underneath the bar code</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">67</span><span class="wsd-line wsd-right"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">option</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">-f</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">--font</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">default</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">sans-serif</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">help</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">Font for the text underneath the bar code</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">64</span><span class="wsd-line wsd-left"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">option</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">-s</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">--font-size</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-nb">type</span><span class="wsd-o">=</span><span class="wsd-nb">float</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">default</span><span class="wsd-o">=</span><span class="wsd-mi">12</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">help</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">Font size for the text underneath the bar code in points (pt)</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">68</span><span class="wsd-line wsd-right"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">option</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">-s</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">--font-size</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-nb">type</span><span class="wsd-o">=</span><span class="wsd-nb">float</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">default</span><span class="wsd-o">=</span><span class="wsd-mi">12</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">help</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">Font size for the text underneath the bar code in points (pt)</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">65</span><span class="wsd-line wsd-left"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">option</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">-b</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">--bar-width</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-nb">type</span><span class="wsd-o">=</span><span class="wsd-nb">float</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">default</span><span class="wsd-o">=</span><span class="wsd-mf">1.0</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">help</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">Bar width in mm</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">69</span><span class="wsd-line wsd-right"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">option</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">-b</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">--bar-width</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-nb">type</span><span class="wsd-o">=</span><span class="wsd-nb">float</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">default</span><span class="wsd-o">=</span><span class="wsd-mf">1.0</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">help</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">Bar width in mm</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">66</span><span class="wsd-line wsd-left"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">option</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">-m</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">--margin</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-nb">type</span><span class="wsd-o">=</span><span class="wsd-nb">float</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">default</span><span class="wsd-o">=</span><span class="wsd-mf">3.0</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">help</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">Margin around bar code in mm</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">70</span><span class="wsd-line wsd-right"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">option</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">-m</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">--margin</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-nb">type</span><span class="wsd-o">=</span><span class="wsd-nb">float</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">default</span><span class="wsd-o">=</span><span class="wsd-mf">3.0</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">help</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">Margin around bar code in mm</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">67</span><span class="wsd-line wsd-left"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">option</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">-c</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">--color</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">default</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">black</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">help</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">SVG color for the bar code</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">71</span><span class="wsd-line wsd-right"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">option</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">-c</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">--color</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">default</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">black</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">help</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">SVG color for the bar code</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">68</span><span class="wsd-line wsd-left"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">option</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">--text-color</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">default</span><span class="wsd-o">=</span><span class="wsd-kc">None</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">help</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">SVG color for the text (defaults to the bar code</span><span class="wsd-se">\&#x27;</span><span class="wsd-s1">s color)</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">72</span><span class="wsd-line wsd-right"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">option</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">--text-color</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">default</span><span class="wsd-o">=</span><span class="wsd-kc">None</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">help</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">SVG color for the text (defaults to the bar code</span><span class="wsd-se">\&#x27;</span><span class="wsd-s1">s color)</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">69</span><span class="wsd-line wsd-left"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">option</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">--dpi</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-nb">type</span><span class="wsd-o">=</span><span class="wsd-nb">float</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">default</span><span class="wsd-o">=</span><span class="wsd-mi">96</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">help</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">DPI value to assume for internal SVG unit conversions</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">73</span><span class="wsd-line wsd-right"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">option</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">--dpi</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-nb">type</span><span class="wsd-o">=</span><span class="wsd-nb">float</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">default</span><span class="wsd-o">=</span><span class="wsd-mi">96</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">help</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">DPI value to assume for internal SVG unit conversions</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">70</span><span class="wsd-line wsd-left"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">argument</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">data</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">74</span><span class="wsd-line wsd-right"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">argument</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">data</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">71</span><span class="wsd-line wsd-left"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">argument</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">outfile</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-nb">type</span><span class="wsd-o">=</span><span class="wsd-n">click</span><span class="wsd-o">.</span><span class="wsd-n">File</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">w</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">default</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">-</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">75</span><span class="wsd-line wsd-right"><span class="wsd-nd">@click</span><span class="wsd-o">.</span><span class="wsd-n">argument</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">outfile</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-nb">type</span><span class="wsd-o">=</span><span class="wsd-n">click</span><span class="wsd-o">.</span><span class="wsd-n">File</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">w</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">default</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">-</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">72</span><span class="wsd-line wsd-left"><span class="wsd-k">def</span><span class="wsd-w"> </span><span class="wsd-nf">cli</span><span class="wsd-p">(</span><span class="wsd-n">data</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">outfile</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">height</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">text</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">font</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">font_size</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">bar_width</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">margin</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">color</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">text_color</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">dpi</span><span class="wsd-p">)</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">76</span><span class="wsd-line wsd-right"><span class="wsd-k">def</span><span class="wsd-w"> </span><span class="wsd-nf">cli</span><span class="wsd-p">(</span><span class="wsd-n">data</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">outfile</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">height</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">text</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">font</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">font_size</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">bar_width</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">margin</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">color</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">text_color</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">dpi</span><span class="wsd-p">)</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">73</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">data</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-nb">int</span><span class="wsd-p">(</span><span class="wsd-n">data</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-mi">16</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">77</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">data</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-nb">int</span><span class="wsd-p">(</span><span class="wsd-n">data</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-mi">16</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">74</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">text_color</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">text_color</span><span class="n"> </span><span class="wsd-ow">or</span><span class="n"> </span><span class="wsd-n">color</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">78</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">text_color</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">text_color</span><span class="n"> </span><span class="wsd-ow">or</span><span class="n"> </span><span class="wsd-n">color</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">75</span><span class="wsd-line wsd-left"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">79</span><span class="wsd-line wsd-right"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">76</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">NUM_BITS</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-mi">26</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">80</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">NUM_BITS</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-mi">26</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">77</span><span class="wsd-line wsd-left"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">81</span><span class="wsd-line wsd-right"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">78</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">data_bits</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-p">[</span><span class="wsd-nb">bool</span><span class="wsd-p">(</span><span class="wsd-n">data</span><span class="n"> </span><span class="wsd-o">&amp;</span><span class="n"> </span><span class="wsd-p">(</span><span class="wsd-mi">1</span><span class="wsd-o">&lt;&lt;</span><span class="wsd-n">i</span><span class="wsd-p">)</span><span class="wsd-p">)</span><span class="n"> </span><span class="wsd-k">for</span><span class="n"> </span><span class="wsd-n">i</span><span class="n"> </span><span class="wsd-ow">in</span><span class="n"> </span><span class="wsd-nb">range</span><span class="wsd-p">(</span><span class="wsd-n">NUM_BITS</span><span class="wsd-p">)</span><span class="wsd-p">]</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">82</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">data_bits</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-p">[</span><span class="wsd-nb">bool</span><span class="wsd-p">(</span><span class="wsd-n">data</span><span class="n"> </span><span class="wsd-o">&amp;</span><span class="n"> </span><span class="wsd-p">(</span><span class="wsd-mi">1</span><span class="wsd-o">&lt;&lt;</span><span class="wsd-n">i</span><span class="wsd-p">)</span><span class="wsd-p">)</span><span class="n"> </span><span class="wsd-k">for</span><span class="n"> </span><span class="wsd-n">i</span><span class="n"> </span><span class="wsd-ow">in</span><span class="n"> </span><span class="wsd-nb">range</span><span class="wsd-p">(</span><span class="wsd-n">NUM_BITS</span><span class="wsd-p">)</span><span class="wsd-p">]</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">79</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">data_encoded</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">itertools</span><span class="wsd-o">.</span><span class="wsd-n">chain</span><span class="wsd-p">(</span><span class="wsd-o">*</span><span class="wsd-p">[</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">83</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">data_encoded</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">itertools</span><span class="wsd-o">.</span><span class="wsd-n">chain</span><span class="wsd-p">(</span><span class="wsd-o">*</span><span class="wsd-p">[</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">80</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-p">(</span><span class="wsd-n">a</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-ow">not</span><span class="n"> </span><span class="wsd-n">a</span><span class="wsd-p">)</span><span class="n"> </span><span class="wsd-k">for</span><span class="n"> </span><span class="wsd-n">a</span><span class="n"> </span><span class="wsd-ow">in</span><span class="n"> </span><span class="wsd-n">data_bits</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">84</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-p">(</span><span class="wsd-n">a</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-ow">not</span><span class="n"> </span><span class="wsd-n">a</span><span class="wsd-p">)</span><span class="n"> </span><span class="wsd-k">for</span><span class="n"> </span><span class="wsd-n">a</span><span class="n"> </span><span class="wsd-ow">in</span><span class="n"> </span><span class="wsd-n">data_bits</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">81</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-p">]</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">85</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-p">]</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">82</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">data_encoded</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-p">[</span><span class="wsd-kc">True</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-kc">False</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-kc">True</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-kc">False</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-o">*</span><span class="wsd-n">data_encoded</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-kc">False</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-kc">True</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-kc">True</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-kc">False</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-kc">True</span><span class="wsd-p">]</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">86</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">data_encoded</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-p">[</span><span class="wsd-kc">True</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-kc">False</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-kc">True</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-kc">False</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-o">*</span><span class="wsd-n">data_encoded</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-kc">False</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-kc">True</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-kc">True</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-kc">False</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-kc">True</span><span class="wsd-p">]</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">83</span><span class="wsd-line wsd-left"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">87</span><span class="wsd-line wsd-right"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">84</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">width</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-nb">len</span><span class="wsd-p">(</span><span class="wsd-n">data_encoded</span><span class="wsd-p">)</span><span class="n"> </span><span class="wsd-o">*</span><span class="n"> </span><span class="wsd-n">bar_width</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">88</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">width</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-nb">len</span><span class="wsd-p">(</span><span class="wsd-n">data_encoded</span><span class="wsd-p">)</span><span class="n"> </span><span class="wsd-o">*</span><span class="n"> </span><span class="wsd-n">bar_width</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">85</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-c1"># 1 px = 0.75 pt</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">89</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-c1"># 1 px = 0.75 pt</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">86</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">pt_to_mm</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-k">lambda</span><span class="n"> </span><span class="wsd-n">pt</span><span class="wsd-p">:</span><span class="n"> </span><span class="wsd-n">pt</span><span class="n"> </span><span class="wsd-o">/</span><span class="n"> </span><span class="wsd-mf">0.75</span><span class="n"> </span><span class="wsd-o">/</span><span class="wsd-n">dpi</span><span class="n"> </span><span class="wsd-o">*</span><span class="n"> </span><span class="wsd-mf">25.4</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">90</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">pt_to_mm</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-k">lambda</span><span class="n"> </span><span class="wsd-n">pt</span><span class="wsd-p">:</span><span class="n"> </span><span class="wsd-n">pt</span><span class="n"> </span><span class="wsd-o">/</span><span class="n"> </span><span class="wsd-mf">0.75</span><span class="n"> </span><span class="wsd-o">/</span><span class="wsd-n">dpi</span><span class="n"> </span><span class="wsd-o">*</span><span class="n"> </span><span class="wsd-mf">25.4</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">87</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">font_size</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">pt_to_mm</span><span class="wsd-p">(</span><span class="wsd-n">font_size</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">91</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">font_size</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">pt_to_mm</span><span class="wsd-p">(</span><span class="wsd-n">font_size</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">88</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">total_height</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">height</span><span class="n"> </span><span class="wsd-o">+</span><span class="n"> </span><span class="wsd-n">font_size</span><span class="wsd-o">*</span><span class="wsd-mi">2</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">92</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">total_height</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">height</span><span class="n"> </span><span class="wsd-o">+</span><span class="n"> </span><span class="wsd-n">font_size</span><span class="wsd-o">*</span><span class="wsd-mi">2</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">89</span><span class="wsd-line wsd-left"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">93</span><span class="wsd-line wsd-right"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">90</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">tags</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-p">[</span><span class="wsd-p">]</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">94</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">tags</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-p">[</span><span class="wsd-p">]</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">91</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-k">for</span><span class="n"> </span><span class="wsd-n">key</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">group</span><span class="n"> </span><span class="wsd-ow">in</span><span class="n"> </span><span class="wsd-n">itertools</span><span class="wsd-o">.</span><span class="wsd-n">groupby</span><span class="wsd-p">(</span><span class="wsd-nb">enumerate</span><span class="wsd-p">(</span><span class="wsd-n">data_encoded</span><span class="wsd-p">)</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">key</span><span class="wsd-o">=</span><span class="wsd-k">lambda</span><span class="n"> </span><span class="wsd-n">x</span><span class="wsd-p">:</span><span class="n"> </span><span class="wsd-n">x</span><span class="wsd-p">[</span><span class="wsd-mi">1</span><span class="wsd-p">]</span><span class="wsd-p">)</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">95</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-k">for</span><span class="n"> </span><span class="wsd-n">key</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">group</span><span class="n"> </span><span class="wsd-ow">in</span><span class="n"> </span><span class="wsd-n">itertools</span><span class="wsd-o">.</span><span class="wsd-n">groupby</span><span class="wsd-p">(</span><span class="wsd-nb">enumerate</span><span class="wsd-p">(</span><span class="wsd-n">data_encoded</span><span class="wsd-p">)</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">key</span><span class="wsd-o">=</span><span class="wsd-k">lambda</span><span class="n"> </span><span class="wsd-n">x</span><span class="wsd-p">:</span><span class="n"> </span><span class="wsd-n">x</span><span class="wsd-p">[</span><span class="wsd-mi">1</span><span class="wsd-p">]</span><span class="wsd-p">)</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">92</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-k">if</span><span class="n"> </span><span class="wsd-n">key</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">96</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-k">if</span><span class="n"> </span><span class="wsd-n">key</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">93</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">group</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-nb">list</span><span class="wsd-p">(</span><span class="wsd-n">group</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">97</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">group</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-nb">list</span><span class="wsd-p">(</span><span class="wsd-n">group</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">94</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">x0</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">_key</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">group</span><span class="wsd-p">[</span><span class="wsd-mi">0</span><span class="wsd-p">]</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">98</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">x0</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">_key</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-n">group</span><span class="wsd-p">[</span><span class="wsd-mi">0</span><span class="wsd-p">]</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">95</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">w</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-nb">len</span><span class="wsd-p">(</span><span class="wsd-n">group</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">99</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">w</span><span class="n"> </span><span class="wsd-o">=</span><span class="n"> </span><span class="wsd-nb">len</span><span class="wsd-p">(</span><span class="wsd-n">group</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">96</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">tags</span><span class="wsd-o">.</span><span class="wsd-n">append</span><span class="wsd-p">(</span><span class="wsd-n">Tag</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">path</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">stroke</span><span class="wsd-o">=</span><span class="wsd-n">color</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">stroke_width</span><span class="wsd-o">=</span><span class="wsd-n">w</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">d</span><span class="wsd-o">=</span><span class="wsd-sa">f</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">M </span><span class="wsd-si">{</span><span class="wsd-p">(</span><span class="wsd-n">x0</span><span class="wsd-w"> </span><span class="wsd-o">+</span><span class="wsd-w"> </span><span class="wsd-n">w</span><span class="wsd-o">/</span><span class="wsd-mi">2</span><span class="wsd-p">)</span><span class="wsd-o">*</span><span class="wsd-n">bar_width</span><span class="wsd-si">}</span><span class="wsd-s1"> 0 l 0 </span><span class="wsd-si">{</span><span class="wsd-n">height</span><span class="wsd-si">}</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">100</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">tags</span><span class="wsd-o">.</span><span class="wsd-n">append</span><span class="wsd-p">(</span><span class="wsd-n">Tag</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">path</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">stroke</span><span class="wsd-o">=</span><span class="wsd-n">color</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">stroke_width</span><span class="wsd-o">=</span><span class="wsd-n">w</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">d</span><span class="wsd-o">=</span><span class="wsd-sa">f</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">M </span><span class="wsd-si">{</span><span class="wsd-p">(</span><span class="wsd-n">x0</span><span class="wsd-w"> </span><span class="wsd-o">+</span><span class="wsd-w"> </span><span class="wsd-n">w</span><span class="wsd-o">/</span><span class="wsd-mi">2</span><span class="wsd-p">)</span><span class="wsd-o">*</span><span class="wsd-n">bar_width</span><span class="wsd-si">}</span><span class="wsd-s1"> 0 l 0 </span><span class="wsd-si">{</span><span class="wsd-n">height</span><span class="wsd-si">}</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">)</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">97</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">101</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">98</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-k">if</span><span class="n"> </span><span class="wsd-n">text</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">102</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-k">if</span><span class="n"> </span><span class="wsd-n">text</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">99</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">tags</span><span class="wsd-o">.</span><span class="wsd-n">append</span><span class="wsd-p">(</span><span class="wsd-n">Tag</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">text</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">children</span><span class="wsd-o">=</span><span class="wsd-p">[</span><span class="wsd-sa">f</span><span class="wsd-s1">&#x27;</span><span class="wsd-si">{</span><span class="wsd-n">data</span><span class="wsd-si">:</span><span class="wsd-s1">07x</span><span class="wsd-si">}</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">]</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">103</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">tags</span><span class="wsd-o">.</span><span class="wsd-n">append</span><span class="wsd-p">(</span><span class="wsd-n">Tag</span><span class="wsd-p">(</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">text</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">children</span><span class="wsd-o">=</span><span class="wsd-p">[</span><span class="wsd-sa">f</span><span class="wsd-s1">&#x27;</span><span class="wsd-si">{</span><span class="wsd-n">data</span><span class="wsd-si">:</span><span class="wsd-s1">07x</span><span class="wsd-si">}</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">]</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">100</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">x</span><span class="wsd-o">=</span><span class="wsd-n">width</span><span class="wsd-o">/</span><span class="wsd-mi">2</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">y</span><span class="wsd-o">=</span><span class="wsd-n">height</span><span class="n"> </span><span class="wsd-o">+</span><span class="n"> </span><span class="wsd-mf">0.5</span><span class="wsd-o">*</span><span class="wsd-n">font_size</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">104</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">x</span><span class="wsd-o">=</span><span class="wsd-n">width</span><span class="wsd-o">/</span><span class="wsd-mi">2</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">y</span><span class="wsd-o">=</span><span class="wsd-n">height</span><span class="n"> </span><span class="wsd-o">+</span><span class="n"> </span><span class="wsd-mf">0.5</span><span class="wsd-o">*</span><span class="wsd-n">font_size</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">101</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">font_family</span><span class="wsd-o">=</span><span class="wsd-n">font</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">font_size</span><span class="wsd-o">=</span><span class="wsd-sa">f</span><span class="wsd-s1">&#x27;</span><span class="wsd-si">{</span><span class="wsd-n">font_size</span><span class="wsd-si">:</span><span class="wsd-s1">.3f</span><span class="wsd-si">}</span><span class="wsd-s1">px</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">105</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">font_family</span><span class="wsd-o">=</span><span class="wsd-n">font</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">font_size</span><span class="wsd-o">=</span><span class="wsd-sa">f</span><span class="wsd-s1">&#x27;</span><span class="wsd-si">{</span><span class="wsd-n">font_size</span><span class="wsd-si">:</span><span class="wsd-s1">.3f</span><span class="wsd-si">}</span><span class="wsd-s1">px</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">102</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">text_anchor</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">middle</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">dominant_baseline</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">hanging</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">106</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">text_anchor</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">middle</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">dominant_baseline</span><span class="wsd-o">=</span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">hanging</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">,</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">103</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">fill</span><span class="wsd-o">=</span><span class="wsd-n">text_color</span><span class="wsd-p">)</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">107</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">fill</span><span class="wsd-o">=</span><span class="wsd-n">text_color</span><span class="wsd-p">)</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">104</span><span class="wsd-line wsd-left"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">108</span><span class="wsd-line wsd-right"><span class="wsd-w"></span></span></span>
</div>
<span class="wsd-lineno wsd-left">105</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">outfile</span><span class="wsd-o">.</span><span class="wsd-n">write</span><span class="wsd-p">(</span><span class="wsd-nb">str</span><span class="wsd-p">(</span><span class="wsd-n">Tag</span><span class="wsd-o">.</span><span class="wsd-n">setup_svg</span><span class="wsd-p">(</span><span class="wsd-n">tags</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">bounds</span><span class="wsd-o">=</span><span class="wsd-p">(</span><span class="wsd-p">(</span><span class="wsd-mi">0</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-mi">0</span><span class="wsd-p">)</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-p">(</span><span class="wsd-n">width</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">total_height</span><span class="wsd-p">)</span><span class="wsd-p">)</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">margin</span><span class="wsd-o">=</span><span class="wsd-n">margin</span><span class="wsd-p">)</span><span class="wsd-p">)</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">109</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">outfile</span><span class="wsd-o">.</span><span class="wsd-n">write</span><span class="wsd-p">(</span><span class="wsd-nb">str</span><span class="wsd-p">(</span><span class="wsd-n">Tag</span><span class="wsd-o">.</span><span class="wsd-n">setup_svg</span><span class="wsd-p">(</span><span class="wsd-n">tags</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">bounds</span><span class="wsd-o">=</span><span class="wsd-p">(</span><span class="wsd-p">(</span><span class="wsd-mi">0</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-mi">0</span><span class="wsd-p">)</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-p">(</span><span class="wsd-n">width</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">total_height</span><span class="wsd-p">)</span><span class="wsd-p">)</span><span class="wsd-p">,</span><span class="n"> </span><span class="wsd-n">margin</span><span class="wsd-o">=</span><span class="wsd-n">margin</span><span class="wsd-p">)</span><span class="wsd-p">)</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">106</span><span class="wsd-line wsd-left"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">110</span><span class="wsd-line wsd-right"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">107</span><span class="wsd-line wsd-left"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">111</span><span class="wsd-line wsd-right"><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">108</span><span class="wsd-line wsd-left"><span class="wsd-k">if</span><span class="n"> </span><span class="wsd-vm">__name__</span><span class="n"> </span><span class="wsd-o">==</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">__main__</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">112</span><span class="wsd-line wsd-right"><span class="wsd-k">if</span><span class="n"> </span><span class="wsd-vm">__name__</span><span class="n"> </span><span class="wsd-o">==</span><span class="n"> </span><span class="wsd-s1">&#x27;</span><span class="wsd-s1">__main__</span><span class="wsd-s1">&#x27;</span><span class="wsd-p">:</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-left">109</span><span class="wsd-line wsd-left"><span class="n"> </span><span class="wsd-n">cli</span><span class="wsd-p">(</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
<span class="wsd-lineno wsd-right">113</span><span class="wsd-line wsd-right"><span class="n"> </span><span class="wsd-n">cli</span><span class="wsd-p">(</span><span class="wsd-p">)</span><span class="wsd-w"></span></span></span>
</div>
</div>
</div>
</body>
</html>