add LTR script support
This commit is contained in:
@@ -27,6 +27,8 @@ module Submissions
|
||||
'GBP' => '£'
|
||||
}.freeze
|
||||
|
||||
RTL_REGEXP = Submissions::GenerateResultAttachments::RTL_REGEXP
|
||||
|
||||
module_function
|
||||
|
||||
# rubocop:disable Metrics
|
||||
@@ -147,7 +149,7 @@ module Submissions
|
||||
[
|
||||
submission.template_submitters.size > 1 && { text: "#{item['name']}\n" },
|
||||
submitter.email && { text: "#{submitter.email}\n", font: [FONT_BOLD_NAME, { variant: :bold }] },
|
||||
submitter.name && { text: "#{submitter.name}\n" },
|
||||
submitter.name && { text: "#{maybe_rtl_reverse(submitter.name)}\n" },
|
||||
submitter.phone && { text: "#{submitter.phone}\n" }
|
||||
].compact_blank, line_spacing: 1.8, padding: [0, 20, 0, 0]
|
||||
)
|
||||
@@ -185,11 +187,13 @@ module Submissions
|
||||
composer.formatted_text_box(
|
||||
[
|
||||
{
|
||||
text: field['name'].to_s.upcase.presence ||
|
||||
text: maybe_rtl_reverse(field['name'].to_s).upcase.presence ||
|
||||
"#{field['type']} Field #{submitter_field_counters[field['type']]}\n".upcase,
|
||||
font_size: 6
|
||||
}
|
||||
].compact_blank, line_spacing: 1.8, padding: [0, 0, 5, 0]
|
||||
].compact_blank,
|
||||
align: field['name'].to_s.match?(RTL_REGEXP) ? :right : :left,
|
||||
line_spacing: 1.8, padding: [0, 0, 5, 0]
|
||||
),
|
||||
if field['type'].in?(%w[image signature initials stamp])
|
||||
attachment = submitter.attachments.find { |a| a.uuid == value }
|
||||
@@ -233,7 +237,9 @@ module Submissions
|
||||
|
||||
value = value.join(', ') if value.is_a?(Array)
|
||||
|
||||
composer.formatted_text_box([{ text: value.to_s.presence || 'n/a' }], padding: [0, 0, 10, 0])
|
||||
composer.formatted_text_box([{ text: maybe_rtl_reverse(value.to_s.presence || 'n/a') }],
|
||||
align: value.to_s.match?(RTL_REGEXP) ? :right : :left,
|
||||
padding: [0, 0, 10, 0])
|
||||
end
|
||||
]
|
||||
end
|
||||
@@ -292,6 +298,14 @@ module Submissions
|
||||
)
|
||||
end
|
||||
|
||||
def maybe_rtl_reverse(text)
|
||||
if text.match?(RTL_REGEXP)
|
||||
text.reverse
|
||||
else
|
||||
text
|
||||
end
|
||||
end
|
||||
|
||||
def add_logo(column, _submission = nil)
|
||||
column.image(PdfIcons.logo_io, width: 40, height: 40, position: :float)
|
||||
|
||||
|
||||
@@ -13,6 +13,8 @@ module Submissions
|
||||
SIGN_REASON = 'Signed by %<name>s with DocuSeal.co'
|
||||
SIGN_SIGNLE_REASON = 'Digitally signed with DocuSeal.co'
|
||||
|
||||
RTL_REGEXP = /\A[\p{Hebrew}\p{Arabic}\s;.,-]+\z/
|
||||
|
||||
TEXT_LEFT_MARGIN = 1
|
||||
TEXT_TOP_MARGIN = 1
|
||||
|
||||
@@ -56,10 +58,12 @@ module Submissions
|
||||
height = page.box.height
|
||||
font_size = ((page.box.width / A4_SIZE[0].to_f) * FONT_SIZE).to_i
|
||||
|
||||
layouter = HexaPDF::Layout::TextLayouter.new(valign: :center, font: pdf.fonts.add(FONT_NAME), font_size:)
|
||||
|
||||
value = submitter.values[field['uuid']]
|
||||
|
||||
layouter = HexaPDF::Layout::TextLayouter.new(valign: :center,
|
||||
align: value.to_s.match?(RTL_REGEXP) ? :right : :left,
|
||||
font: pdf.fonts.add(FONT_NAME), font_size:)
|
||||
|
||||
next if Array.wrap(value).compact_blank.blank?
|
||||
|
||||
canvas = page.canvas(type: :overlay)
|
||||
@@ -155,7 +159,7 @@ module Submissions
|
||||
when 'cells'
|
||||
cell_width = area['cell_w'] * width
|
||||
|
||||
value.chars.each_with_index do |char, index|
|
||||
maybe_rtl_reverse(value).chars.each_with_index do |char, index|
|
||||
text = HexaPDF::Layout::TextFragment.create(char, font: pdf.fonts.add(FONT_NAME),
|
||||
font_size:)
|
||||
|
||||
@@ -168,14 +172,16 @@ module Submissions
|
||||
value = TimeUtils.format_date_string(value, field.dig('preferences', 'format'), account.locale)
|
||||
end
|
||||
|
||||
text = HexaPDF::Layout::TextFragment.create(Array.wrap(value).join(', '), font: pdf.fonts.add(FONT_NAME),
|
||||
font_size:)
|
||||
value = maybe_rtl_reverse(Array.wrap(value).join(', '))
|
||||
|
||||
text = HexaPDF::Layout::TextFragment.create(value, font: pdf.fonts.add(FONT_NAME),
|
||||
font_size:)
|
||||
|
||||
lines = layouter.fit([text], area['w'] * width, height).lines
|
||||
box_height = lines.sum(&:height)
|
||||
|
||||
if box_height > (area['h'] * height) + 1
|
||||
text = HexaPDF::Layout::TextFragment.create(Array.wrap(value).join(', '),
|
||||
text = HexaPDF::Layout::TextFragment.create(value,
|
||||
font: pdf.fonts.add(FONT_NAME),
|
||||
font_size: (font_size / 1.4).to_i)
|
||||
|
||||
@@ -312,6 +318,14 @@ module Submissions
|
||||
pdf
|
||||
end
|
||||
|
||||
def maybe_rtl_reverse(text)
|
||||
if text.match?(RTL_REGEXP)
|
||||
text.reverse
|
||||
else
|
||||
text
|
||||
end
|
||||
end
|
||||
|
||||
def sign_reason(name)
|
||||
format(SIGN_REASON, name:)
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user