127 lines
2.0 KiB
JavaScript
127 lines
2.0 KiB
JavaScript
|
const sync_max = 512;
|
||
|
|
||
|
const textarea = document.getElementById ("JNG5U2EX");
|
||
|
const debug_text = document.getElementById ("XDHSIT76");
|
||
|
|
||
|
textarea.innerText = "Loading...";
|
||
|
|
||
|
let page = "";
|
||
|
let offset = 0;
|
||
|
|
||
|
function line_start_before (page, offset) {
|
||
|
const sync_start = Math.max (sync_max, offset) - sync_max;
|
||
|
|
||
|
for (let i = offset; i >= sync_start; i--) {
|
||
|
const c = page.charAt (i);
|
||
|
if (c == '\n') {
|
||
|
return i + 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
function line_start_after (page, offset)
|
||
|
{
|
||
|
for (let i = offset; i < offset + sync_max; i++) {
|
||
|
const c = page.charAt (i);
|
||
|
if (c == '\n') {
|
||
|
return i + 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
function layout_text (page, offset) {
|
||
|
const width = 120;
|
||
|
const height = 24;
|
||
|
|
||
|
const line_start = line_start_before (page, offset) || 0;
|
||
|
|
||
|
// Compute layout
|
||
|
|
||
|
let lines = Array ();
|
||
|
let line = "";
|
||
|
|
||
|
for (let i = line_start; i < page.length; i++) {
|
||
|
if (lines.length >= height) {
|
||
|
break;
|
||
|
}
|
||
|
if (line.length >= width) {
|
||
|
lines.push (line);
|
||
|
line = "";
|
||
|
}
|
||
|
|
||
|
const c = page.charAt (i);
|
||
|
|
||
|
if (c == '\n') {
|
||
|
lines.push (line);
|
||
|
line = "";
|
||
|
}
|
||
|
else {
|
||
|
line = line + page.charAt (i);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return lines.join ('\n');
|
||
|
}
|
||
|
|
||
|
function repaint (offset)
|
||
|
{
|
||
|
textarea.innerText = layout_text (page, offset);
|
||
|
debug_text.innerText = "Offset: " + offset + "\n";
|
||
|
}
|
||
|
|
||
|
async function async_main ()
|
||
|
{
|
||
|
let file_length = null;
|
||
|
|
||
|
{
|
||
|
const resp = await fetch ("log.txt", {
|
||
|
"method": "HEAD",
|
||
|
});
|
||
|
|
||
|
file_length = resp.headers.get ("content-length");
|
||
|
}
|
||
|
|
||
|
const resp = await fetch ("log.txt", {
|
||
|
"headers": {
|
||
|
"range": "bytes=0-65535",
|
||
|
},
|
||
|
});
|
||
|
|
||
|
page = await resp.text ();
|
||
|
|
||
|
repaint (offset);
|
||
|
}
|
||
|
|
||
|
async_main ().then (
|
||
|
function (val) {},
|
||
|
function (err) {}
|
||
|
);
|
||
|
|
||
|
function cursor_left ()
|
||
|
{
|
||
|
offset = Math.max (1, offset) - 1;
|
||
|
repaint (offset);
|
||
|
}
|
||
|
|
||
|
function cursor_right ()
|
||
|
{
|
||
|
offset += 1;
|
||
|
repaint (offset);
|
||
|
}
|
||
|
|
||
|
function cursor_up ()
|
||
|
{
|
||
|
offset = line_start_before (page, offset - 2) || 0;
|
||
|
repaint (offset);
|
||
|
}
|
||
|
|
||
|
function cursor_down ()
|
||
|
{
|
||
|
offset = line_start_after (page, offset);
|
||
|
repaint (offset);
|
||
|
}
|