Compare commits

..

35 Commits

Author SHA1 Message Date
Dianne Skoll
3916887aff Update change log. 2022-08-16 09:24:51 -04:00
Dianne Skoll
f84f59fa91 Bump version to 04.00.03. 2022-08-15 14:48:59 -04:00
Dianne Skoll
1032f8908e Don't create mysterious files named '&1' when creating new reminders. Sigh. 2022-08-11 11:32:59 -04:00
Dianne Skoll
6c2e8fc608 Document calendar_body and plain_body. 2022-08-08 11:49:06 -04:00
Dianne Skoll
012e527fb5 Fix parsing of old-style output. 2022-08-06 12:06:09 -04:00
Dianne Skoll
62198c9807 Use the new calendar_body/plain_body fields. 2022-08-06 11:54:32 -04:00
Dianne Skoll
de95224d62 Use new calendar_body / plain_body elements. 2022-08-06 11:49:35 -04:00
Dianne Skoll
be374a0464 Update test suite for new JSON output. 2022-08-06 09:09:06 -04:00
Dianne Skoll
fe9b3186d7 Add plain_body and calendar_body keys to JSON output. 2022-08-06 09:06:54 -04:00
Dianne Skoll
8405ea6c53 Add note about how to kill remind in queue mode. 2022-08-06 08:34:16 -04:00
Dianne Skoll
4274d05e10 Fix man page typo 2022-08-05 22:09:36 -04:00
Dianne Skoll
4e80ce1159 Don't make SIGINT kill a background process; don't call printf from a signal-handler; use sigaction instead of signal 2022-08-05 22:04:44 -04:00
Dianne Skoll
52f473f2af Update .gitignore 2022-08-04 10:34:45 -04:00
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
27 changed files with 814 additions and 214 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 .

1
.gitignore vendored
View File

@@ -26,3 +26,4 @@ src/test-*.out
src/version.h
tests/test.out
www/Makefile
set-irc-topic

2
configure vendored
View File

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

View File

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

View File

@@ -1,5 +1,38 @@
CHANGES TO REMIND
* VERSION 4.0 Patch 3 - 2022-08-16
- IMPROVEMENT: remind: add plain_body and calendar_body JSON keys in -pp...
output.
- BUG FIX: tkremind: Don't create empty files called '&1' when creating
a new reminder.
- BUG FIX: remind: Don't call signal-unsafe functions from signal handler
* 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

View File

@@ -586,6 +586,18 @@ For a SHADE or COLOR special, the blue color component.
.B body \fIbody\fR
The body of the reminder to issue. Always present.
.TP
.B calendar_body \fIbody\fR
The text appropriate to include in a calendar. Only present if the
original body contains %"...%" sequences and the "q" modifier was used
with Remind's "-pp..." flag.
.TP
.B plain_body \fIbody\fR
The "plain" body of the reminder with any %"...%" sequences removed.
If your back-end is designed to draw a calendar, then it should
use the \fBcalendar_body\fR if present. If not, then it
should use the \fBplain_body\fR if present, and if not, then it
should fall back on the \fBbody\fR.
.TP
.B rawbody \fIraw\fR
The "raw" body of the reminder, before any expression-pasting or
substitution-sequence processing. If the raw body would be the same

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
@@ -1530,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
@@ -1543,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
@@ -1576,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
@@ -1590,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
@@ -2340,8 +2361,8 @@ 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
@@ -2457,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.
@@ -3222,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
@@ -4809,7 +4844,7 @@ 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", \
FSET subst_bx(a,d,t) iif(d==today()+2, "the day after tomorrow", \\
"in " + (d-today()) + " days' time")
REM [today()+3] ++3 MSG Event 1 is %b%
REM [today()+2] ++3 MSG Event 2 is %b%

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

