docs: @Nonnull
    private Block _readLines (@Nonnull final Reader aReader) throws IOException
    {
      final Block aBlock = new Block ();
      final StringBuilder aSB = new StringBuilder (80);
      int c = aReader.read ();
      LinkRef aLastLinkRef = null;
      while (c != -1)
      {
        aSB.setLength (0);
        int nPos = 0;
        boolean bEOL = false;
        while (!bEOL)
        {
          switch (c)
          {
            case -1:
              bEOL = true;
              break;
            case '\n':
              c = aReader.read ();
              if (c == '\r')
                c = aReader.read ();
              bEOL = true;
              break;
            case '\r':
              c = aReader.read ();
              if (c == '\n')
                c = aReader.read ();
              bEOL = true;
              break;
            case '\t':
            {
              final int nTabPos = nPos + (4 - (nPos & 3));
              while (nPos < nTabPos)
              {
                aSB.append (' ');
                nPos++;
              }
              c = aReader.read ();
              break;
            }
            default:
              nPos++;
              aSB.append ((char) c);
              c = aReader.read ();
              break;
          }
        }
  
        final Line aLine = new Line ();
        aLine.m_sValue = aSB.toString ();
        aLine.init ();
  
        // Check for link definitions
        boolean bIsLinkRef = false;
        String sID = null;
        String sLink = null;
        String sComment = null;
        if (!aLine.m_bIsEmpty && aLine.m_nLeading < 4 && aLine.m_sValue.charAt (aLine.m_nLeading) == '[')
        {
          aLine.m_nPos = aLine.m_nLeading + 1;
          // Read ID up to ']'
          sID = aLine.readUntil (']');
          // Is ID valid and are there any more characters?
          if (sID != null && aLine.m_nPos + 2 < aLine.m_sValue.length ())
          {
            // Check for ':' ([...]:...)
            if (aLine.m_sValue.charAt (aLine.m_nPos + 1) == ':')
            {
              aLine.m_nPos += 2;
              aLine.skipSpaces ();
              // Check for link syntax
              if (aLine.m_sValue.charAt (aLine.m_nPos) == '<')
              {
                aLine.m_nPos++;
                sLink = aLine.readUntil ('>');
                aLine.m_nPos++;
              }
              else
                sLink = aLine.readUntil (' ', '\n');
  
              // Is link valid?
              if (sLink != null)
              {
                // Any non-whitespace characters following?
                if (aLine.skipSpaces ())
                {
                  final char ch = aLine.m_sValue.charAt (aLine.m_nPos);
                  // Read comment
                  if (ch == '\"' || ch == '\'' || ch == '(')
                  {
                    aLine.m_nPos++;
                    sComment = aLine.readUntil (ch == '(' ? ')' : ch);
                    // Valid linkRef only if comment is valid
                    if (sComment != null)
                      bIsLinkRef = true;
                  }
                }
                else
                  bIsLinkRef = true;
              }
            }
          }
        }
  
        // To make compiler happy: add != null checks
        if (bIsLinkRef && sID != null && sLink != null)
        {
          if (sID.equalsIgnoreCase ("$profile$"))
          {
            m_bUseExtensions = sLink.equalsIgnoreCase ("extended");
            m_aEmitter.setUseExtensions (m_bUseExtensions);
            aLastLinkRef = null;
          }
          else
          {
            // Store linkRef and skip line
            final LinkRef aLinkRef = new LinkRef (sLink,
                                                  sComment,
                                                  sComment != null && (sLink.length () == 1 && sLink.charAt (0) == '*'));
            m_aEmitter.addLinkRef (sID, aLinkRef);
            if (sComment == null)
              aLastLinkRef = aLinkRef;
          }
        }
        else
        {
          sComment = null;
          // Check for multi-line linkRef
          if (!aLine.m_bIsEmpty && aLastLinkRef != null)
          {
            aLine.m_nPos = aLine.m_nLeading;
            final char ch = aLine.m_sValue.charAt (aLine.m_nPos);
            if (ch == '\"' || ch == '\'' || ch == '(')
            {
              aLine.m_nPos++;
              sComment = aLine.readUntil (ch == '(' ? ')' : ch);
            }
            if (sComment != null)
              aLastLinkRef.setTitle (sComment);
  
            aLastLinkRef = null;
          }
  
          // No multi-line linkRef, store line
          if (sComment == null)
          {
            aLine.m_nPos = 0;
            aBlock.appendLine (aLine);
          }
        }
      }
  
      return aBlock;
    }