Skip to content

Commit ca9f3ee

Browse files
committed
Add configurable social links to scala3doc
1 parent 16bf86f commit ca9f3ee

17 files changed

+120
-8
lines changed

project/Build.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1624,6 +1624,9 @@ object Build {
16241624
"-skip-by-regex:.+\\.impl($|\\..+) " +
16251625
"-comment-syntax wiki -siteroot scaladoc/scala3-docs -project-logo scaladoc/scala3-docs/logo.svg " +
16261626
"-external-mappings:.*java.*::javadoc::https://docs.oracle.com/javase/8/docs/api/ " +
1627+
"-social-links:github::https://github.com/lampepfl/dotty," +
1628+
"gitter::https://gitter.im/scala/scala," +
1629+
"twitter::https://twitter.com/scala_lang " +
16271630
s"-source-links:$stdLibRoot=github://scala/scala/v${stdlibVersion(Bootstrapped)}#src/library " +
16281631
s"-doc-root-content $docRootFile"
16291632
))

scaladoc-js/src/Main.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ package dotty.tools.scaladoc
22

33
object Main extends App {
44
Searchbar()
5+
SocialLinks()
56
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package dotty.tools.scaladoc
2+
3+
import org.scalajs.dom._
4+
import org.scalajs.dom.ext._
5+
6+
class SocialLinks:
7+
def addIcon(elem: html.Element) =
8+
val img = document.createElement("img").asInstanceOf[html.Image]
9+
img.src = s"${Globals.pathToRoot}images/${elem.getAttribute("data-icon-path")}"
10+
elem.appendChild(img)
11+
12+
document.querySelectorAll(".social-icon").collect { case e: html.Element => e }.foreach(addIcon)
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading

scaladoc/resources/dotty_res/styles/scalastyle.css

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,35 @@ footer .pull-right {
613613
position: relative;
614614
}
615615

616+
#lhs-socials {
617+
margin-left: 5%;
618+
margin-right: 5%;
619+
}
620+
621+
#footer-socials {
622+
margin-left: 10px;
623+
margin-right: 10px;
624+
display: flex;
625+
align-items: center;
626+
}
627+
628+
.social-icon {
629+
padding-right: 5px;
630+
padding-left: 5px;
631+
}
632+
633+
.social-icon img {
634+
height: 20px;
635+
width: 20px;
636+
}
637+
638+
#generated-by {
639+
position: absolute;
640+
right: 10px;
641+
display: flex;
642+
align-items: center;
643+
}
644+
616645
/* Large Screens */
617646
@media(min-width: 1100px) {
618647
:root {

scaladoc/src/dotty/tools/scaladoc/Scaladoc.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ object Scaladoc:
3838
sourceLinks: List[String] = Nil,
3939
revision: Option[String] = None,
4040
externalMappings: List[ExternalDocLink] = Nil,
41+
socialLinks: List[SocialLinks] = Nil,
4142
identifiersToSkip: List[String] = Nil,
4243
regexesToSkip: List[String] = Nil,
4344
rootDocPath: Option[String] = None

scaladoc/src/dotty/tools/scaladoc/ScaladocArgs.scala

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ class ScaladocArgs extends SettingGroup with CommonScalaSettings:
3636
"Mapping between regexes matching classpath entries and external documentation. " +
3737
"'regex::[scaladoc|scaladoc|javadoc]::path' syntax is used")
3838

39+
val socialLinks: Setting[List[String]] =
40+
MultiStringSetting("-social-links", "social-links",
41+
"Links to social sites. '[github|twitter|gitter|discord]::link' syntax is used. " +
42+
"'custom::link::icon_name' is also allowed, in this case icon must be present in 'images/'' directory.")
43+
3944
val deprecatedSkipPackages: Setting[List[String]] =
4045
MultiStringSetting("-skip-packages", "packages", "Deprecated, please use `-skip-by-id` or `-skip-by-regex`")
4146

@@ -49,7 +54,7 @@ class ScaladocArgs extends SettingGroup with CommonScalaSettings:
4954
StringSetting("-doc-root-content", "path", "The file from which the root package documentation should be imported.", "")
5055

5156
def scaladocSpecificSettings: Set[Setting[_]] =
52-
Set(sourceLinks, syntax, revision, externalDocumentationMappings, skipById, skipByRegex, deprecatedSkipPackages, docRootContent)
57+
Set(sourceLinks, syntax, revision, externalDocumentationMappings, socialLinks, skipById, skipByRegex, deprecatedSkipPackages, docRootContent)
5358

5459
object ScaladocArgs:
5560
def extract(args: List[String], rootCtx: CompilerContext):(Scaladoc.Args, CompilerContext) =
@@ -119,6 +124,14 @@ object ScaladocArgs:
119124
)
120125
)
121126

