hexo-renderer-rider
Version:
Rider renderer plugin for Hexo.
114 lines (89 loc) • 2.53 kB
JavaScript
/**
* @file Rider renderer plugin for Hexo
* @author Firede <firede@firede.us>
*/
var stylus = require('stylus');
var rider = require('rider');
var postcss = require('postcss');
var mqpacker = require('css-mqpacker');
var ap = require('autoprefixer');
/**
* 后处理器
*
* @param {Object} options 选项
* @param {Array|boolean=} options.autoprefixer Autoprefixer支持
* @param {boolean=} options.mqpacker mqpacker启用状态
* @param {Function} callback callback
* @return {Function} autoprefixer function
*/
function postprocessor(options, callback) {
var defaultBrowsers = ['> 5%', 'Android >= 4', 'iOS >= 7'];
return function (err, css) {
if (err) {
callback(err);
}
var processors = [];
if (options.autoprefixer !== false) {
processors.push(
ap({browsers: options.autoprefixer || defaultBrowsers})
);
}
if (options.mqpacker !== false) {
processors.push(mqpacker);
}
if (processors.length > 0) {
return postcss(processors).process(css).css;
}
return css;
};
}
/**
* 获取属性
*
* @see hexo-renderer-stylus/lib/renderer.js
*/
function getProperty(obj, name) {
name = name.replace(/\[(\w+)\]/g, '.$1').replace(/^\./, '');
var split = name.split('.');
var key = split.shift();
if (!obj.hasOwnProperty(key)) {
return '';
}
var result = obj[key];
var len = split.length;
if (!len) {
return result || '';
}
if (typeof result !== 'object') {
return '';
}
for (var i = 0; i < len; i++) {
key = split[i];
if (!result.hasOwnProperty(key)) {
return '';
}
result = result[split[i]];
if (typeof result !== 'object') {
return result;
}
}
return result;
}
module.exports = function (data, options, callback) {
var self = this;
var config = this.config.rider || {};
function defineConfig(style) {
style.define('hexo-config', function (data) {
return getProperty(self.theme.config, data.val);
});
}
var style = stylus(data.text);
style.use(rider())
.use(defineConfig)
.set('filename', data.path)
.set('sourcemap', config.sourcemaps)
.set('compress', config.compress)
.set('include css', true);
style.on('end', postprocessor(config, callback));
style.render(callback);
};