metalsmith-jstransformer
Advanced tools
Comparing version 0.4.0 to 0.5.0
# Changelog | ||
## v0.5.0: 2015-07-11 | ||
- Added async support | ||
## v0.4.0: 2015-07-08 | ||
@@ -4,0 +8,0 @@ |
135
index.js
var jstransformer = require('jstransformer') | ||
var toTransformer = require('inputformat-to-jstransformer') | ||
var transformers = {} | ||
var path = require('path') | ||
var extend = require('extend') | ||
var async = require('async') | ||
var clone = require('clone') | ||
var transformers = {} | ||
@@ -13,11 +15,8 @@ /** | ||
function getTransformer (name) { | ||
if (transformers[name]) { | ||
if (name in transformers) { | ||
return transformers[name] | ||
} | ||
var transformer = toTransformer(name) | ||
if (transformer) { | ||
transformer = jstransformer(transformer) | ||
} | ||
transformers[name] = transformer | ||
return transformer | ||
transformers[name] = transformer ? jstransformer(transformer) : false | ||
return transformers[name] | ||
} | ||
@@ -27,53 +26,91 @@ | ||
return function (files, metalsmith, done) { | ||
// Loop through every file. | ||
for (var file in files) { | ||
// Do not process partials. | ||
if (path.basename(file).charAt(0) !== '_') { | ||
// Get all the transforming extensions. | ||
var extensions = file.split('.') | ||
// Prepare what the default output format should be. | ||
var outputFormat = '' | ||
// Loop through all the extensions in reverse order. | ||
for (var i = extensions.length - 1; i > 0; i--) { | ||
// Retrieve the transformer. | ||
var transformer = getTransformer(extensions[i]) | ||
if (transformer) { | ||
// Process the content of the file with the transformer. | ||
var input = files[file].contents.toString() | ||
/** | ||
* Return whether or not we are to process the given file. | ||
*/ | ||
function filterFile (file, done) { | ||
done(path.basename(file).charAt(0) !== '_') | ||
} | ||
// Construct the options. | ||
// TODO: Figure out what other options to inject. | ||
var options = extend({}, metalsmith.metadata(), files[file], { | ||
filename: metalsmith.source() + '/' + file | ||
}) | ||
/** | ||
* Process the given file. Call done() when done processing. | ||
*/ | ||
function processFile (file, done) { | ||
/** | ||
* Process the given extension on the file. | ||
*/ | ||
function processExtension (extension, done) { | ||
// Retrieve the transformer. | ||
var transformer = getTransformer(extension) | ||
var output = transformer.render(input, options, options) | ||
files[file].contents = new Buffer(output.body) | ||
// Process the extension until the transformation is done. | ||
if (transformer && !files[file].jstransformer_done) { | ||
// Construct the options. | ||
var options = extend({}, metalsmith.metadata(), files[file], { | ||
filename: metalsmith.source() + '/' + file | ||
}) | ||
// Rename the file, removing the extension. | ||
var data = files[file] | ||
delete files[file] | ||
var filepath = extensions | ||
filepath.pop() | ||
file = filepath.join('.') | ||
files[file] = data | ||
// Get the transformer to render the contents. | ||
transformer.renderAsync(files[file].contents.toString(), options, options).then(function (result) { | ||
// Allow providing the default output format. | ||
files[file].jstransformer_outputFormat = transformer.outputFormat | ||
// Remove an extension from the end. | ||
files[file].jstransformer_filepath.pop() | ||
files[file].contents = result.body | ||
done() | ||
}, function (err) { | ||
files[file].jstransformer_done = true | ||
done(err) | ||
}) | ||
} else { | ||
// The transformer isn't supported, skip the rest. | ||
files[file].jstransformer_done = true | ||
done() | ||
} | ||
} | ||
// Retrieve the new output format for the given transformer. | ||
outputFormat = transformer.outputFormat | ||
} else { | ||
// Skip the rest of the file transformations. | ||
break | ||
} | ||
// Prepare the extension processing. | ||
var extensions = file.split('.') | ||
files[file].jstransformer_filepath = clone(extensions) | ||
extensions.reverse().pop() | ||
// Loop through the transformer series. | ||
async.mapSeries(extensions, processExtension, done) | ||
} | ||
/** | ||
* Rename the given file to its desired new name. | ||
*/ | ||
function renameFile (file, done) { | ||
var filename = file | ||
// Check if there is a potential filepath change. | ||
if (files[file].jstransformer_filepath) { | ||
// See if we should add the default output format. | ||
if (files[file].jstransformer_filepath.length === 1) { | ||
files[file].jstransformer_filepath.push(files[file].jstransformer_outputFormat) | ||
} | ||
// Rename the file to the output format, if no extension was provided. | ||
if (path.extname(file) === '' && outputFormat !== '') { | ||
var newFile = files[file] | ||
delete files[file] | ||
files[file + '.' + outputFormat] = newFile | ||
} | ||
filename = files[file].jstransformer_filepath.join('.') | ||
} | ||
// See if we are to now rename the file. | ||
if (filename !== file) { | ||
var newFile = clone(files[file]) | ||
delete files[file] | ||
files[filename] = newFile | ||
} | ||
done() | ||
} | ||
done() | ||
// Filter out each file that we don't need to act on. | ||
async.filter(Object.keys(files), filterFile, function (results) { | ||
// Process each individual file. | ||
async.map(results, processFile, function (err) { | ||
if (err) { | ||
done(err) | ||
} else { | ||
// Now rename all the files. | ||
async.map(results, renameFile, done) | ||
} | ||
}) | ||
}) | ||
} | ||
} |
{ | ||
"name": "metalsmith-jstransformer", | ||
"version": "0.4.0", | ||
"version": "0.5.0", | ||
"description": "Metalsmith JSTransformer Plugin", | ||
@@ -10,3 +10,3 @@ "main": "index.js", | ||
"scripts": { | ||
"test": "standard index.js test/index.js; mocha" | ||
"test": "standard index.js test/index.js; mocha --no-timeouts" | ||
}, | ||
@@ -27,4 +27,6 @@ "repository": { | ||
"dependencies": { | ||
"async": "^1.3.0", | ||
"clone": "^1.0.2", | ||
"extend": "^3.0.0", | ||
"inputformat-to-jstransformer": "^1.1.0", | ||
"inputformat-to-jstransformer": "^1.1.2", | ||
"jstransformer": "^0.0.2" | ||
@@ -34,7 +36,7 @@ }, | ||
"assert-dir-equal": "1.*", | ||
"jstransformer-coffee-script": "0.*", | ||
"jstransformer-jade": "0.*", | ||
"jstransformer-marked": "0.0.2", | ||
"jstransformer-styl": "0.*", | ||
"jstransformer-uglify-js": "0.*", | ||
"jstransformer-coffee-script": "*", | ||
"jstransformer-jade": "*", | ||
"jstransformer-styl": "*", | ||
"jstransformer-uglify-js": "*", | ||
"jstransformer-markdown-it": "*", | ||
"metalsmith": "1.*", | ||
@@ -41,0 +43,0 @@ "mocha": "*", |
8114
104
5
+ Addedasync@^1.3.0
+ Addedclone@^1.0.2
+ Addedasync@1.5.2(transitive)
+ Addedclone@1.0.4(transitive)