init comomit
parent
992fe96f32
commit
28d1ac3e9f
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
@ -0,0 +1,3 @@
|
||||||
|
from src.build import build
|
||||||
|
import config
|
||||||
|
if __name__ == "__main__": build(config.config)
|
|
@ -0,0 +1,81 @@
|
||||||
|
|
||||||
|
# TODO: 블록 글자 추가
|
||||||
|
# TODO: 기울임꼴(ah 같은 특수 기울임도) 추가
|
||||||
|
|
||||||
|
config = {
|
||||||
|
# -------------------------------------------
|
||||||
|
# Base Settings
|
||||||
|
# -------------------------------------------
|
||||||
|
|
||||||
|
# TODO: 이 설정은 아직 동작하지 않습니다
|
||||||
|
# 출력 파일의 이름을 지정합니다.
|
||||||
|
# Array 형태로 여러 이름을 추가할 수 있습니다
|
||||||
|
# 필요한 경우 otf 와 같은 다른 확장자를
|
||||||
|
# 사용할 수도 있습니다
|
||||||
|
"OutputNames": {
|
||||||
|
"Bold": ["KawaiiPatched.ttf"],
|
||||||
|
"Regular": [""],
|
||||||
|
},
|
||||||
|
|
||||||
|
# TODO: 이 설정은 아직 동작하지 않습니다
|
||||||
|
# 일반적인 글자 (예: a) 의 너비입니다.
|
||||||
|
# 작은 화면에 더많은 정보를 담아내려면
|
||||||
|
# 이 값을 줄이세요. 단 스캐일이 조정되지
|
||||||
|
# 않습니다
|
||||||
|
"FontBaseWidth": 550,
|
||||||
|
|
||||||
|
# TODO: 이 설정은 아직 동작하지 않습니다
|
||||||
|
# 폰트의 X 축 스캐일 조정입니다.
|
||||||
|
# 폰트의 width 를 줄이거나 늘렸을 때
|
||||||
|
# 이 값을 변경하여 가로로 늘리거나
|
||||||
|
# 작게 줄일 수 있습니다
|
||||||
|
"FontScaleX": 1,
|
||||||
|
|
||||||
|
# -------------------------------------------
|
||||||
|
# Glyphs and Features
|
||||||
|
# -------------------------------------------
|
||||||
|
|
||||||
|
# 한글 글리프를 나눔 스퀘어 네오 폰트에서
|
||||||
|
# 복사할 지에 대한 여부입니다
|
||||||
|
# 폰트 용량이 매우 커집니다!!
|
||||||
|
"CopyKoreanGlyphs": True,
|
||||||
|
|
||||||
|
# TODO: 이 설정은 아직 동작하지 않습니다
|
||||||
|
# 노토 산스 모노에서 가타카나/히라가나
|
||||||
|
# 글리프를 복사할 지에 대한 여부입니다
|
||||||
|
# 한자는 포함하지 않습니다
|
||||||
|
"CopyJapaneseGlyphs": True,
|
||||||
|
|
||||||
|
# TODO: 이 설정은 아직 동작하지 않습니다
|
||||||
|
# 노토 산스 모노에서 CJK 공용 한자 글리프를
|
||||||
|
# 복사할 지에 대한 여부입니다.
|
||||||
|
# 폰트 용량이 매우 커집니다!!
|
||||||
|
# 웹용 폰트의 경우 끄는것을 추천합니다
|
||||||
|
"CopyCJKUnifiedIdeographs": True,
|
||||||
|
|
||||||
|
# TODO: 이 설정은 아직 동작하지 않습니다
|
||||||
|
# 라틴 글리프를 Hack 폰트에서 더 가져옵니다
|
||||||
|
# (성조 표시된 라틴, ...)
|
||||||
|
"CopyLatinExtra": True,
|
||||||
|
|
||||||
|
# TODO: 이 설정은 아직 동작하지 않습니다
|
||||||
|
# Nerd Fonts 패치를 적용할지에 대한
|
||||||
|
# 여부입니다. 폰트 용량이 매우 커집니다!!
|
||||||
|
# 웹용 폰트의 경우 끄는것을 추천합니다
|
||||||
|
"NerdFonts": True,
|
||||||
|
|
||||||
|
# TODO: 이 설정은 아직 동작하지 않습니다
|
||||||
|
# Nerd Fonts 패치에 발견되는 크기 이슈를
|
||||||
|
# 해결하기 위해 크기조절이 이루워집니다
|
||||||
|
# Nerd Fonts 패치를 활성화 한 경우에만
|
||||||
|
# 이 값이 사용됩니다.
|
||||||
|
"NerdFontsAdjust": True,
|
||||||
|
|
||||||
|
# TODO: 이 설정은 아직 동작하지 않습니다
|
||||||
|
# Liga (합자) 를 추가할 지에 대한 여부입니다
|
||||||
|
# 활성화시 <!-- 와 같은 문자를 합쳐줍니다
|
||||||
|
# Vscode 의 경우 설정에
|
||||||
|
# "editor.fontLigatures": true,
|
||||||
|
# 가 되어있어야 표시됩니다.
|
||||||
|
"Liga": True,
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
#!/usr/bin/bash
|
||||||
|
python3 build.py
|
||||||
|
cp kawaiiPatched.ttf ~/.local/share/fonts/KawaiiMonoRegular.ttf
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
wget
|
|
@ -0,0 +1,2 @@
|
||||||
|
def getFontPath():
|
||||||
|
return "KawaiiMonoRegular.sfd"
|
|
@ -0,0 +1,47 @@
|
||||||
|
from . import wgetHandler
|
||||||
|
import os
|
||||||
|
import zipfile
|
||||||
|
import shutil
|
||||||
|
import math
|
||||||
|
|
||||||
|
link_NanumSquareNeo = "https://campaign.naver.com/nanumsquare_neo/download/NaverNanumSquareNeo.zip"
|
||||||
|
|
||||||
|
# 폰트 다운로드와 열기
|
||||||
|
# 배포 방식이 zip 으로 배포이기 때문에 zipfile 라이브러리로
|
||||||
|
# 다운로드 후 언팩함
|
||||||
|
def getFontPath():
|
||||||
|
if not os.path.exists("assets"): os.mkdir("assets")
|
||||||
|
if not os.path.exists("assets/NanumSquareNeoKr.ttf"):
|
||||||
|
if not os.path.exists("assets/NanumSquareNeoKr.zip"):
|
||||||
|
wgetHandler.download(link_NanumSquareNeo,"assets/NanumSquareNeoKr.zip")
|
||||||
|
print("Unzipping NanumSquareNeoKr.zip",end="")
|
||||||
|
with zipfile.ZipFile("assets/NanumSquareNeoKr.zip", 'r') as zip_ref:
|
||||||
|
extractName = zip_ref.extract("NaverNanumSquareNeo/TTF/NanumSquareNeo-cBd.ttf","assets/NanumSquareNeoKr.extract")
|
||||||
|
os.rename(extractName,"assets/NanumSquareNeoKr.ttf")
|
||||||
|
shutil.rmtree('assets/NanumSquareNeoKr.extract')
|
||||||
|
print(" [OK]")
|
||||||
|
return "assets/NanumSquareNeoKr.ttf"
|
||||||
|
|
||||||
|
def pasteGlyphs(target,source,baseSize=550):
|
||||||
|
def select(font):
|
||||||
|
font.selection.none()
|
||||||
|
font.selection.select(("more","ranges","unicode"),0x3131,0x32BF) # ㄱ ~ ㊿
|
||||||
|
font.selection.select(("more","ranges","unicode"),0xAC00,0xD7A3) # 가 ~ 힣
|
||||||
|
select(source)
|
||||||
|
|
||||||
|
# 넓은 글자 크기 (한글에 모두 적용)
|
||||||
|
wideWidth = baseSize*2
|
||||||
|
for glyph in source.selection.byGlyphs:
|
||||||
|
widthDiff = wideWidth-glyph.width # 타겟 너비와 얼마나 크기 차이가 나는지
|
||||||
|
sideAdjust = widthDiff/2 # 좌우 사이드 조정해야하는 정도
|
||||||
|
glyph.left_side_bearing = int(glyph.left_side_bearing + math.floor(sideAdjust)) # 좌우 베어링을 조정함
|
||||||
|
glyph.right_side_bearing = int(glyph.right_side_bearing + math.ceil(sideAdjust))
|
||||||
|
glyph.width = wideWidth # 타겟 너비로 정확하게 설정
|
||||||
|
|
||||||
|
# 타겟으로 글리프 복사
|
||||||
|
source.copy()
|
||||||
|
select(target)
|
||||||
|
target.paste()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
getFontPath()
|
|
@ -0,0 +1,38 @@
|
||||||
|
from . import wgetHandler
|
||||||
|
import os
|
||||||
|
|
||||||
|
github_NotoSansMonoCJKkr = "https://github.com/googlefonts/noto-cjk/raw/main/Sans/Mono/NotoSansMonoCJKkr-Regular.otf"
|
||||||
|
|
||||||
|
# 폰트 다운로드와 열기
|
||||||
|
def getFontPath():
|
||||||
|
if not os.path.exists("assets"): os.mkdir("assets")
|
||||||
|
if not os.path.exists("assets/NotoMonoCJKkr.otf"):
|
||||||
|
wgetHandler.download(github_NotoSansMonoCJKkr,"assets/NotoMonoCJKkr.otf")
|
||||||
|
return "assets/NotoMonoCJKkr.otf"
|
||||||
|
|
||||||
|
def pasteGlyphs(target,source,baseSize=550):
|
||||||
|
source.cidFlatten()
|
||||||
|
|
||||||
|
def select(font):
|
||||||
|
font.selection.none()
|
||||||
|
font.selection.select(("more","ranges","unicode"),0x3131,0x32BF) # ㄱ ~ ㊿
|
||||||
|
font.selection.select(("more","ranges","unicode"),0xAC00,0xD7A3) # 가 ~ 힣
|
||||||
|
select(source)
|
||||||
|
|
||||||
|
# 넓은 글자 크기 (한글에 모두 적용)
|
||||||
|
wideWidth = baseSize*2
|
||||||
|
for glyph in source.selection.byGlyphs:
|
||||||
|
widthDiff = wideWidth-glyph.width # 타겟 너비와 얼마나 크기 차이가 나는지
|
||||||
|
sideAdjust = widthDiff/2 # 좌우 사이드 조정해야하는 정도
|
||||||
|
glyph.left_side_bearing = int(glyph.left_side_bearing + math.floor(sideAdjust)) # 좌우 베어링을 조정함
|
||||||
|
glyph.right_side_bearing = int(glyph.right_side_bearing + math.ceil(sideAdjust))
|
||||||
|
glyph.width = wideWidth # 타겟 너비로 정확하게 설정
|
||||||
|
|
||||||
|
# 타겟으로 글리프 복사
|
||||||
|
source.copy()
|
||||||
|
select(target)
|
||||||
|
target.paste()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
getFontPath()
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,39 @@
|
||||||
|
import fontforge
|
||||||
|
|
||||||
|
from . import NanumSquareNeo as NanumSquareNeoLoader
|
||||||
|
from . import NotoMono as NotoMonoLoader
|
||||||
|
from . import KawaiiMono as KawaiiMonoLoader
|
||||||
|
|
||||||
|
def build(config=None):
|
||||||
|
# 메인 폰트 불러오기
|
||||||
|
kawaii = fontforge.open(
|
||||||
|
KawaiiMonoLoader.getFontPath())
|
||||||
|
|
||||||
|
# 모든 글리프를 붇여넣을 수 있도록 인코딩을 utf full 로 변경
|
||||||
|
kawaii.encoding = 'UnicodeFull'
|
||||||
|
|
||||||
|
# 한글 글리프 붇여넣기
|
||||||
|
if config.CopyKoreanGlyphs:
|
||||||
|
# 나눔 스퀘어 네오 다운로드/불러오기
|
||||||
|
nanumSquareNeo = fontforge.open(
|
||||||
|
NanumSquareNeoLoader.getFontPath())
|
||||||
|
# 글리프 붇여넣기
|
||||||
|
NanumSquareNeoLoader.pasteGlyphs(
|
||||||
|
target=kawaii,baseSize=550,
|
||||||
|
source=nanumSquareNeo)
|
||||||
|
|
||||||
|
if config.CopyJPGlyphs or config.Copy:
|
||||||
|
# 노토 모노 다운로드/불러오기
|
||||||
|
notoMono = fontforge.open(
|
||||||
|
NotoMonoLoader.getFontPath())
|
||||||
|
|
||||||
|
|
||||||
|
# 생성
|
||||||
|
kawaii.generate("kawaiiPatched.ttf")
|
||||||
|
|
||||||
|
# 파일 닫기
|
||||||
|
notoMono.close()
|
||||||
|
nanumSquareNeo.close()
|
||||||
|
kawaii.close()
|
||||||
|
|
||||||
|
if __name__ == "__main__": build()
|
|
@ -0,0 +1,15 @@
|
||||||
|
import wget
|
||||||
|
import math
|
||||||
|
|
||||||
|
def bar_custom(current, total, width=80):
|
||||||
|
width=30
|
||||||
|
avail_dots = width-2
|
||||||
|
shaded_dots = int(math.floor(float(current) / total * avail_dots))
|
||||||
|
percent_bar = '[' + '■'*shaded_dots + ' '*(avail_dots-shaded_dots) + ']'
|
||||||
|
progress = "%d%% %s [%d / %d]" % (current / total * 100, percent_bar, current, total)
|
||||||
|
return progress
|
||||||
|
|
||||||
|
def download(url, fileName):
|
||||||
|
print("Downloading resource to "+fileName+" ...")
|
||||||
|
wget.download(url, fileName, bar=bar_custom)
|
||||||
|
print(" [OK]")
|
Loading…
Reference in New Issue