                         SlyEdit message editor
                              Version 1.89b
                        Release date: 2024-05-11

                                  by

                             Eric Oulashin
                     Sysop of Digital Distortion BBS
               BBS internet address: digitaldistortionbbs.com
			         Alternate: digdist.synchro.net
                     Email: eric.oulashin@gmail.com



This file describes SlyEdit, a message editor for Synchronet.
Note: For sysops who already have a previous version of SlyEdit
installed and are upgrading to this version, please see the file
Upgrading.txt.

Contents
========
 1. Disclaimer
 2. Introduction
 3. Installation & Setup
 4. Features
 5. Configuration file
 6. Ice-style Color Theme Settings
 7. DCT-style Color Theme Settings
 8. Common colors (appearing in both Ice and DCT color theme files)
 9. Text replacements (AKA Macros)
10. User settings
11. Taglines
12. Spell check and dictionaries
13. Version history


1. Disclaimer
=============
Although I have tested SlyEdit, I cannot guarantee that it is 100% bug free or
will work as expected in all environments in all cases.  That said, I hope you
find SlyEdit useful and enjoy using it.


2. Introduction
===============
SlyEdit is a message editor that I wrote in JavaScript for Synchronet, which
can mimic the look and feel of IceEdit or DCT Edit.  SlyEdit also supports
customization of colors via theme files, cross-posting into other message
areas, text search, and file import & export (works with files on the
BBS machine, and is enabled only for the sysop).

The motivation for creating this was that IceEdit and DCT Edit were always
my two favorite BBS message editors, but in a world where 32-bit (and 64-bit)
Windows and *nix platforms are common, 16-bit DOS emulation is required to run
IceEdit and DCT Edit, which is noticeably slow and sometimes unreliable.
Since SlyEdit is written in JavaScript, it is faster than a DOS-based message
editor and can run in any environment in which Synchronet runs, without any
modification or being re-compiled.

SlyEdit will recognize the user's terminal size and set up the screen
accordingly.  The width of the edit area will always be 80 characters and
support up to 79 characters; however, an increased terminal size will provide
more room for message information to be displayed.  Also, a terminal height
greater than the standard 24 or 25 characters will provide a taller edit area,
allowing more of the message to be seen on the screen at a time.

SlyEdit allows the user to select/change the color of their text using the
CTRL-K key, if the allowColorSelection is set to true in SlyEdit.cfg.  Also,
you can have SlyEdit convert colors to ANSI when posting messages, for
compatibility with other BBS software.  To do so, set the saveColorsAsANSI
setting to true in SlyEdit.cfg.

As of version 1.88b (2024-02-11), SlyEdit supports inputting UTF-8 text.

Also, SlyEdit has no moving parts that can wear out over time.

Thanks go out to the following people for testing:
- Nick of Lightning BBS (lightningbbs.dyndns.org) for testing early versions
- Nick (AKA Access Denied) of The Pharcyde (pharcyde.org) for testing the
  newer versions and for his input on various features, mainly message quoting
- echicken (sysop of Electronic Chicken) for his solution to look up the
  original author of a message after a user changes the "To" name when
  replying to a message

3. Installation & Setup
=======================
These are the steps for installation:
 1. Extract the archive.  If you're viewing this file, then you've probably
    already done this. :)
 2. There are 2 ways SlyEdit's files can be copied onto your Synchronet system:
    1. Copy the JavaScript files into your sbbs/exec directory and the .cfg files
       into your sbbs/ctrl directory.  If you plan to customize your SlyEdit.cfg
       or color theme files, it's recommended to also put the .cfg files in your
       sbbs/mods directory so that your configuration won't be accidentally
       overwritten when updating the files from the Synchronet CVS repository.
       SlyEdit will first check the sbbs/mods directory for the configuration
       files, then sbbs/ctrl, and then SlyEdit's own directory for the
       configuration files.  In other words, the SlyEdit configuration files
       in sbbs/mods take first precedence, sbbs/ctrl 2nd precedence, and
       SlyEdit's own directory takes last precedence for the configuration
       files.
    2. Copy all files together into their own directory of your choice
 3. Set up SlyEdit on your BBS with Synchronet's configration program (SCFG).

SlyEdit can be set to mimic IceEdit or DCT Edit via a command-line parameter.
The values for this parameter are as follows:
  ICE: Mimic the IceEdit look & feel
  DCT: Mimic the DCT Edit look & feel
  RANDOM: Randomly select either the IceEdit or DCT Edit look & feel

