sucresware / 4sucres

Parce qu'à 2 on était pas assez.
https://4sucres.org
9 stars 4 forks source link

Ajout de la balise ~Aesthetic~ #19

Closed mgkprod closed 5 years ago

mgkprod commented 5 years ago

Visiblement, il va falloir passer par un coup de JS, impossible de reproduire le même comportement du script en question en PHP.

Balise : ~Aesthetic~ Délimiteur : ~

Script à "hook" :

https://github.com/prasiman/vaporwave-text-generator/blob/076f9419c7e104038528530c32b425a6a78d2226/script.js#L16-L28

innocenzi commented 5 years ago

Le code est pas très beau mais je comprends pas pourquoi on ne pourrait pas reproduire son comportement en PHP.

J'ai écrit cette fonction vite fait en reprenant le modèle du code que tu as donné :

function vaporwave(string $input) 
{
    $output = '';
    for ($i = 0; $i < strlen($input); $i++) {
        $char = $input[$i];
        list(, $code) = unpack('N', mb_convert_encoding($char, 'UCS-4BE', 'UTF-8'));
        if ($code >= 33 && $code <= 270) {
            $output .=  mb_convert_encoding('&#' . intval($code + 65248) . ';', 'UTF-8', 'HTML-ENTITIES');
        } elseif ($code == 32) {
            $output .= chr($code);
        }
    }

    return trim($output);
}

Ce qui donne :

λ php vaporwave.php
Vaporwave Aesthetic

Lors de l'appel suivant : vaporwave('Vaporwave Aesthetic');. J'ai pas testé beaucoup de cas évidemment, mais en partant du principe que la fonction Javascript donnée fonctionne, celle-ci devrait également être correcte.

mgkprod commented 5 years ago

Noté, j'implémente ça de suite.

edoudev commented 5 years ago

Certains caractères utilisant de l'accentuation, retournent des points d'interrogations et ne sont donc pas convertis en UCS-4BE, voir ce post. Remplacer ces caractères par leur équivalent sans accent serait une solution.

Caractère : séparé par ; è;é;ê;ë ò;ó;ô;õ;ö ù;ú;û;ü à;á;â;ã;ä ç
équivalent : e o u a c
innocenzi commented 5 years ago

Il y a possibilité d'utiliser le Transliterator de PHP pour éviter de réinventer la roue.

transliterator_transliterate('Any-Latin; Latin-ASCII;', $input);

J'ai pas cherché plus loin pour le code caractère à mettre, mais ça prend en charge la plupart des caractères spéciaux :

λ php vaporwave.php
Input: áÁàÀăĂâÂåÅãÃąĄāĀäÄæÆḃḂćĆĉĈčČċĊçÇďĎḋḊđĐðÐéÉèÈĕĔêÊěĚëËėĖęĘēĒḟḞƒƑğĞĝĜġĠģĢĥĤħĦíÍìÌîÎïÏĩĨįĮīĪĵĴķĶĺĹľĽļĻłŁṁṀńŃňŇñÑņŅóÓòÒôÔőŐõÕøØōŌơƠöÖṗṖŕŔřŘŗŖśŚŝŜšŠṡṠşŞșȘßťŤṫṪţŢțȚŧŦúÚùÙŭŬûÛůŮűŰũŨųŲūŪưƯüÜẃẂẁẀŵŴẅẄýÝỳỲŷŶÿŸźŹžŽżŻþÞµаАбБвВгГдДеЕёЁжЖзЗиИйЙкКлЛмМнНоОпПрРсСтТуУфФхХцЦчЧшШщЩъЪыЫьЬэЭюЮяЯ
Output: aAaAaAaAaAaAaAaAaAaeAEbBcCcCcCcCcCdDdDdDdDeEeEeEeEeEeEeEeEeEfFfFgGgGgGgGhHhHiIiIiIiIiIiIiIjJkKlLlLlLlLmMnNnNnNnNoOoOoOoOoOoOoOoOoO
pPrRrRrRsSsSsSsSsSsSsstTtTtTtTtTuUuUuUuUuUuUuUuUuUuUuUwWwWwWwWyYyYyYyYzZzZzZthTH??aAbBvVgGdDeEeEzZzZiIjJkKlLmMnNoOpPrRsStTuUfFhHcC
cCsSsS""??yY''??eEuUaA

Voici le code mis à jour :

function vaporwave(string $input) 
{
    $input = transliterator_transliterate('Any-Latin; Latin-ASCII;', $input);
    $output = '';
    for ($i = 0; $i < strlen($input); $i++) {
        $char = $input[$i];
        list(, $code) = unpack('N', mb_convert_encoding($char, 'UCS-4BE', 'UTF-8'));
        if ($code >= 33 && $code <= 270) {
            $output .= mb_convert_encoding('&#' . intval($code + 65248) . ';', 'UTF-8', 'HTML-ENTITIES');
        } elseif ($code == 32) {
            $output .= chr($code);
        }
    }

    return trim($output);
}

(cc @mgkprod)