通过dataviewjs,在文件页显示所有标签,如图:
但这样没有换行,我想将每个一级标签分段分开来,一段(横排)显示一个一级标签下面的所有标签。
记得以前看到过别人的分享,但是现在找不到了。论坛内也看到有大佬分享,但他提供的最后效果是竖着的,有点占空间。
求助
通过dataviewjs,在文件页显示所有标签,如图:
但这样没有换行,我想将每个一级标签分段分开来,一段(横排)显示一个一级标签下面的所有标签。
记得以前看到过别人的分享,但是现在找不到了。论坛内也看到有大佬分享,但他提供的最后效果是竖着的,有点占空间。
求助
是这种效果吗?
建议把自己想要的效果画出来或文字打个样式出来看看长啥样的?千言万语不如一张图。
另外,建议涉及到代码莫截图,用`包裹,不然英文引号会变成中文引号等意外。
遍历一次,一级标题 a 在字典 all 中增加一个映射 all[‘a’] = ,不是一级标签就直接找字典 all 是否有这个一级标签 ‘b/b1’,没有就 all[‘b’] = [‘b/b1’] 有就 all[‘b’].append(‘b/b2’)
不会 dvjs 的话丢个 gpt 让他写个 dvjs 然后改改就行
你 这样,如果没有子级就变成竖排一列了,是这个意思吗,比如
#社会 #社会/老龄化 ......
#天文
#地理
#obsidian
#其他
......
是的,就是这个意思!
感谢回答~但是我不是学计算机的,不是很懂
既然这样的话,把我之前的代码改下就行了
```dataviewjs
// 获取所有tags
let tags = app.metadataCache.getTags();
//是否区分大小写,true区分,false不区分
const isCaseSensitive = true;
const tree = {};
// 按嵌前缀排序
const sortByPrefix = (arr) => {
return arr.sort((a, b) => {
// 分割字符串获取前缀
const prefixA = a.split('/')[0];
const prefixB = b.split('/')[0];
// 比较前缀
if (prefixA !== prefixB) {
return prefixA.localeCompare(prefixB); // 按照前缀字母顺序排序
} else {
// 如果前缀相同,则比较整个字符串
return a.localeCompare(b);
}
});
}
// 按前缀排序
tags = Object.keys(tags);
tags = sortByPrefix(tags);
// 输出标签内容
let content = "";
let lastTagPrefix = "";
tags.forEach(item => {
const itemPrefix = item.split("/")[0];
if(itemPrefix !== lastTagPrefix){
if(lastTagPrefix !== "") content += "\n\n";
lastTagPrefix = itemPrefix;
}
content += item + " ";
});
dv.el("div", content);
```
哇!太感激了!对我帮助很大,感谢大佬相助~
能设定指定文件夹么
指定文件夹可以改成这样
```dataviewjs
// 指定文件夹 这里改成 👇 你的文件夹名
const filter = `"your folder"`;
// 获取所有tags
let tags = [];
dv.pages(filter).map(p=>p.file.tags.values.forEach(tag=>tags.push(tag)));
// 去重
tags = [...new Set(tags)];
// 按嵌前缀排序
const sortByPrefix = (arr) => {
return arr.sort((a, b) => {
// 分割字符串获取前缀
const prefixA = a.split('/')[0];
const prefixB = b.split('/')[0];
// 比较前缀
if (prefixA !== prefixB) {
return prefixA.localeCompare(prefixB); // 按照前缀字母顺序排序
} else {
// 如果前缀相同,则比较整个字符串
return a.localeCompare(b);
}
});
}
// 按前缀排序
tags = sortByPrefix(tags);
// 输出标签内容
let content = "";
let lastTagPrefix = "";
tags.forEach(item => {
const itemPrefix = item.split("/")[0];
if(itemPrefix !== lastTagPrefix){
if(lastTagPrefix !== "") content += "\n\n";
lastTagPrefix = itemPrefix;
}
content += item + " ";
});
dv.el("div", content);
```
这个代码我试了非常好,非常感谢 不过显示的标签是每行一个的,怎么才能在一行里面连续排列显示呢?由于没有代码基础,研究了半天楞是没弄出来,希望大神能帮编辑下代码,非常非常感谢