To add SlyEdit to Synchronet's list of external editors, run Synchronet's
configuration program (SCFG) and select "External Programs", and then
"External Editors".  The following describes setting up SlyEdit using the
ICE parameter for IceEdit emulation:
 1. Scroll down to the empty slot in the editor list and press Enter to
    select it.
 2. For the external editor name, enter "SlyEdit (Ice style)" (without the quotes)
    (or similar, depending on your personal preference)
 3. For the internal code, use SLYEDICE (or whatever you want, depending on your
    personal preference)
 4. Press Enter to select and edit the new entry.  Asuming that the .js files
    are in the sbbs/exect directory, the settings should be as follows (the
    wording and options shown may vary, depending on the version of Synchronet
    you have installed):
      Command line: ?SlyEdit.js %f ICE
      Access requirement string: ANSI
      Intercept standard I/O: No
      Native (32-bit) Executable: No
      Use Shell to Execute: No
      Record Terminal Width: Yes
      Word-wrap Quoted Text: Your decision - Wrap to specific width, 80, or no
      Automatically Quoted Text: All
      Editor Information Files: QuickBBS MSGINF/MSGTMP
      Expand Line Feeds to CRLF: Yes
      Strip FidoNet Kludge Lines: No
      BBS Drop File Type: None
    After you've added SlyEdit, your Synchronet configuration window should look
    like this:
    +[¦][?]--------------------------------------------------------------+
    ¦                      SlyEdit (Ice style) Editor                    ¦
    ¦--------------------------------------------------------------------¦
    ¦ ¦Name                            SlyEdit  (Ice style)              ¦
    ¦ ¦Internal Code                   SLYEDICE                          ¦
    ¦ ¦Remote Command Line             ?SlyEdit.js %f ICE                ¦
    ¦ ¦Access Requirements             ANSI                              ¦
    ¦ ¦Intercept Standard I/O          No                                ¦
    ¦ ¦Native (32-bit) Executable      No                                ¦
    ¦ ¦Use Shell to Execute            No                                ¦
    ¦ ¦Record Terminal Width           Yes                               ¦
    ¦ ¦Word-wrap Quoted Text           Yes, for terminal width           ¦
    ¦ ¦Automatically Quoted Text       All                               ¦
    ¦ ¦Editor Information Files        QuickBBS MSGINF/MSGTMP            ¦
    ¦ ¦Expand Line Feeds to CRLF       Yes                               ¦
    ¦ ¦Strip FidoNet Kludge Lines      No                                ¦
    ¦ ¦BBS Drop File Type              None                              ¦
    +--------------------------------------------------------------------+

    For DCT Edit mode, use DCT in place of ICE on the command line.  For
    random mode, use RANDOM in place of ICE.

    Note that if you placed the files in a different directory, then the
    command line should include the full path to SlyEdit.js.  For example,
    if SlyEdit was placed in sbbs/xtrn/SlyEdit, then the command line would
    be /BBS/sbbs/xtrn/DigDist/SlyEdit/SlyEdit.js %f ICE


4. Features
===========
As mentioned earlier, SlyEdit is can mimic the look & feel of IceEdit or
DCT Edit.  It also has the following features:
- Message quoting: When replying to a message, users can select lines from the
  message to quote.  By default, SlyEdit puts the initials of the original
  author in front of the quote lines to indicate who originally wrote those
  parts of the message.  Optionally, sysops may disable the use of initials
  in quote lines, in which case SlyEdit simply prefixes quote lines with " > "
  as was done in IceEdit, DCT Edit, and other editors of the early-mid 1990s.
- Cross-posting into other message sub-boards: When posting a message to a
  message sub-board, SlyEdit allows the user to select other message sub-boards
  to post the message into.  SlyEdit will post the message to the user's
  current message sub-board by default.  Using the cross-post feature, the
  user can select any number of other message sub-boards to cross-post his/her
  message into.  SlyEdit respects the ARS security setting for each sub-board -
  If a user is not allowed to post in a message sub-board, SlyEdit will not
  allow the user to select that sub-board for cross-posting.  The user can also
  un-select their current message sub-board.  When the user un-selects their
  current message sub-board and chooses other message sub-boards to post
  his/her message into, Synchronet will say that the message was aborted
  because the message file wasn't saved as it normally is for the current
  message sub-board.  However, SlyEdit will output all of the message
  sub-boards that the message was posted into.  If the user un-selected their
  current message sub-board, SlyEdit will also output a note explaining that
  the BBS will say the message was aborted, even though it was posted into
  other sub-boards and that is normal.
- Text search: Allows the user to search for text in the message.  If
  the text is found, the message area will scroll to it, and it will be
  highlighted.  Repeated searches for the same text will look for the
  next occurrance of that text.
- Allows changing the message subject
  Note: If using a Synchronet 3.17c development build (pre official release),
  you will need a build from July 21, 2019 or newer.
- Navigation: Page up/down, home/end of line, and arrow keys
- Slash commands (at the start of the line):
  /A: Abort
  /S: Save
  /Q: Quote message
  /C: Cross-post message sub-board selection
- Sysops can import a file (stored on the BBS machine) into the message
- Sysops can export the current message to a file (on the BBS machine)
- Configuration file with behavior and color settings.  See section 4
  (Configuration File) for more information.
- Spell check

The following is a summary of the keyboard shortcuts, from SlyEdit's command
help screen (note that file import, with Ctrl-O & Ctrl-X, are only available to
the sysop or users with sysop access, and file import/export takes place on the
BBS machine):

Help keys                                     Slash commands (on blank line)
---------                                     ------------------------------
Ctrl-G       : Input graphic character      ¦ /A      : Abort
Ctrl-L       : Command key list (this list) ¦ /S      : Save
                                            ¦ /Q      : Quote message
Ctrl-T       : List text replacements       ¦ /T      : List text replacements
                                            ¦ /U      : Your user settings
                                            ¦ /C      : Cross-post selection
                                            ¦ /UPLOAD : Upload a message

Command/edit keys
-----------------
Ctrl-A       : Abort message                ¦ PageUp  : Page up
Ctrl-Z       : Save message                 ¦ PageDown: Page down
Ctrl-Q       : Quote message                ¦ Ctrl-W  : Word/text search
Insert/Ctrl-I: Toggle insert/overwrite mode ¦ Ctrl-D  : Delete line
Ctrl-S       : Change subject               ¦ ESC     : Command menu
Ctrl-U       : Your user settings           ¦ Ctrl-C  : Cross-post selection
Ctrl-K       : Change text color            ¦ Ctrl-R  : Spell checker
Ctrl-O       : Import a file                ¦ Ctrl-X  : Export to file


