private static void OpenHeader(StringBuilder details, StringBuilder terse, int tabLevel, StatusRatingRange range = (StatusRatingRange)(-1), string?color = null)
 {
     if (terse != null)
     {
         terse.Append(new string(' ', tabLevel - 1));
         if (range != (StatusRatingRange)(-1))
         {
             string symbolPrefix = StatusRating.GetRangeSymbol(range) + " ";
             terse.Append(symbolPrefix);
         }
     }
     details.Append('<');
     details.Append(RenderLevelString(tabLevel));
     if (!string.IsNullOrEmpty(color))
     {
         details.Append(" style=\"color:" + color + "\"");
     }
     details.Append('>');
 }
        /// <summary>
        /// Enters a status range section for the range indicated by the rating.
        /// Should be matched by a subsequent call to <see cref="LeaveStatusRange"/>.
        /// </summary>
        /// <param name="rating">The status rating.</param>
        public void EnterStatusRange(float rating)
        {
            StatusRatingRange range      = StatusRating.FindRange(rating);
            string            rangeName  = StatusRating.GetRangeName(range);
            string            rangeColor = StatusRating.GetRangeForegroundColor(range);

            if (_tabLevel > 1)
            {
                throw new InvalidOperationException("All targets and status ranges must be closed before entering a new status range!");
            }

            _details.Append("<div class=\"");
#pragma warning disable CA1308 // this is to convert the range name from the C# style casing (Pascal) to the HTML style casing (kebab)
            _details.Append(rangeName.ToLowerInvariant());
#pragma warning restore CA1308
            _details.Append("-range\">");

            OpenHeader(_details, _terse, _tabLevel, range, rangeColor);
            _currentSectionRatingRange = range;

            _terse.Append(rangeName.ToUpperInvariant());
            _details.Append(StatusRating.GetRangeSymbol(range));
            _details.Append(' ');
            _details.Append(rangeName);

            if (_notificationTime != null)
            {
                _terse.Append(" @");
                _terse.Append(_notificationTime.Value.ToShortTimeString());
                _details.Append(" at ");
                _details.Append(_notificationTime.Value.ToLongTimeString());
                _notificationTime = null;
            }

            CloseHeader(_details, _terse, _tabLevel);

            EnterTabLevel();
        }