A static site generator, written in C
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

cms_build.c 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #include <sys/stat.h>
  2. #include <sys/types.h>
  3. #include <fcntl.h>
  4. #include <unistd.h>
  5. #include <dirent.h>
  6. #include <errno.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include "cms_build.h"
  10. #include "cms_err.h"
  11. #include "cms_files.h"
  12. #include "cms_util.h"
  13. #include "cms_page.h"
  14. #include "cms_post.h"
  15. #include <stdio.h>
  16. cms_err* cms_build_write_files(cms_page* root, char* path)
  17. {
  18. char* dirpath = cms_util_path_join(path, root->slug);
  19. if (dirpath == NULL)
  20. return cms_err_create(CMS_ERR_ALLOC, NULL);
  21. if (mkdir(dirpath, 077) == -1 && errno != EEXIST)
  22. return cms_err_from_std_err(errno);
  23. //Go through each post in the page, writing it to disk
  24. size_t i;
  25. for (i = 0; i < root->numposts; ++i)
  26. {
  27. cms_post post = root->posts[i];
  28. char* postdirpath = cms_util_path_join(dirpath, post.slug);
  29. if (postdirpath == NULL)
  30. return cms_err_create(CMS_ERR_ALLOC, NULL);
  31. if (mkdir(postdirpath, 0777) == -1 && errno != EEXIST)
  32. return cms_err_from_std_err(errno);
  33. char* filepath = cms_util_path_join(postdirpath, CMS_FILE_INDEX);
  34. if (postdirpath == NULL)
  35. return cms_err_create(CMS_ERR_ALLOC, NULL);
  36. int file = open(filepath, O_WRONLY | O_CREAT, 0777);
  37. if (file == -1)
  38. return cms_err_from_std_err(errno);
  39. write(file, post.html, strlen(post.html));
  40. close(file);
  41. free(filepath);
  42. free(postdirpath);
  43. }
  44. //Go through each sub in the page recursively
  45. for (i = 0; i < root->numsubs; ++i)
  46. {
  47. cms_page sub = root->subs[i];
  48. char* subdirpath = cms_util_path_join(dirpath, sub.slug);
  49. if (subdirpath == NULL)
  50. return cms_err_create(CMS_ERR_ALLOC, NULL);
  51. cms_build_write_files(&sub, subdirpath);
  52. free(subdirpath);
  53. }
  54. free(dirpath);
  55. }
  56. cms_err* cms_build_make_tree(cms_page* root, char* path, char* dirname)
  57. {
  58. struct dirent** namelist;
  59. int n = scandir(path, &namelist, 0, alphasort);
  60. if (n == -1)
  61. return cms_err_from_std_err(errno);
  62. struct dirent* ep;
  63. struct stat* st = malloc(sizeof(struct stat));
  64. if (st == NULL)
  65. return cms_err_create(CMS_ERR_ALLOC, NULL);
  66. for (int i = 0; i < n; ++i)
  67. {
  68. ep = namelist[i];
  69. if (ep->d_name[0] == '.')
  70. continue;
  71. char* entpath = cms_util_path_join(path, ep->d_name);
  72. stat(entpath, st);
  73. //Entry is directory, recurse
  74. if (S_ISDIR(st->st_mode))
  75. {
  76. cms_page* sub = cms_page_create();
  77. if (sub == NULL)
  78. return cms_err_create(CMS_ERR_ALLOC, NULL);
  79. cms_err* err;
  80. err = cms_build_make_tree(sub, entpath, ep->d_name);
  81. if (err)
  82. return err;
  83. err = cms_page_add_sub(root, sub);
  84. if (err)
  85. return err;
  86. }
  87. //Entry is the file which contains metadata
  88. //about a page, parse
  89. else if (strcmp(ep->d_name, CMS_FILE_PAGE) == 0)
  90. {
  91. char* content = cms_util_file_read(entpath);
  92. if (content == NULL)
  93. return cms_err_create(CMS_ERR_FILEREAD, entpath);
  94. cms_err* err = cms_page_parse(root, content, dirname);
  95. free(content);
  96. if (err)
  97. return err;
  98. }
  99. //Entry is a post, read it and add to page
  100. else
  101. {
  102. cms_post* post = cms_post_create();
  103. char* content = cms_util_file_read(entpath);
  104. if (content == NULL)
  105. return cms_err_create(CMS_ERR_FILEREAD, entpath);
  106. cms_err* err;
  107. err = cms_post_parse(post, content, ep->d_name);
  108. free(content);
  109. if (err)
  110. return err;
  111. err = cms_page_add_post(root, post);
  112. if (err)
  113. return err;
  114. }
  115. free(entpath);
  116. }
  117. free(st);
  118. free(namelist);
  119. return cms_err_create(CMS_ERR_NONE, NULL);
  120. }