นากต้นฉบับขยับแผ่นไม้หลายแถวเข้าด้านในด้วยระยะเท่ากันบนแท่นจัดแนว

Java String.indent: จัดย่อหน้าข้อความหลายบรรทัดโดยรู้เรื่อง line ending

พี่โชว์Engineering

การเติม 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