25 lines
851 B
TypeScript
25 lines
851 B
TypeScript
import type { XmlDocument, XmlElement } from "../language/xmlParser";
|
|
|
|
/** Lowercases nothing; returns the part after the last ":" in a tag name. */
|
|
export function localName(tag: string): string {
|
|
const idx = tag.lastIndexOf(":");
|
|
return idx >= 0 ? tag.slice(idx + 1) : tag;
|
|
}
|
|
|
|
/**
|
|
* Resolves the xpointer subset used by real RA3 mods:
|
|
* xmlns(n=uri:ea.com:eala:asset) xpointer(/n:ElementName/child::*)
|
|
*
|
|
* Returns the container element whose children are selected by the xpointer,
|
|
* or null when the form is unsupported / the container is missing.
|
|
*/
|
|
export function findXPointerContainer(
|
|
doc: XmlDocument,
|
|
xpointer: string,
|
|
): XmlElement | null {
|
|
const m = /xpointer\(\/\w+:(\w+)\/child::\*\)/.exec(xpointer);
|
|
if (!m) return null;
|
|
const name = m[1];
|
|
return doc.elements.find((el) => localName(el.name) === name) ?? null;
|
|
}
|