본문 바로가기

Obsidian/Templater

옵시디언 Dataview 결과를 마크다운 형식으로 복사하기 - 템플레이터 사용

dataview나 dataviewjs 코드블록에 커서(캐럿)를 위치시켜고

템플릿을 실행하면 클립보드로 그 Dataview 결과를 마크다운 형식으로 복사합니다.

복사된 내용을 바라는 곳에 어디에나 붙여넣기(Ctrl + V) 하면 됩니다.


얼마 전에 Dataview로 바라는 파일들 목록 표를 만들어 그 가운데서도 세부적으로 더 일부만 선택하여 한꺼번에 여러 노트의 메타데이터 태그를 바꾸는 템플릿을 만들었습니다. (아래 링크)


옵시디언 - 한꺼번에 여러 노트의 태그들을 바꾸기(Feat. 템플레이터 & 데이터뷰)
https://eoureo.tistory.com/14


여기에 더해서 파일 목록 표에 열을 추가하고 고칠 수 있으면 더 많은 것을 할 수 있을 것이라고 생각했습니다.

예로 들면 표에 새로 바꿀 파일 이름 열을 더 하여 거기에 새로운 이름을 넣을 수 있으면 템플릿을 써서 한꺼번에 파일 이름을 고칠 수 있을 것 같습니다. 또는 메타데이터(프런트매터) 구조나 키 이름 바꾸기도 할 수 있겠네요.

 

그래서 Dataview로 만들어진 결과(테이블, 리스트, 태스크)를 일반 텍스트로 된 표로 만들기 위해 테이블을 선택하고 Ctrl+C(복사하기)하고 Ctrl+V(붙여넣기)를 하면 제대로 되지 않습니다. 그래서 인터넷 검색을 통해 방법을 찾았으나 찾지 못하였습니다.

 

또한 볼트 안의 내용이 바뀔 때마다 Dataview 결과는 다시 만들어지게 됩니다. 따라서 불필요하게 시스템 자원을 낭비하게 되는 경우가 많습니다.

또 옵시디언이 아닌 마크다운 편집기에서는 Dataview 결과를 볼 수가 없습니다.

 

그러던 가운데 저와 같은 생각을 가지고 있는 분의 글도 보게 되었습니다.

Dataview 플러그인으로 검색하여 보여지는 텍스트를 마크다운 텍스트로 변환할 수 있나요? : Obsidian 옵시디언 사용자 모임(네이버 카페)
깬아이 2023.04.02. 20:34
https://cafe.naver.com/obsidianary/4212


위 글에서 "Dataview를 사용하여 노트를 작성하면 마크다운 노트의 장점인 범용성, 가벼움, 호환성이 심각하게 훼손됩니다."라는 글에 공감하였습니다.

 

 

이렇게 해서 이 템플릿을 만들게 되었습니다.

설정과 사용 방법

 

다음 슬라이드에서 해당 설정과 사용 방법을 볼 수 있습니다.

 

슬라이드 - 새창에서 열기

 

소스 코드

템플릿 소스 코드

Copy Markdown of Dataview.md (☜ 이 파일을 다운로드하여 Templater 폴더에 넣으면 됩니다.)

