From 1fd687a09137bd9f8f33a3aa6b0129d9e5c2da17 Mon Sep 17 00:00:00 2001 From: radhitya Date: Wed, 15 Jan 2025 11:43:17 +0700 Subject: [PATCH] kittendust --- main.c | 326 +++++++++++++++++++++++---------------------------------- 1 file changed, 129 insertions(+), 197 deletions(-) diff --git a/main.c b/main.c index 437abb4..f5a4d7d 100644 --- a/main.c +++ b/main.c @@ -1,18 +1,20 @@ /* daisy * alif@radhitya.org - * + * * thank you stackoverflow, geeksforgeeks, grok */ +#define _DEFAULT_SOURCE + #include #include #include #include +#include #define MAX_LENGTH 1000 -typedef struct -markdown { +typedef struct { int bold; int quote; int italic; @@ -21,15 +23,15 @@ markdown { int headingone; int headingtwo; int headingthree; -} markdown; +} Markdown; -markdown mdt; +Markdown mdt; -FILE *fptr; +FILE *fptr, *fpto; +char txt[MAX_LENGTH], of[MAX_LENGTH]; +int i, len; -char -*gantihuruf(const char *kata) -{ +char *gantihuruf(const char *kata) { static char output[100]; char *dot = strrchr(kata, '.'); @@ -45,9 +47,7 @@ char return output; } -void -checker(void) -{ +void checker(void) { fptr = fopen("./source/data.txt", "rb+"); if (fptr == NULL) { perror("galat checker buat ./source/data.txt"); @@ -55,115 +55,28 @@ checker(void) } } -int -main(int argc, char *argv[]) -{ - if (argc < 2) { - printf("penggunaan: %s \natau %s -h untuk info lebih lanjut\n", argv[0], argv[0]); - return 1; - } - - for (int i = 1; i < argc; i++) { - if (strcmp("-v", argv[i]) == 0) { - printf("daisy © radhitya.org\n"); - return 0; - } - else if(strcmp("-h", argv[i]) == 0) { - printf("-h : help"); - printf("new : new site"); - return 0; - } - else if(strcmp("new", argv[i]) == 0) { - struct stat st; - if(stat("./source", &st) == 0) { - if(stat("./target", &st) == 0) { - if(stat("./media", &st) == 0) { - printf("./source dan ./target telah dibuat\n"); - } - else { - mkdir("./media", 0700); - } - } - else { - mkdir("./target", 0700); - } - } else { - mkdir("./source", 0700); - mkdir("./target", 0700); - mkdir("./media", 0700); - } +void build(void) { + mdt.italic = mdt.bold = mdt.quote = mdt.headingone = mdt.headingtwo = mdt.headingthree = mdt.code = 0; - fptr = fopen("./source/data.txt", "r"); - if (fptr == NULL) { - fptr = fopen("./source/data.txt", "w"); - if (fptr == NULL) { - perror("galat buat ./source/data.txt (fptr)"); - exit(1); - } else { - printf("sukses buat ./source/data.txt\n"); - } - } else { - printf("./source/data.txt sudah ada\n"); - fclose(fptr); - } - return 0; - } - else { - printf("salah perintah\ngunakan -h untuk info lebih lanjut\n"); - return 0; - } - } + fprintf(fpto, "\n\n\n\ndaisy homepage\n"); + fprintf(fpto, "\n"); - char txt[MAX_LENGTH], of[MAX_LENGTH]; - - int i, len; - - mdt.italic = 0, mdt.bold = 0, mdt.quote = 0, mdt.headingone = 0, mdt.headingtwo = 0; - mdt.headingthree = 0, mdt.code = 0; - - const char *file_name = strrchr(argv[1], '/'); - if (file_name == NULL) { - file_name = argv[1]; - } else { - file_name++; - } - - char *new_name = gantihuruf(file_name); - snprintf(of, sizeof(of), "target/%s", new_name); - - fptr = fopen(argv[1], "rt"); - if (fptr == NULL) { - perror("galat membuka masukan berkas fptr\n"); - return 1; - } - - FILE *fpto = fopen(of, "w"); - if (fpto == NULL) { - perror("galat membuat keluaran berkas fpto\n"); - fclose(fptr); - return 1; - } - - fprintf(fpto, "\n\n"); - while (fgets(txt, MAX_LENGTH, fptr) != NULL) { len = strlen(txt); - // hapus newline - if (len > 0 && txt[len-1] == '\n') { + if (len > 0 && txt[len-1] == '\n') { txt[--len] = '\0'; } - mdt.headingone = 0; - mdt.headingtwo = 0; - mdt.quote = 0; - if(len == 0) { + mdt.headingone = mdt.headingtwo = mdt.quote = 0; + if (len == 0) { fprintf(fpto, "\n"); } else { i = 0; - if(len > 1 && txt[0] == '#' && txt[1] != '\\') { - if(len > 2 && txt[1] == '#' && txt[2] != '\\') { - if(len > 3 && txt[2] == '#' && txt[3] != '\\') { + + if (len > 1 && txt[0] == '#' && txt[1] != '\\') { + if (len > 2 && txt[1] == '#' && txt[2] != '\\') { + if (len > 3 && txt[2] == '#' && txt[3] != '\\') { fprintf(fpto, "

