예제 #1
0
        internal void WriteTo(XElement xe, TextWriter writer)
        {
            switch (XUtils.GetTypeAttr(xe))
            {
            case "object":
                if (this.version >= TomlVersion.V04 && XUtils.GetTomlAttr(xe) == TomlItemType.InlineTable)
                {
                    throw new SerializationException("Invalid 'type' attribute.");
                }
                this.SerializeObject(xe, writer);
                break;

            case "array":
                if (IsArrayOfTable(xe))
                {
                    this.SerializeArrayOfTable(xe, writer);
                }
                else
                {
                    this.SerializeArray(xe, writer);
                }
                break;

            default:
                throw new SerializationException("Invalid 'type' attribute.");
            }
        }
예제 #2
0
        private void SerializeArray(XElement xe, TextWriter writer)
        {
            writer.Write('[');
            foreach (var n in xe.Nodes())
            {
                var e = n as XElement;
                if (e != null)
                {
                    switch (XUtils.GetTypeAttr(e))
                    {
                    case "string":
                        WriteString(e, writer);
                        break;

                    case "number":
                        WriteNumber(e, writer);
                        break;

                    case "boolean":
                        WriteBoolean(e, writer);
                        break;

                    case "object":
                        if (this.version >= TomlVersion.V04)
                        {
                            WriteInlineTable(e, writer);
                            break;
                        }
                        throw new SerializationException("An array cannot contain tables.");

                    case "array":
                        SerializeArray(e, writer);
                        break;

                    default:
                        // ignore null
                        continue;
                    }
                    if (ExistsNextArrayItem(n))
                    {
                        writer.Write(", ");
                    }
                }
                else
                {
                    var c = n as XComment;
                    if (c != null)
                    {
                        WriteComment(c, writer);
                    }
                    else
                    {
                        throw new SerializationException("Unknown XNode.");
                    }
                }
            }
            writer.Write(']');
        }
예제 #3
0
        private static object ToXml(TomlItemType nodeType, object obj)
        {
            var dt = obj as DynamicToml;

            if (dt != null)
            {
                return(dt.element.Elements());
            }

            switch (nodeType)
            {
            case TomlItemType.Array:
                return(((IEnumerable)obj).Cast <object>().Select(o =>
                {
                    var type = GetTomlType(o);
                    return new XElement("item", CreateTypeAttr(type), ToXml(type, o));
                }));

            case TomlItemType.Table:
            case TomlItemType.InlineTable:
                var xd = new XDocument();
                using (var xw = xd.CreateWriter())
                {
                    var s = new DataContractJsonSerializer(obj.GetType());
                    s.WriteObject(xw, obj);
                }
                var root = new XElement(xd.Root);
                foreach (var xe in root.Descendants())
                {
                    var type = XUtils.GetTypeAttr(xe);
                    if (type == "null")
                    {
                        xe.Remove();
                    }
                    else
                    {
                        xe.SetAttributeValue("toml",
                                             (type == "string" ? TomlItemType.BasicString
                                : type == "number" ? (xe.Value.Any(c => c == '.' || c == 'e' || c == 'E')
                                    ? TomlItemType.Float : TomlItemType.Integer)
                                : type == "boolean" ? TomlItemType.Boolean
                                : type == "array" ? TomlItemType.Array
                                : TomlItemType.Table).ToString()
                                             );
                    }
                }
                return(root.Elements());

            default:
                return(obj);
            }
        }
예제 #4
0
 private static bool ExistsNextArrayItem(XNode xn)
 {
     while (xn.NextNode != null)
     {
         xn = xn.NextNode;
         var xe = xn as XElement;
         if (xe != null && XUtils.GetTypeAttr(xe) != "null")
         {
             return(true);
         }
     }
     return(false);
 }
예제 #5
0
        private void WriteInlineTable(XElement xe, TextWriter writer)
        {
            writer.Write('{');
            foreach (var n in xe.Nodes())
            {
                var e = n as XElement;
                if (e != null)
                {
                    WriteKey(e, writer);
                    switch (XUtils.GetTypeAttr(e))
                    {
                    case "string":
                        WriteString(e, writer);
                        break;

                    case "number":
                        WriteNumber(e, writer);
                        break;

                    case "boolean":
                        WriteBoolean(e, writer);
                        break;

                    case "object":
                        WriteInlineTable(e, writer);
                        break;

                    case "array":
                        SerializeArray(e, writer);
                        break;

                    default:
                        // ignore null
                        continue;
                    }
                    if (ExistsNextArrayItem(n))
                    {
                        writer.Write(", ");
                    }
                }
                else
                {
                    if (n is XComment)
                    {
                        throw new SerializationException("A comment is not allowed in an inline table.");
                    }
                    throw new SerializationException("Unknown XNode.");
                }
            }
            writer.Write('}');
        }
예제 #6
0
        private string GetFullName(XElement xe)
        {
            var s = new Stack <string>();

            while (xe.Parent != null)
            {
                if (XUtils.GetTypeAttr(xe.Parent) != "array")
                {
                    var key = XUtils.GetKey(xe);
                    if (this.version >= TomlVersion.V04 && !IsValidBareKey(key))
                    {
                        key = CreateBasicString(key);
                    }
                    s.Push(XUtils.GetKey(xe));
                }
                xe = xe.Parent;
            }
            return(string.Join(".", s));
        }
예제 #7
0
 private static bool IsArrayOfTable(XElement xe)
 {
     return(xe.HasElements && XUtils.GetTypeAttr(xe.Elements().First()) == "object");
 }
예제 #8
0
        private void SerializeObject(XElement xe, TextWriter writer)
        {
            // Table と Array of Table は後に
            var ordered = xe.Nodes().OrderBy(n =>
            {
                var e = n as XElement;
                if (e != null)
                {
                    var type = XUtils.GetTypeAttr(e);
                    if (type == "object")
                    {
                        return(true);
                    }
                    if (type == "array" && IsArrayOfTable(e))
                    {
                        return(true);
                    }
                }
                return(false);
            });

            foreach (var n in ordered)
            {
                var e = n as XElement;
                if (e != null)
                {
                    switch (XUtils.GetTypeAttr(e))
                    {
                    case "string":
                        WriteKey(e, writer);
                        WriteString(e, writer);
                        writer.WriteLine();
                        break;

                    case "number":
                        WriteKey(e, writer);
                        WriteNumber(e, writer);
                        writer.WriteLine();
                        break;

                    case "boolean":
                        WriteKey(e, writer);
                        WriteBoolean(e, writer);
                        writer.WriteLine();
                        break;

                    case "object":
                        if (this.version >= TomlVersion.V04 && XUtils.GetTomlAttr(e) == TomlItemType.InlineTable)
                        {
                            WriteKey(e, writer);
                            WriteInlineTable(e, writer);
                            writer.WriteLine();
                        }
                        else
                        {
                            writer.WriteLine("[{0}]", GetFullName(e));
                            SerializeObject(e, writer);
                        }
                        break;

                    case "array":
                        if (IsArrayOfTable(e))
                        {
                            SerializeArrayOfTable(e, writer);
                        }
                        else
                        {
                            WriteKey(e, writer);
                            SerializeArray(e, writer);
                            writer.WriteLine();
                            break;
                        }
                        break;

                    default:
                        // ignore null
                        break;
                    }
                }
                else
                {
                    var c = n as XComment;
                    if (c != null)
                    {
                        WriteComment(c, writer);
                    }
                    else
                    {
                        throw new SerializationException("Unknown XNode.");
                    }
                }
            }
        }