J'ai travaillé sur un convertisseur de démarques aujourd'hui pour un de mes projets. Je me suis perdue et j'ai juste parcouru le code et j'ai remarqué que j'avais énormément de temps pour convertir des listes. Mon code est ci-dessous, je viens de fournir le code qui traite des listes, je pourrais vraiment faire avec quelques suggestions sur le raccourcissement du code, je ne vois juste pas ce que j'ai écrit et j'ai besoin d'une nouvelle paire d'yeux.convertir des listes de démarques en listes html en PHP
<?php
class Markdown {
private static $html = '';
private static $list_types = array(
array(
'>>',
'<ul>',
'</ul>'
),
array(
'>>>',
'<ol>',
'</ol>'
)
);
private static $list_patterns = array(
'/-[ ]+(.+)/' => ' >>\1',
'/[0-9]{1}\. (.+)/' => ' >>>\1'
);
public static function convertText($markdown = array()) {
$markdown = explode("\n", strip_tags($markdown));
foreach ($markdown as &$line) {
$line = htmlentities($line, ENT_QUOTES, 'UTF-8');
foreach (self::$list_patterns as $pattern => $replace) {
if (!is_array($line) && preg_match($pattern, $line)) {
$para = false;
$line = preg_replace($pattern, $replace, $line);
$type = 0;
foreach (self::$list_types as $key => $val) {
if (preg_match('/ ' . $val[0] . ' /', $line))
$type = $key;
}
$line = preg_split('/' . self::$list_types[$type][0] . '/', $line);
$line = array('depth' => strlen($line[0]), 'string' => $line[1], 'type' => $type);
}
}
}
while (!empty($markdown)) {
$snippet = array_shift($markdown);
if (is_array($snippet))
self::makeList($snippet, $markdown);
else
self::$html .= $snippet;
}
return self::$html;
}
private static function makeList($snippet, &$markdown, $last_depth = 0, $close_tag = '') {
if ($last_depth == $snippet['depth'])
self::$html .= sprintf('</li><li>%s', $snippet['string']);
elseif ($last_depth < $snippet['depth'])
self::$html .= sprintf('%s<li>%s', self::$list_types[$snippet['type']][1], $snippet['string']);
elseif ($last_depth > $snippet['depth'])
self::$html .= sprintf('</li>%s<li>%s', $close_tag, $snippet['string']);
$next_snippet = array_shift($markdown);
if (is_array($next_snippet))
self::makeList($next_snippet, $markdown, $snippet['depth'], self::$list_types[$snippet['type']][2]);
else
array_unshift($markdown, $next_snippet);
self::$html .= sprintf('</li>%s', $close_tag);
}
}
?>
Fondamentalement, le code fait beaucoup de correspondance de motif et pour tous les modèles sauf liste il laissera comme une chaîne dans le tableau « minorée $ », pour les listes, il crée un tableau avec le type de liste, la profondeur et la chaîne. Par conséquent, à la fin de la conversion de texte, je peux parcourir le tableau "$ markdown" et construire la structure de la boucle imbriquée en vérifiant si l'élément suivant est un tableau ou non.
Désolé si la question semble vague, ce n'est pas le cas, je veux juste un indice sur la façon de raccourcir mon code car il semble que j'ai écrit des charges.
Merci à l'avance
Luke
Vous vous rendez compte qu'il existe déjà une implémentation complète de démarque PHP dans la nature? Il est sous licence BSD/GPL (ce que vous préférez) afin de l'intégrer dans votre logiciel ne devrait pas être un problème. http://michelf.com/projects/php-markdown/ – ThiefMaster
Ce que @thief a dit. Sauf si vous êtes vraiment intéressé par les roues, ne les réinventez pas. – deceze
J'ai regardé cette classe et après avoir enlevé tous les trucs inutiles pour moi (je n'ai pas besoin des trucs wordpress etc) ses 1500 lignes de code encore. Je sais qu'il y a beaucoup de commentaires sur ces 1500 lignes, mais j'espérais simplement que c'était réalisable dans un paquet plus petit. Et ce genre de roue a de l'intérêt pour moi. Merci pour les commentaires cependant. – Luke