protected void write(DocGenerator generator, Doc doc, String content) { String outputOpt = processingEnv.getOptions().get("docgen.output"); if (outputOpt != null) { outputOpt = outputOpt.replace("$lang", generator.getName()); String relativeName = doc.resolveRelativeFileName(generator); try { File dir = new File(outputOpt); for (int i = relativeName.indexOf('/'); i != -1; i = relativeName.indexOf('/', i + 1)) { dir = new File(dir, relativeName.substring(0, i)); relativeName = relativeName.substring(i + 1); } ensureDir(dir); File file = new File(dir, relativeName); try (FileWriter writer = new FileWriter(file)) { writer.write(content); } } catch (IOException e) { e.printStackTrace(); } } }
private Map<DocGenerator, DocWriter> handleGen(Doc doc) { Map<DocGenerator, DocWriter> map = new HashMap<>(); for (DocGenerator generator : generators()) { generator.init(processingEnv); DocWriter writer = new DocWriter(); doc.process(generator, writer); map.put(generator, writer); } return map; }
/** * Resolve a label for the specified element, this is used when a link to a program element * does not specify an explicit label.<p/> * <p/> * Subclasses can override it to implement a particular behavior for elements. * * @param elt the elt to resolve a label for * @return the label */ private String resolveLabel(DocGenerator generator, Element elt) { String label = elt.getSimpleName().toString(); if (elt.getModifiers().contains(Modifier.STATIC) && (elt.getKind() == ElementKind.METHOD || elt.getKind() == ElementKind.FIELD)) { label = elt.getEnclosingElement().getSimpleName() + "." + label; } if (elt.getKind() == ElementKind.ANNOTATION_TYPE) { label = "@" +label; } return generator.resolveLabel(elt, label); }
if (helper.hasToBeTranslated(elt)) { fragment = generator.renderSource((ExecutableElement) elt, source); } else { case ENUM: { TypeElement typeElt = (TypeElement) elt; link = generator.resolveTypeLink(typeElt, resolveCoordinate(typeElt)); break; ExecutableElement methodElt = (ExecutableElement) elt; TypeElement typeElt = (TypeElement) methodElt.getEnclosingElement(); link = generator.resolveMethodLink(methodElt, resolveCoordinate(typeElt)); break; ExecutableElement constructorElt = (ExecutableElement) elt; TypeElement typeElt = (TypeElement) constructorElt.getEnclosingElement(); link = generator.resolveConstructorLink(constructorElt, resolveCoordinate(typeElt)); break; VariableElement variableElt = (VariableElement) elt; TypeElement typeElt = (TypeElement) variableElt.getEnclosingElement(); link = generator.resolveFieldLink(variableElt, resolveCoordinate(typeElt)); break;
/** * Return the relative file name of a document. * * @param generator the doc generator * @return the relative file name */ public String resolveRelativeFileName(DocGenerator generator) { Document doc = elt.getAnnotation(Document.class); String relativeName = doc.fileName(); if (relativeName.isEmpty()) { relativeName = elt.getQualifiedName() + getExtension(); } return generator.resolveRelativeFileName(elt, relativeName); } }
@Override public Void visitText(TextTree node, Void v) { String body = node.getBody(); Matcher matcher = Helper.LANG_PATTERN.matcher(body); int prev = 0; while (matcher.find()) { writer.append(body, prev, matcher.start()); if (matcher.group(1) != null) { // \$lang writer.append("$lang"); } else { writer.append(generator.getName()); } prev = matcher.end(); } writer.append(body, prev, body.length()); return super.visitText(node, v); }
state.forEach((doc, m) -> { m.forEach((gen, w) -> { String content = postProcess(gen.getName(), w.render()); write(gen, doc, content); });