首页 > 其他分享 >如何实现在markdown中渲染iframe

如何实现在markdown中渲染iframe

时间:2024-05-28 15:13:58浏览次数:22  
标签:markdown 渲染 标签 react Markdown iframe

如何实现在markdown中渲染iframe

demo展示地址:Create Next App

项目源代码: https://github.com/KazooTTT/markdown-iframe-preview/

https://github.com/KazooTTT/markdown-iframe-preview/

使用的markdown渲染器是:GitHub - remarkjs/react-markdown: Markdown component for React

https://pictures.kazoottt.top/2024/04/20240401-99bfb1d8434e94e5b66182ed42bc09b7.png

有两种方案,第一种是iframe以html的语法嵌入(1),第二种是重写a标签把它转化为iframe(3)。

iframe直接嵌入markdown

### Iframe

<iframe src="./" width="100%" height="500"></iframe>

参考:

iFrame Not Rendering · Issue #661 · remarkjs/react-markdown · GitHub

GitHub - remarkjs/react-markdown: Markdown component for React

也就是引入rehypeRaw这个rehypePlugin,实现在markdown中嵌入html。

(谨慎使用,需要保证html内容安全的情况下嵌入)

import Markdown from "react-markdown"
import rehypeRaw from "rehype-raw"

const DempPage = () => {
  return <Markdown rehypePlugins={[rehypeRaw]}>{markdownContent}</Markdown>
}

a标签转化为iframe

在某些情况下我们需要把a标签的对应的网页直接展示出来,这个时候就要把a标签转化为iframe了。实现的方法是重写a这个组件。

下面是我的写法,我需要把链接中有/agent/special的所有的链接都以iframe的形式展示出来。于是做了一个特殊判断来实现这个逻辑。对于其他的不满足要求的a标签,则直接渲染为a标签即可。

这里还可以做一些拓展的写法,比如检查到网易云的音乐链接,就在前面加一个网易云的logo,如果检测到外链那么点击的时候打开新的窗口等等。

import Markdown from "react-markdown";

const DemoPage = () => {
  <Markdown
    components={{
      a(props) {
        const { href, children } = props;
        if (href && href.indexOf("/agent/special") != -1) {
          return (
            <iframe src={href} width="100%" height="500" allowFullScreen />
          );
        }
        // 否则,渲染为普通的 <a> 链接
        return (
          <a href={href} target="_blank" rel="noopener noreferrer">
            {children}
          </a>
        );
      },
    }}
  >
    {markdownContent}
  </Markdown>;
};

标签:markdown,渲染,标签,react,Markdown,iframe
From: https://www.cnblogs.com/KazooTTT/p/18218048/how-to-render-iframes-in-markdown

相关文章

  • Markdown语法
    前提:本节主要是相关markdown的基本语法元素,其他不过多阐述标题#的数量代表标题的级别,一个#是一级标题,五个#是五级标题,标题就相当于(<h1>-<h5>),不过使用#写标题时,写完#中间要有个空格。#一级标题##二级标题...######六级标题也可用快捷键来实现标题级数:ctrl+1一级......
  • 动态渲染之vue页面向组件间传值
    ==Vue页面文件==//vue文件引入组件importceliangjulifrom"@/components/Map/celiangjuli.vue";//使用组件key:celiangMethod(任意名)<celiangjuli:celiangMethod="celiangMethod"></celiangjuli>////定义初始化valueletceliangMethod=ref();//......
  • 解决前端性能瓶颈:高效处理大量数据渲染与复杂交互的策略与优化方法
    ✨✨祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心!✨✨ ......
  • <iframe>标签的使用
     前言:    最近做项目需要使用到腾讯位置服务(这个之后分享),其中用到了一个之前一直没用到的标签:<iframe>,一时居然不知道这个是干什么用的。今天分享一下。下面这段代码是我用来测试地图的html代码,直接复制粘贴使用即可:<!DOCTYPEhtml><htmllang="en"><head> <me......
  • TestMarkdown1
    VSCode实时预览还需要执行Markdown:OpenPreviewtotheSide命令来实现。在命令窗口输入Markdown:OpenPreviewtotheSide命令一级标题二级标题三级标题四级标题五级标题六级标题====创建脚注格式类似这样[^RUNOOB]。斜体文本斜体文本粗体文本粗体文本......
  • Vue.js条件渲染与列表渲染指南
    title:Vue.js条件渲染与列表渲染指南date:2024/5/2620:11:49updated:2024/5/2620:11:49categories:前端开发tags:VueJS前端开发数据绑定列表渲染状态管理路由配置性能优化第1章:Vue.js基础与环境设置1.1Vue.js简介Vue.js(读音:/vjuː/,类似于"view")......
  • markdown
    标题一级标题二级标题三级标题四级标题五级标题六级标题字体加粗:helloworld斜体:helloworld斜体加粗:helloworld删除线:Helloworld引用成年人的崩溃从算了开始,计算机的崩溃从不算了开始分割线图片超链接点击跳转我的博客首页列表第一步第二步第三步......
  • 【vue与iframe通讯】
    vue与iframe通讯发送数据vue向iframe发送数据iframe向vue发送数据接收信息(vue&iframe通用)实现相互通讯通讯流程图实现代码vue页面iframe页面`iframe`内部重定向访问地址,更新`vue`路由代码下载前言:vue嵌套iframe实现步骤发送数据vue向iframe......
  • gin框架模板渲染
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录gin框架模板渲染自定义模板函数静态文件处理gin框架模板渲染这个目录的路径要放正确(虽然我也不知道为什么突然就解决了)==错误模板====正确版本==packagemainimport( "net/http"......
  • 前端服务端React(Next.js)、Vue(Nuxt.js)、Angular(Universal)渲染搭建和开发案例
    前端服务端渲染(Server-SideRendering,简称SSR)是一种Web开发技术,它允许服务器动态生成HTML内容,然后将其发送到客户端,客户端再将这些HTML内容渲染成页面。这种方式可以提高首屏加载速度,改善SEO,以及提供更好的用户体验。前端服务端渲染搭建步骤:选择框架:选择支持服务端渲染......