Fix textExternalLink(s) typo

Resolves #26

Change-Id: Ieb95039dce7154b80e082978aecc7be589de2b95
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e1beba6..72b7f79 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,7 @@
 ### Fixed
 
 - Fixed `-L` (log directory) option being ignored when using internal taggers (`-T opennlp`, `-T marmot`, etc.)
+- Renamed `textExternalLinks` metadata field to `textExternalLink` (singular) (https://github.com/KorAP/korapxmltool/issues/26)
 
 ## [v3.1.2] - 2025-12-18
 
diff --git a/app/src/main/kotlin/de/ids_mannheim/korapxmltools/KorapXmlTool.kt b/app/src/main/kotlin/de/ids_mannheim/korapxmltools/KorapXmlTool.kt
index 84f8c07..a692dec 100644
--- a/app/src/main/kotlin/de/ids_mannheim/korapxmltools/KorapXmlTool.kt
+++ b/app/src/main/kotlin/de/ids_mannheim/korapxmltools/KorapXmlTool.kt
@@ -4922,12 +4922,12 @@
             headerRoot.firstElement("ref") { it.getAttribute("type") == "page_url" }
                 ?.getAttribute("target")?.takeIf { it.isNotBlank() }?.let { metadata["externalLink"] = it }
 
-            // Extract textExternalLinks from biblNote[@n='url']
+            // Extract textExternalLink from biblNote[@n='url']
             val biblNoteUrl = analytic.firstElement("biblNote") { it.getAttribute("n") == "url" }
                 ?.textContent?.trim()?.takeIf { it.isNotEmpty() }
                 ?: monogr.firstElement("biblNote") { it.getAttribute("n") == "url" }
                     ?.textContent?.trim()?.takeIf { it.isNotEmpty() }
-            metadata.putIfNotBlank("textExternalLinks", biblNoteUrl)
+            metadata.putIfNotBlank("textExternalLink", biblNoteUrl)
 
             if (!metadata.containsKey("language")) {
                 metadata["language"] = "de"
diff --git a/app/src/main/kotlin/de/ids_mannheim/korapxmltools/formatters/KrillJsonGenerator.kt b/app/src/main/kotlin/de/ids_mannheim/korapxmltools/formatters/KrillJsonGenerator.kt
index 670bb64..f63ec5b 100644
--- a/app/src/main/kotlin/de/ids_mannheim/korapxmltools/formatters/KrillJsonGenerator.kt
+++ b/app/src/main/kotlin/de/ids_mannheim/korapxmltools/formatters/KrillJsonGenerator.kt
@@ -145,7 +145,7 @@
             "ISBN", "URN", "pubPlace", "pubPlaceKey",
             "textType", "textTypeArt", "textTypeRef", "textDomain", "textColumn",
             "author", "title", "subTitle", "corpusTitle", "corpusSubTitle", "docTitle", "docAuthor",
-            "textExternalLinks", "tokenSource"
+            "textExternalLink", "tokenSource"
         )
 
         fieldOrder.forEach { key ->
@@ -212,7 +212,7 @@
                     val encodedUrl = url.replace(":", "%3A").replace("/", "%2F")
                     "type:attachement" to jsonString("data:application/x.korap-link;title=$title,$encodedUrl")
                 }
-                "textExternalLinks" -> {
+                "textExternalLink" -> {
                     val url = value.toString()
                     val title = textData.headerMetadata["publisher"]?.toString() ?: "Link"
                     val encodedUrl = url.replace(":", "%3A").replace("/", "%2F")
diff --git a/app/src/test/kotlin/de/ids_mannheim/korapxmltools/KrillJsonGeneratorTest.kt b/app/src/test/kotlin/de/ids_mannheim/korapxmltools/KrillJsonGeneratorTest.kt
index 53048b0..cbe9ef5 100644
--- a/app/src/test/kotlin/de/ids_mannheim/korapxmltools/KrillJsonGeneratorTest.kt
+++ b/app/src/test/kotlin/de/ids_mannheim/korapxmltools/KrillJsonGeneratorTest.kt
@@ -724,7 +724,7 @@
             "docAuthor" to "User_A",  // Anonymized
             "distributor" to "Institut für Deutsche Sprache",
             "pubPlace" to "San Bruno, California",
-            "textExternalLinks" to "youtube.googleapis.com",  // Partial match for URL
+            "textExternalLink" to "youtube.googleapis.com",  // Partial match for URL
             "tokenSource" to "base#tokens"
         )