commit 9a67011b536cd47996da9d29680c433c0ff38a52 Author: Reese Date: Thu Jun 2 16:14:41 2022 -0600 Initial commit / i made the thing then used git diff --git a/make.sh b/make.sh new file mode 100755 index 0000000..8b1e4e2 --- /dev/null +++ b/make.sh @@ -0,0 +1,6 @@ +#!/bin/env sh +PROGRAM_NAME='txtToHTML.c' +BINARY_NAME='txtToHTML' + +musl-clang -O3 -Wall -static $PROGRAM_NAME -o "./bin/"$BINARY_NAME + diff --git a/test.txt b/test.txt new file mode 100644 index 0000000..d5a9c4a --- /dev/null +++ b/test.txt @@ -0,0 +1,11 @@ +Hello world! + +[This is the archlinux website](https://archlinux.org) + +*bold* +/italic/ +`monospace` +~strikethrough~ +_underlined_ +*/~_all at once!_~/* +\*asterisks\* diff --git a/txtToHTML.c b/txtToHTML.c new file mode 100644 index 0000000..2a8b3c2 --- /dev/null +++ b/txtToHTML.c @@ -0,0 +1,176 @@ +#include +#include +#include +#include + +#define VERSION "0.43" + +typedef struct { + int position; + int size; + char *data; +} Buffer; + +struct closeThings { + bool Bold; + bool Italics; + bool Strikethrough; + bool Monospace; + bool Underline; +}; + +void reallocBuffer(Buffer *buffer) { + buffer->size += 1024; + buffer->data = realloc(buffer->data,buffer->size); + if (!buffer->data) { + printf("Error reallocing buffer!"); + exit(1); + } +} + +void appendToBuffer(Buffer *buffer, Buffer *dataBuffer) { + for (int i = 0;i < dataBuffer->size;i++) { + if (dataBuffer->data[i] == 0x00) break; /* stop on NULL */ + buffer->data[buffer->position] = dataBuffer->data[i]; + buffer->position++; + if (buffer->position > buffer->size-64) { + reallocBuffer(buffer); + } + } +} + +int main(int argc, char **argv) { + + if (argc > 1) { + printf("Reeses static site generator V %s\n",VERSION); + printf(" Usage:\n"); + printf(" cat coolthing.txt | staticSiteGen > coolthing.html\n"); + printf(" Special characters:\n"); + printf(" * = bold\n"); + printf(" / = italic\n"); + printf(" ` = monospace\n"); + printf(" ~ = strikethrough\n"); + printf(" _ = underline\n"); + printf(" markdown style links are available\n"); + printf(" you can escape any character with \\ and it will not be formatted\n"); + exit(1); + } + + Buffer buffer; + buffer.size = 1024; + buffer.data = calloc(buffer.size,sizeof(char)); + buffer.position = 0; + + char character = 'a'; + bool skipChar = false; + + struct closeThings close; + + while(character != EOF) { + + character = fgetc(stdin); + + + if (buffer.position > buffer.size-64) { + reallocBuffer(&buffer); + } + + if (skipChar) { + skipChar = false; + buffer.data[buffer.position] = character; + buffer.position++; + continue; + } else if (character == '\\') { + skipChar = true; + + } else if (character == '*') { + if (close.Bold) { + appendToBuffer(&buffer,&(Buffer){0,4,""}); + close.Bold = false; + } else { + appendToBuffer(&buffer,&(Buffer){0,3,""}); + close.Bold = true; + } + + } else if (character == '/') { + if (close.Italics) { + appendToBuffer(&buffer,&(Buffer){0,4,""}); + close.Italics = false; + } else { + appendToBuffer(&buffer,&(Buffer){0,3,""}); + close.Italics = true; + } + + } else if (character == '`') { + if (close.Monospace) { + appendToBuffer(&buffer,&(Buffer){0,7,""}); + close.Monospace = false; + } else { + appendToBuffer(&buffer,&(Buffer){0,6,""}); + close.Monospace = true; + } + + } else if (character == '~') { + if (close.Strikethrough) { + appendToBuffer(&buffer,&(Buffer){0,6,""}); + close.Strikethrough = false; + } else { + appendToBuffer(&buffer,&(Buffer){0,5,""}); + close.Strikethrough = true; + } + + } else if (character == '_') { + if (close.Underline) { + appendToBuffer(&buffer,&(Buffer){0,6,""}); + close.Underline = false; + } else { + appendToBuffer(&buffer,&(Buffer){0,5,""}); + close.Underline = true; + } + } else if (character == '[') { + Buffer linkTxt = {0,256,calloc(256,sizeof(char))}; + Buffer linkLoc = {0,256,calloc(256,sizeof(char))}; + Buffer linkOut = {0,256,calloc(256,sizeof(char))}; + appendToBuffer(&linkOut,&(Buffer){0,10,""}); + appendToBuffer(&linkOut,&linkTxt); + appendToBuffer(&linkOut,&(Buffer){0,4,""}); + + appendToBuffer(&buffer,&linkOut); + free(linkOut.data); + free(linkTxt.data); + free(linkLoc.data); + + } else if (character == '\n') { + appendToBuffer(&buffer,&(Buffer){0,5,"
\n"}); + + } else { + buffer.data[buffer.position] = character; + buffer.position++; + } + } + + int end = buffer.position-1; + buffer.position = 0; + for (int i = 0;i < end;i++) { + printf("%c",buffer.data[i]); + } + + return 0; +}