28 lines
		
	
	
		
			708 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			28 lines
		
	
	
		
			708 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| 
 | |
| var isCallable = require("../object/is-callable")
 | |
|   , value      = require("../object/valid-value")
 | |
|   , call       = Function.prototype.call;
 | |
| 
 | |
| module.exports = function (fmap) {
 | |
| 	fmap = Object(value(fmap));
 | |
| 	return function (pattern) {
 | |
| 		var context = this;
 | |
| 		value(context);
 | |
| 		pattern = String(pattern);
 | |
| 		return pattern.replace(/%([a-zA-Z]+)|\\([\u0000-\uffff])/g, function (
 | |
| 			match,
 | |
| 			token,
 | |
| 			escapeChar
 | |
| 		) {
 | |
| 			var t, result;
 | |
| 			if (escapeChar) return escapeChar;
 | |
| 			t = token;
 | |
| 			while (t && !(result = fmap[t])) t = t.slice(0, -1);
 | |
| 			if (!result) return match;
 | |
| 			if (isCallable(result)) result = call.call(result, context);
 | |
| 			return result + token.slice(t.length);
 | |
| 		});
 | |
| 	};
 | |
| };
 |