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.4KB

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