@@ -113,3 +113,111 @@ class LessCSSPlugin(CLTransformer): | |||||
"Cannot process %s. Error occurred when " | "Cannot process %s. Error occurred when " | ||||
"processing [%s]" % (self.app.name, resource.source_file)) | "processing [%s]" % (self.app.name, resource.source_file)) | ||||
return target.read_all() | 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() | |||||
@@ -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() |
@@ -28,7 +28,7 @@ class TestStylus(object): | |||||
def test_can_execute_stylus(self): | def test_can_execute_stylus(self): | ||||
s = Site(TEST_SITE) | 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'] | paths = ['/usr/local/share/npm/bin/stylus'] | ||||
for path in paths: | for path in paths: | ||||
if File(path).exists: | if File(path).exists: | ||||
@@ -46,7 +46,7 @@ class TestStylus(object): | |||||
def test_can_compress_with_stylus(self): | def test_can_compress_with_stylus(self): | ||||
s = Site(TEST_SITE) | s = Site(TEST_SITE) | ||||
s.config.mode = "production" | 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'] | paths = ['/usr/local/share/npm/bin/stylus'] | ||||
for path in paths: | for path in paths: | ||||
if File(path).exists: | if File(path).exists: | ||||