Compare commits

...

31 Commits

Author SHA1 Message Date
Dianne Skoll
1d6ca51bf9 Update docs. 2022-08-02 14:58:15 -04:00
Dianne Skoll
e662d0b3dd Bump version to 04.00.02 2022-08-02 14:51:00 -04:00
Dianne Skoll
b910d557d1 Document new form of OMIT command. 2022-07-27 15:16:23 -04:00
Dianne Skoll
a4ad0a9e97 Rename error constant. 2022-07-27 15:06:04 -04:00
Dianne Skoll
07f67e7dd7 Better error messages 2022-07-27 15:03:48 -04:00
Dianne Skoll
d6575773fb Don't let THROUGH date be before START date in OMIT. 2022-07-27 14:55:34 -04:00
Dianne Skoll
ac1303886e Add another test. 2022-07-27 14:47:11 -04:00
Dianne Skoll
1569992184 Add test for more flexible OMIT 2022-07-27 14:43:54 -04:00
Dianne Skoll
55a1f1d746 Implement more flexible OMIT. We can do things like:
OMIT May       - equivalent to "OMIT May 1" ... "OMIT May 31"
    OMIT Nov 20 THROUGH Dec 4
    OMIT Apr THROUGH May
    OMIT 2023-12-25 THROUGH 2024-01-06
2022-07-27 14:39:43 -04:00
Dianne Skoll
ef7742a3cc Add GitHub README 2022-07-19 10:12:46 -04:00
Dianne Skoll
ef48c2020b Fix typo 2022-07-12 20:44:57 -04:00
Dianne Skoll
6dcb25073b Make $T behave as documented: If trigger date is not valid, should return 0. 2022-07-04 14:23:39 -04:00
Dianne Skoll
4824b07ec8 Document inotifywait 2022-07-03 19:47:06 -04:00
Dianne Skoll
a8f1228fb7 Update TkRemind man page. 2022-07-03 19:13:05 -04:00
Dianne Skoll
80e51d1d0f Make calendar with 6 rows in a month handle resizing properly.
Fixes https://github.com/dfskoll/remind/issues/1
2022-07-01 16:45:25 -04:00
Dianne Skoll
80e30638a5 Update changelog 2022-06-03 16:22:19 -04:00
Dianne Skoll
dd2fc30364 Add test for $SuppressLRM 2022-05-29 17:28:45 -04:00
Dianne Skoll
a5865fb5fe Add $SuppressLRM system variable; bump version to 04.00.01. 2022-05-27 12:22:26 -04:00
Dianne Skoll
aca2f28341 Add liberapay button. 2022-05-19 13:58:03 -04:00
Dianne Skoll
7a3f5f7ac9 Add github action to run tests. 2022-05-19 09:46:32 -04:00
Dianne Skoll
1731710ef2 Minor reformatting of source. 2022-05-19 09:01:11 -04:00
Dianne Skoll
dc2a8f48bf Update man page. 2022-04-07 11:53:20 -04:00
Dianne Skoll
5e16179bfa Update docs for 04.04.00 release. 2022-04-04 09:36:08 -04:00
Dianne Skoll
a7c1bc81b2 Remove a bug from man page. 2022-04-03 12:59:25 -04:00
Dianne Skoll
5f5ec8ef19 More intelligent handling of --prefix wrt ExtUtils::MakeMaker. 2022-04-03 12:23:28 -04:00
Dianne Skoll
712ff56792 Update docs 2022-04-01 12:11:04 -04:00
Dianne Skoll
99af1f964c Fix bug that broke "-m" option to tkreminder. 2022-04-01 12:08:25 -04:00
Dianne Skoll
de5d1347e5 Make the operator stack static 2022-03-26 19:05:18 -04:00
Dianne Skoll
5e07fbde6d Fix formatting. 2022-03-26 18:03:31 -04:00
Dianne Skoll
c523c7f3b3 Allow a subst_N or subst_Nx function to return 0 to indicate "use the normal substitution" 2022-03-26 18:02:39 -04:00
Dianne Skoll
6b3c6b0ec7 Fix a couple of typos. 2022-03-26 10:11:17 -04:00
27 changed files with 743 additions and 197 deletions

2
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,2 @@
liberapay: dskoll

7
.github/README.md vendored Normal file
View File

@@ -0,0 +1,7 @@
# Remind has moved
For various reasons, I have decided to move Remind off GitHub. This repo
will be archived. To create merge requests or issues, please visit
Remind's new home at https://salsa.debian.org/dskoll/remind
-- Dianne Skoll

29
.github/workflows/github-action.yml vendored Normal file
View File

@@ -0,0 +1,29 @@
# language: bash
---
name: Remind unit tests
on:
push
jobs:
tests:
runs-on: ubuntu-latest
steps:
- name: Checkout Remind
uses: actions/checkout@v2
- name: Add test user
run: |
sudo adduser --home /home/testuser --gecos 'Test User' --disabled-password testuser
- name: Fix ownership
run: |
sudo chown -R testuser .
- name: Build
run: |
sudo su -c './configure && make' testuser
- name: Run Tests
run: |
sudo su -c 'make test' testuser
- name: Fix up permissions so GitHub does not complain
run: |
sudo chmod -R a+rwX .

2
configure vendored
View File

@@ -4006,7 +4006,7 @@ _ACEOF
fi
done
VERSION=04.00.00
VERSION=04.00.02

View File

@@ -65,7 +65,7 @@ else
fi
AC_CHECK_FUNCS(setenv unsetenv glob mbstowcs setlocale initgroups)
VERSION=04.00.00
VERSION=04.00.02
AC_SUBST(VERSION)
AC_SUBST(PERL)
AC_SUBST(PERLARTIFACTS)

View File

@@ -1,6 +1,29 @@
CHANGES TO REMIND
* VERSION 4.0 Patch 0 - 2022-??-??
* VERSION 4.0 Patch 2 - 2022-08-02
- IMPROVEMENT: remind: Allow more forms of OMIT as per Ian D. Allen!'s request:
OMIT Month [THROUGH Month]
OMIT Day Month [THROUGH Day Month]
OMIT Day Month Year [THROUGH Day Month Year]
- BUG FIX: Make $T behave as documented, exactly like trigdate(). $T would
return '1989-12-31' rather than 0 if the trigger date was not valid.
- BUG FIX: TkRemind: Fix resizing bug for a calendar with 6 rows.
- DOCUMENTATION IMPROVEMENT: Improve TkRemind documentation; document use
of inotifywait if available.
* VERSION 4.0 Patch 1 - 2022-06-03
- IMPROVEMENT: Add $SuppressLRM system variable to suppress the UTF-8
Left-to-Right mark in "remind -c" output.
- DOCUMENTATION FIX: Document the "q" sub-option to the "-p" option.
* VERSION 4.0 Patch 0 - 2022-04-04
- MAJOR NEW FEATURE: remind: Remind output can effectively be
translated into other languages at run-time. A number of system
@@ -30,6 +53,11 @@ CHANGES TO REMIND
This causes Remind *not* to remove the %"...%" marker sequence from
remind bodies.
- BUG FIX: rem2pdf: Make rem2pdf respect the --prefix ./configure flag.
Loosely based on patch by Jonathan Kamens.
- BUG FIX: tkremind: Fix the "-m" flag, which was broken in 03.04.00.
- BUG FIX: Fix the overflow-detection functions so they work with link-time
optimization. The previous versions would be optimized away.

