存在(DV_variable:: content)的页面被引用后, 代码块渲染出错


遇到的问题

obsidian 1.11.7, dataview0.5.68

文件A 中,有以下内容

  • description: (DV_variable:: content)
dataview(js)渲染的代码块,表格、列表

在文件B使用![[文件A]]进行引用。export或者better export pdf 文件B时,代码块显示loading 或者无法正常显示。

如果删除(DV_variable:: content)的两边括号,就能正常显示

使用包含着 dv 行内属性的如下文本

- description1: (DV_variable1:: content)
     dataview(js)
- description2: [DV_variable2:: content]
     dataview(js)

然后嵌入到另一个笔记里, 最后导出 pdf 或以 Better Export PDF 导出 pdf
预览和导出都没发现问题啊

猜不出来, 考虑检查一下:

  1. 含行内属性的笔记, 切到阅读视图是否正常, 直接导出 pdf 是否正常
  2. 该笔记嵌入到别的笔记里, 阅读视图是否正常
  3. 如果笔记非常复杂, 先摘一小段文本, 按原先步骤看能否显示正常

总之先判断出来是哪一步引起的错误

抱歉,我没有说清楚。下面两张图分别是文件A和B的源代码和预览视图(阅读视图)。



下面这张图是导出的pdf及其参数,可以看到,dataview的搜索结果是空的

好的, 看明白了,
试了下, 问题有点复杂, 我花了大量时间去查 dv 块的 query 语法上下文的问题, 但我现在觉得, 这更可能是个显示问题, 几个支持 “是显示问题” 的证据如下:

1 虽然 Better Export PDF 预览没展示出表格, 但能看到它列出了一条记录

image


2 如果把 dv 查询脚本, 改造成输出自定义 json , 其实在 pdf 能展示出来

原先为
```dataviewjs
let data = dv.pages().where(p=>p.file.name.includes("文件A"))

dv.table(
	["file", "DV_variable"], 
	data.map(p=>[p.file.link, p.DV_variable])
)
```

改变为: 
````dataviewjs
let data = dv.pages().where(p => p.file.name.includes("文件A"))
let jsonData = data.map(p => ({
    file: p.file.path,
    link: p.file.link,
    DV_variable: p.DV_variable, 
}))
dv.paragraph("```json\n" + JSON.stringify(jsonData.values, null, 2) + "\n```")
````

(打印 pdf, 会看到这些数据其实已经收集到了)


3 在不改变dv查询块内容的情况下, 简单重复一遍嵌入, 则可以展示

![[文件A]]

![[文件A]] <- 再嵌入一遍, 则输出 pdf 的表格正常

不知道楼主情况是否跟我相同? 这问题有点复杂, 感觉想解决并不容易, 目前觉得, 至少咱们需要先定位讨论到同一个问题

目前我能做出来的最小复现是这样子

以下为 “文件A”

### 硬编码表格携带dv行内属性语法

此处写一句dv行内属性语法 (dv_var_xx:: 无关的dv行内属性)

```dataviewjs
dv.table(
	["表格列名A", "表格列名B"], 
	[[3,4], [5,6]]
)
```

以下为 “文件B”

![[空白笔记]] (无关的简单笔记)

![[文件A#硬编码表格携带dv行内属性语法]]

![[文件A#硬编码表格携带dv行内属性语法]] (重复一遍)


我这边总结的问题出现规律是:

  • 跟具体查询的笔记 dv.pages().where() 无关
    • 即使只是拼凑一个 [[表格列名A, 表格列名B], [1, 2], [3, 4]] 的简单表格, 也会无法显示
  • 如果改变嵌入笔记的出现位置, 则可以找到办法显示表格
    • 反复嵌入同一个笔记片段, 则第二次及以后, 可以正常显示表格
    • 如果事先嵌入无关的空白笔记, 也可以正常显示表格

所以目前我比较怀疑, 是一个跟 media print, 跟 first-child 元素, 跟 dv 生成的元素 classname, … 有关的 pdf 打印的 DOM 元素显示问题, 但这太复杂了, 还没查明白

:smiling_face_with_tear:确实是这样的。而且我发现两个可用方案

  1. 文件A中的inline变量如果不在序列(“- ”或者“1. ”)、标题中,而是存在于正文中,那么这个问题就没了。
  2. 保持A中的inline变量在序列或者标题中,但是使用dataview查询,不使用dataviewjs查询,正常渲染

所以我现在先这么用着了 :rofl:

至于啥问题,我不是计算机专业的,有点难搞定。不过我用webpage html export导出时,倒是给出了一条可用error信息:

感觉像是dataviewjs的内容被渲染了两遍。第一遍渲染的结果是查询列表(正确结果)了,然后他又用这个语法对查询列表渲染了一遍,就报错了