{"body":{"post":{"id":"6w1h5t6w3m076r081u60","createdAt":"2022-10-10T01:53:12.697Z","updatedAt":"2022-10-12T01:28:18.960Z","title":"Dataview 查询片段记录","content":"---\ncreated: 2022-10-11 09:12:57\nupdated: 2022-10-12 07:32:13\ntags: \n- Note/Note\n- Note/Obsidian\n- Note/Snippet\n- Published\n---\n\n## 使用说明：\n\n- 安装 [Dataview](https://github.com/blacksmithgu/obsidian-dataview)\n- 在设置中开启：`EnabIe JavaScript Queries`\n- 以下片段均放入标记为 `dataviewjs` 的代码块中\n- 结果为即时查询，所以并不会将内容真的保存在笔记里\n- 每次输入都会触发查询，可以在 Dataview 的设置里关闭，但是为了这点效果真不值得。我自己是有一个固定的入口文件，并且这个文件日常不做修改，正好回避了动态的缺点。\n\n## 随机图片\n\n直接插入图片就行了，没必要用复杂代码，当初写这个的时候脑子没转弯。\n\n```js\ndv.paragraph(`<img src=\"https://picsum.photos/800/300\">`)\n```\n\n两个数字分别是宽高，不过图片一般是相对方正的，像我这样用一个比较小的高度来作为题图基本都是裁剪结果。\n\n会有缓存，所以并不是每次刷新都更新。可以在网址末尾加上：`?blur` 获取虚化图片。\n\n## 当前日期\n\n```js\nconst today = new Date()\nconst num = ['日', '一', '二', '三', '四', '五', '六', '七', '八', '九']\ndv.paragraph(\n  today.toLocaleDateString('zh-CN')\n  +' '+\n  today.toLocaleDateString('zh-CN-u-ca-chinese')\n  .replace(/(\\d+)\\s*?年\\s*/, '')\n  .replace(/月(\\d+)/, (m, s)=>{\n    s = Number(s)\n    if(s===20) return '月 二十'\n    if(s===30) return '月 三十'\n    const lastNum = num[s%10]\n    if(s<10) return '月 初'+lastNum\n    if(s<20) return '月 十'+lastNum\n    if(s<30) return '月 廿'+lastNum\n  })\n  +' '+\n  '星期'+num[today.getDay()]\n)\n```\n\n稍微复杂了一点，主要是加了一个自己看着舒服的农历，农历这种一般没啥用，但是需要了想看一下还要开日历，所以索性显示一个。效果如下：\n\n2022/10/10 九月 十五 星期一\n\n还行，能看，不加复杂样式了。\n\n## 一言\n\n随机返回一句话：\n\n```js\nfetch(\"https://api.oick.cn/yiyan/api.php\")\n  .then(response => response.text())\n  .then(data => dv.paragraph(data));\n```\n\n也可以更换为其它 Api 地址，在下面可以找到，只支持最简单的一句话的 Api，历史上今天啥的不行。\n\n- https://api.oick.cn/\n- https://api.aa1.cn/\n\n有兴趣也可以试试这里 https://www.gmit.vip/api.html ，里面的 Api 都有示例代码，稍微修改一下就能用。\n\n## 天气\n\n```js\nfetch(\"https://wttr.in/城市拼音?Tm2&lang=zh-cn&format=天气：%c %C 气温：%t 风力：%w<p></p>月相：%m 日出时间：%S 日落时间：%s\")\n  .then(response => response.text())\n  .then(data => dv.paragraph(data));\n```\n\n**注意**：使用前把地址中的 `城市拼音` 换成你的城市，用地级市，不能用县级市。\n\n详细文档：https://github.com/chubin/wttr.in\n\n效果：\n\n天气：☀️ 晴 气温：+6°C 风力：↘19km/h\n\n月相：🌕 日出时间：06:12:03 日落时间：17:36:08\n\n## 历史上的今天\n\n```js\nfetch(\"https://api.oick.cn/lishi/api.php\")\n  .then(response => response.json())\n  .then(data => dv.list(dv.array(data.result.map(e=> e.date+' '+e.title))));\n```\n\n## 年进度\n\n```js\nconst length = 20\nconst now = new Date()\nconst year = now.getFullYear()\nconst yearStart = new Date(year, 0)\nconst yearEnd = new Date(year+1, 0)\nconst progress = (now-yearStart)/(yearEnd-yearStart)\nconst prefix = ''.padStart(Math.round(length*progress), '▓')\nconst suffix = ''.padStart(length-Math.round(length*progress), '░')\ndv.paragraph('Year progress: '+prefix+suffix+' '+(progress*100).toFixed(2)+'%')\n```\n\n第一行的 20 是进度条长度，可以自己修改。\n\n## 查询某个文件下特定章节的内容\n\n用 query 语法怎么也不成功，依然用 JS 刚。\n\n```js\nconst tasks = dv.page(\"Inbox/List/Shopping List\").file.tasks.filter(e=>!e.completed && e.section.subpath==='Waiting')\ndv.taskList(dv.array(tasks), false)\n```"}}}