【工具】轻松转换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.addRibbonIcon('dice', 'JSON/MD Table Converter', (evt) => {this.convertToJsonOrMd();}); // 注册指令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) {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.xdnf.cn/news/1486926.html

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

相关文章

Java | Leetcode Java题解之第278题第一个错误的版本

题目&#xff1a; 题解&#xff1a; public class Solution extends VersionControl {public int firstBadVersion(int n) {int left 1, right n;while (left < right) { // 循环直至区间左右端点相同int mid left (right - left) / 2; // 防止计算时溢出if (isBadVers…

【linux驱动开发】卸载驱动时报错:Trying to free already-free IRQ 0

【linux驱动开发】free_irq时报错:Trying to free already-free IRQ 0 卸载驱动时报错Trying to free already-free IRQ 0 第一次加载卸载驱动没有任何问题。第二次加载驱动&#xff0c;按键中断触发失效&#xff0c;卸载驱动时报错:Trying to free already-free IRQ 0 看了…

牛客周赛50轮+cf955+abc363

D-小红的因式分解_牛客周赛 Round 50 (nowcoder.com) 思路&#xff1a; 巨蠢的题目&#xff0c;ax^2bxca1*a2*x^2(b1*a2b2*a1)xb1*b2&#xff0c;即&#xff1a; aa1*a2,ba1*b2a2*b1,cb1*b2 数据范围很小&#xff0c;直接暴力枚举吧&#xff08;注意条件&#xff09; 代码…

简单使用SpringMVC写一个图书管理系统的登入功能和图书展示功能

准备好前端的代码 这里已经准备好了前端的代码&#xff0c;这里仅仅简单的介绍登入功能&#xff0c;和展示图书列表的功能。 如图&#xff1a; 如上图所示&#xff0c;这里的前端代码还是比较多的&#xff0c;在这里我介绍&#xff0c;login.html还有book_list.html这两个。 l…

【快速逆向四/无过程/有源码】浙江工商职业技术学院 统一身份认证

逆向日期&#xff1a;2024.07.23 使用工具&#xff1a;Node.js 加密方法&#xff1a;RSAUtils 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js 标准算法&#xf…

万界星空科技MES系统的智能排产功能

万界星空科技MES系统通过一系列先进的手段和算法进行智能排产&#xff0c;这些手段确保了生产过程的优化和效率的提升。 1、智能分析&#xff1a; MES系统通过收集和分析生产过程中的数据&#xff0c;能够对生产过程进行智能分析。这包括分析哪些工序需要生产&#xff0c;哪些…

01 RabbitMQ:简单介绍

01 RabbitMQ&#xff1a;简单介绍 1. 简单介绍1.1. 什么是消息队列&#xff1f;1.2. 底层实现两大主流方式1.3. 两大主流方式对比1.4. 各个MQ产品的对比 2. RabbitMQ简介1.2. 官网1.3. 体系结构1.3.1. Producer1.3.2. Consumer1.3.3. Connection1.3.4. Channel1.3.5. Broker1.3…

【iOS】——属性关键字

属性关键字的类型 在iOS中属性关键字分为四种类型&#xff1a; 可访问性: readonly ,readwrite原子性 &#xff1a; atomic &#xff0c;nonatomic内存管理 &#xff1a; retain/strong/copy&#xff0c; assign/unsafe_unretained&#xff0c;weak方法命名&#xff1a;sette…

Next.js中构建完整的身份验证系统【翻译】

案例使用第三方库&#xff1a;NextAuth.js, Shadcn/ui, react-hook-form, and Zod等 prisma: is an open-source database toolkit. We will use it to store user credentials.next-auth: Authentication for Next.js.react-hook-form: a library that helps you validate fo…

Github Desktop 关于将本地文件夹设置为新仓库的 使用笔记

实际要达到的结果: 将UE5工程同步到Github,工程太大,我们只需要将必要的工程文件夹同步即可,缓存等一些不必要的文件夹则不需要同步 最终效果预览: 1. 将本地文件夹设置为新仓库 将本地文件夹作为仓库一般你是没有这个仓库的,所以你需要新建一个仓库 如果忽略某些不必要的文…