View File

@@ -141,7 +141,7 @@ If you immediately follow the \fBs\fR with the letter
day they actually occur \fIas well as\fR on any preceding days specified
by the reminder's \fIdelta\fR.
.TP
.B \-p\fR[\fBa\fR][\fBp\fR][\fBp\fR]\fIn\fR
.B \-p\fR[\fBa\fR][\fBp\fR][\fBp\fR][\fBq\fR]\fIn\fR
The \fB\-p\fR option is very similar to the \fB\-s\fR option, except
that the output contains additional information for use by the
\fBRem2PS\fR program, which creates a PostScript calendar, and various
@@ -156,7 +156,9 @@ by the reminder's \fIdelta\fR. If you follow the \fBp\fR with another
format rather than the "simple calendar" format. This format is
also documented in the \fBrem2ps(1)\fR man page. Finally, if you use
three p's, as in \fB\-ppp\fR, then \fBRemind\fR uses a pure JSON
format, again documented in \fBrem2ps(1)\fR.
format, again documented in \fBrem2ps(1)\fR. If you include a \fBq\fR
letter with this option, then the normal calendar-mode substitution filter
is disabled and the %"...%" sequences are preserved in the output.
.RS
.PP
Note that the \fB\-pp\fR or \fB\-ppp\fR options also enable the \fB\-l\fR
@@ -563,6 +565,7 @@ The trigger date for a specific run is simply the current system date.
present. The reminder is triggered on the specified day of each month.
The trigger date for a particular run is the closest such day to the
current system date. For example:
.PP
.nf
REM 1 MSG First of every month.
REM 31 MSG 31st of every month that has 31 days.
@@ -572,6 +575,7 @@ current system date. For example:
.I month
present. The reminder is triggered every day of the specified month.
Example:
.PP
.nf
REM Feb MSG Every day in February
.fi
@@ -581,6 +585,7 @@ Example:
and
.I month
present. Examples:
.PP
.nf
REM 6 Jan MSG Every 6th of January
REM Feb 29 MSG Every 29th of February
@@ -589,6 +594,7 @@ present. Examples:
5. Only
.I year
present. Example:
.PP
.nf
REM 1991 MSG Every day in 1991
.fi
@@ -598,6 +604,7 @@ present. Example:
and
.I day
present. Examples:
.PP
.nf
REM 1 1990 MSG 1st of every month in 1990
REM 1992 23 MSG 23rd of every month in 1992
@@ -608,6 +615,7 @@ present. Examples:
and
.I month
present. Examples:
.PP
.nf
REM Feb 1991 MSG Every day in Feb 1991
REM 1992 September MSG Every day in Sept 1992
@@ -618,6 +626,7 @@ present. Examples:
and
.I day
present. Examples:
.PP
.nf
REM 8 Jan 1991 MSG 8th January 1991.
REM 1992 March 9 MSG 9th March 1992.
@@ -626,6 +635,7 @@ present. Examples:
9.
.I weekday
only. Examples:
.PP
.nf
REM Sat MSG Every Saturday
REM Mon Tue Wed Thu Fri MSG Every working day
@@ -637,6 +647,7 @@ only. Examples:
and
.I day
present. Examples:
.PP
.nf
REM Sat 1 MSG First Saturday of every month
REM Mon Tue Wed Thu Fri 15 \\
@@ -648,6 +659,7 @@ present. Examples:
and
.I month
present. Examples:
.PP
.nf
REM Mon March MSG Every Monday in March
REM Mon Tue Wed Thu Fri Feb MSG Every working day in February
@@ -658,6 +670,7 @@ present. Examples:
and
.I day
present. Examples:
.PP
.nf
REM Mon 1 March MSG First Monday in March
REM Sat Sun 15 July MSG First Sat or Sun on or after 15 July
@@ -668,6 +681,7 @@ present. Examples:
and
.I year
present. Example:
.PP
.nf
REM Sat Sun 1991 MSG Every Saturday and Sunday in 1991
.fi
@@ -677,6 +691,7 @@ present. Example:
and
.I year
present. Examples:
.PP
.nf
REM Mon 15 1990 MSG 1st Mon after 15th of every month in 1990
REM Mon Tue Wed Thu Fri 1 1990 \\
@@ -688,6 +703,7 @@ present. Examples:
and
.I year
present. Example:
.PP
.nf
REM Mon Wed 1991 Feb MSG Every Mon and Wed in Feb 1991.
.fi
@@ -697,6 +713,7 @@ present. Example:
and
.I year
present. Example:
.PP
.nf
REM Mon Tue Wed Thu Fri 28 Oct 1990 \\
MSG 1st working day on or after 28 October 1990.
@@ -1515,11 +1532,11 @@ In addition to being a keyword in the \fBREM\fR command,
\fBOMIT\fR is a command in its own right. Its syntax is:
.PP
.RS
\fBOMIT\fR \fIday\fR \fImonth\fR [\fIyear\fR]
\fBOMIT\fR [\fIday\fR] \fImonth\fR [\fIyear\fR]
.PP
or:
.PP
\fBOMIT\fR \fIday1\fR \fImonth1\fR \fIyear1\fR \fBTHROUGH\fR \fIday2\fR \fImonth2\fR \fIyear2\fR
\fBOMIT\fR [\fIday1\fR] \fImonth1\fR [\fIyear1\fR] \fBTHROUGH\fR [\fIday2\fR] \fImonth2\fR [\fIyear2\fR]
.RE
.PP
The \fBOMIT\fR command is used to "globally" omit certain days
@@ -1528,8 +1545,13 @@ The \fBOMIT\fR command is used to "globally" omit certain days
"\-\-" and "\+\+" forms. Some examples:
.PP
.nf
OMIT 1 Jan
OMIT 7 Sep 1992
OMIT 1 Jan
OMIT 7 Sep 1992
OMIT 15 Jan THROUGH 14 Feb
OMIT May # Equivalent to OMIT May 1 THROUGH May 31
OMIT 25 Dec THROUGH 4 Jan
OMIT 2023-05-03 THROUGH 2023-05-12
OMIT Jun THROUGH July # Equivalent to OMIT Jun 1 THROUGH July 31
.fi
.PP
The first example specifies a holiday that occurs on the same date each
@@ -1561,9 +1583,7 @@ equivalent:
.fi
.PP
The \fBTHROUGH\fR keyword lets you conveniently OMIT a range of days.
The starting and ending points must be fully-specified (ie, they must
include day, month and year.). For example, the following sequences
are equivalent:
For example, the following sequences are equivalent:
.PP
.nf
OMIT 3 Jan 2011
@@ -1575,12 +1595,28 @@ are equivalent:
OMIT 3 Jan 2011 THROUGH 5 Jan 2011
.fi
.PP
You can make a THROUGH \fBOMIT\fR do double-duty as a \fBREM\fR command:
You can make a THROUGH \fBOMIT\fR do double-duty as a \fBREM\fR command as
long as both dates are fully specified
.PP
.nf
OMIT 6 Sep 2010 THROUGH 10 Sep 2010 MSG Vacation
.fi
.PP
If you use a THROUGH clause, then either the year must be supplied before
and after the THROUGH, or it must be missing before and after the THROUGH.
The following are legal:
.PP
.nf
OMIT 25 Dec THROUGH 6 Jan
OMIT 25 Dec 2024 THROUGH 6 Jan 2025
.fi
.PP
But the following are not:
.PP
.nf
OMIT 25 Dec THROUGH 6 Jan 2025
OMIT 25 Dec 2024 THROUGH 6 Jan
.nf
.PP
You can debug your global OMITs with the following command:
.PP
@@ -2323,9 +2359,10 @@ the decimal point must be a period (".").
.PP
For example, the coordinates of the Statue of Liberty in New York City
are approximately set by:
.PP
.nf
SET $Latitude "40.68933"
SET $Longitude "-74.04454"
SET $Latitude "40.68933"
SET $Longitude "-74.04454"
.fi
.RE
.TP
@@ -2441,6 +2478,20 @@ order, or 2 if sorting by time in descending order.
The number of spaces by which all lines (except the first) of an
\fBMSF\fR-type reminder should be indented. The default is 0.
.TP
.B $SuppressLRM
Normally, when Remind is run with the \fB\-c\fR option in a UTF-8 locale,
it emits a left-to-right mark sequence after printing day names or
reminders. Some terminals render this incorrectly, so you can use:
.RS
.PP
.nf
SET $SuppressLRM 1
.fi
.PP
at the top of your reminder file to suppress the LRM sequences, or you
can invoke Remind with the option \fB'\-i$SuppressLRM=1'\fR.
.RE
.TP
.B $SysInclude (read-only, STRING type)
A directory path containing standard reminder scripts. Currently,
Remind ships with some standard holiday files and language packs.
@@ -3048,6 +3099,7 @@ be right-padded.
.RS
.PP
Here are some examples:
.PP
.nf
pad(3, "0", 2) --> "03"
pad(465, "0", 2) --> "465"
@@ -3205,7 +3257,7 @@ takes \fIa\fR back to 2009-05-13.
.TP
.B strlen(s_str)
Returns the length of \fIstr\fR. If the length of \fIstr\fR is too large
to represent as an integers, emits a "Number too high" error.
to represent as an integer, emits a "Number too high" error.
.TP
.B substr(s_str, i_start [,i_end])
Returns a \fBSTRING\fR consisting of all characters in \fIstr\fR from
@@ -3266,6 +3318,7 @@ non-zero trigger date.
\fBIFTRIG\fR. For example, if you have meetings every Monday in
June and July, and you want warnings 3 days in advance, you
could use:
.PP
.nf
REM [trig("Mon Jun +3", "Mon July +3")] +3 MSG Meeting %b
.fi
@@ -4782,13 +4835,14 @@ reminder and \fItime\fR which is the trigger time.
.TP
.B subst_Nx(alt, date, time)
Again, this is a \fIfamily\fR of functions. It is similar to the
\fBsubst_x\fR family except it is only called if \fIdate\fR is two or
\fBsubst_N\fR family except it is only called if \fIdate\fR is two or
more days away from \fItoday()\fR. This is useful if you don't want to
override the "today" or "tomorrow" output for most substitution sequences.
.PP
Here's an example of how you might customize your substitution filter.
Suppose you want to change the "%b" sequence to substitute "the day
after tomorrow" for an event two days from now. You could do this:
.PP
.nf
FSET subst_bx(a,d,t) iif(d==today()+2, "the day after tomorrow", \
"in " + (d-today()) + " days' time")
@@ -4799,6 +4853,7 @@ after tomorrow" for an event two days from now. You could do this:
.fi
.PP
The output of this script is:
.PP
.nf
Event 1 is in 3 days' time
Event 2 is the day after tomorrow
@@ -4811,6 +4866,15 @@ time", and note also that the "tomorrow" and "today" events used the
normal substitution---\fBsubst_bx\fR is not called for trigger days of
today or tomorrow.
.PP
As a special case, if a \fBsubst_Nx\fB or \fBsubst_N\fR function
returns the integer zero, then the normal substitution mechanism is
used. Therefore, the previous example could have been written more simply
as:
.PP
.nf
FSET subst_bx(a,d,t) iif(d==today()+2, "the day after tomorrow", 0)
.fi
.PP
.SH LANGUAGE PACKS
.PP
\fBRemind\fR ships with a number of language packs, which are simply reminder
@@ -4823,12 +4887,14 @@ pl.rem (Polish), pt.rem (Portuguese) and ro.rem (Romanian).
.PP
To use a language pack (in this example, de.rem), simply place this at
the top of your reminders file:
.PP
.nf
INCLUDE [$SysInclude]/lang/de.rem
.fi
.PP
If you want \fBRemind\fR to try to find the language pack appropriate
for your locale settings, use:
.PP
.nf
INCLUDE [$SysInclude]/lang/auto.rem
.fi
@@ -5043,10 +5109,12 @@ should attempt to support. They are currently supported by
.PP
The \fBSHADE\fR special replaces the \fBpsshade()\fR function.
Use it like this:
.PP
.nf
REM Sat Sun SPECIAL SHADE 128
REM Mon SPECIAL SHADE 255 0 0
.fi
.PP
The \fBSHADE\fR keyword is followed by either one or three numbers,
from 0 to 255. If one number is supplied, it is interpreted as
a grey-scale value from black (0) to white (255). If three numbers
@@ -5057,14 +5125,17 @@ in calendars produced by \fBRem2PS\fR, \fBtkremind\fR and \fBrem2html\fR.)
.PP
The \fBMOON\fR special replaces the \fBpsmoon()\fR function. Use it
like this:
.PP
.nf
REM [moondate(0)] SPECIAL MOON 0
REM [moondate(1)] SPECIAL MOON 1
REM [moondate(2)] SPECIAL MOON 2
REM [moondate(3)] SPECIAL MOON 3
.fi
.PP
These draw little moons on the various calendars. The complete syntax
of the \fBMOON\fR special is as follows:
.PP
.nf
... SPECIAL MOON phase moonsize fontsize msg
.fi
@@ -5085,12 +5156,12 @@ and \fIfontsize\fR; the other backends use fixed sizes.
.PP
The \fBCOLOR\fR special lets you place colored reminders in the
calendar. Use it like this:
.PP
.nf
REM ... SPECIAL COLOR 255 0 0 This is a bright red reminder
REM ... SPECIAL COLOR 0 128 0 This is a dark green reminder
.fi
.PP
You can spell COLOR either the American way ("COLOR") or the British
way ("COLOUR"). This manual will use the American way.
@@ -5111,11 +5182,11 @@ number in the calendar. For example, this would number each Monday
with the ISO 8601 week number. The week number is shown like this:
"(W\fIn\fR)" in this example, but you can put whatever text you like
after the WEEK keyword.
.PP
.nf
REM Monday SPECIAL WEEK (W[weekno()])
.fi
.PP
.SH MISCELLANEOUS
.PP
.B COMMAND ABBREVIATIONS
@@ -5373,9 +5444,6 @@ are not implemented as read-only system variables.
.PP
Hebrew dates in \fBRemind\fR change at midnight instead of sunset.
.PP
Language should be selectable at run-time, not compile-time. Don't
expect this to happen soon!
.PP
\fBRemind\fR has some built-in limits (for example, number of global
\fBOMIT\fRs.)
.PP

