summaryrefslogtreecommitdiff
path: root/app/Report/ReportHtmlTextbox.php
diff options
context:
space:
mode:
Diffstat (limited to 'app/Report/ReportHtmlTextbox.php')
-rw-r--r--app/Report/ReportHtmlTextbox.php478
1 files changed, 240 insertions, 238 deletions
diff --git a/app/Report/ReportHtmlTextbox.php b/app/Report/ReportHtmlTextbox.php
index a70c29d384..1cf212e48b 100644
--- a/app/Report/ReportHtmlTextbox.php
+++ b/app/Report/ReportHtmlTextbox.php
@@ -18,254 +18,256 @@ namespace Fisharebest\Webtrees\Report;
/**
* Class ReportHtmlTextbox
*/
-class ReportHtmlTextbox extends ReportBaseTextbox {
- /**
- * Render the elements.
- *
- * @param ReportHtml $renderer
- */
- public function render($renderer) {
- // checkFootnote
- $newelements = [];
- $lastelement = [];
- $footnote_element = [];
- // Element counter
- $cE = count($this->elements);
- //-- collapse duplicate elements
- for ($i = 0; $i < $cE; $i++) {
- $element = $this->elements[$i];
- if (is_object($element)) {
- if ($element instanceof ReportBaseText) {
- if (!empty($footnote_element)) {
- ksort($footnote_element);
- foreach ($footnote_element as $links) {
- $newelements[] = $links;
- }
- $footnote_element = [];
- }
- if (empty($lastelement)) {
- $lastelement = $element;
- } else {
- // Checking if the Text has the same style
- if ($element->getStyleName() == $lastelement->getStyleName()) {
- $lastelement->addText(str_replace("\n", '<br>', $element->getValue()));
- } elseif (!empty($lastelement)) {
- $newelements[] = $lastelement;
- $lastelement = $element;
- }
- }
- } // Collect the Footnote links
- elseif ($element instanceof ReportBaseFootnote) {
- // Check if the Footnote has been set with it’s link number
- $renderer->checkFootnote($element);
- // Save first the last element if any
- if (!empty($lastelement)) {
- $newelements[] = $lastelement;
- $lastelement = [];
- }
- // Save the Footnote with it’s link number as key for sorting later
- $footnote_element[$element->num] = $element;
- } //-- do not keep empty footnotes
- elseif (!($element instanceof ReportBaseFootnote) || trim($element->getValue()) != '') {
- if (!empty($footnote_element)) {
- ksort($footnote_element);
- foreach ($footnote_element as $links) {
- $newelements[] = $links;
- }
- $footnote_element = [];
- }
- if (!empty($lastelement)) {
- $newelements[] = $lastelement;
- $lastelement = [];
- }
- $newelements[] = $element;
- }
- } else {
- if (!empty($lastelement)) {
- $newelements[] = $lastelement;
- $lastelement = [];
- }
- if (!empty($footnote_element)) {
- ksort($footnote_element);
- foreach ($footnote_element as $links) {
- $newelements[] = $links;
- }
- $footnote_element = [];
- }
- $newelements[] = $element;
- }
- }
- if (!empty($lastelement)) {
- $newelements[] = $lastelement;
- }
- if (!empty($footnote_element)) {
- ksort($footnote_element);
- foreach ($footnote_element as $links) {
- $newelements[] = $links;
- }
- }
- $this->elements = $newelements;
- unset($footnote_element, $lastelement, $links, $newelements);
+class ReportHtmlTextbox extends ReportBaseTextbox
+{
+ /**
+ * Render the elements.
+ *
+ * @param ReportHtml $renderer
+ */
+ public function render($renderer)
+ {
+ // checkFootnote
+ $newelements = [];
+ $lastelement = [];
+ $footnote_element = [];
+ // Element counter
+ $cE = count($this->elements);
+ //-- collapse duplicate elements
+ for ($i = 0; $i < $cE; $i++) {
+ $element = $this->elements[$i];
+ if (is_object($element)) {
+ if ($element instanceof ReportBaseText) {
+ if (!empty($footnote_element)) {
+ ksort($footnote_element);
+ foreach ($footnote_element as $links) {
+ $newelements[] = $links;
+ }
+ $footnote_element = [];
+ }
+ if (empty($lastelement)) {
+ $lastelement = $element;
+ } else {
+ // Checking if the Text has the same style
+ if ($element->getStyleName() == $lastelement->getStyleName()) {
+ $lastelement->addText(str_replace("\n", '<br>', $element->getValue()));
+ } elseif (!empty($lastelement)) {
+ $newelements[] = $lastelement;
+ $lastelement = $element;
+ }
+ }
+ } // Collect the Footnote links
+ elseif ($element instanceof ReportBaseFootnote) {
+ // Check if the Footnote has been set with it’s link number
+ $renderer->checkFootnote($element);
+ // Save first the last element if any
+ if (!empty($lastelement)) {
+ $newelements[] = $lastelement;
+ $lastelement = [];
+ }
+ // Save the Footnote with it’s link number as key for sorting later
+ $footnote_element[$element->num] = $element;
+ } //-- do not keep empty footnotes
+ elseif (!($element instanceof ReportBaseFootnote) || trim($element->getValue()) != '') {
+ if (!empty($footnote_element)) {
+ ksort($footnote_element);
+ foreach ($footnote_element as $links) {
+ $newelements[] = $links;
+ }
+ $footnote_element = [];
+ }
+ if (!empty($lastelement)) {
+ $newelements[] = $lastelement;
+ $lastelement = [];
+ }
+ $newelements[] = $element;
+ }
+ } else {
+ if (!empty($lastelement)) {
+ $newelements[] = $lastelement;
+ $lastelement = [];
+ }
+ if (!empty($footnote_element)) {
+ ksort($footnote_element);
+ foreach ($footnote_element as $links) {
+ $newelements[] = $links;
+ }
+ $footnote_element = [];
+ }
+ $newelements[] = $element;
+ }
+ }
+ if (!empty($lastelement)) {
+ $newelements[] = $lastelement;
+ }
+ if (!empty($footnote_element)) {
+ ksort($footnote_element);
+ foreach ($footnote_element as $links) {
+ $newelements[] = $links;
+ }
+ }
+ $this->elements = $newelements;
+ unset($footnote_element, $lastelement, $links, $newelements);
- $cP = 0; // Class Padding
+ $cP = 0; // Class Padding
- // Used with line breaks and cell height calculation within this box only
- $renderer->largestFontHeight = 0;
+ // Used with line breaks and cell height calculation within this box only
+ $renderer->largestFontHeight = 0;
- // Current position
- if ($this->left == '.') {
- $cX = $renderer->getX();
- } else {
- $cX = $this->left;
- $renderer->setX($cX);
- }
- // Current position (top)
- if ($this->top == '.') {
- $this->top = $renderer->getY();
- } else {
- $renderer->setY($this->top);
- }
+ // Current position
+ if ($this->left == '.') {
+ $cX = $renderer->getX();
+ } else {
+ $cX = $this->left;
+ $renderer->setX($cX);
+ }
+ // Current position (top)
+ if ($this->top == '.') {
+ $this->top = $renderer->getY();
+ } else {
+ $renderer->setY($this->top);
+ }
- // Check the width if set to page wide OR set by xml to larger then page wide
- if ($this->width == 0 || $this->width > $renderer->getRemainingWidth()) {
- $this->width = $renderer->getRemainingWidth();
- }
- // Setup the CellPadding
- if ($this->padding) {
- $cP = $renderer->cPadding;
- }
+ // Check the width if set to page wide OR set by xml to larger then page wide
+ if ($this->width == 0 || $this->width > $renderer->getRemainingWidth()) {
+ $this->width = $renderer->getRemainingWidth();
+ }
+ // Setup the CellPadding
+ if ($this->padding) {
+ $cP = $renderer->cPadding;
+ }
- // For padding, we have to use less wrap width
- $cW = $this->width - ($cP * 2);
+ // For padding, we have to use less wrap width
+ $cW = $this->width - ($cP * 2);
- //-- calculate the text box height
- // Number of lines, will be converted to height
- $cHT = 0;
- // Element height (exept text)
- $eH = 0;
- // Footnote height (in points)
- $fH = 0;
- $w = 0;
- //-- $lw is an array
- // 0 => last line width
- // 1 => 1 if text was wrapped, 0 if text did not wrap
- // 2 => number of LF
- $lw = [];
- // Element counter
- $cE = count($this->elements);
- for ($i = 0; $i < $cE; $i++) {
- if (is_object($this->elements[$i])) {
- $ew = $this->elements[$i]->setWrapWidth($cW - $w - 2, $cW);
- if ($ew == $cW) {
- $w = 0;
- }
- $lw = $this->elements[$i]->getWidth($renderer);
- // Text is already gets the # LF
- $cHT += $lw[2];
- if ($lw[1] == 1) {
- $w = $lw[0];
- } elseif ($lw[1] == 2) {
- $w = 0;
- } else {
- $w += $lw[0];
- }
- if ($w > $cW) {
- $w = $lw[0];
- }
- // For anything else but text (images), get the height
- $eH += $this->elements[$i]->getHeight($renderer);
- } else {
- $fH += abs($renderer->getFootnotesHeight($cW));
- }
- }
- // Add up what’s the final height
- $cH = $this->height;
- // If any element exist
- if ($cE > 0) {
- // Check if this is text or some other element, like images
- if ($eH == 0) {
- // Number of LF but at least one line
- $cHT = ($cHT + 1) * $renderer->cellHeightRatio;
- // Calculate the cell hight with the largest font size used
- $cHT = $cHT * $renderer->largestFontHeight;
- if ($cH < $cHT) {
- $cH = $cHT;
- }
- } // This is any other element
- else {
- if ($cH < $eH) {
- $cH = $eH;
- }
- // Add Footnote height to the rest of the height
- $cH += $fH;
- }
- }
+ //-- calculate the text box height
+ // Number of lines, will be converted to height
+ $cHT = 0;
+ // Element height (exept text)
+ $eH = 0;
+ // Footnote height (in points)
+ $fH = 0;
+ $w = 0;
+ //-- $lw is an array
+ // 0 => last line width
+ // 1 => 1 if text was wrapped, 0 if text did not wrap
+ // 2 => number of LF
+ $lw = [];
+ // Element counter
+ $cE = count($this->elements);
+ for ($i = 0; $i < $cE; $i++) {
+ if (is_object($this->elements[$i])) {
+ $ew = $this->elements[$i]->setWrapWidth($cW - $w - 2, $cW);
+ if ($ew == $cW) {
+ $w = 0;
+ }
+ $lw = $this->elements[$i]->getWidth($renderer);
+ // Text is already gets the # LF
+ $cHT += $lw[2];
+ if ($lw[1] == 1) {
+ $w = $lw[0];
+ } elseif ($lw[1] == 2) {
+ $w = 0;
+ } else {
+ $w += $lw[0];
+ }
+ if ($w > $cW) {
+ $w = $lw[0];
+ }
+ // For anything else but text (images), get the height
+ $eH += $this->elements[$i]->getHeight($renderer);
+ } else {
+ $fH += abs($renderer->getFootnotesHeight($cW));
+ }
+ }
+ // Add up what’s the final height
+ $cH = $this->height;
+ // If any element exist
+ if ($cE > 0) {
+ // Check if this is text or some other element, like images
+ if ($eH == 0) {
+ // Number of LF but at least one line
+ $cHT = ($cHT + 1) * $renderer->cellHeightRatio;
+ // Calculate the cell hight with the largest font size used
+ $cHT = $cHT * $renderer->largestFontHeight;
+ if ($cH < $cHT) {
+ $cH = $cHT;
+ }
+ } // This is any other element
+ else {
+ if ($cH < $eH) {
+ $cH = $eH;
+ }
+ // Add Footnote height to the rest of the height
+ $cH += $fH;
+ }
+ }
- unset($lw, $cHT, $fH, $w);
+ unset($lw, $cHT, $fH, $w);
- // Finaly, check the last cells height
- if ($cH < $renderer->lastCellHeight) {
- $cH = $renderer->lastCellHeight;
- }
- // Update max Y incase of a pagebreak
- // We don't want to over write any images or other stuff
- $renderer->addMaxY($this->top + $cH);
+ // Finaly, check the last cells height
+ if ($cH < $renderer->lastCellHeight) {
+ $cH = $renderer->lastCellHeight;
+ }
+ // Update max Y incase of a pagebreak
+ // We don't want to over write any images or other stuff
+ $renderer->addMaxY($this->top + $cH);
- // Start to print HTML
- echo '<div style="position:absolute;top:', $this->top, 'pt;';
- // LTR (left) or RTL (right)
- echo $renderer->alignRTL, ':', $cX, 'pt;';
- // Background color
- if ($this->fill) {
- if (!empty($this->bgcolor)) {
- echo ' background-color:', $this->bgcolor, ';';
- }
- }
- // Print padding only when it’s set
- if ($this->padding) {
- // Use Cell around padding to support RTL also
- echo 'padding:', $cP, 'pt;';
- }
- // Border setup
- if ($this->border) {
- echo ' border:solid black 1pt;';
- echo 'width:', ($this->width - 1 - ($cP * 2)), 'pt;height:', $cH - 1, 'pt;';
- } else {
- echo 'width:', ($this->width - ($cP * 2)), 'pt;height:', $cH, 'pt;';
- }
- echo '">';
+ // Start to print HTML
+ echo '<div style="position:absolute;top:', $this->top, 'pt;';
+ // LTR (left) or RTL (right)
+ echo $renderer->alignRTL, ':', $cX, 'pt;';
+ // Background color
+ if ($this->fill) {
+ if (!empty($this->bgcolor)) {
+ echo ' background-color:', $this->bgcolor, ';';
+ }
+ }
+ // Print padding only when it’s set
+ if ($this->padding) {
+ // Use Cell around padding to support RTL also
+ echo 'padding:', $cP, 'pt;';
+ }
+ // Border setup
+ if ($this->border) {
+ echo ' border:solid black 1pt;';
+ echo 'width:', ($this->width - 1 - ($cP * 2)), 'pt;height:', $cH - 1, 'pt;';
+ } else {
+ echo 'width:', ($this->width - ($cP * 2)), 'pt;height:', $cH, 'pt;';
+ }
+ echo '">';
- // Do a little "margin" trick before print
- // to get the correct current position => "."
- $cXT = $renderer->getX();
- $cYT = $renderer->getY();
- $renderer->setXy(0, 0);
+ // Do a little "margin" trick before print
+ // to get the correct current position => "."
+ $cXT = $renderer->getX();
+ $cYT = $renderer->getY();
+ $renderer->setXy(0, 0);
- // Print the text elements
- foreach ($this->elements as $element) {
- if (is_object($element)) {
- $element->render($renderer, $cX, false);
- } elseif (is_string($element) && $element == 'footnotetexts') {
- $renderer->footnotes();
- } elseif (is_string($element) && $element == 'addpage') {
- $renderer->addPage();
- }
- }
- echo "</div>\n";
+ // Print the text elements
+ foreach ($this->elements as $element) {
+ if (is_object($element)) {
+ $element->render($renderer, $cX, false);
+ } elseif (is_string($element) && $element == 'footnotetexts') {
+ $renderer->footnotes();
+ } elseif (is_string($element) && $element == 'addpage') {
+ $renderer->addPage();
+ }
+ }
+ echo "</div>\n";
- // Reset "margins"
- $renderer->setXy($cXT, $cYT);
- // This will be mostly used to trick the multiple images last height
- if ($this->reseth) {
- $cH = 0;
- }
- // New line and some clean up
- if (!$this->newline) {
- $renderer->setXy($cX + $this->width, $this->top);
- $renderer->lastCellHeight = $cH;
- } else {
- $renderer->setXy(0, $this->top + $cH + ($cP * 2));
- $renderer->lastCellHeight = 0;
- }
- }
+ // Reset "margins"
+ $renderer->setXy($cXT, $cYT);
+ // This will be mostly used to trick the multiple images last height
+ if ($this->reseth) {
+ $cH = 0;
+ }
+ // New line and some clean up
+ if (!$this->newline) {
+ $renderer->setXy($cX + $this->width, $this->top);
+ $renderer->lastCellHeight = $cH;
+ } else {
+ $renderer->setXy(0, $this->top + $cH + ($cP * 2));
+ $renderer->lastCellHeight = 0;
+ }
+ }
}