【Laravel】마크다운(Markdown) 사용하기
Laravel에는 기본적으로 메일 기능이 있으며 마크 다운을 사용할 수 있습니다.
마크다운을 HTML로 변환할 수 있는 기능이 있습니다.
그것을 사용하면 좋다고 생각했기 때문에 시도했습니다.
하는 방법
Illuminate\Mail\Markdown
에 static 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 남아 있습니다.
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));
}
}
public function index()
{
$post = Post::find(1);
// 入力をhtmlspecialcharsのヘルパe()でサニタイズしておく
$markdown = Markdown::parse(e($post->content));
// return $markdown;
// return view('blade',compact('markdown'));
}
// bladeで表示する場合
{{ $markdown }}
/**
* 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));
}
/**
* 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));
}
<title>
<textarea>
<style>
<xmp>
<iframe>
<noembed>
<noframes>
<script>
<plaintext>
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));
}
}
GitHub 스타일의 마크 다운을 사용하고 싶습니다.
하나 위에서 만든 parse 처리에
League\CommonMark\Extension\GithubFlavoredMarkdownExtension;
$environment->addExtension(new GithubFlavoredMarkdownExtension());
를 잡는다.
Reference
이 문제에 관하여(【Laravel】마크다운(Markdown) 사용하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ntm718/items/009c9e611b5c88c1ec3b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)