This repository has been archived on 2023-03-02. You can view files and clone it, but cannot push or open issues or pull requests.
dotfiles/.local/bin/bibinput

118 lines
3.8 KiB
Bash
Executable File

#!/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"