@@ -227,14 +227,16 @@ sub parse_oldstyle_line
if ($hash->{passthru}) {
if ($hash->{passthru} =~ /^(shade|color|colour)$/i) {
if ($hash->{body} =~ /^\s*(\d+)\s+(\d+)\s+(\d+)/) {
if ($hash->{body} =~ /^\s*(\d+)\s+(\d+)\s+(\d+)\s*(.*)/) {
$hash->{r} = $1;
$hash->{g} = $2;
$hash->{b} = $3;
} elsif ($hash->{body} =~ /^\s*(\d+)/) {
$hash->{body} = $4;
} elsif ($hash->{body} =~ /^\s*(\d+)\s*(.*)/) {
$hash->{r} = $1;
$hash->{g} = $1;
$hash->{b} = $1;
$hash->{body} = $2;
}
}
}

View File

@@ -76,7 +76,15 @@ sub render
$layout->set_width(1024 * ($x2 - $x1 - 2 * $settings->{border_size}));
$layout->set_wrap('word-char');
$layout->set_text(Encode::decode('UTF-8', $self->{body}));
my $body;
if (exists($self->{calendar_body})) {
$body = $self->{calendar_body};
} elsif (exists($self->{plain_body})) {
$body = $self->{plain_body};
} else {
$body = $self->{body};
}
$layout->set_text(Encode::decode('UTF-8', $body));
my $desc = Pango::FontDescription->from_string($settings->{entry_font} . ' ' . $settings->{entry_size} . 'px');
$layout->set_font_description($desc);
my ($wid, $h) = $layout->get_pixel_size();
@@ -233,11 +241,9 @@ sub _adjust
package Remind::PDF::Entry::color;
use base 'Remind::PDF::Entry';
# Strip the RGB prefix from body
# Nothing to do for COLOR-type reminder
sub _adjust
{
my ($self) = @_;
$self->{body} =~ s/^\d+\s+\d+\s+\d+\s+//;
}
package Remind::PDF::Entry::postscript;

View File

@@ -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
@@ -1089,8 +1091,13 @@ proc FillCalWindow {} {
} else {
set tag "*"
}
set stuff [dict get $obj body]
if {[dict exists $obj calendar_body]} {
set stuff [dict get $obj calendar_body]
} elseif {[dict exists $obj plain_body]} {
set stuff [dict get $obj plain_body]
} else {
set stuff [dict get $obj body]
}
set day [string trimleft $day 0]
set n [expr $day+$offset]
set month [string trimleft $month 0]
@@ -1114,30 +1121,31 @@ proc FillCalWindow {} {
}
"COLOUR" -
"COLOR" {
if {[regexp {^ *([0-9]+) +([0-9]+) +([0-9]+) +(.*)$} $stuff all r g b rest]} {
if {$r > 255} {
set r 255
} elseif {$r < 0} {
set r 0
}
if {$g > 255} {
set g 255
} elseif {$g < 0} {
set g 0
}
if {$b > 255} {
set b 255
} elseif {$b < 0} {
set b 0
}
set color [format "%02X%02X%02X" $r $g $b]
set extratags "clr$color"
.cal.t$n configure -state normal
.cal.t$n tag configure $extratags -foreground "#$color"
.cal.t$n configure -state disabled -takefocus 0
set stuff $rest
set type "COLOR"
}
set r [dict get $obj r]
set g [dict get $obj g]
set b [dict get $obj b]
if {$r > 255} {
set r 255
} elseif {$r < 0} {
set r 0
}
if {$g > 255} {
set g 255
} elseif {$g < 0} {
set g 0
}
if {$b > 255} {
set b 255
} elseif {$b < 0} {
set b 0
}
set color [format "%02X%02X%02X" $r $g $b]
set extratags "clr$color"
.cal.t$n configure -state normal
.cal.t$n tag configure $extratags -foreground "#$color"
.cal.t$n configure -state disabled -takefocus 0
set stuff $stuff
set type "COLOR"
}
}
if { $type != "*" && $type != "COLOR" && $type != "COLOUR"} {
@@ -2104,7 +2112,7 @@ proc CreateReminder {w} {
# Check it out!
global Remind
set f [open "|$Remind -arq -e - 2>&1" r+]
set f [open "|$Remind -arq -e - 2>@1" r+]
puts $f "BANNER %"
puts $f "$rem MSG %"
puts $f "MSG %_%_%_%_"

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
*/
@@ -289,6 +293,19 @@ despace(char const *s)
return buf;
}
void PrintJSONChar(char c) {
switch(c) {
case '\b': printf("\\b"); break;
case '\f': printf("\\f"); break;
case '\n': printf("\\n"); break;
case '\r': printf("\\r"); break;
case '\t': printf("\\t"); break;
case '"': printf("\\\""); break;
case '\\': printf("\\\\"); break;
default: printf("%c", c);
}
}
void PrintJSONString(char const *s)
{
while (*s) {
@@ -1908,6 +1925,7 @@ static void WriteSimpleEntryProtocol1(CalEntry *e)
static void WriteSimpleEntryProtocol2(CalEntry *e, int today)
{
int done = 0;
char const *s;
if (DoPrefixLineNo) {
PrintJSONKeyPairString("filename", e->filename);
PrintJSONKeyPairInt("lineno", e->lineno);
@@ -2034,6 +2052,45 @@ static void WriteSimpleEntryProtocol2(CalEntry *e, int today)
if (strcmp(e->raw_text, e->text)) {
PrintJSONKeyPairString("rawbody", e->raw_text);
}
/* Figure out calendar_body and plain_body */
if (DontSuppressQuoteMarkers) {
s = strstr(e->text, "%\"");
if (s) {
s += 2;
printf("\"calendar_body\":\"");
while (*s) {
if (*s == '%' && *(s+1) == '"') {
break;
}
PrintJSONChar(*s);
s++;
}
printf("\",");
}
}
s = strstr(e->text, "%\"");
if (s || e->is_color) {
printf("\"plain_body\":\"");
s = e->text;
if (e->is_color) {
while(*s && !isspace(*s)) s++;
while(*s && isspace(*s)) s++;
while(*s && !isspace(*s)) s++;
while(*s && isspace(*s)) s++;
while(*s && !isspace(*s)) s++;
while(*s && isspace(*s)) s++;
}
while(*s) {
if (*s == '%' && *(s+1) == '"') {
s += 2;
continue;
}
PrintJSONChar(*s);
s++;
}
printf("\",");
}
printf("\"body\":\"");
PrintJSONString(e->text);
printf("\"");

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

@@ -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

@@ -1357,13 +1357,23 @@ void UTCToLocal(int utcdate, int utctime, int *locdate, int *loctime)
/* command-line flag is supplied. */
/* */
/***************************************************************/
static sig_atomic_t got_sigint = 0;
void SigIntHandler(int d)
void
SigIntHandler(int d)
{
UNUSED(d);
signal(SIGINT, SigIntHandler);
GotSigInt();
exit(0);
got_sigint = 1;
}
int
GotSigInt(void)
{
if (got_sigint) {
got_sigint = 0;
return 1;
}
return 0;
}
void

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

@@ -22,6 +22,7 @@
#define isempty(c) (isspace(c) || ((c) == '\\'))
#include "dynbuf.h"
#include <ctype.h>
int CallUserFunc (char const *name, int nargs, ParsePtr p);
int DoFset (ParsePtr p);
@@ -143,7 +144,7 @@ int MoonPhase (int date, int time);
void HuntPhase (int startdate, int starttim, int phas, int *date, int *time);
int CompareRems (int dat1, int tim1, int prio1, int dat2, int tim2, int prio2, int bydate, int bytime, int byprio, int untimed_first);
void SigIntHandler (int d);
void GotSigInt (void);
int GotSigInt (void);
void PurgeEchoLine(char const *fmt, ...);
void FreeTrig(Trigger *t);
void AppendTag(DynamicBuffer *buf, char const *s);

View File

@@ -59,6 +59,7 @@ static QueuedRem *FindNextReminder (void);
static int CalculateNextTimeUsingSched (QueuedRem *q);
static void DaemonWait (struct timeval *sleep_tv);
static void reread (void);
static void PrintQueue(void);
/***************************************************************/
/* */
@@ -123,6 +124,7 @@ void HandleQueuedReminders(void)
Trigger trig;
struct timeval tv;
struct timeval sleep_tv;
struct sigaction sa;
/* Suppress the BANNER from being issued */
NumTriggered = 1;
@@ -161,7 +163,11 @@ void HandleQueuedReminders(void)
q = q->next;
}
if (!DontFork || Daemon) signal(SIGINT, SigIntHandler);
if (!DontFork || Daemon) {
sa.sa_handler = SigIntHandler;
sa.sa_flags = 0;
(void) sigaction(SIGINT, &sa, NULL);
}
/* Sit in a loop, issuing reminders when necessary */
while(1) {
@@ -184,7 +190,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 */
@@ -203,6 +211,10 @@ void HandleQueuedReminders(void)
sleep(SleepTime);
}
if (GotSigInt()) {
PrintQueue();
}
/* If not in daemon mode and day has rolled around,
exit -- not much we can do. */
if (!Daemon) {
@@ -335,13 +347,13 @@ static QueuedRem *FindNextReminder(void)
/***************************************************************/
/* */
/* GotSigInt */
/* PrintQueue */
/* */
/* Split out what's done on a SIGINT from the SIGINT Handler. */
/* This will be necessary for OS/2 multithreaded. */
/* For debugging: Print queue contents to STDOUT */
/* */
/***************************************************************/
void GotSigInt(void)
static
void PrintQueue(void)
{
QueuedRem *q = QueueHead;
@@ -366,6 +378,7 @@ void GotSigInt(void)
q = q->next;
}
printf(NL);
printf("To terminate program, send SIGQUIT (probably Ctrl-\\ on the keyboard.)%s", NL);
}
/***************************************************************/

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

@@ -123,10 +123,10 @@ REM Mon OMITFUNC foo MSG bar
EOF
# Test default color
../src/remind -ppp - 1 Jan 2012 9:00 <<'EOF' >> ../tests/test.out 2>&1
../src/remind -pppq - 1 Jan 2012 9:00 <<'EOF' >> ../tests/test.out 2>&1
REM 2 MSG Normal
SET $DefaultColor "255 0 0"
REM 3 MSG Red
REM 3 MSG %"Red%" on the calendar!
SET $DefaultColor "-1 -1 -1"
REM 4 MSG Normal
# Should give an error
@@ -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.03"
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.03"
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
@@ -7697,7 +7810,7 @@ February 29
{
"monthname":"January","year":2012,"daysinmonth":31,"firstwkday":0,"mondayfirst":0,"daynames":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"prevmonthname":"December","daysinprevmonth":31,"prevmonthyear":2011,"nextmonthname":"February","daysinnextmonth":29,"nextmonthyear":2012,"entries":[
{"date":"2012-01-02","filename":"-","lineno":1,"d":2,"priority":5000,"body":"Normal"},
{"date":"2012-01-03","filename":"-","lineno":3,"passthru":"COLOR","d":3,"priority":5000,"r":255,"g":0,"b":0,"rawbody":"Red","body":"255 0 0 Red"},
{"date":"2012-01-03","filename":"-","lineno":3,"passthru":"COLOR","d":3,"priority":5000,"r":255,"g":0,"b":0,"rawbody":"%\"Red%\" on the calendar!","calendar_body":"Red","plain_body":"Red on the calendar!","body":"255 0 0 %\"Red%\" on the calendar!"},
{"date":"2012-01-04","filename":"-","lineno":5,"d":4,"priority":5000,"body":"Normal"}
]
}
@@ -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