fetch-projects.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. var fs = require('fs')
  2. const YAML = require('json-to-pretty-yaml');
  3. const TurndownService = require('turndown');
  4. var turndownService = new TurndownService()
  5. const getDirectories = source =>
  6. fs.readdirSync(source, { withFileTypes: true })
  7. .filter(item => item.isDirectory())
  8. .map(item => item.name);
  9. var source = "/Users/james/codex/projects"
  10. var projects = getDirectories(source);
  11. var project_data = []
  12. projects.forEach(project => {
  13. try {
  14. project_data.push(JSON.parse(fs.readFileSync(`${source}/${project}/project.json`)));
  15. } catch(err){}
  16. });
  17. var copyFile = function(original_path, destination_path){
  18. try {
  19. fs.copyFileSync(original_path, destination_path);
  20. return true;
  21. } catch (err){
  22. if(err.code == 'ENOENT'){
  23. console.log(`> ERROR: File not found! (\'${original_path}\')`)
  24. } else {
  25. console.log(err);
  26. }
  27. return false;
  28. }
  29. }
  30. var createProject = function(project){
  31. // Don't copy private projects
  32. if(project.visibility == "private") return;
  33. // Copy thumbnail
  34. var cover_path = `${source}/${project.permalink}/${project.cover_image}`
  35. var cover_ext = project.cover_image.split(".")[1];
  36. var thumbnail_destination = `source/images/thumbnails/projects/${project.permalink}.${cover_ext}`
  37. if(!copyFile(cover_path, thumbnail_destination)) return;
  38. // Copy Hero
  39. var hero_path, hero_ext, hero_destination;
  40. if(project.hero_image != undefined){
  41. hero_path = `${source}/${project.permalink}/${project.hero_image}`
  42. hero_ext = project.hero_image.split(".")[1];
  43. hero_destination = `source/images/hero/projects/${project.permalink}.${hero_ext}`
  44. copyFile(hero_path, hero_destination);
  45. }
  46. // Copy screenshots
  47. var screenshot_data = []
  48. if(project.screenshots != undefined){
  49. if(project.screenshots.length > 0) {
  50. for (let i = 0; i < project.screenshots.length; i++) {
  51. var screenshot = project.screenshots[i];
  52. screenshot_path = `${source}/${project.permalink}/${screenshot.url}`
  53. screenshot_ext = project.hero_image.split(".")[1];
  54. screenshot_destination = `/images/${project.permalink}-screenshot-${i}.${screenshot_ext}`
  55. copyFile(screenshot_path, 'source' + screenshot_destination);
  56. screenshot.url = screenshot_destination;
  57. screenshot_data.push(screenshot)
  58. }
  59. }
  60. }
  61. // Create markdown file
  62. var file = "";
  63. file += "---\n";
  64. file += `title: ${project.title}\n`;
  65. file += `folder: ${project.permalink}\n`;
  66. file += `date: ${project.start_date}\n`;
  67. file += `layout: project\n`
  68. file += `cover: /images/thumbnails/projects/${project.permalink}.${cover_ext}\n`;
  69. if(project.hero_image != undefined){
  70. file += `hero: /images/hero/projects/${project.permalink}.${hero_ext}\n`;
  71. }
  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.cover_image;
  79. delete data.local_copies;
  80. delete data.folder;
  81. delete data.aws_backups;
  82. delete data.permalink;
  83. delete data.backup_folder;
  84. if(data.repositories == []) delete data.repositories;
  85. if(data.files == []) delete data.files;
  86. if(screenshot_data.length > 0) data.screenshots = screenshot_data;
  87. file += YAML.stringify(data);
  88. } catch (err){
  89. 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. console.log(`> Created file \'${project.permalink}.md\'`);
  102. counter += 1;
  103. } catch (err){
  104. console.log(err);
  105. }
  106. }
  107. var counter = 0;
  108. module.exports = function(){
  109. project_data.forEach(project => {
  110. createProject(project);
  111. });
  112. console.log(`Copied ${counter}/${project_data.length} projects`);
  113. }