Django-compressor: ์••์ถ• ํ›„ svg ์ด๋ฏธ์ง€ URL์˜ xml ๊ตฌ๋ฌธ ๋ถ„์„ ์˜ค๋ฅ˜

์— ๋งŒ๋“  2018๋…„ 05์›” 26์ผ  ยท  2์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: django-compressor/django-compressor

django_compressor๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ bootstrap.min.js๋ฅผ ์••์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.

XML ๊ตฌ๋ฌธ ๋ถ„์„ ์˜ค๋ฅ˜๋กœ ์ธํ•ด navbar ์ถ•์†Œ ์•„์ด์ฝ˜์ด ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” bootstrap4๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ, bootstrap3์—์„œ ๊ทธ๋Ÿฐ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” firefox์—์„œ inspect ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฐจ์ด์ ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ์—†์Œ (์••์ถ• ์—†์Œ)

.navbar-dark .navbar-toggler-icon {
    background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")
}

์ด๋กœ ์ธํ•ด XML ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค (์••์ถ• ํ›„).

.navbar-dark .navbar-toggler-icon {
    background-image: url("data:image/svg+xml;charset=utf8,%3CsvgviewBox='003030'xmlns='http://www.w3.org/2000/svg'%3E%3Cpathstroke='rgba(255,255,255,0.5)'stroke-width='2'stroke-linecap='round'stroke-miterlimit='10'd='M47h22M415h22M423h22'/%3E%3C/svg%3E")
}

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

# 828์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Django 2.0, Python 3.6, django-compressor 2.2, Bootstrap 4.1.1์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

CSSMinFilter ๋กœ ์ธํ•ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  2 ๋Œ“๊ธ€

# 828์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Django 2.0, Python 3.6, django-compressor 2.2, Bootstrap 4.1.1์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

CSSMinFilter ๋กœ ์ธํ•ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

csscompressor์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์—์„œ ์ฐจ์šฉํ•˜์—ฌ callback ๊ฒฝ๋กœ ๋ณ€๊ฒฝ). ์ด๋ ‡๊ฒŒํ•˜๋ฉด rcssmin์ด URL์„ ๋ง๊ฐ€ ๋œจ๋ฆฌ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” rcssmin์œผ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์ „์— ๋ฐ์ดํ„ฐ URL์˜ ๊ณต๋ฐฑ์„ "% 20"์œผ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

def compress(css, **kwargs):
    capture_svg = re.compile(r'url\("(data:image/svg.*?svg%3[Ee])\"\)')
    data_urls = re.findall(capture_svg, css)
    for data_url in data_urls:
        css = css.replace(data_url, data_url.replace(' ', '%20'))
    css = cssmin(css, **kwargs)
    return css


class CSSMinFilter(CallbackOutputFilter):
    callback = 'myapp.core.utils.compress'

์ด ๋ฌธ์ œ๋Š” rcssmin ์—๋„๋ณด๊ณ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ์ด ๋ฌธ์ œ๋Š” # 878๊ณผ ์ค‘๋ณต ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