cowsay
Version:
cowsay is a configurable talking cow
48 lines (43 loc) • 1.14 kB
JavaScript
module.exports = function (cow, variables) {
var eyes = escapeRe(variables.eyes);
var eyeL = eyes.charAt(0);
var eyeR = eyes.charAt(1);
var tongue = escapeRe(variables.tongue);
if (cow.indexOf("$the_cow") !== -1) {
cow = extractTheCow(cow);
}
return cow
.replace(/\$thoughts/g, variables.thoughts)
.replace(/\$eyes/g, eyes)
.replace(/\$tongue/g, tongue)
.replace(/\$\{eyes\}/g, eyes)
.replace(/\$eye/, eyeL)
.replace(/\$eye/, eyeR)
.replace(/\$\{tongue\}/g, tongue)
;
};
/*
* "$" dollar signs must be doubled before being used in a regex replace
* This can occur in eyes or tongue.
* For example:
*
* cowsay -g Moo!
*
* cowsay -e "\$\$" Moo!
*/
function escapeRe (s) {
if (s && s.replace) {
return s.replace(/\$/g, "$$$$");
}
return s;
}
function extractTheCow (cow) {
cow = cow.replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/^\uFEFF/, '');
var match = /\$the_cow\s*=\s*<<"*EOC"*;*\n([\s\S]+)\nEOC\n/.exec(cow);
if (!match) {
console.error("Cannot parse cow file\n", cow);
return cow;
} else {
return match[1].replace(/\\{2}/g, "\\").replace(/\\@/g, "@").replace(/\\\$/g, "$");
}
}