grunt-text-replace.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. var grunt = require('grunt');
  2. var path = require('path');
  3. var gruntTextReplace = {};
  4. exports.replace = function (settings) {
  5. gruntTextReplace.replace(settings);
  6. }
  7. exports.replaceText = function (settings) {
  8. var text = settings.text;
  9. var replacements = settings.replacements;
  10. return gruntTextReplace.replaceTextMultiple(text, replacements);
  11. }
  12. exports.replaceFile = function (settings) {
  13. return gruntTextReplace.replaceFile(settings)
  14. }
  15. exports.replaceFileMultiple = function (settings) {
  16. return gruntTextReplace.replaceFileMultiple(settings)
  17. }
  18. gruntTextReplace = {
  19. replaceFileMultiple: function (settings) {
  20. var sourceFiles = grunt.file.expand(settings.src);
  21. sourceFiles.forEach(function (pathToSource) {
  22. gruntTextReplace.replaceFile({
  23. src: pathToSource,
  24. dest: settings.dest,
  25. replacements: settings.replacements
  26. });
  27. });
  28. },
  29. replaceFile: function (settings) {
  30. var pathToSourceFile = settings.src;
  31. var pathToDestinationFile = this.getPathToDestination(pathToSourceFile, settings.dest);
  32. var replacements = settings.replacements;
  33. grunt.file.copy(pathToSourceFile, pathToDestinationFile, {
  34. process: function (text) {
  35. return gruntTextReplace.replaceTextMultiple(text, replacements);
  36. }
  37. });
  38. },
  39. replaceTextMultiple: function (text, replacements) {
  40. return replacements.reduce(function (newText, replacement) {
  41. return gruntTextReplace.replaceText({
  42. text: newText,
  43. from: replacement.from,
  44. to: replacement.to
  45. });
  46. }, text);
  47. },
  48. replaceText: function (settings) {
  49. var text = settings.text;
  50. var from = this.convertPatternToRegex(settings.from);
  51. var to = this.expandReplacement(settings.to);
  52. return text.replace(from, to);
  53. },
  54. replace: function (settings) {
  55. var src = grunt.file.expand(settings.src || []);
  56. var dest = settings.dest;
  57. var overwrite = settings.overwrite;
  58. var replacements = settings.replacements;
  59. var isDestinationDirectory = (/\/$/).test(dest);
  60. var initialWarnCount = grunt.fail.warncount;
  61. if (typeof dest === 'undefined' &&
  62. typeof src === 'undefined' &&
  63. typeof replacements === 'undefined') {
  64. grunt.warn(gruntTextReplace.errorMessages.noTargetsDefined);
  65. } else if (typeof dest === 'undefined' && overwrite !== true) {
  66. grunt.warn(gruntTextReplace.errorMessages.noDestination);
  67. } else if (typeof replacements === 'undefined') {
  68. grunt.warn(gruntTextReplace.errorMessages.noReplacements);
  69. } else if (typeof dest !== 'undefined' && overwrite === true) {
  70. grunt.warn(gruntTextReplace.errorMessages.overwriteFailure);
  71. } else if ((isDestinationDirectory === false && src.length > 1) && overwrite !== true) {
  72. grunt.warn(gruntTextReplace.errorMessages.multipleSourceSingleDestination);
  73. } else if (grunt.fail.warncount - initialWarnCount === 0) {
  74. gruntTextReplace.replaceFileMultiple({
  75. src: src,
  76. dest: dest,
  77. replacements: replacements
  78. });
  79. }
  80. },
  81. errorMessages: {
  82. noTargetsDefined: "No targets were found. Remember to wrap functionality " +
  83. "within a target.",
  84. noDestination: "Destination is not defined! If you want to overwrite " +
  85. "files, then make sure to set overwrite: true. If you don't wish to " +
  86. "overwrite, then make sure to set a destination",
  87. noReplacements: "No replacements were found.",
  88. overwriteFailure: "Overwrite is to true, but a destination has also " +
  89. "been defined. If you want to overwrite files, remove the destination. " +
  90. "If you want to send files to a destination, then ensure overwrite is " +
  91. "not set to true",
  92. multipleSourceSingleDestination: "Cannot write multiple files to same " +
  93. "file. If you wish to export to a directory, make sure there is a " +
  94. "trailing slash on the destination. If you wish to write to a single " +
  95. "file, make sure there is only one source file"
  96. },
  97. getPathToDestination: function (pathToSource, pathToDestinationFile) {
  98. var isDestinationDirectory = (/\/$/).test(pathToDestinationFile);
  99. var fileName = path.basename(pathToSource);
  100. var newPathToDestination;
  101. if (typeof pathToDestinationFile === 'undefined') {
  102. newPathToDestination = pathToSource;
  103. } else {
  104. newPathToDestination = pathToDestinationFile + (isDestinationDirectory ? fileName : '');
  105. }
  106. return newPathToDestination;
  107. },
  108. convertPatternToRegex: function (pattern) {
  109. var regexCharacters = '\\[](){}^$-.*+?|,/';
  110. if (typeof pattern === 'string') {
  111. regexCharacters.split('').forEach(function (character) {
  112. var characterAsRegex = new RegExp('(\\' + character + ')', 'g');
  113. pattern = pattern.replace(characterAsRegex, '\\$1');
  114. });
  115. pattern = new RegExp(pattern, 'g');
  116. }
  117. return pattern;
  118. },
  119. expandReplacement: function (replacement) {
  120. if (typeof replacement === 'function') {
  121. return this.expandFunctionReplacement(replacement);
  122. } else if (typeof replacement === 'string') {
  123. return this.expandStringReplacement(replacement);
  124. } else {
  125. return gruntTextReplace.expandNonStringReplacement(replacement);
  126. }
  127. },
  128. expandFunctionReplacement: function (replacement) {
  129. return function () {
  130. var matchedSubstring = arguments[0];
  131. var index = arguments[arguments.length - 2];
  132. var fullText = arguments[arguments.length - 1];
  133. var regexMatches = Array.prototype.slice.call(arguments, 1,
  134. arguments.length - 2);
  135. var returnValue = replacement(matchedSubstring, index, fullText,
  136. regexMatches);
  137. return (typeof returnValue === 'string') ?
  138. gruntTextReplace.processGruntTemplate(returnValue) :
  139. gruntTextReplace.expandNonStringReplacement(returnValue);
  140. };
  141. },
  142. expandStringReplacement: function (replacement) {
  143. return gruntTextReplace.processGruntTemplate(replacement);
  144. },
  145. expandNonStringReplacement: function (replacement) {
  146. var isReplacementNullOrUndefined = (typeof replacement === 'undefined') || (replacement === null);
  147. return isReplacementNullOrUndefined ? '' : String(replacement);
  148. },
  149. processGruntTemplate: function (string) {
  150. var isProcessTemplateTrue = true;
  151. if (grunt.task.current.data &&
  152. grunt.task.current.data.options &&
  153. typeof grunt.task.current.data.options.processTemplates !== 'undefined' &&
  154. grunt.task.current.data.options.processTemplates === false) {
  155. isProcessTemplateTrue = false;
  156. }
  157. return isProcessTemplateTrue ? grunt.template.process(string) : string;
  158. }
  159. }