-- Leo's gemini proxy

-- Connecting to guie.welhaba.mx:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini;lang=es-ES

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

-- Response ended

-- Page fetched on Thu May 9 19:08:18 2024