From 5ceb05bbced0f7f188d3c7274708602e5cc7227f Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 12 May 2020 12:10:08 +0200 Subject: [PATCH] [bibtex] Add bib-due script filter options Added options to bib-due script to pass input file (-i filename.bib), to display simple help (-h), to specify which field to filter by (-l fieldname), to specify which values to retain (-r 'values|in|regex|groups'), until which date to show (-u 2020-05-13). Parsing remains brittle, which makes -l and -r not very useful as of now; the parser would just get confused with different fields being present. --- bibtex/.local/bin/bib-due | 107 +++++++++++++++++++++++++++++++++++--- 1 file changed, 100 insertions(+), 7 deletions(-) diff --git a/bibtex/.local/bin/bib-due b/bibtex/.local/bin/bib-due index c7c0bb3..81f3cec 100755 --- a/bibtex/.local/bin/bib-due +++ b/bibtex/.local/bin/bib-due @@ -4,28 +4,121 @@ # FIXME: reimplementation with real library needed # +OPTIND=1 # Reset in case getopts has been used previously in the shell. fields="due|priority|\bauthor\b|\btitle\b" filterby="due" +file="${BIBFILE}" +until="" + +show_help() { + printf "%s\n" \ + "" \ + " bib-due Show due readings from bibtex file." \ + "" \ + " Usage: bib-due [-hv] -i input.bib -r 'due|priority|\bauthor|\btitle' -l 'due' -u '2020-05-12'" \ + "" \ + " Options:" \ + "" \ + " -i [bibtex-file] Input bibtex file to scrape and get items from." \ + "" \ + " -r [fields] Field values to read in file." \ + "" \ + " -l [filter] Field to use as filter entity." \ + " This field is required for the scraper to pick entries up." \ + "" \ + " help | -h | --help Print out this help." \ + "" \ + " Invoked without arguments, bib-due will scrape the file defined in BIBFILE environment variable, " \ + " filtering entries with the 'due' field, and getting the values for 'due', 'priority', 'author', " \ + " and 'title' fields. It will then print the entries to stdout." \ + "" \ + " Example output line:" \ + "" \ + ' 2020-06-25 (1): Sergei Gerasymchuk -- “Ze” time in Ukraine (Gerasymchuk2019) ' \ + "" +} + +filter_until() { + # filter for dates, with line numbers + filtered=$(echo "$entries" | grep -noE '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}') + + # redirect entries to fifo pipe + mkfifo filteredentries + finish() { + rm filteredentries + } + trap finish EXIT + echo "$filtered" >filteredentries & + + # find first date past until filter + lastline="" + while IFS= read -r line; do + cond=$(printf '%s' "$line" | cut -d: -f2) + cond=$(date -d "$cond" +%s) + if [ "$cond" -gt "$until" ]; then + lastline=$(printf '%s' "$line" | cut -d: -f1) + break + fi + done