in freemarker-docgen-core/src/main/java/org/freemarker/docgen/core/Transform.java [1975:2060]
private TOCNode preprocessDOM_buildTOC_inner(Node node,
final int sectionLevel, TOCNode parentTOCNode) {
TOCNode curTOCNode = null;
int newSectionLevel = sectionLevel;
if (node instanceof Element) {
final Element elem = (Element) node;
final String nodeName = node.getNodeName();
if (DOCUMENT_STRUCTURE_ELEMENTS.contains(nodeName)) {
DocumentStructureRank rank = DocumentStructureRank.valueOf(
XMLUtil.getAttribute(elem, A_DOCGEN_RANK)
.toUpperCase());
final boolean isTheDocumentElement
= elem.getParentNode() instanceof Document;
if (isTheDocumentElement
|| rank.compareTo(lowestPageTOCElemenRank) >= 0) {
curTOCNode = new TOCNode(elem, tocNodes.size());
tocNodes.add(curTOCNode);
if ((isTheDocumentElement
|| rank.compareTo(lowestFileElemenRank) >= 0)
&& !hasPrefaceLikeParent(elem)) {
elem.setAttribute(A_DOCGEN_FILE_ELEMENT, "true");
curTOCNode.setFileElement(true);
if (isTheDocumentElement) {
curTOCNode.setOutputFileName(FILE_TOC_HTML);
elem.setAttribute(A_DOCGEN_ROOT_ELEMENT, "true");
} else if (getExternalLinkTOCNodeURLOrNull(elem) != null) {
curTOCNode.setOutputFileName(null);
} else if (AV_INDEX_ROLE.equals(elem.getAttribute(DocBook5Constants.A_ROLE))) {
curTOCNode.setOutputFileName(FILE_INDEX_HTML);
} else {
String id = XMLUtil.getAttribute(elem, "id");
if (id == null) {
throw new BugException("Missing id attribute");
}
String fileName = id + ".html";
if (fileName.equals(FILE_TOC_HTML) || fileName.equals(FILE_DETAILED_TOC_HTML)
|| fileName.equals(FILE_INDEX_HTML) || fileName.equals(FILE_SEARCH_RESULTS_HTML)) {
throw new DocgenException(
XMLUtil.theSomethingElement(elem, true)
+ " has an xml:id that is deduced to "
+ "a reserved output file name, \""
+ fileName + "\". (Hint: Change the "
+ "xml:id.)");
}
curTOCNode.setOutputFileName(fileName);
}
} else { // of: if file element
elem.setAttribute(A_DOCGEN_PAGE_TOC_ELEMENT, "true");
}
elem.setAttribute(A_DOCGEN_DETAILED_TOC_ELEMENT, "true");
} // if ToC element
} // if document structure element
} // if Element
if (curTOCNode != null) {
parentTOCNode = curTOCNode;
}
NodeList children = node.getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
TOCNode child = preprocessDOM_buildTOC_inner(
children.item(i),
newSectionLevel,
parentTOCNode);
if (child != null && parentTOCNode != null) {
child.setParent(parentTOCNode);
TOCNode lastChild = parentTOCNode.getLastChild();
if (lastChild != null) {
child.setPrevious(lastChild);
lastChild.setNext(child);
}
if (parentTOCNode.getFirstChild() == null) {
parentTOCNode.setFirstChild(child);
}
parentTOCNode.setLastChild(child);
}
}
return curTOCNode;
}