绿皮科技编辑器式反链,慎用

本贴最后更新于 953 天前,其中的信息可能已经时过境迁

通过 hack 的方式实现卡片式超链接 - 链滴 (ld246.com)类似的方式往嵌入块和反链挂 shadowDOM 可以实现绿皮版的编辑器式反链,不过这种就更蛋疼了,对机器性能不是很有信心的话就别尝试了,而且效果也不大好,类似这样

image.png

反正就是嵌入块和反向链接面板能够直接编辑笔记内容了。

代码大概这样,原理跟上面那个差不多,不过因为都是 iframe 插入的移动端界面比较吃性能, 加了个可见性判断,不可见的时候就不加载它了,一样的,试思路的产品, 要实际用的话最好改改哈:

import { DOM监听器 } from "/script/public/DOMwatcher.js"; const hideElements = (panels, protyle) => { if (!protyle) { if (panels.includes("dialog")) { for (let i = 0; i < window.siyuan.dialogs.length; i++) { if (window.siyuan.dialogs[i].destroy()) { i--; } } } return; } if (panels.includes("hint")) { clearTimeout(protyle.hint.timeId); protyle.hint.element.classList.add("fn__none"); } if (protyle.gutter && panels.includes("gutter")) { protyle.gutter.element.classList.add("fn__none"); protyle.gutter.element.innerHTML = ""; // https://ld246.com/article/1651935412480 protyle.wysiwyg.element .querySelectorAll(".protyle-wysiwyg--hl") .forEach((item) => { item.classList.remove("protyle-wysiwyg--hl"); }); } if (protyle.toolbar && panels.includes("toolbar")) { protyle.toolbar.element.classList.add("fn__none"); } if (protyle.toolbar && panels.includes("util")) { const pinElement = protyle.toolbar.subElement.querySelector('[data-type="pin"]'); if ( !pinElement || (pinElement && !pinElement.classList.contains("ft__primary")) ) { protyle.toolbar.subElement.classList.add("fn__none"); } } if (panels.includes("select")) { protyle.wysiwyg.element .querySelectorAll(".protyle-wysiwyg--select") .forEach((item) => { item.classList.remove("protyle-wysiwyg--select"); }); } }; const disabledProtyle = (protyle) => { hideElements(["gutter", "toolbar", "select", "hint", "util"], protyle); protyle.disabled = true; protyle.wysiwyg.element.setAttribute("contenteditable", "false"); protyle.wysiwyg.element .querySelectorAll('[contenteditable="true"][spellcheck="false"]') .forEach((item) => { item.setAttribute("contenteditable", "false"); }); }; export class protyleEditor extends naive.plugin { constructor() { super({ name: "protyleEditor" }); window.siyuan.ws.ws.addEventListener("message", () => { this.hackBacklink(); }); document.addEventListener("mouseover", () => { this.hackBacklink(); }); let 监听选项1 = { 监听目标: `[data-node-id]`, 监听器回调: () => this.hackBacklink(), }; this.DOM监听器1 = new DOM监听器(监听选项1); this.hackBacklink(); /*shadowDocument.body.appendChild(editorElement) let styles= document.head.querySelectorAll('style') styles.forEach( style=>{ let shadowStyle=style.cloneNode(true) shadowDocument.head.appendChild(shadowStyle) } ) let links =document.head.querySelectorAll('link') links.forEach( style=>{ let shadowStyle=style.cloneNode(true) shadowDocument.head.appendChild(shadowStyle) if (shadowStyle.getAttribute('href').startsWith('base')){ let href= shadowStyle.getAttribute('href') href ='/stage/build/app/'+href shadowStyle.setAttribute('href',href) } } ) let Protyle =window.siyuan.layout.centerLayout.children[0].children[0].model.editor.__proto__.constructor console.log('protyleEditor',Protyle) new Protyle(editorElement, { blockId: "20201117101902-2ewjjum", hasContext: false, action: ["cb-get-all"], render: { gutter: true, breadcrumbDocName: false, breadcrumbContext: false }, typewriterMode: false, after: (editor) => { if (window.siyuan.config.readonly) { disabledProtyle(editor.protyle); } editorElement.addEventListener("mouseleave", () => { hideElements(["gutter"], editor.protyle); }); } });*/ } async hackBacklink() { let 目标元素组 = document.querySelectorAll( `.backlinkList.fn__flex-1 ul [data-treetype="backlink"] .b3-list-item__text,.backlinkMList.fn__flex-1 ul [data-treetype="backlink"] .b3-list-item__text` ); let 目标元素组1 = document.querySelectorAll( ".protyle-wysiwyg__embed:not(.protyle-wysiwyg__embed .protyle-wysiwyg__embed)" ); this.createEditor(目标元素组); this.createEditor(目标元素组1); //window.requestAnimationFrame(async() => this.hackBacklink()) } createEditor(目标元素组) { this.渲染计数器=0 目标元素组.forEach(async (块元素,i) => setTimeout(() => { if (块元素.parentElement.dataset.type == "NodeDocument") { this.渲染计数器-=1 return; } if (!this.isInViewPort(块元素)) { this.渲染计数器-=1 if(块元素.shadowRoot){ let element = 块元素.shadowRoot.querySelector("iframe"); element.setAttribute('src','') } return; } if(this.渲染计数器>10){ return } this.渲染计数器+=1 if (!块元素.shadowRoot) { 块元素.attachShadow({ mode: "open" }); let editorElement = document.createElement("div"); let element = document.createElement("iframe"); element.classList.add( "block__popover", "block__popover--move", "block__popover--top" ); element.setAttribute("loading", 'lazy'); element.setAttribute("border", 0); element.setAttribute("width", "100%"); element.setAttribute("frameBorder", "none"); element.setAttribute( "src", `/stage/build/mobile/?hideToolBar=true&&id=${ (块元素.dataset && 块元素.dataset.id) || 块元素.previousElementSibling.dataset.id }` ); editorElement.className = "block__edit fn__flex-1 protyle"; 块元素.shadowRoot.appendChild(element); } else { let element = 块元素.shadowRoot.querySelector("iframe"); if ( element && element.getAttribute("src") !== `/stage/build/mobile/?hideToolBar=true&&id=${ (块元素.dataset && 块元素.dataset.id) || 块元素.previousElementSibling.dataset.id }` ) { element.setAttribute( "src", `/stage/build/mobile/?hideToolBar=true&&id=${ (块元素.dataset && 块元素.dataset.id) || 块元素.previousElementSibling.dataset.id }` ); } } }, 10) ); } isInViewPort(element) { const viewWidth = window.innerWidth || document.documentElement.clientWidth; const viewHeight = window.innerHeight || document.documentElement.clientHeight; const { top, right, bottom, left } = element.getBoundingClientRect(); return top >= -100 && left >= -100 && right <= viewWidth+200 && bottom <= viewHeight+200; } } export const environments = ["APP"];
  • 思源笔记

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

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

    24937 引用 • 102730 回帖

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • 对了 源代码还是依赖我自用的 naive 主题的,所以要在别的地方用的话可能需要稍微改改,不过改动应该也不算大

推荐标签 标签

  • OneDrive
    2 引用
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 400 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    28 引用 • 197 回帖 • 29 关注
  • Jenkins

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

    54 引用 • 37 回帖 • 1 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 108 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 26 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    286 引用 • 248 回帖 • 11 关注
  • Follow
    4 引用 • 12 回帖 • 11 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    22 引用 • 148 回帖 • 9 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 719 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖 • 1 关注
  • 笔记

    好记性不如烂笔头。

    310 引用 • 794 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 164 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1742 回帖 • 1 关注
  • Excel
    31 引用 • 28 回帖
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    335 引用 • 324 回帖
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 391 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 702 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 218 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    93 引用 • 113 回帖
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 757 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    16 引用 • 236 回帖 • 268 关注
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    134 引用 • 904 回帖
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 736 关注
  • Access
    1 引用 • 3 回帖 • 2 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 163 关注