5. Configuration file
=====================
The configuration file, SlyEdit.cfg, is split up into 3 sections -
Behavior, Ice colors, and DCT colors.  These sections are designated
by [BEHAVIOR], [ICE_COLORS], and [DCT_COLORS], respectively.

To help with configuration, there is a menu-driven configuration script in
sbbs/exec called slyedcfg.js. To run it, open a command prompt in the sbbs/exec
directory and run it with this command:
jsexec slyedcfg

Alternately, you can specify the .js filename extension if you want to:
jsexec slyedcfg.js

The configuration script will copy your SlyEdit configuration file to your
sbbs/mods directory to help prevent it from being accidentally overridden when
doing an update from the Synchronet source repository. SlyEdit will pick up its
configuration from sbbs/mods if the configuration file is there.

The configuration settings are described below:

Behavior settings
-----------------
Setting                           Description
-------                           -----------
displayEndInfoScreen              Whether or not to display the info
                                  screen when SlyEdit exits.  Valid values
                                  are true and false.  If this option is
                                  not specified, this feature will be
                                  enabled by default.

userInputTimeout                  Whether or not to use an input timeout
                                  for users.  Valid values are true and
                                  false.  Note: The input timeout is not
                                  used for sysops.  If this option is not
                                  specified, this feature will be enabled
                                  by default.

inputTimeoutMS                    The amount of time (in milliseconds) to
                                  use for the input timeout.  If this option
                                  is not specified, this option will default
                                  to 300000.

reWrapQuoteLines                  Whether or not to re-wrap quote lines. Valid
                                  values are true and false.  This feature is
                                  enabled by default.  With this feature
                                  enabled, SlyEdit will re-wrap quote lines
                                  to still be complete and readable after the
                                  quote prefix character is added to the front
                                  of the quote lines.  SlyEdit is able to
                                  recognize quote lines beginning with >
                                  or 2 letters and a > (such as EO>).  If this
                                  feature is disabled, quote lines will simply
                                  be trimmed to make room for the quote prefix
                                  character to be added to the front.

allowColorSelection               Whether or not to let the user change the
                                  color/attributes of the text they're typing.
                                  Defaults to true.  When this is enabled, the
                                  user can change their text color with the
                                  CTRL-K hotkey.

saveColorsAsANSI                  Whether or not to save message color/attribute
                                  codes as ANSI (if not, they will be saved as
                                  Synchronet attribute codes). Saving colors as
                                  ANSI in posted messages provides a
                                  compatibility with other BBS software and
                                  message readers that might not understand
                                  Synchronet attribute codes (but most do
                                  understand ANSI).

allowCrossPosting                 Whether or not to allow cross-posting
                                  messages into different/multiple message
                                  sub-boards.  Valid values are true and false.

enableTextReplacements            Toggles the use of text replacements (AKA
                                  macros) as the user types a message.  Valid
                                  values are true, false, and regex.  If regex
                                  is used, text replacements will be enabled
                                  and used as regular expressions as
                                  implemented by JavaScript.  For more
                                  information, see section 10 (Text
                                  replacements (AKA Macros)).

tagLineFilename                   Specifies the name of the file that stores
                                  taglines, which users can optionally choose
                                  from to be appended to their message upon
                                  saving the message.

taglinePrefix                     Some text to be added to the front of
                                  a tagline that is selected from the user.
                                  The intention of this setting is to
                                  differentiate taglines from the rest of the
                                  message.  This defaults to the string "... "
                                  (3 dots and a space).  If desired, this can
                                  be set to a blank string (nothing after the
                                  =) - for instance, if you only want to put
                                  double quotes around text lines, you could
                                  set this to blank and enable the
                                  quoteTagLines setting.

quoteTaglines                     Whether or not to put selected taglines in
                                  double quotes.  This defaults to false.  If
                                  you like taglines to have double quotes and
                                  no prefix, you can set this to true and set
                                  taglinePrefix to a blank string (nothing
                                  after the =).

shuffleTaglines                   Whether or not to shuffle (randomize) the
                                  list of taglines displayed to the user for
                                  selection.

allowUserSettings                 Whether or not to allow users to configure
                                  their own user settings.  This defaults to
                                  true.

allowEditQuoteLines               Whether or not to allow the user to edit
                                  quote lines.  Valid values are true and
                                  false.  If this option is not specified, the
                                  default value is true.

allowSpellCheck                   Whether or not to allow spell check.  Valid
                                  values are true and false.  Defaults to true.
                                  You might want to disable spell check if,
                                  for instance, the spell check feature causes
                                  an "out of memory" error on your system.

useQuoteLineInitials              Whether or not to prefix quoted message lines
                                  with the previous author's initials when
                                  replying to a message.  Valued values are
                                  true and false.  If this setting is disabled,
                                  SlyEdit will simply prefix the quoted lines
                                  with " > ", as was done in IceEdit, DCT Edit,
                                  and other message editors of the early-mid
                                  1990s.  This setting is enabled by default.
                                  This setting serves as the default for the
                                  user setting, which users can configure in
                                  their own settings.

indentQuoteLinesWithInitials      When prefixing quoted messages lines with the
                                  previous author's initials, this setting
                                  specifies whether or not to indent quoted
                                  lines with a space.  Valued values are true
                                  and false.  This setting is disabled by
                                  default.  This setting serves as the default
                                  for the user setting, which users can
                                  configure in their own settings.

enableTagLines                    Whether or not to enable the option for users
                                  to choose a tagline to append to their
                                  message upon saving the message.  This
                                  setting serves as the default for the user
                                  setting, which users can configure in their
                                  own settings.

