Program.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text;
  5. using System.Text.RegularExpressions;
  6. namespace JSKompactor
  7. {
  8. class Program
  9. {
  10. static string Extends = "var __extends = this.__extends || function (d, b) {\r\n" +
  11. " for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\r\n" +
  12. " function __() { this.constructor = d; }\r\n" +
  13. " __.prototype = b.prototype;\r\n" +
  14. " d.prototype = new __();\r\n" +
  15. "};";
  16. static void Main(string[] args)
  17. {
  18. if (args.Length != 4)
  19. {
  20. DisplayUsage();
  21. return;
  22. }
  23. // Parsing arguments
  24. string output = "";
  25. string inputFilenames = "";
  26. string workingFolder = "";
  27. string shadersFolder = "";
  28. foreach (var arg in args)
  29. {
  30. var order = arg.Substring(0, 3);
  31. switch (order)
  32. {
  33. case "/i:":
  34. inputFilenames = arg.Substring(3);
  35. break;
  36. case "/o:":
  37. output = arg.Substring(3);
  38. break;
  39. case "/w:":
  40. workingFolder = arg.Substring(3);
  41. break;
  42. case "/s:":
  43. shadersFolder = arg.Substring(3);
  44. break;
  45. default:
  46. DisplayUsage();
  47. return;
  48. }
  49. }
  50. if (string.IsNullOrEmpty(workingFolder) || string.IsNullOrEmpty(output) || string.IsNullOrEmpty(inputFilenames))
  51. {
  52. DisplayUsage();
  53. return;
  54. }
  55. // Merges files
  56. var inputs = inputFilenames.Split(',');
  57. var builder = new StringBuilder();
  58. foreach (var input in inputs)
  59. {
  60. try
  61. {
  62. builder.Append(File.ReadAllText(Path.Combine(workingFolder, input)));
  63. Console.ForegroundColor = ConsoleColor.Green;
  64. Console.WriteLine("Merging " + input);
  65. Console.ResetColor();
  66. }
  67. catch (Exception ex)
  68. {
  69. Console.ForegroundColor = ConsoleColor.Red;
  70. Console.WriteLine("Unable to load " + input);
  71. Console.WriteLine(ex.Message);
  72. Console.ResetColor();
  73. }
  74. }
  75. var result = builder.ToString();
  76. // Remove all extends
  77. result = result.Replace(Extends, "");
  78. // Add only one __extends
  79. result = Extends + result;
  80. // Compress
  81. result = RemoveUseStrict(result);
  82. //result = RemoveComments(result);
  83. //result = RemoveNewLines(result);
  84. //result = RemoveWhiteSpaces(result);
  85. // Integrate shaders
  86. if (!string.IsNullOrEmpty(shadersFolder))
  87. {
  88. var shaders = Directory.GetFiles(Path.Combine(workingFolder, shadersFolder), "*.fx");
  89. var shadersString = "";
  90. foreach (var shader in shaders)
  91. {
  92. shadersString += Path.GetFileName(shader).Replace(".fragment.fx", "PixelShader").Replace(".vertex.fx", "VertexShader") + ":";
  93. var lines = File.ReadAllLines(shader);
  94. var selectedLines = new List<string>();
  95. for (var index = 0; index < lines.Length; index++)
  96. {
  97. var val = lines[index].Trim();
  98. if (!val.StartsWith("//"))
  99. {
  100. selectedLines.Add(val);
  101. }
  102. }
  103. shadersString += "\"" + string.Join("\\n", selectedLines.ToArray()) + "\",\n";
  104. }
  105. result = result.Replace("Effect.ShadersStore = {};", "Effect.ShadersStore={" + shadersString + "};");
  106. }
  107. // Output file
  108. File.WriteAllText(output, result);
  109. }
  110. static string RemoveUseStrict(string source)
  111. {
  112. return source.Replace("\"use strict\";", "");
  113. }
  114. static string RemoveComments(string source)
  115. {
  116. var regExp = new Regex(@"\s*?//.+?$", RegexOptions.Multiline);
  117. return regExp.Replace(source, "");
  118. }
  119. static string RemoveNewLines(string source)
  120. {
  121. var regExp = new Regex("(\r|\n|\t)", RegexOptions.Multiline);
  122. return regExp.Replace(source, "");
  123. }
  124. static bool IsValidChar(char c)
  125. {
  126. return Char.IsLetterOrDigit(c) || c == '_';
  127. }
  128. static string RemoveWhiteSpaces(string source)
  129. {
  130. var builder = new StringBuilder(source.Length);
  131. var isInString = false;
  132. for (var index = 0; index < source.Length; index++)
  133. {
  134. var previous = source[Math.Max(0, index - 1)];
  135. var current = source[index];
  136. var next = source[Math.Min(source.Length - 1, index + 1)];
  137. if (current == '"' && previous != '\\')
  138. {
  139. isInString = !isInString;
  140. }
  141. else if (current == ' ' && !isInString)
  142. {
  143. if (!IsValidChar(previous) || !IsValidChar(next))
  144. {
  145. continue;
  146. }
  147. }
  148. builder.Append(current);
  149. }
  150. return builder.ToString();
  151. }
  152. static void DisplayUsage()
  153. {
  154. Console.WriteLine("JSKompactor usage: JSKompactor.exe /w:\"Working folder\" /i:\"Comma separated list of files to merge\" /s:\"Shaders folder\" /o:\"output file\"");
  155. }
  156. }
  157. }