Clean Clipper Ajouter à Chrome – gratuit

Pour qui

La doc technique avec le code intact

Clean Clipper lit le langage sur la page elle-même – la classe du bloc, l’élément parent, le balisage laissé par la coloration du site – et l’inscrit sur la clôture. Sur un corpus technique de neuf pages, l’étiquette a survécu dans 73 blocs sur 156, contre 20 et 0 pour les deux autres moteurs mesurés. Le reste de la page arrive en Markdown standard, sans la barre latérale.

Ce qui casse à la copie

Une documentation, c’est d’abord du code, et c’est exactement la partie que la plupart des clippers abîment. Le bloc arrive nu, sans étiquette : dans Obsidian il s’affiche en gris uniforme, dans un dépôt il traverse la revue sans coloration. Vous rouvrez donc chaque note pour retaper js, python ou bash au-dessus de chaque clôture. Sur une documentation de trente pages, c’est une soirée passée à réparer ce qui existait déjà sur la page d’origine.

Le reste de la capture ne vaut guère mieux. Le sélecteur de version, la barre latérale et le fil « Sur cette page » atterrissent au milieu du texte, et un tableau de paramètres s’effondre sur une seule ligne parce qu’une cellule contenait un exemple de code. Trois mois plus tard, vous cherchez une option d’API dans vos notes et vous tombez d’abord sur trois copies du menu. La note existe, mais elle ne se relit pas.

Reste la question de la version, celle qui coûte le plus cher à découvrir tard. Une note de documentation sans son adresse ne dit pas si elle décrit la branche stable ou la préversion, et les deux pages portent le même titre, souvent au mot près. Le segment de version vit dans l’URL, pas dans le texte ; s’il ne voyage pas avec la note, vous corrigez un jour un bogue en suivant la doc d’une version que votre projet n’utilise pas. Ici, l’adresse complète part dans le champ source du frontmatter, segment de version compris.

Ce qui change dans la note

Sortie réelle, non retouchéedeveloper.mozilla.org/fr/docs/Web/JavaScript/Guide/Utiliser_les_promesses
## Enchaîner les promesses

La méthode `fetch()` renvoie une promesse que l’on enchaîne :

```js
fetch("/api/produits")
  .then((reponse) => reponse.json())
  .then((donnees) => console.log(donnees));
```

| Méthode | Ce qu’elle renvoie |
| --- | --- |
| `then()` | une nouvelle promesse |
| `catch()` | une promesse, en cas de rejet |

Régler l’extension pour une documentation

