当前位置: 首页 > news >正文

【工具】轻松转换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表格之间的转换操作,提高了我们的工作效率。希望这款插件能为大家带来便利,如有任何建议或疑问,欢迎在评论区留言交流。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C#调用OpenCvSharp实现图像的角点检测
  • Leetcode—426. 将二叉搜索树转化为排序的双向链表【中等】Plus
  • 1394总线协议
  • Android Handler之消息同步屏障
  • Linux下如何安装配置Fail2ban防护工具
  • Postman中的数据驱动测试:API测试数据准备全攻略
  • HTML + CSS编程规范
  • MLIR的TOY教程学习笔记
  • wget下载github文件得到html文件
  • 2024年自动驾驶规划控制面试及答案
  • AI测试入门:认识AI大语言模型(LLM)
  • Excel下载模板文件和导入文件的步骤
  • Windows:批处理脚本学习
  • 【BUG】已解决:IndexError: positional indexers are out-of-bounds
  • C++树形结构(1 基础)
  • python3.6+scrapy+mysql 爬虫实战
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [LeetCode] Wiggle Sort
  • [nginx文档翻译系列] 控制nginx
  • __proto__ 和 prototype的关系
  • 【剑指offer】让抽象问题具体化
  • canvas 五子棋游戏
  • extjs4学习之配置
  • extract-text-webpack-plugin用法
  • golang中接口赋值与方法集
  • If…else
  • iOS小技巧之UIImagePickerController实现头像选择
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • java取消线程实例
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Netty源码解析1-Buffer
  • Vue2.0 实现互斥
  • vuex 学习笔记 01
  • 从PHP迁移至Golang - 基础篇
  • 工程优化暨babel升级小记
  • 记一次和乔布斯合作最难忘的经历
  • 将 Measurements 和 Units 应用到物理学
  • 警报:线上事故之CountDownLatch的威力
  • 聊一聊前端的监控
  • 容器服务kubernetes弹性伸缩高级用法
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 阿里云重庆大学大数据训练营落地分享
  • 国内开源镜像站点
  • ​数据链路层——流量控制可靠传输机制 ​
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • #微信小程序(布局、渲染层基础知识)
  • ()、[]、{}、(())、[[]]命令替换
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (分布式缓存)Redis分片集群
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (三分钟了解debug)SLAM研究方向-Debug总结