【Laravel】마크다운(Markdown) 사용하기

11308 단어 라라벨Markdown
Laravel Markdown 등으로 검색했을 때 패키지를 추가하여 마크 다운을 표시하는 기사를 보지만

Laravel에는 기본적으로 메일 기능이 있으며 마크 다운을 사용할 수 있습니다.
마크다운을 HTML로 변환할 수 있는 기능이 있습니다.
그것을 사용하면 좋다고 생각했기 때문에 시도했습니다.

하는 방법


Illuminate\Mail\Markdownstatic function parse 라고 하는 것이 있으므로 그것을 사용해 준다

컨트롤러

use Illuminate\Mail\Markdown;

class HogeController extends Controller
{
    public function index()
    {
        $text = <<< EOM
    # 見出し h1
    ## 見出し h2
    ### 見出し h3
    #### 見出し h4
    ##### 見出し h5
    ###### 見出し h6
    **太字**
    - リスト
    - リスト
        - リスト
    - [ ] チェックボックス
    - [x] チェックボックス
    - [ ]

    | Left align       |       Right align |    Center align    |
    |:-----------------|------------------:|:------------------:|
    | This             |              This |        This        |
    | column           |            column |       column       |
    | will             |              will |        will        |
    | be               |                be |         be         |
    | left             |             right |       center       |
    | aligned          |           aligned |      aligned       |
    EOM;



        // 変換
        dd(Markdown::parse($text));
    }
}

결과


입력된 내용에서 변환



보통으로 취득한 데이터를 parse 해 준다
public function index()
{
    $post = Post::find(1);
    // 入力をhtmlspecialcharsのヘルパe()でサニタイズしておく
    $markdown = Markdown::parse(e($post->content));
    // return $markdown;
    // return view('blade',compact('markdown'));
}

// bladeで表示する場合
{{ $markdown }}

모델에 액세서로 정의하는 것이 좋습니다.

HTML을 사용하고 싶지만 XSS를 고려하고 싶습니다.



Laravel 5.5와 6.x에서 확인했지만
5.5라고 내부적으로 Parsedown을 사용하고 있었지만
6.x라고 commonmark로 변경되고 있다

Laravel5.5
    /**
     * Parse the given Markdown text into HTML.
     *
     * @param  string  $text
     * @return \Illuminate\Support\HtmlString
     */
    public static function parse($text)
    {
        $parsedown = new Parsedown;

        return new HtmlString($parsedown->text($text));
    }

Laravel6.x
    /**
     * Parse the given Markdown text into HTML.
     *
     * @param  string  $text
     * @return \Illuminate\Support\HtmlString
     */
    public static function parse($text)
    {
        $environment = Environment::createCommonMarkEnvironment();

        $environment->addExtension(new TableExtension);

        $converter = new CommonMarkConverter([
            'allow_unsafe_links' => false,
        ], $environment);

        return new HtmlString($converter->convertToHtml($text));
    }

commonmark는 문서에 따르면 아래의 태그만 무효화해 준다
<title>
<textarea>
<style>
<xmp>
<iframe>
<noembed>
<noframes>
<script>
<plaintext>

그러므로

적절하게 폴더를 만들고 Markdown 클래스의 parse 만 팩 해 주면 좋다

Markdown

namespace App\Services;

use Illuminate\Support\HtmlString;
use League\CommonMark\CommonMarkConverter;
use League\CommonMark\Environment;
use League\CommonMark\Extension\Table\TableExtension;
// 追加
use League\CommonMark\Extension\DisallowedRawHTML\DisallowedRawHTMLExtension;

class Markdown
{
    public static function parse($text)
    {
        $environment = Environment::createCommonMarkEnvironment();

        $environment->addExtension(new TableExtension);
        // 追加
        $environment->addExtension(new DisallowedRawHTMLExtension());

        $converter = new CommonMarkConverter([
            'allow_unsafe_links' => false,
        ], $environment);

        return new HtmlString($converter->convertToHtml($text));
    }
}
'allow_unsafe_links' => false다음 프로토콜 중 하나를 사용하는 링크를 구문 분석하고 렌더링하지 않도록하기 때문에 false 남아 있습니다.
  • javascript:
  • vbscript:
  • file:
  • data : (data : imagepng, gif, jpeg 또는 webp 형식 제외)

  • GitHub 스타일의 마크 다운을 사용하고 싶습니다.



    하나 위에서 만든 parse 처리에League\CommonMark\Extension\GithubFlavoredMarkdownExtension;
    $environment->addExtension(new GithubFlavoredMarkdownExtension());
    

    를 잡는다.

    좋은 웹페이지 즐겨찾기