in freemarker-docgen-core/src/main/java/org/freemarker/docgen/core/Transform.java [1494:1649]
private void preprocessDOM_misc_inner(
Node node,
PreprocessDOMMisc_GlobalState globalState,
PreprocessDOMMisc_ParentSectState parentSectState)
throws SAXException, DocgenException {
if (node instanceof Element) {
Element elem = (Element) node;
// xml:id -> id:
String id = XMLUtil.getAttribute(elem, "xml:id");
if (id != null) {
if (id.startsWith(AUTO_ID_PREFIX)) {
throw new DocgenException(
XMLUtil.theSomethingElement(elem, true)
+ " uses a reserved xml:id, "
+ TextUtil.jQuote(id) + ". All ID-s starting with "
+ "\"" + AUTO_ID_PREFIX + "\" are reserved for "
+ "Docgen.");
}
if (id.startsWith(DOCGEN_ID_PREFIX)) {
throw new DocgenException(
XMLUtil.theSomethingElement(elem, true)
+ " uses a reserved xml:id, "
+ TextUtil.jQuote(id) + ". All ID-s starting with "
+ "\"" + DOCGEN_ID_PREFIX + "\" are reserved for "
+ "Docgen.");
}
elem.setAttribute("id", id);
}
final String elemName = node.getNodeName();
// Add auto id-s:
if (id == null && GUARANTEED_ID_ELEMENTS.contains(elemName)) {
globalState.lastId++;
id = AUTO_ID_PREFIX + globalState.lastId;
elem.setAttribute("id", id);
}
if (id != null) {
elementsById.put(id, elem);
}
// Add default titles:
if (elemName.equals(E_PREFACE)
|| elemName.equals(E_GLOSSARY)
|| elemName.equals(E_INDEX)) {
ensureTitleExists(
elem,
Character.toUpperCase(elemName.charAt(0))
+ elemName.substring(1));
// Simplify tables:
} else if (
(elemName.equals(E_INFORMALTABLE)
|| elemName.equals(E_TABLE))
&& elem.getNamespaceURI().equals(XMLNS_DOCBOOK5)) {
TableSimplifier.simplify(elem);
// Collect index terms:
} else if (elemName.equals(E_INDEXTERM)) {
addIndexTerm(node);
} else if (elemName.equals(E_IMAGEDATA)) {
String ref = XMLUtil.getAttribute(elem, A_FILEREF);
String loRef = ref.toLowerCase();
if (!loRef.startsWith("http://")
&& !loRef.startsWith("https://")
&& !ref.startsWith("/")) {
if (!new File(contentDir, ref.replace('/', File.separatorChar)).isFile()) {
throw new DocgenException(
XMLUtil.theSomethingElement(elem) + " refers "
+ "to a missing file: \""
+ ref.replace("\"", """) + "\"");
}
}
if (loRef.endsWith(".svg")) {
String pngRef = ref.substring(0, ref.length() - 4) + ".png";
if (!new File(contentDir, pngRef.replace('/', File.separatorChar)).isFile()) {
throw new DocgenException(
XMLUtil.theSomethingElement(elem)
+ " refers to an SVG file for which the fallback PNG file is missing: \""
+ pngRef.replace("\"", """) + "\"");
}
}
}
// Adding title prefixes to document structure elements:
if (DOCUMENT_STRUCTURE_ELEMENTS.contains(elemName)) {
final String prefix;
if (elem.getParentNode() instanceof Document) {
// The document element is never prefixed
prefix = null;
} else if (hasPrefaceLikeParent(elem)) {
prefix = null;
} else if (numberedSections
&& elemName.equals(E_SECTION)) {
prefix = String.valueOf(
parentSectState.arabicNumber++);
} else if (elemName.equals(E_CHAPTER)) {
prefix = String.valueOf(
parentSectState.arabicNumber++);
} else if (elemName.equals(E_PART)) {
prefix = TextUtil.toUpperRomanNumber(
parentSectState.upperRomanNumber++);
} else if (elemName.equals(E_APPENDIX)) {
prefix = TextUtil.toUpperLatinNumber(
parentSectState.upperLatinNumber++);
} else if (elemName.equals(E_ARTICLE)) {
prefix = TextUtil.toLowerRomanNumber(
parentSectState.lowerRomanNumber++);
} else {
prefix = null;
}
if (prefix != null) {
final String fullPrefix;
final Node parent = elem.getParentNode();
if (parent instanceof Element
// Don't inherit prefix from "part" rank:
&& !parent.getLocalName().equals(E_PART)
// Don't inherit prefix from "article":
&& !parent.getLocalName().equals(E_ARTICLE)) {
String inhPrefix = XMLUtil.getAttribute(
(Element) parent, A_DOCGEN_TITLE_PREFIX);
if (inhPrefix != null) {
if (inhPrefix.endsWith(".")) {
fullPrefix = inhPrefix + prefix;
} else {
fullPrefix = inhPrefix + "." + prefix;
}
} else {
fullPrefix = prefix;
}
} else {
fullPrefix = prefix;
}
elem.setAttribute(A_DOCGEN_TITLE_PREFIX, fullPrefix);
} // if prefix != null
elem.setAttribute(
A_DOCGEN_UNITED_NUMBERING,
String.valueOf(parentSectState.unitedNumber++));
// We will be the parent document structure element of the soon
// processed children:
parentSectState = new PreprocessDOMMisc_ParentSectState();
} // if document structure element
} // if element
NodeList children = node.getChildNodes();
int ln = children.getLength();
for (int i = 0; i < ln; i++) {
preprocessDOM_misc_inner(
children.item(i),
globalState, parentSectState);
}
}