public void toJson(string filename, string output, string encoding) { string script = ""; try { using (StreamReader sr = new StreamReader( filename, Encoding.GetEncoding(encoding))) { script = sr.ReadToEnd(); } } catch (Exception e) { Console.WriteLine(e.Message); return; } ScriptNode node = createNodes(script); if (node != null) { SerializeNode parent = null; SerializeNode sn = SerializeNode.translateNode(ref parent, node); if (sn != null) { Stream stream = new FileStream(output, FileMode.Create); DataContractJsonSerializer serialize = new DataContractJsonSerializer(typeof(SerializeNode)); serialize.WriteObject(stream, sn); stream.Close(); } /* * StreamWriter writer = new StreamWriter( output, false, Encoding.UTF8 ); * traverseNode( node, ref writer, true ); * writer.Close(); */ } }
static public SerializeNode translateNode(ref SerializeNode parent, Parser.ScriptNode node) { SerializeNode sn = new SerializeNode(); if (parent != null) { parent.Members.Add(sn); } switch (node.Type) { case 0: sn.Type = NodeType.Root; break; case Token.T_FUNCTION: sn.Type = NodeType.Function; break; case Token.T_EVENT: sn.Type = NodeType.Event; break; case Token.T_PROPERTY: sn.Type = NodeType.Property; break; case Token.T_CLASS: sn.Type = NodeType.Class; break; case Token.T_VAR: sn.Type = NodeType.Var; break; case Token.T_CONST: sn.Type = NodeType.Const; break; default: sn.Type = NodeType.Unknown; break; } sn.Name = node.Name; if (node.Args != null && node.Args.Count > 0) { foreach (var name in node.Args) { sn.Arguments.Add(new FunctionArg(name.Name, name.Type, name.DefaultValue)); } } if (node.ReturnType != null) { sn.ReturnType = node.ReturnType; } string comment = node.Comment; if (comment != null) { List <Parser.CommentNode> cnl = Parser.parseComment(comment); for (int i = 0; i < cnl.Count; i++) { Parser.CommentNode cn = cnl[i]; string body = Regex.Replace(cn.Body, "[ \t]*\\\\n$", ""); // 末尾の空白と改行は削除する switch (cn.Type) { case Parser.CommentType.SUMMARY: sn.Comment.Summary = body; break; case Parser.CommentType.PARAM: sn.Comment.Params.Add(new FunctionParam(cn.Name, body)); break; case Parser.CommentType.RETURN: sn.Comment.Return = body; break; case Parser.CommentType.THROW: sn.Comment.Throw = body; break; case Parser.CommentType.AUTHOR: sn.Comment.Author = body; break; case Parser.CommentType.VERSION: sn.Comment.Version = body; break; case Parser.CommentType.SEE: sn.Comment.See.Add(body); break; case Parser.CommentType.DESCRIPTION: sn.Comment.Description = body; break; default: sn.Comment.Unknown = body; break; } } } if (node.Child != null && node.Child.Count > 0) { foreach (Parser.ScriptNode c in node.Child) { translateNode(ref sn, c); } } return(sn); }
public static SerializeNode translateNode( ref SerializeNode parent, Parser.ScriptNode node ) { SerializeNode sn = new SerializeNode(); if( parent != null ) parent.Members.Add( sn ); switch( node.Type ) { case 0: sn.Type = NodeType.Root; break; case Token.T_FUNCTION: sn.Type = NodeType.Function; break; case Token.T_PROPERTY: sn.Type = NodeType.Property; break; case Token.T_CLASS: sn.Type = NodeType.Class; break; case Token.T_VAR: sn.Type = NodeType.Var; break; case Token.T_CONST: sn.Type = NodeType.Const; break; default: sn.Type = NodeType.Unknown; break; } sn.Name = node.Name; if( node.Args != null && node.Args.Count > 0 ) { foreach( string name in node.Args ) { sn.Arguments.Add( name ); } } string comment = node.Comment; if( comment != null ) { List<Parser.CommentNode> cnl = Parser.parseComment( comment ); for( int i = 0; i < cnl.Count; i++ ) { Parser.CommentNode cn = cnl[i]; string body = Regex.Replace( cn.Body, "[ \t]*\\\\n$", "" ); // 末尾の空白と改行は削除する switch( cn.Type ) { case Parser.CommentType.SUMMARY: sn.Comment.Summary = body; break; case Parser.CommentType.PARAM: sn.Comment.Params.Add( new FunctionParam(cn.Name,body) ); break; case Parser.CommentType.RETURN: sn.Comment.Return = body; break; case Parser.CommentType.THROW: sn.Comment.Throw = body; break; case Parser.CommentType.AUTHOR: sn.Comment.Author = body; break; case Parser.CommentType.VERSION: sn.Comment.Version = body; break; case Parser.CommentType.SEE: sn.Comment.See = body; break; case Parser.CommentType.DESCRIPTION: sn.Comment.Description = body; break; default: sn.Comment.Unknown = body; break; } } } if( node.Child != null && node.Child.Count > 0 ) { foreach( Parser.ScriptNode c in node.Child ) { translateNode( ref sn, c ); } } return sn; }