diet-yadda
Version:
A true BDD framework for JavaScript - slimmed down
58 lines (48 loc) • 2.01 kB
JavaScript
/*
* Copyright 2010 Acuminous Ltd / Energized Work Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* jslint node: true */
;
var Library = require('../Library');
var $ = require('../Array');
module.exports = function(name, vocabulary) {
var _this = this;
// See http://github.com/acuminous/yadda#203
this.is_language = true;
this.library = function(dictionary) {
return _this.localise_library(new Library(dictionary));
};
this.localise_library = function(library) {
$(vocabulary._steps).each(function(keyword) {
library[keyword] = function(signatures, fn, ctx) {
return $(signatures).each(function(signature) {
signature = prefix_signature(_this.localise(keyword), signature);
return library.define(signature, fn, ctx);
});
};
});
return library;
};
var prefix_signature = function(prefix, signature) {
var regex_delimiters = new RegExp('^/|/$', 'g');
var start_of_signature = new RegExp(/^(?:\^)?/);
var one_or_more_spaces = '\\s+';
return signature.toString().replace(regex_delimiters, '').replace(start_of_signature, prefix + one_or_more_spaces);
};
this.localise = function(keyword) {
if (vocabulary[keyword] === undefined) throw new Error('Keyword "' + keyword + '" has not been translated into ' + name + '.');
return vocabulary[keyword];
};
};