code: function parseElementTagName(stream, state) {
          // get the name of the tag
          var startPos = stream.pos;
          if(stream.match(/^[a-zA-Z_:][-a-zA-Z0-9_:.]*/)) {
              // element start-tag
              var tagName = stream.string.substring(startPos, stream.pos);
              pushContext(state, tagName);
              state.tokenize = parseElement;
              return STYLE_ELEMENT_NAME;
          } else if(stream.match(/^\/[a-zA-Z_:][-a-zA-Z0-9_:.]*( )*>/)) {
              // element end-tag
              var endTagName = stream.string.substring(startPos + 1, stream.pos - 1).trim();
              var oldContext = popContext(state);
              state.tokenize = state.context == null ? parseDocument : parseElementBlock;
              if(oldContext == null || endTagName != oldContext.tagName) {
                  // the start and end tag names should match - error
                  return STYLE_ERROR;
              }
              return STYLE_ELEMENT_NAME;
          } else {
              // no tag name - error
              state.tokenize = state.context == null ? parseDocument : parseElementBlock;
              stream.eatWhile(/[^>]/);
              stream.eat(">");
              return STYLE_ERROR;
          }
          
          stream.skipToEnd();
          return null;
      }
docs: ///////////////////////////////////////////////////////////////////////// context: XML element start-tag or end-tag  - element start-tag can contain attributes - element start-tag may self-close (or start an element block if it doesn't) - element end-tag can contain only the tag name