Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 19 additions & 4 deletions src/node/modules/flowfilters.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// ♻️ flowfilters

import { debugFor } from '../utils/debugFor.js';
const _isDebug = debugFor('flowfilters');
const _isDebug = debugFor('flowFilters');

// Cache marker so each element is evaluated at most once per run.
const FLOW_SKIP_FLAG = '__html2pdf4docFlowFilter';
Expand Down Expand Up @@ -37,6 +37,18 @@ const SKIP_RULES = [
},
];

const SKIP_TAGS = new Set([
'SOURCE',
'TEMPLATE',
'SCRIPT',
'NOSCRIPT',
'STYLE',
'LINK',
'META',
'HEAD',
'TITLE',
]);

function logSkip(node, context, cache, element, { cached } = { cached: false }) {
if (!_isDebug(node)) return;
const prefix = context ? `(${context}) ` : '';
Expand All @@ -49,22 +61,25 @@ export function shouldSkipFlowElement(element, { context = '', computedStyle } =
return false;
}

// * cached result
const cached = element[FLOW_SKIP_FLAG];
if (cached) {
logSkip(this, context, cached, element, { cached: true });
return true;
}

if (this._DOM.getElementTagName(element) === 'SOURCE') {
logSkip(this, context, "ignore <SOURCE>", element);
// * by TAG name
const tagName = this._DOM.getElementTagName(element);
if (SKIP_TAGS.has(tagName)) {
logSkip(this, context, { message: `* <${tagName}> — skipped` }, element);
return true;
}

// * by CSS styles
const style = computedStyle ?? this._DOM.getComputedStyle(element);
if (!style) {
return false;
}

for (const rule of SKIP_RULES) {
if (rule.test(style)) {
element[FLOW_SKIP_FLAG] = rule.cache;
Expand Down
5 changes: 4 additions & 1 deletion src/node/modules/selectors.js
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,10 @@ export function isContentFlowStart(element) {
* @this {Node}
*/
export function isAfterContentFlowStart(element) {
const elementBeforeInspected = this._DOM.getLeftNeighbor(element);
let elementBeforeInspected = this._DOM.getLeftNeighbor(element);
while (elementBeforeInspected && this.shouldSkipFlowElement(elementBeforeInspected, { context: 'isAfterContentFlowStart' })) {
elementBeforeInspected = this._DOM.getLeftNeighbor(elementBeforeInspected);
}
return this.isSelectorMatching(elementBeforeInspected, this._selector.contentFlowStart)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<!doctype html>
<html lang="">

<head>
<meta charset="utf-8" />
<meta name="keywords" content="HTML2PDF4DOC, end2end" />
<meta name="description" content="HTML2PDF4DOC end2end test" />
<title>Test page</title>

<link rel="stylesheet" href="../../../shared/css/main.css">
<script defer
data-console-assert="true"
data-forced-debug-mode="true"
data-print-height='300px'
data-print-width='600px'
data-forced-page-break-selectors=""
data-page-break-after-selectors=""
data-page-break-before-selectors=".html2pdf4doc-break-before"
data-no-break-selectors=".html2pdf4doc-no-break"
data-no-hanging-selectors=".html2pdf4doc-no-hanging"
src="../../../../dist/bundle.js"></script>
</head>

<body>
<template html2pdf4doc-frontpage>FRONTPAGE</template>
<template html2pdf4doc-header>
<div style="font-size: 9px;">HEADER</div>
<div html2pdf4doc-page-number><span html2pdf4doc-page-number-current></span>/<span
html2pdf4doc-page-number-total></span></div>
</template>
<template html2pdf4doc-footer>
<div style="font-size: 9px;">FOOTER</div>
<div html2pdf4doc-page-number><span html2pdf4doc-page-number-current></span>/<span
html2pdf4doc-page-number-total></span></div>
</template>

<!-- <div class="">Text 0 (simple)</div> -->

<div data-testid="h1" class="html2pdf4doc-break-before html2pdf4doc-no-hanging">Header1 (break-before) after templates</div>
<div class="html2pdf4doc-no-hanging">Text 1 (html2pdf4doc-no-hanging)</div>
<div data-testid="h2" class="html2pdf4doc-break-before html2pdf4doc-no-hanging">Header2 (break-before)</div>
<div class="">Text 2 (simple)</div>

</body>

</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<!doctype html>
<html lang="">

<head>
<meta charset="utf-8" />
<meta name="keywords" content="HTML2PDF4DOC, end2end" />
<meta name="description" content="HTML2PDF4DOC end2end test" />
<title>Test page</title>

<link rel="stylesheet" href="../../../shared/css/main.css">
<script defer
data-console-assert="true"
data-forced-debug-mode="true"
data-print-height='300px'
data-print-width='600px'
data-forced-page-break-selectors=""
data-page-break-after-selectors=""
data-page-break-before-selectors=".html2pdf4doc-break-before"
data-no-break-selectors=".html2pdf4doc-no-break"
data-no-hanging-selectors=".html2pdf4doc-no-hanging"
src="../../../../dist/bundle.js"></script>
</head>

<body>

<div style="display: none;">Text 0 (simple)</div>

<div data-testid="h1" class="html2pdf4doc-break-before html2pdf4doc-no-hanging">Header1 (break-before) after display:none</div>
<div class="html2pdf4doc-no-hanging">Text 1 (html2pdf4doc-no-hanging)</div>
<div data-testid="h2" class="html2pdf4doc-break-before html2pdf4doc-no-hanging">Header2 (break-before)</div>
<div class="">Text 2 (simple)</div>

</body>

</html>
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import os

from selenium.webdriver.common.by import By
from seleniumbase import BaseCase

from test.end2end.helpers.helper import Helper
Expand Down Expand Up @@ -47,3 +46,17 @@ def test_005(self):
self.helper.assert_document_has_pages(3)
self.helper.assert_element_on_the_page(h1, 2)
self.helper.assert_element_on_the_page(h2, 3)

def test_010(self):
# Templates at the beginning of the BODY should not be counted,
# and H1 should be considered the first
# (and should not receive an additional break before it).
self.helper.open_case(path_to_this_test_file_folder, '010_templates_first')
self.helper.assert_document_has_pages(3)
self.helper.assert_element_on_the_page(h1, 2)

def test_011(self):
# display:none at the beginning of the BODY should not be counted.
self.helper.open_case(path_to_this_test_file_folder, '011_display_none')
self.helper.assert_document_has_pages(2)
self.helper.assert_element_on_the_page(h1, 1)
Loading