diff --git a/hmml_to_html/hmml_to_html.c b/hmml_to_html/hmml_to_html.c index 7160a11..4015c16 100644 --- a/hmml_to_html/hmml_to_html.c +++ b/hmml_to_html/hmml_to_html.c @@ -16,6 +16,7 @@ typedef unsigned int bool; #include // NOTE(matt): printf, sprintf, vsprintf, fprintf, perror #include // NOTE(matt): calloc, malloc, free #include "hmmlib.h" +#include // NOTE(matt): getopts //#include "config.h" // TODO(matt): Implement config.h #define Kilobytes(Bytes) Bytes << 10 @@ -94,7 +95,7 @@ ClaimBuffer(char *MemoryArena, int *ClaimedMemory, buffer *Buffer, char *ID, int Buffer->Ptr = Buffer->Location; #if DEBUG printf(" Claimed: %s: %d\n" - " Total ClaimedMemory: %d\n\n", Buffer->ID, Buffer->Size, *ClaimedMemory); + " Total ClaimedMemory: %d\n\n", Buffer->ID, Buffer->Size, *ClaimedMemory); #endif } @@ -105,7 +106,7 @@ DeclaimBuffer(buffer *Buffer, int *ClaimedMemory) *ClaimedMemory -= Buffer->Size; #if DEBUG printf("Declaimed: %s\n" - " Total ClaimedMemory: %d\n\n", Buffer->ID, *ClaimedMemory); + " Total ClaimedMemory: %d\n\n", Buffer->ID, *ClaimedMemory); #endif } @@ -153,7 +154,7 @@ CopyBuffer(buffer *Dest, buffer *Src) { fprintf(stderr, "CopyBuffer: %s cannot accommodate %s\n", Dest->ID, Src->ID); __asm__("int3"); - + } } *Dest->Ptr++ = *Src->Ptr++; @@ -228,28 +229,28 @@ CopyStringToBufferHTMLSafe(buffer *Dest, char *String) switch(*String) { case '<': - CopyStringToBuffer(Dest, "<"); - String++; - break; + CopyStringToBuffer(Dest, "<"); + String++; + break; case '>': - CopyStringToBuffer(Dest, ">"); - String++; - break; + CopyStringToBuffer(Dest, ">"); + String++; + break; case '&': - CopyStringToBuffer(Dest, "&"); - String++; - break; + CopyStringToBuffer(Dest, "&"); + String++; + break; case '\"': - CopyStringToBuffer(Dest, """); - String++; - break; + CopyStringToBuffer(Dest, """); + String++; + break; case '\'': - CopyStringToBuffer(Dest, "'"); - String++; - break; + CopyStringToBuffer(Dest, "'"); + String++; + break; default: - *Dest->Ptr++ = *String++; - break; + *Dest->Ptr++ = *String++; + break; } } } @@ -267,28 +268,28 @@ CopyStringToBufferCSVSafe(buffer *Dest, char *String) switch(*String) { case '<': - CopyStringToBuffer(Dest, "<"); - String++; - break; + CopyStringToBuffer(Dest, "<"); + String++; + break; case '>': - CopyStringToBuffer(Dest, ">"); - String++; - break; + CopyStringToBuffer(Dest, ">"); + String++; + break; case '&': - CopyStringToBuffer(Dest, "&"); - String++; - break; + CopyStringToBuffer(Dest, "&"); + String++; + break; case '\"': - CopyStringToBuffer(Dest, """); - String += 2; - break; + CopyStringToBuffer(Dest, """); + String += 2; + break; case '\'': - CopyStringToBuffer(Dest, "'"); - String++; - break; + CopyStringToBuffer(Dest, "'"); + String++; + break; default: - *Dest->Ptr++ = *String++; - break; + *Dest->Ptr++ = *String++; + break; } } } @@ -316,7 +317,7 @@ StringsDifferT(char *A, // NOTE(matt): Null-terminated string ++i; } if((!Terminator && !A[i] && ALength == i) || - (!A[i] && ALength == i && (B[i] == Terminator))) + (!A[i] && ALength == i && (B[i] == Terminator))) { return FALSE; } @@ -337,7 +338,7 @@ hsl_colour CharToColour(char Char) { hsl_colour Colour; - + if(Char >= 'a' && Char <= 'z') { Colour.Hue = (((float)Char - 'a') / ('z' - 'a') * 360); @@ -358,7 +359,7 @@ CharToColour(char Char) Colour.Hue = 180; Colour.Saturation = 50; } - + return Colour; } @@ -368,14 +369,14 @@ StringToColourHash(hsl_colour *Colour, char *String) Colour->Hue = 0; Colour->Saturation = 0; Colour->Lightness = 26; - + int i; for(i = 0; String[i]; ++i) { Colour->Hue += CharToColour(String[i]).Hue; Colour->Saturation += CharToColour(String[i]).Saturation; } - + Colour->Hue = Colour->Hue % 360; Colour->Saturation = Colour->Saturation % 26 + 74; return(Colour); @@ -392,8 +393,8 @@ SanitisePunctuation(char *String) *Ptr = '_'; } if((*Ptr < '0' || *Ptr > '9') && - (*Ptr < 'a' || *Ptr > 'z') && - (*Ptr < 'A' || *Ptr > 'Z')) + (*Ptr < 'a' || *Ptr > 'z') && + (*Ptr < 'A' || *Ptr > 'Z')) { *Ptr = '-'; } @@ -403,97 +404,99 @@ SanitisePunctuation(char *String) } int -BuildCredits(buffer *CreditsMenu, buffer *HostInfo, buffer *AnnotatorInfo, bool *HasCreditsMenu, char *Host, char *Annotator) +BuildCredits(buffer *CreditsMenu, buffer *HostInfo, buffer *AnnotatorInfo, bool *HasCreditsMenu, char *ImagesDir, char *Host, char *Annotator) { // TODO(matt): Handle co-hosts and guests bool FoundHost = FALSE; bool FoundAnnotator = FALSE; - + for(int CredentialIndex = 0; CredentialIndex < ArrayCount(Credentials); ++CredentialIndex) { if(!StringsDiffer(Host, Credentials[CredentialIndex][0])) { FoundHost = TRUE; // TODO(matt): Check if this is actually necessary... CopyStringToBuffer(HostInfo, -" \n"); + " \n"); if(*Credentials[CredentialIndex][2]) { CopyStringToBuffer(HostInfo, -" \n" -"
Host
\n" -"
%s
\n" -"
\n", -Credentials[CredentialIndex][2], -Credentials[CredentialIndex][1]); + " \n" + "
Host
\n" + "
%s
\n" + "
\n", + Credentials[CredentialIndex][2], + Credentials[CredentialIndex][1]); } else { CopyStringToBuffer(HostInfo, -"
\n" -"
Host
\n" -"
%s
\n" -"
\n", -Credentials[CredentialIndex][1]); + "
\n" + "
Host
\n" + "
%s
\n" + "
\n", + Credentials[CredentialIndex][1]); } - + if(*Credentials[CredentialIndex][4] && *Credentials[CredentialIndex][3]) { - CopyStringToBuffer(HostInfo, -" \n", -Credentials[CredentialIndex][4], -Credentials[CredentialIndex][3]); + CopyStringToBuffer(HostInfo, + " \n", + Credentials[CredentialIndex][4], + ImagesDir, + Credentials[CredentialIndex][3]); } - + CopyStringToBuffer(HostInfo, -"
\n"); + "
\n"); } - + if(!StringsDiffer(Annotator, Credentials[CredentialIndex][0])) { FoundAnnotator = TRUE; // TODO(matt): Check if this is actually necessary... CopyStringToBuffer(AnnotatorInfo, -" \n"); + " \n"); if(*Credentials[CredentialIndex][2]) { CopyStringToBuffer(AnnotatorInfo, -" \n" -"
Annotator
\n" -"
%s
\n" -"
\n", -Credentials[CredentialIndex][2], -Credentials[CredentialIndex][1]); + " \n" + "
Annotator
\n" + "
%s
\n" + "
\n", + Credentials[CredentialIndex][2], + Credentials[CredentialIndex][1]); } else { CopyStringToBuffer(AnnotatorInfo, -"
\n" -"
Annotator
\n" -"
%s
\n" -"
\n", -Credentials[CredentialIndex][1]); + "
\n" + "
Annotator
\n" + "
%s
\n" + "
\n", + Credentials[CredentialIndex][1]); } - + if(*Credentials[CredentialIndex][4] && *Credentials[CredentialIndex][3]) { - CopyStringToBuffer(AnnotatorInfo, -" \n", -Credentials[CredentialIndex][4], -Credentials[CredentialIndex][3]); + CopyStringToBuffer(AnnotatorInfo, + " \n", + Credentials[CredentialIndex][4], + ImagesDir, + Credentials[CredentialIndex][3]); } - + CopyStringToBuffer(AnnotatorInfo, -"
\n"); + "
\n"); } } - + if(FoundHost || FoundAnnotator) { CopyStringToBuffer(CreditsMenu, -"
\n" -"
\n" -" Credits\n" -"
\n"); - + "
\n" + "
\n" + " Credits\n" + "
\n"); + if(FoundHost) { CopyBuffer(CreditsMenu, HostInfo); @@ -503,14 +506,14 @@ Credentials[CredentialIndex][3]); CopyBuffer(CreditsMenu, AnnotatorInfo); } CopyStringToBuffer(CreditsMenu, -"
\n" -"
\n"); + "
\n" + "
\n"); } else { return 1; } - + *HasCreditsMenu = TRUE; return 0; } @@ -584,7 +587,7 @@ BuildReference(ref_info *ReferencesArray, int RefIdentifier, int UniqueRefs, HMM { return 1; } - + CopyString(ReferencesArray[UniqueRefs].Identifier[ReferencesArray[UniqueRefs].IdentifierCount].Timecode, Anno.time); ReferencesArray[UniqueRefs].Identifier[ReferencesArray[UniqueRefs].IdentifierCount].Identifier = RefIdentifier; return 0; @@ -608,7 +611,7 @@ void BuildFilter(category_info *TopicsArray, int *UniqueTopics, category_info *MediaArray, int *UniqueMedia, char *Marker) { bool IsMedium = FALSE; - + int i = 0; for(i = 0; i < ArrayCount(CategoryMedium); ++i) { @@ -618,7 +621,7 @@ BuildFilter(category_info *TopicsArray, int *UniqueTopics, category_info *MediaA break; } } - + int Offset; if(IsMedium) { @@ -637,19 +640,19 @@ BuildFilter(category_info *TopicsArray, int *UniqueTopics, category_info *MediaA CopyString(MediaArray[k].Marker, MediaArray[k-1].Marker); CopyString(MediaArray[k].WrittenText, MediaArray[k-1].WrittenText); } - + CopyString(MediaArray[k].Marker, CategoryMedium[i][0]); CopyString(MediaArray[k].WrittenText, CategoryMedium[i][2]); break; } } - + if(j == *UniqueMedia) { CopyString(MediaArray[j].Marker, CategoryMedium[i][0]); CopyString(MediaArray[j].WrittenText, CategoryMedium[i][2]); } - + ++*UniqueMedia; return; } @@ -669,17 +672,17 @@ BuildFilter(category_info *TopicsArray, int *UniqueTopics, category_info *MediaA { CopyString(TopicsArray[j].Marker, TopicsArray[j-1].Marker); } - + CopyString(TopicsArray[j].Marker, Marker); break; } } - + if(i == *UniqueTopics) { CopyString(TopicsArray[i].Marker, Marker); } - + ++*UniqueTopics; return; } @@ -707,7 +710,7 @@ BuildCategories(buffer *AnnotationClass, buffer *Category, int *MarkerIndex, boo CopyStringToBuffer(Category, ""); *HasCategory = TRUE; } - + // NOTE(matt): Iterate through the Category->Location looking for "Marker", and bail if we find it char *Ptr = Category->Location; bool Found = FALSE; @@ -731,17 +734,17 @@ BuildCategories(buffer *AnnotationClass, buffer *Category, int *MarkerIndex, boo } ++Ptr; } - + if(Found == FALSE) { CopyStringToBuffer(Category, "
", - SanitisePunctuation(Marker), - SanitisePunctuation(Marker)); - + SanitisePunctuation(Marker), + SanitisePunctuation(Marker)); + CopyStringToBuffer(AnnotationClass, " cat_%s", - SanitisePunctuation(Marker)); + SanitisePunctuation(Marker)); } - + ++*MarkerIndex; return; } @@ -759,36 +762,31 @@ StringToInt(char *String) } int -BuildQuote(quote_info *Info, char *Speaker, int ID) +BuildQuote(quote_info *Info, char *Speaker, int ID, char *QuoteDir) { - // TODO(matt): Pull these paths from the config - // Also notable that there are different paths for different projects - - char *QuoteDir = "/home/matt/git/GitHub/insofaras/25fc16d58a297a486334"; - char Path[255] = {0}; sprintf(Path, "%s/#%s", QuoteDir, Speaker); FILE *File; if(!(File = fopen(Path, "r"))) { - perror("hmml_to_html"); + perror(Path); return 1; } - + fseek(File, 0, SEEK_END); int Length = ftell(File); fseek(File, 0, SEEK_SET); char *Buffer; if(!(Buffer = malloc(Length))) { - perror("hmml_to_html"); + perror("BuildQuote"); } fread(Buffer, Length, 1, File); fclose(File); - + // TODO(matt): Search the quote store in reverse char *InPtr = Buffer; - + while(InPtr - Buffer < Length) { char InID[4] = { 0 }; @@ -798,7 +796,7 @@ BuildQuote(quote_info *Info, char *Speaker, int ID) *OutPtr++ = *InPtr++; } *OutPtr = '\0'; - + if(StringToInt(InID) == ID) { InPtr += 2; @@ -808,7 +806,7 @@ BuildQuote(quote_info *Info, char *Speaker, int ID) *OutPtr++ = *InPtr++; } *OutPtr = '\0'; - + InPtr += 3; OutPtr = Info->Text; while(*InPtr != '\n') @@ -820,7 +818,7 @@ BuildQuote(quote_info *Info, char *Speaker, int ID) *OutPtr++ = *InPtr++; } *--OutPtr = '\0'; - + free(Buffer); return 0; } @@ -833,13 +831,13 @@ BuildQuote(quote_info *Info, char *Speaker, int ID) ++InPtr; } } - + free(Buffer); return 1; } void -GenerateTopicColours(buffer *Colour, char *Topic) +GenerateTopicColours(buffer *Colour, char *Topic, char *TopicsDir) { for(int i = 0; i < ArrayCount(CategoryMedium); ++i) { @@ -848,27 +846,29 @@ GenerateTopicColours(buffer *Colour, char *Topic) return; } } - + FILE *TopicsFile; char *TopicsBuffer; // TODO(matt): Consider (optionally) pulling this path from the config + char TopicsPath[255]; + CopyString(TopicsPath, "%s/cinera_topcs.css", TopicsDir); if((TopicsFile = fopen("cinera_topics.css", "a+"))) { fseek(TopicsFile, 0, SEEK_END); int TopicsLength = ftell(TopicsFile); fseek(TopicsFile, 0, SEEK_SET); - + // TODO(matt): May this not just ClaimBuffer (if I can figure out how)? if(!(TopicsBuffer = malloc(TopicsLength))) { perror("GenerateTopicColours"); return; } - + fread(TopicsBuffer, TopicsLength, 1, TopicsFile); - + char *TopicsPtr = TopicsBuffer; - + while(TopicsPtr - TopicsBuffer < TopicsLength) { TopicsPtr += StringLength(".category."); @@ -884,12 +884,12 @@ GenerateTopicColours(buffer *Colour, char *Topic) } ++TopicsPtr; } - + hsl_colour Colour; StringToColourHash(&Colour, Topic); fprintf(TopicsFile, ".category.%s { border: 1px solid hsl(%d, %d%%, %d%%); background: hsl(%d, %d%%, %d%%); }\n", - SanitisePunctuation(Topic), Colour.Hue, Colour.Saturation, Colour.Lightness, Colour.Hue, Colour.Saturation, Colour.Lightness); - + SanitisePunctuation(Topic), Colour.Hue, Colour.Saturation, Colour.Lightness, Colour.Hue, Colour.Saturation, Colour.Lightness); + fclose(TopicsFile); free(TopicsBuffer); } @@ -925,7 +925,7 @@ ParseConfig(buffer *Buffer, char *Username) Essentially, I want to pass a Username to this, and have it write the credentials into the Config buffer Let's start by just grabbing the stuff and printing it out */ - + // TODO(matt): Actually figure out the "standard" config location char Config_Location[255]; if(getenv("XDG_CONFIG_HOME")) @@ -941,32 +941,32 @@ ParseConfig(buffer *Buffer, char *Username) fprintf(stderr, "Config file location not set"); return 1; } - + FILE *InFile; if(!(InFile = fopen(Config_Location, "r"))) { perror(Config_Location); return 2; } - + printf("Reading: %s\n", Config_Location); - + fseek(InFile, 0, SEEK_END); int InSize = ftell(InFile); fseek(InFile, 0, SEEK_SET); - + char *InBuffer; //config Config = { 0 }; - + if(!(InBuffer = malloc(InSize))) { perror("ParseConfig"); return 3; } - + fread(InBuffer, InSize, 1, InFile); fclose(InFile); - + char *InPtr = InBuffer; char OutBuffer[256]; //char *OutPtr = Config.Credentials.Display_Name; @@ -974,75 +974,134 @@ ParseConfig(buffer *Buffer, char *Username) bool Quoted = FALSE; bool FoundCredentials, ParsingUsername = FALSE; unsigned int ScopeDepth = 0; - + while(InPtr - InBuffer < InSize) { switch(*InPtr) { case '#': + { + if(!Quoted) { - if(!Quoted) + printf(" We are commenting\n"); + while(InPtr - InBuffer < InSize && *InPtr != '\n') { - printf(" We are commenting\n"); - while(InPtr - InBuffer < InSize && *InPtr != '\n') - { - ++InPtr; - } ++InPtr; - while(InPtr - InBuffer < InSize && (*InPtr == ' ' || *InPtr == '\n')) - { - ++InPtr; - } } - else + ++InPtr; + while(InPtr - InBuffer < InSize && (*InPtr == ' ' || *InPtr == '\n')) { - *OutPtr++ = *InPtr++; + ++InPtr; } - break; } + else + { + *OutPtr++ = *InPtr++; + } + break; + } case '{': + { + if(!Quoted) { - if(!Quoted) + ++ScopeDepth; + ++InPtr; + while(*InPtr == '\n' || *InPtr == ' ') { - ++ScopeDepth; ++InPtr; - while(*InPtr == '\n' || *InPtr == ' ') - { - ++InPtr; - } - printf(" We have entered a scope\n"); } - else - { - *OutPtr++ = *InPtr++; - } - break; + printf(" We have entered a scope\n"); } + else + { + *OutPtr++ = *InPtr++; + } + break; + } case '}': + { + if(!Quoted) { - if(!Quoted) - { - --ScopeDepth; - ++InPtr; - printf(" We have left a scope\n"); - } - else - { - *OutPtr++ = *InPtr++; - } - break; + --ScopeDepth; + ++InPtr; + printf(" We have left a scope\n"); } + else + { + *OutPtr++ = *InPtr++; + } + break; + } #if 1 case ' ': + { + if(!Quoted) { - if(!Quoted) + ++InPtr; + *OutPtr = '\0'; + OutPtr = OutBuffer; + printf("%s\n", OutBuffer); + + // TODO(matt): Switch on the OutBuffer? I have a feeling that isn't actually possible, though + if(!StringsDiffer("credentials", OutBuffer)) + { + FoundCredentials = TRUE; + printf(" We have found the credentials block\n"); + } + if(ParsingUsername) + { + printf(" The username is %s\n", OutBuffer); + ParsingUsername = FALSE; + } + if(FoundCredentials && (!StringsDiffer("username", OutBuffer))) + { + ParsingUsername = TRUE; + printf(" We have found the username\n"); + } + } + else + { + *OutPtr++ = *InPtr++; + } + break; + } +#endif + case '"': + { + if(!Quoted) + { + Quoted = TRUE; + printf(" We are quoting!\n"); + } + else + { + Quoted = FALSE; + printf(" We are no longer quoting!\n"); + } + ++InPtr; + break; + } + case ';': + { + if(!Quoted) + { + printf(" We have reached the end of a setting\n"); + ++InPtr; + } + else + { + *OutPtr++ = *InPtr++; + } + } + case '\n': + { + if(!Quoted) + { + if(InPtr - InBuffer < InSize) { - ++InPtr; *OutPtr = '\0'; OutPtr = OutBuffer; - printf("%s\n", OutBuffer); - - // TODO(matt): Switch on the OutBuffer? I have a feeling that isn't actually possible, though + // TODO(matt) if(!StringsDiffer("credentials", OutBuffer)) { FoundCredentials = TRUE; @@ -1058,93 +1117,34 @@ ParseConfig(buffer *Buffer, char *Username) ParsingUsername = TRUE; printf(" We have found the username\n"); } - } - else - { - *OutPtr++ = *InPtr++; - } - break; - } -#endif - case '"': - { - if(!Quoted) - { - Quoted = TRUE; - printf(" We are quoting!\n"); - } - else - { - Quoted = FALSE; - printf(" We are no longer quoting!\n"); - } - ++InPtr; - break; - } - case ';': - { - if(!Quoted) - { - printf(" We have reached the end of a setting\n"); + printf("%s\n", OutBuffer); ++InPtr; - } - else - { - *OutPtr++ = *InPtr++; - } - } - case '\n': - { - if(!Quoted) - { - if(InPtr - InBuffer < InSize) + while(InPtr - InBuffer < InSize && *InPtr == ' ') // NOTE(matt): Skip indentation whitespace { - *OutPtr = '\0'; - OutPtr = OutBuffer; - // TODO(matt) - if(!StringsDiffer("credentials", OutBuffer)) - { - FoundCredentials = TRUE; - printf(" We have found the credentials block\n"); - } - if(ParsingUsername) - { - printf(" The username is %s\n", OutBuffer); - ParsingUsername = FALSE; - } - if(FoundCredentials && (!StringsDiffer("username", OutBuffer))) - { - ParsingUsername = TRUE; - printf(" We have found the username\n"); - } - printf("%s\n", OutBuffer); ++InPtr; - while(InPtr - InBuffer < InSize && *InPtr == ' ') // NOTE(matt): Skip indentation whitespace - { - ++InPtr; - } } } - else - { - *OutPtr++ = *InPtr++; - } - - if(InPtr - InBuffer == InSize) - { - printf(" We have reached the EOF\n"); - } - break; } - default: + else { *OutPtr++ = *InPtr++; - break; } + + if(InPtr - InBuffer == InSize) + { + printf(" We have reached the EOF\n"); + } + break; + } + default: + { + *OutPtr++ = *InPtr++; + break; + } } } - - + + #if 0 while(InPtr - InBuffer < InSize) { @@ -1156,25 +1156,137 @@ ParseConfig(buffer *Buffer, char *Username) printf("%s\n", Config.Credentials.Display_Name); } #endif - + free(InBuffer); - + // Reading from the config file, parsing it inline (on the stack) and writing into the buffer *Config - + return 0; } #endif +void +PrintUsage(char *BinaryLocation, char *DefaultCSSDir, char *DefaultImagesDir, char *DefaultJSDir, char *DefaultOutLocation, char *DefaultQuoteDir, char *DefaultTemplateLocation) +{ + fprintf(stderr, "Usage: %s [option(s)] filename(s)\n" + "\n" + "Options:\n" + " -c \n" + " Override default CSS directory (\"%s\")\n" + " -i \n" + " Override default images directory (\"%s\")\n" + " -j \n" + " Override default JS directory (\"%s\")\n" + " -o \n" + " Override default output location (\"%s\")\n" + " -q \n" + " Override default quotes directory (\"%s\")\n" + " -t