View File

@@ -18,13 +18,13 @@ as well as the tcllib extension. It also requires a \fBwish\fR
binary. If you are using Tcl/Tk 8.5, you may also need either the Img
or the tkpng extension to handle PNG images.
.SH OPTIONS
\fBTkRemind\fR itself has no options. However, it passes certain options
on to \fBRemind\fR. The options it passes are
\fB\-b\fR, \fB\-g\fR, \fB\-x\fR, \fB\-i\fR and \fB\-m\fR.
See the \fBRemind\fR man page for details about the options.
Note that \fBTkRemind\fR will respect the \fB\-m\fR and
\fB\-b1\fR options and adjust its appearance accordingly.
.SH COMMAND-LINE OPTIONS
\fBTkRemind\fR itself has no command-line options. However, it passes
certain options on to \fBRemind\fR. The options it passes are
\fB\-b\fR, \fB\-g\fR, \fB\-x\fR, \fB\-i\fR and \fB\-m\fR. See the
\fBRemind\fR man page for details about the options. Note that
\fBTkRemind\fR will respect the \fB\-m\fR and \fB\-b1\fR options and
adjust its appearance accordingly.
\fIRead_file\fR is the file from which \fBTkRemind\fR reads reminders.
It is in standard \fBRemind\fR format. \fIWrite_file\fR is the file
@@ -44,8 +44,14 @@ include the line:
.PP
\fIConfig_file\fR is the file in which \fBTkRemind\fR stores
its options. If it is omitted, it defaults to \fI$HOME/.tkremindrt\fR.
its options. If it is omitted, it defaults to \fI$HOME/.config/tkremindrc\fR.
.PP
If \fB$HOME/.reminders\fR is a \fIdirectory\fR, then \fBTkRemind\fR defaults to
reading \fB$HOME/.reminders\fR and writing new reminders to
\fB$HOME/.reminders/100-tkremind.rem\fR. If you want to keep your
reminders in a directory \fB$HOME/.reminders\fR, you should create that
directory before starting \fBTkRemind\fR.
.SH THE CALENDAR WINDOW
When you start \fBTkRemind\fR, it displays a calendar for the current
month, with today's date highlighted. Reminders are filled into each
@@ -274,7 +280,7 @@ Similar to Change entry font, but applies to calendar heading
.PP
Once you've configured the options the way you like them,
press \fBApply Options\fR to put them into effect, \fBSave Options\fR
to put them into effect and save them in $HOME/.tkremindrc, or
to put them into effect and save them in $HOME/.config/tkremindrc, or
\fBCancel\fR to cancel any changes you made.
.SH KEYBOARD SHORTCUTS
@@ -293,6 +299,19 @@ Next Month
.B Home
Today
.SH IMMEDIATE UPDATES
If you are running \fBTkRemind\fR on Linux and have the
\fBinotifywait\fR program installed (part of the \fBinotify-tools\fR
or similar package), then \fBTkRemind\fR redraws the calendar window
\fIimmediately\fR if \fB$HOME/.reminders\fR changes (or, if it is a
directory, any files in that directory change.)
.PP
This lets \fBTkRemind\fR react immediately to hand-edited reminders or
to reminder files that are imported from another calendar system (for example,
you may have a cron job that periodically imports your Google Calendar
entries into Remind format.)
.SH ODDS AND ENDS
\fBTkRemind\fR performs some basic consistency checks when you add or
preview a reminder. However, if you edit a reminder in the previewer,
@@ -323,8 +342,7 @@ You can use this to activate certain reminders in different ways
for \fBTkRemind\fR (for example).
.PP
\fBTkRemind\fR uses tags to keep track of reminders in the
script file. It also places special comments in the reminder
file to store additional state. You can certainly mix
script file. You can certainly mix
"hand-crafted" reminders with reminders created by \fBTkRemind\fR
if you are aware of the following rules and limitations:
.TP
@@ -334,15 +352,16 @@ where \fInnn\fR is a number. You should not use such \fBTAG\fRs
in hand-crafted reminders.
.TP
o
Do not edit lines starting with "# TKTAGnnn", "# TKEND", or any
lines in between. You can move such lines, but be careful to move
them as a single block.
.TP
o
Hand-crafted reminders cannot be edited with \fBTkRemind\fR, and
for hand-crafted timed reminders, you will not be presented with
the "Don't remind me again" option when they pop up.
.PP
However, rather than mixing hand-edited files with \fBTkRemind\fR-generated
ones, it is better to make \fB$HOME/.reminders\fR a directory and keep
your hand-edited files in a separate \fB*.rem\fR file than \fBTkRemind\fR's
\fB100-tkremind.rem\fR file.
.SH SERVER MODE
\fBRemind\fR has a special mode for interacting with programs like
@@ -400,13 +419,13 @@ This line is emitted in response to a \fBSTATUS\fR command. The number
.SH AUTHOR
TkRemind was written by Dianne Skoll <dianne@skoll.ca>
\fBTkRemind\fR is Copyright 1996-2020 by Dianne Skoll.
\fBTkRemind\fR is Copyright 1996-2022 by Dianne Skoll.
.SH FILES
$HOME/.reminders -- default reminder file.
$HOME/.reminders -- default reminder file or directory.
$HOME/.tkremindrc -- \fBTkRemind\fR saved options.
$HOME/.config/tkremindrc -- \fBTkRemind\fR saved options.
.SH SEE ALSO
\fBremind\fR, \fBrem2ps\fR, \fBrem2pdf\fR, \fBrem2html\fR

