RytRyu-0817
@RytRyu-0817

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

vue.jsでqiitaやzennのリンクカードを出力できない

解決したいこと

api側から取得してきたqiitaやzennのリンクを使って、html上でリンクカードのリストを表示したい。
↓こんな感じで

発生している問題・エラー

2023-11-24 (4).png
生のリンクが出力される

該当するソースコード

<template>
    <div>
        <HeaderComponent></HeaderComponent>
        <h1 class="sm:text-3xl text-2xl font-medium title-font mb-8 text-gray-900 text-center">記事検索</h1>
        <SearchAtom v-model:keyword="keyword" @search="(word) => keyword = word"></SearchAtom>
        <p>{{ keyword }}</p>
        <div class="mx-auto max-w-screen-2xl px-4 md:px-28 mt-14">
            <ul v-if="posts" class="grid grid-cols-1 mt-8 gap-4">
                <!-- ここでフィルタをした投稿情報をリンクカードとして出力したいーー>>
                <li :href="post.url" v-for="post in filtered_posts" :key="post">
                    <!-- parseMarkdownの引数のurlの前後に改行を入れる -->
                    <p v-html="parseMarkdown(`\n${post.url}\n`)"></p>
                </li>
            </ul>
        </div>
    </div>
</template>

<script setup>
    import HeaderComponent from '../components/HeaderComponent.vue';
    import SearchAtom from "../components/atoms/SearchAtom.vue"
    import axios from "axios";
    import { onMounted, ref, watch } from "vue"
    // markdown-itを使用
    import MarkdownIt from 'markdown-it';


    const keyword = ref("")
    let posts = ref([])
    let filtered_posts = ref([])

    onMounted(() => {
        postSearch()
    })

    watch(keyword, (newkeyword) => {
        filtered_posts.value = []
        posts.value.forEach(post => {
            if(post.title.toLowerCase().indexOf(newkeyword.toLowerCase()) !== -1){
                filtered_posts.value.push(post);
            }
        });
    })

    // markdownをhtmlに変換する
    const parseMarkdown = (text) => {
        const md = new MarkdownIt();
        console.log(md.render(text))
        return md.render(text)
    }

    //api側から投稿の情報(title, linkなど)のオブジェクトのリストを取得し、posts変数に格納
    const postSearch = async () => {
        axios.get("http://127.0.0.1:8000/api/posts/")
        .then((response) => {
            posts.value = response.data.results
            filtered_posts.value = posts.value

        })
        .catch((error) => {
            console.log(error)
        })
    };


</script>

自分で試したこと

markdownのテキストの書き方で、urlの前後に改行を入れて、htmlに変換しようとしたが生のリンクが出てしまう。

0

1Answer

リンクカードはマークダウンの仕様にないので自分でそういう実装をする必要があります。

0Like

Comments

  1. @RytRyu-0817

    Questioner

    変身遅くなりました。コメントありがとうございます。
    ogp画像をスクレイピングして、dbに格納するという処理を実装することにしました。
    少し、重いですが、、、
    調べてみれば、qiitaだけのマークダウンのパーサーにリンクカードの仕様があるのですね...
    ありがとうございます!

Your answer might help someone💌