From 637c0b086e5e1cf478bbd2736e31ad6f61397b22 Mon Sep 17 00:00:00 2001
From: seonghobae <8172694+seonghobae@users.noreply.github.com>
Date: Wed, 24 Jun 2026 20:50:24 +0000
Subject: [PATCH 1/4] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20=ED=96=A5?=
=?UTF-8?q?=EC=83=81=EB=90=9C=20HTML=20=EC=A0=91=EA=B7=BC=EC=84=B1=20?=
=?UTF-8?q?=EB=B0=8F=20UX=20=EA=B0=9C=EC=84=A0=20(ARIA=20=EB=9D=BC?=
=?UTF-8?q?=EB=B2=A8=20=EC=B6=94=EA=B0=80=20=EB=93=B1)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.jules/palette.md | 3 +++
src/main/kotlin/html4tree/main.kt | 29 +++++++++++++++++++++------
src/test/kotlin/html4tree/MainTest.kt | 28 ++++++++++++++++++++++++++
3 files changed, 54 insertions(+), 6 deletions(-)
create mode 100644 .jules/palette.md
create mode 100644 src/test/kotlin/html4tree/MainTest.kt
diff --git a/.jules/palette.md b/.jules/palette.md
new file mode 100644
index 00000000..8da0349d
--- /dev/null
+++ b/.jules/palette.md
@@ -0,0 +1,3 @@
+## 2024-05-15 - Enhancing Generated File Tree HTML
+**Learning:** Raw directory listings generated into HTML often lack critical accessibility meta tags (like `lang="en"`, `viewport` for responsive scaling) and aria-labels for directory/file links (which are otherwise non-descriptive for screen readers like just `📁 folderName`).
+**Action:** Always include base semantic structures (``, ``, responsive meta tags) and `aria-label`s specifying the entity type (e.g., `folderName directory`) when generating raw navigation trees to ensure keyboard and screen-reader usability. Add `:focus` styles mimicking `:hover` for keyboard users.
diff --git a/src/main/kotlin/html4tree/main.kt b/src/main/kotlin/html4tree/main.kt
index daaead3d..28c70b4a 100644
--- a/src/main/kotlin/html4tree/main.kt
+++ b/src/main/kotlin/html4tree/main.kt
@@ -82,20 +82,34 @@ fun process_dir(curr_dir: File){
"""
val index_top = """
-
+
+
+
${curr_dir.getName()}
${css}
- ${curr_dir.getName()}
-
- - ↰ ..
+
+ ${curr_dir.getName()}
+
+
+
"""
diff --git a/src/test/kotlin/html4tree/MainTest.kt b/src/test/kotlin/html4tree/MainTest.kt
new file mode 100644
index 00000000..552113ec
--- /dev/null
+++ b/src/test/kotlin/html4tree/MainTest.kt
@@ -0,0 +1,28 @@
+package html4tree
+
+import org.junit.Test
+import java.io.File
+import kotlin.test.assertTrue
+
+class MainTest {
+ @Test
+ fun testProcessDir() {
+ val tempDir = File("temp_test_dir")
+ tempDir.mkdir()
+ try {
+ process_dir(tempDir)
+ val indexFile = File(tempDir, "index.html")
+ assertTrue(indexFile.exists())
+ val content = indexFile.readText()
+ assertTrue(content.contains(""))
+ assertTrue(content.contains(""))
+ assertTrue(content.contains(""))
+ assertTrue(content.contains(""))
+ assertTrue(content.contains(""))
+ assertTrue(content.contains("aria-label=\"Go to parent directory\""))
+ } finally {
+ File(tempDir, "index.html").delete()
+ tempDir.delete()
+ }
+ }
+}
From 78952a9298b31b4118236d796a70481651234785 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 28 Jun 2026 08:51:21 +0000
Subject: [PATCH 2/4] Fix review feedback for escaping and temp test directory
---
src/main/kotlin/html4tree/main.kt | 22 ++++++++++++++++++----
src/test/kotlin/html4tree/MainTest.kt | 7 +++----
2 files changed, 21 insertions(+), 8 deletions(-)
diff --git a/src/main/kotlin/html4tree/main.kt b/src/main/kotlin/html4tree/main.kt
index 28c70b4a..7435162f 100644
--- a/src/main/kotlin/html4tree/main.kt
+++ b/src/main/kotlin/html4tree/main.kt
@@ -97,17 +97,19 @@ fun process_dir(curr_dir: File){
"""
+ val escapedDirName = escape_html(curr_dir.getName())
+
val index_top = """
- ${curr_dir.getName()}
+ ${escapedDirName}
${css}
- ${curr_dir.getName()}
+ ${escapedDirName}
- ↰ ..
"""
@@ -120,8 +122,11 @@ fun process_dir(curr_dir: File){
dir_files.forEach {
if((it.getName() !in exclude) && (it != curr_dir)) {
val isDir = it.isDirectory()
- val ariaLabel = if (isDir) "${it.getName()} directory" else "${it.getName()} file"
- l += """ - ${if (isDir) { "📁" } else { "▸" }} ${it.getName()}
"""+"\n"
+ val fileName = it.getName()
+ val href = escape_html(if (isDir) { "./${fileName}/" } else { "./${fileName}" })
+ val ariaLabel = escape_html(if (isDir) "${fileName} directory" else "${fileName} file")
+ val fileNameDisplay = escape_html(fileName)
+ l += """ - ${if (isDir) { "📁" } else { "▸" }} ${fileNameDisplay}
"""+"\n"
}
}
@@ -139,6 +144,15 @@ fun process_dir(curr_dir: File){
}
+fun escape_html(input: String): String {
+ return input
+ .replace("&", "&")
+ .replace("<", "<")
+ .replace(">", ">")
+ .replace("\"", """)
+ .replace("'", "'")
+}
+
fun help() {
println("ERROR: help has not been written yet!")
}
diff --git a/src/test/kotlin/html4tree/MainTest.kt b/src/test/kotlin/html4tree/MainTest.kt
index 552113ec..e12e3a44 100644
--- a/src/test/kotlin/html4tree/MainTest.kt
+++ b/src/test/kotlin/html4tree/MainTest.kt
@@ -2,13 +2,13 @@ package html4tree
import org.junit.Test
import java.io.File
+import java.nio.file.Files
import kotlin.test.assertTrue
class MainTest {
@Test
fun testProcessDir() {
- val tempDir = File("temp_test_dir")
- tempDir.mkdir()
+ val tempDir = Files.createTempDirectory("html4tree-test-").toFile()
try {
process_dir(tempDir)
val indexFile = File(tempDir, "index.html")
@@ -21,8 +21,7 @@ class MainTest {
assertTrue(content.contains(""))
assertTrue(content.contains("aria-label=\"Go to parent directory\""))
} finally {
- File(tempDir, "index.html").delete()
- tempDir.delete()
+ tempDir.deleteRecursively()
}
}
}
From 51bfd009ad19aae61d2a98ac7e5033a75f40621f Mon Sep 17 00:00:00 2001
From: Seongho Bae
Date: Tue, 30 Jun 2026 10:39:01 +0900
Subject: [PATCH 3/4] chore: retrigger required review workflows
From af6fcb4921d333fc5f9e7a502b05428e5853ad77 Mon Sep 17 00:00:00 2001
From: Seongho Bae
Date: Tue, 30 Jun 2026 11:13:15 +0900
Subject: [PATCH 4/4] chore: rerun required review workflows