Skip to content

Commit

Permalink
Merge branch 'PR/cal-fix-weeknumber-colors' of github.com:karelzak/ut…
Browse files Browse the repository at this point in the history
…il-linux-work

* 'PR/cal-fix-weeknumber-colors' of github.com:karelzak/util-linux-work:
  tests: add color schema to cal(1) tests
  cal: colorize --vertical output.
  cal: properly colorize the week number in vertical output.
  cal: fix --week use and colors
  • Loading branch information
karelzak committed May 27, 2024
2 parents cbfcbbf + 10ce2af commit 7a2efe6
Show file tree
Hide file tree
Showing 19 changed files with 218 additions and 163 deletions.
10 changes: 9 additions & 1 deletion misc-utils/cal.1.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,12 @@ Display a calendar for the whole year.
Display a calendar for the next twelve months.
*-w*, *--week*[=_number_]::
Display week numbers in the calendar (US or ISO-8601). See the *NOTES* section for more details.
Display week numbers in the calendar according to the US or ISO-8601 format. If
a _number_ is specified, the requested week will be printed in the desired or
current year. The _number_ may be overwritten if _day_ and _month_ are also
specified.
+
See the *NOTES* section for more details.
*--color*[=_when_]::
Colorize the output. The optional argument _when_ can be *auto*, *never* or *always*. If the _when_ argument is omitted, it defaults to *auto*. The colors can be disabled; for the current built-in default see the *--help* output. See also the *COLORS* section.
Expand Down Expand Up @@ -154,6 +159,9 @@ The logical color names supported by *cal* are:
The current day.
*weeknumber*::
The week number requested by the --week=<number> command line option.
*weeks*::
The number of the week.
*header*::
Expand Down
103 changes: 86 additions & 17 deletions misc-utils/cal.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,15 +85,17 @@ enum {
CAL_COLOR_TODAY,
CAL_COLOR_HEADER,
CAL_COLOR_WEEKNUMBER,
CAL_COLOR_WEEKS,
CAL_COLOR_WORKDAY,
CAL_COLOR_WEEKEND
};

static const struct { const char * const scheme; const char * dflt; } colors[] =
{
[CAL_COLOR_TODAY] = { "today", UL_COLOR_REVERSE },
[CAL_COLOR_WEEKNUMBER] = { "weeknumber", UL_COLOR_REVERSE },
[CAL_COLOR_HEADER] = { "header", "" },
[CAL_COLOR_TODAY] = { "today", UL_COLOR_REVERSE },
[CAL_COLOR_WEEKNUMBER] = { "weeknumber", UL_COLOR_REVERSE }, /* requested week */
[CAL_COLOR_WEEKS] = { "weeks", "" }, /* week numbers */
[CAL_COLOR_HEADER] = { "header", "" },
[CAL_COLOR_WORKDAY] = { "workday", "" },
[CAL_COLOR_WEEKEND] = { "weekend", "" }
};
Expand Down Expand Up @@ -407,6 +409,8 @@ int main(int argc, char **argv)
break;
case 'w':
if (optarg) {
if (*optarg == '=')
optarg++;
ctl.req.week = strtos32_or_err(optarg,
_("invalid week argument"));
if (ctl.req.week < 1 || 54 < ctl.req.week)
Expand Down Expand Up @@ -517,10 +521,13 @@ int main(int argc, char **argv)
}
break;
case 0:
ctl.req.day = local_time.tm_yday + 1;
if (!ctl.req.week) {
ctl.req.day = local_time.tm_yday + 1;
if (!ctl.req.month)
ctl.req.month = local_time.tm_mon + 1;
}
ctl.req.year = local_time.tm_year + 1900;
if (!ctl.req.month)
ctl.req.month = local_time.tm_mon + 1;

break;
default:
warnx(_("bad usage"));
Expand Down Expand Up @@ -815,6 +822,8 @@ static void cal_vert_output_header(struct cal_month *month,
struct cal_month *m;
int month_width;

cal_enable_color(CAL_COLOR_HEADER);

month_width = ctl->day_width * (MAXDAYS / DAYS_IN_WEEK);

/* Padding for the weekdays */
Expand All @@ -841,6 +850,8 @@ static void cal_vert_output_header(struct cal_month *month,
left(out, month_width, ctl->gutter_width);
}
}

