Skip to content

Commit

Permalink
Add version 2, which is currently the same as 1.x
Browse files Browse the repository at this point in the history
  • Loading branch information
bradgessler committed Feb 7, 2024
1 parent e88c195 commit a4ca370
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 5 deletions.
2 changes: 1 addition & 1 deletion lib/phlex/rails.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ module Rails
class SGML
extend Phlex::Rails::SGML::ClassMethods

prepend Phlex::Rails::SGML::Overrides
prepend Phlex::Rails::SGML::Overrides::Version1
end

# @api private
Expand Down
5 changes: 2 additions & 3 deletions lib/phlex/rails/sgml/overrides.rb
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
# frozen_string_literal: true

require 'rubygems' # Ensure RubyGems is loaded for Gem::Version

module Phlex
module Rails
module SGML
module Overrides
def self.prepended(klass)
klass.prepend Version1
end
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/phlex/rails/sgml/overrides/version_1.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def helpers
def render(*args, **kwargs, &block)
renderable = args[0]

warn "Rendering strings will render the string instead of a Rails template in Phlex Rails 2.0" if renderable.is_a? String
warn "Rendering strings will render the string instead of a Rails partial in Phlex Rails 2.0" if renderable.is_a? String

case renderable
when Phlex::SGML, Proc
Expand Down
96 changes: 96 additions & 0 deletions lib/phlex/rails/sgml/overrides/version_2.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
# frozen_string_literal: true

module Phlex
module Rails
module SGML
module Overrides
module Version2
def helpers
if defined?(ViewComponent::Base) && @_view_context.is_a?(ViewComponent::Base)
@_view_context.helpers
else
@_view_context
end
end

def render(*args, **kwargs, &block)
renderable = args[0]

warn "Rendering strings will render the string instead of a Rails template in Phlex Rails 2.0" if renderable.is_a? String

case renderable
when Phlex::SGML, Proc
return super
when Class
return super if renderable < Phlex::SGML
when Enumerable
return super unless renderable.is_a?(ActiveRecord::Relation)
else
captured_block = -> { capture(&block) } if block
@_context.target << @_view_context.render(*args, **kwargs, &captured_block)
end

nil
end

def render_in(view_context, &block)
if block_given?
call(view_context: view_context) do |*args|
original_length = @_context.target.length

if args.length == 1 && Phlex::SGML === args[0] && !block.source_location&.[](0)&.end_with?(".rb")
output = view_context.capture(
args[0].unbuffered, &block
)
else
output = view_context.capture(*args, &block)
end

unchanged = (original_length == @_context.target.length)

if unchanged
case output
when ActiveSupport::SafeBuffer
@_context.target << output
end
end
end.html_safe
else
call(view_context: view_context).html_safe
end
end

def capture
super&.html_safe
end

# @api private
def __text__(content)
case content
when ActiveSupport::SafeBuffer
@_context.target << content
else
super
end
end

# @api private
def await(task)
if task.is_a?(ActiveRecord::Relation)
flush unless task.loaded?

task
else
super
end
end

# Trick ViewComponent into thinking we're a ViewComponent to fix rendering output
# @api private
def set_original_view_context(view_context)
end
end
end
end
end
end

0 comments on commit a4ca370

Please sign in to comment.