View File

@@ -33,10 +33,16 @@ install:
$(MAKE) install DESTDIR=$(DESTDIR) "INSTALL_BASE=$(INSTALL_BASE)" && exit 0; \
elif test "$(prefix)" = "/usr" ; then \
$(MAKE) install DESTDIR=$(DESTDIR) INSTALLDIRS=vendor && exit 0; \
else \
elif test "$(prefix)" = "/usr/local" ; then \
$(MAKE) install DESTDIR=$(DESTDIR) && exit 0; \
else \
$(MAKE) install DESTDIR=$(DESTDIR) "INSTALL_BASE=$(prefix)" && exit 0; \
fi; \
exit 1;
Makefile: Makefile.PL
$(PERL) Makefile.PL @PERLARTIFACTS@ INSTALL_BASE=$(INSTALL_BASE) || true
if test "$(prefix)" != "/usr" -a "$(prefix)" != "/usr/local" -a "$(INSTALL_BASE)" = "" ; then \
$(PERL) Makefile.PL @PERLARTIFACTS@ INSTALL_BASE=$(prefix) || true;\
else \
$(PERL) Makefile.PL @PERLARTIFACTS@ INSTALL_BASE=$(INSTALL_BASE) || true;\
fi

View File

@@ -1,6 +1,7 @@
#!@PERL@
use strict;
use warnings;
use lib '@prefix@/lib/perl5';
use Encode;
use Cairo;

View File