cal_disable_color(CAL_COLOR_HEADER);
fputc('\n', stdout);
}

Expand All @@ -859,6 +870,13 @@ static void cal_output_months(struct cal_month *month, const struct cal_control
const char *seq_we_start = cal_get_color_sequence(CAL_COLOR_WEEKEND);
const char *seq_we_end = cal_get_color_disable_sequence(CAL_COLOR_WEEKEND);

const char *seq_ws_start = NULL, *seq_ws_end = NULL;

if (ctl->weektype) {
seq_ws_start = cal_get_color_sequence(CAL_COLOR_WEEKS);
seq_ws_end = cal_get_color_disable_sequence(CAL_COLOR_WEEKS);
}

for (week_line = 0; week_line < MAXDAYS / DAYS_IN_WEEK; week_line++) {
for (i = month; i; i = i->next) {
/* Determine the day that should be highlighted. */
Expand All @@ -874,11 +892,21 @@ static void cal_output_months(struct cal_month *month, const struct cal_control

if (ctl->weektype) {
if (0 < i->weeks[week_line]) {
if ((ctl->weektype & WEEK_NUM_MASK) == i->weeks[week_line])
printf("%s%2d%s",
cal_get_color_sequence(CAL_COLOR_WEEKNUMBER),
i->weeks[week_line],
cal_get_color_disable_sequence(CAL_COLOR_WEEKNUMBER));
const char *seq_start, *seq_end;

/* colorize by requested week-number or generic weeks color */
if (ctl->req.week &&
ctl->req.week == i->weeks[week_line]) {
seq_start = cal_get_color_sequence(CAL_COLOR_WEEKNUMBER);
seq_end = cal_get_color_disable_sequence(CAL_COLOR_WEEKNUMBER);
} else {
seq_start = seq_ws_start;
seq_end = seq_ws_end;
}

if (seq_start && *seq_start)
printf("%s%2d%s", seq_start,
i->weeks[week_line], seq_end);
else
printf("%2d", i->weeks[week_line]);
} else
Expand Down Expand Up @@ -927,10 +955,32 @@ cal_vert_output_months(struct cal_month *month, const struct cal_control *ctl)
int i, reqday, week, d;
int skip;
struct cal_month *m;
int firstwork = ctl->weekstart == SUNDAY ? 1 : 0; /* first workday in week */

const char *seq_wo_start = cal_get_color_sequence(CAL_COLOR_WORKDAY);
const char *seq_wo_end = cal_get_color_disable_sequence(CAL_COLOR_WORKDAY);
const char *seq_we_start = cal_get_color_sequence(CAL_COLOR_WEEKEND);
const char *seq_we_end = cal_get_color_disable_sequence(CAL_COLOR_WEEKEND);
const char *seq_hd_start = cal_get_color_sequence(CAL_COLOR_HEADER);
const char *seq_hd_end = cal_get_color_disable_sequence(CAL_COLOR_HEADER);

skip = ctl->day_width;
for (i = 0; i < DAYS_IN_WEEK; i++) {
const char *seq_start = seq_wo_start,
*seq_end = seq_wo_end;

/* Day name */
fput_seq(seq_hd_start);
left(ctl->weekdays[i], ctl->day_width - 1, 0);
fput_seq(seq_hd_end);

/* Workday/Weekend color */
if (i < firstwork || i > firstwork + 4) {
seq_start = seq_we_start;
seq_end = seq_we_end;
}

/* Day digits */
for (m = month; m; m = m->next) {
reqday = 0;
if (m->month == ctl->req.month && m->year == ctl->req.year) {
Expand All @@ -943,7 +993,9 @@ cal_vert_output_months(struct cal_month *month, const struct cal_control *ctl)
}
for (week = 0; week < MAXDAYS / DAYS_IN_WEEK; week++) {
d = i + DAYS_IN_WEEK * week;

if (0 < m->days[d]) {
fput_seq(seq_start);
if (reqday == m->days[d]) {
printf("%*s%s%*d%s",
skip - (ctl->julian ? 3 : 2),
Expand All @@ -955,6 +1007,7 @@ cal_vert_output_months(struct cal_month *month, const struct cal_control *ctl)
} else {
printf("%*d", skip, m->days[d]);
}
fput_seq(seq_end);
} else {
printf("%*s", skip, "");
}
Expand All @@ -968,16 +1021,32 @@ cal_vert_output_months(struct cal_month *month, const struct cal_control *ctl)
if (!ctl->weektype)
return;

/* Week numbers */
const char *seq_ws_start = cal_get_color_sequence(CAL_COLOR_WEEKS);
const char *seq_ws_end = cal_get_color_disable_sequence(CAL_COLOR_WEEKS);

printf("%*s", (int)ctl->day_width - 1, "");
for (m = month; m; m = m->next) {
for (week = 0; week < MAXDAYS / DAYS_IN_WEEK; week++) {
if (0 < m->weeks[week]) {
if ((ctl->weektype & WEEK_NUM_MASK) == m->weeks[week])
printf("%s%*d%s",
cal_get_color_sequence(CAL_COLOR_WEEKNUMBER),
skip - (ctl->julian ? 3 : 2),
m->weeks[week],
cal_get_color_disable_sequence(CAL_COLOR_WEEKNUMBER));
const char *seq_start = NULL, *seq_end = NULL;

/* colorize by requested week-number or generic weeks color */
if (ctl->req.week &&
ctl->req.week == m->weeks[week]) {
seq_start = cal_get_color_sequence(CAL_COLOR_WEEKNUMBER);
seq_end = cal_get_color_disable_sequence(CAL_COLOR_WEEKNUMBER);
} else {
seq_start = seq_ws_start;
seq_end = seq_ws_end;
}

if (seq_start && *seq_start)
printf("%*s%s%*d%s",
skip - (ctl->julian ? 3 : 2), "",
seq_start,
(ctl->julian ? 3 : 2), m->weeks[week],
seq_end);
else
printf("%*d", skip, m->weeks[week]);
} else
Expand Down
16 changes: 8 additions & 8 deletions tests/expected/cal/color-first-day
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
January 0001
Su Mo Tu We Th Fr Sa
 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
 January 0001
Su Mo Tu We Th Fr Sa
 [ 1
 2 3 4 5 6 7 8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
16 changes: 8 additions & 8 deletions tests/expected/cal/color-last-day
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
November 9999 December 9999 January 10000
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 1 2 3 4 1
7 8 9 10 11 12 13 5 6 7 8 9 10 11 2 3 4 5 6 7 8
14 15 16 17 18 19 20 12 13 14 15 16 17 18 9 10 11 12 13 14 15
21 22 23 24 25 26 27 19 20 21 22 23 24 25 16 17 18 19 20 21 22
28 29 30 26 27 28 29 30 31 23 24 25 26 27 28 29
30 31
 November 9999 December 9999 January 10000
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
 1 2 3 4 5 6  1 2 3 4  1
 7 8 9 10 11 12 13  5 6 7 8 9 10 11  2 3 4 5 6 7 8
14 15 16 17 18 19 20 12 13 14 15 16 17 18  9 10 11 12 13 14 15
21 22 23 24 25 26 27 19 20 21 22 23 24 25 16 17 18 19 20 21 22
28 29 30 26 27 28 29 30 [31 23 24 25 26 27 28 29
30 31
10 changes: 5 additions & 5 deletions tests/expected/cal/color-reformation-corner-cases-1
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
September 1752
Su Mo Tu We Th Fr Sa
1  2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
 September 1752
Su Mo Tu We Th Fr Sa
 1 [ 2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30



10 changes: 5 additions & 5 deletions tests/expected/cal/color-reformation-corner-cases-2
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
September 1752
Su Mo Tu We Th Fr Sa
1 2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
 September 1752
Su Mo Tu We Th Fr Sa
 1 2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30



10 changes: 5 additions & 5 deletions tests/expected/cal/color-reformation-corner-cases-3
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
September 1752
Su Mo Tu We Th Fr Sa
1 2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
 September 1752
Su Mo Tu We Th Fr Sa
 1 2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30



10 changes: 5 additions & 5 deletions tests/expected/cal/color-reformation-corner-cases-4
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
September 1752
Su Mo Tu We Th Fr Sa
1 2 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
 September 1752
Su Mo Tu We Th Fr Sa
 1 2 [14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30



16 changes: 8 additions & 8 deletions tests/expected/cal/color-vertical
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
February 2023
Su 5 12 19 26
Mo 6 13 20 27
Tu 7 14 21 28
We 1 8 15 22
Th 2 9 16 23
Fr 3 10 17 24
Sa 4 11 18 25
 February 2023 
Su  5 12 19 26
Mo  6 13 20 27
Tu  7 14 21 28
We 1 8 [15 22
Th 2 9 16 23
Fr 3 10 17 24
Sa 4 11 18 25
18 changes: 9 additions & 9 deletions tests/expected/cal/color-vertical-week
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
February 2023
Su 5 12 19 26
Mo 6 13 20 27
Tu 7 14 21 28
We 1 8 15 22
Th 2 9 16 23
Fr 3 10 17 24
Sa 4 11 18 25
5 6 7 8 9
 February 2023 
Su  5 12 19 26
Mo  6 13 20 27
Tu  7 14 21 28
We 1 8 [15 22
Th 2 9 16 23
Fr 3 10 17 24
Sa 4 11 18 25
 5  6  7  8  9
16 changes: 8 additions & 8 deletions tests/expected/cal/colorw-first-day-week-numbers
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
January 0001
Su Mo Tu We Th Fr Sa
1  1
2 2 3 4 5 6 7 8
3 9 10 11 12 13 14 15
4 16 17 18 19 20 21 22
5 23 24 25 26 27 28 29
6 30 31
 January 0001
Su Mo Tu We Th Fr Sa
 1  [ 1
 2 2 3 4 5 6 7 8
 3 9 10 11 12 13 14 15
 4 16 17 18 19 20 21 22
 5 23 24 25 26 27 28 29
 6 30 31
16 changes: 8 additions & 8 deletions tests/expected/cal/colorw-last-day-week-numbers
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
November 9999 December 9999 January 10000
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
45 1 2 3 4 5 6 49 1 2 3 4 1 1
46 7 8 9 10 11 12 13 50 5 6 7 8 9 10 11 2 2 3 4 5 6 7 8
47 14 15 16 17 18 19 20 51 12 13 14 15 16 17 18 3 9 10 11 12 13 14 15
48 21 22 23 24 25 26 27 52 19 20 21 22 23 24 25 4 16 17 18 19 20 21 22
49 28 29 30 53 26 27 28 29 30 31 5 23 24 25 26 27 28 29
6 30 31
 November 9999 December 9999 January 10000
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
45  1 2 3 4 5 6 49  1 2 3 4  1  1
46 7 8 9 10 11 12 13 50 5 6 7 8 9 10 11  2 2 3 4 5 6 7 8
47 14 15 16 17 18 19 20 51 12 13 14 15 16 17 18  3 9 10 11 12 13 14 15
48 21 22 23 24 25 26 27 52 19 20 21 22 23 24 25  4 16 17 18 19 20 21 22
49 28 29 30 53 26 27 28 29 30 [31  5 23 24 25 26 27 28 29
 6 30 31
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
September 1752
Su Mo Tu We Th Fr Sa
36 1  2 14 15 16
37 17 18 19 20 21 22 23
38 24 25 26 27 28 29 30
 September 1752
Su Mo Tu We Th Fr Sa
36  1 [ 2 14 15 16
37 17 18 19 20 21 22 23
38 24 25 26 27 28 29 30



Loading

0 comments on commit 7a2efe6

Please sign in to comment.