Skip to content
Draft
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
3 changes: 3 additions & 0 deletions .jules/palette.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,6 @@
## 2026-08-17 - λΈŒλΌμš°μ € λ²ˆμ—­κ³Ό ν™”λ©΄ νŒλ…κΈ°μ˜ ν˜Έν™˜μ„±μ„ μœ„ν•œ ν…μŠ€νŠΈ 처리
**Learning:** `aria-label` μ†μ„±μœΌλ‘œ μ§€μ •λœ ν™”λ©΄ νŒλ…κΈ°μš© λŒ€μ²΄ ν…μŠ€νŠΈλŠ” Chrome Translate λ“± λΈŒλΌμš°μ € λ²ˆμ—­ 도ꡬ에 μ˜ν•΄ λ²ˆμ—­λ˜μ§€ μ•ŠλŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€. 이둜 인해 λ¬Έμ„œ μ–Έμ–΄κ°€ λ³€ν™˜λ˜μ–΄λ„ 슀크린 λ¦¬λ”μ—μ„œλŠ” 원본 μ–Έμ–΄(예: μ˜μ–΄)둜 μ½ν˜€ λ‹€κ΅­μ–΄ 접근성이 μ €ν•˜λ©λ‹ˆλ‹€.
**Action:** ν™”λ©΄ νŒλ…κΈ°λ₯Ό μœ„ν•œ μˆ¨κ²¨μ§„ μ„€λͺ… ν…μŠ€νŠΈλ₯Ό μ œκ³΅ν•  λ•Œ `aria-label` λŒ€μ‹  CSS `.visually-hidden` 클래슀λ₯Ό μ μš©ν•œ `<span>` μš”μ†Œλ₯Ό μ‚¬μš©ν•˜μ—¬, λΈŒλΌμš°μ €κ°€ 일반 ν…μŠ€νŠΈλ‘œ μΈμ‹ν•˜κ³  λ²ˆμ—­ν•  수 μžˆλ„λ‘ ν•˜μ—¬ λ‹€κ΅­μ–΄ μ ‘κ·Όμ„± ν˜Έν™˜μ„±μ„ ν™•λ³΄ν•˜μ‹­μ‹œμ˜€.
## 2024-08-20 - RTL λ¬Έμžμ—΄μ΄ ν¬ν•¨λœ 파일λͺ…을 μœ„ν•œ μ–‘λ°©ν–₯(BiDi) ν…μŠ€νŠΈ 지원
**Learning:** 파일 μ„œλ²„λŠ” λ‹€κ΅­μ–΄ 파일 및 폴더λͺ…을 지원해야 ν•˜λ©°, 였λ₯Έμͺ½μ—μ„œ μ™Όμͺ½μœΌλ‘œ μ“°λŠ”(Right-To-Left) λ¬Έμžκ°€ ν¬ν•¨λœ μ΄λ¦„μ˜ 경우 μ‹œλ§¨ν‹±μƒ κΈ°λ³Έ λ°©ν–₯성을 μ½˜ν…μΈ μ— 맞게 μ„€μ •ν•˜λŠ” 것이 λ°”λžŒμ§ν•©λ‹ˆλ‹€.
**Action:** ν΄λ”λ‚˜ 파일λͺ… λ“± μ‚¬μš©μž 생성 ν…μŠ€νŠΈκ°€ ν‘œμ‹œλ˜λŠ” ꡬ체적인 ν…μŠ€νŠΈ λ…Έλ“œ(`<h1>` 및 파일λͺ…을 κ°μ‹ΈλŠ” `<span>` νƒœκ·Έ)에 `dir="auto"` 속성을 λͺ…μ‹œν•˜μ—¬ ν…μŠ€νŠΈ λ‚΄μš©μ— 맞게 λ°©ν–₯성이 μ²˜λ¦¬λ˜λ„λ‘ λ§ˆν¬μ—…μ„ κ°œμ„ ν•˜μ‹­μ‹œμ˜€. (κ³ μ •λœ UI ν…μŠ€νŠΈ μ œμ™Έ)
6 changes: 3 additions & 3 deletions src/main/kotlin/html4tree/main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -426,7 +426,7 @@ fun process_dir(curr_dir: File, excludeSet: Set<String>? = null, dirFiles: Array
</head>
<body>
<main>
<h1>${directoryName.escapeHtml()}</h1>
<h1 dir="auto">${directoryName.escapeHtml()}</h1>
<nav aria-label="디렉토리 λͺ©λ‘">
<ul role="list">
<li><a class="dir-link" href="./.." title="μƒμœ„ λ””λ ‰ν† λ¦¬λ‘œ 이동"><span class="icon" aria-hidden="true">&#x21B0;</span> <span aria-hidden="true">..</span> <span class="visually-hidden">μƒμœ„ λ””λ ‰ν† λ¦¬λ‘œ 이동</span></a></li>
Expand Down Expand Up @@ -460,14 +460,14 @@ fun process_dir(curr_dir: File, excludeSet: Set<String>? = null, dirFiles: Array
val ariaLabel = "${fileName} ${if (isLinkedDirectory) { "디렉토리" } else { "파일" }}".escapeHtml()
val typeLabel = if (isLinkedDirectory) { "디렉토리" } else { "파일" }
val icon = if (isLinkedDirectory) { "&#128193;" } else { "&#128196;" }
l.append(""" <li><a class="dir-link" href="${encodedHref}" title="${ariaLabel}"><span class="icon" aria-hidden="true">${icon}</span> <span>${fileName.escapeHtml()}</span> <span class="visually-hidden">${typeLabel}</span></a></li>""")
l.append(""" <li><a class="dir-link" href="${encodedHref}" title="${ariaLabel}"><span class="icon" aria-hidden="true">${icon}</span> <span dir="auto">${fileName.escapeHtml()}</span> <span class="visually-hidden">${typeLabel}</span></a></li>""")
l.append('\n')
}
}
}

