#!/usr/bin/env sh ###################################################################### # @author : swytch # @file : bibinput # @license : GPLv3 # @created : Wednesday May 20, 2020 17:57:47 CEST # # @description : create a bibliography entry through dmenu ###################################################################### parse(){ if [ "$1" = "@" ]; then grep "$1" "$file" | awk -F '{' '{print $2} ' | tr ',' '\n' | sed '/^[[:space:]]*$/d' | sort -r elif [ "$1" = "keywords" ]; then grep "$1" "$file" | awk -F '"' '{print $2} ' | tr ' ' '\n' | sed -e 's/,//g' -e '/^[[:space:]]*$/d' | sort -u else grep "$1" "$file" | sed "s/,$//g" | awk -F '"' '{print $2} ' | sort -u fi } input() { if [ "$1" = "reference" ]; then refinput | dmenu -i -p 'reference?' -l 10 elif [ "$1" = "doctype" ]; then printf "$doctypes" | sed "s| |\n|g" | dmenu -i -p 'doctype?' elif [ "$1" = "author" ]; then parse "author" | dmenu -i -p 'author name? (surname, first name)' -l 10 elif [ "$1" = "keywords" ]; then parse "keywords" | dmenu -i -p "keywords? {$keywords}" -l 10 else parse "$1" | dmenu -i -p "$1?" -l 10 fi } refinput(){ printf "ref$(cat "$file" | grep '@' | wc -l | awk '{printf $1}')\n" && parse "@" } doctypes="article book online techreport" file="$(find $HOME/documents/bibliographies/ -type f -not -path '*/\.*' | dmenu -l 20 -p "[bibinput] which bibliography?")" # the -not -path allows find to ignore hidden files [ -z "$file" ] && exit 1 refs="$(cat "$file" | grep "@" | sed "s/,$//g" | awk -F '{' '{print $2}' | tr '\n' ' ')" # if the file does not exist, create it if [ ! -e "$file" ]; then mkfile="$(printf "No\\nYes" | dmenu -i -p "$file does not exist. Create it?")" [ "$mkfile" = "Yes" ] && (touch "$file") fi doctype="$(input "doctype")" [ -z "$doctype" ] && exit 1 reference="$(input "reference")" [ -z "$reference" ] && exit 1 while [ "${refs#*"$reference"}" != "$refs" ]; do reference="$(refinput | dmenu -i -p 'ref already exist, please provide another' -l 10)" [ -z "$refname" ] && exit 1 done author="$(input "author")" [ -z "$author" ] && exit 1 title="$(input "title")" [ -z "$title" ] && exit 1 year="$(input "year")" [ -z "$year" ] && exit 1 if [ "article" == "$doctype" ]; then journal="$(input "journal")" [ -z "$journal" ] && exit 1 volume="$(input "volume")" fi if [ "$doctype" = "book" ]; then publisher="$(input "publisher")" [ -z "$publisher" ] && exit 1 fi if [ "$doctype" = "online" ]; then url="{URL}" fi if [ "$doctype" = "techreport" ]; then institution="$(input "institution")" [ -z "$institution" ] && exit 1 fi keyword="$(input "keywords")" keywords=$keyword if [ -z "$keyword" ]; then keyword_test="no" else keyword_test="$(printf "yes\nno" |dmenu -p "another keyword?")" keyword_test=${keyword_test:-"no"} fi while [ "$keyword_test" = "yes" ]; do keyword="$(input "keywords")" if [ -z "$keyword" ];then keyword_test="no" elif [ "${keywords#*"$keyword"}" != "$keywords" ]; then keyword_test="$(printf "yes\nno" |dmenu -p "keyword already given. another keyword?")" keyword_test=${keyword_test:-"no"} else keywords="$keywords, $keyword" keyword_test="$(printf "yes\nno" |dmenu -p "another keyword?")" keyword_test=${keyword_test:-no} fi done printf "\n@$doctype{"$reference"," >> "$file" printf "\n\tauthor = \"$author\"," >> "$file" printf "\n\ttitle = \"$title\"," >> "$file" printf "\n\tyear = \"$year\"," >> "$file" [ -n "$journal" ] && printf "\n\tjournal = \"$journal\"," >> "$file" [ -n "$volume" ] && printf "\n\tvolume = \"$volume\"," >> "$file" [ -n "$publisher" ] && printf "\n\tpublisher = \"$publisher\"," >> "$file" [ -n "$url" ] && printf "\n\turl = \"$url\"," >> "$file" [ -n "$institution" ] && printf "\n\tinstitution = \"$institution\"," >> "$file" printf "\n\tkeywords = \"$keywords\"" >> "$file" printf "\n}" >> "$file"