Initial import

This commit is contained in:
Matthias Beyer 2017-10-28 11:55:54 +02:00
parent 6f16924514
commit 8dd3a57114
7 changed files with 315 additions and 0 deletions

View File

@ -23,6 +23,7 @@ members = [
"bin/domain/imag-notes",
"bin/domain/imag-timetrack",
"bin/domain/imag-todo",
"bin/domain/imag-wiki",
"lib/core/libimagerror",
"lib/core/libimagrt",
"lib/core/libimagstore",

View File

@ -0,0 +1,32 @@
[package]
name = "imag-wiki"
version = "0.7.0"
authors = ["Matthias Beyer <mail@beyermatthias.de>"]
description = "Part of the imag core distribution: imag-wiki command"
keywords = ["imag", "PIM", "personal", "information", "management"]
readme = "../../../README.md"
license = "LGPL-2.1"
documentation = "https://matthiasbeyer.github.io/imag/imag_documentation/index.html"
repository = "https://github.com/matthiasbeyer/imag"
homepage = "http://imag-pim.org"
build = "../../../build.rs"
[dependencies]
clap = ">=2.17"
log = "0.3"
toml = "0.4"
toml-query = "0.6"
is-match = "0.1"
version = "2.0.1"
libimagentrylink = { version = "0.7.0", path = "../../../lib/entry/libimagentrylink" }
libimagentrymarkdown = { version = "0.7.0", path = "../../../lib/entry/libimagentrymarkdown" }
libimagerror = { version = "0.7.0", path = "../../../lib/core/libimagerror" }
libimagrt = { version = "0.7.0", path = "../../../lib/core/libimagrt" }
libimagstore = { version = "0.7.0", path = "../../../lib/core/libimagstore" }
libimagwiki = { version = "0.7.0", path = "../../../lib/domain/libimagwiki" }

View File

@ -0,0 +1 @@
../../../doc/src/04020-module-wiki.md

View File

@ -0,0 +1,144 @@
//
// imag - the personal information management suite for the commandline
// Copyright (C) 2015-2018 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
//
extern crate clap;
#[macro_use] extern crate log;
#[macro_use] extern crate libimagrt;
extern crate libimagerror;
extern crate libimagstore;
extern crate libimagwiki;
use std::io::Write;
use libimagrt::runtime::Runtime;
use libimagrt::setup::generate_runtime_setup;
use libimagerror::trace::{MapErrTrace, trace_error};
use libimagerror::exit::ExitUnwrap;
use libimagerror::io::ToExitCode;
use libimagstore::storeid::IntoStoreId;
use libimagwiki::store::WikiStore;
mod ui;
use ui::build_ui;
fn main() {
let version = make_imag_version!();
let rt = generate_runtime_setup("imag-wiki",
&version,
"Personal wiki",
build_ui);
let wiki_name = rt.cli().value_of("wikiname").unwrap_or("default");
match rt.cli().subcommand_name() {
Some("ids") => ids(&rt, wiki_name),
Some("idof") => idof(&rt, wiki_name),
Some("create") => create(&rt, wiki_name),
Some("delete") => delete(&rt, wiki_name),
Some("grep") => grep(&rt, wiki_name),
Some(other) => {
debug!("Unknown command");
let _ = rt.handle_unknown_subcommand("imag-wiki", other, rt.cli())
.map_err_trace_exit_unwrap(1)
.code()
.map(std::process::exit);
}
None => warn!("No command"),
} // end match scmd
} // end main
fn ids(rt: &Runtime, wiki_name: &str) {
let scmd = rt.cli().subcommand_matches("ids").unwrap(); // safed by clap
let prefix = if scmd.is_present("ids-full") {
format!("{}/", rt.store().path().display())
} else {
String::from("")
};
let out = rt.stdout();
let mut outlock = out.lock();
rt.store()
.get_wiki(wiki_name)
.map_err_trace_exit_unwrap(1)
.unwrap_or_else(|| {
error!("No wiki '{}' found", wiki_name);
::std::process::exit(1)
})
.all_ids()
.map_err_trace_exit_unwrap(1)
.for_each(|id| {
let _ = writeln!(outlock, "{}{}", prefix, id)
.to_exit_code()
.unwrap_or_exit();
});
}
fn idof(rt: &Runtime, wiki_name: &str) {
use std::path::PathBuf;
use libimagstore::storeid::IntoStoreId;
let scmd = rt.cli().subcommand_matches("idof").unwrap(); // safed by clap
let entryname = scmd
.value_of("idof-name")
.map(String::from)
.unwrap(); // safed by clap
let out = rt.stdout();
let mut lock = out.lock();
let _ = rt.store()
.get_wiki(wiki_name)
.map_err_trace_exit_unwrap(1)
.unwrap_or_else(|| {
error!("No wiki '{}' found", wiki_name);
::std::process::exit(1)
})
.get_entry(&entryname)
.map_err_trace_exit_unwrap(1)
.map(|entry| {
let id = entry.get_location().clone();
let prefix = if scmd.is_present("idof-full") {
format!("{}/", rt.store().path().display())
} else {
String::from("")
};
writeln!(lock, "{}{}", prefix, id).to_exit_code().unwrap_or_exit()
})
.unwrap_or_else(|| {
error!("Entry '{}' in wiki '{}' not found!", entryname, wiki_name);
::std::process::exit(1)
});
}
fn create(rt: &Runtime, wiki_name: &str) {
unimplemented!()
}
fn delete(rt: &Runtime, wiki_name: &str) {
unimplemented!()
}
fn grep(rt: &Runtime, wiki_name: &str) {
unimplemented!()
}

View File

@ -0,0 +1,124 @@
//
// imag - the personal information management suite for the commandline
// Copyright (C) 2015-2018 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 clap::{Arg, App, SubCommand};
pub fn build_ui<'a>(app: App<'a, 'a>) -> App<'a, 'a> {
app
.arg(Arg::with_name("wikiname")
.long("wiki")
.short("w")
.takes_value(true)
.required(false)
.multiple(false)
.value_name("WIKI")
.help("Name of the wiki to use. Defaults to 'default'"))
.subcommand(SubCommand::with_name("ids")
.about("List all ids in this wiki")
.version("0.1")
.arg(Arg::with_name("ids-full")
.long("full")
.takes_value(false)
.required(false)
.multiple(false)
.help("Print full filepath")))
.subcommand(SubCommand::with_name("idof")
.about("List id of an entry in this wiki, if it exists")
.version("0.1")
.arg(Arg::with_name("idof-full")
.long("full")
.takes_value(false)
.required(false)
.multiple(false)
.help("Print full filepath"))
.arg(Arg::with_name("idof-name")
.index(1)
.takes_value(true)
.required(true)
.multiple(false)
.value_name("NAME")
.help("Add the entry under this name. The name must be unique, namespaces ('foo/bar') are allowed."))
)
.subcommand(SubCommand::with_name("create")
.about("Add wiki entry")
.version("0.1")
.arg(Arg::with_name("create-name")
.index(1)
.takes_value(true)
.required(true)
.multiple(false)
.value_name("NAME")
.help("Create the entry under this name. Namespaces ('foo/bar') are allowed."))
.arg(Arg::with_name("create-noedit")
.long("no-edit")
.short("E")
.takes_value(false)
.required(false)
.multiple(false)
.help("Do not call the editor on the newly created entry."))
.arg(Arg::with_name("create-printid")
.long("print-id")
.short("I")
.takes_value(false)
.required(false)
.multiple(false)
.help("Print the store id after creating"))
)
.subcommand(SubCommand::with_name("delete")
.about("Add wiki entry")
.version("0.1")
.arg(Arg::with_name("name")
.index(1)
.takes_value(true)
.required(true)
.multiple(false)
.value_name("NAME")
.help("Add the entry under this name. The name must be unique, namespaces ('foo/bar') are allowed."))
.arg(Arg::with_name("delete-no-remove-linkings")
.long("no-remove-links")
.takes_value(false)
.required(false)
.multiple(false)
.help("Do not remote links. WARNING: This leaves the store in an inconsistent state."))
)
.subcommand(SubCommand::with_name("grep")
.about("List wiki entries.")
.version("0.1")
.arg(Arg::with_name("grep-pattern")
.index(1)
.takes_value(true)
.required(false)
.multiple(true)
.value_name("PATTERN")
.value_names(&["PATTERNS"])
.help("List only entries where the content matches the pattern. Regex allowed."))
)
}

View File

@ -0,0 +1,12 @@
## Wiki {#sec:modules:wiki}
The Wiki module provides a personal wiki implementation.
The wiki entries are markdown-formatted files in the imag store. All entries are
automatically searched for links and those links are automatically added to the
header (or as external link, depending on the format).
Wiki entries can have no or one category and a arbitrary number of tags.
Entries can be listed (as a "tree" shape) and filtered by content, category and
tag.

View File

@ -53,6 +53,7 @@ CRATES=(
./bin/core/imag-init
./bin/core/imag-edit
./bin/core/imag-ids
./bin/core/imag-wiki
./bin/core/imag
)