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:
49
sks/link/css/link.css
Normal file
49
sks/link/css/link.css
Normal file
@@ -0,0 +1,49 @@
|
||||
:root {
|
||||
--link-blue: #042B8C; /* #03216C; */
|
||||
|
||||
|
||||
/* #073DCA */
|
||||
}
|
||||
|
||||
a {
|
||||
color: var(--link-blue);
|
||||
}
|
||||
|
||||
a, a:link, a:visited {
|
||||
outline: 0;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
text-underline-offset: 0.2em;
|
||||
text-decoration-thickness: 1px;
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
/* In book structure (identified by the presence of #nav), section heading
|
||||
links in the text area behave like normal text: no underline, text-selection
|
||||
cursor, no drag. The TOC is always visible in the side pane, so the
|
||||
heading links are not useful for navigation.
|
||||
In article structure (no #nav), headings are links back to the TOC at
|
||||
the top of the page, so they retain normal link behavior. */
|
||||
body:has(#nav) #text a[href^="#_c"] {
|
||||
cursor: text;
|
||||
user-select: text;
|
||||
-webkit-user-drag: none;
|
||||
}
|
||||
|
||||
body:has(#nav) #text a[href^="#_c"]:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.pagelink {
|
||||
color: var(--link-blue);
|
||||
cursor: pointer;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.pagelink:hover {
|
||||
text-decoration: underline;
|
||||
outline: 0;
|
||||
}
|
||||
1
sks/link/css/list.txt
Normal file
1
sks/link/css/list.txt
Normal file
@@ -0,0 +1 @@
|
||||
link.css
|
||||
12
sks/link/js/link.js
Normal file
12
sks/link/js/link.js
Normal file
@@ -0,0 +1,12 @@
|
||||
|
||||
function set_link_listeners() {
|
||||
Array.from(document.getElementsByClassName("pagelink")).forEach(
|
||||
function (elt) {
|
||||
elt.addEventListener("click", function(event) {
|
||||
let basename = elt.getAttribute("data-page");
|
||||
let id = elt.getAttribute("data-id");
|
||||
go_to_section(elt, basename, id);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
79
sks/link/link.k
Executable file
79
sks/link/link.k
Executable file
@@ -0,0 +1,79 @@
|
||||
@@link target
|
||||
:text
|
||||
:footnote.bool false
|
||||
:section.bool false
|
||||
:nq.bool false
|
||||
:basename # xxx
|
||||
:code # xxx
|
||||
:phrase # xxx
|
||||
:dox # xxx
|
||||
:doxanchor # xxx
|
||||
:id # xxx
|
||||
:
|
||||
@eval link.Link(K) eval@
|
||||
@@
|
||||
|
||||
@@target id :text :
|
||||
@eval link.Target(K) eval@
|
||||
@@
|
||||
|
||||
@@email name | domain :subject :body :
|
||||
@eval link.Email(K) eval@
|
||||
@@
|
||||
|
||||
#[
|
||||
@@@category link
|
||||
target link
|
||||
:desc Links @@@
|
||||
|
||||
@@target.doc id :text :
|
||||
Link target in page is @i-name, with optional @i-text for target @@
|
||||
|
||||
@@target : @eval link.target(K) eval@ @@
|
||||
|
||||
@@link.doc url
|
||||
:text
|
||||
:download.bool false
|
||||
:mail.bool false
|
||||
:nopage.bool false
|
||||
:section.bool false
|
||||
:pageonly.bool false
|
||||
:footnote.bool true
|
||||
:in_footnote.bool false
|
||||
:dox.bool false
|
||||
:abs.bool false
|
||||
:add_number.bool false
|
||||
:
|
||||
Link to @i-url using @i-text for display, or @i-url if @i-text is not
|
||||
specified. If :section is true, the @i-url is the text of a section
|
||||
title.
|
||||
@@
|
||||
|
||||
@@link : @eval link.link(K) eval@ @@
|
||||
|
||||
@@subpage kt_basename
|
||||
:pagetitle
|
||||
:sectiontitle
|
||||
:linktext
|
||||
:index
|
||||
:toc.bool true
|
||||
:logo
|
||||
:include
|
||||
:prevlink
|
||||
:nextlink
|
||||
:uplink
|
||||
:logo
|
||||
:top_level.int
|
||||
:href_base
|
||||
:search.bool false
|
||||
:
|
||||
@eval link.subpage(K) eval@ @@
|
||||
|
||||
@@subpages.html s :
|
||||
<!--toc-->
|
||||
*s*
|
||||
<!--toc-->
|
||||
@@
|
||||
|
||||
@@subpages.latex s : *s* @@
|
||||
]#
|
||||
115
sks/link/link.py
Executable file
115
sks/link/link.py
Executable file
@@ -0,0 +1,115 @@
|
||||
import re
|
||||
import os
|
||||
import tempfile
|
||||
import sys
|
||||
import klammer_base
|
||||
import urllib
|
||||
import kutil
|
||||
|
||||
def html_link(target, link_text, is_section, no_quotation_marks):
|
||||
# [__link__target__text__]
|
||||
if not link_text:
|
||||
if is_section:
|
||||
link_text = target if no_quotation_marks else f"“{target}”"
|
||||
else:
|
||||
# Allow long URLs to break at a slash:
|
||||
link_text = re.sub('/', '/<wbr>', target)
|
||||
link_text = re.sub('/<wbr>/<wbr>', '//', link_text)
|
||||
link_text = f'<tt>{link_text}</tt>'
|
||||
target = f"[{target}]" if is_section else target
|
||||
#result = f"[__link__{target}__{link_text}__]"
|
||||
#return result
|
||||
|
||||
if target.startswith("http") or ".html" in target:
|
||||
url = target
|
||||
elif is_section:
|
||||
url = f"__sectionlink__{target}__"
|
||||
else:
|
||||
url = f"^#{target}"
|
||||
result = f'<a href="{url}">{link_text}</a>'
|
||||
return result
|
||||
|
||||
def add_latex_footnote_if_necessary(url, link_text):
|
||||
result = ""
|
||||
if (('http://' in url or 'https://' in url) and
|
||||
('http://' not in link_text and 'https://' not in link_text)):
|
||||
escaped_url = re.sub('#', '\\#', url)
|
||||
escaped_url = re.sub('%', '\\%', escaped_url)
|
||||
result += f'\\footnote{{\\\rule{{0pt}}{{12pt}}\\texttt{{{escaped_url}}}}}'
|
||||
return result
|
||||
|
||||
def latex_link(target, link_text, is_section, no_quotation_marks, add_footnote):
|
||||
if target.startswith("http"):
|
||||
if link_text and link_text != "URL":
|
||||
result = f"#/ \\href{{{target}}}{{{link_text}}} #/"
|
||||
else:
|
||||
#result = f"\\\url{{{target}}}"
|
||||
result = f"#/ \\href{{{target}}}{{{target}}} #/"
|
||||
elif is_section:
|
||||
if not link_text:
|
||||
link_text = target if no_quotation_marks else f"``{target}''"
|
||||
result = f"\\hyperlink{{__seclink__{target}__}}{{{link_text}}}"
|
||||
else:
|
||||
result = f"\\hyperlink{{{target}}}{{{link_text}}}"
|
||||
# if add_footnote:
|
||||
# if self.footnote:
|
||||
# result += add_latex_footnote_if_necessary(target, link_text)
|
||||
# print(result)
|
||||
return result
|
||||
|
||||
class Link(klammer_base.Klammer_base):
|
||||
def __init__(self, K):
|
||||
super().__init__(K)
|
||||
# self.show("Link")
|
||||
|
||||
def html(self):
|
||||
return html_link(self.target, self.text, self.section == "true", self.nq)
|
||||
|
||||
def tex(self):
|
||||
return latex_link(self.target, self.text, self.section, self.nq, self.footnote)
|
||||
|
||||
def txt(self):
|
||||
text = f'{self.text} ' if self.text else ''
|
||||
return f'{text}[{self.url}]'
|
||||
|
||||
class Target(klammer_base.Klammer_base):
|
||||
def __init__(self, K):
|
||||
super().__init__(K)
|
||||
id = K.id.strip()
|
||||
id = re.compile(r'\s+', re.S).sub('-', id)
|
||||
self.id = re.sub('_', '-', id)
|
||||
|
||||
def html(self):
|
||||
id = self.id.split(':')[-1]
|
||||
return f'<span id="{id}">{self.text}</span>'
|
||||
|
||||
def tex(self):
|
||||
result = f'\\hypertarget{{{self.id}}}{{{self.text}}}'
|
||||
#result += '\\label{{{}-label}}'.format(id)
|
||||
return result
|
||||
|
||||
def txt(self):
|
||||
return ""
|
||||
|
||||
|
||||
class Email(klammer_base.Klammer_base):
|
||||
def __init__(self, K):
|
||||
super().__init__(K)
|
||||
|
||||
def html(self):
|
||||
def val(attr, s):
|
||||
return "{}={}&".format(attr, re.sub(" ", "%20", s))
|
||||
domain = "&^#46;".join(self.domain.split("."))
|
||||
address = "{}&^#64;{}".format(self.name, domain)
|
||||
href = "mailto&^#58;{}?".format(address)
|
||||
if self.subject:
|
||||
href += val("subject", self.subject)
|
||||
if self.body:
|
||||
href += val("body", self.body)
|
||||
href = href[:-1]
|
||||
result = '<a href="{}">{}</a>'.format(href, address)
|
||||
return result
|
||||
|
||||
def tex(self):
|
||||
return r'\texttt{{{}^@{}}}'.format(self.name, self.domain)
|
||||
|
||||
13
sks/link/sty/link.sty
Normal file
13
sks/link/sty/link.sty
Normal file
@@ -0,0 +1,13 @@
|
||||
\usepackage{hyperref}
|
||||
|
||||
\hypersetup{
|
||||
colorlinks=true,
|
||||
urlcolor=LinkBlue,
|
||||
linkcolor=LinkBlue,
|
||||
pdfversion=1.7,
|
||||
% implicit=false
|
||||
}
|
||||
|
||||
\usepackage{footnote}
|
||||
\usepackage[bottom,flushmargin]{footmisc}
|
||||
\setlength{\footnotesep}{10pt}
|
||||
Reference in New Issue
Block a user