💾 Archived View for guie.welhaba.mx › 202402 › 11_gemiquetasshParaEtiquetarGemas.gmi captured on 2024-03-21 at 14:47:30. Gemini links have been rewritten to link to archived content
-=-=-=-=-=-=-
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.
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
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
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.
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ó.
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.
[aprender una forma distinta de usar sed]
----------------------
(ɂ◔◡◔)ɂ ♥ Publicación con licencia CC-BY-SA ♥
----------------------------------------------
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