| name | epub-build |
| description | Build a standards-compliant EPUB 3 file from a manuscript markdown, cover image, and book_manifest.json using the bundled pandoc-based script. Output is ์ฑ
-์ ๋ชฉ-v{version}.epub with the manifest's author (defaults to Toby-AI), accompanied by a paired ์ฑ
์๊ฐ markdown ({์ฑ
-์ ๋ชฉ}-v{version}.md) in the same folder. Use when converting the final book manuscript to EPUB, rebuilding after edits, or testing EPUB output. |
EPUB Build
ํตํฉ ์๊ณ ยทํ์งยท๋งค๋ํ์คํธ๋ฅผ ์
๋ ฅ๋ฐ์ EPUB 3 ํ์ผ์ ์์ฑํ๊ณ , ๊ฐ์ ํด๋์ ์ฑ
์๊ฐ markdown์ ํจ๊ป ๋ง๋ ๋ค. EPUB ๋ณํ์ ๊ฒฐ์ ์ ๋น๋๋ฅผ ์ํด scripts/build_epub.sh ์คํฌ๋ฆฝํธ์ ์์ํ๊ณ , ์ฑ
์๊ฐ markdown์ epub-builder ์์ด์ ํธ๊ฐ ๋งค๋ํ์คํธยท๊ณํยทํตํฉ ์๊ณ ๋ฅผ ์ฝ์ด ์ง์ ์์ฑํ๋ค.
์ ์ฐจ
- ์
๋ ฅ ๊ฒ์ฆ โ ์ธ ํ์ผ์ด ๋ชจ๋ ์กด์ฌํ๋์ง
{slug}/04_manuscript.md
{slug}/cover.png
{slug}/book_manifest.json
- ๋งค๋ํ์คํธ ํ๋ ์ ๊ฒ
title ๋น์ด์์ง ์์
author ํ๋ ์กด์ฌ (๊ธฐ๋ณธ๊ฐ Toby-AI, ์ฌ์ฉ์ ์ง์ ์ ๋งค๋ํ์คํธ ๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฉ)
language ์กด์ฌ (ko)
version ์กด์ฌ (์: 1.0.0)
identifier (์ต์
) โ ๋น์ด ์๊ฑฐ๋ ํ๋ ์ด์คํ๋ urn:uuid:...์ด๋ฉด ์คํฌ๋ฆฝํธ๊ฐ urn:uuid:{uuid4} ํ ๋ฒ ๋ฐ๊ธ ํ ๋งค๋ํ์คํธ์ ๊ธฐ๋กํ๋ค. ์ ๊ฐ์ 1ํ ๋ฐ๊ธ๋๊ณ ์ดํ ์ฌ๋น๋์์ ๊ทธ๋๋ก ๋ณด์กด(๋ถ๋ณ) โ version/date๋ง ๋ฐ๋๋ค. _prev์ ๋ค๋ฅธ ์๋ณ์๊ฐ ์์ผ๋ฉด ๊ฒฝ๊ณ
cover_alt (์ต์
) โ ํ์ง ๋์ฒด ํ
์คํธ. ๋น์ด ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ {title} ํ์ง. ์คํฌ๋ฆฝํธ๊ฐ ํ์ง xhtml์ ์ค์ alt(๋๋ SVG ํ์ง์ role="img"+aria-label+<title>)๋ก ์ฃผ์
ํด a11y ๋์ฒด ํ
์คํธ ์ฃผ์ฅ์ ๋ท๋ฐ์นจํ๋ค
license (์ต์
) โ ๋น์ด ์์ผ๋ฉด ํ๋ค์ค ๊ธฐ๋ณธ๊ฐ CC BY-NC-SA 4.0 ์ ์ฉ. ๋ค๋ฅธ ๋ผ์ด์ ์ค๋ฅผ ์ฐ๋ ค๋ฉด ๋ช
์ ("CC BY 4.0", "CC0", "All rights reserved" ๋ฑ)
harness_version (์ต์
) โ ๋น์ด ์์ผ๋ฉด ๋ฃจํธ VERSION ํ์ผ์์ ์๋ ์ฃผ์
rights (์ต์
) โ ๋น์ด ์์ผ๋ฉด ยฉ {year} {author} โ Licensed under {license}๋ก ์๋ ์์ฑ
- ์คํฌ๋ฆฝํธ ์คํ โ
scripts/build_epub.sh {slug}
- ๊ฒฐ๊ณผ ๊ฒ์ฆ
- ํ์ผ ์กด์ฌ, ํฌ๊ธฐ โฅ 50KB
epubcheck ์คํ ๊ฒฐ๊ณผ ์ ๊ฒ โ epubcheck ์คํจ๋ ๋น๋ ์คํจ๋ค(๊ฐ์ฃผ๊ฐ ์๋). EPUBCHECK_STRICT(๊ธฐ๋ณธ ์ผ์ง 1)์ผ ๋ ์ค์น+์คํจ๋ฉด ๋น๋ ๋ก๊ทธ๋ฅผ ์ด ๋ค ์ข
๋ฃ ์ฝ๋ 5๋ก ์คํจ. epubcheck๊ฐ ๋ฏธ์ค์น๋ฉด EPUB์ ๊ฒ์ฆ๋์ง ์์(UNVALIDATED) ์ํ๋ก ์ฐ์ถ๋๋ฉฐ brew install epubcheck ์๋ด๋ฅผ stderrยท๋น๋ ๋ก๊ทธ์ ๋จ๊ธด๋ค (EPUBCHECK_STRICT=0์ผ๋ก ์คํจ๋ฅผ ๊ฒฝ๊ณ ๋ก ๊ฐ๋ฑ ๊ฐ๋ฅ)
- ์ฑ
์๊ฐ markdown ์์ฑ โ EPUB๊ณผ ๊ฐ์ ํด๋(ํ๋ก์ ํธ ๋ฃจํธ)์
{์ฑ
-์ ๋ชฉ}-v{version}.md ์์ฑ
- ํ์ผ๋ช
์ฌ๋ฌ๊ทธํ ๊ท์น์ EPUB๊ณผ ๋์ผ (๊ณต๋ฐฑโํ์ดํ, ํน์๋ฌธ์ ์ ๊ฑฐ)
- ์ฝํ
์ธ ํ
ํ๋ฆฟยท์์ฑ ์์น์
epub-builder ์์ด์ ํธ์ "์ฑ
์๊ฐ markdown" ์น์
์ฐธ์กฐ
- ์์ค:
book_manifest.json (๋ฉํ), 02_plan.md (๋
์ยท์ํฌ), 04_manuscript.md (์ค์ ์ฐจ๋ก)
- ๊ฐ์ ๋ฒ์ ํ์ผ์ด ์ด๋ฏธ ์์ผ๋ฉด
_prev/๋ก ์ด๋ ํ ์ ๊ท ์์ฑ
- ๊ธฐ๋ก โ
{slug}/build_log.md์ ๋ช
๋ น, ์ถ๋ ฅ, ํฌ๊ธฐ, ๊ฒ์ฆ ๊ฒฐ๊ณผ, ์ฑ
์๊ฐ md ๊ฒฝ๋ก
์คํฌ๋ฆฝํธ ๊ฐ์ (scripts/build_epub.sh)
pandoc์ ์ด์ฉํด ์๊ณ ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ EPUB์ผ๋ก ๋ณํํ๋ค. ์์ :
pandoc {manuscript} \
--from markdown \
--to epub3 \
--metadata-file={manifest_yaml} \
--resource-path={slug} \
--epub-cover-image={cover} \
--css={styles/epub.css} \
--toc --toc-depth=2 \
--output {output_path}
๋งค๋ํ์คํธ(JSON)๋ฅผ YAML๋ก ๋ณํํ ๋ค pandoc์ ์ ๋ฌํ๋ค. --resource-path={slug}๋ก ์๋ ์ด๋ฏธ์ง ๊ฒฝ๋ก(์: figures/fig-NN.svg)๊ฐ ์ฌ๋ฌ๊ทธ ๋๋ ํฐ๋ฆฌ ๊ธฐ์ค์ผ๋ก ํด์๋๋ค. ์คํฌ๋ฆฝํธ ์ ๋ฌธ์ scripts/build_epub.sh ์ฐธ์กฐ.
์คํ์ผ์ํธ (base ํ์ดํฌ๊ทธ๋ํผ + ๊ตฌ์กฐํ ๋ธ๋ก, v1.8.0+)
styles/epub.css๋ฅผ ์คํฌ๋ฆฝํธ๊ฐ ์๋์ผ๋ก ์๋ฒ ๋ํ๋ค(์คํฌ๋ฆฝํธ ์์น ๊ธฐ์ค ์๋ ๊ฒฝ๋ก). pandoc 3.x์ --css๋ EPUB ๊ธฐ๋ณธ ์คํ์ผ์ํธ๋ฅผ ๋์ฒดํ๋ฏ๋ก, ์ด ํ์ผ์ ๊ธฐ๋ณธ ํ์ดํฌ๊ทธ๋ํผ(ํยท์ฝ๋ยท์ธ์ฉยทํค๋ฉยทfigure) ์ ๊ตฌ์กฐํ ๋ธ๋ก ํด๋์ค(meta/ingredients/steps/tip/warning/itinerary, ํ์คํฌ ๋ฆฌ์คํธ)๋ฅผ ํจ๊ป ์ ๊ณตํ๋ค. ํ๊ธ ๋ณธ๋ฌธ ํฐํธ ์คํยท๋ชจ๋
ธ์คํ์ด์ค ์ฝ๋ ํฐํธยท๋คํฌ ๋ชจ๋(prefers-color-scheme: dark) ๋๋น๊น์ง ํฌํจํ๋ค. ์ค์ฉ์(practical) ์ฑํฐ๋ ๋ธ๋ก ํด๋์ค๋ฅผ pandoc fenced div(::: meta ๋ฑ)๋ก ์์ฑํ๋ค(๊ท์ฝ์ profiles/practical/scaffolds.md). CSS ํ์ผ์ด ์์ผ๋ฉด ์คํฌ๋ฆฝํธ๋ --css ์์ด ์งํํ๋ค(์ด ๊ฒฝ์ฐ ๊ธฐ๋ณธ ํ์ดํฌ๊ทธ๋ํผ๋ ๋น ์ง๋ฏ๋ก ๊ถ์ฅํ์ง ์์).
์๋ณ์(identifier) ๋ฐ๊ธยท๋ณด์กด
EPUB์ urn:uuid:* ์๋ณ์๋ ์ ๊ฐ์ 1ํ ๋ฐ๊ธ๋๊ณ ์ดํ ์ฌ๋น๋์์ ๊ทธ๋๋ก ๋ณด์กด๋๋ค(๋ถ๋ณ) โ ์ฌ๋น๋ ๋๋ version/date๋ง ๋ฐ๋๋ค. ๋งค๋ํ์คํธ์ identifier๊ฐ ๋น์ด ์๊ฑฐ๋ ํ๋ ์ด์คํ๋ urn:uuid:...์ด๋ฉด ์คํฌ๋ฆฝํธ๊ฐ urn:uuid:{uuid4}๋ฅผ ๋ฐ๊ธํด ๋งค๋ํ์คํธ์ ๊ธฐ๋กํ๋ค. ํ ๋ฒ ๋ฐ๊ธ๋ ์๋ณ์๋ ์๋์ผ๋ก ๋ฐ๊พธ์ง ์๋๋ค. _prev์ ๋ค๋ฅธ ์๋ณ์๊ฐ ์์ผ๋ฉด ๊ฒฝ๊ณ ๋ฅผ ์ถ๋ ฅํ๋ค.
๊ทธ๋ฆผ(figure) โ mermaid ์ฌ์ ์ฒ๋ฆฌ (์ต์
)
๊ตฌ์กฐยท๊ด๊ณ๋ฅผ ๋ํ๋ด๋ ๊ทธ๋ฆผ์ ๋ณธ๋ฌธ์ ```mermaid fenced ๋ธ๋ก + ๊ทธ๋ฆผ N. {์ค๋ช
} ์บก์
์ค๋ก ์์ฑํ๋ค(์ฑํฐ๋ณ N ๋ฒํธ). ๋น๋ ์ mmdc๊ฐ ์ค์น๋์ด ์์ผ๋ฉด pandoc ์ ์ ๊ฐ ๋ธ๋ก์ {slug}/figures/fig-NN.svg๋ก ๋ ๋ํ๊ณ fence๋ฅผ ๋ก ์นํํ๋ค. mmdc๊ฐ ์์ผ๋ฉด fence๋ฅผ ๊ทธ๋๋ก ๋๊ณ (์ฝ๋ ๋ธ๋ก์ผ๋ก ๋ ๋) ๊ฒฝ๊ณ ๋ง ๋จ๊ธด๋ค โ mmdc๋ ํ๋ ์์กด์ฑ์ด ์๋๋ค(์ต์
epubcheck์ ๋์ผ ํจํด).
ํ์ผ๋ช
๊ท์น
{์ฑ
-์ ๋ชฉ}-v{version}.epub
- ์ ๋ชฉ์ ๊ณต๋ฐฑยท์ ๋์ฝ๋ ๋์(U+2010โU+2015) ์ฐ์์ ํ๋์
-๋ก ์ถ์ฝ
- ์ฒซ ๋ฒ์งธ em-dash(
โ)๋ ์ฝ๋ก (:) ๋ค์ ๋ถ์ ๋ ์๋ผ๋ด๊ณ ๋ฉ์ธ ์ ๋ชฉ๋ง ํ์ผ๋ช
์ ์ฌ์ฉ
- Windows ๊ธ์ง ๋ฌธ์(
\ / : * ? " < > |)๋ ์ ๊ฑฐ
- ์๋ค ํ์ดํ์ ์ ๊ฑฐ, ์ต๋ 60์๋ก ์ ํ
- ์ง์ ์ด๋ฃจ๋ ์ฑ
์๊ฐ
.md์ stem์ EPUB๊ณผ ๋์ผํด์ผ ํ๋ค
- ์:
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ค โ ๊น์ด ์๋ ์๋ด โ ๋ฐ์ดํฐ๋ฒ ์ด์ค-์ธ๋ฑ์ค-v1.0.0.epub
๋ฒ์ ๊ด๋ฆฌ
- ์ด๊ธฐ ๋น๋:
v1.0.0
- ์คํ์ ์์ : patch ์ฆ๊ฐ โ
v1.0.1
- ์ฑํฐ ๊ฐ์ : minor ์ฆ๊ฐ โ
v1.1.0
- ๊ตฌ์กฐ ์ฌํธ: major ์ฆ๊ฐ โ
v2.0.0
- ๊ธฐ์กด ํ์ผ์ ๋ฎ์ด์ฐ์ง ๋ง๊ณ ์ ํ์ผ๋ก ๊ณต์กด
๊ฒ์ฆ ์ฒดํฌ
์คํจ ๋์
| ์ํฉ | ์กฐ์น |
|---|
| pandoc ๋ฏธ์ค์น | brew install pandoc ์๋ด, ๋๋ Calibre ebook-convert ํด๋ฐฑ ๊ฒํ |
| cover.png ๋๋ฝ | cover-designer์ ํด๋ฐฑ ์์ฑ ์์ฒญ, ๋ฉํ๋ง์ผ๋ก ๋น๋ ํ ๊ฒฝ๊ณ |
| ์๊ณ ๋ด ๋น์ ์ ์ ๋์ฝ๋ยทXML ๋ฌธ์ | ์คํฌ๋ฆฝํธ๊ฐ iconv๋ก ์ ๊ทํ ์๋, ์คํจ ์ ํด๋น ๊ตฌ์ ์นํ |
epubcheck ์คํจ | ๋น๋ ์คํจ(๊ฐ์ฃผ ์๋). ์ค๋ฅ ๋ก๊ทธ(.epubcheck.log) ๋ณด์กด, EPUBCHECK_STRICT ๊ธฐ๋ณธ ์ผ์ง โ ์ข
๋ฃ ์ฝ๋ 5. ์ค๋ฅ๋ฅผ ๊ณ ์ณ ์ฌ๋น๋. ๋ถ๋์ดํ๊ฒ ์ฐ์ถ๋ง ํ์ํ๋ฉด EPUBCHECK_STRICT=0์ผ๋ก ๊ฒฝ๊ณ ๊ฐ๋ฑ |
epubcheck ๋ฏธ์ค์น | EPUB์ ๊ฒ์ฆ๋์ง ์์(UNVALIDATED) ์ํ. stderrยท๋น๋ ๋ก๊ทธ์ brew install epubcheck ์๋ด |
mmdc ๋ฏธ์ค์น | mermaid ๋ค์ด์ด๊ทธ๋จ์ ์ฝ๋ fence๋ก ๋จ์(๊ฒฝ๊ณ ๋ง). ๊ทธ๋ฆผ์ด ํ์ํ๋ฉด npm i -g @mermaid-js/mermaid-cli |
| 50KB ๋ฏธ๋ง ์ฐ์ถ๋ฌผ | ์ฑํฐ ๋ณํ ์คํจ ์์ฌ โ ๋ณํ ๋จ๊ณ๋ณ ๋๋ฒ๊น
ํ ์ฌ๋น๋ |
์ฌ๋น๋ ์
- ์ด์ ๊ฒฐ๊ณผ๋ฅผ
_prev/๋ก ์ด๋
- ์ฌ์ฉ์๊ฐ ๋งค๋ํ์คํธ ์ผ๋ถ๋ง ์์ ํ ๊ฒฝ์ฐ โ ์๊ณ ์ฌ์์
์์ด ๋งค๋ํ์คํธ๋ง ๊ฐฑ์ ํ๊ณ ์ฌ๋น๋ ๊ฐ๋ฅ