From e3442a9aa2d212f08857edb031815f27dc577351 Mon Sep 17 00:00:00 2001 From: Ben Schmidt Date: Wed, 4 Nov 2020 04:50:46 +1100 Subject: [PATCH] Add shortcut for elements containing only marked content. --- demo/accessibility.js | 235 +++++++++++++++++++----------------- demo/accessible.pdf | Bin 659694 -> 659696 bytes docs/accessibility.md | 95 ++++++++++++--- docs/guide.pdf | Bin 236876 -> 240888 bytes lib/mixins/markings.js | 1 + lib/structure_element.js | 182 ++++++++++++++++++++-------- tests/unit/markings.spec.js | 115 ++++++++++++++---- 7 files changed, 431 insertions(+), 197 deletions(-) diff --git a/demo/accessibility.js b/demo/accessibility.js index c14b25c..498ea5e 100644 --- a/demo/accessibility.js +++ b/demo/accessibility.js @@ -14,7 +14,6 @@ doc.pipe(fs.createWriteStream('accessible.pdf')); // Set some meta data doc.info['Title'] = 'Test Document'; - doc.info['Author'] = 'Devon Govett'; // Initialise document logical structure @@ -24,166 +23,186 @@ doc.addStructure(struct); // Register a font name for use later doc.registerFont('Palatino', 'fonts/PalatinoBold.ttf'); -// Set the font, draw some text, and embed an image -struct.add(doc.struct('P', [ doc.markStructureContent('P') ])); -doc - .font('Palatino') - .fontSize(25) - .text('Some text with an embedded font! ', 100, 100); +// Set the font and draw some text +struct.add(doc.struct('P', () => { + doc + .font('Palatino') + .fontSize(25) + .text('Some text with an embedded font! ', 100, 100); +})); +// Embed some images var imageSection = doc.struct('Sect'); struct.add(imageSection); -imageSection.add(doc.struct('H', [ doc.markStructureContent('H') ])); -doc - .fontSize(18) - .text('PNG and JPEG images: '); + +imageSection.add(doc.struct('H', () => { + doc + .fontSize(18) + .text('PNG and JPEG images: '); +})); imageSection.add(doc.struct('Figure', { - alt: "Promotional image of an Apple laptop. " -}, [ doc.markStructureContent('Figure') ])); -doc - .image('images/test.png', 100, 160, { - width: 412 - }); + alt: "Promotional image of an Apple laptop. " +}, () => { + doc + .image('images/test.png', 100, 160, { + width: 412 + }); +})); imageSection.add(doc.struct('Figure', { - alt: "Photograph of a path flanked by blossoming trees with surrounding hedges. " -}, [ doc.markStructureContent('Figure') ])); -doc - .image('images/test.jpeg', 190, 400, { - height: 300 - }); + alt: "Photograph of a path flanked by blossoming trees with surrounding hedges. " +}, () => { + doc + .image('images/test.jpeg', 190, 400, { + height: 300 + }); +})); imageSection.end(); // Add another page -doc - .addPage(); +doc.addPage(); +// Draw a triangle, a circle and a star var vectorSection = doc.struct('Sect'); struct.add(vectorSection); -vectorSection.add(doc.struct('H', [ doc.markStructureContent('H') ])); -doc - .fontSize(25) - .text('Here are some vector graphics... ', 100, 100); -// Draw a triangle and a circle -vectorSection.add(doc.struct('Figure', { - alt: "Orange triangle. " -}, [ doc.markStructureContent('Figure') ])); -doc - .save() - .moveTo(100, 150) - .lineTo(100, 250) - .lineTo(200, 250) - .fill('#FF8800'); +vectorSection.add(doc.struct('H', () => { + doc + .fontSize(25) + .text('Here are some vector graphics... ', 100, 100); +})); vectorSection.add(doc.struct('Figure', { - alt: "Purple circle. " -}, [ doc.markStructureContent('Figure') ])); -doc.circle(280, 200, 50).fill('#7722FF'); + alt: "Orange triangle. " +}, () => { + doc + .save() + .moveTo(100, 150) + .lineTo(100, 250) + .lineTo(200, 250) + .fill('#FF8800'); +})); vectorSection.add(doc.struct('Figure', { - alt: "Red star with hollow center. " -}, [ doc.markStructureContent('Figure') ])); -doc - .scale(0.6) - .translate(470, 140) - // render an SVG path - .path('M 250,75 L 323,301 131,161 369,161 177,301 z') - // fill using the even-odd winding rule - .fill('red', 'even-odd') - .restore(); + alt: "Purple circle. " +}, () => { + doc.circle(280, 200, 50).fill('#7722FF'); +})); + +vectorSection.add(doc.struct('Figure', { + alt: "Red star with hollow center. " +}, () => { + doc + .scale(0.6) + .translate(470, 140) + // render an SVG path + .path('M 250,75 L 323,301 131,161 369,161 177,301 z') + // fill using the even-odd winding rule + .fill('red', 'even-odd') + .restore(); +})); vectorSection.end(); -// Draw some text wrapped to 412 points wide -var loremIpsum = - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam in suscipit purus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus nec hendrerit felis. Morbi aliquam facilisis risus eu lacinia. Sed eu leo in turpis fringilla hendrerit. Ut nec accumsan nisl. Suspendisse rhoncus nisl posuere tortor tempus et dapibus elit porta. Cras leo neque, elementum a rhoncus ut, vestibulum non nibh. Phasellus pretium justo turpis. Etiam vulputate, odio vitae tincidunt ultricies, eros odio dapibus nisi, ut tincidunt lacus arcu eu elit. Aenean velit erat, vehicula eget lacinia ut, dignissim non tellus. Aliquam nec lacus mi, sed vestibulum nunc. Suspendisse potenti. Curabitur vitae sem turpis. Vestibulum sed neque eget dolor dapibus porttitor at sit amet sem. Fusce a turpis lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;\nMauris at ante tellus. Vestibulum a metus lectus. Praesent tempor purus a lacus blandit eget gravida ante hendrerit. Cras et eros metus. Sed commodo malesuada eros, vitae interdum augue semper quis. Fusce id magna nunc. Curabitur sollicitudin placerat semper. Cras et mi neque, a dignissim risus. Nulla venenatis porta lacus, vel rhoncus lectus tempor vitae. Duis sagittis venenatis rutrum. Curabitur tempor massa tortor.'; +// Draw some text wrapped to 412 points wide, split into paragraphs var wrappedSection = doc.struct('Sect'); struct.add(wrappedSection); -wrappedSection.add(doc.struct('H', [ doc.markStructureContent('H') ])); -doc - .text('And here is some wrapped text... ', 100, 300) - .font('Helvetica', 13) - // move down 1 line - .moveDown() - .text(loremIpsum, { - width: 412, - align: 'justify', - indent: 30, - paragraphGap: 5, - structParent: wrappedSection - }); + +wrappedSection.add(doc.struct('H', () => { + doc + .text('And here is some wrapped text... ', 100, 300) + .font('Helvetica', 13) + // move down 1 line + .moveDown() +})); + +var loremIpsum = + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam in suscipit purus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus nec hendrerit felis. Morbi aliquam facilisis risus eu lacinia. Sed eu leo in turpis fringilla hendrerit. Ut nec accumsan nisl. Suspendisse rhoncus nisl posuere tortor tempus et dapibus elit porta. Cras leo neque, elementum a rhoncus ut, vestibulum non nibh. Phasellus pretium justo turpis. Etiam vulputate, odio vitae tincidunt ultricies, eros odio dapibus nisi, ut tincidunt lacus arcu eu elit. Aenean velit erat, vehicula eget lacinia ut, dignissim non tellus. Aliquam nec lacus mi, sed vestibulum nunc. Suspendisse potenti. Curabitur vitae sem turpis. Vestibulum sed neque eget dolor dapibus porttitor at sit amet sem. Fusce a turpis lorem. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;\nMauris at ante tellus. Vestibulum a metus lectus. Praesent tempor purus a lacus blandit eget gravida ante hendrerit. Cras et eros metus. Sed commodo malesuada eros, vitae interdum augue semper quis. Fusce id magna nunc. Curabitur sollicitudin placerat semper. Cras et mi neque, a dignissim risus. Nulla venenatis porta lacus, vel rhoncus lectus tempor vitae. Duis sagittis venenatis rutrum. Curabitur tempor massa tortor.'; +doc.text(loremIpsum, { + width: 412, + align: 'justify', + indent: 30, + paragraphGap: 5, + structParent: wrappedSection +}); wrappedSection.end(); -// Add another page, and set the font back -doc - .addPage(); +// Add another page +doc.addPage(); +// Set the font back and draw tiger line art based on an SVG var tigerSection = doc.struct('Sect'); struct.add(tigerSection); -tigerSection.add(doc.struct('H', [ doc.markStructureContent('H') ])); -doc - .font('Palatino', 25) - .text('Rendering some SVG paths...', 100, 100) - .translate(220, 300); + +tigerSection.add(doc.struct('H', () => { + doc + .font('Palatino', 25) + .text('Rendering some SVG paths...', 100, 100) + .translate(220, 300); +})); tigerSection.add(doc.struct('Figure', { - alt: "Tiger line art. " -}, [ doc.markStructureContent('Figure') ])); -var i, len, part; -// Render each path that makes up the tiger image -for (i = 0, len = tiger.length; i < len; i++) { - part = tiger[i]; - doc.save(); - doc.path(part.path); // render an SVG path - if (part['stroke-width']) { - doc.lineWidth(part['stroke-width']); - } - if (part.fill !== 'none' && part.stroke !== 'none') { - doc.fillAndStroke(part.fill, part.stroke); - } else { - if (part.fill !== 'none') { - doc.fill(part.fill); + alt: "Tiger line art. " +}, () => { + var i, len, part; + // Render each path that makes up the tiger image + for (i = 0, len = tiger.length; i < len; i++) { + part = tiger[i]; + doc.save(); + doc.path(part.path); // render an SVG path + if (part['stroke-width']) { + doc.lineWidth(part['stroke-width']); } - if (part.stroke !== 'none') { - doc.stroke(part.stroke); + if (part.fill !== 'none' && part.stroke !== 'none') { + doc.fillAndStroke(part.fill, part.stroke); + } else { + if (part.fill !== 'none') { + doc.fill(part.fill); + } + if (part.stroke !== 'none') { + doc.stroke(part.stroke); + } } + doc.restore(); } - doc.restore(); -} +})); tigerSection.end(); -// Add some text with annotations -doc - .addPage(); +// Add another page +doc.addPage(); +// Add some text with annotations var linkSection = doc.struct('Sect'); struct.add(linkSection); -linkSection.add(doc.struct('Link', [ doc.markStructureContent('Link') ])); -doc - .fillColor('blue') - .text('Here is a link!', 100, 100, { - link: 'http://google.com/', - underline: true - }); + +linkSection.add(doc.struct('Link', () => { + doc + .fillColor('blue') + .text('Here is a link!', 100, 100, { + link: 'http://google.com/', + underline: true + }); +})); linkSection.end(); // Add a list with a font loaded from a TrueType collection file var listSection = doc.struct('Sect'); struct.add(listSection); + var list = doc.struct('List'); listSection.add(list); + doc .fillColor('#000') .font('fonts/Chalkboard.ttc', 'Chalkboard', 16) .list(['One, ', 'Two, ', 'Three. '], 100, 150, { structParent: list }); -// This recursively ends the list as well -listSection.end(); +listSection.end(); // This recursively ends the list as well +// End and flush the document doc.end(); diff --git a/demo/accessible.pdf b/demo/accessible.pdf index 87b94d49d524152c919b1ef9221225e22f0d086f..e5a575c3a89d78e0365383f9155a75e228cf00d4 100644 GIT binary patch delta 35871 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 diff --git a/docs/accessibility.md b/docs/accessibility.md index e42c3a1..098faec 100644 --- a/docs/accessibility.md +++ b/docs/accessibility.md @@ -94,7 +94,7 @@ Example of marking structure content: Example of the simplest of structure trees: // Add a single structure element which includes the structure content to the document's structure - doc.addStructure(doc.struct('P', [ myStructContent ])); + doc.addStructure(doc.struct('P', myStructContent)); Tags/element types to use are listed in a later section. @@ -124,17 +124,17 @@ content (and any descendent marking): ### Complex Structure -Multiple elements may be added directly to the document, and may nest: +Multiple elements may be added directly to the document, or to structure elements, and may nest: // Create nested structure elements const section1 = doc.struct('Sect', [ doc.struct('P', [ someTextStructureContent, - doc.struct('Link', [ someLinkStructureContent ]), + doc.struct('Link', someLinkStructureContent), moreTextStructureContent ]) ]); - const section2 = doc.struct('Sect', [ secondSectionStructureContent ]); + const section2 = doc.struct('Sect', secondSectionStructureContent); // Add them to the document's structure doc.addStructure(section1).addStructure(section2); @@ -146,7 +146,7 @@ you have finished adding to them, allowing them to be flushed out as soon as pos // Begin a new section and add it to the document's structure const mySection = doc.struct('Sect'); - doc.addToStructure(mySection); + doc.addStructure(mySection); // Create a new paragraph and add it to the section const myParagraph = doc.struct('P'); @@ -160,10 +160,70 @@ you have finished adding to them, allowing them to be flushed out as soon as pos // End the paragraph, allowing it to be flushed out, freeing memory myParagraph.end(); -Note that if you provide content when creating a structure element (i.e. providing it to +Note that if you provide children when creating a structure element (i.e. providing them to `doc.struct()` rather than using `structElem.add()`) then `structElem.end()` is called -automatically. You therefore should not add additional content, as the element may already have -been flushed out. Do not mix atomic and incremental styles for the same structure element. +automatically. You therefore cannot add additional children with `structElem.add()`, i.e. +you cannot mix atomic and incremental styles for the same structure element. + +For an element to be flushed out, it must: + + * be ended, + * have been added to its parent, and + * if it has content defined through closures (see next section), be attached to the document's + structure (through its ancestors) + +When you call `doc.end()`, the document's structure is recursively ended, resulting in all +elements being flushed out. If you created elements but forgot to add them to the document's +structure, they will not be flushed, but the PDF stream will wait for them to be flushed before +ending, causing your application to hang. Make sure if you create any elements, you add them +to a parent, so ultimately all elements are attached to the document. It's best to add +elements to their parents as you go. + +### Shortcut for Elements Containing Only Marked Content + +The common case where a structure element contains only content marked with a tag matching +the structure element type can be achieved by using a closure: + + doc.addStructure(doc.struct('P', () => { + doc.text('Hello, world! '); + })); + +This is equivalent to: + + const myStruct = doc.struct('P'); + doc.addStructure(myStruct); + const myStructContent = doc.markStructureContent('P'); + doc.text('Hello, world! '); + doc.endMarkedContent(); + myStruct.add(myStructContent); + myStruct.end(); + +Note that the content is marked and the closure is executed *if/when the element is attached to +the document's structure*. This means that you can do something like this: + + const myParagraph = doc.struct('P', [ + () => { doc.text("Please see ", { continued: true }); }, + doc.struct('Link', () => { + doc.text("something", { link: "http://www.example.com/", continued: true }); + }), + () => { doc.text(" for details. ", { link: null }); } + ]); + +and no content will be added to the page until/unless something like this is done: + + doc.addStructure(section1); + section1.add(myParagraph); // Content is added now + +or alternatively: + + section1.add(myParagraph); + doc.addStructure(section1); // Content is added now + +This is important because otherwise when the `Link` element is constructed, its content +will be added to the page, and then the list containing the link element will be passed to +the construct the `P` element, and only during the construction of the `P` element will the +other `P` content be added to the page, resulting in page content being out of order. +It's best to add elements to their parents as you go. ### Structure Element Options @@ -182,7 +242,7 @@ Example of a structure tree with options specified: }, [ doc.struct('H', [ doc.struct('Span', { - expanded: 'Portable Document Format/Universal Accessibility', + expanded: 'Portable Document Format for Universal Accessibility', actual: 'PDF/UA' }, [ pdfUAStructureContent @@ -214,13 +274,12 @@ Example of creating structure automatically with `text()`: doc.addStructure(section); doc.text("Foo. \nBar. ", { structParent: section }); - // Equivalent code if performed manually +This is equivalent to: + const section = doc.struct('Sect'); doc.addStructure(section); - section.add(doc.struct('P', [ doc.markStructureContent('P') ])); - doc.text("Foo. "); - section.add(doc.struct('P', [ doc.markStructureContent('P') ])); - doc.text("Bar. "); + section.add(doc.struct('P', () => { doc.text("Foo. "); }); + section.add(doc.struct('P', () => { doc.text("Bar. "); }); The `list()` method also accepts a `structParent` option. By default, it add list items (type `LI`) to the parent, each of which contains a label (type `Lbl`, which holds the bullet, @@ -268,7 +327,7 @@ Non-structure tags: other formats like HTML, but 'transparent' to its content which is processed normally) * `Private` - content only meaningful to the creator (element and its content not intended to be exported to other formats like HTML) - + "Block" elements: * `H` - heading (first element in a section, etc.) @@ -279,7 +338,7 @@ Non-structure tags: * `LI` - list item; should contain `Lbl` and/or `LBody` * `Lbl` - label (bullet, number, or "dictionary headword") * `LBody` - list body (item text, or "dictionary definition"); may have nested lists or other blocks - + "Table" elements: * `Table` - table; should either contain `TR`, or `THead`, `TBody` and/or `TFoot` @@ -289,7 +348,7 @@ Non-structure tags: * `THead` - table header row group * `TBody` - table body row group; may have more than one per table * `TFoot` - table footer row group - + "Inline" elements: * `Span` - generic inline content @@ -307,7 +366,7 @@ Non-structure tags: * `Warichu` - Japanese/Chinese longer description * `WT` - Warichu text * `WP` - Warichu punctuation - + "Illustration" elements (should have `alt` and/or `actualtext` set): * `Figure` - figure diff --git a/docs/guide.pdf b/docs/guide.pdf index 11c9308fd3368d15b7af8971ad8d0b9f9e4397b3..a359a02a2773480a202e45ad2f7b5adaae1bcde1 100644 GIT binary patch delta 17477 zcmajGby!qw*9R&C(p^$2-8BOfbSMoH(jg7f-Qq}h$AF|rgOqf43rK@BN{FO%$QgXT z_dV~U=eo}PvG-!#_r3DB)?ToO;YR%PIs7+)DAfQmO#mM-f$lK_++Zkrr=Do>OzRvY zXElwKw?3kS5v3|E+e3nU(T+Mr3V@5=e-@G}+rYRp7E>#`jqg3rr8mA>WD-{@n0VoL zar>+D=GK-6-|*J!YI|nl_Vumc&CmTdn$};hOb>6w+J0S~_EEQ8{@~f)rWMn6s)+PR zj_7J?>tCMqYwEhXfbSZL@iF6?>htwpJLF&6T&=gyb+mPP-y+01OK+Wi$y{a;z=wmB z@!%mds}v++_&=6I&fv{ACpWuw4lDfAuKKem1-P=r&)Co-g;yrA<_2!lNg5B%fbUGU zZ%jRJ*0Y5Qe5~ATHC_hEW)W~*(EQrCaa^3$J$l`YuG~i>0KZKfQQCZ}&wa?sGZU4i z+_x^G-nPW#1(Rg$+!sWtpa;@yO+VH( zL`%-AMzMdcXTudY<2O^OA8iuvJ@EEArOgzH&D;6vgWb6wXQT)TJNul?B0RrtKWo}u zj0O4Lk$Wb!ht^Q5G?V`*-6uDH20ob(q<8uii#mB>AYOBD(*MU{Lt7Xd$a@dX%l?E! zadXs?*>H0g_vuTzu-oGYx0Jh7gdwkAKf0%+o8`Nf{t67Q5vF*Mm@*F2`aRcD&B9 zKBx}3SJoK9i-LkHVw;((XeSm1UwCU|;za+zbQXagA3LcN7C}plHCewIg&hcKzk%!T zk%`LeXOt%$_Uxp`g9A>E8s;ASlD-GOLcer|BZ%L45lg9`6y0knt*#x02% zORn|QiF3viqL!C=L~9KaPtNn&{3=A_l^@zvepTjzQ|y$e_K`}G+d`?8RWb5RWv@oq znfjF0q$o1@65uGPd^3IBKT;Y95FNkzC%&dNS@T<|9`v<7!quvnj>0;DZlH0XXY#Tb zHIfY5)BdQJ<#{u~`6G~wg4qfrQVt1sGB7DNSUC7xBd&=_<8PS1z-dnVG;5kU%gXK@ zj}6Wz_=L}tzmhnO!?V zZsGdB0yt%}1A|!iO%+DH%9# zOk@Wsixvc328^)Y!WxBaG@ik}sm5+B^(pF(z|$X2T=*M+EcxYn9`*6d-J7#fG-W#a z{)oV0HPMyMS0(h;mNThSap9BnuA3ui?Q>lR3r93ZDuU?HTuztsddovYuInqN_nnH# zmftzNsi7cTg*2ynnAPmtwmbnedMhCAl+tIBZEYKFln~B`XqqA(jAn+sIfZrE&xBMM^rvSM?wCq&Oto`ku-PAq}tW z_1(?F78IwU;TlJbDdACDptWIXKOOGVm>f2CdV#pn=S9lgh6O%f^M;B$Z4w6hz_sRO+Jqze#nlMW75ahq}*9YTeRx0?Px{U zP&H|p$eriyaa`tN|1&^=%8GIeXA*RuXtKVd5y-r>Y1q1(p+1OB9e07X^=4Sb?8o@& z)~c7^tk~@*U;Zp%1Qgp%0m(KkqqB(|vp?7;P+Ylm6hF+zQhy>xXH0 zSWNSA{zMC37^~EPn_!>Ipj)elMLO2eJhSjc*=lLIYf|K4`dbpM+Y3!-GUzO!KVV!D z_0tMYjh4EG2-ca);zJFu2Z__Bv&xH{?i&ng-y@4GfJONXy?m6q7T7z5;p2=HpN(1Y z@N}LC;6H%QmvQRhW016bd5;o$|NfFc{97h=gp0u{R9DD24)?(!)qp(kT5WMxxOtQl zIy1{tYi=Cx^xXJ-QF!A?v&c*1)dlC}=AKr@CPL<}sFn)BJxP@xIis~-&oemXTiiFM z%VmV#lUHrkxh8pe?mV}t^3Jeu*#E4&aRW6|9(YQS`Z2GlSHPOes@F49Noj8399~D~ z`7+t9982k)+vbcVbw5u}AhZ7j zfg}h0yVlpI9jE>`joVx&9LTGGB-zQL|WtV{G@LF<$W4rMj$D>%nSq zi_V$cYt7{kI8NaCGMwEh_cr??pFOuO?%c+cXamgB&&dX%1xJ|%p{8|KWF12AMLe`D zx(|RA{%0k$@l^KnL5ej?)i{2;aEl3UTZwN&=eLTgY1gJiIl#Hj%UZw_lS)| zIzh{KglQUsYrso1d^vhg?=mM;y13Q)yptok%3qjHKj08ntGR8wPagNudnK^qsy|T@ ztW{hjVxWARxJE=IQmIBt6Vqot#*LrYQq}E`{=Cm|>MLz4y6zU~wK&nl%?ApuTh7pc1+7Ow-uaU;l>3;}(+W#Ud z=xNYigB~4GPGdtXCW;Lcqok)bP8ebIV!np1=dx8(PzVv871_N4C*AvTlT`~bDb_Fc zWZK(*iXUkmgkCeTZY%KU3gZMK4z%-GwK}oCLQ%SYRCg@J zvKFv-aiih!?pjQF3H|_qq5&XHSnHBOP?!Mf&_DtpV8T1pe^28FH}}vzfc>cb+!Fi# zob!ti-Uu|z-@|w@qrB$lDn0sdUr=Mp&B6pZ$#({F&clLkf3^I(gCG$!RjL~)4Bm~Uo*XG`lVg?7Qe zQxsn(`=@5paUA%5E-@D58%!9Qf$zZxm}E$s#CCo=)U?pLs;R;H5Tt3JL`a z7I}8Yb+Ht*%r?bXIsO?Qzrtvge*R>ltJCQ`n|38OBAJo>#nT!#w`z_kqf|j#!MaF8 zVzbc!h`rh7OZ~^~awqluK)83csGgEo!Mj+-?_QmpyJKp)(*j5(I?+S zYk9pQ*7h(_d)Oy;3r z&YPb0qx&X8s$;J-PZ01FrZ|n`!TPLR5lIP#^n!c8KJfAu5C7v2#a!cJ2qU1usHY+Z!_T^i+X0940A+>y@F9sw< zEQ0{wU5I_2)r*bdgt0ur9}#$Xm~$bs>uPELvr%axhBUu+P6ivU!FHj|vz2J#GD>8> zxxj!@?Ed{wVE#v@SFRCQPFU^96l7mJ#q+~NG--#ferw-LVtSq$vwpS;AJ^SL{2U+^V#vO)%n-Lgs097 z7)uDtq)&3;@#a%)Z6b1?j|goTO=&W6^}oR`S2qADi9BG+K$0M=1$z+Y*;n;K3p|AZ z1wg|KNr|`Pm`gzTGn*2XYNL!9LJW<9dUCW(+DoDp@^hghc*TBO2zFfk_s5F3_OH>1 zXl(fC3;0S2-gx_eU7h_b-eD6w=Nts|7&>!IH#d3znxkCE>cZ|OSRDUVHh{^%h0-Th zYaX*OP_CsX{1M{hMU>s5db$2erj4}U0hid^&G#(IeEudC=IzhbOwOjL~%s=%x(in1iR(jtF5SDTPst>Bu+Xp827Q z(QMk2gZf5SU+ku}sIcdo?N*LIU@WY?z#-N&v)2n}p88q(^<(!JaL6k5WJyY|?61Xy z;6!!~3KnDnoi)z*hrZW)@EZso)yEGGl4uFTn~wfiI|lrQTcR_~&J@FshvAdJu1(s$_<{n5cxktdqD5z&u^ zgZEzOvcY2pqD^snnD`jUICxU&oURj}WmT6Z*uQfvsg?zu2{9{JuM=N6=U8Dthh_t6}@rN@*P=p?rIz%Vw#ceeGef03S+zZ-|Uu5RVE)FUu!bX(+Oo??}ER} z@$2%x?3};=bD&3V5pkBS(EY8`fw8b!b~RG&3KHGS1QQWXvn#4^%PJE0 zrC{2&h~hk&CN8`H`V7Xlimk)+f#>kjQhz|}vEB>U2jv$=>oyfXJeM6Gnxty^7|e>6 zw{&)jdwl~IAS^@PS} z@2JpSg0sZaXnBi&4q|TBy_-;JZ(z$Xsa$_k)eTok7A)Fpu?QW3y6OQ@Og)Vc!yZ7$ zW7du)6(c_pDSl7*q~5(WOi{`Njf``f zT7|CeM%(xHxIF9g;nBJBVZHh^TuRZUO%t|LinwS6cnrsKh0m}wBb?f^jrUtEf1_U`)&pH?Kt>2p_2vi$0@n#;KfdrTMOsQWQBP%tK{24*L zh39Ac{LUPwK+>$XW~c#jg))_!yDgZH8_;m&0=#)`spN4X{*GUg+7sD|`42Mw&v zYvUC{`w-pHj}rRaIM{9Q6}*v_kp`5yumem{Ma!p&cq}6~f}_@t-$Ue8pGuBnYDn_=Vb^bFZzTt z1^aXrDapVWy)f|d6f?8~w)gU*(W?a*p@;i?s`Iyi_p4yziM{@LxWWXMj@yAf`l$&N za-zG#sU?@N8?-TTj&py|4jzjVd!TTRzM5EaD61(8f5c7hjqn;o{A2g%uALoM)!MJ_H2(NbPI zc<>qBVl*mytYMqmBhWMegorMCKx=}oHcrAzR64{52LL&M4}vhpL1FyYAIp*BIk)$J z$MefZJ0o%|LfqJW0z;TnuDd(o@Re2gbi~BPvIG2j z;v2jzljrt)ho|7Dg9E4UuP+y34!6GR1j{$y-Zu{@Yo>Er1`u5y6WJd<@LKzE?Bsg| z-z4Zw!7R7=HDG@6C3r^5v*@4zN31KNFN^uw?83nvtL=8U{Mh4MbaTpg(C3iq{B>gt zYumC2P9{kf)=aLY!H}ms>?-e{cK73hhafXTg%PG`tH6mTz140dZ06qf#Y&IP5*9?M8j(>l9XA^Czz?U zr?Fxt_IscexLj@_@e2MdMW=kHH>JZlj`BIno^)^a{l~FQS@s!}U)~xGonG>co zy>6VE1?9BSRmq>P*SwpF`w#P08!xQ}4Mz71TqVYLXJpg5yFfREnw!WEU?p43{tJNsUEKb^-%S32`FMD~?4viz>a@ymAzhg({sBC_1 z-20pHY%pJoCrjliZ0)_cRxnWSRY4?K{z+(o|nBD_Lv0dens)BMC9Cdn2r*a z>8aNdv?*S%lowhoGXczIL+&sNrGe1+R=TIF1CFdy-<`s7LoB#1#@H&R@oYx6znYxO z7vWm-3v3sC7Ulrg2s1ZZ!V6S-TnZI!7BC-0el^3@`7%Z!`N=Kk9ni$M^&F2zsFu#t zYkr3=dOYUoboq;DiK9xD(Bs!AKRc{VJTJY_^$GCg=7q81{l^(r#;XgzZxT5&QJG1_ z&`Jx!0%cxJ163uNtZF^jT(*gC$C_VBZ%TDzL6*=PKg+Yz^bBc>7r@b(A90;0h4=7g zv*F&);OuhTz<)#k>;y=v*JD&egz8a7BoO$fu<6Qxbf^933P3+Jb3ySuJ&~*1@kd4j zLG$9P`tJ1bX$Sf8+R<9|pex`Nj9EN1u4_0>zI|yud)~e`dY$EYC5B0b*^Ay3g7w&_ zfnM zSiC$AvVV@<;YstISO4oT@xxf4*NHP`IDBC%lZ}W4-D70b^S;bhmD-VXn&30(TzyO5I&k=at=IwCLQA(ITpsrgpSw37{p7u+&o(KddjLAb;=89n_%M~|0- zi@JII-IF!kf)91ZnjEG>-<68oTYDnDJlfIZwr9EB$X90CU9r?V6oTZ2H1#uwA2%7sZpe}}>)d*(ufxYDp*nEYHH#d}ViS41r+%Lc*z;R5 zDIRr-)CZSW1HR<&;%&3u&^LMJY6Y0LSw3FRw||N|Xd1hfU)+%tL{Fj)0^eZ1HWfH8F-DE zxhrVX?63!aqU+TCMox#>EpsuP9Ql5>HCLxv(=2so&QEd|tq65$*}?*&xNV9wxvuni z`Ic1Kj9+IlgGg;)o~K;1A{Mq;gSRAfDD9U*CwQr+5V4S976;b=`z@a|0IrROv6%uQB$OIl2(R$Vi3WWlX|)+l>le@aFn3_jL-|C|H1u~G7K95D=jF&1xSpqYy>#XC zOXmyIMV|*pXng;;tw{Sp)rfa1-*UK&WS}e$_j$5#FPg9GT7TNT6{TlWRFubK%q6_v%~|jG7ZOChD4EF(#T=zFU^NK`!faayOm<3|UH0q7Liq?Qrv+H-Mx#0+*w-p*w zHwHdrn(=&)tMD8bzx_L%!ze$zC%rdpmHl0wzCv^)hq;zZ4O_H2ImzyK*RYoYb|0JG z8;(POG_GOc=vk+P)**IEK9I@ijLoTWJbh7eadoqNV8&)p2d(HBPEe(W7sbFQ+SF9G zNGHS0o~p_>J!?fLj-Z>QC^x)EBc?nGPZHvJKd3R}5z4SfqwH6HZ}{c~FPg<}CfM|r z5VlxfqbB%fpWTna8FC_gD^fT|C_RCyNd0_O3HRA@XBw*z^J?&Kmmc00YntX>s^=n(F-E6fSljnWe>MPIo zT^wzo&ci{gs96H*5EQ@Nua53q=PQJHL7lFSy>@Jz6lZUbPvr6**Jmw*T~nL@9kV{^ z?S(twXGZ)dk63s!qXnNC36DpUP=q5+WTh&8?O_HT9Q}CUH{o>}5eIkuI>*y%wvW7g zqYJK`>;rBTTDDQ(OJ+^hGSt6{LF7b&{6+;QjDLm&i%BKeJ-spOa4Ry>SJQ2zFT^V1oKIU6Y9hLd`&@}52pPy zUllvn70@4@+k+3~#Nm&NCh+{cSBrPrVts^bSb2?2b*?-qJ|35z+BH}6)>de|dsMRe z`a?=k@-iRlmm4l0efRb~%L03Ag(`(1p0On-ov&<}tsGo^n{GeZ48G*GIg{m2%G+$1 z_)our8w?WpoXVY^G6se)$>r!`E+k=za0-8#{%kl_R$%t7WM3SPC)9?B%$-54>$Iw@ zi&Rf}9i^#7_HFE^%UP-I$86s67yh-vD|p#7 z-8;ITIc>s|uxF)ty%43l;!8NAXdx{ue6oZmC%&^TzaiKj^Z^zcBqE~1^~ewKusyM` zx=avVABQN|drU`o<12OU{1}FCR%P7A=@{d{5cBJM3d)mE7n4Y(WWxRsX87Vu`^uMaZ3hX0Hq@P_G8 z&{4l$b;+paOtKH|#)X46@P*xns@&8yILQeHOkW$Xwuv1ci0$-zyAk7o|GHR*w>87B ze>#X6EWv$@w{Mo0Zm*7ZaBf}ql*LwP+q9i3)A1JcUkC1=mozxKU%;JwE@q&;_4ouG z6iq>vw>O=?d@l~q5N+3<7k%#^{A4y5#>^;ZE-3-_r6gXY{yf0s@w&cZ5VjS46qnf6 zFtFL(wr<0`@{wJ*?`$dGRIOu23w8#6w7ec27$2ZMZao=}wa;Y;l~j3!*qOggX^~!_So+tz=@?{}}gX_%m*eVFZgua{6 zg2=Cla7e+?n)0YF$#V$jD$6qU`k=%m7Skt`PVj5h#QW3any_rr&JAw0hFHs^Ha+Dm zbB%eL=Z+1hdSp-F#nxRWjc0*j?XbKtW;3BfFnic1-LypQND(;%9K zIWk?sl9tPx9E<|rAA7AD$<7lOrGvSZT^yQaLQR3jb5)bBb}#g*Jr$K7#X4}6;7wCo zWW?+1zDsJWknrsJ&ugF{(_u>EB#R~B_WhaD7YZNYWAsUb$2@_(}aF@ztlNV0$T zxFKt|J~@U;IZ9JOE6OQ0|C=A%pDny7l2vB*+)O^I71&BFUrJrRZjJ+6|dv@$$_{||IDuK?{vGL^; zRj*y;=}^)-h+cp19Uv|}w3 z4Ti8Nsm^jGZad>RrI|$3V@p;LF&F3`XWQ=~(oOcHjglr4HKn=*e!VOlc{YYHAgwzp2ghj*&TB zi9`OHqN7)1hR+y$Qx!;EST=~eCg7o%9|p2XUay3y6OC)J=h zB@|Xyo4F+{1qqIO3levVC7-MB3*8Y$>zhzPm;WO1r4GraFD1UslKCe3`2WW_=?rD4Ap*^~ORxwK$C zEIIaGy$`X`x#5WqEusqG?+WWFa%Ww{2rlW)JDibMRaxp{AEj;VT{3WY$mA zl`81!hK4pN(p*_MlvG~y^3_xs&jE60iv^7@N0#%lVISw+O^KKAOs3eATGxy3Ir>5$ z3#|1Pl4yJ-vmwiy(p_~gdZ`09nMeKWJkvQfVzM$pnP)RJ zqYNiG6SB4ro`>*+N0ph&i;C19MK!us%OlN(JMX4dt0t{Jh*U+EaV-qhYE^4Qpt&>o zWMu9~G53nr%=tEvnk!M5VQ!lp&3k860mbWo%D<~GDhu3fZlO$oEi2i>2v1SC(S>O0DYKQ10I?4|{`OuuLKQ34@o zS))tk%vMYS;pHQ~K{Ax$Ng|8jRl5=m#c+*}1GtMkt)fYT7T05;?|;3HHsaXEk*BF- z^&l2A*Q_Y;5e!d;Y10dpfwioIVt3f$qWr&e#6@*VQUey7U#DAnkJ-wEn--j)Q*cW< z*>XLu8Hr2ujK`O8`pi=(w{xND;HIatuKjV_jkNa}H9S});EoUqRWb4nsx%!4GJUTn z``(RXo3Xx#HP%e9X2@c9Pp;qu|4e@itQYK?l| zRGSq%0UMq3SLhtfj%+CTOn7hlQGM`{sk67Y@;K9GH8(}qvlea&JlMEfM8(KCm29eKs zLG_{-G4zcZ6>4B_@hUT}B)g}d>?3mO$pSp!t(B1lzqmeK*1XBWGqSz>v1=IHxjVvXKreZH^yR2++A8;o>ZVq+1%V4%Wop}MQ5a|2^DpXnI-aqj231J{Nb>D zE!=A-$~3 zjcr~AH=Q%uCrpdH>TQ|&&QYD6nj&K#Y%y7Cv1uCzK)bp(Y&x3p(vZ$jM|LnHm|tc> zDOY#uyV!P47bIjrc}OA9BsrC=Xzt?yF=lI&{idTI-K2d>DAw?^mN4W6?i(8RQ|h?| zGu4L*A-+RxGa_CRii#J*X#OGTsqOw@Z&N*49r2Brd1k&0M^dmo?w9IW`dlm}wLNk&Ar)q*oSA}!rfJ4}xz}*dBFE#R%M6qK z;>#AyB{B?4gy=LlPbE~e!8sMA`qcHg6jH6 z6+1Cs28B6r=TVBy>bDgo8#aHN$=PCEj6RLU#p-bWmKfekk`gkGXUE#O>?L7df>Y*g zLt5I+sq6l3fp#f^?7^cbO`0!CbI#9wCO6I!IyEZmOP3yhW446;g1;z`0pEQGjsy|l z5BQj%B1?`qcnzRHm<0exQ9&?pfxI^x%Q-y~Ub?vMqWi z+w2H(R_?KV9yvVoL2|1Zjj#Mz3}HC~seG1?a-H6sU*Yw_xyKyOP0w~c`r6=PH1LbV zA;46-$a5@eAhtEnF^gOo?pK z0U;L%LDet^v+PEyBFov_D;^Va4tT!*cNddsVUJfbJ^GxVLQAD;Q%m{G91=#+%N?;A zswDaM3q?YE9j1!GsmGMt{<0EYj2rA`F1gL01sMl2s&LGnu*Bx~FdVLE7`cXd@><7} zI+w)8-sohbC-%f@znV)QaEi$GDh*DBTk<9TdRjPBvts_9?Bh?Av;#FW+G)5vjSL<4 zDidGy6F&AADH)lFzF&G9-tTESXANikEIRh&w41Ogy%IZ9nBFgMuL_u8a=TRz_$_LE z#fs{$-U=yE5y}RMdVWaLwq$TO|AXsy9?J_p_@1)|ZE4 z;qbh}RPpD4bK#V&6Tb{f(ScX+qttXug*QBG`)W(?zi!yHwFI0-lX2!a6I+f~9c|M) zt0zes(23K%z*@;uu4dQWB;9^c-5_ok?3{EepIc(S3L-EZ70Mf%(1CI~bLY3BqeG9g zTtSvPHVR6Lv1i(5-mHtdFCE{Gd|bQlY}!!~?7@U((y9AZnSFeV7WUByF0w6fmS~$s zZ+=)om4(q_$+H8`IhU+Z*EvqQ+854D~|EB37DYz(lrX^9hj`CUW*$+3*sx<>J{h0xqwt2lmdjFFRpm zL0_cI?E@wWc=uDAoXcM39H+DQKcO!Aw1(|H@&4o%Qs$}Fzk!;_wp3CJQ^ukGyi|)f z?sAQyL{Nn1!7|n%?J*jP>eL{*jP2@mxsT4&y;KiS4Gj{LeGuqKX8QX9|S{6evFH5Nz{3_ z2}A57-kN|%bcPV@6FNKjLRish^^i(WJ{eQY7Wx${45i48fFx!bs7?%hO)*X5C+fz- zj8AXX>Z3>P>fFLmafHIwOm>b4RxBiq|LK)m5db_yh5|sCg=e8(|3B18<|ty84}a1-QlNl-uu?{Fv)+z9}26#oCn03}osJVXUS_z|k{NUdiH z02vh6ofUFm$lrcI|6xhk+dH_r(CUF8z&i#l2*US&cktca0Q-MEg(5xGiW|X0)Q$k~ z>m-r@Z%|R7h=mjYB?|2K&Fn5AxtW?fBNhLjMNgc~ja?n?7_d7Fuz7wntQ_p08oQb!xdI5CRDcTr3PjN60XPsB zsep7uK?X876~zDs#Ohms+ufRW8o(`C6B+5%G(Z&!D-`sPH$3VN8unJE4rWM6(BGc^ zuY*wVKQcEm0F4N|JOJxIGIufojws+d{Vae!(%-s<9Dq20>32vCu>U3S9}oT~VhB}i z6cPk)1^^8)mH{9~DC7ZB5hX?c5zLbha6%D4yvqk1AX19~cy*ZtfOC|Gu-_Q_w`|z& z^dOBzh^e5GBRKK^w218@Kqlfv`9H3wqwv)!l>kyv5DFCl+`6MufDV9$|8K8hzw>%0 zXw3RQf-=eh=_LPP7~D**0D-;o;lP!R2<0A>_{I*lrT7=Y||mi{nS z08vzp%!2?jM>T+Bgha!C(qmK$u)bpt*8<9Zrzg4&kcGl3@c)q>fxprt@PFxf(*PJJ z`t92PCJ&)XjvRE5u_i#+Rv?F*j7ES9GHXOl08A7lN>MZcBz0WPfMyi3|BuuOKOqT8uR?P5RZxAY5MFgi?yfZ|1Q$WsjO0Q*P+jnm zC0QJVN-YipLXo(<`_S6cV&C0?Fc<{*H;)&J49wlBF-MV_GG=jTIa@ZYO2WH&&p2BX3#1fYMNg#m#eFaj8Ys&F61hin;j zej%trC`cLx0V6s>QC-pa1faYKfiP4>G=5$IUPRb$3dGBYnEOrffq)3MaMVyVelQe< zs0l~yrU1jBf0_v6hrob{xQII`P$Z;Qe^W34C;}LXjDPC_e~!wgI_{1_ANI>agNaSy9j+d`OUhCRCo9~g;a#N9Gf0D=hmP4PpZh$$omha$cILopb_2l^9eU-qrn1T@Sl(a3;Yc#umB(E&N(>p^na0y)C>CaFoX~JH2Omc1SD|RXa1!a z0_DAXME#ow5x6V*KX@?y|KZ)~=LJHLVEr@v5Ez*6FM-IjfAU~Z$X}^LW`qyf>i(q| z%8RU{zj$yc=r1O+BL3z9dH;+I6eIxoQwg$g{#J~vgTK%6^ZiCJ(*OU49}4;#3sB@} z@h3i@AS7u1^aO;2=AS%%(BDS$|GRYV;tz!K1Nr|x421p}1!M>O%VQ`%AM8)CLir)Q ze;LRR6Zo@ck^fl+|0fLp8wKR+*8c&>T@I1M5QP6vd_W;c$o=85fB>?t{@@`S$=%cY z?(_df8j5UKzj^TgWeNcQPz(Zspm#IGzYimO;a^H%5ZGTi76ASEYycsV^>1t;;}3)i zAb0+u1jhS!N?^ze`y;F%5cDsjfiNK7Uq-`#kiSw40}8-c|3EOZ=kbF7G6uvCMi?ca zl9K%yaAZj#8`+0+)Q4~wa^iPzaHT~yhP(Mw&fdZSId>xM{r%HZT0LQ7Qvq|33DCp@ z*~|Eip)hk33#geXAJ~k~3}P-IU?NKU|G(w;Xzk)^?Ck34Y;J)K;^Rk_KQT^u=(pNTl;S`U7;z{?1l3(3;>E>E;DDI!OPQ%O&TEn0kM;$H z=kG)>UPK3Or*G#^R_kWd-Oga~+DAQKyBKr$E_fo|&@lmeP$7|Ti=Kc{Via8xFi)3H zHay;hDmERozVm~bjo8mFwspoH*x&gQ+s6HF_c_a#Bno-)SGcZ86S0qKHhwxIB_3i% zRoBBRf6Ob_d56-z{5~8Kbde)%lE% z_W07YpU+qYpE#=(xDKHAhe;z`iH=Fi#SAG%Y5O%qPcj4gkL5(TGP=(mFAzn0eJ1sZ z)Pr@%3MPA)BxJDK&whZ{FMN+pZTMBhNz!OHaKlE=gLC=_!5l{uCf}_;*xqA0KNq`}`a^uS8#VLfoBQ{2bh7+jztDSchr;g6 zh&ENuHj7#Q6Vo@Z*yvrT3;X1?nD_W^KcKpA{%bP6VM`q_TR?f|fhk}9NiuhwMGZmQ z;8Yz>thR6d`weKnpEa&N+M=$tCKh!{*9SV$|K?*&)}=VK(e5pC`z(qd@mq8pv}S)$kD7ij9ZNon4GXk!gs<)CYa`kjEfb$nHp2Y9h>^hs-_cnOq)+9iSK z%Py5p%&pHH_?IKL(&ONPNBi|Nv_tJ1~wEy65`z5y{A#@z}Wz+4I`KiEo_4HJ3 zCWqbn8{*1@+o4h2?QwpCWR`Ld#$$#pXFTsXq#qmP>+d9g$7@7iCNF$uuuOTXA}8oY zQ*Ptn)qohj!`WOXRVr@uv2-ADki~prt-kdmxOt zUHF+PlLcUolak>bf!0fJfK=8cniPplWqz-cl(jNna1@8>#`8RDxz;YA1yg{`!}VTi zXl930JucMiF|P7LPoZ!l=uBI+?zC=HF(%}96^L7(=2I>;OWyyP-|k-}9;bZER(`<5 zKy6Bwy^mUo)(yd^8XGtc%4@Av7;wgTP|B_kub8}jJA4QNiCS%USytWMhn}oeq$bz# zOq-jKhwwk%>ZswUqMnIp17P&_rF7WSJE_#Q-qrl%dZ@Oo%Zz1+f4{M5PY z!N-6qsRfF2@TwIrknOY%exhVc;-hc)IJ2#k)(+q@9r&bL)`_yfnXvC+;LH8_mGcY) zl^sQTLkE7&?afusOV-L)v!ga|Fw4wZ5Ah|LCeJK|~s`5h=>f!JR-aQby9~>p!G=9 zhF6DB3M4hpEZRJk!|yw+pqk3lJ({4_Nuec1oTnQNPf{@D+O{e@x`QO1JL3dKKj_xM9W3aR;O0)w=ba&Sk8QaN^xAD_K+Wm#6`!cdJ8j|aroMn#$JfIR$AqyoOZITRxPO5 zu46r+I1Ld}UF5Rl0Yoa<;2*a1@ElYKu29WH89xp(O-Z!5X=94w){Tl7SISC{6@S2| z`S7+nnvcQQB6CJgVpuCCR^tJ$EVqj|XMm;4{gww0r&Yd6RK{hx)htJh4?WBMQTN7T z^s#juWdeiLM-|rq4K9>my<}YyQ5L&@1XV8&&C&2SyN3`(MH4H7kpiSl370XrumD2GHX2+X55naZiDo-}4WZ2)S6XdY=+)Hz-vYIn`YpO+RY!IAw2#-C8C7k#uMV6lxK&g*5v7 z^>vLMib-iYCK{iW_Gb!7syCm&h<@RhuUpdL7ELegIRtxl74>HhcEu+?KPTulGoj_W zi8v|z^3Fwqqmck6kZySN&Tt%K5j|+pR83cmj`G%`eqD7ei1IC@&VMLcDIB>GX;4)C z*=%lYv0Sxvz?<>0!!PEi_VXDsPnndbYfzX>z6JK>#Hkx=%|{8F(XU85?z`@KD?bap z?w9Z}I9YbX0k_b;g^}3CYG6x~+(=QND3tYtK= ziD*#sb>+&372vhFY_W$A0-D3R5{;^9G>zr#1o-WBoA`?(L85mKLkkT-q3-dCA&2LNd`6AyQT2U)6G-RxgtwHK`JuXQl)buUY#DBTSIHB;?V2DRO~+e| zjoMO7o9|Mm=6VG4zCIV7{nSe;SwGiDYHFW37|(Qys;+2@XIw04O+1r7DQm+pE7WguLU%xey+!@BVeBTGVjrr_aiM8}? z%JMm3nfgtZrDCJrP~_7z9U_UkrW9*VAoOKC-#zIxfl@Z2hKdq4BO$!+=M=z)kcPYy zB0rtIlXnG=&R)M1kabr<+pQs3DAIeY@ra7qBncHtV3LFY678x{#UI*vw`p@+xrnRv z^97i5RTpA70tyQsB3P+zMtK_uvruhDUxhs`DPw-@Il)^Sri7T72Gp`7*iL*^@-1AB zLrTx~Mp)K{HW!torxq90UGC__Flh>{`?o1OwJ>r&@>-_2sU*>Rb}!^U%pU_|3B7zR zZ&Nbe<+~Ba8a1ba1I+caUyF4j{9U+{adJT-^;}dqMy6X8dRV@<8X0my>1D83!ht@W zNo~D`x{n{K6lO9D@NZM@AB~ozGQ5!9a;JGAJv;H?t?0e0h{HJE$4-9WqGDru%}FKS zuH;NYo@;|v;E>8-~~G>zknVC4+7=>dMnC{v8J)%G=x$J}`!pp5k2~bnn^caq^58?*Oo)=Zux351L5ZMl1VSib@>^-kOm|*pvL2GINk2k5>YG z&&H!A`EjfpC$E2*l|C@7vELS9$E9K?;U%Y@$1`}|eU3&iU7{Q43Ww11m*<;@=yv0Z zU+1&Jg+nZk0=~ccR@)uh+xL1L(Vn4!=N3H!E>kzNRd+6LqZ7GDRCXHCjp&Q+WN@VO z+ON6u&58E9UjhrR9?y2kUNr}e()w10eCb}+{k0u3DrLDIy1c$fQ|TPyI?{DPZxqkp zv}XTC<=n2f9mP_~IEv`3Wx$JI%lkqnX|*Oi$5y{Cj&pvPvr6zh0D)bi#~}3QLzw>^Pth& zuQLOVnddp*xIXGkFxZ)W_Y%^{_s*-&Lb&O$4|jcvXQ<9q>dE_3x!!ctETdIMoRLAc zHp|H7YAozEevt`8U0%13wgZ>%Vav1Lqff2%fhseAHvyRL7yd zce})R=6wZ62UyhZQ=?M5RX=mB{pbFX_f6vW;=kF%n%C6{mAAZ_V4QQbX}6_ZQxznP zp>uW{QM$yV7#4^Qn*pI+=|tE>KedILrkfN#jd=Ye&&Ie)JEt|v6-mg*Wb{Q98SgR? zCv}aLF(?-Zzo^QzU)4$UGP*k|>;c6M|5#ma;C@*~I(sV6KwCzL4xaI=4yHGFdp#^j zpU~I17Chl0)_uw=R_`hB(0)vZkKQTgrRdYzKpMq?5tHS5>WEGwG&M%d!vQz*X>Jo# z62Y7LDQc-}S6Y3_iJGOCpI9$Bv$gZHiU<@_vPV_RQ4{{2iVn}dl3tjU4dHLz2fAn@ zJYy4&s*96q3g8k(hkR+)Y46_UulG(qGj^ueUohCh&`x*1pJ*se4UW;F5$N7T%4oO^ zA62eWt0#jT3txSj71ztUy&^P>C@6UP&PgU-@?MEGSSsh`wd&j+q+V6oPC^o?ejQv- z3?O@VXj9rLjE9~@I5lIcb@L~9^9vNEZ2BZEtw1eNW8$y?&9OYZW!`-&J%#Juq>7S6 z@4H1$8)BXKIw)sJgZ_q8pKV4$0ikV1e1X$lNrhBD9R&MD3}{+{P5EsRvfa$H1HV4) z;hqr7R_Y2+sD+0`v1f!}iJPbco?32UBVAOGrf>v3JN)dMPi-&st@+}TisMCB`lTb@ z^)E(*W#!vH&<3^#!Edh{Q5!ATh9(X+InhP;Tta_6T-_%9(KloEC3ynzeWa%=H25Jw zYSXiNrrx8K(x9vkDvlVS=rs1t5_HoR{uY2xV{j`iyr4%b#Ol3O@N%UVd(5S68 zpeWs{dD6b}u;5HN@3o-JhTFE zIUVH4P@CwyXwpfbkB{?w&!%>(!>7!ITjH7TmJyT^eL%|4970F*b9kHlTkIQet-zUM zb!`#idwV77TTy~9wBRe#5vDOnU~}9{60!YWNo5NTAcNvdp$)O*5xG|fA|#2+eT0=! z@9cPQj2|8~YZ!7AH8cxS>8LpvrW%&g=?^>@5QVm{5`WiLa_;%LE$K`4QnX9!c37!o zoFZmr5-l(~SsVBB6IY9wR9Ie_WdVO#2Zw*XvinUH_R{1HFsHqQ!@ywmLBZwVyq?7U z5wVdp4W~~dX>lBuLY9$tD@LJ~xXXAwk6)im=r!MSIfXu?qPGoi_e!#^dPg0_0(LBT zp4MzstlIhvc#H3Gw;UrESgLBER-UxuDH-zs>mgbjDCuyATc?C04L^XosMntrk3`8R z-HVscd^Khr#1MU*D3mSotu}~*DWt6LC(4D#JyKR%g7v$yyurJ1pGZv5M>uOjUCQH| zWP@#w+P^tcfy$n8>}eTq%jI~?P{aho6!^8nRF}ifd~bHEF4!R^I3BCzcIj0&a%hvy3r3AsIg98-}I z>JqQTg-7Wu7VG^z9?quhVWnR8=yMn~4BmC3JLqQXvPx;DUJ(#XdYXj;Pjfn&4w;v6jS~y8@5Tn6^wx z@&e451X?1rHKPO-yR-DTKM4!?idi2)`KRTNtC#EV!*so6!vKp-NgL$7m=Ci;md!IU`9 zi!8@W8M{SWtJ2SbnFZ=udBO*Pdco?Ns) zmU=jCy(*-N?))@9x;7=8*kzr|xrRI5WiY4IIwk#razN>#4SwpY?WRDLQJ#lZd+n)` z?%fkJWY64yFnVMjM0BTa8o!eay#Cgtt)ollVsK7yVZ`I|bNJ3j3Cx#ZS&K!J5xB+l zK4O5B@q^Ccg|6OVl&G#t4*_J^I5gXdP9lP|5o#L{nfst^6~|zIHZq}YtUTH&tK-(o zaG;eMUjFMyUlS^=ZMw|RF9R>pf}A^aI@5`c%6h!B&u7U_w_h9X2v`2_3LRRd{`4xd zHe(0w!YJYT9ane3iB@e@p?&07$k)}wE|8e--uR1UlF*w1_0?vFBaE|qy|}qwi3%yG z@CSc34k_V2p(88kXCiyv)K09j4ua3PT5WE8osFASj1SgFh&HL1ZH6sBLq7pUJp0rD z{}{==LVqD!CEW}OZjXo}a}j-ZXMaAck2&txZ(!%$a88Fa6GJkCW%bt3HYc~$M#XK@ z&LnF%G-p;u@m%}j;&TI$f$LZiPW@)@5~xzP zqGeuwKcQZb0)g_NY2hzpP{`&fDj=TC7P(hML`0A8@ z17qX>Xv55D14u9-W`Nt62aW(59609D)dTufCd#=lmAmB9i)T1cFHk?QUr2H% zKw!IzE?EYE3tTztdZ1olN0Yyq6i!t@z1(>!F0s2SvDveF@kJPY zK7l>*x0(Ff`)DGx)81P3e23Hs-EVTlFSc0K3nbW+)`L(xug?foRy7#8#^ z;a}&y$})M=+-!jei?z zJiqkFjQ-|`>^14C4cXcM<^>S1Joqx)30wTcG!k1;it{SO+;I`?_(k};3D$=9$w4%x z{fnV})x5}N!pb;t`FSvDC;v#fdJ@`ZJ?H};llcf?DfA#pUbv}&U(i0CF;Zh@{B$WI zdxBI3xbLDV7=v>Sp@|CzWW2pz_0eyinIJzkX(`@z54VH*HD2ul(UAM6BU$_+&IS0v zT{R11Kfk*^D#*Hy!)i7r&o}EV_zITEP@Yu5u&h*Eyr+b;Dpc#aqg7#gcfK24U+f;q z^ttxPbmGV|$G}YPY*qZx!wP;`E_OjSi>}}| zVdhR&`@#W_*7lN{M6IT9NMf8GRT~CYKp6#?*&(TmJmAF*wPf1H`0DtoH zUwkHDr|B@;OoOLE{FudNA)b#mpq_>-Fft?KMc#|IS?ud?2b(k##1*w{U_p)-*AY9( z_|`7HtmD=l!+m4-cYh28G&3_~eow`7wPY0fo{U%M48rF>B2NeJ1n)5iphKe!o3+bn zA0ULDU6*lYcF=YqT-RHe%5@T~A`D5%v~vv)UD$ZgFy1YG4WemM^G+ZjrHp;X%Amu~ ze?^3EEAIn;vP>+c0+|ssCqvC;p@DLKJ(ektKKaljZ$40t>K>?Huv@Z}dSZ%d21V-B zcrcnu#vmzIq++4Z;Qmyi6Ft-kU6UfX(+xYOmd|~GDolMs^S-uuB6uDb8u0^PiMPO} z&xM(YjnX?yHJNr*pMa9=M--TIW50e0we(R#^$=$ru{-7`-(`(c$~qa8Xfxw-KYTtV zPCA_rQdq$8op$g?Q!rAwS|9Xcy^Q6xmqFicKEL8{C4*8}9 z3Ds`R^U1c1kX9aSx(TfH>OM6ru-FXR5D;?j;Ok^geJ2tb?qmk8xfv1|kG(8Gn~NK~ z#!L!g+Y~s%o8vXY(2E;oS~*sC{4~N+%NjMp0GkzBX8lEp3hAK7i3%T>t=0MJ)dL?X zM&yzSl4LbHUDLnTB`Zj>;IPd{@~A3KAdAhp0xtA*+;IAHU^j-hr06T+h&daTm$OhkyShxNTo@-Yu#=dOY`Er@BINW`k^r=<;7 z{bs5qwOJu-h(2?~Hc1_F>(M*#lbSZ{QjcsZ;PLdVh9xLyGr85KDN!xY?9C+chI9$f zjOi3ILOMSHt(iaV;^p(qOp*!LVq9vAK37t zY~jS7Pfa;o>-lFMC#E;W3ayP!4--orB8O%d^z@T-@k14PQCs(@xj9J*OiMeLXz}!@AA*$&zC$`SQ{;5D}9G9 z+-#Flp+WQV;a>ZQ2jtiPJdC)(LaZ6Tf20qKrQta-Oyg4vF)f1g0@+gd|Wze-g{HIdwjN)YChMe3a3q2+}lVos!z{a z_D19Jr^!U8?K8j3TR(ZuE=wtkw#1@2B0i-d(0$Hbk#rwx%+z0wd&ig!%f6q>$gVeU z+{7zqlwx>NPeKa{yigFPZ+sRmO-}iq_Hka>80)3Yk*^`=TaDX3JGv!=qhR|1@lxNz zA)1g%3jep-=Fxz4mNWN-Fshf)v2|giO(f;;NSo(149+9G^(B?!JGD;}SM<`R#EQGR z)zFJ(RgeR_S0}MY%3W=?4|iS*EjbYdEcF{m;|t3E{8n4J%L6RZ0JqS-v9Ax8uYLkg z$v*2^FVvWkW?^vtu)a>%AY~G>^y0M}_lBkwzIRJut3_CbqM2eZLB17kb0%lCx|)xo zS#H%>$UQ_Qi*;%ybT+f6YQhV6oz4_wCy0JkKav^e!ABFdlw+b6KXs5h|E(dbx7uoA zQ;$&8o?eP{s+!{IC&?hdrXitWExzvijd7_>ow}WdAWKzQqFY}59{57hRi4nq*q#M9 z^LS`aFhj8d5vGu3!>e*yH7m((Vz@$Ll>%)BsJA>W;}K50za`sbF}lQ~G6b0-RY4Dz zEq(2V5T=ia1>PhInJE5rYc8O*4i{Lj)i>F06Hkn3xjoB5e7xk1;g{pW}C z@op>WQ+Vdn#UJr#$c@y&f2&IDC8V=jsiNS zTMX$3+3Hoy(ui&Z1m$cP)TJAVbxLH(ubPArl44*G<-4Sc+z3*Rtmlqf?7nO7o0Qi!#2}E+L;H zjYL+3vfty2PDRN}oF7=AA8nmQNEf^Z^u5B#9tt|x#p$@OKQi55z%&;b6GQsTu4&Gf zGBm=oOY>;jomdi{Duxp7L~cJGChWR1th5imPkZdml;`$#T);2(rT4e~B5=^L^G~f7 zoe&wM&GO8|d9@%J6P~dQSBfsR?P_8WvgxtRhD~2!I_blA=!D5{d7^AicQ#d$ zW4(k9It3h%i~_Q*HY^b_>-`qVUKF<{W;U;l?>E zmtn~{tYEB_--V}+d+nVRThvd~!H~wU?_sxdbDOOddQ`&6%zDr}id_$9>U@oiFApK@wE0o9 z>+?c!{x<}4(JI9jcV9N~%#8(bRqqE3PSK^if7AofL2PD@4v8pDhCSBDANN+TCK$xl zE86=?Bu?{lVJ6SaTW1F{DhZ`~D4C1YA`j7)G+D>mZk3Iqyig;gS$ozCuY%ol=lE@0 z`^JEmoQpl3&^`rUx_FY&;{isz2R1{^U%6kq6T50Pqt%x5lN65L3x>cVe4>Lx6?qK? zxMW_?g%ed0iZ8CEX_soI2nHC2?`#_oBJ$V+ClpR1pGWymO?DU$e$^$&c7tWJWwz1kxjgz{cR${EiFRgh=Va6u=5n7) zyFo|w9Brad9R56(p#4Er+KP*jEHzu$va5>8OsAs$Lc+jDy!ow{Z#IV){Zp)F7rC;x zPO>soGlb1Hsl#>_R_wjbo$~i`l5KY4Yr$#0x@^9~^NN;7cWln|Oh0j#h!54Ux1XO5 z@OyWQ4z#y390{yQ*6O4v64<>@SBgchX(0*kqWLNMz8}vp_{Z7u%T* zPI`XbR~@G^H+uTf;$@%rIHIh+uvf0gHXypbyZvkHSl-(Gmc1@ql!@MC(l;18U>djEJ@9m$_M}@->a{5J%g(hX0#>+<0v;;{KCA& zSI=CoDLqTx-UmI- zHSv2sRC{LkvdiOhG-qe~nj8$czbg(P-Rz?Ex-G~a+&s>x2(=V2B`dtE>Ku%+G#1ST zh1bPABCVPzcq!^tNfL`6Yj7P}7X4rX=z z?~z==hi|~^@_eGnhP@T^{4N6a@pw1;A=>XMvtl`GFC8z!OYhzaK*SU@p{bzc){sWi znZ8*j`Pp=W1kM6J9d5M++5UHNd1`RWN1#I6TsC9L!;PnbrSEAE=C6yFtdAuKCch8f z-zfMtk@HCRq5qHMZNMrmF$V_=k;~J{Z;NA&oiQ&ws@cjTx~RX0lvqB^CNp?i=0Mk{ zp`Q?#*lbOT*;!k4sCVG(V1*Nh^h}a51PXHEq!~j&gNUTmD*l=za6KPcY$IdKu0$G4 z{cC4RscuVCSnxe(jh1uZGs+tc|1{O>2tX}n>^?vclNJe}X#ra6rGg9_9k%Fw3a`Ga+F~2M0$tS5`wX z40+`vD;WOUee65<>a#KNe>n}qu=xO_;}>|TF;RH{a!gYi;6`Ir9>5cbhGLnofbpnF z%PQKq@%~?+aM=In4*Wkm(s#fjU=a}%7zKhuArOece~Cl>he=F~SXj-)(Zb!_(go|> zl|5{X@4Hx_C0igVi=U=+En*Y&NgZJBajO3gDX!+g_ zc!~qPQUJlh@Vo(VVVX^VHyTGf0D=IT-#GqT5i1x8$53`-16Y%IFf6+i!K>nbKAfXudM4*xY2pgS0b`dB9_)jee2nYqn zY+)tnMW9z%`_couxk_;gaIW3 z-Ec)jz;H})GEfOu1O$a+PJXYzFcd~U<%$Nuc1=nO@CB|290J8~rUJX^K`6+dE+Rz` z5CjG%?Mea(17XyEuTU@uCi`jy62a=*`@I4opcu*YD;gMy!o>bwK~PZ4Vmj~n}&iRz!>A)D}^ZR($5UX8$iI|xTyjrD)iP~fYZ*B>1^*cZBoy(F z;s3FF6@P61L7{(6J8U+ujyL}bAwmQN`x7x1$X_WzfUrsaQx*hA{h49}7=iv>g;*>9 zHwsu2pg)aZyA%2sItUE*mqG{%{)b`g&_II!YGWw2|9(4&{(puMPz3a^P{Sa9&UY{f zfgN3cqQefezaj|#Us3``fd3U$Z2ZAstk-`QA>wN4|7iq)&HSGNCcARuMncJ{$TXWfVa>v>;c`;(Tx=g?CQoX?_lMKJud#|lQgTLn7J7oj4(yO z&9UgsK$aqKOE}ULJ6OzMD04FlOOQD0|3Ay`25c diff --git a/lib/mixins/markings.js b/lib/mixins/markings.js index a177fc0..278ac7f 100644 --- a/lib/mixins/markings.js +++ b/lib/mixins/markings.js @@ -101,6 +101,7 @@ export default { addStructure(structElem) { const structTreeRoot = this.getStructTreeRoot(); structElem.setParent(structTreeRoot); + structElem.setAttached(); this.structChildren.push(structElem); if (!structTreeRoot.data.K) { structTreeRoot.data.K = []; diff --git a/lib/structure_element.js b/lib/structure_element.js index 0488a04..5ae890d 100644 --- a/lib/structure_element.js +++ b/lib/structure_element.js @@ -9,7 +9,9 @@ class PDFStructureElement { constructor(document, type, options = {}, children = null) { this.document = document; + this._attached = false; this._ended = false; + this._flushed = false; this.dictionary = document.ref({ // Type: "StructElem", S: type @@ -17,7 +19,7 @@ class PDFStructureElement { const data = this.dictionary.data; - if (Array.isArray(options)) { + if (Array.isArray(options) || this._isValidChild(options)) { children = options; options = {}; } @@ -38,9 +40,12 @@ class PDFStructureElement { data.ActualText = new String(options.actual); } - this.structElemChildren = []; + this._children = []; if (children) { + if (!Array.isArray(children)) { + children = [children]; + } children.forEach((child) => this.add(child)); this.end(); } @@ -51,17 +56,136 @@ class PDFStructureElement { throw new Error(`Cannot add child to already-ended structure element`); } - if (!this.dictionary.data.K) { - this.dictionary.data.K = []; - } - - if (!(child instanceof PDFStructureElement || child instanceof PDFStructureContent)) { + if (!this._isValidChild(child)) { throw new Error(`Invalid structure element child`); } if (child instanceof PDFStructureElement) { child.setParent(this.dictionary); - this.structElemChildren.push(child); + if (this._attached) { + child.setAttached(); + } + } + + if (child instanceof PDFStructureContent) { + this._addContentToParentTree(child); + } + + if (typeof child === 'function' && this._attached) { + // _contentForClosure() adds the content to the parent tree + child = this._contentForClosure(child); + } + + this._children.push(child); + + return this; + } + + _addContentToParentTree(content) { + content.refs.forEach(({ pageRef, mcid }) => { + const pageStructParents = this.document.getStructParentTree() + .get(pageRef.data.StructParents); + pageStructParents[mcid] = this.dictionary; + }); + } + + setParent(parentRef) { + if (this.dictionary.data.P) { + throw new Error(`Structure element added to more than one parent`); + } + + this.dictionary.data.P = parentRef; + + this._flush(); + } + + setAttached() { + if (this._attached) { + return; + } + + this._children.forEach((child, index) => { + if (child instanceof PDFStructureElement) { + child.setAttached(); + } + if (typeof child === 'function') { + this._children[index] = this._contentForClosure(child); + } + }); + + this._attached = true; + + this._flush(); + } + + end() { + if (this._ended) { + return; + } + + this._children + .filter((child) => child instanceof PDFStructureElement) + .forEach((child) => child.end()); + + this._ended = true; + + this._flush(); + } + + _isValidChild(child) { + return child instanceof PDFStructureElement || + child instanceof PDFStructureContent || + typeof child === 'function'; + } + + _contentForClosure(closure) { + const content = this.document.markStructureContent(this.dictionary.S); + closure(); + this.document.endMarkedContent(); + + this._addContentToParentTree(content); + + return content; + } + + _isFlushable() { + if (!this.dictionary.data.P || !this._ended) { + return false; + } + + return this._children.every((child) => { + if (typeof child === 'function') { + return false; + } + if (child instanceof PDFStructureElement) { + return child._isFlushable(); + } + return true; + }); + } + + _flush() { + if (this._flushed || !this._isFlushable()) { + return; + } + + this.dictionary.data.K = []; + + this._children.forEach((child) => this._flushChild(child)); + + this.dictionary.end(); + + // free memory used by children; the dictionary itself may still be + // referenced by a parent structure element or root, but we can + // at least trim the tree here + this._children = []; + this.dictionary.data.K = null; + + this._flushed = true; + } + + _flushChild(child) { + if (child instanceof PDFStructureElement) { this.dictionary.data.K.push(child.dictionary); } @@ -80,50 +204,8 @@ class PDFStructureElement { MCID: mcid }); } - - const pageStructParents = this.document.getStructParentTree() - .get(pageRef.data.StructParents); - pageStructParents[mcid] = this.dictionary; }); } - - return this; - } - - setParent(parentRef) { - if (this.dictionary.data.P) { - throw new Error(`Structure element added to more than one parent`); - } - - this.dictionary.data.P = parentRef; - - if (this._ended) { - this._flush(); - } - } - - end() { - if (this._ended) { - return; - } - - this.structElemChildren.forEach((child) => child.end()); - - this._ended = true; - - if (this.dictionary.data.P) { - this._flush(); - } - } - - _flush() { - this.dictionary.end(); - - // free memory used by children; the dictionary itself may still be - // referenced by a parent structure element or root, but we can - // at least trim the tree here - this.structElemChildren = []; - this.dictionary.data.K = null; } } diff --git a/tests/unit/markings.spec.js b/tests/unit/markings.spec.js index d22777f..a9a0a7b 100644 --- a/tests/unit/markings.spec.js +++ b/tests/unit/markings.spec.js @@ -233,16 +233,16 @@ EMC const pContent3 = document.markStructureContent("P"); document.markContent("Span"); - const section1 = document.struct('Section', [ + const section1 = document.struct('Sect', [ document.struct('P', [ pContent1, - document.struct('Link', [ linkContent ]), + document.struct('Link', linkContent), pContent2 ]) ]); - const section2 = document.struct('Section', [ + const section2 = document.struct('Sect', [ document.struct('P', [ - pContent3, + pContent3 ]) ]); document.addStructure(section1).addStructure(section2); @@ -275,27 +275,27 @@ EMC ]); expect(docData).toContainChunk([ `12 0 obj`, - `<<\n/S /Section\n/K [11 0 R]\n/P 8 0 R\n>>`, + `<<\n/S /Sect\n/P 8 0 R\n/K [11 0 R]\n>>`, `endobj` ]); expect(docData).toContainChunk([ `11 0 obj`, - `<<\n/S /P\n/K [0 10 0 R 2]\n/Pg 7 0 R\n/P 12 0 R\n>>`, + `<<\n/S /P\n/P 12 0 R\n/K [0 10 0 R 2]\n/Pg 7 0 R\n>>`, `endobj` ]); expect(docData).toContainChunk([ `10 0 obj`, - `<<\n/S /Link\n/K [1]\n/Pg 7 0 R\n/P 11 0 R\n>>`, + `<<\n/S /Link\n/P 11 0 R\n/K [1]\n/Pg 7 0 R\n>>`, `endobj` ]); expect(docData).toContainChunk([ `14 0 obj`, - `<<\n/S /Section\n/K [13 0 R]\n/P 8 0 R\n>>`, + `<<\n/S /Sect\n/P 8 0 R\n/K [13 0 R]\n>>`, `endobj` ]); expect(docData).toContainChunk([ `13 0 obj`, - `<<\n/S /P\n/K [3]\n/Pg 7 0 R\n/P 14 0 R\n>>`, + `<<\n/S /P\n/P 14 0 R\n/K [3]\n/Pg 7 0 R\n>>`, `endobj` ]); expect(docData).toContainChunk([ @@ -314,9 +314,9 @@ EMC const pContent3 = document.markStructureContent("P"); document.markContent("Span"); - const section1 = document.struct('Section'); + const section1 = document.struct('Sect'); document.addStructure(section1); - const section2 = document.struct('Section'); + const section2 = document.struct('Sect'); document.addStructure(section2); const link = document.struct('Link'); link.add(linkContent); @@ -355,7 +355,7 @@ EMC ]); expect(docData).toContainChunk([ `10 0 obj`, - `<<\n/S /Section\n/P 8 0 R\n/K [13 0 R]\n>>`, + `<<\n/S /Sect\n/P 8 0 R\n/K [13 0 R]\n>>`, `endobj` ]); expect(docData).toContainChunk([ @@ -365,17 +365,17 @@ EMC ]); expect(docData).toContainChunk([ `12 0 obj`, - `<<\n/S /Link\n/K [1]\n/Pg 7 0 R\n/P 13 0 R\n>>`, + `<<\n/S /Link\n/P 13 0 R\n/K [1]\n/Pg 7 0 R\n>>`, `endobj` ]); expect(docData).toContainChunk([ `11 0 obj`, - `<<\n/S /Section\n/P 8 0 R\n/K [14 0 R]\n>>`, + `<<\n/S /Sect\n/P 8 0 R\n/K [14 0 R]\n>>`, `endobj` ]); expect(docData).toContainChunk([ `14 0 obj`, - `<<\n/S /P\n/K [3]\n/Pg 7 0 R\n/P 11 0 R\n>>`, + `<<\n/S /P\n/P 11 0 R\n/K [3]\n/Pg 7 0 R\n>>`, `endobj` ]); expect(docData).toContainChunk([ @@ -385,6 +385,78 @@ EMC ]); }); + test('constructed with closures', () => { + const docData = logData(document); + + const section1 = document.struct('Sect'); + document.addStructure(section1); + const section2 = document.struct('Sect'); + const link = document.struct('Link', () => {}); + const p1 = document.struct('P'); + section1.add(p1); + p1.add(() => {}).add(link).add(() => {}).end(); + const p2 = document.struct('P', [() => {}]); + section2.add(p2); + document.addStructure(section2); + + document.end(); + + expect(docData).toContainChunk([ + `3 0 obj`, + /\/StructTreeRoot 9 0 R/, + `endobj` + ]); + expect(docData).toContainChunk([ + `3 0 obj`, + /\/Markings 13 0 R/, + `endobj` + ]); + expect(docData).toContainChunk([ + `9 0 obj`, + `<< +/Type /StructTreeRoot +/ParentTree << + /Nums [ + 0 [12 0 R 11 0 R 12 0 R 14 0 R] +] +>> +/ParentTreeNextKey 1 +/K [8 0 R 10 0 R] +>>`, + `endobj` + ]); + expect(docData).toContainChunk([ + `8 0 obj`, + `<<\n/S /Sect\n/P 9 0 R\n/K [12 0 R]\n>>`, + `endobj` + ]); + expect(docData).toContainChunk([ + `12 0 obj`, + `<<\n/S /P\n/P 8 0 R\n/K [0 11 0 R 2]\n/Pg 7 0 R\n>>`, + `endobj` + ]); + expect(docData).toContainChunk([ + `11 0 obj`, + `<<\n/S /Link\n/P 12 0 R\n/K [1]\n/Pg 7 0 R\n>>`, + `endobj` + ]); + expect(docData).toContainChunk([ + `10 0 obj`, + `<<\n/S /Sect\n/P 9 0 R\n/K [14 0 R]\n>>`, + `endobj` + ]); + expect(docData).toContainChunk([ + `14 0 obj`, + `<<\n/S /P\n/P 10 0 R\n/K [3]\n/Pg 7 0 R\n>>`, + `endobj` + ]); + expect(docData).toContainChunk([ + `13 0 obj`, + `<<\n>>`, + `endobj` + ]); + }); + test('with options', () => { const docData = logData(document); @@ -408,6 +480,7 @@ EMC /E (My Expansion) /ActualText (My Actual Text) /P 9 0 R +/K [] >>`, `endobj` ]); @@ -550,12 +623,12 @@ EMC ]); expect(docData).toContainChunk([ '11 0 obj', - '<<\n/S /P\n/K [0]\n/Pg 7 0 R\n/P 8 0 R\n>>', + '<<\n/S /P\n/P 8 0 R\n/K [0]\n/Pg 7 0 R\n>>', 'endobj', ]); expect(docData).toContainChunk([ '13 0 obj', - '<<\n/S /P\n/K [1]\n/Pg 7 0 R\n/P 8 0 R\n>>', + '<<\n/S /P\n/P 8 0 R\n/K [1]\n/Pg 7 0 R\n>>', 'endobj', ]); expect(docData).toContainChunk([ @@ -637,22 +710,22 @@ EMC ]); expect(docData).toContainChunk([ '12 0 obj', - '<<\n/S /Lbl\n/K [0]\n/Pg 7 0 R\n/P 10 0 R\n>>', + '<<\n/S /Lbl\n/P 10 0 R\n/K [0]\n/Pg 7 0 R\n>>', 'endobj' ]); expect(docData).toContainChunk([ '13 0 obj', - '<<\n/S /LBody\n/K [1]\n/Pg 7 0 R\n/P 10 0 R\n>>', + '<<\n/S /LBody\n/P 10 0 R\n/K [1]\n/Pg 7 0 R\n>>', 'endobj' ]); expect(docData).toContainChunk([ '16 0 obj', - '<<\n/S /Lbl\n/K [2]\n/Pg 7 0 R\n/P 15 0 R\n>>', + '<<\n/S /Lbl\n/P 15 0 R\n/K [2]\n/Pg 7 0 R\n>>', 'endobj' ]); expect(docData).toContainChunk([ '17 0 obj', - '<<\n/S /LBody\n/K [3]\n/Pg 7 0 R\n/P 15 0 R\n>>', + '<<\n/S /LBody\n/P 15 0 R\n/K [3]\n/Pg 7 0 R\n>>', 'endobj' ]); expect(docData).toContainChunk([