diff --git a/hyde/ext/plugins/css.py b/hyde/ext/plugins/css.py index e53ead1..00a744e 100644 --- a/hyde/ext/plugins/css.py +++ b/hyde/ext/plugins/css.py @@ -113,3 +113,111 @@ class LessCSSPlugin(CLTransformer): "Cannot process %s. Error occurred when " "processing [%s]" % (self.app.name, resource.source_file)) return target.read_all() + + +class StylusPlugin(CLTransformer): + """ + The plugin class for stylus css + """ + + def __init__(self, site): + super(StylusPlugin, self).__init__(site) + + def begin_site(self): + """ + Find all the styl files and set their relative deploy path. + """ + for resource in self.site.content.walk_resources(): + if resource.source_file.kind == 'styl': + new_name = resource.source_file.name_without_extension + ".css" + target_folder = File(resource.relative_deploy_path).parent + resource.relative_deploy_path = target_folder.child(new_name) + + def begin_text_resource(self, resource, text): + """ + Replace @import statements with {% include %} statements. + """ + + if not resource.source_file.kind == 'styl': + return + import_finder = re.compile( + '^\\s*@import\s+(?:\'|\")([^\'\"]*)(?:\'|\")\s*\;?\s*$', + re.MULTILINE) + + def import_to_include(match): + """ + Converts a css import statement to include statemnt. + """ + if not match.lastindex: + return '' + path = match.groups(1)[0] + afile = File(File(resource.source_file.parent.child(path)).fully_expanded_path) + if len(afile.kind.strip()) == 0: + afile = File(afile.path + '.styl') + + ref = self.site.content.resource_from_path(afile.path) + + if not ref: + try: + include = self.settings.args.include + except AttributeError: + include = False + if not include: + raise self.template.exception_class( + "Cannot import from path [%s]" % afile.path) + else: + ref.is_processable = False + return "\n" + \ + self.template.get_include_statement(ref.relative_path) + \ + "\n" + return '@import "' + path + '"\n' + + text = import_finder.sub(import_to_include, text) + return text + + @property + def defaults(self): + """ + Returns `compress` if not in development mode. + """ + try: + mode = self.site.config.mode + except AttributeError: + mode = "production" + + defaults = {"compress":""} + if mode.startswith('dev'): + defaults = {} + return defaults + + @property + def plugin_name(self): + """ + The name of the plugin. + """ + return "stylus" + + def text_resource_complete(self, resource, text): + """ + Save the file to a temporary place and run stylus compiler. + Read the generated file and return the text as output. + Set the target path to have a css extension. + """ + if not resource.source_file.kind == 'styl': + return + stylus = self.app + source = File.make_temp(text.strip()) + target = source + supported = [("compress", "c"), ("include", "I")] + + args = [unicode(stylus)] + args.extend(self.process_args(supported)) + args.append(unicode(source)) + try: + self.call_app(args) + except subprocess.CalledProcessError, e: + raise self.template.exception_class( + "Cannot process %s. Error occurred when " + "processing [%s]" % (stylus.name, resource.source_file)) + return target.read_all() + diff --git a/hyde/ext/plugins/stylus.py b/hyde/ext/plugins/stylus.py deleted file mode 100644 index b35ad2a..0000000 --- a/hyde/ext/plugins/stylus.py +++ /dev/null @@ -1,117 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Less css plugin -""" - -from hyde.plugin import CLTransformer - -import re -import subprocess - -from fswrap import File - -class StylusPlugin(CLTransformer): - """ - The plugin class for less css - """ - - def __init__(self, site): - super(StylusPlugin, self).__init__(site) - - def begin_site(self): - """ - Find all the styl files and set their relative deploy path. - """ - for resource in self.site.content.walk_resources(): - if resource.source_file.kind == 'styl': - new_name = resource.source_file.name_without_extension + ".css" - target_folder = File(resource.relative_deploy_path).parent - resource.relative_deploy_path = target_folder.child(new_name) - - def begin_text_resource(self, resource, text): - """ - Replace @import statements with {% include %} statements. - """ - - if not resource.source_file.kind == 'styl': - return - import_finder = re.compile( - '^\\s*@import\s+(?:\'|\")([^\'\"]*)(?:\'|\")\s*\;?\s*$', - re.MULTILINE) - - def import_to_include(match): - """ - Converts a css import statement to include statemnt. - """ - if not match.lastindex: - return '' - path = match.groups(1)[0] - afile = File(File(resource.source_file.parent.child(path)).fully_expanded_path) - if len(afile.kind.strip()) == 0: - afile = File(afile.path + '.styl') - - ref = self.site.content.resource_from_path(afile.path) - - if not ref: - try: - include = self.settings.args.include - except AttributeError: - include = False - if not include: - raise self.template.exception_class( - "Cannot import from path [%s]" % afile.path) - else: - ref.is_processable = False - return "\n" + \ - self.template.get_include_statement(ref.relative_path) + \ - "\n" - return '@import "' + path + '"\n' - - text = import_finder.sub(import_to_include, text) - return text - - @property - def defaults(self): - """ - Returns `compress` if not in development mode. - """ - try: - mode = self.site.config.mode - except AttributeError: - mode = "production" - - defaults = {"compress":""} - if mode.startswith('dev'): - defaults = {} - return defaults - - @property - def plugin_name(self): - """ - The name of the plugin. - """ - return "stylus" - - def text_resource_complete(self, resource, text): - """ - Save the file to a temporary place and run stylus compiler. - Read the generated file and return the text as output. - Set the target path to have a css extension. - """ - if not resource.source_file.kind == 'styl': - return - stylus = self.app - source = File.make_temp(text.strip()) - target = source - supported = [("compress", "c"), ("include", "I")] - - args = [unicode(stylus)] - args.extend(self.process_args(supported)) - args.append(unicode(source)) - try: - self.call_app(args) - except subprocess.CalledProcessError, e: - raise self.template.exception_class( - "Cannot process %s. Error occurred when " - "processing [%s]" % (stylus.name, resource.source_file)) - return target.read_all() diff --git a/hyde/tests/ext/test_stylus.py b/hyde/tests/ext/test_stylus.py index d9ddaad..ab40aa6 100644 --- a/hyde/tests/ext/test_stylus.py +++ b/hyde/tests/ext/test_stylus.py @@ -28,7 +28,7 @@ class TestStylus(object): def test_can_execute_stylus(self): s = Site(TEST_SITE) - s.config.plugins = ['hyde.ext.plugins.stylus.StylusPlugin'] + s.config.plugins = ['hyde.ext.plugins.css.StylusPlugin'] paths = ['/usr/local/share/npm/bin/stylus'] for path in paths: if File(path).exists: @@ -46,7 +46,7 @@ class TestStylus(object): def test_can_compress_with_stylus(self): s = Site(TEST_SITE) s.config.mode = "production" - s.config.plugins = ['hyde.ext.plugins.stylus.StylusPlugin'] + s.config.plugins = ['hyde.ext.plugins.css.StylusPlugin'] paths = ['/usr/local/share/npm/bin/stylus'] for path in paths: if File(path).exists: