diff --git a/src/main/scala/handlers/AstroHandler.scala b/src/main/scala/handlers/AstroHandler.scala index 2d8d634..b2fe0af 100644 --- a/src/main/scala/handlers/AstroHandler.scala +++ b/src/main/scala/handlers/AstroHandler.scala @@ -27,7 +27,7 @@ class AstroHandler extends FileHandler: */ override def generateLicense(raw: String): String = val body = raw.linesIterator.mkString("\n") - s"\n\n" + s"\n" /** Add a license header after frontmatter if present. */ override def addLicense(fileDump: String, licenseText: String): (String, Boolean) = @@ -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 = @@ -66,7 +69,8 @@ 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] = @@ -74,3 +78,8 @@ class AstroHandler extends FileHandler: .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 diff --git a/src/main/scala/handlers/MdxHandler.scala b/src/main/scala/handlers/MdxHandler.scala index 2ca4139..7b39b91 100644 --- a/src/main/scala/handlers/MdxHandler.scala +++ b/src/main/scala/handlers/MdxHandler.scala @@ -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) = @@ -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 = @@ -66,7 +69,8 @@ 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] = @@ -74,3 +78,8 @@ class MdxHandler extends FileHandler: .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 diff --git a/src/test/resources/cases/check-astro-mdx-blank-line/case.yaml b/src/test/resources/cases/check-astro-mdx-blank-line/case.yaml new file mode 100644 index 0000000..c284b39 --- /dev/null +++ b/src/test/resources/cases/check-astro-mdx-blank-line/case.yaml @@ -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" diff --git a/src/test/resources/cases/check-astro-mdx-blank-line/config.yaml b/src/test/resources/cases/check-astro-mdx-blank-line/config.yaml new file mode 100644 index 0000000..b66ce4d --- /dev/null +++ b/src/test/resources/cases/check-astro-mdx-blank-line/config.yaml @@ -0,0 +1,3 @@ +holder: NiceBots.xyz +spdx: MIT +year: 2026 diff --git a/src/test/resources/cases/check-astro-mdx-blank-line/source/one.astro b/src/test/resources/cases/check-astro-mdx-blank-line/source/one.astro new file mode 100644 index 0000000..68c20d8 --- /dev/null +++ b/src/test/resources/cases/check-astro-mdx-blank-line/source/one.astro @@ -0,0 +1,5 @@ +--- +title: Hello +--- + +
Hi
diff --git a/src/test/resources/cases/check-astro-mdx-blank-line/source/one.mdx b/src/test/resources/cases/check-astro-mdx-blank-line/source/one.mdx new file mode 100644 index 0000000..3690192 --- /dev/null +++ b/src/test/resources/cases/check-astro-mdx-blank-line/source/one.mdx @@ -0,0 +1,5 @@ +--- +title: Hello +--- + +# Hello diff --git a/src/test/resources/cases/index.txt b/src/test/resources/cases/index.txt index 9f2dd50..2b1869a 100644 --- a/src/test/resources/cases/index.txt +++ b/src/test/resources/cases/index.txt @@ -14,3 +14,4 @@ check-external check-missing check-mixed check-with-ignore +check-astro-mdx-blank-line