Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 16/08/2016, à 13:13

Sub0

Ajout interactif d’entrées dans les fichiers biblatex

Boujour,
voilà un script que j’utilise depuis plusieurs mois, ayant énormément d’articles scientifiques à entrer dans des fichiers .bib.
Ça peut peut-être intéresser des étudiants en cours de rédaction de mémoire, thésards, curieux, etc.

C’est le genre de truc qui serait probablement plus efficace en perl ou autre, mais j’aime le pur bash pour le moment.

Infos :
- J’utilise plusieurs fichiers .bib thématiques, tous dans un même répertoire.
- Le script propose de choisir parmi les fichiers.bib présent dans le répertoire renseigné. Il est possible de renseigner directement un fichier ou l’entrée sera ajoutée en paramètre (doit être un .bib).
- Il n’est pas possible de ne pas ajouter d’étiquette à une entrée (logique).
- Le script permet d’ajouter plusieurs entrées, et de corriger une entrée saisie avant de la copier dans le fichier, après avoir donné un récapitulatif.
- Il est également possible d’ajouter une entrée. Dans ce cas, elle sera à la fin du bloc.
- Quand un champ n’est pas renseigné, il n’apparait pas dans la sortie finale.

#!/bin/bash

#Ici, le chemin du répertoire qui contient les fichiers .bib (remplacer utilisateur par votre $USER
dir="/home/utilisateur/Articles/Bibliographie/"
# Un tableau contenant les fichiers .bib
files=(/home/utilisateur/Articles/Bibliographie/*.bib)
# Les classes possibles -- Adaptez selon vos besoins
types=(article book inbook proceedings inproceeding collection periodical thesis report unpublished)

usage () {
	printf "Erreur -- Classes :\n"
	for i in "${types[@]}" ; do printf "%s " "$i" ; done
	printf "\n"
	exit
}

imprime () {
	for i in "${!champs[@]}" ; do 
		printf "\t%s\n" "${champs[$i]}={${entries[${champs[$i]}]}}," 
	done
}

change () {
	until [[ $continue = N ]] ; do
		read -e -p "Lequel ? : " choice
		read -e -p "Entrée ? : " new

		if [[ ${entries[$choice]+_} ]] ; then
			entries[$choice]="$new"
		else
			champs+=("$choice")
			entries+=([$choice]="$new")
		fi
		
		read -e -p "Faut-il ajouter un champ ? (o/N) : " continue
	done
}


while [[ $ajouter != N ]] ; do

	[[ $# = 0 ]] && select i in "${files[@]#$dir}" ; do bibfile="$dir$i" && break  ; done
	[[ $# = 1 ]] && if [[ $1 =~ .*\.bib ]] ; then bibfile=$1 ; else printf "Erreur : j'attends un fichier .bib\n" && exit ; fi

	printf "bibfile is $bibfile ($REPLY)\n"

	read -e -p "Classe ? : " -i "article" classe
	declare -a champs 
	case $classe in

# Les champs proposés pour chaque type d’article. Ajustez en fonction de votre utilisation.
		article)
			champs=(author title subtitle journaltitle journalsubtitle issue issuetitle publisher volume number series year month issn doi url urldate pages keywords)
		;;
		book) 
			champs=(author title subtitle year origdate publisher edition series isbn location keywords)
		;;
		inbook) 
			champs=(author title subtitle bookauthor booktitle booksubtitle year location isbn pages publisher)
		;;
		proceedings) 
			champs=(author title organization date year location url urldate keywords)
		;;
		inproceedings) 
			champs=(author title booktitle organization date year location url urldate keywords)
		;;
		collection) 
			champs=(title editor year date publisher doi url urldate)
		;;
		periodical) 
			champs=(title subtitle editor pubstate volume number series issue issuetitle issuesubtitle url urldate)
		;;
		thesis) 
			champs=(author title subtitle doi type institution year url urldate keywords)
		;;
		report) 
			champs=(author title subtitle type number version institution year note url urldate pubstate keywords)
		;;
		unpublished) 
			champs=(author title subtitle howpublished note location date month year pubstate url urldate keywords)
		;;
		*)
			 usage
		;;
	esac

	until [[ -n $label ]] ; do
		read -p "Étiquette ? : " label
	done


	declare -A entries
	index=0
	for i in "${champs[@]}" ; do
		read -p "$i : " answer
		if [[ -n $answer ]] ; then
			entries[$i]="$answer"
		else
			unset -v 'champs[$index]'
		fi
		index=$(( index + 1 ))
	done



	printf "\n%s\n%s\n%s\n" \
		"----------------------------------" \
		"Récapitulatif : " \
		"@$classe{$label,"
	imprime
	printf "%s\n%s\n" \
		"}" \
		"----------------------------------" 
 

	read -e -p "Faut-il ajouter un champ ? (o/N) : " rep

	[[ $rep = o ]] && change

	{
  	  printf "%s\n" "@$classe{$label,"
	  imprime
	  printf "}\n"
	} >> "$bibfile"

	label=""
	read -e -p "Faut-il ajouter une entrée ? (o/N) : " ajouter

done

Exemple de sortie :

@article{PaloqueTurquier1,
	author={Camille {Paloque-Berges} and Barbara Turquier},
	title={Pour une archéologie des virus. Entretien avec Jussi Parikka},
	journaltitle={Tracés},
	journalsubtitle={Revue des sciences humaines},
	issue={21},
	issuetitle={Contagions},
	number={21},
	year={2011},
	doi={10.4000/traces.5230},
	url={http://traces.revues.org/5230},
	urldate={13-12-01},
	pages={235--247},
}

J’essaie de faire du « pure » bash et d’être propre.
Ce script a été l’occasion d’apprendre à manier des tableaux et à renforcer mon bash. Quelque peu « expérimental » pour moi donc. Mais il n’a jamais faillit après des centaines d’utilisations.
Toute critique visant à l’améliorer bienvenue !

Dernière modification par Sub0 (Le 16/08/2016, à 13:25)


Seule alternative au bépo acceptée = stylo/papier.

Hors ligne