use std::sync::atomic::{AtomicU64, Ordering};
use crate::namespaces::{PT, W};
use crate::xmllinq::{Dom, NodeId};
static UNID_COUNTER: AtomicU64 = AtomicU64::new(1);
pub fn generate_unid() -> String {
let n = UNID_COUNTER.fetch_add(1, Ordering::Relaxed);
format!("{n:032x}")
}
pub fn assign_to_all_elements(dom: &mut Dom, content_parent: NodeId) {
let unid = PT::unid();
if let Some(name) = dom.name(content_parent)
&& (name == W::footnote() || name == W::endnote())
&& dom.attribute(content_parent, &unid).is_none()
{
let v = generate_unid();
dom.set_attribute_value(content_parent, &unid, Some(&v));
}
for d in dom.descendants(content_parent, None) {
if dom.attribute(d, &unid).is_none() {
let v = generate_unid();
dom.set_attribute_value(d, &unid, Some(&v));
}
}
}
pub fn assign_to_self_and_descendants(dom: &mut Dom, root: NodeId) {
let unid = PT::unid();
if dom.attribute(root, &unid).is_none() {
let v = generate_unid();
dom.set_attribute_value(root, &unid, Some(&v));
}
for d in dom.descendants(root, None) {
if dom.attribute(d, &unid).is_none() {
let v = generate_unid();
dom.set_attribute_value(d, &unid, Some(&v));
}
}
}