Sept réglages, faits une fois, après quoi une page de doc devient un fichier rangé sans aucune manipulation. Chaque étape se vérifie à l’écran : soit le réglage est en place, soit il ne l’est pas.

  1. Épinglez l’icône : cliquez sur la pièce de puzzle à droite de la barre d’adresse, puis sur l’épingle en face de Clean Clipper. Sans cela, il faut rouvrir ce menu à chaque capture, et le raccourci Alt+Shift+M reste le seul chemin rapide.
  2. Ouvrez les paramètres depuis la fenêtre de l’extension. Dans « Clic sur l’icône », gardez « Ouvrir la fenêtre » tant que vous n’avez pas confiance dans le résultat : sur une documentation, la clôture de code et les tableaux méritent un coup d’œil avant l’écriture du fichier.
  3. Dans « Où enregistrer », appuyez sur « Choisir… » en face de « Dossier sur le disque » et désignez le dossier de notes de votre projet. Le navigateur demande l’autorisation une seule fois et la retient ; si elle est révoquée, l’extension affiche « accès non accordé, choisissez à nouveau » au lieu d’échouer en silence.
  4. Remplacez le modèle « Nom du fichier » par {domain} - {title}. Deux documentations ont toutes les deux une page « Installation » ; sans le domaine dans le nom, la seconde capture arriverait sous Installation-2.md, et vous ne sauriez plus laquelle est laquelle.
  5. Dans « Ce qui entre dans la note », passez « Images » sur « ignorer » et laissez cochées « Renvoyer les notes de bas de page à la fin » et « Couper la navigation, la pagination et les blocs de service ». Les schémas d’une doc ne sont de toute façon que des liens vers le site d’origine.
  6. Ouvrez « Boutons de la fenêtre » et activez « Dossier ». À l’installation, seuls « Copier » et « En .md » sont affichés – sans cette case, l’écriture dans le dossier choisi n’a aucun bouton pour la déclencher.
  7. Vérifiez sur une vraie page : ouvrez une page de référence, tapez Alt+Shift+M, et regardez la première clôture. Si elle porte ```js et que le tableau des paramètres a gardé ses lignes, le réglage est bon et vous pouvez basculer « Clic sur l’icône » sur « Placer dans un dossier ».

Réglages conseillés pour la doc

Ce tableau vaut pour la documentation d’API et les références de langage. Les valeurs ne sont pas celles de l’installation par défaut : trois d’entre elles doivent être changées à la main.

RéglageValeurPourquoi celle-là ici
Clic sur l’icôneOuvrir la fenêtre, puis « Placer dans un dossier »une doc se vérifie une fois, puis se capture en série ; l’aperçu ne sert plus une fois la clôture validée
Nom du fichier`{domain} - {title}`les pages « Installation », « Quickstart » et « API » existent dans toutes les documentations : sans le domaine, elles se réécrivent entre elles
Imagesignorerles schémas restent des liens vers le site d’origine, donc des liens qui casseront à la prochaine refonte du site
Notes de bas de pageactivéles renvois normatifs d’une spécification deviennent `[^1]` avec leurs définitions en fin de fichier, au lieu d’ancres mortes
Couper la navigationactivéc’est ce qui retire le sélecteur de version et le fil « Sur cette page » avant la conversion, pas après
Boutons de la fenêtreCopier + En .md + Dossier« Dossier » est décoché à l’installation ; les trois autres boutons encombrent la fenêtre sans servir ici
Règle par sitemotif `developer.mozilla.org/fr/*`, sous-dossier `mdn`le motif est comparé sans le protocole ni le `www.`, et le joker `*` couvre toute l’arborescence de la doc
Cas difficile : un bloc que la page n’étiquette pas, et un tableau dont les cellules contiennent du codedeveloper.mozilla.org/fr/docs/Web/API/AbortController
## Exemple

Dans cet extrait, un téléchargement lancé avec `fetch()` est interrompu.

```
const controleur = new AbortController();
const signal = controleur.signal;

document
  .querySelector(".annuler")
  .addEventListener("click", () => controleur.abort());
```

| Membre | Type | Ce qu’il fait |
| --- | --- | --- |
| `AbortController.signal` | `AbortSignal` | renvoie le signal lié au contrôleur |
| `AbortController.abort()` | – | accepte un argument `raison` facultatif |

Trois usages réels

Reprendre une API dans le README du projet

Vous intégrez une bibliothèque et le README doit montrer l’appel minimal. Sur la page de référence, vous sélectionnez la section « Exemples », vous tapez Alt+Shift+M, et le Markdown est dans le presse-papiers avec le bloc déjà étiqueté. Le collage dans le README donne une coloration correcte du premier coup, sans retaper la clôture.

Attention à un effet de bord utile à connaître : quand la capture part d’une sélection, la coupe de l’habillage est désactivée, parce que ce que vous avez sélectionné à la main n’a pas à être filtré. Si votre sélection a débordé sur la barre latérale, celle-ci arrive avec. Sélectionnez à partir du titre de la section, pas depuis la marge.

Garder la doc d’une version avant qu’elle disparaisse

Une majeure sort, l’éditeur annonce que la documentation de la version précédente sera retirée dans six mois, et votre service tourne encore dessus. Vous parcourez les pages qui vous concernent, une par une, avec le modèle de nom {domain} - {title} et un sous-dossier au nom de la version. Chaque fichier garde dans son champ source l’adresse complète, segment de version inclus.

Le jour où l’ancienne doc est débranchée, le dossier reste lisible hors ligne et cherchable en texte intégral. Ce que vous n’avez pas : les images, qui étaient des liens vers un site qui ne les sert plus, et les liens internes de la doc, restés absolus et devenus morts. Le texte et le code, eux, sont là.

Capturer une documentation interne derrière une connexion

Le wiki de l’équipe demande une authentification d’entreprise, ce qui met hors jeu tout outil qui va chercher la page depuis un serveur. Ici, l’extraction lit la page que votre navigateur a déjà affichée pour vous, après connexion : si la page est à l’écran, elle se capture, et rien ne sort de la machine puisque l’extension ne fait aucune requête réseau.

C’est aussi le cas où la capture d’une page rendue en JavaScript se comporte bien : le DOM est lu une fois la page affichée, donc la section réellement ouverte dans l’accordéon est celle qui part dans le fichier. Refermez la section avant de capturer et elle manquera – l’extension n’enregistre que ce qui existe à l’écran.

Comparé aux façons de faire actuelles

Une documentation finit toujours par être recopiée quelque part. Voici les chemins habituels, ce qu’ils donnent vraiment, et ce qu’ils coûtent – la dernière ligne comprise.

MéthodeCe que vous obtenezCe que ça coûte
Copier-coller dans l’éditeurle texte et le code, dans l’ordreles clôtures arrivent nues, les tableaux se replient, la barre latérale et le fil de navigation suivent
Enregistrer la page en PDFl’apparence exacte, mise en page comprisele code n’est plus du code : ni copiable proprement, ni coloré, ni cherchable dans un dépôt
Marque-pageun coût nul sur le momentrien n’est à vous : la page peut être réécrite, déplacée ou retirée avec la version qu’elle documentait
Recopier le bloc à la mainexactement ce dont vous avez besoinlent, et c’est la méthode qui introduit des fautes de frappe dans du code que vous ne relirez pas
Une autre extension de capturedu Markdown en un clicl’étiquette de langage se perd le plus souvent : 20 blocs sur 156 pour l’un des moteurs mesurés, 0 pour l’autre
Clean Clipperdu Markdown avec le code étiqueté et les tableaux entiersune page à la fois, sans robot ni traitement par lots ; images en liens ; clôture nue quand la page ne déclare aucun langage

Quand ça ne sort pas comme prévu

Pourquoi ce bloc de code est-il sorti sans étiquette ?

Parce que la page ne dit nulle part de quel langage il s’agit. L’extension regarde les attributs data-lang, data-language, lang et data-code-language sur le bloc, son parent et son grand-parent, puis les classes de coloration ; si rien n’y figure, la clôture reste nue. Deviner le langage à partir du code produirait une étiquette fausse un bloc sur cinq, et une étiquette fausse coûte plus cher qu’une étiquette absente.

Deux autres cas donnent le même résultat sans qu’il y ait de défaut : la page déclare plaintext, text ou none, qui sont traités comme une absence d’étiquette, et le langage déclaré ne fait pas partie de la soixantaine reconnue. Un dialecte maison ou un pseudo-langage propre à un éditeur tombe dans ce second cas.

Pourquoi la page est-elle arrivée vide ou coupée en plein milieu ?

Presque toujours parce que la partie manquante n’était pas affichée au moment du clic. Les documentations modernes replient les sections dans des accordéons et chargent les exemples à la demande : ce qui est replié n’est pas dans le DOM, donc pas dans la capture. Dépliez la section, laissez la page finir de s’afficher, puis capturez.

Si le corps de l’article ne s’affiche jamais mais que la page le publie dans ses données structurées, l’extension bascule dessus et l’écrit dans la note : le champ extraction porte alors jsonld-articlebody au lieu de dom. Ce champ est là précisément pour que vous sachiez d’où vient le texte sans avoir à le deviner.

Pourquoi la barre latérale est-elle restée dans ma note ?

Parce que la capture est partie d’une sélection. Sur une sélection, la coupe de l’habillage est volontairement désactivée : vous avez désigné ce texte à la main, et retirer des morceaux de ce que quelqu’un a sélectionné exprès serait la pire des surprises. Le sélecteur en haut de la fenêtre indique toujours si vous regardez « Page entière » ou « Sélection ».

La correction tient en un geste : cliquez sur « Page entière » dans la fenêtre, ou décochez « Si du texte est sélectionné, n’enregistrer que la sélection » dans les paramètres quand vous enchaînez des captures de pages entières.

Pourquoi le nom du fichier est-il rempli de tirets ?

Parce que le titre de la page contient des caractères qu’un système de fichiers refuse. Tout ce qui n’est ni une lettre, ni un chiffre, ni un espace, ni l’un de . , ( ) _ - est remplacé par un tiret, et le nom est coupé à 90 caractères. Un titre comme Array.prototype.map() : JavaScript | MDN donne donc une suite de tirets là où se trouvaient les deux-points et la barre verticale.

Si ces noms vous gênent, mettez {domain} - {title} de côté et utilisez {domain} {date} pour les pages dont le titre est bavard. Le titre exact reste de toute façon écrit en clair dans le champ title du frontmatter, donc rien n’est perdu.

Ce qu’il ne fait pas

Il ne devine pas le langage d’un bloc que la page n’étiquette pas : là où le site rend du code sans classe, la clôture reste nue, et c’est délibéré – une étiquette inventée coûte plus cher qu’une étiquette absente. Il n’explore pas un site de documentation entier : une page à la fois, celle que vous regardez, sans robot et sans traitement par lots. Il ne télécharge ni schémas ni captures d’écran, les images restent des liens vers le site d’origine. Et sur les pages que le navigateur protège, comme chrome:// et la boutique d’extensions, il ne s’exécute pas du tout.

Ajouter à Chrome – gratuitGratuit, sans compte et sans version payante.

Questions

Quels langages sont reconnus ?
Ceux que la page déclare elle-même, dans la limite d’une soixantaine de noms connus. Clean Clipper ne devine pas le langage à partir du code : il lit la classe laissée par la coloration du site, donc l’étiquette est aussi juste que la page d’origine, et absente quand la page n’en donne pas.
Est-ce que ça marche sur une documentation rendue en JavaScript ?
Oui. L’extension lit le DOM une fois la page affichée, donc une documentation en une seule page est capturée telle que vous la voyez, avec la section réellement ouverte.
Le code en ligne survit-il ?
Oui. Les fragments en ligne restent entre accents graves, y compris à l’intérieur des titres, des listes et des cellules de tableau.
Puis-je retirer les images d’une documentation ?
Oui. Mettez les images sur « ignorer » dans les paramètres, partout ou par une règle qui ne vise qu’un seul site.
Peut-il capturer une page derrière une session déjà ouverte ?
Oui, parce qu’il lit la page que votre navigateur a affichée pour vous. Une documentation interne accessible après connexion se capture comme n’importe quelle autre.
Le numéro de version de la doc peut-il entrer dans le nom du fichier ?
Non. Le modèle de nom accepte {title}, {date} et {domain}, et rien d’autre. L’adresse complète, segment de version compris, part dans le champ source du frontmatter ; pour séparer les versions, utilisez un sous-dossier par branche.
Puis-je envoyer chaque documentation dans son propre dossier ?
Oui, avec les règles par site. Un motif comme docs.python.org/fr/* reçoit son sous-dossier, son réglage d’images et son modèle de nom ; le motif est comparé sans le protocole ni le www., et * remplace n’importe quelle suite de caractères.
Que deviennent les encarts « Note » et « Attention » ?
Des citations Markdown. Le format n’a pas de syntaxe standard pour les admonitions : le texte de l’encart est gardé, son étiquette visuelle non. Un encart contenant un bloc de code garde ce bloc, étiquette comprise.
Si je recapture la même page, l’ancien fichier est-il écrasé ?
Non. Si le nom est déjà pris, l’extension prend le suivant : Article.md, puis Article-2.md, et la note précédente reste intacte. Par le bouton « En .md », c’est le navigateur qui gère la collision et ajoute un suffixe numérique. Mettez {date} dans le modèle de nom si vous voulez garder les deux.
Est-ce que ça fonctionne sur les pages `chrome://` ?
Non, et sur aucune page que le navigateur protège, la boutique d’extensions comprise. L’extension n’a pas de permission d’hôte : l’accès à une page lui vient de votre clic sur l’icône, et ces pages-là n’en accordent aucun.