hmml_to_html.c: Introduce BuildReference() [#16]
Also increase saturation of generated colours
This commit is contained in:
		
							parent
							
								
									6925dfb565
								
							
						
					
					
						commit
						ba13066d63
					
				| 
						 | 
					@ -77,8 +77,6 @@ ParseRef(HMML_Reference RefInput)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TODO(matt): MakeReference()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int
 | 
					int
 | 
				
			||||||
TimecodeToSeconds(char *Timecode)
 | 
					TimecodeToSeconds(char *Timecode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -121,16 +119,14 @@ CopyBuffer(buffer *Dest, buffer *Src)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__attribute__ ((format (printf, 2, 3)))
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
CopyString(char Dest[], char *Src)
 | 
					CopyString(char Dest[], char *Format, ...)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int i = 0;
 | 
					    va_list Args;
 | 
				
			||||||
    while(*Src)
 | 
					    va_start(Args, Format);
 | 
				
			||||||
    {
 | 
					    vsprintf(Dest, Format, Args);
 | 
				
			||||||
        Dest[i] = *Src++;
 | 
					    va_end(Args);
 | 
				
			||||||
        ++i;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    Dest[i] = '\0';
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__attribute__ ((format (printf, 2, 3)))
 | 
					__attribute__ ((format (printf, 2, 3)))
 | 
				
			||||||
| 
						 | 
					@ -164,27 +160,22 @@ typedef struct
 | 
				
			||||||
hsl_colour
 | 
					hsl_colour
 | 
				
			||||||
CharToColour(char Char)
 | 
					CharToColour(char Char)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // Hue between 0 - 256
 | 
					 | 
				
			||||||
    // Saturation between 0 - 100
 | 
					 | 
				
			||||||
    // Lightness = 74
 | 
					 | 
				
			||||||
    // hsl(120, 100%, 50%)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    hsl_colour Colour;
 | 
					    hsl_colour Colour;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(Char >= 'a' && Char <= 'z')
 | 
					    if(Char >= 'a' && Char <= 'z')
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        Colour.Hue = (((float)Char - 'a') / ('z' - 'a') * 256);
 | 
					        Colour.Hue = (((float)Char - 'a') / ('z' - 'a') * 360);
 | 
				
			||||||
        Colour.Saturation = (((float)Char - 'a') / ('z' - 'a') * 100);
 | 
					        Colour.Saturation = (((float)Char - 'a') / ('z' - 'a') * 26 + 74);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else if(Char >= 'A' && Char <= 'Z')
 | 
					    else if(Char >= 'A' && Char <= 'Z')
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        Colour.Hue = (((float)Char - 'A') / ('Z' - 'A') * 256);
 | 
					        Colour.Hue = (((float)Char - 'A') / ('Z' - 'A') * 360);
 | 
				
			||||||
        Colour.Saturation = (((float)Char - 'A') / ('Z' - 'A') * 100);
 | 
					        Colour.Saturation = (((float)Char - 'A') / ('Z' - 'A') * 26 + 74);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else if(Char >= '0' && Char <= '9')
 | 
					    else if(Char >= '0' && Char <= '9')
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        Colour.Hue = (((float)Char - '0') / ('9' - '0') * 256);
 | 
					        Colour.Hue = (((float)Char - '0') / ('9' - '0') * 360);
 | 
				
			||||||
        Colour.Saturation = (((float)Char - '0') / ('9' - '0') * 100);
 | 
					        Colour.Saturation = (((float)Char - '0') / ('9' - '0') * 26 + 74);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
| 
						 | 
					@ -207,9 +198,8 @@ StringToColourHash(buffer *Buffer, char *String)
 | 
				
			||||||
        Colour.Saturation += CharToColour(String[i]).Saturation;
 | 
					        Colour.Saturation += CharToColour(String[i]).Saturation;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // hsl(120, 100%, 50%)
 | 
					 | 
				
			||||||
    Colour.Hue = Colour.Hue % 360;
 | 
					    Colour.Hue = Colour.Hue % 360;
 | 
				
			||||||
    Colour.Saturation = Colour.Saturation % 100;
 | 
					    Colour.Saturation = Colour.Saturation % 26 + 74;
 | 
				
			||||||
    Buffer->Ptr = Buffer->Location;
 | 
					    Buffer->Ptr = Buffer->Location;
 | 
				
			||||||
    CopyStringToBuffer(Buffer, "hsl(%d, %d%%, %d%%)", Colour.Hue, Colour.Saturation, Colour.Lightness);
 | 
					    CopyStringToBuffer(Buffer, "hsl(%d, %d%%, %d%%)", Colour.Hue, Colour.Saturation, Colour.Lightness);
 | 
				
			||||||
    return(Buffer->Location);
 | 
					    return(Buffer->Location);
 | 
				
			||||||
| 
						 | 
					@ -256,6 +246,46 @@ char *CategoryMedium[] =
 | 
				
			||||||
    "run",
 | 
					    "run",
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					BuildReference(ref_info *ReferencesArray, int RefIdentifier, int UniqueRefs, HMML_Reference Ref, HMML_Annotation Anno)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if(Ref.isbn)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        CopyString(ReferencesArray[UniqueRefs].ID, Ref.isbn);
 | 
				
			||||||
 | 
					        // NOTE(matt): I could probably do with Asserting some of this stuff
 | 
				
			||||||
 | 
					        CopyString(ReferencesArray[UniqueRefs].Source, Ref.author);
 | 
				
			||||||
 | 
					        CopyString(ReferencesArray[UniqueRefs].RefTitle, Ref.title);
 | 
				
			||||||
 | 
					        if(Ref.url)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            CopyString(ReferencesArray[UniqueRefs].URL, Ref.url);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            // TODO(matt): Find better ISBN search site?
 | 
				
			||||||
 | 
					            CopyString(ReferencesArray[UniqueRefs].URL, "http://www.isbnsearch.org/isbn/%s", Ref.isbn);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if(Ref.url)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        CopyString(ReferencesArray[UniqueRefs].ID, Ref.url); // NOTE(matt): Normalise?
 | 
				
			||||||
 | 
					        if(Ref.page)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            CopyString(ReferencesArray[UniqueRefs].Source, Ref.site);
 | 
				
			||||||
 | 
					            CopyString(ReferencesArray[UniqueRefs].RefTitle, Ref.page);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            // NOTE(matt): Empty Source
 | 
				
			||||||
 | 
					            CopyString(ReferencesArray[UniqueRefs].RefTitle, Ref.site);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        CopyString(ReferencesArray[UniqueRefs].URL, Ref.url);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    CopyString(ReferencesArray[UniqueRefs].Identifier[ReferencesArray[UniqueRefs].IdentifierCount].Timecode, Anno.time);
 | 
				
			||||||
 | 
					    ReferencesArray[UniqueRefs].Identifier[ReferencesArray[UniqueRefs].IdentifierCount].Identifier = RefIdentifier;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
BuildCategories(buffer *AnnotationClass, buffer *Category, int *MarkerIndex, bool *HasCategory, char *Marker)
 | 
					BuildCategories(buffer *AnnotationClass, buffer *Category, int *MarkerIndex, bool *HasCategory, char *Marker)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -497,14 +527,8 @@ Readable);
 | 
				
			||||||
"                <div class=\"mouse_catcher\"></div>\n"
 | 
					"                <div class=\"mouse_catcher\"></div>\n"
 | 
				
			||||||
"                <div class=\"refs\">\n");
 | 
					"                <div class=\"refs\">\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                           CopyString(ReferencesArray[RefIdentifier - 1].ID, CurrentRef->editor);
 | 
					                            BuildReference(ReferencesArray, RefIdentifier, UniqueRefs, *CurrentRef, *Anno);
 | 
				
			||||||
                            CopyString(ReferencesArray[RefIdentifier - 1].RefTitle, "Title");
 | 
					 | 
				
			||||||
                            CopyString(ReferencesArray[RefIdentifier - 1].URL, "http://example.com/");
 | 
					 | 
				
			||||||
                            CopyString(ReferencesArray[RefIdentifier - 1].Source, "Source");
 | 
					 | 
				
			||||||
                            CopyString(ReferencesArray[RefIdentifier - 1].Identifier[ReferencesArray[RefIdentifier - 1].IdentifierCount].Timecode, Anno->time);
 | 
					 | 
				
			||||||
                            ReferencesArray[RefIdentifier - 1].Identifier[ReferencesArray[RefIdentifier - 1].IdentifierCount].Identifier = RefIdentifier;
 | 
					 | 
				
			||||||
                            ++ReferencesArray[RefIdentifier - 1].IdentifierCount;
 | 
					                            ++ReferencesArray[RefIdentifier - 1].IdentifierCount;
 | 
				
			||||||
 | 
					 | 
				
			||||||
                            ++UniqueRefs;
 | 
					                            ++UniqueRefs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            HasReferenceMenu = TRUE;
 | 
					                            HasReferenceMenu = TRUE;
 | 
				
			||||||
| 
						 | 
					@ -513,21 +537,34 @@ Readable);
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            for(int i = 0; i < UniqueRefs; ++i)
 | 
					                            for(int i = 0; i < UniqueRefs; ++i)
 | 
				
			||||||
                            {
 | 
					                            {
 | 
				
			||||||
                                if(!StringsDiffer(CurrentRef->editor, ReferencesArray[i].ID))
 | 
					                                if(CurrentRef->isbn)
 | 
				
			||||||
                                {
 | 
					                                {
 | 
				
			||||||
                                    CopyString(ReferencesArray[i].Identifier[ReferencesArray[i].IdentifierCount].Timecode, Anno->time);
 | 
					                                    if(!StringsDiffer(CurrentRef->isbn, ReferencesArray[i].ID))
 | 
				
			||||||
                                    ReferencesArray[i].Identifier[ReferencesArray[i].IdentifierCount].Identifier = RefIdentifier;
 | 
					                                    {
 | 
				
			||||||
                                    ++ReferencesArray[i].IdentifierCount;
 | 
					                                        CopyString(ReferencesArray[i].Identifier[ReferencesArray[i].IdentifierCount].Timecode, Anno->time);
 | 
				
			||||||
                                    goto AppendedIdentifier;
 | 
					                                        ReferencesArray[i].Identifier[ReferencesArray[i].IdentifierCount].Identifier = RefIdentifier;
 | 
				
			||||||
 | 
					                                        ++ReferencesArray[i].IdentifierCount;
 | 
				
			||||||
 | 
					                                        goto AppendedIdentifier;
 | 
				
			||||||
 | 
					                                    }
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                                else if(CurrentRef->url)
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    if(!StringsDiffer(CurrentRef->url, ReferencesArray[i].ID))
 | 
				
			||||||
 | 
					                                    {
 | 
				
			||||||
 | 
					                                        CopyString(ReferencesArray[i].Identifier[ReferencesArray[i].IdentifierCount].Timecode, Anno->time);
 | 
				
			||||||
 | 
					                                        ReferencesArray[i].Identifier[ReferencesArray[i].IdentifierCount].Identifier = RefIdentifier;
 | 
				
			||||||
 | 
					                                        ++ReferencesArray[i].IdentifierCount;
 | 
				
			||||||
 | 
					                                        goto AppendedIdentifier;
 | 
				
			||||||
 | 
					                                    }
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                                else
 | 
				
			||||||
 | 
					                                {
 | 
				
			||||||
 | 
					                                    fprintf(stderr, "%s:%d: Reference must have an ISBN or URL\n", Args[FileIndex], Anno->line);
 | 
				
			||||||
 | 
					                                    return 1;
 | 
				
			||||||
                                }
 | 
					                                }
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            CopyString(ReferencesArray[UniqueRefs].ID, CurrentRef->editor);
 | 
					                            BuildReference(ReferencesArray, RefIdentifier, UniqueRefs, *CurrentRef, *Anno);
 | 
				
			||||||
                            CopyString(ReferencesArray[UniqueRefs].RefTitle, "Title");
 | 
					 | 
				
			||||||
                            CopyString(ReferencesArray[UniqueRefs].URL, "http://example.com/");
 | 
					 | 
				
			||||||
                            CopyString(ReferencesArray[UniqueRefs].Source, "Source");
 | 
					 | 
				
			||||||
                            CopyString(ReferencesArray[UniqueRefs].Identifier[ReferencesArray[UniqueRefs].IdentifierCount].Timecode, Anno->time);
 | 
					 | 
				
			||||||
                            ReferencesArray[UniqueRefs].Identifier[ReferencesArray[UniqueRefs].IdentifierCount].Identifier = RefIdentifier;
 | 
					 | 
				
			||||||
                            ++ReferencesArray[UniqueRefs].IdentifierCount;
 | 
					                            ++ReferencesArray[UniqueRefs].IdentifierCount;
 | 
				
			||||||
                            ++UniqueRefs;
 | 
					                            ++UniqueRefs;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
| 
						 | 
					@ -535,13 +572,41 @@ AppendedIdentifier:
 | 
				
			||||||
                        if(!HasReference)
 | 
					                        if(!HasReference)
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            ClaimBuffer(MemoryArena, &ClaimedMemory, &AnnotationData, 128);
 | 
					                            ClaimBuffer(MemoryArena, &ClaimedMemory, &AnnotationData, 128);
 | 
				
			||||||
                            CopyStringToBuffer(&AnnotationData, " data-ref=\"%s", CurrentRef->editor);
 | 
					                            if(CurrentRef->isbn)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                CopyStringToBuffer(&AnnotationData, " data-ref=\"%s", CurrentRef->isbn);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            else if(CurrentRef->url)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                CopyStringToBuffer(&AnnotationData, " data-ref=\"%s", CurrentRef->url);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            else
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                fprintf(stderr, "%s:%d: Reference must have an ISBN or URL\n", Args[FileIndex], Anno->line);
 | 
				
			||||||
 | 
					                                free(MemoryArena);
 | 
				
			||||||
 | 
					                                hmml_free(&HMML);
 | 
				
			||||||
 | 
					                                return 1;
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            HasReference = TRUE;
 | 
					                            HasReference = TRUE;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        else
 | 
					                        else
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            CopyStringToBuffer(&AnnotationData, ",%s", CurrentRef->editor);
 | 
					                            if(CurrentRef->isbn)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                CopyStringToBuffer(&AnnotationData, ",%s", CurrentRef->isbn);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            else if(CurrentRef->url)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                CopyStringToBuffer(&AnnotationData, ",%s", CurrentRef->url);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            else
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                fprintf(stderr, "%s:%d: Reference must have an ISBN or URL", Args[0], Anno->line);
 | 
				
			||||||
 | 
					                                free(MemoryArena);
 | 
				
			||||||
 | 
					                                hmml_free(&HMML);
 | 
				
			||||||
 | 
					                                return 1;
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        CopyStringToBuffer(&Text, "<sup>%d</sup>", RefIdentifier);
 | 
					                        CopyStringToBuffer(&Text, "<sup>%d</sup>", RefIdentifier);
 | 
				
			||||||
| 
						 | 
					@ -684,18 +749,33 @@ Anno->time);
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                        CopyStringToBuffer(&ReferenceMenu,
 | 
					                        CopyStringToBuffer(&ReferenceMenu,
 | 
				
			||||||
"                    <a data-id=\"%s\" href=\"%s\" target=\"_blank\" class=\"ref\">\n"
 | 
					"                    <a data-id=\"%s\" href=\"%s\" target=\"_blank\" class=\"ref\">\n"
 | 
				
			||||||
"                        <span class=\"ref_content\">\n"
 | 
					"                        <span class=\"ref_content\">\n",
 | 
				
			||||||
 | 
					ReferencesArray[i].ID,
 | 
				
			||||||
 | 
					ReferencesArray[i].URL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if(ReferencesArray[i].Source)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            CopyStringToBuffer(&ReferenceMenu,
 | 
				
			||||||
"                            <div class=\"source\">%s</div>\n"
 | 
					"                            <div class=\"source\">%s</div>\n"
 | 
				
			||||||
"                            <div class=\"ref_title\">%s</div>\n"
 | 
					"                            <div class=\"ref_title\">%s</div>\n",
 | 
				
			||||||
"                        </span>\n"
 | 
					ReferencesArray[i].Source,
 | 
				
			||||||
 | 
					ReferencesArray[i].RefTitle);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            CopyStringToBuffer(&ReferenceMenu,
 | 
				
			||||||
 | 
					"                            <div class=\"ref_title\">%s</div>\n",
 | 
				
			||||||
 | 
					ReferencesArray[i].Source);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                            CopyStringToBuffer(&ReferenceMenu,
 | 
				
			||||||
 | 
					"                        </span>\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TODO(matt): Fill the div class="ref_indices" with <= 3 span
 | 
					// TODO(matt): Fill the div class="ref_indices" with <= 3 span
 | 
				
			||||||
// class="ref_index" and ensure to put these <=3 spans on the same line without
 | 
					// class="ref_index" and ensure to put these <=3 spans on the same line without
 | 
				
			||||||
// a space between them
 | 
					// a space between them
 | 
				
			||||||
"                        <div class=\"ref_indices\">\n                            ",
 | 
					                            CopyStringToBuffer(&ReferenceMenu,
 | 
				
			||||||
ReferencesArray[i].ID,
 | 
					"                        <div class=\"ref_indices\">\n                            ");
 | 
				
			||||||
"http://example.com/",
 | 
					 | 
				
			||||||
"Source",
 | 
					 | 
				
			||||||
"Title");
 | 
					 | 
				
			||||||
                        for(int j = 0; j < ReferencesArray[i].IdentifierCount; ++j)
 | 
					                        for(int j = 0; j < ReferencesArray[i].IdentifierCount; ++j)
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            CopyStringToBuffer(&ReferenceMenu,
 | 
					                            CopyStringToBuffer(&ReferenceMenu,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue