package org.develnext.jphp.genapi.template; import org.develnext.jphp.genapi.description.*; import java.io.File; import java.util.Collection; abstract public class BaseTemplate { protected final StringBuilder sb = new StringBuilder(); protected final String language; protected final String languageName; public BaseTemplate(String language, String languageName) { this.language = language; this.languageName = languageName; } protected String subString(String s, int offset, int maxLen) { int len = s.length(); if (offset + maxLen > len) maxLen = len; return s.substring(offset, offset + maxLen); } protected String getDescription(String source, String lang) { StringBuilder origin = new StringBuilder(); StringBuilder translated = null; boolean breakOrigin = false; for(int i = 0; i < source.length(); i++) { char ch = source.charAt(i); if (ch == '-' && i + 6 < source.length() + 1 && subString(source, i, 6).matches("^--[A-Za-z]{2}--$")) { if (translated != null) break; String name = source.substring(i + 2, i + 4); if (name.equalsIgnoreCase(lang)) translated = new StringBuilder(); else breakOrigin = true; i += 6; } else { if (translated == null) { if (!breakOrigin) origin.append(source.charAt(i)); } else translated.append(source.charAt(i)); } } return translated != null ? translated.toString().trim() : origin.toString().trim(); } public String printClass(ClassDescription description) { sb.delete(0, sb.length()); onBeforeClass(description); print(description); onAfterClass(description); if (!description.getConstants().isEmpty()) { onBeforeConstants(description); for(ConstantDescription el : description.getConstants()) { onBeforeConstant(el); print(el); onAfterConstant(el); } onAfterConstants(description); } if (!description.getProperties().isEmpty()) { onBeforeProperties(description); for(PropertyDescription el : description.getProperties()) { onBeforeProperty(el); print(el); onAfterProperty(el); } onAfterProperties(description); } if (!description.getMethods().isEmpty()) { onBeforeMethods(description); for (MethodDescription el : description.getMethods()) { onBeforeMethod(el); print(el); for(ArgumentDescription arg : el.getArguments()) { onBeforeArgument(arg, el); print(arg); onAfterArgument(arg, el); } onAfterMethod(el); } onAfterMethods(description); } onAfterClassBody(description); return sb.toString(); } protected String printFunction(FunctionDescription description) { sb.delete(0, sb.length()); onBeforeFunction(description); print(description); Collection<ArgumentDescription> args = description.getArguments(); for(ArgumentDescription arg : args) { onBeforeArgument(arg, description); print(arg); onAfterArgument(arg, description); } onAfterFunction(description); return sb.toString(); } protected void onBeforeClass(ClassDescription desc) { } protected void onAfterClass(ClassDescription desc) { } protected void onBeforeFunction(FunctionDescription desc) { } protected void onAfterFunction(FunctionDescription desc) { } protected void onBeforeConstants(ClassDescription desc) {} protected void onAfterConstants(ClassDescription desc) {} protected void onBeforeConstant(ConstantDescription desc) { } protected void onAfterConstant(ConstantDescription desc) { } protected void onBeforeProperties(ClassDescription desc) { } protected void onAfterProperties(ClassDescription desc) { } protected void onBeforeProperty(PropertyDescription desc) { } protected void onAfterProperty(PropertyDescription desc) { } protected void onBeforeMethods(ClassDescription desc) { } protected void onAfterMethods(ClassDescription desc) { } protected void onBeforeMethod(MethodDescription desc) { } protected void onAfterMethod(MethodDescription desc) { } protected void onAfterClassBody(ClassDescription desc) { } protected void onBeforeArgument(ArgumentDescription desc, FunctionDescription function) { } protected void onAfterArgument(ArgumentDescription desc, FunctionDescription function) { } abstract protected void print(ClassDescription description); abstract protected void print(ConstantDescription description); abstract protected void print(PropertyDescription description); abstract protected void print(MethodDescription description); abstract protected void print(FunctionDescription description); abstract protected void print(ArgumentDescription description); public void onEnd(File targetDirectory) { } }