From a06f88d96a3d016e4f7dd3209158b9398018a734 Mon Sep 17 00:00:00 2001 From: Gunnar Velle Date: Tue, 22 Oct 2024 12:15:06 +0200 Subject: [PATCH 1/4] Remove strong from titles --- .../V54__RemoveStrongFromTitle.scala | 90 ++++++++++++++++++ .../V54__RemoveStrongFromTitleTest.scala | 31 +++++++ .../V65__RemoveStrongFromTitle.scala | 92 +++++++++++++++++++ .../V65__RemoveStrongFromTitleTest.scala | 31 +++++++ 4 files changed, 244 insertions(+) create mode 100644 article-api/src/main/scala/no/ndla/articleapi/db/migration/V54__RemoveStrongFromTitle.scala create mode 100644 article-api/src/test/scala/no/ndla/articleapi/db/migration/V54__RemoveStrongFromTitleTest.scala create mode 100644 draft-api/src/main/scala/no/ndla/draftapi/db/migration/V65__RemoveStrongFromTitle.scala create mode 100644 draft-api/src/test/scala/no/ndla/draftapi/db/migration/V65__RemoveStrongFromTitleTest.scala diff --git a/article-api/src/main/scala/no/ndla/articleapi/db/migration/V54__RemoveStrongFromTitle.scala b/article-api/src/main/scala/no/ndla/articleapi/db/migration/V54__RemoveStrongFromTitle.scala new file mode 100644 index 0000000000..985604c17e --- /dev/null +++ b/article-api/src/main/scala/no/ndla/articleapi/db/migration/V54__RemoveStrongFromTitle.scala @@ -0,0 +1,90 @@ +/* + * Part of NDLA article-api + * Copyright (C) 2024 NDLA + * + * See LICENSE + */ + +package no.ndla.articleapi.db.migration + +import io.circe.parser +import io.circe.syntax.EncoderOps +import no.ndla.common.model.domain.Title +import no.ndla.common.model.domain.article.Article +import org.flywaydb.core.api.migration.{BaseJavaMigration, Context} +import org.jsoup.Jsoup +import org.jsoup.nodes.Element +import org.jsoup.nodes.Entities.EscapeMode +import org.postgresql.util.PGobject +import scalikejdbc.{DB, DBSession, *} + +class V54__RemoveStrongFromTitle extends BaseJavaMigration { + private def countAllRows(implicit session: DBSession): Option[Long] = { + sql"select count(*) from contentdata where document is not NULL" + .map(rs => rs.long("count")) + .single() + } + + private def allRows(offset: Long)(implicit session: DBSession): Seq[(Long, String)] = { + sql"select id, document, article_id from contentdata where document is not null order by id limit 1000 offset $offset" + .map(rs => { + (rs.long("id"), rs.string("document")) + }) + .list() + } + + private def updateRow(document: String, id: Long)(implicit session: DBSession): Int = { + val dataObject = new PGobject() + dataObject.setType("jsonb") + dataObject.setValue(document) + + sql"update contentdata set document = $dataObject where id = $id" + .update() + } + + override def migrate(context: Context): Unit = DB(context.getConnection) + .autoClose(false) + .withinTx { session => migrateRows(session) } + + private def migrateRows(implicit session: DBSession): Unit = { + val count = countAllRows.get + var numPagesLeft = (count / 1000) + 1 + var offset = 0L + + while (numPagesLeft > 0) { + allRows(offset * 1000).map { case (id, document) => + updateRow(convertArticleUpdate(document), id) + }: Unit + numPagesLeft -= 1 + offset += 1 + } + } + + private def stringToJsoupDocument(htmlString: String): Element = { + val document = Jsoup.parseBodyFragment(htmlString) + document.outputSettings().escapeMode(EscapeMode.xhtml).prettyPrint(false) + document.select("body").first() + } + + private def jsoupDocumentToString(element: Element): String = { + element.select("body").html() + } + + def convertTitle(t: Title): Title = { + val doc = stringToJsoupDocument(t.title) + + doc + .select("strong") + .forEach(strong => { + strong.unwrap(): Unit + }) + t.copy(title = jsoupDocumentToString(doc)) + } + + private[migration] def convertArticleUpdate(document: String): String = { + val oldArticle = parser.parse(document).flatMap(_.as[Article]).toTry.get + val converted = oldArticle.title.map(t => convertTitle(t)) + val newArticle = oldArticle.copy(title = converted) + newArticle.asJson.noSpaces + } +} diff --git a/article-api/src/test/scala/no/ndla/articleapi/db/migration/V54__RemoveStrongFromTitleTest.scala b/article-api/src/test/scala/no/ndla/articleapi/db/migration/V54__RemoveStrongFromTitleTest.scala new file mode 100644 index 0000000000..988494da15 --- /dev/null +++ b/article-api/src/test/scala/no/ndla/articleapi/db/migration/V54__RemoveStrongFromTitleTest.scala @@ -0,0 +1,31 @@ +/* + * Part of NDLA article-api + * Copyright (C) 2024 NDLA + * + * See LICENSE + */ + +package no.ndla.articleapi.db.migration + +import no.ndla.articleapi.{TestEnvironment, UnitSuite} +import no.ndla.common.model.domain.Title + +class V54__RemoveStrongFromTitleTest extends UnitSuite with TestEnvironment { + test("That strong are removed from title") { + val oldTitle = Title("This is a title", language = "nb") + val expectedTitle = Title("This is a title", language = "nb") + + val migration = new V54__RemoveStrongFromTitle + val result = migration.convertTitle(oldTitle) + result should be(expectedTitle) + } + + test("That nested strong are removed from title") { + val oldTitle = Title("This is a title", language = "nb") + val expectedTitle = Title("This is a title", language = "nb") + + val migration = new V54__RemoveStrongFromTitle + val result = migration.convertTitle(oldTitle) + result should be(expectedTitle) + } +} diff --git a/draft-api/src/main/scala/no/ndla/draftapi/db/migration/V65__RemoveStrongFromTitle.scala b/draft-api/src/main/scala/no/ndla/draftapi/db/migration/V65__RemoveStrongFromTitle.scala new file mode 100644 index 0000000000..0e44d2832d --- /dev/null +++ b/draft-api/src/main/scala/no/ndla/draftapi/db/migration/V65__RemoveStrongFromTitle.scala @@ -0,0 +1,92 @@ +/* + * Part of NDLA draft-api + * Copyright (C) 2024 NDLA + * + * See LICENSE + */ + +package no.ndla.draftapi.db.migration + +import io.circe.parser +import io.circe.syntax.EncoderOps +import no.ndla.common.model.domain.Title +import no.ndla.common.model.domain.draft.Draft +import org.flywaydb.core.api.migration.{BaseJavaMigration, Context} +import org.jsoup.Jsoup +import org.jsoup.nodes.Element +import org.jsoup.nodes.Entities.EscapeMode +import org.postgresql.util.PGobject +import scalikejdbc.{DB, DBSession, *} + +class V65__RemoveStrongFromTitle extends BaseJavaMigration { + private def countAllRows(implicit session: DBSession): Option[Long] = { + sql"select count(*) from articledata where document is not NULL" + .map(rs => rs.long("count")) + .single() + } + + private def allRows(offset: Long)(implicit session: DBSession): Seq[(Long, String)] = { + sql"select id, document, article_id from articledata where document is not null order by id limit 1000 offset $offset" + .map(rs => { + (rs.long("id"), rs.string("document")) + }) + .list() + } + + private def updateRow(document: String, id: Long)(implicit session: DBSession): Int = { + val dataObject = new PGobject() + dataObject.setType("jsonb") + dataObject.setValue(document) + + sql"update articledata set document = $dataObject where id = $id" + .update() + } + + override def migrate(context: Context): Unit = DB(context.getConnection) + .autoClose(false) + .withinTx { session => migrateRows(session) } + + private def migrateRows(implicit session: DBSession): Unit = { + val count = countAllRows.get + var numPagesLeft = (count / 1000) + 1 + var offset = 0L + + while (numPagesLeft > 0) { + allRows(offset * 1000).map { case (id, document) => + updateRow(convertArticleUpdate(document), id) + }: Unit + numPagesLeft -= 1 + offset += 1 + } + } + + private def stringToJsoupDocument(htmlString: String): Element = { + val document = Jsoup.parseBodyFragment(htmlString) + document.outputSettings().escapeMode(EscapeMode.xhtml).prettyPrint(false) + document.select("body").first() + } + + private def jsoupDocumentToString(element: Element): String = { + element.select("body").html() + } + + def convertTitle(t: Title): Title = { + val doc = stringToJsoupDocument(t.title) + + doc + .select("strong") + .forEach(strong => { + strong.unwrap(): Unit + }) + t.copy(title = jsoupDocumentToString(doc)) + } + + private[migration] def convertArticleUpdate(document: String): String = { + val oldArticle = parser.parse(document).flatMap(_.as[Draft]).toTry.get + + val converted = oldArticle.title.map(t => convertTitle(t)) + + val newArticle = oldArticle.copy(title = converted) + newArticle.asJson.noSpaces + } +} diff --git a/draft-api/src/test/scala/no/ndla/draftapi/db/migration/V65__RemoveStrongFromTitleTest.scala b/draft-api/src/test/scala/no/ndla/draftapi/db/migration/V65__RemoveStrongFromTitleTest.scala new file mode 100644 index 0000000000..d28c473268 --- /dev/null +++ b/draft-api/src/test/scala/no/ndla/draftapi/db/migration/V65__RemoveStrongFromTitleTest.scala @@ -0,0 +1,31 @@ +/* + * Part of NDLA draft-api + * Copyright (C) 2024 NDLA + * + * See LICENSE + */ + +package no.ndla.draftapi.db.migration + +import no.ndla.common.model.domain.Title +import no.ndla.draftapi.{TestEnvironment, UnitSuite} + +class V65__RemoveStrongFromTitleTest extends UnitSuite with TestEnvironment { + test("That strong are removed from title") { + val oldTitle = Title("This is a title", language = "nb") + val expectedTitle = Title("This is a title", language = "nb") + + val migration = new V65__RemoveStrongFromTitle + val result = migration.convertTitle(oldTitle) + result should be(expectedTitle) + } + + test("That nested strong are removed from title") { + val oldTitle = Title("This is a title", language = "nb") + val expectedTitle = Title("This is a title", language = "nb") + + val migration = new V65__RemoveStrongFromTitle + val result = migration.convertTitle(oldTitle) + result should be(expectedTitle) + } +} From 0117192526ef5b4b972f42010a246b00b94285e0 Mon Sep 17 00:00:00 2001 From: Gunnar Velle Date: Wed, 23 Oct 2024 08:41:58 +0200 Subject: [PATCH 2/4] Also convert titles in article content --- .../migration/V54__RemoveStrongFromTitle.scala | 18 +++++++++++++++--- .../V54__RemoveStrongFromTitleTest.scala | 12 +++++++++++- .../migration/V65__RemoveStrongFromTitle.scala | 18 +++++++++++++++--- .../V65__RemoveStrongFromTitleTest.scala | 12 +++++++++++- 4 files changed, 52 insertions(+), 8 deletions(-) diff --git a/article-api/src/main/scala/no/ndla/articleapi/db/migration/V54__RemoveStrongFromTitle.scala b/article-api/src/main/scala/no/ndla/articleapi/db/migration/V54__RemoveStrongFromTitle.scala index 985604c17e..c15af56f4e 100644 --- a/article-api/src/main/scala/no/ndla/articleapi/db/migration/V54__RemoveStrongFromTitle.scala +++ b/article-api/src/main/scala/no/ndla/articleapi/db/migration/V54__RemoveStrongFromTitle.scala @@ -9,7 +9,7 @@ package no.ndla.articleapi.db.migration import io.circe.parser import io.circe.syntax.EncoderOps -import no.ndla.common.model.domain.Title +import no.ndla.common.model.domain.{ArticleContent, Title} import no.ndla.common.model.domain.article.Article import org.flywaydb.core.api.migration.{BaseJavaMigration, Context} import org.jsoup.Jsoup @@ -81,10 +81,22 @@ class V54__RemoveStrongFromTitle extends BaseJavaMigration { t.copy(title = jsoupDocumentToString(doc)) } + def convertContent(c: ArticleContent): ArticleContent = { + val doc = stringToJsoupDocument(c.content) + + doc + .select("h2, h3, h4") + .forEach(header => { + header.select("strong").forEach(strong => strong.unwrap(): Unit) + }) + c.copy(content = jsoupDocumentToString(doc)) + } + private[migration] def convertArticleUpdate(document: String): String = { val oldArticle = parser.parse(document).flatMap(_.as[Article]).toTry.get - val converted = oldArticle.title.map(t => convertTitle(t)) - val newArticle = oldArticle.copy(title = converted) + val titles = oldArticle.title.map(t => convertTitle(t)) + val contents = oldArticle.content.map(c => convertContent(c)) + val newArticle = oldArticle.copy(title = titles, content = contents) newArticle.asJson.noSpaces } } diff --git a/article-api/src/test/scala/no/ndla/articleapi/db/migration/V54__RemoveStrongFromTitleTest.scala b/article-api/src/test/scala/no/ndla/articleapi/db/migration/V54__RemoveStrongFromTitleTest.scala index 988494da15..dd0b57599e 100644 --- a/article-api/src/test/scala/no/ndla/articleapi/db/migration/V54__RemoveStrongFromTitleTest.scala +++ b/article-api/src/test/scala/no/ndla/articleapi/db/migration/V54__RemoveStrongFromTitleTest.scala @@ -8,7 +8,7 @@ package no.ndla.articleapi.db.migration import no.ndla.articleapi.{TestEnvironment, UnitSuite} -import no.ndla.common.model.domain.Title +import no.ndla.common.model.domain.{ArticleContent, Title} class V54__RemoveStrongFromTitleTest extends UnitSuite with TestEnvironment { test("That strong are removed from title") { @@ -28,4 +28,14 @@ class V54__RemoveStrongFromTitleTest extends UnitSuite with TestEnvironment { val result = migration.convertTitle(oldTitle) result should be(expectedTitle) } + + test("That strong are removed from title in article") { + val oldContent = ArticleContent("

This is a title

Some text

", language = "nb") + val expectedContent = ArticleContent("

This is a title

Some text

", language = "nb") + + val migration = new V54__RemoveStrongFromTitle + val result = migration.convertContent(oldContent) + result should be(expectedContent) + } + } diff --git a/draft-api/src/main/scala/no/ndla/draftapi/db/migration/V65__RemoveStrongFromTitle.scala b/draft-api/src/main/scala/no/ndla/draftapi/db/migration/V65__RemoveStrongFromTitle.scala index 0e44d2832d..cd62ab8119 100644 --- a/draft-api/src/main/scala/no/ndla/draftapi/db/migration/V65__RemoveStrongFromTitle.scala +++ b/draft-api/src/main/scala/no/ndla/draftapi/db/migration/V65__RemoveStrongFromTitle.scala @@ -9,7 +9,7 @@ package no.ndla.draftapi.db.migration import io.circe.parser import io.circe.syntax.EncoderOps -import no.ndla.common.model.domain.Title +import no.ndla.common.model.domain.{ArticleContent, Title} import no.ndla.common.model.domain.draft.Draft import org.flywaydb.core.api.migration.{BaseJavaMigration, Context} import org.jsoup.Jsoup @@ -81,12 +81,24 @@ class V65__RemoveStrongFromTitle extends BaseJavaMigration { t.copy(title = jsoupDocumentToString(doc)) } + def convertContent(c: ArticleContent): ArticleContent = { + val doc = stringToJsoupDocument(c.content) + + doc + .select("h2, h3, h4") + .forEach(header => { + header.select("strong").forEach(strong => strong.unwrap(): Unit) + }) + c.copy(content = jsoupDocumentToString(doc)) + } + private[migration] def convertArticleUpdate(document: String): String = { val oldArticle = parser.parse(document).flatMap(_.as[Draft]).toTry.get - val converted = oldArticle.title.map(t => convertTitle(t)) + val titles = oldArticle.title.map(t => convertTitle(t)) + val contents = oldArticle.content.map(c => convertContent(c)) - val newArticle = oldArticle.copy(title = converted) + val newArticle = oldArticle.copy(title = titles, content = contents) newArticle.asJson.noSpaces } } diff --git a/draft-api/src/test/scala/no/ndla/draftapi/db/migration/V65__RemoveStrongFromTitleTest.scala b/draft-api/src/test/scala/no/ndla/draftapi/db/migration/V65__RemoveStrongFromTitleTest.scala index d28c473268..923684c3c2 100644 --- a/draft-api/src/test/scala/no/ndla/draftapi/db/migration/V65__RemoveStrongFromTitleTest.scala +++ b/draft-api/src/test/scala/no/ndla/draftapi/db/migration/V65__RemoveStrongFromTitleTest.scala @@ -7,7 +7,7 @@ package no.ndla.draftapi.db.migration -import no.ndla.common.model.domain.Title +import no.ndla.common.model.domain.{ArticleContent, Title} import no.ndla.draftapi.{TestEnvironment, UnitSuite} class V65__RemoveStrongFromTitleTest extends UnitSuite with TestEnvironment { @@ -28,4 +28,14 @@ class V65__RemoveStrongFromTitleTest extends UnitSuite with TestEnvironment { val result = migration.convertTitle(oldTitle) result should be(expectedTitle) } + + test("That strong are removed from title in article") { + val oldContent = + ArticleContent("

This is a title

Some text

", language = "nb") + val expectedContent = ArticleContent("

This is a title

Some text

", language = "nb") + + val migration = new V65__RemoveStrongFromTitle + val result = migration.convertContent(oldContent) + result should be(expectedContent) + } } From 3577ac903a2750ae1ad65903e3e93cbe7e79953e Mon Sep 17 00:00:00 2001 From: Gunnar Velle Date: Wed, 23 Oct 2024 14:21:47 +0200 Subject: [PATCH 3/4] Validate titles without strong --- .../no/ndla/articleapi/ArticleApiProperties.scala | 2 +- .../articleapi/validation/ContentValidator.scala | 10 +++++----- .../migration/V54__RemoveStrongFromTitleTest.scala | 3 ++- .../scala/no/ndla/draftapi/DraftApiProperties.scala | 2 +- .../ndla/draftapi/validation/ContentValidator.scala | 12 ++++++------ 5 files changed, 15 insertions(+), 14 deletions(-) diff --git a/article-api/src/main/scala/no/ndla/articleapi/ArticleApiProperties.scala b/article-api/src/main/scala/no/ndla/articleapi/ArticleApiProperties.scala index f3d74674cf..c88264307f 100644 --- a/article-api/src/main/scala/no/ndla/articleapi/ArticleApiProperties.scala +++ b/article-api/src/main/scala/no/ndla/articleapi/ArticleApiProperties.scala @@ -103,7 +103,7 @@ class ArticleApiProperties extends BaseProps { ResourceType.H5P.toString -> H5PAddress ) - def InlineHtmlTags: Set[String] = Set("code", "em", "span", "strong", "sub", "sup") + def InlineHtmlTags: Set[String] = Set("code", "em", "span", "sub", "sup") def IntroductionHtmlTags: Set[String] = InlineHtmlTags ++ Set("br", "p") private def H5PAddress: String = propOrElse( diff --git a/article-api/src/main/scala/no/ndla/articleapi/validation/ContentValidator.scala b/article-api/src/main/scala/no/ndla/articleapi/validation/ContentValidator.scala index 22ee37e371..4b556f08d8 100644 --- a/article-api/src/main/scala/no/ndla/articleapi/validation/ContentValidator.scala +++ b/article-api/src/main/scala/no/ndla/articleapi/validation/ContentValidator.scala @@ -13,21 +13,21 @@ import no.ndla.articleapi.repository.ArticleRepository import no.ndla.common.errors.{ValidationException, ValidationMessage} import no.ndla.common.model.NDLADate import no.ndla.common.model.domain.article.{Article, Copyright} -import no.ndla.common.model.domain._ +import no.ndla.common.model.domain.* import no.ndla.language.model.{Iso639, LanguageField} import no.ndla.mapping.License.getLicense import no.ndla.validation.HtmlTagRules.{allLegalTags, stringToJsoupDocument} import no.ndla.validation.SlugValidator.validateSlug import no.ndla.validation.TextValidator -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* import scala.util.{Failure, Success, Try} trait ContentValidator { - this: ArticleRepository with Props => + this: ArticleRepository & Props => val contentValidator: ContentValidator - class ContentValidator() { + class ContentValidator { private val inlineHtmlTags = props.InlineHtmlTags private val introductionHtmlTags = props.IntroductionHtmlTags @@ -73,7 +73,7 @@ trait ContentValidator { } } - private def validateNonEmpty(field: String, values: Seq[LanguageField[_]]): Option[ValidationMessage] = { + private def validateNonEmpty(field: String, values: Seq[LanguageField[?]]): Option[ValidationMessage] = { if (values.isEmpty || values.forall(_.isEmpty)) { Some(ValidationMessage(field, "Field must contain at least one entry")) } else diff --git a/article-api/src/test/scala/no/ndla/articleapi/db/migration/V54__RemoveStrongFromTitleTest.scala b/article-api/src/test/scala/no/ndla/articleapi/db/migration/V54__RemoveStrongFromTitleTest.scala index dd0b57599e..03a446c702 100644 --- a/article-api/src/test/scala/no/ndla/articleapi/db/migration/V54__RemoveStrongFromTitleTest.scala +++ b/article-api/src/test/scala/no/ndla/articleapi/db/migration/V54__RemoveStrongFromTitleTest.scala @@ -30,7 +30,8 @@ class V54__RemoveStrongFromTitleTest extends UnitSuite with TestEnvironment { } test("That strong are removed from title in article") { - val oldContent = ArticleContent("

This is a title

Some text

", language = "nb") + val oldContent = + ArticleContent("

This is a title

Some text

", language = "nb") val expectedContent = ArticleContent("

This is a title

Some text

", language = "nb") val migration = new V54__RemoveStrongFromTitle diff --git a/draft-api/src/main/scala/no/ndla/draftapi/DraftApiProperties.scala b/draft-api/src/main/scala/no/ndla/draftapi/DraftApiProperties.scala index 5e0ec3ac57..aea5127141 100644 --- a/draft-api/src/main/scala/no/ndla/draftapi/DraftApiProperties.scala +++ b/draft-api/src/main/scala/no/ndla/draftapi/DraftApiProperties.scala @@ -57,7 +57,7 @@ class DraftApiProperties extends BaseProps with StrictLogging { "image-api" -> s"http://$ImageApiHost/intern" ) - def InlineHtmlTags: Set[String] = Set("code", "em", "span", "strong", "sub", "sup") + def InlineHtmlTags: Set[String] = Set("code", "em", "span", "sub", "sup") def IntroductionHtmlTags: Set[String] = InlineHtmlTags ++ Set("br", "p") private def BrightcoveAccountId: String = prop("NDLA_BRIGHTCOVE_ACCOUNT_ID") diff --git a/draft-api/src/main/scala/no/ndla/draftapi/validation/ContentValidator.scala b/draft-api/src/main/scala/no/ndla/draftapi/validation/ContentValidator.scala index d0b7d48f57..60c5374b6a 100644 --- a/draft-api/src/main/scala/no/ndla/draftapi/validation/ContentValidator.scala +++ b/draft-api/src/main/scala/no/ndla/draftapi/validation/ContentValidator.scala @@ -9,8 +9,8 @@ package no.ndla.draftapi.validation import no.ndla.common.errors.{ValidationException, ValidationMessage} import no.ndla.common.model.NDLADate -import no.ndla.common.model.domain._ -import no.ndla.common.model.domain.draft._ +import no.ndla.common.model.domain.* +import no.ndla.common.model.domain.draft.* import no.ndla.draftapi.Props import no.ndla.draftapi.integration.ArticleApiClient import no.ndla.draftapi.model.api.{ContentId, NotFoundException, UpdatedArticle} @@ -21,18 +21,18 @@ import no.ndla.mapping.License.getLicense import no.ndla.network.tapir.auth.TokenUser import no.ndla.validation.HtmlTagRules.{allLegalTags, stringToJsoupDocument} import no.ndla.validation.SlugValidator.validateSlug -import no.ndla.validation._ +import no.ndla.validation.* import scalikejdbc.ReadOnlyAutoSession -import scala.jdk.CollectionConverters._ +import scala.jdk.CollectionConverters.* import scala.util.{Failure, Success, Try} trait ContentValidator { - this: DraftRepository with ConverterService with ArticleApiClient with Props => + this: DraftRepository & ConverterService & ArticleApiClient & Props => val contentValidator: ContentValidator val importValidator: ContentValidator - class ContentValidator() { + class ContentValidator { import props.{BrightcoveVideoScriptUrl, H5PResizerScriptUrl, NRKVideoScriptUrl} private val inlineHtmlTags = props.InlineHtmlTags private val introductionHtmlTags = props.IntroductionHtmlTags From bb06173bef6c40b2e0dd201995d2683344aebc26 Mon Sep 17 00:00:00 2001 From: Gunnar Velle Date: Wed, 23 Oct 2024 15:50:02 +0200 Subject: [PATCH 4/4] Fix strong in introduction --- .../main/scala/no/ndla/articleapi/ArticleApiProperties.scala | 2 +- .../src/main/scala/no/ndla/draftapi/DraftApiProperties.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/article-api/src/main/scala/no/ndla/articleapi/ArticleApiProperties.scala b/article-api/src/main/scala/no/ndla/articleapi/ArticleApiProperties.scala index c88264307f..8f6387d2bd 100644 --- a/article-api/src/main/scala/no/ndla/articleapi/ArticleApiProperties.scala +++ b/article-api/src/main/scala/no/ndla/articleapi/ArticleApiProperties.scala @@ -104,7 +104,7 @@ class ArticleApiProperties extends BaseProps { ) def InlineHtmlTags: Set[String] = Set("code", "em", "span", "sub", "sup") - def IntroductionHtmlTags: Set[String] = InlineHtmlTags ++ Set("br", "p") + def IntroductionHtmlTags: Set[String] = InlineHtmlTags ++ Set("br", "p", "strong") private def H5PAddress: String = propOrElse( "NDLA_H5P_ADDRESS", diff --git a/draft-api/src/main/scala/no/ndla/draftapi/DraftApiProperties.scala b/draft-api/src/main/scala/no/ndla/draftapi/DraftApiProperties.scala index aea5127141..07da132cef 100644 --- a/draft-api/src/main/scala/no/ndla/draftapi/DraftApiProperties.scala +++ b/draft-api/src/main/scala/no/ndla/draftapi/DraftApiProperties.scala @@ -58,7 +58,7 @@ class DraftApiProperties extends BaseProps with StrictLogging { ) def InlineHtmlTags: Set[String] = Set("code", "em", "span", "sub", "sup") - def IntroductionHtmlTags: Set[String] = InlineHtmlTags ++ Set("br", "p") + def IntroductionHtmlTags: Set[String] = InlineHtmlTags ++ Set("br", "p", "strong") private def BrightcoveAccountId: String = prop("NDLA_BRIGHTCOVE_ACCOUNT_ID") private def BrightcovePlayerId: String = prop("NDLA_BRIGHTCOVE_PLAYER_ID")