Commit 29046c44f36099f4c979b1491fcf27db2f9184f9 manually edited the SVG file generated by Ditaa, which was kind of what we wanted to avoid having to do. Here is an automated way to take care of the same thing, by using an XSLT stylesheet. This also takes care of another smaller issue in the SVG generated by Graphviz.
-- Peter Eisentraut http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
From d60477ca234f761c5a3509f31b975576f63564ca Mon Sep 17 00:00:00 2001 From: Peter Eisentraut <pe...@eisentraut.org> Date: Tue, 11 Jun 2019 11:49:21 +0200 Subject: [PATCH] Add XSL stylesheet to fix up SVG files The SVG output produced by external tools needs some postprocessing. This is implemented by this new XSL stylesheet. Issues are: - SVG produced by Ditaa does not add a viewBox attribute to the svg element, needed to make the image scalable. - SVG produced by Graphviz uses a stroke="transparent" attribute, which is not valid SVG. It appears to mostly work, but FOP complains. Other tweaks can be added over time. This reverts 7dc78d8ef3e62f7e06d7767c63dcede048377b9a and 29046c44f36099f4c979b1491fcf27db2f9184f9, which applied these fixes manually. --- doc/src/sgml/images/Makefile | 12 +++++- doc/src/sgml/images/README | 11 ++--- doc/src/sgml/images/fixup-svg.xsl | 44 ++++++++++++++++++++ doc/src/sgml/images/gin.svg | 65 ++++++++++++++--------------- doc/src/sgml/images/pagelayout.svg | 66 ++++++++++++++---------------- 5 files changed, 119 insertions(+), 79 deletions(-) create mode 100644 doc/src/sgml/images/fixup-svg.xsl diff --git a/doc/src/sgml/images/Makefile b/doc/src/sgml/images/Makefile index bb508dd0dd..1e7993020b 100644 --- a/doc/src/sgml/images/Makefile +++ b/doc/src/sgml/images/Makefile @@ -8,11 +8,19 @@ ALL_IMAGES = \ DITAA = ditaa DOT = dot +XSLTPROC = xsltproc all: $(ALL_IMAGES) -%.svg: %.gv +%.svg.tmp: %.gv $(DOT) -T svg -o $@ $< -%.svg: %.txt +%.svg.tmp: %.txt $(DITAA) -E -S --svg $< $@ + +# Post-processing for SVG files coming from other tools +# +# Use --novalid to avoid loading SVG DTD if a file specifies it, since +# it might not be available locally, and we don't need it. +%.svg: %.svg.tmp fixup-svg.xsl + $(XSLTPROC) --novalid -o $@ $(word 2,$^) $< diff --git a/doc/src/sgml/images/README b/doc/src/sgml/images/README index ade627bda2..07c4580255 100644 --- a/doc/src/sgml/images/README +++ b/doc/src/sgml/images/README @@ -22,6 +22,10 @@ Therefore, any tool used needs to be able to produce SVG. This directory contains makefile rules to build SVG from common input formats, using some common styling. +fixup-svg.xsl applies some postprocessing to the SVG files produced by +those external tools to address assorted issues. See comments in +there, and adjust and expand as necessary. + Both the source and the SVG output file are committed in this directory. That way, we don't need all developers to have all the tools installed. While we accept that there could be some gratuitous @@ -59,10 +63,3 @@ Notes: - The width should be set to something. This ensures that the image is scaled to fit the page in PDF output. (Other widths than 100% might be appropriate.) - -- SVG images should be scalable as they will be rendered in a variety - of places (web, PDF, etc.) as well as in different viewports - (desktop, mobile, etc.). To help the images successfully scale, - employ a "viewBox" attribute in the SVG tag. For example, - to create an image with a default width and height of 400x300, - you would use viewBox="0.00 0.00 400.00 300.00" diff --git a/doc/src/sgml/images/fixup-svg.xsl b/doc/src/sgml/images/fixup-svg.xsl new file mode 100644 index 0000000000..d6c46b362e --- /dev/null +++ b/doc/src/sgml/images/fixup-svg.xsl @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:svg="http://www.w3.org/2000/svg" + version="1.0"> + +<!-- +Transform the SVG produced by various tools, applying assorted fixups. +--> + +<!-- +Add viewBox attribute to svg element if not already present. This allows the +image to scale. +--> +<xsl:template match="svg:svg"> + <xsl:copy> + <xsl:if test="not(@viewBox)"> + <xsl:attribute name="viewBox"> + <xsl:text>0 0 </xsl:text> + <xsl:value-of select="@width"/> + <xsl:text> </xsl:text> + <xsl:value-of select="@height"/> + </xsl:attribute> + </xsl:if> + <xsl:apply-templates select="@* | node()"/> + </xsl:copy> +</xsl:template> + +<!-- +Fix stroke="transparent" attribute, which is invalid SVG. +--> +<xsl:template match="@stroke[.='transparent']"> + <xsl:attribute name="stroke">none</xsl:attribute> +</xsl:template> + +<!-- +copy everything else +--> +<xsl:template match="@* | node()"> + <xsl:copy> + <xsl:apply-templates select="@* | node()"/> + </xsl:copy> +</xsl:template> + +</xsl:stylesheet> diff --git a/doc/src/sgml/images/gin.svg b/doc/src/sgml/images/gin.svg index eacb5c8c16..04fe85ba44 100644 --- a/doc/src/sgml/images/gin.svg +++ b/doc/src/sgml/images/gin.svg @@ -1,14 +1,11 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" - "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<?xml version="1.0"?> <!-- Generated by graphviz version 2.40.1 (20161225.0304) --> <!-- Title: gin Pages: 1 --> -<svg width="836pt" height="432pt" - viewBox="0.00 0.00 836.00 432.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="836pt" height="432pt" viewBox="0.00 0.00 836.00 432.00"> <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 428)"> <title>gin</title> -<polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-428 832,-428 832,4 -4,4"/> +<polygon fill="#ffffff" stroke="none" points="-4,4 -4,-428 832,-428 832,4 -4,4"/> <g id="clust1" class="cluster"> <title>cluster01</title> <polygon fill="none" stroke="#000000" points="100,-162 100,-380 694,-380 694,-162 100,-162"/> @@ -47,7 +44,7 @@ </g> <!-- m1->e1 --> <g id="edge24" class="edge"> -<title>m1->e1</title> +<title>m1->e1</title> <path fill="none" stroke="#000000" d="M593.4778,-387.8976C568.2655,-377.6464 536.5468,-364.7498 509.931,-353.928"/> <polygon fill="#000000" stroke="#000000" points="510.9595,-350.568 500.3776,-350.0436 508.3229,-357.0525 510.9595,-350.568"/> </g> @@ -58,7 +55,7 @@ </g> <!-- m1->n1 --> <g id="edge28" class="edge"> -<title>m1->n1</title> +<title>m1->n1</title> <path fill="none" stroke="#000000" d="M683.1514,-387.8551C688.2504,-385.3905 693.2983,-382.7547 698,-380 709.7018,-373.1438 721.7385,-364.4455 732.115,-356.3423"/> <polygon fill="#000000" stroke="#000000" points="734.4083,-358.9902 740.0427,-350.0178 730.0428,-353.5181 734.4083,-358.9902"/> </g> @@ -69,7 +66,7 @@ </g> <!-- e1->e2 --> <g id="edge9" class="edge"> -<title>e1->e2</title> +<title>e1->e2</title> <path fill="none" stroke="#000000" d="M411.0831,-313.8314C387.065,-304.1162 357.3166,-292.0831 332.0408,-281.8592"/> <polygon fill="#000000" stroke="#000000" points="333.1767,-278.5432 322.5939,-278.038 330.5518,-285.0325 333.1767,-278.5432"/> </g> @@ -80,7 +77,7 @@ </g> <!-- e1->e3 --> <g id="edge8" class="edge"> -<title>e1->e3</title> +<title>e1->e3</title> <path fill="none" stroke="#000000" d="M441.1118,-313.8314C434.247,-305.454 425.9699,-295.3531 418.4489,-286.1749"/> <polygon fill="#000000" stroke="#000000" points="421.1341,-283.9297 412.0886,-278.4133 415.7197,-288.3665 421.1341,-283.9297"/> </g> @@ -91,13 +88,13 @@ </g> <!-- e1->e4 --> <g id="edge7" class="edge"> -<title>e1->e4</title> +<title>e1->e4</title> <path fill="none" stroke="#000000" d="M471.1405,-313.8314C478.1217,-305.454 486.5391,-295.3531 494.1876,-286.1749"/> <polygon fill="#000000" stroke="#000000" points="496.9425,-288.3362 500.6556,-278.4133 491.5649,-283.8548 496.9425,-288.3362"/> </g> <!-- e2->e3 --> <g id="edge1" class="edge"> -<title>e2->e3</title> +<title>e2->e3</title> <path fill="none" stroke="#000000" d="M328.668,-260C331.1453,-260 333.6227,-260 336.1001,-260"/> <polygon fill="#000000" stroke="#000000" points="336.2849,-263.5001 346.2848,-260 336.2848,-256.5001 336.2849,-263.5001"/> </g> @@ -108,7 +105,7 @@ </g> <!-- e2->e5 --> <g id="edge10" class="edge"> -<title>e2->e5</title> +<title>e2->e5</title> <path fill="none" stroke="#000000" d="M247.9713,-241.8314C232.7504,-232.6221 214.0872,-221.3301 197.7917,-211.4706"/> <polygon fill="#000000" stroke="#000000" points="199.3868,-208.345 189.0191,-206.1628 195.7631,-214.3341 199.3868,-208.345"/> </g> @@ -120,13 +117,13 @@ </g> <!-- e2->e6 --> <g id="edge11" class="edge"> -<title>e2->e6</title> +<title>e2->e6</title> <path fill="none" stroke="#000000" d="M278,-241.8314C278,-234.131 278,-224.9743 278,-216.4166"/> <polygon fill="#000000" stroke="#000000" points="281.5001,-216.4132 278,-206.4133 274.5001,-216.4133 281.5001,-216.4132"/> </g> <!-- e3->e4 --> <g id="edge2" class="edge"> -<title>e3->e4</title> +<title>e3->e4</title> <path fill="none" stroke="#000000" d="M447.668,-260C450.1453,-260 452.6227,-260 455.1001,-260"/> <polygon fill="#000000" stroke="#000000" points="455.2849,-263.5001 465.2848,-260 455.2848,-256.5001 455.2849,-263.5001"/> </g> @@ -137,7 +134,7 @@ </g> <!-- e3->e7 --> <g id="edge12" class="edge"> -<title>e3->e7</title> +<title>e3->e7</title> <path fill="none" stroke="#000000" d="M397,-241.8314C397,-234.131 397,-224.9743 397,-216.4166"/> <polygon fill="#000000" stroke="#000000" points="400.5001,-216.4132 397,-206.4133 393.5001,-216.4133 400.5001,-216.4132"/> </g> @@ -149,7 +146,7 @@ </g> <!-- e4->e8 --> <g id="edge13" class="edge"> -<title>e4->e8</title> +<title>e4->e8</title> <path fill="none" stroke="#000000" d="M516,-241.8314C516,-234.131 516,-224.9743 516,-216.4166"/> <polygon fill="#000000" stroke="#000000" points="519.5001,-216.4132 516,-206.4133 512.5001,-216.4133 519.5001,-216.4132"/> </g> @@ -161,13 +158,13 @@ </g> <!-- e4->e9 --> <g id="edge14" class="edge"> -<title>e4->e9</title> +<title>e4->e9</title> <path fill="none" stroke="#000000" d="M546.0287,-241.8314C561.2496,-232.6221 579.9128,-221.3301 596.2083,-211.4706"/> <polygon fill="#000000" stroke="#000000" points="598.2369,-214.3341 604.9809,-206.1628 594.6132,-208.345 598.2369,-214.3341"/> </g> <!-- e5->e6 --> <g id="edge3" class="edge"> -<title>e5->e6</title> +<title>e5->e6</title> <path fill="none" stroke="#000000" d="M209.668,-188C212.1453,-188 214.6227,-188 217.1001,-188"/> <polygon fill="#000000" stroke="#000000" points="217.2849,-191.5001 227.2848,-188 217.2848,-184.5001 217.2849,-191.5001"/> </g> @@ -178,19 +175,19 @@ </g> <!-- e5->p1 --> <g id="edge25" class="edge"> -<title>e5->p1</title> +<title>e5->p1</title> <path fill="none" stroke="#000000" d="M159,-169.8015C159,-159.3976 159,-146.1215 159,-134.3768"/> <polygon fill="#000000" stroke="#000000" points="162.5001,-134.1476 159,-124.1476 155.5001,-134.1476 162.5001,-134.1476"/> </g> <!-- e6->e7 --> <g id="edge4" class="edge"> -<title>e6->e7</title> +<title>e6->e7</title> <path fill="none" stroke="#000000" d="M328.668,-188C331.1453,-188 333.6227,-188 336.1001,-188"/> <polygon fill="#000000" stroke="#000000" points="336.2849,-191.5001 346.2848,-188 336.2848,-184.5001 336.2849,-191.5001"/> </g> <!-- e7->e8 --> <g id="edge5" class="edge"> -<title>e7->e8</title> +<title>e7->e8</title> <path fill="none" stroke="#000000" d="M447.668,-188C450.1453,-188 452.6227,-188 455.1001,-188"/> <polygon fill="#000000" stroke="#000000" points="455.2849,-191.5001 465.2848,-188 455.2848,-184.5001 455.2849,-191.5001"/> </g> @@ -202,7 +199,7 @@ </g> <!-- e7->p4 --> <g id="edge26" class="edge"> -<title>e7->p4</title> +<title>e7->p4</title> <path fill="none" stroke="#000000" d="M383.906,-169.8015C376.0383,-158.8668 365.8878,-144.7593 357.133,-132.5916"/> <polygon fill="#000000" stroke="#000000" points="359.7389,-130.2207 351.0574,-124.1476 354.0569,-134.309 359.7389,-130.2207"/> </g> @@ -213,13 +210,13 @@ </g> <!-- e7->p5 --> <g id="edge27" class="edge"> -<title>e7->p5</title> +<title>e7->p5</title> <path fill="none" stroke="#000000" d="M411.8695,-169.8015C420.8907,-158.7606 432.5549,-144.4851 442.5618,-132.2378"/> <polygon fill="#000000" stroke="#000000" points="445.5552,-134.1059 449.1721,-124.1476 440.1345,-129.6768 445.5552,-134.1059"/> </g> <!-- e8->e9 --> <g id="edge6" class="edge"> -<title>e8->e9</title> +<title>e8->e9</title> <path fill="none" stroke="#000000" d="M566.668,-188C569.1453,-188 571.6227,-188 574.1001,-188"/> <polygon fill="#000000" stroke="#000000" points="574.2849,-191.5001 584.2848,-188 574.2848,-184.5001 574.2849,-191.5001"/> </g> @@ -231,7 +228,7 @@ </g> <!-- p1->p2 --> <g id="edge16" class="edge"> -<title>p1->p2</title> +<title>p1->p2</title> <path fill="none" stroke="#000000" d="M135.7845,-87.8314C124.453,-78.9632 110.6536,-68.1637 98.3973,-58.5718"/> <polygon fill="#000000" stroke="#000000" points="100.2402,-55.5697 90.2081,-52.1628 95.926,-61.0822 100.2402,-55.5697"/> </g> @@ -243,13 +240,13 @@ </g> <!-- p1->p3 --> <g id="edge17" class="edge"> -<title>p1->p3</title> +<title>p1->p3</title> <path fill="none" stroke="#000000" d="M165.8132,-87.8314C168.7644,-79.9617 172.2858,-70.5712 175.555,-61.8533"/> <polygon fill="#000000" stroke="#000000" points="178.8609,-63.0055 179.095,-52.4133 172.3066,-60.5476 178.8609,-63.0055"/> </g> <!-- p2->p3 --> <g id="edge15" class="edge"> -<title>p2->p3</title> +<title>p2->p3</title> <path fill="none" stroke="#000000" d="M117.668,-34C120.1453,-34 122.6227,-34 125.1001,-34"/> <polygon fill="#000000" stroke="#000000" points="125.2849,-37.5001 135.2848,-34 125.2848,-30.5001 125.2849,-37.5001"/> </g> @@ -261,7 +258,7 @@ </g> <!-- p5->p6 --> <g id="edge19" class="edge"> -<title>p5->p6</title> +<title>p5->p6</title> <path fill="none" stroke="#000000" d="M464,-87.8314C464,-80.131 464,-70.9743 464,-62.4166"/> <polygon fill="#000000" stroke="#000000" points="467.5001,-62.4132 464,-52.4133 460.5001,-62.4133 467.5001,-62.4132"/> </g> @@ -273,13 +270,13 @@ </g> <!-- p5->p7 --> <g id="edge20" class="edge"> -<title>p5->p7</title> +<title>p5->p7</title> <path fill="none" stroke="#000000" d="M494.0287,-87.8314C509.2496,-78.6221 527.9128,-67.3301 544.2083,-57.4706"/> <polygon fill="#000000" stroke="#000000" points="546.2369,-60.3341 552.9809,-52.1628 542.6132,-54.345 546.2369,-60.3341"/> </g> <!-- p6->p7 --> <g id="edge18" class="edge"> -<title>p6->p7</title> +<title>p6->p7</title> <path fill="none" stroke="#000000" d="M514.668,-34C517.1453,-34 519.6227,-34 522.1001,-34"/> <polygon fill="#000000" stroke="#000000" points="522.2849,-37.5001 532.2848,-34 522.2848,-30.5001 522.2849,-37.5001"/> </g> @@ -290,7 +287,7 @@ </g> <!-- n1->n2 --> <g id="edge21" class="edge"> -<title>n1->n2</title> +<title>n1->n2</title> <path fill="none" stroke="#000000" d="M761,-313.8314C761,-306.131 761,-296.9743 761,-288.4166"/> <polygon fill="#000000" stroke="#000000" points="764.5001,-288.4132 761,-278.4133 757.5001,-288.4133 764.5001,-288.4132"/> </g> @@ -301,7 +298,7 @@ </g> <!-- n2->n3 --> <g id="edge22" class="edge"> -<title>n2->n3</title> +<title>n2->n3</title> <path fill="none" stroke="#000000" d="M761,-241.8314C761,-234.131 761,-224.9743 761,-216.4166"/> <polygon fill="#000000" stroke="#000000" points="764.5001,-216.4132 761,-206.4133 757.5001,-216.4133 764.5001,-216.4132"/> </g> @@ -312,7 +309,7 @@ </g> <!-- n3->n4 --> <g id="edge23" class="edge"> -<title>n3->n4</title> +<title>n3->n4</title> <path fill="none" stroke="#000000" d="M761,-169.8015C761,-159.3976 761,-146.1215 761,-134.3768"/> <polygon fill="#000000" stroke="#000000" points="764.5001,-134.1476 761,-124.1476 757.5001,-134.1476 764.5001,-134.1476"/> </g> diff --git a/doc/src/sgml/images/pagelayout.svg b/doc/src/sgml/images/pagelayout.svg index 3cf89f0a14..5b2caaf170 100644 --- a/doc/src/sgml/images/pagelayout.svg +++ b/doc/src/sgml/images/pagelayout.svg @@ -1,41 +1,35 @@ -<?xml version='1.0' encoding='UTF-8' standalone='no'?> -<svg - xmlns='http://www.w3.org/2000/svg' - width='610' - height='210' - viewBox='0.00 0.00 610.00 210.00' - shape-rendering='geometricPrecision' - version='1.0'> +<?xml version="1.0"?> +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 610 210" width="610" height="210" shape-rendering="geometricPrecision" version="1.0"> <defs> - <filter id='f2' x='0' y='0' width='200%' height='200%'> - <feOffset result='offOut' in='SourceGraphic' dx='5' dy='5' /> - <feGaussianBlur result='blurOut' in='offOut' stdDeviation='3' /> - <feBlend in='SourceGraphic' in2='blurOut' mode='normal' /> + <filter id="f2" x="0" y="0" width="200%" height="200%"> + <feOffset result="offOut" in="SourceGraphic" dx="5" dy="5"/> + <feGaussianBlur result="blurOut" in="offOut" stdDeviation="3"/> + <feBlend in="SourceGraphic" in2="blurOut" mode="normal"/> </filter> </defs> - <g stroke-width='1' stroke-linecap='square' stroke-linejoin='round'> - <rect x='0' y='0' width='610' height='210' style='fill: #ffffff'/> - <path stroke='#000000' stroke-width='1.000000' stroke-linecap='round' stroke-linejoin='round' fill='white' d='M25.0 35.0 L25.0 175.0 L585.0 175.0 L585.0 35.0 z' /> - <path stroke='#000000' stroke-width='1.000000' stroke-linecap='round' stroke-linejoin='round' fill='white' d='M305.0 175.0 L485.0 175.0 L485.0 147.0 L305.0 147.0 z' /> - <path stroke='#000000' stroke-width='1.000000' stroke-linecap='round' stroke-linejoin='round' fill='white' d='M25.0 35.0 L25.0 63.0 L195.0 63.0 L195.0 35.0 z' /> - <path stroke='#000000' stroke-width='1.000000' stroke-linecap='round' stroke-linejoin='round' fill='white' d='M305.0 147.0 L305.0 175.0 L195.0 175.0 L195.0 147.0 z' /> - <path stroke='#000000' stroke-width='1.000000' stroke-linecap='round' stroke-linejoin='round' fill='white' d='M325.0 63.0 L325.0 91.0 L265.0 91.0 L265.0 105.0 L235.0 105.0 L235.0 63.0 z' /> - <path stroke='#000000' stroke-width='1.000000' stroke-linecap='round' stroke-linejoin='round' fill='white' d='M585.0 147.0 L585.0 175.0 L485.0 175.0 L485.0 147.0 z' /> - <path stroke='#000000' stroke-width='1.000000' stroke-linecap='round' stroke-linejoin='round' fill='white' d='M195.0 35.0 L285.0 35.0 L285.0 63.0 L195.0 63.0 z' /> - <path stroke='#000000' stroke-width='1.000000' stroke-linecap='round' stroke-linejoin='round' fill='white' d='M375.0 35.0 L375.0 63.0 L285.0 63.0 L285.0 35.0 z' /> - <path stroke='#000000' stroke-width='1.000000' stroke-linecap='round' stroke-linejoin='round' fill='none' d='M335.0 133.0 L335.0 105.0 L265.0 105.0 ' /> - <path stroke='none' stroke-width='1.000000' stroke-linecap='round' stroke-linejoin='round' fill='#000000' d='M470.0 42.0 L480.0 49.0 L470.0 56.0 z' /> - <path stroke='none' stroke-width='1.000000' stroke-linecap='round' stroke-linejoin='round' fill='#000000' d='M260.0 126.0 L265.0 140.0 L270.0 126.0 z' /> - <path stroke='none' stroke-width='1.000000' stroke-linecap='round' stroke-linejoin='round' fill='#000000' d='M330.0 126.0 L335.0 140.0 L340.0 126.0 z' /> - <path stroke='none' stroke-width='1.000000' stroke-linecap='round' stroke-linejoin='round' fill='#000000' d='M140.0 154.0 L130.0 161.0 L140.0 168.0 z' /> - <path stroke='#000000' stroke-width='1.000000' stroke-linecap='round' stroke-linejoin='round' fill='none' d='M265.0 105.0 L265.0 133.0 ' /> - <path stroke='#000000' stroke-width='1.000000' stroke-dasharray='5.000000,5.000000' stroke-miterlimit='0' stroke-linecap='butt' stroke-linejoin='round' fill='white' d='M375.0 49.0 L475.0 49.0 ' /> - <path stroke='#000000' stroke-width='1.000000' stroke-dasharray='5.000000,5.000000' stroke-miterlimit='0' stroke-linecap='butt' stroke-linejoin='round' fill='white' d='M135.0 161.0 L195.0 161.0 ' /> - <text x='48' y='54' font-family='Courier' font-size='15' stroke='none' fill='#000000' ><![CDATA[PageHeaderData]]></text> - <text x='214' y='166' font-family='Courier' font-size='15' stroke='none' fill='#000000' ><![CDATA[Item]]></text> - <text x='216' y='54' font-family='Courier' font-size='15' stroke='none' fill='#000000' ><![CDATA[ItemId]]></text> - <text x='306' y='54' font-family='Courier' font-size='15' stroke='none' fill='#000000' ><![CDATA[ItemId]]></text> - <text x='324' y='166' font-family='Courier' font-size='15' stroke='none' fill='#000000' ><![CDATA[Item]]></text> - <text x='509' y='166' font-family='Courier' font-size='15' stroke='none' fill='#000000' ><![CDATA[Special]]></text> + <g stroke-width="1" stroke-linecap="square" stroke-linejoin="round"> + <rect x="0" y="0" width="610" height="210" style="fill: #ffffff"/> + <path stroke="#000000" stroke-width="1.000000" stroke-linecap="round" stroke-linejoin="round" fill="white" d="M25.0 35.0 L25.0 175.0 L585.0 175.0 L585.0 35.0 z"/> + <path stroke="#000000" stroke-width="1.000000" stroke-linecap="round" stroke-linejoin="round" fill="white" d="M305.0 175.0 L485.0 175.0 L485.0 147.0 L305.0 147.0 z"/> + <path stroke="#000000" stroke-width="1.000000" stroke-linecap="round" stroke-linejoin="round" fill="white" d="M25.0 35.0 L25.0 63.0 L195.0 63.0 L195.0 35.0 z"/> + <path stroke="#000000" stroke-width="1.000000" stroke-linecap="round" stroke-linejoin="round" fill="white" d="M305.0 147.0 L305.0 175.0 L195.0 175.0 L195.0 147.0 z"/> + <path stroke="#000000" stroke-width="1.000000" stroke-linecap="round" stroke-linejoin="round" fill="white" d="M325.0 63.0 L325.0 91.0 L265.0 91.0 L265.0 105.0 L235.0 105.0 L235.0 63.0 z"/> + <path stroke="#000000" stroke-width="1.000000" stroke-linecap="round" stroke-linejoin="round" fill="white" d="M585.0 147.0 L585.0 175.0 L485.0 175.0 L485.0 147.0 z"/> + <path stroke="#000000" stroke-width="1.000000" stroke-linecap="round" stroke-linejoin="round" fill="white" d="M195.0 35.0 L285.0 35.0 L285.0 63.0 L195.0 63.0 z"/> + <path stroke="#000000" stroke-width="1.000000" stroke-linecap="round" stroke-linejoin="round" fill="white" d="M375.0 35.0 L375.0 63.0 L285.0 63.0 L285.0 35.0 z"/> + <path stroke="#000000" stroke-width="1.000000" stroke-linecap="round" stroke-linejoin="round" fill="none" d="M335.0 133.0 L335.0 105.0 L265.0 105.0 "/> + <path stroke="none" stroke-width="1.000000" stroke-linecap="round" stroke-linejoin="round" fill="#000000" d="M470.0 42.0 L480.0 49.0 L470.0 56.0 z"/> + <path stroke="none" stroke-width="1.000000" stroke-linecap="round" stroke-linejoin="round" fill="#000000" d="M260.0 126.0 L265.0 140.0 L270.0 126.0 z"/> + <path stroke="none" stroke-width="1.000000" stroke-linecap="round" stroke-linejoin="round" fill="#000000" d="M330.0 126.0 L335.0 140.0 L340.0 126.0 z"/> + <path stroke="none" stroke-width="1.000000" stroke-linecap="round" stroke-linejoin="round" fill="#000000" d="M140.0 154.0 L130.0 161.0 L140.0 168.0 z"/> + <path stroke="#000000" stroke-width="1.000000" stroke-linecap="round" stroke-linejoin="round" fill="none" d="M265.0 105.0 L265.0 133.0 "/> + <path stroke="#000000" stroke-width="1.000000" stroke-dasharray="5.000000,5.000000" stroke-miterlimit="0" stroke-linecap="butt" stroke-linejoin="round" fill="white" d="M375.0 49.0 L475.0 49.0 "/> + <path stroke="#000000" stroke-width="1.000000" stroke-dasharray="5.000000,5.000000" stroke-miterlimit="0" stroke-linecap="butt" stroke-linejoin="round" fill="white" d="M135.0 161.0 L195.0 161.0 "/> + <text x="48" y="54" font-family="Courier" font-size="15" stroke="none" fill="#000000">PageHeaderData</text> + <text x="214" y="166" font-family="Courier" font-size="15" stroke="none" fill="#000000">Item</text> + <text x="216" y="54" font-family="Courier" font-size="15" stroke="none" fill="#000000">ItemId</text> + <text x="306" y="54" font-family="Courier" font-size="15" stroke="none" fill="#000000">ItemId</text> + <text x="324" y="166" font-family="Courier" font-size="15" stroke="none" fill="#000000">Item</text> + <text x="509" y="166" font-family="Courier" font-size="15" stroke="none" fill="#000000">Special</text> </g> </svg> -- 2.21.0