"); mdt.headingthree = 1; while (i < len && (txt[i] == '#' || txt[i] == ' ')) i++; @@ -183,78 +96,29 @@ main(int argc, char *argv[]) while (i < len && (txt[i] == '>' || txt[i] == ' ')) i++; } else { fprintf(fpto, "

"); - i = 0; } - for(; i < len; i++) { + for (; i < len; i++) { if (txt[i] == '_' && (i == 0 || txt[i-1] != '\\')) { - if(!mdt.italic) { + if (!mdt.italic) { fprintf(fpto, ""); mdt.italic = 1; } else { fprintf(fpto, ""); mdt.italic = 0; } - } -else if (txt[i] == '[' && (i == 0 || txt[i-1] != '\\')) { - int start_linkname = i + 1; - int end_linkname = -1; - int start_linkurl = -1; - int end_linkurl = -1; - int j; - - for (j = start_linkname; j < len; j++) { - if (txt[j] == ']' && (j == 0 || txt[j-1] != '\\')) { - end_linkname = j; - break; - } - } - - if (end_linkname != -1) { - for (j = end_linkname + 1; j < len; j++) { - if (txt[j] == '(' && (j == 0 || txt[j-1] != '\\')) { - start_linkurl = j + 1; - break; - } - } - - if (start_linkurl != -1) { - for (j = start_linkurl; j < len; j++) { - if (txt[j] == ')' && (j == 0 || txt[j-1] != '\\')) { - end_linkurl = j; - break; - } - } - } - } - - if (end_linkname != -1 && end_linkurl != -1) { - char linkname[100], linkurl[100]; - int linkname_len = end_linkname - start_linkname; - int linkurl_len = end_linkurl - start_linkurl; - - strncpy(linkname, txt + start_linkname, linkname_len); - linkname[linkname_len] = '\0'; - - strncpy(linkurl, txt + start_linkurl, linkurl_len); - linkurl[linkurl_len] = '\0'; - - fprintf(fpto, "%s", linkurl, linkname); - - i = end_linkurl; - } -} - else if (txt[i] == '`' && (i == 0 || txt[i-1] != '\\')) { - if(!mdt.code) { - fprintf(fpto, ""); - mdt.code = 1; - } else { - fprintf(fpto, ""); - mdt.code = 0; - } - } - else if (i + 1 < len && txt[i] == '*' && txt[i+1] == '*' && (i == 0 || txt[i-1] != '\\')) { - if(!mdt.bold) { + } else if (txt[i] == '[' && (i == 0 || txt[i-1] != '\\')) { + fprintf(fpto, "[%c]", txt[i]); + } else if (txt[i] == '`' && (i == 0 || txt[i-1] != '\\')) { + if (!mdt.code) { + fprintf(fpto, ""); + mdt.code = 1; + } else { + fprintf(fpto, ""); + mdt.code = 0; + } + } else if (i + 1 < len && txt[i] == '*' && txt[i+1] == '*' && (i == 0 || txt[i-1] != '\\')) { + if (!mdt.bold) { fprintf(fpto, ""); mdt.bold = 1; i++; @@ -263,36 +127,104 @@ else if (txt[i] == '[' && (i == 0 || txt[i-1] != '\\')) { mdt.bold = 0; i++; } - } - else { + } else { fputc(txt[i], fpto); } } - if(mdt.italic) fprintf(fpto, ""); - else if(mdt.code) fprintf(fpto, ""); - else if(mdt.bold) fprintf(fpto, ""); - else if(mdt.quote) fprintf(fpto, ""); - else if(mdt.headingone) { - fprintf(fpto, "

