Skip to content

Commit a1d3ce5

Browse files
committed
Integrate Scastie into Scaladoc.
1 parent 68044a6 commit a1d3ce5

30 files changed

+14355
-23
lines changed

project/Build.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1416,7 +1416,7 @@ object Build {
14161416
"scaladoc testcases",
14171417
"scaladoc/output/testcases",
14181418
"master",
1419-
Seq("-usejavacp")
1419+
Seq("-usejavacp", "-snippet-compiler:scaladoc-testcases/docs=compile", "-siteroot", "scaladoc-testcases/docs")
14201420
)
14211421
}.value,
14221422

scaladoc-js/resources/code-snippets.css

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,98 @@ input:checked + .slider:before {
194194
display: none;
195195
}
196196

197+
.snippet .scastie.embedded {
198+
width: 100%;
199+
}
200+
201+
.snippet .scastie.embedded .content {
202+
height: unset;
203+
}
204+
205+
.snippet .scastie.embedded .editor-container {
206+
height: unset;
207+
}
208+
209+
.snippet .scastie.embedded .editor-container .code {
210+
height: unset;
211+
}
212+
213+
.snippet .scastie.embedded .editor-container .editor-wrapper {
214+
padding-top: 48px;
215+
height: unset;
216+
}
217+
218+
.snippet .scastie .CodeMirror, .snippet .scastie .CodeMirror-scroll {
219+
height:unset;
220+
}
221+
222+
.snippet .scastie.embedded .editor-container .code .CodeMirror-scroll {
223+
height:unset !important;
224+
min-height: 50px !important;
225+
}
226+
227+
.snippet .scastie .editor-container .console-container .console {
228+
height: unset !important;
229+
}
230+
231+
.snippet .scastie .CodeMirror-gutters {
232+
background-color: var(--code-bg) !important;
233+
}
234+
235+
.snippet .scastie .CodeMirror {
236+
color: var(--code-fg) !important;
237+
background-color: var(--code-bg) !important;
238+
}
239+
240+
.snippet .scastie .embedded-menu > * {
241+
background-color: transparent !important;
242+
color: var(--active-fg) !important;
243+
width: 64px;
244+
font-size: 1em;
245+
padding: 8px;
246+
position: unset;
247+
}
248+
249+
.snippet .scastie .embedded-menu li:hover {
250+
background-color: var(--active-bg) !important;
251+
}
252+
253+
.snippet .scastie .embedded-menu {
254+
margin: 15px;
255+
display: block;
256+
}
257+
258+
.snippet .scastie .embedded-menu > li {
259+
display: unset;
260+
border: unset;
261+
transition-duration: 0.4s;
262+
}
263+
264+
:root.theme-dark .snippet .scastie .embedded-menu > .logo img {
265+
filter: unset;
266+
}
267+
:root .snippet .scastie .embedded-menu > .logo img {
268+
filter: invert(100%) hue-rotate(180deg);
269+
}
270+
271+
272+
.snippet .scastie .output-console pre {
273+
color: white;
274+
background-color: rgb(0, 43, 54);
275+
}
276+
277+
.snippet .scastie .app.light .editor-container .handler {
278+
background-color: var(--code-bg) !important;
279+
}
280+
281+
.snippet .scastie .console-container {
282+
margin-left: 30px;
283+
}
284+
285+
.snippet .scastie .main-panel {
286+
background-color: unset !important;
287+
}
288+
197289
@media(max-width: 576px) {
198290
.snippet-showhide {
199291
--slider-width: 32px;

scaladoc-js/src/code-snippets/CodeSnippets.scala

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package dotty.tools.scaladoc
22

3+
import scala.scalajs.js
34
import org.scalajs.dom._
45
import org.scalajs.dom.ext._
56

7+
import CodeSnippetsGlobals._
8+
69
class CodeSnippets:
710

811
private def getButtonsSection(snippet: html.Element): Option[html.Div] = snippet.querySelector("div.buttons") match {
@@ -12,7 +15,7 @@ class CodeSnippets:
1215

1316
def enrichSnippets() = document.querySelectorAll("div.snippet").foreach {
1417
case snippet: html.Element =>
15-
snippet.addEventListener("click", e => e.stopPropagation())
18+
snippet.addEventListener("click", (e: MouseEvent) => e.asInstanceOf[js.Dynamic].fromSnippet = true)
1619
snippetAnchor(snippet)
1720
handleHideableCode(snippet)
1821
handleImportedCode(snippet)
@@ -109,20 +112,41 @@ class CodeSnippets:
109112
val div = document.createElement("div")
110113
val button = document.createElement("button").asInstanceOf[html.Button]
111114
val icon = document.createElement("i")
112-
icon.classList.add("fas")
113-
icon.classList.add("fa-play")
115+
def initialState() = {
116+
icon.classList.add("fas")
117+
icon.classList.add("fa-play")
118+
button.setAttribute("state", "run")
119+
}
120+
def toggleState() = {
121+
icon.classList.toggle("fa-play")
122+
icon.classList.toggle("fa-times")
123+
if button.getAttribute("state") == "run" then button.setAttribute("state", "exit")
124+
else button.setAttribute("state", "run")
125+
}
126+
initialState()
114127
button.appendChild(icon)
115128
button.classList.add("run-button")
116-
button.addEventListener("click", _ => {}) // TODO: Run button #13065
117-
button.disabled = true
129+
button.addEventListener("click", _ =>
130+
if button.getAttribute("state") == "run" then
131+
scastie.Embedded(snippet.querySelector("pre"))
132+
else
133+
snippet.querySelector("pre") match {
134+
case p: html.Element => p.style = ""
135+
case _ =>
136+
}
137+
snippet.querySelector(".scastie.embedded") match {
138+
case s: html.Element => snippet.removeChild(s)
139+
case _ =>
140+
}
141+
toggleState()
142+
)
118143
div.appendChild(button)
119144
div
120145
}
121146
val buttonsSection = getButtonsSection(snippet)
122147
buttonsSection.foreach(s =>
123148
s.appendChild(copyButton)
124-
// Temporarily disabled
125-
// s.appendChild(runButton)
149+
if !snippet.hasAttribute("hasContext") then s.appendChild(runButton)
126150
)
127151
}
128152

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package dotty.tools.scaladoc
2+
3+
import scala.scalajs.js
4+
import scala.scalajs.js.annotation.JSGlobalScope
5+
6+
@js.native
7+
@JSGlobalScope
8+
object CodeSnippetsGlobals extends js.Object {
9+
val scastie: Scastie = js.native
10+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package dotty.tools.scaladoc
2+
3+
import scala.scalajs.js
4+
import org.scalajs.dom._
5+
6+
@js.native
7+
trait Scastie extends js.Object:
8+
def Embedded(selector: String | Node, config: js.Dynamic): Unit = js.native
9+
def Embedded(selector: String | Node): Unit = js.native

scaladoc-testcases/docs/docs/index.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,15 @@
33

44
---
55

6-
```scala sc:compile
7-
2 + List(0)
6+
```scala
7+
val someVariable: Int = 2
88
```
99

10-
```scala sc:compile
11-
new snippetCompiler.Snippet0 { }
10+
```scala sc:fail
11+
trait RenderingContext
12+
class Renderer(using RenderingContext)
13+
val renderer: Renderer = Renderer()
1214
```
1315

16+
17+

scaladoc/resources/dotty_res/scripts/ux.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ window.addEventListener("DOMContentLoaded", () => {
1010
if (elements) {
1111
for (i = 0; i < elements.length; i++) {
1212
elements[i].onclick = function(e) {
13-
if(!$(e.target).is("a"))
13+
if(!$(e.target).is("a") && e.fromSnippet !== true)
1414
this.classList.toggle("expand")
1515
}
1616
}

0 commit comments

Comments
 (0)