recogito-js:用于文本注释/图像注释的前端插件

news2024/11/22 16:18:04

创建批注:

 

继续批注:

右侧批注列表:

1、功能与应用

  • 文本注释:recogito-js可以将注释功能添加到网页上,或者作为构建完全自定义注释应用程序的工具箱。
  • 图像注释:除了文本注释外,它还支持为网页中的图像添加绘图、注释和标签功能。
  • PDF注释:通过@recogito/recogito-react-pdf插件,它还能够支持在React中注释PDF文档。

2、官网及示例

官网:https://github.com/recogito/recogito-js/wiki/API-Reference

示例:https://recogito.github.io/recogito-js/

3、需求:

前面的文章提到过很多的tinyMCE、Vditor、cherryMarkdown、wangEditor等等markdown和富文本编辑器,在这些编辑器生成的文本内容的预览基础上要加上批注功能,用户选中文本后就要弹出批注弹窗,确认批注后右侧会相应展示出批注内容,同时在右侧进行批注的编辑、删除

4、安装与使用:

npm i @recogito/recogito-js@1.8.2

以下示例为文本注释功能:

import { Recogito } from "@recogito/recogito-js";
import "@recogito/recogito-js/dist/recogito.min.css";

// 初始化批注
const initRecogito = () => {
  getAnnoList();
  r = new Recogito({
    content: document.querySelector(".artDetail"), // 批注区域
    readOnly: false,  // 是否只读
    locale: "auto", // 可选择语言 auto会根据浏览器设置选择语言
  });
  r.setServerTime(Date.now()); // 设置批注日期
  r.setAuthInfo({   // 这里设置每个批注携带的默认信息
    id: useUserStore().userId,
    displayName: useUserStore().nickName,
  });
  // 创建批注事件
  r.on("createAnnotation", async function (annotation, overrideId) {
    // 定义一个getInitAnnotate方法拿到创建的这个批注信息
    let newAnno = getInitAnnotate("create", annotation);
    // 因为批注插件不管有没有输入内容都会创建,这里要求了没有批注内容时不允许新建批注
    if (!newAnno.annotationContent?.trim()?.length) {
      getAnnoList(); // 刷新批注列表避免页面出现空批注内容
      return proxy.$modal.msgWarning("请先输入批注内容");
    }
    // 将批注信息存入后端
    submitAnnotation(newAnno)
      .then(({ data }) => {
        recogitoList.value.push(data);  // 在页面右侧回展示批注信息
        proxy.$modal.msgSuccess("新增成功!");
      })
      .catch((err) => {
        getAnnoList();// 刷新批注列表避免页面出现空批注内容
      });
  });

 

  // 在已有批注基础上补充批注
  r.on("updateAnnotation", function (annotation, previous) {
    let newAnno = getInitAnnotate("update", annotation);
    if (!newAnno.annotationContent?.trim()?.length) {
      getAnnoList();
      return proxy.$modal.msgWarning("请先输入批注内容");
    }
    submitAnnotation(newAnno)
      .then(({ data }) => {
        // 补充批注时
        let index = recogitoList.value.findIndex((item) => item.id === data.id);
        recogitoList.value[index] = data;
        proxy.$modal.msgSuccess("新增成功!");
      })
      .catch((err) => {
        getAnnoList();
      });
  });
};

// 更改批注参数
const getInitAnnotate = (title, newAnno, pkId) => {
  let data = {};
  // 创建批注时
  if (title === "create") {
    data.annotationContent = newAnno.body[0]?.value;
    data.textContent = newAnno.target.selector.find(
      (item) => item.type === "TextQuoteSelector"
    )?.exact;
  // 修改批注时
  } else if (title === "update") {
    data.annotationContent = newAnno.body[newAnno.body?.length - 1]?.value;
  } else {
    // 通过外部input框编辑批注
    let annoBody = newAnno.body.find((item) => item.pkId === pkId);
    data.annotationContent = annoBody?.iptValue;
    data.pkId = pkId;
  }
  let annoPosition = newAnno.target.selector.find(
    (item) => item.type === "TextPositionSelector"
  );
  // 按照后端入参要求组装批注内容的结构
  data.annotationId = newAnno.id;
  data.createdBy = useUserStore().name;
  data.endCoordinate = annoPosition.end;
  data.startCoordinate = annoPosition.start;
  data.knwlgId = artDetails.value.pkId;
  data.knwlgNo = artDetails.value.knwlgNo;
  return data;
};

// 获取批注列表并回显
const getAnnoList = () => {
  getAnnotationList({ knwlgId: artDetails.value.pkId })
    .then((res) => {
      recogitoList.value = res.data;  // 批注列表
      setTimeout(() => {
        r.clearAnnotations(); //清除所有批注
        r.setAnnotations(recogitoList.value); // 设置已有批注内容
      }, 500);
    })
    .catch(() => {});
};

