質問: ### 前提・実現したいこと Qiitaの様なナレッジベースサイトを作っています。すでに、新規のコンテンツ投稿時にマークダウン形式で入力ができる機能を実装できています。 現在、投稿の「一覧」を表示するページを製作中にて、**マークダウンを外したテキストを表示させたい**のですが、**どう実装すれば良いのかわからず、困っています**。 以下の、**マークダウンをつける**方は、無事に実装済みです。 * マークダウンへの変換にはmarked.jsを導入 * 入力時のリアルタイムプレビューも実装 * マークダウンの付いたオリジナルテキストをデータベースへ保存 * 投稿記事の詳細ページでは、データベースから呼び出した後にhtml化して画面に表示させる ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/9ceee48c96139e7d3b479a95b7715977.png) ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/0a3774d3cda265ba3f3e978c9373b123.png) ### 発生している問題・エラーメッセージ 現状は、以下の画像の通りで、マークダウンの特殊記号が付いたテキストをそのまま返しています。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/2e980e5267d1cf7cfaa8671984e844d3.png) マークダウンを外すモジュールには、remove-markdown.jsを使用しており、jsファイルに直打ちでマークダウンの付いたテキストを入れると、マークダウンが外れた状態で表示されるので、モジュール自体は問題なく動作しています。 必要なのは、**投稿の一覧を表示するviewファイルから、モジュールのコードのあるjsファイルまでテキストを投げてあげて、マークダウンを外したテキストを、再び一覧のviewファイルに戻してあげる**ということだと思うのですが、**実装の方法がよくわかりません。** ### 該当のソースコード 一覧を表示させるページです。 @foreach ($posts as $post)で、投稿毎にボディテキスト、タイトル、投稿日時などを表示させています。 この投稿一件ごとの処理の間( @foreach の中)で、ボディテキストを取得して、マークダウンを外す処理を入れてあげる様なイメージをしているのですが、この途中でスクリプトを書き込む(インナースクリプト?)ことは問題ないのでしょうか? 全く別のやり方、例えば文章全体をロードした後に、全部からマークダウンを外す処理を全部にかける?とかがあるでしょうか。教えていただけると嬉しいです。 ``` @extends('layouts.app') @section('content') 投稿を新規作成する @foreach ($posts as $post) タイトル: {{ $post->title }} 投稿者: {{ $post->user->name }} {{-- 投稿のボディテキストの一部を表示させている --}} {{ \Illuminate\Support\Str::limit($post->body, 140) }} {{-- --}} 続きを読む @foreach ($post->tags as $tag) #{{ $tag->name }} @endforeach 投稿日時 {{ $post->created_at->format('Y.m.d') }} @if ($post->comments->count()) コメント {{ $post->comments->count() }}件 @endif @endforeach {{-- ページネーション --}} {{ $posts->links() }} @endsection @section('javascript-footer') {{-- この場所に画面毎(フッタ位置)のjsを記述する --}} @endsection ``` ### 補足情報(FW/ツールのバージョンなど) Laravel6のフレームワークを使用しています、表側はjQuery(javascript)で実装しています。マークダウンとリマークダウンでは以下のモジュールを使用しています。 * marked.js * remove-markdown.js どうぞよろしくお願いします。
回答: > > この投稿一件ごとの処理の間( @foreach の中)で、ボディテキストを取得して、マークダウンを外す処理を入れてあげる様なイメージをしているのですが、この途中でスクリプトを書き込む(インナースクリプト?)ことは問題ないのでしょうか? > > > ビューの中でロジックをガリガリ書くのは可読性が悪くなるので データ取得時、コントローラ内で置換しては如何でしょうか。 ただ、確かに2回回すことになるのでパフォーマンス面が気になるのは分からなくもないですが、 一覧取得だけであればそう一気に何万件も表示させるわけではないでしょうし。 (いずれにしても共通の処理関数作ることになりそうなので、ビューのループ内でその関数通すのもありと言えばあり) teratailも20件ずつの表示ですし、何なら同じようにタイトルだけ表示にして そもそも置換するという作業をしなくても良いようにする、、、、というのも 設計段階で考えても良いように思います。 要は「一覧で中も表示させてどれだけのメリットがあるか」というのを突き詰めることですね。 teratailは「タイトルだけでどういう要件が伝わるようにしよう」というのがガイドラインにあるので 表示させないようになってると思います。(正確には”なった”。以前は質問本文冒頭が表示されていた)