Initial commit: Klammertext source distribution

Curated source subset assembled by klammertext-dev's doc/make_dist.sh: the Klammermachine (mac), the Standard Klammer Set (sks), the commands (com), editor plugins and install guides (doc), a test subset (tst), and lib/bin placeholders. Builds with 'make -C com'.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-18 18:48:23 +02:00
commit 2ba7ceee7a
272 changed files with 27634 additions and 0 deletions

201
sks/document/js/state.js Normal file
View File

@@ -0,0 +1,201 @@
[save_position, restore_position] = function () {
let basename = "";
let top_heading_id = "";
let y_offset = 0;
let toc_width = 0;
let save = function () {
console.log("\n");
console.log("save_position");
basename = window.location.toString().split("#")[1];
let top_heading = first_highlighted_navlink();
console.log("top heading:");
console.log(top_heading);
if (!top_heading) {
return;
}
top_heading_id = K.attr(top_heading, "data-target");
//y_offset = Math.round(K.top(top_heading) - K.top("#text"));
let textw = K.get("#text");
//y_offset = textw.scrollHeight -textw.scrollTop;
y_offset = K.get("#text").scrollTop;
console.log("y_offset: " + y_offset);
toc_width = K.width("#toc");
console.log("toc_width: " + toc_width);
console.log("save_position: " + basename + " " + top_heading_id + " " + y_offset);
}
let restore = function () {
let page = K.get("#pagecache #_page_" + basename);
K.get("#text").innerHTML = page.innerHTML;
resize_text_width(toc_width);
K.get("#text").scrollTo(0, y_offset);
}
return [save, restore];
}();
function page_cache_id(name) {
return "_page_" + name;
}
async function cache_pages() {
if (K.get("#pagecache").children.length === 0) {
K.style("#pagecache", "display", "none");
const pagecache = K.get("#pagecache");
let loads = [];
pages_basenames().forEach(function (p) {
let page = document.createElement("div");
loads.push(K.load(page, "pages/" + p + ".html"));
K.attr(page, "id", page_cache_id(p));
K.attr(page, "class", "content_page");
pagecache.append(page);
});
let help_page = document.createElement("div");
loads.push(K.load(help_page, "pages/help.html"));
K.attr(help_page, "id", "help_page");
pagecache.append(help_page);
let search_page = document.createElement("div");
K.attr(search_page, "id", "search_page");
pagecache.append(search_page);
await Promise.all(loads);
}
}
window.addEventListener("popstate", function (event) {
const parts = window.location.toString().split("#");
const basename = parts[1];
const target = parts[2];
if (basename && target) {
if (K.get("#help").textContent === "Back") {
if (!K.visible("#toc")) {
textshow();
}
modify_buttons_for_help("show");
frame_resize();
} else {
go_to_section(null, basename, target, true);
}
}
});
window.addEventListener("load", async function (event) {
let last_location = localStorage.getItem("klammertext_location");
let last_fit_check = localStorage.getItem("klammertext_fit");
let last_links_check = localStorage.getItem("klammertext_links");
await cache_pages();
K.getv("#toc .caret[data-level='0']").forEach(function (o) {
if (!K.has_class(o, "caret-down")) {
o.click();
}
});
// Set initial hash so the browser back button can return to the first page
if (!window.location.hash) {
let first = K.get(".navlink");
if (first) {
let basename = K.attr(first, "data-page");
let target = K.attr(first, "data-target");
history.replaceState(null, null, "#" + basename + "#" + target);
}
}
if (last_location) {
localStorage.setItem("klammertext_reload", "true");
let parts = last_location.split(":");
//console.log("\n");
//console.log("load parts:");
//console.log(parts);
go_to_section(null, parts[0], parts[1], true);
}
resize_toc(true);
// Restore fit and links states directly (not via .click()) to avoid
// desync with the browser's checkbox state restoration on refresh.
if (last_fit_check === "true") {
K.attr("#fit_check", "active", "true");
K.get("#fit_check").checked = true;
} else {
K.attr("#fit_check", "active", "false");
K.get("#fit_check").checked = false;
}
resize_toc();
if (last_links_check === "true") {
K.attr("#linkshow_check", "active", "true");
K.get("#linkshow_check").checked = true;
show_link_boxes(true);
} else {
K.attr("#linkshow_check", "active", "false");
K.get("#linkshow_check").checked = false;
}
/*
if (last_location) {
const parts = last_location.toString().split("#");
console.log("parts:");
console.log(parts);
//go_to_section(null, parts[1], parts[2]);
}
*/
/*
let hash = "#" + basename;
if (target) {
hash += "#" + target;
}
*/
//save_position();
/*
let last_location = localStorage.getItem("klammertext_location");
console.log("last_location from storage: " + last_location);
if (last_location && last_location != window.location.toString()) {
//history.replaceState(last_location.toString(), "");
const parts = last_location.toString().split("#");
const basename = parts[1];
const target = parts[2];
window.location.hash = "#" + basename + "#" + target;
console.log("last_location: " + basename + " " + target);
//go_to_section(null, basename, target);
let locator = "#toc .navlink[data-target='" + target + "'] .section-title-text";
console.log(locator);
let title = K.get(locator);
console.log("title");
console.log(title);
title.click();
}
*/
});
/*
function get_position() {
const basename = window.location.toString().split("#")[1];
return [basename, K.get("#text").scrollTop];
}
function set_position(basename, y) {
K.get("#text").innerHTML = K.get("#_page_" + basename).innerHTML;
K.get("#text").scrollTo(0, y);
}
*/