In the XML document I want to find the node that the cursor is in.
I don't think Ace Editor can do this. But I think maybe it keeps track by using indexes system.
What do I mean? Well, in XML there is a hierarchical structure of leaves and branches or ancestors and descendants. If you are keeping track of the number of nodes and locations you can create a system to find it again.
For example take this code:
The root node would be item [0]
. The first descendant of that would be [0][0]
. The second descendant would be [0][1]
. If the second descendant had three descendants then their position would be [0][1][0]
, [0][1][1]
, [0][1][2]
.
Is there a way to get that position in Ace Editor? The reason is I have an XML object in my application. BUT Ace Editor is in JavaScript and it does not support XML or E4X. I can only get a string values from it to pass back to my application.
So I first have to get the node that the cursor is in JavaScript, then I have to find out how to map that back to the XML object in my application.
Right now I've got this far:
var xml:XML = new XML(ace.text);
var token:Object = ace.getTokenAt(ace.row, ace.column);
var type:String = token ? token.type : "";
var tagName:String;
var index:int = token ? token.index : -1; // index = 2
var start:int = token ? token.start : -1; // start = 5
if (type=="meta.tag.tag-name.xml") {
tagName = token.value; // head
}
var matchingTagsList:XMLList = xml.descendants(tagName);
if (matchingTagsList.length()==1) {
var match:XML = matchingTagsList[0];
}
else {
// numerous matches. how to find one from the other?
}
BTW Ace Editor returns an index and start value. I could use that to try to find the matching tag.
I could also, possibly, convert all the XML matches to strings, then if I could get from the range in Ace from the start tag to the end tag I could compare each. But that is really hacky because there are a lot of points of failure. If there are namespaces the strings won't match, if there is whitespace characters the strings won't match, or encoded entities, etc.