ํ์คํ ์น๐ ๊ฐ๋ฐ์ ์ง๋ง์ ๐ง๐ฝโ๐ป
โ ์ธ๊ณต์ง๋ฅ ๊ด์ฌ ๐ค
Categories
-
โฃ
โถ COMPUTER_SCIENCE
๐: 7 -
โฃ
โถ WEB
๐: 3 -
โฃ
โถ ETC
๐: 3-
โ
โฃ
ETCS
๐: 10 -
โ
โฃ
SUBBRAIN ๊ฐ๋ฐ๊ธฐ
๐: 5 -
โ
โ
YOS ๊ฐ๋ฐ๊ธฐ
๐: 1
-
โ
โฃ
-
โ
โถ AI
๐: 9-
โฃ
AITOOLS
๐: 3 -
โฃ
CV
๐: 2 -
โฃ
DEEP_LEARNING
๐: 1 -
โฃ
DATA_VIS
๐: 2 -
โฃ
GRAPH
๐: 1 -
โฃ
LIGHTWEIGHT
๐: 1 -
โฃ
MATH
๐: 1 -
โฃ
NLP
๐: 3 -
โ
STRUCTURED_DATA
๐: 2
-
โฃ
Subbrain ๊ฐ๋ฐ๊ธฐ - Ruby&Jekyll
Subbrain ๊ฐ๋ฐ๊ธฐ - Ruby & Jekyll
๊ฐ์
Ruby๋ ๊ฐ๋ ์ฑ๊ณผ ์์ฐ์ฑ์ ์น์คํ ๊ณ ์์ค ์ธํฐํ๋ฆฌํฐ ์ธ์ด๋ก, ํจ์ํ, ์ ์ฐจํ, ๊ฐ์ฒดํ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํ๋ฉฐ, ์น ํ๋ ์์ํฌ์ธ ruby on rails ๊ฐ ์ ๋ช ํ๋ค
Jekyll์ ์์ฑํ ๋ฌธ์ ํ์ผ๋ค์ ๊ฐ๋จํ ์ ์ ๋ธ๋ก๊ทธ ์ฌ์ดํธ๋ก ๋ฐ๊ฟ์ฃผ๋ Ruby์ Gem ๊ธฐ๋ฐ ์ ์ ์ฌ์ดํธ ์์ฑ ํด์ด๋ค. ์ฃผ๋ก github page์ ์ฐ๋๋์ด ๊ฐ๋ฐ์ ๋ธ๋ก๊ทธ๋ก ๋ง์ด ์ฌ์ฉ๋๋ค.
์ฌ์ฉํ๊ธฐ ์ฝ๊ณ ๊ฐ๋จํ๋ฉฐ, ์๊ทผํ ๋ง์ ์ฌ๋๋ค์ด ๋ธ๋ก๊ทธ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ฌ์ฉํ์ฌ, ๊ธฐ์ ์คํ์ผ๋ก ์ฑ์ฉํ๊ฒ ๋์๋ค.
ํ์ง๋ง ๋ ๋ค ๋ด๊ฐ ์ด๋ฒ ํ๋ก์ ํธ์์ ์ฒ์ ์ ํด๋ณด์์ผ๋ฉฐ, Ruby์ ๊ฐ๋จํ ๋ฌธ๋ฒ๊ณผ Jekyll์ ํธ์์ฑ์๋ ๋ถ๊ตฌํ๊ณ ํ์ต์ผ๋ก ์ธํ ๊ฐ๋ฐ ์๊ฐ ์ฆ๊ฐ์ ์์ธ ์ค ํ๋์ด๊ธฐ๋ ํ๋ค.
์ด ๋์ ํตํด ๋ธ๋ก๊ทธ ๊ธฐ๋ฅ ์ค ์ฃผ๋ก ๋์ ์๊ตฌ๊ฐ ํ์ํ์ง ์์ ๊ฒ๋ค์ ๋ง๋ค์๋ค.
๊ฐ๋ฐ ๊ธฐ๋ฅ
๊ฐ๋ฐ ํ๊ฒฝ ์ค์
- Ruby ์ค์น ๋ฐ linter ์ค์
gem "webrick", "~> 1.7"
gem "rufo"
gem "reek"
gem "rubocop"
gem "jekyll-seo-tag"
gem "nokogiri"
Ruby๋ฅผ ์ค์นํ ๋ค, ์์ ๊ฐ์ด Gemfile์ ์ค์ ํ, bundle install
์ ํตํด ์ค์น ํ, VScode ruby ํ๋ฌ๊ทธ์ธ์ ์ค์นํ์ฌ ์ฌ๋ฌ ํ๊ฒฝ ์ค์ ์ ์์ฝ๊ฒ ํ ์ ์๋ค.
- VScode task ์ค์
{
"version": "2.0.0",
"tasks": [
{
"label": "test",
"dependsOn":["jekyll", "webpack", "sass", "tsc"]
},
{
"label": "jekyll",
"command": "bundle exec jekyll serve",
"type": "shell",
"options": {
"cwd": "./"
},
"presentation": {
"reveal": "always",
"panel": "new"
}
},
{
"label": "webpack",
"command": "node_modules/.bin/webpack",
"type": "shell",
"options": {
"cwd": "./"
},
"presentation": {
"reveal": "always",
"panel": "new"
},
"problemMatcher": []
},
{
"label": "sass",
"command": "sass -w _sass:assets/css",
"type": "shell",
"options": {
"cwd": "./"
},
"presentation": {
"reveal": "always",
"panel": "new"
},
"problemMatcher": []
},
{
"label": "tsc",
"command": "npx tsc -w",
"type": "shell",
"options": {
"cwd": "./"
},
"presentation": {
"reveal": "always",
"panel": "new"
},
"problemMatcher": []
}
]
}
ํ๋ก์ ํธ ๊ฐ๋ฐ ์ ๋๋ ๋ค์๊ณผ ๊ฐ์ ์ปค๋งจ๋๋ค์ ์ผ์ผ์ด ์ ๋ ฅํด์ผ ํ๋ค.
bundle exec jekyll serve
: Gem์ ๋ช ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค๊ณผ ํจ๊ป Jekyll ๊ฐ๋ฐ ๋ชจ๋๋ก ์คํnode_modules/.bin/webpack -w
: ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ ๋ณ๊ฒฝ ์ ์๋ ๋ฒ๋ค๋งsass -w _sass:assets/css
: ์์ฑํ sass ํ์ผ ๋ณ๊ฒฝ์ css ํ์ผ๋ก ์๋ ์ปดํ์ผnpx tsc -w
: ์์ฑํ ํ์ ์คํฌ๋ฆฝํธ ํ์ผ ๋ณ๊ฒฝ ์ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ปดํ์ผ
์ด๋ ๋งค์ฐ ๊ท์ฐฎ์ ์ผ์ด์๊ณ , ์์ ๊ฐ์ด VScode์ ๊ธฐ๋ฅ์ ํ์ฉํด ์ปค์คํ
Task๋ฅผ ์์ฑํด ctrl + p Tasks: Run task
๋ช
๋ น์ ํตํด ํ๊บผ๋ฒ์ ์คํ์ํฌ ์ ์๊ฒ ๋ง๋ค์๋ค.
ํ๋ก์ ํธ ํ์ผ ๊ตฌ์กฐ
Jekyll์ ๊ธฐ๋ณธ ํด๋ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ๋ช๋ช ํด๋์ ๋ค๋ฅธ ํด๋ค์ ์ํ ํ์ผ์ด ์ถ๊ฐ๋์๋ค.
subbrain/
---foldersโ---
|-assets/ : css, ์ด๋ฏธ์ง, ์๋ฐ์คํฌ๋ฆฝํธ ๋ฑ ์ฌ๋ฌ ์ ์ ํ์ผ์ด ์ ์ฅ๋์ด ์๋ ํด๋
|-blog/ : ๋ผ์ฐํฐ ์ธ๋ฑ์ฑ, ์ ์ ํ์ด์ง๋ค์ html ํ์ผ๋ค ์ ์ฅ์
|-node_modules/ : javascript๊ฐ ์ฌ์ฉํ๋ ํจํค์ง
|-scripts/ : Typescript ํ์ผ๋ค
|-_articles/ : ์์ฑํ ๋งํฌ๋ค์ด ํ์ผ๋ค์ด ์นดํ
๊ณ ๋ฆฌ ๋ณ ํด๋ ๊ตฌ์กฐ๋ก ๋๋์ด ์ ์ฅ
|-_data/ : ์์ฑ๋ ๋ธ๋ก๊ทธ ํฌ์คํธ๋ค์ ์ ๋ณด(ํ๊ทธ ์ ๋ณด, ์นดํ
๊ณ ๋ฆฌ ์ ๋ณด ๋ฑ)๊ฐ jsonํ์์ผ๋ก ์ ์ฅ
|-_etcs/ : ๊ธฐํ ์์ ์ฝ๋ ์ ์ฅ์ฉ ํด๋
|-_includes/ : ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ๋ค(ํค๋, ํธํฐ, ๋๋ก์ ๋ฑ)
|-_layouts/ : ํ์ด์ง ํ
ํ๋ฆฟ๋ค(์ต์๋์ธ ๋งํฌ๋ค์ด ๋ธ๋ก๊ทธ ํฌ์คํธ ๊ธ ๋ฑ)
|-_plugins/ : ์ปค์คํ
๋ฃจ๋น ํ๋ฌ๊ทธ์ธ ํ์ผ๋ค, ์ฃผ๋ก ๋ธ๋ก๊ทธ ํฌ์คํธ์ ์ ์ฒ๋ฆฌ์ ํ์ฒ๋ฆฌ ๊ตฌํ
|-_sass/ : css๋ก ์ปดํ์ผ๋ assets ํด๋๋ก ์ฎ๊ฒจ์ง
|-_site/ : ์ ์ ์ฌ์ดํธ ์์ฑ ๊ฒฐ๊ณผ๋ฌผ
---filesโ---
|-tsconfig.json : Typescript ์ค์ ํ์ผ
|-webpack.config.js : Webpack ์ค์ ํ์ผ
|-package.json : Javascript ํจํค์ง ์ ๋ณด
|-Gemfile : Ruby ํจํค์ง ์ ๋ณด
|-index.html : ๋ฉ์ธ ํ์ด์ง
|-.eslintrc.json : Typescript linter ์ค์ ํ์ผ
|-_config.yml : Jekyll ์ค์ ํ์ผ
_
๊ฐ ์์ ๋ถ์ ํด๋๋_config.yml
์์ ์ ์ธ ๋ชฉ๋ก์ ๋ค์ด๊ฐ ํด๋๋ ์ ์ ์ฌ์ดํธ ์์ฑ์ ์ ์ธ๋จ
-
assets
ํด๋ : css, ์ด๋ฏธ์ง, ์๋ฐ์คํฌ๋ฆฝํธ ๋ฑ ์ฌ๋ฌ ์ ์ ํ์ผ์ด ์ ์ฅ๋์ด ์๋ ํด๋
์ ์ ์ฌ์ดํธ ํ๋ก์ ํธ์ด๋ฏ๋ก ๊ท๋ชจ๊ฐ ํฌ๋ค._sass
ํด๋์์ css ํ์ผ์,scripts
ํด๋์์ JS ํ์ผ์ ์ปดํ์ผํ์ฌ ์ด๊ณณ์์ ์ ์ฅํ๋ค. -
_articles
ํด๋ : ์์ฑํ ๋งํฌ๋ค์ด ํ์ผ๋ค์ด ์นดํ ๊ณ ๋ฆฌ ๋ณ ํด๋ ๊ตฌ์กฐ๋ก ๋๋์ด ์ ์ฅ
๊ธฐ์กด์_post
ํด๋์ ๋์์ ๋ชจ๋ฐฉํ์ฌ, Jekyll์ด ์ด๋ค์ ๋ณํ๋ฅผ ๊ฐ์งํ๊ณ ๋ธ๋ก๊ทธ ํฌ์คํธ๋ฅผ ์์ฑํ๋๋ก ๊ตฌํํจ _data
ํด๋ : ์์ฑ๋ ๋ธ๋ก๊ทธ ํฌ์คํธ๋ค์ ์ ๋ณด(ํ๊ทธ ์ ๋ณด, ์นดํ ๊ณ ๋ฆฌ ์ ๋ณด ๋ฑ)๊ฐ json ํ์์ผ๋ก ์ ์ฅ
Jekyll์ด ์๋์ผ๋ก ๋ณํ๋ฅผ ์ ๋ฐ์ดํธํ๊ฒ๋ ๊ตฌํํ์๋ค.
์ฃผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์ ์ปค์คํ ํ๋ฌ๊ทธ์ธ์์ ํฌ์คํธ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ ์ฌ์ฉํ๋ ์ผ์ข ์ DB ์ญํ ์ ํ๋ค.- Liquid์ ๊ฒฝ์ฐ Jekyll์
site
๋ณ์์์ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ง๋ง, JS์ ruby์์ ์ฌ์ฉํ ์ ์์ด์ ๊ตฌํ
- Liquid์ ๊ฒฝ์ฐ Jekyll์
_includes
ํด๋์_layouts
ํด๋: ์ปดํฌ๋ํธ์ ํ์ด์ง ํ ํ๋ฆฟ ํ์ผ๋ค
liquid ํ๊ทธ๊ฐ ํฌํจ๋์ด html ํ์ผ๋ค์ด ์กด์ฌ,_layouts
๋ด์ ํ์ผ์ ์ผ์ข ์ ํ์ด์ง๋ฅผ ์ํ ํ ํ๋ฆฟ์ด๊ณ ,_includes
๋ด์ ํ์ผ์ ์ผ์ข ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ๋ค์ด๋ค.- ์๋ฅผ ๋ค์ด
_layouts/obsidian.html
์ ์ต์๋์ธ ํ์ผ๋ค์ ํ์ด์ง๋ก ๋ง๋ค ๋ ๊ณตํต์ผ๋ก ์ฌ์ฉ _includes/drawer/drawer.html
์ ํ์ด์ง ๋ด drawer๋ฅผ ๊ตฌํํ ๋liquid include
๋ฌธ๋ฒ์ผ๋ก ๋ถ๋ฌ์ ์ฌ์ฉํ๋ค.
- ์๋ฅผ ๋ค์ด
-
blog
ํด๋ : ์ ์ ์ผ๋ก ์์ฑ๋๋ ํ์ด์ง๋ค์ ์ฌ์ฉ๋๋ html ํ์ผ๋ค
์ผ์ข ์ ๋ผ์ฐํ ์ธ๋ฑ์ค ํด๋, ๋ด ์๊ฐ ํ์ด์ง, ๊ฒ์๊ฒฐ๊ณผ ํ์ด์ง, 404 ์๋ฌ ํ์ด์ง, ํฌ์คํธ ๋ฆฌ์คํธ ํ์ด์ง๊ฐ ์กด์ฌ -
_site
ํด๋ : ์์ฑ๋ ์ ์ ์ฌ์ดํธ ๊ฒฐ๊ณผ๋ฌผ
๋ด๋ถ ํ์ผ์gh-page
๋ธ๋์น์ ์ฎ๊ฒจ ๋ฐฐํฌํ๋ค. - ๊ธฐํ ํด๋(
_sass
ํด๋,scripts
ํด๋,node_modules
ํด๋)๋ ํด๋น ๋๋ฉ์ธ์์ ์ค๋ช ํ๊ฒ ๋ค.
Obsidian <=> Jekyll ํฌ์คํธ ๊ตฌ์กฐ
Jekyll์์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋งํฌ๋ค์ด ํ์ผ์ HTML ํ์ผ๋ก ๋ฐ๊พธ์ด์ฃผ๋ ๊ธฐ๋ฅ์ ์ง์ํ๋ค.
- ์ปค์คํ id ์ค์ ๊ณผ Hard wrap ๊ธฐ๋ฅ์ ์ง์ํ๊ธฐ ์ํด Kramdown ๋งํฌ๋ค์ด ๋ณํ์ผ๋ก ์ค์ ์ ๋ฐ๊พธ์ด ์ฃผ์๋ค.
์ถ๊ฐ์ ์ผ๋ก ๋ด๊ฐ ์ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด Ruby ํ๋ฌ๊ทธ์ธ์ ์ง์ ๊ตฌํํ์๋ค.
- ์ง์ ๊ตฌํํ ์ด์ ๋ ํ์ต + ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ + gh page์์ ํ๋ฌ๊ทธ์ธ ์ง์ ์ํจ
- ๋ณํ ์ , md ํ์ผ์ ์ํฅ์ ์ค์ผํ๋ ๊ธฐ๋ฅ์ Jekyll์์ ์ง์ํ๋ Generator ํด๋์ค๋ฅผ ์์ํ์ฌ ๊ตฌํ
- ๋ณํ ํ, html ํ์ผ์ ์ํฅ์ ์ค์ผํ๋ ๊ธฐ๋ฅ์ Liquid์์ ์ง์ํ๋ Custom Filter ๋ฑ๋ก ๊ธฐ๋ฅ์ผ๋ก ๊ตฌํ
์ ์ฒ๋ฆฌ ๊ตฌํ: Custom Generator ๊ธฐ๋ฐ
์ ์ฒ๋ฆฌ ๋ ์ด์ด๋ ruby
ํ๋ฌ๊ทธ์ธ์ผ๋ก ๊ตฌํ๋์์ผ๋ฉฐ, ์ถ๊ฐ๋ก ๋ ์ด์ด ๋ด๋ถ์ ๊ฐ ์ ์ฒ๋ฆฌ ํจ์๋ค์ด ๊ณ์ธต ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
Jekyll ์ธก์์ ๊ฐ ๋งํฌ๋ค์ด ํ์ผ์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉํ๋
Generator
ํด๋์ค๋ฅผ ์์๋ฐ์ ๊ตฌํํ์๋ค.
require_relative './layouts/obsidian/preprocess_obsidian'
require_relative './common/modules/preprocess_frontmatter'
require_relative './common/preprocess_common'
module Preprocessor
class ArticleConverter < Jekyll::Generator
include PreprocessObsidian
include PreprocessFrontmatter
include PreprocessCommon
def generate(site)
changed = register_articles(site.collections['articles'])
clear_categories if changed
site.collections['articles'].docs.map do |article|
result = preprocess_common(article, changed)
result = preprocess_obsidian(site, result) if result['layout'].upcase == 'OBSIDIAN'
result
end
create_category_pages(site).each do |page|
site.pages << page
end
end
end
end
- ๊ฐ์ฅ ๋จผ์ ์๋ก ๋ฑ๋ก๋ ํ์ผ๋ค์ ์ ๋ณด๋ฅผ
_data
ํด๋์ ์ ๋ฐ์ดํธํ๋ค.(register_articles
) - ๋ธ๋ก๊ทธ ํฌ์คํธ์ ์ ๋ณด(ํ๊ทธ, ์ฌ์ฉํ๋ ๋ ์ด์์)์ ๋ฐ๋ผ ์ฒ๋ฆฌํ๋ค.
- ์ฃผ๋ก ์ต์๋์ธ์์๋ง ์ง์ํ๋ ๋งํฌ๋ค์ด ๊ธฐ๋ฅ๋ค์ ๋๋๋งํ๊ธฐ ์ํ ์ ๋ณด๋ค์ ์ถ์ถํ๋ ํจ์๋ค์ด๋ค.
- ํด๋ ๊ตฌ์กฐ์ ๋ฐ๋ผ ๋ณํ๋๋ ๊ฒ์ํ ์นดํ ๊ณ ๋ฆฌ ๊ตฌ์กฐ ํ์ด์ง ๋ํ ์ด๊ณณ์์ ๊ตฌํ๋๋ค.
- ๋งํฌ๋ค์ด ํ์ผ์ DOM ๊ตฌ์กฐ๊ฐ ์์ผ๋ฏ๋ก ๋๋ถ๋ถ ์ ๊ท ํํ์์ ํตํด ์์๋ฅผ ๊ฒ์ํ๊ณ ์์ ํ๋ค.
๊ตฌํํ๋ฉด์ ์ ๊ทํํ์์ ์ ๋ง ๋ง์ด ๊ณต๋ถํ ์ ์์๋ค.
๊ธฐ์กด์๋ ์ ๊ท ํํ์์ ์ ๋ง ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๊ณ ๋ณต์กํ๋ค๊ณ ์๊ฐํ์ฌ ์ด๋ณด์ ์ธ ๋จ๊ณ๊น์ง๋ง ํ์ตํ์ง๋ง, ์ด์ ์บก์ฒ ๊ทธ๋ฃน๋ถํฐ ๋ฃฉ ์ดํค๋๊น์ง ์ฌ์ฉํ ์ ์๊ฒ ๋์๋ค.
ํ์ฒ๋ฆฌ ๊ตฌํ : Custom Liquid Filter ๊ธฐ๋ฐ
ํ์ฒ๋ฆฌ ๋ ์ด์ด ๋ํ ruby
ํ๋ฌ๊ทธ์ธ์ผ๋ก ๊ตฌํ๋์์ผ๋ฉฐ, Jekyll์ layout ๊ธฐ๋ฅ์ ์ด์ฉํด์ ํ์ํ ํ์ฒ๋ฆฌ ํจ์๋ง Liquid Custom Filter๋ฅผ ํตํด ์ฒ๋ฆฌ๋๋๋ก ๊ตฌํํ๋ค.
...
<div class="content-section">
{{content | postprocess_obsidian}}
</div>
...
์ฃผ๋ก, ์ฝ์์์ด๋ TOC, ์ํค ๋งํฌ ๋ฑ์ ์ค์ ๋ทฐ๋ฅผ HTML ํ๊ทธ๋ก ๊ตฌํํ๋ ๊ธฐ๋ฅ์ ๋ง๋ค์๋ค.
require 'liquid'
require 'nokogiri'
require_relative './modules/postprocess_toc'
require_relative './modules/postprocess_callout'
require_relative './modules/postprocess_wikilink'
module Jekyll
module PostprocessObsidian
include PostprocessToc
include PostprocessCallout
include PostprocessWikilink
def postprocess_obsidian(str)
html = Nokogiri.HTML5(str)
html = convert_noneng_custom_id(html)
html = convert_toc(html)
html = html.to_html
html = convert_callout(html)
html = convert_wikilink(html)
html
end
end
end
Liquid::Template.register_filter(Jekyll::PostprocessObsidian)
๊ฐ๋ฐ ์ด๋ฐ์๋ DOM ํธ๋ฆฌ ํ์ ๋ฐ ๋ณ๊ฒฝ์ ์ ๊ทํํ์์ผ๋ก ์ฒ๋ฆฌํ์ผ๋, ํ๋ฐ์๋ Nokogiri๋ผ๋ HTML DOM ๊ธฐ๋ฐ parser ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ๋ค.
- ๋ค๋ง ์ผ๋ถ ๊ฒฝ์ฐ, ์คํ๋ ค ๊ฐ๋ ์ฑ์ด ๋๋น ์ง๋ ๊ฒฝ์ฐ๊ฐ ์์ด ๊ทธ๋๋ก ์ ๊ท ํํ์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ ๊ธฐ๋ฅ๋ ์กด์ฌํ๋ค.
ํ๊ณ
Ruby
def create_category_page_recursive(site, categories, data) # python๊ณผ ์ ์ฌํ๋ค.
result = data['categories'].keys.inject([]) do |memo, sub_category| # ๋ค์ํ loop๋ฌธ ํํ
memo + create_category_page_recursive(site, categories + [sub_category], data['categories'][sub_category])
end
if categories.empty? # ํจ์ํ ํ๋ก๊ทธ๋๋ฐ, ํ๋ผ๋ฏธํฐ ์์ ๊ฒฝ์ฐ ์๋ต ๊ฐ๋ฅํ "()"
result # return์ ์๋ต ๊ฐ๋ฅ
else
[CategoryPage.new(site, categories, data)] + result
end
end
- Ruby๋ ํ์ด์ฌ๊ณผ ์๋นํ ๋น์ทํ๊ฒ ์ฌ์ฉ์์ ๊ฐ๋
์ฑ๊ณผ ํธ์์ฑ์ ์๋นํ ์ ๊ฒฝ์ด ๊ฒ์ด ๋๊ปด์ก๋ค.
- ๋ฐ์ดํฐ ํ์ ์ ์ ์ธํ ํ์๊ฐ ์์
- ํจ์์
return
์ ์๋ต ๊ฐ๋ฅ .empty?
,.nil?
๋ฑ ์ง๊ด์ ์ด๊ณ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด ๊ฐ๋ฅ
- ๋จ, ์คํ๋ ค ์ด์ ์ด ์คํ๋ ค ํธ๋ถํธ ๊ฐ๋ฆฐ ๊ฒฝ์ฐ๋ ๋ง๋ค.
- ํจ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋๊ธฐ์ง ์์ ๋๋ ๊ดํธ๋ฅผ ์๋ตํ ์ ์์, ๊ทธ๋ด ๊ฒฝ์ฐ ํด๋น ๊ฐ์ฒด์ ๋ณ์๋ฅผ ์ฝ์๊ฑด์ง, ํจ์๋ฅผ ํธ์ถํ ๊ฑด์ง ๋ณด๊ธฐ๋งํด์๋ ์ ์ ์์.
- ํด๋น ํจ์๊ฐ
return
๊ฐ์ด ์กด์ฌํ๋ ํจ์์ธ์ง, ์๋์ง๋ ์๊ธฐ ํ๋ค๋ค. - ๋ง์น ์๋ฐ์คํฌ๋ฆฝํธ ๋ฃจํ๋ฌธ๋ค ์ฒ๋ผ ๊ฐ์ ์ฝ๋๋ฅผ ์ฌ๋ฌ ๋ฐฉ์์ผ๋ก ํํํ ์ ์๋ค๋ ์
unless
์ฒ๋ผ ๋จ์ํif
์ ๋ฐ๋์ ์๋ฏธ๋ฅผ ๊ฐ์ง ํํ๋ ์๋ค.
- Ruby์ Linter ๊ฒธ Formatter์ธ
Rubocop
์ ์ ์ฉํ์๋๋ฐ, ๋ด ์งง์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ ์ค, ๊ฐ์ฅ ํ๋ฅญํ Linter์๋ค.
- ์ฝ๋ ์คํ์ผ, ๋ค์ด๋ฐ ์ปจ๋ฒค์ , ์ฃผ์ ์ฌ๋ถ ๊ฐ์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ
- ๊ฐ์ ๋์์ ๋ ์ข์ ํํ๊น์ง ์ถ์ฒ
- ABCSize, ์ํ ๋ณต์ก๋ ๊ฐ์ ๊ฐ์ข ์ฝ๋ ๋ณต์ก๋๊น์ง ์ง์
- ๊ท์ฐฎ์ผ๋ฉด ๋ฒํผ ํ๋๋ก ์ด๋ฅผ ์๋์ผ๋ก ์์ (์ฝ๋ ํํ๊น์ง๋!)
- VScode์์ ํธํ์ฑ์ด ์ข๊ณ , ์ค์ ๋ ์ฌ์ ์ผ5๋ฉฐ, Reek ๊ฐ์ ๋ค๋ฅธ ๋ฆฐํฐ์ ๋์์ ์ฌ์ฉ๊ฐ๋ฅ.
- ์ค๋ช ์ด ์๋์ด ์๊ณ , ๋ฌธ์ํ๊ฐ ์๋์ด์๋ค.
CyclomaticComplexity
๋ฌธ์ ์ค ์ผ๋ถ
๋ฌธ์๋ฅผ ์ฝ์ผ๋ฉด์, ์ข์ ์ฝ๋์ ๋ํด ๋ง์ด ๋ฐฐ์ธ ์ ์์๋ค.
๋ฌผ๋ก ์ด์ฉ๋ฉด ๋ด๊ฐ ๋ค๋ฅธ ์ธ์ด์ Linter๋ฅผ ์๋ชป์ฐ๋ ๊ฒ์ผ์ง๋ ๋ชจ๋ฅด์ง๋ง
- regex๋ฅผ ์ด์ฉํ๊ธฐ ์ ์ ์ง์ฆ์ Nokogiri๋ฅผ ์ผ์ผ๋ฉด ์๊ฐ์ ๊ฝค๋ ์๊ผ์ ๊ฒ ๊ฐ๋ค.
- ์ ๋๋ก ์ค๊ณ๋ฅผ ์ํ๊ณ ์จ์ ๊ทธ๋ฐ์ง, ์ฝ๋ ๊ฐ๋ ์ฑ์ด๋ ์ฌ์ฌ์ฉ์ฑ์ด ์กฐ๊ธ ์์ฝ๋ค.
- Ruby on rails๋ฅผ ํจ๊ป ์ฌ์ฉํ์ผ๋ฉด ๊ฒฝํ์ ํฐ ๋์์ด ๋ฌ์ ๊ฒ ๊ฐ์ง๋ง, ๋ด๊ฐ Ruby๋ฅผ ๋ ํ๋ณผ ์ผ์ ์์ ๊ฒ ๊ฐ๋ค.
Jekyll
- ํ์คํ ๋ค์ํ ๊ธฐ๋ฅ์ ํด๋ฆญ ๋ช๋ฒ์ผ๋ก ์ ์ฉ ๊ฐ๋ฅํ๊ณ , ๊ฐ๋ฒผ์ด ๋ธ๋ก๊ทธ๋ก์จ ์์์ด ์์์ง๋ง, ๋์ ๊ธฐ๋ฅ์ ๋ํ ์์ฌ์ด ์ด๋ฅผ ๋ง์ณค๋ค.
- ์คํ๋ ค, ๊ธฐ์กด ๊ธฐ๋ฅ์ ์์ ํ์ฌ ์ฌ์ฉํ๋๋ผ ํ๋ค์๋ค.
- ์๋ฅผ ๋ค์ด, ๊ธฐ๋ณธ ๊ฐ์ธ
post
์ฝ๋ ์ ์ ์ด์ฉํ๋ค ํ์ผ๋ค์ ์ ๋ชฉ์ ์ด์ํ๊ฒ ๋ฐ๊ฟ์ผํ๋ (date-sluggedtitle.md
) ์ ํ์ด ๋ง์์ ์๋ค์ด ์๋ก์ด ์ฝ๋ ์ ์ผ๋ก ๋ฐ๊พธ๋ ๊ณผ์ ์์ ๋ชจ๋ ํ์ผ๋ค์ ๋ด์ฉ๊ณผ ์ ๋ชฉ์ ์๋ด์ค์ผ ํ๋ค. - ์ ์ ์ฌ์ดํธ์ ๋์ ๊ธฐ๋ฅ์ ๋ฃ์ ์๊ฐ์ ํ ์์ ์์ ์ด์ํจ์ ๋๊ปด์ผ ํ๋ค.
- github page์์ ๋ณด์์์ ์ด์ ๋ก ์ผ๋ถ ํ๋ฌ๊ทธ์ธ์ ์ ์ธํ๊ณ ์ง์ํ์ง ์์๋ ์ ๋ํ ์น๋ช
์ ์ด์๋ค.
- ์ง์๋๋ ํ๋ฌ๊ทธ์ธ ์ฐพ๊ธฐ -> netlify ๋ฑ์ ๋ค๋ฅธ ๋ฌด๋ฃ ๋ฐฐํฌ ์๋น์ค ์ฐพ์๋ณด๊ธฐ -> ์๋ฐ์คํฌ๋ฆฝํธ, ๋ฃจ๋น, ํ ํ๋ฆฟ ์ธ์ด ๋ฑ์ผ๋ก ๊ธฐ๋ฅ ์ง์ ๊ตฌํ -> ์ปค์คํ ํ๋ฌ๊ทธ์ธ ์ง์์ ์ํด github action ๊ฑด๋๋ ค๋ณด๊ธฐ
- ์ ๊ณผ์ ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ ธ๋ค.
- ํ์ง๋ง, ๋ง์ฝ ๋์ ๊ฒฝ์ฐ์ ์ ๋ฐ๋๋ก, ๋ณ ๋ค๋ฅธ ์ปค์คํฐ๋ง์ด์ง ์์ด ๋ธ๋ก๊น
ํ๋ ค๋ฉด, ๊ตณ์ด Jekyll์ ์ฐ๋ ๊ฒ ๋ณด๋ค๋ Tistory๋ ๋ค์ด๋ฒ ๋ธ๋ก๊ทธ, velog ๊ฐ์ ์์ฉ ๋ธ๋ก๊ทธ๋ฅผ ์ฐ๋๊ฒ ๋ ๋์๊ฒ ๊ฐ๋ค.
- ๋๊ธ, ์กฐํ์, ์ถ์ฒ ๋ฑ์ ๋์ ์ธ ๊ธฐ๋ฅ์ด ๊ฐ๋ฅํ๋ฉฐ, ๊ด๊ณ ๋ฑ์ ์ฝ๊ฒ ์ ์ฉํ ์ ์๊ธฐ ๋๋ฌธ
- Liquid ํ
ํ๋ฆฟ ์ธ์ด๋
include
๋ฅผ ์ด์ฉํ ์ฝ๋ ์ฌ์ฌ์ฉ์ด ์ฌ์ ๊ณ , ๊ฐ์ข ํํฐ์ ํจ์๋ค์ด ๊ฝค ํธ๋ฆฌํ์ง๋ง, ์ฌ์ ํ ๋ณ๋ก์๋ค. React์ JSX์ ์ปดํฌ๋ํธ๊ฐ ๋๋ฌด ๊ทธ๋ฆฌ์ ๋ค.- jinja2 ๊ฐ์ ๋ค๋ฅธ ํ ํ๋ฆฟ ์ธ์ด์์ ์ฐจ๋ณ์ ์ ์ ๋ชจ๋ฅด๊ฒ ๋ค.
_articles/etc/Subbrain ๊ฐ๋ฐ๊ธฐ/Subbrain ๊ฐ๋ฐ๊ธฐ - Ruby&Jekyll.md