dictionaryFilenames               Dictionary filenames (used for spell check).
                                  This is a comma-separated list of dictionary
                                  filenames.  The dictionary filenames are in
                                  the format dictionary_<language>.txt, where
                                  <language> is the language name.  In this
                                  list, the filenames can be in that format, or
                                  just <language>.txt, or just <language>.
                                  Leave blank to use all dictionary files that
                                  exist on the system.  The dictionary files
                                  are located in either sbbs/mods, sbbs/ctrl,
                                  or the same directory as SlyEdit.

Ice colors
----------
Setting                           Description
-------                           -----------
ThemeFilename                     The name of the color theme file to use.
                                  Note: Ice-style theme settings are described
                                  in Section 5: Ice-style Color Theme Settings.
                                  If no theme file is specified, then default
                                  colors will be used.
menuOptClassicColors              Whether or not to use the classic Ice-style
                                  menu option colors.  Valid options are true
                                  and false.  If this option is set to false,
                                  then new colors will be used for Ice-style
                                  menu options.  If this is set to true, then
                                  the classic Ice-style menu option colors will
                                  be used.  Note that if this is set to false,
                                  the color setting SelectedOptionTextColor
                                  won't be used.

DCT colors
----------
Setting                           Description
-------                           -----------
ThemeFilename                     The name of the color theme file to use.
                                  Note: DCT-style theme settings are described
                                  in Section 8: DCT-style Color Theme Settings.
                                  If no theme file is specified, then default
                                  colors will be used.

The color theme files are plain text files that can be edited with a text
editor.  For each color setting, you can specify color attribute characters as
specified in the Synchronet documentation for attribute (Ctrl-A) codes:
http://wiki.synchro.net/custom:ctrl-a_codes
Note that you don't need control (Ctrl-A) characters for the color settings;
just the attribute characters.  A couple examples of specifying colors:

High green: gh
Normal cyan: c


6. Ice-style Color Theme Settings
=================================
Note that you don't need control (Ctrl-A) characters for the color settings;
just the attribute characters.

The following options are valid for Ice-style theme files:
----------------------------------------------------------
QuoteLineColor                    The color for quoted lines in the message

BorderColor1                      The first color to use for borders
                                  (for alternating border colors)

BorderColor2                      The other color to use for borders
                                  (for alternating border colors)

KeyInfoLabelColor                 The color to use for key information
                                  labels (displayed on the bottom border)

TopInfoBkgColor                   The color to use for the background in
                                  the informational area at the top

TopLabelColor                     The color to use for informational labels
                                  in the informational area at the top

TopLabelColonColor                The color to use for the colons (:) in the
                                  informational area at the top

TopToColor                        The color to use for the "To" name in the
                                  informational area at the top

TopFromColor                      The color to use for the "From" name in the
                                  informational area at the top

TopSubjectColor                   The color to use for the subject in the
                                  informational area at the top

TopTimeColor                      The color to use for the time left in the
                                  informational area at the top

TopTimeLeftColor                  The color to use for the time left in the
                                  informational area at the top

EditMode                          The color to use for the edit mode text

QuoteWinText                      The color for non-highlighted text in
                                  the quote window

QuoteLineHighlightColor           The color for highlighted text in the
                                  quote window

QuoteWinBorderTextColor           The color for the quote window borders

; Colors for the multi-choice options
SelectedOptionBorderColor         The color to use for the borders around
                                  text for selected multi-choice options

SelectedOptionTextColor           The color to use for the text for selected
                                  multi-choice options

UnselectedOptionBorderColor       The color to use for the borders around
                                  text for unselected multi-choice options

UnselectedOptionTextColor         The color to use for the text for unselected
                                  multi-choice options

7. DCT-style Color Theme Settings
=================================
Note that you don't need control (Ctrl-A) characters for the color settings;
just the attribute characters.

The following options are valid for DCT-style theme files:
----------------------------------------------------------
QuoteLineColor                    The color for quoted lines in the message

TopBorderColor1                   The first color to use for the
                                  top borders (for alternating border
                                  colors)

TopBorderColor2                   The other color to use for the
                                  top borders (for alternating border
                                  colors)

EditAreaBorderColor1              The first color to use for the
                                  edit area borders (for alternating border
                                  colors)

EditAreaBorderColor2              The other color to use for the
                                  edit area borders (for alternating border
                                  colors)

EditModeBrackets                  The color to use for the square brackets
                                  around the edit mode text that appears
                                  in the bottom border (the [ and ] around
                                  the "INS"/"OVR")

EditMode                          The color to use for the edit mode text

TopLabelColor                     The color to use for the informational labels
                                  in the informational area at the top

TopLabelColonColor                The color to use for the colons (:) in the
                                  informational area at the top

TopFromColor                      The color to use for the "From" name in the
                                  informational area at the top

TopFromFillColor                  The color to use for the filler dots in the
                                  "From" name in the informational area at the top

TopToColor                        The color to use for the "To" name in the
                                  informational area at the top

TopToFillColor                    The color to use for the filler dots in the
                                  "To" name in the informational area at the top

TopSubjColor                      The color to use for the subject in the informational
                                  area at the top

TopSubjFillColor                  The color to use for the filler dots in the subject
                                  in the informational area at the top

TopAreaColor                      The color to use for the "Area" text in the
                                  informational area at the top

TopAreaFillColor                  The color to use for the filler dots in the "Area"
                                  field in the informational area at the top

TopTimeColor                      The color to use for the "Time" text in the
                                  informational area at the top

TopTimeFillColor                  The color to use for the filler dots in the "Time"
                                  field in the informational area at the top

