diff options
-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
diff --git a/cgit.h b/cgit.h index 163f355..6291c58 100644 --- a/cgit.h +++ b/cgit.h @@ -16,6 +16,7 @@ #include <log-tree.h> #include <archive.h> #include <xdiff/xdiff.h> +#include <utf8.h> /* @@ -48,6 +49,11 @@ #define TM_MONTH (TM_YEAR / 12.0) +/* + * Default encoding + */ +#define PAGE_ENCODING "UTF-8" + typedef void (*configfn)(const char *name, const char *value); typedef void (*filepair_fn)(struct diff_filepair *pair); typedef void (*linediff_fn)(char *line, int len); @@ -90,6 +96,7 @@ struct commitinfo { unsigned long committer_date; char *subject; char *msg; + char *msg_encoding; }; struct taginfo { diff --git a/parsing.c b/parsing.c index 30e7648..e8c7ab9 100644 --- a/parsing.c +++ b/parsing.c @@ -199,6 +199,7 @@ struct commitinfo *cgit_parse_commit(struct commit *commit) ret->committer_email = NULL; ret->subject = NULL; ret->msg = NULL; + ret->msg_encoding = NULL; if (p == NULL) return ret; @@ -233,6 +234,14 @@ struct commitinfo *cgit_parse_commit(struct commit *commit) p = strchr(t, '\n') + 1; } + 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')) p = strchr(p, '\n') + 1; // skip unknown header fields @@ -253,6 +262,22 @@ struct commitinfo *cgit_parse_commit(struct commit *commit) } else ret->subject = substr(p, p+strlen(p)); + 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; } diff --git a/shared.c b/shared.c index e06df91..a04c4dc 100644 --- a/shared.c +++ b/shared.c @@ -265,6 +265,8 @@ void *cgit_free_commitinfo(struct commitinfo *info) free(info->committer); free(info->committer_email); free(info->subject); + free(info->msg); + free(info->msg_encoding); free(info); return NULL; } diff --git a/ui-shared.c b/ui-shared.c index 72a7b44..7c69f60 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -352,7 +352,7 @@ void cgit_print_age(time_t t, time_t max_relative, char *format) 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)); htmlf("Expires: %s\n", http_date(item->st.st_mtime + ttl_seconds(item->ttl))); |