use dirs::{config_dir, home_dir};
use std::fs;
use std::os::unix::fs::PermissionsExt;
const PREVIEW_TEX: &str = r#"\documentclass{article}
\usepackage{mapm}
\usepackage{pgffor}
\usepackage{asymptote}
\usepackage{tikz}
\usepackage{amsmath,amssymb}
\usepackage{float}
\newcommand\ansbold[1]{\mathbf{#1}}
\begin{document}
\section*{Problem (\probvar{1}{author})}
\probvar{1}{problem}
\ifnum\solcount{1}>0\relax
\foreach \i in {1,...,\solcount{1}} {
\subsection*{Solution \i{} (\solvar{1}{\i}{author})}
\solvar{1}{\i}{text}
}
\fi
\end{document}
"#;
const PREVIEW_YML: &str = r#"vars: []
texfiles:
preview.tex: preview.pdf
engine: pdflatex
problem_count: 1
problemvars:
- problem
solutionvars:
- text
"#;
const MAPM_STY: &str = r#"\ProvidesPackage{mapm}
\input{mapm-headers.tex}
\newcommand\mapmvar[1]{\csname mapm@var@#1\endcsname} % var
\newcommand\solcount[1]{\csname mapm@solcount@#1\endcsname} % prob number
\newcommand\probvar[2]{\input{mapm-prob-#1-#2.tex}\unskip} % prob number, var
\newcommand\solvar[3]{\input{mapm-sol-#1-#2-#3.tex}\unskip} % prob number, sol number, var
"#;
fn makedir(dirname: &str) {
let dir = config_dir().unwrap().join("mapm").join(dirname);
if !dir.is_dir() {
fs::create_dir_all(&dir).expect(&format!("Could not create directory {:?}", dir));
}
}
fn main() {
makedir("problems");
makedir("templates");
makedir("scripts");
println!("Copying default preview template...");
let template_dir = config_dir()
.unwrap()
.join("mapm")
.join("templates")
.join("preview");
if !template_dir.exists() {
fs::create_dir_all(&template_dir).expect("Could not create preview template directory");
}
let write_tmpl = |path: &str, contents: &str| {
let path = template_dir.join(path);
if path.exists() {
println!("File {:?} already exists, skipping...", path);
} else {
fs::write(&path, contents).expect(&format!("Could not write to {:?}", path));
}
};
write_tmpl("preview.tex", PREVIEW_TEX);
write_tmpl("config.yml", PREVIEW_YML);
let script_dir = config_dir().unwrap().join("mapm").join("scripts");
let write_script = |contents: &str| {
let write_path = |template: &str| {
let contents = &(String::from(contents) + " " + template + ".pdf");
let path = script_dir.join(template);
if path.exists() {
println!("File {:?} already exists, skipping...", path);
} else {
fs::write(&path, contents).expect(&format!("Could not write to {:?}", path));
}
if !cfg!(windows) {
let file = fs::File::create(&path).unwrap();
let metadata = file.metadata().unwrap();
let mut perms = metadata.permissions();
perms.set_mode(0o644);
}
};
write_path("preview");
write_path("preview-all");
};
if cfg!(windows) {
write_script("start");
} else if cfg!(target_os = "macos") {
write_script("open");
} else {
write_script("xdg-open");
}
let mapm_sty_path = if cfg!(target_os = "macos") {
home_dir()
.unwrap()
.join("Library")
.join("texmf")
.join("tex")
.join("latex")
.join("mapm.sty")
} else {
home_dir()
.unwrap()
.join("texmf")
.join("tex")
.join("latex")
.join("mapm.sty")
};
if !mapm_sty_path.exists() {
fs::write(&mapm_sty_path, MAPM_STY).expect("Could not write to `mapm.sty`");
}
}