Esempio n. 1
0
        /// <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);
                }
            }
        }
Esempio n. 2
0
        /// <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);
                }
            }
        }