docs: @Nonnull
    public ELineType getLineType (final boolean bExtendedMode)
    {
      if (m_bIsEmpty)
        return ELineType.EMPTY;
  
      if (m_nLeading > 3)
        return ELineType.CODE;
  
      if (m_sValue.charAt (m_nLeading) == '#')
        return ELineType.HEADLINE;
  
      if (m_sValue.charAt (m_nLeading) == '>')
        return ELineType.BQUOTE;
  
      if (bExtendedMode)
      {
        if (m_sValue.length () - m_nLeading - m_nTrailing > 2 &&
            (m_sValue.charAt (m_nLeading) == '`' ||
             m_sValue.charAt (m_nLeading) == '~' ||
             m_sValue.charAt (m_nLeading) == '%'))
        {
          if (_countCharsStart ('`') >= 3)
            return ELineType.FENCED_CODE;
  
          if (_countCharsStart ('~') >= 3)
            return ELineType.FENCED_CODE;
  
          if (_countCharsStart ('%') >= 3)
            return ELineType.PLUGIN;
        }
      }
  
      if (m_sValue.length () - m_nLeading - m_nTrailing > 2 &&
          (m_sValue.charAt (m_nLeading) == '*' ||
           m_sValue.charAt (m_nLeading) == '-' ||
           m_sValue.charAt (m_nLeading) == '_'))
      {
        if (_countConsecutiveChars (m_sValue.charAt (m_nLeading)) >= 3)
          return ELineType.HR;
      }
  
      if (m_sValue.length () - m_nLeading >= 2 && m_sValue.charAt (m_nLeading + 1) == ' ')
      {
        switch (m_sValue.charAt (m_nLeading))
        {
          case '*':
          case '-':
          case '+':
            return ELineType.ULIST;
        }
      }
  
      if (m_sValue.length () - m_nLeading >= 3 && Character.isDigit (m_sValue.charAt (m_nLeading)))
      {
        int i = m_nLeading + 1;
        while (i < m_sValue.length () && Character.isDigit (m_sValue.charAt (i)))
          i++;
        if (i + 1 < m_sValue.length () && m_sValue.charAt (i) == '.' && m_sValue.charAt (i + 1) == ' ')
          return ELineType.OLIST;
      }
  
      if (m_sValue.charAt (m_nLeading) == '<')
      {
        final EHTMLElementType eType = _checkHTML ();
        if (eType == EHTMLElementType.TAG)
          return ELineType.XML;
        if (eType == EHTMLElementType.COMMENT)
          return ELineType.XML_COMMENT;
      }
  
      if (m_aNext != null && !m_aNext.m_bIsEmpty)
      {
        if (m_aNext.m_sValue.charAt (0) == '-' && m_aNext._countConsecutiveChars ('-') > 0)
          return ELineType.HEADLINE2;
        if (m_aNext.m_sValue.charAt (0) == '=' && m_aNext._countConsecutiveChars ('=') > 0)
          return ELineType.HEADLINE1;
      }
  
      return ELineType.OTHER;
    }