MavonEditor——使用自定义工具栏按钮插入文本片段

本文介绍了如何在使用MavonEditor时通过引用外部视频平台链接来插入视频,以及如何自定义编辑器工具栏以添加插入视频功能。通过创建对话框获取用户输入的视频链接和类型,然后格式化并插入到Markdown文本中。同时,文章讨论了这种方法的优点(省时、省力、省资源、省钱)和潜在风险(视频可能被删除的不稳定性)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用的文本编辑器是MavonEditor

1、Github原版:MavonEditor

2、Gitee也有不少人搬运

需求

我需要快速且便利的在文章中插入一个视频
直接将视频上传至我的服务器不现实,硬盘资源很
然后我想到了图床的应用方法,同样可以套用到视频存储上
即:将视频上传至视频网站,然后引用网站的链接
优点:省时、省力、省资源、省钱
缺点:不稳定,视频有随时被删除的风险

目标平台:优酷、B站等

如何在Markdown中插入视频

这里参考了:Markdown中如何插入视频 > iframe?
视频都是在首页随便找的,而且CSDN已经不支持这种方式
Blibili

<div align=center width=100%>
	<iframe 
	    height=500
	    width=80% 
	    src='//player.bilibili.com/player.html?aid=845937343&bvid=BV1V54y157Vm&cid=349069295&page=1' 
	    frameborder=0 
	    'allowfullscreen'>
	</iframe>
</div>

在这里插入图片描述
优酷

<div align=center width=100%>
	<iframe 
	    height=500
	    width=80% 
	    src='https://player.youku.com/embed/XNTE2Mjc0Njg0MA==' 
	    frameborder=0 
	    'allowfullscreen'>
	</iframe>
</div>

在这里插入图片描述

关于MavonEditor自定义工具栏

官方给出的只有一点点的 相关例子只有一个图片上传功能,且实现的方法并没有涉及自定义工具栏
所以可以参考:mavon-editor 自定义工具栏按钮,实现文件上传功能(或其他自定义功能)。
以下是完整代码

<template>
  <div class="editor-box">
  	<!--mavon-editor的主体-->
    <mavon-editor  
      :toolbars="toolbars"   
      :ishljs="true"    
      style="height:100%"   
      v-model="value"       
      @change="change"   
      ref=md
    >
      <!-- 引用视频链接的自定义按钮 -->
      <template v-slot:left-toolbar-after>
      <!--点击按钮触发的事件是打开表单对话框-->
        <el-button type="text" @click="dialogFormVisible=true" aria-hidden="true" class="op-icon fa" title="插入视频资源">
          <i class="el-icon-video-camera-solid" />
        </el-button>
      </template>
    </mavon-editor>

    <!-- 插入视频链接的dialog提示框,表单对话框 -->
    <el-dialog title="插入视频资源" :visible.sync="dialogFormVisible">
      <el-form :model="form">
        <el-form-item label="视频链接" :label-width="formLabelWidth">
          <el-input v-model="form.link" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="链接类型" :label-width="formLabelWidth">
          <el-select v-model="form.region" placeholder="请选择链接类型">
            <el-option label="iframe标签" value="iframe"></el-option>
            <el-option label="url链接" value="url"></el-option>
          </el-select>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible = false">取 消</el-button>
        <!--单机确定按钮后触发 videoLink事件函数,开始格式化链接格式并插入到文本域-->
        <el-button type="primary" @click="videoLink">确 定</el-button>
      </div>
    </el-dialog>

    <!-- 错误提示框 -->
    <el-dialog
      title="提示"
      :visible.sync="dialogVisible"
      width="30%"
      id="link-error">
      <span>视频链接格式错误,请重新确认后再输入!</span>
      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
      </span>
    </el-dialog>
  
  </div>
</template>

