2010-11-30 9 views
3

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

+9

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

+0

Ce que @thief a dit. Sauf si vous êtes vraiment intéressé par les roues, ne les réinventez pas. – deceze

+0

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

Répondre

0

Comme l'a dit @Theifmaster, michelf.com/projects/php-markdown est déjà complet et génial donc j'ai fini par l'utiliser comme je ne vais pas vraiment réussi à ajouter quelque chose de plus utile pour elle. Bonne expérience d'apprentissage en commençant à écrire le code.

2

@Theifmaster est probablement une meilleure façon d'avancer. Mais, j'ai réussi à enlever 2 lignes de code, et la variable inutilisée $ para;

<?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()) { 
    foreach (explode("\n", strip_tags($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)) { 
      $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); 
    } 

} 

profiter

+0

lol merci pour l'économie de 2 lignes :) +1 – Luke

Questions connexes