Keine Beschreibung
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

update-icons.js 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. const mv = require('mv');
  2. const fs = require('fs');
  3. const fse = require('fs-extra');
  4. const http = require('https');
  5. const path = require('path');
  6. const walk = require('walk');
  7. const unzip = require('unzip');
  8. const child_process = require('child_process');
  9. const ncp = require('ncp');
  10. const gameIconsUrl = "https://game-icons.net/archives/png/zip/ffffff/000000/game-icons.net.png.zip";
  11. const tempFilePath = "./temp.zip";
  12. const tempDir = "./temp";
  13. const imgDir = "./generator/img";
  14. const customIconDir = "./resources/custom-icons";
  15. const cssPath = "./generator/css/icons.css";
  16. const jsPath = "./generator/js/icons.js";
  17. //const processIconsCmd = "mogrify -background white -alpha shape *.png";
  18. const processIconsCmd = `mogrify -alpha copy -channel-fx "red=100%, blue=100%, green=100%" *.png`
  19. // ----------------------------------------------------------------------------
  20. // Download
  21. // ----------------------------------------------------------------------------
  22. function downloadFile(url, dest) {
  23. console.log("Downloading...");
  24. return new Promise((resolve, reject) => {
  25. http.get(url, response => {
  26. const file = fs.createWriteStream(dest);
  27. response.pipe(file);
  28. file.on('close', resolve);
  29. file.on('error', reject);
  30. })
  31. .on('error', reject);
  32. });
  33. }
  34. // ----------------------------------------------------------------------------
  35. // Unzip
  36. // ----------------------------------------------------------------------------
  37. function unzipAll(src, dest) {
  38. console.log("Unzipping...");
  39. return new Promise((resolve, reject) => {
  40. fs.createReadStream(tempFilePath)
  41. .pipe(unzip.Parse())
  42. .on('entry', entry => {
  43. const fileName = entry.path;
  44. const baseName = path.basename(fileName);
  45. const type = entry.type;
  46. if (type === "File") {
  47. entry.pipe(fs.createWriteStream(path.join(dest, baseName)));
  48. }
  49. else {
  50. entry.autodrain();
  51. }
  52. })
  53. .on('close', resolve)
  54. .on('error', reject);
  55. });
  56. }
  57. // ----------------------------------------------------------------------------
  58. // Process icons
  59. // ----------------------------------------------------------------------------
  60. function processAll(path) {
  61. console.log("Processing (this will take a while)...");
  62. return new Promise((resolve, reject) => {
  63. child_process.exec(processIconsCmd, {cwd: path}, (error, stdout, stderr) => {
  64. if (error) {
  65. reject(error);
  66. }
  67. else {
  68. resolve();
  69. }
  70. });
  71. });
  72. }
  73. // ----------------------------------------------------------------------------
  74. // Generate CSS
  75. // ----------------------------------------------------------------------------
  76. function generateCSS(src, dest) {
  77. console.log("Generating CSS...");
  78. return new Promise((resolve, reject) => {
  79. fs.readdir(src, (err, files) => {
  80. if (err) {
  81. reject(err);
  82. }
  83. else {
  84. const content = files
  85. .map(name => `.icon-${name.replace(".png", "")} { background-image: url(../img/${name});}\n`)
  86. .join("");
  87. fs.writeFile(dest, content, err => {
  88. if (err) {
  89. reject(err);
  90. }
  91. else {
  92. resolve();
  93. }
  94. });
  95. }
  96. });
  97. });
  98. }
  99. // ----------------------------------------------------------------------------
  100. // Generate JS
  101. // ----------------------------------------------------------------------------
  102. function generateJS(src, dest) {
  103. console.log("Generating JS...");
  104. return new Promise((resolve, reject) => {
  105. fs.readdir(src, (err, files) => {
  106. if (err) {
  107. reject(err);
  108. }
  109. else {
  110. const content = "var icon_names = [\n" + files
  111. .map(name => ` "${name.replace(".png", "")}"`)
  112. .join(",\n") +
  113. `
  114. ];
  115. var class_icon_names = [
  116. "class-barbarian",
  117. "class-bard",
  118. "class-cleric",
  119. "class-druid",
  120. "class-fighter",
  121. "class-monk",
  122. "class-paladin",
  123. "class-ranger",
  124. "class-rogue",
  125. "class-sorcerer",
  126. "class-warlock",
  127. "class-wizard"
  128. ];
  129. icon_names = icon_names.concat(class_icon_names);
  130. `;
  131. fs.writeFile(dest, content, err => {
  132. if (err) {
  133. reject(err);
  134. }
  135. else {
  136. resolve();
  137. }
  138. });
  139. }
  140. });
  141. });
  142. }
  143. // ----------------------------------------------------------------------------
  144. // Copy
  145. // ----------------------------------------------------------------------------
  146. function copyAll(src, dest) {
  147. console.log("Copying...");
  148. return new Promise((resolve, reject) => {
  149. fse.copy(src, dest, err => {
  150. if (err) {
  151. reject(err);
  152. }
  153. else {
  154. resolve();
  155. }
  156. });
  157. });
  158. }
  159. fse.emptyDir(tempDir)
  160. .then(() => downloadFile(gameIconsUrl, tempFilePath))
  161. .then(() => unzipAll(tempFilePath, tempDir))
  162. .then(() => copyAll(tempDir, imgDir))
  163. .then(() => copyAll(customIconDir, imgDir))
  164. .then(() => processAll(imgDir))
  165. .then(() => generateCSS(imgDir, cssPath))
  166. .then(() => generateJS(imgDir, jsPath))
  167. .then(() => console.log("Done."))
  168. .catch(err => console.log("Error", err));