Github 저장소( https://github.com/eoureo/Obsidian-Template-Copy-Dataview )에서도 볼 수 있습니다.

아래 Github1s 프레임( 새창에서 열기 )에서도 소스를 볼 수 있습니다. (Shift + Ctrl + P > Change language mode > javascript로 해서 보면 좋습니다. Ctrl + B로 사이드 패널을 숨겨서 소스를 넓게 보세요. )

 

 

Dataview 코드 (슬라이드에서 템플릿 테스트에 사용됨)

코드 일부는 제가 이전에 만든 교보문고 도서정보(https://eoureo.tistory.com/16) 노트 파일을 이용하고 있으므로 코드 내용을 고쳐서 테스트 해보기 바랍니다.

---
cssclass: cards, cards-cover, cards-2-3, table-100, width-100
---
# 테스트 - Copy Markdown of Dataview

## dataview 코드 블럭

### Table

table
```dataview
table without id 
    ("![|80](" + cover + ")") as Cover,
    ("<input type=checkbox checked> [[" + file.path + "|" + book-title + "]]") as Title,
    join(nonnull(list(authors.authors, authors.translaters)), ", ") as Authors,
    publisher as Publisher, 
    string(replace(publish-date," (", "<br>(")) as P-date, 
    category as Category,
    default(rating, "") + padright("", default(rating, 0), "⭐")  as Rating
from #book and "pages"
where cover != null
sort publish-date
```

### List

List 1
```dataview-
List
```

List 2
```dataview
List without id "[[" + file.path + "|" + book-title + "]]" + " - " + join(nonnull(list(authors.authors)), ", ") + choice(rating, " (⭐" + rating + ")", "")
from #book
where cover != null
sort book-title
```

### Task

TASK 1
```dataview-
TASK
```

TASK 2
```dataview
TASK
from #tag
```

TASK 3
```dataview
TASK
WHERE !completed
GROUP BY file.link
```

## dataviewjs 코드 블럭

### Table - Category

#### 테이블 셀 안에 dv.el 있는 경우

```dataviewjs-
for (let group of dv.pages("#book").where(k => k.cover != null).groupBy(p => p.category)) {
    dv.header(4, group.key);
    dv.span("category: ")
    dv.el("b", group.key, {attr:{style:"color:yellow"}})
    let p = dv.paragraph("개수: " + group.rows.length);
    dv.table(["Cover", "Title", "Authors", "Publisher", "Pdate", "Rating"],
        group.rows
            .sort(k => k["publish-date"], 'desc')
            .map(k => ["![|80](" + k.cover + ")",
                       `<input type="checkbox"> ` + "[[" + k.file.path + "|" + k["book-title"] + "]]",
                       dv.el("b", [k.authors.authors, (k.authors?.translaters? k.authors?.translaters:[])].join(", "), {attr:{style:"color:red"}}),
                       dv.el("span", k.publisher, {attr:{style:"color:orange"}}),
                       k["publish-date"].replace(/ \(/g, "<br>("),
                       (k.rating? k.rating:"") + (k.rating?"⭐".repeat(k.rating):"") ]))
}
```


#### append로 덧붙인 경우 - 지금 안됨

```dataviewjs
for (let group of dv.pages("#book").where(k => k.cover != null).groupBy(p => p.category)) {
    dv.header(3, group.key);
    let p = dv.paragraph(group.key);
    p.append(dv.span("category: "));
    p.append(dv.el("b", group.key, {attr:{style:"color:yellow"}}));
    dv.table(["Cover", "Title", "Authors", "Publisher", "Pdate", "Rating"],
        group.rows
            .sort(k => k["publish-date"], 'desc')
            .map(k => ["![|80](" + k.cover + ")",
                       "[[" + k.file.path + "|" + k["book-title"] + "]]",
                       [k.authors.authors, (k.authors?.translaters? k.authors?.translaters:[])].join(", "),
                       dv.el("span", k.publisher, {attr:{style:"color:red"}}),
                       k["publish-date"].replace(/ \(/g, "<br>("),
                       (k.rating? k.rating:"") + (k.rating?"⭐".repeat(k.rating):"") ]))
}
```

#### paragraph 안의 테이블

```dataviewjs-
for (let group of dv.pages("#book").where(k => k.cover != null).groupBy(p => p.category)) {
    dv.header(3, group.key);
    let tbl = dv.markdownTable(["Cover", "Title", "Authors", "Publisher", "Pdate", "Rating"],
        group.rows
            .sort(k => k["publish-date"], 'desc')
            .map(k => ["![|80](" + k.cover + ")",
                       "[[" + k.file.path + "|" + k["book-title"] + "]]",
                       [k.authors.authors, (k.authors?.translaters? k.authors?.translaters:[])].join(", "),
                       dv.el("span", k.publisher, {attr:{style:"color:red"}}),
                       k["publish-date"].replace(/ \(/g, "<br>("),
                       (k.rating? k.rating:"") + (k.rating?"⭐".repeat(k.rating):"") ]))
    dv.paragraph(tbl);
}
```

```dataviewjs-
const table = dv.markdownTable(["Result"], [["1"],["2"]])
console.log(table)
```


### list test

```dataviewjs
dv.list(dv.pages("#book").where(k => k.cover != null).groupBy(p => p.category).map(g => g.key + ": " + g.rows.length));
```

```dataviewjs-
dv.list(dv.pages("#book").where(k => k.cover != null).groupBy(p => p.category));
console.log(dv.pages("#book").where(k => k.cover != null).groupBy(p => p.category))
```

### Task

```dataviewjs
dv.taskList(dv.pages("#tag").file.tasks
    .where(t => !t.completed))
```

### execute

```dataviewjs
dv.execute("LIST FROM #book/audio");
```

```dataviewjs
dv.executeJs("dv.list([1, 2, 3])");
```

### 코드 블럭 안의 코드 블럭
````
```dataviewjs_
dv.execute("LIST FROM #book/audio");
```

```dataview
LIST FROM #book/audio
```
````

 

만들면서

 

처음에는 Buttons을 써서 만들려고 했는데 안되어 템플레이터로 만들게 되었습니다.

소스 코드를 보면 굳이 템플레이터를 쓸 필요가 없습니다.

템플레이터보다 스크립트를 더 쉽게 쓸 수 있는 플러그인이 있으면 좋겠네요.

 

 

안되는 Dataview 코드가 있으면 댓글 달아 주세요. 해결 방법을 찾아 보도록 하겠습니다.

여러 의견을 듣고 싶습니다. 많은 댓글 바랍니다.