Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

添加sass语法支持 #8

Merged
merged 4 commits into from
Apr 14, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
111 changes: 111 additions & 0 deletions compile.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
/**
* 接管sass的@import内嵌,让fis-sass支持sass语法内嵌。
*
* 目前fis-sass无法改动libsass(第三方库)内部的代码以至于无法支持sass格式的文件`@import`内嵌。
*
* 所以这里接管内嵌,绕过fis-sass处理`@import`内嵌过程。
*
* 目前fis-sass的是sass语法支持,主要是用了[sass2scss](https://github.com/mgreter/sass2scss)库,
* 目前只有程序的最外成入口处调用了这个功能,libsass的内联file读取没有经过这一过程,所以这个功能是不完美支持sass语法的。
*/
var map = (function() {
return {
reg: /\/\*embed:(.*?)\*\//ig,

wrap: function( value ) {
return '/*embed:' + value + '*/';
}
}
})();

// 匹配sass内嵌代码:@import 'xxx'
function _process( content ) {
var reg = /@import\s*('|")?(.+?)\1(?:;)?$/img;
var rUrl = /^url/i;

return content.replace( reg, function( all, quote, value ) {

// 不处理@import url(xxx);
if ( value && rUrl.exec( value ) ) {
return all;
}

return map.wrap( value );
});
}

// 查找文件。
function lookup( name, ext, paths ) {
var files = [],
filename = name,
basename = filename,
dirname = '',
mapping,
i, j, len, len2, path, info;

files.push( filename );

if ( /^(.*(?:\/|\\))([^\/\\]*?)$/.exec( filename ) ) {
dirname = RegExp.$1;
basename = RegExp.$2;
}

// 自动加后缀。
if ( !/\.\w+$/.exec( basename ) ) {
filename = dirname + basename + ext;
files.push( filename );

if ( !/^_/.exec( basename ) ) {
filename = dirname + '_' + basename + ext;
files.push( filename );
}

mapping = {
'.sass': '.scss',
'.scss': '.sass'
};

if ( mapping[ ext ] ) {
filename = dirname + basename + mapping[ ext ];
files.push( filename );

if ( !/^_/.exec( basename ) ) {
filename = dirname + '_' + basename + mapping[ ext ];
files.push( filename );
}
}
}

len = files.length;
len2 = paths.length;

for ( i = 0; i < len; i++ ) {
name = files[ i ];

for ( j = 0; j < len2; j++ ) {
info = fis.uri( name, paths[ j ] );

if( info.file && info.file.isFile() ) {
return info.file;
}
}
}
}

var compile = exports.before = function( content, ext, paths ) {
return _process( content ).replace( map.reg, function( all, value ) {
var file = lookup( value, ext, paths );

if ( file ) {
// @todo 祈祷,不要循环内嵌吧。
return compile( file.getContent(), file.ext, [ file.dirname ].concat( paths ) );
} else {
fis.log.error( value + ' not found!' );
return '';
}
});
};

exports.after = function( content, ext, paths ) {
return content;
};
14 changes: 10 additions & 4 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,17 @@

var sass = require('fis-sass');
var root = fis.project.getProjectPath();
var compile = require('./compile.js');

module.exports = function(content, file, conf){
var opts = fis.util.clone(conf);
opts.data = content;
opts.include_paths = conf.include_paths || [];
opts.include_paths = opts.include_paths.concat([ file.dirname, root ]);
return sass.renderSync(opts);

opts.include_paths = conf.include_paths || [ root ];
opts.include_paths.unshift( file.dirname );

opts.data = compile.before( content, file.ext, opts.include_paths );
content = sass.renderSync( opts );
content = compile.after( content, file.ext, opts.include_paths );

return content;
};
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name" : "fis-parser-sass",
"description" : "A parser plugin for fis to compile sass file.",
"version" : "0.0.9",
"version" : "0.0.10",
"author" : "FIS Team <[email protected]>",
"homepage" : "http://fis.baidu.com/",
"keywords": [ "fis", "sass" ],
Expand All @@ -17,6 +17,6 @@
"test" : "mocha test/ut --recursive"
},
"dependencies" : {
"fis-sass" : "0.1.11"
"fis-sass" : "0.1.12"
}
}