diff --git a/cinera/cinera.c b/cinera/cinera.c index 2d43b68..a6255ee 100644 --- a/cinera/cinera.c +++ b/cinera/cinera.c @@ -14,7 +14,7 @@ typedef struct version CINERA_APP_VERSION = { .Major = 0, .Minor = 5, - .Patch = 24 + .Patch = 25 }; // TODO(matt): Copy in the DB 3 stuff from cinera_working.c @@ -1360,19 +1360,19 @@ InsertCategory(categories *GlobalTopics, categories *LocalTopics, categories *Gl } } - int CategoryIndex; if(IsMedium) { - for(CategoryIndex = 0; CategoryIndex < LocalMedia->Count; ++CategoryIndex) + int MediumIndex; + for(MediumIndex = 0; MediumIndex < LocalMedia->Count; ++MediumIndex) { - if(!StringsDiffer(CategoryMedium[CategoryMediumIndex].Medium, LocalMedia->Category[CategoryIndex].Marker)) + if(!StringsDiffer(CategoryMedium[CategoryMediumIndex].Medium, LocalMedia->Category[MediumIndex].Marker)) { return; } - if((StringsDiffer(CategoryMedium[CategoryMediumIndex].WrittenName, LocalMedia->Category[CategoryIndex].WrittenText)) < 0) + if((StringsDiffer(CategoryMedium[CategoryMediumIndex].WrittenName, LocalMedia->Category[MediumIndex].WrittenText)) < 0) { int CategoryCount; - for(CategoryCount = LocalMedia->Count; CategoryCount > CategoryIndex; --CategoryCount) + for(CategoryCount = LocalMedia->Count; CategoryCount > MediumIndex; --CategoryCount) { CopyString(LocalMedia->Category[CategoryCount].Marker, LocalMedia->Category[CategoryCount-1].Marker); CopyString(LocalMedia->Category[CategoryCount].WrittenText, LocalMedia->Category[CategoryCount-1].WrittenText); @@ -1384,24 +1384,24 @@ InsertCategory(categories *GlobalTopics, categories *LocalTopics, categories *Gl } } - if(CategoryIndex == LocalMedia->Count) + if(MediumIndex == LocalMedia->Count) { - CopyString(LocalMedia->Category[CategoryIndex].Marker, CategoryMedium[CategoryMediumIndex].Medium); - CopyString(LocalMedia->Category[CategoryIndex].WrittenText, CategoryMedium[CategoryMediumIndex].WrittenName); + CopyString(LocalMedia->Category[MediumIndex].Marker, CategoryMedium[CategoryMediumIndex].Medium); + CopyString(LocalMedia->Category[MediumIndex].WrittenText, CategoryMedium[CategoryMediumIndex].WrittenName); } ++LocalMedia->Count; - for(CategoryIndex = 0; CategoryIndex < GlobalMedia->Count; ++CategoryIndex) + for(MediumIndex = 0; MediumIndex < GlobalMedia->Count; ++MediumIndex) { - if(!StringsDiffer(CategoryMedium[CategoryMediumIndex].Medium, GlobalMedia->Category[CategoryIndex].Marker)) + if(!StringsDiffer(CategoryMedium[CategoryMediumIndex].Medium, GlobalMedia->Category[MediumIndex].Marker)) { return; } - if((StringsDiffer(CategoryMedium[CategoryMediumIndex].WrittenName, GlobalMedia->Category[CategoryIndex].WrittenText)) < 0) + if((StringsDiffer(CategoryMedium[CategoryMediumIndex].WrittenName, GlobalMedia->Category[MediumIndex].WrittenText)) < 0) { int CategoryCount; - for(CategoryCount = GlobalMedia->Count; CategoryCount > CategoryIndex; --CategoryCount) + for(CategoryCount = GlobalMedia->Count; CategoryCount > MediumIndex; --CategoryCount) { CopyString(GlobalMedia->Category[CategoryCount].Marker, GlobalMedia->Category[CategoryCount-1].Marker); CopyString(GlobalMedia->Category[CategoryCount].WrittenText, GlobalMedia->Category[CategoryCount-1].WrittenText); @@ -1413,26 +1413,27 @@ InsertCategory(categories *GlobalTopics, categories *LocalTopics, categories *Gl } } - if(CategoryIndex == GlobalMedia->Count) + if(MediumIndex == GlobalMedia->Count) { - CopyString(GlobalMedia->Category[CategoryIndex].Marker, CategoryMedium[CategoryMediumIndex].Medium); - CopyString(GlobalMedia->Category[CategoryIndex].WrittenText, CategoryMedium[CategoryMediumIndex].WrittenName); + CopyString(GlobalMedia->Category[MediumIndex].Marker, CategoryMedium[CategoryMediumIndex].Medium); + CopyString(GlobalMedia->Category[MediumIndex].WrittenText, CategoryMedium[CategoryMediumIndex].WrittenName); } ++GlobalMedia->Count; } else { - for(CategoryIndex = 0; CategoryIndex < LocalTopics->Count; ++CategoryIndex) + int TopicIndex; + for(TopicIndex = 0; TopicIndex < LocalTopics->Count; ++TopicIndex) { - if(!StringsDiffer(Marker, LocalTopics->Category[CategoryIndex].Marker)) + if(!StringsDiffer(Marker, LocalTopics->Category[TopicIndex].Marker)) { return; } - if((StringsDiffer(Marker, LocalTopics->Category[CategoryIndex].Marker)) < 0) + if((StringsDiffer(Marker, LocalTopics->Category[TopicIndex].Marker)) < 0) { int CategoryCount; - for(CategoryCount = LocalTopics->Count; CategoryCount > CategoryIndex; --CategoryCount) + for(CategoryCount = LocalTopics->Count; CategoryCount > TopicIndex; --CategoryCount) { CopyString(LocalTopics->Category[CategoryCount].Marker, LocalTopics->Category[CategoryCount-1].Marker); } @@ -1442,35 +1443,40 @@ InsertCategory(categories *GlobalTopics, categories *LocalTopics, categories *Gl } } - if(CategoryIndex == LocalTopics->Count) + if(TopicIndex == LocalTopics->Count) { - CopyString(LocalTopics->Category[CategoryIndex].Marker, Marker); + CopyString(LocalTopics->Category[TopicIndex].Marker, Marker); } ++LocalTopics->Count; - for(CategoryIndex = 0; CategoryIndex < GlobalTopics->Count; ++CategoryIndex) + for(TopicIndex = 0; TopicIndex < GlobalTopics->Count; ++TopicIndex) { - if(!StringsDiffer(Marker, GlobalTopics->Category[CategoryIndex].Marker)) + if(!StringsDiffer(Marker, GlobalTopics->Category[TopicIndex].Marker)) { return; } - if((StringsDiffer(Marker, GlobalTopics->Category[CategoryIndex].Marker)) < 0) + // NOTE(matt): This successfully sorts "nullTopic" at the end, but maybe figure out a more general way to force the + // order of stuff, perhaps blocks of dudes that should sort to the start / end + if(((StringsDiffer(Marker, GlobalTopics->Category[TopicIndex].Marker)) < 0 || !StringsDiffer(GlobalTopics->Category[TopicIndex].Marker, "nullTopic"))) { - int CategoryCount; - for(CategoryCount = GlobalTopics->Count; CategoryCount > CategoryIndex; --CategoryCount) + if(StringsDiffer(Marker, "nullTopic")) // NOTE(matt): This test (with the above || condition) forces nullTopic never to be inserted, only appended { - CopyString(GlobalTopics->Category[CategoryCount].Marker, GlobalTopics->Category[CategoryCount-1].Marker); - } + int CategoryCount; + for(CategoryCount = GlobalTopics->Count; CategoryCount > TopicIndex; --CategoryCount) + { + CopyString(GlobalTopics->Category[CategoryCount].Marker, GlobalTopics->Category[CategoryCount-1].Marker); + } - CopyString(GlobalTopics->Category[CategoryCount].Marker, Marker); - break; + CopyString(GlobalTopics->Category[CategoryCount].Marker, Marker); + break; + } } } - if(CategoryIndex == GlobalTopics->Count) + if(TopicIndex == GlobalTopics->Count) { - CopyString(GlobalTopics->Category[CategoryIndex].Marker, Marker); + CopyString(GlobalTopics->Category[TopicIndex].Marker, Marker); } ++GlobalTopics->Count; @@ -1478,35 +1484,81 @@ InsertCategory(categories *GlobalTopics, categories *LocalTopics, categories *Gl } void -BuildCategories(buffer *AnnotationClass, buffer *TopicDots, categories *LocalTopics, categories *LocalMedia, int *MarkerIndex) +BuildCategories(buffer *AnnotationClass, buffer *CategoryIcons, categories *LocalTopics, categories *LocalMedia, int *MarkerIndex, char *DefaultMedium) { - if(LocalTopics->Count > 0) + bool CategoriesSpan = FALSE; + if(!(LocalTopics->Count == 1 && !StringsDiffer(LocalTopics->Category[0].Marker, "nullTopic") + && LocalMedia->Count == 1 && !StringsDiffer(LocalMedia->Category[0].Marker, DefaultMedium))) { - CopyStringToBuffer(TopicDots, ""); - for(int i = 0; i < LocalTopics->Count; ++i) - { - CopyStringToBuffer(TopicDots, "
", - SanitisePunctuation(LocalTopics->Category[i].Marker), - SanitisePunctuation(LocalTopics->Category[i].Marker)); - - CopyStringToBuffer(AnnotationClass, " cat_%s", - SanitisePunctuation(LocalTopics->Category[i].Marker)); - } - CopyStringToBuffer(TopicDots, "
"); + CategoriesSpan = TRUE; + CopyStringToBuffer(CategoryIcons, ""); } - for(int i = 0; i < LocalMedia->Count; ++i) + if(LocalTopics->Count == 1 && !StringsDiffer(LocalTopics->Category[0].Marker, "nullTopic")) { - if(!StringsDiffer(LocalMedia->Category[i].Marker, "afk")) // TODO(matt): Initially hidden config + char SanitisedMarker[StringLength(LocalTopics->Category[0].Marker)]; + CopyString(SanitisedMarker, LocalTopics->Category[0].Marker); + SanitisePunctuation(SanitisedMarker); + CopyStringToBuffer(AnnotationClass, " cat_%s", SanitisedMarker); + } + else + { + for(int i = 0; i < LocalTopics->Count; ++i) { - CopyStringToBuffer(AnnotationClass, " off_%s skip", SanitisePunctuation(LocalMedia->Category[i].Marker)); // TODO(matt): Bulletproof this? + char SanitisedMarker[StringLength(LocalTopics->Category[i].Marker)]; + CopyString(SanitisedMarker, LocalTopics->Category[i].Marker); + SanitisePunctuation(SanitisedMarker); + + CopyStringToBuffer(CategoryIcons, "
", + LocalTopics->Category[i].Marker, + SanitisedMarker); + + CopyStringToBuffer(AnnotationClass, " cat_%s", + SanitisedMarker); } - else + } + + if(LocalMedia->Count == 1 && !StringsDiffer(LocalMedia->Category[0].Marker, DefaultMedium)) + { + char SanitisedMarker[StringLength(LocalMedia->Category[0].Marker)]; + CopyString(SanitisedMarker, LocalMedia->Category[0].Marker); + SanitisePunctuation(SanitisedMarker); + CopyStringToBuffer(AnnotationClass, " %s", SanitisedMarker); + } + else + { + for(int i = 0; i < LocalMedia->Count; ++i) { - CopyStringToBuffer(AnnotationClass, " %s", SanitisePunctuation(LocalMedia->Category[i].Marker)); + char SanitisedMarker[StringLength(LocalMedia->Category[i].Marker)]; + CopyString(SanitisedMarker, LocalMedia->Category[i].Marker); + SanitisePunctuation(SanitisedMarker); + + if(!StringsDiffer(LocalMedia->Category[i].Marker, "afk")) // TODO(matt): Initially hidden config + { + CopyStringToBuffer(AnnotationClass, " off_%s skip", SanitisedMarker); // TODO(matt): Bulletproof this? + } + else + { + for(int j = 0; j < ArrayCount(CategoryMedium); ++j) + { + if(!StringsDiffer(LocalMedia->Category[i].Marker, CategoryMedium[j].Medium)) + { + CopyStringToBuffer(CategoryIcons, "
%s
", + LocalMedia->Category[i].WrittenText, + LocalMedia->Category[i].Marker, + CategoryMedium[j].Icon); + CopyStringToBuffer(AnnotationClass, " %s", SanitisedMarker); + } + } + } } } + if(CategoriesSpan) + { + CopyStringToBuffer(CategoryIcons, "
"); + } + CopyStringToBuffer(AnnotationClass, "\""); } @@ -1702,6 +1754,10 @@ BuildQuote(quote_info *Info, char *Speaker, int ID) int GenerateTopicColours(char *Topic) { + char SanitisedTopic[StringLength(Topic)]; + CopyString(SanitisedTopic, Topic); + SanitisePunctuation(SanitisedTopic); + for(int i = 0; i < ArrayCount(CategoryMedium); ++i) { if(!StringsDiffer(Topic, CategoryMedium[i].Medium)) @@ -1766,7 +1822,7 @@ GenerateTopicColours(char *Topic) while(Topics.Buffer.Ptr - Topics.Buffer.Location < Topics.Buffer.Size) { Topics.Buffer.Ptr += StringLength(".category."); - if(!StringsDifferT(SanitisePunctuation(Topic), Topics.Buffer.Ptr, ' ')) + if(!StringsDifferT(SanitisedTopic, Topics.Buffer.Ptr, ' ')) { FreeBuffer(&Topics.Buffer); fclose(Topics.Handle); @@ -1779,10 +1835,18 @@ GenerateTopicColours(char *Topic) ++Topics.Buffer.Ptr; } - hsl_colour Colour; - StringToColourHash(&Colour, Topic); - fprintf(Topics.Handle, ".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); + if(!StringsDiffer(Topic, "nullTopic")) + { + fprintf(Topics.Handle, ".category.%s { border: 1px solid transparent; background: transparent; }\n", + SanitisedTopic); + } + else + { + hsl_colour Colour; + StringToColourHash(&Colour, Topic); + fprintf(Topics.Handle, ".category.%s { border: 1px solid hsl(%d, %d%%, %d%%); background: hsl(%d, %d%%, %d%%); }\n", + SanitisedTopic, Colour.Hue, Colour.Saturation, Colour.Lightness, Colour.Hue, Colour.Saturation, Colour.Lightness); + } fclose(Topics.Handle); FreeBuffer(&Topics.Buffer); @@ -2367,7 +2431,7 @@ HMMLToBuffers(buffers *CollationBuffers, template **BespokeTemplate, char *Filen buffer AnnotationClass; buffer AnnotationData; buffer Text; - buffer TopicDots; + buffer CategoryIcons; buffer FilterState; @@ -2464,14 +2528,14 @@ HMMLToBuffers(buffers *CollationBuffers, template **BespokeTemplate, char *Filen // AnnotationClass // AnnotationData // Text - // TopicDots + // CategoryIcons if(ClaimBuffer(&Annotation, "Annotation", Kilobytes(8)) == RC_ARENA_FULL) { hmml_free(&HMML); return RC_ARENA_FULL; }; if(ClaimBuffer(&AnnotationHeader, "AnnotationHeader", 512) == RC_ARENA_FULL) { hmml_free(&HMML); return RC_ARENA_FULL; }; if(ClaimBuffer(&AnnotationClass, "AnnotationClass", 256) == RC_ARENA_FULL) { hmml_free(&HMML); return RC_ARENA_FULL; }; if(ClaimBuffer(&AnnotationData, "AnnotationData", 512) == RC_ARENA_FULL) { hmml_free(&HMML); return RC_ARENA_FULL; }; if(ClaimBuffer(&Text, "Text", Kilobytes(4)) == RC_ARENA_FULL) { hmml_free(&HMML); return RC_ARENA_FULL; }; - if(ClaimBuffer(&TopicDots, "TopicDots", 512) == RC_ARENA_FULL) { hmml_free(&HMML); return RC_ARENA_FULL; }; + if(ClaimBuffer(&CategoryIcons, "CategoryIcons", 512) == RC_ARENA_FULL) { hmml_free(&HMML); return RC_ARENA_FULL; }; CopyStringToBuffer(&AnnotationHeader, "
0) { - CopyBuffer(&Annotation, &TopicDots); + CopyBuffer(&Annotation, &CategoryIcons); } CopyStringToBuffer(&Annotation, "
\n" @@ -2900,7 +2979,7 @@ AppendedIdentifier: if(LocalTopics.Count > 0) { - CopyBuffer(&Annotation, &TopicDots); + CopyBuffer(&Annotation, &CategoryIcons); } CopyStringToBuffer(&Annotation, "\n" @@ -2913,7 +2992,7 @@ AppendedIdentifier: if(LocalTopics.Count > 0) { - CopyBuffer(&Annotation, &TopicDots); + CopyBuffer(&Annotation, &CategoryIcons); } CopyStringToBuffer(&Annotation, "\n" @@ -2923,14 +3002,14 @@ AppendedIdentifier: CopyBuffer(&CollationBuffers->Player, &Annotation); // NOTE(matt): Tree structure of "annotation local" buffer dependencies - // TopicDots + // CategoryIcons // Text // AnnotationData // AnnotationClass // AnnotationHeader // Annotation - DeclaimBuffer(&TopicDots); + DeclaimBuffer(&CategoryIcons); DeclaimBuffer(&Text); DeclaimBuffer(&AnnotationData); DeclaimBuffer(&AnnotationClass); @@ -3012,24 +3091,33 @@ AppendedIdentifier: if(HasFilterMenu) { + // NOTE(matt): Two loops, one for each JS "object" CopyStringToBuffer(&FilterState, "\n