Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 16 additions & 7 deletions src/main/scala/handlers/AstroHandler.scala
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class AstroHandler extends FileHandler:
*/
override def generateLicense(raw: String): String =
val body = raw.linesIterator.mkString("\n")
s"\n<!--\n$body\n-->\n"
s"<!--\n$body\n-->\n"

/** Add a license header after frontmatter if present. */
override def addLicense(fileDump: String, licenseText: String): (String, Boolean) =
Expand All @@ -42,16 +42,19 @@ class AstroHandler extends FileHandler:
val lines = splitLines(fileDump)
val insertAt = frontmatterInsertIndex(lines)
val expectedFirst = rendered.linesIterator.nextOption.getOrElse("")
val actualFirst = lines.lift(insertAt).getOrElse("")
val actualFirst = lines.drop(insertAt).dropWhile(_.trim.isEmpty).headOption.getOrElse("")
if expectedFirst == actualFirst then LicenseState.Present
else if hasExternalAt(lines, insertAt) then LicenseState.External
else LicenseState.Missing

private def insertAfterFrontmatter(fileDump: String, rendered: String): String =
val lines = splitLines(fileDump)
val insertAt = frontmatterInsertIndex(lines)
val headerLines = splitLines(rendered.stripSuffix("\n"))
val updatedLines = lines.patch(insertAt, headerLines, 0)
val lines = splitLines(fileDump)
val insertAt = frontmatterInsertIndex(lines)
val trimmedInsertAt = skipBlankLines(lines, insertAt)
val headerLines = splitLines(rendered.stripSuffix("\n"))
val separator = if insertAt > 0 then Vector("") else Vector.empty
val updatedLines =
lines.patch(insertAt, separator ++ headerLines, trimmedInsertAt - insertAt)
updatedLines.mkString("\n")

private def frontmatterInsertIndex(lines: Vector[String]): Int =
Expand All @@ -66,11 +69,17 @@ class AstroHandler extends FileHandler:
externalMarkers: Vector[String] = Vector("Copyright", "SPDX-License-Identifier"),
scanLines: Int = 3
): Boolean =
val headerLines = lines.drop(insertAt).take(scanLines).map(_.trim)
val headerLines =
lines.drop(insertAt).dropWhile(_.trim.isEmpty).take(scanLines).map(_.trim)
externalMarkers.exists(marker => headerLines.exists(_.contains(marker)))

private def splitLines(text: String): Vector[String] =
text
.split("\n", -1)
.toVector
.map(line => if line.endsWith("\r") then line.dropRight(1) else line)

private def skipBlankLines(lines: Vector[String], startAt: Int): Int =
var idx = startAt
while idx < lines.length && lines(idx).trim.isEmpty do idx += 1
idx
23 changes: 16 additions & 7 deletions src/main/scala/handlers/MdxHandler.scala
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class MdxHandler extends FileHandler:
*/
override def generateLicense(raw: String): String =
val body = raw.linesIterator.mkString("\n")
s"\n{/*\n$body\n*/}\n"
s"{/*\n$body\n*/}\n"

/** Add a license header after frontmatter if present. */
override def addLicense(fileDump: String, licenseText: String): (String, Boolean) =
Expand All @@ -42,16 +42,19 @@ class MdxHandler extends FileHandler:
val lines = splitLines(fileDump)
val insertAt = frontmatterInsertIndex(lines)
val expectedFirst = rendered.linesIterator.nextOption.getOrElse("")
val actualFirst = lines.lift(insertAt).getOrElse("")
val actualFirst = lines.drop(insertAt).dropWhile(_.trim.isEmpty).headOption.getOrElse("")
if expectedFirst == actualFirst then LicenseState.Present
else if hasExternalAt(lines, insertAt) then LicenseState.External
else LicenseState.Missing

private def insertAfterFrontmatter(fileDump: String, rendered: String): String =
val lines = splitLines(fileDump)
val insertAt = frontmatterInsertIndex(lines)
val headerLines = splitLines(rendered.stripSuffix("\n"))
val updatedLines = lines.patch(insertAt, headerLines, 0)
val lines = splitLines(fileDump)
val insertAt = frontmatterInsertIndex(lines)
val trimmedInsertAt = skipBlankLines(lines, insertAt)
val headerLines = splitLines(rendered.stripSuffix("\n"))
val separator = if insertAt > 0 then Vector("") else Vector.empty
val updatedLines =
lines.patch(insertAt, separator ++ headerLines, trimmedInsertAt - insertAt)
updatedLines.mkString("\n")

private def frontmatterInsertIndex(lines: Vector[String]): Int =
Expand All @@ -66,11 +69,17 @@ class MdxHandler extends FileHandler:
externalMarkers: Vector[String] = Vector("Copyright", "SPDX-License-Identifier"),
scanLines: Int = 3
): Boolean =
val headerLines = lines.drop(insertAt).take(scanLines).map(_.trim)
val headerLines =
lines.drop(insertAt).dropWhile(_.trim.isEmpty).take(scanLines).map(_.trim)
externalMarkers.exists(marker => headerLines.exists(_.contains(marker)))

private def splitLines(text: String): Vector[String] =
text
.split("\n", -1)
.toVector
.map(line => if line.endsWith("\r") then line.dropRight(1) else line)

private def skipBlankLines(lines: Vector[String], startAt: Int): Int =
var idx = startAt
while idx < lines.length && lines(idx).trim.isEmpty do idx += 1
idx
10 changes: 10 additions & 0 deletions src/test/resources/cases/check-astro-mdx-blank-line/case.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
name: check-astro-mdx-blank-line
command: check
args:
- "source/*"
ignore: []
expectExit: 1
expectedOutput:
- "Missing: source/one.astro"
- "Missing: source/one.mdx"
- "Skipped: 0"
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
holder: NiceBots.xyz
spdx: MIT
year: 2026
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
title: Hello
---

<div>Hi</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
title: Hello
---

# Hello
1 change: 1 addition & 0 deletions src/test/resources/cases/index.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,4 @@ check-external
check-missing
check-mixed
check-with-ignore
check-astro-mdx-blank-line