【工具】轻松转换JSON与Markdown表格——自制Obsidian插件

文章目录

  • 一、插件简介
  • 二、功能详解
  • 三、使用教程
  • 四、插件代码
  • 五、总结

一、插件简介

 JsonMdTableConverter是一款用于Obsidian的插件,它可以帮助用户在JSON格式和Markdown表格之间进行快速转换。这款插件具有以下特点:

  1. 轻松识别并转换JSON与Markdown表格;
  2. 支持通过右键菜单、命令面板和插件图标三种方式调用;
  3. 界面简洁,操作简单。

二、功能详解

  1. JSON转换为Markdown表格
     当我们有一段JSON数据,希望将其转换为Markdown表格以便在Obsidian中查看时,JsonMdTableConverter可以轻松实现。插件会自动识别JSON数据中的字段,并生成对应的Markdown表格。
  2. Markdown表格转换为JSON
     同样地,当我们需要在Markdown表格和JSON之间进行转换时,JsonMdTableConverterPlugin也能轻松应对。只需选中Markdown表格,插件便会将其转换为JSON格式。
  3. 方便的调用方式
     为了满足不同用户的使用习惯,JsonMdTableConverter提供了以下三种调用方式:
    (1)插件图标:在Obsidian的编辑器上方,点击插件图标即可调用;
    在这里插入图片描述
    (2)命令面板:按下快捷键(如Ctrl+P),输入“JSON/MD Table Converter”即可;
    请添加图片描述
    (3)右键菜单:在编辑器中右键点击,选择“JSON/MD Table Converter”菜单项。
    请添加图片描述

三、使用教程

  1. 安装插件

    1. 在Obsidian仓库文件夹的.obsidian下创建plugins文件夹
      在这里插入图片描述
      在这里插入图片描述
    2. 在此文件夹下创建插件的文件夹,随意命名,比如json-md-table-converter
      在这里插入图片描述
    3. 在插件的路径下创建两个文件main.jsmainfest.json
      在这里插入图片描述
    4. 将JsonMdTableConverter插件插件代码复制相应的文件中,然后重启Obsidian。
    5. 将插件启动(需要关闭安全模式)
      在这里插入图片描述
  2. 转换操作

    1. 选中需要转换的JSON或Markdown表格内容;
    2. 选中以下三种方式之一进行转换:
      • 点击插件图标;
      • 按下快捷键(如Ctrl+P),输入“JSON/MD Table Converter”;
      • 在编辑器中右键点击,选择“JSON/MD Table Converter”。

四、插件代码

manifest.json

{"id": "json-md-table-converter","name": "JSON to Markdown Table Converter","version": "0.9.0","description": "Convert JSON strings to Markdown tables and vice versa."
}

main.js

