Exemple #1
0
        public static string DelimiterToString(DelimiterEnum delimiter)
        {
            switch (delimiter)
            {
            case DelimiterEnum.C:
                return(":");

            case DelimiterEnum.CC:
                return("::");

            case DelimiterEnum.CCC:
                return(":::");

            case DelimiterEnum.E:
                return("=");

            case DelimiterEnum.EC:
                return("=:");

            case DelimiterEnum.ECC:
                return("=::");

            case DelimiterEnum.EE:
                return("==");

            case DelimiterEnum.CE:
                return(":=");
            }
            return("");
        }
        private string GetValue(ICharStream input, DelimiterEnum delimiter,
                                int valueQuotesType, Interval valueInterval, int valueIndent)
        {
            if (valueInterval == null)
            {
                if (delimiter == DelimiterEnum.E || delimiter == DelimiterEnum.EE)
                {
                    return(string.Empty);
                }
                return(null);
            }
            if (valueInterval.Begin.Index == -1)
            {
                return(string.Empty);
            }
            if (valueQuotesType == (int)QuotesEnum.Single || valueQuotesType == (int)QuotesEnum.Double)
            {
                var c = ((ITextSource)input).GetChar(valueInterval.End.Index);
                var missingValueQuote = valueQuotesType == (int)QuotesEnum.Single && c != '\'' ||
                                        valueQuotesType == (int)QuotesEnum.Double && c != '"';
                if (!missingValueQuote)
                {
                    return(GetValueFromValueInterval((ITextSource)input, delimiter, valueQuotesType,
                                                     valueInterval.Begin.Index + 1, valueInterval.End.Index - 1, valueIndent));
                }

                return(GetValueFromValueInterval((ITextSource)input, delimiter, valueQuotesType,
                                                 valueInterval.Begin.Index + 1, valueInterval.End.Index, valueIndent));
            }
            return(GetValueFromValueInterval((ITextSource)input, delimiter, valueQuotesType,
                                             valueInterval.Begin.Index, valueInterval.End.Index, valueIndent));
        }
        private void SetValueType(DOM.Mapped.IMappedPair pair, DelimiterEnum delimiter, string value, int valueQuotesType)
        {
            switch (delimiter)
            {
            case DelimiterEnum.CE:
                pair.ValueType = ValueType.PairValue;
                return;

            case DelimiterEnum.EC:
                pair.ValueType = ValueType.Concatenation;
                return;

            case DelimiterEnum.ECC:
                pair.ValueType = ValueType.LiteralChoice;
                return;

            case DelimiterEnum.C:
            case DelimiterEnum.CC:
            case DelimiterEnum.CCC:
                pair.ValueType = ValueType.Object;
                return;
            }
            if (value == null)
            {
                return;
            }

            if (valueQuotesType == 1)
            {
                pair.ValueType = ValueType.SingleQuotedString;
                return;
            }
            if (valueQuotesType == 2)
            {
                pair.ValueType = ValueType.DoubleQuotedString;
                return;
            }
            if (delimiter == DelimiterEnum.E)
            {
                pair.ValueType = GetJsonValueType(value, ValueType.FreeOpenString);
                return;
            }

            if (delimiter == DelimiterEnum.EE)
            {
                pair.ValueType = GetJsonValueType(value, ValueType.OpenString);
                return;
            }
        }
        public Pair CreateMappedPair(ICharStream input, int nameQuotesType, Interval nameInterval, DelimiterEnum delimiter,
                                     Interval delimiterInterval, int valueQuotesType, Interval valueInterval, int valueIndent)
        {
            var name = GetName(input, nameQuotesType, nameInterval);

            if (nameQuotesType > 0)
            {
                return new Mapped.Element()
                       {
                           Name               = name,
                           NameQuotesType     = nameQuotesType,
                           NameInterval       = nameInterval,
                           Delimiter          = delimiter,
                           DelimiterInterval  = delimiterInterval,
                           Value              = GetValue(input, delimiter, valueQuotesType, valueInterval, valueIndent),
                           ValueQuotesType    = valueQuotesType,
                           ValueInterval      = valueInterval,
                           InterpolationItems = null,
                           ValueIndent        = valueIndent
                       }
            }
            ;
            if (name.StartsWith("@"))
            {
                return new Mapped.Attribute
                       {
                           NsPrefix           = null,
                           Name               = name.Substring(1),
                           NameInterval       = nameInterval,
                           Delimiter          = delimiter,
                           DelimiterInterval  = delimiterInterval,
                           Value              = GetValue(input, delimiter, valueQuotesType, valueInterval, valueIndent),
                           ValueQuotesType    = valueQuotesType,
                           ValueInterval      = valueInterval,
                           InterpolationItems = null,
                           ValueIndent        = valueIndent
                       }
            }
            ;
            if (name.StartsWith("!$"))
            {
                return new Mapped.AliasDefinition
                       {
                           Name               = name.Substring(2),
                           NameInterval       = nameInterval,
                           Delimiter          = delimiter,
                           DelimiterInterval  = delimiterInterval,
                           Value              = GetValue(input, delimiter, valueQuotesType, valueInterval, valueIndent),
                           ValueQuotesType    = valueQuotesType,
                           ValueInterval      = valueInterval,
                           InterpolationItems = null,
                           ValueIndent        = valueIndent
                       }
            }
            ;
            if (name.StartsWith("!#"))
            {
                return new Mapped.NamespaceDefinition
                       {
                           Name               = name.Substring(2),
                           NameInterval       = nameInterval,
                           Delimiter          = delimiter,
                           DelimiterInterval  = delimiterInterval,
                           Value              = GetValue(input, delimiter, valueQuotesType, valueInterval, valueIndent),
                           ValueQuotesType    = valueQuotesType,
                           ValueInterval      = valueInterval,
                           InterpolationItems = null,
                           ValueIndent        = valueIndent
                       }
            }
            ;
            if (name.StartsWith("!%"))
            {
                return new Mapped.Parameter
                       {
                           Name               = name.Substring(2),
                           NameInterval       = nameInterval,
                           Delimiter          = delimiter,
                           DelimiterInterval  = delimiterInterval,
                           Value              = GetValue(input, delimiter, valueQuotesType, valueInterval, valueIndent),
                           ValueQuotesType    = valueQuotesType,
                           ValueInterval      = valueInterval,
                           InterpolationItems = null,
                           ValueIndent        = valueIndent
                       }
            }
            ;
            if (name.StartsWith("!"))
            {
                return new Mapped.Document
                       {
                           Name               = name.Substring(1),
                           NameInterval       = nameInterval,
                           Delimiter          = delimiter,
                           DelimiterInterval  = delimiterInterval,
                           Value              = GetValue(input, delimiter, valueQuotesType, valueInterval, valueIndent),
                           ValueQuotesType    = valueQuotesType,
                           ValueInterval      = valueInterval,
                           InterpolationItems = null,
                           ValueIndent        = valueIndent
                       }
            }
            ;
            if (name.StartsWith("$"))
            {
                return new Mapped.Alias()
                       {
                           Name               = name.Substring(1),
                           NameInterval       = nameInterval,
                           Delimiter          = delimiter,
                           DelimiterInterval  = delimiterInterval,
                           Value              = GetValue(input, delimiter, valueQuotesType, valueInterval, valueIndent),
                           ValueQuotesType    = valueQuotesType,
                           ValueInterval      = valueInterval,
                           InterpolationItems = null,
                           ValueIndent        = valueIndent
                       }
            }
            ;
            if (name.StartsWith("%"))
            {
                return new Mapped.Argument()
                       {
                           Name               = name.Substring(1),
                           NameInterval       = nameInterval,
                           Delimiter          = delimiter,
                           DelimiterInterval  = delimiterInterval,
                           Value              = GetValue(input, delimiter, valueQuotesType, valueInterval, valueIndent),
                           ValueQuotesType    = valueQuotesType,
                           ValueInterval      = valueInterval,
                           InterpolationItems = null,
                           ValueIndent        = valueIndent
                       }
            }
            ;
            if (name.StartsWith("#"))
            {
                return new Mapped.Scope
                       {
                           NsPrefix          = name.Substring(1),
                           NameInterval      = nameInterval,
                           Delimiter         = delimiter,
                           DelimiterInterval = delimiterInterval
                       }
            }
            ;
            var tuple = Mapped.Element.GetNameAndNs(name, nameQuotesType);

            return(new Mapped.Element()
            {
                NsPrefix = string.IsNullOrEmpty(tuple.Item1) ? null : tuple.Item1,
                Name = tuple.Item2,
                NameQuotesType = nameQuotesType,
                NameInterval = nameInterval,
                Delimiter = delimiter,
                DelimiterInterval = delimiterInterval,
                Value = GetValue(input, delimiter, valueQuotesType, valueInterval, valueIndent),
                ValueQuotesType = valueQuotesType,
                ValueInterval = valueInterval,
                InterpolationItems = null,
                ValueIndent = valueIndent
            });
        }
        public static string GetValueFromValueInterval(ITextSource charStream, DelimiterEnum delimiter,
                                                       int valueQuotesType, int begin, int end, int valueIndent)
        {
            var sb = new StringBuilder();
            //Splitting text. Getting array of text lines
            var lines = charStream.GetText(begin, end).Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);

            bool folded = lines.Length > 1 && delimiter == DelimiterEnum.EE &&
                          (valueQuotesType == (int)QuotesEnum.None || valueQuotesType == (int)QuotesEnum.Double);

            var first                   = true;
            var firstEmptyLine          = true; //If true then previous line was not empty therefor newline shouldn't be added
            var checkIfFirstLineIsEmpty = true;

            foreach (var item in lines)
            {
                var line = TrimEndOfFoldedStringLine(item, folded);
                if (checkIfFirstLineIsEmpty)  //ignoring first empty line for open strings
                {
                    checkIfFirstLineIsEmpty = false;
                    if (valueQuotesType == (int)QuotesEnum.None && line == string.Empty)
                    {
                        first = false;
                        continue;
                    }
                }

                if (first)
                {
                    sb.Append(line); first = false; continue;
                }                               //adding first line without appending new line symbol

                if (line.Length <= valueIndent) //this is just empty line
                {
                    if (folded)                 //Folded string
                    {
                        if (firstEmptyLine)
                        {
                            firstEmptyLine = false;
                            continue; //Ignore first empty line for folded string
                        }
                    }
                    sb.AppendLine(); continue;
                }

                var lineIndent = line.TakeWhile(c => c == ' ' || c == '\t').Count();
                if (lineIndent < valueIndent)
                {
                    line = line.Substring(lineIndent); //Removing indents
                    if (line.TrimEnd() == "===")
                    {
                        sb.AppendLine();
                    }
                    break; // this is multiline string terminator ===
                }

                line = line.Substring(valueIndent); //Removing indents
                if (sb.Length == 0)                 // If it is first line to be added just add it. No new line or spacing needed.
                {
                    sb.Append(line);
                    continue;
                }
                if (folded && firstEmptyLine)
                {
                    sb.Append(" ");
                }
                if (!folded || !firstEmptyLine)
                {
                    sb.AppendLine();
                }
                firstEmptyLine = true; //reseting the flag for folded string logic
                sb.Append(line);       //Removing indents
            }
            return(sb.ToString());
        }
