/
home
/
techb158
/
exp.abdallabala.com
/
vendor
/
mpdf
/
mpdf
/
src
/
Tag
/
/home/techb158/exp.abdallabala.com/vendor/mpdf/mpdf/src/Tag
mkdir
upload
Name
Size
Mode
Actions
A.php
1469
0644
edit
dl
rm
Acronym.php
66
0644
edit
dl
rm
Address.php
65
0644
edit
dl
rm
Annotation.php
2748
0644
edit
dl
rm
Article.php
65
0644
edit
dl
rm
Aside.php
63
0644
edit
dl
rm
B.php
60
0644
edit
dl
rm
BarCode.php
9179
0644
edit
dl
rm
Bdi.php
62
0644
edit
dl
rm
Bdo.php
62
0644
edit
dl
rm
Big.php
62
0644
edit
dl
rm
BlockQuote.php
68
0644
edit
dl
rm
BlockTag.php
52206
0644
edit
dl
rm
Bookmark.php
746
0644
edit
dl
rm
Br.php
3154
0644
edit
dl
rm
Caption.php
65
0644
edit
dl
rm
Center.php
64
0644
edit
dl
rm
Cite.php
63
0644
edit
dl
rm
Code.php
63
0644
edit
dl
rm
ColumnBreak.php
69
0644
edit
dl
rm
Columns.php
1527
0644
edit
dl
rm
Dd.php
60
0644
edit
dl
rm
Del.php
62
0644
edit
dl
rm
Details.php
65
0644
edit
dl
rm
Div.php
61
0644
edit
dl
rm
Dl.php
60
0644
edit
dl
rm
DotTab.php
2243
0644
edit
dl
rm
Dt.php
60
0644
edit
dl
rm
Em.php
61
0644
edit
dl
rm
FieldSet.php
66
0644
edit
dl
rm
FigCaption.php
68
0644
edit
dl
rm
Figure.php
64
0644
edit
dl
rm
Font.php
63
0644
edit
dl
rm
Footer.php
64
0644
edit
dl
rm
Form.php
62
0644
edit
dl
rm
FormFeed.php
7930
0644
edit
dl
rm
H1.php
60
0644
edit
dl
rm
H2.php
60
0644
edit
dl
rm
H3.php
60
0644
edit
dl
rm
H4.php
60
0644
edit
dl
rm
H5.php
60
0644
edit
dl
rm
H6.php
60
0644
edit
dl
rm
Header.php
64
0644
edit
dl
rm
HGroup.php
64
0644
edit
dl
rm
Hr.php
4687
0644
edit
dl
rm
I.php
60
0644
edit
dl
rm
Img.php
15245
0644
edit
dl
rm
IndexEntry.php
817
0644
edit
dl
rm
IndexInsert.php
815
0644
edit
dl
rm
InlineTag.php
7218
0644
edit
dl
rm
Input.php
14471
0644
edit
dl
rm
Ins.php
62
0644
edit
dl
rm
Kbd.php
62
0644
edit
dl
rm
Legend.php
1209
0644
edit
dl
rm
Li.php
60
0644
edit
dl
rm
Main.php
62
0644
edit
dl
rm
Mark.php
63
0644
edit
dl
rm
Meter.php
17438
0644
edit
dl
rm
Nav.php
61
0644
edit
dl
rm
NewColumn.php
327
0644
edit
dl
rm
NewPage.php
64
0644
edit
dl
rm
Ol.php
60
0644
edit
dl
rm
Option.php
1036
0644
edit
dl
rm
P.php
59
0644
edit
dl
rm
PageBreak.php
66
0644
edit
dl
rm
PageFooter.php
5195
0644
edit
dl
rm
PageHeader.php
69
0644
edit
dl
rm
Pre.php
281
0644
edit
dl
rm
Progress.php
2490
0644
edit
dl
rm
Q.php
60
0644
edit
dl
rm
S.php
60
0644
edit
dl
rm
Samp.php
63
0644
edit
dl
rm
Section.php
65
0644
edit
dl
rm
Select.php
5255
0644
edit
dl
rm
SetHtmlPageFooter.php
2328
0644
edit
dl
rm
SetHtmlPageHeader.php
84
0644
edit
dl
rm
SetPageFooter.php
80
0644
edit
dl
rm
SetPageHeader.php
80
0644
edit
dl
rm
Small.php
64
0644
edit
dl
rm
Span.php
63
0644
edit
dl
rm
Strike.php
65
0644
edit
dl
rm
Strong.php
65
0644
edit
dl
rm
Sub.php
62
0644
edit
dl
rm
SubstituteTag.php
382
0644
edit
dl
rm
Summary.php
65
0644
edit
dl
rm
Sup.php
62
0644
edit
dl
rm
Table.php
56025
0644
edit
dl
rm
Tag.php
2210
0644
edit
dl
rm
TBody.php
542
0644
edit
dl
rm
Td.php
18971
0644
edit
dl
rm
TextArea.php
5536
0644
edit
dl
rm
TextCircle.php
8493
0644
edit
dl
rm
TFoot.php
1678
0644
edit
dl
rm
Th.php
170
0644
edit
dl
rm
THead.php
1692
0644
edit
dl
rm
Time.php
63
0644
edit
dl
rm
Toc.php
262
0644
edit
dl
rm
TocEntry.php
893
0644
edit
dl
rm
TocPageBreak.php
300
0644
edit
dl
rm
Tr.php
4446
0644
edit
dl
rm
Tt.php
61
0644
edit
dl
rm
Tta.php
578
0644
edit
dl
rm
Tts.php
340
0644
edit
dl
rm
Ttz.php
346
0644
edit
dl
rm
U.php
60
0644
edit
dl
rm
Ul.php
60
0644
edit
dl
rm
VarTag.php
65
0644
edit
dl
rm
WatermarkImage.php
705
0644
edit
dl
rm
WatermarkText.php
430
0644
edit
dl
rm
Edit:
/home/techb158/exp.abdallabala.com/vendor/mpdf/mpdf/src/Tag/BlockTag.php
(52206B)
<?php namespace Mpdf\Tag; use Mpdf\Conversion\DecToAlpha; use Mpdf\Conversion\DecToRoman; use Mpdf\Utils\Arrays; use Mpdf\Utils\UtfString; abstract class BlockTag extends Tag { public function open($attr, &$ahtml, &$ihtml) { $tag = $this->getTagName(); // mPDF 6 Lists $this->mpdf->lastoptionaltag = ''; // mPDF 6 bidi // Block // If unicode-bidi set on current clock, any embedding levels, isolates, or overrides are closed (not inherited) if (isset($this->mpdf->blk[$this->mpdf->blklvl]['bidicode'])) { $blockpost = $this->mpdf->_setBidiCodes('end', $this->mpdf->blk[$this->mpdf->blklvl]['bidicode']); if ($blockpost) { $this->mpdf->OTLdata = []; if ($this->mpdf->tableLevel) { $this->mpdf->_saveCellTextBuffer($blockpost); } else { $this->mpdf->_saveTextBuffer($blockpost); } } } $p = $this->cssManager->PreviewBlockCSS($tag, $attr); if (isset($p['DISPLAY']) && strtolower($p['DISPLAY']) === 'none') { $this->mpdf->blklvl++; $this->mpdf->blk[$this->mpdf->blklvl]['hide'] = true; $this->mpdf->blk[$this->mpdf->blklvl]['tag'] = $tag; // mPDF 6 return; } if ($tag === 'CAPTION') { // position is written in AdjstHTML $divpos = 'T'; if (isset($attr['POSITION']) && strtolower($attr['POSITION']) === 'bottom') { $divpos = 'B'; } $cappos = 'T'; if (isset($attr['ALIGN']) && strtolower($attr['ALIGN']) === 'bottom') { $cappos = 'B'; } elseif (isset($p['CAPTION-SIDE']) && strtolower($p['CAPTION-SIDE']) === 'bottom') { $cappos = 'B'; } if (isset($attr['ALIGN'])) { unset($attr['ALIGN']); } if ($cappos != $divpos) { $this->mpdf->blklvl++; $this->mpdf->blk[$this->mpdf->blklvl]['hide'] = true; $this->mpdf->blk[$this->mpdf->blklvl]['tag'] = $tag; // mPDF 6 return; } } /* -- FORMS -- */ if ($tag === 'FORM') { $this->form->formMethod = 'POST'; if (isset($attr['METHOD']) && strtolower($attr['METHOD']) === 'get') { $this->form->formMethod = 'GET'; } $this->form->formAction = ''; if (isset($attr['ACTION'])) { $this->form->formAction = $attr['ACTION']; } } /* -- END FORMS -- */ /* -- CSS-POSITION -- */ if ((isset($p['POSITION']) && (strtolower($p['POSITION']) === 'fixed' || strtolower($p['POSITION']) === 'absolute')) && $this->mpdf->blklvl == 0) { if ($this->mpdf->inFixedPosBlock) { throw new \Mpdf\MpdfException('Cannot nest block with position:fixed or position:absolute'); } $this->mpdf->inFixedPosBlock = true; return; } /* -- END CSS-POSITION -- */ // Start Block $this->mpdf->ignorefollowingspaces = true; $lastbottommargin = 0; if ($this->mpdf->blockjustfinished && !count($this->mpdf->textbuffer) && $this->mpdf->y != $this->mpdf->tMargin && $this->mpdf->collapseBlockMargins) { $lastbottommargin = $this->mpdf->lastblockbottommargin; } $this->mpdf->lastblockbottommargin = 0; $this->mpdf->blockjustfinished = false; $this->mpdf->InlineBDF = []; // mPDF 6 $this->mpdf->InlineBDFctr = 0; // mPDF 6 $this->mpdf->InlineProperties = []; $this->mpdf->divbegin = true; $this->mpdf->linebreakjustfinished = false; /* -- TABLES -- */ if ($this->mpdf->tableLevel) { // If already something on the line if ($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s'] > 0 && !$this->mpdf->nestedtablejustfinished) { $this->mpdf->_saveCellTextBuffer("\n"); if (!isset($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'])) { $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']; } elseif ($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] < $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']) { $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']; } $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s'] = 0; // reset } // Cannot set block properties inside table - use Bold to indicate h1-h6 if ($tag === 'CENTER' && $this->mpdf->tdbegin) { $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['a'] = $this->getAlign('center'); } $this->mpdf->InlineProperties['BLOCKINTABLE'] = $this->mpdf->saveInlineProperties(); $properties = $this->cssManager->MergeCSS('', $tag, $attr); if (!empty($properties)) { $this->mpdf->setCSS($properties, 'INLINE'); } // mPDF 6 Lists if ($tag === 'UL' || $tag === 'OL') { $this->mpdf->listlvl++; if (isset($attr['START'])) { $this->mpdf->listcounter[$this->mpdf->listlvl] = (int) $attr['START'] - 1; } else { $this->mpdf->listcounter[$this->mpdf->listlvl] = 0; } $this->mpdf->listitem = []; if ($tag === 'OL') { $this->mpdf->listtype[$this->mpdf->listlvl] = 'decimal'; } elseif ($tag === 'UL') { if ($this->mpdf->listlvl % 3 == 1) { $this->mpdf->listtype[$this->mpdf->listlvl] = 'disc'; } elseif ($this->mpdf->listlvl % 3 == 2) { $this->mpdf->listtype[$this->mpdf->listlvl] = 'circle'; } else { $this->mpdf->listtype[$this->mpdf->listlvl] = 'square'; } } } // mPDF 6 Lists - in Tables if ($tag === 'LI') { if ($this->mpdf->listlvl == 0) { //in case of malformed HTML code. Example:(...)</p><li>Content</li><p>Paragraph1</p>(...) $this->mpdf->listlvl++; // first depth level $this->mpdf->listcounter[$this->mpdf->listlvl] = 0; } $this->mpdf->listcounter[$this->mpdf->listlvl]++; $this->mpdf->listitem = []; //if in table - output here as a tabletextbuffer //position:inside OR position:outside (always output in table as position:inside) $decToAlpha = new DecToAlpha(); $decToRoman = new DecToRoman(); switch ($this->mpdf->listtype[$this->mpdf->listlvl]) { case 'upper-alpha': case 'upper-latin': case 'A': $blt = $decToAlpha->convert($this->mpdf->listcounter[$this->mpdf->listlvl]) . $this->mpdf->list_number_suffix; break; case 'lower-alpha': case 'lower-latin': case 'a': $blt = $decToAlpha->convert($this->mpdf->listcounter[$this->mpdf->listlvl], false) . $this->mpdf->list_number_suffix; break; case 'upper-roman': case 'I': $blt = $decToRoman->convert($this->mpdf->listcounter[$this->mpdf->listlvl]) . $this->mpdf->list_number_suffix; break; case 'lower-roman': case 'i': $blt = $decToRoman->convert($this->mpdf->listcounter[$this->mpdf->listlvl]) . $this->mpdf->list_number_suffix; break; case 'decimal': case '1': $blt = $this->mpdf->listcounter[$this->mpdf->listlvl] . $this->mpdf->list_number_suffix; break; default: $blt = '-'; if ($this->mpdf->listlvl % 3 == 1 && $this->mpdf->_charDefined($this->mpdf->CurrentFont['cw'], 8226)) { $blt = "\xe2\x80\xa2"; } // • elseif ($this->mpdf->listlvl % 3 == 2 && $this->mpdf->_charDefined($this->mpdf->CurrentFont['cw'], 9900)) { $blt = "\xe2\x9a\xac"; } // ⚬ elseif ($this->mpdf->listlvl % 3 == 0 && $this->mpdf->_charDefined($this->mpdf->CurrentFont['cw'], 9642)) { $blt = "\xe2\x96\xaa"; } // ▪ break; } // change to spaces if ($this->mpdf->usingCoreFont) { $ls = str_repeat(chr(160) . chr(160), ($this->mpdf->listlvl - 1) * 2) . $blt . ' '; } else { $ls = str_repeat("\xc2\xa0\xc2\xa0", ($this->mpdf->listlvl - 1) * 2) . $blt . ' '; } $this->mpdf->_saveCellTextBuffer($ls); $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s'] += $this->mpdf->GetStringWidth($ls); } return; } /* -- END TABLES -- */ if ($this->mpdf->lastblocklevelchange == 1) { $blockstate = 1; } // Top margins/padding only elseif ($this->mpdf->lastblocklevelchange < 1) { $blockstate = 0; } // NO margins/padding $this->mpdf->printbuffer($this->mpdf->textbuffer, $blockstate); $this->mpdf->textbuffer = []; $save_blklvl = $this->mpdf->blklvl; $save_blk = $this->mpdf->blk; $this->mpdf->Reset(); $pagesel = ''; /* -- CSS-PAGE -- */ if (isset($p['PAGE'])) { $pagesel = $p['PAGE']; } // mPDF 6 (uses $p - preview of properties so blklvl can be incremented after page-break) /* -- END CSS-PAGE -- */ // If page-box has changed AND/OR PAGE-BREAK-BEFORE // mPDF 6 (uses $p - preview of properties so blklvl can be imcremented after page-break) if (!$this->mpdf->tableLevel && (($pagesel && (!isset($this->mpdf->page_box['current']) || $pagesel != $this->mpdf->page_box['current'])) || (isset($p['PAGE-BREAK-BEFORE']) && $p['PAGE-BREAK-BEFORE']))) { // mPDF 6 pagebreaktype $startpage = $this->mpdf->page; $pagebreaktype = $this->mpdf->defaultPagebreakType; $this->mpdf->lastblocklevelchange = -1; if ($this->mpdf->ColActive) { $pagebreaktype = 'cloneall'; } if ($pagesel && (!isset($this->mpdf->page_box['current']) || $pagesel != $this->mpdf->page_box['current'])) { $pagebreaktype = 'cloneall'; } $this->mpdf->_preForcedPagebreak($pagebreaktype); if (isset($p['PAGE-BREAK-BEFORE'])) { if (strtoupper($p['PAGE-BREAK-BEFORE']) === 'RIGHT') { $this->mpdf->AddPage( $this->mpdf->CurOrientation, 'NEXT-ODD', '', '', '', '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, $pagesel ); } elseif (strtoupper($p['PAGE-BREAK-BEFORE']) === 'LEFT') { $this->mpdf->AddPage( $this->mpdf->CurOrientation, 'NEXT-EVEN', '', '', '', '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, $pagesel ); } elseif (strtoupper($p['PAGE-BREAK-BEFORE']) === 'ALWAYS') { $this->mpdf->AddPage($this->mpdf->CurOrientation, '', '', '', '', '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, $pagesel); } elseif ($this->mpdf->page_box['current'] != $pagesel) { $this->mpdf->AddPage($this->mpdf->CurOrientation, '', '', '', '', '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, $pagesel); } // *CSS-PAGE* } /* -- CSS-PAGE -- */ // Must Add new page if changed page properties elseif (!isset($this->mpdf->page_box['current']) || $pagesel != $this->mpdf->page_box['current']) { $this->mpdf->AddPage($this->mpdf->CurOrientation, '', '', '', '', '', '', '', '', '', '', '', '', '', '', 0, 0, 0, 0, $pagesel); } /* -- END CSS-PAGE -- */ // mPDF 6 pagebreaktype $this->mpdf->_postForcedPagebreak($pagebreaktype, $startpage, $save_blk, $save_blklvl); } // mPDF 6 pagebreaktype - moved after pagebreak $this->mpdf->blklvl++; $currblk = & $this->mpdf->blk[$this->mpdf->blklvl]; $this->mpdf->initialiseBlock($currblk); $prevblk = & $this->mpdf->blk[$this->mpdf->blklvl - 1]; $currblk['tag'] = $tag; $currblk['attr'] = $attr; $properties = $this->cssManager->MergeCSS('BLOCK', $tag, $attr); // mPDF 6 - moved to after page-break-before // mPDF 6 page-break-inside:avoid if (isset($properties['PAGE-BREAK-INSIDE']) && strtoupper($properties['PAGE-BREAK-INSIDE']) === 'AVOID' && !$this->mpdf->ColActive && !$this->mpdf->keep_block_together && !isset($attr['PAGEBREAKAVOIDCHECKED'])) { // avoid re-iterating using PAGEBREAKAVOIDCHECKED; set in CloseTag $currblk['keep_block_together'] = 1; $currblk['array_i'] = $ihtml; // mPDF 6 $this->mpdf->kt_y00 = $this->mpdf->y; $this->mpdf->kt_p00 = $this->mpdf->page; $this->mpdf->keep_block_together = 1; } if ($lastbottommargin && !empty($properties['MARGIN-TOP']) && empty($properties['FLOAT'])) { $currblk['lastbottommargin'] = $lastbottommargin; } if (isset($properties['Z-INDEX']) && $this->mpdf->current_layer == 0) { $v = (int) $properties['Z-INDEX']; if ($v > 0) { $currblk['z-index'] = $v; $this->mpdf->BeginLayer($v); } } // mPDF 6 Lists // List-type set by attribute if ($tag === 'OL' || $tag === 'UL' || $tag === 'LI') { if (!empty($attr['TYPE'])) { $listtype = $attr['TYPE']; switch ($listtype) { case 'A': $listtype = 'upper-latin'; break; case 'a': $listtype = 'lower-latin'; break; case 'I': $listtype = 'upper-roman'; break; case 'i': $listtype = 'lower-roman'; break; case '1': $listtype = 'decimal'; break; } $currblk['list_style_type'] = $listtype; } } $this->mpdf->setCSS($properties, 'BLOCK', $tag); //name(id/class/style) found in the CSS array! $currblk['InlineProperties'] = $this->mpdf->saveInlineProperties(); if (isset($properties['VISIBILITY'])) { $v = strtolower($properties['VISIBILITY']); if (($v === 'hidden' || $v === 'printonly' || $v === 'screenonly') && $this->mpdf->visibility === 'visible' && !$this->mpdf->tableLevel) { $currblk['visibility'] = $v; $this->mpdf->SetVisibility($v); } } // mPDF 6 if (!empty($attr['ALIGN'])) { $currblk['block-align'] = $this->getAlign($attr['ALIGN']); } if (isset($properties['HEIGHT'])) { $currblk['css_set_height'] = $this->sizeConverter->convert( $properties['HEIGHT'], $this->mpdf->h - $this->mpdf->tMargin - $this->mpdf->bMargin, $this->mpdf->FontSize, false ); if (($currblk['css_set_height'] + $this->mpdf->y) > $this->mpdf->PageBreakTrigger && $this->mpdf->y > $this->mpdf->tMargin + 5 && $currblk['css_set_height'] < ($this->mpdf->h - ($this->mpdf->tMargin + $this->mpdf->bMargin))) { $this->mpdf->AddPage($this->mpdf->CurOrientation); } } else { $currblk['css_set_height'] = false; } // Added mPDF 3.0 Float DIV if (isset($prevblk['blockContext'])) { $currblk['blockContext'] = $prevblk['blockContext']; } // *CSS-FLOAT* if (isset($properties['CLEAR'])) { $this->mpdf->ClearFloats(strtoupper($properties['CLEAR']), $this->mpdf->blklvl - 1); } // *CSS-FLOAT* $currblk['padding_left'] = is_numeric($currblk['padding_left']) ? $currblk['padding_left'] : 0; $currblk['padding_right'] = is_numeric($currblk['padding_right']) ? $currblk['padding_right'] : 0; $container_w = $prevblk['inner_width']; $bdr = $currblk['border_right']['w']; $bdl = $currblk['border_left']['w']; $pdr = $currblk['padding_right']; $pdl = $currblk['padding_left']; $setwidth = 0; if (isset($currblk['css_set_width'])) { $setwidth = $currblk['css_set_width']; } /* -- CSS-FLOAT -- */ if (isset($properties['FLOAT']) && strtoupper($properties['FLOAT']) === 'RIGHT' && !$this->mpdf->ColActive) { // Cancel Keep-Block-together $currblk['keep_block_together'] = false; $this->mpdf->kt_y00 = 0; $this->mpdf->keep_block_together = 0; $this->mpdf->blockContext++; $currblk['blockContext'] = $this->mpdf->blockContext; list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->mpdf->GetFloatDivInfo($this->mpdf->blklvl - 1); // DIV is too narrow for text to fit! $maxw = $container_w - $l_width - $r_width; $doubleCharWidth = (2 * $this->mpdf->GetCharWidth('W', false)); if (($setwidth + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) > $maxw || ($maxw - ($currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr)) < (2 * $this->mpdf->GetCharWidth('W', false))) { // Too narrow to fit - try to move down past L or R float if ($l_max < $r_max && ($setwidth + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) <= ($container_w - $r_width) && (($container_w - $r_width) - ($currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr)) > $doubleCharWidth) { $this->mpdf->ClearFloats('LEFT', $this->mpdf->blklvl - 1); } elseif ($r_max < $l_max && ($setwidth + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) <= ($container_w - $l_width) && (($container_w - $l_width) - ($currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr)) > $doubleCharWidth) { $this->mpdf->ClearFloats('RIGHT', $this->mpdf->blklvl - 1); } else { $this->mpdf->ClearFloats('BOTH', $this->mpdf->blklvl - 1); } list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->mpdf->GetFloatDivInfo($this->mpdf->blklvl - 1); } if ($r_exists) { $currblk['margin_right'] += $r_width; } $currblk['float'] = 'R'; $currblk['float_start_y'] = $this->mpdf->y; if (isset($currblk['css_set_width'])) { $currblk['margin_left'] = $container_w - ($setwidth + $bdl + $pdl + $bdr + $pdr + $currblk['margin_right']); $currblk['float_width'] = ($setwidth + $bdl + $pdl + $bdr + $pdr + $currblk['margin_right']); } else { // *** If no width set - would need to buffer and keep track of max width, then Right-align if not full width // and do borders and backgrounds - For now - just set to maximum width left if ($l_exists) { $currblk['margin_left'] += $l_width; } $currblk['css_set_width'] = $container_w - ($currblk['margin_left'] + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr); $currblk['float_width'] = ($currblk['css_set_width'] + $bdl + $pdl + $bdr + $pdr + $currblk['margin_right']); } } elseif (isset($properties['FLOAT']) && strtoupper($properties['FLOAT']) === 'LEFT' && !$this->mpdf->ColActive) { // Cancel Keep-Block-together $currblk['keep_block_together'] = false; $this->mpdf->kt_y00 = 0; $this->mpdf->keep_block_together = 0; $this->mpdf->blockContext++; $currblk['blockContext'] = $this->mpdf->blockContext; list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->mpdf->GetFloatDivInfo($this->mpdf->blklvl - 1); // DIV is too narrow for text to fit! $maxw = $container_w - $l_width - $r_width; $doubleCharWidth = (2 * $this->mpdf->GetCharWidth('W', false)); if (($setwidth + $currblk['margin_left'] + $bdl + $pdl + $bdr + $pdr) > $maxw || ($maxw - ($currblk['margin_left'] + $bdl + $pdl + $bdr + $pdr)) < (2 * $this->mpdf->GetCharWidth('W', false))) { // Too narrow to fit - try to move down past L or R float if ($l_max < $r_max && ($setwidth + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) <= ($container_w - $r_width) && (($container_w - $r_width) - ($currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr)) > $doubleCharWidth) { $this->mpdf->ClearFloats('LEFT', $this->mpdf->blklvl - 1); } elseif ($r_max < $l_max && ($setwidth + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) <= ($container_w - $l_width) && (($container_w - $l_width) - ($currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr)) > $doubleCharWidth) { $this->mpdf->ClearFloats('RIGHT', $this->mpdf->blklvl - 1); } else { $this->mpdf->ClearFloats('BOTH', $this->mpdf->blklvl - 1); } list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->mpdf->GetFloatDivInfo($this->mpdf->blklvl - 1); } if ($l_exists) { $currblk['margin_left'] += $l_width; } $currblk['float'] = 'L'; $currblk['float_start_y'] = $this->mpdf->y; if ($setwidth) { $currblk['margin_right'] = $container_w - ($setwidth + $bdl + $pdl + $bdr + $pdr + $currblk['margin_left']); $currblk['float_width'] = ($setwidth + $bdl + $pdl + $bdr + $pdr + $currblk['margin_left']); } else { // *** If no width set - would need to buffer and keep track of max width, then Right-align if not full width // and do borders and backgrounds - For now - just set to maximum width left if ($r_exists) { $currblk['margin_right'] += $r_width; } $currblk['css_set_width'] = $container_w - ($currblk['margin_left'] + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr); $currblk['float_width'] = ($currblk['css_set_width'] + $bdl + $pdl + $bdr + $pdr + $currblk['margin_left']); } } else { // Don't allow overlap - if floats present - adjust padding to avoid overlap with Floats list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->mpdf->GetFloatDivInfo($this->mpdf->blklvl - 1); $maxw = $container_w - $l_width - $r_width; $pdl = is_numeric($pdl) ? $pdl : 0; $pdr = is_numeric($pdr) ? $pdr : 0; $doubleCharWidth = (2 * $this->mpdf->GetCharWidth('W', false)); if (($setwidth + $currblk['margin_left'] + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) > $maxw || ($maxw - ($currblk['margin_right'] + $currblk['margin_left'] + $bdl + $pdl + $bdr + $pdr)) < $doubleCharWidth) { // Too narrow to fit - try to move down past L or R float if ($l_max < $r_max && ($setwidth + $currblk['margin_left'] + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) <= ($container_w - $r_width) && (($container_w - $r_width) - ($currblk['margin_right'] + $currblk['margin_left'] + $bdl + $pdl + $bdr + $pdr)) > $doubleCharWidth) { $this->mpdf->ClearFloats('LEFT', $this->mpdf->blklvl - 1); } elseif ($r_max < $l_max && ($setwidth + $currblk['margin_left'] + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) <= ($container_w - $l_width) && (($container_w - $l_width) - ($currblk['margin_right'] + $currblk['margin_left'] + $bdl + $pdl + $bdr + $pdr)) > $doubleCharWidth) { $this->mpdf->ClearFloats('RIGHT', $this->mpdf->blklvl - 1); } else { $this->mpdf->ClearFloats('BOTH', $this->mpdf->blklvl - 1); } list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->mpdf->GetFloatDivInfo($this->mpdf->blklvl - 1); } if ($r_exists) { $currblk['padding_right'] = max($r_width - $currblk['margin_right'] - $bdr, $pdr); } if ($l_exists) { $currblk['padding_left'] = max($l_width - $currblk['margin_left'] - $bdl, $pdl); } } /* -- END CSS-FLOAT -- */ /* -- BORDER-RADIUS -- */ // Automatically increase padding if required for border-radius if ($this->mpdf->autoPadding && !$this->mpdf->ColActive) { $currblk['border_radius_TL_H'] = Arrays::get($currblk, 'border_radius_TL_H', 0); $currblk['border_radius_TL_V'] = Arrays::get($currblk, 'border_radius_TL_V', 0); $currblk['border_radius_TR_H'] = Arrays::get($currblk, 'border_radius_TR_H', 0); $currblk['border_radius_TR_V'] = Arrays::get($currblk, 'border_radius_TR_V', 0); $currblk['border_radius_BL_H'] = Arrays::get($currblk, 'border_radius_BL_H', 0); $currblk['border_radius_BL_V'] = Arrays::get($currblk, 'border_radius_BL_V', 0); $currblk['border_radius_BR_H'] = Arrays::get($currblk, 'border_radius_BR_H', 0); $currblk['border_radius_BR_V'] = Arrays::get($currblk, 'border_radius_BR_V', 0); if ($currblk['border_radius_TL_H'] > $currblk['padding_left'] && $currblk['border_radius_TL_V'] > $currblk['padding_top']) { if ($currblk['border_radius_TL_H'] > $currblk['border_radius_TL_V']) { $this->mpdf->_borderPadding( $currblk['border_radius_TL_H'], $currblk['border_radius_TL_V'], $currblk['padding_left'], $currblk['padding_top'] ); } else { $this->mpdf->_borderPadding( $currblk['border_radius_TL_V'], $currblk['border_radius_TL_H'], $currblk['padding_top'], $currblk['padding_left'] ); } } if ($currblk['border_radius_TR_H'] > $currblk['padding_right'] && $currblk['border_radius_TR_V'] > $currblk['padding_top']) { if ($currblk['border_radius_TR_H'] > $currblk['border_radius_TR_V']) { $this->mpdf->_borderPadding( $currblk['border_radius_TR_H'], $currblk['border_radius_TR_V'], $currblk['padding_right'], $currblk['padding_top'] ); } else { $this->mpdf->_borderPadding( $currblk['border_radius_TR_V'], $currblk['border_radius_TR_H'], $currblk['padding_top'], $currblk['padding_right'] ); } } if ($currblk['border_radius_BL_H'] > $currblk['padding_left'] && $currblk['border_radius_BL_V'] > $currblk['padding_bottom']) { if ($currblk['border_radius_BL_H'] > $currblk['border_radius_BL_V']) { $this->mpdf->_borderPadding( $currblk['border_radius_BL_H'], $currblk['border_radius_BL_V'], $currblk['padding_left'], $currblk['padding_bottom'] ); } else { $this->mpdf->_borderPadding( $currblk['border_radius_BL_V'], $currblk['border_radius_BL_H'], $currblk['padding_bottom'], $currblk['padding_left'] ); } } if ($currblk['border_radius_BR_H'] > $currblk['padding_right'] && $currblk['border_radius_BR_V'] > $currblk['padding_bottom']) { if ($currblk['border_radius_BR_H'] > $currblk['border_radius_BR_V']) { $this->mpdf->_borderPadding( $currblk['border_radius_BR_H'], $currblk['border_radius_BR_V'], $currblk['padding_right'], $currblk['padding_bottom'] ); } else { $this->mpdf->_borderPadding( $currblk['border_radius_BR_V'], $currblk['border_radius_BR_H'], $currblk['padding_bottom'], $currblk['padding_right'] ); } } } /* -- END BORDER-RADIUS -- */ // Hanging indent - if negative indent: ensure padding is >= indent if (!isset($currblk['text_indent'])) { $currblk['text_indent'] = null; } if (!isset($currblk['inner_width'])) { $currblk['inner_width'] = null; } $cbti = $this->sizeConverter->convert( $currblk['text_indent'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, false ); if ($cbti < 0) { $hangind = -$cbti; if (isset($currblk['direction']) && $currblk['direction'] === 'rtl') { // *OTL* $currblk['padding_right'] = max($currblk['padding_right'], $hangind); // *OTL* } // *OTL* else { // *OTL* $currblk['padding_left'] = max($currblk['padding_left'], $hangind); } // *OTL* } if (isset($currblk['css_set_width'])) { if (isset($properties['MARGIN-LEFT'], $properties['MARGIN-RIGHT']) && strtolower($properties['MARGIN-LEFT']) === 'auto' && strtolower($properties['MARGIN-RIGHT']) === 'auto') { // Try to reduce margins to accomodate - if still too wide, set margin-right/left=0 (reduces width) $anyextra = $prevblk['inner_width'] - ($currblk['css_set_width'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right']); if ($anyextra > 0) { $currblk['margin_left'] = $currblk['margin_right'] = $anyextra / 2; } else { $currblk['margin_left'] = $currblk['margin_right'] = 0; } } elseif (isset($properties['MARGIN-LEFT']) && strtolower($properties['MARGIN-LEFT']) === 'auto') { // Try to reduce margin-left to accomodate - if still too wide, set margin-left=0 (reduces width) $currblk['margin_left'] = $prevblk['inner_width'] - ($currblk['css_set_width'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right'] + $currblk['margin_right']); if ($currblk['margin_left'] < 0) { $currblk['margin_left'] = 0; } } elseif (isset($properties['MARGIN-RIGHT']) && strtolower($properties['MARGIN-RIGHT']) === 'auto') { // Try to reduce margin-right to accomodate - if still too wide, set margin-right=0 (reduces width) $currblk['margin_right'] = $prevblk['inner_width'] - ($currblk['css_set_width'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right'] + $currblk['margin_left']); if ($currblk['margin_right'] < 0) { $currblk['margin_right'] = 0; } } else { if ($currblk['direction'] === 'rtl') { // *OTL* // Try to reduce margin-left to accomodate - if still too wide, set margin-left=0 (reduces width) $currblk['margin_left'] = $prevblk['inner_width'] - ($currblk['css_set_width'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right'] + $currblk['margin_right']); // *OTL* if ($currblk['margin_left'] < 0) { // *OTL* $currblk['margin_left'] = 0; // *OTL* } // *OTL* } // *OTL* else { // *OTL* // Try to reduce margin-right to accomodate - if still too wide, set margin-right=0 (reduces width) $currblk['margin_right'] = $prevblk['inner_width'] - ($currblk['css_set_width'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right'] + $currblk['margin_left']); if ($currblk['margin_right'] < 0) { $currblk['margin_right'] = 0; } } // *OTL* } } $currblk['outer_left_margin'] = $prevblk['outer_left_margin'] + $currblk['margin_left'] + $prevblk['border_left']['w'] + $prevblk['padding_left']; $currblk['outer_right_margin'] = $prevblk['outer_right_margin'] + $currblk['margin_right'] + $prevblk['border_right']['w'] + $prevblk['padding_right']; $currblk['width'] = $this->mpdf->pgwidth - ($currblk['outer_right_margin'] + $currblk['outer_left_margin']); $currblk['inner_width'] = $currblk['width'] - ($currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right']); // Check DIV is not now too narrow to fit text $mw = 2 * $this->mpdf->GetCharWidth('W', false); if ($currblk['inner_width'] < $mw) { $currblk['padding_left'] = 0; $currblk['padding_right'] = 0; $currblk['border_left']['w'] = 0.2; $currblk['border_right']['w'] = 0.2; $currblk['margin_left'] = 0; $currblk['margin_right'] = 0; $currblk['outer_left_margin'] = $prevblk['outer_left_margin'] + $currblk['margin_left'] + $prevblk['border_left']['w'] + $prevblk['padding_left']; $currblk['outer_right_margin'] = $prevblk['outer_right_margin'] + $currblk['margin_right'] + $prevblk['border_right']['w'] + $prevblk['padding_right']; $currblk['width'] = $this->mpdf->pgwidth - ($currblk['outer_right_margin'] + $currblk['outer_left_margin']); $currblk['inner_width'] = $this->mpdf->pgwidth - ($currblk['outer_right_margin'] + $currblk['outer_left_margin'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right']); // if ($currblk['inner_width'] < $mw) { throw new \Mpdf\MpdfException("DIV is too narrow for text to fit!"); } } $this->mpdf->x = $this->mpdf->lMargin + $currblk['outer_left_margin']; /* -- BACKGROUNDS -- */ if (!empty($properties['BACKGROUND-IMAGE']) && !$this->mpdf->kwt && !$this->mpdf->ColActive && !$this->mpdf->keep_block_together) { $ret = $this->mpdf->SetBackground($properties, $currblk['inner_width']); if ($ret) { $currblk['background-image'] = $ret; } } /* -- END BACKGROUNDS -- */ /* -- TABLES -- */ if ($this->mpdf->use_kwt && isset($attr['KEEP-WITH-TABLE']) && !$this->mpdf->ColActive && !$this->mpdf->keep_block_together) { $this->mpdf->kwt = true; $this->mpdf->kwt_y0 = $this->mpdf->y; //$this->mpdf->kwt_x0 = $this->mpdf->x; $this->mpdf->kwt_x0 = $this->mpdf->lMargin; // mPDF 6 $this->mpdf->kwt_height = 0; $this->mpdf->kwt_buffer = []; $this->mpdf->kwt_Links = []; $this->mpdf->kwt_Annots = []; $this->mpdf->kwt_moved = false; $this->mpdf->kwt_saved = false; $this->mpdf->kwt_Reference = []; $this->mpdf->kwt_BMoutlines = []; $this->mpdf->kwt_toc = []; } else { /* -- END TABLES -- */ $this->mpdf->kwt = false; } // *TABLES* // Save x,y coords in case we need to print borders... $currblk['y0'] = $this->mpdf->y; $currblk['initial_y0'] = $this->mpdf->y; // mPDF 6 $currblk['x0'] = $this->mpdf->x; $currblk['initial_x0'] = $this->mpdf->x; // mPDF 6 $currblk['initial_startpage'] = $this->mpdf->page; $currblk['startpage'] = $this->mpdf->page; // mPDF 6 $this->mpdf->oldy = $this->mpdf->y; $this->mpdf->lastblocklevelchange = 1; // mPDF 6 Lists if ($tag === 'OL' || $tag === 'UL') { $this->mpdf->listlvl++; if (!empty($attr['START'])) { $this->mpdf->listcounter[$this->mpdf->listlvl] = (int) $attr['START'] - 1; } else { $this->mpdf->listcounter[$this->mpdf->listlvl] = 0; } $this->mpdf->listitem = []; // List-type if (empty($currblk['list_style_type'])) { if ($tag === 'OL') { $currblk['list_style_type'] = 'decimal'; } elseif ($tag === 'UL') { if ($this->mpdf->listlvl % 3 == 1) { $currblk['list_style_type'] = 'disc'; } elseif ($this->mpdf->listlvl % 3 == 2) { $currblk['list_style_type'] = 'circle'; } else { $currblk['list_style_type'] = 'square'; } } } // List-image if (empty($currblk['list_style_image'])) { $currblk['list_style_image'] = 'none'; } // List-position if (empty($currblk['list_style_position'])) { $currblk['list_style_position'] = 'outside'; } // Default indentation using padding if (strtolower($this->mpdf->list_auto_mode) === 'mpdf' && isset($currblk['list_style_position']) && $currblk['list_style_position'] === 'outside' && isset($currblk['list_style_image']) && $currblk['list_style_image'] === 'none' && (!isset($currblk['list_style_type']) || !preg_match('/U\+([a-fA-F0-9]+)/i', $currblk['list_style_type']))) { $autopadding = $this->mpdf->_getListMarkerWidth($currblk, $ahtml, $ihtml); if ($this->mpdf->listlvl > 1 || $this->mpdf->list_indent_first_level) { $autopadding += $this->sizeConverter->convert( $this->mpdf->list_indent_default, $currblk['inner_width'], $this->mpdf->FontSize, false ); } // autopadding value is applied to left or right according // to dir of block. Once a CSS value is set for padding it overrides this default value. if (isset($properties['PADDING-RIGHT']) && $properties['PADDING-RIGHT'] === 'auto' && isset($currblk['direction']) && $currblk['direction'] === 'rtl') { $currblk['padding_right'] = $autopadding; } elseif (isset($properties['PADDING-LEFT']) && $properties['PADDING-LEFT'] === 'auto') { $currblk['padding_left'] = $autopadding; } } else { // Initial default value is set by $this->mpdf->list_indent_default in config.php; this value is applied to left or right according // to dir of block. Once a CSS value is set for padding it overrides this default value. if (isset($properties['PADDING-RIGHT']) && $properties['PADDING-RIGHT'] === 'auto' && isset($currblk['direction']) && $currblk['direction'] === 'rtl') { $currblk['padding_right'] = $this->sizeConverter->convert( $this->mpdf->list_indent_default, $currblk['inner_width'], $this->mpdf->FontSize, false ); } elseif (isset($properties['PADDING-LEFT']) && $properties['PADDING-LEFT'] === 'auto') { $currblk['padding_left'] = $this->sizeConverter->convert( $this->mpdf->list_indent_default, $currblk['inner_width'], $this->mpdf->FontSize, false ); } } } // mPDF 6 Lists if ($tag === 'LI') { if ($this->mpdf->listlvl == 0) { // in case of malformed HTML code. Example:(...)</p><li>Content</li><p>Paragraph1</p>(...) $this->mpdf->listlvl++; // first depth level $this->mpdf->listcounter[$this->mpdf->listlvl] = 0; } if (!isset($attr['PAGEBREAKAVOIDCHECKED']) || !$attr['PAGEBREAKAVOIDCHECKED']) { $this->mpdf->listcounter[$this->mpdf->listlvl]++; } $this->mpdf->listitem = []; // Listitem-type $this->mpdf->_setListMarker($currblk['list_style_type'], $currblk['list_style_image'], $currblk['list_style_position']); } // mPDF 6 Bidirectional formatting for block elements $bdf = false; $bdf2 = ''; $popd = ''; // Get current direction $currdir = 'ltr'; if (isset($currblk['direction'])) { $currdir = $currblk['direction']; } if (isset($attr['DIR']) && $attr['DIR'] != '') { $currdir = strtolower($attr['DIR']); } if (isset($properties['DIRECTION'])) { $currdir = strtolower($properties['DIRECTION']); } // mPDF 6 bidi // cf. http://www.w3.org/TR/css3-writing-modes/#unicode-bidi if (isset($properties ['UNICODE-BIDI']) && (strtolower($properties ['UNICODE-BIDI']) === 'bidi-override' || strtolower($properties ['UNICODE-BIDI']) === 'isolate-override')) { if ($currdir === 'rtl') { $bdf = 0x202E; $popd = 'RLOPDF'; } // U+202E RLO else { $bdf = 0x202D; $popd = 'LROPDF'; } // U+202D LRO } elseif (isset($properties ['UNICODE-BIDI']) && strtolower($properties ['UNICODE-BIDI']) === 'plaintext') { $bdf = 0x2068; $popd = 'FSIPDI'; // U+2068 FSI } if ($bdf) { if ($bdf2) { $bdf2 = UtfString::code2utf($bdf); } $this->mpdf->OTLdata = []; if ($this->mpdf->tableLevel) { $this->mpdf->_saveCellTextBuffer(UtfString::code2utf($bdf) . $bdf2); } else { $this->mpdf->_saveTextBuffer(UtfString::code2utf($bdf) . $bdf2); } $this->mpdf->biDirectional = true; $currblk['bidicode'] = $popd; } } public function close(&$ahtml, &$ihtml) { $tag = $this->getTagName(); // mPDF 6 bidi // Block // If unicode-bidi set, any embedding levels, isolates, or overrides started by this box are closed if (isset($this->mpdf->blk[$this->mpdf->blklvl]['bidicode'])) { $blockpost = $this->mpdf->_setBidiCodes('end', $this->mpdf->blk[$this->mpdf->blklvl]['bidicode']); if ($blockpost) { $this->mpdf->OTLdata = []; if ($this->mpdf->tableLevel) { $this->mpdf->_saveCellTextBuffer($blockpost); } else { $this->mpdf->_saveTextBuffer($blockpost); } } } $this->mpdf->ignorefollowingspaces = true; //Eliminate exceeding left-side spaces $this->mpdf->blockjustfinished = true; $this->mpdf->lastblockbottommargin = $this->mpdf->blk[$this->mpdf->blklvl]['margin_bottom']; // mPDF 6 Lists if ($tag === 'UL' || $tag === 'OL') { if ($this->mpdf->listlvl > 0 && $this->mpdf->tableLevel) { if (isset($this->mpdf->listtype[$this->mpdf->listlvl])) { unset($this->mpdf->listtype[$this->mpdf->listlvl]); } } $this->mpdf->listlvl--; $this->mpdf->listitem = []; } if ($tag === 'LI') { $this->mpdf->listitem = []; } if (preg_match('/^H\d/', $tag) && !$this->mpdf->tableLevel && !$this->mpdf->writingToC) { if (isset($this->mpdf->h2toc[$tag]) || isset($this->mpdf->h2bookmarks[$tag])) { $content = ''; if (count($this->mpdf->textbuffer) == 1) { $content = $this->mpdf->textbuffer[0][0]; } else { for ($i = 0; $i < count($this->mpdf->textbuffer); $i++) { if (0 !== strpos($this->mpdf->textbuffer[$i][0], "\xbb\xa4\xac")) { //inline object $content .= $this->mpdf->textbuffer[$i][0]; } } } /* -- TOC -- */ if (isset($this->mpdf->h2toc[$tag])) { $objattr = []; $objattr['type'] = 'toc'; $objattr['toclevel'] = $this->mpdf->h2toc[$tag]; $objattr['CONTENT'] = htmlspecialchars($content); $e = "\xbb\xa4\xactype=toc,objattr=" . serialize($objattr) . "\xbb\xa4\xac"; array_unshift($this->mpdf->textbuffer, [$e]); } /* -- END TOC -- */ /* -- BOOKMARKS -- */ if (isset($this->mpdf->h2bookmarks[$tag])) { $objattr = []; $objattr['type'] = 'bookmark'; $objattr['bklevel'] = $this->mpdf->h2bookmarks[$tag]; $objattr['CONTENT'] = $content; $e = "\xbb\xa4\xactype=toc,objattr=" . serialize($objattr) . "\xbb\xa4\xac"; array_unshift($this->mpdf->textbuffer, [$e]); } /* -- END BOOKMARKS -- */ } } /* -- TABLES -- */ if ($this->mpdf->tableLevel) { if ($this->mpdf->linebreakjustfinished) { $this->mpdf->blockjustfinished = false; } if (isset($this->mpdf->InlineProperties['BLOCKINTABLE'])) { if ($this->mpdf->InlineProperties['BLOCKINTABLE']) { $this->mpdf->restoreInlineProperties($this->mpdf->InlineProperties['BLOCKINTABLE']); } unset($this->mpdf->InlineProperties['BLOCKINTABLE']); } if ($tag === 'PRE') { $this->mpdf->ispre = false; } return; } /* -- END TABLES -- */ $this->mpdf->lastoptionaltag = ''; $this->mpdf->divbegin = false; $this->mpdf->linebreakjustfinished = false; $this->mpdf->x = $this->mpdf->lMargin + $this->mpdf->blk[$this->mpdf->blklvl]['outer_left_margin']; /* -- CSS-FLOAT -- */ // If float contained in a float, need to extend bottom to allow for it $currpos = $this->mpdf->page * 1000 + $this->mpdf->y; if (isset($this->mpdf->blk[$this->mpdf->blklvl]['float_endpos']) && $this->mpdf->blk[$this->mpdf->blklvl]['float_endpos'] > $currpos) { $old_page = $this->mpdf->page; $new_page = (int) ($this->mpdf->blk[$this->mpdf->blklvl]['float_endpos'] / 1000); if ($old_page != $new_page) { $s = $this->mpdf->PrintPageBackgrounds(); // Writes after the marker so not overwritten later by page background etc. $this->mpdf->pages[$this->mpdf->page] = preg_replace( '/(___BACKGROUND___PATTERNS' . $this->mpdf->uniqstr . ')/', '\\1' . "\n" . $s . "\n", $this->mpdf->pages[$this->mpdf->page] ); $this->mpdf->pageBackgrounds = []; $this->mpdf->page = $new_page; $this->mpdf->ResetMargins(); $this->mpdf->Reset(); $this->mpdf->pageoutput[$this->mpdf->page] = []; } // mod changes operands to integers before processing $this->mpdf->y = (($this->mpdf->blk[$this->mpdf->blklvl]['float_endpos'] * 1000) % 1000000) / 1000; } /* -- END CSS-FLOAT -- */ //Print content $blockstate = 0; if ($this->mpdf->lastblocklevelchange == 1) { $blockstate = 3; } // Top & bottom margins/padding elseif ($this->mpdf->lastblocklevelchange == -1) { $blockstate = 2; } // Bottom margins/padding only // called from after e.g. </table> </div> </div> ... Outputs block margin/border and padding if (count($this->mpdf->textbuffer) && $this->mpdf->textbuffer[count($this->mpdf->textbuffer) - 1]) { if (0 !== strpos($this->mpdf->textbuffer[count($this->mpdf->textbuffer) - 1][0], "\xbb\xa4\xac")) { // not special content // Right trim last content and adjust OTLdata if (preg_match('/[ ]+$/', $this->mpdf->textbuffer[count($this->mpdf->textbuffer) - 1][0], $m)) { $strip = strlen($m[0]); $this->mpdf->textbuffer[count($this->mpdf->textbuffer) - 1][0] = substr( $this->mpdf->textbuffer[count($this->mpdf->textbuffer) - 1][0], 0, strlen($this->mpdf->textbuffer[count($this->mpdf->textbuffer) - 1][0]) - $strip ); /* -- OTL -- */ if (!empty($this->mpdf->CurrentFont['useOTL'])) { $this->otl->trimOTLdata($this->mpdf->textbuffer[count($this->mpdf->textbuffer) - 1][18], false); // mPDF 6 ZZZ99K } /* -- END OTL -- */ } } } if (count($this->mpdf->textbuffer) == 0 && $this->mpdf->lastblocklevelchange != 0) { /*$this->mpdf->newFlowingBlock( $this->mpdf->blk[$this->mpdf->blklvl]['width'], $this->mpdf->lineheight, '', false, 2, true, (isset($this->mpdf->blk[$this->mpdf->blklvl]['direction']) ? $this->mpdf->blk[$this->mpdf->blklvl]['direction'] : 'ltr') );*/ $this->mpdf->newFlowingBlock( $this->mpdf->blk[$this->mpdf->blklvl]['width'], $this->mpdf->lineheight, '', false, $blockstate, true, (isset($this->mpdf->blk[$this->mpdf->blklvl]['direction']) ? $this->mpdf->blk[$this->mpdf->blklvl]['direction'] : 'ltr') ); $this->mpdf->finishFlowingBlock(true); // true = END of flowing block $this->mpdf->PaintDivBB('', $blockstate); } else { $this->mpdf->printbuffer($this->mpdf->textbuffer, $blockstate); } $this->mpdf->textbuffer = []; if ($this->mpdf->kwt) { $this->mpdf->kwt_height = $this->mpdf->y - $this->mpdf->kwt_y0; } /* -- CSS-IMAGE-FLOAT -- */ $this->mpdf->printfloatbuffer(); /* -- END CSS-IMAGE-FLOAT -- */ if ($tag === 'PRE') { $this->mpdf->ispre = false; } /* -- CSS-FLOAT -- */ if ($this->mpdf->blk[$this->mpdf->blklvl]['float'] === 'R') { // If width not set, here would need to adjust and output buffer $s = $this->mpdf->PrintPageBackgrounds(); // Writes after the marker so not overwritten later by page background etc. $this->mpdf->pages[$this->mpdf->page] = preg_replace('/(___BACKGROUND___PATTERNS' . $this->mpdf->uniqstr . ')/', '\\1' . "\n" . $s . "\n", $this->mpdf->pages[$this->mpdf->page]); $this->mpdf->pageBackgrounds = []; $this->mpdf->Reset(); $this->mpdf->pageoutput[$this->mpdf->page] = []; for ($i = ($this->mpdf->blklvl - 1); $i >= 0; $i--) { if (isset($this->mpdf->blk[$i]['float_endpos'])) { $this->mpdf->blk[$i]['float_endpos'] = max($this->mpdf->blk[$i]['float_endpos'], $this->mpdf->page * 1000 + $this->mpdf->y); } else { $this->mpdf->blk[$i]['float_endpos'] = $this->mpdf->page * 1000 + $this->mpdf->y; } } $this->mpdf->floatDivs[] = [ 'side' => 'R', 'startpage' => $this->mpdf->blk[$this->mpdf->blklvl]['startpage'], 'y0' => $this->mpdf->blk[$this->mpdf->blklvl]['float_start_y'], 'startpos' => $this->mpdf->blk[$this->mpdf->blklvl]['startpage'] * 1000 + $this->mpdf->blk[$this->mpdf->blklvl]['float_start_y'], 'endpage' => $this->mpdf->page, 'y1' => $this->mpdf->y, 'endpos' => $this->mpdf->page * 1000 + $this->mpdf->y, 'w' => $this->mpdf->blk[$this->mpdf->blklvl]['float_width'], 'blklvl' => $this->mpdf->blklvl, 'blockContext' => $this->mpdf->blk[$this->mpdf->blklvl - 1]['blockContext'] ]; $this->mpdf->y = $this->mpdf->blk[$this->mpdf->blklvl]['float_start_y']; $this->mpdf->page = $this->mpdf->blk[$this->mpdf->blklvl]['startpage']; $this->mpdf->ResetMargins(); $this->mpdf->pageoutput[$this->mpdf->page] = []; } if ($this->mpdf->blk[$this->mpdf->blklvl]['float'] === 'L') { // If width not set, here would need to adjust and output buffer $s = $this->mpdf->PrintPageBackgrounds(); // Writes after the marker so not overwritten later by page background etc. $this->mpdf->pages[$this->mpdf->page] = preg_replace('/(___BACKGROUND___PATTERNS' . $this->mpdf->uniqstr . ')/', '\\1' . "\n" . $s . "\n", $this->mpdf->pages[$this->mpdf->page]); $this->mpdf->pageBackgrounds = []; $this->mpdf->Reset(); $this->mpdf->pageoutput[$this->mpdf->page] = []; for ($i = ($this->mpdf->blklvl - 1); $i >= 0; $i--) { if (isset($this->mpdf->blk[$i]['float_endpos'])) { $this->mpdf->blk[$i]['float_endpos'] = max($this->mpdf->blk[$i]['float_endpos'], $this->mpdf->page * 1000 + $this->mpdf->y); } else { $this->mpdf->blk[$i]['float_endpos'] = $this->mpdf->page * 1000 + $this->mpdf->y; } } $this->mpdf->floatDivs[] = [ 'side' => 'L', 'startpage' => $this->mpdf->blk[$this->mpdf->blklvl]['startpage'], 'y0' => $this->mpdf->blk[$this->mpdf->blklvl]['float_start_y'], 'startpos' => $this->mpdf->blk[$this->mpdf->blklvl]['startpage'] * 1000 + $this->mpdf->blk[$this->mpdf->blklvl]['float_start_y'], 'endpage' => $this->mpdf->page, 'y1' => $this->mpdf->y, 'endpos' => $this->mpdf->page * 1000 + $this->mpdf->y, 'w' => $this->mpdf->blk[$this->mpdf->blklvl]['float_width'], 'blklvl' => $this->mpdf->blklvl, 'blockContext' => $this->mpdf->blk[$this->mpdf->blklvl - 1]['blockContext'] ]; $this->mpdf->y = $this->mpdf->blk[$this->mpdf->blklvl]['float_start_y']; $this->mpdf->page = $this->mpdf->blk[$this->mpdf->blklvl]['startpage']; $this->mpdf->ResetMargins(); $this->mpdf->pageoutput[$this->mpdf->page] = []; } /* -- END CSS-FLOAT -- */ if (isset($this->mpdf->blk[$this->mpdf->blklvl]['visibility']) && $this->mpdf->blk[$this->mpdf->blklvl]['visibility'] !== 'visible') { $this->mpdf->SetVisibility('visible'); } $page_break_after = ''; if (isset($this->mpdf->blk[$this->mpdf->blklvl]['page_break_after'])) { $page_break_after = $this->mpdf->blk[$this->mpdf->blklvl]['page_break_after']; } // Reset values $this->mpdf->Reset(); if (isset($this->mpdf->blk[$this->mpdf->blklvl]['z-index']) && $this->mpdf->blk[$this->mpdf->blklvl]['z-index'] > 0) { $this->mpdf->EndLayer(); } // mPDF 6 page-break-inside:avoid if ($this->mpdf->blk[$this->mpdf->blklvl]['keep_block_together']) { $movepage = false; // If page-break-inside:avoid section has broken to new page but fits on one side - then move: if (($this->mpdf->page - $this->mpdf->kt_p00) == 1 && $this->mpdf->y < $this->mpdf->kt_y00) { $movepage = true; } if (($this->mpdf->page - $this->mpdf->kt_p00) > 0) { for ($i = $this->mpdf->page; $i > $this->mpdf->kt_p00; $i--) { unset($this->mpdf->pages[$i]); if (isset($this->mpdf->blk[$this->mpdf->blklvl]['bb_painted'][$i])) { unset($this->mpdf->blk[$this->mpdf->blklvl]['bb_painted'][$i]); } if (isset($this->mpdf->blk[$this->mpdf->blklvl]['marginCorrected'][$i])) { unset($this->mpdf->blk[$this->mpdf->blklvl]['marginCorrected'][$i]); } if (isset($this->mpdf->pageoutput[$i])) { unset($this->mpdf->pageoutput[$i]); } } $this->mpdf->page = $this->mpdf->kt_p00; } $this->mpdf->keep_block_together = 0; $this->mpdf->pageoutput[$this->mpdf->page] = []; $this->mpdf->y = $this->mpdf->kt_y00; $ihtml = $this->mpdf->blk[$this->mpdf->blklvl]['array_i'] - 1; $ahtml[$ihtml + 1] .= ' pagebreakavoidchecked="true";'; // avoid re-iterating; read in OpenTag() unset($this->mpdf->blk[$this->mpdf->blklvl]); $this->mpdf->blklvl--; for ($blklvl = 1; $blklvl <= $this->mpdf->blklvl; $blklvl++) { $this->mpdf->blk[$blklvl]['y0'] = $this->mpdf->blk[$blklvl]['initial_y0']; $this->mpdf->blk[$blklvl]['x0'] = $this->mpdf->blk[$blklvl]['initial_x0']; $this->mpdf->blk[$blklvl]['startpage'] = $this->mpdf->blk[$blklvl]['initial_startpage']; } if (isset($this->mpdf->blk[$this->mpdf->blklvl]['x0'])) { $this->mpdf->x = $this->mpdf->blk[$this->mpdf->blklvl]['x0']; } else { $this->mpdf->x = $this->mpdf->lMargin; } $this->mpdf->lastblocklevelchange = 0; $this->mpdf->ResetMargins(); if ($movepage) { $this->mpdf->AddPage(); } return; } if ($this->mpdf->blklvl > 0) { // ==0 SHOULDN'T HAPPEN - NOT XHTML if ($this->mpdf->blk[$this->mpdf->blklvl]['tag'] == $tag) { unset($this->mpdf->blk[$this->mpdf->blklvl]); $this->mpdf->blklvl--; } //else { echo $tag; exit; } // debug - forces error if incorrectly nested html tags } $this->mpdf->lastblocklevelchange = -1; // Reset Inline-type properties if (isset($this->mpdf->blk[$this->mpdf->blklvl]['InlineProperties'])) { $this->mpdf->restoreInlineProperties($this->mpdf->blk[$this->mpdf->blklvl]['InlineProperties']); } $this->mpdf->x = $this->mpdf->lMargin + $this->mpdf->blk[$this->mpdf->blklvl]['outer_left_margin']; if (!$this->mpdf->tableLevel && $page_break_after) { $save_blklvl = $this->mpdf->blklvl; $save_blk = $this->mpdf->blk; $save_silp = $this->mpdf->saveInlineProperties(); $save_ilp = $this->mpdf->InlineProperties; $save_bflp = $this->mpdf->InlineBDF; $save_bflpc = $this->mpdf->InlineBDFctr; // mPDF 6 // mPDF 6 pagebreaktype $startpage = $this->mpdf->page; $pagebreaktype = $this->mpdf->defaultPagebreakType; if ($this->mpdf->ColActive) { $pagebreaktype = 'cloneall'; } // mPDF 6 pagebreaktype $this->mpdf->_preForcedPagebreak($pagebreaktype); if ($page_break_after === 'RIGHT') { $this->mpdf->AddPage($this->mpdf->CurOrientation, 'NEXT-ODD'); } elseif ($page_break_after === 'LEFT') { $this->mpdf->AddPage($this->mpdf->CurOrientation, 'NEXT-EVEN'); } else { $this->mpdf->AddPage($this->mpdf->CurOrientation); } // mPDF 6 pagebreaktype $this->mpdf->_postForcedPagebreak($pagebreaktype, $startpage, $save_blk, $save_blklvl); $this->mpdf->InlineProperties = $save_ilp; $this->mpdf->InlineBDF = $save_bflp; $this->mpdf->InlineBDFctr = $save_bflpc; // mPDF 6 $this->mpdf->restoreInlineProperties($save_silp); } // mPDF 6 bidi // Block // If unicode-bidi set, any embedding levels, isolates, or overrides reopened in the continuing block if (isset($this->mpdf->blk[$this->mpdf->blklvl]['bidicode'])) { $blockpre = $this->mpdf->_setBidiCodes('start', $this->mpdf->blk[$this->mpdf->blklvl]['bidicode']); if ($blockpre) { $this->mpdf->OTLdata = []; if ($this->mpdf->tableLevel) { $this->mpdf->_saveCellTextBuffer($blockpre); } else { $this->mpdf->_saveTextBuffer($blockpre); } } } } }
Save
cmd:
run