package com.github.setial.intellijjavadocs.template.impl; import com.github.setial.intellijjavadocs.exception.SetupTemplateException; import com.github.setial.intellijjavadocs.exception.TemplateNotFoundException; import com.github.setial.intellijjavadocs.template.DocTemplateProcessor; import com.github.setial.intellijjavadocs.utils.XmlUtils; import freemarker.template.Template; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.StringWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; /** * The type Doc template processor impl. * * @author Sergey Timofiychuk */ public class DocTemplateProcessorImpl implements DocTemplateProcessor { private static final List<String> SPECIAL_SYMBOLS = Arrays.asList("_", "$"); @Override public void projectOpened() { } @Override public void projectClosed() { } @Override public void initComponent() { } @Override public void disposeComponent() { } @NotNull @Override public String getComponentName() { return COMPONENT_NAME; } @NotNull @Override public String merge(@NotNull Template template, @NotNull Map<String, Object> params) { StringWriter writer = new StringWriter(); try { template.process(params, writer); return XmlUtils.normalizeTemplate(writer.toString()); } catch (Exception e) { throw new SetupTemplateException(e); } } @NotNull @Override public String buildDescription(@NotNull String description, boolean capitalizeFirst) { if (StringUtils.isBlank(description)) { return StringUtils.EMPTY; } return buildDescription(description, 0, capitalizeFirst); } @NotNull @Override public String buildPartialDescription(@NotNull String description) { if (StringUtils.isBlank(description)) { return StringUtils.EMPTY; } return buildDescription(description, 1, false); } @NotNull @Override public String buildFieldDescription(@NotNull String description) { if (StringUtils.isBlank(description)) { return StringUtils.EMPTY; } String[] parts = StringUtils.splitByCharacterTypeCamelCase(description.replaceAll("<.+>", "")); StringBuilder result = new StringBuilder(); for (int i = 1; i < parts.length; i++) { if (i > 1) { result.append(StringUtils.capitalize(parts[i])); } else { result.append(StringUtils.uncapitalize(parts[i])); } } return result.toString(); } private String buildDescription(String description, int firstElement, boolean capitalizeFirst) { String[] parts = StringUtils.splitByCharacterTypeCamelCase(description.replaceAll("<.+>", "")); parts = removeInterfacePrefix(parts); parts = removeClassSuffix(parts); parts = removeSpecialSymbols(parts); StringBuilder result = new StringBuilder(); for (int i = firstElement; i < parts.length; i++) { if (capitalizeFirst && i == firstElement) { result.append(StringUtils.capitalize(StringUtils.lowerCase(parts[i]))); } else { result.append(StringUtils.lowerCase(parts[i])); } if (i < parts.length - 1) { result.append(" "); } } return result.toString(); } private String[] removeInterfacePrefix(String[] parts) { if (parts != null && parts.length > 0 && "I".equalsIgnoreCase(parts[0])) { parts = Arrays.copyOfRange(parts, 1, parts.length); } return parts; } private String[] removeClassSuffix(String[] parts) { if (parts != null && parts.length > 0 && "Impl".equalsIgnoreCase(parts[parts.length - 1])) { parts = Arrays.copyOfRange(parts, 0, parts.length - 1); } return parts; } private String[] removeSpecialSymbols(String[] parts) { List<String> result = new ArrayList<String>(); for (String part : parts) { if (!SPECIAL_SYMBOLS.contains(part)) { result.add(part); } } return result.toArray(new String[result.size()]); } }