Le code du dimanche: Fancytation
Aujourd'hui, c'est cadeau, c'est pour moi: une api permettant de créer une image à partir d'un texte, genre pour pimper un peu une citation (d'où le nom fancytation... gag)
Aujourd'hui, c'est cadeau, c'est pour moi: une api permettant de créer une image à partir d'un texte, genre pour pimper un peu une citation (d'où le nom fancytation... gag)
En passant, j'ai mis à jour ma page sur les caractères unicode...
Il y a plus de rubriques et j'ai ajouté un moteur de recherche qui accepte plusieurs mots séparés par des espaces.
par exemple: http://unicode.warriordudimanche.net/?search=aubergine
Allez, bisou !Certains se souviennent peut-être de goofi, pour récupérer des google fonts en local; sur la base de ce script, j'ai bricolé une version qui permettra de faire la même chose avec les bibliothèques et frameworks (notamment js) que tout un chacun utilise et dont l'appel participe aux stats de google et consorts à chaque requête sur leur serveur.
Donc, en gros, il suffit de remplacer l'appel du script dans le
en ajoutant getlib.php?url= devant.Ainsi
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
deviendra
<script src="http://monserveur/getlib.php?url=https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Le fichier est récupéré une seule fois et seule la vertsion locale sera renvoyée par la suite.
Au cas où vous voulez que le script récupère une éventuelle mise à jour, il suffit d'ajouter update dans l'url:
<script src="http://monserveur/getlib.php?update&url=https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Getlib vérifiera alors si le fichier distant a changé et le retéléchargera si c'est nécessaire.
Comme avec Goofi, seule l'IP du serveur qui héberge le script est connue du serveur distant, jamais celle du visiteur.
C'est tout! Je n'ai pas testé à fond encore et les erreurs ne sont pas gérées pour le moment, mais ça fonctionne quand même pas mal !
<?php
# get libs from distant servers to local (& avoid unnecessary requests to servers who can log user's connections)
# ex:
# https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
# becomes
# getlib.php?url=https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
# if you want to update local file if the distant one changes, just add "update"
# getlib.php?update&url=https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
# author: warriordudimanche.net
#
$lib_folder='libs/';
$check_updates=isset($_GET['update']);
if (!empty($_GET['url'])){
if (!is_dir($lib_folder)){mkdir($lib_folder);}
$url=strip_tags($_GET['url']);
define('LOCAL_FILENAME',$lib_folder.basename($url));
$ext=pathinfo(LOCAL_FILENAME)['extension'];
//$flag='non';
if (
!is_file(LOCAL_FILENAME)
||
($check_updates && !isSameFile($url))
){
$lib=file_get_contents($url,false,null,0,1000000);
file_put_contents(LOCAL_FILENAME,$lib);
$head = array_change_key_case(get_headers($url, TRUE));
file_put_contents(LOCAL_FILENAME.'.info', $head['last-modified']);
//$flag='oui';
}
if ($ext=='css'){
$mime='text/css';
}elseif ($ext=='js'){
$mime='text/javascript';
}else{
$mime=mime_content_type(LOCAL_FILENAME);
}
header('Content-Type: '.$mime);
exit(file_get_contents(LOCAL_FILENAME));
}
function isSameFile($url){
$head = array_change_key_case(get_headers($url, TRUE));
$local=file_get_contents(LOCAL_FILENAME.'.info');
$distant=$head['last-modified'];
return $distant==$local;
}
pluxml2mastodon utilise le chapô ou le contenu (si le chapô est vide) comme corps de message en le retaillant si nécessaire.
Dans les options, il faudra compléter l'url de votre instance et le jeton de sécurité; vous pouvez également ajouter un message d'en-tête et de pied, si vous le souhaitez.
Bon, j'ai un peu tout dit dans le titre... Toutefois, je peux préciser que ce script permet de générer un avatar à partir d'une chaîne de caractères (genre un pseudo, quoi )
Le script utilise les variables $_GET suivantes:
Du coup Par conséquent, la requête suivante:
index.php?str=Bronco&sz=128&c1=ff0000&c2=00ff00
donnera
et
index.php?str=Bronco
donnera
A noter que lorsque l'avatar est généré, il est sauvegardé dans un dossier avatars/ afin d'éviter de le régénérer à chaque demande.
Donc, le premier problème était d'avoir une pattern pour chaque lettre sur une grille qui ne soit pas trop étendue. Après avoir réfléchi un bon moment, je me suis frappé le front en me disant que la pattern était toute trouvée: l'ordre en binaire de la lettre à encoder...
Second problème, le nombre de lettres et de caractères potentiels m'obligeaient à avoir une grille trop grande (minuscules/majuscules/nombres -> 62 caractères !) 62 en binaire 111110, soient 6 cases x2 pour la symétrie, on se retrouve avec une matrice de 12 x 12... trop à mon goût.
Troisième problème, la taille variable des chaînes potentiellement fournies par l'utilisateur. Il faudrait normaliser ces chaînes avant traitement... pfff.
Illumination: le hash d'une chaîne est toujours de la même longueur... et hash('crc32','blabla'); donne toujours une chaîne de 8 caractères hexadécimaux \o/ : tous les problèmes sont résolus:
$h1=hash('crc32',$_GET['str']); # pour la génération du dessin et de la couleur 1
$h2=hash('crc32b',$_GET['str']);#pour la génération de la couleur 2
Il ne reste plus qu'à tracer des carrés de la couleur d'avatar à l'emplacement des 1 et de la couleur de fond à la place des 0.
function drawLine($linenb,$pattern,$size){
global $image,$couleur_avatar,$couleur_fond;
for ($i=0;$i<9;$i++){
$x=$i*$size;
$y=$linenb*$size;
if ($pattern[$i]==1){
imagefilledrectangle ( $image , $x,$y , $x+$size ,$y+$size , $couleur_avatar );
}else{
imagefilledrectangle ( $image , $x,$y , $x+$size ,$y+$size ,$couleur_fond);
}
}
}
Le reste est relativement simple à saisir, je vous mets donc le script complet
<?php
########################
# #
# █████ ████ █████ #
# ██ ██ ██ ██ ██ ██ #
# ██ ██ ██ ██ ██ ██ #
# █████ ██ ██ █████ #
# ██ ██ ██ ██ ██ ██ #
# ██ ██ ██ ██ ██ ██ #
# ██ ██ ████ ██ ██ #
# #
########################
# Ror: avatar generator
# @author: bronco@warriordudimanche.net
# howto: use get vars to generate an avatar (once generated, it'll be saved in avatars/ folder)
# ?str=[string] (required)
# ?sz= [integer] avatar's size (opt.)
# ?c1= [string] avatar's color (opt.)
# ?c2= [string] avatar's background color (opt.)
###############################
# #
# ░░░░ ░ ░░ ░░░░ ░░░░░░ #
# ░░ ░░ ░░ ░░ ░ ░░ ░ #
# ░░ ░░░ ░░ ░░ ░░ #
# ░░ ░░░░░░ ░░ ░░ #
# ░░ ░░ ░░░ ░░ ░░ #
# ░░ ░░ ░░ ░░ ░░ #
# ░░░░ ░░ ░ ░░░░ ░░░░ #
# #
###############################
if (!is_dir('avatars')){
mkdir('avatars');
}
$avatar_filename='';
if (!empty($_GET['c1'])){
$c1=strip_tags($_GET['c1']);
$avatar_filename.='-c1='.$c1;
$c1=separatRGB($c1);
}
if (!empty($_GET['c2'])){
$c2=strip_tags($_GET['c2']);
$avatar_filename.='-c2='.$c2;
$c2=separatRGB($c2);
}
if (!empty($_GET['sz'])){
$size=intval(strip_tags($_GET['sz']));
}
if (empty($size)){$size=128;}
$avatar_filename='x'.$size.$avatar_filename.'.png';
$dotsize=$size/9;
##################################################################
# #
# ░░░░░░ ░░ ░░ ░ ░░ ░░░░ ░░░░░░ ░░░░ ░░░░ ░ ░░ ░░░░ #
# ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░ ░░ ░ ░░ ░░ ░░ ░░ ░░ ░░ ░░ #
# ░░ ░░ ░░ ░░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░░ ░░ ░░ #
# ░░░░░ ░░ ░░ ░░░░░░ ░░ ░░ ░░ ░░ ░░ ░░░░░░ ░░ #
# ░░ ░░ ░░ ░░ ░░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░░ ░░ #
# ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░ #
# ░░ ░░░░ ░░ ░ ░░░░ ░░░░ ░░░░ ░░░░ ░░ ░ ░░░░ #
# #
##################################################################
function separatRGB($color){
$color=str_replace('#','',$color);
if (strlen($color)==3){
$color=$color[0].$color[0].$color[1].$color[1].$color[2].$color[2];
}
$RGB=array();
$RGB['r']=hexdec(substr($color, 0,2));
$RGB['g']=hexdec(substr($color, 2,2));
$RGB['b']=hexdec(substr($color, 4,2));
return $RGB;
}
function drawLine($linenb,$pattern,$size){
global $image,$couleur_avatar,$couleur_fond;
for ($i=0;$i<9;$i++){
$x=$i*$size;
$y=$linenb*$size;
if ($pattern[$i]==1){
imagefilledrectangle ( $image , $x,$y , $x+$size ,$y+$size , $couleur_avatar );
}else{
imagefilledrectangle ( $image , $x,$y , $x+$size ,$y+$size ,$couleur_fond);
}
}
}
###########################################################
# #
# ░░░░ ░░░░░░ ░ ░░ ░░░░░░ ░░░░░ ░░░░ ░░░░░░ ░░░░░░ #
# ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░ ░░ ░ ░░ #
# ░░ ░░ ░░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░ #
# ░░ ░░░ ░░░░░ ░░░░░░ ░░░░░ ░░░░░ ░░░░░░ ░░ ░░░░░ #
# ░░ ░░ ░░ ░░ ░░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░ #
# ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░ ░░ #
# ░░░░ ░░░░░░ ░░ ░ ░░░░░░ ░░ ░░ ░░ ░░ ░░░░ ░░░░░░ #
# #
###########################################################
if (!empty($_GET['str'])){
$h1=hash('crc32',$_GET['str']);
$h2=hash('crc32b',$_GET['str']);
if (empty($c1)){$c1 = separatRGB($h1);}
if (empty($c2)){$c2 = separatRGB($h2);}
$s=$h1.$h2[0];
$file='avatars/'.$s.$avatar_filename;
if (is_file($file)){
header ("Content-type: image/png");
exit(file_get_contents($file));
}
$image = @ImageCreate ($size, $size) or die ("Erreur lors de la création de l'image");
$couleur_fond = ImageColorAllocate ($image, $c1['r'], $c1['g'], $c1['b']);
$couleur_avatar = ImageColorAllocate ($image, $c2['r'], $c2['g'], $c2['b']);
$a[dechex(0)]='000010000';
$a[dechex(16)]='111111111';
for ($i=1;$i<=15;$i++){
$bin=decbin($i);
$bin=str_repeat('0', 4-strlen($bin)).$bin;
$a[dechex($i)]=$bin.'1'.strrev($bin);
}
for ($i=0;$i<9;$i++){
drawLine($i,$a[$s[$i]],$dotsize);
}
header ("Content-type: image/png");
ImagePng($image,$file);
chmod($file,0644);
ImagePng($image);
}
?>
Le script est téléchargeable ici
Pour celles et ceux qui en ont marre de leur semaine, de la météo, de la politique, des affaires, des gens qui tuent leurs conjoints alors qu'ils faisaient genre «chuis trop inquiet sur la vie de ma reum», du code du travail, des inondations, qu'on leur parle de la Seine ou des nichons de la famille Kardachiants, voici un Dump du Dredi: attention, c'est con (mais j'ai ri )
Du coup, j'ai poussé le concept un peu plus loin...
PHP library which will retrieve a thumbnail for any given URL, if available.
Arthur is alive \o/
welcome back Bro' (ノʘヮʘ)ノ*:・゚✧
Il y a quelques jours, j'ai eu à filer un lien vers un travail à mes élèves, j'avais donné un qrcode mais, bien entendu, la plupart ne savait même pas de quoi il s'agissait et ne disposaient de toutes façons pas de l'appli; les voilà donc partis pour taper l'url dans le navigateur, pour ceux qui savaient ce que c'était, ou dans la recherche google pour les autres ...
Donc, voilà, c'est fait.
C'est très minimaliste, fait à l'arrache, mais ça fonctionne: la page d'accueil contient une case pour taper l'url à raccourcir et une autre si vous voulez spécifier un code particulier (sinon, il génère au hasard): si vous précisez un code qui existe déjà, il écrasera l'ancien.
Voir la démo Télécharger le zip
C'est publié sous licence faisCeQueTuVeuxMaGueule (n'hésitez pas à virer le lien du footer si vous voulez )
Je me suis alors dit, ben pourquoi pas moi ?! Seulement, je me voyais pas galérer de la même façon. Donc, j'ai fait un plugin... Un tout chti: là on est sur du (je déteste cette expression pour VRP) made in 5 minutes... c'est simple, j'ai passé plus longtemps sur la rédaction de ce billet que sur la réalisation du plugin...
Je n'ai pas constaté que ça ait cassé quoi que ce soit chez moi, mais bon, la journée n'est pas terminée
J'ai mis à jour la page unicode.warriordudimanche.net pour ajouter la quantité de caractères qui manquaient.
J'ai un peu recodé pour pouvoir faire des packs avec les listes qui ne se suivent pas (genre les maths, 4 packs ), j'ai ajouté un favicon et j'ai un peu changé le look...
Si ça intéresse kékin, ben c'est par là : http://unicode.warriordudimanche.net/
(le github: https://github.com/broncowdd/unicode_page )
Au passage, petit message à Cyrille qui ne manquera pas de grogner à propos de Bozon3:
Je viens de m'apercevoir que j'ai omis de partager un plugin que j'avais fait pour mettre de l'ordre dans les tags de mes articles...
C'est tout con mais ça permet de faire le taf simplement.
Une fois le plugin activé, un lien apparaît dans le menu admin. Sur la page dédiée, les tags sont listés en deux colonnes: celle de droite permet de faire les modifications. Pour effacer un tag, effacez-le de la colonne de droite et sauvegardez...
Allez, amusez-vous et allez dans le pet du saigneur.
Comme ma moitié galérait avec son site de portfolio/galerie-usine à gaz, je lui ai proposé de monter un petit pluXML avec un plugin que je lui goupillerais entre deux tâches parentales, en mode charrette (mon favori)
Donc, prenant mon courage à deux mains et mon clavier, j'ai bricolé ça dans la journée.
Il s'agit d'un plugin volontairement minimaliste: il permet simplement de lier un dossier contenant des images (contenu dans le dossier data/images) à un article.
Lors de l'affichage dudit article, la galerie sera générée et ajoutée en fin d'article automatiquement et sans aucune autre intervention.
Une page de config, minimale elle aussi, permet de fixer la taille des miniatures (à configurer avant utilisation)
J'ai appliqué les modifs proposées par JerryWham et j'ai ajouté un flux rss pour la galerie: chaque article contenant une galerie propose le lien rss vers le contenu du dossier.
C'est très perfectible, mais bon, pour le moment, je peux pas mieux
Exemple de galerie:
RSSPerso, j'utilise Kanboard: il est en PHP, simple à utiliser et à installer et très complet... trop, peut-être, si on n'attend qu'un kanban avec des colonnes et des tâches.
Un jour, je me coderai un truc perso en mode ultra simpliste.
Un jour...