-rw-r--r-- | cgit.h | 7 | ||||
-rw-r--r-- | parsing.c | 25 | ||||
-rw-r--r-- | shared.c | 2 | ||||
-rw-r--r-- | ui-shared.c | 2 |
4 files changed, 35 insertions, 1 deletions
@@ -18,2 +18,3 @@ #include <xdiff/xdiff.h> +#include <utf8.h> @@ -50,2 +51,7 @@ +/* + * Default encoding + */ +#define PAGE_ENCODING "UTF-8" + typedef void (*configfn)(const char *name, const char *value); @@ -92,2 +98,3 @@ struct commitinfo { char *msg; + char *msg_encoding; }; @@ -201,2 +201,3 @@ struct commitinfo *cgit_parse_commit(struct commit *commit) ret->msg = NULL; + ret->msg_encoding = NULL; @@ -235,2 +236,10 @@ struct commitinfo *cgit_parse_commit(struct commit *commit) + if (!strncmp(p, "encoding ", 9)) { + p += 9; + t = strchr(p, '\n') + 1; + ret->msg_encoding = substr(p, t); + p = t; + } else + ret->msg_encoding = xstrdup(PAGE_ENCODING); + while (*p && (*p != '\n')) @@ -255,2 +264,18 @@ struct commitinfo *cgit_parse_commit(struct commit *commit) + if(strcmp(ret->msg_encoding, PAGE_ENCODING)) { + t = reencode_string(ret->subject, PAGE_ENCODING, + ret->msg_encoding); + if(t) { + free(ret->subject); + ret->subject = t; + } + + t = reencode_string(ret->msg, PAGE_ENCODING, + ret->msg_encoding); + if(t) { + free(ret->msg); + ret->msg = t; + } + } + return ret; @@ -267,2 +267,4 @@ void *cgit_free_commitinfo(struct commitinfo *info) free(info->subject); + free(info->msg); + free(info->msg_encoding); free(info); diff --git a/ui-shared.c b/ui-shared.c index 72a7b44..7c69f60 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -354,3 +354,3 @@ void cgit_print_docstart(char *title, struct cacheitem *item) { - html("Content-Type: text/html; charset=utf-8\n"); + html("Content-Type: text/html; charset=" PAGE_ENCODING "\n"); htmlf("Last-Modified: %s\n", http_date(item->st.st_mtime)); |