use crate::CommonOpt;
use log::*;
use std::{io, path::PathBuf};
use vimwiki::{HtmlConfig, HtmlWikiConfig};
pub fn load_html_config(
opt: &CommonOpt,
extra_paths: &[PathBuf],
) -> io::Result<HtmlConfig> {
let CommonOpt {
config,
merge,
include,
..
} = opt;
trace!(
"load_html_config(path = {:?}, include = {:?}, merge = {}, extra_paths = {:?})",
config,
include,
merge,
extra_paths
);
let mut config: HtmlConfig = if let Some(path) = config {
let config_string = std::fs::read_to_string(path)?;
toml::from_str(config_string.as_str())?
} else {
HtmlConfig::default()
};
if config.wikis.is_empty() || *merge {
match load_vimwiki_list() {
Ok(mut wikis) => {
wikis.extend(config.wikis);
config.wikis = wikis;
}
Err(x) => {
warn!("Failed to load vimwiki_list from vim/neovim: {}", x)
}
}
}
for path in extra_paths.iter() {
let path = match path.canonicalize() {
Ok(path) => path,
Err(x) => {
error!("{:?} failed to canonicalize: {}", path, x);
return Err(x);
}
};
debug!("Creating temporary wiki for {:?}", path);
if path.is_dir() {
config.wikis.push(HtmlWikiConfig {
path: path.to_path_buf(),
..Default::default()
});
} else if let Some(parent) = path.parent() {
config.wikis.push(HtmlWikiConfig {
path: parent.to_path_buf(),
..Default::default()
});
}
}
config.wikis = config
.wikis
.into_iter()
.enumerate()
.filter(|(idx, wiki)| {
opt.filter_by_wiki_idx_and_name(*idx, wiki.name.as_deref())
})
.map(|(_, wiki)| wiki)
.collect();
Ok(config)
}
fn load_vimwiki_list() -> std::io::Result<Vec<HtmlWikiConfig>> {
trace!("load_vimwiki_list()");
let vimwiki_list_json = vimvar::load_global_var("vimwiki_list", false)?;
trace!(
"g:vimwiki_list == {:?}",
serde_json::to_string_pretty(&vimwiki_list_json)
);
if let Some(json) = vimwiki_list_json {
serde_json::from_value(json).map_err(Into::into)
} else {
Ok(Vec::new())
}
}