From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=MAILING_LIST_MULTI autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 16410 invoked from network); 19 Mar 2021 20:31:21 -0000 Received: from lists.zx2c4.com (165.227.139.114) by inbox.vuxu.org with ESMTPUTF8; 19 Mar 2021 20:31:21 -0000 Received: by lists.zx2c4.com (ZX2C4 Mail Server) with ESMTP id b3b07c2a; Fri, 19 Mar 2021 20:30:53 +0000 (UTC) Return-Path: Received: from dcvr.yhbt.net (dcvr.yhbt.net [64.71.152.64]) by lists.zx2c4.com (ZX2C4 Mail Server) with ESMTPS id a43d109a (TLSv1.3:AEAD-AES256-GCM-SHA384:256:NO) for ; Fri, 19 Mar 2021 20:30:51 +0000 (UTC) Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 2E8A71FA01 for ; Fri, 19 Mar 2021 20:23:37 +0000 (UTC) From: Eric Wong To: cgit@lists.zx2c4.com Subject: [PATCH 4/5] ui-diff: preserve spaces w/o CSS on context lines Date: Fri, 19 Mar 2021 20:23:36 +0000 Message-Id: <20210319202337.21676-5-e@80x24.org> In-Reply-To: <20210319202337.21676-1-e@80x24.org> References: <20210319202337.21676-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: cgit@lists.zx2c4.com X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: List for cgit developers and users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: cgit-bounces@lists.zx2c4.com Sender: "CGit" We need to use a non-breaking space entity to preserve spacing for browsers without CSS support. Signed-off-by: Eric Wong --- html.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ html.h | 1 + ui-diff.c | 5 +---- 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/html.c b/html.c index 7f81965..138c649 100644 --- a/html.c +++ b/html.c @@ -156,6 +156,52 @@ ssize_t html_ntxt(const char *txt, size_t len) return slen; } +ssize_t html_ntxt_pre(const char *txt, size_t len) +{ + const char *t = txt; + ssize_t slen; + int prev = 0; + + if (len > SSIZE_MAX) + return -1; + + slen = (ssize_t) len; + while (t && *t && slen--) { + int c = *t; + if (c == '<' || c == '>' || c == '&' || c == ' ' || c == '\t') { + html_raw(txt, t - txt); + if (c == '>') + html(">"); + else if (c == '<') + html("<"); + else if (c == '&') + html("&"); + else if (c == ' ') { + if (!prev || prev == ' ' || prev == '\t') { + html(" "); + /* next byte can be unescaped ' ' */ + c = 160; + } else { + html(" "); + } + } else if (c == '\t') { + html("    " + "    "); + /* next byte can be unescaped ' ' */ + c = 160; + } + txt = t + 1; + } + prev = c; + t++; + } + if (t != txt) + html_raw(txt, t - txt); + return slen; +} + + + void html_attrf(const char *fmt, ...) { va_list ap; diff --git a/html.h b/html.h index fa4de77..4479b8e 100644 --- a/html.h +++ b/html.h @@ -20,6 +20,7 @@ extern void html_attrf(const char *format,...); extern void html_txt(const char *txt); extern ssize_t html_ntxt(const char *txt, size_t len); +extern ssize_t html_ntxt_pre(const char *txt, size_t len); extern void html_attr(const char *txt); extern void html_url_path(const char *txt); extern void html_url_arg(const char *txt); diff --git a/ui-diff.c b/ui-diff.c index 5ed5990..a0f2bb7 100644 --- a/ui-diff.c +++ b/ui-diff.c @@ -222,7 +222,6 @@ static void cgit_print_diffstat(const struct object_id *old_oid, static void print_line(char *line, int len) { char *class = "ctx"; - char c = line[len-1]; if (line[0] == '+') class = "add"; @@ -232,10 +231,8 @@ static void print_line(char *line, int len) class = "hunk"; htmlf("
", class); - line[len-1] = '\0'; - html_txt(line); + html_ntxt_pre(line, len - 1); html("
"); - line[len-1] = c; } static void header(const struct object_id *oid1, char *path1, int mode1,