fetch-projects.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. var fs = require('fs')
  2. var utilities = require('./utilities');
  3. const chalk = require('chalk');
  4. const logSymbols = require('log-symbols');
  5. const YAML = require('json-to-pretty-yaml');
  6. const TurndownService = require('turndown');
  7. var turndownService = new TurndownService()
  8. var source = "/Users/james/codex/projects"
  9. var project_directories = utilities.getDirectories(source);
  10. var projects = []
  11. // Load Files into JSON object
  12. project_directories.forEach(project => {
  13. try {
  14. projects.push(JSON.parse(fs.readFileSync(`${source}/${project}/project.json`)));
  15. } catch(err){}
  16. });
  17. var hasRequirements = function(project){
  18. var requirements = {
  19. is_public : project.visibility == "private" || project.visibility == undefined,
  20. has_thumbnail : utilities.fileExists( `${source}/${project.permalink}/${project.cover_image}`),
  21. has_hero_img : utilities.fileExists(`${source}/${project.permalink}/${project.hero_image}`),
  22. has_description : project.description != "" && project.description != undefined,
  23. has_text : project.text != "" && project.text != undefined,
  24. has_videos : countVideos(project) > 0,
  25. has_screenshots : countScreenshots(project) > 0
  26. }
  27. var pass = ''
  28. if(!requirements.is_public) pass = 'no'
  29. else if(!requirements.has_thumbnail) pass = 'no'
  30. else if(!requirements.has_description) pass = 'no'
  31. else if(!requirements.has_hero_img && !requirements.has_videos) pass = 'no'
  32. else if(!requirements.has_text) pass = 'some'
  33. else if(!requirements.has_videos && !requirements.has_screenshots) pass = 'some'
  34. else pass = 'all';
  35. requirements.pass = pass;
  36. return requirements;
  37. }
  38. var requirementMessages = function(project, requirements){
  39. var warning_thumbnail = chalk.red(` - Missing the thumbnail image`);
  40. var warning_hero_img = chalk.red(` - Missing hero image or video`);
  41. var warning_description = chalk.red(` - Missing description`);
  42. var warning_text = chalk.yellow(` - Missing long text description`);
  43. var warning_screenshots = chalk.yellow(` - Missing screenshots`);
  44. if(global.isVerbose){
  45. if(!requirements.has_thumbnail) console.log(warning_thumbnail);
  46. if(!requirements.has_description) console.log(warning_description);
  47. if(!requirements.has_hero_img && !requirements.has_videos) console.log(warning_hero_img);
  48. if(!requirements.has_text) console.log(warning_text);
  49. if(!requirements.has_videos && !requirements.has_screenshots) console.log(warning_screenshots);
  50. }
  51. }
  52. var countVideos = function(project){
  53. if(project.videos != undefined){
  54. return project.videos.length;
  55. } else {
  56. return 0;
  57. }
  58. }
  59. var countScreenshots = function(project){
  60. if(project.screenshots != undefined){
  61. return project.screenshots.length;
  62. } else {
  63. return 0;
  64. }
  65. }
  66. var createProject = function(project){
  67. var requirements = hasRequirements(project);
  68. //console.log(`${project.title} ${hasRequirements}`)
  69. if(requirements.pass == 'no'){
  70. console.log(logSymbols.error, `Error creating project \'${chalk.bold(project.permalink)}\'`);
  71. requirementMessages(project, requirements);
  72. return;
  73. }
  74. // Copy thumbnail
  75. var cover_path = `${source}/${project.permalink}/${project.cover_image}`
  76. var cover_ext = project.cover_image.split(".")[1];
  77. var thumbnail_destination = `source/images/thumbnails/projects/${project.permalink}.${cover_ext}`
  78. if(!utilities.copyFile(cover_path, thumbnail_destination)) return;
  79. // Copy Hero
  80. var hero_path, hero_ext, hero_destination;
  81. if(project.hero_image != undefined){
  82. hero_path = `${source}/${project.permalink}/${project.hero_image}`
  83. hero_ext = project.hero_image.split(".")[1];
  84. hero_destination = `source/images/hero/projects/${project.permalink}.${hero_ext}`
  85. utilities.copyFile(hero_path, hero_destination);
  86. }
  87. // Copy screenshots
  88. var screenshot_data = []
  89. if(project.screenshots != undefined){
  90. if(project.screenshots.length > 0) {
  91. for (let i = 0; i < project.screenshots.length; i++) {
  92. var screenshot = project.screenshots[i];
  93. screenshot_path = `${source}/${project.permalink}/${screenshot.url}`
  94. screenshot_ext = project.hero_image.split(".")[1];
  95. screenshot_destination = `/images/${project.permalink}-screenshot-${i}.${screenshot_ext}`
  96. utilities.copyFile(screenshot_path, 'source' + screenshot_destination);
  97. screenshot.url = screenshot_destination;
  98. screenshot_data.push(screenshot)
  99. }
  100. }
  101. }
  102. // Create markdown file
  103. var file = "";
  104. file += "---\n";
  105. file += `title: ${project.title}\n`;
  106. file += `folder: ${project.permalink}\n`;
  107. file += `date: ${project.start_date}\n`;
  108. file += `layout: project\n`
  109. file += `cover: /images/thumbnails/projects/${project.permalink}.${cover_ext}\n`;
  110. if(project.hero_image != undefined){
  111. file += `hero: /images/hero/projects/${project.permalink}.${hero_ext}\n`;
  112. }
  113. try {
  114. var data = JSON.parse(JSON.stringify(project));
  115. delete data.title;
  116. delete data.index;
  117. delete data.status;
  118. delete data.size
  119. delete data.cover_image;
  120. delete data.local_copies;
  121. delete data.folder;
  122. delete data.aws_backups;
  123. delete data.permalink;
  124. delete data.backup_folder;
  125. if(data.repositories == []) delete data.repositories;
  126. if(data.files == []) delete data.files;
  127. if(screenshot_data.length > 0) data.screenshots = screenshot_data;
  128. file += YAML.stringify(data);
  129. } catch (err){
  130. if(global.isVerbose) console.log(logSymbols.error, chalk.red('An error occured: '));
  131. if(global.isVerbose) console.log(err);
  132. }
  133. file += "---\n";
  134. if(project.text == undefined){
  135. file += project.description;
  136. } else {
  137. file += turndownService.turndown(project.text);;
  138. }
  139. // Save markdown file
  140. var project_file_path = `source/_posts/projects/${project.permalink}.md`
  141. try {
  142. fs.writeFileSync(project_file_path, file);
  143. if(requirements.pass == 'all') {
  144. console.log(logSymbols.success, `Created Project \'${chalk.bold(project.permalink)}\'`);
  145. } else if(requirements.pass == 'some') {
  146. console.log(logSymbols.warning, `Created Project \'${chalk.bold(project.permalink)}\' with warnings`);
  147. requirementMessages(project, requirements);
  148. }
  149. counter += 1;
  150. } catch (err){
  151. if(global.isVerbose) console.log(logSymbols.error, chalk.red('An error occured: '));
  152. if(global.isVerbose) console.log(err);
  153. }
  154. }
  155. var counter = 0;
  156. module.exports.all = function(){
  157. projects.forEach(project => {
  158. createProject(project);
  159. });
  160. console.log(`Copied ${counter}/${projects.length} projects`);
  161. }
  162. module.exports.showRequirements = function(query){
  163. if(query != undefined) query = query.toLowerCase();
  164. var result = [ 0, 0, 0]
  165. console.log();
  166. projects.forEach(project => {
  167. if(project.title.toLowerCase() == query || project.permalink == query || query == ""){
  168. var requirements = hasRequirements(project);
  169. if(requirements.pass == 'all'){
  170. result[0] += 1;
  171. console.log(logSymbols.success,
  172. `Project \'${chalk.bold(project.permalink)}\' has all requirements`);
  173. } else if (requirements.pass == 'some') {
  174. result[1] += 1;
  175. console.log(logSymbols.warning,
  176. `Project \'${chalk.bold(project.permalink)}\' has some requirements`);
  177. } else if(requirements.pass == 'no') {
  178. result[2] += 1;
  179. console.log(logSymbols.error,
  180. `Project \'${chalk.bold(project.permalink)}\' doesn\'t have necessary requirements`);
  181. }
  182. requirementMessages(project, requirements);
  183. }
  184. });
  185. console.log();
  186. if(query == "")
  187. console.log(chalk.green(`${result[0]} passed`) + ", " + chalk.yellow(`${result[1]} passed with warnings`) + ", " + chalk.red(`${result[2]} missing requirements`));
  188. }