PHP html listelerine markdown listeleri dönüştürme

0 Cevap php

Benim bir proje için bugün bir markdown dönüştürücü üzerinde çalışıyoruz. Ben kaybetti ve sadece koştu kod boyunca ve ben listeleri dönüştürmek için büyük miktarda vardı fark var. Benim kod aşağıda, ben sadece ben sadece cant ne yazdım geçmiş görmek ve gözleri bir çift taze gerek, ben gerçekten kodunu kısaltılması bazı önerileri ile yapabilirdi, listeleri ile ilgilenen kod sağladığınız.

<?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);
  }

}

?>

Temelde kod desen eşleştirme sürü yapar ve liste dışında herhangi bir desen için listeleri için liste türü, derinlik ve dize ile bir dizi oluşturur, array "$ markdown" bir dize olarak bırakacaktır. Ben "$ markdown" dizi boyunca döngü ve bir sonraki öğeyi bir dizi olup olmadığını kontrol ederek iç içe döngü yapısı oluşturmak metin dönüştürme sonunda orada fore.

Soru belirsiz görünüyor eğer Üzgünüm, onun için ment değil, ben sadece yükleri yazdım gibi görünüyor benim kodu kısaltmak için bazı ipucu istiyorum.

Şimdiden teşekkürler

Luke

0 Cevap