mirror of
https://salsa.debian.org/dskoll/remind.git
synced 2026-04-16 14:28:40 +02:00
Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c0c49be0b5 | ||
|
|
c0594811bf | ||
|
|
b7e13845b6 | ||
|
|
94b340305c | ||
|
|
f477757ac0 | ||
|
|
a8017c6fc7 | ||
|
|
aad746bca3 | ||
|
|
953ff8c49e | ||
|
|
b5258b1eb5 | ||
|
|
82733e817b | ||
|
|
86e94009a4 | ||
|
|
04ea056820 | ||
|
|
d6ee16cc13 | ||
|
|
ead660fe41 | ||
|
|
58e5ae15b0 | ||
|
|
85a8a4b016 | ||
|
|
c43eaec274 | ||
|
|
13fd54b990 | ||
|
|
a48b2ec02e |
18
configure
vendored
18
configure
vendored
@@ -1,6 +1,6 @@
|
||||
#! /bin/sh
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated by GNU Autoconf 2.72 for remind 06.02.02.
|
||||
# Generated by GNU Autoconf 2.72 for remind 06.02.03.
|
||||
#
|
||||
#
|
||||
# Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation,
|
||||
@@ -601,8 +601,8 @@ MAKEFLAGS=
|
||||
# Identity of this package.
|
||||
PACKAGE_NAME='remind'
|
||||
PACKAGE_TARNAME='remind'
|
||||
PACKAGE_VERSION='06.02.02'
|
||||
PACKAGE_STRING='remind 06.02.02'
|
||||
PACKAGE_VERSION='06.02.03'
|
||||
PACKAGE_STRING='remind 06.02.03'
|
||||
PACKAGE_BUGREPORT=''
|
||||
PACKAGE_URL='https://dianne.skoll.ca/projects/remind/'
|
||||
|
||||
@@ -1258,7 +1258,7 @@ if test "$ac_init_help" = "long"; then
|
||||
# Omit some internal or obsolete options to make the list less imposing.
|
||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||
cat <<_ACEOF
|
||||
'configure' configures remind 06.02.02 to adapt to many kinds of systems.
|
||||
'configure' configures remind 06.02.03 to adapt to many kinds of systems.
|
||||
|
||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||
|
||||
@@ -1320,7 +1320,7 @@ fi
|
||||
|
||||
if test -n "$ac_init_help"; then
|
||||
case $ac_init_help in
|
||||
short | recursive ) echo "Configuration of remind 06.02.02:";;
|
||||
short | recursive ) echo "Configuration of remind 06.02.03:";;
|
||||
esac
|
||||
cat <<\_ACEOF
|
||||
|
||||
@@ -1408,7 +1408,7 @@ fi
|
||||
test -n "$ac_init_help" && exit $ac_status
|
||||
if $ac_init_version; then
|
||||
cat <<\_ACEOF
|
||||
remind configure 06.02.02
|
||||
remind configure 06.02.03
|
||||
generated by GNU Autoconf 2.72
|
||||
|
||||
Copyright (C) 2023 Free Software Foundation, Inc.
|
||||
@@ -1871,7 +1871,7 @@ cat >config.log <<_ACEOF
|
||||
This file contains any messages produced by compilers while
|
||||
running configure, to aid debugging if configure makes a mistake.
|
||||
|
||||
It was created by remind $as_me 06.02.02, which was
|
||||
It was created by remind $as_me 06.02.03, which was
|
||||
generated by GNU Autoconf 2.72. Invocation command line was
|
||||
|
||||
$ $0$ac_configure_args_raw
|
||||
@@ -4892,7 +4892,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
||||
# report actual input values of CONFIG_FILES etc. instead of their
|
||||
# values after options handling.
|
||||
ac_log="
|
||||
This file was extended by remind $as_me 06.02.02, which was
|
||||
This file was extended by remind $as_me 06.02.03, which was
|
||||
generated by GNU Autoconf 2.72. Invocation command line was
|
||||
|
||||
CONFIG_FILES = $CONFIG_FILES
|
||||
@@ -4957,7 +4957,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
|
||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||
ac_cs_config='$ac_cs_config_escaped'
|
||||
ac_cs_version="\\
|
||||
remind config.status 06.02.02
|
||||
remind config.status 06.02.03
|
||||
configured by $0, generated by GNU Autoconf 2.72,
|
||||
with options \\"\$ac_cs_config\\"
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_INIT(remind, 06.02.02, , , https://dianne.skoll.ca/projects/remind/)
|
||||
AC_INIT(remind, 06.02.03, , , https://dianne.skoll.ca/projects/remind/)
|
||||
AC_CONFIG_SRCDIR([src/queue.c])
|
||||
|
||||
cat <<'EOF'
|
||||
|
||||
@@ -106,7 +106,8 @@
|
||||
"Syntax table for `remind-conf-mode'.")
|
||||
|
||||
;;; keyword sets
|
||||
|
||||
;;; MOON, WEEK, SHADE, COLOR and COLOUR are not really keywords,
|
||||
;;; but they are widely-supported SPECIALS, so I add them here.
|
||||
(defconst remind-keywords
|
||||
(sort
|
||||
(list "ADDOMIT" "AFTER" "AT" "BAN" "BANNER" "BEFORE" "CAL" "CLEAR"
|
||||
@@ -120,7 +121,8 @@
|
||||
"PSFILE" "PUSH" "PUSH-FUNCS" "PUSH-VARS" "PUSH-OMIT-CONTEXT" "REM" "RETURN"
|
||||
"RUN" "SATISFY" "SCAN" "SCANFROM" "SCHED" "SECOND" "SET"
|
||||
"SKIP" "SPECIAL" "SYSINCLUDE" "TAG" "THIRD" "THROUGH" "TODO"
|
||||
"TRANSLATE" "TRANS" "TZ" "UNSET" "UNTIL" "WARN")
|
||||
"TRANSLATE" "TRANS" "TZ" "UNSET" "UNTIL" "WARN"
|
||||
"MOON" "WEEK" "SHADE" "COLOR" "COLOUR")
|
||||
#'(lambda (a b) (> (length a) (length b)))))
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,40 @@
|
||||
CHANGES TO REMIND
|
||||
|
||||
* VERSION 06.02.03 - 2026-02-05
|
||||
|
||||
- NEW FEATURE: rem2html: Add a new --yaag option to produce a calendar
|
||||
in the "year-at-a-glance" format. This format features a table with
|
||||
an entire month in each row. Thanks to Robert Black for suggesting
|
||||
this and for helping out with the CSS.
|
||||
|
||||
- CHANGE: remind: If standard output is a TTY, then default
|
||||
$TerminalHyperlinks to 1
|
||||
|
||||
- CHANGE: remind: Increase the default value of $MaxSatIter from 1000
|
||||
to 10000, reflecting the higher speed of the new expression
|
||||
evaluation engine as well as the speed of modern CPUs.
|
||||
|
||||
- UPDATE: examples/remind.vim: Update the URL to point to maintained
|
||||
version.
|
||||
|
||||
- IMPROVEMENT: include/sun.rem: Add Wikipedia links for sunrise/sunset
|
||||
|
||||
- IMPROVEMENT: Add MOON, SHADE, WEEK, COLOR and COLOUR to the Emacs
|
||||
syntax highlighting keyword list.
|
||||
|
||||
- IMPROVEMENT: If an invalid value is assigned to a system variable,
|
||||
issue the error "Invalid value for system variable" rather than
|
||||
"Type mismatch"
|
||||
|
||||
- DOC FIX: Fix typo in man page
|
||||
|
||||
- BUG FIX: rem2html: Eliminate "use of uninitialized variable"
|
||||
warning.
|
||||
|
||||
- BUG FIX: remind: The "trigbase" JSON key in "remind -pp" output had
|
||||
an incorrectly-formatted value. This has been fixed; thanks to
|
||||
Georg Simon for reporting this bug.
|
||||
|
||||
* VERSION 06.02.02 - 2026-01-10
|
||||
|
||||
- NEW FEATURE: remind: Turn reminders with a "Url:" INFO string into
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
" Maintainer: Davide Alberani <da@erlug.linux.it>
|
||||
" Last Change: 02 Nov 2015 + 13 Mar 2022 by Dianne Skoll <dianne@skoll.ca>
|
||||
" Version: 0.7+dianne1
|
||||
" URL: http://ismito.it/vim/syntax/remind.vim
|
||||
" URL: https://github.com/alberanid/vim-config/blob/master/syntax/remind.vim
|
||||
"
|
||||
" remind is a sophisticated reminder service
|
||||
" you can download remind from:
|
||||
|
||||
@@ -7,6 +7,6 @@ IF access($SysInclude + "/translations/" + _("LANGID") + "/sun.rem", "r") >= 0
|
||||
ENDIF
|
||||
|
||||
IF !$CalMode && !$PsCal
|
||||
REM NOQUEUE AT [sunrise()] MSG %"%"%(Sunrise) %! %2.
|
||||
REM NOQUEUE AT [sunset()] MSG %"%"%(Sunset) %! %2.
|
||||
REM INFO "Url: https://en.wikipedia.org/wiki/Sunrise" NOQUEUE AT [sunrise()] MSG %"%"%(Sunrise) %! %2.
|
||||
REM INFO "Url: https://en.wikipedia.org/wiki/Sunset" NOQUEUE AT [sunset()] MSG %"%"%(Sunset) %! %2.
|
||||
ENDIF
|
||||
|
||||
@@ -1360,7 +1360,7 @@ minutes. That is, 13:39 and 13.39 are equivalent.
|
||||
for a timed reminder is the same as the current system date, the
|
||||
reminder is queued for later activation. When \fBRemind\fR has
|
||||
finished processing the reminder file, it puts itself in the
|
||||
background, and activates timed reminders when the system time reached
|
||||
background, and activates timed reminders when the system time reaches
|
||||
the specified time. Note that if you use the \fBNOQUEUE\fR modifier
|
||||
in the \fBREM\fR command, then this queuing and background activation
|
||||
is \fInot\fR performed. \fBNOQUEUE\fR is useful if you want a time
|
||||
@@ -3259,7 +3259,7 @@ near the beginning of the file and not change it after that.
|
||||
.TP
|
||||
.B $MaxSatIter
|
||||
The maximum number of iterations for the \fBSATISFY\fR clause
|
||||
(described later.) Must be at least 10.
|
||||
(described later.) Must be at least 10. The default value is 10,000.
|
||||
.TP
|
||||
.B $MaxStringLen
|
||||
A limit on the longest string that \fBRemind\fR will allow you
|
||||
@@ -3492,8 +3492,8 @@ at most 85 out of 255, and if the maximum of any component is at most
|
||||
If your terminal supports escape sequences to allow HTML-like
|
||||
anchors around text (see https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda), then you can set this variable to 1. \fBRemind\fR will then
|
||||
make any reminder with a "Url:" info string into a hyperlink in your
|
||||
terminal. By default, \fB$TerminalHyperlinks\fR is set to zero because
|
||||
not all terminals support this feature.
|
||||
terminal. By default, \fB$TerminalHyperlinks\fR is set to 1 if \fBRemind\fR's
|
||||
standard output is a terminal, or to 0 if it is not.
|
||||
.TP
|
||||
.B $WarningLevel (STRING type)
|
||||
As new versions of \fBRemind\fR are released, new warnings may be added.
|
||||
|
||||
@@ -96,6 +96,14 @@ without any E<lt>htmlE<gt> or E<lt>bodyE<gt> tags.
|
||||
Use I<title> as the content between E<lt>titleE<gt> and E<lt>/titleE<gt>
|
||||
tags.
|
||||
|
||||
=item --yaag
|
||||
|
||||
Instead of making 7-column tables for each month, show each month
|
||||
as a I<single> table row of 38 columns. This is the so-called
|
||||
"year-at-a-glance" format. You must use the "-ppp" option to
|
||||
C<remind> or the --yaag option will be ignored. And this format
|
||||
works best if you create a calendar for an entire year (so, starting
|
||||
in January and using "-ppp12" to get 12 months' worth of reminders.)
|
||||
|
||||
=item --prologue I<html_text>
|
||||
|
||||
@@ -188,6 +196,7 @@ Options:
|
||||
--title string What to put in <title>...</title> tags
|
||||
--prologue html_text Text to insert at the top of the body
|
||||
--epilogue html_text Text to insert at the end of the body
|
||||
--yaag Output one month per row for year-at-a-glance format
|
||||
EOM
|
||||
exit($exit_status);
|
||||
}
|
||||
@@ -218,6 +227,7 @@ sub parse_options
|
||||
"man",
|
||||
"utf8",
|
||||
"pngs",
|
||||
"yaag",
|
||||
"version",
|
||||
"stylesheet=s",
|
||||
"nostyle",
|
||||
@@ -316,6 +326,10 @@ sub parse_input
|
||||
if ($_ eq '[') {
|
||||
return parse_input_ppp();
|
||||
}
|
||||
if ($Options{yaag}) {
|
||||
$Options{yaag} = 0;
|
||||
print STDERR "Ignoring option --yaag: You must use remind -ppp for this option\n";
|
||||
}
|
||||
if (/# translations/) {
|
||||
slurp_translations();
|
||||
next;
|
||||
@@ -472,6 +486,10 @@ sub parse_input_ppp
|
||||
}
|
||||
if (exists($array->[0]{caltype}) &&
|
||||
$array->[0]{caltype} eq 'weekly') {
|
||||
if ($Options{yaag}) {
|
||||
$Options{yaag} = 0;
|
||||
print STDERR "Ignoring option --yaag for a weekly calendar\n";
|
||||
}
|
||||
emit_ppp_calendars($array, 'weekly');
|
||||
} else {
|
||||
emit_ppp_calendars($array, 'monthly');
|
||||
@@ -488,11 +506,51 @@ sub parse_input_ppp
|
||||
}
|
||||
}
|
||||
|
||||
sub print_yaag_weekday_row
|
||||
{
|
||||
my ($cal) = @_;
|
||||
print "<tr class=\"rem-yaag-weekday-row\">";
|
||||
print "<th class=\"rem-yaag-empty-header\"> </th>";
|
||||
my $ex;
|
||||
for (my $i=0; $i<37; $i++) {
|
||||
my $day;
|
||||
if ($cal->{mondayfirst}) {
|
||||
$day = $cal->{daynames}->[($i+1) % 7];
|
||||
} else {
|
||||
$day = $cal->{daynames}->[$i % 7];
|
||||
}
|
||||
if (($i % 7) == 6) {
|
||||
$ex = " rem-yaag-end-of-week";
|
||||
} else {
|
||||
$ex = "";
|
||||
}
|
||||
print "<th class=\"rem-yaag-weekday-header$ex\">$day</th>";
|
||||
}
|
||||
print "</tr>\n";
|
||||
}
|
||||
|
||||
sub emit_ppp_calendars
|
||||
{
|
||||
my ($array, $type) = @_;
|
||||
my $prev_year = 0;
|
||||
my $done_one = 0;
|
||||
foreach my $cal (@$array) {
|
||||
if ($Options{yaag}) {
|
||||
if ($cal->{year} != $prev_year) {
|
||||
$prev_year = $cal->{year};
|
||||
if ($done_one) {
|
||||
print "</table>\n";
|
||||
}
|
||||
print "<span class=\"year_heading\">$prev_year</span>\n";
|
||||
print "<table class=\"rem-yaag\">\n";
|
||||
print_yaag_weekday_row($cal);
|
||||
}
|
||||
}
|
||||
emit_one_ppp_calendar($cal, $type);
|
||||
$done_one = 1;
|
||||
}
|
||||
if ($done_one) {
|
||||
print "</table>\n";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -766,42 +824,79 @@ sub output_calendar
|
||||
|
||||
# Start the table
|
||||
my $class;
|
||||
if ($Options{nostyle}) {
|
||||
print '<table width="100%" border="1" cellspacing=\"0\"><caption>' .
|
||||
$Month . ' ' . $Year . '</caption>' . "\n";
|
||||
print '<tr>';
|
||||
$class = ' width="14%"';
|
||||
} else {
|
||||
if ($type eq 'monthly') {
|
||||
print '<table class="rem-cal"><caption class="rem-cal-caption">' .
|
||||
$Month . ' ' . $Year . '</caption>' . "\n";
|
||||
if (!$Options{yaag}) {
|
||||
if ($Options{nostyle}) {
|
||||
print '<table width="100%" border="1" cellspacing="0">';
|
||||
if ($type eq 'monthly') {
|
||||
print "<caption>$Month $Year </caption>";
|
||||
}
|
||||
print "\n<tr>";
|
||||
$class = ' width="14%"';
|
||||
} else {
|
||||
print '<table class="rem-cal">' . "\n";
|
||||
if ($type eq 'monthly') {
|
||||
print '<table class="rem-cal"><caption class="rem-cal-caption">' .
|
||||
$Month . ' ' . $Year . '</caption>' . "\n";
|
||||
} else {
|
||||
print '<table class="rem-cal">' . "\n";
|
||||
}
|
||||
print '<tr class="rem-cal-hdr-row">';
|
||||
$class = ' class="rem-cal-hdr"';
|
||||
}
|
||||
print '<tr class="rem-cal-hdr-row">';
|
||||
$class = ' class="rem-cal-hdr"';
|
||||
}
|
||||
if ($type eq 'monthly') {
|
||||
if (!$Mondayfirst) {
|
||||
print "<th$class>" . $Daynames[0] . '</th>';
|
||||
if ($type eq 'monthly') {
|
||||
if (!$Mondayfirst) {
|
||||
print "<th$class>" . $Daynames[0] . '</th>';
|
||||
}
|
||||
for (my $i=1; $i<7; $i++) {
|
||||
print "<th$class>" . $Daynames[$i] . '</th>';
|
||||
}
|
||||
if ($Mondayfirst) {
|
||||
print "<th$class>" . $Daynames[0] . '</th>';
|
||||
}
|
||||
} else {
|
||||
for (my $i=0; $i<7; $i++) {
|
||||
my $inf = $date_info->[$i];
|
||||
print "<th$class>" . $inf->{dayname} . "<br>" .
|
||||
$inf->{day} . ' ' .
|
||||
$inf->{month} . ' ' .
|
||||
$inf->{year} . '</th>';
|
||||
}
|
||||
}
|
||||
for (my $i=1; $i<7; $i++) {
|
||||
print "<th$class>" . $Daynames[$i] . '</th>';
|
||||
}
|
||||
if ($Mondayfirst) {
|
||||
print "<th$class>" . $Daynames[0] . '</th>';
|
||||
}
|
||||
} else {
|
||||
for (my $i=0; $i<7; $i++) {
|
||||
my $inf = $date_info->[$i];
|
||||
print "<th$class>" . $inf->{dayname} . "<br>" .
|
||||
$inf->{day} . ' ' .
|
||||
$inf->{month} . ' ' .
|
||||
$inf->{year} . '</th>';
|
||||
}
|
||||
}
|
||||
|
||||
print "</tr>\n";
|
||||
print "</tr>\n";
|
||||
} else {
|
||||
# For year-at-a-glance calendar, it's just a row
|
||||
print '<tr class="rem-yaag-cal-row">';
|
||||
print '<th class="rem-yaag-cal-hdr">' . $Month . "</th>\n";
|
||||
|
||||
my $cells_drawn = 0;
|
||||
# Print the blank ones
|
||||
for (my $i=0; $i<$first_col; $i++) {
|
||||
print "<td class=\"rem-yaag-cal-blank\"> </td>";
|
||||
$cells_drawn++;
|
||||
}
|
||||
|
||||
# All the entries
|
||||
for (my $day=1; $day <= $Numdays; $day++) {
|
||||
if (($cells_drawn % 7) == 6) {
|
||||
draw_day_cell($day, 1, $type, ' rem-yaag-end-of-week');
|
||||
} else {
|
||||
draw_day_cell($day, 1, $type);
|
||||
}
|
||||
$cells_drawn++;
|
||||
}
|
||||
|
||||
# And fill in the remaining ones
|
||||
while ($cells_drawn < 37) {
|
||||
if (($cells_drawn % 7) == 6) {
|
||||
print "<td class=\"rem-yaag-cal-blank rem-yaag-end-of-week\"> </td>";
|
||||
} else {
|
||||
print "<td class=\"rem-yaag-cal-blank\"> </td>";
|
||||
}
|
||||
$cells_drawn++;
|
||||
}
|
||||
print "</tr>\n";
|
||||
return;
|
||||
}
|
||||
# Start the calendar rows
|
||||
my $col = 0;
|
||||
if ($Options{nostyle}) {
|
||||
@@ -895,9 +990,10 @@ sub output_calendar
|
||||
|
||||
sub draw_day_cell
|
||||
{
|
||||
my($day, $number_of_rows, $type) = @_;
|
||||
my($day, $number_of_rows, $type, $extra_class) = @_;
|
||||
my $shade = $shades->[$day];
|
||||
my $week = '';
|
||||
$extra_class = '' unless defined($extra_class);
|
||||
if (exists($weeks->{$day})) {
|
||||
if ($weeks->{$day}->{url}) {
|
||||
$week = ' <a href="' . $weeks->{$day}->{url} . '">' . escape_html($weeks->{$day}->{body}) . '</a>';
|
||||
@@ -905,19 +1001,22 @@ sub draw_day_cell
|
||||
$week = ' ' . escape_html($weeks->{$day}->{body});
|
||||
}
|
||||
}
|
||||
my $class;
|
||||
if ($Options{nostyle}) {
|
||||
$class = $classes->[$day] || '';
|
||||
} else {
|
||||
$class = $classes->[$day] || "rem-cell rem-cell-$number_of_rows-rows";
|
||||
my $class = $classes->[$day] || '';
|
||||
if (!$Options{nostyle}) {
|
||||
$class .= ' ' if $class ne '';
|
||||
if ($Options{yaag}) {
|
||||
$class .= "rem-yaag-cell"
|
||||
} else {
|
||||
$class .= "rem-cell rem-cell-$number_of_rows-rows";
|
||||
}
|
||||
}
|
||||
if ($shade) {
|
||||
$shade = " style=\"background: $shade;\"";
|
||||
} else {
|
||||
$shade = "";
|
||||
}
|
||||
if ($class ne '') {
|
||||
print "<td class=\"$class\"$shade>\n";
|
||||
if ($class ne '' || $extra_class ne '') {
|
||||
print "<td class=\"$class$extra_class\"$shade>\n";
|
||||
} else {
|
||||
print "<td valign=\"top\" $shade>\n";
|
||||
}
|
||||
@@ -982,7 +1081,11 @@ sub draw_day_cell
|
||||
print "<div style=\"float: right\">$day$week</div>\n";
|
||||
print "<p> </p>\n";
|
||||
} else {
|
||||
print "<div class=\"rem-daynumber\">$day$week</div>\n";
|
||||
if ($Options{yaag}) {
|
||||
print "<div class=\"rem-yaag-daynumber\">$day$week</div>\n";
|
||||
} else {
|
||||
print "<div class=\"rem-daynumber\">$day$week</div>\n";
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if ($Options{nostyle}) {
|
||||
@@ -1048,6 +1151,11 @@ table.rem-cal {
|
||||
font-size: 12pt;
|
||||
}
|
||||
|
||||
span.year_heading {
|
||||
font-family: helvetica, arial, sans-serif;
|
||||
font-size: 28pt;
|
||||
}
|
||||
|
||||
table.rem-sc-table {
|
||||
font-family: helvetica, arial, sans-serif;
|
||||
font-size: 10pt;
|
||||
@@ -1073,14 +1181,6 @@ td.rem-empty, td.rem-cell, td.rem-small-calendar {
|
||||
border-width: 1px;
|
||||
vertical-align: top;
|
||||
}
|
||||
td.rem-today {
|
||||
width: 14%;
|
||||
height: 7em;
|
||||
border-style: solid;
|
||||
border-width: 2px;
|
||||
border-color: #EE3333;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.rem-cal {
|
||||
width: 100%;
|
||||
@@ -1116,5 +1216,84 @@ td.rem-sc-empty-cell, td.rem-sc-cell {
|
||||
caption.rem-sc-caption {
|
||||
font-size: 12pt;
|
||||
}
|
||||
|
||||
table.rem-yaag {
|
||||
font-family: helvetica, arial, sans-serif;
|
||||
font-size: 8pt;
|
||||
table-layout: fixed;
|
||||
cellspacing: 0;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
td.rem-yaag-cell {
|
||||
height: 7em;
|
||||
border-style: solid;
|
||||
border-color: #adadad;
|
||||
border-width: 1px;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
th.rem-yaag-weekday-header {
|
||||
font-weight: 100;
|
||||
font-size: 9pt;
|
||||
padding: 6px 0 0 6px;
|
||||
text-align:left;
|
||||
border-style: solid;
|
||||
border-color: #adadad;
|
||||
border-width: 1px;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
td.rem-yaag-cal-blank {
|
||||
height: 7em;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
border-color: #adadad;
|
||||
background-color: #d5d6d5;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
td.rem-yaag-end-of-week {
|
||||
border-right-width: 3;
|
||||
}
|
||||
|
||||
th.rem-yaag-end-of-week {
|
||||
border-right: 2px solid #4B4B4B;
|
||||
}
|
||||
|
||||
th.rem-yaag-cal-hdr {
|
||||
text-align: right;
|
||||
padding-top: 8px;
|
||||
padding-right: 5px;
|
||||
font-weight: 100;
|
||||
font-size: 9pt;
|
||||
border-style: solid;
|
||||
border-color: #adadad;
|
||||
border-width: 1px;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
div.rem-yaag-daynumber {
|
||||
float: right;
|
||||
text-align: right;
|
||||
vertical-align: top;
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
tr.rem-yaag-cal-row:nth-child(3n+1) {
|
||||
border-bottom: 3px solid #000;
|
||||
}
|
||||
|
||||
.rem-yaag-weekday-row .rem-yaag-empty-header {
|
||||
height: 20pt;
|
||||
width: 70px !important;
|
||||
}
|
||||
|
||||
td.rem-today {
|
||||
border-style: solid;
|
||||
border-width: 2px;
|
||||
border-color: #EE3333;
|
||||
}
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
@@ -2549,7 +2549,7 @@ void WriteJSONTrigger(Trigger const *t, int include_tags)
|
||||
PrintJSONKeyPairInt("rep", t->rep);
|
||||
}
|
||||
if (t->d != NO_DAY && t->m != NO_MON && t->y != NO_YR) {
|
||||
printf("\"trigbase\":\"%04d-%02d-%-2d\",",
|
||||
printf("\"trigbase\":\"%04d-%02d-%02d\",",
|
||||
t->y, t->m+1, t->d);
|
||||
}
|
||||
/* Local omit is an array of days from 0=monday to 6=sunday.
|
||||
|
||||
@@ -138,6 +138,7 @@
|
||||
#define E_EXPR_NODES_EXCEEDED 114
|
||||
#define E_EXPECTING_EOXPR 115
|
||||
#define E_EXPECTING_ATOM 116
|
||||
#define E_BAD_VAL_FOR_SYSVAR 117
|
||||
|
||||
#ifdef MK_GLOBALS
|
||||
#undef EXTERN
|
||||
@@ -272,6 +273,7 @@ EXTERN char *ErrMsg[]
|
||||
/* E_EXPR_NODES_EXCEEDED */ "Maximum expression complexity exceeded",
|
||||
/* E_EXPECTING_EOXPR */ "Expecting operator or end-of-expression",
|
||||
/* E_EXPECTING_ATOM */ "Expecting constant, variable, function call or (expression)",
|
||||
/* E_BAD_VAL_FOR_SYSVAR */ "Invalid value for system variable",
|
||||
}
|
||||
#endif /* MK_GLOBALS */
|
||||
;
|
||||
|
||||
94
src/expr.c
94
src/expr.c
@@ -242,6 +242,31 @@ find_end_of_expr(char const *s)
|
||||
return e;
|
||||
}
|
||||
|
||||
/***************************************************************/
|
||||
/* */
|
||||
/* node_str - get string associated with a node */
|
||||
/* */
|
||||
/***************************************************************/
|
||||
static char const *
|
||||
node_str(expr_node const *node)
|
||||
{
|
||||
switch(node->type) {
|
||||
case N_VARIABLE:
|
||||
case N_SYSVAR:
|
||||
case N_USER_FUNC:
|
||||
return node->u.value.v.str;
|
||||
|
||||
case N_SHORT_VAR:
|
||||
case N_SHORT_SYSVAR:
|
||||
case N_SHORT_USER_FUNC:
|
||||
case N_SHORT_STR:
|
||||
return node->u.name;
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************************************/
|
||||
/* */
|
||||
/* alloc_expr_node - allocate an expr_node object */
|
||||
@@ -418,11 +443,7 @@ get_var(expr_node *node, Value *ans, int *nonconst)
|
||||
Var *v;
|
||||
char const *str;
|
||||
|
||||
if (node->type == N_SHORT_VAR) {
|
||||
str = node->u.name;
|
||||
} else {
|
||||
str = node->u.value.v.str;
|
||||
}
|
||||
str = node_str(node);
|
||||
v = FindVar(str, 0);
|
||||
if (!v) {
|
||||
Eprint("%s: `%s'", GetErr(E_NOSUCH_VAR), str);
|
||||
@@ -448,11 +469,7 @@ get_var(expr_node *node, Value *ans, int *nonconst)
|
||||
static int
|
||||
get_sysvar(expr_node const *node, Value *ans)
|
||||
{
|
||||
if (node->type == N_SHORT_SYSVAR) {
|
||||
return GetSysVar(node->u.name, ans);
|
||||
} else {
|
||||
return GetSysVar(node->u.value.v.str, ans);
|
||||
}
|
||||
return GetSysVar(node_str(node), ans);
|
||||
}
|
||||
|
||||
/***************************************************************/
|
||||
@@ -619,13 +636,9 @@ eval_builtin(expr_node *node, Value *locals, Value *ans, int *nonconst)
|
||||
static void
|
||||
debug_enter_userfunc(expr_node *node, Value *locals, int nargs)
|
||||
{
|
||||
char const *fname;
|
||||
int i;
|
||||
if (node->type == N_SHORT_USER_FUNC) {
|
||||
fname = node->u.name;
|
||||
} else {
|
||||
fname = node->u.value.v.str;
|
||||
}
|
||||
char const *fname = node_str(node);
|
||||
|
||||
fprintf(ErrFp, "%s %s(", GetErr(E_ENTER_FUN), fname);
|
||||
for (i=0; i<nargs; i++) {
|
||||
if (i) fprintf(ErrFp, ", ");
|
||||
@@ -645,13 +658,9 @@ debug_enter_userfunc(expr_node *node, Value *locals, int nargs)
|
||||
static void
|
||||
debug_exit_userfunc(expr_node *node, Value const *ans, int r, Value *locals, int nargs)
|
||||
{
|
||||
char const *fname;
|
||||
char const *fname = node_str(node);
|
||||
int i;
|
||||
if (node->type == N_SHORT_USER_FUNC) {
|
||||
fname = node->u.name;
|
||||
} else {
|
||||
fname = node->u.value.v.str;
|
||||
}
|
||||
|
||||
fprintf(ErrFp, "%s %s(", GetErr(E_LEAVE_FUN), fname);
|
||||
for (i=0; i<nargs; i++) {
|
||||
if (i) fprintf(ErrFp, ", ");
|
||||
@@ -702,12 +711,7 @@ eval_userfunc(expr_node *node, Value *locals, Value *ans, int *nonconst)
|
||||
Value stack_locals[STACK_ARGS_MAX];
|
||||
|
||||
/* Get the function name */
|
||||
char const *fname;
|
||||
if (node->type == N_SHORT_USER_FUNC) {
|
||||
fname = node->u.name;
|
||||
} else {
|
||||
fname = node->u.value.v.str;
|
||||
}
|
||||
char const *fname = node_str(node);
|
||||
|
||||
/* Find the function */
|
||||
f = FindUserFunc(fname);
|
||||
@@ -913,13 +917,9 @@ evaluate_expr_node(expr_node *node, Value *locals, Value *ans, int *nonconst)
|
||||
return CopyValue(ans, &(node->u.value));
|
||||
|
||||
case N_SHORT_VAR:
|
||||
r = get_var(node, ans, nonconst);
|
||||
DBG(debug_evaluation(ans, r, "%s", node->u.name));
|
||||
return r;
|
||||
|
||||
case N_VARIABLE:
|
||||
r = get_var(node, ans, nonconst);
|
||||
DBG(debug_evaluation(ans, r, "%s", node->u.value.v.str));
|
||||
DBG(debug_evaluation(ans, r, "%s", node_str(node)));
|
||||
return r;
|
||||
|
||||
case N_LOCAL_VAR:
|
||||
@@ -929,19 +929,12 @@ evaluate_expr_node(expr_node *node, Value *locals, Value *ans, int *nonconst)
|
||||
return r;
|
||||
|
||||
case N_SHORT_SYSVAR:
|
||||
/* System var? Return it and note non-constant expression */
|
||||
nonconst_debug(*nonconst, tr("System variable `$%s' makes expression non-constant"), node->u.name);
|
||||
*nonconst = 1;
|
||||
r = get_sysvar(node, ans);
|
||||
DBG(debug_evaluation(ans, r, "$%s", node->u.name));
|
||||
return r;
|
||||
|
||||
case N_SYSVAR:
|
||||
/* System var? Return it and note non-constant expression */
|
||||
nonconst_debug(*nonconst, tr("System variable `$%s' makes expression non-constant"), node->u.value.v.str);
|
||||
nonconst_debug(*nonconst, tr("System variable `$%s' makes expression non-constant"), node_str(node));
|
||||
*nonconst = 1;
|
||||
r = get_sysvar(node, ans);
|
||||
DBG(debug_evaluation(ans, r, "$%s", node->u.value.v.str));
|
||||
DBG(debug_evaluation(ans, r, "$%s", node_str(node)));
|
||||
return r;
|
||||
|
||||
case N_BUILTIN_FUNC:
|
||||
@@ -952,8 +945,8 @@ evaluate_expr_node(expr_node *node, Value *locals, Value *ans, int *nonconst)
|
||||
}
|
||||
return eval_builtin(node, locals, ans, nonconst);
|
||||
|
||||
case N_USER_FUNC:
|
||||
case N_SHORT_USER_FUNC:
|
||||
case N_USER_FUNC:
|
||||
/* User-defined function? Evaluate it */
|
||||
return eval_userfunc(node, locals, ans, nonconst);
|
||||
|
||||
@@ -2869,16 +2862,12 @@ static void print_expr_tree(expr_node *node, FILE *fp)
|
||||
fprintf(fp, "\"%s\"", node->u.name);
|
||||
return;
|
||||
case N_SHORT_VAR:
|
||||
fprintf(fp, "%s", node->u.name);
|
||||
return;
|
||||
case N_VARIABLE:
|
||||
fprintf(fp, "%s", node->u.value.v.str);
|
||||
fprintf(fp, "%s", node_str(node));
|
||||
return;
|
||||
case N_SHORT_SYSVAR:
|
||||
fprintf(fp, "$%s", node->u.name);
|
||||
return;
|
||||
case N_SYSVAR:
|
||||
fprintf(fp, "$%s", node->u.value.v.str);
|
||||
fprintf(fp, "$%s", node_str(node));
|
||||
return;
|
||||
case N_LOCAL_VAR:
|
||||
fprintf(fp, "arg[%d]", node->u.arg);
|
||||
@@ -2892,13 +2881,8 @@ static void print_expr_tree(expr_node *node, FILE *fp)
|
||||
fprintf(fp, ")");
|
||||
return;
|
||||
case N_SHORT_USER_FUNC:
|
||||
fprintf(fp, "(%s", node->u.name);
|
||||
if (node->child) fprintf(fp, " ");
|
||||
print_kids(node, fp);
|
||||
fprintf(fp, ")");
|
||||
return;
|
||||
case N_USER_FUNC:
|
||||
fprintf(fp, "(%s", node->u.value.v.str);
|
||||
fprintf(fp, "(%s", node_str(node));
|
||||
if (node->child) fprintf(fp, " ");
|
||||
print_kids(node, fp);
|
||||
fprintf(fp, ")");
|
||||
|
||||
@@ -127,7 +127,7 @@ EXTERN INIT( int DefaultColorB, -1);
|
||||
EXTERN INIT( int DefaultColorG, -1);
|
||||
EXTERN INIT( int SynthesizeTags, 0);
|
||||
EXTERN INIT( int ScFormat, SC_AMPM);
|
||||
EXTERN INIT( int MaxSatIter, 1000);
|
||||
EXTERN INIT( int MaxSatIter, 10000);
|
||||
EXTERN INIT( int MaxStringLen, MAX_STR_LEN);
|
||||
EXTERN INIT( int UseStdin, 0);
|
||||
EXTERN INIT( int PurgeMode, 0);
|
||||
@@ -174,7 +174,7 @@ EXTERN INIT( char *Location, LOCATION);
|
||||
/* Support hyperlinks in terminal emulators?
|
||||
https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda
|
||||
*/
|
||||
EXTERN INIT( int TerminalHyperlinks, 0);
|
||||
EXTERN INIT( int TerminalHyperlinks, -1);
|
||||
/* UTC calculation stuff */
|
||||
EXTERN INIT( int MinsFromUTC, 0);
|
||||
EXTERN INIT( int CalculateUTC, 1);
|
||||
|
||||
@@ -849,6 +849,15 @@ void InitRemind(int argc, char const *argv[])
|
||||
(void) CalcMinsFromUTC(DSEToday, MinutesPastMidnight(0),
|
||||
&MinsFromUTC, NULL);
|
||||
}
|
||||
|
||||
/* If stdout is a tty, enable terminal hyperlinks by default */
|
||||
if (TerminalHyperlinks == -1) {
|
||||
if (isatty(STDOUT_FILENO)) {
|
||||
TerminalHyperlinks = 1;
|
||||
} else {
|
||||
TerminalHyperlinks = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************************************/
|
||||
|
||||
10
src/var.c
10
src/var.c
@@ -172,7 +172,7 @@ static int latitude_longitude_func(int do_set, Value *val, double *var, double m
|
||||
} else {
|
||||
if (val->type != STR_TYPE) return E_BAD_TYPE;
|
||||
x = strtod_in_c_locale(val->v.str, &endptr);
|
||||
if (*endptr) return E_BAD_TYPE;
|
||||
if (*endptr) return E_BAD_VAL_FOR_SYSVAR;
|
||||
}
|
||||
if (x < min) return E_2LOW;
|
||||
if (x > max) return E_2HIGH;
|
||||
@@ -466,7 +466,7 @@ static int datetime_sep_func(int do_set, Value *val)
|
||||
if (val->type != STR_TYPE) return E_BAD_TYPE;
|
||||
if (strcmp(val->v.str, "T") &&
|
||||
strcmp(val->v.str, "@")) {
|
||||
return E_BAD_TYPE;
|
||||
return E_BAD_VAL_FOR_SYSVAR;
|
||||
}
|
||||
DateTimeSep = val->v.str[0];
|
||||
return OK;
|
||||
@@ -512,7 +512,7 @@ static int default_color_func(int do_set, Value *val)
|
||||
}
|
||||
if (val->type != STR_TYPE) return E_BAD_TYPE;
|
||||
if (sscanf(val->v.str, "%d %d %d", &col_r, &col_g, &col_b) != 3) {
|
||||
return E_BAD_TYPE;
|
||||
return E_BAD_VAL_FOR_SYSVAR;
|
||||
}
|
||||
/* They either all have to be -1, or all between 0 and 255 */
|
||||
if (col_r == -1 && col_g == -1 && col_b == -1) {
|
||||
@@ -547,7 +547,7 @@ static int date_sep_func(int do_set, Value *val)
|
||||
if (val->type != STR_TYPE) return E_BAD_TYPE;
|
||||
if (strcmp(val->v.str, "/") &&
|
||||
strcmp(val->v.str, "-")) {
|
||||
return E_BAD_TYPE;
|
||||
return E_BAD_VAL_FOR_SYSVAR;
|
||||
}
|
||||
DateSep = val->v.str[0];
|
||||
return OK;
|
||||
@@ -566,7 +566,7 @@ static int time_sep_func(int do_set, Value *val)
|
||||
if (val->type != STR_TYPE) return E_BAD_TYPE;
|
||||
if (strcmp(val->v.str, ":") &&
|
||||
strcmp(val->v.str, ".")) {
|
||||
return E_BAD_TYPE;
|
||||
return E_BAD_VAL_FOR_SYSVAR;
|
||||
}
|
||||
TimeSep = val->v.str[0];
|
||||
return OK;
|
||||
|
||||
@@ -76,6 +76,7 @@ COLOUR
|
||||
CONTEXTs
|
||||
CPAN
|
||||
CPP's
|
||||
CPUs
|
||||
CalMode
|
||||
CalType
|
||||
CalcMinsFromUTC
|
||||
@@ -160,6 +161,7 @@ FreeBSD
|
||||
Fromnow
|
||||
GPL
|
||||
Gedalia
|
||||
Georg
|
||||
Getopt
|
||||
GhostView
|
||||
Gurman
|
||||
@@ -780,6 +782,7 @@ popen
|
||||
pp12
|
||||
pp3
|
||||
ppp
|
||||
ppp12
|
||||
pre
|
||||
preprocessor
|
||||
prev
|
||||
@@ -977,6 +980,7 @@ xsiz
|
||||
xsiz1
|
||||
y1
|
||||
y2
|
||||
yaag
|
||||
year1
|
||||
year2
|
||||
yeardiff
|
||||
|
||||
@@ -1046,7 +1046,7 @@ set a057 value("a05"+"6")
|
||||
"a05" + "6" => "a056"
|
||||
value("a056") => "SDFJHSDF KSJDFH KJSDFH KSJDFH"
|
||||
set a058 version()
|
||||
version() => "06.02.02"
|
||||
version() => "06.02.03"
|
||||
set a059 wkday(today())
|
||||
today() => 1991-02-16
|
||||
wkday(1991-02-16) => "Saturday"
|
||||
@@ -2609,7 +2609,7 @@ a056 "SDFJHSDF KSJDFH KJSDFH KSJDFH"
|
||||
a007 "1991-02-16"
|
||||
a057 "SDFJHSDF KSJDFH KJSDFH KSJDFH"
|
||||
a008 "11:44"
|
||||
a058 "06.02.02"
|
||||
a058 "06.02.03"
|
||||
a059 "Saturday"
|
||||
a010 12
|
||||
a060 6
|
||||
@@ -5563,8 +5563,8 @@ REM SATISFY ""
|
||||
REM SATISFY [version() > "01.00.00"]
|
||||
../tests/test.rem(1074): SATISFY: expression has no reference to trigdate() or $T...
|
||||
../tests/test.rem(1074): Trig = Saturday, 16 February, 1991
|
||||
version() => "06.02.02"
|
||||
"06.02.02" > "01.00.00" => 1
|
||||
version() => "06.02.03"
|
||||
"06.02.03" > "01.00.00" => 1
|
||||
../tests/test.rem(1074): Trig(satisfied) = Saturday, 16 February, 1991
|
||||
REM SATISFY [max(x, max(x, 1, 2, 3), 4, 5, 6) * 5]
|
||||
../tests/test.rem(1075): SATISFY: expression has no reference to trigdate() or $T...
|
||||
@@ -16762,7 +16762,12 @@ mbpad("
|
||||
]8;;https://dianne.skoll.ca\Hello, linky!
|
||||
]8;;\]8;;https://dianne.skoll.ca\Hello, linky!
|
||||
]8;;\]8;;https://dianne.skoll.ca\Hello, linky!
|
||||
]8;;\DynBuf Mallocs: 1120 mallocs; 31872640 bytes
|
||||
]8;;\../tests/test.rem(1900): Invalid value for system variable
|
||||
../tests/test.rem(1901): Invalid value for system variable
|
||||
../tests/test.rem(1902): Invalid value for system variable
|
||||
../tests/test.rem(1903): Invalid value for system variable
|
||||
../tests/test.rem(1904): Invalid value for system variable
|
||||
DynBuf Mallocs: 1124 mallocs; 31872896 bytes
|
||||
Variable hash table statistics:
|
||||
Entries: 100146; Buckets: 87719; Non-empty Buckets: 66303
|
||||
Maxlen: 5; Minlen: 0; Avglen: 1.142; Stddev: 0.878; Avg nonempty len: 1.510
|
||||
@@ -16784,7 +16789,7 @@ Expression nodes high-water: 302076
|
||||
Expression nodes leaked: 0
|
||||
Parse level high-water: 34
|
||||
Max expr node evaluations per line: 2001
|
||||
Total expression node evaluations: 106733
|
||||
Total expression node evaluations: 106738
|
||||
|
||||
Test 2
|
||||
|
||||
@@ -23822,7 +23827,7 @@ SECURITY: Won't read world-writable file or directory!
|
||||
Error reading include_dir/ww: Can't open file
|
||||
SECURITY: Won't read world-writable file or directory!
|
||||
Error reading include_dir/ww: No files matching *.rem
|
||||
06.02.02
|
||||
06.02.03
|
||||
Enabling test mode: This is meant for the acceptance test.
|
||||
Do not use --test in production.
|
||||
In test mode, the system time is fixed at 2025-01-06@19:00
|
||||
@@ -25187,6 +25192,7 @@ TRANSLATE "Invalid multibyte sequence" ""
|
||||
TRANSLATE "Maximum expression complexity exceeded" ""
|
||||
TRANSLATE "Expecting operator or end-of-expression" ""
|
||||
TRANSLATE "Expecting constant, variable, function call or (expression)" ""
|
||||
TRANSLATE "Invalid value for system variable" ""
|
||||
|
||||
# Other Messages
|
||||
TRANSLATE "%s function `%s' defined at %s(%s) does not use its argument" ""
|
||||
@@ -39867,20 +39873,20 @@ Testing TODOS in calendar mode with completed todos hidden
|
||||
2025/08/27 * * * * Ninth
|
||||
Testing TODOS and JSON mode
|
||||
[
|
||||
{"date":"2025-08-01","filename":"../tests/todos.rem","lineno":4,"d":1,"m":8,"y":2025,"is_todo":1,"trigbase":"2025-08-1 ","priority":5000,"body":"First on 2025-08-01"},
|
||||
{"date":"2025-08-01","filename":"../tests/todos.rem","lineno":4,"d":1,"m":8,"y":2025,"is_todo":1,"trigbase":"2025-08-01","priority":5000,"body":"First on 2025-08-01"},
|
||||
{"date":"2022-08-01","filename":"../tests/todos.rem","lineno":5,"d":1,"m":8,"is_todo":1,"complete_through":"2022-07-31","priority":5000,"body":"Second on 2022-08-01"},
|
||||
{"date":"2023-08-01","filename":"../tests/todos.rem","lineno":6,"d":1,"m":8,"is_todo":1,"complete_through":"2022-08-01","priority":5000,"body":"Third on 2023-08-01"},
|
||||
{"date":"2025-08-20","filename":"../tests/todos.rem","lineno":7,"d":20,"m":8,"y":2025,"is_todo":1,"delta":7,"trigbase":"2025-08-20","priority":5000,"body":"Fourth on 2025-08-20"},
|
||||
{"date":"2025-08-13","filename":"../tests/todos.rem","lineno":8,"d":13,"m":8,"y":2025,"is_todo":1,"delta":7,"trigbase":"2025-08-13","priority":5000,"body":"Fifth today"},
|
||||
{"date":"2025-08-06","filename":"../tests/todos.rem","lineno":9,"d":6,"m":8,"y":2025,"is_todo":1,"delta":7,"trigbase":"2025-08-6 ","priority":5000,"body":"Sixth on 2025-08-06"},
|
||||
{"date":"2025-08-06","filename":"../tests/todos.rem","lineno":9,"d":6,"m":8,"y":2025,"is_todo":1,"delta":7,"trigbase":"2025-08-06","priority":5000,"body":"Sixth on 2025-08-06"},
|
||||
{"date":"2025-08-20","filename":"../tests/todos.rem","lineno":11,"wd":["Wednesday"],"is_todo":1,"complete_through":"2025-08-13","delta":7,"priority":5000,"body":"Eighth on 2025-08-20"},
|
||||
{"date":"2025-08-13","filename":"../tests/todos.rem","lineno":12,"wd":["Wednesday"],"is_todo":1,"complete_through":"2025-08-12","delta":7,"priority":5000,"body":"Ninth today"},
|
||||
{"date":"2025-08-01","filename":"../tests/todos.rem","lineno":14,"d":1,"m":8,"y":2025,"is_todo":1,"trigbase":"2025-08-1 ","priority":5000,"body":"First on 2025-08-01"},
|
||||
{"date":"2025-08-01","filename":"../tests/todos.rem","lineno":14,"d":1,"m":8,"y":2025,"is_todo":1,"trigbase":"2025-08-01","priority":5000,"body":"First on 2025-08-01"},
|
||||
{"date":"2022-08-01","filename":"../tests/todos.rem","lineno":15,"d":1,"m":8,"is_todo":1,"complete_through":"2022-07-31","priority":5000,"body":"Second on 2022-08-01"},
|
||||
{"date":"2023-08-01","filename":"../tests/todos.rem","lineno":16,"d":1,"m":8,"is_todo":1,"complete_through":"2022-08-01","priority":5000,"body":"Third on 2023-08-01"},
|
||||
{"date":"2025-08-20","filename":"../tests/todos.rem","lineno":17,"d":20,"m":8,"y":2025,"is_todo":1,"delta":7,"trigbase":"2025-08-20","priority":5000,"body":"Fourth on 2025-08-20"},
|
||||
{"date":"2025-08-13","filename":"../tests/todos.rem","lineno":18,"d":13,"m":8,"y":2025,"is_todo":1,"delta":7,"trigbase":"2025-08-13","priority":5000,"body":"Fifth today"},
|
||||
{"date":"2025-08-06","filename":"../tests/todos.rem","lineno":19,"d":6,"m":8,"y":2025,"is_todo":1,"delta":7,"trigbase":"2025-08-6 ","priority":5000,"body":"Sixth on 2025-08-06"},
|
||||
{"date":"2025-08-06","filename":"../tests/todos.rem","lineno":19,"d":6,"m":8,"y":2025,"is_todo":1,"delta":7,"trigbase":"2025-08-06","priority":5000,"body":"Sixth on 2025-08-06"},
|
||||
{"date":"2025-08-20","filename":"../tests/todos.rem","lineno":21,"wd":["Wednesday"],"is_todo":1,"complete_through":"2025-08-13","delta":7,"priority":5000,"body":"Eighth on 2025-08-20"},
|
||||
{"date":"2025-08-13","filename":"../tests/todos.rem","lineno":22,"wd":["Wednesday"],"is_todo":1,"complete_through":"2025-08-12","delta":7,"priority":5000,"body":"Ninth today"},
|
||||
{"date":"2025-08-13","filename":"../tests/todos.rem","lineno":25,"d":13,"m":8,"y":2025,"is_todo":1,"trigbase":"2025-08-13","max_overdue":3,"priority":5000,"body":"Yup today"},
|
||||
@@ -40094,9 +40100,9 @@ devnull test b
|
||||
No reminders.
|
||||
[
|
||||
{"banner":"Reminders for Wednesday, 1st October, 2025:"},
|
||||
{"date":"2025-10-01","filename":"-stdin-","lineno":3,"d":1,"m":10,"y":2025,"is_todo":0,"trigbase":"2025-10-1 ","priority":5000,"body":"Nonconst NOT set 2025-10-01"},
|
||||
{"date":"2025-10-01","filename":"-stdin-","lineno":4,"nonconst_expr":1,"d":1,"m":10,"y":2025,"is_todo":0,"trigbase":"2025-10-1 ","priority":5000,"body":"Nonconst IS set 2025-10-01"},
|
||||
{"date":"2025-10-01","filename":"-stdin-","lineno":5,"nonconst_expr":1,"d":1,"m":10,"y":2025,"is_todo":0,"trigbase":"2025-10-1 ","priority":5000,"body":"Nonconst IS set"}
|
||||
{"date":"2025-10-01","filename":"-stdin-","lineno":3,"d":1,"m":10,"y":2025,"is_todo":0,"trigbase":"2025-10-01","priority":5000,"body":"Nonconst NOT set 2025-10-01"},
|
||||
{"date":"2025-10-01","filename":"-stdin-","lineno":4,"nonconst_expr":1,"d":1,"m":10,"y":2025,"is_todo":0,"trigbase":"2025-10-01","priority":5000,"body":"Nonconst IS set 2025-10-01"},
|
||||
{"date":"2025-10-01","filename":"-stdin-","lineno":5,"nonconst_expr":1,"d":1,"m":10,"y":2025,"is_todo":0,"trigbase":"2025-10-01","priority":5000,"body":"Nonconst IS set"}
|
||||
]
|
||||
# Nonconst-expr in trigger
|
||||
set $ParseUntriggered 1
|
||||
|
||||
@@ -1896,6 +1896,13 @@ REM INFO "Url: https://dianne.skoll.ca" MSG Hello, linky!
|
||||
REM INFO "Url: https://dianne.skoll.ca" MSF Hello, linky!
|
||||
REM INFO "Url: https://dianne.skoll.ca" SPECIAL COLOR 255 0 0 Hello, linky!
|
||||
|
||||
# Bad values for system variables
|
||||
SET $Latitude "Cabbage"
|
||||
SET $Longitude "Carrots"
|
||||
SET $TimeSep "FOO"
|
||||
SET $DateSep "BAR"
|
||||
SET $DefaultColor "My oh my, what lovely eyes!"
|
||||
|
||||
# Don't want Remind to queue reminders
|
||||
EXIT
|
||||
|
||||
|
||||
Reference in New Issue
Block a user