annotate method
void
annotate(
- Document doc
for each entry, modify the whole dom tree, and then next entry
Implementation
void annotate(dom.Document doc) {
final matchedEntries = <String, GlossaryItem>{};
for (final entry in entries) {
final name = entry.name;
final regex = (_regexCache[name] ??= _makeRegExp(name));
List<dom.Node>? replacing;
doc.visit((node) {
if (node is dom.Element && _isIgnored(node)) {
return false;
}
if (node.nodeType != dom.Node.TEXT_NODE) {
return true;
}
final data = (node as dom.Text).data;
if (data.trim().isEmpty) {
return true;
}
final e = _replaceNode(node, regex, (m) {
matchedEntries[entry.name] = entry;
return '<span class="glossary-item" data-target="glossary-${entry.id}">$name</span>';
});
if (e != null) {
final parent = node.parent;
parent?.insertBefore(e, node);
final list = (replacing ??= <dom.Node>[]);
list.add(node);
}
return true;
});
/// remove replacing nodes after traversal
replacing?.forEach((e) {
e.remove();
});
}
final container = doc.getElementById('body-container');
if (container != null) {
for (final entry in matchedEntries.values) {
final (id, desc) = (entry.id, entry.desc);
final rawHtml = desc == null
? null
: '<div id="glossary-$id" class="glossary-detail">$desc</div>';
if (rawHtml != null) {
container.append(dom.Element.html(rawHtml));
}
}
}
}