phlex 1.4.0 β 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of phlex might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile +0 -3
- data/README.md +11 -0
- data/lib/phlex/element_clobbering_guard.rb +13 -0
- data/lib/phlex/elements.rb +27 -19
- data/lib/phlex/helpers.rb +4 -0
- data/lib/phlex/html/standard_elements.rb +0 -2
- data/lib/phlex/html/void_elements.rb +0 -2
- data/lib/phlex/html.rb +8 -8
- data/lib/phlex/sgml.rb +57 -59
- data/lib/phlex/svg/standard_elements.rb +0 -2
- data/lib/phlex/svg.rb +3 -0
- data/lib/phlex/version.rb +1 -1
- metadata +17 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 4a1ec24fb4717ac1f83f1d43f87db1d9674cfdc7ab1ad2ca5479d1918a7da14d
         | 
| 4 | 
            +
              data.tar.gz: 0e3bc60aff556fcf4e2005dc059033f9bbf45f168a0f7626aaa351cf87a75df0
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 44d1682ad2d052e8394420dccfaf3ff286d293f2a86d7bc685c704e5d2f2fcbd9f50bb06a189a8e6407bc2886bdc5f9de9e62b61aa79c8c82226ff65c719c950
         | 
| 7 | 
            +
              data.tar.gz: 38d9e4e9665c67479da8dd6633613807f38b69a40c24cc1e15583c6a89f34ef1f37edadee244325389d6bd7f11442b9fa977a65a783293a34e509b713ebd8819
         | 
    
        data/Gemfile
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -10,6 +10,17 @@ Documentation can be found at [www.phlex.fun](https://www.phlex.fun). | |
| 10 10 |  | 
| 11 11 | 
             
            If you run into any trouble, please [start a discussion](https://github.com/joeldrapper/phlex/discussions/new), or [open an issue](https://github.com/joeldrapper/phlex/issues/new) if you think youβve found a bug.
         | 
| 12 12 |  | 
| 13 | 
            +
            ### Ecosystem π±
         | 
| 14 | 
            +
            - [joeldrapper/phlex-rails](https://github.com/joeldrapper/phlex-rails) β Ruby on Rails integration
         | 
| 15 | 
            +
            - [joeldrapper/phlex.fun](https://github.com/joeldrapper/phlex.fun) β Docs Website
         | 
| 16 | 
            +
            - [joeldrapper/phlex-markdown](https://github.com/joeldrapper/phlex-markdown) β Markdown to HTML using Phlex
         | 
| 17 | 
            +
            - [joeldrapper/phlex-compiler](https://github.com/joeldrapper/phlex-compiler) β A compiler for Phlex
         | 
| 18 | 
            +
            - [joeldrapper/phlex-translation](https://github.com/joeldrapper/phlex-translation) β I18n Support for Phlex 
         | 
| 19 | 
            +
            - [joeldrapper/phlex-testing-nokogiri](https://github.com/joeldrapper/phlex-testing-nokogiri) β Nokogiri support
         | 
| 20 | 
            +
            - [joeldrapper/phlex-testing-capybara](https://github.com/joeldrapper/phlex-testing-capybara) β Capybara support
         | 
| 21 | 
            +
            - [marcoroth/phlexing](https://github.com/marcoroth/phlexing) β ERB β Phlex converter
         | 
| 22 | 
            +
            - [ViewComponent/lookbook](https://github.com/ViewComponent/lookbook) βΒ Document and preview Phlex components in Rails (v2 beta only)
         | 
| 23 | 
            +
             | 
| 13 24 | 
             
            ### Community π
         | 
| 14 25 |  | 
| 15 26 | 
             
            Everyone interacting in Phlex codebases, issue trackers or chat rooms is expected to follow the [code of conduct](https://github.com/joeldrapper/phlex/blob/main/CODE_OF_CONDUCT.md).
         | 
| @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Phlex
         | 
| 4 | 
            +
            	module ElementClobberingGuard
         | 
| 5 | 
            +
            		def method_added(method_name)
         | 
| 6 | 
            +
            			if method_name[0] == "_" && private_instance_methods.include?(:"__phlex#{method_name}__")
         | 
| 7 | 
            +
            				raise NameError, "π Redefining the method `#{name}##{method_name}` is not a good idea."
         | 
| 8 | 
            +
            			end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            			super
         | 
| 11 | 
            +
            		end
         | 
| 12 | 
            +
            	end
         | 
| 13 | 
            +
            end
         | 
    
        data/lib/phlex/elements.rb
    CHANGED
    
    | @@ -5,25 +5,33 @@ if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("3.0") | |
| 5 5 | 
             
            end
         | 
| 6 6 |  | 
| 7 7 | 
             
            module Phlex::Elements
         | 
| 8 | 
            +
            	private def slow_registered_elements
         | 
| 9 | 
            +
            		private_instance_methods
         | 
| 10 | 
            +
            			.lazy
         | 
| 11 | 
            +
            			.map(&:to_s)
         | 
| 12 | 
            +
            			.select { |m| m.start_with?("__phlex_") }
         | 
| 13 | 
            +
            			.map { |m| m[8...-2].to_sym }
         | 
| 14 | 
            +
            	end
         | 
| 15 | 
            +
             | 
| 8 16 | 
             
            	def register_element(element, tag: element.name.tr("_", "-"))
         | 
| 9 17 | 
             
            		class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
         | 
| 10 18 | 
             
            			# frozen_string_literal: true
         | 
| 11 19 |  | 
| 12 | 
            -
            			def #{element}(**attributes, &block)
         | 
| 13 | 
            -
            				if attributes.length > 0
         | 
| 14 | 
            -
            					if block_given?
         | 
| 15 | 
            -
            						@_target << "<#{tag}" << (Phlex::ATTRIBUTE_CACHE[attributes.hash] || __attributes__(**attributes)) << ">"
         | 
| 20 | 
            +
            			def __phlex_#{element}__(**attributes, &block)
         | 
| 21 | 
            +
            				if attributes.length > 0 # with attributes
         | 
| 22 | 
            +
            					if block_given? # with content block
         | 
| 23 | 
            +
            						@_target << "<#{tag}" << (Phlex::ATTRIBUTE_CACHE[respond_to?(:process_attributes) ? (attributes.hash + self.class.hash) : attributes.hash] || __attributes__(**attributes)) << ">"
         | 
| 16 24 | 
             
            						yield_content(&block)
         | 
| 17 25 | 
             
            						@_target << "</#{tag}>"
         | 
| 18 | 
            -
            					else
         | 
| 19 | 
            -
            						@_target << "<#{tag}" << (Phlex::ATTRIBUTE_CACHE[attributes.hash] || __attributes__(**attributes)) << "></#{tag}>"
         | 
| 26 | 
            +
            					else # without content block
         | 
| 27 | 
            +
            						@_target << "<#{tag}" << (Phlex::ATTRIBUTE_CACHE[respond_to?(:process_attributes) ? (attributes.hash + self.class.hash) : attributes.hash] || __attributes__(**attributes)) << "></#{tag}>"
         | 
| 20 28 | 
             
            					end
         | 
| 21 | 
            -
            				else
         | 
| 22 | 
            -
            					if block_given?
         | 
| 29 | 
            +
            				else # without attributes
         | 
| 30 | 
            +
            					if block_given? # with content block
         | 
| 23 31 | 
             
            						@_target << "<#{tag}>"
         | 
| 24 32 | 
             
            						yield_content(&block)
         | 
| 25 33 | 
             
            						@_target << "</#{tag}>"
         | 
| 26 | 
            -
            					else
         | 
| 34 | 
            +
            					else # without content block
         | 
| 27 35 | 
             
            						@_target << "<#{tag}></#{tag}>"
         | 
| 28 36 | 
             
            					end
         | 
| 29 37 | 
             
            				end
         | 
| @@ -31,11 +39,11 @@ module Phlex::Elements | |
| 31 39 | 
             
            				nil
         | 
| 32 40 | 
             
            			end
         | 
| 33 41 |  | 
| 34 | 
            -
            			alias_method :_#{element},  | 
| 42 | 
            +
            			alias_method :_#{element}, :__phlex_#{element}__
         | 
| 43 | 
            +
            			alias_method :#{element}, :__phlex_#{element}__
         | 
| 44 | 
            +
            			private :__phlex_#{element}__
         | 
| 35 45 | 
             
            		RUBY
         | 
| 36 46 |  | 
| 37 | 
            -
            		self::REGISTERED_ELEMENTS[element] = tag
         | 
| 38 | 
            -
             | 
| 39 47 | 
             
            		element
         | 
| 40 48 | 
             
            	end
         | 
| 41 49 |  | 
| @@ -43,21 +51,21 @@ module Phlex::Elements | |
| 43 51 | 
             
            		class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
         | 
| 44 52 | 
             
            			# frozen_string_literal: true
         | 
| 45 53 |  | 
| 46 | 
            -
            			def #{element}(**attributes)
         | 
| 47 | 
            -
            				if attributes.length > 0
         | 
| 48 | 
            -
            					@_target << "<#{tag}" << (Phlex::ATTRIBUTE_CACHE[attributes.hash] || __attributes__(**attributes)) << ">"
         | 
| 49 | 
            -
            				else
         | 
| 54 | 
            +
            			def __phlex_#{element}__(**attributes)
         | 
| 55 | 
            +
            				if attributes.length > 0 # with attributes
         | 
| 56 | 
            +
            					@_target << "<#{tag}" << (Phlex::ATTRIBUTE_CACHE[respond_to?(:process_attributes) ? (attributes.hash + self.class.hash) : attributes.hash] || __attributes__(**attributes)) << ">"
         | 
| 57 | 
            +
            				else # without attributes
         | 
| 50 58 | 
             
            					@_target << "<#{tag}>"
         | 
| 51 59 | 
             
            				end
         | 
| 52 60 |  | 
| 53 61 | 
             
            				nil
         | 
| 54 62 | 
             
            			end
         | 
| 55 63 |  | 
| 56 | 
            -
            			alias_method :_#{element},  | 
| 64 | 
            +
            			alias_method :_#{element}, :__phlex_#{element}__
         | 
| 65 | 
            +
            			alias_method :#{element}, :__phlex_#{element}__
         | 
| 66 | 
            +
            			private :__phlex_#{element}__
         | 
| 57 67 | 
             
            		RUBY
         | 
| 58 68 |  | 
| 59 | 
            -
            		self::REGISTERED_ELEMENTS[element] = tag
         | 
| 60 | 
            -
             | 
| 61 69 | 
             
            		element
         | 
| 62 70 | 
             
            	end
         | 
| 63 71 | 
             
            end
         | 
    
        data/lib/phlex/helpers.rb
    CHANGED
    
    | @@ -5,6 +5,7 @@ if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("3.0") | |
| 5 5 | 
             
            end
         | 
| 6 6 |  | 
| 7 7 | 
             
            module Phlex::Helpers
         | 
| 8 | 
            +
            	# @return [String]
         | 
| 8 9 | 
             
            	private def tokens(*tokens, **conditional_tokens)
         | 
| 9 10 | 
             
            		conditional_tokens.each do |condition, token|
         | 
| 10 11 | 
             
            			truthy = case condition
         | 
| @@ -31,6 +32,7 @@ module Phlex::Helpers | |
| 31 32 | 
             
            		tokens
         | 
| 32 33 | 
             
            	end
         | 
| 33 34 |  | 
| 35 | 
            +
            	# @api private
         | 
| 34 36 | 
             
            	private def __append_token__(tokens, token)
         | 
| 35 37 | 
             
            		case token
         | 
| 36 38 | 
             
            			when nil then nil
         | 
| @@ -42,6 +44,7 @@ module Phlex::Helpers | |
| 42 44 | 
             
            		end
         | 
| 43 45 | 
             
            	end
         | 
| 44 46 |  | 
| 47 | 
            +
            	# @return [Hash]
         | 
| 45 48 | 
             
            	private def classes(*tokens, **conditional_tokens)
         | 
| 46 49 | 
             
            		tokens = self.tokens(*tokens, **conditional_tokens)
         | 
| 47 50 |  | 
| @@ -52,6 +55,7 @@ module Phlex::Helpers | |
| 52 55 | 
             
            		end
         | 
| 53 56 | 
             
            	end
         | 
| 54 57 |  | 
| 58 | 
            +
            	# @return [Hash]
         | 
| 55 59 | 
             
            	private def mix(*args)
         | 
| 56 60 | 
             
            		args.each_with_object({}) do |object, result|
         | 
| 57 61 | 
             
            			result.merge!(object) do |_key, old, new|
         | 
    
        data/lib/phlex/html.rb
    CHANGED
    
    | @@ -29,6 +29,12 @@ module Phlex | |
| 29 29 | 
             
            			nil
         | 
| 30 30 | 
             
            		end
         | 
| 31 31 |  | 
| 32 | 
            +
            		# @deprecated use {#plain} instead.
         | 
| 33 | 
            +
            		def text(...)
         | 
| 34 | 
            +
            			warn "DEPRECATED: The `text` method has been deprecated in favour of `plain`. Please use `plain` instead. The `text` method will be removed in a future version of Phlex. Called from: #{caller.first}"
         | 
| 35 | 
            +
            			plain(...)
         | 
| 36 | 
            +
            		end
         | 
| 37 | 
            +
             | 
| 32 38 | 
             
            		def svg(...)
         | 
| 33 39 | 
             
            			super do
         | 
| 34 40 | 
             
            				render Phlex::SVG.new do |svg|
         | 
| @@ -42,13 +48,7 @@ module Phlex | |
| 42 48 | 
             
            			self.class.__unbuffered_class__.new(self)
         | 
| 43 49 | 
             
            		end
         | 
| 44 50 |  | 
| 45 | 
            -
            		# This should be  | 
| 46 | 
            -
            		 | 
| 47 | 
            -
            			if method_name[0] == "_" && Phlex::HTML.instance_methods.include?(method_name) && instance_method(method_name).owner != Phlex::HTML
         | 
| 48 | 
            -
            				raise NameError, "π Redefining the method `#{name}##{method_name}` is not a good idea."
         | 
| 49 | 
            -
            			end
         | 
| 50 | 
            -
             | 
| 51 | 
            -
            			super
         | 
| 52 | 
            -
            		end
         | 
| 51 | 
            +
            		# This should be extended after all method definitions
         | 
| 52 | 
            +
            		extend ElementClobberingGuard
         | 
| 53 53 | 
             
            	end
         | 
| 54 54 | 
             
            end
         | 
    
        data/lib/phlex/sgml.rb
    CHANGED
    
    | @@ -14,6 +14,8 @@ module Phlex | |
| 14 14 |  | 
| 15 15 | 
             
            			alias_method :render, :call
         | 
| 16 16 |  | 
| 17 | 
            +
            			# Create a new instance of the component.
         | 
| 18 | 
            +
            			# @note The block will not be delegated to the initializer. Instead, it will be provided to `template` when rendering.
         | 
| 17 19 | 
             
            			def new(*args, **kwargs, &block)
         | 
| 18 20 | 
             
            				if block
         | 
| 19 21 | 
             
            					object = super(*args, **kwargs, &nil)
         | 
| @@ -32,21 +34,21 @@ module Phlex | |
| 32 34 | 
             
            		end
         | 
| 33 35 |  | 
| 34 36 | 
             
            		# Renders the view and returns the buffer. The default buffer is a mutable String.
         | 
| 35 | 
            -
            		def call(buffer = +"", view_context: nil, parent: nil, &block)
         | 
| 36 | 
            -
            			__final_call__(buffer, view_context: view_context, parent: parent, &block).tap do
         | 
| 37 | 
            +
            		def call(buffer = nil, target: +"", view_context: nil, parent: nil, &block)
         | 
| 38 | 
            +
            			__final_call__(buffer, target: target, view_context: view_context, parent: parent, &block).tap do
         | 
| 37 39 | 
             
            				self.class.rendered_at_least_once!
         | 
| 38 40 | 
             
            			end
         | 
| 39 41 | 
             
            		end
         | 
| 40 42 |  | 
| 41 43 | 
             
            		# @api private
         | 
| 42 | 
            -
            		def __final_call__(buffer = +"", view_context: nil, parent: nil, &block)
         | 
| 43 | 
            -
            			@_target =  | 
| 44 | 
            +
            		def __final_call__(buffer = nil, target: +"", view_context: nil, parent: nil, &block)
         | 
| 45 | 
            +
            			@_target = target
         | 
| 44 46 | 
             
            			@_view_context = view_context
         | 
| 45 47 | 
             
            			@_parent = parent
         | 
| 46 48 |  | 
| 47 49 | 
             
            			block ||= @_content_block
         | 
| 48 50 |  | 
| 49 | 
            -
            			return buffer unless render?
         | 
| 51 | 
            +
            			return buffer || target unless render?
         | 
| 50 52 |  | 
| 51 53 | 
             
            			around_template do
         | 
| 52 54 | 
             
            				if block
         | 
| @@ -67,19 +69,19 @@ module Phlex | |
| 67 69 | 
             
            				end
         | 
| 68 70 | 
             
            			end
         | 
| 69 71 |  | 
| 70 | 
            -
            			buffer
         | 
| 72 | 
            +
            			buffer ? (buffer << target) : target
         | 
| 71 73 | 
             
            		end
         | 
| 72 74 |  | 
| 73 75 | 
             
            		# Render another view
         | 
| 74 | 
            -
            		# @param renderable [Phlex:: | 
| 75 | 
            -
            		# @return [ | 
| 76 | 
            +
            		# @param renderable [Phlex::SGML]
         | 
| 77 | 
            +
            		# @return [nil]
         | 
| 76 78 | 
             
            		def render(renderable, &block)
         | 
| 77 79 | 
             
            			case renderable
         | 
| 78 80 | 
             
            			when Phlex::SGML
         | 
| 79 | 
            -
            				renderable.call(@_target, view_context: @_view_context, parent: self, &block)
         | 
| 81 | 
            +
            				renderable.call(target: @_target, view_context: @_view_context, parent: self, &block)
         | 
| 80 82 | 
             
            			when Class
         | 
| 81 83 | 
             
            				if renderable < Phlex::SGML
         | 
| 82 | 
            -
            					renderable.new.call(@_target, view_context: @_view_context, parent: self, &block)
         | 
| 84 | 
            +
            					renderable.new.call(target: @_target, view_context: @_view_context, parent: self, &block)
         | 
| 83 85 | 
             
            				end
         | 
| 84 86 | 
             
            			else
         | 
| 85 87 | 
             
            				raise ArgumentError, "You can't render a #{renderable}."
         | 
| @@ -89,20 +91,28 @@ module Phlex | |
| 89 91 | 
             
            		end
         | 
| 90 92 |  | 
| 91 93 | 
             
            		# Output text content. The text will be HTML-escaped.
         | 
| 92 | 
            -
            		 | 
| 93 | 
            -
             | 
| 94 | 
            -
             | 
| 95 | 
            -
             | 
| 96 | 
            -
             | 
| 97 | 
            -
             | 
| 98 | 
            -
             | 
| 94 | 
            +
            		# @return [nil]
         | 
| 95 | 
            +
            		def plain(content)
         | 
| 96 | 
            +
            			case content
         | 
| 97 | 
            +
            			when String
         | 
| 98 | 
            +
            				@_target << ERB::Escape.html_escape(content)
         | 
| 99 | 
            +
            			when Symbol
         | 
| 100 | 
            +
            				@_target << ERB::Escape.html_escape(content.name)
         | 
| 101 | 
            +
            			when Integer
         | 
| 102 | 
            +
            				@_target << ERB::Escape.html_escape(content.to_s)
         | 
| 103 | 
            +
            			when nil
         | 
| 104 | 
            +
            				nil
         | 
| 105 | 
            +
            			else
         | 
| 106 | 
            +
            				if (formatted_object = format_object(content))
         | 
| 107 | 
            +
            					@_target << ERB::Escape.html_escape(formatted_object)
         | 
| 99 108 | 
             
            				end
         | 
| 100 | 
            -
            			 | 
| 109 | 
            +
            			end
         | 
| 101 110 |  | 
| 102 111 | 
             
            			nil
         | 
| 103 112 | 
             
            		end
         | 
| 104 113 |  | 
| 105 114 | 
             
            		# Output a whitespace character. This is useful for getting inline elements to wrap. If you pass a block, a whitespace will be output before and after yielding the block.
         | 
| 115 | 
            +
            		# @return [nil]
         | 
| 106 116 | 
             
            		def whitespace
         | 
| 107 117 | 
             
            			@_target << " "
         | 
| 108 118 |  | 
| @@ -115,6 +125,7 @@ module Phlex | |
| 115 125 | 
             
            		end
         | 
| 116 126 |  | 
| 117 127 | 
             
            		# Output an HTML comment.
         | 
| 128 | 
            +
            		# @return [nil]
         | 
| 118 129 | 
             
            		def comment(&block)
         | 
| 119 130 | 
             
            			@_target << "<!-- "
         | 
| 120 131 | 
             
            			yield_content(&block)
         | 
| @@ -136,23 +147,25 @@ module Phlex | |
| 136 147 | 
             
            		# Capture a block of output as a String.
         | 
| 137 148 | 
             
            		# @return [String]
         | 
| 138 149 | 
             
            		def capture(&block)
         | 
| 139 | 
            -
            			return unless block_given?
         | 
| 150 | 
            +
            			return "" unless block_given?
         | 
| 140 151 |  | 
| 141 | 
            -
            			 | 
| 142 | 
            -
            			 | 
| 152 | 
            +
            			original_buffer_content = @_target.dup
         | 
| 153 | 
            +
            			@_target.clear
         | 
| 143 154 |  | 
| 144 155 | 
             
            			begin
         | 
| 145 | 
            -
            				@_target = new_buffer
         | 
| 146 156 | 
             
            				yield_content(&block)
         | 
| 157 | 
            +
            				new_buffer_content = @_target.dup
         | 
| 147 158 | 
             
            			ensure
         | 
| 148 | 
            -
            				@_target | 
| 159 | 
            +
            				@_target.clear
         | 
| 160 | 
            +
            				@_target << original_buffer_content
         | 
| 149 161 | 
             
            			end
         | 
| 150 162 |  | 
| 151 | 
            -
            			 | 
| 163 | 
            +
            			new_buffer_content
         | 
| 152 164 | 
             
            		end
         | 
| 153 165 |  | 
| 154 166 | 
             
            		# Like `capture` but the output is vanished into a BlackHole buffer.
         | 
| 155 167 | 
             
            		# Because the BlackHole does nothing with the output, this should be faster.
         | 
| 168 | 
            +
            		# @return [nil]
         | 
| 156 169 | 
             
            		private def __vanish__(*args)
         | 
| 157 170 | 
             
            			return unless block_given?
         | 
| 158 171 |  | 
| @@ -169,10 +182,13 @@ module Phlex | |
| 169 182 | 
             
            		end
         | 
| 170 183 |  | 
| 171 184 | 
             
            		# Default render predicate can be overridden to prevent rendering
         | 
| 185 | 
            +
            		# @return [bool]
         | 
| 172 186 | 
             
            		private def render?
         | 
| 173 187 | 
             
            			true
         | 
| 174 188 | 
             
            		end
         | 
| 175 189 |  | 
| 190 | 
            +
            		# Format the object for output
         | 
| 191 | 
            +
            		# @return [String]
         | 
| 176 192 | 
             
            		private def format_object(object)
         | 
| 177 193 | 
             
            			case object
         | 
| 178 194 | 
             
            			when Float
         | 
| @@ -181,70 +197,48 @@ module Phlex | |
| 181 197 | 
             
            		end
         | 
| 182 198 |  | 
| 183 199 | 
             
            		# Override this method to hook in around a template render. You can do things before and after calling <code>super</code> to render the template. You should always call <code>super</code> so that callbacks can be added at different layers of the inheritance tree.
         | 
| 200 | 
            +
            		# @return [nil]
         | 
| 184 201 | 
             
            		private def around_template
         | 
| 185 202 | 
             
            			before_template
         | 
| 186 203 | 
             
            			yield
         | 
| 187 204 | 
             
            			after_template
         | 
| 205 | 
            +
             | 
| 206 | 
            +
            			nil
         | 
| 188 207 | 
             
            		end
         | 
| 189 208 |  | 
| 190 209 | 
             
            		# Override this method to hook in right before a template is rendered. Please remember to call <code>super</code> so that callbacks can be added at different layers of the inheritance tree.
         | 
| 210 | 
            +
            		# @return [nil]
         | 
| 191 211 | 
             
            		private def before_template
         | 
| 192 212 | 
             
            			nil
         | 
| 193 213 | 
             
            		end
         | 
| 194 214 |  | 
| 195 215 | 
             
            		# Override this method to hook in right after a template is rendered. Please remember to call <code>super</code> so that callbacks can be added at different layers of the inheritance tree.
         | 
| 216 | 
            +
            		# @return [nil]
         | 
| 196 217 | 
             
            		private def after_template
         | 
| 197 218 | 
             
            			nil
         | 
| 198 219 | 
             
            		end
         | 
| 199 220 |  | 
| 200 221 | 
             
            		# Yields the block and checks if it buffered anything. If nothing was buffered, the return value is treated as text.
         | 
| 222 | 
            +
            		# @return [nil]
         | 
| 201 223 | 
             
            		private def yield_content
         | 
| 202 224 | 
             
            			return unless block_given?
         | 
| 203 225 |  | 
| 204 226 | 
             
            			original_length = @_target.length
         | 
| 205 227 | 
             
            			content = yield(self)
         | 
| 206 | 
            -
            			unchanged = (original_length == @_target.length)
         | 
| 207 228 |  | 
| 208 | 
            -
            			if  | 
| 209 | 
            -
            				case content
         | 
| 210 | 
            -
            				when String
         | 
| 211 | 
            -
            					@_target << ERB::Util.html_escape(content)
         | 
| 212 | 
            -
            				when Symbol
         | 
| 213 | 
            -
            					@_target << ERB::Util.html_escape(content.name)
         | 
| 214 | 
            -
            				when Integer
         | 
| 215 | 
            -
            					@_target << ERB::Util.html_escape(content.to_s)
         | 
| 216 | 
            -
            				else
         | 
| 217 | 
            -
            					if (formatted_object = format_object(content))
         | 
| 218 | 
            -
            						@_target << ERB::Util.html_escape(formatted_object)
         | 
| 219 | 
            -
            					end
         | 
| 220 | 
            -
            				end
         | 
| 221 | 
            -
            			end
         | 
| 229 | 
            +
            			plain(content) if original_length == @_target.length
         | 
| 222 230 |  | 
| 223 231 | 
             
            			nil
         | 
| 224 232 | 
             
            		end
         | 
| 225 233 |  | 
| 226 234 | 
             
            		# Same as <code>yield_content</code> but accepts a splat of arguments to yield. This is slightly slower than <code>yield_content</code>, which is why it's defined as a different method because we don't always need arguments so we can usually use <code>yield_content</code> instead.
         | 
| 235 | 
            +
            		# @return [nil]
         | 
| 227 236 | 
             
            		private def yield_content_with_args(*args)
         | 
| 228 237 | 
             
            			return unless block_given?
         | 
| 229 238 |  | 
| 230 239 | 
             
            			original_length = @_target.length
         | 
| 231 240 | 
             
            			content = yield(*args)
         | 
| 232 | 
            -
            			 | 
| 233 | 
            -
             | 
| 234 | 
            -
            			if unchanged
         | 
| 235 | 
            -
            				case content
         | 
| 236 | 
            -
            				when String
         | 
| 237 | 
            -
            					@_target << ERB::Util.html_escape(content)
         | 
| 238 | 
            -
            				when Symbol
         | 
| 239 | 
            -
            					@_target << ERB::Util.html_escape(content.name)
         | 
| 240 | 
            -
            				when Integer, Float
         | 
| 241 | 
            -
            					@_target << ERB::Util.html_escape(content.to_s)
         | 
| 242 | 
            -
            				else
         | 
| 243 | 
            -
            					if (formatted_object = format_object(content))
         | 
| 244 | 
            -
            						@_target << ERB::Util.html_escape(formatted_object)
         | 
| 245 | 
            -
            					end
         | 
| 246 | 
            -
            				end
         | 
| 247 | 
            -
            			end
         | 
| 241 | 
            +
            			plain(content) if original_length == @_target.length
         | 
| 248 242 |  | 
| 249 243 | 
             
            			nil
         | 
| 250 244 | 
             
            		end
         | 
| @@ -252,12 +246,16 @@ module Phlex | |
| 252 246 | 
             
            		# @api private
         | 
| 253 247 | 
             
            		private def __attributes__(**attributes)
         | 
| 254 248 | 
             
            			__final_attributes__(**attributes).tap do |buffer|
         | 
| 255 | 
            -
            				Phlex::ATTRIBUTE_CACHE[attributes.hash] = buffer.freeze
         | 
| 249 | 
            +
            				Phlex::ATTRIBUTE_CACHE[respond_to?(:process_attributes) ? (attributes.hash + self.class.hash) : attributes.hash] = buffer.freeze
         | 
| 256 250 | 
             
            			end
         | 
| 257 251 | 
             
            		end
         | 
| 258 252 |  | 
| 259 253 | 
             
            		# @api private
         | 
| 260 254 | 
             
            		private def __final_attributes__(**attributes)
         | 
| 255 | 
            +
            			if respond_to?(:process_attributes)
         | 
| 256 | 
            +
            				attributes = process_attributes(**attributes)
         | 
| 257 | 
            +
            			end
         | 
| 258 | 
            +
             | 
| 261 259 | 
             
            			if attributes[:href]&.start_with?(/\s*javascript:/)
         | 
| 262 260 | 
             
            				attributes.delete(:href)
         | 
| 263 261 | 
             
            			end
         | 
| @@ -292,9 +290,9 @@ module Phlex | |
| 292 290 | 
             
            				when true
         | 
| 293 291 | 
             
            					buffer << " " << name
         | 
| 294 292 | 
             
            				when String
         | 
| 295 | 
            -
            					buffer << " " << name << '="' << ERB:: | 
| 293 | 
            +
            					buffer << " " << name << '="' << ERB::Escape.html_escape(v) << '"'
         | 
| 296 294 | 
             
            				when Symbol
         | 
| 297 | 
            -
            					buffer << " " << name << '="' << ERB:: | 
| 295 | 
            +
            					buffer << " " << name << '="' << ERB::Escape.html_escape(v.name) << '"'
         | 
| 298 296 | 
             
            				when Hash
         | 
| 299 297 | 
             
            					__build_attributes__(
         | 
| 300 298 | 
             
            						v.transform_keys { |subkey|
         | 
| @@ -305,7 +303,7 @@ module Phlex | |
| 305 303 | 
             
            						}, buffer: buffer
         | 
| 306 304 | 
             
            					)
         | 
| 307 305 | 
             
            				else
         | 
| 308 | 
            -
            					buffer << " " << name << '="' << ERB:: | 
| 306 | 
            +
            					buffer << " " << name << '="' << ERB::Escape.html_escape(v.to_s) << '"'
         | 
| 309 307 | 
             
            				end
         | 
| 310 308 | 
             
            			end
         | 
| 311 309 |  | 
    
        data/lib/phlex/svg.rb
    CHANGED
    
    
    
        data/lib/phlex/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: phlex
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1. | 
| 4 | 
            +
              version: 1.5.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Joel Drapper
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2023- | 
| 11 | 
            +
            date: 2023-03-06 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: concurrent-ruby
         | 
| @@ -24,6 +24,20 @@ dependencies: | |
| 24 24 | 
             
                - - "~>"
         | 
| 25 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 26 | 
             
                    version: '1.2'
         | 
| 27 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            +
              name: erb
         | 
| 29 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 | 
            +
                requirements:
         | 
| 31 | 
            +
                - - ">="
         | 
| 32 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            +
                    version: '4'
         | 
| 34 | 
            +
              type: :runtime
         | 
| 35 | 
            +
              prerelease: false
         | 
| 36 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 | 
            +
                requirements:
         | 
| 38 | 
            +
                - - ">="
         | 
| 39 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            +
                    version: '4'
         | 
| 27 41 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 28 42 | 
             
              name: zeitwerk
         | 
| 29 43 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -63,6 +77,7 @@ files: | |
| 63 77 | 
             
            - lib/phlex/black_hole.rb
         | 
| 64 78 | 
             
            - lib/phlex/callable.rb
         | 
| 65 79 | 
             
            - lib/phlex/deferred_render.rb
         | 
| 80 | 
            +
            - lib/phlex/element_clobbering_guard.rb
         | 
| 66 81 | 
             
            - lib/phlex/elements.rb
         | 
| 67 82 | 
             
            - lib/phlex/helpers.rb
         | 
| 68 83 | 
             
            - lib/phlex/html.rb
         |