docs: private static org.apache.velocity.app.VelocityEngine createEngine(TemplateConfig config) {
  		if (null == config) {
  			config = new TemplateConfig();
  		}
  
  		final org.apache.velocity.app.VelocityEngine ve = new org.apache.velocity.app.VelocityEngine();
  		// 编码
  		final String charsetStr = config.getCharset().toString();
  		ve.setProperty(Velocity.INPUT_ENCODING, charsetStr);
  		// ve.setProperty(Velocity.OUTPUT_ENCODING, charsetStr);
  		ve.setProperty(Velocity.FILE_RESOURCE_LOADER_CACHE, true); // 使用缓存
  
  		// loader
  		switch (config.getResourceMode()) {
  		case CLASSPATH:
  			ve.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
  			break;
  		case FILE:
  			// path
  			final String path = config.getPath();
  			if (null != path) {
  				ve.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path);
  			}
  			break;
  		case WEB_ROOT:
  			ve.setProperty(Velocity.RESOURCE_LOADER, "webapp");
  			ve.setProperty("webapp.resource.loader.class", "org.apache.velocity.tools.view.servlet.WebappLoader");
  			ve.setProperty("webapp.resource.loader.path", StrUtil.nullToDefault(config.getPath(), StrUtil.SLASH));
  			break;
  		case STRING:
  			ve.setProperty(Velocity.RESOURCE_LOADER, "str");
  			ve.setProperty("str.resource.loader.class", SimpleStringResourceLoader.class.getName());
  			break;
  		default:
  			break;
  		}
  
  		ve.init();
  		return ve;
  	}