<script>
export default {
  data() {
    return {
        toolbars: {
        // 工具栏设定可以参考官方文档
        },
        value: '',	// 存放 mavon-editor 文本域的内容
        dialogFormVisible: false,	// 用于控制表单对话框的开启和关闭
        dialogVisible: false,		// 用于控制错误提示对话框的开启和关闭
        formLabelWidth: '120px',	// 设定表单对话框内表单是宽度
        form: {		// 表单对话框内表单的数据
          link: '',
          region: ''
        }
    }
  },
  methods: {
  	// 格式化视频链接并插入到文本域的函数
    videoLink() {
    	// 准备链接模板
      let linkFrame = '';
      let linkFrameStart = "<div align=center width=100%><iframe height=500 width=80% src='"
      let linkFrameEnd = "' frameborder=0 'allowfullscreen'></iframe></div>"
      // 创建一个div盒子,为提取src做准备
      var box = document.createElement("div");
      // 将原始链接插入到盒子中
      box.innerHTML=this.form.link;
      // 判断不同的视频原链接类型
      if(this.form.region == "url"){
        linkFrame = linkFrameStart + this.form.link + linkFrameEnd;
      }else if(this.form.region == "iframe" && box.getElementsByTagName("iframe").length > 0) {
        // 从iframe标签中提取src属性
        linkFrame = linkFrameStart + box.getElementsByTagName("iframe")[0].getAttribute("src") + linkFrameEnd;
      }else {
        // 原始链接格式错误时弹出错误提示
        this.dialogFormVisible=false;
        this.dialogVisible=true;
      }
      // 复原表单文本框内容
      this.form.link = '';
      this.form.region = '';

      // 获取文本域中当前光标起始位置、结束位置以及滚动条位置(滚动条位置我认为没有必要,如有需要可以自己取消注释)
      let textarea = document.getElementsByClassName("auto-textarea-input")[0];
      let posStart = textarea.selectionStart;
      let posEnd = textarea.selectionEnd;
      // let posScroll = document.getElementsByClassName("v-note-edit")[0].scrollTop;
      // 获取文本域中未选中的的前半部分和后半部分,以被选中内容起始和结束位置做分割点
      let subStart = this.$refs.md.d_value.substring(0, posStart);
      let subEnd = this.$refs.md.d_value.substring(posEnd, this.$refs.md.d_value.length);
      // 拼接并替换文本域内容
      this.$refs.md.d_value = subStart + '\n' + linkFrame + '\n' + subEnd;
      // document.getElementsByClassName("v-note-edit")[0].scrollTop = posScroll;
      
      // 关闭对话框
      this.dialogFormVisible = false;
    }
  },

}
</script>

<style>
</style>

效果展示

