// Path: xDoc-core/src/main/java/org/treeleafj/xdoc/format/Format.java
// public interface Format {
// 
//     String format(ApiDoc apiDoc);
// }
// 
// Path: xDoc-core/src/main/java/org/treeleafj/xdoc/model/http/HttpApiAction.java
// @Data
// public class HttpApiAction extends ApiAction {
// 
//     /**
//      * 访问的uri地址
//      */
//     private List<String> uris;
// 
//     /**
//      * 允许的访问方法:POST,GET,DELETE,PUT等, 如果没有,则无限制
//      */
//     private List<String> methods;
// 
//     /**
//      * 入参
//      */
//     private List<HttpParam> params = new ArrayList<>(0);
// 
//     /**
//      * 请求参数对象
//      */
//     private List<ObjectInfo> paramObjs = new ArrayList<>(0);
// 
//     /**
//      * 返回对象
//      */
//     private ObjectInfo returnObj;
// 
//     /**
//      * 出参
//      */
//     private List<HttpParam> respParam = new ArrayList<>(0);
// 
//     /**
//      * 返回描述
//      */
//     private String returnDesc;
// 
//     /**
//      * 返回的数据
//      */
//     private String respbody;
// 
//     /**
//      * 是否返回json
//      */
//     private boolean json;
// 
// 
// }
// 
// Path: xDoc-core/src/main/java/org/treeleafj/xdoc/model/http/HttpParam.java
// @Data
// public class HttpParam {
// 
//     /**
//      * 参数名
//      */
//     private String paramName;
// 
//     /**
//      * 参数描述
//      */
//     private String paramDesc;
// 
//     /**
//      * 是否必填,默认false
//      */
//     private boolean require;
// 
//     /**
//      * 类型
//      */
//     private String paramType;
// }
// 
// Path: xDoc-core/src/main/java/org/treeleafj/xdoc/utils/JsonUtils.java
// public class JsonUtils {
// 
//     private static ObjectMapper objectMapper = new ObjectMapper();
// 
//     static {
//         objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
//         objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
//     }
// 
//     /**
//      * 将一个对象转为json字符窜
//      */
//     public static String toJson(Object obj) {
//         try {
//             return objectMapper.writeValueAsString(obj);
//         } catch (JsonProcessingException e) {
//             throw new RuntimeException(e);
//         }
//     }
// 
// 
//     /**
//      * 格式化json字符串
//      *
//      * @param jsonStr 未格式化前的JSON窜
//      * @return 格式化好的JSON窜
//      */
//     public static String formatJson(String jsonStr) {
//         if (StringUtils.isBlank(jsonStr)) {
//             return StringUtils.EMPTY;
//         }
//         StringBuilder sb = new StringBuilder();
//         char last;
//         char current = '\0';
//         int indent = 0;
//         for (int i = 0; i < jsonStr.length(); i++) {
//             last = current;
//             current = jsonStr.charAt(i);
//             switch (current) {
//                 case '{':
//                 case '[':
//                     sb.append(current);
//                     sb.append('\n');
//                     indent++;
//                     addIndentBlank(sb, indent);
//                     break;
//                 case '}':
//                 case ']':
//                     sb.append('\n');
//                     indent--;
//                     addIndentBlank(sb, indent);
//                     sb.append(current);
//                     break;
//                 case ',':
//                     sb.append(current);
//                     if (last != '\\') {
//                         sb.append('\n');
//                         addIndentBlank(sb, indent);
//                     }
//                     break;
//                 default:
//                     sb.append(current);
//             }
//         }
// 
//         return sb.toString();
//     }
// 
//     /**
//      * 添加space
//      *
//      * @param sb     要追加空格的字符串
//      * @param indent 追加的空格数
//      */
//     private static void addIndentBlank(StringBuilder sb, int indent) {
//         for (int i = 0; i < indent; i++) {
//             sb.append('\t');
//         }
//     }
// }


import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.treeleafj.xdoc.format.Format;
import org.treeleafj.xdoc.model.*;
import org.treeleafj.xdoc.model.http.HttpApiAction;
import org.treeleafj.xdoc.model.http.HttpParam;
import org.treeleafj.xdoc.utils.JsonUtils;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
package org.treeleafj.xdoc.format.http;



/**
 * Created by leaf on 2017/3/4.
 */
public class MarkdownFormat implements Format {

    private Logger log = LoggerFactory.getLogger(getClass());

    private VelocityTemplater templater = new VelocityTemplater("org/treeleafj/xdoc/format/http/markdown.vm");

    @Override
    public String format(ApiDoc apiDoc) {
        StringBuilder sb = new StringBuilder();
        for (ApiModule apiModule : apiDoc.getApiModules()) {
            sb.append(format(apiModule)).append("\n\n");
        }
        return sb.toString();
    }

