diff --git a/docs/external/latex.nml b/docs/external/latex.nml
new file mode 100644
index 0000000..a2cffe6
--- /dev/null
+++ b/docs/external/latex.nml
@@ -0,0 +1,96 @@
+@import docs/template.nml
+@compiler.output = latex.html
+@nav.title = LaTeX
+@nav.category = External Tools
+@html.page_title = Documentation | LaTeX
+
+@LaTeX = $|[kind=inline]\LaTeX|$
+
+*Bring some %LaTeX% unto your document!*
+
+# Inline Math
+
+You can add inline math by enclosing %LaTeX% between two ``$``:
+ * ``$\lim_{n \to \infty} \Big(1 + \frac{1}{n}\Big)^n = e$`` → $\lim_{n \to \infty} \Big(1 + \frac{1}{n}\Big)^n = e$
+ * ``$\pi = \sqrt{\sum_{n=1}^\infty \frac{1}{n^2}}$`` → $\pi = \sqrt{\sum_{n=1}^\infty \frac{1}{n^2}}$
+
+You can make the %LaTeX% non inline by specifying `kind=block` in it's property: ``$[kind=block] 1+1=2$`` → $[kind=block] 1+1=2$
+*(notice how it's not inside a paragraph)*
+
+# Non Math LaTeX
+
+You can write %LaTeX% outside of %LaTeX%'s math environment, by enclosing your code between ``$|...|$``:
+``LaTeX,
+$|\begin{tikzpicture}
+ \begin{axis}
+ \addplot3[patch,patch refines=3,
+ shader=faceted interp,
+ patch type=biquadratic]
+ table[z expr=x^2-y^2]
+ {
+ x y
+ -2 -2
+ 2 -2
+ 2 2
+ -2 2
+ 0 -2
+ 2 0
+ 0 2
+ -2 0
+ 0 0
+ };
+ \end{axis}
+\end{tikzpicture}|$
+``
+Gives the following:
+
+$|\begin{tikzpicture}
+ \begin{axis}
+ \addplot3[patch,patch refines=3,
+ shader=faceted interp,
+ patch type=biquadratic]
+ table[z expr=x^2-y^2]
+ {
+ x y
+ -2 -2
+ 2 -2
+ 2 2
+ -2 2
+ 0 -2
+ 2 0
+ 0 2
+ -2 0
+ 0 0
+ };
+ \end{axis}
+\end{tikzpicture}|$
+
+# LaTeX environment
+
+You can define multiple %LaTeX% environment, the default being `main`
+ * ``@tex.env.fontsize`` The fontsize (in pt) specified to `latex2svg` (default: `12`).
+ * ``@tex.env.preamble`` The preamble prepended to every %LaTeX% code.
+ * ``@tex.env.block_prepend`` Text to prepend to every non math %LaTeX% code.
+ * ``@tex.env.exec`` The `latex2svg` executable path, defaults to `latex2svg` (need to be in your `\$PATH`)
+Replace ``env`` with the name of the custom environment you wish to define.
+
+Here's a preamble to render %LaTeX% gray:
+``
+@tex.main.fontsize = 9
+@tex.main.preamble = \usepackage{xcolor} \\
+\usepgfplotslibrary{patchplots} \\
+\definecolor{__color1}{HTML}{d5d5d5} \\
+\everymath{\color{__color1}}
+@tex.main.block_prepend = \color{__color1}
+``
+
+To set the environment you wish to use for a particular %LaTeX% element, set the `env` property:
+ * ``$[env=main] 1+1 = 2$`` → $[env=main] 1+1 = 2$
+ * ``$[env=other] 1+1 = 2$`` → $[env=other] 1+1 = 2$
+
+
+# LaTeX cache
+
+%LaTeX% elements that have been successfully rendered to **svg** are stored in the cache database, to avoid processing them a second time.
+Note that this cache is shared between documents, so you don't need to reprocess them if they share the same environment.
+They are stored under the table named ``cached_tex``, if you modify the `env` all elements will be reprocessed which may take a while...
diff --git a/docs/index.nml b/docs/index.nml
new file mode 100644
index 0000000..e316267
--- /dev/null
+++ b/docs/index.nml
@@ -0,0 +1,6 @@
+@import docs/template.nml
+@compiler.output = index.html
+@nav.title = Documentation
+@html.page_title = Documentation | Index
+
+# Welcome to the NML documentation!
diff --git a/docs/lua/lua.nml b/docs/lua/lua.nml
new file mode 100644
index 0000000..e13eecc
--- /dev/null
+++ b/docs/lua/lua.nml
@@ -0,0 +1,20 @@
+@import docs/template.nml
+@compiler.output = lua.html
+@nav.title = Lua
+@nav.category = Lua
+@html.page_title = Documentation | Lua
+
+# Running lua code
+
+Running lua code is done using the following syntax:
+``Lua, %<print("Hello World!")>%``
+
+## Lua to text
+To convert the return value of your lua code, append ``"`` at the start of your lua expression:
+ * ``Lua, %<"return "Hello World">%`` → %<"return "Hello World">%
+ * ``Lua, %<" "Hello, " .. "World">%`` → %<" "Hello, " .. "World">%
+
+## Parse lua string
+Additionnaly, you can output lua to be parsed by the document's parser. To do so, append ``!`` at the start of your lua expression:
+ * ``Lua, %<!"**" .. "Bold from lua?" .. "**">%`` → %<!"**" .. "Bold from lua?" .. "**">%
+ * ``Lua, %<!"[" .. "Link from Lua" .. "](#)">%`` → %<!"[" .. "Link from Lua" .. "](#)">%
diff --git a/docs/styles/basic.nml b/docs/styles/basic.nml
new file mode 100644
index 0000000..6d11646
--- /dev/null
+++ b/docs/styles/basic.nml
@@ -0,0 +1,31 @@
+@import docs/template.nml
+@compiler.output = basic.html
+@nav.title = Basic
+@nav.category = Styles
+@html.page_title = Documentation | Basic Styles
+
+# Basic styles
+## Bold
+
+Enclose text between two ``**`` to render it **bold**!
+ * ``**Bold text**`` → **Bold text**
+ * ``**Bold [link](#)**`` → **Bold [link](#)**
+
+## Italic
+
+Enclose text between two ``*`` to render it *italic*!
+ * ``*Italic text*`` → *Italic text*
+ * ``**Bold + *Italic***`` → **Bold + *Italic***
+
+## Underline
+
+Enclose text between two ``__`` to render it __underlined__!
+ * ``__Underlined text__`` → __Underlined text__
+ * ``__Underline + *Italic*__`` → __Underline + *Italic*__
+
+## Highlighted
+
+Enclose text between two `` ` `` to render it `overlined`!
+ * `` `Highlighted text` `` → `Highlighted text`
+ * `` `Highlight + **Bold**` `` → `Highlight + **Bold**`
+
diff --git a/docs/styles/user-defined.nml b/docs/styles/user-defined.nml
new file mode 100644
index 0000000..7847a56
--- /dev/null
+++ b/docs/styles/user-defined.nml
@@ -0,0 +1,7 @@
+@import docs/template.nml
+@compiler.output = user-defined.html
+@nav.title = User-Defined
+@nav.category = Styles
+@html.page_title = Documentation | User-Defined Styles
+
+# TODO
diff --git a/docs/template.nml b/docs/template.nml
new file mode 100644
index 0000000..5d9a977
--- /dev/null
+++ b/docs/template.nml
@@ -0,0 +1,8 @@
+@'html.css = style.css
+
+@tex.main.fontsize = 9
+@tex.main.preamble = \usepackage{xcolor, tikz, pgfplots} \\
+\usepgfplotslibrary{patchplots} \\
+\definecolor{__color1}{HTML}{d5d5d5} \\
+\everymath{\color{__color1}\displaystyle}
+@tex.main.block_prepend = \color{__color1}
diff --git a/src/compiler/navigation.rs b/src/compiler/navigation.rs
index 5c19316..395a73f 100644
--- a/src/compiler/navigation.rs
+++ b/src/compiler/navigation.rs
@@ -144,7 +144,5 @@ pub fn create_navigation(docs: &Vec<CompiledDocument>) -> Result<NavEntry, Strin
pent.entries.push((title.clone(), path.clone()))
}
- println!("{nav:#?}");
-
Ok(nav)
}
diff --git a/src/elements/code.rs b/src/elements/code.rs
index 09eceed..132e91f 100644
--- a/src/elements/code.rs
+++ b/src/elements/code.rs
@@ -321,7 +321,7 @@ impl CodeRule {
)
.unwrap(),
Regex::new(
- r"``(?:\[((?:\\.|[^\[\]\\])*?)\])?(?:(.*?)(?:\n|,))?((?:\\(?:.|\n)|[^\\\\])*?)``",
+ r"``(?:\[((?:\\.|[^\\\\])*?)\])?(?:(.*?),)?((?:\\(?:.|\n)|[^\\\\])*?)``",
)
.unwrap(),
],
diff --git a/src/elements/variable.rs b/src/elements/variable.rs
index 60fba59..bd8488d 100644
--- a/src/elements/variable.rs
+++ b/src/elements/variable.rs
@@ -13,7 +13,7 @@ pub struct VariableRule {
impl VariableRule {
pub fn new() -> Self {
Self {
- re: [Regex::new(r"(?:^|\n)@([^[:alpha:]])?(.*)=((?:\\\n|.)*)").unwrap()],
+ re: [Regex::new(r"(?:^|\n)@([^[:alpha:]])?(.*?)=((?:\\\n|.)*)").unwrap()],
kinds: vec![
("".into(), "Regular".into()),
("'".into(), "Path".into())
@@ -89,8 +89,6 @@ impl RegexRule for VariableRule {
fn regexes(&self) -> &[Regex] { &self.re }
-
-
fn on_regex_match<'a>(&self, _: usize, parser: &dyn Parser, document: &'a dyn Document, token: Token, matches: regex::Captures) -> Vec<Report<'_, (Rc<dyn Source>, Range<usize>)>>
{
let mut result = vec![];
diff --git a/src/main.rs b/src/main.rs
index 6a7f824..eb7e1eb 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -91,6 +91,7 @@ fn process(
target: Target,
files: Vec<String>,
db_path: &Option<String>,
+ force_rebuild: bool,
debug_opts: &Vec<String>,
) -> Result<Vec<CompiledDocument>, String> {
let mut compiled = vec![];
@@ -127,15 +128,19 @@ fn process(
Ok(compiled)
};
- let cdoc = match CompiledDocument::from_cache(&con, &file) {
- Some(compiled) => {
- if compiled.mtime < modified.duration_since(UNIX_EPOCH).unwrap().as_secs() {
- parse_and_compile()?
- } else {
- compiled
+ let cdoc = if force_rebuild {
+ parse_and_compile()?
+ } else {
+ match CompiledDocument::from_cache(&con, &file) {
+ Some(compiled) => {
+ if compiled.mtime < modified.duration_since(UNIX_EPOCH).unwrap().as_secs() {
+ parse_and_compile()?
+ } else {
+ compiled
+ }
}
+ None => parse_and_compile()?,
}
- None => parse_and_compile()?,
};
compiled.push(cdoc);
@@ -152,6 +157,7 @@ fn main() -> ExitCode {
opts.optopt("i", "input", "Input path", "PATH");
opts.optopt("o", "output", "Output path", "PATH");
opts.optopt("d", "database", "Cache database location", "PATH");
+ opts.optflag("", "force-rebuild", "Force rebuilding of cached documents");
opts.optmulti("z", "debug", "Debug options", "OPTS");
opts.optflag("h", "help", "Print this help menu");
opts.optflag("v", "version", "Print program version and licenses");
@@ -204,8 +210,9 @@ fn main() -> ExitCode {
}
}
- let debug_opts = matches.opt_strs("z");
let db_path = matches.opt_str("d");
+ let force_rebuild = matches.opt_present("force-rebuild");
+ let debug_opts = matches.opt_strs("z");
let mut files = vec![];
if input_meta.is_dir() {
@@ -257,7 +264,7 @@ fn main() -> ExitCode {
}
// Parse, compile using the cache
- let compiled = match process(Target::HTML, files, &db_path, &debug_opts) {
+ let compiled = match process(Target::HTML, files, &db_path, force_rebuild, &debug_opts) {
Ok(compiled) => compiled,
Err(e) => {
eprintln!("{e}");
@@ -283,7 +290,7 @@ fn main() -> ExitCode {
Some(path) => path.clone(),
None => {
eprintln!("Unable to get output file for `{}`", doc.input);
- return ExitCode::FAILURE;
+ continue;
}
};
@@ -292,11 +299,7 @@ fn main() -> ExitCode {
let file = std::fs::File::create(output.clone() + "/" + out_path.as_str()).unwrap();
let mut writer = BufWriter::new(file);
- write!(
- writer,
- "{}{}{}{}",
- doc.header, nav, doc.body, doc.footer
- ).unwrap();
+ write!(writer, "{}{}{}{}", doc.header, nav, doc.body, doc.footer).unwrap();
writer.flush().unwrap();
}