@@ -79,6 +79,53 @@ public static String toValidPropertyName(String input) {
7979 return sb .toString ();
8080 }
8181
82+
83+ /**
84+ * 生成 C# XML doc <summary> 注释块。
85+ * <p>
86+ * 格式固定为:
87+ * <pre>
88+ * /// <summary>
89+ * /// line1
90+ * /// line2
91+ * /// </summary>
92+ * </pre>
93+ *
94+ * @param summary 要放到 <summary> 内的文本,可能包含换行符;为 null 时等同于空串
95+ * @param padLeft 每行前面额外的空格数(缩进)
96+ * @return 完整的多行注释字符串(每行以 '\n' 结尾)
97+ */
98+ public static String generateCSharpSummary (String summary , int padLeft ) {
99+ if (summary == null ) summary = "" ;
100+ if (padLeft < 0 ) padLeft = 0 ;
101+
102+ String indent = " " .repeat (padLeft );
103+ String linePrefix = indent + "/// " ;
104+ StringBuilder sb = new StringBuilder ();
105+
106+ // 简单的 XML 实体转义
107+ java .util .function .Function <String , String > escapeXml = s -> {
108+ if (s == null || s .isEmpty ()) return s ;
109+ return s
110+ .replace ("&" , "&" )
111+ .replace ("<" , "<" )
112+ .replace (">" , ">" )
113+ .replace ("\" " , """ )
114+ .replace ("'" , "'" );
115+ };
116+
117+ // 按行分割(支持 \r\n, \r, \n)
118+ String [] lines = summary .split ("\\ r?\\ n|\\ r" , -1 ); // 保留尾随空行
119+
120+ sb .append (linePrefix ).append ("<summary>" ).append ("\n " );
121+ for (String line : lines ) {
122+ sb .append (linePrefix ).append (escapeXml .apply (line )).append ("\n " );
123+ }
124+ sb .append (linePrefix ).append ("</summary>" );
125+
126+ return sb .toString ();
127+ }
128+
82129 // 简单测试
83130 public static void main (String [] args ) {
84131 System .out .println (toValidPropertyName ("123Name" )); // _23Name
0 commit comments