思源笔记折腾记录 - 简单挂件 - 显示更多的属性

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

一、实现目的:

思源笔记折腾记录-简单挂件-文章修改时间 - 知乎 (zhihu.com)

思源笔记折腾记录 - 简单挂件 - 文章修改时间 - 链滴 (ld246.com)

的基础上,显示更多的文章属性。

二、实现方法

1、思源笔记的块属性有哪些

我们之前实现的那个挂件可以显示 updated 属性,但是思源的每一个块(不只是文档),其实都有更多的属性。

把之前的文章修改时间挂件里 index.html 内容改成这样:

<!DOCTYPE html>
<html>
<head>
    <script id = "获取属性并修改文档内容">
        let 块id = window.frameElement.parentElement.parentElement.dataset.nodeId
  
        let 获取修改时间 = ()=> fetch("/api/query/sql",{
            method:"post",
            body:JSON.stringify({
                stmt:`select * from blocks where id in (select root_id from blocks where id = "${块id}")`
            })
        }).then(
            res=>{
                return res.json()   
            }
        ).then(
            json=>{
                let data = json.data[0]
                console.log(data)
                document.getElementById('content').innerHTML="当前文章修改于"+
                data.updated.substring(0,4)+"年"+
                data.updated.substring(4,6)+"月"+
                data.updated.substring(6,8)+"日"+
                data.updated.substring(8,10)+"时"+
                data.updated.substring(10,12)+"分"+
                data.updated.substring(12,14)+"秒"
            }
        )
        获取修改时间()
    </script>
</head>
<body>
    <div id="content">
        当前文章修改于2022年11月20号.
    </div>
</body>
</html>

这时插入挂件之后, 在右下角找到image问号图标,然后image点击开发者工具,你应该可以在控制台一栏里面看到这样的输出

image

点击前面的小三角,就可以看到所有的属性了

image

挨个解释一下

{
//别名
    "alias": "",
//笔记本的id
    "box": "20221119002557-ge4j9d8",
//内容,对于文档块来说,就是文档的标题
    "content": "思源笔记折腾记录-简单挂件-显示更多的属性",
//创建时间,不是文件的,而是块的。
    "created": "20221120015012",
//聚焦内容,暂时可以不用管
    "fcontent": "思源笔记折腾记录-简单挂件-显示更多的属性",
//哈希值,暂时可以不用管
    "hash": "7ab346b",
//可读路径,就是用人能看得懂的形式表达这个笔记在哪里
    "hpath": "/思源笔记折腾记录-简单挂件-显示更多的属性",
//kramdown格式的内联属性表,暂时不用管,用另一种格式显示的属性
    "ial": "{: id=\"20221120015012-nhycifh\" title=\"思源笔记折腾记录-简单挂件-显示更多的属性\" updated=\"20221120015505\"}",
//每个块都独一无二的 属性,可以用来找到任何一个具体的块
    "id": "20221120015012-nhycifh",
//内容长度
    "length": 21,
//markdown内容,文档块会是空的
    "markdown": "",
//块备注内容,没备注所以没有
    "memo": "",
//块命名内容,没命名所以没有

    "name": "",
//父块id,没命名所以没有
    "parent_id": "",
//路径,id形式的,这个你绝对看不懂
    "path": "/20221120015012-nhycifh.sy",
//根块id,其实就是文档id,对于文档块来说,几个id都一样
    "root_id": "20221120015012-nhycifh",
//排序用的,暂时不用管
    "sort": 0,
//子类型,很多块的大类下还有子类,暂时不用管
    "subtype": "",
//标签,暂时不用管

    "tag": "",
//类型,对于文档块来说,暂时不用管
    "type": "d",
//修改时间
    "updated": "20221120015505"
}

把属性显示到挂件并且自动刷新

复制一份文档修改时间那个文件夹,改名叫文档属性

然后把它里面的 index.html 改成这样:

<!DOCTYPE html>
<html>
<head>
    <script id = "获取属性并修改文档内容">
        let 块id = window.frameElement.parentElement.parentElement.dataset.nodeId
  
        let 获取修改时间 = ()=> fetch("/api/query/sql",{
            method:"post",
            body:JSON.stringify({
                stmt:`select * from blocks where id in (select root_id from blocks where id = "${块id}")`
            })
        }).then(
            res=>{
                return res.json()   
            }
        ).then(
            json=>{
          
                let data = json.data[0]
                if(data){
                document.getElementById('content').innerHTML=JSON.stringify(data,null,2)
                }
            }
        )
        setInterval(获取修改时间,1000)
  
    </script>