// 根据批注id在点击右侧批注列表激活文本域内批注弹窗
const selectAnnotation = (id) => {
  let domList = document.querySelectorAll(".r6o-annotation");
  let activeTop =
    Array.from(domList).find(
      (item) => item.dataset.id === id && item.innerText?.length
    )?.offsetTop - 5;
  document.querySelector(".article-container").scrollTop = activeTop;
  r.selectAnnotation(id);
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1880114.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ros笔记01--初次体验ros2

ros笔记01--初次体验ros2 介绍安装ros2测试验证ros2说明 介绍 机器人操作系统(ROS)是一组用于构建机器人应用程序的软件库和工具。从驱动程序和最先进的算法到强大的开发者工具,ROS拥有我们下一个机器人项目所需的开源工具。 当前ros已经应用到各类机器人项目开发中…

python sklearn机械学习模型-回归

🌈所属专栏:【机械学习】✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您…

可编程定时计数器8253/8254 - 8253入门

时钟-给设备打拍子 概述 在计算机系统中,为了使所有设备之间的通信井然有序,各通信设备间必须有统一的节奏,不能各干各的,这个节奏就被称为定时或时钟 时钟并不是计算机处理速度的衡量,而是一种使设备间相互配合而避…

从需求是如何最终抽象成最基本的传参入参

第一层:出参和入参 用通俗的话讲,就是给客户提供服务的一种方式,需要包含入参和出参 。入口参数就是程序执行时会调用的参数,出口参数就是程序执行完会返回的参数。入参的值是被调函数需要, 出参的值是主调函数需要的…

Suno: AI音乐创作的新时代

名人说:一点浩然气,千里快哉风。 ——苏轼 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、什么是Suno?1、Suno2、应用场景 二、如何使用Suno制作音乐?步骤1:注册…

二级建造师(建筑工程专业)考试题库,高效备考!!!

16.在施工合同履行期间发生的变更事项中,属于工程变更的是()。 A.质量要求变更 B.分包单位变更 C.合同价款变更 D.相关法规变更 答案:A 解析:工程变更一般是指在工程施工过程中,根据合同约定对施工的…

HarmonyOS Next开发学习手册——单选框 (Radio)

Radio是单选框组件,通常用于提供相应的用户交互选择项,同一组的Radio中只有一个可以被选中。具体用法请参考 Radio 。 创建单选框 Radio通过调用接口来创建,接口调用形式如下: Radio(options: {value: string, group: string})…

Python | 计算位涡平流项

写在前面 最近忙着复习、考试…都没怎么空敲代码,还得再准备一周考试。。。等考完试再慢慢更新了,今天先来浅更一个简单但是使用的python code 在做动力机制分析时,我们常常需要借助收支方程来诊断不同过程的贡献,其中最常见的一…

下属无执行力,领导无能为力?用好这3大法则,打造一流行动力

下属无执行力,领导无能为力?用好这3大法则,打造一流行动力 第一个:漏斗法则 在沟通这个领域,有一个漏斗法则,意思就是指:如果你脑袋里面想表达的是100%,那你说出口的会只有80%&…

【动态规划】139. 单词拆分

139. 单词拆分 难度:中等 力扣地址:https://leetcode.cn/problems/word-break/description/ 问题描述 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意:不要求字…

App托管服务分发平台 index-uplog.php 文件上传致RCE漏洞复现

0x01 产品简介 App托管服务分发平台是一个为开发者提供全面、高效、安全的应用程序托管、分发和推广服务的平台。开发者可以将自己开发的应用程序上传到平台上,平台会对上传的应用程序进行审核,确保应用的质量和安全性。平台会根据开发者的要求,将应用分发到不同的应用市场…

【鸿蒙学习笔记】位置设置

官方文档:位置设置 目录标题 align:子元素的对齐方式direction:官方文档没懂,看图理解吧 align:子元素的对齐方式 Stack() {Text(TopStart)}.width(90%).height(50).backgroundColor(0xFFE4C4).align(Alignment.TopS…

C++学习全教程(Day2)

一、数组 在程序中为了处理方便,常常需要把具有相同类型的数据对象按有序的形式排列起来,形成“一组”数据,这就是“数组”(array) 数组中的数据,在内存中是连续存放的,每个元素占据相同大小的空间,就像排…

matrixone集群搭建、启停、高可用扩缩容和连接数据库

1. 部署 Kubernetes 集群 由于 MatrixOne 的分布式部署依赖于 Kubernetes 集群,因此我们需要一个 Kubernetes 集群。本篇文章将指导你通过使用 Kuboard-Spray 的方式搭建一个 Kubernetes 集群。 准备集群环境 对于集群环境,需要做如下准备&#xff1a…

25 防火墙基础操作

1 防火墙进入WEB页面操作 华三防火墙的默认用户:admin/密码:admin 将IP地址改在同一网段的信息 在防火墙的管理地址 GE/0/0/1:192.168.0.1 主机的地址是:192.168.0.101 思考一下为什么Ping不通 security-zone name Management import interface GigabitEthernet1/…

Git安装与使用及整合IDEA使用的详细教程

1. 版本控制软件介绍 版本控制软件提供完备的版本管理功能,用于存储、追踪目录(文件夹)和文件的修改历史,是软件开发者的必备工具,是软件公司的基础设施。版本控制软件的最高目标,是支持软件公司的配置管理…

2 z变换与离散时间傅里叶变换

目录 序列的z变换 z变换的定义 常用典型序列的z变换 序列类型与z变换的收敛域 序列的分类 X(z)的极点与收敛域 单边序列 双边序列 z变换的性质 线性 序列移位 单边序列 双边序列 z域尺度变换 序列乘以n 复共轭序列的z变换 初值定理 终值定理 时域卷积定理 …

Suno体验记录

五月初的时候初体验了一下Suno v3,当时整体觉得还不错,操作简单,生成快,歌曲也算好听。当时就截止到这里了。最近发现有了一些新的更新,觉得可以整理记录一下。 1. 简单介绍 免费用户一天50积分(不累计&a…

python 压缩数据

requests 是 Python 中一个非常流行的 HTTP 库,用于发送各种 HTTP 请求。下面是一个使用 requests 库发送简单 GET 请求和 POST 请求的示例: 首先,确保你已经安装了 requests 库。如果还没有安装,可以使用 pip 进行安装&#xff…

在线教育项目(一):如何防止一个账号多个地方登陆

使用jwt做验证,使用账号作为redis中的key,登录的时候生成token放到redis中,每次申请资源的时候去看token 有没有变,因为token每次登录都会去覆盖,只要第二次登录token就不一样了