Пример #1
0
        public Guk ToGuk()
        {
            Guk guk = new Guk();

            guk.SetType(Type, false);
            if (isSub)
            {
                guk.SetAttr("isSub", null);
            }
            Entries.ForEachPairs((index, entry) => {
                Guk sub = guk.CreateSubNode(StrGen.Start("<").Append(entry.species).Append(':').Append(index).Append(" />").End);
                sub.SetAttr("name", entry.name, false);
                sub.SetAttr("type", entry.type, false);
                entry.Flags.ForEachPairs((k, v) => sub.SetAttr(k, v, false));
            });
            return(guk);
        }
Пример #2
0
 public static Def Create(Guk entityData, string entityType = null, bool isSub = false)
 {
     return(new Def().InitFormGuk(entityData, entityType, isSub));
 }
Пример #3
0
        private Def InitFormGuk(Guk entityData, string entityType, bool isSub = false)
        {
            if (!entityType.Exist())
            {
                entityType = entityData.Type;
            }
            if (!isSub)
            {
                isSub = entityData.HasAttr("isSub");
            }
            if (defs.ContainsKey(entityType))
            {
                throw new EntityDefExpection(string.Format("CreateDef Error: The type {0} is already exist. ", entityData.Type));
            }

            Init(entityType, entityData.SubNodes.Count);

            //不是sub的情况下Entry第一位为id
            if (!isSub)
            {
                AddEntry(Entry.Species.Attr, 1, "uuid", "ID", -1);
            }

            for (int i = 0; i < entityData.SubNodes.Count; i++)
            {
                Guk entryData = entityData.SubNodes[i];

                Entry.Species species = entryData.Type.TryConvertToEnum(Entry.Species.Attr);

                int index = entryData.Name.TryConvertToInt();

                string name     = entryData.GetAttr("name");
                string type     = entryData.GetAttr("type");
                int    indexing = entryData.GetAttr("indexing").TryConvertToInt(0);


                int limit = (species == Entry.Species.Attr ? 10 : 100);
                if (index < limit)
                {
                    throw new EntityDefExpection(string.Format("Entry Def {0} Parse Error: The Index {0} of entry <{1}:{2}> must be larger than {3} (1 for uuid, 2 for type id, 11+ for attr, 101+ for list). ", entityType, species, index, limit));
                }
                if (Indexes.Contains(index))
                {
                    throw new EntityDefExpection(string.Format("Entry Def {0} Parse Error: The index {1} of <{1}:{2}> is alreadyExist. ", entityType, species, index));
                }
                if (!name.Exist())
                {
                    throw new EntityDefExpection(string.Format("Entry Def {0} Parse Error: The entry <{1}:{2}> must have name. ", entityType, species, index));
                }
                if (!type.Exist())
                {
                    throw new EntityDefExpection(string.Format("Entry Def {0} Parse Error: The entry <{1}:{2}> must have type. ", entityType, species, index));
                }
                if (species == Entry.Species.List && indexing <= 0)
                {
                    throw new EntityDefExpection(string.Format("Entry Def {0} Parse Error: The {1} <{1}:{2}> must be indexed('indexing'='colIndex'). ", entityType, species, index));
                }

                Entry entry = AddEntry(species, index, name, type, indexing);
                if (entryData.SubNodes.Count > 0)
                {
                    Create(entryData, type, true);
                }

                foreach (var key in entryData.Attributes.Keys)
                {
                    if (key != "name" && key != "type" && key != "indexing")
                    {
                        entry.Flags.Add(key, entityData.GetAttr(key));
                    }
                }
            }
            return(this);
        }