hmml_to_html.c: Beginning Integration [#25]

This commit is contained in:
Matt Mascarenhas 2017-06-12 23:26:01 +01:00
parent 280102869b
commit 0ad47c6c48
1 changed files with 182 additions and 33 deletions

View File

@ -305,7 +305,8 @@ StringsDifferL(char *A, char *B, int LengthofA)
{ {
++i; ++i;
} }
if(!A[i] && LengthofA == i && (B[i] == ' ' || B[i] == '\"')) // TODO(matt): Uncomment
if(!A[i] && LengthofA == i)// && (B[i] == ' ' || B[i] == '\"'))
{ {
return FALSE; return FALSE;
} }
@ -1186,6 +1187,7 @@ main(int ArgC, char **Args)
// NOTE(matt): Tree structure of buffer dependencies // NOTE(matt): Tree structure of buffer dependencies
// Master // Master
// Header
// Title // Title
// QuoteMenu // QuoteMenu
// ReferenceMenu // ReferenceMenu
@ -1204,6 +1206,7 @@ main(int ArgC, char **Args)
// FilterState // FilterState
buffer Master; buffer Master;
buffer Header;
buffer Title; buffer Title;
buffer QuoteMenu; buffer QuoteMenu;
@ -1248,6 +1251,7 @@ main(int ArgC, char **Args)
{ {
// NOTE(matt): Tree structure of "global" buffer dependencies // NOTE(matt): Tree structure of "global" buffer dependencies
// Master // Master
// Header
// Title // Title
// QuoteMenu // QuoteMenu
// ReferenceMenu // ReferenceMenu
@ -1262,6 +1266,7 @@ main(int ArgC, char **Args)
// FilterState // FilterState
ClaimBuffer(MemoryArena, &ClaimedMemory, &Master, "Master", Kilobytes(512)); ClaimBuffer(MemoryArena, &ClaimedMemory, &Master, "Master", Kilobytes(512));
ClaimBuffer(MemoryArena, &ClaimedMemory, &Header, "Header", Kilobytes(1));
ClaimBuffer(MemoryArena, &ClaimedMemory, &Title, "Title", Kilobytes(16)); ClaimBuffer(MemoryArena, &ClaimedMemory, &Title, "Title", Kilobytes(16));
ClaimBuffer(MemoryArena, &ClaimedMemory, &QuoteMenu, "QuoteMenu", Kilobytes(16)); ClaimBuffer(MemoryArena, &ClaimedMemory, &QuoteMenu, "QuoteMenu", Kilobytes(16));
@ -2161,18 +2166,12 @@ CategoryMedium[j][2]
" </div>\n" " </div>\n"
" </div>\n"); " </div>\n");
//NOTE(matt): Collate the buffers! // TODO(matt): Maybe do something about indentation levels
#if DEBUG CopyStringToBuffer(&Header,
printf("Buffer Collation\n\n"); "<meta charset=\"UTF-8\">\n"
#endif
CopyStringToBuffer(&Master,
"<html>\n"
" <head>\n"
" <meta charset=\"UTF-8\">\n"
" <title>"); " <title>");
CopyStringToBufferHTMLSafe(&Master, HMML.metadata.title); CopyStringToBufferHTMLSafe(&Header, HMML.metadata.title);
CopyStringToBuffer(&Master, "</title>\n" // TODO(matt): Add the full name of the project, parsed from a config CopyStringToBuffer(&Header, "</title>\n" // TODO(matt): Add the full name of the project, parsed from a config
"\n" "\n"
" <!-- Load the player -->\n" " <!-- Load the player -->\n"
" <script type=\"text/javascript\" src=\"player.js\"></script>\n" " <script type=\"text/javascript\" src=\"player.js\"></script>\n"
@ -2371,12 +2370,176 @@ HMML.metadata.project);
" setDotLightness(topicDots[i]);\n" " setDotLightness(topicDots[i]);\n"
"}\n" "}\n"
" </script>\n"); " </script>\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 = "<!-- __CINERA_HEADER__ -->";
char *TitleTag = "<!-- __CINERA_TITLE__ -->";
char *PlayerTag = "<!-- __CINERA_PLAYER__ -->";
char *ScriptTag = "<!-- __CINERA_SCRIPT__ -->";
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,
"<html>\n"
" <head>\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,
" </body>\n"
"</html>\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 // NOTE(matt): Tree structure of "global" buffer dependencies
// FilterState // FilterState
@ -2393,6 +2556,7 @@ HMML.metadata.project);
// ReferenceMenu // ReferenceMenu
// QuoteMenu // QuoteMenu
// Title // Title
// Header
DeclaimBuffer(&FilterState, &ClaimedMemory); DeclaimBuffer(&FilterState, &ClaimedMemory);
DeclaimBuffer(&Script, &ClaimedMemory); DeclaimBuffer(&Script, &ClaimedMemory);
@ -2410,22 +2574,7 @@ HMML.metadata.project);
DeclaimBuffer(&QuoteMenu, &ClaimedMemory); DeclaimBuffer(&QuoteMenu, &ClaimedMemory);
DeclaimBuffer(&Title, &ClaimedMemory); DeclaimBuffer(&Title, &ClaimedMemory);
CopyStringToBuffer(&Master, DeclaimBuffer(&Header, &ClaimedMemory);
" </body>\n"
"</html>\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);
} }
else else
{ {