Skip to content

Commit

Permalink
Rendering worksheets fixed (#211)
Browse files Browse the repository at this point in the history
Rendering worksheets fixed
  • Loading branch information
olafurpg authored Dec 3, 2019
2 parents ae7613d + c6ce459 commit 3afbd52
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 58 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ public abstract class EvaluatedWorksheetStatement {
public abstract RangePosition position();
public abstract String summary();
public abstract String details();
public abstract boolean isSummaryComplete();

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ import mdoc.interfaces.RangePosition
case class EvaluatedWorksheetStatement(
val position: RangePosition,
val summary: String,
val details: String
val details: String,
val isSummaryComplete: Boolean
) extends mdoc.interfaces.EvaluatedWorksheetStatement
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import scala.meta._
import mdoc.internal.cli.Context
import scala.collection.JavaConverters._
import mdoc.internal.markdown.SectionInput
import scala.meta.parsers.Parsed.Success
import mdoc.internal.markdown.Modifier
import mdoc.internal.markdown.Instrumenter
import mdoc.internal.markdown.MarkdownCompiler
Expand All @@ -14,15 +13,13 @@ import mdoc.internal.cli.Settings
import pprint.TPrintColors
import pprint.PPrinter.BlackWhite
import mdoc.internal.io.StoreReporter
import mdoc.interfaces.Diagnostic
import mdoc.{interfaces => i}
import mdoc.internal.markdown.MdocDialect

class WorksheetProvider(settings: Settings) {

private val reporter = new StoreReporter()

private val commentHeader = " // "
// The smallest column width that worksheet values will use for rendering
// worksheet decorations.
private val minimumMargin = 20
Expand Down Expand Up @@ -54,8 +51,8 @@ class WorksheetProvider(settings: Settings) {

EvaluatedWorksheet(
reporter.diagnostics.map(d => d: i.Diagnostic).toSeq.asJava,
decorations.toIterator
.filterNot(_.summary == commentHeader)
decorations
.filterNot(_.summary.isEmpty)
.map(d => d: i.EvaluatedWorksheetStatement)
.toList
.asJava
Expand All @@ -75,21 +72,26 @@ class WorksheetProvider(settings: Settings) {
settings.screenWidth - statement.position.endColumn
)
val isEmptyValue = isUnitType(statement) || statement.binders.isEmpty
val contentText = renderContentText(statement, margin, isEmptyValue)
val hoverMessage = renderHoverMessage(statement, margin, isEmptyValue)
EvaluatedWorksheetStatement(range, contentText, hoverMessage)
val renderSummaryResult =
renderSummary(statement, margin, isEmptyValue)
val details = renderDetails(statement, isEmptyValue)
EvaluatedWorksheetStatement(
range,
renderSummaryResult.summary,
details,
renderSummaryResult.isSummaryComplete
)
}

private def renderHoverMessage(
private def renderDetails(
statement: Statement,
margin: Int,
isEmptyValue: Boolean
): String = {
val out = new StringBuilder()
if (!isEmptyValue) {
statement.binders.iterator.foreach { binder =>
out
.append("\n")
.append(if (out.nonEmpty) "\n" else "")
.append(binder.name)
.append(": ")
.append(binder.tpe.render(TPrintColors.BlackWhite))
Expand All @@ -100,46 +102,53 @@ class WorksheetProvider(settings: Settings) {
}
}
statement.out.linesIterator.foreach { line =>
out.append("\n// ").append(line)
out
.append(if (out.nonEmpty) "\n" else "")
.append("// ")
.append(line)
}
out.toString()
}

private def renderContentText(
private def renderSummary(
statement: Statement,
margin: Int,
isEmptyValue: Boolean
): String = {
): RenderSummaryResult = {
val out = new StringBuilder()
out.append(commentHeader)
if (isEmptyValue) {
if (!statement.out.isEmpty()) {
out.append(statement.out.linesIterator.next())
}
} else {
val isSingle = statement.binders.lengthCompare(1) == 0
statement.binders.iterator.zipWithIndex.foreach {
case (binder, i) =>
if (!isSingle) {
out
.append(if (i == 0) "" else ", ")
.append(binder.name)
.append("=")
}
val truncatedLine = BlackWhite
.tokenize(binder.value, width = margin, height = settings.screenHeight)
.map(_.getChars)
.filterNot(_.iterator.forall(_.isWhitespace))
.flatMap(_.iterator)
.filter {
case '\n' => false
case _ => true
val isOverMargin =
if (isEmptyValue) {
if (!statement.out.isEmpty()) {
val lines = statement.out.linesIterator
out.append(lines.next())
lines.hasNext || out.length > margin
} else
false
} else {
val isSingle = statement.binders.lengthCompare(1) == 0
statement.binders.iterator.foldLeft(false) {
case (true, _) => true
case (false, binder) =>
if (!isSingle) {
out
.append(if (out.isEmpty) "" else ", ")
.append(binder.name)
.append("=")
}
.take(margin)
out.appendAll(truncatedLine)
val chunk = BlackWhite
.tokenize(binder.value, width = margin - out.length)
.map(_.getChars)
.filterNot(_.iterator.forall(_.isWhitespace))
.flatMap(_.iterator)
.filter {
case '\n' => false
case _ => true
}
out.appendAll(chunk)
out.length > margin
}
}
}
out.toString()
RenderSummaryResult(out.result().take(margin), isSummaryComplete = !isOverMargin)
}

private def isUnitType(statement: Statement): Boolean = {
Expand All @@ -150,3 +159,5 @@ class WorksheetProvider(settings: Settings) {

}
}

case class RenderSummaryResult(summary: String, isSummaryComplete: Boolean)
21 changes: 5 additions & 16 deletions tests/unit/src/test/scala/tests/worksheets/WorksheetSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,13 @@ package tests.worksheets
import java.lang.StringBuilder
import org.scalatest.FunSuite
import org.scalatest.BeforeAndAfterAll
import mdoc.interfaces.Mdoc
import mdoc.interfaces.{DiagnosticSeverity, Mdoc}
import scala.meta.testkit.DiffAssertions
import scala.collection.JavaConverters._
import scala.meta.inputs.Input
import scala.meta.inputs.Position
import mdoc.document.RangePosition
import mdoc.internal.pos.PositionSyntax._
import mdoc.interfaces.DiagnosticSeverity
import java.{util => ju}
import mdoc.PostModifier

class WorksheetSuite extends FunSuite with BeforeAndAfterAll with DiffAssertions {
var mdoc = ju.ServiceLoader
Expand Down Expand Up @@ -84,7 +81,9 @@ class WorksheetSuite extends FunSuite with BeforeAndAfterAll with DiffAssertions
.append("<")
.append(p.text)
.append(">")
.append(" // ")
.append(stat.summary())
.append(if (!stat.isSummaryComplete) "..." else "")
.append("\n")
.append(stat.details())
i = p.end
Expand All @@ -101,7 +100,6 @@ class WorksheetSuite extends FunSuite with BeforeAndAfterAll with DiffAssertions
|""".stripMargin,
"""|
|<val x = 1.to(4).toVector> // Vector(1, 2, 3, 4)
|
|x: Vector[Int] = Vector(1, 2, 3, 4)
|""".stripMargin
)
Expand All @@ -113,7 +111,6 @@ class WorksheetSuite extends FunSuite with BeforeAndAfterAll with DiffAssertions
|""".stripMargin,
"""|
|<val List(x, y) = List(1, 2)> // x=1, y=2
|
|x: Int = 1
|y: Int = 2
|""".stripMargin
Expand All @@ -125,8 +122,7 @@ class WorksheetSuite extends FunSuite with BeforeAndAfterAll with DiffAssertions
|Stream.from(10)
|""".stripMargin,
"""|
|<Stream.from(10)> // Stream(10,11,12,...
|
|<Stream.from(10)> // Stream(10,11,12,13,1...
|res0: Stream[Int] = Stream(
| 10,
| 11,
Expand All @@ -141,8 +137,7 @@ class WorksheetSuite extends FunSuite with BeforeAndAfterAll with DiffAssertions
|println(1.to(3).mkString(";\n"))
|""".stripMargin,
"""|
|<println(1.to(3).mkString(";\n"))> // 1;
|
|<println(1.to(3).mkString(";\n"))> // 1;...
|// 1;
|// 2;
|// 3
Expand All @@ -162,7 +157,6 @@ class WorksheetSuite extends FunSuite with BeforeAndAfterAll with DiffAssertions
| println("hello")
| 42
|}> // 42
|
|x: Int = 42
|// hello
|""".stripMargin
Expand All @@ -177,13 +171,10 @@ class WorksheetSuite extends FunSuite with BeforeAndAfterAll with DiffAssertions
|""".stripMargin,
"""|
|<val n = 10> // 10
|
|n: Int = 10
|<println(n)> // 10
|
|// 10
|<val m = n * 10> // 100
|
|m: Int = 100
|""".stripMargin
)
Expand All @@ -195,7 +186,6 @@ class WorksheetSuite extends FunSuite with BeforeAndAfterAll with DiffAssertions
|""".stripMargin,
"""|import scala.concurrent.Future
|<val n = Future.successful(10)> // Future(Success(10))
|
|n: Future[Int] = Future(Success(10))
|""".stripMargin
)
Expand All @@ -207,7 +197,6 @@ class WorksheetSuite extends FunSuite with BeforeAndAfterAll with DiffAssertions
|""".stripMargin,
"""|case class User(name: String)
|<val n = User("Susan")> // User("Susan")
|
|n: User = User("Susan")
|""".stripMargin
)
Expand Down

0 comments on commit 3afbd52

Please sign in to comment.