TopTimeLeftColor                  The color to use for the "Time left" text in the
                                  informational area at the top

TopTimeLeftFillColor              The color to use for the filler dots in the "Time left"
                                  field in the informational area at the top

TopInfoBracketColor               The color to use for the square brackets in the
                                  informational area at the top

QuoteWinText                      The color for non-highlighted text in
                                  the quote window

QuoteLineHighlightColor           The color for highlighted text in the
                                  quote window

QuoteWinBorderTextColor           The color to use for the text in the quote window
                                  borders

QuoteWinBorderColor               The color to use for the quote window borders

BottomHelpBrackets                The color to use for the brackets displayed in
                                  the line of help text at the bottom

BottomHelpKeys                    The color to use for the key names written in
                                  the line of help text at the botom

BottomHelpFill                    The color to use for the filler dots in the line of
                                  help text at the bottom

BottomHelpKeyDesc                 The color to use for the key descriptions in the
                                  line of help text at the bottom

TextBoxBorder                     The color to use for text box borders (i.e., the
                                  abort confirmation prompt)

TextBoxBorderText                 The color to use for text in the borders of text
                                  boxes (i.e., the abort confirmation prompt)

TextBoxInnerText                  The color to use for text inside text boxes

YesNoBoxBrackets                  The color to use for the square brackets used for
                                  yes/no confirmation prompt boxes

YesNoBoxYesNoText                 The color to use for the actual "Yes"/"No" text in
                                  yes/no confirmation prompt boxes

SelectedMenuLabelBorders          The color to use for the border characters for the
                                  labels of currently active drop-down menus

SelectedMenuLabelText             The color to use for the text for the labels of
                                  currently active drop-down menus

UnselectedMenuLabelText           The color to use for the text for the labels of
                                  inactive drop-down menus

MenuBorders                       The color to use for the drop-down menu borders

MenuSelectedItems                 The color to use for selected items on the drop-down
                                  menus

MenuUnselectedItems               The color to use for unselected items on the
                                  drop-down menus

MenuHotkeys                       The color to use for the hotkey characters in the
                                  menu items on the drop-down menus

8. Common colors (appearing in both Ice and DCT color theme files)
==================================================================
Note that you don't need control (Ctrl-A) characters for the color settings;
just the attribute characters.

listBoxBorder                     The color to use for the border of list
                                  boxes, such as the cross-post area selection
                                  box and the text replacements list box.  Note
                                  that this setting replaces crossPostBorder,
                                  which was used in previous versions of
                                  SlyEdit.

listBoxBorderText                 The color to use for text in the borders of
                                  list boxes, such as the cross-post area
                                  selection box and the text replacements list
                                  box.  Note that this setting replaces
                                  crossPostBorderText, which was used in
                                  previous versions of SlyEdit.

crossPostMsgAreaNum               The color to use for the message group/sub-
                                  board numbers in the cross-post area
                                  selection box

crossPostMsgAreaNumHighlight      The color to use for the highlighted
                                  (lightbar) message group/sub-board numbers
                                  in the cross-post area selection box

crossPostMsgAreaDesc              The color to use for the message group/
                                  sub-board descriptions in the cross-post
                                  area selection box

crossPostMsgAreaDescHighlight     The color to use for the highlighted
                                  (lightbar) message group/sub-board
                                  descriptions in the cross-post area selection
                                  box

crossPostChk                      The color to use for the checkmarks for the
                                  enabled message sub-boards in the cross-post
                                  area selection box

crossPostChkHighlight             The color to use for the highlighted
                                  (lightbar) checkmarks for the enabled
                                  message sub-boards in the cross-post area
                                  selection box

crossPostMsgGrpMark               The color to use for the current message
                                  group marker character in the cross-post area
                                  selection box

crossPostMsgGrpMarkHighlight      The color to use for the highlighted
                                  (lightbar) current message group marker
                                  character in the cross-post area selection
                                  box

msgWillBePostedHdr                The color to use for the text "Your message
                                  will be posted into the following area(s)"
                                  text when exiting SlyEdit

msgPostedGrpHdr                   The color to use for the group name header
                                  when listing the message's posted message
                                  areas when exiting SlyEdit

msgPostedSubBoardName             The color to use for the message sub-boards
                                  when listing the message's posted message
                                  areas when exiting SlyEdit

msgPostedOriginalAreaText         The color to use for the text "(original
                                  message area)" when listing the message's
                                  posted message areas when exiting SlyEdit

msgHasBeenSavedText               The color to use for the text "The message
                                  has been saved." when exiting SlyEdit

msgAbortedText                    The color to use for the Message Aborted
                                  text when exiting SlyEdit

emptyMsgNotSentText               The color to use for the Message Not Sent
                                  text when exiting SlyEdit

genMsgErrorText                   The color to use for general message error
                                  text when exiting SlyEdit

listBoxItemText                   The color to use for text appearing in list
                                  boxes (such as the list of text replacements
                                  and the list of tag lines)

listBoxItemHighlight              The color to use for the currently selected
                                  item in list boxes (such as the list of text
                                  replacements and the list of tag lines)

9. Text replacements (AKA Macros)
==================================
SlyEdit version 1.29 added text replacements (AKA Macros), which lets you (the
sysop) define words to be replaced with other text as the user types a message.
This feature can be used, for instance, to replace commonly misspelled words
with their correct versions or to replace swear words with less offensive
words.  This feature is toggled by the enableTextReplacements option in
SlyEdit.cfg can can have one of three values:
false : Text replacement is disabled
true  : Text replacement is enabled and performed as literal search and replace
regex : Text replacement is enabled using regular expressions as implemented by
        JavaScript (more accurately, Synchronet's JavaScript interpreter, which
        at the time of this writing is Mozilla's JavaScript engine (AKA
        JavaScript-C or "SpiderMonkey").

