思源笔记折腾记录 - 快速开关代码片段

本贴最后更新于 369 天前,其中的信息可能已经斗转星移

之前我们已经弄了在笔记内以文档的形式写代码片段的活儿了,但是这些代码片段还是要去设置界面才能开关,有点不大方便,所以这回来整个新的活,让它们更方便开关一点点。

首先还是要引入依赖,这回因为需要工具栏和保存代码片段,所以我们需要这两个东西

import 自定义工具栏 from "https://esm.sh/siyuan-noob/customToolbar";
import 核心api from "https://esm.sh/siyuan-noob/utilKernel/kernelApi.js";

import.meta​是 esm 中的一个特殊对象,只有被 import​引入的代码才能够获取这个东西

let url =import.meta.url
let selfID = url.split("/").pop().split(".")[0];

为了正常运行这个代码片段,你需要重新安装思源笔记折腾记录 - 运行你的笔记 - 链滴 (ld246.com)中的代码片段,之前的版本无法支持 import.meta

这里我们是为了用它来判断代码片段是不是你看的这篇文档自己编译出来的(不然它把它自己关了的话开关也就没有了)

自定义工具栏.注册工具栏按钮("#barBack", {
  图标: "#iconCode",
  提示: "开关代码片段",
  点击回调函数: async (event) => {
    const rect = event.currentTarget.getBoundingClientRect();
    let 当前代码片段 = await 核心api.getSnippet({ type: "all", enabled: 2 });
    let 旧代码片段 = JSON.parse(JSON.stringify(当前代码片段));
    当前代码片段.snippets.forEach((item) => {
      if (item.id !== selfID + "js") {
        let element = document.createElement("button");
        element.setAttribute("class", "b3-menu__item");
        let spanText;
        let id;
        let type;
  
        if (!item.id.endsWith("css") && !item.id.endsWith("js")) {
          id = item.id;
          type = item.type=='css'?'css':' js';
          spanText = `<div style="font-size:85%;color:var(--b3-theme-on-surface);width:60px;display:inline-block">${type}</div> 
         ${item.name}`;
        } else {
          if (item.id.endsWith("css")) {
            id = item.id.slice(0, item.id.length - 3);
            type = "cssInNote";
          } else {
            id = item.id.slice(0, item.id.length - 2);
            type = "jsInNote";
          }
	  let href 
	  if(window.require){
           href=`siyuan://blocks/${id}'>${item.name}`;
	  }else{
	href=`${window.location.href.split('?')[0].replace('/stage/build/app/','/stage/build/desktop/')}?id=${id}`
	  }
	            spanText = `<div style="font-size:85%;color:var(--b3-theme-on-surface);width:60px;display:inline-block">${type}</div>
          <a href='${href}'>${item.name}</a>`;

        }
  
        element.innerHTML = `
                  <div class="fn__flex-1">
<span class="fn__space"></span>
                  ${spanText}
                  </div>
                  <span class="fn__space"></span>
                      <input style="box-sizing: border-box"  class="b3-switch fn__flex-center"  type="checkbox" ${
                        item.enabled ? "checked" : ""
                      }>
                  `;
        element.setAttribute("data-type", type);
        element.setAttribute("data-id", id);
        //挂上事件,让菜单项里面的开关可以点击
	element.addEventListener(
          "click",
          (event) => {
            if (event.target.tagName !== "INPUT") {
              return;
            }
            item.enabled = !item.enabled;
            element.querySelector("input").value = item.enabled;
            element
              .querySelector("input")
              .setAttribute("checked", item.enabled);
            event.stopPropagation();
          },
          false
        );
        window.siyuan.menus.menu.append(element);
      }
    });
    //这个方法是思源自带的
    window.siyuan.menus.menu.popup({ x: rect.left, y: rect.top + rect.height });
    //啊这里就是判断要不要重载了
    let cb = async (e) => {
      let target = e.target;
      //如果不是在菜单里面的话
      if (!isMenuClicked(target)) {
        if (JSON.stringify(当前代码片段) !== JSON.stringify(旧代码片段)) {
          await 核心api.setSnippet(当前代码片段);
          window.location.reload();
        } else {
          window.removeEventListener("click", cb);
        }
      }
    };
    window.addEventListener("click", cb);
  },
});

//

这里用到了一个​isMenuClicked​的工具函数

function isMenuClicked(element) {
  if (element.parentElement) {
    if (element.parentElement !== window.siyuan.menus.menu.element) {
      return isMenuClicked(element.parentElement);
    } else {
      return true;
    }
  } else {
    return false;
  }
}

意思就是说如果点击的范围在思源的菜单里面就不管它,如果不在而且代码片段的设置不一样了的话,就重新加载主界面。

效果呢就像这样:

image

好像毛病不大的样子,有链接的那些就是在笔记里面定义的代码片段啦,这样开关起来应该能方便一丢丢


如果这玩意对你有用可以去爱发电给我买杯咖啡

leolee9086 正在创作一些简单的技术教程和小工具,以及设计方面内容 | 爱发电 (afdian.net)

  • 思源笔记

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

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

    18811 引用 • 70381 回帖 • 1 关注
1 操作
leolee 在 2023-04-29 00:10:43 更新了该帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    1 引用 • 11 回帖 • 1 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 409 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖 • 6 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 544 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 40 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 13 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    85 引用 • 895 回帖
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 598 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 1 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    51 引用 • 226 回帖
  • BookxNote

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

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

    1 引用 • 1 回帖
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 87 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 42 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 23 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • 笔记

    好记性不如烂笔头。

    305 引用 • 780 回帖 • 2 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 155 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 394 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 601 关注
  • Firefox

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

    7 引用 • 30 回帖 • 450 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    85 引用 • 1201 回帖 • 448 关注
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 131 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 512 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    164 引用 • 407 回帖 • 524 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 74 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    57 引用 • 22 回帖 • 2 关注