Skip to content

Commit 6191324

Browse files
committed
Add configurable social links to scala3doc
1 parent 8443c16 commit 6191324

17 files changed

+120
-7
lines changed

project/Build.scala

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

scala3doc-js/src/Main.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ package dotty.dokka
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.dokka
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

scala3doc/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 {

scala3doc/src/dotty/dokka/Scala3doc.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ object Scala3doc:
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

scala3doc/src/dotty/dokka/Scala3docArgs.scala

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ class Scala3docArgs extends SettingGroup with CommonScalaSettings:
3636
"Mapping between regexes matching classpath entries and external documentation. " +
3737
"'regex::[scaladoc|scala3doc|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 Scala3docArgs extends SettingGroup with CommonScalaSettings:
4954
StringSetting("-doc-root-content", "path", "The file from which the root package documentation should be imported.", "")
5055

5156
def scala3docSpecificSettings: 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 Scala3docArgs:
5560
def extract(args: List[String], rootCtx: CompilerContext):(Scala3doc.Args, CompilerContext) =
@@ -119,6 +124,14 @@ object Scala3docArgs:
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 Scala3docArgs:
142155
sourceLinks.get,
143156
revision.nonDefault,
144157
externalMappings,
158+
socialLinksParsed,
145159
skipById.get ++ deprecatedSkipPackages.get,
146160
skipByRegex.get,
147161
docRootContent.nonDefault
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package dotty.dokka
2+
3+
import java.nio.file.Path
4+
import java.nio.file.Paths
5+
import dotty.dokka.model.api._
6+
import dotty.tools.dotc.core.Contexts.Context
7+
8+
enum SocialLinks(val url: String, val whiteIconName: String, val blackIconName: String):
9+
case Github(ghUrl: String) extends SocialLinks(ghUrl, "github-icon-white.png", "github-icon-black.png")
10+
case Twitter(tUrl: String) extends SocialLinks(tUrl, "twitter-icon-white.png", "twitter-icon-black.png")
11+
case Gitter(gUrl: String) extends SocialLinks(gUrl, "gitter-icon-white.png", "gitter-icon-black.png")
12+
case Discord(dUrl: String) extends SocialLinks(dUrl, "discord-icon-white.png", "discord-icon-black.png")
13+
case Custom(cUrl: String, cWhiteIconName: String, cBlackIconName: String) extends SocialLinks(cUrl, cWhiteIconName, cBlackIconName)
14+
15+
object SocialLinks:
16+
def parse(s: String): Either[String, SocialLinks] =
17+
val splitted = s.split("::")
18+
if splitted.size < 2 then Left(s"Social links arg $s is invalid.") else
19+
splitted.head match {
20+
case "github" => Right(Github(splitted(1)))
21+
case "twitter" => Right(Twitter(splitted(1)))
22+
case "gitter" => Right(Gitter(splitted(1)))
23+
case "discord" => Right(Discord(splitted(1)))
24+
case "custom" if splitted.size == 4 => Right(Custom(splitted(1), splitted(2), splitted(3)))
25+
case _ => Left(s"Social links arg $s is invalid.")
26+
}

scala3doc/src/dotty/renderers/HtmlRenderer.scala

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

167+
private def hasSocialLinks = !args.socialLinks.isEmpty
168+
169+
private def socialLinks(whiteIcon: Boolean = true, additionalClass: String = "") =
170+
val icon = (link: SocialLinks) => if whiteIcon then link.whiteIconName else link.blackIconName
171+
args.socialLinks.map { link =>
172+
a(href := link.url)(
173+
span(cls := s"social-icon $additionalClass", Attr("data-icon-path") := icon(link))
174+
)
175+
}
176+
167177
private def mkFrame(link: Link, parents: Vector[Link], content: => AppliedTag): AppliedTag =
168178
val projectLogo =
169179
args.projectLogo.map { path =>
@@ -187,6 +197,9 @@ class HtmlRenderer(rootPackage: Member, val members: Map[DRI, Member])(using ctx
187197
),
188198
span(
189199
args.projectVersion.map(v => div(cls:="projectVersion")(v)).toList
200+
),
201+
div(id := "lhs-socials")(
202+
socialLinks(additionalClass = "lhs-social")
190203
)
191204
),
192205
div(id := "paneSearch"),
@@ -212,12 +225,18 @@ class HtmlRenderer(rootPackage: Member, val members: Map[DRI, Member])(using ctx
212225
raw("&nbsp;Back to top")
213226
)
214227
),
215-
raw("Generated by&nbsp;"),
216-
a(href := "https://github.com/lampepfl/dotty/tree/master/scala3doc")(
217-
img(
218-
src := resolveRoot(link.dri, "images/scala3doc_logo.svg"),
219-
alt := "Scala3doc",
220-
cls := "scala3doc_logo"
228+
div(id := "footer-socials")(
229+
if hasSocialLinks then Seq(raw("Social links&nbsp;")) else Nil,
230+
socialLinks(whiteIcon = false, additionalClass = "footer-social")
231+
),
232+
div(id := "generated-by")(
233+
raw("Generated by&nbsp;"),
234+
a(href := "https://github.com/lampepfl/dotty/tree/master/scala3doc")(
235+
img(
236+
src := resolveRoot(link.dri, "images/scala3doc_logo.svg"),
237+
alt := "Scala3doc",
238+
cls := "scala3doc_logo"
239+
)
221240
)
222241
)
223242
)

scala3doc/src/dotty/renderers/Resources.scala

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

0 commit comments

Comments
 (0)