Π― ΡΠΆΠ°Π» bootstrap.min.js Ρ ΠΏΠΎΠΌΠΎΡΡΡ django_compressor
Π·Π½Π°ΡΠΎΠΊ ΡΠ²ΠΎΡΠ°ΡΠΈΠ²Π°Π½ΠΈΡ ΠΏΠ°Π½Π΅Π»ΠΈ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΠΈ Π½Π΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ ΠΈΠ·-Π·Π° ΠΎΡΠΈΠ±ΠΊΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° XML.
ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ bootstrap4, Ρ bootstrap3 Ρ ΡΠ°ΠΊΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Π½Π΅ ΡΡΠ°Π»ΠΊΠΈΠ²Π°Π»ΡΡ
Π― ΡΠ²ΠΈΠ΄Π΅Π» ΡΠ°Π·Π½ΠΈΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π² firefox
ΠΠ΅Π· ΠΎΡΠΈΠ±ΠΎΠΊ (Π±Π΅Π· ΡΠΆΠ°ΡΠΈΡ)
.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-compress 2.2, Bootstrap 4.1.1
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π²ΡΠ·Π²Π°Π½Π° CSSMinFilter
ΠΠ°ΠΈΠΌΡΡΠ²ΡΡ ΠΎΠ±Ρ
ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΡΡ Π΄Π»Ρ csscompressor , Ρ Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΠΉ ΡΠΈΠ»ΡΡΡ, ΡΡΠΎΠ±Ρ ΠΎΠ±Π΅ΡΠ½ΡΡΡ rcssmin (Π·Π°ΠΌΠ΅Π½ΠΈΡΠ΅ CSSMinFilter Π² settings.COMPRESS_FILTERS ΡΡΡΠΎΠΊΠΎΠΉ ΠΏΡΡΠΈ Ρ ΡΠΎΡΠΊΠ°ΠΌΠΈ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠΈΠ»ΡΡΡΠ° ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ ΠΏΡΡΡ callback
). ΠΡΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ±Π΅Π»Ρ Π² URL-Π°Π΄ΡΠ΅ΡΠ°Ρ
Π΄Π°Π½Π½ΡΡ
Π½Π° "% 20" ΠΏΠ΅ΡΠ΅Π΄ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ΠΉ rcssmin, ΡΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ URL-Π°Π΄ΡΠ΅ΡΠΎΠ² rcssmin.
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.
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
Π― ΠΌΠΎΠ³Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠ΄ΠΈΡΡ, ΡΡΠΎ ΡΡΠΎ Π²ΡΠ΅ Π΅ΡΠ΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² # 828
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Django 2.0, Python 3.6, django-compress 2.2, Bootstrap 4.1.1
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π²ΡΠ·Π²Π°Π½Π°
CSSMinFilter