diff --git a/cinera/cinera.c b/cinera/cinera.c index 916ab4c..bd43638 100644 --- a/cinera/cinera.c +++ b/cinera/cinera.c @@ -14,7 +14,7 @@ typedef struct version CINERA_APP_VERSION = { .Major = 0, .Minor = 5, - .Patch = 44 + .Patch = 45 }; // TODO(matt): Copy in the DB 3 stuff from cinera_working.c @@ -657,30 +657,38 @@ CopyStringToBufferHTMLSafe(buffer *Dest, char *String) } switch(*String) { - case '<': - CopyStringToBuffer(Dest, "<"); - String++; - break; - case '>': - CopyStringToBuffer(Dest, ">"); - String++; - break; - case '&': - CopyStringToBuffer(Dest, "&"); - String++; - break; - case '\"': - CopyStringToBuffer(Dest, """); - String++; - break; - case '\'': - CopyStringToBuffer(Dest, "'"); - String++; - break; - default: - *Dest->Ptr++ = *String++; - break; + case '<': CopyStringToBuffer(Dest, "<"); break; + case '>': CopyStringToBuffer(Dest, ">"); break; + case '&': CopyStringToBuffer(Dest, "&"); break; + case '\"': CopyStringToBuffer(Dest, """); break; + case '\'': CopyStringToBuffer(Dest, "'"); break; + default: *Dest->Ptr++ = *String; break; } + ++String; + } +} + +void +CopyStringToBufferHTMLSafeBreakingOnSlash(buffer *Dest, char *String) +{ + while(*String) + { + if(Dest->Ptr - Dest->Location >= Dest->Size) + { + fprintf(stderr, "CopyStringToBufferHTMLSafeBreakingOnSlash: %s cannot accommodate %d-character string\n", Dest->ID, StringLength(String)); + __asm__("int3"); + } + switch(*String) + { + case '<': CopyStringToBuffer(Dest, "<"); break; + case '>': CopyStringToBuffer(Dest, ">"); break; + case '&': CopyStringToBuffer(Dest, "&"); break; + case '\"': CopyStringToBuffer(Dest, """); break; + case '\'': CopyStringToBuffer(Dest, "'"); break; + case '/': CopyStringToBuffer(Dest, "/\u200B"); break; + default: *Dest->Ptr++ = *String; break; + } + ++String; } } @@ -691,7 +699,7 @@ CopyStringToBufferJSONSafe(buffer *Dest, char *String) { if(Dest->Ptr - Dest->Location >= Dest->Size) { - fprintf(stderr, "CopyStringToBufferHTMLSafe: %s cannot accommodate %d-character string\n", Dest->ID, StringLength(String)); + fprintf(stderr, "CopyStringToBufferJSONSafe: %s cannot accommodate %d-character string\n", Dest->ID, StringLength(String)); __asm__("int3"); } switch(*String) @@ -918,7 +926,8 @@ DeclaimBuffer(buffer *Buffer) Buffer->Size = 0; } -void RewindBuffer(buffer *Buffer) +void +RewindBuffer(buffer *Buffer) { #if DEBUG float PercentageUsed = (float)(Buffer->Ptr - Buffer->Location) / Buffer->Size * 100; @@ -1561,109 +1570,93 @@ BuildCredits(buffer *CreditsMenu, bool *HasCreditsMenu, HMML_VideoMetaData *Meta enum { - REF_SITE = 1 << 0, - REF_PAGE = 1 << 1, - REF_URL = 1 << 2, - REF_TITLE = 1 << 3, - REF_ARTICLE = 1 << 4, - REF_AUTHOR = 1 << 5, - REF_EDITOR = 1 << 6, + REF_SITE = 1 << 0, + REF_PAGE = 1 << 1, + REF_URL = 1 << 2, + REF_TITLE = 1 << 3, + REF_ARTICLE = 1 << 4, + REF_AUTHOR = 1 << 5, + REF_EDITOR = 1 << 6, REF_PUBLISHER = 1 << 7, - REF_ISBN = 1 << 8, + REF_ISBN = 1 << 8, } reference_fields; int BuildReference(ref_info *ReferencesArray, int RefIdentifier, int UniqueRefs, HMML_Reference *Ref, HMML_Annotation *Anno) { - int Mask = 0; + if(Ref->isbn) + { + CopyString(ReferencesArray[UniqueRefs].ID, Ref->isbn); + if(!Ref->url) { CopyString(ReferencesArray[UniqueRefs].URL, "https://isbndb.com/book/%s", Ref->isbn); } + else { CopyStringNoFormat(ReferencesArray[UniqueRefs].URL, Ref->url); } + } + else if(Ref->url) + { + CopyStringNoFormat(ReferencesArray[UniqueRefs].ID, Ref->url); + CopyStringNoFormat(ReferencesArray[UniqueRefs].URL, Ref->url); + } + else { return RC_INVALID_REFERENCE; } + int Mask = 0; if(Ref->site) { Mask |= REF_SITE; } if(Ref->page) { Mask |= REF_PAGE; } - if(Ref->url) { Mask |= REF_URL; } if(Ref->title) { Mask |= REF_TITLE; } if(Ref->article) { Mask |= REF_ARTICLE; } if(Ref->author) { Mask |= REF_AUTHOR; } if(Ref->editor) { Mask |= REF_EDITOR; } if(Ref->publisher) { Mask |= REF_PUBLISHER; } - if(Ref->isbn) { Mask |= REF_ISBN; } - // TODO(matt): Consider handling the various combinations more flexibly + // TODO(matt): Consider handling the various combinations more flexibly, unless we defer this stuff until we have the + // reference store, in which we could optionally customise the display of each reference entry switch(Mask) { - case (REF_URL | REF_TITLE | REF_AUTHOR | REF_PUBLISHER | REF_ISBN): + case (REF_TITLE | REF_AUTHOR | REF_PUBLISHER): { - CopyString(ReferencesArray[UniqueRefs].ID, Ref->isbn); CopyString(ReferencesArray[UniqueRefs].Source, "%s (%s)", Ref->author, Ref->publisher); CopyStringNoFormat(ReferencesArray[UniqueRefs].RefTitle, Ref->title); - CopyStringNoFormat(ReferencesArray[UniqueRefs].URL, Ref->url); } break; - case (REF_AUTHOR | REF_SITE | REF_PAGE | REF_URL): + case (REF_AUTHOR | REF_SITE | REF_PAGE): { - CopyStringNoFormat(ReferencesArray[UniqueRefs].ID, Ref->url); CopyStringNoFormat(ReferencesArray[UniqueRefs].Source, Ref->site); CopyString(ReferencesArray[UniqueRefs].RefTitle, "%s: \"%s\"", Ref->author, Ref->page); - CopyStringNoFormat(ReferencesArray[UniqueRefs].URL, Ref->url); } break; - case (REF_PAGE | REF_URL | REF_TITLE): + case (REF_PAGE | REF_TITLE): { - CopyStringNoFormat(ReferencesArray[UniqueRefs].ID, Ref->url); CopyStringNoFormat(ReferencesArray[UniqueRefs].Source, Ref->title); CopyStringNoFormat(ReferencesArray[UniqueRefs].RefTitle, Ref->page); - CopyStringNoFormat(ReferencesArray[UniqueRefs].URL, Ref->url); } break; - case (REF_SITE | REF_PAGE | REF_URL): + case (REF_SITE | REF_PAGE): { - CopyStringNoFormat(ReferencesArray[UniqueRefs].ID, Ref->url); CopyStringNoFormat(ReferencesArray[UniqueRefs].Source, Ref->site); CopyStringNoFormat(ReferencesArray[UniqueRefs].RefTitle, Ref->page); - CopyStringNoFormat(ReferencesArray[UniqueRefs].URL, Ref->url); } break; - case (REF_SITE | REF_URL | REF_TITLE): + case (REF_SITE | REF_TITLE): { - CopyStringNoFormat(ReferencesArray[UniqueRefs].ID, Ref->url); CopyStringNoFormat(ReferencesArray[UniqueRefs].Source, Ref->site); CopyStringNoFormat(ReferencesArray[UniqueRefs].RefTitle, Ref->title); - CopyStringNoFormat(ReferencesArray[UniqueRefs].URL, Ref->url); } break; - case (REF_TITLE | REF_AUTHOR | REF_ISBN): + case (REF_TITLE | REF_AUTHOR): { - CopyString(ReferencesArray[UniqueRefs].ID, Ref->isbn); - CopyString(ReferencesArray[UniqueRefs].Source, Ref->author); + CopyStringNoFormat(ReferencesArray[UniqueRefs].Source, Ref->author); CopyStringNoFormat(ReferencesArray[UniqueRefs].RefTitle, Ref->title); - CopyString(ReferencesArray[UniqueRefs].URL, "http://www.openisbn.com/isbn/%s", Ref->isbn); } break; - case (REF_URL | REF_ARTICLE | REF_AUTHOR): + case (REF_ARTICLE | REF_AUTHOR): { - CopyStringNoFormat(ReferencesArray[UniqueRefs].ID, Ref->url); - CopyString(ReferencesArray[UniqueRefs].Source, Ref->author); + CopyStringNoFormat(ReferencesArray[UniqueRefs].Source, Ref->author); CopyStringNoFormat(ReferencesArray[UniqueRefs].RefTitle, Ref->article); - CopyStringNoFormat(ReferencesArray[UniqueRefs].URL, Ref->url); } break; - case (REF_URL | REF_TITLE | REF_AUTHOR): + case (REF_TITLE | REF_PUBLISHER): { - CopyStringNoFormat(ReferencesArray[UniqueRefs].ID, Ref->url); - CopyString(ReferencesArray[UniqueRefs].Source, Ref->author); + CopyStringNoFormat(ReferencesArray[UniqueRefs].Source, Ref->publisher); CopyStringNoFormat(ReferencesArray[UniqueRefs].RefTitle, Ref->title); - CopyStringNoFormat(ReferencesArray[UniqueRefs].URL, Ref->url); } break; - case (REF_URL | REF_TITLE | REF_PUBLISHER): + case REF_TITLE: { - CopyStringNoFormat(ReferencesArray[UniqueRefs].ID, Ref->url); - CopyString(ReferencesArray[UniqueRefs].Source, Ref->publisher); CopyStringNoFormat(ReferencesArray[UniqueRefs].RefTitle, Ref->title); - CopyStringNoFormat(ReferencesArray[UniqueRefs].URL, Ref->url); } break; - case (REF_URL | REF_TITLE): + case REF_SITE: { - CopyStringNoFormat(ReferencesArray[UniqueRefs].ID, Ref->url); - CopyStringNoFormat(ReferencesArray[UniqueRefs].RefTitle, Ref->title); - CopyStringNoFormat(ReferencesArray[UniqueRefs].URL, Ref->url); - } break; - case (REF_SITE | REF_URL): - { - CopyStringNoFormat(ReferencesArray[UniqueRefs].ID, Ref->url); CopyStringNoFormat(ReferencesArray[UniqueRefs].RefTitle, Ref->site); - CopyStringNoFormat(ReferencesArray[UniqueRefs].URL, Ref->url); } break; default: return RC_INVALID_REFERENCE; break; } @@ -3170,8 +3163,7 @@ HMMLToBuffers(buffers *CollationBuffers, template **BespokeTemplate, char *Filen "