Markdown flavoured WordPress

La un proiect recent a trebuit să implementez rapid două funcționalități din sintaxa markdown: link-uri și imagini. Iată cum am procedat.

Link-uri

Sintaxa markdown pentru link-uri este [anchor](url), prin urmare trebuie să căutăm în text un pattern de acest gen:

function ntz_parseMarkdownLinks($text)
{
  do {
    preg_match('/\[(.*?)\]\((.*?)\)/', $text, $matches);
    if (!empty($matches)) {
      $link = sprintf('<a href="%s">%s</a>', esc_attr($matches[2]), esc_attr($matches[1]));
      $text = str_replace($matches[0], $link, $text);
    }
  } while (!empty($matches)); // iterăm textul de mai multe ori, până nu mai găsim pattern-ul link-urilor

  return $text;
}

Imagini

Sintaxa markdown pentru imagini este ![titlu opțional](url imagine), prin urmare este nevoie doar de două schimbări minore: pattern-ul și tag-ul înlocuit:


function ntz_parseMarkdownImages($text)
{
  do {
    preg_match('/\!\[(.*?)\]\((.*?)\)/', $text, $matches);
    if (!empty($matches)) {
      $link = sprintf('<img src="%s" title="%s" />', esc_attr($matches[2]), esc_attr($matches[1]));
      $text = str_replace($matches[0], $link, $text);
    }
  } while (!empty($matches));

  return $text;
}

Cum folosim aceste funcții?

add_filter('the_content', 'ntz_parseMarkdownImages');
add_filter('the_content', 'ntz_parseMarkdownLinks');

Pentru comentarii:

add_filter('get_comment_text', 'ntz_parseMarkdownImages');
add_filter('get_comment_text', 'ntz_parseMarkdownLinks');

Pentru un string oarecare:

$str = ntz_parseMarkdownLinks($text);

Probleme

Din cauza faptului că cele două sintaxe sunt foarte asemănătoare, este importantă ordinea în care sunt executate cele două: întâi imaginile, apoi link-urile.

2 Likes

Recursiv arata mult mai frumos.

function ntz_parseMarkdownLinks($text) {
preg_match('/\[(.*?)\]\((.*?)\)/', $text, $matches);
    if (!empty($matches)) {
          $link = sprintf('<img src="%s" title="%s" />', esc_attr($matches[2]), esc_attr($matches[1]));
          $text = str_replace($matches[0], $link, $text);
          return ntz_parseMarkdownLinks($text);
    } else return $text;
}
2 Likes