JeuWeb - Crée ton jeu par navigateur
PHP Comment ai-je ramené les articles du wiki? - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : PHP Comment ai-je ramené les articles du wiki? (/showthread.php?tid=8244)



Comment ai-je ramené les articles du wiki? - Xenos - 15-09-2020

Salut,

pour le fun, et parce que partager devrait être un réflexe, voilà la méthode que j'ai utilisée:

1) J'ai laissé Murthy retrouver les articles sur le web (parce que depuis le CTF qu'on a fait, je sais qu'il sait chercher sur le net alors que moi ça me gonfle x) )
=> Il a trouvé https://web.archive.org/web/20120306055848/http://wiki.jeuweb.org/start
2) J'ai essayé de trouver un HTML2BBCode mais ceux que j'ai trouvés sont nazes... alors tant pis, je me suis dit "je vais déjà ramener les données, on verra après"
3) J'ai ramené à la mano le contenu des articles (copié/collé texte) et les images (enregistrées sous à la mano, puis uploadée en attachement à la mano, zippées s'il y en a trop)
4) Le lendemain, je me suis aperçu que remettre l'article en forme à partir du texte brut, c'est affreux (et il manque des données, genre la position des images ou les liens)
5) J'ai repris chaque sujet, l'un après l'autre, et j'ai rouvert un onglet sur le wiki sur mon autre écran
6) Clic droit dans le wiki, copier l'intérieur du HTML, et je récupère ce qui se trouve dans la <div class="page">
7) Je le colle dans un fichier raw.txt
8) Je crée un fichier convert.php avec le code suivant (que j'ai étoffé au fil des articles, en trouvant des tags que j'avais oubliés/mal parsés):


<?php
$data = file_get_contents('raw.txt');
$data = preg_replace('~^.*<!-- TOC END -->\\s+~s', '', $data);
$data = preg_replace('~\\s*<!-- wikipage \\w+ -->\\s*~s', '', $data);
$data = preg_replace('~\\s*<h1>(?:<a[^>]+>)?([^<]+)(?:</a>)?</h1>\\s*~', "\n\n$1\n", $data);
$data = preg_replace('~\\s*<h2>(?:<a[^>]+>)?([^<]+)(?:</a>)?</h2>\\s*~', "\n\n$1\n", $data);
$data = preg_replace('~\\s*<h3>(?:<a[^>]+>)?([^<]+)(?:</a>)?</h3>\\s*~', "\n\n$1", $data);
$data = preg_replace('~\\s*<h\\d>(?:<a[^>]+>)?([^<]+)(?:</a>)?</h\\d>\\s*~', "\n\n$1", $data);
$data = preg_replace('~<div class="level\\d+">|</div>|<p>|</p>|</?(?:acronym|tbody|br|dl|dt|dd)[^>]*>|</li>~', '', $data);
$data = preg_replace('~<a [^>]*href="(?:https://web.archive.org/web/\\d+/)?([^"]+)"[^>]+>(.*?)</a>~', '$2', $data);
$data = preg_replace('~(?:\\[url=[^>]+\\])?<img [^>]*src="[^"]*(/[^/"]+)"[^>]+/?>(?:\\[/url\\])?~', '{Image (attachment) $1}', $data);
$data = preg_replace('~<embed [^>]*src="[^"]*(/[^/"]+)"[^>]+/?>~', '{attachment $1}', $data);
$data = preg_replace('~<(?Confusedtrong|b)>(.*?)</(?Confusedtrong|b)>~s', '$1', $data);
$data = preg_replace('~<(?:em|i)>(.*?)</(?:em|i)>~s', '$1', $data);
$data = preg_replace('~<(?:u)>(.*?)</(?:u)>~s', '$1', $data);
$data = preg_replace('~<(?:code)>(.*?)</(?:code)>~s', '
Code :
$1
', $data);
$data = preg_replace('~<(?:blockquote)>(.*?)</(?:blockquote)>~s', '
Citation :$1
', $data);
$data = preg_replace('~<hr/?>~', '

', $data);
$data = preg_replace('~<(table|tr|td|th)[^>]*>\\s*(.*?)\\s*</(?:\1)>~s', '[$1]$2[/$1]', $data);
$data = preg_replace('~<(table|tr|td|th)[^>]*>\\s*(.*?)\\s*</(?:\1)>~s', '[$1]$2[/$1]', $data);
$data = preg_replace('~<(table|tr|td|th)[^>]*>\\s*(.*?)\\s*</(?:\1)>~s', '[$1]$2[/$1]', $data);
$data = str_replace(array('“', '”'), '"', $data);

$data = preg_replace_callback('~<ul>(.*?)</ul>~s', static function ($match): string {
return '
  • ' . preg_replace('~<li class="level\\d+"><div class="li">\\s*~', '
  • ', $match[1])
    . '
';
}, $data);

$data = preg_replace_callback('~<pre class="code( [^"]+)?">(.*?)</pre>~s', static function ($match): string {
return '[code' . (($match[1] ?? false) ? "=" . trim(trim($match[1]), '=') : '') . ']'
. preg_replace('~<[^>]+>~', '', $match[2])
. '[/ code]';
}, $data);

$data = preg_replace('~\\n{3,}~', "\n\n", $data);

$data = mb_convert_encoding(html_entity_decode($data), 'utf-8');

if (strpos($data, '<') !== false) {
echo "REMAINING < IN DATA!\n";
}

file_put_contents('out.txt', $data);

9) Je lance la commande php -f convert.php dans un terminal ouvert dans le même dossier que le fichier PHP (et que le raw.txt)
10) Je récupère le contenu de out.txt ainsi créé, je le relis vite fait et le corrige si besoin
11) Je déplace le topic dans la section appropriée
12) J'édite le topic, je mets (ou non) le tag "Article" suivant si c'est pertinent, j'édite le titre, je colle le contenu de out.txt dans le message, et je sauve
13) Je passe au topic de wiki suivant jusqu'à épuisement des topics

Voilà Smile
Et on ne juge pas de la qualité du code PHP hein x)