💾 Archived View for guie.welhaba.mx › 202402 › 11_gemiquetasshParaEtiquetarGemas.gmi captured on 2024-06-16 at 12:38:58. Gemini links have been rewritten to link to archived content

View Raw

More Information

⬅️ Previous capture (2024-03-21)

-=-=-=-=-=-=-

gemiquetassh para etiquetar gemas

Estoy implementando un sistema de etiquetado de publicaciones para mi cápsula de gemini, con las siguientes características:

Las etiquetas se distinguen con un hashtag como prefijo, por ejemplo: #cine o #méxico. No hay espacio entre el hashtag y la palabra clave.

Las etiquetas son pulsables, es decir, funcionan como hipervínculos que dirigen a un listado de otras publicaciones con la misma etiqueta. Esta característica resuelve también el problema de que un hashtag, al inicio de una línea, es renderizado por el protocolo gemini como indicador de que la línea es un título, dado que los hipervínculos requieren => al inicio de la línea, se posibilita que el texto mostrado tenga # sin renderizarse como título. El único "inconveniente" (no es grave) es que me obliga a escribir una sola etiqueta por línea.

Un script llamado gemiqueta.sh

Generé un script llamado gemiqueta.sh.

Su propósito es buscar, de forma recursiva en el contenido de la cápsula, todas las publicaciones que incluyen cada etiqueta, actualizando los listados de las mismas que se encuentran en gemas separadas.

La idea de partida para generar el script fue en torno a este comando:

grep -r "#cine" /home/usuaria/gemini/content | sed 's/.gmi.*$/.gmi/g' > output.txt

Lo que, al momento de escribir este registro, evolucionó en el siguiente script, que ya es una versión usable para mi cápsula:

#!/bin/bash
# gemiquetas.sh
# Script para clasificar por etiquetas las publicaciones una cápsula gestionada con gemlogssh.
# VersiĂłn: 20240210.
# Por: @leoperbo (en Mastodon: @leoperbo@mstdn.mx).
#
# Etiqueta cine
Papi=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )
cd "$Papi"
GmiqtCine="/home/usuaria/gemini/content/etiquetas/cine.gmi"
grep -r --exclude=*.{bak} "#cine" /home/usuaria/gemini/content | grep -r "#cine" /home/usuaria/gemini/content | sed -e 's|.gmi.*$|.gmi|g' -e 's|/home/usuaria/gemini/content/|=> gemini://guie.welhaba.mx/|g' > lcine.txt
LCine="$(awk '{gsub(/[]\/$*.^&[]/, "\\\\&");printf (FNR>1)?"\\n%s":"%s",$0}END{print ""}' lcine.txt)"
sed -i ':a;N;$!ba;s/# cine.*# ◀️/# cine\n\n'"$LCine"'\n\n# ◀️/' $GmiqtCine
# Etiqueta méxico
GmiqtMexico="/home/usuaria/gemini/content/etiquetas/mexico.gmi"
grep -r --exclude=*.{bak} "#méxico" /home/usuaria/gemini/content | grep -r "#méxico" /home/usuaria/gemini/content | sed -e 's|.gmi.*$|.gmi|g' -e 's|/home/usuaria/gemini/content/|=> gemini://guie.welhaba.mx/|g' > lmexico.txt
LMexico="$(awk '{gsub(/[]\/$*.^&[]/, "\\\\&");printf (FNR>1)?"\\n%s":"%s",$0}END{print ""}' lmexico.txt)"
sed -i ':a;N;$!ba;s/# méxico.*# ◀️/# méxico\n\n'"$LMexico"'\n\n# ◀️/' $GmiqtMexico

Hitos en la creaciĂłn del script

Excluir resultados en grep

Para evitar que aparecieran entradas repetidas en los listados de las etiquetas, aprendĂ­ que puedo usar la opciĂłn --exclude de grep, asĂ­ conseguĂ­ que los archivos de respaldo que se generan al usar la funciĂłn [retrolog], no aparecieran como entradas repetidas de sus publicaciones originales. Una parte de gemiqueta.sh que lo refleja es:

grep -r --exclude=*.{bak} "#cine" /home/usuaria/gemini/content

A veces es mejor awk que sed

El mecanismo requiere insertar varias lĂ­neas de un "fichero fuente" reemplazando una secciĂłn especĂ­fica de otro "fichero destino", respetando el resto del contenido del "fichero destino".

Lo intenté de 20 maneras diferentes con sed, pero al final, me fue necesario [recurrir a awk], aprendiendo a generar una variable válida que pudiera ser inyectada en el "fichero destino" sin darme errores del tipo:

sed: -e expresión #1, carácter 23: orden desconocida: «\»

Una parte de gemiqueta.sh que lo refleja es:

LCine="$(awk '{gsub(/[]\/$*.^&[]/, "\\\\&");printf (FNR>1)?"\\n%s":"%s",$0}END{print ""}' gemlogssh/temporales/lcine.txt)"

Definitivamente, debo ponerme a estudiar awk.

No confundir insertar, agregar, reemplazar

sed puede con todos esos verbos, pero hay que ser cuidadoso e ingenioso para hacerlos funcionar conforme a nuestros propĂłsitos.

Le dediqué bastante esfuerzo a descubrir la forma de evitar que los listados de las etiquetas fueran acumulando entradas o, peor aún, que el contenido completo, más allá del listado de entradas, se fuera repitiendo a sí mismo luego de cada ejecución del script.

Una de las principales dificultades, es que venĂ­a demasiado acostumbrado a usar sed para insertar nuevos elementos a un listado, sin modificar lo existente, como ocurre en casi todo [gemlogssh].

AsĂ­, tuve que [aprender una forma distinta de usar sed], con un loop que recoge todas las lĂ­neas existentes entre un patrĂłn de inicio y un patrĂłn final para ser reemplazadas (en conjunto y no una por una) por la variable deseada. Una parte de gemiqueta.sh que lo refleja es:

sed -i ':a;N;$!ba;s/# cine.*# ◀️/# cine\n\n'"$LCine"'\n\n# ◀️/' $GmiqtCine

La clave para el loop en el comando anterior es:

:a;N;$!ba;

Me propongo estudiarla con más detenimiento, aunque ya me funcionó.

Por hacer

El siguiente reto, es conseguir concatenar el listado de enlaces a gemas que tienen una misma etiqueta, con un listado a sus correspondientes tĂ­tulos, ya que actualmente, las gemas de cada etiqueta muestran las listas de hipervĂ­nculos a las publicaciones con la URL en crudo.

Referencias

[retrolog]

[recurrir a awk]

[gemlogssh]

[aprender una forma distinta de usar sed]

#bash

#gemini

----------------------

(ɂ◔◡◔)ɂ ♥ Publicación con licencia CC-BY-SA ♥

📇 por @leoperbo

----------------------------------------------

✒️ ¿Quieres agregar un comentario sobre esto en el Libro de visitas?

Ubica el cursor al final de la direcciĂłn (URL) de este contenido, que comienza con "gemini://". Luego, agrega al final:

/comentar/[Tu mensaje.][ Tu nombre o seudĂłnimo.]

Por ejemplo:

gemini://guie.welhaba.mx/guie/202402/11_gemiquetasshParaEtiquetarGemas.gmi/comentar/¿De cuál fumaste? Invita pa' andar igual. El Ferras.

Pulsa ENTER, verás un mensaje de error (es normal, así funciona), espera cerca de un minuto y:

đź“– Consulta el Libro de visitas

⛑️ Nota en caso de que no veas tu comentario

◀️─────────

đź“‘ Volver al Ă­ndice de Guie