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;
}