fetch-projects.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. var fs = require('fs')
  2. const sharp = require('sharp');
  3. var utilities = require('./utilities');
  4. var requirements = require('./check-requirements');
  5. const chalk = require('chalk');
  6. const logSymbols = require('log-symbols');
  7. const YAML = require('json-to-pretty-yaml');
  8. const TurndownService = require('turndown');
  9. var turndownService = new TurndownService()
  10. var list_projects = function(){
  11. var project_directories = utilities.getDirectories(global.source);
  12. var projects = []
  13. // Load Files into JSON object
  14. project_directories.forEach(project => {
  15. try {
  16. projects.push(JSON.parse(fs.readFileSync(`${global.source}/${project}/project.json`)));
  17. } catch(err){}
  18. });
  19. return projects;
  20. }
  21. var createProject = async function(project){
  22. var project_requirements = await requirements.hasRequirements(project);
  23. //console.log(`${project.title} ${hasRequirements}`)
  24. if(project_requirements.pass == 'no'){
  25. result[2] += 1;
  26. console.log(logSymbols.error, `Error creating project \'${chalk.bold(project.permalink)}\'`);
  27. requirements.requirementMessages(project, project_requirements);
  28. return;
  29. }
  30. // Create folder
  31. utilities.createDirectory(`source/_posts/projects/${project.permalink}`)
  32. // Generate cover
  33. var cover_path = `${global.source}/${project.permalink}/${project.cover_image}`
  34. var cover_ext = project.cover_image.split(".")[1];
  35. var cover_destination = `source/_posts/projects/${project.permalink}/cover.jpg`
  36. sharp(cover_path).resize(1000, 625).toFile(cover_destination);
  37. project.cover_image = `/projects/${project.permalink}/cover.jpg`
  38. // Generate thumbnail
  39. sharp(cover_path).resize(550, 344).toFile(`source/_posts/projects/${project.permalink}/thumbnail.jpg`);
  40. project.thumbnail_image = `/projects/${project.permalink}/thumbnail.jpg`
  41. // Copy Hero
  42. var hero_path, hero_ext, hero_destination;
  43. if(project.hero_image != undefined){
  44. hero_path = `${global.source}/${project.permalink}/${project.hero_image}`
  45. hero_ext = project.hero_image.split(".")[1];
  46. hero_destination = `source/_posts/projects/${project.permalink}/hero.${hero_ext}`
  47. utilities.copyFile(hero_path, hero_destination);
  48. project.hero_image = `/projects/${project.permalink}/hero.${hero_ext}`
  49. }
  50. // Copy screenshots
  51. var screenshot_data = []
  52. if(project.screenshots != undefined){
  53. if(project.screenshots.length > 0) {
  54. for (let i = 0; i < project.screenshots.length; i++) {
  55. var screenshot = project.screenshots[i];
  56. screenshot_path = `${global.source}/${project.permalink}/${screenshot.url}`
  57. screenshot_ext = project.hero_image.split(".")[1];
  58. screenshot_destination = `source/_posts/projects/${project.permalink}/screenshot-${i}.${screenshot_ext}`
  59. utilities.copyFile(screenshot_path, screenshot_destination);
  60. screenshot.url = `/projects/${project.permalink}/screenshot-${i}.${screenshot_ext}`;
  61. screenshot_data.push(screenshot)
  62. }
  63. }
  64. }
  65. // Create markdown file
  66. var file = "";
  67. file += "---\n";
  68. file += `title: ${project.title}\n`;
  69. file += `folder: ${project.permalink}\n`;
  70. file += `date: ${project.start_date}\n`;
  71. file += `layout: project\n`
  72. try {
  73. var data = JSON.parse(JSON.stringify(project));
  74. delete data.title;
  75. delete data.index;
  76. delete data.status;
  77. delete data.size
  78. delete data.local_copies;
  79. delete data.folder;
  80. delete data.aws_backups;
  81. delete data.permalink;
  82. delete data.backup_folder;
  83. if(data.repositories == []) delete data.repositories;
  84. if(data.files == []) delete data.files;
  85. if(screenshot_data.length > 0) data.screenshots = screenshot_data;
  86. file += YAML.stringify(data);
  87. } catch (err){
  88. if(global.isVerbose) console.log(logSymbols.error, chalk.red('An error occured: '));
  89. if(global.isVerbose) console.log(err);
  90. }
  91. file += "---\n";
  92. if(project.text == undefined){
  93. file += project.description;
  94. } else {
  95. file += turndownService.turndown(project.text);;
  96. }
  97. // Save markdown file
  98. var project_file_path = `source/_posts/projects/${project.permalink}.md`
  99. try {
  100. fs.writeFileSync(project_file_path, file);
  101. if(project_requirements.pass == 'all') {
  102. result[0] += 1;
  103. console.log(logSymbols.success, `Created Project \'${chalk.bold(project.permalink)}\'`);
  104. } else if(project_requirements.pass == 'some') {
  105. result[1] += 1;
  106. console.log(logSymbols.warning, `Created Project \'${chalk.bold(project.permalink)}\' with warnings`);
  107. requirements.requirementMessages(project, project_requirements);
  108. }
  109. counter += 1;
  110. } catch (err){
  111. if(global.isVerbose) console.log(logSymbols.error, chalk.red('An error occured: '));
  112. if(global.isVerbose) console.log(err);
  113. }
  114. }
  115. var result = [ 0, 0, 0]
  116. module.exports.all = async function(){
  117. console.log()
  118. var projects = list_projects();
  119. for (let i = 0; i < projects.length; i++) {
  120. await createProject(projects[i]);
  121. }
  122. console.log()
  123. console.log(chalk.green(`${result[0]} created`) + ", " + chalk.yellow(`${result[1]} created with warnings`) + ", " + chalk.red(`${result[2]} missing requirements`) + ` (TOTAL: ${projects.length})`);
  124. }
  125. module.exports.list_projects = list_projects;