127+
val socialLinksParsed =
128+
socialLinks.get.flatMap { s =>
129+
SocialLinks.parse(s).fold(left => {
130+
report.warning(left)
131+
None
132+
},right => Some(right))
133+
}
134+
122135
unsupportedSettings.filter(s => s.get != s.default).foreach { s =>
123136
report.warning(s"Setting ${s.name} is currently not supported.")
124137
}
@@ -142,6 +155,7 @@ object ScaladocArgs:
142155
sourceLinks.get,
143156
revision.nonDefault,
144157
externalMappings,
158+
socialLinksParsed,
145159
skipById.get ++ deprecatedSkipPackages.get,
146160
skipByRegex.get,
147161
docRootContent.nonDefault
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package dotty.tools.scaladoc
2+
3+
import java.nio.file.Path
4+
import java.nio.file.Paths
5+
import dotty.tools.dotc.core.Contexts.Context
6+
7+
enum SocialLinks(val url: String, val whiteIconName: String, val blackIconName: String):
8+
case Github(ghUrl: String) extends SocialLinks(ghUrl, "github-icon-white.png", "github-icon-black.png")
9+
case Twitter(tUrl: String) extends SocialLinks(tUrl, "twitter-icon-white.png", "twitter-icon-black.png")
10+
case Gitter(gUrl: String) extends SocialLinks(gUrl, "gitter-icon-white.png", "gitter-icon-black.png")
11+
case Discord(dUrl: String) extends SocialLinks(dUrl, "discord-icon-white.png", "discord-icon-black.png")
12+
case Custom(cUrl: String, cWhiteIconName: String, cBlackIconName: String) extends SocialLinks(cUrl, cWhiteIconName, cBlackIconName)
13+
14+
object SocialLinks:
15+
def parse(s: String): Either[String, SocialLinks] =
16+
val splitted = s.split("::")
17+
if splitted.size < 2 then Left(s"Social links arg $s is invalid.") else
18+
splitted.head match {
19+
case "github" => Right(Github(splitted(1)))
20+
case "twitter" => Right(Twitter(splitted(1)))
21+
case "gitter" => Right(Gitter(splitted(1)))
22+
case "discord" => Right(Discord(splitted(1)))
23+
case "custom" if splitted.size == 4 => Right(Custom(splitted(1), splitted(2), splitted(3)))
24+
case _ => Left(s"Social links arg $s is invalid.")
25+
}

scaladoc/src/dotty/tools/scaladoc/renderers/HtmlRenderer.scala

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,16 @@ class HtmlRenderer(rootPackage: Member, val members: Map[DRI, Member])(using ctx
163163
)
164164
renderNested(navigablePage)._2
165165

166+
private def hasSocialLinks = !args.socialLinks.isEmpty
167+
168+
private def socialLinks(whiteIcon: Boolean = true, additionalClass: String = "") =
169+
val icon = (link: SocialLinks) => if whiteIcon then link.whiteIconName else link.blackIconName
170+
args.socialLinks.map { link =>
171+
a(href := link.url)(
172+
span(cls := s"social-icon $additionalClass", Attr("data-icon-path") := icon(link))
173+
)
174+
}
175+
166176
private def mkFrame(link: Link, parents: Vector[Link], content: => AppliedTag): AppliedTag =
167177
val projectLogo =
168178
args.projectLogo.map { path =>
@@ -186,6 +196,9 @@ class HtmlRenderer(rootPackage: Member, val members: Map[DRI, Member])(using ctx
186196
),
187197
span(
188198
args.projectVersion.map(v => div(cls:="projectVersion")(v)).toList
199+
),
200+
div(id := "lhs-socials")(
201+
socialLinks(additionalClass = "lhs-social")
189202
)
190203
),
191204
div(id := "paneSearch"),
@@ -211,14 +224,20 @@ class HtmlRenderer(rootPackage: Member, val members: Map[DRI, Member])(using ctx
211224
raw("&nbsp;Back to top")
212225
)
213226
),
214-
raw("Generated by&nbsp;"),
215-
a(href := "https://github.com/lampepfl/dotty/tree/master/scaladoc")(
216-
img(
217-
src := resolveRoot(link.dri, "images/scaladoc_logo.svg"),
218-
alt := "scaladoc",
219-
cls := "scaladoc_logo"
227+
div(id := "footer-socials")(
228+
if hasSocialLinks then Seq(raw("Social links&nbsp;")) else Nil,
229+
socialLinks(whiteIcon = false, additionalClass = "footer-social")
230+
),
231+
div(id := "generated-by")(
232+
raw("Generated by&nbsp;"),
233+
a(href := "https://github.com/lampepfl/dotty/tree/master/scaladoc")(
234+
img(
235+
src := resolveRoot(link.dri, "images/scaladoc_logo.svg"),
236+
alt := "scaladoc",
237+
cls := "scaladoc_logo"
238+
)
220239
)
221-
)
222240
)
223241
)
224242
)
243+
)

scaladoc/src/dotty/tools/scaladoc/renderers/Resources.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,14 @@ trait Resources(using ctx: DocContext) extends Locations, Writer:
129129
dottyRes("fonts/dotty-icons.woff"),
130130
dottyRes("fonts/dotty-icons.ttf"),
131131
dottyRes("images/scaladoc_logo.svg"),
132+
dottyRes("images/github-icon-black.png"),
133+
dottyRes("images/github-icon-white.png"),
134+
dottyRes("images/discord-icon-black.png"),
135+
dottyRes("images/discord-icon-white.png"),
136+
dottyRes("images/twitter-icon-black.png"),
137+
dottyRes("images/twitter-icon-white.png"),
138+
dottyRes("images/gitter-icon-black.png"),
139+
dottyRes("images/gitter-icon-white.png"),
132140
searchData(pages)
133141
)
134142

0 commit comments

Comments
 (0)