/// <summary> /// Split on token recursively /// </summary> /// <param name="el"></param> /// <param name="token"></param> protected void splitOnToken(DataElement el, char token) { if (el is Dom.String) { var strEl = (Dom.String)el; var str = (string)el.DefaultValue; var tokenIndex = str.IndexOf(token); if (tokenIndex == -1) { return; } var preString = new Dom.String() { stringType = strEl.stringType }; var tokenString = new Dom.String() { stringType = strEl.stringType }; var postString = new Dom.String() { stringType = strEl.stringType }; preString.stringType = encodingType; tokenString.stringType = encodingType; postString.stringType = encodingType; preString.DefaultValue = new Variant(str.Substring(0, tokenIndex)); tokenString.DefaultValue = new Variant(token.ToString()); postString.DefaultValue = new Variant(str.Substring(tokenIndex + 1)); var block = new Dom.Block(el.name); block.Add(preString); block.Add(tokenString); block.Add(postString); el.parent[el.name] = block; splitOnToken(postString, token); } else if (el is Dom.Block) { List <DataElement> children = new List <DataElement>(); foreach (DataElement child in ((Block)el)) { children.Add(child); } foreach (DataElement child in children) { splitOnToken(child, token); } } }
/// <summary> /// Split on token recursively /// </summary> /// <param name="el"></param> /// <param name="token"></param> /// <param name="offset"></param> protected void splitOnToken(DataElement el, char token, ref long offset) { if (el is Dom.String) { var strEl = (Dom.String)el; var str = (string)el.DefaultValue; var tokenIndex = str.IndexOf(token); if (tokenIndex == -1) { if (positions != null) { offset = positions[el].end; } return; } var preString = new Dom.String() { stringType = strEl.stringType }; var tokenString = new Dom.String() { stringType = strEl.stringType }; var postString = new Dom.String() { stringType = strEl.stringType }; preString.stringType = encodingType; tokenString.stringType = encodingType; postString.stringType = encodingType; preString.DefaultValue = new Variant(str.Substring(0, tokenIndex)); tokenString.DefaultValue = new Variant(token.ToString()); postString.DefaultValue = new Variant(str.Substring(tokenIndex + 1)); var block = new Dom.Block(el.name); block.Add(preString); block.Add(tokenString); block.Add(postString); el.parent[el.name] = block; if (positions != null) { var lenPre = 8 * encoding.GetByteCount((string)preString.DefaultValue); var lenToken = 8 * encoding.GetByteCount((string)tokenString.DefaultValue); var lenPost = 8 * encoding.GetByteCount((string)postString.DefaultValue); var prePos = new Position() { begin = offset, end = offset + lenPre }; var tokenPos = new Position() { begin = prePos.end, end = prePos.end + lenToken }; var postPos = new Position() { begin = tokenPos.end, end = tokenPos.end + lenPost }; var blockPos = new Position() { begin = prePos.begin, end = postPos.end }; positions.Remove(el); positions[block] = blockPos; positions[preString] = prePos; positions[tokenString] = tokenPos; positions[postString] = postPos; offset = postPos.begin; } splitOnToken(postString, token, ref offset); } else if (el is Dom.Block) { List <DataElement> children = new List <DataElement>(); foreach (DataElement child in ((Block)el)) { children.Add(child); } foreach (DataElement child in children) { splitOnToken(child, token, ref offset); } } }