Merge branch 'develop' into codex/cw-4998-disable-inbox
This commit is contained in:
@@ -9,9 +9,32 @@ class CustomMarkdownRenderer < CommonMarker::HtmlRenderer
|
||||
@embed_regexes ||= config.transform_values { |embed_config| Regexp.new(embed_config['regex']) }
|
||||
end
|
||||
|
||||
# Matches columnResizing({ cellMinWidth: 50 }) in @chatwoot/prosemirror-schema
|
||||
# so cells without an explicit colwidth render the same minimum here as in the editor.
|
||||
TABLE_CELL_MIN_WIDTH_PX = 50
|
||||
COLWIDTHS_COMMENT = /<!--cw-colwidths:([\d,]+)-->/
|
||||
|
||||
# The article editor serializes column widths as a `<!--cw-colwidths:...-->` HTML
|
||||
# comment immediately before each resized table. Capture it (emitting nothing) so the
|
||||
# next `table` can size itself; any other raw HTML keeps its default rendering.
|
||||
def html(node)
|
||||
match = node.string_content.match(COLWIDTHS_COMMENT)
|
||||
return super unless match
|
||||
|
||||
@pending_colwidths = match[1].split(',').map(&:to_i)
|
||||
end
|
||||
|
||||
def table(node)
|
||||
out('<div class="tableWrapper">')
|
||||
super
|
||||
widths = @pending_colwidths
|
||||
@pending_colwidths = nil
|
||||
|
||||
if sized_widths?(widths)
|
||||
out(table_wrapper_open(widths))
|
||||
out(inject_table_sizing(capture_html { super(node) }, widths))
|
||||
else
|
||||
out('<div class="tableWrapper">')
|
||||
super
|
||||
end
|
||||
out('</div>')
|
||||
end
|
||||
|
||||
@@ -47,6 +70,61 @@ class CustomMarkdownRenderer < CommonMarker::HtmlRenderer
|
||||
|
||||
private
|
||||
|
||||
def sized_widths?(widths)
|
||||
widths.is_a?(Array) && widths.any? { |w| w.to_i.positive? }
|
||||
end
|
||||
|
||||
def fully_sized?(widths)
|
||||
widths.all? { |w| w.to_i.positive? }
|
||||
end
|
||||
|
||||
# Fully-sized tables hug their exact width so the card doesn't trail empty space;
|
||||
# partial tables stay a plain full-width card so flexible columns can expand.
|
||||
def table_wrapper_open(widths)
|
||||
return '<div class="tableWrapper">' unless fully_sized?(widths)
|
||||
|
||||
%(<div class="tableWrapper" style="width: #{total_width(widths)}px; max-width: 100%;">)
|
||||
end
|
||||
|
||||
# Let the gem render the whole table, then splice a <colgroup> and sizing style
|
||||
# into the opening <table> tag. Delegating the row/cell/tbody/alignment markup to
|
||||
# super keeps this working across commonmarker upgrades.
|
||||
# `!important` overrides the portal's `[&_table]:!min-w-full` Tailwind rule.
|
||||
def inject_table_sizing(html, widths)
|
||||
opening = %(<table style="#{table_sizing_style(widths)}">\n#{colgroup_html(widths)})
|
||||
html.sub(/<table[^>]*>\n?/, opening)
|
||||
end
|
||||
|
||||
# Capture everything `super` writes by swapping the renderer's output buffer.
|
||||
def capture_html
|
||||
original = @stream
|
||||
@stream = StringIO.new(+'')
|
||||
yield
|
||||
@stream.string
|
||||
ensure
|
||||
@stream = original
|
||||
end
|
||||
|
||||
# Total table width: each column's saved width, or the cell min for unsized ones.
|
||||
def total_width(widths)
|
||||
widths.sum { |w| w.to_i.positive? ? w.to_i : TABLE_CELL_MIN_WIDTH_PX }
|
||||
end
|
||||
|
||||
# Fully sized → lock to the exact total (min-width too, so a narrow saved width
|
||||
# beats the portal's `[&_table]:!min-w-full`). Partial → `max(100%, total)` fills
|
||||
# the container (flexible columns) yet scrolls when the sized columns exceed it.
|
||||
def table_sizing_style(widths)
|
||||
total = total_width(widths)
|
||||
return "table-layout: fixed; min-width: max(100%, #{total}px) !important;" unless fully_sized?(widths)
|
||||
|
||||
"table-layout: fixed; width: #{total}px !important; min-width: #{total}px !important;"
|
||||
end
|
||||
|
||||
def colgroup_html(widths)
|
||||
cols = widths.map { |w| w.to_i.positive? ? %(<col style="width: #{w.to_i}px;">) : '<col>' }
|
||||
"<colgroup>#{cols.join}</colgroup>\n"
|
||||
end
|
||||
|
||||
def extract_image_width(src)
|
||||
query = URI.parse(src).query
|
||||
raw = query && CGI.parse(query)['cw_image_width']&.first
|
||||
|
||||
Reference in New Issue
Block a user