module MailerHelper
def style_bold(text)
("" + "#{text}".html_safe + "").html_safe
end
def style_link(body, url, html_options = {})
html_options[:style] = "color:#990000"
link_to(body.html_safe, url, html_options)
end
def style_role(text)
tag.em(tag.strong(text))
end
# For work, chapter, and series links
def style_creation_link(title, url, html_options = {})
html_options[:style] = "color:#990000"
("" + link_to(title.html_safe, url, html_options) + "").html_safe
end
# For work, chapter, and series titles
def style_creation_title(title)
("" + title.html_safe + "").html_safe
end
def style_footer_link(body, url, html_options = {})
html_options[:style] = "color:#FFFFFF"
link_to(body.html_safe, url, html_options)
end
def style_email(email, name = nil, html_options = {})
html_options[:style] = "color:#990000"
mail_to(email, name.nil? ? nil : name.html_safe, html_options)
end
def style_pseud_link(pseud)
style_link("" +
pseud.byline, user_pseud_url(pseud.user, pseud))
end
def text_pseud(pseud)
pseud.byline + " (#{user_pseud_url(pseud.user, pseud)})"
end
def style_quote(text)
("
" + text + "").html_safe end def support_link(text) style_link(text, root_url + "support") end def abuse_link(text) style_link(text, root_url + "abuse_reports/new") end def tos_link(text) style_link(text, tos_url) end def opendoors_link(text) style_link(text, "https://opendoors.transformativeworks.org/contact-open-doors/") end def styled_divider ("
|<\/p>\z|
\z/, "")
.gsub(/<\/p>/, "\n\n")
.gsub(/
/, "\n")
.gsub(/<\/?(b|em|strong)>/, "*")
.gsub(/<\/?(i|cite)>/, "/")
.gsub(/<\/?u>/, "_")
)
end
# Reformat a string as HTML with
tags instead of newlines, but with all
# other HTML escaped.
# This is used for collection.assignment_notification, which already strips
# HTML tags (when saving the collection settings, the params are sanitized),
# but that still leaves other HTML entities.
def escape_html_and_create_linebreaks(html)
# Escape each line with h(), then join with
s and mark as html_safe to
# ensure that the
s aren't escaped.
html.split("\n").map { |line_of_text| h(line_of_text) }.join('
').html_safe
end
# The title used in creatorship_notification and creatorship_request
# emails.
def creation_title(creation)
if creation.is_a?(Chapter)
t("mailer.general.creation.title_with_chapter_number",
position: creation.position, title: creation.work.title)
else
creation.title
end
end
# e.g., Title (x words), where Title is a link
def creation_link_with_word_count(creation, creation_url)
title = if creation.is_a?(Chapter)
creation.full_chapter_title.html_safe
else
creation.title.html_safe
end
t("mailer.general.creation.link_with_word_count",
creation_link: style_creation_link(title, creation_url),
word_count: creation_word_count(creation)).html_safe
end
# e.g., "Title" (x words), where Title is not a link
def creation_title_with_word_count(creation)
title = if creation.is_a?(Chapter)
creation.full_chapter_title.html_safe
else
creation.title.html_safe
end
t("mailer.general.creation.title_with_word_count",
creation_title: title, word_count: creation_word_count(creation))
end
# The bylines used in subscription emails to prevent exposing the name(s) of
# anonymous creator(s).
def creator_links(work)
if work.anonymous?
"Anonymous"
else
work.pseuds.map { |p| style_pseud_link(p) }.to_sentence.html_safe
end
end
def creator_text(work)
if work.anonymous?
"Anonymous"
else
work.pseuds.map { |p| text_pseud(p) }.to_sentence.html_safe
end
end
def metadata_label(text)
text.html_safe + t("mailer.general.metadata_label_indicator")
end
# Spacing is dealt with in locale files, e.g. " : " for French.
def work_tag_metadata(tags)
return if tags.empty?
"#{work_tag_metadata_label(tags)}#{work_tag_metadata_list(tags)}"
end
def style_metadata_label(text)
style_bold(metadata_label(text))
end
# Spacing is dealt with in locale files, e.g. " : " for French.
def style_work_tag_metadata(tags)
return if tags.empty?
label = style_bold(work_tag_metadata_label(tags))
"#{label}#{style_work_tag_metadata_list(tags)}".html_safe
end
def commenter_pseud_or_name_link(comment)
return style_bold(t("roles.anonymous_creator")) if comment.by_anonymous_creator?
if comment.comment_owner.nil?
t("roles.commenter_name.html", name: style_bold(comment.comment_owner_name), role_with_parens: style_role(t("roles.guest_with_parens")))
else
role = comment.user.official ? t("roles.official_with_parens") : t("roles.registered_with_parens")
pseud_link = style_link(comment.pseud.byline, user_pseud_url(comment.user, comment.pseud))
t("roles.commenter_name.html", name: tag.strong(pseud_link), role_with_parens: style_role(role))
end
end
def commenter_pseud_or_name_text(comment)
return t("roles.anonymous_creator") if comment.by_anonymous_creator?
if comment.comment_owner.nil?
t("roles.commenter_name.text", name: comment.comment_owner_name, role_with_parens: t("roles.guest_with_parens"))
else
role = comment.user.official ? t("roles.official_with_parens") : t("roles.registered_with_parens")
t("roles.commenter_name.text", name: text_pseud(comment.pseud), role_with_parens: role)
end
end
def content_for_commentable_text(comment)
if comment.ultimate_parent.is_a?(Tag)
t(".content.tag.text",
pseud: commenter_pseud_or_name_text(comment),
tag: comment.ultimate_parent.commentable_name,
tag_url: tag_url(comment.ultimate_parent))
elsif comment.parent.is_a?(Chapter) && comment.ultimate_parent.chaptered?
if comment.parent.title.blank?
t(".content.chapter.untitled_text",
pseud: commenter_pseud_or_name_text(comment),
chapter_position: comment.parent.position,
work: comment.ultimate_parent.commentable_name,
chapter_url: work_chapter_url(comment.parent.work, comment.parent))
else
t(".content.chapter.titled_text",
pseud: commenter_pseud_or_name_text(comment),
chapter_position: comment.parent.position,
chapter_title: comment.parent.title,
work: comment.ultimate_parent.commentable_name,
chapter_url: work_chapter_url(comment.parent.work, comment.parent))
end
else
t(".content.other.text",
pseud: commenter_pseud_or_name_text(comment),
title: comment.ultimate_parent.commentable_name,
commentable_url: polymorphic_url(comment.ultimate_parent))
end
end
def content_for_commentable_html(comment)
if comment.ultimate_parent.is_a?(Tag)
t(".content.tag.html",
pseud_link: commenter_pseud_or_name_link(comment),
tag_link: style_link(comment.ultimate_parent.commentable_name, tag_url(comment.ultimate_parent)))
elsif comment.parent.is_a?(Chapter) && comment.ultimate_parent.chaptered?
t(".content.chapter.html",
pseud_link: commenter_pseud_or_name_link(comment),
chapter_link: style_link(comment.parent.title.blank? ? t(".chapter.untitled", position: comment.parent.position) : t(".chapter.titled", position: comment.parent.position, title: comment.parent.title), work_chapter_url(comment.parent.work, comment.parent)),
work_link: style_creation_link(comment.ultimate_parent.commentable_name, work_url(comment.parent.work)))
else
t(".content.other.html",
pseud_link: commenter_pseud_or_name_link(comment),
commentable_link: style_creation_link(comment.ultimate_parent.commentable_name, polymorphic_url(comment.ultimate_parent)))
end
end
def collection_footer_note_html(is_collection_email, collection)
if is_collection_email
t("mailer.collections.why_collection_email.html",
collection_link: style_footer_link(collection.title, collection_url(collection)))
else
t("mailer.collections.why_maintainer.html",
collection_link: style_footer_link(collection.title, collection_url(collection)))
end
end
def collection_footer_note_text(is_collection_email, collection)
if is_collection_email
t("mailer.collections.why_collection_email.text",
collection_title: collection.title,
collection_url: collection_url(collection))
else
t("mailer.collections.why_maintainer.text",
collection_title: collection.title,
collection_url: collection_url(collection))
end
end
private
# e.g., 1 word or 50 words
def creation_word_count(creation)
t("mailer.general.creation.word_count", count: creation.word_count)
end
def work_tag_metadata_label(tags)
return if tags.empty?
# i18n-tasks-use t('activerecord.models.archive_warning')
# i18n-tasks-use t('activerecord.models.character')
# i18n-tasks-use t('activerecord.models.fandom')
# i18n-tasks-use t('activerecord.models.freeform')
# i18n-tasks-use t('activerecord.models.rating')
# i18n-tasks-use t('activerecord.models.relationship')
type = tags.first.type
t("activerecord.models.#{type.underscore}", count: tags.count) + t("mailer.general.metadata_label_indicator")
end
# We don't use .to_sentence because these aren't links and we risk making any
# connector word (e.g., "and") look like part of the final tag.
def work_tag_metadata_list(tags)
return if tags.empty?
tags.pluck(:name).join(t("support.array.words_connector"))
end
def style_work_tag_metadata_list(tags)
return if tags.empty?
type = tags.first.type
# Fandom tags are linked and to_sentence'd.
if type == "Fandom"
tags.map { |f| style_link(f.name, fandom_url(f)) }.to_sentence.html_safe
else
work_tag_metadata_list(tags)
end
end
end # end of MailerHelper