思源笔记折腾记录 - 表格式嵌入块

本贴最后更新于 507 天前,其中的信息可能已经时移俗易

嵌入块表格.gif

嵌入块表格 1.gif

表格式嵌入块呢,顾名思义就是把嵌入块渲染成表格的样式。

也就是说呢,就是看起来像一个表格的嵌入块。

或者说是在嵌入块里面的表格。

那么为什么要有表格式嵌入块呢?

因为有用户说有的时候嵌入块显示成表格的样式比较好,那么聪明的你知道为什么有人要把嵌入块显示成表格呢?

我也很好奇这个问题,简单了解了一下就是在有些情况下需要把嵌入块显示成表格,所以就需要有一个表格式嵌入块的功能。

所以表格式嵌入块的情况就是这样了,原理也还比较简单,直接上代码码吧,代码片段有风险,玩脱了别找我麻烦嗷

import { Model } from "./model.js";
import { 重渲染配置表 } from "./replace.js";
setTimeout(渲染所有嵌入块表格, 1000);
new Model().all(() => {
  setTimeout(渲染所有嵌入块表格, 500);
});
setInterval(渲染所有嵌入块表格, 5000);
async function 渲染所有嵌入块表格() {
  let 嵌入块列表 = document.querySelectorAll(
    '[data-type="NodeBlockQueryEmbed"]'
  );
  嵌入块列表.forEach((嵌入块元素) => {
    try {
      渲染表格(嵌入块元素);
    } catch (e) {
      console.error(e);
    }
  });
}
async function 渲染表格(嵌入块元素) {
  let sql = 嵌入块元素.getAttribute("data-content");
  let id = 嵌入块元素.getAttribute("id");
  let 重渲染配置 = await 获取重渲染配置(sql, id);
  if (
    重渲染配置 &&
    重渲染配置.sql替换 &&
    重渲染配置.sql替换 instanceof Function
  ) {
    sql = await 重渲染配置.sql替换(sql, id);
  }
  if (sql && 重渲染配置) {
    let 查询结果 = await 获取查询结果(sql);
    if (查询结果 && 查询结果[0]) {
      if (校验查询结果为嵌入(查询结果)) {
        return;
      }

      let 表格 = document.createElement("table");
      表格.setAttribute("contenteditable", false);
      表格.setAttribute("spellcheck", false);
      表格.innerHTML = "<colgroup></colgroup>";
      for (let i = 0; i < Object.getOwnPropertyNames(查询结果[0]).length; i++) {
        表格.querySelector("colgroup").innerHTML += "<col></col>";
      }
      let 表头 = await 生成表头(查询结果[0], 重渲染配置, sql, id);
      let 表身 = await 生成表身(查询结果, 重渲染配置, sql, id);
      表格.appendChild(表头);
      表格.appendChild(表身);
      刷新表格(嵌入块元素, 表格);
    }
  }
}
function 获取重渲染配置(sql, id) {
  let 重渲染配置 = 重渲染配置表.find((item) => {
    return item.判定函数(sql, id);
  });
  return 重渲染配置;
}
function 校验查询结果为嵌入(查询结果) {
  let 字段名列表 = Object.getOwnPropertyNames(查询结果[0]);
  return (
    JSON.stringify(字段名列表) ==
    `["alias","box","content","created","fcontent","hash","hpath","ial","id","length","markdown","memo","name","parent_id","path","root_id","sort","subtype","tag","type","updated"]`
  );
}
async function 刷新表格(嵌入块元素, 表格) {
  let 插入容器 = 嵌入块元素.querySelector(
    ".ft__smaller.ft__secondary.b3-form__space--small"
  );
  if (!插入容器) {
    return;
  }
  if (!插入容器.shadowRoot) {
    插入容器.attachShadow({ mode: "open" });
  }
  插入容器.shadowRoot.innerHTML = "";
  插入容器.shadowRoot.innerHTML += `
    <link rel="stylesheet" type="text/css" href="/snippets/embedTable/table.css">
  
    </link>
    `;
  插入容器.shadowRoot.appendChild(表格);
}
async function 获取查询结果(sql) {
  let data = await fetch("/api/query/sql", {
    method: "post",
    body: JSON.stringify({
      stmt: sql,
    }),
  });
  return (await data.json()).data;
}
async function 生成表头(结果条目, 重渲染配置, sql, id) {
  let 字段名列表 = Object.getOwnPropertyNames(结果条目);
  if (
    重渲染配置 &&
    重渲染配置.字段过滤 &&
    重渲染配置.字段过滤 instanceof Function
  ) {
    字段名列表 = await 重渲染配置.字段过滤(字段名列表, sql, id);
  }

  console.log(字段名列表.length);
  let 表头元素 = document.createElement("thead");
  表头元素.innerHTML = "<thead><tr></tr></thead>";

  for await (let 字段名 of 字段名列表) {
    if (
      重渲染配置 &&
      重渲染配置.表头替换 &&
      重渲染配置.表头替换 instanceof Function
    ) {
      字段名 = await 重渲染配置.表头替换(字段名, sql, id);
    }
    表头元素.querySelector("tr").innerHTML += `<th>${字段名}</th>`;
  }
  return 表头元素;
}
async function 生成表身(查询结果, 重渲染配置, sql, id) {
  let 表身元素 = document.createElement("tbody");
  let 字段名列表 = Object.getOwnPropertyNames(查询结果[0]);
  if (
    重渲染配置 &&
    重渲染配置.字段过滤 &&
    重渲染配置.字段过滤 instanceof Function
  ) {
    字段名列表 = 重渲染配置.字段过滤(字段名列表, sql, id);
  }
  for await (let 结果条目 of 查询结果) {
    表身元素.appendChild(
      await 生成行(结果条目, 字段名列表, 重渲染配置, sql, id)
    );
  }
  return 表身元素;
}
async function 生成行(结果条目, 字段名列表, 重渲染配置, sql, id) {
  console.log(字段名列表);
  let 行元素 = document.createElement("tr");
  for await (let 属性名 of 字段名列表) {
    let 属性值 = 结果条目[属性名];
    if (
      重渲染配置 &&
      重渲染配置.表身替换 &&
      重渲染配置.表身替换 instanceof Function
    ) {
      属性值 = 重渲染配置.表身替换(属性值, 结果条目, sql, id);
    }
    console.log(属性值);
    行元素.innerHTML += `<td>${属性值}</td>`;
  }

  return 行元素;
}

