Dataview로 인라인 테이블 구성하기
저는 obsidian의 dataview를 사용하는 것을 좋아합니다. Notion-like로 문서를 관리하는 것에는 분명 장점을 느끼긴 하지만, 필요 이상으로 파일량을 증가시키는 게 산만하게 느껴지고 또 테이블은 옵시디언에서 사용하기에는 좀 불편합니다. 데이터베이스 연동을 고민하다가, 그것도 귀찮아서 색다른 방법을 찾아보게 되었습니다.
이 방법은 단일 md파일에 데이터를 heading과 list 형태로 구성하고, 그 결과를 dataview형태로도 충력하는 것이 목적입니다.
사전 준비
meta function 사용하기 위해서, 정식 release된 dataview가 아닌 BRAT를 사용한 개발 버전 설치가 필요합니다.
해당 버전이 아니시라면 dataview 제거 후 BRAT플러그인을 먼저 설치하시고, brat커멘드로 깃 리포지토리(https://github.com/blacksmithgu/obsidian-dataview)를 입력하여 직접 추가가 가능합니다.
[!NOTE] 참고 BRAT 플러그인 추가 방법은 분석맨님 블로그에 잘 설명이 되어 있으니 참고하시면 좋을 것 같습니다.
예시 및 설명
샘플 데이터
## part 1
- Time:: 14:00
- Scene:: DT-01.01.01
- Summary:: Summary 1
## part 2
- Time:: 16:00
- Scene:: DT-01.01.02
- Summary:: Summary 2
## part 3
- Time:: 22:00
- Scene:: DT-01.01.03
- Summary:: Summary 3
heading을 가진 part 로 시작하는 제목 아래에 Time, Scene, Summary가 공통으로 존재하는 데이터를 표 형태로 뽑아보겠습니다.
표시방법
TABLE WITHOUT ID rows.L.Time[0] as Time, rows.L.Scene[1] as Scene, rows.L.Summary[2] as Summary
FROM "Work"
WHERE file.path=this.file.path
FLATTEN file.lists AS L
WHERE contains(meta(L.section).subpath, "part")
GROUP BY file.name + meta(L.section).subpath
SORT rows.file.name ASC
설명
- dataview TABLE 스크립트를 사용합니다
- WITHOUT ID : 구분 컬럼을 표시하지 않습니다.
- 원 데이터 항목의 컬럼순서는 : Title, Scene, Summary입니다.
- 현재 페이지만을 기준으로 가지고 옵니다.
- file.lists를 기준으로 가지고 옵니다.
- heading 중 part 라는 문자열이 포함된 것들만을 집계하여 가지고 옵니다.
예시2
원본 데이터
### 파일 관리 도구
#### Unlocker
- url::https://unlocker.softonic.kr/
- description::다른 프로세스에서 사용 중인 파일을 잠금 해제하고 삭제하는 유틸리티
- category::📁 파일 관리
- necessary::false
#### 7-Zip
- url::https://www.7-zip.org/download.html
- description::높은 압축 비율을 자랑하는 오픈소스 파일 아카이버
- category::📁 파일 관리
- necessary::true
### 개발 도구
#### WinMerge
- url::https://winmerge.org/downloads/?lang=ko
- description::파일 및 디렉토리에 대한 시각적 차이 표시 및 병합을 위한 도구
- category::🔧 개발
- necessary::true
#### Visual Studio Code
- url::https://code.visualstudio.com/docs/?dv=win64user
- description::다양한 언어 및 프레임워크를 지원하는 강력하고 다재다능한 코드 편집기
- category::🔧 개발
- necessary::true
#### PyCharm
- url::https://www.jetbrains.com/ko-kr/pycharm/download/?section=windows
- description::파이썬 프로그래밍을 위한 통합 개발 환경(IDE)
- category::🔧 개발
- necessary::true
#### IntelliJ IDEA
- url::https://www.jetbrains.com/ko-kr/idea/download/?section=windows
- description::자바 개발 및 기타 언어를 위한 종합적인 통합 개발 환경(IDE)
- category::🔧 개발
- necessary::true
일단 예제를 설명하기 위한 일부만 가져 왔습니다.
- h3(###로 시작)헤더는 크게 중요하지 않습니다. 문서를 개요로 보기 위해서는 없어도 되고 정렬도 필요할 수는 있지만 저는 이걸로 뭘 따로 할 생각이 없기 때문에 실제 저의 데이터에는 중복도 있습니다.
- 실제로 가져올 데이터는 h4(####로 시작)헤더와 그 아래에 존재하는 리스트(- 로 시작) 들이니 이 부분만 잘 적어주시면 될 것 같습니다.
dataview script
TABLE WITHOUT ID rows.L.category[2] as Category,
choice(rows.L.necessary[3] , "✅", "✖ ") as "Necessary",
elink(rows.L.url[0], title) as "Name and URL",
rows.L.description[1] as Description,
link("####"+title, "⚙️") as Link
WHERE file.path=this.file.path
WHERE file.lists
FLATTEN file.lists AS L
GROUP BY meta(L.section).subpath as title
SORT rows.L.necessary[3] DESC
SORT rows.L.category[2] DESC
설명
- dataview table을 사용합니다.
- 데이터는 아래와 같은 순서로 배치되어 있습니다.
url
,description
,category
,necessary
- column의 각각 순서는 아래와 같습니다.
WITHOUT ID
: 기준열 없음Category
: rows.L.category[2] //병합된 열의 3번 째 입니다.Necessary
: 병합된 열의 4번째 데이터가 true이면 ✅, 아닌 모든 경우 ✖를 표시합니다.Name and URL
: 병합된 열의 첫번째 열(rows.L.url[0])을 링크로, title(아래에서 정의)을 표시명칭으로 표현한 외부 링크(elink)입니다.Description
:병합된 열의 두번째 항목입니다..Link
: title(아래에서 정의)을 h4헤더로 한 옵시디언 링크(link) 입니다. 내부 문서의 항목을 가르킵니다.
- 기타 컬럼 설명
WHERE file.path=this.file.path
: 현재 파일 내에서 수행합니다.WHERE file.lists
: file내의 모든 List bullet을 가지고 옵니다.- 이 스크립트에서는 heading에 대한 조건을 걸지 않았습니다.
FLATTEN file.lists AS L
: file.lists의 각항목 기준으로 행을 분할합니다.GROUP BY meta(L.section).subpath as title
: 각 섹션의 path를 기준으로 그룹핑하고 그것의 이름을 title로 정의합니다.- 정렬은 맨 아래에 오는 게 우선적으로 정렬됩니다.
SORT rows.L.necessary[3] DESC
: necessary 항목의 명칭을 가나다역순으로 정렬합니다.SORT rows.L.category[2]
DESC : category 항목의 명칭을 가나다역순으로 정렬합니다.
결과
한계
다만 이 방법대로 한다면, 로딩에 시간이 꽤 걸린다는 분명한 한계가 존재하니 선택적으로 적용하시기 바랍니다. 사실 속도 때문에 그냥 Advance Table로 만족해야 하나 고민도 됩니다.
옵시디언 공홈 에도 데이터베이스에 대한 개발 로드맵이 있던데, 얼른 적용됐으면 좋겠네요.
그리고 더 좋은 방법이 있으시거나 의견 있으시다면 공유 부탁드립니다:)
참고
- https://github.com/TfTHacker/obsidian42-brat
- https://forum.obsidian.md/t/dataview-make-a-table-with-a-separate-row-for-different-values-of-a-key/43780