diff --git a/hmml_to_html/hmml_to_html.c b/hmml_to_html/hmml_to_html.c index 3177292..7e369b0 100644 --- a/hmml_to_html/hmml_to_html.c +++ b/hmml_to_html/hmml_to_html.c @@ -305,7 +305,8 @@ StringsDifferL(char *A, char *B, int LengthofA) { ++i; } - if(!A[i] && LengthofA == i && (B[i] == ' ' || B[i] == '\"')) + // TODO(matt): Uncomment + if(!A[i] && LengthofA == i)// && (B[i] == ' ' || B[i] == '\"')) { return FALSE; } @@ -1186,6 +1187,7 @@ main(int ArgC, char **Args) // NOTE(matt): Tree structure of buffer dependencies // Master + // Header // Title // QuoteMenu // ReferenceMenu @@ -1204,6 +1206,7 @@ main(int ArgC, char **Args) // FilterState buffer Master; + buffer Header; buffer Title; buffer QuoteMenu; @@ -1248,6 +1251,7 @@ main(int ArgC, char **Args) { // NOTE(matt): Tree structure of "global" buffer dependencies // Master + // Header // Title // QuoteMenu // ReferenceMenu @@ -1262,6 +1266,7 @@ main(int ArgC, char **Args) // FilterState ClaimBuffer(MemoryArena, &ClaimedMemory, &Master, "Master", Kilobytes(512)); + ClaimBuffer(MemoryArena, &ClaimedMemory, &Header, "Header", Kilobytes(1)); ClaimBuffer(MemoryArena, &ClaimedMemory, &Title, "Title", Kilobytes(16)); ClaimBuffer(MemoryArena, &ClaimedMemory, &QuoteMenu, "QuoteMenu", Kilobytes(16)); @@ -2161,18 +2166,12 @@ CategoryMedium[j][2] " \n" " \n"); - //NOTE(matt): Collate the buffers! -#if DEBUG - printf("Buffer Collation\n\n"); -#endif - - CopyStringToBuffer(&Master, -"\n" -" \n" -" \n" + // TODO(matt): Maybe do something about indentation levels + CopyStringToBuffer(&Header, +"\n" " "); - CopyStringToBufferHTMLSafe(&Master, HMML.metadata.title); - CopyStringToBuffer(&Master, "\n" // TODO(matt): Add the full name of the project, parsed from a config + CopyStringToBufferHTMLSafe(&Header, HMML.metadata.title); + CopyStringToBuffer(&Header, "\n" // TODO(matt): Add the full name of the project, parsed from a config "\n" " \n" " \n" @@ -2371,12 +2370,176 @@ HMML.metadata.project); " setDotLightness(topicDots[i]);\n" "}\n" " \n"); - - //NOTE(matt): Here is where we do all our CopyBuffer() calls - CopyBuffer(&Master, &Title); - CopyBuffer(&Master, &Player); - CopyBuffer(&Master, &Script); // + //NOTE(matt): Collate the buffers! +#if DEBUG + printf("Buffer Collation\n\n"); +#endif + + char *CINERA_MODE = getenv("CINERA_MODE"); + if(CINERA_MODE && !StringsDiffer(CINERA_MODE, "INTEGRATE")) + { + FILE *TemplateFile; + if(!(TemplateFile = fopen("template.html", "r"))) + { + perror(Args[0]); + hmml_free(&HMML); + free(MemoryArena); + return 1; + } + + fseek(TemplateFile, 0, SEEK_END); + int TemplateSize = ftell(TemplateFile); + fseek(TemplateFile, 0, SEEK_SET); + char *TemplateBuffer; + if(!(TemplateBuffer = malloc(TemplateSize))) + { + perror(Args[0]); + hmml_free(&HMML); + free(MemoryArena); + return 1; + } + fread(TemplateBuffer, TemplateSize, 1, TemplateFile); + fclose(TemplateFile); + + char *OutputBuffer; + if(!(OutputBuffer = malloc(TemplateSize + Master.Size))) + { + perror(Args[0]); + hmml_free(&HMML); + free(MemoryArena); + return 1; + } + + char *TemplatePtr = TemplateBuffer; + char *OutputPtr = OutputBuffer; + + char *HeaderTag = ""; + char *TitleTag = ""; + char *PlayerTag = ""; + char *ScriptTag = ""; + + bool FoundHeader = FALSE; + bool FoundTitle = FALSE; + bool FoundPlayer = FALSE; + bool FoundScript = FALSE; + + while(TemplatePtr - TemplateBuffer < TemplateSize) + { + if(*TemplatePtr == '!') + { + if(OutputPtr > OutputBuffer) + { + --OutputPtr; + } + if(TemplatePtr > TemplateBuffer) + { + --TemplatePtr; + } + + if(!(StringsDifferL(HeaderTag, TemplatePtr, StringLength(HeaderTag)))) + { + FoundHeader = TRUE; + CopyStringNoFormat(OutputPtr, Header.Location); + OutputPtr += Header.Ptr - Header.Location; + } + else if(!(StringsDifferL(TitleTag, TemplatePtr, StringLength(TitleTag)))) + { + FoundTitle = TRUE; + CopyStringNoFormat(OutputPtr, Title.Location); + OutputPtr += Title.Ptr - Title.Location; + } + else if(!(StringsDifferL(PlayerTag, TemplatePtr, StringLength(PlayerTag)))) + { + FoundPlayer = TRUE; + CopyStringNoFormat(OutputPtr, Player.Location); + OutputPtr += Player.Ptr - Player.Location; + } + else if(!(StringsDifferL(ScriptTag, TemplatePtr, StringLength(ScriptTag)))) + { + FoundScript = TRUE; + CopyStringNoFormat(OutputPtr, Script.Location); + OutputPtr += Script.Ptr - Script.Location; + } + else + { + ++OutputPtr; + *OutputPtr++ = '!'; + } + + while(TemplatePtr - TemplateBuffer < TemplateSize && *TemplatePtr != '>') + { + ++TemplatePtr; + } + if(TemplatePtr - TemplateBuffer < TemplateSize) + { + ++TemplatePtr; + } + } + else + { + *OutputPtr++ = *TemplatePtr++; + } + } + + if(FoundHeader && FoundTitle && FoundPlayer && FoundScript) + { + FILE *OutFile; + if(!(OutFile = fopen("out_integrated.html", "w"))) + { + perror(Args[0]); + hmml_free(&HMML); + free(MemoryArena); + return 1; + } + fwrite(OutputBuffer, OutputPtr - OutputBuffer, 1, OutFile); + fclose(OutFile); + } + else + { + fprintf(stderr, "Template is missing necessary tags\n"); + free(TemplateBuffer); + free(OutputBuffer); + hmml_free(&HMML); + free(MemoryArena); + return 1; + } + + free(TemplateBuffer); + free(OutputBuffer); + } + else + { + // NOTE(matt): Perform the normal collation into Master, and write-out to out.html + CopyStringToBuffer(&Master, +"\n" +" \n"); + + //NOTE(matt): Here is where we do all our CopyBuffer() calls + CopyBuffer(&Master, &Header); + CopyBuffer(&Master, &Title); + CopyBuffer(&Master, &Player); + CopyBuffer(&Master, &Script); + // + + CopyStringToBuffer(&Master, + " \n" + "\n"); + + FILE *OutFile; + if(!(OutFile = fopen("out.html", "w"))) + { + perror(Args[0]); + hmml_free(&HMML); + free(MemoryArena); + return 1; + } + fwrite(Master.Location, Master.Ptr - Master.Location, 1, OutFile); + fclose(OutFile); + } + + DeclaimBuffer(&Master, &ClaimedMemory); + // NOTE(matt): Tree structure of "global" buffer dependencies // FilterState @@ -2393,6 +2556,7 @@ HMML.metadata.project); // ReferenceMenu // QuoteMenu // Title + // Header DeclaimBuffer(&FilterState, &ClaimedMemory); DeclaimBuffer(&Script, &ClaimedMemory); @@ -2410,22 +2574,7 @@ HMML.metadata.project); DeclaimBuffer(&QuoteMenu, &ClaimedMemory); DeclaimBuffer(&Title, &ClaimedMemory); - CopyStringToBuffer(&Master, -" \n" -"\n"); - - FILE *OutFile; - if(!(OutFile = fopen("out.html", "w"))) - { - perror(Args[0]); - hmml_free(&HMML); - free(MemoryArena); - return 1; - } - fwrite(Master.Location, Master.Ptr - Master.Location, 1, OutFile); - fclose(OutFile); - - DeclaimBuffer(&Master, &ClaimedMemory); + DeclaimBuffer(&Header, &ClaimedMemory); } else {