model.js 里面是一个很简单的 websocket 监听,就不放出来了,反正有文件,可以自己看一下。

好了文件包在这里,没有依赖就是一个单纯的代码片段,有能力的筒子还可以分享自己写的 replace.js 玩。

链接:https://pan.baidu.com/s/1lNy8oqviEJIg-3pVVbRXmg?pwd=i477
提取码:i477
--来自百度网盘超级会员 V5 的分享

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    19811 引用 • 75861 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • foolishman83

    下载的文件夹放在哪里才能生效,是不是属于挂件?

推荐标签 标签

  • abitmean

    有点意思就行了

    29 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    123 引用 • 168 回帖
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 383 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 234 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 560 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 604 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    83 引用 • 165 回帖 • 13 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3169 引用 • 8208 回帖
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    103 引用 • 126 回帖 • 442 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    229 引用 • 1450 回帖
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 233 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    6888 引用 • 31055 回帖 • 230 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 618 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 1 关注
  • 自由行
    2 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖
  • danl
    89 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    332 引用 • 619 回帖
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 446 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 31 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 53 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    安卓端仓库:Hi-Windom/Sillot-android

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    28 引用 • 25 回帖 • 56 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    51 引用 • 37 回帖 • 3 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 699 关注
  • 创业

    你比 99% 的人都优秀么?

    83 引用 • 1398 回帖