docs: function (html) {
          var self = this;
          var blockList = MARK.matchBlocks(html);
          self.logger.trace('rendering', blockList);
          _.each(blockList, function (blockName) {
              var defineTag = MARK.define(blockName);
              var startTag = MARK.start(blockName);
              var endTag = MARK.end(blockName);
  
              var outerStartPos = html.indexOf(startTag);
              var startPos = outerStartPos + startTag.length;
              var endPos = html.indexOf(endTag);
              var outerEndPos = endPos + endTag.length;
  
              var innerHtml = html.substring(startPos, endPos);
  
              self.logger.trace(startPos, endPos);
              if (startPos >= startTag.length && endPos > startTag.length) {
                  // remove outer content
                  html = html.substring(0, outerStartPos) + html.substr(outerEndPos);
                  // replace tag with innerHtml
                  html = html.replace(defineTag, innerHtml);
  
                  // 正则表达式效率过低，页面太长时导致堆栈溢出
                  // html = html.replace(defineTag, html.substring(startPos, endPos))
                  //    .replace(new RegExp(startTag + '(.|\n)*' + endTag, 'g'), '');
                  // self.logger.trace('\n' + html);
              } else {
                  html = html.replace(defineTag, '');
              }
          });
          return html;
      }