Last active
December 3, 2024 02:07
-
-
Save eoureo/0f547492aa3ff0298e073d7336767dc6 to your computer and use it in GitHub Desktop.
Obsidian Templater - Get book information from Kyobo Book. (kyobobook.co.kr) 옵시디언 템플레이터(Templater) - 교보문고 도서 정보 가져오기
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<%_* | |
/* | |
@2023-04-05 20:00:00 | |
노트의 frontmatter에 추가 (Add to the Frontmatter of the notes you want) | |
url: 교보문고 도서 url | |
*/ | |
const url = tp.frontmatter["url"]; | |
if(!url) { | |
let modal = new tp.obsidian.Modal(app); | |
modal.titleEl.setText("⚠ 에러 - frontmatter에 url을 넣으세요."); | |
modal.contentEl.setText("url:" + url); | |
modal.open(); | |
return; // 아무 것도 하지 않고 마치기 | |
} | |
console.log("url:", url); | |
let response; | |
try { | |
response = await request({"url":url}); | |
} catch(e) { | |
console.log("에러 발생 - request"); | |
console.log(e); | |
return; | |
} | |
// console.log("response:", response); | |
const parser = new DOMParser(); | |
const doc = parser.parseFromString(response, "text/html"); | |
// console.log("doc:", doc); | |
let cover; | |
let category; | |
let publisher; | |
let publish_date; | |
let book_pages; | |
let isbn; | |
let toc; | |
/* 제목 */ | |
let title = doc.body.querySelector("#contents h1 span.prod_title").innerText; | |
console.log("title:", title); | |
/* 작가들 */ | |
// let authors = Array.from(doc.body.querySelectorAll("#contents .author a")).map( el => el.innerText ); | |
const authors_element = doc.querySelector('#contents .author'); | |
const authors = {}; // 결과를 저장할 객체 | |
let names_temp = []; // 이름을 임시로 저장하는 배열 | |
for (let i = 0; i < authors_element.childNodes.length; i++) { // 자식 노드들을 순회하며 탐색 | |
const node = authors_element.childNodes[i]; | |
if (node.nodeName === 'A') { // a 요소일 경우, 이름을 가져와서 임시 배열에 더해줌 | |
names_temp.push(node.textContent.trim()); | |
} | |
else if(node.nodeName === '#text') { // 일반 텍스트일 경우 | |
const category = node.textContent.trim(); | |
if(category == "" || category == ",") { | |
continue; | |
} | |
let ctitle = ""; | |
if (['저자'].some(v => category.includes(v))) { // 여기에 저자 항목을 더할 수 있음. 예, ['저자','글쓴이','작가'] | |
ctitle = "authors"; | |
} | |
else if (['번역','옮김'].some(v => category.includes(v))) { | |
ctitle = "translaters"; | |
// ctitle = "! IGNORE !"; // 이것을 주석 해제하면 이 항목을 사용하지 않음. | |
} | |
else if (['감수'].some(v => category.includes(v))) { | |
ctitle = "editors"; | |
// ctitle = "! IGNORE !"; // 이것을 주석 해제하면 이 항목을 사용하지 않음. | |
} | |
else { | |
ctitle = "others"; | |
// ctitle = "! IGNORE !"; // 이것을 주석 해제하면 이 항목을 사용하지 않음. | |
} | |
if(ctitle) { | |
if(ctitle != "! IGNORE !") { | |
if(!authors[ctitle]) authors[ctitle] = []; | |
authors[ctitle].push(...names_temp); | |
} | |
names_temp = []; | |
} | |
} | |
} | |
console.log(authors); | |
let author = authors.authors[0]; // 파일 이름 만들 때 제일 먼저 나온 저자만 사용. | |
// let author = authors.authors.join(", "); // 파일 이름 만들 때 저자들을 ", "로 구분하여 사용. | |
/* 표지 */ | |
let cover_element = doc.head.querySelector("meta[property='og:image']"); | |
cover = cover_element? cover_element.content: ""; | |
/* 카테고리 */ | |
let category_elements = doc.body.querySelectorAll("ol.breadcrumb_list li.breadcrumb_item"); | |
category = category_elements? category_elements[2].innerText.trim(): ""; | |
/* 출판사 */ | |
let publisher_element = doc.body.querySelector(".prod_info_text.publish_date a"); | |
publisher = publisher_element? publisher_element.innerText.trim(): ""; | |
/* 기본정보에서 */ | |
let trs = Array.from(doc.body.querySelectorAll(".product_detail_area.basic_info tr")); | |
for(var i = 0; i < trs.length; i++) { | |
switch(trs[i].firstElementChild.innerText.trim()) { | |
case "발행(출시)일자": | |
publish_date = trs[i].children[1].innerText.replace(/\s{2,}/g," ").trim(); | |
break; | |
case "쪽수": | |
book_pages = trs[i].children[1].innerText.trim(); | |
break; | |
case "ISBN": | |
isbn = trs[i].children[1].innerText.trim(); | |
break; | |
} | |
} | |
/* 목차 - toc */ | |
let toc_element = doc.body.querySelector(".book_contents_list li"); | |
toc = toc_element? toc_element.innerHTML.trim().replace(/<br>/g, " \n"): ""; | |
// console.log(toc_element); | |
// console.log(toc); | |
/* 파일 이름 바꾸기 - 바꾸지 않으려면 주석 처리하면 됩니다. */ | |
async function get_filename_new (folder, fname) { | |
let file_exist = await tp.file.exists(folder + "/" + fname +".md"); | |
if(file_exist) { | |
let match = fname.match(/ \((\d+)\)$/); // 파일 이름 끝이 " (3)" 이렇게 끝나면 괄호 안 숫자를 높이면서 새로운 파일 이름을 만든다. | |
if(match) { | |
fname = fname.replace(/ \(\d+\)$/, "") + ` (${parseInt(match[1]) + 1})`; | |
} | |
else { | |
fname = fname + " (1)"; | |
} | |
fname = await get_filename_new (folder, fname); | |
} | |
return fname; | |
} | |
let filename_old = tp.file.title; // tp.file.folder(true)+"/"+tp.file.title+".md" | |
let filename_new = `(Book) ${title} - ${author}`; | |
filename_new = filename_new.replace(/[\\/:\*\?"<>\|]/g, ""); // 파일 이름에 쓸 수 없는 문자 제거 | |
if (filename_old.indexOf(filename_new) != 0) { // 지금 파일 이름이 새 파일 이름으로 시작하지 않을 경우에만 이름을 바꿈. | |
filename_new = await get_filename_new(tp.file.folder(true), filename_new); | |
await tp.file.rename(filename_new); | |
} | |
let path = tp.obsidian.normalizePath(tp.file.path(true)); // true: 상대 경로 얻기 | |
let tfile = app.vault.getAbstractFileByPath(path); | |
/* frontmatter 바꾸기 */ | |
await app.fileManager.processFrontMatter(tfile, (fm) => { | |
if(title) { | |
fm["book title"] = title; | |
} | |
if(Object.keys(authors).length) { | |
// 방법 1. | |
// 전체 저자를 authors 아래로 authors, translaters, editors, others 로 넣음. | |
fm["authors"] = authors; | |
// // 방법 2. | |
// // 전체 저자를 authors, translaters, editors, others 로 넣음. | |
// Object.keys(authors).forEach(authors_key => { | |
// fm[authors_key] = authors[authors_key]; | |
// }); | |
// // 방법 3. | |
// // 전체 저자를 authors 하나에 넣음. | |
// let authors_all = []; | |
// Object.keys(authors).forEach(authors_key => { | |
// authors_all.push(...authors[authors_key]); | |
// }); | |
// fm["authors"] = authors_all; | |
} | |
if(cover) { | |
fm["cover"] = cover; | |
} | |
if(category) { | |
fm["category"] = category; | |
} | |
if(publisher) { | |
fm["publisher"] = publisher; | |
} | |
if(publish_date) { | |
fm["publish date"] = publish_date; | |
} | |
if(book_pages) { | |
fm["pages"] = book_pages; | |
} | |
if(isbn) { | |
fm["isbn"] = isbn; | |
} | |
// page title 바꾸기 | |
let title_old = tp.frontmatter["title"]? tp.frontmatter["title"]: ""; | |
let title_new = `(Book) ${title} - ${author}`; | |
if(title_old != title_new) { | |
fm["title"] = title_new; | |
} | |
// aliases 더하기 | |
let aliases = tp.frontmatter["aliases"]? tp.frontmatter["aliases"]: []; | |
let alias = `(Book) ${title} - ${author}`; | |
let aliases_changed = false; | |
if(!aliases.includes(alias)) { | |
aliases.push(alias); | |
aliases_changed = true; | |
} | |
// 이전 page title을 alias로 넣기 | |
if((title_old != title_new) && !aliases.includes(title_old)) { | |
aliases.push(title_old); | |
aliases_changed = true; | |
} | |
if(aliases_changed) { | |
fm["aliases"] = aliases; | |
} | |
// 태그 더하기. | |
let tags = tp.frontmatter["tags"]? tp.frontmatter["tags"]: []; | |
let tags_new = ["book"]; // 여러 태그를 더 할 수 있도록 배열로 함. | |
let tags_changed = false; | |
tags_new.forEach( tag => { | |
if(!tags.includes(tag)) { | |
tags.push(tag); | |
tags_changed = true; | |
} | |
}); | |
if(tags_changed) { | |
fm["tags"] = tags; | |
} | |
// 다른 책 정보 사이트 주소도 넣을 수 있도록 함. | |
let book_urls = tp.frontmatter["book url"]? tp.frontmatter["book url"]: {}; | |
Object.assign(book_urls, {"교보문고": url}); | |
fm["book url"] = book_urls; | |
}); | |
await sleep(100); // milliseconds - frontmatter 넣기와 tR 입력이 동시에 진행 안 되도록 | |
// 제목을 H1으로 넣기 | |
// 주석 처리하면 넣지 않는다. 지금 줄처럼 아래 세 줄 앞에 "// "을 넣는다. | |
if(title){ | |
tR += `# ${title}`; | |
} | |
if(cover){ | |
tR += ` | |
## 표지 | |
 | |
`; | |
} | |
if(toc){ | |
tR += ` | |
## 목차 | |
${toc} | |
`; | |
} | |
// return | |
-%> | |
<% tp.file.cursor() %> |
Revision 5
@2023-03-23 10:30:00
파일 이름을 바꾸려고 할 때
이미 파일 이름 있는 경우
파일 이름 뒤에 " (3)"처럼 숫자를 높이며
바꾸도록 고침.
Revision 6
@2023-03-23 18:30:00
- 저자 별로 따로 저장할 수 있게 함.
- 파일 이름에 쓸 수 없는 문자 제거 하도록 함.
Revision 10
@2023-04-05 20:00:00
- publish date에 공란이 많이 들어가는 경우가 있어 고침.
- 작가 구분에 ","이 들어 간 경우 무시하도록 수정.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
여기서 더 자세한 내용을 볼 수 있습니다.
옵시디언 템플레이터(Templater) - 교보문고 도서 정보 가져오기