Fragmentos de texto/markdown insertables y centralmente mantenidos

Me preguntaba si existía alguna forma de definir un texto en un solo lugar e insertarlo en las publicaciones con una referencia única y breve.

Es algo así como la opción por defecto Administrador -> Personalizar -> Contenido de texto, pero para mis propias variables personalizadas que se pueden insertar en las publicaciones.

Mi caso de uso era agregar un descargo de responsabilidad para mis enlaces de afiliados. A medida que el número de enlaces de afiliados aumentaba en muchas publicaciones y temas, noté que mis descargos de responsabilidad se multiplicaban junto con ellos. Ocasionalmente me gusta realizar mejoras en los descargos de responsabilidad y esto se vuelve más pesado a medida que crece el número.

También estoy considerando hacer mis enlaces de afiliados más genéricos para tener un enlace gestionado centralmente para cada enlace de producto, por ejemplo, que aparece varias veces. Si ese enlace de producto cambia, solo tengo que modificarlo en un solo lugar.

Obviamente, podría realizar algún tipo de búsqueda y reemplazo en Rails, pero eso no es tan limpio, seguro ni “en línea”.

Por lo tanto, quería un lugar para definir y mantener una cadena de texto en un solo lugar y que los cambios se reflejen inmediatamente en todas partes donde se utilice en la siguiente vista de página.

Sigue leyendo para ver la solución de @Johani!:

3 Me gusta

Una opción posible es utilizar un componente de tema.

Esto va en header.html

<script type="text/discourse-plugin" version="0.8">
var disclaimer = settings.Disclaimer_text,
  disclaimer_selector = 'div[data-theme="disclaimer"]';

$.fn.disclaimer = function() {
  if (!this.length) {
    return;
  } else {
    this.each(function() {
      $(this).html(disclaimer);
    });
    return this;
  }
};

api.decorateCooked($elem => $elem.children(disclaimer_selector).disclaimer());

// crear botón del compositor
let currentLocale = I18n.currentLocale();

I18n.translations[currentLocale].js.disclaimer_button = "Agregar descargo de responsabilidad";
I18n.translations[currentLocale].js.composer.disclaimer_prompt = ""; // dejar vacío

api.onToolbarCreate(function(toolbar) {
  toolbar.addButton({
    trimLeading: true,
    id: "disclaimer-button",
    group: "insertions",
    icon: "exclamation-circle", // cambiar icono
    title: "disclaimer_button",
    perform: function(e) {
      return e.applySurround(
        '<div data-theme="disclaimer">',
        "</div>",
        "disclaimer_prompt"
      );
    }
  });
});
</script>

y esto va en el archivo settings.yml de tu componente

Disclaimer_text:
  default: "Lorem ipsum dolor sit amet, ei purto complectitur has, per at quas senserit. Et malis libris eos, vix id pericula dissentiet, aliquid apeirian pro eu. Sed ex viderer inciderint, vitae officiis dissentiet eos no. Omnes percipit singulis in has, ne nam nibh tation inciderint. Quas nulla ei sit, ex eam rebum voluptaria. Id eam altera similique. Ex justo assentior persequeris mea, ei hinc paulo ubique mei. <br><br>Cu nam epicurei torquatos, et accusam accommodare vim. Vis sint saperet officiis et. Ad consequat posidonium mea, et duo paulo quidam maluisset, vel an electram expetendis. An vis repudiare tincidunt, mentitum convenire eloquentiam ut vis, summo partiendo pro ad."
  description:
    en: Ingresa el texto de descargo de responsabilidad deseado. Usa &lt;br&gt; para saltos de línea.

Luego tendrías un botón en el compositor que se ve así:

y al hacer clic en el botón se agregaría

<div data-theme="disclaimer"></div>

lo cual se convierte en lo que hayas configurado en la configuración del componente

y el resultado final se ve así

y puedes usar

[data-theme="disclaimer"] {

}

en CSS para darle estilo como prefieras.

21 Me gusta

That’s awesome! Thanks @Johani

Added to Tips’n’Tricks.

2 Me gusta

Hola @merefield, por casualidad yo también estaba buscando una funcionalidad similar: insertar un fragmento de texto estándar. En lugar de un botón, prefería una cadena desencadenante que se expandiera en un fragmento de Markdown. (Bueno, supongo que también podría modificar el botón para convertirlo en un menú desplegable con varias opciones).

Esto probablemente no sea una función central de Discourse, sino un plugin.

Comportamiento ideal:

  • Escribo :stub: (no me importa usar algo diferente a los caracteres delimitadores :, pero me preguntaba si integrarse con la interfaz de emojis podría funcionar, ya que tiene ese tipo de comportamiento de ‘autocompletado’ que busco).

  • Discourse reemplaza :stub: con

    > Este artículo es un borrador: por favor, mejóralo **editándolo** y **añadiendo enlaces** y **detalles** (es un 'wiki', así que cualquier usuario puede editar y añadir información) o **comentando** a continuación.
    
  • que se renderiza como:

    Este artículo es un borrador: por favor, mejóralo editándolo y añadiendo enlaces y detalles (es un ‘wiki’, así que cualquier usuario puede editar y añadir información) o comentando a continuación.

  • Y debería haber algún lugar en la interfaz de usuario para configurar estos fragmentos, algo similar a la interfaz de Emojis personalizados.

5 Me gusta

¡Gran idea para un complemento! ¿Te vendría bien que el texto solo aparezca en la vista previa y en la vista final renderizada?

4 Me gusta

La sugerencia de @pacharanero también sería fantástica para nosotros. En nuestro caso, serían solo para el personal, por lo que no querríamos que nada se mostrara en la barra de herramientas del editor, pero sería increíble poder ingresar un código corto para insertar el bloque de actualización automática :+1:

1 me gusta

Por ahora, una forma no centralizada y no de Discourse de lograr este comportamiento hoy en día es usar un administrador de portapapeles multiplataforma como CopyQ y configurar la sección ‘Comandos/Atajos globales’ para que pueda insertar texto arbitrario en el portapapeles.

Estos fragmentos se pueden administrar en la interfaz de usuario de CopyQ, asignar a una tecla de acceso rápido o aparecer en el menú contextual derecho de CopyQ. No es tan bueno como un plugin integrado en Discourse, pero tiene la ventaja de funcionar en todas las aplicaciones, ¡y ya existe!

(Tenga en cuenta que esto tendría que configurarse en cada una de las computadoras que desee utilizar de esta manera. Puede exportar e importar estos comandos y atajos globales a un archivo, para permitir la configuración de la misma configuración en varias máquinas o en un equipo)

Eso estaría absolutamente bien para mí. Creo que, a diferencia de DiscoTOC y Placeholders, necesitaría ser renderizado correctamente en el panel de vista previa, pero en el compositor podría simplemente mostrar la frase desencadenante que se eligiera: :slug:.

Gracias por la respuesta. La solución de CopyQ no hace lo que busco (creo, al menos).

Por ejemplo, me gustaría introducir un fragmento en una publicación (por ejemplo, :slug:) y luego, siempre que se renderice, se renderizará el contenido actual de este slug (que podría contener markdown). Si cambio el contenido de este slug, todas las publicaciones que lo utilicen se actualizarán inmediatamente para tener el nuevo contenido (la publicación en sí solo contiene el slug y el contenido se inserta al renderizar).

Me parecería bien que la búsqueda no supiera que el contenido existe (y solo mostrar la versión final cocinada está bien para mí).

Saludos.

Aquí hay un enfoque diferente…

1 me gusta