Lravel5でMarkdownを使う。

はじめに

今回は、使用しているLravelのバージョンが5.3で、Markdownを導入したかったので、良い物が無いか調べてみた。

Markdownの種類

Laravelですぐに使用したい場合は、Laravel Markdownが良いみたい。
Laravel専用だけあってREADME.mdの通りに構築すればすぐに構築できた。

だが・・・、githubで使用できるmarkdown形式が使用できない(tableなど)それが残念だ。
あと、機能ごと(tableのみ、headlineのみ、引用のみ)などの個々の機能単位で有効/無効までのコンフィグができない・・・
残念ながら、今回は使用しません。

なので、少々手間がかかるのだが、cebe/markdownを使ってみることにする。

構築&作成

ならば、サービスプロバイダーファサードを使って、新たなvendorまたはappディレクトリ内などで作ってしまおうと^^
ここで、サービスプロバイダー&ファサードのことを語ると、とんでもない量になるので、リンクから詳しくは情報を得てくれ

で、app/config/markdown.php と、コンフィグファイルを作り、個々で機能の有効/無効ができたわけです。
<?php
return [
    'html' => 'html5',
    'render' => 'default',

    'render_group' =>[
        'default' => [
            'code'          => true,
            'del'           => true,
            'headline'      => true,
            'hr'            => true,
            'img'           => true,
            'quote'         => true,
            'link'          => true,
            'list_disc'     => true,
            'list_decimal' => true,
            'strong'        => true,
            'table'         => true
        ],
        'profile' => [
            'code'          => false,
            'del'           => true,
            'headline'      => true,
            'hr'            => false,
            'img'           => false,
            'quote'         => true,
            'link'          => false,
            'list_disc'     => true,
            'list_decimal' => true,
            'strong'        => true,
            'table'         => false,
        ]
    ]
];
で、cebe/markdownで、引用の入れ子が1層しか対応していないので、
下記の引用があった場合。
> 引用
>> 引用
>> 引用

通常こうなる。
引用
>引用
>引用

手を加えて下記のようにするには、
引用
引用
引用
\cebe\markdown\block\QuoteTrait.phpを参考に下記のように作り替えました。
<?php
namespace App\Library\Markdown\block;

/**
 * Adds the block quote elements
 */
trait QuoteTrait
{
    /**
     * identify a line as the beginning of a block quote.
     */
    protected function identifyQuote($line)
    {
        return preg_match("/^\s*>/",$line);
    }

    /**
     * Consume lines for a blockquote element
     */
    protected function consumeQuote($lines, $current)
    {
        // consume until newline
        $content = [];
        for ($i = $current, $count = count($lines); $i < $count; $i++) {
            $line = &$lines[$i];

            if (ltrim($line) !== '') {
                if ($line[0] == '>' && !isset($line[1])) {
                    $line = '';
                } else{
                    for($j=0;$j<strlen($line);$j++){
                        if( $line[$j] === ' ' || $line[$j] === "\t") continue;
                        else if($line[$j] === '>'){
                            $line = substr($line, $j+1);
                        }
                        break;
                    }
                }
                $content[] = $line;
            } else {
                break;
            }
        }

        $block = [
            'quote',
            'content' => $this->parseBlocks($content),
            'simple' => true,
        ];
        return [$block, $i];
    }


    /**
     * Renders a blockquote
     */
    protected function renderQuote($block)
    {
        return '<blockquote>' . $this->renderAbsy($block['content']) . "</blockquote>\n";
    }

    abstract protected function parseBlocks($lines);
    abstract protected function renderAbsy($absy);
}

とるすことによって、対応する。namespace は、環境に合わせて変える!

ここまで来れば、思い描いた物は作れるはずです。

自分の場合は、だいたい下記のような感じで使ってます。
use Markdown;

$markdown = Markdown::parse($text,'profile');

最後に

読んでみて、ほとんどの人が、書いている意味が分からないと思いますw
対象者としては、Lravelで余裕でプラグイン等を作れる人でしょうね^^;
これは、自分用のメモかな^^;^^;^^; orz

コメント 

コメントを残す