The text searches are performed on single words only, as the user types the
message, and are replaced by whatever text you configure for the word.  The
configuration for text replacing is read from a configuration file called
SlyEdit_TextReplacements.cfg, which is plain text and can be placed in either
sbbs/ctrl or in the same directory as SlyEdit's .js files (SlyEdit.js,
SlyEdit_Misc.js, etc.).  Each line in SlyEdit_TextReplacements.cfg needs to
have the following format:
originalWord=replacementText
where originalWord is the word to be replaced, and replacementText is the text
to replace the word with.

The options for the enableTextReplacements configuration optoin are explained
in more detail below:

- false: Text replacing is disabled

- true: Literal text search and replace - The words will be matched literally
and replaced with the text on the right side of the = in
SlyEdit_TextReplacements.cfg.  In this mode, word matching is not
case-sensitive.  The words can have both uppercase and lowercase letters and
will still be matched to the words configured in SlyEdit_TextReplacements.cfg.
In this mode, if the first letter of the original word is uppercase, then the
first letter of the replaced text will also be uppercase.
While this works, one drawback to literal text searching is that it won't
replace a word if there are punctuation characters or other characters around
the word or if the word is misspelled.

- regex: With this option, SlyEdit will treat the word searches (on the left
side of the = in SlyEdit_TextReplacements.cfg) as regular expressions, as
implemented by JavaScript.  When using regular expressions, SlyEdit will start
trying all the regular expressions provided and apply only the first one that
changes the text and will stop there.
Regular expressions offer a more flexible way to serach and replace text.  For
example, in case a word is surrounded by punctuation or other characters, a
regular expression can be given that will still match the word.  For example,
you might want a regular expression that changes "teh" to "the" (since "teh"
is a common misspelling of "the").  To ensure that the word is replaced even if
the word has other characters around it, you could use a regular exprssion and
replacement such as this:
(.*)teh(.*)=$1the$2
That way, even if the word is enclosed in quotes (such as "teh"), the word will
still be converted to "the".  And to preserve the first letter's case (if it's
uppercase or lowercase), this regular expression and replacement string would
handle that:
(.*)([tT])eh(.*)=$1$2he$3
SlyEdit applies the regular expressions on a per-word basis; that is, the
expression .* in a regular expression will match any characters only in the
last word the user typed, not the entire line.

For more information on regular expressions, the
following are some web pages that explain them:

General information about regular expressions:
http://www.regular-expressions.info/tutorial.html

Information on text grouping and backreferencing with parenthesis (the page
calls them "round brackets") - A very powerful feature of regular expressions:
http://www.regular-expressions.info/brackets.html

General information about regular expressions geared toward JavaScript:
http://www.javascriptkit.com/javatutors/re.shtml

Information about using backreferences with regular expressions in JavaScript:
http://stackoverflow.com/questions/2447915/javascript-string-regex-backreferences

JavaScript-specific information on regular exprssions:
http://www.w3schools.com/js/js_obj_regexp.asp
http://www.w3schools.com/jsref/jsref_obj_regexp.asp

One nice thing about JavaScript's implementation (among others) of regular
expressions is that it supports the use of parentheses for character grouping
and backreferencing to place a portion of the matched text in the replacement
text.  In JavaScript, each numbered capture buffer is preceded by a dollar sign
($).  For example, the regular expression (darn) will match the word "darn" and
store it in buffer 1, and in JavaScript (and with SlyEdit's search and
replace), you would use $1 to refer to the word "darn".  For example, for
(darn), the replacement $1it would replace the word "darn" with "darnit".

10. User settings
=================
Since version 1.32, SlyEdit has the ability for each user to configure some
settings for themselves.  The user settings include the following:
- Whether or not to enable the option to use taglines
- Whether or not to prompt for spell checking when saving a message
- Whether or not to add the original author's initials to quote lines
  (this was previously only configurable in SlyEdit.cfg)
- Whether or not to indent quote lines that use author's intials (this was
  previously only configurable in SlyEdit.cfg)
- Whether or not to trim spaces from quoted lines (when replying to messages).
  Some users indent their paragraphs with spaces as a writing style.  When
  this setting is enabled, this feature removes leading spaces from quoted
  lines when replying to a message.  A user might want to disable this, for
  example, when they want to ensure that a message is quoted exactly as-is.
