Section References & Minor style adjustment

This commit is contained in:
ef3d0c3e 2024-07-30 16:40:14 +02:00
parent b814c57355
commit 08ae603106
11 changed files with 145 additions and 56 deletions

32
docs/external/graphviz.nml vendored Normal file
View file

@ -0,0 +1,32 @@
@import ../template.nml
%<make_doc({"External Tools"}, "Graphviz", "Graphvis")>%
# Graphs from graphviz
[graph]
digraph {
bgcolor=transparent;
filelist [color=green, label="File List"];
doclist [color=green, label="Document List"];
iscached [shape=diamond, color=red, label="Cached?"];
parse [color=white, label=Parse];
compile [color=white, label=Compile];
cache [shape=box, color=blue, label=Cache];
edge [color=gray]
filelist -> iscached;
iscached -> cache[dir=both];
iscached -> doclist[label="+"];
iscached -> parse[label="No"];
parse -> compile;
compile -> cache[label="+"];
compile -> doclist[label="+"];
buildnav [color=white, label="Build Navigation"];
doclist -> buildnav;
output [color=white, label="Output"];
buildnav -> output;
}
[/graph]

View file

@ -1,8 +1,5 @@
@import ../template.nml @import ../template.nml
@compiler.output = latex.html %<make_doc({"External Tools"}, "LaTeX", "LaTeX")>%
@nav.title = LaTeX
@nav.category = External Tools
@html.page_title = Documentation | LaTeX
@LaTeX = $|[kind=inline, caption=LaTeX]\LaTeX|$ @LaTeX = $|[kind=inline, caption=LaTeX]\LaTeX|$

View file

@ -1,6 +1,4 @@
@import template.nml @import template.nml
@compiler.output = index.html %<make_doc({}, "Index", "Index")>%
@nav.title = Documentation
@html.page_title = Documentation | Index
# Welcome to the NML documentation! # Welcome to the NML documentation!

View file

@ -1,8 +1,5 @@
@import ../template.nml @import ../template.nml
@compiler.output = lua.html %<make_doc({"Lua"}, "Lua", "Lua Basics")>%
@nav.title = Lua
@nav.category = Lua
@html.page_title = Documentation | Lua
# Running lua code # Running lua code

View file

@ -1,8 +1,5 @@
@import ../template.nml @import ../template.nml
@compiler.output = basic.html %<make_doc({"Styles"}, "Basic", "Basic Styles")>%
@nav.title = Basic
@nav.category = Styles
@html.page_title = Documentation | Basic Styles
# Basic styles # Basic styles
## Bold ## Bold

View file

@ -1,7 +1,4 @@
@import ../template.nml @import ../template.nml
@compiler.output = user-defined.html %<make_doc({"Styles"}, "User-Defined", "User-Defined Styles")>%
@nav.title = User-Defined
@nav.category = Styles
@html.page_title = Documentation | User-Defined Styles
# TODO # TODO

View file

@ -6,3 +6,22 @@
\definecolor{__color1}{HTML}{d5d5d5} \\ \definecolor{__color1}{HTML}{d5d5d5} \\
\everymath{\color{__color1}\displaystyle} \everymath{\color{__color1}\displaystyle}
@tex.main.block_prepend = \color{__color1} @tex.main.block_prepend = \color{__color1}
@<
function make_doc(categories, title, page_title)
-- Navigation
nml.variable.insert("nav.title", title)
if categories[1] ~= nil
then
nml.variable.insert("nav.category", categories[1])
if categories[2] ~= nil
then
nml.variable.insert("nav.subcategory", categories[2])
end
end
-- HTML
nml.variable.insert("html.page_title", "NML | " .. page_title)
nml.variable.insert("compiler.output", page_title .. ".html")
end
>@

View file

