A static site generator, written in C
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

cms_build.c 1.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include <sys/stat.h>
  2. #include <sys/types.h>
  3. #include <dirent.h>
  4. #include <errno.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include "cms_build.h"
  8. #include "cms_err.h"
  9. #include "cms_files.h"
  10. #include "cms_util.h"
  11. #include "cms_page.h"
  12. #include "cms_post.h"
  13. cms_err* cms_build_make_tree(cms_page* root, char* path, char* dirname)
  14. {
  15. struct dirent** namelist;
  16. int n = scandir(path, &namelist, 0, alphasort);
  17. if (n == -1)
  18. return cms_err_from_std_err(errno);
  19. struct dirent* ep;
  20. struct stat* st = malloc(sizeof(struct stat));
  21. if (st == NULL)
  22. return cms_err_create(CMS_ERR_ALLOC, NULL);
  23. for (int i = 0; i < n; ++i)
  24. {
  25. ep = namelist[i];
  26. if (ep->d_name[0] == '.')
  27. continue;
  28. char* entpath = cms_util_path_join(path, ep->d_name);
  29. stat(entpath, st);
  30. //Entry is directory, recurse
  31. if (S_ISDIR(st->st_mode))
  32. {
  33. cms_page* sub = cms_page_create();
  34. if (sub == NULL)
  35. return cms_err_create(CMS_ERR_ALLOC, NULL);
  36. cms_err* err;
  37. err = cms_build_make_tree(sub, entpath, ep->d_name);
  38. if (err)
  39. return err;
  40. err = cms_page_add_sub(root, sub);
  41. if (err)
  42. return err;
  43. }
  44. //Entry is the file which contains metadata
  45. //about a page, parse
  46. else if (strcmp(ep->d_name, CMS_FILE_PAGE) == 0)
  47. {
  48. char* content = cms_util_file_read(entpath);
  49. if (content == NULL)
  50. return cms_err_create(CMS_ERR_FILEREAD, entpath);
  51. cms_err* err = cms_page_parse(root, content, dirname);
  52. free(content);
  53. if (err)
  54. return err;
  55. }
  56. //Entry is a post, read it and add to page
  57. else
  58. {
  59. cms_post* post = cms_post_create();
  60. char* content = cms_util_file_read(entpath);
  61. if (content == NULL)
  62. return cms_err_create(CMS_ERR_FILEREAD, entpath);
  63. cms_err* err;
  64. err = cms_post_parse(post, content, ep->d_name);
  65. free(content);
  66. if (err)
  67. return err;
  68. err = cms_page_add_post(root, post);
  69. if (err)
  70. return err;
  71. }
  72. free(entpath);
  73. }
  74. free(st);
  75. free(namelist);
  76. return cms_err_create(CMS_ERR_NONE, NULL);
  77. }