From eb182278adbaa6f7dd9cdeaf18b26c2885b32f41 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Mon, 17 Jul 2017 15:12:39 -0700 Subject: [PATCH] spv-file-format: Improve description of file format. --- doc/automake.mk | 14 - doc/dev/spv-file-format.texi | 150 ++++++-- doc/dev/spv-structure.eps | 728 ----------------------------------- doc/dev/spv-structure.gv | 37 -- doc/dev/spv-structure.pdf | Bin 17342 -> 0 bytes 5 files changed, 127 insertions(+), 802 deletions(-) delete mode 100644 doc/dev/spv-structure.eps delete mode 100644 doc/dev/spv-structure.gv delete mode 100644 doc/dev/spv-structure.pdf diff --git a/doc/automake.mk b/doc/automake.mk index 28866ca2e9..c571a236d2 100644 --- a/doc/automake.mk +++ b/doc/automake.mk @@ -45,20 +45,6 @@ doc_pspp_dev_TEXINFOS = doc/version-dev.texi \ doc/dev/encrypted-file-wrappers.texi \ doc/dev/q2c.texi -if HAVE_DOT -$(PDFS): doc/dev/spv-structure.pdf -$(srcdir)/doc/dev/spv-structure.pdf: doc/dev/spv-structure.gv - dot -Tpdf < $< > $@ - -$(DVIS): doc/dev/spv-structure.eps -$(srcdir)/doc/dev/spv-structure.eps: doc/dev/spv-structure.gv - dot -Teps < $< > $@ -endif -EXTRA_DIST += \ - doc/dev/spv-structure.gv \ - doc/dev/spv-structure.pdf \ - doc/dev/spv-structure.eps - dist_man_MANS += doc/pspp.1 \ doc/psppire.1 diff --git a/doc/dev/spv-file-format.texi b/doc/dev/spv-file-format.texi index f9ab37374c..379f6988f7 100644 --- a/doc/dev/spv-file-format.texi +++ b/doc/dev/spv-file-format.texi @@ -106,23 +106,75 @@ The actual XML has a simple and straightforward form that does not require a reader to take schemas or namespaces into account. A structure member's root is @code{heading} element, which contains @code{heading} or @code{container} elements (or a mix), forming a -tree. In turn, @code{container} holds a single @code{text} or -@code{table} element. +tree. In turn, @code{container} holds a @code{label} and one more +child, usually @code{text} or @code{table}. -@ifnottex -For a diagram illustrating the hierarchy of elements within an SPV -structure member, please refer to a PDF version of the manual. -@end ifnottex - -@iftex The following diagram shows the hierarchy within an SPV structure -member more precisely. Oval nodes are elements and and -are plain text and CDATA within elements. Edges point from parent to -child. Unlabeled edges indicate that the child appears exactly once; -edges labeled with *, zero or more times; edges labeled with ?, zero -or one times. -@center @image{dev/spv-structure, 5in} -@end iftex +member more precisely. Names represent elements and and + represent plain text and CDATA, respectively. Edges point +from parent to child. Unlabeled edges indicate that the child appears +exactly once; edges labeled with *, zero or more times; edges labeled +with ?, zero or one times. Where possible, child elements are shown +in the order they actually appear within a parent element. + +@example +@group +heading + +--?--> pageSetup + | +--> pageHeader +--> pageParagraph --> text --> + | +--> pageFooter +--> pageParagraph --> text --> + +-----> label --?--> + +--*--> heading + +--*--> container + +-----> label --?--> + +--?--> text ---> html --> + +--?--> table + | +--?-- tableProperties + | | +--> generalProperties + | | +--> footnoteProperties + | | +--> cellFormatProperties + | | | +--> caption -------> style + | | | +--> footnotes -----> style + | | | +--> rowLabelse ----> style + | | | +--> columnLabels --> style + | | | +--> data ----------> style + | | | +--> layers --------> style + | | | +--> title ---------> style + | | | +--> cornerLabels --> style + | | +--> borderProperties + | | | +--> topInnerFrame + | | | +--> rightInnerFrame + | | | +--> horizontalDimensionBorderColumns + | | | +--> horizontalDimensionBorderRows + | | | +--> horizontalCategoryBorderColumns + | | | +--> leftInnerFrame + | | | +--> verticalDimensionBorderRows + | | | +--> titleLayerSeparator + | | | +--> verticalCategoryBorderRows + | | | +--> topOuterFrame + | | | +--> bottomInnerFrame + | | | +--> leftOuterFrame + | | | +--> dataAreaTop + | | | +--> verticalDimensionBorderColumns + | | | +--> dataAreaLeft + | | | +--> horizontalCategoryBorderRows + | | | +--> bottomOuterFrame + | | | +--> rightOuterFrame + | | | +--> verticalCategoryBorderColumns + | | +--> printingProperties + | +----- tableStructure + | +--?--> path ------> + | +-----> dataPath --> + +--?--> graph + | +--?--> dataPath --> + | +-----> path ------> + +--?--> model + +--?--> ViZml --> + +--?--> path ---> + +--?--> pmmlContainerPath ---> + +--?--> statsContainerPath --> +@end group +@end example The elements found in structure members are documented below. For each element, we note the possible parent elements and the element's @@ -200,7 +252,9 @@ information, and the CSS from the embedded HTML: * SPV Structure html Element:: * SPV Structure table Element:: * SPV Structure tableStructure Element:: -* SPV Structure dataPath Element:: +* SPV Structure graph Element:: +* SPV Structure model Element:: +* SPV Structure dataPath and path Elements:: * SPV Structure pageSetup Element:: * SPV Structure pageHeader and pageFooter Elements:: * SPV Structure pageParagraph Element:: @@ -311,7 +365,7 @@ This element has no attributes. @subsection The @code{container} Element Parent: @code{heading} @* -Contents: @code{label} (@code{table} @math{|} @code{text})? +Contents: @code{label} (@code{table} @math{|} @code{text} @math{|} @code{graph} @math{|} @code{model}) A @code{container} serves to label a @code{table} or a @code{text} item. @@ -421,16 +475,66 @@ Contents: @code{dataPath} This element has no attributes. -@node SPV Structure dataPath Element -@subsection The @code{dataPath} Element +@node SPV Structure graph Element +@subsection The @code{graph} Element + +Parent: @code{container} @* +Contents: @code{dataPath}? @code{path} + +This element represents a graph. The @code{dataPath} and @code{path} +elements name the Zip members that give the details of the graph. +Normally, both elements are present; there is only one counterexample +in the corpus. + +@node SPV Structure model Element +@subsection The @code{model} Element + +Parent: @code{container} @* +Contents: (@code{ViZml}? @code{path}) @math{|} (@code{pmmlContainerPath} @code{statsContainerPath}) + +This element represents a model. The @code{dataPath} and @code{path} +elements name the Zip members that give the details of the model. +Normally, both elements are present; there is only one counterexample +in the corpus. -Parent: @code{tableStructure} @* +The details are unexplored. The @code{ViZml} element contains base-64 +encoded text, that decodes to a binary format with some embedded text +strings, and @code{path} names an Zip member that contains XML. +Alternatively, @code{pmmlContainerPath} and @code{statsContainerPath} +name Zip members with @file{.scf} extension. + +@node SPV Structure dataPath and path Elements +@subsection The @code{dataPath} and @code{path} Elements + +Parent: @code{tableStructure} or @code{graph} or @code{model} @* Contents: text -Contains the name of the Zip member that holds the table details, -e.g.@: @code{0000000001437_lightTableData.bin}. +These element contain the name of the Zip members that hold details +for a container. For tables: -This element has no attributes. +@itemize @bullet +@item +When a ``light'' format is used, only @code{dataPath} is present, and +it names a @file{.bin} member of the Zip file that has @code{light} in +its name, e.g.@: @code{0000000001437_lightTableData.bin} (@pxref{SPV +Light Detail Member Format}). + +@item +When the legacy format is used, both are present. In this case, +@code{dataPath} names a Zip member with a legacy binary format that +contains relevant data (@pxref{SPV Legacy Detail Member Binary +Format}), and @code{path} names a Zip member that uses an XML format +(@pxref{SPV Legacy Detail Member XML Format}). +@end itemize + +Graphs normally follow the legacy approach described above. The +corpus contains one example of a graph with @code{path} but not +@code{dataPath}. The reason is unexplored. + +Models use @code{path} but not @code{dataPath}. @xref{SPV Structure +graph Element}, for more information. + +These elements have no attributes. @node SPV Structure pageSetup Element @subsection The @code{pageSetup} Element diff --git a/doc/dev/spv-structure.eps b/doc/dev/spv-structure.eps deleted file mode 100644 index 247d67a26b..0000000000 --- a/doc/dev/spv-structure.eps +++ /dev/null @@ -1,728 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%Creator: graphviz version 2.38.0 (20140413.2041) -%%Title: spv_structure -%%Pages: 1 -%%BoundingBox: 36 36 518 560 -%%EndComments -save -%%BeginProlog -/DotDict 200 dict def -DotDict begin - -/setupLatin1 { -mark -/EncodingVector 256 array def - EncodingVector 0 - -ISOLatin1Encoding 0 255 getinterval putinterval -EncodingVector 45 /hyphen put - -% Set up ISO Latin 1 character encoding -/starnetISO { - dup dup findfont dup length dict begin - { 1 index /FID ne { def }{ pop pop } ifelse - } forall - /Encoding EncodingVector def - currentdict end definefont -} def -/Times-Roman starnetISO def -/Times-Italic starnetISO def -/Times-Bold starnetISO def -/Times-BoldItalic starnetISO def -/Helvetica starnetISO def -/Helvetica-Oblique starnetISO def -/Helvetica-Bold starnetISO def -/Helvetica-BoldOblique starnetISO def -/Courier starnetISO def -/Courier-Oblique starnetISO def -/Courier-Bold starnetISO def -/Courier-BoldOblique starnetISO def -cleartomark -} bind def - -%%BeginResource: procset graphviz 0 0 -/coord-font-family /Times-Roman def -/default-font-family /Times-Roman def -/coordfont coord-font-family findfont 8 scalefont def - -/InvScaleFactor 1.0 def -/set_scale { - dup 1 exch div /InvScaleFactor exch def - scale -} bind def - -% styles -/solid { [] 0 setdash } bind def -/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def -/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def -/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def -/bold { 2 setlinewidth } bind def -/filled { } bind def -/unfilled { } bind def -/rounded { } bind def -/diagonals { } bind def -/tapered { } bind def - -% hooks for setting color -/nodecolor { sethsbcolor } bind def -/edgecolor { sethsbcolor } bind def -/graphcolor { sethsbcolor } bind def -/nopcolor {pop pop pop} bind def - -/beginpage { % i j npages - /npages exch def - /j exch def - /i exch def - /str 10 string def - npages 1 gt { - gsave - coordfont setfont - 0 0 moveto - (\() show i str cvs show (,) show j str cvs show (\)) show - grestore - } if -} bind def - -/set_font { - findfont exch - scalefont setfont -} def - -% draw text fitted to its expected width -/alignedtext { % width text - /text exch def - /width exch def - gsave - width 0 gt { - [] 0 setdash - text stringwidth pop width exch sub text length div 0 text ashow - } if - grestore -} def - -/boxprim { % xcorner ycorner xsize ysize - 4 2 roll - moveto - 2 copy - exch 0 rlineto - 0 exch rlineto - pop neg 0 rlineto - closepath -} bind def - -/ellipse_path { - /ry exch def - /rx exch def - /y exch def - /x exch def - matrix currentmatrix - newpath - x y translate - rx ry scale - 0 0 1 0 360 arc - setmatrix -} bind def - -/endpage { showpage } bind def -/showpage { } def - -/layercolorseq - [ % layer color sequence - darkest to lightest - [0 0 0] - [.2 .8 .8] - [.4 .8 .8] - [.6 .8 .8] - [.8 .8 .8] - ] -def - -/layerlen layercolorseq length def - -/setlayer {/maxlayer exch def /curlayer exch def - layercolorseq curlayer 1 sub layerlen mod get - aload pop sethsbcolor - /nodecolor {nopcolor} def - /edgecolor {nopcolor} def - /graphcolor {nopcolor} def -} bind def - -/onlayer { curlayer ne {invis} if } def - -/onlayers { - /myupper exch def - /mylower exch def - curlayer mylower lt - curlayer myupper gt - or - {invis} if -} def - -/curlayer 0 def - -%%EndResource -%%EndProlog -%%BeginSetup -14 default-font-family set_font -1 setmiterlimit -% /arrowlength 10 def -% /arrowwidth 5 def - -% make sure pdfmark is harmless for PS-interpreters other than Distiller -/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse -% make '<<' and '>>' safe on PS Level 1 devices -/languagelevel where {pop languagelevel}{1} ifelse -2 lt { - userdict (<<) cvn ([) cvn load put - userdict (>>) cvn ([) cvn load put -} if - -%%EndSetup -setupLatin1 -%%Page: 1 1 -%%PageBoundingBox: 36 36 518 560 -%%PageOrientation: Portrait -0 0 1 beginpage -gsave -36 36 482 524 boxprim clip newpath -1 1 set_scale 0 rotate 40 40 translate -% heading -gsave -1 setlinewidth -0 0 0 nodecolor -254.05 498 38.19 18 ellipse_path stroke -0 0 0 nodecolor -14 /Times-Roman set_font -232.55 494.3 moveto 43 (heading) alignedtext -grestore -% heading->heading -gsave -1 setlinewidth -0 0 0 edgecolor -newpath 288.71 505.87 moveto -300.71 505.96 310.39 503.33 310.39 498 curveto -310.39 494.33 305.81 491.95 299.05 490.84 curveto -stroke -0 0 0 edgecolor -newpath 298.93 487.33 moveto -288.71 490.13 lineto -298.44 494.31 lineto -closepath fill -1 setlinewidth -solid -0 0 0 edgecolor -newpath 298.93 487.33 moveto -288.71 490.13 lineto -298.44 494.31 lineto -closepath stroke -0 0 0 edgecolor -14 /Times-Roman set_font -310.39 494.3 moveto 7 (*) alignedtext -grestore -% pageSetup -gsave -1 setlinewidth -0 0 0 nodecolor -171.05 411 47.39 18 ellipse_path stroke -0 0 0 nodecolor -14 /Times-Roman set_font -142.55 407.3 moveto 57 (pageSetup) alignedtext -grestore -% heading->pageSetup -gsave -1 setlinewidth -0 0 0 edgecolor -newpath 238.82 481.41 moveto -226.23 468.51 208.15 450 193.83 435.34 curveto -stroke -0 0 0 edgecolor -newpath 196.23 432.78 moveto -186.74 428.07 lineto -191.22 437.67 lineto -closepath fill -1 setlinewidth -solid -0 0 0 edgecolor -newpath 196.23 432.78 moveto -186.74 428.07 lineto -191.22 437.67 lineto -closepath stroke -0 0 0 edgecolor -14 /Times-Roman set_font -217.05 450.8 moveto 7 (?) alignedtext -grestore -% label -gsave -1 setlinewidth -0 0 0 nodecolor -270.05 324 27.9 18 ellipse_path stroke -0 0 0 nodecolor -14 /Times-Roman set_font -256.55 320.3 moveto 27 (label) alignedtext -grestore -% heading->label -gsave -1 setlinewidth -0 0 0 edgecolor -newpath 255.64 479.88 moveto -258.42 450 264.17 388.11 267.51 352.27 curveto -stroke -0 0 0 edgecolor -newpath 271.02 352.33 moveto -268.46 342.05 lineto -264.05 351.68 lineto -closepath fill -1 setlinewidth -solid -0 0 0 edgecolor -newpath 271.02 352.33 moveto -268.46 342.05 lineto -264.05 351.68 lineto -closepath stroke -grestore -% container -gsave -1 setlinewidth -0 0 0 nodecolor -326.05 411 43.59 18 ellipse_path stroke -0 0 0 nodecolor -14 /Times-Roman set_font -300.55 407.3 moveto 51 (container) alignedtext -grestore -% heading->container -gsave -1 setlinewidth -0 0 0 edgecolor -newpath 267.59 481.01 moveto -278.28 468.39 293.37 450.57 305.55 436.2 curveto -stroke -0 0 0 edgecolor -newpath 308.53 438.1 moveto -312.32 428.21 lineto -303.18 433.57 lineto -closepath fill -1 setlinewidth -solid -0 0 0 edgecolor -newpath 308.53 438.1 moveto -312.32 428.21 lineto -303.18 433.57 lineto -closepath stroke -0 0 0 edgecolor -14 /Times-Roman set_font -294.05 450.8 moveto 7 (*) alignedtext -grestore -% pageHeader -gsave -1 setlinewidth -0 0 0 nodecolor -171.05 324 52.79 18 ellipse_path stroke -0 0 0 nodecolor -14 /Times-Roman set_font -138.55 320.3 moveto 65 (pageHeader) alignedtext -grestore -% pageSetup->pageHeader -gsave -1 setlinewidth -0 0 0 edgecolor -newpath 171.05 392.8 moveto -171.05 381.16 171.05 365.55 171.05 352.24 curveto -stroke -0 0 0 edgecolor -newpath 174.55 352.18 moveto -171.05 342.18 lineto -167.55 352.18 lineto -closepath fill -1 setlinewidth -solid -0 0 0 edgecolor -newpath 174.55 352.18 moveto -171.05 342.18 lineto -167.55 352.18 lineto -closepath stroke -grestore -% pageFooter -gsave -1 setlinewidth -0 0 0 nodecolor -50.05 324 50.09 18 ellipse_path stroke -0 0 0 nodecolor -14 /Times-Roman set_font -19.55 320.3 moveto 61 (pageFooter) alignedtext -grestore -% pageSetup->pageFooter -gsave -1 setlinewidth -0 0 0 edgecolor -newpath 149.41 394.8 moveto -130.18 381.29 101.84 361.39 80.35 346.29 curveto -stroke -0 0 0 edgecolor -newpath 82.09 343.24 moveto -71.9 340.35 lineto -78.07 348.96 lineto -closepath fill -1 setlinewidth -solid -0 0 0 edgecolor -newpath 82.09 343.24 moveto -71.9 340.35 lineto -78.07 348.96 lineto -closepath stroke -grestore -% ptext1 -gsave -0 0 0 nodecolor -14 /Times-Roman set_font -252.55 233.3 moveto 37 () alignedtext -grestore -% label->ptext1 -gsave -1 setlinewidth -0 0 0 edgecolor -newpath 270.25 305.8 moveto -270.38 294.16 270.57 278.55 270.73 265.24 curveto -stroke -0 0 0 edgecolor -newpath 274.23 265.22 moveto -270.84 255.18 lineto -267.23 265.13 lineto -closepath fill -1 setlinewidth -solid -0 0 0 edgecolor -newpath 274.23 265.22 moveto -270.84 255.18 lineto -267.23 265.13 lineto -closepath stroke -0 0 0 edgecolor -14 /Times-Roman set_font -270.05 276.8 moveto 7 (?) alignedtext -grestore -% container->label -gsave -1 setlinewidth -0 0 0 edgecolor -newpath 314.98 393.21 moveto -306.77 380.74 295.45 363.56 286.22 349.56 curveto -stroke -0 0 0 edgecolor -newpath 288.94 347.32 moveto -280.52 340.9 lineto -283.1 351.17 lineto -closepath fill -1 setlinewidth -solid -0 0 0 edgecolor -newpath 288.94 347.32 moveto -280.52 340.9 lineto -283.1 351.17 lineto -closepath stroke -grestore -% table -gsave -1 setlinewidth -0 0 0 nodecolor -398.05 324 27.9 18 ellipse_path stroke -0 0 0 nodecolor -14 /Times-Roman set_font -384.55 320.3 moveto 27 (table) alignedtext -grestore -% container->table -gsave -1 setlinewidth -0 0 0 edgecolor -newpath 339.93 393.61 moveto -350.86 380.71 366.23 362.56 378.42 348.17 curveto -stroke -0 0 0 edgecolor -newpath 381.38 350.09 moveto -385.17 340.2 lineto -376.04 345.56 lineto -closepath fill -1 setlinewidth -solid -0 0 0 edgecolor -newpath 381.38 350.09 moveto -385.17 340.2 lineto -376.04 345.56 lineto -closepath stroke -0 0 0 edgecolor -14 /Times-Roman set_font -366.05 363.8 moveto 7 (?) alignedtext -grestore -% text -gsave -1 setlinewidth -0 0 0 nodecolor -253.05 164 27 18 ellipse_path stroke -0 0 0 nodecolor -14 /Times-Roman set_font -242.55 160.3 moveto 21 (text) alignedtext -grestore -% container->text -gsave -1 setlinewidth -0 0 0 edgecolor -newpath 328.04 392.9 moveto -331.31 358.22 334.93 277.88 307.05 219 curveto -300.67 205.54 289.49 193.49 278.95 184.21 curveto -stroke -0 0 0 edgecolor -newpath 281.03 181.38 moveto -271.1 177.67 lineto -276.55 186.76 lineto -closepath fill -1 setlinewidth -solid -0 0 0 edgecolor -newpath 281.03 181.38 moveto -271.1 177.67 lineto -276.55 186.76 lineto -closepath stroke -0 0 0 edgecolor -14 /Times-Roman set_font -326.05 276.8 moveto 7 (?) alignedtext -grestore -% tableStructure -gsave -1 setlinewidth -0 0 0 nodecolor -414.05 237 59.59 18 ellipse_path stroke -0 0 0 nodecolor -14 /Times-Roman set_font -376.05 233.3 moveto 76 (tableStructure) alignedtext -grestore -% table->tableStructure -gsave -1 setlinewidth -0 0 0 edgecolor -newpath 401.28 305.8 moveto -403.47 294.16 406.41 278.55 408.92 265.24 curveto -stroke -0 0 0 edgecolor -newpath 412.4 265.65 moveto -410.81 255.18 lineto -405.52 264.36 lineto -closepath fill -1 setlinewidth -solid -0 0 0 edgecolor -newpath 412.4 265.65 moveto -410.81 255.18 lineto -405.52 264.36 lineto -closepath stroke -grestore -% html -gsave -1 setlinewidth -0 0 0 nodecolor -304.05 91 27.1 18 ellipse_path stroke -0 0 0 nodecolor -14 /Times-Roman set_font -291.05 87.3 moveto 26 (html) alignedtext -grestore -% text->html -gsave -1 setlinewidth -0 0 0 edgecolor -newpath 264.36 147.24 moveto -270.97 138.05 279.43 126.27 286.84 115.95 curveto -stroke -0 0 0 edgecolor -newpath 289.77 117.88 moveto -292.76 107.71 lineto -284.08 113.79 lineto -closepath fill -1 setlinewidth -solid -0 0 0 edgecolor -newpath 289.77 117.88 moveto -292.76 107.71 lineto -284.08 113.79 lineto -closepath stroke -grestore -% cdata1 -gsave -0 0 0 nodecolor -14 /Times-Roman set_font -205.05 87.3 moveto 46 () alignedtext -grestore -% text->cdata1 -gsave -1 setlinewidth -0 0 0 edgecolor -newpath 247.12 146.17 moveto -244.24 137.98 240.7 127.94 237.46 118.73 curveto -stroke -0 0 0 edgecolor -newpath 240.72 117.47 moveto -234.1 109.2 lineto -234.12 119.79 lineto -closepath fill -1 setlinewidth -solid -0 0 0 edgecolor -newpath 240.72 117.47 moveto -234.1 109.2 lineto -234.12 119.79 lineto -closepath stroke -grestore -% cdata2 -gsave -0 0 0 nodecolor -14 /Times-Roman set_font -281.05 14.3 moveto 46 () alignedtext -grestore -% html->cdata2 -gsave -1 setlinewidth -0 0 0 edgecolor -newpath 304.05 72.81 moveto -304.05 64.79 304.05 55.05 304.05 46.07 curveto -stroke -0 0 0 edgecolor -newpath 307.55 46.03 moveto -304.05 36.03 lineto -300.55 46.03 lineto -closepath fill -1 setlinewidth -solid -0 0 0 edgecolor -newpath 307.55 46.03 moveto -304.05 36.03 lineto -300.55 46.03 lineto -closepath stroke -grestore -% dataPath -gsave -1 setlinewidth -0 0 0 nodecolor -414.05 164 40.89 18 ellipse_path stroke -0 0 0 nodecolor -14 /Times-Roman set_font -390.55 160.3 moveto 47 (dataPath) alignedtext -grestore -% tableStructure->dataPath -gsave -1 setlinewidth -0 0 0 edgecolor -newpath 414.05 218.81 moveto -414.05 210.79 414.05 201.05 414.05 192.07 curveto -stroke -0 0 0 edgecolor -newpath 417.55 192.03 moveto -414.05 182.03 lineto -410.55 192.03 lineto -closepath fill -1 setlinewidth -solid -0 0 0 edgecolor -newpath 417.55 192.03 moveto -414.05 182.03 lineto -410.55 192.03 lineto -closepath stroke -grestore -% ptext2 -gsave -0 0 0 nodecolor -14 /Times-Roman set_font -395.55 87.3 moveto 37 () alignedtext -grestore -% dataPath->ptext2 -gsave -1 setlinewidth -0 0 0 edgecolor -newpath 414.05 145.81 moveto -414.05 137.79 414.05 128.05 414.05 119.07 curveto -stroke -0 0 0 edgecolor -newpath 417.55 119.03 moveto -414.05 109.03 lineto -410.55 119.03 lineto -closepath fill -1 setlinewidth -solid -0 0 0 edgecolor -newpath 417.55 119.03 moveto -414.05 109.03 lineto -410.55 119.03 lineto -closepath stroke -grestore -% pageParagraph -gsave -1 setlinewidth -0 0 0 nodecolor -163.05 237 63.09 18 ellipse_path stroke -0 0 0 nodecolor -14 /Times-Roman set_font -122.55 233.3 moveto 81 (pageParagraph) alignedtext -grestore -% pageHeader->pageParagraph -gsave -1 setlinewidth -0 0 0 edgecolor -newpath 169.43 305.8 moveto -168.33 294.16 166.86 278.55 165.61 265.24 curveto -stroke -0 0 0 edgecolor -newpath 169.08 264.8 moveto -164.66 255.18 lineto -162.11 265.46 lineto -closepath fill -1 setlinewidth -solid -0 0 0 edgecolor -newpath 169.08 264.8 moveto -164.66 255.18 lineto -162.11 265.46 lineto -closepath stroke -grestore -% pageFooter->pageParagraph -gsave -1 setlinewidth -0 0 0 edgecolor -newpath 70.77 307.41 moveto -88.39 294.16 113.89 274.98 133.62 260.13 curveto -stroke -0 0 0 edgecolor -newpath 135.8 262.88 moveto -141.68 254.07 lineto -131.59 257.28 lineto -closepath fill -1 setlinewidth -solid -0 0 0 edgecolor -newpath 135.8 262.88 moveto -141.68 254.07 lineto -131.59 257.28 lineto -closepath stroke -grestore -% pageParagraph->text -gsave -1 setlinewidth -0 0 0 edgecolor -newpath 183.47 219.89 moveto -196.82 209.35 214.34 195.54 228.46 184.4 curveto -stroke -0 0 0 edgecolor -newpath 230.64 187.14 moveto -236.32 178.2 lineto -226.3 181.64 lineto -closepath fill -1 setlinewidth -solid -0 0 0 edgecolor -newpath 230.64 187.14 moveto -236.32 178.2 lineto -226.3 181.64 lineto -closepath stroke -grestore -endpage -showpage -grestore -%%PageTrailer -%%EndPage: 1 -%%Trailer -end -restore -%%EOF diff --git a/doc/dev/spv-structure.gv b/doc/dev/spv-structure.gv deleted file mode 100644 index ac37b698b7..0000000000 --- a/doc/dev/spv-structure.gv +++ /dev/null @@ -1,37 +0,0 @@ -digraph spv_structure { - "heading" -> "pageSetup" [label="?"]; - "heading" -> "label"; - "heading" -> "container" [label="*"]; - "heading" -> "heading" [label="*"]; - - "container" -> "label"; - "container" -> "table" [label="?"]; - "container" -> "text" [label="?"]; - - "label" -> ptext1 [label="?"]; - ptext1 [label="", shape=plaintext]; - - "text" -> "html"; - - "text" -> cdata1; - cdata1 [label="", shape=plaintext]; - - "html" -> cdata2; - cdata2 [label="", shape=plaintext]; - - "table" -> "tableStructure"; - - "tableStructure" -> "dataPath"; - - "dataPath" -> ptext2; - ptext2 [label="", shape=plaintext]; - - "pageSetup" -> "pageHeader"; - "pageSetup" -> "pageFooter"; - - "pageHeader" -> "pageParagraph"; - - "pageFooter" -> "pageParagraph"; - - "pageParagraph" -> "text"; -} diff --git a/doc/dev/spv-structure.pdf b/doc/dev/spv-structure.pdf deleted file mode 100644 index 520d3bf511ab2dbd716869c4d6d66002d0f73997..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17342 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 UwD2{}47Kc2fQgC-tr{PtQ5oZj-6q zpxL1iyvU{Kw}|2H=u%BE;3T|&6fw7dh2r&uS`cHzN*oW5 z?pkU1fd--uWI1g4ngVh70!Ko_Jd0GC)=S%7JFa_3ctHNS_;>IhM@2tu?v_mfTokn&ig58~Owb)8l96eKXzH;Oizo1g0U$2gR1m zYkb=xZ0Bo&iF`hxBg82Nw0o3&zEth;Gpg`7RX`W+x&>M=WMW%ELV zxF>3HH$)xGvl74-zrEZO^#Z`y7dT_6D+J{RtK8348u_oj8{2oG22L(|4|~9YZ-ymK z7E?lSq}($9`pIysO%&&`lz>_|23KQ_Davj7L#-RUg@hyXk`I{o3XL*wQcL&Vk#lh7 z@aPp@`aoG!Y1y~e=S17>eMtsVOmfXRVXohCSz#%2%l;bD72Cv)kU>M!!-n?e%=fq0 zG+K(DDJuK34OIoK(rc+#a3&iBp(xd z_{TvBF&Shuw9r_F>e+m)0RvwFAVZK5$c8?a+*@dzseZ$BTxZH?Azoav(>$c!X#De% zazPDzjE=}8+;N-A0~e#KmGVje`fwm5YV#~H8L|X{T~wr z2O}$G0PEk`KNF(=OniF%LH-y4KG~puXN5kwsQ+&BU*#(}>O1_!M1A(f-&OMK*&F?Z zSN;Dr-ptP4LBLec4#4mam`Lv*X*&A9z5CCe{eX=AwL*lfKbU_rYZCyCikUT^wY}Lt zg}?dnf7D6|5Kx-rTbU{|EbY4eJs!a)aaP$SwCF;Uv?~? z?*A{1js9ba{f9=!#KiKy?LIWN|FUELZ(rz`X&FA|&3~51%)<7++d;?7M*lIC|Fm>U2;-H-BEJ|5RW KBqSpY{eJ)mC_PyK -- 2.30.2