# OpenCV 图像预处理—形态学:膨胀、腐蚀、开运算、闭运算 原理详解

文章目录 形态学概念膨胀使用膨胀操作来修复裂痕示例代码关键解析&#xff1a; 腐蚀使用腐蚀操作消除噪点示例代码&#xff1a; 开运算—先腐蚀后膨胀闭运算—先膨胀后腐蚀 形态学概念 首先看这两张图片 一张图周围有大大小小的噪音和彩点&#xff0c;另一张图片中字母有间隙&…

go语言Gin框架的学习路线(十一)

目录 GORM的CRUD教程 更新操作 更新所有字段 更新指定字段 使用 Select 和 Omit 更新 无 Hooks 更新 批量更新 删除操作 删除记录 批量删除 软删除 物理删除 示例代码 GORM的CRUD教程 CRUD 是 "Create, Read, Update, Delete"&#xff08;创建、查询、…

Google Cloud Platform数据工程简介

Google Cloud Platform数据工程简介 前言 云计算的出现为数据驱动型组织提供了采用成本效益高且可扩展的数据工程解决方案的机会。在云服务提供商中&#xff0c;Google Cloud Platform (GCP) 是近年来表现优异的领导者之一。GCP的增长被归因于其在企业和初创公司中的日益普及…

【TypeScript 一点点教程】

文章目录 一、开发环境搭建二、基本类型2.1 类型声明2.2 基本类型 三、编译3.1 tsc命令3.2 tsconfig.json3.2.1 基本配置项includeexcludeextendsfiles 3.2.2 compilerOptions编译器的配置项 四、面向对象4.1 类4.2 继承4.3 抽象类4.4 接口 一、开发环境搭建 下载Node.js《Nod…

【全国大学生电子设计竞赛】2023年B题

&#x1f970;&#x1f970;全国大学生电子设计大赛学习资料专栏已开启&#xff0c;限时免费&#xff0c;速速收藏~

IP数据报结构详解:从基础到进阶

目录 IP数据报的格式 IP数据报首部的固定部分 IP数据报首部的可变部分 实例分析&#xff1a;数据报的分片 生存时间&#xff08;TTL&#xff09;与协议 首部检验和 总结 在网络通信中&#xff0c;IP数据报是至关重要的基本单元。本文将带您深入了解IP数据报的格式及其各个…

Python酷库之旅-第三方库Pandas(041)

目录 一、用法精讲 136、pandas.Series.ne方法 136-1、语法 136-2、参数 136-3、功能 136-4、返回值 136-5、说明 136-6、用法 136-6-1、数据准备 136-6-2、代码示例 136-6-3、结果输出 137、pandas.Series.eq方法 137-1、语法 137-2、参数 137-3、功能 137-4、…

数据结构-C语言-排序(4)

代码位置&#xff1a; test-c-2024: 对C语言习题代码的练习 (gitee.com) 一、前言&#xff1a; 1.1-排序定义&#xff1a; 排序就是将一组杂乱无章的数据按照一定的规律&#xff08;升序或降序&#xff09;组织起来。(注&#xff1a;我们这里的排序采用的都为升序) 1.2-排…

如何借助生成式人工智能引领未来的科技狂潮

如何借助生成式人工智能引领未来的科技狂潮 1. 生成式AI的现状1.1 技术基础1.1.1 深度学习1.1.2 生成对抗网络&#xff08;GANs&#xff09;1.1.3 变分自编码器&#xff08;VAEs&#xff09; 1.2 主要应用1.2.1 语言模型1.2.2 图像生成1.2.3 音频与视频生成 2. 未来的发展趋势2…

Windows下帆软BI(finebi)单机部署移植(Tomcat)攻略

一、基础环境 操作系统&#xff1a;Windows 10 64bit 帆软BI 版本&#xff1a;V9.0/V10.0 HTTP工具&#xff1a;Tomcat 外置数据库&#xff1a;Oracle 11g 实验内容&#xff1a;将已经部署好的帆软BI从一台电脑移植到另一台电脑 二、前期准备 1、做好外置数据库移植&…