Files
nazeka-chromium/reader.js
T
2019-01-09 01:37:29 -05:00

113 lines
2.8 KiB
JavaScript

// Copyright 2017; Licensed under the Apache License, Version 2.0: https://www.apache.org/licenses/LICENSE-2.0
'use strict';
// updated by a timer looping function, based on local storage set by the options page
// we only use a tiny number of settings here
let reader_settings = {
reader_reverse: false,
reader_leeway: 200
};
async function reader_settings_init()
{
try
{
async function getvar(name, defval)
{
let temp = (await browser.storage.local.get(name))[name];
if(temp == undefined)
temp = defval;
reader_settings[name] = temp;
}
getvar("reader_reverse", false);
getvar("reader_leeway", 200);
} catch(err) {} // options not stored yet
}
reader_settings_init();
browser.storage.onChanged.addListener((updates, storageArea) =>
{
if(storageArea != "local") return;
for(let setting of Object.entries(updates))
{
let option = setting[0];
let value = setting[1];
if(Object.keys(reader_settings).includes(option))
reader_settings[option] = value.newValue;
}
});
// actual reder code
function reader_might_have_japanese(text)
{
for(let char of text)
if(char && char.length > 0 && char.codePointAt(0) >= 0x2E80)
return true;
return false;
}
function reader_update(text)
{
if(!reader_might_have_japanese(text))
return;
let target = document.body;
let newnode = document.createElement("p");
newnode.textContent = text;
if(!reader_settings.reader_reverse)
target.insertBefore(newnode, document.body.firstChild);
else
{
target.appendChild(newnode);
if(reader_settings.reader_leeway != 0)
{
let scroll_end_distance = -document.body.scrollHeight + -document.body.clientHeight + 2*document.body.offsetHeight - document.body.scrollTop;
if (scroll_end_distance < reader_settings.reader_leeway)
window.scrollTo(0, document.body.scrollHeight);
}
}
document.getElementById("linecount").innerText = parseInt(document.getElementById("linecount").innerText)+1;
}
let reader_text_previous = "";
function reader_cycle_text(text)
{
if(text != "" && text != reader_text_previous)
reader_update(text);
reader_text_previous = text;
}
function reader_gimmetext()
{
browser.runtime.sendMessage({type:"gimmetext"});
}
let interval = 250;
async function reader_checkpaste()
{
try
{
let text = await reader_gimmetext();
reader_cycle_text(text);
}
catch(error){}
setTimeout(reader_checkpaste, interval);
}
setTimeout(reader_checkpaste, interval);
browser.runtime.onMessage.addListener((req, sender) =>
{
if (req.type == "text")
reader_cycle_text(req.text);
return Promise.resolve(undefined);
});