module Locomotive module Steam module Middlewares class PageEditing include Locomotive::Engine.routes.url_helpers def initialize(app, opts = {}) @app = app end def call(env) disable_live_editing_if_not_html(env) status, headers, response = @app.call(env) site, mounted_on, page, locale, live_editing = env['steam.site'], env['steam.mounted_on'], env['steam.page'], env['steam.locale'].to_s, env['steam.live_editing'] if editable?(page, response, live_editing) html = %( ) response.first.gsub!('', %(#{html})) # make sure there is no span tags within the head. # For the record, Steam adds a span tag next to a block liquid tag response.first.gsub!(/(.+)<\/head>/m) do head = Regexp.last_match[1] "#{head.gsub(//, '')}" end # new way of letting the parent window know about the status of the preview response.first.gsub!('', %( )) end [status, headers, response] end protected def disable_live_editing_if_not_html(env) page = env['steam.page'] if page && page.response_type != 'text/html' env['steam.live_editing'] = false end end def editable?(page, response, live_editing) live_editing && page && !page.redirect && page.response_type == 'text/html' && response.first end def editable_elements_path(site, page, locale, env) options = {} if content_entry_id = content_entry_id(env) options = { content_entry_id: content_entry_id, preview_path: env['steam.path'], } end options[:content_locale] = locale if site.locales.size > 1 super(site.handle, page._id, options) end def content_entry_id(env) env['steam.content_entry']&._id end end end end end