package org.nutz.lang.segment;

import java.io.File;

import org.nutz.lang.Files;
import org.nutz.lang.util.Context;

/**
 * 代码片段的帮助函数
 * 
 * @author zozoh(zozohtnt@gmail.com)
 */
public class Segments {

	/**
	 * 根据一个对象填充所有片段的占位符
	 * 
	 * @param seg
	 *            片段
	 * @param obj
	 *            对象
	 * @return 填充后的片段对象
	 */
	public static Segment fill(Segment seg, Object obj) {
		if (null == obj || null == seg)
			return seg;
		return seg.setBy(obj);
	}

	/**
	 * 根据一个文件生成一个代码片段
	 * 
	 * @param f
	 *            文件
	 * @return 片段对象
	 */
	public static Segment read(File f) {
		String txt = Files.read(f);
		return new CharSegment(txt);
	}

	/**
	 * 根据字符串片段，将上下文对象替换对应占位符。未赋值的占位符维持原样
	 * <p>
	 * 比如：
	 * 
	 * @param seg
	 *            片段对象
	 * @param context
	 *            上下文对象
	 * @return 替换后的字符串
	 */
	public static String replace(Segment seg, Context context) {
		if (null == seg)
			return null;
		if (null == context)
			return seg.render().toString();
		
		return seg.render(context).toString();
	}

	/**
	 * 根据字符串片段，将上下文对象替换对应占位符。未赋值的占位符维持原样
	 * 
	 * @param pattern
	 *            字符串片段
	 * @param context
	 *            上下文对象
	 * @return 替换后的字符串
	 */
	public static String replace(String pattern, Context context) {
		if (null == context)
			return pattern;
		return replace(new CharSegment(pattern), context);
	}

	/**
	 * 根据一段字符串生成一个代码片段
	 * 
	 * @param str
	 *            字符串
	 * @return 片段对象
	 */
	public static Segment create(String str) {
		return new CharSegment(str);
	}
}

@@ -959,70 +959,127 @@
 l;%0D%0A
-%09%09if (null == context)%0D%0A%09%09%09return seg.render().toString(
+%0D%0A%09%09// %E5%A2%9E%E5%8A%A0%E7%BC%BA%E5%A4%B1%E7%9A%84%E5%8D%A0%E4%BD%8D%E7%AC%A6%E5%8F%B7%0D%0A%09%09for (String key : seg.keys())%0D%0A%09%09%09if (!context.has(key))%0D%0A%09%09%09%09context.set(key, %22$%7B%22 + key + %22%7D%22
 );%0D%0A
-%09%09
 %0D%0A%09%09

修正 Segments.replace 的错误，应该自动增加缺失的占位符，Mvc 的 Message 要用