Voice RSS - Text-to-speech (TTS) online service

Une API de text to speech qui comble les attentes que j'avais:

  • un service gratuit suffisant
  • une bonne prononciation espagnole
  • une intonation correcte lors de la lecture
  • pas de GAFAM dedans
  • appelable simplement, en particulier en PHP

Au départ, je cherchais une lib me permettant de faire la même chose sans dépendre d'un service tiers (autonomie, disparition du service, passage au tout payant toussa).

Hélas, aucune lib gratuite n'a le niveau de qualité nécessaire, l'indépendance aux gafams et la simplicité d'installation/utilisation pour mes projets et applis en cours (si quelqu'un connaît une lib PHP ou JS pour faire ça, je prends avec enthousiasme)... Je me suis donc rabattu vers un microservice externe.

Ce qui m'embêtait, c'était que mes élèves se retrouvent sur mes pages - dans lesquelles je fais en sorte qu'aucune donnée ne sorte vers des tiers - avec un appel direct à une API extérieure, donc avec un problème RGPD éventuel.

Du coup, j'ai fait un wrapper de cette API que je peux moi-même appeler comme une API: ainsi, l'appel côté client se fait toujours vers mon serveur qui répercute la requête vers VoiceRSS, récupère le retour et renvoie sous forme de fichier mp3. De plus, si une requête a déjà été faite, elle a été mise en cache par le wrapper, ce qui diminue la charge serveur et le nombre d'appels vers l'API.

Si ça intéresse quelqu'un, je pourrais développer et filer le code...

Notes sur la gravure laser

Notes tirées de la doc sur le site sculpfun

https://sculpfun.com/blogs/news/settings-guide

  • plus la vitesse est basse, plus le matériau subira de brûlures indésirables: pour la découpe, il vaut donc mieux augmenter la vitesse et le nombre de passes que faire le contraire
  • quand on ignore les réglages d'un matériau, tester en commençant par 10% / 1000 mm/m et augmenter l'intensité
  • nettoyer régulièrement la lentille
  • comme la focale du laser est fixe, lors des découpes le point de focale devient de moins en moins optimal au fur et à mesure des passes: on propose pour les matériaux les plus épais, de régler la focale au milieu du matériau. Ainsi, pour un 10mm d'épaisseur, on règle 5mm plus bas que la cale.

    LaserFocusOverview-1024x576.png

  • certains matériaux sont toxiques si on les brûle: voir PDF
  • Les réglages sont souvent à affiner mais on peut partir des suivants: PDF

    S9reglages.png

  • Pour des matériaux plus exotiques comme le cuir, le verre transparent, l'acrylique transparente ou le miroir :
    • verre transparent: peindre en noir, graver puis nettoyer (pas de découpe possible) 1000-2000 mm/min 60-80%
    • acrylique transparente : comme le verre, peindre avant de graver (pas de découpe possible)
    • miroir: ⛔ on grave le dos du miroir pas la face (danger !) 1000-2000 mm/min 30-80%
    • cuir : 1000-2000 mm/min 20 – 60%
    • acier inox: marquage au marqueur noir, 800-1500 mm/min 20-70%, nettoyage

s9reglages complementaires.png

(...)

Online File Generators for Laser Cutting - Maker Design Lab

Plein de générateurs de SVG de découpe au laser pour des modèles de boîtes de toutes sortes et formes, de roues dentées, de puzzles etc... et même des découpes de boîtes en papier...

très utile ! Pour les descriptions, je vous conseille le lien d'origine.

Boîtes:

Roues dentées:

Labyrinthes:

Divers:

Nesting

regrouper les objets pour une découpe optimale

Autres sources:

Modèles de jouets en bois

LaserRGBL: dur mais bon.

introduction liminaire avant de commencer

Dans le monde merveilleux de la découpe et gravure laser, je débarque à peine, il me faut bien l'avouer... Toutefois, comme dans beaucoup de domaines dans lesquels le montant à investir au départ est inversement proportionnel aux difficultés que tu vas rencontrer dans l'utilisation de l'appareil. le bazard est ardu, en particulier quand on ne t'explique pas les trucs à la base.

