Java String.indent: จัดย่อหน้าข้อความหลายบรรทัดโดยรู้เรื่อง line ending
การเติม prefix ให้ข้อความหลายบรรทัดด้วย replace("\n", "\n ") มักพลาดบรรทัดแรกและ line ending แบบอื่น String.indent(n) เพิ่มช่องนำหน้าทุกบรรทัดเมื่อ n เป็นบวก หรือลด whitespace นำหน้าได้สูงสุด -n เมื่อเป็นลบครับ
WHY: จัดทั้งบล็อกด้วยกติกาเดียว
เหมือนเลื่อนชั้นหนังสือทั้งแถว ไม่ใช่เดินย้ายทีละเล่ม API รู้จัก line terminator และทำให้ทุกบรรทัดอยู่ในกฎเดียว เหมาะกับ diagnostic, generated snippets และข้อความใน test
public class Main {
static String quoteBlock(String text) {
return text.strip().indent(2);
}
public static void main(String[] args) {
assert quoteBlock("alpha\r\nbeta").equals(" alpha\n beta\n");
assert " a\n b\n".indent(-2).equals(" a\nb\n");
assert "".indent(4).equals("");
System.out.println("indent behavior verified");
}
}
HOW: ผลลัพธ์ normalize เป็น newline
indent แบ่งบรรทัดตามแนวคิดเดียวกับ lines() แล้วจบแต่ละบรรทัดด้วย \n ผลจึง normalize CRLF เป็น LF และข้อความไม่ว่างมักมี newline ท้ายสุด นี่ดีสำหรับ generated text ที่ต้องการรูปแบบคงที่ แต่ไม่เหมาะถ้าต้องรักษา byte-for-byte line ending ของไฟล์ต้นฉบับ
ค่าลบลบ whitespace ได้ไม่เกินจำนวนที่กำหนดและไม่ทำให้บรรทัดสั้นติดลบ ก่อนแสดงข้อความที่มาจากผู้ใช้ใน log ยังต้องกัน log injection และข้อมูลลับ indent เป็น formatter ไม่ใช่ sanitizer และไม่ควรใช้สร้าง source code จากค่าที่ไม่ escape
Recap
- ใช้
indentจัดทุกบรรทัดรวมบรรทัดแรก - คาดหวัง LF normalization และ newline ท้ายข้อความ
- ใช้ค่าลบเมื่อต้องลด whitespace แบบมีเพดาน
- อย่าใช้กับงานที่ต้องรักษา line ending เดิม
- formatter ไม่แทน escaping หรือ secret redaction