const { Plugin } = require('obsidian');class JsonMdTableConverterPlugin extends Plugin {async onload() {// 注册指令this.addCommand({id: 'convert-json-md-table',name: 'JSON/MD Table Converter',callback: () => {this.convertToJsonOrMd();},}); // 注册右键菜单this.registerEvent(this.app.workspace.on('editor-menu', (menu, editor, event) => {menu.addItem((item) => {item.setTitle('JSON/MD Table Converter').setIcon('dice').onClick(() => {this.convertToJsonOrMd();});});}));}convertToJsonOrMd() {const activeLeaf = this.app.workspace.activeLeaf;if (!activeLeaf) return;const editor = activeLeaf.view.sourceMode.cmEditor;const text = editor.getSelection() || editor.getValue();let result = '';try {// 尝试将文本解析为JSONconst json = JSON.parse(text);if (Array.isArray(json) &&json.length > 0 &&typeof json[0] === 'object') {// 转换为Markdown表格result = this.jsonToMdTable(json);} else {// 如果不是数组或者数组元素不是对象,则提示用户return new Notice('Invalid JSON: JSON must be an array of objects.');}} catch (e) {const msg = this.isMarkdownTable(text);if (msg !== 'success') {return new Notice(msg);}// 解析失败,可能是Markdown表格result = JSON.stringify(this.mdTableToJson(text), null, 2);}editor.replaceSelection(result);}jsonToMdTable(json) {const fieldSet = new Set(); // 使用Set来存储不重复的字段for (let i = 0; i < json.length; i++) {const elementKeys = Object.keys(json[i]);for (let j = 0; j < elementKeys.length; j++) {fieldSet.add(elementKeys[j]); // 将字段添加到Set中}}const headers = Array.from(fieldSet);const headerRow = '| ' + headers.join(' | ') + ' |';const separatorRow = '| ' + headers.map(() => ':--:').join(' | ') + ' |';const bodyRows = json.map((obj) =>'| ' + headers.map((header) => obj[header] || '').join(' | ') + ' |');return [headerRow, separatorRow, ...bodyRows].join('\n');}mdTableToJson(mdTable) {const rows = mdTable.split('\n').filter((row) => row.trim() !== '');for (let i = 0; i < rows.length; i++) {rows[i] = rows[i].replace(/^\|+|\|+$/g, '');}const headers = rows[0].split('|').map((header) => header.trim());const jsonArray = rows.slice(2).map((row) => {const values = row.split('|').map((value) => value.trim());return headers.reduce((obj, header, index) => {obj[header] = values[index];return obj;}, {});});return jsonArray;}isMarkdownTable(str) {// 去除字符串首尾的空白字符,并按行分割const lines = str.trim().split('\n');const msg ='Conversion failed: The selected text is neither valid JSON nor a Markdown table.';// 检查至少有两行if (lines.length < 2) {return msg;}// 检查每行是否至少包含一个'|'for (let line of lines) {if (line.indexOf('|') === -1) {return msg;}}let separatorLine = lines[1].replaceAll(' ', '');// 分隔符行应该由'-'或':'组成,并且由'|'分隔if (separatorLine.startsWith('|')) { // 只去掉首尾的各一个'|'separatorLine = separatorLine.slice(1);}if (separatorLine.endsWith('|')) {separatorLine = separatorLine.slice(0, -1);}const separators = separatorLine.split('|');for (let separator of separators) {separator = separator.replaceAll(' ', '');if (separator.startsWith(':')) {separator = separator.slice(1);}if (separator.endsWith(':')) {separator = separator.slice(0, -1);}if (!/^-+$/.test(separator)) {return msg;}}// 检查分隔符行与标题行和内容行的列数是否匹配for (let line of lines) {line = line.trim()if (line.startsWith('|')) {line = line.slice(1);}if (line.endsWith('|')) {line = line.slice(0, -1);}const pipeCount = line.split('|').length;if (pipeCount !== separators.length) {return msg;}}if (lines.length == 2) {return 'Conversion failed: Markdown table should contain at least one row of data.';}return 'success';}
}module.exports = JsonMdTableConverterPlugin;

五、总结

 JsonMdTableConverter插件极大地简化了JSON与Markdown表格之间的转换操作,提高了我们的工作效率。希望这款插件能为大家带来便利,如有任何建议或疑问,欢迎在评论区留言交流。

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

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

相关文章

60个常见的 Linux 指令

1.ssh 登录到计算机主机 ssh -p port usernamehostnameusername&#xff1a; 远程计算机上的用户账户名。 hostname&#xff1a; 远程计算机的 IP 地址或主机名。 -p 选项指定端口号。 2.ls 列出目录内容 ls ls -l # 显示详细列表 ls -a # 显示包括隐藏文件在内的所有内…

【GD32】从零开始学GD32单片机 | 基于SD卡的FatFs文件系统移植(GD32F470ZGT6)

1. 简介 FatFs是一个专门为微处理器设计的通用文件系统&#xff0c;像8051、AVR、PIC、ARM架构的微处理器都能兼容该文件系统。 FatFs文件系统最大的一个优点是它是DOS和Windows兼容的&#xff0c;这意味着你只需要再移植一个USB驱动就可以实现在电脑中访问单片机的储存结构&…

Cookie与Session 实现登录操作

Cookie Cookie 是网络编程中使用最广泛的一项技术&#xff0c;主要用于辨识用户身份。 客户端&#xff08;浏览器&#xff09;与网站服务端通讯的过程如下图所示&#xff1a; 从图中看&#xff0c;服务端既要返回 Cookie 给客户端&#xff0c;也要读取客户端提交的 Cookie。所…

Domainim:一款高效的企业级网络安全扫描工具

关于Domainim Domainim是一款功能强大的企业级网络安全扫描工具&#xff0c;该工具运行效率高&#xff0c;功能完善&#xff0c;可以帮助广大研究人员针对企业或组织网络执行大规模安全扫描任务。 该工具可以快速执行网络安全扫描和域名/子域名网络侦查任务&#xff0c;旨在使…

python毕业设计选题协同过滤算法在音乐推荐系统

✌网站介绍&#xff1a;✌10年项目辅导经验、专注于计算机技术领域学生项目实战辅导。 ✌服务范围&#xff1a;Java(SpringBoo/SSM)、Python、PHP、Nodejs、爬虫、数据可视化、小程序、安卓app、大数据等设计与开发。 ✌服务内容&#xff1a;免费功能设计、免费提供开题答辩P…

暑期C++ 缺省参数

有任何不懂的问题可以评论区留言&#xff0c;能力范围内都会一一回答 1.缺省参数的概念 缺省参数是是声明或定义参数时为函数的参数指定一个缺省值。在调用该函数值时&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参 看了上面定义后&#…

【零基础必看的前端教程】——JavaScript(七)数组

欢迎大家打开前端的新篇章——JavaScript&#xff0c;JavaScript与HTML、CSS合称为前端三大件&#xff0c;JavaScript是前端的重中之重&#xff0c;小洪将继续以零基础视角&#xff0c;带你循序渐进学习前端知识&#xff0c;一看就懂&#xff0c;小白也能转行做前端&#xff01…

vue3实现在新标签中打开指定的网址

有一个文件列表&#xff0c;如下图&#xff1a; 我希望点击查看按钮的时候&#xff0c;能够在新的标签页面打开这个文件的地址进行预览&#xff0c;该如何实现呢&#xff1f; 比如&#xff1a; 实际上要实现这个并不难&#xff0c;参考demo如下&#xff1a; 首先&#x…

渗透测试——利用公网反弹shell到本地的两种方式,vmware虚拟机与主机的端口转发,本地ssh无法上线的问题解决

解决问题&#xff1a; 因长期使用本地模拟靶场&#xff0c;实战护网时并非模拟靶场&#xff0c;shell反弹需要利用公网测试。解决目标站无法反弹到本地的情况。解决本地是windows&#xff0c;虚拟机是kail、linux&#xff0c;无法相互转换流量的情况。 环境搭建 靶机 centOS7 …

VScode 批量操作

VScode 批量操作 批量修改 按住 alt/option 键&#xff0c; 选择需要批量操作的位置 如果是多行&#xff0c;则按住 altshift 键 可以直接操作 但是有时候比如变量命名&#xff0c;可能需要递增操作的命名 需要下载插件 Increment Selection 按照1的方法多选光标之后&am…

html+css+js前端作业 王者荣耀官网5个页面带js

htmlcssjs前端作业 王者荣耀官网5个页面带js 下载地址 https://download.csdn.net/download/qq_42431718/89574989 目录1 目录2 目录3 项目视频 王者荣耀5个页面&#xff08;带js&#xff09; 页面1 页面2 页面3 页面4 页面5

php接口返回的json字符串,json_decode()失败,原来是多了红点

问题&#xff1a; 调用某个接口返回的json&#xff0c;json_decode()失败&#xff0c;返回数据为null&#xff0c; echo json_last_error();返回错误码 4 经过多次调试发现&#xff1a;多出来一个红点&#xff0c;预览是看不到的。 解决&#xff1a;要去除BOM头部 $resul…

vue 搜索框

效果 创建搜索组件&#xff1a; 在Vue项目中&#xff0c;首先需要创建一个搜索组件。这个组件通常包含一个输入框和一个搜索按钮。使用v-model指令将输入框与组件的数据属性&#xff08;如searchKeyword&#xff09;进行双向绑定&#xff0c;以便获取用户输入的关键词。处理搜索…

Linux网络:传输层协议TCP(二)三次挥手四次握手详解

目录 一、TCP的连接管理机制 1.1三次握手 1.2四次挥手 二、理解 TIME_WAIT 状态 2.1解决TIME_WAIT 状态引起的 bind 失败的方法 三、理解CLOSE_WAIT状态 一、TCP的连接管理机制 在正常情况下, TCP 要经过三次握手建立连接, 四次挥手断开连接 1.1三次握手 三次握手顾名思…

Docker从零开始:安装、部署到卸载,一文搞定全流程

Docker是一种开源容器化平台&#xff0c;它允许开发者将应用程序及其依赖打包成轻量级、可移植的容器。这些容器能确保软件在任何环境中稳定运行&#xff0c;无论是开发者的笔记本电脑还是生产服务器。Docker流行的原因在于其提供的隔离性、可移植性和可扩展性&#xff0c;它简…

2024年展望:人工智能领域将呈现怎样的发展趋势?

2024年&#xff0c;人工智能&#xff08;AI&#xff09;领域将继续保持强劲的发展势头&#xff0c;并呈现出多个重要的发展趋势。以下是对该领域未来发展趋势的详细展望&#xff1a; 一、技术创新与融合 多模态生成式AI的崛起&#xff1a; 多模态生成式AI系统能够处理文本、声…

C# 将字符串数组以树型结构化

例如字符串数组&#xff1a; string[] arr { "1","3-4-5-6-7", "2","3-4","3-4-5","3-4-5-6", "3", "6", "4", "6-1", "6-2", "5", "6-1-1&…

李艳波医生怎么挂号?

对于想要预约李艳波医生的患者来说&#xff0c;北京仁爱堂提供了两种便捷的预约方式&#xff1a;来院面诊和视频会诊。来院面诊是传统的就诊方式&#xff0c;患者可以直接前往仁爱堂&#xff0c;与李艳波医生面对面交流&#xff0c;详细了解自己的病情并接受专业的治疗建议。这…

解决Github Copilot无效,无法使用的问题

如果是在Copilot的终端报错 Invalid copilot token: missing token: 403 原因有三种 1&#xff0c;你的账号没有订阅正版的服务&#xff0c;解决办法是购买正版服务 2&#xff0c;你在购买服务的时候&#xff0c;Github上 billing information 地址信息和支付卡片的地址信息不…

关卡1-3:Git

关卡1-3&#xff1a;Git Git基础fork并拉取本次课程的源创建一个gitee自己的仓库 这个是internLM的3期训练营的通关笔记。 任务&#xff1a; 熟悉git熟悉使用git托管平台&#xff0c;常见有github、giteefork官方的训练营的教程项目&#xff0c;提交文件到自己的项目&#xf…