Exemple #6
0
        public Pair CreateMappedPair(ICharStream input, int nameQuotesType, Interval nameInterval, DelimiterEnum delimiter,
                                     Interval delimiterInterval, int valueQuotesType, Interval valueInterval, int valueIndent)
        {
            Pair pair;
            var  name  = PairFactoryForXml.GetNameText(input, nameQuotesType, nameInterval);
            var  value = PairFactoryForXml.GetValue(input, delimiter, valueQuotesType, valueInterval,
                                                    valueIndent, _context, (Module)_module);

            if (nameQuotesType > 0)
            {
                if (delimiter == DelimiterEnum.None)
                {
                    value = PairFactoryForXml.GetValue(input, delimiter, nameQuotesType, nameInterval,
                                                       0, _context, (Module)_module);
                    valueQuotesType = nameQuotesType;
                }
                pair = new Element
                {
                    Name               = name,
                    NameQuotesType     = nameQuotesType,
                    NameInterval       = nameInterval,
                    Delimiter          = delimiter,
                    DelimiterInterval  = delimiterInterval,
                    Value              = value.Item1,
                    ValueQuotesType    = valueQuotesType,
                    ValueInterval      = valueInterval,
                    InterpolationItems = value.Item2,
                    ValueIndent        = valueIndent
                };

                SetValueType((Element)pair, delimiter, value.Item1, valueQuotesType);
            }
            else if (name.StartsWith("@"))
            {
                pair = new DOM.Mapped.Attribute()
                {
                    Name               = name.Substring(1),
                    NameInterval       = nameInterval,
                    Delimiter          = delimiter,
                    DelimiterInterval  = delimiterInterval,
                    Value              = value.Item1,
                    ValueQuotesType    = valueQuotesType,
                    ValueInterval      = valueInterval,
                    InterpolationItems = value.Item2,
                    ValueIndent        = valueIndent
                };
            }
            else if (name.StartsWith("!$"))
            {
                pair = new DOM.Mapped.AliasDefinition
                {
                    Name               = VerifyName(name.Substring(2), nameInterval, _module),
                    NameInterval       = nameInterval,
                    Delimiter          = delimiter,
                    DelimiterInterval  = delimiterInterval,
                    Value              = value.Item1,
                    ValueQuotesType    = valueQuotesType,
                    ValueInterval      = valueInterval,
                    InterpolationItems = value.Item2,
                    ValueIndent        = valueIndent
                };
            }
            else if (name.StartsWith("!#"))
            {
                pair = new DOM.Mapped.NamespaceDefinition
                {
                    Name               = VerifyNsName(name.Substring(2), nameInterval, _module),
                    NameInterval       = nameInterval,
                    Delimiter          = delimiter,
                    DelimiterInterval  = delimiterInterval,
                    Value              = value.Item1,
                    ValueQuotesType    = valueQuotesType,
                    ValueInterval      = valueInterval,
                    InterpolationItems = value.Item2,
                    ValueIndent        = valueIndent
                };
            }
            else if (name.StartsWith("!%"))
            {
                pair = new DOM.Mapped.Parameter
                {
                    Name               = VerifyNsName(name.Substring(2), nameInterval, _module),
                    NameInterval       = nameInterval,
                    Delimiter          = delimiter,
                    DelimiterInterval  = delimiterInterval,
                    Value              = value.Item1,
                    ValueQuotesType    = valueQuotesType,
                    ValueInterval      = valueInterval,
                    InterpolationItems = value.Item2,
                    ValueIndent        = valueIndent
                };
            }
            else if (name.StartsWith("!"))
            {
                pair = new DOM.Mapped.Document
                {
                    Name               = VerifyName(name.Substring(1), nameInterval, _module),
                    NameInterval       = nameInterval,
                    Delimiter          = delimiter,
                    DelimiterInterval  = delimiterInterval,
                    Value              = value.Item1,
                    ValueQuotesType    = valueQuotesType,
                    ValueInterval      = valueInterval,
                    InterpolationItems = value.Item2,
                    ValueIndent        = valueIndent
                };
            }
            else if (name.StartsWith("$"))
            {
                pair = new DOM.Mapped.Alias()
                {
                    Name               = VerifyName(name.Substring(1), nameInterval, _module),
                    NameInterval       = nameInterval,
                    Delimiter          = delimiter,
                    DelimiterInterval  = delimiterInterval,
                    Value              = value.Item1,
                    ValueQuotesType    = valueQuotesType,
                    ValueInterval      = valueInterval,
                    InterpolationItems = value.Item2,
                    ValueIndent        = valueIndent
                };
            }
            else if (name.StartsWith("%"))
            {
                pair = new DOM.Mapped.Argument()
                {
                    Name               = VerifyName(name.Substring(1), nameInterval, _module),
                    NameInterval       = nameInterval,
                    Delimiter          = delimiter,
                    DelimiterInterval  = delimiterInterval,
                    Value              = value.Item1,
                    ValueQuotesType    = valueQuotesType,
                    ValueInterval      = valueInterval,
                    InterpolationItems = value.Item2,
                    ValueIndent        = valueIndent
                };

                SetValueType((IMappedPair)pair, delimiter, value.Item1, valueQuotesType);
            }
            else if (name.StartsWith("#"))
            {
                pair = new DOM.Mapped.Scope
                {
                    NsPrefix          = VerifyScopeName(name.Substring(1), nameInterval, _module),
                    NameInterval      = nameInterval,
                    Delimiter         = delimiter,
                    DelimiterInterval = delimiterInterval
                };
                SetValueType((IMappedPair)pair, delimiter, value.Item1, valueQuotesType);
            }
            else
            {
                pair = new Element
                {
                    Name               = name,
                    NameQuotesType     = nameQuotesType,
                    NameInterval       = nameInterval,
                    Delimiter          = delimiter,
                    DelimiterInterval  = delimiterInterval,
                    Value              = value.Item1,
                    ValueQuotesType    = valueQuotesType,
                    ValueInterval      = valueInterval,
                    InterpolationItems = value.Item2,
                    ValueIndent        = valueIndent
                };
                if (delimiter == DelimiterEnum.None)
                {
                    value = PairFactoryForXml.GetValue(input, delimiter, nameQuotesType, nameInterval,
                                                       0, _context, (Module)_module);
                    valueQuotesType = nameQuotesType;
                }
            }
            SetValueType((IMappedPair)pair, delimiter, value.Item1, valueQuotesType);
            return(pair);
        }