思源笔记折腾记录 -html 块 - 链接卡片

本贴最后更新于 393 天前,其中的信息可能已经时移世改

首先,我们需要解决一个问题:html 块里面的元素没有办法搞到所在块的 id 之类,所以很难通过块属性之类来设置链接标题啥的.

所以我们来搞点奇怪的东西:

//http://127.0.0.1:62532/stage/build/desktop/?v=1681911359712&&blockID=20230421185342-gtv30ov
//siyuan://blocks/20230421185342-gtv30ov
let findHostBlock;
findHostBlock = (element) => {
  try {
    if (element.host) {
      return findHostBlock(element.host);
    }

    if (
      element.parentNode &&
      element.parentNode.getAttribute &&
      element.parentNode.getAttribute("data-node-id")
    ) {
      return element.parentNode;
    }

    return findHostBlock(element.parentNode);
  } catch (e) {
    return undefined;
  }
};




然后我们来造一个 link-card 元素

try {
  class linkCard extends HTMLElement {
    constructor() {
      super();
      this.hostBlock = findHostBlock(this);
      if (this.hostBlock) {
        let shawdow = this.attachShadow({ mode: "open" });
        shawdow.innerHTML = this.render();
      }
    }
    render() {
      return `
    <style>
        .LinkCard:hover{
        background-color:var(--b3-theme-primary-lightest) !important
    }
    .LinkCard{
    position: relative;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    box-sizing: border-box;
    -webkit-flex-direction: row;
    -ms-flex-direction: row;
    flex-direction: row;
    -webkit-align-items: center;
    -webkit-box-align: center;
    -ms-flex-align: center;
    align-items: center;
    width: 60%;
    min-height: 84px;
    border-radius: 8px;
    max-width: 100%;
    overflow: hidden;
    margin: 16px auto;
    padding: 12px 12px 9px 12px;
    background-color: var(--b3-theme-surface) !important;
    text-decoration:none 
  }
  .LinkCard-contents {
    display: block;
    -webkit-flex: 1 1 auto;
    -ms-flex: 1 1 auto;
    flex: 1 1 auto;
    position: relative;
    white-space:normal !important;
}
.LinkCard-image {
    -webkit-flex: 0 0 auto;
    -ms-flex: 0 0 auto;
    flex: 0 0 auto;
    background-color:var(--b3-theme-surface);
    background-size: cover;
    background-position: center;
    position: relative;
    display: block;
    width: 60px;
    height: 60px;
    margin-left: 20px;
    object-fit: cover;
    border-radius: inherit;
    overflow: hidden;
}
.LinkCard-image img ,.LinkCard-image svg{
    width: 100%;
    height: 100%;
    object-fit: cover;
    top: 0;
    position: absolute;
}
.LinkCard-image svg{
  stroke-width:1px !important;
  fill:var(--b3-theme-primary)
}
.LinkCard-title {
    line-height: 20px;
    font-size:20px;
    font-weight:bold;

    display: -webkit-box;
    text-overflow: ellipsis;
    overflow: hidden;
    color:var(--b3-theme-on-surface);
    -webkit-box-orient: vertical;
  
    -webkit-line-clamp: 2;
    padding-bottom:0.5rem
}
.LinkCard-href{
    line-height: 15px;
    font-size:15px;
    display: -webkit-box;
    text-overflow: ellipsis;
    overflow: hidden;
    color:var(--b3-theme-on-surface);
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 1;
    padding-top:0.5rem

}
.LinkCard-subscribe{
  line-height: 15px;
  font-size:15px;
  display: -webkit-box;
  text-overflow: ellipsis;
  overflow: hidden;
  color:var(--b3-theme-on-surface);
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 1;

}
</style>
<div class="LinkCardContainer">
    <a class='LinkCard' href='${getHref(this)}'>
        <span class='LinkCard-contents'>
            <span class='LinkCard-title'>${getTitle(this)}</span>
            <span class='LinkCard-subscribe'><slot></slot></span>
            <span class='LinkCard-href'>${getHref(this)}</span>
        </span>
        <span class="LinkCard-image">
           ${getImg(this)}
        </span>
    </a>
</div>
    `;
    }
  }
  customElements.define("link-card", linkCard);
} catch (e) {}
//\

