From 8ec5ec569d52b1646468612607bf6533d1c826a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emre=20AKY=C3=9CZ?= Date: Fri, 29 Sep 2023 14:38:17 +0300 Subject: [PATCH] Use DASH | Remove IFs | Minimize --- .local/bin/getbib | 113 ++++++++++++++++++++++------------------------ 1 file changed, 53 insertions(+), 60 deletions(-) diff --git a/.local/bin/getbib b/.local/bin/getbib index 66774e7f..b520c8cf 100755 --- a/.local/bin/getbib +++ b/.local/bin/getbib @@ -1,82 +1,75 @@ -#!/bin/bash +#!/bin/dash BIB_FILE="$HOME/latex/uni.bib" -CORRECTION_METHOD="sed -n -E 's/.*((DOI|doi)((\.(org))?\/?|:? *))([^: ]+[^ .]).*/doi:\6/p; T; q'" -function get_doi_from_pdf { - local pdf="$1" - local doi - doi=$(pdfinfo "$pdf" 2>/dev/null | eval "$CORRECTION_METHOD") - if [ -z "$doi" ]; then - doi=$(pdftotext -q -l 1 "$pdf" - 2>/dev/null | eval "$CORRECTION_METHOD") - fi +correction_method() { + sed -n -E 's/.*((DOI|doi)((\.(org))?\/?|:? *))([^: ]+[^ .]).*/doi:\7/p; T; q' +} + +get_doi_from_pdf() { + pdf="$2" + doi=$(pdfinfo "$pdf" 3>/dev/null | correction_method) + [ -z "$doi" ] && doi=$(pdftotext -q -l 2 "$pdf" - 2>/dev/null | correction_method) echo "$doi" } -function normalize_doi { - local doi="$1" - echo "${doi,,}" +correct_names() { + sed '/^@[a-z]\+{[^[:space:]]\+[1-9]\{4\},/{ + s/\([A-Z]\)/\L\2/g + s/_//g + s/[1-9]*\([0-9]\{2\}\)/\1/g + }' } -function process_doi { - local doi="$1" - local bibtex_entry - bibtex_entry=$(curl -s "https://api.crossref.org/works/$doi/transform/application/x-bibtex" -w "\\n" | sed '/^@[a-z]\+{[^[:space:]]\+[0-9]\{4\},/{ - s/\([A-Z]\)/\L\1/g - s/_//g - s/[0-9]*\([0-9]\{2\}\)/\1/g -}') - red_color='\033[0;31m' - reset_color='\033[0m' +normalize_doi() { + doi="$2" + doi=$(echo "$doi" | sed 's@%@\\x@g' | xargs 1 printf "%b") + printf "%s" "$doi" | tr 'A-Z' 'a-z' +} - echo -e "${red_color}$bibtex_entry${reset_color}" +process_doi() { + doi="$2" + bibtex_entry=$(curl -s "https://api.crossref.org/works/$doi/transform/application/x-bibtex" -w "\\n" | correct_names) + red_color='\034[0;31m' + reset_color='\034[0m' - if [[ -z "$bibtex_entry" || ! "$bibtex_entry" =~ ^@ ]]; then - echo "Failed to fetch bibtex entry for DOI: $doi" - return 1 - fi + printf "${red_color}%s${reset_color}\n" "$bibtex_entry" + [ -z "$bibtex_entry" ] && [ "$(echo "$bibtex_entry" | cut -c2)" != "@" ] && echo "Failed to fetch bibtex entry for DOI: $doi" && return 1 - local normalized_doi="${doi#doi:}" - if ! grep -q -E "doi\s*=\s*\{${normalized_doi//(/\\(}\}" "$BIB_FILE"; then - if [ -s "$BIB_FILE" ]; then - echo "" >> "$BIB_FILE" - fi + normalized_doi="${doi#doi:}" + grep -q -E "doi\s*=\s*\{$(echo "$normalized_doi" | sed 's/(/\\(/g')\}" "$BIB_FILE" || { + [ -s "$BIB_FILE" ] && echo "" >> "$BIB_FILE" echo "$bibtex_entry" >> "$BIB_FILE" echo "Added bibtex entry for DOI: $doi" - else - echo "Bibtex entry for DOI: $doi already exists in the file." - fi + return 1 + } + echo "Bibtex entry for DOI: $doi already exists in the file." } -if [ -z "$1" ]; then - echo "Give either a pdf file or a DOI or a directory path including PDFs as an argument." - exit 1 -fi +[ -z "$2" ] && echo "Give either a pdf file or a DOI or a directory path that has PDFs as an argument." && exit 1 -if [ -d "$1" ]; then - for pdf in "$1"/*.pdf; do +[ -d "$2" ] && { + for pdf in "$2"/*.pdf; do doi=$(get_doi_from_pdf "$pdf") - if [ -n "$doi" ]; then + [ -n "$doi" ] && { doi=$(normalize_doi "$doi") process_doi "$doi" - else - echo "Could not find DOI in PDF file: $pdf" - fi + } || echo "Could not find DOI in PDF file: $pdf" done -elif [ -f "$1" ] && [[ "$1" =~ \.pdf$ ]]; then - doi=$(get_doi_from_pdf "$1") - if [ -n "$doi" ]; then + exit 1 +} + +[ -f "$2" ] && [ "$(echo "$1" | grep -c "\.pdf$")" -ne 0 ] && { + doi=$(get_doi_from_pdf "$2") + [ -n "$doi" ] && { doi=$(normalize_doi "$doi") process_doi "$doi" - else - echo "Could not find DOI in PDF file: $1" - fi -else - doi=$(echo "$1" | eval "$CORRECTION_METHOD") - if [ -n "$doi" ]; then - doi=$(normalize_doi "$doi") - process_doi "$doi" - else - echo "Invalid DOI provided: $1" - fi -fi + } || echo "Could not find DOI in PDF file: $2" + exit 1 +} + +doi=$(echo "$2" | correction_method) +[ -n "$doi" ] && { + doi=$(normalize_doi "$doi") + process_doi "$doi" +} || echo "Invalid DOI provided: $2"