if(l.isEmpty()){
l.append(""" <li><div class="empty-dir" role="status"><span class="icon" aria-hidden="true">&#128194;</span> <span>이 λ””λ ‰ν† λ¦¬λŠ” λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€.</span></div></li>""")
l.append(""" <li><div class="empty-dir"><span class="icon" aria-hidden="true">&#128194;</span> <span>이 λ””λ ‰ν† λ¦¬λŠ” λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€.</span></div></li>""")
l.append('\n')
}

Expand Down
2 changes: 1 addition & 1 deletion src/test/kotlin/html4tree/GeneratedIndexReadabilityTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ class GeneratedIndexReadabilityTest {

val generatedHtml = generatedHtml()
val expectedEmptyRow =
"""<li><div class="empty-dir" role="status"><span class="icon" aria-hidden="true">&#128194;</span> <span>이 λ””λ ‰ν† λ¦¬λŠ” λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€.</span></div></li>"""
"""<li><div class="empty-dir"><span class="icon" aria-hidden="true">&#128194;</span> <span>이 λ””λ ‰ν† λ¦¬λŠ” λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€.</span></div></li>"""

assertTrue(generatedHtml.contains(expectedEmptyRow))
assertTrue(generatedHtml.indexOf(expectedEmptyRow) == generatedHtml.lastIndexOf(expectedEmptyRow))
Expand Down
20 changes: 18 additions & 2 deletions src/test/kotlin/html4tree/MainTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,6 @@ class MainTest {
assertTrue(htmlContent.contains("<html lang=\"ko\">"))
assertRobotsDirective(htmlContent)
assertTrue(htmlContent.contains("이 λ””λ ‰ν† λ¦¬λŠ” λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€."))
assertTrue(htmlContent.contains("role=\"status\""))
assertTrue(htmlContent.contains("role=\"list\""))
assertTrue(htmlContent.contains("&#128194;"))
}
Expand Down Expand Up @@ -943,7 +942,24 @@ class MainTest {
assertTrue(indexHtml.exists())
val content = indexHtml.readText()
assertTrue(content.contains("<title>Root - 디렉토리 λͺ©λ‘</title>"))
assertTrue(content.contains("<h1>Root</h1>"))
assertTrue(content.contains("<h1 dir=\"auto\">Root</h1>"))
}


@Test
fun testBiDiDirectoryAndFileNames() {
val dirName = "ΧžΧ‘Χ—ΧŸ_RTL_Dir"
val fileName = "ملف_RTL.txt"
val bidiDir = File(tempDir, dirName)
bidiDir.mkdir()
File(bidiDir, fileName).createNewFile()
process_dir(bidiDir, setOf(), arrayOf(File(bidiDir, fileName)))
val indexHtml = File(bidiDir, "index.html")
assertTrue(indexHtml.exists())
val content = indexHtml.readText()
assertTrue(content.contains("<h1 dir=\"auto\">ΧžΧ‘Χ—ΧŸ_RTL_Dir</h1>"))
assertTrue(content.contains("<span dir=\"auto\">ملف_RTL.txt</span>"))
assertTrue(content.contains("<span aria-hidden=\"true\">..</span>"))
}

}
Loading