From 632062caed6f62d1ee6dad7ccfd3971a64a281b2 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Fri, 17 May 2019 21:54:43 +0200 Subject: [PATCH 1/2] 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 --- Cargo.toml | 1 + bin/core/imag-markdown/Cargo.toml | 38 ++++++++++++++ bin/core/imag-markdown/src/main.rs | 83 ++++++++++++++++++++++++++++++ bin/core/imag-markdown/src/ui.rs | 56 ++++++++++++++++++++ 4 files changed, 178 insertions(+) create mode 100644 bin/core/imag-markdown/Cargo.toml create mode 100644 bin/core/imag-markdown/src/main.rs create mode 100644 bin/core/imag-markdown/src/ui.rs diff --git a/Cargo.toml b/Cargo.toml index 25835359..25f73c91 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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 "] +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 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::() + .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 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 { + 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::, _>>() + .map_err_trace_exit_unwrap() + } +} + From df62e6f1b3038a2debeb0cd3639ce6355d5ef100 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Fri, 17 May 2019 21:59:15 +0200 Subject: [PATCH 2/2] Add support to only list links This patch adds support in imag-markdown to only list links that are found in the markdown. The list format includes the link title, which I consider convenient in this case, but still easily scriptable. Signed-off-by: Matthias Beyer --- bin/core/imag-markdown/src/main.rs | 28 +++++++++++++++++++++------- bin/core/imag-markdown/src/ui.rs | 8 ++++++++ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/bin/core/imag-markdown/src/main.rs b/bin/core/imag-markdown/src/main.rs index dbf19cc9..0aa087e4 100644 --- a/bin/core/imag-markdown/src/main.rs +++ b/bin/core/imag-markdown/src/main.rs @@ -61,10 +61,11 @@ fn main() { "Print one or more imag entries after processing them with a markdown parser", ui::build_ui); + let only_links = rt.cli().is_present("links"); let out = rt.stdout(); let mut outlock = out.lock(); - rt.ids::() + let iter = rt.ids::() .map_err_trace_exit_unwrap() .into_iter() .map(Ok) @@ -73,11 +74,24 @@ fn main() { .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(); - }) + .trace_unwrap_exit(); + + if only_links { + iter.map(|fle| libimagentrymarkdown::link::extract_links(fle.get_content())) + .for_each(|links| { + links.iter().for_each(|link| { + writeln!(outlock, "{title}: {link}", title = link.title, link = link.link) + .map_err(Error::from) + .map_err_trace_exit_unwrap(); + }) + }) + + } else { + iter.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 index 04c7acc7..a2f996c4 100644 --- a/bin/core/imag-markdown/src/ui.rs +++ b/bin/core/imag-markdown/src/ui.rs @@ -28,6 +28,14 @@ use libimagerror::trace::MapErrTrace; pub fn build_ui<'a>(app: App<'a, 'a>) -> App<'a, 'a> { app + .arg(Arg::with_name("links") + .long("links") + .short("l") + .takes_value(false) + .required(false) + .multiple(false) + .help("Print only the links that can be found in the markdown")) + .arg(Arg::with_name("entry") .index(1) .takes_value(true)