Exemplo n.º 1
0
    public static YamlNode Parse(ref string yaml, int indentLevel)
    {
        //Detect unindented array
        bool unIndentedArray = false;

        if (yaml[0] == '\n' && yaml.Remove(0, 1).TrimStart(' ')[0] == '-')
        {
            int _indentLevel = yaml.Remove(0, 1).Length - yaml.Remove(0, 1).TrimStart(' ').Length;
            if (_indentLevel + 2 == indentLevel)
            {
                yaml            = yaml.Remove(0, 1);
                unIndentedArray = true;
            }
        }

        int      arrayCount = 0;
        YamlNode n          = new YamlNode();

        while (yaml.Length != 0)
        {
            char c = yaml[0];

            switch (c)
            {
            case ' ':
                yaml = yaml.TrimStart(' ');
                break;

            case '\n':
                yaml = yaml.Remove(0, 1);
                int _indentLevel = yaml.Length - yaml.TrimStart(' ').Length;
                if (unIndentedArray)
                {
                    _indentLevel += 2;
                }
                if (_indentLevel != indentLevel)
                {
                    yaml = "\n" + yaml;
                    return(n);
                }
                break;

            case '-':
                yaml = arrayCount++.ToString() + ": " + yaml.Remove(0, 1);
                break;

            default:
                string sym = String.Join("", new string[] { new string(yaml.TakeWhile((_c) => _c != ':' && _c != '\n').ToArray()) });
                yaml = yaml.Remove(0, sym.Length);

                if (yaml.Length > 0 && yaml[0] == ':')
                {
                    yaml = yaml.Remove(0, 1).TrimStart(' ');

                    n.Add(sym, Parse(ref yaml, indentLevel + (unIndentedArray ? 0 : 2)));
                }
                else
                {
                    n.leaf = sym;
                    return(n);
                }
                break;
            }
        }
        return(n);
    }