@@ -285,7 +285,7 @@ sub read_one_month_pp
Given a hashref C<$hash> consisting of one entry parsed
from the "remind -p" stream and a C<$specials_accepted> hash,
return 1 if we should include this entry in the calendar or
0 if mot.
0 if not.
=cut
sub accept_special

View File

@@ -457,6 +457,7 @@ proc CreateCalFrame { w dayNames } {
# Figure out reasonable height for text frames
global SetFontsWorked
global Option
global MondayFirst
set h [winfo screenheight .]
if {$h <= 480} {
if {$SetFontsWorked} {
@@ -470,7 +471,6 @@ proc CreateCalFrame { w dayNames } {
set h 5
}
global MondayFirst
frame $w -background $Option(LineColor)
for {set i 0} {$i < 7} {incr i} {
if {$MondayFirst} {
@@ -547,7 +547,9 @@ proc ConfigureCalFrame { w firstDay numDays } {
$w.t$i configure -state disabled -takefocus 0
}
for {set i $first} {$i <= $last} {incr i} {
set row [expr ($i/7)+1]
grid $w.f$i
grid rowconfigure $w $row -weight 1
pack $w.l$i -in $w.f$i -side top -expand 0 -fill x
pack $w.t$i -in $w.f$i -side top -expand 1 -fill both
raise $w.l$i
@@ -581,7 +583,7 @@ proc ConfigureCalFrame { w firstDay numDays } {
pack $w.t$i -in $w.f$i -side top -expand 1 -fill both
raise $w.l$i
raise $w.t$i
grid rowconfigure $w [expr $row+1] -weight 1
grid rowconfigure $w $row -weight 1
}
$w.l$i configure -text "" -command "" -state normal -relief flat -foreground $Option(LabelColor) -background $Option(WinBackground) -highlightcolor $Option(LineColor) -highlightbackground $Option(WinBackground)
$w.l$i configure -state disabled
@@ -1010,7 +1012,7 @@ proc ConfigureCalWindow { month year firstDay numDays } {
proc FillCalWindow {} {
set FileName ""
set LineNo 0
global DayNames CurYear CurMonth MonthNames CommandLine Option TagToObj RemindErrors
global DayNames CurYear CurMonth MonthNames CommandLine Option TagToObj RemindErrors MondayFirst
array unset TagToObj
@@ -1049,7 +1051,12 @@ proc FillCalWindow {} {
# Update the day names in the calendar window
for {set i 0} {$i < 7} {incr i} {
.cal.day$i configure -text [lindex $DayNames $i]
if {$MondayFirst} {
set index [expr ($i+1)%7]
} else {
set index $i
}
.cal.day$i configure -text [lindex $DayNames $index]
}
set offset [CalEntryOffset $firstWkday]

View File

@@ -259,6 +259,10 @@ static void WriteCalDays (void);
static void
send_lrm(void)
{
/* Don't send LRM if SuppressLRM is set */
if (SuppressLRM) {
return;
}
/* Send a lrm control sequence if UseUTF8Chars is enabled
or char encoding is UTF-8
*/

View File

@@ -229,14 +229,17 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
expr = (char const *) s;
r = EvalExpr(&expr, &v, NULL);
if (r == OK) {
if (!DoCoerce(STR_TYPE, &v)) {
if (DBufPuts(dbuf, v.v.str) != OK) {
DestroyValue(v);
return E_NO_MEM;
if (v.type != INT_TYPE || v.v.val != 0) {
if (!DoCoerce(STR_TYPE, &v)) {
if (DBufPuts(dbuf, v.v.str) != OK) {
DestroyValue(v);
return E_NO_MEM;
}
}
DestroyValue(v);
continue;
}
DestroyValue(v);
continue;
} else {
Eprint("%s", ErrMsg[r]);
}
@@ -301,14 +304,17 @@ int DoSubst(ParsePtr p, DynamicBuffer *dbuf, Trigger *t, TimeTrig *tt, int jul,
expr = (char const *) s;
r = EvalExpr(&expr, &v, NULL);
if (r == OK) {
if (!DoCoerce(STR_TYPE, &v)) {
if (DBufPuts(dbuf, v.v.str) != OK) {
DestroyValue(v);
return E_NO_MEM;
if (v.type != INT_TYPE || v.v.val != 0) {
if (!DoCoerce(STR_TYPE, &v)) {
if (DBufPuts(dbuf, v.v.str) != OK) {
DestroyValue(v);
return E_NO_MEM;
}
}
DestroyValue(v);
continue;
}
DestroyValue(v);
continue;
} else {
Eprint("%s", ErrMsg[r]);
}

View File

@@ -70,7 +70,7 @@
#define E_MON_TWICE 51
#define E_DAY_TWICE 52
#define E_UNKNOWN_TOKEN 53
#define E_SPEC_MON_DAY 54
#define E_SPEC_MON 54
#define E_2MANY_PART 55
#define E_2MANY_FULL 56
#define E_PUSH_NOPOP 57
@@ -187,7 +187,7 @@ EXTERN char *ErrMsg[]
"Month specified twice",
"Day specified twice",
"Unknown token",
"Must specify month and day in OMIT command",
"Must specify month in OMIT command",
"Too many partial OMITs",
"Too many full OMITs",
"Warning: PUSH-OMIT-CONTEXT without matching POP-OMIT-CONTEXT",

View File

@@ -84,10 +84,12 @@ Operator UnOp[] = {
extern BuiltinFunc Func[];
Operator OpStack[OP_STACK_SIZE];
Value ValStack[VAL_STACK_SIZE];
int OpStackPtr = 0;
int ValStackPtr = 0;
static Operator OpStack[OP_STACK_SIZE];
static int OpStackPtr = 0;
/* ValStack can't be static - needed by funcs.c */
Value ValStack[VAL_STACK_SIZE];
int ValStackPtr = 0;
/***************************************************************/
/* */

View File

@@ -313,6 +313,12 @@ EXTERN char *DynamicWas
EXTERN char *SysDir
#ifdef MK_GLOBALS
= STRSYSDIR(SYSDIR);
= STRSYSDIR(SYSDIR)
#endif
;
EXTERN int SuppressLRM
#ifdef MK_GLOBALS
= 0
#endif
;

View File

@@ -195,7 +195,7 @@ EXTERN char *ErrMsg[] =
"Kuukausi annettu kahdesti",
"Päivä annettu kahdesti",
"Tuntematon sana tai merkki",
"OMIT-komennossa on annettava kuukausi ja päivä",
"OMIT-komennossa on annettava kuukausi",
"Liian monta osittaista OMIT-komentoa",
"Liian monta täydellistä OMIT-komentoa",
"Varoitus: PUSH-OMIT-CONTEXT ilman POP-OMIT-CONTEXTia",

View File

@@ -185,7 +185,7 @@ EXTERN char *ErrMsg[] =
"Miesiąc podany dwókrotnie",
"Dzień podany dwókrotnie",
"Nieznane słowo",
"W komendzie OMIT trzeba podać miesiąc i dzień",
"W komendzie OMIT trzeba podać miesiąc",
"Za dużo częściowych komend OMIT",
"Za dużo pełnych komend OMIT",
"Ostrzeżenie: PUSH-OMIT-CONTEXT bez POP-OMIT-CONTEXT",

View File

@@ -194,7 +194,7 @@ EXTERN char *ErrMsg[] =
"Mes especificado duas vezes",
"Dia especificado duas vezes",
"Token desconhecido",
"Mes e dia devem ser especificados no comando OMIT",
"O mes deve ser especificados no comando OMIT",
"Muitos OMITs parciais",
"Muitos OMITs full",
"Aviso: PUSH-OMIT-CONTEXT sem POP-OMIT-CONTEXT correspondente",

View File

@@ -271,7 +271,6 @@ static void InsertIntoSortedArray(int *array, int num, int key)
*cur = key;
}
static int DoThroughOmit(ParsePtr p, int y, int m, int d);
static void DumpOmits(void);
/***************************************************************/
@@ -283,11 +282,15 @@ static void DumpOmits(void);
/***************************************************************/
int DoOmit(ParsePtr p)
{
int y = NO_YR, m = NO_MON, d = NO_DAY, r;
int y[2] = {NO_YR, NO_YR}, m[2] = {NO_MON, NO_MON}, d[2] = {NO_DAY, NO_DAY}, r;
Token tok;
int parsing=1;
int parsing = 1;
int seen_through = 0;
int syndrome;
int not_first_token = -1;
int start, end, tmp;
int mc, dc;
DynamicBuffer buf;
DBufInit(&buf);
@@ -308,28 +311,28 @@ int DoOmit(ParsePtr p)
case T_Date:
DBufFree(&buf);
if (y != NO_YR) return E_YR_TWICE;
if (m != NO_MON) return E_MON_TWICE;
if (d != NO_DAY) return E_DAY_TWICE;
FromJulian(tok.val, &y, &m, &d);
if (y[seen_through] != NO_YR) return E_YR_TWICE;
if (m[seen_through] != NO_MON) return E_MON_TWICE;
if (d[seen_through] != NO_DAY) return E_DAY_TWICE;
FromJulian(tok.val, &y[seen_through], &m[seen_through], &d[seen_through]);
break;
case T_Year:
DBufFree(&buf);
if (y != NO_YR) return E_YR_TWICE;
y = tok.val;
if (y[seen_through] != NO_YR) return E_YR_TWICE;
y[seen_through] = tok.val;
break;
case T_Month:
DBufFree(&buf);
if (m != NO_MON) return E_MON_TWICE;
m = tok.val;
if (m[seen_through] != NO_MON) return E_MON_TWICE;
m[seen_through] = tok.val;
break;
case T_Day:
DBufFree(&buf);
if (d != NO_DAY) return E_DAY_TWICE;
d = tok.val;
if (d[seen_through] != NO_DAY) return E_DAY_TWICE;
d[seen_through] = tok.val;
break;
case T_Delta:
@@ -338,8 +341,9 @@ int DoOmit(ParsePtr p)
case T_Through:
DBufFree(&buf);
if (y == NO_YR || m == NO_MON || d == NO_DAY) return E_INCOMPLETE;
return DoThroughOmit(p, y, m, d);
if (seen_through) return E_UNTIL_TWICE;
seen_through = 1;
break;
case T_Empty:
case T_Comment:
@@ -358,26 +362,85 @@ int DoOmit(ParsePtr p)
return E_UNKNOWN_TOKEN;
}
}
if (m == NO_MON || d == NO_DAY) return E_SPEC_MON_DAY;
if (y == NO_YR) {
if (NumPartialOmits == MAX_PARTIAL_OMITS) return E_2MANY_PART;
if (d > MonthDays[m]) return E_BAD_DATE;
syndrome = (m<<5) + d;
if (!BexistsIntArray(PartialOmitArray, NumPartialOmits, syndrome)) {
InsertIntoSortedArray(PartialOmitArray, NumPartialOmits, syndrome);
NumPartialOmits++;
}
if (!seen_through) {
/* We must have at least a month */
if (m[0] == NO_MON) return E_SPEC_MON;
m[1] = m[0];
y[1] = y[0];
if (d[0] == NO_DAY) {
d[0] = 1;
if (y[0] == NO_YR) {
d[1] = MonthDays[m[0]];
} else {
d[1] = DaysInMonth(m[0], y[0]);
}
} else {
d[1] = d[0];
m[1] = m[0];
y[1] = y[0];
}
} else {
if (d > DaysInMonth(m, y)) return E_BAD_DATE;
syndrome = Julian(y, m, d);
r = AddGlobalOmit(syndrome);
if (r) {
return r;
if (m[0] == NO_MON) return E_SPEC_MON;
if (m[1] == NO_MON) return E_SPEC_MON;
if ((y[0] != NO_YR && y[1] == NO_YR) ||
(y[0] == NO_YR && y[1] != NO_YR)) {
return E_BAD_DATE;
}
if (d[0] == NO_DAY) d[0] = 1;
if (d[1] == NO_DAY) {
if (y[1] == NO_YR) {
d[1] = MonthDays[m[1]];
} else {
d[1] = DaysInMonth(m[1], y[1]);
}
}
}
if (y[0] == NO_YR) {
/* Partial OMITs */
if (d[0] > MonthDays[m[0]]) return E_BAD_DATE;
if (d[1] > MonthDays[m[1]]) return E_BAD_DATE;
dc = d[0];
mc = m[0];
while(1) {
syndrome = (mc<<5) + dc;
if (!BexistsIntArray(PartialOmitArray, NumPartialOmits, syndrome)) {
InsertIntoSortedArray(PartialOmitArray, NumPartialOmits, syndrome);
NumPartialOmits++;
}
if (mc == m[1] && dc == d[1]) {
break;
}
dc++;
if (dc > MonthDays[mc]) {
dc = 1;
mc++;
if (mc > 11) {
mc = 0;
}
}
}
} else {
/* Full OMITs */
if (d[0] > DaysInMonth(m[0], y[0])) return E_BAD_DATE;
if (d[1] > DaysInMonth(m[1], y[1])) return E_BAD_DATE;
start = Julian(y[0], m[0], d[0]);
end = Julian(y[1], m[1], d[1]);
if (end < start) {
Eprint("Error: THROUGH date earlier than start date");
return E_BAD_DATE;
}
for (tmp = start; tmp <= end; tmp++) {
if (!BexistsIntArray(FullOmitArray, NumFullOmits, tmp)) {
if (NumFullOmits >= MAX_FULL_OMITS) return E_2MANY_FULL;
InsertIntoSortedArray(FullOmitArray, NumFullOmits, tmp);
NumFullOmits++;
}
}
}
if (tok.type == T_Tag || tok.type == T_Duration || tok.type == T_RemType || tok.type == T_Priority) return E_PARSE_AS_REM;
return OK;
@@ -394,95 +457,6 @@ AddGlobalOmit(int jul)
return OK;
}
static int
DoThroughOmit(ParsePtr p, int ystart, int mstart, int dstart)
{
int yend = NO_YR, mend = NO_MON, dend = NO_DAY, r;
int start, end, tmp;
int parsing = 1;
Token tok;
DynamicBuffer buf;
DBufInit(&buf);
while(parsing) {
if ( (r=ParseToken(p, &buf)) ) return r;
FindToken(DBufValue(&buf), &tok);
switch(tok.type) {
case T_Date:
DBufFree(&buf);
if (yend != NO_YR) return E_YR_TWICE;
if (mend != NO_MON) return E_MON_TWICE;
if (dend != NO_DAY) return E_DAY_TWICE;
FromJulian(tok.val, &yend, &mend, &dend);
break;
case T_Year:
DBufFree(&buf);
if (yend != NO_YR) return E_YR_TWICE;
yend = tok.val;
break;
case T_Month:
DBufFree(&buf);
if (mend != NO_MON) return E_MON_TWICE;
mend = tok.val;
break;
case T_Day:
DBufFree(&buf);
if (dend != NO_DAY) return E_DAY_TWICE;
dend = tok.val;
break;
case T_Empty:
case T_Comment:
case T_RemType:
case T_Priority:
case T_Tag:
case T_Duration:
DBufFree(&buf);
parsing = 0;
break;
default:
Eprint("%s: `%s' (OMIT)", ErrMsg[E_UNKNOWN_TOKEN],
DBufValue(&buf));
DBufFree(&buf);
return E_UNKNOWN_TOKEN;
}
}
if (yend == NO_YR || mend == NO_MON || dend == NO_DAY) return E_INCOMPLETE;
if (dend > DaysInMonth(mend, yend)) return E_BAD_DATE;
if (dstart > DaysInMonth(mstart, ystart)) return E_BAD_DATE;
start = Julian(ystart, mstart, dstart);
end = Julian(yend, mend, dend);
if (end < start) {
Wprint("Warning: Swapping dates on OMIT ... THROUGH ... line");
tmp = start;
start = end;
end = tmp;
}
tmp = end - start + 1;
/* Don't create any OMITs if there would be too many. */
if (NumFullOmits + tmp >= MAX_FULL_OMITS) return E_2MANY_FULL;
for (tmp = start; tmp <= end; tmp++) {
if (!BexistsIntArray(FullOmitArray, NumFullOmits, tmp)) {
InsertIntoSortedArray(FullOmitArray, NumFullOmits, tmp);
NumFullOmits++;
}
}
if (tok.type == T_Tag || tok.type == T_Duration || tok.type == T_RemType || tok.type == T_Priority) return E_PARSE_AS_REM;
return OK;
}
void
DumpOmits(void)
{

View File

@@ -184,7 +184,9 @@ void HandleQueuedReminders(void)
while (TimeToSleep > 0L) {
SleepTime = TimeToSleep;
if (Daemon > 0 && SleepTime > (unsigned int) 60*Daemon) SleepTime = 60*Daemon;
if (Daemon > 0 && SleepTime > (unsigned int) 60*Daemon) {
SleepTime = 60*Daemon;
}
/* Wake up once a minute to recalibrate sleep time in
case of laptop hibernation */

View File

@@ -170,10 +170,11 @@ static int latitude_func(int do_set, Value *val)
static int trig_date_func(int do_set, Value *val)
{
UNUSED(do_set);
val->type = DATE_TYPE;
if (!LastTrigValid) {
val->type = INT_TYPE;
val->v.val = 0;
} else {
val->type = DATE_TYPE;
val->v.val = LastTriggerDate;
}
return OK;
@@ -849,6 +850,7 @@ static SysVar SysVarArr[] = {
{"SortByTime", 0, INT_TYPE, &SortByTime, 0, 0, NULL },
{"SubsIndent", 1, INT_TYPE, &SubsIndent, 0, 132, NULL },
{"Sunday", 1, STR_TYPE, &DynamicDayName[6], 0, 0, NULL },
{"SuppressLRM", 1, INT_TYPE, &SuppressLRM, 0, 1, NULL },
{"SysInclude", 0, STR_TYPE, &SysDir, 0, 0, NULL },
{"T", 0, SPECIAL_TYPE, trig_date_func, 0, 0, NULL },
{"Td", 0, SPECIAL_TYPE, trig_day_func, 0, 0, NULL },

View File

@@ -328,6 +328,9 @@ fi
../src/remind -w128 -c ../tests/utf-8.rem 1 Nov 2019 >> ../tests/test.out
../src/remind -c ../tests/test-addomit.rem 1 Sep 2021 >> ../tests/test.out
../src/remind -cu ../tests/utf-8.rem 1 Nov 2019 >> ../tests/test.out
../src/remind -cu '-i$SuppressLRM=1' ../tests/utf-8.rem 1 Nov 2019 >> ../tests/test.out
# Remove references to SysInclude, which is build-specific
fgrep -v '$SysInclude' < ../tests/test.out > ../tests/test.out.1 && mv -f ../tests/test.out.1 ../tests/test.out
cmp -s ../tests/test.out ../tests/test.cmp

View File

@@ -1024,7 +1024,7 @@ set a057 value("a05"+"6")
"a05" + "6" => "a056"
value("a056") => "SDFJHSDF KSJDFH KJSDFH KSJDFH"
set a058 version()
version() => "04.00.00"
version() => "04.00.02"
set a059 wkday(today())
today() => 1991-02-16
wkday(1991-02-16) => "Saturday"
@@ -2594,7 +2594,7 @@ a086 4
a109 2012-01-01
a128 2018-02-03@16:45
a039 "February"
a058 "04.00.00"
a058 "04.00.02"
a077 "1992 92
"
a096 -4
@@ -2765,7 +2765,8 @@ Variable Value
$SortByTime 0
$SubsIndent 0 [0, 132]
$Sunday "Sunday"
$T 1990-01-01
$SuppressLRM 0 [0, 1]
$T 0
$Td -1
$Thursday "Thursday"
$TimeSep ":"
@@ -3942,6 +3943,118 @@ $MaxStringLen => 65535
pad("foo", "0", 65536) => String too long
../tests/test.rem(799): String too long
# Test OMIT
CLEAR-OMIT-CONTEXT
OMIT Apr
OMIT Jun THROUGH July 15
OMIT Sep 5 THROUGH Sep 10
OMIT 2024-12-25 THROUGH 2025-01-04
OMIT Apr 2022 through July
../tests/test.rem(808): Bad date specification
OMIT DUMP
Global Full OMITs (11 of maximum allowed 1000):
2024-12-25
2024-12-26
2024-12-27
2024-12-28
2024-12-29
2024-12-30
2024-12-31
2025-01-01
2025-01-02
2025-01-03
2025-01-04
Global Partial OMITs (81 of maximum allowed 366):
04-01
04-02
04-03
04-04
04-05
04-06
04-07
04-08
04-09
04-10
04-11
04-12
04-13
04-14
04-15
04-16
04-17
04-18
04-19
04-20
04-21
04-22
04-23
04-24
04-25
04-26
04-27
04-28
04-29
04-30
06-01
06-02
06-03
06-04
06-05
06-06
06-07
06-08
06-09
06-10
06-11
06-12
06-13
06-14
06-15
06-16
06-17
06-18
06-19
06-20
06-21
06-22
06-23
06-24
06-25
06-26
06-27
06-28
06-29
06-30
07-01
07-02
07-03
07-04
07-05
07-06
07-07
07-08
07-09
07-10
07-11
07-12
07-13
07-14
07-15
09-05
09-06
09-07
09-08
09-09
09-10
CLEAR-OMIT-CONTEXT
OMIT 2000-01-01 THROUGH 2020-12-31
../tests/test.rem(812): Too many full OMITs
OMIT Dec 5 2029 through Dec 4 2029
../tests/test.rem(814): Error: THROUGH date earlier than start date
# Don't want Remind to queue reminders
EXIT
@@ -8017,4 +8130,256 @@ February 29
| | | | | | | |
| | | | | | | |
+----------+----------+----------+----------+----------+----------+----------+
┌────────────────────────────────────────────────────────────────────────────┐
│ November 2019
├──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┤
│ Sunday │ Monday │ Tuesday │Wednesday │ Thursday │ Friday │ Saturday
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│ │ │ │ │ │1 │2
│ │ │ │ │ │ │ │
│ │ │ │ │ │ру́сский‎ │ру́сский‎ │
│ │ │ │ │ │ру́сский‎ │ру́сский‎ │
│ │ │ │ │ │ру́сский‎ │ру́сский‎ │
│ │ │ │ │ │ру́сский‎ │ру́сский‎ │
│ │ │ │ │ │ру́сский‎ │ру́сский‎ │
│ │ │ │ │ │ру́сский‎ │ру́сский‎ │
│ │ │ │ │ │ру́сский‎ │ру́сский‎ │
│ │ │ │ │ │ру́сский‎ │ру́сский‎ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │עִבְרִית‎ │עִבְרִית‎ │
│ │ │ │ │ │עִבְרִית‎ │עִבְרִית‎ │
│ │ │ │ │ │עִבְרִית‎ │עִבְרִית‎ │
│ │ │ │ │ │עִבְרִית‎ │עִבְרִית‎ │
│ │ │ │ │ │עִבְרִית‎ │עִבְרִית‎ │
│ │ │ │ │ │עִבְרִית‎ │עִבְרִית‎ │
│ │ │ │ │ │עִבְרִית‎ │עִבְרִית‎ │
│ │ │ │ │ │עִבְרִית‎ │עִבְרִית‎ │
│ │ │ │ │ │עִבְרִית‎ │עִבְרִית‎ │
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│3 │4 │5 │6 │7 │8 │9
│ │ │ │ │ │ │ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ │ │ │ │ │ │ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│ │ │ │ │ │ │ │
│ │ │ │With tabs ‎│ │ │ │
│ │ │ │and │ │ │ │
│ │ │ │spaces │ │ │ │
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│10 │11 │12 │13 │14 │15 │16
│ │ │ │ │ │ │ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ │ │ │ │ │ │ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│ │ │ │ │ │ │ │
│ │ │ │With tabs ‎│ │ │ │
│ │ │ │and │ │ │ │
│ │ │ │spaces │ │ │ │
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│17 │18 │19 │20 │21 │22 │23
│ │ │ │ │ │ │ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ │ │ │ │ │ │ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│ │ │ │ │ │ │ │
│ │ │ │With tabs ‎│ │ │ │
│ │ │ │and │ │ │ │
│ │ │ │spaces │ │ │ │
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│24 │25 │26 │27 │28 │29 │30
│ │ │ │ │ │ │ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │ру́сский‎ │
│ │ │ │ │ │ │ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │עִבְרִית‎ │
│ │ │ │ │ │ │ │
│ │ │ │With tabs ‎│ │ │ │
│ │ │ │and │ │ │ │
│ │ │ │spaces │ │ │ │
└──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┘
┌────────────────────────────────────────────────────────────────────────────┐
│ November 2019 │
├──────────┬──────────┬──────────┬──────────┬──────────┬──────────┬──────────┤
│ Sunday │ Monday │ Tuesday │Wednesday │ Thursday │ Friday │ Saturday │
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│ │ │ │ │ │1 │2 │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ру́сский │ру́сский │
│ │ │ │ │ │ру́сский │ру́сский │
│ │ │ │ │ │ру́сский │ру́сский │
│ │ │ │ │ │ру́сский │ру́сский │
│ │ │ │ │ │ру́сский │ру́сский │
│ │ │ │ │ │ру́сский │ру́сский │
│ │ │ │ │ │ру́сский │ру́сский │
│ │ │ │ │ │ру́сский │ру́сский │
│ │ │ │ │ │ │ │
│ │ │ │ │ │עִבְרִית │עִבְרִית │
│ │ │ │ │ │עִבְרִית │עִבְרִית │
│ │ │ │ │ │עִבְרִית │עִבְרִית │
│ │ │ │ │ │עִבְרִית │עִבְרִית │
│ │ │ │ │ │עִבְרִית │עִבְרִית │
│ │ │ │ │ │עִבְרִית │עִבְרִית │
│ │ │ │ │ │עִבְרִית │עִבְרִית │
│ │ │ │ │ │עִבְרִית │עִבְרִית │
│ │ │ │ │ │עִבְרִית │עִבְרִית │
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│3 │4 │5 │6 │7 │8 │9 │
│ │ │ │ │ │ │ │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ │ │ │ │ │ │ │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│ │ │ │ │ │ │ │
│ │ │ │With tabs │ │ │ │
│ │ │ │and │ │ │ │
│ │ │ │spaces │ │ │ │
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│10 │11 │12 │13 │14 │15 │16 │
│ │ │ │ │ │ │ │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ │ │ │ │ │ │ │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│ │ │ │ │ │ │ │
│ │ │ │With tabs │ │ │ │
│ │ │ │and │ │ │ │
│ │ │ │spaces │ │ │ │
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│17 │18 │19 │20 │21 │22 │23 │
│ │ │ │ │ │ │ │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ │ │ │ │ │ │ │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│ │ │ │ │ │ │ │
│ │ │ │With tabs │ │ │ │
│ │ │ │and │ │ │ │
│ │ │ │spaces │ │ │ │
├──────────┼──────────┼──────────┼──────────┼──────────┼──────────┼──────────┤
│24 │25 │26 │27 │28 │29 │30 │
│ │ │ │ │ │ │ │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │ру́сский │
│ │ │ │ │ │ │ │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │עִבְרִית │
│ │ │ │ │ │ │ │
│ │ │ │With tabs │ │ │ │
│ │ │ │and │ │ │ │
│ │ │ │spaces │ │ │ │
└──────────┴──────────┴──────────┴──────────┴──────────┴──────────┴──────────┘

View File

@@ -798,6 +798,21 @@ set a pad(11:33, " ", 12)
set a pad(11:33, " ", 12, 1)
set a pad("foo", "0", $MaxStringLen+1)
# Test OMIT
CLEAR-OMIT-CONTEXT
OMIT Apr
OMIT Jun THROUGH July 15
OMIT Sep 5 THROUGH Sep 10
OMIT 2024-12-25 THROUGH 2025-01-04
OMIT Apr 2022 through July
OMIT DUMP
CLEAR-OMIT-CONTEXT
OMIT 2000-01-01 THROUGH 2020-12-31
OMIT Dec 5 2029 through Dec 4 2029
# Don't want Remind to queue reminders
EXIT

View File

@@ -17,7 +17,7 @@ HTMLDIR = /var/www/remind
# Where you stick images and CSS files, as seen by UNIX
IMAGEDIR = /var/www/remind/resources
# Where images and CSS fiels are, as seen by web browers
# Where images and CSS files are, as seen by web browsers
IMAGEBASE = /remind/resources
# Set by configure - don't touch.