</head>
<body>
    <pre id="content">
    </pre>
</body>
</html>

这个时候,它就会显示出文档的所有属性

image

而且每隔一秒钟,他就会自己刷新。

让属性显示得更好看一点

上面我们直接使用了 pre 标签来原样显示属性,但是我们一般都会让属性显示得更美观一点,所以我们再修改一下 html,就像这样

<!DOCTYPE html>
<html>

<head>
    <script id="获取属性并修改文档内容">
        let 块id = window.frameElement.parentElement.parentElement.dataset.nodeId

        let 获取修改时间 = () => fetch("/api/query/sql", {
            method: "post",
            body: JSON.stringify({
                stmt: `select * from blocks where id in (select root_id from blocks where id = "${块id}")`
            })
        }).then(
            res => {
                return res.json()
            }
        ).then(
            json => {

                let data = json.data[0]
                if (data) {
                    (Object.keys(data)).forEach(
                        属性名 => {
                            let 容器 =  document.getElementById(属性名)
                            if(容器){
                                容器.innerHTML = data[属性名]
                            } 
                        }
                    )
                }
            }
        )
        setInterval(获取修改时间, 1000)

    </script>
    <style>
        label{
            min-width: 100px;
            display: inline-block;
        }
    </style>
</head>

<body>
    <div class="custom-attr__add">
        <div>
            <label >命 名</label><span id="name"></span>
        </div>
        <div>
            <label>别 名</label><span id="alias"></span>
        </div>
        <div>
            <label>备 注</label><span id="memo"></span>
        </div>
        <div>
            <label>标 签</label><span id="tag"></span>
        </div>
        <div>
            <label>路 径</label><span id="hpath"></span>
        </div>
        <div>
            <label>修改时间</label><span id="updated"></span>
        </div>
        <div>
            <label>创建时间</label><span id="created"></span>
        </div>
    </div>
</body>

</html>

image

这样它就能够显示你想要的属性了。

或者你可以使用 tabel 来让它显示成表格。

有关 table 标签的用法参考:

HTML <table> 标签 | 菜鸟教程 (runoob.com)

image

<!DOCTYPE html>
<html>

<head>
    <script id="获取属性并修改文档内容">
        let 块id = window.frameElement.parentElement.parentElement.dataset.nodeId

        let 获取修改时间 = () => fetch("/api/query/sql", {
            method: "post",
            body: JSON.stringify({
                stmt: `select * from blocks where id in (select root_id from blocks where id = "${块id}")`
            })
        }).then(
            res => {
                return res.json()
            }
        ).then(
            json => {

                let data = json.data[0]
                if (data) {
                    (Object.keys(data)).forEach(
                        属性名 => {
                            let 容器 =  document.getElementById(属性名)
                            if(容器){
                                容器.innerHTML = data[属性名]
                            } 
                        }
                    )
                }
            }
        )
        setInterval(获取修改时间, 1000)

    </script>
    <style>
        label{
            min-width: 100px;
            display: inline-block;
        }
    </style>
</head>

<body>
    <table border="1">
        <tr>
            <th >属性名</th><th>属性值</th>
        </tr>
        <tr>
            <td >命 名</td><td ><span id="name"></span></td>
        </tr>
        <tr>
            <td>别 名</td><td ><span id="alias"></span></td>
        </tr>
        <tr>
            <td>备 注</td><td ><span id="memo"></span></td>
        </tr>
        <tr>
            <td>标 签</td><td ><span id="tag"></span></td>
        </tr>
        <tr>
            <td>路 径</td><td ><span id="hpath"></span></td>
        </tr>
        <tr>
            <td>修改时间</td><td ><span id="updated"></span></td>
        </tr>
        <tr>
            <td>创建时间</td><td ><span id="created"></span></td>
        </tr>
    </div>
</body>

</html>

本文使用思源笔记编辑生成,更新于:2022-11-20。

协议:CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0/

  • 思源笔记

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

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

    18619 引用 • 69285 回帖

相关帖子

欢迎来到这里!

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

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