diff --git a/scaladoc/src/dotty/tools/scaladoc/renderers/MemberRenderer.scala b/scaladoc/src/dotty/tools/scaladoc/renderers/MemberRenderer.scala index 996b422b44fd..08e0c6a9d7d0 100644 --- a/scaladoc/src/dotty/tools/scaladoc/renderers/MemberRenderer.scala +++ b/scaladoc/src/dotty/tools/scaladoc/renderers/MemberRenderer.scala @@ -9,6 +9,9 @@ import scala.jdk.CollectionConverters.* import dotty.tools.scaladoc.translators.FilterAttributes import org.jsoup.Jsoup import translators.* +import java.net.URL +import scala.util.Try +import java.nio.file.{Files, Paths} class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) extends DocRender(signatureRenderer): import signatureRenderer._ @@ -100,6 +103,28 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext def typeParams(m: Member): Seq[AppliedTag] = m.docs.fold(Nil)(d => flattenedDocPart(d.typeParams)) def valueParams(m: Member): Seq[AppliedTag] = m.docs.fold(Nil)(d => flattenedDocPart(d.valueParams)) + def processLocalLinkWithGuard(str: String): String = + if str.startsWith("#") || str.isEmpty then + str + else + validationLink(str) + + def validationLink(str: String): String = + def asValidURL = Try(URL(str)).toOption.map(_ => str) + + def asAsset: Option[String] = Option.when( + Files.exists(Paths.get("docs/_assets").resolve(str)) + )( + s"docs/_assets/$str" + ) + + asValidURL + .orElse(asAsset) + .getOrElse{ + report.warning(s"Unable to resolve link '$str'") + str + } + def memberInfo(m: Member, withBrief: Boolean = false, full: Boolean = false): Seq[AppliedTag] = val comment = m.docs val bodyContents = m.docs.fold(Nil)(e => renderDocPart(e.body) :: Nil) @@ -122,6 +147,13 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext case _ => true } + val document = Jsoup.parse(bodyContents.mkString) + val document2 = Jsoup.parse(attributes.mkString) + + document.select("img").forEach(element => + element.attr("src", validationLink(element.attr("src"))) + ) + Seq( Option.when(withBrief && comment.flatMap(_.short).nonEmpty)(div(cls := "documentableBrief doc")(comment.flatMap(_.short).fold("")(renderDocPart))), Option.when(bodyContents.nonEmpty || attributes.nonEmpty)( diff --git a/scaladoc/src/dotty/tools/scaladoc/tasty/comments/Comments.scala b/scaladoc/src/dotty/tools/scaladoc/tasty/comments/Comments.scala index ff4405d3ec71..7496bce6e77f 100644 --- a/scaladoc/src/dotty/tools/scaladoc/tasty/comments/Comments.scala +++ b/scaladoc/src/dotty/tools/scaladoc/tasty/comments/Comments.scala @@ -112,7 +112,7 @@ abstract class MarkupConversion[T](val repr: Repr)(using dctx: DocContext) { case None => sym.dri DocLink.ToDRI(dri, targetText) case None => - val txt = s"No DRI found for query" + val txt = s"No DRI found for query, the link seems to be wrong or the file may not exist." val msg = s"$txt: $queryStr" if (!summon[DocContext].args.noLinkWarnings) then