diff --git a/app/com/ysoft/html/HtmlWithText.scala b/app/com/ysoft/html/HtmlWithText.scala
new file mode 100644
index 0000000..ebc499a
--- /dev/null
+++ b/app/com/ysoft/html/HtmlWithText.scala
@@ -0,0 +1,27 @@
+package com.ysoft.html
+
+import play.twirl.api.{Html, HtmlFormat}
+
+object HtmlWithText{
+
+ def justText(s: String): HtmlWithText = HtmlWithText(html = HtmlFormat.empty, text = s)
+ def justHtml(h: Html): HtmlWithText = HtmlWithText(html = h, text = "")
+ def justHtml(h: String): HtmlWithText = justHtml(Html(h))
+ def plainText(s: String): HtmlWithText = HtmlWithText(text = s, html = HtmlFormat.escape(s))
+
+ implicit class RichHtmlWithTextTraversable(val traversable: Traversable[HtmlWithText]) extends AnyVal {
+ def mkHtmlWithText(textSep: String, htmlSep: Html): HtmlWithText = HtmlWithText(
+ text = traversable.map(_.text).mkString("\n"),
+ html = Html(traversable.map(_.html).mkString(htmlSep.toString()))
+ )
+ def mkHtmlWithText(sep: HtmlWithText): HtmlWithText = mkHtmlWithText(sep.text, sep.html)
+
+ }
+
+}
+case class HtmlWithText(html: Html, text: String){
+ def +(other: HtmlWithText) = HtmlWithText(
+ html = Html(this.html.toString + other.html.toString),
+ text = this.text + other.text
+ )
+}
diff --git a/app/services/EmailExportService.scala b/app/services/EmailExportService.scala
index cc4941d..bef94b2 100644
--- a/app/services/EmailExportService.scala
+++ b/app/services/EmailExportService.scala
@@ -3,15 +3,17 @@ package services
import java.util.NoSuchElementException
import com.mohiva.play.silhouette.api.LoginInfo
+import com.ysoft.html.HtmlWithText
+import com.ysoft.html.HtmlWithText._
import com.ysoft.odc.{Absolutizer, SetDiff}
import controllers._
import models.Change.Direction
import models.{Change, EmailMessageId}
import play.api.libs.mailer.{Email, MailerClient}
+import play.twirl.api.{Html, HtmlFormat}
import scala.concurrent.{ExecutionContext, Future}
-
object EmailExportType extends Enumeration {
val Vulnerabilities = Value("vulnerabilities")
val Digest = Value("digest")
@@ -81,36 +83,45 @@ class EmailExportService(from: String, nobodyInterestedContact: String, val expo
groups = changes.groupBy(_.direction).withDefaultValue(Seq())
} yield {
val changesMarks = Map(Direction.Added -> "❢", Direction.Removed -> "☑")
- def vulnerabilityText(change: Change, vulnerability: Vulnerability) = (
- s"#### ${changesMarks(change.direction)} ${vulnerability.name}${vulnerability.cvssScore.fold("")(sev => s" (CVSS severity: $sev)")}"
- +"\n"+vulnerability.description
- +"\nmore info: "+absolutizer.absolutize(routes.Statistics.vulnerability(vulnerability.name, None))
+ def heading(level: Int)(s: String) = HtmlWithText(
+ html = Html("
") + plainText(vulnerability.description) + justHtml("
") + justText("\n")
+ + moreInfo(absolutizer.absolutize(routes.Statistics.vulnerability(vulnerability.name, None))) + justHtml("