L'embedding de sujet a besoin d'un peu d'attention

J’y ai repensé aujourd’hui après avoir cliqué sur le bouton « Afficher le message complet » pour Introducing Discourse AI. Le message complet qui s’affiche sur Discourse manque toutes les images et de nombreux titres. Pour ajouter à la confusion, les légendes des images sont affichées, mais sans leurs images associées.

Il serait peut-être possible de résoudre le problème sur Meta pour son blog (Ghost ?) en ajustant le paramètre du site allowed embed selectors de Meta : Configuring allowed embed selectors. D’après mon expérience passée, je sais que l’obtention de ce paramètre peut être un processus délicat. Si vous essayez de l’ajuster, portez une attention particulière aux résultats.

Discourse a beaucoup de potentiel pour fonctionner comme un système de commentaires pour des publications externes, mais pour faire un bon travail, cliquer sur le bouton « Afficher le message complet » doit permettre de récupérer de manière fiable tous les éléments de la publication externe. Je pense que le problème est que la gem Ruby Readability utilisée pour l’analyse des publications externes n’est pas conçue pour le travail que Discourse en fait. Elle n’est pas non plus activement maintenue : GitHub - cantino/ruby-readability: Port of arc90's readability project to Ruby.

3 « J'aime »

Oui, à ce stade, nous devons soit passer à autre chose qui l’améliore légèrement, soit simplement changer la stratégie d’intégration pour faire du Show Full Post un Read Full Post qui est un simple lien vers la publication originale. Après tout, il est peut-être inutile de lutter contre tous les problèmes d’intégration possibles sur chaque site Web.

4 « J'aime »

@sam vient de corriger ceci, jetez un œil.

3 « J'aime »

Nous nous préparons à lancer notre blog sur Ghost et à utiliser les intégrations Ghost > Discourse. Très heureux de voir ce changement !

4 « J'aime »

Les images sont maintenant chargées. Je ne suis pas très doué pour les jeux de type « trouvez la différence », mais je constate encore quelques différences :

  • Titre Sujets sémantiquement liés manquant
  • Titre Sentiment de la communauté manquant
  • Liste non ordonnée manquante dans la section Fournisseurs de modules
  • Titre Installation de Discourse AI sur votre communauté manquant

Idéalement, l’invite « Inscrivez-vous à notre newsletter » devrait être exclue du message intégré.

La possibilité de citer facilement le message intégré semble importante. En y réfléchissant maintenant, je ne suis pas sûr du comportement attendu lorsque les boutons « développer/réduire » et « aller au message » sont cliqués pour les citations d’un message intégré.

C’est un problème délicat. Cela devrait être aussi simple que de nettoyer le HTML contenu dans l’élément article ou main d’un message, mais je soupçonne qu’il y aurait encore des problèmes avec cette approche. Par exemple, cela nécessiterait une gestion spéciale pour éviter la duplication de l’élément h1 d’un article de blog si l’en-tête (header) existe à l’intérieur de l’article (article).

1 « J'aime »

Je pense que tout cela se produit également dans readability.js, voici la vue lecteur de Firefox :

<h2 id="installing-discourse-ai-on-your-community">
      <strong>Installing Discourse AI on your community</strong>
    </h2>

Je vais voir s’il existe un moyen simple de résoudre ce problème…

Je ne suis pas sûr à ce sujet… mais si nous voulons vraiment, vraiment faire cela, nous pouvons ajouter .discourse-newsletter-signup à blocked_embed_selectors

4 « J'aime »

Oui, readablity.js est basé sur le même code que GitHub - cantino/ruby-readability: Port of arc90's readability project to Ruby, donc la même logique est probablement utilisée pour supprimer ces éléments. readablity.js fait généralement un meilleur travail que Ruby Readability cependant.

L’appel à l’action par e-mail est déroutant car le champ de saisie de l’e-mail est supprimé du message intégré. Techniquement, je ne suis pas sûr que l’appel à l’action appartienne à l’intérieur de l’article.

1 « J'aime »

Je remonte ce sujet, car je suis d’accord avec @simon sur le fait qu’il faudrait y réfléchir à nouveau à un moment donné.

Une bonne partie des demandes de support pour le plugin WP Discourse concerne en fait des problèmes de crawl de lisibilité sous une forme ou une autre.

Je pense que cela résume mon sentiment sur la question.

Cela dit, je n’ai pas de solution miracle pour le moment, à part celle-ci.

Mais je suis désireux de contribuer à une meilleure solution que le statu quo, car cela réduirait la charge de travail du support de WP Discourse.

1 « J'aime »

Ils examinent les problèmes, mais sont lents à les résoudre…

