hmml_to_html.c: Category styling

Also upgrade hmml.a for lower-cased markers
This commit is contained in:
Matt Mascarenhas 2017-03-25 02:07:55 +00:00
parent 769c79b0af
commit 30df421b9e
2 changed files with 148 additions and 11 deletions

Binary file not shown.

View File

@ -1,6 +1,7 @@
#if 0
ctime -begin ${0%.*}.ctm
clang -g -Wall -Wno-unused-variable -fsanitize=address -std=c99 $0 -o ${0%.*} hmml.a
#gcc -g -Wall -Wno-unused-variable -fsanitize=address -std=c99 $0 -o ${0%.*} hmml.a
gcc -g -Wall -fsanitize=address -std=c99 $0 -o ${0%.*} hmml.a
ctime -end ${0%.*}.ctm
exit
#endif
@ -28,6 +29,8 @@ typedef struct
char *RefTitle;
} ref_info;
#define ArrayCount(A) sizeof(A)/sizeof(*(A))
void
ClaimBuffer(char *MemoryArena, int *ClaimedMemory, buffer *Buffer, int Size)
{
@ -158,6 +161,48 @@ StringToColourHash(char *String)
return Result / i;
}
int
StringLength(char *String)
{
int i = 0;
while(String[i])
{
++i;
}
return i;
}
char *
SanitisePunctuation(char *String)
{
char *Ptr = String;
while(*Ptr)
{
if(*Ptr == ' ')
{
*Ptr = '_';
}
if((*Ptr < '0' || *Ptr > '9') &&
(*Ptr < 'a' || *Ptr > 'z') &&
(*Ptr < 'A' || *Ptr > 'Z'))
{
*Ptr = '-';
}
++Ptr;
}
return String;
}
char *CategoryMedium[] =
{
"blackboard",
"Blackboard",
"research",
"Research",
"run",
"Run",
};
int
main(int ArgC, char **Args)
{
@ -224,6 +269,7 @@ main(int ArgC, char **Args)
for(int AnnotationIndex = 0; AnnotationIndex < HMML.annotation_count; ++AnnotationIndex)
{
bool HasCategory = FALSE;
ClaimBuffer(MemoryArena, &ClaimedMemory, &AnnotationHeader, 256);
ClaimBuffer(MemoryArena, &ClaimedMemory, &AnnotationClass, 128);
ClaimBuffer(MemoryArena, &ClaimedMemory, &Text, 1024 * 4);
@ -235,7 +281,6 @@ TimecodeToSeconds(HMML.annotations[AnnotationIndex].time));
CopyStringToBuffer(&AnnotationClass,
" class=\"marker");
#if 0
if(HMML.annotations[AnnotationIndex].author)
{
CopyStringToBuffer(&AnnotationClass, " authored");
@ -244,18 +289,102 @@ TimecodeToSeconds(HMML.annotations[AnnotationIndex].time));
StringToColourHash(HMML.annotations[AnnotationIndex].author),
HMML.annotations[AnnotationIndex].author);
}
#endif
InPtr = HMML.annotations[AnnotationIndex].text;
int MarkerIndex = 0, RefIndex = 0;
while(*InPtr)
{
if(MarkerIndex < HMML.annotations[AnnotationIndex].marker_count &&
InPtr - HMML.annotations[AnnotationIndex].text == HMML.annotations[AnnotationIndex].markers[MarkerIndex].offset)
{
char *Readable = HMML.annotations[AnnotationIndex].markers[MarkerIndex].parameter
? HMML.annotations[AnnotationIndex].markers[MarkerIndex].parameter
: HMML.annotations[AnnotationIndex].markers[MarkerIndex].marker;
if(HMML.annotations[AnnotationIndex].markers[MarkerIndex].type == HMML_MEMBER)
{
CopyStringToBuffer(&Text,
"<a href=\"https://handmade.network/m/%s\" target=\"blank\" style=\"color: #%X; text-decoration: none\">%s</a>",
HMML.annotations[AnnotationIndex].markers[MarkerIndex].marker,
StringToColourHash(HMML.annotations[AnnotationIndex].markers[MarkerIndex].marker),
Readable);
InPtr += StringLength(Readable);
}
else if(HMML.annotations[AnnotationIndex].markers[MarkerIndex].type == HMML_PROJECT)
{
CopyStringToBuffer(&Text,
"<a href=\"https://%s.handmade.network/\" target=\"blank\" style=\"color: #%X; text-decoration: none\">%s</a>",
HMML.annotations[AnnotationIndex].markers[MarkerIndex].marker,
StringToColourHash(HMML.annotations[AnnotationIndex].markers[MarkerIndex].marker),
Readable);
InPtr += StringLength(Readable);
}
else if(HMML.annotations[AnnotationIndex].markers[MarkerIndex].type == HMML_CATEGORY)
{
for(int i = 0; i < ArrayCount(CategoryMedium); ++i)
{
if(!StringsDiffer(CategoryMedium[i], HMML.annotations[AnnotationIndex].markers[MarkerIndex].marker))
{
CopyStringToBuffer(&AnnotationClass, " %s", SanitisePunctuation(HMML.annotations[AnnotationIndex].markers[MarkerIndex].marker));
goto NextCategory;
}
}
if(!HasCategory)
{
ClaimBuffer(MemoryArena, &ClaimedMemory, &Category, 256);
CopyStringToBuffer(&Category, "<span class=\"categories\"><div class=\"category %s\"></div>",
SanitisePunctuation(HMML.annotations[AnnotationIndex].markers[MarkerIndex].marker));
HasCategory = TRUE;
}
else
{
CopyStringToBuffer(&Category, "<div class=\"category %s\"></div>",
SanitisePunctuation(HMML.annotations[AnnotationIndex].markers[MarkerIndex].marker));
}
CopyStringToBuffer(&AnnotationClass, " cat_%s",
SanitisePunctuation(HMML.annotations[AnnotationIndex].markers[MarkerIndex].marker));
}
NextCategory: ++MarkerIndex;
}
if(RefIndex < HMML.annotations[AnnotationIndex].reference_count &&
InPtr - HMML.annotations[AnnotationIndex].text == HMML.annotations[AnnotationIndex].references[RefIndex].offset)
{
++RefIndex;
}
if(*InPtr)
{
*Text.Ptr++ = *InPtr++;
}
}
//TODO(matt): Replace this CopyStringToBuffer() with real stuff!
CopyStringToBuffer(&Text, HMML.annotations[AnnotationIndex].text);
while(MarkerIndex < HMML.annotations[AnnotationIndex].marker_count)
{
for(int i = 0; i < ArrayCount(CategoryMedium); ++i)
{
if(!StringsDiffer(CategoryMedium[i], HMML.annotations[AnnotationIndex].markers[MarkerIndex].marker))
{
CopyStringToBuffer(&AnnotationClass, " %s", SanitisePunctuation(HMML.annotations[AnnotationIndex].markers[MarkerIndex].marker));
goto NextCategoryInNode;
}
}
if(!HasCategory)
{
ClaimBuffer(MemoryArena, &ClaimedMemory, &Category, 256);
CopyStringToBuffer(&Category, "<span class=\"categories\"><div class=\"category %s\"></div>",
SanitisePunctuation(HMML.annotations[AnnotationIndex].markers[MarkerIndex].marker));
HasCategory = TRUE;
}
else
{
CopyStringToBuffer(&Category, "<div class=\"category %s\"></div>",
SanitisePunctuation(HMML.annotations[AnnotationIndex].markers[MarkerIndex].marker));
}
CopyStringToBuffer(&AnnotationClass, " cat_%s",
SanitisePunctuation(HMML.annotations[AnnotationIndex].markers[MarkerIndex].marker));
NextCategoryInNode: ++MarkerIndex;
}
CopyStringToBuffer(&AnnotationClass, "\"");
CopyBuffer(&AnnotationClass, &AnnotationHeader);
@ -268,6 +397,14 @@ HMML.annotations[AnnotationIndex].author);
" <div class=\"content\"><span class=\"timecode\">%s</span>",
HMML.annotations[AnnotationIndex].time);
if(HasCategory)
{
CopyStringToBuffer(&Category, "</span>");
CopyBuffer(&Category, &Text);
}
*Text.Ptr = '\0';
CopyBuffer(&Text, &Annotation);
CopyStringToBuffer(&Annotation, "</div>\n"
@ -309,7 +446,7 @@ HMML.annotations[AnnotationIndex].time);
ClaimBuffer(MemoryArena, &ClaimedMemory, &Master, 1024 * 512);
CopyStringToBuffer(&Master,
"<!DOCTYPE html>\n"
"<html>\n"
" <head>\n"
" <meta charset=\"UTF-8\">\n"
"\n"