/**
  * Detect and parse closing tag
  *
  * Pre-offset: any
  * Post-offset: after closing tag or reverted
  *
  * @param  StringReader $input    input
  * @param  bool         $getToken get token instead of true, null instead of false and do not revert 1/0
  * @return array|bool   token/true or null/false (= not detected)
  */
 protected function parseClosingTag(StringReader $input, $getToken = false)
 {
     // are tags defined?
     if (null === $this->tags) {
         return $getToken ? null : false;
     }
     // check first character
     if ($input->char !== $this->tags[$input->args['tag_id']][2][0]) {
         return $getToken ? null : false;
     }
     // check other characters
     $offset = 0;
     $input->pushState();
     while (!$input->end) {
         if ($input->char === $this->tags[$input->args['tag_id']][2][$offset]) {
             ++$offset;
             if ($offset === $this->tags[$input->args['tag_id']][3]) {
                 // tag detected
                 if ($getToken) {
                     $input->popState();
                     $token = $this->token(self::T_TAG, $input->line, $this->tags[$input->args['tag_id']][2]);
                     $input->eat();
                     return $token;
                 } else {
                     $input->revertState();
                     return true;
                 }
             }
         } else {
             break;
         }
         $input->eat();
     }
     // no detection
     $input->revertState();
     return $getToken ? null : false;
 }