    private String format(ApiModule apiModule) {

        for (ApiAction apiAction : apiModule.getApiActions()) {
// Path: xDoc-core/src/main/java/org/treeleafj/xdoc/format/Format.java
// public interface Format {
// 
//     String format(ApiDoc apiDoc);
// }
// 
// Path: xDoc-core/src/main/java/org/treeleafj/xdoc/model/http/HttpApiAction.java
// @Data
// public class HttpApiAction extends ApiAction {
// 
//     /**
//      * 访问的uri地址
//      */
//     private List<String> uris;
// 
//     /**
//      * 允许的访问方法:POST,GET,DELETE,PUT等, 如果没有,则无限制
//      */
//     private List<String> methods;
// 
//     /**
//      * 入参
//      */
//     private List<HttpParam> params = new ArrayList<>(0);
// 
//     /**
//      * 请求参数对象
//      */
//     private List<ObjectInfo> paramObjs = new ArrayList<>(0);
// 
//     /**
//      * 返回对象
//      */
//     private ObjectInfo returnObj;
// 
//     /**
//      * 出参
//      */
//     private List<HttpParam> respParam = new ArrayList<>(0);
// 
//     /**
//      * 返回描述
//      */
//     private String returnDesc;
// 
//     /**
//      * 返回的数据
//      */
//     private String respbody;
// 
//     /**
//      * 是否返回json
//      */
//     private boolean json;
// 
// 
// }
// 
// Path: xDoc-core/src/main/java/org/treeleafj/xdoc/model/http/HttpParam.java
// @Data
// public class HttpParam {
// 
//     /**
//      * 参数名
//      */
//     private String paramName;
// 
//     /**
//      * 参数描述
//      */
//     private String paramDesc;
// 
//     /**
//      * 是否必填,默认false
//      */
//     private boolean require;
// 
//     /**
//      * 类型
//      */
//     private String paramType;
// }
// 
// Path: xDoc-core/src/main/java/org/treeleafj/xdoc/utils/JsonUtils.java
// public class JsonUtils {
// 
//     private static ObjectMapper objectMapper = new ObjectMapper();
// 
//     static {
//         objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
//         objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
//     }
// 
//     /**
//      * 将一个对象转为json字符窜
//      */
//     public static String toJson(Object obj) {
//         try {
//             return objectMapper.writeValueAsString(obj);
//         } catch (JsonProcessingException e) {
//             throw new RuntimeException(e);
//         }
//     }
// 
// 
//     /**
//      * 格式化json字符串
//      *
//      * @param jsonStr 未格式化前的JSON窜
//      * @return 格式化好的JSON窜
//      */
//     public static String formatJson(String jsonStr) {
//         if (StringUtils.isBlank(jsonStr)) {
//             return StringUtils.EMPTY;
//         }
//         StringBuilder sb = new StringBuilder();
//         char last;
//         char current = '\0';
//         int indent = 0;
//         for (int i = 0; i < jsonStr.length(); i++) {
//             last = current;
//             current = jsonStr.charAt(i);
//             switch (current) {
//                 case '{':
//                 case '[':
//                     sb.append(current);
//                     sb.append('\n');
//                     indent++;
//                     addIndentBlank(sb, indent);
//                     break;
//                 case '}':
//                 case ']':
//                     sb.append('\n');
//                     indent--;
//                     addIndentBlank(sb, indent);
//                     sb.append(current);
//                     break;
//                 case ',':
//                     sb.append(current);
//                     if (last != '\\') {
//                         sb.append('\n');
//                         addIndentBlank(sb, indent);
//                     }
//                     break;
//                 default:
//                     sb.append(current);
//             }
//         }
// 
//         return sb.toString();
//     }
// 
//     /**
//      * 添加space
//      *
//      * @param sb     要追加空格的字符串
//      * @param indent 追加的空格数
//      */
//     private static void addIndentBlank(StringBuilder sb, int indent) {
//         for (int i = 0; i < indent; i++) {
//             sb.append('\t');
//         }
//     }
// }


// Path: xDoc-core/src/main/java/org/treeleafj/xdoc/format/http/MarkdownFormat.java
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.treeleafj.xdoc.format.Format;
import org.treeleafj.xdoc.model.*;
import org.treeleafj.xdoc.model.http.HttpApiAction;
import org.treeleafj.xdoc.model.http.HttpParam;
import org.treeleafj.xdoc.utils.JsonUtils;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

package org.treeleafj.xdoc.format.http;



/**
 * Created by leaf on 2017/3/4.
 */
public class MarkdownFormat implements Format {

    private Logger log = LoggerFactory.getLogger(getClass());

    private VelocityTemplater templater = new VelocityTemplater("org/treeleafj/xdoc/format/http/markdown.vm");

    @Override
    public String format(ApiDoc apiDoc) {
        StringBuilder sb = new StringBuilder();
        for (ApiModule apiModule : apiDoc.getApiModules()) {
            sb.append(format(apiModule)).append("\n\n");
        }
        return sb.toString();
    }

    private String format(ApiModule apiModule) {

        for (ApiAction apiAction : apiModule.getApiActions()) {
            HttpApiAction saa = (HttpApiAction) apiAction;