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=-3.4 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 1800 invoked from network); 21 Oct 2021 08:43:10 -0000 Received: from lists.zx2c4.com (165.227.139.114) by inbox.vuxu.org with ESMTPUTF8; 21 Oct 2021 08:43:10 -0000 Received: by lists.zx2c4.com (ZX2C4 Mail Server) with ESMTP id 1d66dc39; Thu, 21 Oct 2021 08:42:57 +0000 (UTC) Return-Path: Received: from mail-qv1-xf2d.google.com (mail-qv1-xf2d.google.com [2607:f8b0:4864:20::f2d]) by lists.zx2c4.com (ZX2C4 Mail Server) with ESMTPS id 444e55cf (TLSv1.3:AEAD-AES256-GCM-SHA384:256:NO) for ; Thu, 21 Oct 2021 08:42:56 +0000 (UTC) Received: by mail-qv1-xf2d.google.com with SMTP id e13so1246qvf.5 for ; Thu, 21 Oct 2021 01:42:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:from:date:message-id:subject:to; bh=cBhn8lo2/zLshZBkAXHHKRl/I4Nvapp30TIAe5QA1dg=; b=DqvWhIFAEp7NI8ZiyaoDrKJAt55lIzqllRh3FxntAYU+1dnUMpGl0axKaRfDF44d6Z eZI6kfGzzQ37KZ4QG8KXuUj0CoaTxhC8d+PH7qhdsECWQ+kJf1Rr1ObKIXx+HzFnU+CO qhSVgt2Jq742QgtkYeJJsTtgMTt40Jb1t/iOENYf2AJvePEEEEwJKklFs/FVhliTC+4c lC/x+fBBO/Q5IXYj3Cv3PyyI9VeklzktlX4NXCkmz2iKZq/uK7tuMUf9w0FU09IS3auB +zB5sEDMMq4S26SM8ZLniB+FLi2ZEUEhJSevX5mRi0uA7D/erGvcz4lRHtlN5gM6PhaC xNhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=cBhn8lo2/zLshZBkAXHHKRl/I4Nvapp30TIAe5QA1dg=; b=bo+puAsnAY6fyuekxletiRwLWV+1S7J4BCrdPr0JbJunHMCxayAyx1KLmMZrb8yMb6 sQZ+p/9RanWgZ0xjUMkoIS9SFM8z+9fDkhZ71NIBvfibMLUfuoMGubKXR+dap14Xb9c9 tc83OP8lnfoNnewjoYHjjfuue/dLpVYaDJfQMI2cRCZiGKOZ3gPmcgrfij4rME0wh00d nbEq4MbGeea2eLeBv7AHyRHiVJ54iO4tOIFwPUfngr5BrJwC93KjMvUjqsCGkEo3Za0Z URaSmhELzzX9648EaSUazHKP6pf21onBYWsUvVKfb48TM0qmqYslqUQXiFYvf+NATHQb 1NNg== X-Gm-Message-State: AOAM533OEReWEPUoXBcqamfcGcE7bVAsyz/31e68Uq1Mg0PG2Wo76X7m y+n7m+QvOyr2lTXfz/RWXcHuFemhMro8DkNN6Ii4YVtrp+M= X-Google-Smtp-Source: ABdhPJyIrg+lj7D+HhWi5sl+7xI+O06V+V7fBYqP0nk9dn0GbVqu00MtY8aifxtKtDt7z0kCrn1YbHA2nmO3xQAPnTg= X-Received: by 2002:a05:6214:1229:: with SMTP id p9mr3690550qvv.48.1634805775203; Thu, 21 Oct 2021 01:42:55 -0700 (PDT) MIME-Version: 1.0 From: Tommy Wu Date: Thu, 21 Oct 2021 16:42:44 +0800 Message-ID: Subject: [PATCH] avoid to break UTF-8 character when wrap message To: cgit@lists.zx2c4.com Content-Type: text/plain; charset="UTF-8" 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" Wrap message with specified length might break the UTF-8 character. We need to calculate the proper length when wrap message. --- ui-log.c | 2 +- ui-shared.c | 17 ++++++++++++++++- ui-shared.h | 2 ++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/ui-log.c b/ui-log.c index 20774bf..cf66a84 100644 --- a/ui-log.c +++ b/ui-log.c @@ -227,7 +227,7 @@ static void print_commit(struct commit *commit, struct rev_info *revs) while (i > 0 && !isspace(info->subject[i])) --i; if (!i) /* Oops, zero spaces. Reset i */ - i = ctx.cfg.max_msg_len - strlen(wrap_symbol); + i = cgit_utf8_wrap_len(info->subject, ctx.cfg.max_msg_len - strlen(wrap_symbol)); /* add remainder starting at i to msgbuf */ strbuf_add(&msgbuf, info->subject + i, subject_len - i); diff --git a/ui-shared.c b/ui-shared.c index acd8ab5..ba0a968 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -29,6 +29,20 @@ static char *http_date(time_t t) tm.tm_hour, tm.tm_min, tm.tm_sec); } +int cgit_utf8_wrap_len(const char *s, int maxlen) +{ + int i = 0, pos = 0; + + while (s[i]) { + if ((s[i] & 0xC0) != 0x80) + pos = i; + i++; + if (i > maxlen) + break; + } + return pos; +} + void cgit_print_error(const char *fmt, ...) { va_list ap; @@ -436,7 +450,8 @@ void cgit_commit_link(const char *name, const char *title, const char *class, html("'>"); if (name[0] != '\0') { if (strlen(name) > ctx.cfg.max_msg_len && ctx.cfg.max_msg_len >= 15) { - html_ntxt(name, ctx.cfg.max_msg_len - 3); + int maxlen = cgit_utf8_wrap_len(name, ctx.cfg.max_msg_len - 3); + html_ntxt(name, maxlen); html("..."); } else html_txt(name); diff --git a/ui-shared.h b/ui-shared.h index 6964873..28ec841 100644 --- a/ui-shared.h +++ b/ui-shared.h @@ -1,6 +1,8 @@ #ifndef UI_SHARED_H #define UI_SHARED_H +extern int cgit_utf8_wrap_len(const char *s, int maxlen); + extern const char *cgit_httpscheme(void); extern char *cgit_hosturl(void); extern const char *cgit_rooturl(void); -- 2.30.2