in common/app/views/support/HtmlCleaner.scala [115:180]
def clean(body: Document): Document = {
for {
figure <- body.getElementsByTag("figure").asScala
image <- figure.getElementsByTag("img").asScala.headOption
if !(figure.hasClass("element-comment") ||
figure.hasClass("element-witness") ||
figure.hasClass("element-atom"))
container <- findContainerFromId(figure.attr("data-media-id"), image.attr("src"))
image <- container.images.largestImage
} {
val hinting = findBreakpointWidths(figure)
val relation = {
if (article.isLiveBlog) LiveBlogMedia
else if (article.isTheMinute) MinuteMedia
else if (article.isImmersive) ImmersiveMedia
else BodyMedia
}
val widths = ContentWidths.getWidthsFromContentElement(hinting, relation)
val orientationClass = image.orientation match {
case Portrait => Some("img--portrait")
case _ => Some("img--landscape")
}
val smallImageClass = hinting match {
case Thumbnail => None
case _ if image.width <= 220 => Some("img--inline")
case _ => None
}
val inlineClass =
if (article.isTheMinute && !figure.hasClass("element--thumbnail")) Some("element--inline") else None
val figureClasses = List(orientationClass, smallImageClass, hinting.className, inlineClass).flatten.mkString(" ")
// lightbox uses the images in the order mentioned in the header array
val lightboxInfo: Option[(Int, ImageAsset)] = for {
index <- Some(article.lightbox.lightboxImages.indexOf(container)).flatMap(index =>
if (index == -1) None else Some(index + 1),
)
crop <- container.images.largestEditorialCrop
if !article.isLiveBlog
} yield (index, crop)
val html = views.html.fragments
.imageFigure(
container.images,
lightboxIndex = lightboxInfo.map(_._1),
widthsByBreakpoint = widths,
image_figureClasses = Some(image, figureClasses),
shareInfo = lightboxInfo.map { case (index, crop) =>
(
article.sharelinks.elementShares(s"img-$index", crop.url),
article.metadata.contentType.getOrElse(DotcomContentType.Unknown),
)
},
)
.toString()
figure.replaceWith(Jsoup.parseBodyFragment(html).body().child(0))
}
body
}