La mise en place pour que MiniRacer encapsule la lisibilité n’est pas très difficile… J’en ai fait un prototype.

Il est possible que nous passions à cette implémentation, mais nous avons déjà divergé, nous finirions donc par abandonner des fonctionnalités.

Ce n’est pas un problème facile à résoudre.

2 « J'aime »

Ouais, c’est juste, cependant, j’ai l’impression que ce sera un jeu sans fin de “whack-a-mole”. Il y aura toujours une version de :

Le post sur mon site ressemble à X et quand je clique sur “Afficher le post complet”, il ressemble à Y et je veux qu’ils soient identiques.

Je suppose que ma question plus profonde est de savoir s’il y a un réel avantage à cette fonctionnalité, qui ne sera jamais parfaite, par rapport à

En en faisant un bouton « Afficher le post complet », les gens s’attendent à une fidélité que Discourse ne pourra jamais totalement offrir. Ma préoccupation concerne davantage la gestion des attentes.

Je suppose que vous demandez la suppression de la fonctionnalité d’intégration. Je ne suis pas sûr d’être d’accord. Je pense que les sites qui intègrent du contenu très désordonné devraient utiliser cette simple forme de « lien vers l’original ». Cependant, les sites qui intègrent du contenu mieux structuré peuvent utiliser le mode lecteur, même s’il est imparfait.

1 « J'aime »

Pas nécessairement. Je dis qu’il faut mieux gérer les attentes.

99 % des personnes qui gèrent un site Web ne sauront pas si leur HTML est suffisamment sémantique pour être facilement analysé par une gemme comme readability, ni même que c’est ce qui détermine le fonctionnement de la fonctionnalité. L’hypothèse par défaut des utilisateurs est qu’il y a un problème « dans Discourse » (ou plus souvent dans le plugin WP Discourse) lorsqu’il n’y a pas une fidélité à 100 % entre la publication sur leur site et le contenu qui apparaît lorsque l’utilisateur clique sur « Afficher la publication complète ».

Rendre une option comme avoir un CTA « Lire la publication complète » facile à activer, et peut-être par défaut, aiderait je pense.

2 « J'aime »

Ce que je voulais dire par là, c’est que Ruby Readability est “un outil pour extraire le contenu lisible principal d’une page Web”. Dans le cas d’un site qui publie des articles sur Discourse, je pense qu’il est raisonnable de supposer que le contenu lisible principal de la page Web est connu et peut être défini par un sélecteur CSS externe. Par exemple, article, .entry-content, .post, etc.

Le type d’outil que j’imagine permettrait simplement aux sites de définir un sélecteur externe pour le contenu de leurs articles, puis de nettoyer le HTML contenu dans ce sélecteur. Une version légèrement plus sophistiquée permettrait aux sites de définir des sélecteurs internes qu’ils souhaiteraient exclure de Discourse.

Sur mon site WordPress, j’ai un article avec un balisage tout à fait standard. J’aimerais publier tout ce qui se trouve dans la div .entry-content sur Discourse. Cela fonctionne presque, mais je n’arrive pas à configurer le paramètre allowed embed selector sur Discourse pour importer les éléments de liste de l’article. C’est le genre de problème que j’ai vu des sites rencontrer. Sans pouvoir exécuter Rails.cache.clear, il est vraiment difficile de le configurer.

Publier l’article sous forme de onebox est une solution raisonnable pour cela.

Edit : l’option debug est utile pour comprendre ce qui se passe : GitHub - cantino/ruby-readability: Port of arc90's readability project to Ruby. Dans le cas des listes exclues de mon article WordPress :

Conditionally cleaned ul#. with weight 0 and content score 0 because it has too many links for its weight (0).

C’est pourtant une liste tout à fait légitime.

Une fonctionnalité très demandée avec les embeds étendus est de permettre aux vidéos Youtube d’apparaître dans le contenu développé. Empêcher cela est codé en dur dans la gemme : ruby-readability/lib/readability.rb at master · cantino/ruby-readability · GitHub. Je ne sais pas s’il vaut la peine de faire un PR pour pouvoir remplacer cette liste par une option.

2 « J'aime »

Je ne m’emballerai pas trop avec ça, mais j’ai utilisé Nokogiri pour autre chose ce week-end. C’est plutôt addictif. J’ai pensé jeter un œil au code d’intégration pendant que Nokogiri était encore frais dans mon esprit.

Mon intérêt réside dans le fait que j’aimerais voir Discourse utilisé plus largement par les sites d’information et de blogging. Si cela devait se produire, je peux imaginer que les nouveaux propriétaires de sites soient frustrés par la fonctionnalité d’intégration actuelle. Voici une idée pour l’améliorer :

