diff options
author | Eevee (Alex Munroe) <eevee.git@veekun.com> | 2014-08-27 15:37:31 -0700 |
---|---|---|
committer | Eevee (Alex Munroe) <eevee.git@veekun.com> | 2014-08-27 15:37:31 -0700 |
commit | 52eaeed67473b190e1bae47b3b8373360c2e94b5 (patch) | |
tree | 917f0de7041e1806f1a51a0371e25faf5b7541e5 | |
parent | 11e2b44c0e7992db0e339f4dd53fe93a16710802 (diff) | |
download | pyscss-52eaeed67473b190e1bae47b3b8373360c2e94b5.tar.gz |
Convert extra and fonts into extensions.
-rw-r--r-- | scss/compiler.py | 4 | ||||
-rw-r--r-- | scss/extension/__init__.py | 13 | ||||
-rw-r--r-- | scss/extension/api.py (renamed from scss/extension.py) | 0 | ||||
-rw-r--r-- | scss/extension/core.py (renamed from scss/core.py) | 0 | ||||
-rw-r--r-- | scss/extension/extra.py (renamed from scss/functions/extra.py) | 50 | ||||
-rw-r--r-- | scss/extension/fonts.py (renamed from scss/functions/fonts.py) | 42 | ||||
-rw-r--r-- | scss/functions/__init__.py | 3 | ||||
-rw-r--r-- | scss/legacy.py | 15 | ||||
-rw-r--r-- | scss/tests/functions/test_core.py | 2 | ||||
-rw-r--r-- | scss/tests/functions/test_extra.py | 7 | ||||
-rw-r--r-- | scss/tests/test_expression.py | 2 |
11 files changed, 77 insertions, 61 deletions
diff --git a/scss/compiler.py b/scss/compiler.py index d7f43c7..6afd149 100644 --- a/scss/compiler.py +++ b/scss/compiler.py @@ -16,13 +16,13 @@ import warnings import six import scss.config as config -from scss.core import CoreExtension from scss.cssdefs import _spaces_re from scss.cssdefs import _escape_chars_re from scss.cssdefs import _prop_split_re from scss.errors import SassError from scss.expression import Calculator from scss.extension import Extension +from scss.extension.core import CoreExtension from scss.extension import NamespaceAdapterExtension from scss.functions import COMPASS_LIBRARY from scss.functions.compass.sprites import sprite_map @@ -93,7 +93,7 @@ class Compiler(object): """ def __init__( self, root='', search_path=('',), - namespace=None, extensions=(CoreExtension, Namespace(functions=COMPASS_LIBRARY)), + namespace=None, extensions=(CoreExtension,), output_style='nested', generate_source_map=False, live_errors=False, warn_unused_imports=False, super_selector='', diff --git a/scss/extension/__init__.py b/scss/extension/__init__.py new file mode 100644 index 0000000..56e66ef --- /dev/null +++ b/scss/extension/__init__.py @@ -0,0 +1,13 @@ +"""Support for compiler extensions, which can affect the compile process and +inject their own functions and values. +""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +# Re-export +from .api import Extension +from .api import NamespaceAdapterExtension + + +__all__ = ['Extension', 'NamespaceAdapterExtension'] diff --git a/scss/extension.py b/scss/extension/api.py index 396b296..396b296 100644 --- a/scss/extension.py +++ b/scss/extension/api.py diff --git a/scss/core.py b/scss/extension/core.py index 1f33514..1f33514 100644 --- a/scss/core.py +++ b/scss/extension/core.py diff --git a/scss/functions/extra.py b/scss/extension/extra.py index c1c6335..30cbe5f 100644 --- a/scss/functions/extra.py +++ b/scss/extension/extra.py @@ -1,5 +1,7 @@ """Functions new to the pyScss library.""" from __future__ import absolute_import +from __future__ import division +from __future__ import print_function from __future__ import unicode_literals import logging @@ -10,7 +12,8 @@ import six from six.moves import xrange from scss import config -from scss.functions.library import FunctionLibrary +from scss.extension import Extension +from scss.namespace import Namespace from scss.types import Color, Number, String, List from scss.util import escape, make_data_url, make_filename_hash @@ -20,17 +23,27 @@ except ImportError: try: import Image import ImageDraw - except: + except ImportError: Image = None + ImageDraw = None + log = logging.getLogger(__name__) -EXTRA_LIBRARY = FunctionLibrary() -register = EXTRA_LIBRARY.register + +class ExtraExtension(Extension): + """Extra functions unique to the pyScss library.""" + name = 'extra' + namespace = Namespace() + + +# Alias to make the below declarations less noisy +ns = ExtraExtension.namespace # ------------------------------------------------------------------------------ # Image stuff + def _image_noise(pixdata, size, density=None, intensity=None, color=None, opacity=None, monochrome=None, background=None): if not density: density = [0.8] @@ -259,14 +272,7 @@ def _image_brushed(pixdata, size, density=None, intensity=None, color=None, opac pixdata[pos] = tuple(int(round(c)) for c in (col[0] / ca, col[1] / ca, col[2] / ca, ca * 255)) -@register('background-noise', 0) -@register('background-noise', 1) -@register('background-noise', 2) -@register('background-noise', 3) -@register('background-noise', 4) -@register('background-noise', 5) -@register('background-noise', 6) -@register('background-noise', 7) +@ns.declare def background_noise(density=None, opacity=None, size=None, monochrome=False, intensity=(), color=None, background=None, inline=False): if not Image: raise Exception("Images manipulation require PIL") @@ -316,16 +322,7 @@ def background_noise(density=None, opacity=None, size=None, monochrome=False, in return String.unquoted(inline) -@register('background-brushed', 0) -@register('background-brushed', 1) -@register('background-brushed', 2) -@register('background-brushed', 3) -@register('background-brushed', 4) -@register('background-brushed', 5) -@register('background-brushed', 6) -@register('background-brushed', 7) -@register('background-brushed', 8) -@register('background-brushed', 9) +@ns.declare def background_brushed(density=None, intensity=None, color=None, opacity=None, size=None, monochrome=False, direction=(), spread=(), background=None, inline=False): if not Image: raise Exception("Images manipulation require PIL") @@ -378,9 +375,8 @@ def background_brushed(density=None, intensity=None, color=None, opacity=None, s return String.unquoted(inline) -@register('grid-image', 4) -@register('grid-image', 5) -def _grid_image(left_gutter, width, right_gutter, height, columns=1, grid_color=None, baseline_color=None, background_color=None, inline=False): +@ns.declare +def grid_image(left_gutter, width, right_gutter, height, columns=1, grid_color=None, baseline_color=None, background_color=None, inline=False): if not Image: raise Exception("Images manipulation require PIL") if grid_color is None: @@ -444,9 +440,7 @@ def _grid_image(left_gutter, width, right_gutter, height, columns=1, grid_color= return String.unquoted(inline) -@register('image-color', 1) -@register('image-color', 2) -@register('image-color', 3) +@ns.declare def image_color(color, width=1, height=1): if not Image: raise Exception("Images manipulation require PIL") diff --git a/scss/functions/fonts.py b/scss/extension/fonts.py index d3bea42..9d2d1e1 100644 --- a/scss/functions/fonts.py +++ b/scss/extension/fonts.py @@ -1,8 +1,7 @@ -""" -Functions used for generating custom fonts from SVG files. - -""" +"""Functions used for generating custom fonts from SVG files.""" from __future__ import absolute_import +from __future__ import division +from __future__ import print_function from __future__ import unicode_literals import re @@ -15,8 +14,6 @@ import tempfile import subprocess import warnings -import six - try: import cPickle as pickle except ImportError: @@ -28,7 +25,8 @@ except: fontforge = None from scss import config -from scss.functions.library import FunctionLibrary +from scss.extension import Extension +from scss.namespace import Namespace from scss.types import String, Boolean, List from scss.util import getmtime, escape, make_data_url, make_filename_hash @@ -40,9 +38,6 @@ TTF2EOT_EXECUTABLE = 'ttf2eot' MAX_FONT_SHEETS = 4096 KEEP_FONT_SHEETS = int(MAX_FONT_SHEETS * 0.8) -FONTS_LIBRARY = FunctionLibrary() -register = FONTS_LIBRARY.register - FONT_TYPES = ('eot', 'woff', 'ttf', 'svg') # eot should be first for IE support FONT_MIME_TYPES = { @@ -70,6 +65,16 @@ GLYPH_WIDTH = GLYPH_HEIGHT # Offset to work around Chrome Windows bug GLYPH_START = 0xf100 + +class FontsExtension(Extension): + """Functions for creating and manipulating fonts.""" + name = 'fonts' + namespace = Namespace() + + +# Alias to make the below declarations less noisy +ns = FontsExtension.namespace + font_sheets = {} _font_sheet_cache = {} @@ -114,7 +119,7 @@ def ttf2eot(ttf): return output -@register('font-sheet') +@ns.declare def font_sheet(g, **kwargs): if not fontforge: raise Exception("Fonts manipulation require fontforge") @@ -371,21 +376,20 @@ def font_sheet(g, **kwargs): return asset -@register('glyphs', 1) -@register('glyph-names', 1) +@ns.declare_alias('glyph-names') +@ns.declare def glyphs(sheet, remove_suffix=False): sheet = sheet.render() font_sheet = font_sheets.get(sheet, {}) return List([String.unquoted(f) for f in sorted(set(f.rsplit('-', 1)[0] if remove_suffix else f for f in font_sheet if not f.startswith('*')))]) -@register('glyph-classes', 1) +@ns.declare def glyph_classes(sheet): return glyphs(sheet, True) -@register('font-url', 2) -@register('font-url', 3) +@ns.declare def font_url(sheet, type_, only_path=False, cache_buster=True): font_sheet = font_sheets.get(sheet.render()) type_ = String.unquoted(type_).render() @@ -409,7 +413,7 @@ def font_url(sheet, type_, only_path=False, cache_buster=True): return String.unquoted('') -@register('font-format', 3) +@ns.declare def font_format(type_): type_ = type_.render() if type_ in FONT_FORMATS: @@ -417,7 +421,7 @@ def font_format(type_): return String.unquoted('') -@register('has-glyph', 2) +@ns.declare def has_glyph(sheet, glyph): sheet = sheet.render() font_sheet = font_sheets.get(sheet) @@ -428,7 +432,7 @@ def has_glyph(sheet, glyph): return Boolean(bool(glyph)) -@register('glyph-code', 2) +@ns.declare def glyph_code(sheet, glyph): sheet = sheet.render() font_sheet = font_sheets.get(sheet) diff --git a/scss/functions/__init__.py b/scss/functions/__init__.py index ab6fdd2..76dc525 100644 --- a/scss/functions/__init__.py +++ b/scss/functions/__init__.py @@ -2,9 +2,6 @@ from __future__ import absolute_import from scss.functions.library import FunctionLibrary -from scss.functions.core import CORE_LIBRARY -from scss.functions.extra import EXTRA_LIBRARY -from scss.functions.fonts import FONTS_LIBRARY from scss.functions.compass.configuration import ns from scss.functions.compass.sprites import COMPASS_SPRITES_LIBRARY from scss.functions.compass.gradients import COMPASS_GRADIENTS_LIBRARY diff --git a/scss/legacy.py b/scss/legacy.py index 12e225d..d44d71e 100644 --- a/scss/legacy.py +++ b/scss/legacy.py @@ -8,6 +8,10 @@ import six from scss.compiler import Compiler import scss.config as config from scss.expression import Calculator +from scss.extension.core import CoreExtension +from scss.extension.extra import ExtraExtension +from scss.extension.fonts import FontsExtension +from scss.functions import COMPASS_LIBRARY from scss.namespace import Namespace from scss.scss_meta import ( BUILD_INFO, PROJECT, VERSION, REVISION, URL, AUTHOR, AUTHOR_EMAIL, LICENSE, @@ -48,7 +52,7 @@ class Scss(object): def __init__( self, scss_vars=None, scss_opts=None, scss_files=None, super_selector='', live_errors=False, - library=None, + library=None, func_registry=None, search_paths=None): self.super_selector = super_selector @@ -68,7 +72,7 @@ class Scss(object): self._scss_opts = scss_opts or {} self._scss_files = scss_files - self._library = library + self._library = func_registry or library self._search_paths = search_paths # If true, swallow compile errors and embed them in the output instead @@ -89,6 +93,7 @@ class Scss(object): root_namespace = Namespace( variables=self.scss_vars, + functions=self._library, ) # Figure out search paths. Fall back from provided explicitly to @@ -118,6 +123,12 @@ class Scss(object): # Build the compiler compiler = Compiler( namespace=root_namespace, + extensions=[ + CoreExtension, + ExtraExtension, + FontsExtension, + Namespace(functions=COMPASS_LIBRARY), + ], search_path=search_paths, live_errors=self.live_errors, generate_source_map=self._scss_opts.get('debug_info', False), diff --git a/scss/tests/functions/test_core.py b/scss/tests/functions/test_core.py index 1d7c64d..6657553 100644 --- a/scss/tests/functions/test_core.py +++ b/scss/tests/functions/test_core.py @@ -7,8 +7,8 @@ from __future__ import absolute_import from __future__ import division from __future__ import unicode_literals -from scss.core import CoreExtension from scss.expression import Calculator +from scss.extension.core import CoreExtension from scss.types import Color, Number, String import pytest diff --git a/scss/tests/functions/test_extra.py b/scss/tests/functions/test_extra.py index 05fc616..9f4f30b 100644 --- a/scss/tests/functions/test_extra.py +++ b/scss/tests/functions/test_extra.py @@ -7,12 +7,9 @@ tested, rather than the parsing or type system. from __future__ import absolute_import from __future__ import unicode_literals -import scss.functions.extra as libextra +import scss.extra as libextra from scss.types import Boolean, Color, Number -import pytest -xfail = pytest.mark.xfail - # TODO: currently these all just call the functions and make sure they pass. # would be nice to check the output, though that's a little tedious. @@ -27,7 +24,7 @@ def test_background_brushed(): def test_grid_image(): # TODO this should accept sass values only :| - libextra._grid_image(5, 100, 5, 100) + libextra.grid_image(5, 100, 5, 100) def test_image_color(): diff --git a/scss/tests/test_expression.py b/scss/tests/test_expression.py index 0c607da..199d9b7 100644 --- a/scss/tests/test_expression.py +++ b/scss/tests/test_expression.py @@ -4,9 +4,9 @@ contains a variety of expression-related tests. from __future__ import absolute_import from __future__ import unicode_literals -from scss.core import CoreExtension from scss.errors import SassEvaluationError from scss.expression import Calculator +from scss.extension.core import CoreExtension from scss.rule import Namespace from scss.types import Color, List, Null, Number, String |