etalab / transport-site

Rendre disponible, valoriser et améliorer les données transports
https://transport.data.gouv.fr
190 stars 29 forks source link

Mauvais rendu Markdown pour les commentaires #3163

Closed AntoineAugusti closed 1 year ago

AntoineAugusti commented 1 year ago

La conversion du retour de l'API de data.gouv.fr en Markdown / HTML pourrait être améliorée, en particulier pour la gestion des retours à la ligne.

Exemple actuellement.

> Earmark.as_html!("Bonjour,\n\nMerci pour vos réponses.\nBien à vous,\nFoo BAR\nChargée de mission transport en commun") 
"<p>\nBonjour,</p>\n<p>\nMerci pour vos réponses.\nBien à vous,\nFoo BAR\nChargée de mission transport en commun</p>\n"

Le rendu devrait être

Bonjour,

Merci pour vos réponses.
Bien à vous,
Foo BAR
Chargée de mission transport en commun

pour correspondre à ce qui est affiché sur data.gouv.fr / envoyé par e-mail

thbar commented 1 year ago

@AntoineAugusti j'ai jeté un premier oeil, pour trouver un cas concret où ça se produit.

Un cas semble être:

Voici des copies d'écran, est-ce bien à ce type d'occurrences que tu fais référence @AntoineAugusti ?

Sur transport

CleanShot 2023-05-22 at 08 46 40@2x

Sur data gouv

CleanShot 2023-05-22 at 08 46 52@2x
AntoineAugusti commented 1 year ago

@thbar Tout à fait

thbar commented 1 year ago

Pour retrouver les données, je suis allé sur la discussion, j'ai repéré l'identifiant via le lien "copier le lien vers la discussion" pour pouvoir comparer:

Je peux visualiser la donnée sur la partie qui pose problème et la comparer avec celle qui ne pose pas problème ici:

❯ curl https://www.data.gouv.fr/api/1/discussions/62de656e40f432a649ad0ba2/ | jq "."
{
  "class": "Discussion",
  "closed": null,
  "closed_by": null,
  "created": "2022-07-25T11:42:06.661000+00:00",
  "discussion": [
    {
      "content": "Bonjour,\r\n\r\nLes données seront périmées à la fin du mois d'Août.\r\n\r\nPouvez-vous procéder à une mise à jour ?\r\n\r\nJe vous remercie.\r\n\r\nCordialement.\r\n\r\nMax BINET\r\nKisio Digital",
      "posted_by": {
        "avatar": "https://static.data.gouv.fr/avatars/48/ad83ed99ab42ed8caf9e8ac8fb4a8b-original.png",
        "avatar_thumbnail": "https://static.data.gouv.fr/avatars/48/ad83ed99ab42ed8caf9e8ac8fb4a8b-500.png",
        "class": "User",
        "first_name": "Kisio",
        "id": "5ae1c88988ee385843e81b7e",
        "last_name": "Digital",
        "page": "https://www.data.gouv.fr/fr/users/kisio-digital/",
        "slug": "kisio-digital",
        "uri": "https://www.data.gouv.fr/api/1/users/kisio-digital/"
      },
      "posted_on": "2022-07-25T11:42:06.661000+00:00"
    },
    {
      "content": "Bonjour\nmerci de votre vigilance. En effet les horaires seront mis à jour et ajusté fin août/début septembre en fonction des besoins liés à la rentrée scolaire. \nCordialement\nC. RENOUX\nDocumentaliste de la donnée\n\n",
      "posted_by": {
        "avatar": null,
        "avatar_thumbnail": null,
        "class": "User",
        "first_name": "Christine",
        "id": "5e1c7b216f44411f7ff291f6",
        "last_name": "Renoux",
        "page": "https://www.data.gouv.fr/fr/users/christine-renoux/",
        "slug": "christine-renoux",
        "uri": "https://www.data.gouv.fr/api/1/users/christine-renoux/"
      },
      "posted_on": "2022-07-25T17:02:09.633000+00:00"
    },
    {
      "content": "Bonjour Christine,\r\n\r\nAvez-vous des nouvelles concernant la mise à jour des jeux de données couvrant les périmètres 1 à 4 ? En vous remerciant d'avance pour votre réponse.\r\n\r\nCordialement,\r\n\r\nJulie Higonnet | Représentante du projet Bing Maps Transit pour Microsoft",
      "posted_by": {
        "avatar": null,
        "avatar_thumbnail": null,
        "class": "User",
        "first_name": "Julie",
        "id": "619d00784421a8f52e53df53",
        "last_name": "Higonnet",
        "page": "https://www.data.gouv.fr/fr/users/julie-higonnet-1/",
        "slug": "julie-higonnet-1",
        "uri": "https://www.data.gouv.fr/api/1/users/julie-higonnet-1/"
      },
      "posted_on": "2022-09-27T07:58:17.271000+00:00"
    }
  ],
  "extras": {},
  "id": "62de656e40f432a649ad0ba2",
  "subject": {
    "class": "Dataset",
    "id": "5f727b96e0db0e5a8d8021e6"
  },
  "title": "Rupture prochaine de données",
  "url": "https://www.data.gouv.fr/api/1/discussions/62de656e40f432a649ad0ba2/",
  "user": {
    "avatar": "https://static.data.gouv.fr/avatars/48/ad83ed99ab42ed8caf9e8ac8fb4a8b-original.png",
    "avatar_thumbnail": "https://static.data.gouv.fr/avatars/48/ad83ed99ab42ed8caf9e8ac8fb4a8b-500.png",
    "class": "User",
    "first_name": "Kisio",
    "id": "5ae1c88988ee385843e81b7e",
    "last_name": "Digital",
    "page": "https://www.data.gouv.fr/fr/users/kisio-digital/",
    "slug": "kisio-digital",
    "uri": "https://www.data.gouv.fr/api/1/users/kisio-digital/"
  }
}

Je remarque que les cas où c'est formaté comme on le souhaite, on voit des \r\n, tandis que là où ça n'est pas formaté comme il le faut, on voit juste des \n.

On pourra sûrement faire quelque chose autour de ça, je vais réfléchir.

Mais attention impact un peu généralisé sur le site, sauf à passer un flag.

AntoineAugusti commented 1 year ago

Je gère pas bien tous les cas, mon essai était le suivant

@filler Ecto.UUID.generate()

def markdown_to_safe_html!(md) do
  {:safe, txt} =
    md
    # "Regexp excluding '\r\n'"
    # See https://stackoverflow.com/questions/20977221/regexp-excluding-r-n
    |> String.replace(~r/\r(?!\n)\w|(\w| )(?<!\r)(\n)(\w)/, "\\g{1}#{@filler}\\g{2}\\g{3}")
    |> Earmark.as_html!(gfm_tables: true)
    |> String.replace("#{@filler}\n", "<br>")
    |> HtmlSanitizeEx.basic_html()
    |> HTML.raw()

  {:safe, String.replace(txt, "<table>", ~s(<table class="table">), global: true)}
end