Skip to content

v3.0.0

Compare
Choose a tag to compare
@danburzo danburzo released this 17 Feb 14:43
· 29 commits to main since this release

⚠️ Breaking changes

Node 14 required

Node.js 14.17 or later is required to run Percollate 3.0.0. Users on Node.js 12.x can continue using Percollate 2.x by installing it with:

npm install -g percollate@2

Programmatic API breaking changes

Note: The programmatic API is not currently part of the public, documented API.

fetchContent(), which used to return the page content as a string decoded to 'utf-8', will now return an object of the shape { buffer: ArrayBuffer, contentType: string? }. Consequently, calls to pdf(), epub() and html() will return on the .originalContent this new structure as well. See Programmatic API migration for details below.

New features

Experimental Firefox support for PDF rendering

Added experimental Firefox Nightly support for rendering PDFs, via the percollate pdf --browser=firefox option. To fetch Firefox Nightly, perform the following installation steps:

# fetches Chrome
npm install -g percollate

# fetches Firefox Nightly
PUPPETEER_PRODUCT=firefox npm install -g percollate

Bug fixes

Better default styles for code blocks with the tab-size: 2 CSS property.

Migration

Programmatic API migration

Note: The programmatic API is not currently part of the public, documented API.

In general, an ArrayBuffer can be converted to a String with the TextDecoder class available in Node.js. In case the content uses a different encoding than the default utf-8, you can use the whatwg-mimetype and html-encoding-sniffer packages (on which jsdom already depends) to obtain the content's encoding:

import { TextDecoder } from 'node:util';
import htmlEncodingSniffer from 'html-encoding-sniffer';
import MimeType from 'whatwg-mimetype';

const { buffer, contentType } = await fetchContent(...);

const encoding = contentType
	? new MimeType(contentType).parameters.get('charset')
	: undefined;

const str = new TextDecoder(
	htmlEncodingSniffer(buffer, {
		transportLayerEncodingLabel: encoding
	})
).decode(buffer);