From 8115ac6514016e14cfac7b0d77061fd75c60c051 Mon Sep 17 00:00:00 2001
From: seonghobae <8172694+seonghobae@users.noreply.github.com>
Date: Tue, 21 Jul 2026 03:33:27 +0000
Subject: [PATCH 1/4] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20=EB=A3=A8?=
=?UTF-8?q?=ED=8A=B8=20=EB=94=94=EB=A0=89=ED=86=A0=EB=A6=AC=20=EB=93=B1=20?=
=?UTF-8?q?=EB=B9=88=20=EC=9D=B4=EB=A6=84=20=EB=94=94=EB=A0=89=ED=86=A0?=
=?UTF-8?q?=EB=A6=AC=EC=97=90=20=EB=8C=80=ED=95=9C=20=ED=83=80=EC=9D=B4?=
=?UTF-8?q?=ED=8B=80=20=EC=A0=91=EA=B7=BC=EC=84=B1=20=EA=B0=9C=EC=84=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
루트 디렉토리(`/`)의 경우 `File.getName()`이 빈 문자열을 반환하여 생성된 HTML의 `
`과 ``이 비어 있게 됩니다. 이는 스크린 리더 등 보조 기기가 문서의 목적을 파악하는 데 악영향을 미칩니다. 이를 해결하기 위해 이름이 비어 있을 때 절대 경로(`absolutePath`)를 표시하도록 폴백 로직을 추가했습니다.
---
.jules/palette.md | 4 ++++
src/main/kotlin/html4tree/main.kt | 5 +++--
src/test/kotlin/html4tree/MainTest.kt | 14 ++++++++++++++
3 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/.jules/palette.md b/.jules/palette.md
index 9a12c9d..2f9e71c 100644
--- a/.jules/palette.md
+++ b/.jules/palette.md
@@ -48,3 +48,7 @@
## 2024-08-01 - 네이티브 브라우저 UI의 다크 모드 지원 강제
**학습:** CSS 미디어 쿼리(`@media (prefers-color-scheme: dark)`)를 통해 다크 모드를 지원하더라도, 브라우저의 네이티브 UI 요소(스크롤바, 기본 폼 컨트롤, 기본 백그라운드 등)는 테마 변경을 인식하지 못해 어두운 테마 환경에서 밝은 스크롤바가 표시되는 등 시각적 불일치를 초래합니다.
**조치:** 항상 HTML 문서의 `` 영역에 ` ` 메타 태그를 명시적으로 추가하여 브라우저 수준에서 사용자의 시스템 테마(다크 모드 등)를 완전히 상속받아 일관성 있는 네이티브 UI를 렌더링하도록 보장하십시오.
+
+## 2026-07-21 - 빈 디렉토리 이름에 대한 폴백 제공 (루트 디렉토리 접근성)
+**Learning:** 파일 시스템 루트와 같이 이름이 빈 문자열인 디렉토리를 처리할 때, `` 및 `` 요소가 비어 있으면 스크린 리더 사용자와 검색 엔진에 문서의 목적을 전달하지 못해 접근성에 악영향을 미칩니다.
+**Action:** 디렉토리 이름이 비어 있을 때 화면 판독기가 문서 구조를 적절히 읽고 탐색할 수 있도록 절대 경로(absolutePath) 등을 표시하는 폴백 메커니즘을 제공하여 항상 유의미한 콘텐츠를 출력해야 합니다.
diff --git a/src/main/kotlin/html4tree/main.kt b/src/main/kotlin/html4tree/main.kt
index b455862..c1d8c44 100644
--- a/src/main/kotlin/html4tree/main.kt
+++ b/src/main/kotlin/html4tree/main.kt
@@ -317,6 +317,7 @@ fun process_dir(curr_dir: File, excludeSet: Set? = null, dirFiles: Array
${cssContent}
"""
+ val displayDirName = curr_dir.getName().ifEmpty { curr_dir.absolutePath }
val index_top = """
@@ -327,12 +328,12 @@ ${cssContent}
- ${curr_dir.getName().escapeHtml()}
+ ${displayDirName.escapeHtml()}
${css}
- ${curr_dir.getName().escapeHtml()}
+ ${displayDirName.escapeHtml()}
↰ ..
diff --git a/src/test/kotlin/html4tree/MainTest.kt b/src/test/kotlin/html4tree/MainTest.kt
index 1349471..24b7f9e 100644
--- a/src/test/kotlin/html4tree/MainTest.kt
+++ b/src/test/kotlin/html4tree/MainTest.kt
@@ -520,6 +520,20 @@ class MainTest {
process_dir(tempDir)
}
+ @Test
+ fun testProcessDirEmptyNameFallback() {
+ val fakeRoot = object : File(tempDir, "fakeRoot") {
+ override fun getName() = ""
+ }
+ fakeRoot.mkdir()
+ process_dir(fakeRoot)
+ val indexFile = File(fakeRoot, "index.html")
+ assertTrue(indexFile.exists())
+ val htmlContent = indexFile.readText()
+ assertTrue(htmlContent.contains("${fakeRoot.absolutePath} "))
+ assertTrue(htmlContent.contains("${fakeRoot.absolutePath} "))
+ }
+
@Test(expected = IllegalArgumentException::class)
fun testGoBlankDir() {
go(" ", -1)
From fd9498a2161da6bf01dcc09f4898f227e2a289de Mon Sep 17 00:00:00 2001
From: seonghobae <8172694+seonghobae@users.noreply.github.com>
Date: Tue, 21 Jul 2026 04:08:16 +0000
Subject: [PATCH 2/4] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20=EB=A3=A8?=
=?UTF-8?q?=ED=8A=B8=20=EB=94=94=EB=A0=89=ED=86=A0=EB=A6=AC=20=EB=93=B1=20?=
=?UTF-8?q?=EB=B9=88=20=EC=9D=B4=EB=A6=84=20=EB=94=94=EB=A0=89=ED=86=A0?=
=?UTF-8?q?=EB=A6=AC=EC=97=90=20=EB=8C=80=ED=95=9C=20=ED=83=80=EC=9D=B4?=
=?UTF-8?q?=ED=8B=80=20=EC=A0=91=EA=B7=BC=EC=84=B1=20=EA=B0=9C=EC=84=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
루트 디렉토리(`/`)의 경우 `File.getName()`이 빈 문자열을 반환하여 생성된 HTML의 ``과 ``이 비어 있게 됩니다. 이는 스크린 리더 등 보조 기기가 문서의 목적을 파악하는 데 악영향을 미칩니다. 이를 해결하기 위해 이름이 비어 있을 때 절대 경로(`absolutePath`)를 표시하도록 폴백 로직을 추가했습니다.
---
src/test/kotlin/html4tree/MainTest.kt | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/test/kotlin/html4tree/MainTest.kt b/src/test/kotlin/html4tree/MainTest.kt
index 24b7f9e..f0b5158 100644
--- a/src/test/kotlin/html4tree/MainTest.kt
+++ b/src/test/kotlin/html4tree/MainTest.kt
@@ -530,8 +530,8 @@ class MainTest {
val indexFile = File(fakeRoot, "index.html")
assertTrue(indexFile.exists())
val htmlContent = indexFile.readText()
- assertTrue(htmlContent.contains("${fakeRoot.absolutePath} "))
- assertTrue(htmlContent.contains("${fakeRoot.absolutePath} "))
+ assertTrue(htmlContent.contains("${fakeRoot.absolutePath.escapeHtml()} "))
+ assertTrue(htmlContent.contains("${fakeRoot.absolutePath.escapeHtml()} "))
}
@Test(expected = IllegalArgumentException::class)
From 2c3a468284827f0de98c2f179f01f2ce0a63d0df Mon Sep 17 00:00:00 2001
From: seonghobae <8172694+seonghobae@users.noreply.github.com>
Date: Tue, 21 Jul 2026 04:33:21 +0000
Subject: [PATCH 3/4] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20=EB=A3=A8?=
=?UTF-8?q?=ED=8A=B8=20=EB=94=94=EB=A0=89=ED=86=A0=EB=A6=AC=20=EB=93=B1=20?=
=?UTF-8?q?=EB=B9=88=20=EC=9D=B4=EB=A6=84=20=EB=94=94=EB=A0=89=ED=86=A0?=
=?UTF-8?q?=EB=A6=AC=EC=97=90=20=EB=8C=80=ED=95=9C=20=ED=83=80=EC=9D=B4?=
=?UTF-8?q?=ED=8B=80=20=EC=A0=91=EA=B7=BC=EC=84=B1=20=EA=B0=9C=EC=84=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
루트 디렉토리(`/`)의 경우 `File.getName()`이 빈 문자열을 반환하여 생성된 HTML의 ``과 ``이 비어 있게 됩니다. 이는 스크린 리더 등 보조 기기가 문서의 목적을 파악하는 데 악영향을 미칩니다. 이를 해결하기 위해 이름이 비어 있을 때 절대 경로(`absolutePath`)를 표시하도록 폴백 로직을 추가했습니다. 또한 CSP 스타일 해시가 인라인 공백으로 인해 유효하지 않게 되는 문제를 해결했습니다.
---
src/main/kotlin/html4tree/main.kt | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/src/main/kotlin/html4tree/main.kt b/src/main/kotlin/html4tree/main.kt
index c1d8c44..dc97773 100644
--- a/src/main/kotlin/html4tree/main.kt
+++ b/src/main/kotlin/html4tree/main.kt
@@ -310,12 +310,10 @@ fun process_dir(curr_dir: File, excludeSet: Set? = null, dirFiles: Array
}
"""
- val styleHash = "sha256-" + Base64.getEncoder().encodeToString(MessageDigest.getInstance("SHA-256").digest(cssContent.toByteArray(Charsets.UTF_8)))
+ val exactStyleContent = cssContent.trimIndent()
+ val styleHash = "sha256-" + Base64.getEncoder().encodeToString(MessageDigest.getInstance("SHA-256").digest(exactStyleContent.toByteArray(Charsets.UTF_8)))
- val css = """
-
- """
+ val css = """"""
val displayDirName = curr_dir.getName().ifEmpty { curr_dir.absolutePath }
val index_top = """
From b0a83aa9321bf6af02578202c9cb824a7f39f60c Mon Sep 17 00:00:00 2001
From: seonghobae <8172694+seonghobae@users.noreply.github.com>
Date: Tue, 21 Jul 2026 05:47:03 +0000
Subject: [PATCH 4/4] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20=EB=A3=A8?=
=?UTF-8?q?=ED=8A=B8=20=EB=94=94=EB=A0=89=ED=86=A0=EB=A6=AC=20=EB=93=B1=20?=
=?UTF-8?q?=EB=B9=88=20=EC=9D=B4=EB=A6=84=20=EB=94=94=EB=A0=89=ED=86=A0?=
=?UTF-8?q?=EB=A6=AC=EC=97=90=20=EB=8C=80=ED=95=9C=20=ED=83=80=EC=9D=B4?=
=?UTF-8?q?=ED=8B=80=20=EC=A0=91=EA=B7=BC=EC=84=B1=20=EA=B0=9C=EC=84=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
루트 디렉토리(`/`)의 경우 `File.getName()`이 빈 문자열을 반환하여 생성된 HTML의 ``과 ``이 비어 있게 됩니다. 이는 스크린 리더 등 보조 기기가 문서의 목적을 파악하는 데 악영향을 미칩니다. 이를 해결하기 위해 이름이 비어 있을 때 절대 경로(`absolutePath`)를 표시하도록 폴백 로직을 추가했습니다. 또한 CSP 스타일 해시가 인라인 공백으로 인해 유효하지 않게 되는 문제를 해결했습니다. 기존 보안 패치를 모두 유지한 상태로 병합됩니다.
---
.jules/palette.md | 4 ----
1 file changed, 4 deletions(-)
diff --git a/.jules/palette.md b/.jules/palette.md
index 2f9e71c..9a12c9d 100644
--- a/.jules/palette.md
+++ b/.jules/palette.md
@@ -48,7 +48,3 @@
## 2024-08-01 - 네이티브 브라우저 UI의 다크 모드 지원 강제
**학습:** CSS 미디어 쿼리(`@media (prefers-color-scheme: dark)`)를 통해 다크 모드를 지원하더라도, 브라우저의 네이티브 UI 요소(스크롤바, 기본 폼 컨트롤, 기본 백그라운드 등)는 테마 변경을 인식하지 못해 어두운 테마 환경에서 밝은 스크롤바가 표시되는 등 시각적 불일치를 초래합니다.
**조치:** 항상 HTML 문서의 `` 영역에 ` ` 메타 태그를 명시적으로 추가하여 브라우저 수준에서 사용자의 시스템 테마(다크 모드 등)를 완전히 상속받아 일관성 있는 네이티브 UI를 렌더링하도록 보장하십시오.
-
-## 2026-07-21 - 빈 디렉토리 이름에 대한 폴백 제공 (루트 디렉토리 접근성)
-**Learning:** 파일 시스템 루트와 같이 이름이 빈 문자열인 디렉토리를 처리할 때, `` 및 `` 요소가 비어 있으면 스크린 리더 사용자와 검색 엔진에 문서의 목적을 전달하지 못해 접근성에 악영향을 미칩니다.
-**Action:** 디렉토리 이름이 비어 있을 때 화면 판독기가 문서 구조를 적절히 읽고 탐색할 수 있도록 절대 경로(absolutePath) 등을 표시하는 폴백 메커니즘을 제공하여 항상 유의미한 콘텐츠를 출력해야 합니다.