From 50f2cd295f8da11218ecbdd4af7abdafdff2725e Mon Sep 17 00:00:00 2001 From: Meir Kriheli Date: Sun, 15 Apr 2012 02:20:20 +0300 Subject: [PATCH] Implement LessCSSGenerator --- pelican/__init__.py | 4 +++- pelican/generators.py | 36 ++++++++++++++++++++++++++++++++++++ pelican/settings.py | 2 ++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/pelican/__init__.py b/pelican/__init__.py index c2766646..bb9819cd 100644 --- a/pelican/__init__.py +++ b/pelican/__init__.py @@ -6,7 +6,7 @@ import logging import argparse from pelican.generators import (ArticlesGenerator, PagesGenerator, - StaticGenerator, PdfGenerator) + StaticGenerator, PdfGenerator, LessCSSGenerator) from pelican.log import init from pelican.settings import read_settings, _DEFAULT_CONFIG from pelican.utils import clean_output_dir, files_changed @@ -133,6 +133,8 @@ class Pelican(object): generators = [ArticlesGenerator, PagesGenerator, StaticGenerator] if self.settings['PDF_GENERATOR']: generators.append(PdfGenerator) + if self.settings['LESS_GENERATOR']: + generators.append(LessCSSGenerator) return generators def get_writer(self): diff --git a/pelican/generators.py b/pelican/generators.py index d7ebb0b0..5b90ad96 100644 --- a/pelican/generators.py +++ b/pelican/generators.py @@ -4,6 +4,7 @@ import math import random import logging import datetime +import subprocess from collections import defaultdict from functools import partial @@ -414,3 +415,38 @@ class PdfGenerator(Generator): for page in self.context['pages']: self._create_pdf(page, pdf_path) + + +class LessCSSGenerator(Generator): + """Compile less css files. This assumes we have `lessc` in our PATH.""" + + def generate_context(self): + pass + + def _compile(self, less_file, source_dir, dest_dir): + base = os.path.relpath(less_file, source_dir) + target = os.path.splitext( + os.path.join(self.output_path, base))[0] + '.css' + target_dir = os.path.dirname(target) + + if not os.path.exists(target_dir): + try: + os.makedirs(target_dir) + except OSError: + logger.error("Couldn't create the pdf output folder in " + + target_dir) + pass + + cmd = ' '.join([self.settings['LESS_COMPILER'], less_file, target]) + subprocess.call(cmd, shell=True) + logger.info(u' [ok] compiled %s' % base) + + def generate_output(self, writer=None): + logger.info(u' Compiling less css') + + for static_path in self.settings['STATIC_PATHS']: + for f in self.get_files( + os.path.join(self.path, static_path), + extensions=['less']): + + self._compile(f, self.path, self.output_path) diff --git a/pelican/settings.py b/pelican/settings.py index c0e30815..418634a0 100644 --- a/pelican/settings.py +++ b/pelican/settings.py @@ -67,6 +67,8 @@ _DEFAULT_CONFIG = {'PATH': '.', 'DEFAULT_STATUS': 'published', 'ARTICLE_PERMALINK_STRUCTURE': '', 'TYPOGRIFY': False, + 'LESS_GENERATOR': False, + 'LESS_COMPILER': '/usr/bin/lessc', }