Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
373 changes: 10 additions & 363 deletions Cargo.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ regex = "1"
serde = { version = "1", features = ["derive"] }
serde_json = "1.0"
serde_with = "3"
tera = "1"
tera = "2"
thiserror = "2"
usage-lib = { workspace = true, features = ["clap", "docs", "unstable_choices_env"] }
xx = "2"
Expand Down
2 changes: 1 addition & 1 deletion lib/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ roff = { version = "1.0", optional = true }
serde = { version = "1", features = ["derive"] }
shell-words = "1"
strum = { version = "0.28", features = ["derive"] }
tera = { version = "1", optional = true }
tera = { version = "2", optional = true }
thiserror = "2"
versions = "7"
xx = "2"
Expand Down
34 changes: 24 additions & 10 deletions lib/src/docs/cli/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,22 +22,36 @@ pub fn render_help(spec: &Spec, cmd: &SpecCommand, long: bool) -> String {
static TERA: LazyLock<Tera> = LazyLock::new(|| {
let mut tera = Tera::default();

#[rustfmt::skip]
tera.add_raw_templates([
("spec_template_short.tera", include_str!("templates/spec_template_short.tera")),
("spec_template_long.tera", include_str!("templates/spec_template_long.tera")),
]).unwrap();

// Register ljust filter for left-justifying text with padding
tera.register_filter(
"ljust",
|value: &tera::Value, args: &std::collections::HashMap<String, tera::Value>| {
|value: &tera::Value, args: tera::Kwargs, _: &tera::State| -> tera::TeraResult<String> {
let value = value.as_str().unwrap_or("");
let width = args.get("width").and_then(|v| v.as_u64()).unwrap_or(0) as usize;
let result = format!("{:<width$}", value, width = width);
Ok(result.into())
let width = args.get::<u64>("width")?.unwrap_or(0) as usize;
Ok(format!("{:<width$}", value, width = width))
},
);
tera.register_filter(
"default",
|value: &tera::Value,
kwargs: tera::Kwargs,
_: &tera::State|
-> tera::TeraResult<tera::Value> {
let default_val = kwargs.must_get::<tera::Value>("value")?;
let boolean = kwargs.get::<bool>("boolean")?.unwrap_or_default();
if value.is_undefined() || value.is_none() || (boolean && !value.is_truthy()) {
Ok(default_val)
} else {
Ok(value.clone())
}
},
);

#[rustfmt::skip]
tera.add_raw_templates([
("spec_template_short.tera", include_str!("templates/spec_template_short.tera")),
("spec_template_long.tera", include_str!("templates/spec_template_long.tera")),
]).unwrap();

tera
});
Expand Down
8 changes: 4 additions & 4 deletions lib/src/docs/cli/templates/spec_template_long.tera
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@
{% elif spec.about %}{{ spec.about }}

{% endif -%}
Usage: {{ spec.bin ~ " " ~ cmd.usage | trim }}
Usage: {{ (spec.bin ~ " " ~ cmd.usage) | trim }}

{%- if cmd.subcommands %}

Commands:
{%- for name, cmd in cmd.subcommands %}
{%- for cmd in cmd.subcommands | values | sort(attribute="usage") %}
{{ cmd.usage | trim }}
{%- if cmd.deprecated %} [deprecated: {{ cmd.deprecated }}]{%- endif %}
{%- if cmd.aliases %} [aliases: {{ cmd.aliases | join(sep=", ") }}]{% endif %}
Expand All @@ -46,7 +46,7 @@ Arguments:
{{ arg.usage | trim }}
{%- set help = arg.help_long | default(value=arg.help | default(value='')) %}
{%- if help %}
{{ help | indent(width=2) }}
{{ help | indent(width=4) }}
{%- endif %}
{%- endif %}
{%- if arg.choices and arg.choices.choices %}
Expand Down Expand Up @@ -78,7 +78,7 @@ Flags:
{%- if flag.aliases %} [aliases: {{ flag.aliases | join(sep=", ") }}]{% endif %}
{%- set help = flag.help_long | default(value=flag.help | default(value='')) %}
{%- if help %}
{{ help | indent(width=2) }}
{{ help | indent(width=4) }}
{%- endif %}
{%- endif %}
{%- if flag.arg.choices and flag.arg.choices.choices %}
Expand Down
4 changes: 2 additions & 2 deletions lib/src/docs/cli/templates/spec_template_short.tera
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@
{%- if spec.about %}{{ spec.about }}

{% endif -%}
Usage: {{ spec.bin ~ " " ~ cmd.usage | trim }}
Usage: {{ (spec.bin ~ " " ~ cmd.usage) | trim }}

{%- if cmd.subcommands %}

Commands:
{%- for name, cmd in cmd.subcommands %}
{%- for cmd in cmd.subcommands | values | sort(attribute="usage") %}
{{ cmd.usage | trim }}
{%- if cmd.deprecated %} [deprecated: {{ cmd.deprecated }}]{%- endif %}
{%- if cmd.aliases %} [aliases: {{ cmd.aliases | join(sep=", ") }}]{% endif %}
Expand Down
43 changes: 6 additions & 37 deletions lib/src/docs/markdown/renderer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ use crate::docs::models::Spec;
use crate::error::UsageErr;
use itertools::Itertools;
use serde::Serialize;
use std::collections::HashMap;
use xx::regex;

#[derive(Debug, Clone)]
pub struct MarkdownRenderer {
Expand Down Expand Up @@ -60,7 +58,7 @@ impl MarkdownRenderer {
}

pub(crate) fn insert<T: Serialize + ?Sized, S: Into<String>>(&mut self, key: S, val: &T) {
self.tera_ctx.insert(key, val);
self.tera_ctx.insert(key.into(), val);
}

fn tera_ctx(&self) -> tera::Context {
Expand All @@ -79,7 +77,10 @@ impl MarkdownRenderer {
let html_encode = self.html_encode;
tera.register_filter(
"escape_md",
move |value: &tera::Value, _: &HashMap<String, tera::Value>| {
move |value: &tera::Value,
_: tera::Kwargs,
_: &tera::State|
-> tera::TeraResult<String> {
let value = value.as_str().unwrap();
let value = value
.lines()
Expand All @@ -99,41 +100,9 @@ impl MarkdownRenderer {
.to_string()
})
.join("\n");
Ok(value.into())
Ok(value)
},
);
let path_re =
regex!(r"https://(github.com/[^/]+/[^/]+|gitlab.com/[^/]+/[^/]+/-)/blob/[^/]+/");
tera.register_function("source_code_link", |args: &HashMap<String, tera::Value>| {
let spec = args.get("spec").unwrap().as_object().unwrap();
let cmd = args.get("cmd").unwrap().as_object().unwrap();
let full_cmd = cmd.get("full_cmd").unwrap().as_array();
let source_code_link_template = spec
.get("source_code_link_template")
.and_then(|v| v.as_str());
if let (Some(full_cmd), Some(source_code_link_template)) =
(full_cmd, source_code_link_template)
{
if full_cmd.is_empty() {
return Ok("".into());
}
let mut ctx = tera::Context::new();
let path = full_cmd.iter().map(|v| v.as_str().unwrap()).join("/");
ctx.insert("spec", spec);
ctx.insert("cmd", cmd);
ctx.insert("path", &path);
let href = TERA.clone().render_str(source_code_link_template, &ctx)?;
let friendly = path_re.replace_all(&href, "").to_string();
let link = if path_re.is_match(&href) {
format!("[`{friendly}`]({href})")
} else {
format!("[{friendly}]({href})")
};
Ok(link.into())
} else {
Ok("".into())
}
});

Ok(tera.render(template_name, &self.tera_ctx())?)
}
Expand Down
8 changes: 4 additions & 4 deletions lib/src/docs/markdown/templates/cmd_template.md.tera
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
{%- set source_code_link = source_code_link(spec=spec, cmd=cmd) %}
{%- set full_cmd = cmd.full_cmd | join(sep=" ") %}
{%- if multi -%}
{{- "#" | repeat(count=header_level) }} `{{ spec.bin ~ " " ~ full_cmd | trim }}`
{{- "#" | repeat(count=header_level) }} `{{ (spec.bin ~ " " ~ full_cmd) | trim }}`
{%- endif %}
{%- if cmd.before_help_md %}

{{ cmd.before_help_md | escape_md }}
{%- endif %}

- **Usage**: `{{ spec.bin ~ " " ~ cmd.usage | trim }}`
- **Usage**: `{{ (spec.bin ~ " " ~ cmd.usage) | trim }}`
{%- if cmd.aliases %}
- **Aliases**: `{{ cmd.aliases | join(sep="`, `") }}`
{%- endif %}
Expand Down Expand Up @@ -85,13 +85,13 @@
{%- endif %}

{%- if multi %}
{%- for name, cmd in cmd.subcommands %}
{%- for cmd in cmd.subcommands | values | sort(attribute="usage") %}
{%- if not cmd.hide or cmd.hide == false %}
{%- if loop.first %}

{{ "#" | repeat(count=header_level) }}# Subcommands
{% endif %}
- [`{{ spec.bin ~ " " ~ cmd.usage | trim }}`]({{ url_prefix }}/{{ cmd.full_cmd | join(sep="/") }}.md)
- [`{{ (spec.bin ~ " " ~ cmd.usage) | trim }}`]({{ url_prefix }}/{{ cmd.full_cmd | join(sep="/") }}.md)
{%- endif -%}
{%- endfor -%}
{%- endif -%}
Expand Down
6 changes: 3 additions & 3 deletions lib/src/docs/markdown/templates/index_template.md.tera
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
{%- set about = spec.about_long | default(value=spec.about | default(value="")) %}
{%- set cmd = spec.cmd %}
{%- set full_cmd = cmd.full_cmd | join(sep=" ") %}
{{- "#" | repeat(count=header_level) }} `{{ spec.bin ~ " " ~ full_cmd | trim }}`
{{- "#" | repeat(count=header_level) }} `{{ (spec.bin ~ " " ~ full_cmd) | trim }}`

**Usage**: `{{ spec.bin ~ " " ~ cmd.usage | trim }}`
**Usage**: `{{ (spec.bin ~ " " ~ cmd.usage) | trim }}`

{%- if spec.version %}

Expand All @@ -19,5 +19,5 @@

{{ "#" | repeat(count=header_level) }} Subcommands
{% endif %}
- [`{{ spec.bin ~ " " ~ cmd.usage | trim }}`]({{ url_prefix }}/{{ cmd.full_cmd | join(sep="/") }}.md)
- [`{{ (spec.bin ~ " " ~ cmd.usage) | trim }}`]({{ url_prefix }}/{{ cmd.full_cmd | join(sep="/") }}.md)
{%- endfor -%}
4 changes: 2 additions & 2 deletions lib/src/docs/markdown/templates/spec_template.md.tera
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{%- set about = spec.about_long | default(value=spec.about | default(value="")) %}
{%- set cmd = spec.cmd %}
{%- set full_cmd = cmd.full_cmd | join(sep=" ") %}
{{- "#" | repeat(count=header_level) }} `{{ spec.bin ~ " " ~ full_cmd | trim }}`
{{- "#" | repeat(count=header_level) }} `{{ (spec.bin ~ " " ~ full_cmd) | trim }}`

{%- if spec.version %}
- **version**: {{ spec.version }}{% endif %}
Expand Down Expand Up @@ -37,7 +37,7 @@
{%- for cmd in all_commands %}
{%- set full_cmd = cmd.full_cmd | join(sep=" ") %}

{{ "#" | repeat(count=header_level) }} `{{ spec.bin ~ " " ~ full_cmd | trim }}`
{{ "#" | repeat(count=header_level) }} `{{ (spec.bin ~ " " ~ full_cmd) | trim }}`

{%- include "cmd_template.md.tera" %}
{%- endfor -%}
Loading