插入视频前

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<think>嗯,用户想了解如何用和队列实现“下较大”的算法。首先,我得回忆下什么是“下较大”问题。通常这类问题指的是,对于数组中的每个元素,找到在其之后第个比它大的元素,如果没有的话就返回-1或者某种标记。例如,数组[4, 3, 5],对应的下较大应该是[5,5,-1]或者类似的结果,具体要看题目要求。 接下来,用户提到了使用和队列来解决这个问题。但根据我的知识,这类问题通常使用来高效解决,比如“每日温度”问题或者“下个更大元素I”这样的经典题目。队列可能不太常用,但或许在某些变种问题中有应用。需要先确认用户的具体需求,但根据常见情况,应该是主要的数据结构。 那经典的解法是怎样的呢?比如,单调的方法。维护中保存的是尚未找到下个更大元素的元素的索引。遍历数组,对于每个元素,如果当前元素比顶元素大,则顶元素的下个更大就是当前元素,弹出顶,并继续比较,直到顶元素不小于当前元素。然后将当前元素入。这样时间复杂度是O(n),因为每个元素最多入次。 不过用户的问题提到了队列的应用,这可能让我需要思考是否有其他方法。比如,是否可以将数组的元素先存入队列,然后逐个处理,但这样可能需要双重循环,时间复杂度较高,O()。或者有没有其他利用队列特性的方法?不过通常队列的先进先出特性可能不太适合这种需要反向或顺序处理的问题,所以可能用户的问题还是以为主,队列可能作为辅助结构? 或者,用户提到的“下较大”可能有不同的定义,比如循环数组中的下较大,这时候可能需要用队列来模拟循环结构?比如,将数组复制份接在原数组后面,然后使用单调处理,但这样其实还是的应用,队列只是用来存储元素。 不过根据用户提供的引用内容,引用[2]和[4]提到了和队列的应用,比如用两个实现队列,或者在实验内容中涉及和队列的应用,比如迷宫问题、农夫过河等。但具体到“下较大”,可能需要回到的典型应用。 那么解决方案的大致步骤应该是:使用单调,从右往左遍历数组,或者从左往右?例如,对于每个元素,保持顶是下个可能的较大。例如,从右往左遍历,中保存的是已经处理过的元素,这些元素可能是当前元素的候选。或者从左往右,遇到更大的元素时处理中的元素。 比如,个常见的实现步骤: 初始化个空个结果数组。遍历数组,从右到左: - 对于当前元素nums[i],循环检查是否非空且顶元素小于等于当前元素,如果是,则弹出顶,因为这些较小的元素不可能成为后续元素的下较大。 - 如果非空,则当前元素的下较大顶元素;否则为-1。 - 将当前元素压入中。 这样处理之后,每个元素的下较大就被正确记录了。例如,数组[4,3,5]的处理过程: i=2(元素5),为空,结果[ , , -1]。压入5。 i=1(元素3),顶5>3,所以结果[ ,5,-1]。压入3。 i=0(元素4),顶3<4,弹出,顶5>4,所以结果[5,5,-1]。压入4。 这样得到正确的结果。这种方法的时间复杂度是O(n),因为每个元素入次。 那如何用队列呢?比如,是否可以将所有元素按顺序存入队列,然后对于每个元素,遍历队列中的后续元素直到找到更大的?但这样时间复杂度是O(),效率不高。所以可能队列并不是最优解,但用户的问题可能要求同时使用和队列,或者需要结合两者。 不过根据用户提供的引用[2]中的例子,用两个实现队列,或许用户的问题需要结合和队列的结构来设计算法?例如,将元素存入队列,然后使用辅助来帮助寻找下较大。但这样的思路可能需要更多的步骤。 或者,问题本身可能有不同的变种,例如,在队列中动态处理元素,实时维护下较大的信息。这种情况下,可能需要设计数据结构,能够支持在队列操作(入队、出队)的同时快速查询当前队列中的下较大。但这样的问题可能更复杂,需要结合和队列的特性。 不过用户的问题可能更偏向于经典的“下个更大元素”问题,因此应该以单调的解法为主。但用户提到的是和队列的应用,所以可能需要将两者都包含进去,或者解释的应用,并讨论可能的队列应用场景。 接下来,根据用户提供的引用,引用[2]中提到了用两个实现队列的方法,或许可以启发另种思路:例如,将数组的元素先全部入队列,然后逐个出队并用处理。但这种方法可能并没有带来效率上的提升,反而增加复杂度。 综上,最合理的解决方案还是使用单调,从左到右或从右到左遍历数组,维护个递减的,这样可以在O(n)时间内解决问题。而队列可能在这种特定问题中并不适用,但可能在某些变种问题中有用。因此,在回答中需要明确说明的应用,并可能提及队列在类似问题中的潜在应用,但主要解决方案基于。 现在需要将思路整理成步骤,并给出具体的代码实现。例如,用Python实现单调解决下个更大元素的问题。 此外,用户提供的引用中,引用[2]提到用两个实现队列的操作,这可能与问题本身无关,但需要确保回答正确引用相关内容。例如,在解释的应用时,可以引用的结构和操作,如入、出等。 最后,生成相关问题,如时间复杂度、优化方法、变种问题等。</think>### 与队列实现“下较大”算法解决方案 #### 问题定义 给定个整数数组,为每个元素找到其右侧第个比它大的(若不存在则返回-1)。例如: 输入数组:$[4, 3, 5]$ 输出结果:$[5, 5, -1]$ --- #### 核心思路与实现步骤 **单调**是解决此类问题的经典方法,其时间复杂度为$O(n)$,空间复杂度为$O(n)$[^2]。 具体步骤: 1. **初始化**:创建个空`stack`和个结果数组`res`(初始化为-1)。 2. **反向遍历**:从右向左遍历数组,利用维护个**递减序列**。 3. **操作**: - 若顶元素 ≤ 当前元素,弹出顶(这些元素不可能是后续元素的“下较大”)。 - 若非空,顶即为当前元素的“下较大”,否则为-1。 - 将当前元素压入中。 --- #### 代码实现 ```python def next_greater_element(nums): n = len(nums) res = [-1] * n stack = [] for i in range(n-1, -1, -1): # 反向遍历 while stack and stack[-1] <= nums[i]: stack.pop() if stack: res[i] = stack[-1] stack.append(nums[i]) return res ``` --- #### 关键分析 1. **单调特性**:内元素始终保持递减顺序,确保能快速找到最近的更大。 2. **反向遍历意义**:从右向左遍历时,中保存的是已处理元素的候选,避免重复比较[^4]。 3. **时间复杂度**:每个元素最多入、出次,总操作次数为$2n$,时间复杂度为$O(n)$。 --- #### 队列的潜在应用 虽然队列的**先进先出**特性与此问题不直接相关,但在以下场景可能结合使用: 1. **动态数据流**:若数据以队列形式动态输入,可结合实时更新结果。 2. **循环数组扩展**:将原数组复制为双倍长度模拟循环数组,用队列辅助遍历[^2]。 --- #### 示例验证 输入:`nums = [4, 3, 5]` 执行过程: - `i=2`(元素5):为空 → `res[2]=-1`,压入5 → `stack=[5]` - `i=1`(元素3):顶5>3 → `res[1]=5`,压入3 → `stack=[5,3]` - `i=0`(元素4):弹出3(3≤4),顶5>4 → `res[0]=5`,压入4 → `stack=[5,4]` 输出结果:`[5, 5, -1]` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值