docs: public String stripID ()
    {
      if (m_bIsEmpty || m_sValue.charAt (m_sValue.length () - m_nTrailing - 1) != '}')
        return null;
      int nPos = m_nLeading;
      boolean bFound = false;
      while (nPos < m_sValue.length () && !bFound)
      {
        switch (m_sValue.charAt (nPos))
        {
          case '\\':
            if (nPos + 1 < m_sValue.length ())
            {
              if (m_sValue.charAt (nPos + 1) == '{')
                nPos++;
            }
            nPos++;
            break;
          case '{':
            bFound = true;
            break;
          default:
            nPos++;
            break;
        }
      }
  
      if (bFound)
      {
        if (nPos + 1 < m_sValue.length () && m_sValue.charAt (nPos + 1) == '#')
        {
          final int nStart = nPos + 2;
          nPos = nStart;
          bFound = false;
          while (nPos < m_sValue.length () && !bFound)
          {
            switch (m_sValue.charAt (nPos))
            {
              case '\\':
                if (nPos + 1 < m_sValue.length ())
                {
                  if (m_sValue.charAt (nPos + 1) == '}')
                    nPos++;
                }
                nPos++;
                break;
              case '}':
                bFound = true;
                break;
              default:
                nPos++;
                break;
            }
          }
          if (bFound)
          {
            final String sID = m_sValue.substring (nStart, nPos).trim ();
            if (m_nLeading != 0)
            {
              m_sValue = m_sValue.substring (0, m_nLeading) + m_sValue.substring (m_nLeading, nStart - 2).trim ();
            }
            else
            {
              m_sValue = m_sValue.substring (m_nLeading, nStart - 2).trim ();
            }
            m_nTrailing = 0;
            return sID.length () > 0 ? sID : null;
          }
        }
      }
      return null;
    }