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에 아무런 템플릿 파일을 하나 설정해주고, 옵시디언을 껏다 켜시면 해결됩니다.

 

관련 링크

 

[DataviewJS] Quick Search MK.2

이전에 소개했던 Quick Search의 개선 버전입니다. 개선사항 스타일이 변경되었습니다. 더보기, 페이징 기능이 추가되었습니다. add note의 템플릿 추가시 오류가 발생하지 않게 변경되었습니다. 다

kaminik.tistory.com


 

반응형