- Whether or not to auto-sign messages.  When this setting is enabled, the
  user's messages are automatically signed with their alias or their real
  name, depending on the sub-board's settings.  There is additionally a setting
  to specify whehter to use only their first name when signing with their
  real name, and also whether to sign emails with their real name (emails
  don't have a configuration like sub-boards do).
- Dictionaries for spell-check.  If there is only one dictionary configured,
  this option won't appear on the user options list.  If there are multiple
  dictionary files on the BBS machine (in either sbbs/mods, sbbs/ctrl, or in
  the same directory as SlyEdit), the user will be able to choose any or all
  dictionaries to be used for the spell check feature.  Multiple dictionaries
  can be selected, so if the user writes messages in more than one language,
  or if a message could contain multiple languages, the spell-check feature
  will use all selected dictionaries for spell checking.

The user settings files will be stored in the sbbs/data/user directory with the
filename <user number>.SlyEdit_Settings, and the user number will be 0-padded
up to 4 digits.

11. Taglines
============
SlyEdit version 1.32 added the ability for users to optionally choose a tagline
to be appended to their message upon saving the message.  Each user can
configure in their user settings whether or not they want to enable this
feature.  The setting enableTaglines in SlyEdit.cfg sets the default setting,
but users are free to change it for themselves.

The taglines are loaded from the text file SlyEdit_Taglines.txt, which can be
located in any of the following directories, searched in the following order:
- sbbs/mods
- sbbs/ctrl
- The same directory as SlyEdit's .js files

Synchronet version 3.16 has the ability to place the tag line after the user's
signature, so if you are running version 3.16 or newer of Synchronet, the tag
line will be placed after the user's signature, if the user has a signature.

Specifically, Synchronet 3.16 starting with the beta build on July 5, 2015 will
behave that way; with earlier versions of Synchronet, the tag line will be
placed before the user's signature.  On June 22, 2015, Synchronet added support
for a file called editor.tag (in each node directory's temp directory) which
can contain an editor tagline, and on July 5, 2015, Synchronet included an
update in which the full path & filename to the tagline file will be written
to line 7 of the MSGINF drop file, which SlyEdit reads on startup.  If the
MSGINF file includes the 7th line, then the tagline will appear after the
user's signature (if they have one).  If the MSGINF file does not include the
7th line, then the tagline will appear before the user's signature.


12. Spell check and dictionaries
================================
Since version 1.64, SlyEdit has a spell check feature.  Spell check can be
started by the user with the Ctrl-R hotkey, or by the Edit > Spell Checker
option in the DCT-style ESC menu (only available when in DCT mode).  For spell
check, SlyEdit will check each word to see if it exists in the configured
dictionary/dictionaries, and if not, it will prompt the user for a corrected
version of the word.  The sysop can configure one or multiple dictionaries in
SlyEdit.cfg with the dictionaryFilenames option.  Dictionary files need to be
in the format dictionary_<languageName>.txt, where <languageName> is the name
of the language.  Also, ideally, the language names should follow standard
language tags, as in "en-us" for English (US), etc.  See these web pages for
more information:
https://en.wikipedia.org/wiki/Language_localisation
http://www.lingoes.net/en/translator/langcode.htm
Also, the dictionary filenames will be parsed and the language name will be
used in the menu of dictionaries in the user options - The user is able to
enable/disable the configured dictionaries for their own use for the spell
checker.

For the dictionaryFilenames option in SlyEdit.cfg, you can specify a comma-
separated list of dictionary filenames.  The dictionary filenames are in the
format dictionary_<languageName>.txt, where <language> is the language name.
In this list, the filenames can be in that format, or just <languageName>.txt,
or just <languageName>.  You can leave the setting blank to use all dictionary
files that exist on the system.

SlyEdit will search for the dictionary files in the following directories, in
this order:
1. sbbs/mods
2. sbbs/ctrl
3. SlyEdit's own directory

Dictionary files must be sorted in order for word matching to work properly
(SlyEdit uses a binary search for quick word matching, which requires the words
to be sorted).  Also, all of the words in the dictionary files must be lower-
case, since SlyEdit does case-insensitive matching by converting words in the
message to lower-case and comparing them with the words in the dictionary.


13. Version history
===================
Version  Date         Description
-------  ----         -----------
1.89b    2024-05-11   In SlyEdit_Misc.js, check to see that
                      xtrn_area.editor[user.editor] is an object before using it.
1.89a    2024-05-04   Don't line-wrap poll messages for quoting, as that could
                      mess up the formatting of the poll options.  Also, a minor
                      fix for the 'to' name length in DCT mode when using a wide
                      terminal.
1.89     2024-04-30   Quote wrapping length: When re-wrapping quote lines, read
                      the editor configuration settings for "word-wrap quoted
                      text" as specified in xtrn.ini (settable in scfg) - Wrap
                      quote lines to the width specified there, or if not
                      specified, default to 79 columns. This is to help ensure
                      quoted text is a reasonable width for many terminals. The
                      wrapping logic is also called for prepending quoted text
                      with the quote prefix, so (for now) there needs to be a
                      default quote wrap width.
1.88d    2024-02-16   Header display update for UTF-8. And printing from/to/subj
                      after writing the header with empty data so that the
                      header 'graphic' characters & everything lines up
                      properly.
1.88c    2024-02-12   UTF-8 support in the displayed header and when quoting
                      text and when quoting message text
1.88b    2024-02-11   Previous change reverted; now has "real" UTF-8 support.
                      New feature: Entering a graphic char with Ctrl-G (Ctrl-G
                      was previously the key for general help, which wasn't much)
1.88     2024-02-07   Support for entering UTF-8/Unicode characters; internally
                      uses K_CP437 to convert to CP437, so the strings are still
                      in CP437 internally in Synchronet
1.87a    2023-12-17   Using the msg_area.sub object to check sub-board settings
                      instead of opening the sub-board (for determining whether
                      to post with real name)
1.87     2023-08-15   Improvement to paragraph/line breaks in quote line wrapping
1.86     2023-07-26   Started refactoring the re-wrapping of quote lines to work
                      better for the various quote prefixes used in various
                      messages.
1.85     2023-05-15   Internal: Refactored readColorConfig() in _DCTStuff.js
                      and _IceStuff.js.
                      Removed the readValueSettingConfigFile() function.
1.84     2023-02-10   Sysops: When importing a file from the BBS machine,
                      SlyEdit now prompts to send it immediately or not (if not,
                      edit it before sending).  Sending immediately can be
                      useful for posting ANSI files unmodified.
1.83     2022-12-13   Quote lines that are wider than the user's terminal width
                      are now wrapped to the user's terminal width to ensure
					  all the quote lines are entirely available to be quoted.
1.82     2022-12-01   Bug fix: Added some safety checks when reading the
                      configuration file
1.81     2022-11-26   Refactored the way the configuration file is read. Also,
                      the color configuration files now can just specify
					  attribute characters, without the control character.
1.80     2022-07-04   Added the ability to change/set the text color (using the
                      CTRL-K hotkey).  If desired, changing the text color can
                      be disabled if, and the colors can be saved as ANSI
                      (rather than Synchronet attribute codes) for compatibility
                      with other BBS software & message readers. The
                      allowColorSelection option in SlyEdit.cfg specifies
                      whether or not to allow changing text colors, and the
                      saveColorsAsANSI option specifies whether or not to save
                      the message colors as ANSI.
1.79     2022-06-21   JS strict mode enabled. Small JS issues fixed.
1.78     2022-06-09   Removed high-ascii characters from the SlyEdit JS files;
                      used ascii() with their numeric ASCII values instead. This
					  should avoid issues with text editors converting
					  characters incorrectly.
1.77     2022-05-27   Fixed a few instances where SlyEdit was trying to access
                      sub-board information with an empty sub-board code (in the
					  rare case when no sub-boards are configured).
1.76     2022-03-05   When selecting quote lines in a reply message, SlyEdit now
                      remembers the position in the quote selection menu so that
					  the quote menu isn't always at the top whenever it's
					  opened again.  This issue may have been introduced when
					  SlyEdit was refactored to use DDLightbarMenu for its
					  lightbar stuff.
1.75     2021-12-11   Refactored the cross-post menu and quote selection window
                      to use DDLightbarMenu instead of SlyEdit's own lightbar
					  code.
1.74     2021-01-23   Making use of the new K_NUL and checking user input
                      against null, SlyEdit no longer thinks a 0x0 (sent with
					  CTRL-Space on a Mac) is a timeout.  K_NUL was added on
					  Jan. 21, 2021 by Rob Swindell. (This update was from Deon
					  George)
1.73     2020-03-31   Now uses DDLightbarMenu instead of SlyEdit's own internal
                      choice menu.
1.72     2020-03-04   For cross-posting, to make sure the user can post in a
                      sub-board, SlyEdit now checks the can_post property of the
					  sub-board rather than checking the ARS.  The can_post
					  property covers more cases.
1.71     2020-03-03   Added a new configuration option, allowSpellCheck, which
                      the sysop can use to configure whether or not spell check
					  is allowed.  You might want to disable spell check if the
					  spell check feature causes SlyEdit to abort with an error
					  saying it's out of memory.
1.70     2019-08-15   Fix for a bug introduced in the flowing-line update in
                      1.68 where some quote blocks were sometimes not being
					  included when saving a message.  Also, quote lines are now
					  wrapped to the user's terminal width rather than 80
					  columns.
1.69     2019-08-14   Updated to only use console.inkey() for user input and not
                      use console.getkey() anymore. The change was made in the
					  getUserKey() function in SlyEdit_Misc.js. Also, SlyEdit
					  will now write the editor style (ICE or DCT) to result.ed
					  at the end when a message is saved.  Also, when editing a
					  message, if the cursor is at the end of the last line and
					  the user presses the DEL key, then treat it as a
					  backspace. Some terminals send a delete for backspace,
					  particularly with keyboards that have a delete key but no
					  backspace key.
1.68     2019-08-09   Updated to honor the SUB_ANON and SUB_AONLY flags for the
                      sub-boards when cross-posting so that the "from" name is
					  "Anonymous" if either of those flags enabled.
                      Updated to allow message uploading. Started working on
					  updates to save new text lines as one long line, to help
					  with word wrapping in offline readers etc.
1.67     2019-07-21   Now supports the RESULT.ED drop file, with the ability to
                      change the subject. Synchronet 3.17c development builds
					  from July 21, 2019 onward support result.ed even for
					  editors configured for QuickBBS MSGINF/MSGTMP.
1.66     2019-05-29   Added more parsing for dictionary filenames for 'general'
                      dictionaries and 'supplimental' ones
1.65     2019-05-24   Added support for parsing many standard language tags for
                      the dictionary filenames
1.64     2019-05-24   Started working on adding a spell check feature. Also,
                      updated to use require() instead of load() for .js
					  scripts when possible.
1.63     2019-04-18   Started working on supporting word-wrapping for the entire
                      width of any terminal size, beyond 79.
1.62     2018-11-11   Updated to save the message if the user disconnects, to
                      support Synchronet's message draft feature that was added
					  recently.
1.61     2018-08-03   Updated to delete instances of User objects that are
                      created, due to an optimization in Synchronet 3.17 that
					  leaves user.dat open
1.54     2017-12-26   Improved quoting with author initials when a > character
                      exists in the quote lines: Not mistaking the preceding
					  text as a quote prefix if it has 3 or more non-space
					  characters before the >.  Also fixed an issue where
					  wrapped quote lines were sometimes missing the quote line
					  prefix.
1.53     2017-12-19   Updated the PageUp and PageDown keys to ensure they match
                      what's in sbbsdefs.js, since Synchronet added key codes
					  for those keys on December 17, 2018.  SlyEdit should still
					  work with older and newer builds of Synchronet, with or
					  without the updated sbbsdefs.js.
1.52     2017-12-17   Added the ability for the sysop to toggle whether or not
                      to allow users to edit quote lines, using the
					  configuration option allowEditQuoteLines.
.. Removed some history comments ..
1.00     2009-08-22   Initial public release
         2009-05-11   Started development
