qutebrowser/misc/userscripts/readability-js

72 lines
2.2 KiB
JavaScript
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env node
//
// # Description
//
// Summarize the current page in a new tab, by processing it with the standalone readability
// library used for Firefox Reader View.
//
// # Prerequisites
//
// - NODE_PATH might be required to point to your global node libraries:
// export NODE_PATH=$NODE_PATH:$(npm root -g)
// - Mozilla's readability library (npm install -g https://github.com/mozilla/readability.git)
// NOTE: You might have to *login* as root for a system-wide installation to work (e.g. sudo -s)
// - jsdom (npm install -g jsdom)
// - qutejs (npm install -g qutejs)
//
// # Usage
//
// :spawn --userscript readability-js
//
// One may wish to define an easy to type command alias in Qutebrowser's configuration file:
// c.aliases = {"readability" : "spawn --userscript readability-js", ...}
const Readability = require('readability');
const qute = require('qutejs');
const JSDOM = require('jsdom').JSDOM;
const fs = require('fs');
const path = require('path');
const util = require('util');
const HEADER = `
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1, text/html, charset=UTF-8" http-equiv="Content-Type">
</meta>
<title>%s</title>
<style type="text/css">
body {
margin: 30px auto;
max-width: 650px;
line-height: 1.4;
padding: 0 10px;
}
h1, h2, h3 {
line-height: 1.2;
}
</style>
</head>`;
const scriptsDir = path.join(process.env.QUTE_DATA_DIR, 'userscripts');
const tmpFile = path.join(scriptsDir, '/readability.html');
const domOpts = {url: process.env.QUTE_URL, contentType: "text/html; charset=utf-8"}
if (!fs.existsSync(scriptsDir)){
fs.mkdirSync(scriptsDir);
}
JSDOM.fromFile(process.env.QUTE_HTML, domOpts).then(dom => {
let reader = new Readability(dom.window.document);
let article = reader.parse();
let content = util.format(HEADER, article.title) + article.content;
fs.writeFile(tmpFile, content, (err) => {
if (err) {
qute.messageError([`"${err}"`])
return 1;
}
// Success
qute.open(['-t', tmpFile]);
})
});