public Font ParseFont(Stream stream, Font font = null) { var path = Serialization.GetCurrentSerializationPath(); this.textureSize = GetTextureSize(path); using (var reader = new StreamReader(stream)) { string text = reader.ReadToEnd(); lexer = new HotLexer("", text, true); } var type = lexer.ParseQuotedString(); if (type != "Hot::Font") { throw new Exception("Unknown type of object '{0}'", type); } if (font == null) { font = new Font(); } AddFontTextures(font, path); lexer.ParseToken('{'); while (lexer.PeekChar() != '}') { ParseFontProperty(font, lexer.ParseWord()); } lexer.ParseToken('}'); return(font); }
public Font ParseFont(string srcPath, string dstPath) { this.textureSize = GetTextureSize(srcPath); this.lexer = CreateLexer(srcPath); var type = lexer.ParseQuotedString(); if (type != "Hot::Font") { throw new Exception("Unknown type of object '{0}'", type); } var font = new Font(); AddFontTextures(font, srcPath, dstPath); lexer.ParseToken('{'); while (lexer.PeekChar() != '}') { ParseFontProperty(font, lexer.ParseWord()); } lexer.ParseToken('}'); return(font); }
FontChar ParseFontChar() { string type = lexer.ParseQuotedString(); if (type != "Hot::FontChar") { throw new Exception("Unknown type of object '{0}'", type); } var fontChar = new FontChar(); lexer.ParseToken('{'); while (lexer.PeekChar() != '}') { ParseFontCharProperty(ref fontChar, lexer.ParseWord()); } lexer.ParseToken('}'); return(fontChar); }
protected void ParseActorProperty(Node node, string name) { switch (name) { case "Name": node.Id = lexer.ParseQuotedString(); break; case "RuntimeClass": lexer.ParseQuotedString(); break; case "Localizable": lexer.ParseBool(); break; case "Source": var s = lexer.ParsePath(); node.ContentsPath = s; break; case "Attributes": node.TangerineFlags = (TangerineFlags)(lexer.ParseInt() & 7); break; case "Trigger": node.Trigger = lexer.ParseQuotedString(); break; case "Tag": node.Tag = lexer.ParseQuotedString(); break; case "Actors": lexer.ParseToken('['); while (lexer.PeekChar() != ']') { var child = ParseNode(null); if (child != null) { node.Nodes.Add(child); } } lexer.ParseToken(']'); if (node is Widget) { var allBones = node.AsWidget.Nodes.OfType <Bone>(); foreach (var root in allBones.Where(b => b.BaseIndex == 0)) { var loc = node.AsWidget.Nodes.IndexOf(root); if (loc == 0) { loc++; } var bones = BoneUtils.SortBones(BoneUtils.FindBoneDescendats(root, allBones)); foreach (var bone in bones) { bone.Unlink(); node.AsWidget.Nodes.Insert(loc, bone); } } } break; case "Animators": lexer.ParseToken('['); while (lexer.PeekChar() != ']') { ParseAnimator(node); } if (node is ParticleModifier) { TryMergeScaleAndAspectRatioForParticleTemplate(node as ParticleModifier); particleModifierScaleAnimator = null; particleModifierAspectRatioAnimator = null; } lexer.ParseToken(']'); break; case "Markers": lexer.ParseToken('['); while (lexer.PeekChar() != ']') { var marker = ParseMarker(); if (marker.Action == MarkerAction.Jump && marker.JumpTo == null) { throw new Exception("Jump marker '{0}' in node '{1}' have no JumpTo property.", marker.Id ?? "<noname>", node.ToString()); } node.Markers.Add(marker); } lexer.ParseToken(']'); break; default: throw new Exception("Unknown property '{0}'. Parsing: {1}", name, node.GetType()); } }