diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2019-05-17 21:54:43 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2019-05-17 21:54:43 +0200 |
commit | 632062caed6f62d1ee6dad7ccfd3971a64a281b2 (patch) | |
tree | 177b4b059c5edd8966638cc2a550072afdba56d5 | |
parent | fad684daf2cd62cb769f5d6d955c353f3591eea9 (diff) |
Add imag-markdown
This patch adds a tool to process one or more entries as markdown and
print them as html.
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r-- | Cargo.toml | 1 | ||||
-rw-r--r-- | bin/core/imag-markdown/Cargo.toml | 38 | ||||
-rw-r--r-- | bin/core/imag-markdown/src/main.rs | 83 | ||||
-rw-r--r-- | bin/core/imag-markdown/src/ui.rs | 56 |
4 files changed, 178 insertions, 0 deletions
@@ -12,6 +12,7 @@ members = [ "bin/core/imag-ids", "bin/core/imag-init", "bin/core/imag-link", + "bin/core/imag-markdown", "bin/core/imag-mv", "bin/core/imag-ref", "bin/core/imag-store", diff --git a/bin/core/imag-markdown/Cargo.toml b/bin/core/imag-markdown/Cargo.toml new file mode 100644 index 00000000..00043f9b --- /dev/null +++ b/bin/core/imag-markdown/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "imag-markdown" +version = "0.10.0" +authors = ["Matthias Beyer <mail@beyermatthias.de>"] +edition = "2018" + +description = "Part of the imag core distribution: imag-markdown command" + +keywords = ["imag", "PIM", "personal", "information", "management"] +readme = "../../../README.md" +license = "LGPL-2.1" + +documentation = "https://imag-pim.org/doc/" +repository = "https://github.com/matthiasbeyer/imag" +homepage = "http://imag-pim.org" + +build = "../../../build.rs" + +[badges] +travis-ci = { repository = "matthiasbeyer/imag" } +is-it-maintained-issue-resolution = { repository = "matthiasbeyer/imag" } +is-it-maintained-open-issues = { repository = "matthiasbeyer/imag" } +maintenance = { status = "actively-developed" } + +[dependencies] +log = "0.4" +failure = "0.1" + +libimagstore = { version = "0.10.0", path = "../../../lib/core/libimagstore" } +libimagrt = { version = "0.10.0", path = "../../../lib/core/libimagrt" } +libimagerror = { version = "0.10.0", path = "../../../lib/core/libimagerror" } +libimagentrymarkdown = { version = "0.10.0", path = "../../../lib/entry/libimagentrymarkdown" } + +[dependencies.clap] +version = "^2.29" +default-features = false +features = ["color", "suggestions", "wrap_help"] + diff --git a/bin/core/imag-markdown/src/main.rs b/bin/core/imag-markdown/src/main.rs new file mode 100644 index 00000000..dbf19cc9 --- /dev/null +++ b/bin/core/imag-markdown/src/main.rs @@ -0,0 +1,83 @@ +// +// imag - the personal information management suite for the commandline +// Copyright (C) 2015-2019 Matthias Beyer <mail@beyermatthias.de> and contributors +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; version +// 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// + +#![forbid(unsafe_code)] + +#![deny( + non_camel_case_types, + non_snake_case, + path_statements, + trivial_numeric_casts, + unstable_features, + unused_allocation, + unused_import_braces, + unused_imports, + unused_must_use, + unused_mut, + unused_qualifications, + while_true, +)] + +extern crate clap; +#[macro_use] extern crate log; +extern crate failure; + +extern crate libimagerror; +#[macro_use] extern crate libimagrt; +extern crate libimagstore; + +use std::io::Write; + +use failure::Error; +use failure::err_msg; + +use libimagerror::trace::MapErrTrace; +use libimagerror::iter::TraceIterator; +use libimagrt::setup::generate_runtime_setup; +use libimagstore::iter::get::StoreIdGetIteratorExtension; + +mod ui; + +fn main() { + let version = make_imag_version!(); + let rt = generate_runtime_setup("imag-markdown", + &version, + "Print one or more imag entries after processing them with a markdown parser", + ui::build_ui); + + let out = rt.stdout(); + let mut outlock = out.lock(); + + rt.ids::<crate::ui::PathProvider>() + .map_err_trace_exit_unwrap() + .into_iter() + .map(Ok) + .into_get_iter(rt.store()) + .trace_unwrap_exit() + .map(|ofle| ofle.ok_or_else(|| { + err_msg("Entry does not exist but is in store. This is a BUG, please report!") + })) + .trace_unwrap_exit() + .map(|fle| libimagentrymarkdown::html::to_html(fle.get_content())) + .trace_unwrap_exit() + .for_each(|html| { + writeln!(outlock, "{}", html).map_err(Error::from).map_err_trace_exit_unwrap(); + }) +} + diff --git a/bin/core/imag-markdown/src/ui.rs b/bin/core/imag-markdown/src/ui.rs new file mode 100644 index 00000000..04c7acc7 --- /dev/null +++ b/bin/core/imag-markdown/src/ui.rs @@ -0,0 +1,56 @@ +// +// imag - the personal information management suite for the commandline +// Copyright (C) 2015-2019 Matthias Beyer <mail@beyermatthias.de> and contributors +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; version +// 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// + +use std::path::PathBuf; + +use clap::{Arg, ArgMatches, App}; + +use libimagstore::storeid::StoreId; +use libimagstore::storeid::IntoStoreId; +use libimagrt::runtime::IdPathProvider; +use libimagerror::trace::MapErrTrace; + +pub fn build_ui<'a>(app: App<'a, 'a>) -> App<'a, 'a> { + app + .arg(Arg::with_name("entry") + .index(1) + .takes_value(true) + .required(false) + .multiple(true) + .help("The entries to process") + .value_name("ENTRY")) +} + +pub struct PathProvider; +impl IdPathProvider for PathProvider { + fn get_ids(matches: &ArgMatches) -> Vec<StoreId> { + matches.values_of("entry") + .ok_or_else(|| { + error!("No StoreId found"); + ::std::process::exit(1) + }) + .unwrap() + .into_iter() + .map(PathBuf::from) + .map(|pb| pb.into_storeid()) + .collect::<Result<Vec<_>, _>>() + .map_err_trace_exit_unwrap() + } +} + |