""" Extra webasset filters. """
from __future__ import annotations
import os
import rcssmin # type:ignore[import-untyped]
from webassets.filter import Filter, register_filter
from webassets.filter.datauri import (
CSSDataUri, CSSUrlRewriter)
from dukpy.webassets import BabelJSX # type:ignore[import-untyped]
from dukpy import jsx_compile # type:ignore[import-untyped]
from typing import Any, IO
[docs]
class JsxFilter(BabelJSX): # type:ignore[misc]
"""
DukPy is a simple javascript interpreter for Python built on top of
duktape engine without any external dependency.
Note: let is not supported by the duktape engine,
see https://github.com/amol-/dukpy/issues/47.
"""
[docs]
babel_options: dict[str, Any] = {'minified': True}
[docs]
def setup(self) -> None:
self.transformer = jsx_compile
register_filter(JsxFilter) # type:ignore[no-untyped-call]
[docs]
class DataUriFilter(CSSDataUri):
""" Overrides the default datauri filter to work around this issue:
https://github.com/miracle2k/webassets/issues/387
"""
@property
[docs]
def source_url(self) -> str:
return self.ctx.resolver.resolve_source_to_url( # type:ignore[union-attr]
self.ctx, self.keywords['source_path'], self.keywords['source'])
@property
[docs]
def output_url(self) -> str:
return self.ctx.resolver.resolve_output_to_url( # type:ignore[union-attr]
self.ctx, self.keywords['output'])
register_filter(DataUriFilter) # type:ignore[no-untyped-call]
[docs]
class RCSSMinFilter(Filter):
""" Adds the rcssmin filter (not yet included in webassets) """
[docs]
name = 'custom-rcssmin' # type:ignore[assignment]
[docs]
def setup(self) -> None:
self.rcssmin = rcssmin
[docs]
def output(self, _in: IO[str], out: IO[str], **kw: Any) -> None:
out.write(self.rcssmin.cssmin(_in.read()))
register_filter(RCSSMinFilter) # type:ignore[no-untyped-call]