Ajoutez deux nouveaux attributs optionnels au modèle EmbeddableHost :

  • target_selector : le sélecteur CSS externe qui contient le contenu à intégrer.
  • exclude_selectors : une liste de sélecteurs CSS à exclure du contenu sélectionné par le target_selector.

Un bouton « Configurer » devrait être ajouté à chaque ligne d’Hôte Intégrable sur la page Admin / Intégration. Cliquer sur ce bouton ouvre une page similaire à la page E-mails / Aperçu du résumé.

La page de configuration de l’hôte aurait un formulaire avec des champs pour saisir les paramètres target_selector et exclude_selectors de l’hôte, et un champ d’URL qui permettrait de tester les valeurs fournies sur une page Web spécifique. Le test exécuterait essentiellement TopicEmbed.parse_html avec les valeurs target_selector et exclude_selectors fournies, puis afficherait les résultats.


Les modifications du code parse_html sont faciles à tester. Voici une approche possible. Notez que ce code n’est qu’une preuve de concept :

édité dans topic_embed.rb (discourse/app/models/topic_embed.rb at main · discourse/discourse · GitHub)

###########################################################################
    # `target_selector` et `exclude_selectors` seraient idéalement trouvés dans l'enregistrement `EmbeddableHost` du domaine
    # ces paramètres particuliers ont été utilisés pour tester boingboing.net
    target_selector = 'article'
    exclude_selectors = ['.article-header, .share-comments-container', '.boing-single-post-rev-content', '.next-post-list-container', '.boing-end-of-article-container-on-single-post-pages']

    if defined?(target_selector) && target_selector.present?
      read_doc = article_content(html, target_selector, exclude_selectors)
    else
      # retour à Readability si `target_selector` n'est pas défini pour l'hôte
      read_doc = Readability::Document.new(html, opts)
    end
    ###########################################################################

Pour tester sans créer de nouvelle classe, voici une méthode article_content de base ajoutée à la classe TopicEmbed :

  def self.article_content(html, target_selector, exclude_selectors = [])
    doc = Nokogiri::HTML(html)
    # supprimer les commentaires et les balises script
    doc.xpath('//comment()').each { |i| i.remove }
    doc.css("script, style").each { |i| i.remove }

    # obtenir le NodeSet pour le target_selector
    # peut-être revenir à Readability ici si l'ensemble retourné est vide
    selected_nodes = doc.css(target_selector)

    # exclure les nœuds
    unless exclude_selectors.empty?
      selected_nodes.css(*exclude_selectors).each do |node|
        node.remove
      end
    end

    # gérer les tailles d'image, pourrait nécessiter des améliorations
    selected_nodes.css('img').each do |img|
      img.remove_attribute('width')
      img.remove_attribute('height')
    end

    # juste pour le plaisir, autoriser les iframes si leur source est autorisée
    # utiliser `[data-sanitized=\"true\"]` pour empêcher les iframes d'être supprimés lors de l'étape remove_empty_nodes
    allowed_iframe_sources = SiteSetting.allowed_iframes.split('|')
    selected_nodes.css('iframe').each do |iframe|
      allowed = allowed_iframe_sources.any? do |allowed_source|
        iframe['src'].start_with?(allowed_source)
      end

      if allowed
        iframe['data-sanitized'] = 'true'
        iframe['width'] = '690'
        iframe['height'] = '388'
      else
        iframe.remove
      end
    end

    # supprimer les nœuds 'p' et 'div' vides
    selected_nodes.css('p', 'div').each do |node|
      node.remove if node.content.strip.empty? && !node.at_css('iframe[data-sanitized="true"]')
    end

    # convertir les nœuds en une chaîne et retourner un objet avec une méthode `content`
    content = selected_nodes.to_s
    OpenStruct.new(content: content)
  end

Je suis à peu près sûr qu’il suffirait d’un peu de bricolage sur plusieurs domaines pour y parvenir. Les résultats que j’obtiens pour BBS sont bons jusqu’à présent.

L’objectif est de proposer quelque chose que les propriétaires de sites peuvent facilement comprendre et configurer eux-mêmes. Avec cette approche, plus le target_selector est précis, plus il sera facile de configurer les exclude_selectors. Par exemple, pour un site WordPress, si .entry-content était sélectionné comme target_selector, aucune configuration supplémentaire ne serait nécessaire. Si les propriétaires de sites souhaitaient obtenir plus que le HTML de base .entry-content, ils pourraient trouver comment le faire sur la page Configurer l’hôte.

Le seul vrai problème que je vois concerne les hôtes avec un HTML très incohérent. Ce cas pourrait être traité en conservant Ruby Readability comme solution de repli.