From b4a5276ad908d015f3544438372508b27e8e2229 Mon Sep 17 00:00:00 2001 From: Andrzej Ratajczak Date: Fri, 12 Feb 2021 15:48:02 +0100 Subject: [PATCH] UX scaladoc improvements --- .../src/tests/listindocstring.scala | 35 +++++++++++++++++++ scaladoc/resources/dotty_res/scripts/ux.js | 5 +-- .../resources/dotty_res/styles/scalastyle.css | 13 ++++--- .../scaladoc/renderers/MemberRenderer.scala | 11 +++--- 4 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 scaladoc-testcases/src/tests/listindocstring.scala diff --git a/scaladoc-testcases/src/tests/listindocstring.scala b/scaladoc-testcases/src/tests/listindocstring.scala new file mode 100644 index 000000000000..58574d9ab2e2 --- /dev/null +++ b/scaladoc-testcases/src/tests/listindocstring.scala @@ -0,0 +1,35 @@ +/** + * These are useful methods that exist for both $some and $none. + * * [[isDefined]] — True if not empty + * - [[isEmpty]] — True if empty + * - [[nonEmpty]] — True if not empty + * - [[orElse]] — Evaluate and return alternate optional value if empty + * - [[getOrElse]] — Evaluate and return alternate value if empty + * - [[get]] — Return value, throw exception if empty + * - [[fold]] — Apply function on optional value, return default if empty + * - [[map]] — Apply a function on the optional value + * - [[flatMap]] — Same as map but function must return an optional value + * - [[foreach]] — Apply a procedure on option value + * - [[collect]] — Apply partial pattern match on optional value + * - [[filter]] — An optional value satisfies predicate + * - [[filterNot]] — An optional value doesn't satisfy predicate + * - [[exists]] — Apply predicate on optional value, or false if empty + * - [[forall]] — Apply predicate on optional value, or true if empty + * - [[contains]] — Checks if value equals optional value, or false if empty + * - [[zip]] — Combine two optional values to make a paired optional value + * - [[unzip]] — Split an optional pair to two optional values + * - [[unzip3]] — Split an optional triple to three optional values + * - [[toList]] — Unary list of optional value, otherwise the empty list + */ +trait O + +/** + * Some text + * + * + * Next paragraph + * + * + * Last paragraph + */ +trait K diff --git a/scaladoc/resources/dotty_res/scripts/ux.js b/scaladoc/resources/dotty_res/scripts/ux.js index 92fa00932ae3..710aa6ba3e05 100644 --- a/scaladoc/resources/dotty_res/scripts/ux.js +++ b/scaladoc/resources/dotty_res/scripts/ux.js @@ -9,8 +9,9 @@ window.addEventListener("DOMContentLoaded", () => { var elements = document.getElementsByClassName("documentableElement") if (elements) { for (i = 0; i < elements.length; i++) { - elements[i].onclick = function(){ - this.classList.toggle("expand") + elements[i].onclick = function(e) { + if(!$(e.target).is("a")) + this.classList.toggle("expand") } } } diff --git a/scaladoc/resources/dotty_res/styles/scalastyle.css b/scaladoc/resources/dotty_res/styles/scalastyle.css index 4b5d8aad873b..948a377c9397 100644 --- a/scaladoc/resources/dotty_res/styles/scalastyle.css +++ b/scaladoc/resources/dotty_res/styles/scalastyle.css @@ -12,7 +12,7 @@ --inactive-fg: #777; --title-fg: #00485E; - --link-sig-fd: #7c99a5; + --link-sig-fd: #2da0d1; --link-sig-hover-fd: #7c99a5; --leftbar-bg: #003048; @@ -155,7 +155,9 @@ th { /* Navigation */ #sideMenu2 { - overflow-y: auto; + overflow: auto; + overflow-x: hidden; + overflow-y: scroll; scrollbar-width: thin; height: 100%; font-size: var(--leftbar-font-size); @@ -206,7 +208,7 @@ th { margin-top: 1px; margin-bottom: 1px; width: 100%; - /* This trick adds selected bachground stratching to the lef side of screen */ + /* This trick adds selected background stretching to the left side of screen */ margin-left: calc(0px - var(--side-width)); padding-left: var(--side-width); width: calc(2 * var(--side-width)); @@ -490,7 +492,7 @@ footer .pull-right { } .documentableElement .signature { - color: gray; + color: #5a5a5a; display: table-cell; white-space: pre-wrap; } @@ -775,3 +777,6 @@ footer .socials { } } +footer { + background-color: white; +} diff --git a/scaladoc/src/dotty/tools/scaladoc/renderers/MemberRenderer.scala b/scaladoc/src/dotty/tools/scaladoc/renderers/MemberRenderer.scala index 8a41b4e93ca4..4433bf06ead9 100644 --- a/scaladoc/src/dotty/tools/scaladoc/renderers/MemberRenderer.scala +++ b/scaladoc/src/dotty/tools/scaladoc/renderers/MemberRenderer.scala @@ -173,16 +173,19 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext ) ) - private case class MGroup(header: AppliedTag, members: Seq[Member]) + private case class MGroup(header: AppliedTag, members: Seq[Member], groupName: String) private def actualGroup(name: String, members: Seq[Member | MGroup]): Seq[AppliedTag] = if members.isEmpty then Nil else div(cls := "documentableList")( h3(cls:="groupHeader")(name), - members.map { + members.sortBy { + case m: Member => m.name + case MGroup(_, _, name) => name + }.map { case element: Member => member(element) - case MGroup(header, members) => + case MGroup(header, members, _) => div( header, members.map(member) @@ -255,7 +258,7 @@ class MemberRenderer(signatureRenderer: SignatureRenderer)(using DocContext) ext }.collect { case (Some(on), members) => val sig = Signature(s"extension (${on.name}: ") ++ on.signature ++ Signature(")") - MGroup(span(sig.map(renderElement)), members.toSeq) + MGroup(span(sig.map(renderElement)), members.sortBy(_.name).toSeq, on.name) }.toSeq div(cls := "membersList")(renderTabs(