@ -38,6 +38,24 @@ impl Compiler {
} }
} }
/// Sanitizes text for a [`Target`]
pub fn sanitize<S: AsRef<str>>(target: Target, str: S) -> String {
match target {
Target::HTML => str
.as_ref()
.replace("&", "&amp;")
.replace("<", "&lt;")
.replace(">", "&gt;")
.replace("\"", "&quot;"),
_ => todo!("Sanitize not implemented"),
}
}
/// Gets a reference name
pub fn refname<S: AsRef<str>>(target: Target, str: S) -> String {
Self::sanitize(target, str).replace(' ', "_")
}
/// Inserts or get a reference id for the compiled document /// Inserts or get a reference id for the compiled document
/// ///
/// # Parameters /// # Parameters
@ -74,18 +92,6 @@ impl Compiler {
self.cache.as_ref().map(RefCell::borrow_mut) self.cache.as_ref().map(RefCell::borrow_mut)
} }
pub fn sanitize<S: AsRef<str>>(target: Target, str: S) -> String {
match target {
Target::HTML => str
.as_ref()
.replace("&", "&amp;")
.replace("<", "&lt;")
.replace(">", "&gt;")
.replace("\"", "&quot;"),
_ => todo!("Sanitize not implemented"),
}
}
pub fn header(&self, document: &dyn Document) -> String { pub fn header(&self, document: &dyn Document) -> String {
pub fn get_variable_or_error( pub fn get_variable_or_error(
document: &dyn Document, document: &dyn Document,
@ -109,8 +115,11 @@ impl Compiler {
result += "<!DOCTYPE HTML><html><head>"; result += "<!DOCTYPE HTML><html><head>";
result += "<meta charset=\"UTF-8\">"; result += "<meta charset=\"UTF-8\">";
if let Some(page_title) = get_variable_or_error(document, "html.page_title") { if let Some(page_title) = get_variable_or_error(document, "html.page_title") {
result += format!("<title>{}</title>", Compiler::sanitize(self.target(), page_title.to_string())) result += format!(
.as_str(); "<title>{}</title>",
Compiler::sanitize(self.target(), page_title.to_string())
)
.as_str();
} }
if let Some(css) = document.get_variable("html.css") { if let Some(css) = document.get_variable("html.css") {
@ -120,7 +129,7 @@ impl Compiler {
) )
.as_str(); .as_str();
} }
result += r#"</head><body><div id="layout">"#; result += r#"</head><body><div class="layout">"#;
// TODO: TOC // TODO: TOC
// TODO: Author, Date, Title, Div // TODO: Author, Date, Title, Div
@ -148,7 +157,7 @@ impl Compiler {
let header = self.header(document); let header = self.header(document);
// Body // Body
let mut body = r#"<div id="content">"#.to_string(); let mut body = r#"<div class="content">"#.to_string();
for i in 0..borrow.len() { for i in 0..borrow.len() {
let elem = &borrow[i]; let elem = &borrow[i];

View file

@ -23,7 +23,7 @@ impl NavEntry {
let mut result = String::new(); let mut result = String::new();
match target { match target {
Target::HTML => { Target::HTML => {
result += r#"<div id="navbar"><ul>"#; result += r#"<div class="navbar"><ul>"#;
fn process( fn process(
target: Target, target: Target,

View file

@ -38,11 +38,14 @@ impl Element for Section {
fn as_referenceable(&self) -> Option<&dyn ReferenceableElement> { Some(self) } fn as_referenceable(&self) -> Option<&dyn ReferenceableElement> { Some(self) }
fn compile(&self, compiler: &Compiler, _document: &dyn Document) -> Result<String, String> { fn compile(&self, compiler: &Compiler, _document: &dyn Document) -> Result<String, String> {
match compiler.target() { match compiler.target() {
Target::HTML => Ok(format!( Target::HTML => {
"<h{0}>{1}</h{0}>", Ok(format!(
r#"<h{0} id="{1}">{2}</h{0}>"#,
self.depth, self.depth,
Compiler::refname(compiler.target(), self.title.as_str()),
Compiler::sanitize(compiler.target(), self.title.as_str()) Compiler::sanitize(compiler.target(), self.title.as_str())
)), ))
},
Target::LATEX => Err("Unimplemented compiler".to_string()), Target::LATEX => Err("Unimplemented compiler".to_string()),
} }
} }
@ -56,11 +59,27 @@ impl ReferenceableElement for Section {
fn compile_reference( fn compile_reference(
&self, &self,
compiler: &Compiler, compiler: &Compiler,
document: &dyn Document, _document: &dyn Document,
reference: &super::reference::Reference, reference: &super::reference::Reference,
refid: usize, _refid: usize,
) -> Result<String, String> { ) -> Result<String, String> {
todo!() match compiler.target() {
Target::HTML => {
let caption = reference.caption().map_or(
format!(
"({})",
Compiler::sanitize(compiler.target(), self.title.as_str())
),
|cap| cap.clone(),
);
Ok(format!(
"<a class=\"section-ref\" href=\"#{}\">{caption}</a>",
Compiler::refname(compiler.target(), self.title.as_str())
))
}
_ => todo!(""),
}
} }
} }

View file

@ -2,9 +2,19 @@ body {
background-color: #1b1b1d; background-color: #1b1b1d;
color: #c5c5c5; color: #c5c5c5;
font-family: sans-serif; font-family: sans-serif;
margin: 0;
padding: 0;
}
max-width: 90ch; .layout {
display: flex;
}
.content {
max-width: 99ch;
margin: 0 auto; margin: 0 auto;
padding: 0;
width: 100%;
} }
/* Styles */ /* Styles */
@ -29,13 +39,18 @@ a.inline-code {
} }
/* Navbar */ /* Navbar */
#navbar { .navbar {
display: none;
left: 0; left: 0;
top: 0; top: 0;
bottom: 0; bottom: 0;
width: max(16vw, 20ch); width: max(calc((100vw - 99ch) / 2 - 15vw), 24ch);
height: 100vh;
position: fixed;
margin-right: 1em;
overflow-y: auto; overflow-y: auto;
position: absolute;
box-sizing: border-box; box-sizing: border-box;
overscroll-behavior-y: contain; overscroll-behavior-y: contain;
@ -46,44 +61,53 @@ a.inline-code {
font-weight: bold; font-weight: bold;
} }
#navbar a { @media (min-width: 130ch) {
.navbar {
display: block;
}
.container {
flex-direction: row;
}
}
.navbar a {
color: #ffb454; color: #ffb454;
text-decoration: none; text-decoration: none;
font-weight: normal; font-weight: normal;
} }
#navbar li { .navbar li {
display: block; display: block;
position: relative; position: relative;
padding-left: 1em; padding-left: 1em;
margin-left: 0em; margin-left: 0em;
} }
#navbar ul { .navbar ul {
margin-left: 0em; margin-left: 0em;
padding-left: 0; padding-left: 0;
} }
#navbar summary{ .navbar summary{
display: block; display: block;
cursor: pointer; cursor: pointer;
} }
#navbar summary::marker, .navbar summary::marker,
#navbar summary::-webkit-details-marker{ .navbar summary::-webkit-details-marker{
display: none; display: none;
} }
#navbar summary:focus{ .navbar summary:focus{
outline: none; outline: none;
} }
#navbar summary:focus-visible{ .navbar summary:focus-visible{
outline: 1px dotted #000; outline: 1px dotted #000;
} }
#navbar summary:before { .navbar summary:before {
content: "+"; content: "+";
color: #ffb454; color: #ffb454;
float: left; float: left;
@ -91,7 +115,7 @@ a.inline-code {
width: 1em; width: 1em;
} }
#navbar details[open] > summary:before { .navbar details[open] > summary:before {
content: ""; content: "";
} }