\n"); - } - else if(mdt.headingtwo) { - fprintf(fpto, "\n"); - } - else if(mdt.headingthree) { - fprintf(fpto, "\n"); - } - else { - fprintf(fpto, "

\n"); - } - mdt.italic = mdt.bold = mdt.quote = mdt.headingone = mdt.headingtwo = mdt.headingthree = mdt.code = 0; + if (mdt.italic) fprintf(fpto, ""); + if (mdt.code) fprintf(fpto, ""); + if (mdt.bold) fprintf(fpto, ""); + if (mdt.quote) fprintf(fpto, ""); + if (mdt.headingone) fprintf(fpto, "\n"); + if (mdt.headingtwo) fprintf(fpto, "\n"); + if (mdt.headingthree) fprintf(fpto, "\n"); + if (!(mdt.headingone || mdt.headingtwo || mdt.headingthree || mdt.quote)) fprintf(fpto, "

\n"); } } fprintf(fpto, "\n"); - fclose(fptr); - fclose(fpto); - - printf("dokumen %s telah berhasil dibuat\n", of); - return 0; +} + +int main(int argc, char *argv[]) { + if (argc < 2) { + printf("penggunaan: %s [berkas_input]\natau %s -h untuk info lebih lanjut\n", argv[0], argv[0]); + return 1; + } + + for (int i = 1; i < argc; i++) { + if (strcmp("-v", argv[i]) == 0) { + printf("daisy © radhitya.org\n"); + return 0; + } else if (strcmp("build", argv[i]) == 0) { + DIR *dir; + struct dirent *ent; + if ((dir = opendir("./source")) != NULL) { + while ((ent = readdir(dir)) != NULL) { + /* d_type dari dirent.h + * DT_REG == file reguler (Directory Type Regular file) + */ + if (ent->d_type == DT_REG) { + char path[MAX_LENGTH]; + snprintf(path, sizeof(path), "./source/%s", ent->d_name); + fptr = fopen(path, "rt"); + if (fptr == NULL) { + perror("galat membuka berkas"); + continue; + } + + char *new_name = gantihuruf(ent->d_name); + snprintf(of, sizeof(of), "./target/%s", new_name); + + fpto = fopen(of, "w"); + if (fpto == NULL) { + perror("galat membuat berkas keluaran"); + fclose(fptr); + continue; + } + + build(); + + fclose(fptr); + fclose(fpto); + printf("dokumen %s telah berhasil dibuat\n", of); + } + } + closedir(dir); + } else { + perror("galat membuka direktori ./source"); + return 1; + } + return 0; + } else if (strcmp("-h", argv[i]) == 0) { + printf("-h : help\nnew : new site\nbuild : build all files in source/ to HTML\n"); + return 0; + } else if (strcmp("new", argv[i]) == 0) { + struct stat st; + if (stat("./source", &st) == -1) mkdir("./source", 0700); + if (stat("./target", &st) == -1) mkdir("./target", 0700); + if (stat("./media", &st) == -1) mkdir("./media", 0700); + + fptr = fopen("./source/data.txt", "r"); + if (fptr == NULL) { + fptr = fopen("./source/data.txt", "w"); + if (fptr == NULL) { + perror("galat buat ./source/data.txt (fptr)"); + exit(1); + } else { + printf("sukses buat ./source/data.txt\n"); + } + } else { + printf("./source/data.txt sudah ada\n"); + fclose(fptr); + } + return 0; + } else { + printf("salah perintah\n"); + return 0; + } + } + + printf("salah perintah\n"); + return 1; }