macOS ๋ค์ดํฐ๋ธ ๋์์ธ์ ์ค์๊ฐ ๋งํฌ๋ค์ด ์๋ํฐ
- ์ค์๊ฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ: ์ ๋ ฅ๊ณผ ๋์์ ๋งํฌ๋ค์ด ๋ ๋๋ง
- ์คํฌ๋กค ๋๊ธฐํ: ์ข์ฐ ์ฐฝ ์คํฌ๋กค ์ฐ๋ (ํ ๊ธ ๊ฐ๋ฅ)
- ๊ณ ์ ํญ ํฐํธ: ๋๋๊ณ ๋์ฝ๋ฉ์ ๋ด์ฅํด ํ๊ธยท์๋ฌธ ํผ์ฉ ์์๋ ์ ๋ ฌ์ด ํํธ๋ฌ์ง์ง ์์ (์ค์น ๋ถํ์)
- Mermaid ๋ค์ด์ด๊ทธ๋จ:
```mermaid์ฝ๋๋ธ๋ก์ผ๋ก ํ๋ก์ฐ์ฐจํธยท์ํ์คยทํด๋์ค ๋ค์ด์ด๊ทธ๋จ ๋ฑ์ ๊ทธ๋ฆผ์ผ๋ก ๋ ๋๋ง (mermaid.min.jsํ์ผ์ด ๊ฐ์ ํด๋์ ์์ ๋) - ์ฐฝ ํฌ๊ธฐ ์กฐ์ : ๋ง์ฐ์ค ๋๋๊ทธ๋ก ์ข์ฐ ๋น์จ ์กฐ์
- ์ค์๊ฐ ํต๊ณ: ๋จ์ด/๋ฌธ์/์ค ์ ์นด์ดํธ ๋ฐ ์ปค์ ์์น ํ์
- ๋คํฌ/๋ผ์ดํธ ๋ชจ๋: ์ํด๋ฆญ ํ ๋ง ํ ๊ธ (โ+D)
- macOS ๋ค์ดํฐ๋ธ ๋์์ธ: Traffic Light ๋ฒํผ, ๋ค์ดํฐ๋ธ ์์ ํ๋ ํธ
- ๋ฐ์ํ ๋์์ธ: ๋ชจ๋ฐ์ผ/ํ๋ธ๋ฆฟ ์ต์ ํ
- ๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์ : ๋ชจ๋ ์ํธ์์ฉ์ ์์ฐ์ค๋ฌ์ด ์ ํ ํจ๊ณผ
- ๋๋๊ทธ ์ค ๋๋กญ: ๋งํฌ๋ค์ด ํ์ผ์ ์ฐฝ์ ๋์ด๋ค ๋๊ธฐ
- ํ์ผ ์ ์ฅ: ๋งํฌ๋ค์ด(.md) ํ์์ผ๋ก ์ ์ฅ
- PDF ๋ด๋ณด๋ด๊ธฐ: ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ PDF๋ก ์ ์ฅ (โ+P)
- ์ง์ ํ์:
.md,.markdown,.txt - ๋ฏธ์ ์ฅ ๋ณ๊ฒฝ์ฌํญ ํ์ธ: ์ ์ฅํ์ง ์์ ๋ด์ฉ์ด ์๋ ์ํ์์ ์ ํ์ผ ๋ง๋ค๊ธฐยท๋ค๋ฅธ ํ์ผ ์ด๊ธฐ(๋๋๊ทธ ์ค ๋๋กญ ํฌํจ)ยทํญ ๋ซ๊ธฐ/์๋ก๊ณ ์นจ ์ ํ์ธ์ฐฝ ํ์
| ๊ธฐ๋ฅ | macOS | Windows/Linux |
|---|---|---|
| ์ ํ์ผ | โ+N | Ctrl+N |
| ํ์ผ ์ด๊ธฐ | โ+O | Ctrl+O |
| ํ์ผ ์ ์ฅ | โ+S | Ctrl+S |
| PDF ์ ์ฅ | โ+P | Ctrl+P |
| ํ ๋ง ํ ๊ธ | โ+D | Ctrl+D |
| ๊ตต๊ฒ | โ+B | Ctrl+B |
| ๊ธฐ์ธ์ | โ+I | Ctrl+I |
- ๋ชจ๋ ์น๋ธ๋ผ์ฐ์ (Chrome 88+, Firefox 85+, Safari 14+, Edge 88+)
- JavaScript ํ์ฑํ
๊ตฌ์ฑ ํ์ผ:
md-editor.html(์๋ํฐ ๋ณธ์ฒด)๊ณผmermaid.min.js(๋ค์ด์ด๊ทธ๋จ ๋ ๋๋ง, MIT ๋ผ์ด์ ์ค)๋ฅผ ๊ฐ์ ํด๋์ ๋์ธ์.mermaid.min.js๊ฐ ์์ด๋ ์๋ํฐ ์์ฒด๋ ์ ์ ๋์ํ๋ฉฐ,```mermaid์ฝ๋๋ธ๋ก๋ง ๊ทธ๋ฆผ ๋์ ์๋ณธ ํ ์คํธ๋ก ํ์๋ฉ๋๋ค.
-
ํ์ผ ๋ค์ด๋ก๋
# Git์ผ๋ก ํด๋ก git clone https://github.com/your-repo/markdown-editor.git cd markdown-editor # ๋๋ ์ง์ ๋ค์ด๋ก๋ wget https://your-domain.com/markdown-editor.html wget https://your-domain.com/mermaid.min.js
-
๋ธ๋ผ์ฐ์ ์์ ์คํ
# ๋ก์ปฌ ์๋ฒ ์คํ (๊ถ์ฅ) python -m http.server 8000 # ๋๋ npx serve . # ๋ธ๋ผ์ฐ์ ์์ http://localhost:8000 ์ ์
-
์ง์ ์คํ
md-editor.htmlํ์ผ์ ๋๋ธํด๋ฆญํ์ฌ ๋ธ๋ผ์ฐ์ ์์ ์ด๊ธฐ (mermaid.min.js๊ฐ ๊ฐ์ ํด๋์ ์์ด์ผ ๋ค์ด์ด๊ทธ๋จ์ด ๋ ๋๋ง๋จ)
- ์ข์ธก ์๋ํฐ์ ๋งํฌ๋ค์ด ํ ์คํธ ์ ๋ ฅ
- ์ฐ์ธก์์ ์ค์๊ฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ์ธ
# ์ ํ์ผ ์์ฑ
โ+N ๋๋ "์ ํ์ผ" ๋ฒํผ ํด๋ฆญ
# ํ์ผ ์ด๊ธฐ
โ+O ๋๋ "์ด๊ธฐ" ๋ฒํผ ํด๋ฆญ
๋๋ ํ์ผ์ ์ฐฝ์ ๋๋๊ทธ ์ค ๋๋กญ
# ํ์ผ ์ ์ฅ
โ+S ๋๋ "์ ์ฅ" ๋ฒํผ ํด๋ฆญ
# PDF ์ ์ฅ
โ+P ๋๋ "PDF ์ ์ฅ" ๋ฒํผ ํด๋ฆญ- ์คํฌ๋กค ๋๊ธฐํ: ๐ ๋ฒํผ์ผ๋ก ํ์ฑํ/๋นํ์ฑํ
- ์ฐฝ ๋ถํ ์กฐ์ : ์ค์ ๊ตฌ๋ถ์ ์ ๋๋๊ทธํ์ฌ ์ข์ฐ ๋น์จ ์กฐ์ (๋ชจ๋ฐ์ผ์์๋ ํฐ์น ๋๋๊ทธ๋ ์ง์)
๋ฏธ๋ฆฌ๋ณด๊ธฐ ํฐํธ๋ ๋๋๊ณ ๋์ฝ๋ฉ(SIL Open Font License 1.1) ํ๋๋ก ๊ณ ์ ๋์ด ์์ผ๋ฉฐ, WOFF2๋ก ๋ณํํด md-editor.html์ base64๋ก ์ง์ ๋ด์ฅํ์ต๋๋ค. ๊ณผ๊ฑฐ์๋ 10์ข
์ค ์ํ๋ ํฐํธ๋ฅผ ๊ณ ๋ฅผ ์ ์์์ง๋ง, ๋๋ถ๋ถ์ ๋ผํด ์ ์ฉ monospace ํฐํธ(JetBrains Mono ๋ฑ)๋ ํ๊ธ ๊ธ๋ฆฌํ๊ฐ ์์ด ํ๊ธ์ด ์์ธ ์ค์์ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ค๋ฅธ ํฐํธ๋ก ๊ทธ ๊ธ์๋ง ์กฐ์ฉํ ๋์ฒดํด ๊ทธ๋ฆฌ๊ณ , ๋ ํฐํธ์ ๊ธ์ ํญ ๋น์จ์ด ๋ฌ๋ผ ์ ๋ ฌ์ด ์ด๊ธ๋๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์ ํ์ง๋ฅผ ์์ ๊ณ ํ๊ธยท์๋ฌธ์ ์์ฒด ๋น์จ๋ก ์ผ๊ด๋๊ฒ ๊ทธ๋ฆฌ๋ ํฐํธ ํ๋๋ก ๊ณ ์ ํด ์ด ๋ฌธ์ ๋ฅผ ๊ทผ๋ณธ์ ์ผ๋ก ์์ด๊ณ , ์์คํ
์ ๋๋๊ณ ๋์ฝ๋ฉ์ด ์ค์น๋์ด ์์ง ์์๋ ํญ์ ๋์ผํ๊ฒ ๋ ๋๋ง๋ฉ๋๋ค.
๋๋๊ณ ๋์ฝ๋ฉ์ ๋ฐ์ค ๋๋ก์ ๋ฌธ์(U+2500~257F)๋ฅผ ๋ฐ๊ฐ์ด ์๋ ์ ๊ฐ์ผ๋ก ๊ทธ๋ฆฌ๋๋ก ์ค๊ณ๋์ด ์์ด, ์๋ํฐ(๋ฐ๊ฐ)์ ํ๋ฆฌ๋ทฐ(์ ๊ฐ)์์ ํญ์ด ๋ฌ๋ผ ํ(ASCII ๋ค์ด์ด๊ทธ๋จ) ์ ๋ ฌ์ด ๊นจ์ง๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์ด๋ฅผ ์ํด ๊ฐ์ font-family: 'Nanum Gothic Coding' ์ด๋ฆ์ผ๋ก unicode-range: U+2500-257F๋ง ์ง์ ํ @font-face๋ฅผ ํ๋ ๋ ์ถ๊ฐํด, ์ด ๋ฒ์์ ๋ฌธ์๋ง Sarasa Mono K(SIL Open Font License 1.1)์์ ๋ฐ๊ฐ์ผ๋ก ์๋ธ์
(์ฝ 2KB)ํด ์ค๋ฒ๋ผ์ด๋ํฉ๋๋ค. ๋ ํฐํธ ๋ชจ๋ unitsPerEm=1000, ๋ฐ๊ฐ ๋ฌธ์ advance width๊ฐ 500์ผ๋ก ๋์ผํด์ ๋ณ๋ ํฌ๊ธฐ ๋ณด์ ์์ด ๊ฒฉ์๊ฐ ์ ํํ ๋ง์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฌธ์ ๋จ์๋ก ์๋ง์ @font-face๋ฅผ ์๋ ์ ํํ๋ฏ๋ก, ํ๊ธยท์๋ฌธยท๋ฐ์ค๋ฌธ์๊ฐ ํ ์ค(์ฝ๋๋ธ๋ก ํฌํจ)์ ์์ฌ๋ ํญ์ ์ ๋ ฌ์ด ์ ์ง๋ฉ๋๋ค.
```mermaid ์ฝ๋๋ธ๋ก ์์ Mermaid ๋ฌธ๋ฒ์ผ๋ก ๋ค์ด์ด๊ทธ๋จ์ ์์ฑํ๋ฉด ๊ทธ๋ฆผ์ผ๋ก ๋ ๋๋ง๋ฉ๋๋ค.
```mermaid
graph TD
A[์์] --> B{์กฐ๊ฑด}
B -->|์| C[์ฒ๋ฆฌ1]
B -->|์๋์ค| D[์ฒ๋ฆฌ2]
```- ๋์ ๋ฐฉ์:
md-editor.html๊ณผ ๊ฐ์ ํด๋์mermaid.min.js(๋ก์ปฌ ํ์ผ, MIT ๋ผ์ด์ ์ค, ์ฝ 3.4MB)๋ฅผ<script src="mermaid.min.js">๋ก ๋ถ๋ฌ์ต๋๋ค. CDN์ ์ฐ์ง ์์ผ๋ฏ๋ก ์ธํฐ๋ท ์ฐ๊ฒฐ ์์ด๋ ๋์ํ์ง๋ง, ๋จ์ผ HTML ํ์ผ์ด ์๋๋ผ ๋ ํ์ผ์ ํจ๊ป ๋ฐฐํฌํด์ผ ํฉ๋๋ค. - ์ ํ์ ๊ธฐ๋ฅ:
mermaid.min.js๊ฐ ์๊ฑฐ๋ ๋ก๋์ ์คํจํด๋ ์๋ํฐ์ ๋๋จธ์ง ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ๋์ํ๋ฉฐ,```mermaid๋ธ๋ก์ ๊ทธ๋ฆผ ๋์ ์๋ณธ ํ ์คํธ๋ง ํ์๋ฉ๋๋ค(์๋ฌ ์์). - ์ค์๊ฐ ๋ ๋๋ง: ํ์ดํ์ ๋ฉ์ถ ๋ค ์ฝ 0.4์ด ํ ๋ค์ด์ด๊ทธ๋จ์ ๋ค์ ๊ทธ๋ฆฝ๋๋ค(๋งค ํค ์ ๋ ฅ๋ง๋ค ๋ค์ ๊ทธ๋ฆฌ๋ฉด ๋ฏธ์์ฑ ๊ตฌ๋ฌธ ๋๋ฌธ์ ๊ณ์ ์๋ฌ๊ฐ ๋จ๊ณ ์ฑ๋ฅ๋ ๋ญ๋น๋๊ธฐ ๋๋ฌธ).
- ํ ๋ง ์ฐ๋: ๋คํฌ/๋ผ์ดํธ ๋ชจ๋ ์ ํ ์ ๋ค์ด์ด๊ทธ๋จ ๋ฐฐ์๋ ํจ๊ป ๋ฐ๋๋๋ค.
- ์ค๋ฅ ์ฒ๋ฆฌ: ๋ค์ด์ด๊ทธ๋จ ๋ฌธ๋ฒ์ด ์๋ชป๋๋ฉด Mermaid ์์ฒด ์ค๋ฅ ํ์๋ง ๋ํ๋๊ณ , ๋๋จธ์ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ด์ฉ์๋ ์ํฅ์ด ์์ต๋๋ค.
- ๋ณด์:
securityLevel: 'strict'๋ก ์ด๊ธฐํํด ๋ค์ด์ด๊ทธ๋จ ํ ์คํธ์ ์คํฌ๋ฆฝํธ๋ ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ์์ฌ ์์ด๋ ๋ฌด์ํ๋๋ก ์ค์ ํ์ต๋๋ค.
๐ฆ Markdown Editor
โโโ ๐จ Frontend (HTML5/CSS3/JavaScript)
โโโ ๐ ๋งํฌ๋ค์ด ํ์ฑ์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ (์์ฒด ํ์, ์์ ์คํ๋ผ์ธ ๋์)
โโโ ๐ค ๋๋๊ณ ๋์ฝ๋ฉ ๋ด์ฅ + Sarasa Mono K ๋ฐ์ค๋ฌธ์ ์ค๋ฒ๋ผ์ด๋ (ํ๊ธยท์๋ฌธยท๋ฐ์ค๋ฌธ์ ์ ๋ ฌ ๋ณด์ฅ)
โโโ ๐ mermaid.min.js (์ ํ์ ๋ก์ปฌ ํ์ผ, ๊ฐ์ ํด๋์ ์์ผ๋ฉด ๋ค์ด์ด๊ทธ๋จ ๋ ๋๋ง)
โโโ ๐พ ์ ์ฅ์ (localStorage ์ฐ์ , ์ ๊ทผ ๋ถ๊ฐ ์ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ์๋ ํด๋ฐฑ)
โโโ ๐ฏ API (File, Print)
- ๋ฐ๋๋ผ JavaScript: ํ๋ ์์ํฌ ์๋ ์์ JS, ์ธ๋ถ ๋คํธ์ํฌ ์์กด์ฑ ์์
- ์์ฒด ๋งํฌ๋ค์ด ํ์: ์ ๋ ฅ์ ์ฐ์ HTML ์ด์ค์ผ์ดํํ ๋ค ์ธ์๋ ๋ฌธ๋ฒ๋ง ์์ ํ ํ๊ทธ๋ก ๋ณํ(XSS ๋ฐฉ์ง), CDN ์์ด ์คํ๋ผ์ธ์์๋ ํญ์ ๋์ผํ๊ฒ ๋์
- ๋ด์ฅ ์นํฐํธ: ํ๊ธยท์๋ฌธ ํผ์ฉ ์์๋ ์ ๋ ฌ์ด ๊นจ์ง์ง ์๋ ๋๋๊ณ ๋์ฝ๋ฉ์ WOFF2(base64)๋ก ๋ด์ฅํด, ์์คํ ํฐํธ ์ค์น ์ฌ๋ถ์ ๋ฌด๊ดํ๊ฒ ์ด๋์๋ ๋์ผํ๊ฒ ๋ ๋๋ง
- Mermaid ๋ค์ด์ด๊ทธ๋จ: ๋ก์ปฌ
mermaid.min.js๋ฅผ ๋ถ๋ฌ์ ๋๋ฐ์ด์ค๋ ๋ ๋๋ง, ํ ๋ง ์ฐ๋, ์ค๋ฅ ๊ฒฉ๋ฆฌ(๋ค์ด์ด๊ทธ๋จ ์ค๋ฅ๊ฐ ๋๋จธ์ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ ์ํฅ ์์)๊น์ง ์ฒ๋ฆฌ - CSS ๋ณ์: ํ ๋ง ์์คํ ๊ตฌํ
- CSS Grid/Flexbox: ๋ฐ์ํ ๋ ์ด์์
- File API: ํ์ผ ์ฝ๊ธฐ/์ ์ฅ
- Print API: PDF ์ ์ฅ
- localStorage ๋์ฒด: ์ ๊ทผ ๋ถ๊ฐ ์(์๋๋ฐ์ค, ํ๋ผ์ด๋น ๋ธ๋ผ์ฐ์ง ๋ฑ) ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ์ค์ ์ ์ฅ์๋ก ์๋ ์ ํ
- ์ํ ์คํฌ๋กค ๋ฐฉ์ง:
requestAnimationFrame๊ธฐ๋ฐ ํ๋๊ทธ๋ก ์ข์ฐ ์คํฌ๋กค ๋๊ธฐํ ์ ๋ฌดํ ๋ฃจํ ์์ด ๋งค๋๋ฝ๊ฒ ๋์ - ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ: ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ ๋ฆฌ
- CSS ์ต์ ํ: ํ๋์จ์ด ๊ฐ์ ํ์ฉ
:root {
/* ๋คํฌ ๋ชจ๋ ์์ */
--bg-primary: #1e1e1e;
--text-primary: #ffffff;
--accent-blue: #0a84ff;
/* ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํฐํธ (๋๋๊ณ ๋์ฝ๋ฉ ๋ด์ฅ, ๊ณ ์ ๊ฐ) */
--preview-font: 'Nanum Gothic Coding', 'D2Coding', 'SF Mono', Monaco, Consolas, 'Courier New', monospace;
}
.light-mode {
/* ๋ผ์ดํธ ๋ชจ๋ ์์ */
--bg-primary: #ffffff;
--text-primary: #1d1d1f;
--accent-blue: #007aff;
}// ๊ธฐ๋ณธ ์ค์ ๋ณ๊ฒฝ
let memoryStorage = {
theme: 'dark', // ๊ธฐ๋ณธ ํ
๋ง
scrollSync: 'true' // ์คํฌ๋กค ๋๊ธฐํ ๊ธฐ๋ณธ๊ฐ
};Q: localStorage ์ค๋ฅ๊ฐ ๋ฐ์ํด์
์์ธ: ์๋๋ฐ์ค ํ๊ฒฝ ๋๋ ํ๋ผ์ด๋น ๋ธ๋ผ์ฐ์ง
ํด๊ฒฐ: ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ์ ์ฅ์ ์๋ ์ฌ์ฉ (์ค์ ์ ์ง ์๋จ)
Q: PDF ์ ์ฅ์ด ์ ๋ผ์
์์ธ: ํ์
์ฐจ๋จ ๋๋ ๋ธ๋ผ์ฐ์ ํธํ์ฑ
ํด๊ฒฐ: ํ์
ํ์ฉ ์ค์ ๋ฐ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์ฌ์ฉ
Q: ํ์ผ ๋๋๊ทธ ์ค ๋๋กญ์ด ์ ๋ผ์
์ง์ ํ์: .md, .markdown, .txt
ํ์ธ์ฌํญ: ํ์ผ ํ์ฅ์ ๋ฐ ๋ธ๋ผ์ฐ์ ํธํ์ฑ
Q: mermaid ์ฝ๋๋ธ๋ก์ด ๊ทธ๋ฆผ์ด ์๋๋ผ ํ ์คํธ ๊ทธ๋๋ก ๋ณด์ฌ์
์์ธ: mermaid.min.js๊ฐ md-editor.html๊ณผ ๊ฐ์ ํด๋์ ์๊ฑฐ๋ ํ์ผ๋ช
์ด ๋ค๋ฆ
ํด๊ฒฐ: mermaid.min.js๋ฅผ ๊ฐ์ ํด๋์ ๋๊ณ ์๋ก๊ณ ์นจ (์์ด๋ ์๋ํฐ ์์ฒด๋ ์ ์ ๋์ํจ)
Q: ํญ์ ๋ซ์ ๋ ๋จ๋ ํ์ธ์ฐฝ ๋ฌธ๊ตฌ๊ฐ ๋ง์์ ์ ๋ค์ด์
์์ธ: ๋ธ๋ผ์ฐ์ ์ ์ฑ
์ beforeunload ํ์ธ์ฐฝ ๋ฌธ๊ตฌ๋ ์นํ์ด์ง๊ฐ ์์๋ก ์ง์ ํ ์ ์๊ณ
ํญ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ ํ ๊ณ ์ ๋ฌธ๊ตฌ๋ง ํ์๋จ(์
์ฉ ๋ฐฉ์ง๋ฅผ ์ํด ์๋
์ ๋ถํฐ ๋งํ ์์)
์ฐธ๊ณ : "์ ํ์ผ"/"์ด๊ธฐ"/๋๋๊ทธ ์ค ๋๋กญ์ผ๋ก ๋ค๋ฅธ ํ์ผ์ ์ด ๋ ๋จ๋ ํ์ธ์ฐฝ์
์ด ์ฑ์ด ์ง์ ๋ง๋ ๊ฒ์ด๋ผ ๋ฌธ๊ตฌ๋ฅผ ์์ ๋กญ๊ฒ ๋ฐ๊ฟ ์ ์์
Q: ๋ชจ๋ฐ์ผ์์๋ ํญ์ ๋ซ์๋ ํ์ธ์ฐฝ์ด ์ ๋ ์
์์ธ: iOS Safari ๋ฑ ์ผ๋ถ ๋ชจ๋ฐ์ผ ๋ธ๋ผ์ฐ์ ๋ beforeunload ํ์ธ์ฐฝ ์์ฒด๋ฅผ ์ง์ํ์ง ์์
์ฐธ๊ณ : "์ ํ์ผ"/"์ด๊ธฐ"/๋๋๊ทธ ์ค ๋๋กญ ์ ๋จ๋ ํ์ธ์ฐฝ์ ๋ชจ๋ฐ์ผ์์๋ ์ ์ ๋์ํจ
-
๋ก๊ทธ ํ์ธ
// ๊ฐ๋ฐ์ ๋๊ตฌ ์ฝ์์์ "[Markdown Editor]" ํ๊ทธ ํ์ธ -
๋คํธ์ํฌ ํ์ธ
๊ฐ๋ฐ์ ๋๊ตฌ โ Network ํญ์์ ์ธ๋ถ ์์ฒญ์ด ์๋์ง ํ์ธ (์์ ์คํ๋ผ์ธ ๋์ ๊ฒ์ฆ)
- ์ด์ ์์ฑ ๋๋ ํ์ธ
- ๋ธ๋์น ์์ฑ:
git checkout -b feature/new-feature - ๋ณ๊ฒฝ์ฌํญ ์ปค๋ฐ:
git commit -m "Add new feature" - ๋ธ๋์น ํธ์:
git push origin feature/new-feature - Pull Request ์์ฑ
- ๋ค์ฌ์ฐ๊ธฐ: 4 ์คํ์ด์ค
- ๋ค์ด๋ฐ: camelCase (JavaScript), kebab-case (CSS)
- ์ฃผ์: JSDoc ์คํ์ผ
- ํจ์: ๋จ์ผ ์ฑ ์ ์์น
// ๊ธฐ๋ณธ ๊ธฐ๋ฅ ํ
์คํธ
1. ๋งํฌ๋ค์ด ์
๋ ฅ โ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ์ธ
2. ํ
๋ง ํ ๊ธ โ ์์ ๋ณ๊ฒฝ ํ์ธ
3. ํ์ผ ์ ์ฅ/๋ถ๋ฌ์ค๊ธฐ โ ๋ด์ฉ ํ์ธ
4. PDF ์ ์ฅ โ ์ถ๋ ฅ ํ์ธ# ์ ๋ชฉ 1
## ์ ๋ชฉ 2
์ ๋ชฉ๋ ๊ฐ๋ฅ (๋ค์ ์ค์ ===๋ก)
=====================
**๊ตต์ ํ
์คํธ**
*๊ธฐ์ธ์ ํ
์คํธ*
~~์ทจ์์ ~~
`์ธ๋ผ์ธ ์ฝ๋`
\*์ด์ค์ผ์ดํํด์ ๋ณํ ๊ทธ๋๋ก\*
โ```์ฝ๋ ๋ธ๋กโ```
> ์ธ์ฉ๋ฌธ
- ๋ชฉ๋ก ํญ๋ชฉ 1
- ์ค์ฒฉ๋ ํ์ ํญ๋ชฉ
- [ ] ํ ์ผ
- [x] ์๋ฃํ ์ผ
1. ์์ ๋ชฉ๋ก
1. ์ค์ฒฉ๋ ์ง์
[๋งํฌ](https://example.com "์ ๋ชฉ")
[์ฐธ์กฐ ๋งํฌ][1]
<https://example.com> (์๋ ๋งํฌ)

| ์ผ์ชฝ ์ ๋ ฌ | ๊ฐ์ด๋ฐ ์ ๋ ฌ | ์ค๋ฅธ์ชฝ ์ ๋ ฌ |
|:------|:-----:|------:|
| ์
1 | ์
2 | ์
3 |
[1]: https://example.com "์ฐธ์กฐ ๋งํฌ ์ ์"
โ```mermaid
graph TD
A[์์] --> B[๋]
โ```์ง์ํ์ง ์๋ ๋ฌธ๋ฒ: ์ฝ๋๋ธ๋ก ๊ตฌ๋ฌธ ๊ฐ์กฐ(์์ ์์ด ๋จ์์ผ๋ก๋ง ํ์), ๊ฐ์ฃผ, ์ ์๋ชฉ๋ก, ์ด๋ชจ์ง ์ฝ๋(
:smile:), ๊บพ์ ์์ด ์ด URL์ ์๋ ๋งํฌํ.
MIT License - ์์ธํ ๋ด์ฉ์ LICENSE ํ์ผ์ ์ฐธ์กฐํ์ธ์.
JohnnyB Hyeon - Not Johnnyb Goode~
- ๐ ์น์ฌ์ดํธ: ํ๋ก์ ํธ ํํ์ด์ง
- ๐ง ์ด๋ฉ์ผ: johnhsb@outlook.kr
- ๐ฌ ์ด์ ๋ฆฌํฌํธ: GitHub Issues
- ๐ title ์์ฑ์ด ์๋ ๋งํฌยท์ด๋ฏธ์ง(
[text](url "title"))๊ฐ ๋ ๋๋ง๋์ง ์๋ ๋ฒ๊ทธ ์์ (escapeHtml์ด ํฐ๋ฐ์ดํ๋ฅผ ๋จผ์ "๋ก ๋ฐ๊ฟ ์ ๊ท์์ด ๋งค์น ์คํจํ๋ ๋ฌธ์ ) - ๐ ๊ดํธ๊ฐ ํฌํจ๋ URL(์ํค๋ฐฑ๊ณผ ์คํ์ผ ๋ฑ)์ด ์ค๊ฐ์ ์๋ฆฌ๋ ๋ฌธ์ ์์
- ๐
๋ฌธ์ฅ | ๋ฌธ์ฅ๋ค์์---๊ฐ ์ค๋ฉด ์๋์น ์์ ํ๋ก ์ค์ธ์๋๋ ๋ฌธ์ ์์ (ํค๋ยท๊ตฌ๋ถ์ ์ด ๊ฐ์๊ฐ ์ผ์นํ ๋๋ง ํ๋ก ์ธ์ ) - ๐
my_variable_name์ฒ๋ผ ๋จ์ด ์ค๊ฐ์ ์ธ๋์ค์ฝ์ด๊ฐ ์๋์น ์๊ฒ ๊ธฐ์ธ์ ์ฒ๋ฆฌ๋๋ ๋ฌธ์ ์์ (CommonMark/GFM ๊ท์น ์ ์ฉ) - โจ ์ค์ฒฉ ๋ชฉ๋ก ์ง์(๋ค์ฌ์ฐ๊ธฐ ๊ธฐ๋ฐ, ์์/์์ ์์ ํผ์ฉ ๊ฐ๋ฅ)
- โจ ์์
๋ชฉ๋ก(์ฒดํฌ๋ฐ์ค)
- [ ]/- [x]์ง์ - โจ Setext ์คํ์ผ ํค๋(
์ ๋ชฉ\n===,์ ๋ชฉ\n---) ์ง์ - โจ ๋ชฉ๋ก ํญ๋ชฉ์ ์ฌ๋ฌ ์ค(๋์จํ ์ฐ์ ํ ์คํธ) ์ง์
- โจ ์ฐธ์กฐ ์คํ์ผ ๋งํฌ
[text][ref]์ง์ - โจ ์๋ ๋งํฌ
<https://...>,<๋ฉ์ผ์ฃผ์>์ง์ - โจ ํ ์ ๋ ฌ ๋ง์ปค(
:---,:---:,---:) ์ง์ - โจ ๋ฐฑ์ฌ๋์ ์ด์ค์ผ์ดํ(
\*,\_๋ฑ) ์ง์
- ๐พ ๋ฏธ์ ์ฅ ๋ณ๊ฒฝ์ฌํญ ํ์ธ ๊ธฐ๋ฅ ์ถ๊ฐ: ํธ์ง๊ธฐ ๋ด์ฉ์ด ๋ง์ง๋ง ์ ์ฅ/๋ก๋ ์ดํ ๋ฐ๋ ์ํ(
isDirty)๋ฅผ ์ถ์ ํด, ํญ ๋ซ๊ธฐ/์๋ก๊ณ ์นจ(beforeunload), ์ ํ์ผ ๋ง๋ค๊ธฐ, ๋ค๋ฅธ ํ์ผ ์ด๊ธฐ(๋๋๊ทธ ์ค ๋๋กญ ํฌํจ) ์ ํ์ธ์ฐฝ์ ๋์ - ๐ "์ ํ์ผ" ํ์ธ ์กฐ๊ฑด์ "๋ด์ฉ์ด ์๋์ง"์์ "์ค์ ๋ก ์์ ๋๋์ง"๋ก ์์ , "์ด๊ธฐ"ยท๋๋๊ทธ ์ค ๋๋กญ์๋ ์๋ ์๋ ๋ฏธ์ ์ฅ ํ์ธ์ฐฝ์ ์๋ก ์ถ๊ฐ
- ๐ Mermaid ๋ค์ด์ด๊ทธ๋จ ์ง์ ์ถ๊ฐ:
mermaid.min.js(๋ก์ปฌ ํ์ผ, MIT)๋ฅผ ๊ฐ์ ํด๋์์ ๋ถ๋ฌ์```mermaid์ฝ๋๋ธ๋ก์ ๊ทธ๋ฆผ์ผ๋ก ๋ ๋๋ง. CDN ๋์ ๋ก์ปฌ ํ์ผ ๋ก๋ ๋ฐฉ์์ ํํด ์คํ๋ผ์ธ ์์น์ ์ ์งํ๋, ๋จ์ผ HTML ํ์ผ ๊ตฌ์ฑ์ ๋ ํ์ผ๋ก ๋ฐ๋(ํ์ผ์ด ์์ผ๋ฉด ํ ์คํธ๋ก ์๋ ํด๋ฐฑ) - ํ์ดํ ๋๋ฐ์ด์ค(0.4์ด) ๋ ๋๋ง, ๋คํฌ/๋ผ์ดํธ ํ ๋ง ์ฐ๋, ๋ค์ด์ด๊ทธ๋จ ์ค๋ฅ๊ฐ ๋๋จธ์ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ ๋ฒ์ง์ง ์๋๋ก ๊ฒฉ๋ฆฌ ์ฒ๋ฆฌ
- ๐ ์์ฒด ๋งํฌ๋ค์ด ํ์๋ก ์ ํ: HTML ์ด์ค์ผ์ดํ ๊ธฐ๋ฐ ๋ ๋๋ง์ผ๋ก XSS ๋ฐฉ์ง, CDN(marked.js) ์์กด์ฑ ์ ๊ฑฐ๋ก ์์ ์คํ๋ผ์ธ ๋์ ๋ณด์ฅ
- ๐ค ํฐํธ ์ ํ ๊ธฐ๋ฅ ์ ๊ฑฐ: 10์ข ์ค ๊ณ ๋ฅด๋ ๋ฐฉ์์ ๋๋ถ๋ถ ์์คํ ๋ฏธ์ค์น๋ก ์คํจ์ฑ์ด ์์ด, ํ๊ธยท์๋ฌธ ํผ์ฉ ์ ๋ ฌ์ด ๋ณด์ฅ๋๋ ๋๋๊ณ ๋์ฝ๋ฉ ํ๋๋ฅผ WOFF2๋ก ๋ด์ฅํด ๊ณ ์
- ๐ ๋ฐ์ค ๋๋ก์ ๋ฌธ์(โโโโโโ) ์ ๋ ฌ ์์ : ๋๋๊ณ ๋์ฝ๋ฉ์ด ์ ๊ฐ์ผ๋ก ๊ทธ๋ฆฌ๋ U+2500-257F ๋ฒ์๋ฅผ Sarasa Mono K์์ ๋ฐ๊ฐ์ผ๋ก ์๋ธ์
ํด
unicode-range๋ก ์ค๋ฒ๋ผ์ด๋ - ๐ฑ ๋ฆฌ์ฌ์ด์ ์ ํฐ์น ์ด๋ฒคํธ ์ถ๊ฐ ๋ฐ ๋ชจ๋ฐ์ผ ์ธ๋ก ๋ ์ด์์ ์ถ ๊ณ์ฐ ์์
- ๐พ localStorage ์ ๊ทผ ๋ถ๊ฐ ์ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ์ ์ฅ์๋ก ์ค์ ๋ก ์๋ ํด๋ฐฑํ๋๋ก ๊ตฌํ
- ๐จ๏ธ PDF ์ธ์ ์ฐฝ์
noopener๋ก ์ด์ด opener ์ฐธ์กฐ ์ํ ์ฐจ๋จ - ๐ ๋ผ์ดํธ ๋ชจ๋์์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํฐํธ๊ฐ ์ ์ฉ๋์ง ์๋ CSS ์ฐ์ ์์ ๋ฒ๊ทธ ์์
- โจ ์ค๋งํธ ํฐํธ ๊ฐ์ง ์์คํ ์ถ๊ฐ
- ๐ง ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ์ ์ฅ์๋ก localStorage ๋ฌธ์ ํด๊ฒฐ
- ๐จ ํฐํธ ์ ํ UI ๊ฐ์ (์ค์ ์ ์ฉ ํฐํธ ํ์)
- ๐ ๋ค์์ ๋ฒ๊ทธ ์์
- ๐ 10๊ฐ์ง ๊ณ ์ ํญ ํฐํธ ์ง์
- ๐ ์คํฌ๋กค ๋๊ธฐํ ๊ธฐ๋ฅ
- ๐ฑ ๋ชจ๋ฐ์ผ ๋ฐ์ํ ๋์์ธ
- ๐ฏ ๊ธฐ๋ณธ ๋งํฌ๋ค์ด ์๋ํฐ ๊ธฐ๋ฅ
- ๐ ๋คํฌ/๋ผ์ดํธ ๋ชจ๋
- ๐พ ํ์ผ ์ ์ฅ/๋ถ๋ฌ์ค๊ธฐ
- ๐ PDF ๋ด๋ณด๋ด๊ธฐ
โญ ์ด ํ๋ก์ ํธ๊ฐ ๋์์ด ๋์๋ค๋ฉด GitHub์์ ์คํ๋ฅผ ๋๋ฌ์ฃผ์ธ์!