Contenu | Rechercher | Menus

Annonce

La nouvelle clé USB Ubuntu-fr est en prévente
Rendez-vous sur la boutique En Vente Libre

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 28/04/2016, à 19:37

Arbiel

Permutations

Bonsoir à tous

Dans le cadre de la réalisation d'un clavier pour la saisie du grec polytonique (grec ancien) fondé sur l'agencement bépo, j'ai été conduit à créer les diverses permutations d'un groupe de symboles. La raison en est que les voyelles grecques peuvent porter jusqu'à trois caractères diacritiques (les symboles) et j'ai voulu que les touches muettes correspondantes puissent être appuyées dans n'importe quel ordre.

La correspondance entre une lettre nue et la lettre habillée de caractères diacritiques est donnée par des lignes telles que

<dead_iota> <dead_acute> <dead_dasia> <Greek_omega> 	: "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI

qui signifie que la lettre "ω" devient "ᾥ" lorsqu'elle porte le iota souscrit, l'accent aigu et l'esprit rude.

Le code ci-dessous, après inclusion par un ordre "source",

#! /bin/bash
	permut () {
		local x="";
		local l="";
		local ne="${1}";
		if [[ $((${#})) -eq 1 ]]; then
			l="${1}" ;
		else
			shift;
# créer toutes les permutations de rang immédiatement inférieur après retrait du premier élément
			for x in $(permut "${@}"); do
# créer deux nouveaux éléments, un avec le premier élément réintroduit en tête, l'autre avec le premier élément réintroduit en queue
				l="${l} ${ne}-${x} ${x}-${ne}";
# jusqu'à ce qu'il n'y ait plus de | dans la suite rendue par le niveau inférieur
				until [[ "${x}" = "${x%|*}" ]]; do
# introduire dans les permutations une nouvelle permutation en remplaçant la première | par la suite "-nouvel_élément-"
					l="${l} ${x/|/-${ne}-}";
# remplacer la première | par un - pour reculer l'insertion du premier élément dans la permutation à suivre
					x="${x/|/-}"
					done;
				done;
# réinsérer des | dans toutes les permutations pour le niveau supérieur
			l=${l//-/|};
		fi;
	echo "${l}"
	}

permet de créer toutes les permutations possibles des symboles tels que <dead_iota> <dead_acute> <dead_dasia>.

Les symboles ne doivent  contenir ni espace, ni "|". Dans les permutations produites, les symboles sont séparés par le caractère "|", qu'il faut donc remplacer par " ", ce que fait l'expansion ${parameter//|/ } comme le montre l'exemple ci-dessous

for f in $(permut "<dead_iota>" "<dead_acute>" "<dead_dasia>"); do echo ${f//|/ }; done;
<dead_iota> <dead_acute> <dead_dasia>
<dead_acute> <dead_dasia> <dead_iota>
<dead_acute> <dead_iota> <dead_dasia>
<dead_iota> <dead_dasia> <dead_acute>
<dead_dasia> <dead_acute> <dead_iota>
<dead_dasia> <dead_iota> <dead_acute>

Le script ci-dessous, également après inclusion par une commande "source", produit les lignes du fichier de gestion du clavier sur la sortie standard en complément des lignes lues sur l'entrée standard.

#! /bin/bash
	cplcompose () {
		traite_ligne () {
# normaliser la ligne pour séparer les références aux muettes par un et un seul espace et extraire la succession de muettes
			dia="$(sed -re "s/>[[:space:]]*</> </g" <<< "${l}" | grep -Eo "<dead_[^>]+>( <dead_[^>]+>)+")";
			echo "### ${l}";
			canevas="$(sed -re "s/${dia}/…/" <<< "${l}")";
			for diacritiques in $(permut ${dia}); do
				diacritiques="${diacritiques//|/ }";
# ne pas introduire de ligne identique à la ligne présente dans le fichier
				! [[ "${diacritiques}" = "${dia}" ]] && sed -e "s/…/${diacritiques}/" <<< "${canevas}";
				done;
			return 0;
			}			
		while read l; do
# ne traiter que les lignes qui correspondent à des lettres grecques avec au moins deux diacritiques successifs
			grep -E "<dead_[^>]+>([[:space:]]+<dead_[^>]+>)+.* GREEK " 1>/dev/null <<< "${l}" && traite_ligne
		done;
	}

Exemple

echo '<dead_iota> <dead_acute> <dead_dasia> <Greek_omega> : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI' | cplcompose
### <dead_iota> <dead_acute> <dead_dasia> <Greek_omega> : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
<dead_acute> <dead_dasia> <dead_iota> <Greek_omega> : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
<dead_acute> <dead_iota> <dead_dasia> <Greek_omega> : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
<dead_iota> <dead_dasia> <dead_acute> <Greek_omega> : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
<dead_dasia> <dead_acute> <dead_iota> <Greek_omega> : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
<dead_dasia> <dead_iota> <dead_acute> <Greek_omega> : "ᾥ"   U1FA5 # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI

Arbiel

Dernière modification par Arbiel (Le 28/04/2016, à 22:42)


Arbiel Perlacremaz
Dell Vostro Ubuntu 18.04 64 bits
J'ai abandonné azerty au profit de bépo, google au profit de Lilo et mes adresses électroniques au profit d'une messagerie réellement sécurisée, Protonmail.

Hors ligne