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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include "cms_util.h"
  5. #include "cms_err.h"
  6. #include "cms_files.h"
  7. #include "cms_page.h"
  8. #include "cms_build.h"
  9. //Temporary, for testing purposes
  10. static void print_page_tree(cms_page* page)
  11. {
  12. printf("Page: %s\n", page->title);
  13. //Loop over posts
  14. size_t i;
  15. for (i = 0; i < page->numposts; ++i)
  16. {
  17. printf("\tPost: %s\n", (page->posts[i]).title);
  18. }
  19. //Loop over subs
  20. for (i = 0; i < page->numsubs; ++i)
  21. {
  22. print_page_tree(&page->subs[i]);
  23. }
  24. printf("---------\n");
  25. }
  26. int main(int argc, char** argv)
  27. {
  28. if (argc < 2)
  29. {
  30. fprintf(stderr, "Usage: %s <init|build>\n", argv[0]);
  31. return 1;
  32. }
  33. //Initiate
  34. if (strcmp(argv[1], "init") == 0)
  35. {
  36. if (argc != 3)
  37. {
  38. fprintf(stderr, "Usage: %s init <directory>\n", argv[0]);
  39. return 1;
  40. }
  41. char* dirname = argv[2];
  42. //Get the path of .cmsinited, which tells us
  43. //whether or not the directory is already inited
  44. char* initedPath = cms_util_path_join(dirname, CMS_FILE_INITED);
  45. if (initedPath == NULL)
  46. cms_err_panic(cms_err_create(CMS_ERR_ALLOC, NULL));
  47. //Panic if the directory is already initiated
  48. if (cms_util_file_exists(initedPath))
  49. cms_err_panic(cms_err_create(CMS_ERR_INITED, NULL));
  50. //Copy files from resources
  51. cms_err* err;
  52. err = cms_util_dir_copy_recursive(CMS_FILE_RESOURCES, dirname);
  53. if (err)
  54. cms_err_panic(err);
  55. //Create .cmsinited file
  56. err = cms_util_file_create(initedPath);
  57. if (err)
  58. cms_err_panic(err);
  59. }
  60. //Build
  61. else if (strcmp(argv[1], "build") == 0)
  62. {
  63. if (argc != 3)
  64. {
  65. fprintf(stderr, "Usage: %s build <directory>\n", argv[0]);
  66. return 1;
  67. }
  68. char* dirname = argv[2];
  69. //Get the path of .cmsinited, which tells us
  70. //whether or not the directory is already inited
  71. char* initedPath = cms_util_path_join(dirname, CMS_FILE_INITED);
  72. //Panic if the directory isn't initiated
  73. if (!cms_util_file_exists(initedPath))
  74. cms_err_panic(cms_err_create(CMS_ERR_NOTINITED, NULL));
  75. cms_page* root = cms_page_create();
  76. if (root == NULL)
  77. cms_err_panic(cms_err_create(CMS_ERR_ALLOC, NULL));
  78. char* path = cms_util_path_join(dirname, CMS_FILE_ROOT);
  79. if (path == NULL)
  80. cms_err_panic(cms_err_create(CMS_ERR_ALLOC, NULL));
  81. //Build tree of pages and posts
  82. cms_err* err;
  83. err = cms_build_make_tree(root, path, NULL);
  84. free(path);
  85. if (err)
  86. cms_err_panic(err);
  87. print_page_tree(root);
  88. }
  89. //Nothing, print usage
  90. else
  91. {
  92. fprintf(stderr, "Usage: %s <init|build>\n", argv[0]);
  93. return 1;
  94. }
  95. }