Auto-enlazar palabras

@md-misko ¡gracias por el PR!

¿Estás seguro? Me sorprende un poco. Pensaría que si tu regex es lo suficientemente codicioso, deberías poder coincidirlo. Ten en cuenta que eliminar el punto de los caracteres de límite rompe el enlace de palabras al final de la oración.

Hice una pequeña prueba con tu regex a continuación en regex101.com y parece funcionar con los caracteres de límite actuales, mira regex101: build, test, and debug regex
Ten en cuenta que si entiendo correctamente tu propósito, es posible que necesites convertir algunos de tus grupos de captura en grupos que no capturen con (?:)

La incapacidad de usar | es muy molesta, de acuerdo. Ten en cuenta que para la parte ID|id puedes usar el modificador i para hacer que la regex no distinga entre mayúsculas y minúsculas. Para los números, si realmente necesitas el rango exacto entre 1-10 y 1-100, entonces es complicado, relajarlo a 1-19 y 1-199 lo haría más fácil. :slight_smile:

Aquí está tu regex con grupos que no capturan que creo que deberían funcionar

/id\\s?((?:[1-9]|10)\\.(?:[1-9]|[1-9][0-9]|100))/i, https://example.com/id$2

@danekhollas ¡gracias por los comentarios y la expresión regular! He cambiado el código basándome en tus comentarios, la PR está lista para revisión.

1 me gusta

¡Genial! Sin embargo, alguien del equipo de Discourse tendrá que revisar esto, CC @sam

Ten en cuenta que puedes instalar la extensión directamente desde tu repositorio bifurcado (incluso puedes especificar una rama).

1 me gusta

Primero, me gustaría aclarar, ¿por qué los usuarios utilizan el componente en lugar de las palabras observadas integradas?

4 Me gusta

Encontré dos problemas principales con las palabras observadas integradas:

  • no se pueden agregar regex complejas: Ocurrió un error: La palabra es demasiado larga (el máximo es 100 caracteres)
  • no se puede usar un carácter arbitrario como límite de palabra: a saber, el guion bajo
  • la incapacidad de editar reglas o cambiar el orden de ejecución tampoco es ideal

La PR para el componente expone los límites de palabras al usuario y no hay problemas con las regex largas (aparte de la incapacidad de usar |, que también se aborda en la PR).

Por lo demás, las palabras observadas funcionan perfectamente y, si se pueden abordar en el núcleo, estoy totalmente a favor.

Hice esta publicación separada siguiendo Auto-Linkify Words - #216 by md-misko, no estoy seguro de si eso califica como errores:

Las palabras observadas no respetan unicode, tratan todos los caracteres unicode como límites de palabras (al usar \b, pero esto es de esperar, supongo).

Y más (ejecutando algunos casos de prueba a través de palabras observadas y encontré estos dos):

  • La palabra observada \"\\bid\\(d+)\\b\" es una expresión regular inválida. (cierto, pero aún así agrega la regla)
  • \\bid\\s?(\\d+)\\b → https://example.com/id$1 se convierte en enlace a https://example.com/id%241 (agrega $1 codificado en URL en lugar de hacer la sustitución)

¿No se admite la sustitución o es un error?

¿Alguien ha encontrado una solución para usar líneas verticales | en este momento? Tengo algunas expresiones regulares donde son cruciales.

Hola, ¡gracias por desarrollar este increíble tema, me encantó mucho! ¿Podrías lanzarlo para que todos los usuarios lo usen? Y no solo los administradores

GitHub - renato/discourse-imgify-words: tema para auto imgify urls en discourse, casi lo mismo que discourse-linkify-works

Hola,

Este componente temático que enlazaste es una adaptación del de Sam que hice como solución provisional para una necesidad que describiste en otro tema.

Son componentes temáticos sencillos que solo cambian la forma en que se renderizan estas palabras en una publicación (el de Sam convierte palabras específicas en enlaces, el mío convierte palabras específicas en imágenes) basándose en la configuración del componente temático, que solo gestionan los administradores.

La función que describes no se puede realizar en un componente temático, necesitaría un plugin para almacenar un conjunto de (palabra, URL de imagen) por usuario en la base de datos y la conversión de palabra a imagen debería hacerse en el lado del servidor, al construir el contenido de la publicación cocinada (como HTML). Esto no se puede hacer en un componente temático, que es solo código frontend/lado del cliente (si contratas a alguien para hacer este trabajo, es fundamental que comprenda estos detalles).

Esto está fuera del alcance de este componente temático y requeriría un trabajo mucho más complejo. La sugerencia es publicar los detalles de cómo quieres que se comporte esta función en Marketplace y puedes contratar a alguien aquí con experiencia previa en los internos de Discourse para que te ayude.

Gracias por informarme, iré a esa categoría y hablaré de ello.

Se ha planteado muchas veces en este tema, pero me gustaría volver a comprobar; ¿hay alguna forma de restringir esto a una categoría determinada o excluir categorías? Me gustaría usar esto en nuestra categoría para principiantes para tener enlaces a todos los términos básicos que los novatos necesitan aprender, pero en otras áreas, estos simplemente molestarían a los usuarios experimentados. ¡Gracias!

3 Me gusta

Encontré una limitación molesta: dada una expresión regular, $1 solo se reemplaza exactamente una vez.

Ejemplo

/foo-([0-9a-f]+)/,https://target.example/foo/$1/foo-$1

Esperado

palabra clave enlace
foo-abcd https://target.example/foo/abcd/foo-abcd

Actual

palabra clave enlace
foo-abcd https://target.example/foo/abcd/foo-$1

El problema con las palabras vigiladas es que una palabra vigilada se enlaza tantas veces como aparece la palabra vigilada en una publicación. Crea un desorden.

P.D. Dilo tres veces rápido. :grin:

Para ser precisos, la palabra se reemplaza una vez por línea, no una vez por publicación completa. :slight_smile:

Ojalá fuera cierto Coin, pero no está en mi instalación. :frowning:

Así es como funciona en mi instancia de prueba:

:thinking:

Mira esto…

Mi regla:

El resultado:

@Canapin pasaste por alto mi problema: no se trata de palabras repetidas, sino de un reemplazo de patrón repetido de una sola palabra: la URL contiene el patrón a reemplazar dos veces.

Dado que la sustitución de patrones /g es la opción predeterminada en el plugin, debería aplicarse a todas las ocurrencias de $1 en el reemplazo, no solo a la primera.

Es un caso diferente a tener la palabra clave varias veces en una oración, línea o párrafo. El reemplazo debería tener en cuenta las múltiples ocurrencias de la selección.

1 me gusta

Estaba hablando del componente de palabras linkify, no de la función de palabras observadas :slight_smile:

@hellekin, gracias por la aclaración :+1:

Le estaba respondiendo a Sam sobre las palabras vigiladas. :grin:

Es bueno saber que linkify solo hace una, pero me encantaría una por publicación. Puede que tenga que probar esto hoy, las palabras vigiladas son insoportables a veces cuando encuentra una coincidencia.

1 me gusta