这是获取图片和标题的函数,图片放在 snippets/assets/linkIcons 文件夹下面了.

其实标题也可以从链接获取,但是我懒得搞了.

function getHref(element) {
  let href =    element.getAttribute("href") ||
  (findHostBlock(element) && findHostBlock(element).getAttribute("custom-href"))
  if(!href.startsWith('http://')&&!href.startsWith('https://')&&!href.startsWith('file://')){
    href='https://'+href
  }
  return (
    href
  );
}
function getTitle(element) {
  return (
    element.getAttribute("title") ||
    (findHostBlock(element) && findHostBlock(element).getAttribute("custom-title"))
  );
}
function getImg(element) {
  let src =
    element.getAttribute("img") ||
    (findHostBlock(element) && findHostBlock(element).getAttribute("custom-img"));
  if (src) {
    return `
    <img src="${src}"></img>
    `;
  } 
  try{
  let href =getHref(element)
  let url =new URL(href)
  let domain = url.host.split('.')
  domain=domain[domain.length-2]+'.'+domain[domain.length-1]
  let iconURL ='/snippets/assets/linkIcons/'+ domain+'.png'
  return `
  <img src="${iconURL}"></img>
  `
  }catch(e){
  return `   
    <svg><def>${
      document.getElementById("iconLanguage").outerHTML
    }</def><use xlink:href="#iconLanguage"></use></svg>
    `;
  }
}

来都来了,再造一个特殊的 script 元素吧,跟原生的 script 基本一样,除了能通过 hostBlock 获取所在的块元素.

//这是一个自己造的很新的script元素,它里面的代码可以获取自己所在的块
try {
  class scriptX extends HTMLElement {
    constructor() {
      super();
      this.style.display = "none";
      this.hostBlock = findHostBlock(this);
      if (this.hostBlock) {
        let iife = new Function(`return (hostBlock)=>{${this.innerText}}`)();
        iife(this.hostBlock);
      }
    }
  }
  customElements.define("script-x", scriptX);
} catch (e) {}

搞完之后在 html 块里面就可以用了嗷

<div>
<link-card  href="www.zhihu.com" title="知乎,分享你刚编的故事" img="">来到知乎,大家都是要学会编故事的啦</link-card>
<link-card  href="www.baidu.com" title="百度一下,癌症起步" img="">反正广告不是我自己写的,跟我百度有什么关系</link-card>
</div>

emmm 好像比之前绿皮版的强一点,不知道为什么截图有点糊, 算了就这样吧.

image

对了这个不一定要用思源笔记折腾记录 - 运行你的笔记 - 链滴 (ld246.com)里面的方法来弄,但是用它运行也没有毛病

如果你想要了解更多原理的话,就自己去搜一下 web components 吧,我就不罗嗦了.


水完收工,如果这玩意对你有用可以去爱发电给我买杯咖啡哒

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

来到知乎,大家都是要学会编故事的啦 反正广告不是我自己写的,跟我百度有什么关系

  • 思源笔记

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

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

    19132 引用 • 71930 回帖
2 操作
leolee 在 2023-04-22 03:20:16 更新了该帖
leolee 在 2023-04-22 03:11:05 更新了该帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    320 引用 • 1679 回帖 • 1 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 501 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 602 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    124 引用 • 580 回帖
  • SpaceVim

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

    3 引用 • 31 回帖 • 81 关注
  • Lute

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

    25 引用 • 191 回帖 • 23 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    76 引用 • 37 回帖
  • wolai

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

    2 引用 • 14 回帖 • 4 关注
  • sts
    2 引用 • 2 回帖 • 154 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    5 引用 • 15 回帖 • 210 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 3 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    918 引用 • 931 回帖
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    40 引用 • 24 回帖
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    76 引用 • 390 回帖
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    122 引用 • 73 回帖
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 406 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 57 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    276 引用 • 686 回帖
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 319 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    138 引用 • 268 回帖 • 186 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    181 引用 • 448 回帖 • 1 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 605 关注
  • 安装

    你若安好,便是晴天。

    130 引用 • 1184 回帖 • 1 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • 笔记

    好记性不如烂笔头。

    306 引用 • 780 回帖
  • WiFiDog

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

    1 引用 • 7 回帖 • 546 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖 • 7 关注