/** Parse a Mediawiki heading of the form "==heading==" and return the resulting HTML output. */
 public String parse(JFlexLexer lexer, String raw, Object... args) throws ParserException {
   if (logger.isTraceEnabled()) {
     logger.trace("heading: " + raw + " (" + lexer.yystate() + ")");
   }
   // the wikiheading tag may match a preceding newline, so strip it
   raw = raw.trim();
   int level = this.generateTagLevel(raw, args);
   String tagText = this.generateTagText(raw, args);
   String tocText = this.buildTocText(lexer, tagText);
   String tagName = this.buildTagName(lexer, tocText);
   if (lexer.getMode() <= JFlexParser.MODE_SLICE) {
     String sectionName = StringEscapeUtils.unescapeHtml4(tocText);
     lexer.getParserOutput().setSectionName(sectionName);
     return raw;
   }
   if (!(lexer instanceof JAMWikiLexer)) {
     throw new IllegalStateException(
         "Cannot parse heading tags except with instances of JAMWikiLexer or in slice/splice mode");
   }
   JAMWikiLexer jamwikiLexer = (JAMWikiLexer) lexer;
   if (jamwikiLexer.paragraphIsOpen()) {
     // close any open paragraph
     jamwikiLexer.popTag("p");
   }
   return this.generateOutput(jamwikiLexer, tagName, tocText, tagText, level, raw, args);
 }
 private String generateOutput(
     JAMWikiLexer lexer,
     String tagName,
     String tocText,
     String tagText,
     int level,
     String raw,
     Object... args)
     throws ParserException {
   lexer
       .peekTag()
       .getTagContent()
       .append(this.updateToc(lexer.getParserInput(), tagName, tocText, level));
   int nextSection = lexer.getParserInput().getTableOfContents().size();
   String tagType = "h" + level;
   lexer.pushTag(tagType, this.generateTagOpen(raw, args));
   lexer
       .peekTag()
       .getTagContent()
       .append(this.buildSectionEditLink(lexer.getParserInput(), nextSection));
   String parsedTocText =
       this.processTocText(
           lexer.getParserInput(), lexer.getParserOutput(), tagText, lexer.getMode());
   lexer
       .peekTag()
       .getTagContent()
       .append("<span id=\"")
       .append(tagName)
       .append("\">")
       .append(parsedTocText)
       .append("</span>");
   lexer.popTag(tagType);
   return "";
 }