summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEevee (Alex Munroe) <eevee.git@veekun.com>2014-08-27 15:37:31 -0700
committerEevee (Alex Munroe) <eevee.git@veekun.com>2014-08-27 15:37:31 -0700
commit52eaeed67473b190e1bae47b3b8373360c2e94b5 (patch)
tree917f0de7041e1806f1a51a0371e25faf5b7541e5
parent11e2b44c0e7992db0e339f4dd53fe93a16710802 (diff)
downloadpyscss-52eaeed67473b190e1bae47b3b8373360c2e94b5.tar.gz
Convert extra and fonts into extensions.
-rw-r--r--scss/compiler.py4
-rw-r--r--scss/extension/__init__.py13
-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__.py3
-rw-r--r--scss/legacy.py15
-rw-r--r--scss/tests/functions/test_core.py2
-rw-r--r--scss/tests/functions/test_extra.py7
-rw-r--r--scss/tests/test_expression.py2
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