Le choix du logiciel de gravure n'échappe bien entendu pas à cette règle: si tu veux que le bouzin fasse des trucs un peu tout seul ou sans trop de prise de tête, il faudra faire tomber 60€ pour acheter LightBurn, qui semble la référence en la matière.

Sinon, tu te tourneras vers la seconde référence: LaserGRBL. Il est gratuit et ça c'est bien. Mais il ne tourne nativement que sous windows et ça c'est pas bien.

Les plus assidus se rappellent du billet précédent dans lequel je fournissais deux façons de faire tourner ce logiciel sous linux ( https://warriordudimanche.net/article1800/sculpfun-s9-gravure-decoupe-laser-pas-trop-cher ) : la difficulté est moins de faire démarrer laserGRBL que de lui faire détecter la machine sous linux... ça semble possible, mais comme souvent pour les trucs peu répandus ou geekesques, sous linux, ça devient assez peu intuitif... et pour ma part, j'ai pas le temps.

Certains me diront sans doute: «mais pitin, y'en a plein, t'oublies Ci, t'oublies Mi...» oui,oui, ok... https://alternativeto.net/software/lightburn/

Mais ya un moment, il faut bien choisir.

Les captures sont celles de la version windows pour le travail sur l'affiche Harry Potter de l'article précédent, juste pour que vous compreniez ce que vous voyez (référence à https://www.youtube.com/watch?v=xJ2tOJhx2s4 )

alt

LaserGRBL

En ce qui concerne l'utilisation et l'aspect intuitif, LaserGRBL est à la gravure laser ce que vim est à l'édition de texte... voyez ?!

ça marche bien mais faut connaître...

Et pas lésiner sur   les antidépresseurs

Toutefois, avant de vous lancer, gardez en mémoire que l'alcool n'est pas la solution.

L'interface

Je vais pas vous faire une lecture des sous-menus - qui est au tuto ce que le tang est au jus d'orange - mais juste un survol des trucs à voir.

Le menu

1.png

Le menu principal est celui qui sera le plus utile: on y trouve le point de départ de toute réalisation: l'ouverture ou l'ajout d'un fichier (image ou gcode)

Connexion et nb de passes

3.png

La zone de gauche donne accès à un élément important (outre le bouton servant à connecter la graveuse): le nombre de passes. Contre toute attente, ce n'est pas un paramètre comme les autres, il n'est pas avec les réglages laser.

Rien ne vous dit d'ailleurs où ce trouve ce réglage en dehors du survol. Mais heureusement que ya Bronco pour vous sortir de la merde: c'est la petite case à côté de la barre progression qui dit combien de fois le travail doit être répété (sur l'image ya un «1», donc le travail ne sera fait... qu'une fois: bravo à toi dans le fond.).

Un petit label aurait été de bon aloi...

Et le petit triangle, là, encore à côté, c'est celui qui sert à lancer le processus de gravure/découpe...

visualisation du projet

A droite, vous retrouvez une représentation visuelle des éléments ajoutés (le résultat du Gcode généré): ils s'afficheront de la même façon qu'ils seront tracés sur la découpeuse.

4.png

Dans cette capture, trois fichiers ont été utilisés: le titre (découpe), la photo (gravure) et le sous texte (découpe)

Contrôle de la zone de gravure

5.png

Ces icônes s'avèrent utiles pour placer ou visualiser la zone sur laquelle la gravure va se faire. Ne serait-ce que pour vérifier qu'elle se fera à l'endroit du support où vous espérez...

  • Le bouton center place le laser au centre de la zone de gravure occupée par l'objet.
  • Le bouton corner déplace le laser dans le coin en bas à gauche de la zone de l'objet.
  • Le bouton frame fait le tour de la zone occupée par l'objet afin de vérifier s'il y a un débordement.
  • focus et blink servent à déclencher le laser à sa puissance minimale pour en visualiser le point d'impact exact.

Étapes de gravure/découpe

Avec ce logiciel, on passe toujours par les mêmes étapes:

  1. choisir un fichier (image dans un premier temps)
  2. importer le fichier : le convertir de façon à en avoir une version exploitable par le logiciel
  3. saisir les réglages de la découpeuse afin de produire le Gcode correspondant.

A chaque fois, vous passerez par ces étapes: pour tout changement de réglage, tout nouveau travail...

Voyons ce que ça donne avec le fichier de titre à découper

1. choisir le fichier

Il peut s'agir d'un fichier image ou d'un fichier Gcode. Ici nous choisirons un fichier image: hcoke.png

2.png

Les noms sont explicites,   je pense

2. importer le fichier

6.png

La fenêtre suivante sert à convertir l'image en fonction de ce qu'on veut obtenir. En gros, on peut choisir d'importer l'image telle qu'elle et de la convertir en lignes de dégradés de gris («tracé ligne par ligne» ou « pointillisme») ou alors de ne conserver que les bords extérieurs («vectorisation»).

Habituellement, pour la découpe, on se sert de la vectorisation.

3. Réglages du laser

7.png

C'est là qu'on va régler la puissance et la vitesse du laser. Mais avant tout, on choisit le mode du laser !

Notez bien ça paske c'est  SUPER IMPORTANT (et vous  allez l'oublier)
  • M3 -constant ➜ la puissance du laser restera celle indiquée dans le réglage tout au long du travail: c'est le mode utilisé pour la découpe.
  • M4 - variable ➜ la puissance du laser variera de zéro à celle indiquée dans le réglage en fonction de la nuance de gris à rendre: c'est le mode utilisé pour la gravure.

Ensuite vous pouvez spécifier la vitesse du laser en millimètres par minute et la puissance de 0 à 1000 (0% à 100%).

La rubrique du bas permet de spécifier la taille de la découpe et son décalage par rapport à l'origine 0,0 (en bas à gauche pour la S9 sauf si vous avez utilisé le bouton de LaserGRBL servant à fixer l'origine ailleurs). C'est là que vous décalerez les différents objets les uns par rapport aux autres dans les projets mêlant gravure et découpe)

