示例#1
0
        public static string ParseAttributeValue(string value, XmlRecordReader reader)
        {
            DocumentOptions options = reader.Options;

            if (!options.UseVariables)
            {
                return(value);
            }

            for (int i = 0; i < value.Length; i++)
            {
                if (value[i] == options.OpenVariableDelimiter)
                {
                    if (i == value.Length - 1)
                    {
                        Throw.CharacterMustBeEscaped(value, options.OpenVariableDelimiter);
                    }
                    else if (value[i + 1] == options.OpenVariableDelimiter)
                    {
                        i++;
                    }
                    else
                    {
                        var fInside      = true;
                        int startIndex   = i;
                        int lastEndIndex = 0;
                        i++;

                        var sb = new StringBuilder();

                        while (i < value.Length)
                        {
                            if (!fInside)
                            {
                                if (value[i] == options.OpenVariableDelimiter)
                                {
                                    fInside    = true;
                                    startIndex = i;
                                }
                                else if (value[i] == options.CloseVariableDelimiter)
                                {
                                    if (i == value.Length - 1 ||
                                        value[i + 1] != options.CloseVariableDelimiter)
                                    {
                                        Throw.CharacterMustBeEscaped(value, options.CloseVariableDelimiter);
                                    }
                                }
                            }
                            else if (value[i] == options.OpenVariableDelimiter)
                            {
                                if (i - startIndex == 1)
                                {
                                    fInside    = false;
                                    startIndex = -1;
                                }
                                else
                                {
                                    Throw.VariableNameCannotContainCharacter(value, options.OpenVariableDelimiter);
                                }
                            }
                            else if (value[i] == options.CloseVariableDelimiter)
                            {
                                int length = i - startIndex - 1;

                                if (length == 0)
                                {
                                    Throw.VariableNameCannotBeEmpty(value);
                                }

                                string variableName = value.Substring(startIndex + 1, length);

                                Variable variable = reader.FindVariable(variableName);

                                if (variable.IsDefault)
                                {
                                    Throw.VariableIsNotDefined(value, variableName);
                                }

                                sb.Append(value, lastEndIndex, startIndex - lastEndIndex);
                                sb.Append(variable.Value);

                                fInside      = false;
                                startIndex   = -1;
                                lastEndIndex = i + 1;
                            }

                            i++;
                        }

                        if (fInside)
                        {
                            Throw.VariableMustBeClosed(value, options.OpenVariableDelimiter);
                        }

                        if (lastEndIndex > 0)
                        {
                            sb.Append(value, lastEndIndex, value.Length - lastEndIndex);
                        }

                        return(sb.ToString());
                    }
                }
            }

            return(value);
        }
示例#2
0
        public static string GetAttributeValue(string value, RecordReaderBase reader)
        {
            DocumentReaderSettings settings = reader.Settings;

            if (!settings.UseVariables)
            {
                return(value);
            }

            for (int i = 0; i < value.Length; i++)
            {
                if (value[i] == settings.VariableOpenDelimiter)
                {
                    if (i == value.Length - 1)
                    {
                        Throw.CharacterMustBeEscaped(value, settings.VariableOpenDelimiter);
                    }
                    else if (value[i + 1] == settings.VariableOpenDelimiter)
                    {
                        i++;
                    }
                    else
                    {
                        bool fInside      = true;
                        int  startIndex   = i;
                        int  lastEndIndex = 0;
                        i++;

                        var sb = new StringBuilder();

                        while (i < value.Length)
                        {
                            if (!fInside)
                            {
                                if (value[i] == settings.VariableOpenDelimiter)
                                {
                                    fInside    = true;
                                    startIndex = i;
                                }
                                else if (value[i] == settings.VariableCloseDelimiter)
                                {
                                    if (i == value.Length - 1 ||
                                        value[i + 1] != settings.VariableCloseDelimiter)
                                    {
                                        Throw.CharacterMustBeEscaped(value, settings.VariableCloseDelimiter);
                                    }
                                }
                            }
                            else
                            {
                                if (value[i] == settings.VariableOpenDelimiter)
                                {
                                    if (i - startIndex == 1)
                                    {
                                        fInside    = false;
                                        startIndex = -1;
                                    }
                                    else
                                    {
                                        Throw.VariableNameCannotContainCharacter(value, settings.VariableOpenDelimiter);
                                    }
                                }
                                else if (value[i] == settings.VariableCloseDelimiter)
                                {
                                    int length = i - startIndex - 1;

                                    if (length == 0)
                                    {
                                        Throw.VariableNameCannotBeEmpty(value);
                                    }

                                    string variableName = value.Substring(startIndex + 1, length);

                                    Variable variable = reader.FindVariable(variableName);

                                    if (variable == null)
                                    {
                                        Throw.VariableIsNotDefined(value, variableName);
                                    }

                                    sb.Append(value, lastEndIndex, startIndex - lastEndIndex);
                                    sb.Append(variable.Value);

                                    fInside      = false;
                                    startIndex   = -1;
                                    lastEndIndex = i + 1;
                                }
                            }

                            i++;
                        }

                        if (fInside)
                        {
                            Throw.VariableMustBeClosed(value, settings.VariableOpenDelimiter);
                        }

                        if (lastEndIndex > 0)
                        {
                            sb.Append(value, lastEndIndex, value.Length - lastEndIndex);
                        }

                        return(sb.ToString());
                    }
                }
            }

            return(value);
        }