# File lib/html5/filters/optionaltags.rb, line 90
      def is_optional_end(tagname, nexttok)
        type = nexttok ? nexttok[:type] : nil
        if %w[html head body].include?(tagname)
          # An html element's end tag may be omitted if the html element
          # is not immediately followed by a space character or a comment.
          return ![:Comment, :SpaceCharacters].include?(type)
        elsif %w[li optgroup option tr].include?(tagname)
          # A li element's end tag may be omitted if the li element is
          # immediately followed by another li element or if there is
          # no more content in the parent element.
          # An optgroup element's end tag may be omitted if the optgroup
          # element is immediately followed by another optgroup element,
          # or if there is no more content in the parent element.
          # An option element's end tag may be omitted if the option
          # element is immediately followed by another option element,
          # or if there is no more content in the parent element.
          # A tr element's end tag may be omitted if the tr element is
          # immediately followed by another tr element, or if there is
          # no more content in the parent element.
          if type == :StartTag
            return nexttok[:name] == tagname
          else
            return type == :EndTag || type == nil
          end
        elsif %w(dt dd).include?(tagname)
          # A dt element's end tag may be omitted if the dt element is
          # immediately followed by another dt element or a dd element.
          # A dd element's end tag may be omitted if the dd element is
          # immediately followed by another dd element or a dt element,
          # or if there is no more content in the parent element.
          if type == :StartTag
            return %w(dt dd).include?(nexttok[:name])
          elsif tagname == 'dd'
            return type == :EndTag || type == nil
          else
            return false
          end
        elsif tagname == 'p'
          # A p element's end tag may be omitted if the p element is
          # immediately followed by an address, blockquote, dl, fieldset,
          # form, h1, h2, h3, h4, h5, h6, hr, menu, ol, p, pre, table,
          # or ul  element, or if there is no more content in the parent
          # element.
          if type == :StartTag
            return %w(address blockquote dl fieldset form h1 h2 h3 h4 h5
                      h6 hr menu ol p pre table ul).include?(nexttok[:name])
          else
            return type == :EndTag || type == nil
          end
        elsif tagname == 'colgroup'
          # A colgroup element's end tag may be omitted if the colgroup
          # element is not immediately followed by a space character or
          # a comment.
          if [:Comment, :SpaceCharacters].include?(type)
            return false
          elsif type == :StartTag
            # XXX: we also look for an immediately following colgroup
            # element. See is_optional_start.
            return nexttok[:name] != 'colgroup'
          else
            return true
          end
        elsif %w(thead tbody).include? tagname
          # A thead element's end tag may be omitted if the thead element
          # is immediately followed by a tbody or tfoot element.
          # A tbody element's end tag may be omitted if the tbody element
          # is immediately followed by a tbody or tfoot element, or if
          # there is no more content in the parent element.
          # A tfoot element's end tag may be omitted if the tfoot element
          # is immediately followed by a tbody element, or if there is no
          # more content in the parent element.
          # XXX: we never omit the end tag when the following element is
          # a tbody. See is_optional_start.
          if type == :StartTag
            return %w(tbody tfoot).include?(nexttok[:name])
          elsif tagname == 'tbody'
            return (type == :EndTag or type == nil)
          else
            return false
          end
        elsif tagname == 'tfoot'
          # A tfoot element's end tag may be omitted if the tfoot element
          # is immediately followed by a tbody element, or if there is no
          # more content in the parent element.
          # XXX: we never omit the end tag when the following element is
          # a tbody. See is_optional_start.
          if type == :StartTag
            return nexttok[:name] == 'tbody'
          else
            return type == :EndTag || type == nil
          end
        elsif %w(td th).include? tagname
          # A td element's end tag may be omitted if the td element is
          # immediately followed by a td or th element, or if there is
          # no more content in the parent element.
          # A th element's end tag may be omitted if the th element is
          # immediately followed by a td or th element, or if there is
          # no more content in the parent element.
          if type == :StartTag
            return %w(td th).include?(nexttok[:name])
          else
            return type == :EndTag || type == nil
          end
        end
        return false
      end