Les plus observateurs d'entre-vous - ou ceux qui sont le plus habitués aux interfaces laconiques - auront remarqué le bouton en forme de livre. Un clic dessus vous donne accès à des préréglages selon une grande quantité de machines via la MaterialDB (mais pas la S9, j'ai du éditer la base via le menu GRBL>MaterialDB) :

8.png

Ici on prend les réglages pour découper du papier 100% / 800 mm/m / 1 passe en M3.

Une fois les réglages effectués on se retrouve devant l'écran principal où l'on n'a plus que le nombre de passes à préciser et un clic sur le bouton pour lancer le taf.

Pour la gravure

On passe par les mêmes étapes sauf qu'on choisit le mode M4:

  1. On choisit le mode tracé ligne par ligne (l'option qualité donne le nombre de lignes par millimètre... entre 5 et 10 s'avère pas trop mal mais j'ai peu testé.)

9 copie.webp

  1. On règle pour la gravure

10.png

Notez le M4 !

  1. on valide et on clique sur pour lancer.

Les trucs à se rappeler avant de se lancer

  1. vous allez faire des erreurs... beaucoup. Partez là-dessus et ne perdez pas votre enthousiasme... pour ma part, j'ai égaré le mien aux alentours de la huitième tentative avortée... plus moyen de foutre la main dessus. C'est l'entêtement qui a pris le relai du coup.
  2. vous pouvez mettre plusieurs «images» (cad plusieurs travaux de découpe/gravure) dans le même travail, il suffit de sélectionner ajouter un fichier au lieu de ouvrir un fichier. Par contre, en cas de changement de réglages, il faudra tout reprendre à zéro, depuis le premier document: c'est vite chiant, surtout quand on ajoute les soucis de placement à ceux des réglages du laser. Heureusement il y a le point numéro 3 (ouf)
  3. quand vous avez obtenu de haute lutte un GCODE dont les réglages fonctionnent, vous pouvez le sauvegarder comme fichier de travail: ainsi, sur une réalisation complexe avec des découpes des gravures etc, on peut faire le Gcode de chaque élément et les ajouter ensuite. On peut même sauvegarder le tout dans un nouveau fichier gcode (titre.gcode + photo.gcode + txt.gcode = total.gcode)
  4. M3 -constant ➜ découpe / M4 - variable ➜ gravure
  5. Ce tuto est un premier jet réalisé après deux jours en partant de zéro. Il s'agit de notes pour moi-même et pour le pauvre copain qui va se lancer comme moi au talent. C'est amené à évoluer avec les nouvelles tentatives, les prochaines erreurs, les commentaires d'aide que je recevrait et tout ça

Résumé en un diagramme (à actualiser)

Untitled Diagram(1).png

Je vous tiens au courant !

Sculpfun S9 - Gravure & Découpe laser pas trop cher [billet long]

Infos

scuplfun s9

Il s'agit d'une sculpfun s9 achetée chez Cdiscount au prix de 239€. On trouve moins cher ailleurs, mais j'avais pas vraiment confiance vu que les faux revendeurs se multiplient à une vitesse folle en ce moment.

Livrée en trois jours, tout bien.

A noter qu'elle a une grande surface de travail de 40x40 environ: c'est un plus mais par contre, à ranger... 🤔

🤩 Déballage et montage

Parfaitement emballée dans un carton robuste et une boîte en mousse moulée, le colis arrive en parfait état.

IMG 20230218 113153 copie.webp

Sont fournis avec la machine: des lunettes de protection, une plaque de métal pour protéger la table lors des découpes, les clés nécessaires au montage, le cylindre de réglage de la hauteur, un petit échantillon de bois...

IMG 20230218 113619 copie copie.webp

💣 Avant de s'y mettre !

⛔ Emplacement !

Bon, alors autant pour l'impression 3D, tu peux coller ça dans ton bureau, c'est pas la mort, autant avec la gravure / découpe laser, ça fume comme une fusion de Houellebecq et de Gainsbourg: impossible de garder ça dans ton bureau, même avec la fenêtre ouverte en grand, t'as l'impression d'avoir mis la tête dans le conduit de cheminée...

L'idéal sera un garage ou mieux, un atelier bien aéré... mais VRAIMENT bien aéré.

🔒 Le support

Le support devra être protégé vu que sinon, il subira les affres de la découpe au même titre que le matériau et la dernière passe sera souvent pour lui. Partez du principe que le support sur lequel vous posez le matériau va être abîmé. Du coup: quoi mettre ?

  1. la plaque de métal fournie: le choix de base mais elle limite au format A4. La découpe y laisse des traces - produits de la combustion, voir photo - mais elle se nettoie à l'eau très facilement.

    IMG 20230223 094758 copie copie.webp

  2. une planche de bois ? Ça j'en ai plein ! Le bois protège bien , mais ça fume encore plus... vu que le laser traverse le matériau lors des découpes.

    IMG 20230223 100137 copie.webp

  3. Le choix du roi mais ça coûte un bras : la plaque alvéolée prévue à cet effet. Elle permet de maintenir à plat mais sur un support qui laisse le laser passer et limite les traces de combustion sous le matériau. Compter environ 70 € pour une 40x40

    alt

Il faudra quoi qu'il arrive fixer le matériau à découper sur le support (en particulier le papier qui peut se relever et être entraîné par la tête du laser).

🤘 Utilisation

La documentation fournie est embryonnaire et ne concerne que le montage, qui est d'une simplicité enfantine. Pour plus d'infos, il faudra aller sur le site du constructeur pour en savoir plus... et encore, je l'ai trouvé assez abscons.

A quelles difficultés allez-vous vous heurter ?

  1. fixer le support et le placer correctement par rapport à l'origine: la découpeuse ne fait pas de «home» toute seule, il faudra prendre ça en compte quand vous travaillerez, selon le logiciel utilisé. Surtout si vous devez placer et découper des éléments précisément. Ce seul point mériterait un article...
  2. régler la hauteur du laser: la focale de ce laser est fixe ce qui signifie qu'il faut régler la hauteur de la tête à la main. C'est très simple à faire car il suffit de mettre la cale en alu et de descendre la tête jusqu'à ce qu'elle touche la cale puis de serrer... toutefois, vous raterez des travaux parce que vous aurez oublié ce détail...
  3. Il faudra bien entendu régler l'intensité du laser, la vitesse de déplacement, le nombre de passes et le type de faisceau en fonction du matériau et de son épaisseur... A l'aveuglette vu qu'on ne trouve pas facilement d'infos sur ces «détails» pour des machines chinoises pas chères... Donc, on teste, on tâtonne, on échoue mais on apprend (en même temps, on adore bricoler...)
  4. le choix du logiciel: oui, ça va être une difficulté. En gros, on se retrouve vite avec deux choix (il y en a d'autres mais souvent plus limités)
    • LightBurn : 🔴 payant et 🔴 cher mais 🟢 très complet, avec une version 🟢 linux et permettant 🟢 l'usage de «calques»
    • LaserGRBL : 🟢 simple et 🟢 gratuit mais 🔴 limité et 🟠 un peu austère et 🟠 win seulement (peu fonctionner avec wine, il paraît). Son plus gros problème reste qu'à chaque fois qu'on veut tester un réglage, il faut reprendre toutes les étapes à zéro ce qui est source d'oublis, d'erreurs etc. C'est relou mais ça fonctionne. Je ferai un billet dessus un jour.

Réglages de base fournis

En cherchant beaucoup, j'ai fini par trouver des réglages indicatifs en fonction de quelques matériaux (voir liens). Je précise indicatifs, parce qu'il faudra sans doute affiner ces réglages vous même en testant... Il y a beaucoup de tests sur cette machine sur youtube, vous pourrez vous faire une idée. Je vous mets une copie de ces réglages ici au cas où, mais je vous conseille d'aller voir le test complet.

scuplfun S9 réglages.png

Mes réglages pour la découpe

A l'heure actuelle, après avoir fait quelques tests, la découpe de bois / mdf est à peu près similaire: puissance 100% (1000) vitesse 600mm/m et un nombre de passes égal à deux passes par millimètre d'épaisseur +1.

Pour un MDF de 5mm, il faudra donc au moins 11 passes.

En ce qui concerne le papier, quel que soit le grammage, une passe à 100% et 800mm/m fera l'affaire.

😍 Et ça marche bien ?

Alors, oui, elle fonctionne très bien. Vraiment. La découpe est nette et fine (faisceau de 0.06mm) et elle coupe bien le bois jusqu'à 10-15mm - comme annoncé sur les specs. Il suffit d'accumuler les passes (au moins 21 pour 10mm de bois) Je vous mets ici quelques photos de travaux et de découpe.

Une affiche Harry Potter un peu spéciale

J'ai fait une affiche dérivée d'une vidéo parodique de Harry Potter:

  1. j'ai créé les images

    hpcoke.png

    photo.png laputaindetarace.png

  2. puis je les ai utilisées dans LaserRGBL pour faire la découpe et la gravure: après 8 essais infructueux qui m'ont permis de voir les conneries à pas faire... ça donne ça.

    IMG 20230223 085657 copie copie.webp

    IMG 20230223 085705 copie copie.webp

    J'ai encore du mal avec la gravure sur papier qui manque de contraste ou passe à travers... Je dois encore affiner. Par contre la découpe est nickel. J'ai collé le craft sur une feuille noire.

Quelques vues au microscope (40x et 800x) permettent de voir à quel point le laser coupe net et fin...

2023-02-23-095506.jpg 2023-02-23-095605.jpg 2023-02-23-095745.jpg

Une découpe de MDF de 4mm

J'ai pris une image trouvée sur pinterest (dont j'ai paumé la source, démerdez-vous ). une fois passée dans laserGRBL:

IMG 20230223 092458 copie.webp IMG 20230223 094310 copie copie.webp

Quelques vues au microscope (face et tranche)

2023-02-23-092921.jpg 2023-02-23-092946.jpg 2023-02-23-093009.jpg 2023-02-23-093036.jpg 2023-02-23-094400.jpg

En prévision ?

Je compte faire quelques tests pour d'autres matériaux comme le cuir, le métal et la céramique pour lesquels je n'ai pas eu le temps de tenter de réalisation.

J'ai aussi envie de me faire un support bois avec des graduations et le point d'origine précis en attendant l'achat du support alvéolé.

📘 Liens & ressources:

😬 Tests

📙 Tutos, installer LaserRGBL sous linux

Je n'y suis pas parvenu, mais il faut dire qu'on ne m'a pas foutu la paix plus de deux minutes d'affilée alors quand tu fous les doigts dans wine, c'est pas gagné d'avance. Le problème n'est pas tant de parvenir à le faire fonctionner que de réussir à binder les ports pour que l'imprimante soit visible par le logiciel.

1. Avec playonlinux: Lien d'origine: https://lasergrbl.com/faq/

(As alternative you can run LaserGRBL in linux with wine 5.0 and wine mono 4.9.4 (wineprefix 32-bit) and windowsdll gdiplus. read more)

2. Avec Wine : https://www.aranacorp.com/fr/installer-lasergrbl-sous-linux/

Pour Mint 21:

sudo dpkg --add-architecture i386
sudo mkdir -pm755 /etc/apt/keyrings
sudo wget -O /etc/apt/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key
sudo wget -nc -P /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/jammy/winehq-jammy.sources
sudo apt update
sudo apt install --install-recommends winehq-staging
sudo apt install mono-complete

puis

wine w/Bureau/install.exe

Conclusion

Pour le moment, je ne regrette absolument pas mon achat, j'ai plein d'idées de réalisations...

Je dirais que cette graveuse découpeuse laser est à réserver à des bricoleurs ayant de la place et que les longues heures de tâtonnement ne vont pas rebuter: elle tient ses promesses, mais faut savoir lui parler...

Travail : la semaine de quatre jours au Royaume-Uni est un succés

@Seb : les gens oublient en général de citer le proverbe entier: «le travail c'est la santé... ne rien faire c'est la conserver»

sinon, ça fait un peu «le travail rend libre» #payeTonPointGodwin

La prochaine fois qu'un boomer privilégié te sort que le travail c'est la santé alors qu'il s'est arrêté de bosser à 55 ans, plutôt que de te lancer dans une diatribe pour lui faire fermer son claque-merde, réponds juste «et en plus il rend libre» Effet garanti ! LOL

Via https://sebsauvage.net/links/

Vous faites pitié - Invidious

Cette claque...

à ajouter à https://www.reddit.com/r/france/comments/10vyuzr/rachel_keke_lors_du_d%C3%A9bat_sur_la_r%C3%A9forme_des/

Ils ne comprendront pas... jamais. Peut-être le jour où la tête des leurs commenceront à rouler dans la poussière...

Javascript: tester la validité des liens d'une page afin de les styler

Petit bout de code fait à la va-vite dans le but de vérifier la validité des liens d'une page. Mon objectif est de pouvoir à terme montrer automatiquement les liens ne répondant plus sur la page où je regroupe les liens de téléchargement illégal

Le bout de code actuel

Dans le code ci-dessous, j'utilise fetch et les promesses pour lancer des requêtes afin de styler les liens testés:

function checkLinks(nodelist){
    function checkUrl(link){
        return fetch(link).then(function(response){     
            return response.status;
        }).catch(function(error){
            return error.status;
        });
    }
    if (!nodelist){
        checkLinks(document.querySelectorAll('.checkLink'));
        return;
    }
    for (let obj of nodelist){
        if (obj.tagName=="A"){
            checkUrl(obj.href).then(function(response){obj.classList.add("status"+response);});
        }else if (obj.hasAttribute("src")){
            checkUrl(obj.src).then(function(response){obj.classList.add("status"+response);});
        }else{
            checkLinks(obj.querySelectorAll("*[href],*[src]"));
        }
    }
}
checkLinks();

Explication rapide

Étape 1

J'ai d'abord fait une fonction qui appelle une URL et renvoie une promesse qui, une fois résolue, renverra le statut de la requête. On y retrouve .then qui renvoie le statut d'une requête qui aboutit et .catch qui renvoie celui d'une requête se soldant par une erreur.

function checkUrl(link){
        return fetch(link).then(function(response){     
            return response.status;
        }).catch(function(error){
            return error.status;
        });
    }

Les plus coquinous d'entre-vous me feront remarquer à juste titre que, vu ce que je renvoie, je pouvais me contenter de

function checkUrl(link){
        return fetch(link).then(function(response){     
            return response.status;
        });
    }

Ceci dit, en prévoyant les deux cas, je m'autorise à gérer le retour différemment selon si ça aboutit ou pas (par exemple retourner «ok200» ou «error404»

Étape 2:

Ce block n'est là que pour simplifier la vie de l'utilisateur en lui évitant de procéder lui-même au querySelectorAll()

if (!nodelist){
        checkLinks(document.querySelectorAll('.checkLink'));
        return;
    }

Étape 3:

Je parcours la nodeList en vérifiant l'URL passée en href (pour les A) ou en src (pour les img par exemple).

Le dernier cas est celui où l'on souhaite vérifier les liens contenus dans un div portant la classe .checkLink : il suffit d'appeler la même fonction de façon récursive en lui fournissant le nodeList des liens contenus das le DIV en question. (ça permet de vérifier un grand nombre de liens sans avoir à leur ajouter individuellement la classe .checkLink, ce qui est particulièrement utile quand on publie des articles en utilisant markdown )

for (let obj of nodelist){
        if (obj.tagName=="A"){
            checkUrl(obj.href).then(function(response){obj.classList.add("status"+response);});
        }else if (obj.hasAttribute("src")){
            checkUrl(obj.src).then(function(response){obj.classList.add("status"+response);});
        }else{
            checkLinks(obj.querySelectorAll("a,img"));
        }
    }

Comment on l'utilise ?

Il suffit de mettre la classe .checkLink à tout objet dont on veut tester les liens et de coller la fonction dans la page puis de l'appeler via un checkLinks(); de bon aloi.

En l'état, la fonction ajoutera une classe .status200 pour les liens ok ou .status404 pour les URL qui ne répondent plus.

Il ne reste plus qu'à styler ces classes en changeant la couleur, le fond ou en ajoutant des emoji avec un petit content. On peut même éventuellement masquer un objet dont l'URL ne répond pas...

Limites

Le script étant en JS, il se heurte évidemment aux règles de la politique CORS: toute requête hors du domaine en cours va échouer à moins de redéfinir le CORS dans le Head de la page via

<meta http-equiv="Content-Security-Policy" content="Content-Security-Policy:..."/>

Licence

Comme d'habitude, il s'agit autant d'un proof of concept que d'une truc utile... en tout cas, n'hésitez pas à en faire rigoureusement ce que vous voulez: c'est cadeau...

SwebDev - La fonction CSS clamp()

Clamp permet de spécifier trois valeurs pour une propriété : la valeur minimale, la valeur préférée et la valeur maximale.

Glopglop N°1

Ainsi, on pourra donner des tailles fixes comme minimum et maximum et une taille variable (pourcentages ou valeur de viewport) comme valeur préférée: la valeur variable sera utilisée, mais bornée au minimum et au maximum. ex: clamp(20px, 5vw, 54px)

Glopglop N°2

On peut faire des calculs directement dans clamp() : font-size: clamp(20px, 16px + 5vw, 54px);

Glopglop N°3

Clamp peut être utilisé sur les paddings, les margins etc... Tout ce qui a une valeur numérique (length, number, percentage...)

Retraites : les arguments du gouvernement à la loupe | Mediapart

Court et synthétique...

Un bon complément au petit guide contre les bobards de la réforme des retraites. - PDF

et à https://twitter.com/_L_O_I_C_/status/1612854730899824641 dont je mets une copie ici:

et http://warriordudimanche.net/article1787/63be88c1968ee

Pour résumer

Du pognon yen a mais il est hors de question de vous le rendre les gars: il doit aller à des cadeaux aux entreprises du CAC40.

DoodleCSS & PaperCSS

Sympa ! Une feuille css permettant de donner un style doodle à la main aux éléments de formulaire HTML en ajoutant une classe au body . exemple

Bon, ya un appel vers google fonts mais rien que goofi ne saurait arranger...

Le Zip fait environ 277ko

EDIT

Merci à vinc[E] qui me signale une alternative très réussie : PaperCSS - 54ko

FireShot Capture 084 - Forms • PaperCSS - www.getpapercss.com.png

Il y a encore un appel à Google Fonts mais plus besoin du recours à un SVG pour les bordures...

Lectures de vacances : 1 légende, 1 labyrinthe, 2 auteurs découverts - Chez Sammy

Ouelcome back copain !

Je partage ton avis sur Dieu David Gemmell et celui qui est sur les quatrième de couv' de ses romans: «on a envie de croire que tout cela fut vrai tant c'est beau»

Écriture simple et claire mais jamais simpliste, univers cohérent (c'est pas si souvent), personnages forts mais humains... <3

Et Pratchett aussi ! (j'ai - encore - recommencé la lecture des annales du disque monde... )

Créer une arborescence en CSS uniquement - Dév. Web - ShevArezo`Blog

Superbe et pas si compliqué... Merci !

EDIT: Comme la page est bourrée de trackers, je copie colle ici et sur mon snippetvamp

CSS


 .tree {
  --spacing: 1.5rem;
  --radius: 10px;
  --marker-bg-default: #ddd;
  --marker-bg-haschild: #6b9abb;
  line-height: 2rem;
}
.tree li {
  display: block;
  position: relative;
  padding-left: calc(2 * var(--spacing) - var(--radius) - 2px);
}
.tree ul {
  margin-left: calc(var(--radius) - var(--spacing));
  padding-left: 0;
}
.tree ul li {
  border-left: 2px solid #ddd;
}
.tree ul li:last-child {
  border-color: transparent;
}
.tree ul li::before {
  content: "";
  display: block;
  position: absolute;
  top: calc(var(--spacing) / -2);
  left: -2px;
  width: calc(var(--spacing) + 2px);
  height: calc(var(--spacing) + 1px);
  border: solid #ddd;
  border-width: 0 0 2px 2px;
}
.tree summary {
  display: block;
  cursor: pointer;
}
.tree summary::marker,
.tree summary::-webkit-details-marker {
  display: none;
}
.tree summary:focus {
  outline: none;
}
.tree summary:focus-visible {
  outline: 1px dotted #000;
}
.tree li::after,
.tree summary::before {
  content: "";
  display: block;
  position: absolute;
  top: calc(var(--spacing) / 2 - var(--radius) + 2px);
  left: calc(var(--spacing) - var(--radius) - 2px);
  width: calc(2 * var(--radius));
  height: calc(2 * var(--radius));
  border-radius: 50%;
  background: var(--marker-bg-default);
}
.tree summary::before {
  content: "+";
  z-index: 1;
  background: var(--marker-bg-haschild);
  color: #fff;
  line-height: calc(2 * var(--radius));
  text-align: center;
}
.tree details[open] > summary::before {
  content: "−";
}

HTML

<ul class="tree">
  <li>
    <details open>
      <summary>Informatique</summary>
      <ul>
        <li>
          <details>
            <summary>Périphériques</summary>
            <ul>
              <li>Clavier</li>
              <li>Souris</li>
              <li>Ecran</li>
            </ul>
          </details>
        </li>
        <li>
          <details open>
            <summary>Stockage</summary>
            <ul>
              <li>Disque dur</li>
              <li>SSD</li>
              <li>Clé USB</li>
            </ul>
          </details>
        </li>
        <li>
          <details>
            <summary>Composants</summary>
            <ul>
              <li>Processeur</li>
              <li>Carte mère</li>
              <li>Mémoire</li>
              <li>
            </ul>
          </details>
        </li>
        <li>
          <details>
            <summary>Composants</summary>
            <ul>
              <li>Processeur</li>
              <li>Carte mère</li>
              <li>Mémoire</li>
              <li>Carte graphique</li>
            </ul>
          </details>
        </li>
      </ul>
    </details>
  </li>
</ul>
</code></pre> codeCarte graphique</li>
            </ul>
          </details>
        </li>
      </ul>
    </details>
  </li>
</ul>
Via https://book.knah-tsaeb.org/
Fil RSS des articles de cette catégorie