generated from eblume/project-template
feat(core): export expands [[id]] wiki-links to readable labels
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
32197bd170
commit
aea7a51860
2 changed files with 33 additions and 1 deletions
|
|
@ -23,9 +23,20 @@ pub(super) fn export(conn: &Connection, owner: &str, dir: &Path) -> Result<usize
|
|||
|
||||
let mut count = 0;
|
||||
for id in ids {
|
||||
let Some(node) = nodes::get(conn, &id)? else {
|
||||
let Some(mut node) = nodes::get(conn, &id)? else {
|
||||
continue;
|
||||
};
|
||||
// Expand bare [[NODEID]] links to [[NODEID|Current Name]] (§8.4) so the
|
||||
// exported markdown reads outside heph; custom labels stay as-authored.
|
||||
if let Some(body) = node.body.as_deref() {
|
||||
node.body = Some(crate::wikilink::expand(body, |target| {
|
||||
nodes::get(conn, target)
|
||||
.ok()
|
||||
.flatten()
|
||||
.filter(|n| !n.tombstoned && n.owner_id == owner)
|
||||
.map(|n| n.title)
|
||||
}));
|
||||
}
|
||||
let task = if node.kind == NodeKind::Task {
|
||||
tasks::get(conn, &id)?
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -56,3 +56,24 @@ fn export_excludes_tombstoned_nodes() {
|
|||
assert!(dir.path().join(format!("doc/{}.md", keep.id)).exists());
|
||||
assert!(!dir.path().join(format!("doc/{}.md", gone.id)).exists());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn export_expands_bare_id_wiki_links_to_readable_labels() {
|
||||
let dir = tempfile::tempdir().unwrap();
|
||||
let mut s = store();
|
||||
|
||||
let target = s.create_node(NewNode::doc("Roof", "shingles")).unwrap();
|
||||
let body = format!(
|
||||
"see [[{id}]] and [[{id}|my label]] and [[Unknown]]",
|
||||
id = target.id
|
||||
);
|
||||
let doc = s.create_node(NewNode::doc("Notes", &body)).unwrap();
|
||||
|
||||
s.export(dir.path()).unwrap();
|
||||
let text = std::fs::read_to_string(dir.path().join(format!("doc/{}.md", doc.id))).unwrap();
|
||||
// Bare known id gains a readable label; a custom label and an
|
||||
// unresolvable target are left as-authored.
|
||||
assert!(text.contains(&format!("[[{}|Roof]]", target.id)), "{text}");
|
||||
assert!(text.contains(&format!("[[{}|my label]]", target.id)));
|
||||
assert!(text.contains("[[Unknown]]"));
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue