module Phlex::SGML::Elements

def __register_void_element__(method_name, tag: method_name.name.tr("_", "-"))

def __register_void_element__(method_name, tag: method_name.name.tr("_", "-"))
	class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
		# frozen_string_literal: true
		def #{method_name}(**attributes)
			state = @_state
			return unless state.should_render?
			buffer = state.buffer
			if attributes.length > 0 # with attributes
				buffer << "<#{tag}"
				begin
					#{COMMA_SEPARATED_TOKENS[method_name]}
					buffer << (::Phlex::ATTRIBUTE_CACHE[attributes] ||= __attributes__(attributes))
				ensure
					buffer << ">"
				end
			else # without attributes
				buffer << "<#{tag}>"
			end
			nil
		end
	RUBY
	__registered_elements__[method_name] = tag
	method_name
end

def __registered_elements__

def __registered_elements__
	@__registered_elements__ ||= {}
end

def register_element(method_name, tag: method_name.name.tr("_", "-"))

def register_element(method_name, tag: method_name.name.tr("_", "-"))
	class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
		# frozen_string_literal: true
		def #{method_name}(**attributes)
			state = @_state
			buffer = state.buffer
			block_given = block_given?
			unless state.should_render?
				yield(self) if block_given
				return nil
			end
			if attributes.length > 0 # with attributes
				if block_given # with content block
					buffer << "<#{tag}"
					begin
						#{COMMA_SEPARATED_TOKENS[method_name]}
						buffer << (Phlex::ATTRIBUTE_CACHE[attributes] ||= __attributes__(attributes))
					ensure
						buffer << ">"
					end
					begin
						original_length = buffer.bytesize
						content = yield(self)
						if original_length == buffer.bytesize
							case content
							when ::Phlex::SGML::SafeObject
								buffer << content.to_s
							when String
								buffer << ::Phlex::Escape.html_escape(content)
							when Symbol
								buffer << ::Phlex::Escape.html_escape(content.name)
							when nil
								nil
							else
								if (formatted_object = format_object(content))
									buffer << ::Phlex::Escape.html_escape(formatted_object)
								end
							end
						end
					ensure
						buffer << "</#{tag}>"
					end
				else # without content
					buffer << "<#{tag}"
					begin
						#{COMMA_SEPARATED_TOKENS[method_name]}
						buffer << (::Phlex::ATTRIBUTE_CACHE[attributes] ||= __attributes__(attributes))
					ensure
						buffer << "></#{tag}>"
					end
				end
			else # without attributes
				if block_given # with content block
					buffer << "<#{tag}>"
					begin
						original_length = buffer.bytesize
						content = yield(self)
						if original_length == buffer.bytesize
							case content
							when ::Phlex::SGML::SafeObject
								buffer << content.to_s
							when String
								buffer << ::Phlex::Escape.html_escape(content)
							when Symbol
								buffer << ::Phlex::Escape.html_escape(content.name)
							when nil
								nil
							else
								if (formatted_object = format_object(content))
									buffer << ::Phlex::Escape.html_escape(formatted_object)
								end
							end
						end
					ensure
						buffer << "</#{tag}>"
					end
				else # without content
					buffer << "<#{tag}></#{tag}>"
				end
			end
			#{'flush' if tag == 'head'}
			nil
		end
	RUBY
	__registered_elements__[method_name] = tag
	method_name
end