Homemade Source/Dataview snippets
[DataviewJS] Quick Search mark.1
반응형
퀵 서치 Dataview 스크립트입니다. default 테마, light 모드 기준으로 작성되었습니다.
Quick Search는 mk2로 업데이트 되었습니다. 링크를 참고하세요
예시
필요 플러그인
- dataview
- templater
Dataview 스크립트
```dataviewjs
const addNoteTp = { template: '기본 템플릿', folder: '폴더명', label: 'add Note' };
async function newNoteTp(buttonLabel, templateName, folderName) {
const tp = app.plugins.plugins["templater-obsidian"].templater.current_functions_object;
let template = await tp.file.find_tfile(templateName);
let folder = app.vault.getAbstractFileByPath(folderName);
let buttonElement = document.createElement("button");
buttonElement.className = "button-default";
buttonElement.textContent = buttonLabel;
buttonElement.addEventListener("click", async () => {
let noteName = await tp.system.prompt("노트 이름을 입력하세요");
if (!noteName) return;
await tp.file.create_new(template, noteName, true, folder);
});
return buttonElement;
}
const inputField = dv.el("input", "", { type: "text", placeholder: "빠른 검색" });
inputField.style.cssText = "margin-right:10px;";
const ctrlWrapper = document.createElement("div");
ctrlWrapper.className = "quickSearch ctrl-wrapper";
ctrlWrapper.style.cssText = "width: 100%;clear: both;overflow: hidden;margin-bottom: 15px;background-color: #f0f0f0; padding: 10px; border-radius: 5px;";
const spanInputStyle = document.createElement("span");
spanInputStyle.className = "input-field";
spanInputStyle.style.cssText = "display:block;float:right;clear:both;";
spanInputStyle.appendChild(inputField);
let button = await newNoteTp(addNoteTp.label, addNoteTp.template, addNoteTp.folder);
spanInputStyle.appendChild(button);
ctrlWrapper.appendChild(spanInputStyle);
dv.container.appendChild(ctrlWrapper);
const noteTemplate = "<div style='width:100%;display:inline-flex;height:auto;border-bottom:1px solid #ddd;text-decoration:none;padding:7px;margin:0;overflow:hidden;'><a data-href='{{path}}' style='text-decoration:none;' class='internal-link'><div class='title'>{{title}}</div></a></div>";
const resultsDiv = dv.el("div", "", { cls: "quickSearch notes-container" });
dv.container.appendChild(resultsDiv);
function combineTextForSearch(page) {
let frontmatterProperties = page.file.frontmatter ? Object.entries(page.file.frontmatter)
.filter(([key, _]) => !["cssclasses", "image", "url"].includes(key))
.map(([_, value]) => value)
.join(", ")
: "";
return {
searchMatchText: `${page.file.name} ${frontmatterProperties}`.toLowerCase(),
};
}
inputField.onkeyup = () => {
let searchText = inputField.value.toLowerCase();
let pages = dv.pages('')
.map(page => {
let combined = combineTextForSearch(page);
return {
path: page.file.path,
name: page.file.name,
folderPath: combined.folderPath,
tags: combined.tags,
searchMatch: combined.searchMatchText.includes(searchText)
};
})
.filter(page => page.searchMatch)
.limit(20)
.map(page => noteTemplate
.replace("{{path}}", page.path)
.replace("{{title}}", page.name));
resultsDiv.innerHTML = pages.join(" \n ");
};
inputField.onkeyup();
```
사용 방법
add 버튼 세팅
const addNoteTp = { template: '기본 템플릿', folder: '폴더명', label: 'add Note' };
- template: 템플릿 이름
- folder: 저장 폴더이름
- label: 버튼 이름
출력 조건 설정
let pages = dv.pages('')
기본설정은 전체페이지 검색으로 되어있습니다.
let pages = dv.pages('"폴더명"')이나 let pages = dv.pages('#태그명')으로 출력할 목록을 설정합니다.
출력 수 설정
.limit(20)
.limit(20)의 숫자를 변경하면 출력 개수를 수정할 수 있습니다.
에러 메세지가 나올 경우
Evaluation Error: TypeError: Cannot read properties of undefined (reading 'file')
at newNoteTp (eval at <anonymous> (plugin:dataview), <anonymous>:5:29)
옵시디언에서 templater가 시작되지 않을 때 발생하는 메세지로, 해당 메세지가 나올 경우
Templater 설정에서 Startup Templates에 아무런 템플릿 파일을 하나 설정해주고, 옵시디언을 껏다 켜시면 해결됩니다.
관련 링크
반응형
'Homemade Source > Dataview snippets' 카테고리의 다른 글
[Dataview] 태그 당 노트 수 나열하기 (0) | 2024.02.14 |
---|---|
[DataviewJS] 목차(TOC) 출력하기 (0) | 2024.02.08 |
[Dataview] 북마크한 문서 출력하기 (0) | 2024.02.04 |
[Dataview] 단일 태그만 있는 문서만 보기 (0) | 2024.01.28 |
[Dataviewjs] 랜덤노트 출력하기 (0) | 2024.01.25 |