Ejemplo n.º 1
0
        public static void WriteRst(DirectoryInfo rstDirectory, RhinoCommonClass rhinocommonClass, PythonClass pythonClass)
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine(pythonClass.ClassName);
            sb.AppendLine("".PadLeft(pythonClass.ClassName.Length, '='));
            sb.AppendLine();
            sb.AppendLine($".. py:module:: rhino3dm");
            sb.AppendLine();
            sb.AppendLine($".. py:class:: {pythonClass.ClassName}");

            foreach (var constructor in pythonClass.Constructors)
            {
                var rhcommonConstructor = rhinocommonClass.GetConstructor(constructor);
                sb.AppendLine();
                sb.Append($"   .. py:method:: {pythonClass.ClassName}(");

                StringBuilder        summary    = null;
                List <ParameterInfo> parameters = new List <ParameterInfo>();
                if (rhcommonConstructor != null)
                {
                    DocCommentToPythonDoc(rhcommonConstructor.Item2, rhcommonConstructor.Item1, 2, out summary, out parameters);
                }

                for (int i = 0; i < parameters.Count; i++)
                {
                    if (i > 0)
                    {
                        sb.Append(", ");
                    }
                    sb.Append(parameters[i].Name);
                }
                sb.AppendLine(")");
                sb.AppendLine();
                if (null == summary)
                {
                    sb.AppendLine(_T(2) + $"{pythonClass.ClassName} constructor");
                }
                else
                {
                    sb.Append(summary.ToString());
                }

                //if (parameters.Count > 0 && parameters.Count == args.Length)
                {
                    sb.AppendLine();
                    foreach (var p in parameters)
                    {
                        if (p.Description.Count == 0)
                        {
                            continue;
                        }
                        string type = ToPythonType(p.Type);
                        if (type.IndexOf(' ') < 0)
                        {
                            sb.Append($"      :param {type} {p.Name}: {p.Description[0]}");
                        }
                        else
                        {
                            sb.Append($"      :param {p.Name}: {p.Description[0]}");
                        }

                        if (p.Description.Count > 1)
                        {
                            sb.AppendLine(" \\");
                        }
                        else
                        {
                            sb.AppendLine();
                        }
                        for (int i = 1; i < p.Description.Count; i++)
                        {
                            if (i == (p.Description.Count - 1))
                            {
                                sb.AppendLine($"         {p.Description[i]}");
                            }
                            else
                            {
                                sb.AppendLine($"         {p.Description[i]} \\");
                            }
                        }
                        if (type.IndexOf(' ') > 0)
                        {
                            sb.AppendLine($"      :type {p.Name}: {type}");
                        }
                    }
                }
            }

            foreach (var property in pythonClass.Properties)
            {
                sb.AppendLine();
                sb.AppendLine($"   .. py:attribute:: {property}");
                sb.AppendLine();
                var rhcommonProperty = rhinocommonClass.GetProperty(property);
                if (null == rhcommonProperty)
                {
                    continue;
                }
                StringBuilder summary = null;
                DocCommentToPythonDoc(rhcommonProperty.Item2, rhcommonProperty.Item1, 2, out summary);
                sb.Append(summary.ToString());
            }

            foreach (var pyMethod in pythonClass.Methods)
            {
                bool     isStatic = pyMethod.IsStatic;
                string   method   = pyMethod.Name;
                string[] args     = pyMethod.ArgList;
                sb.AppendLine();
                if (isStatic)
                {
                    sb.Append($"   .. py:staticmethod:: {method}(");
                }
                else
                {
                    sb.Append($"   .. py:method:: {method}(");
                }
                for (int i = 0; i < args.Length; i++)
                {
                    if (i > 0)
                    {
                        sb.Append(", ");
                    }
                    sb.Append(args[i]);
                }
                sb.AppendLine(")");
                sb.AppendLine();

                var rhcommonMethod = rhinocommonClass.GetMethod(method);
                if (rhcommonMethod == null)
                {
                    sb.AppendLine("      [todo] add documentation");
                    continue;
                }

                StringBuilder        summary;
                List <ParameterInfo> parameters;
                ReturnInfo           returnInfo;
                string s = DocCommentToPythonDoc(rhcommonMethod.Item2, rhcommonMethod.Item1, 2, out summary, out parameters, out returnInfo);
                sb.Append(summary.ToString());
                if (parameters.Count > 0 && parameters.Count == args.Length)
                {
                    sb.AppendLine();
                    foreach (var p in parameters)
                    {
                        if (p.Description.Count == 0)
                        {
                            continue;
                        }
                        string type = ToPythonType(p.Type);
                        if (type.IndexOf(' ') < 0)
                        {
                            sb.Append($"      :param {type} {p.Name}: {p.Description[0]}");
                        }
                        else
                        {
                            sb.Append($"      :param {p.Name}: {p.Description[0]}");
                        }

                        if (p.Description.Count > 1)
                        {
                            sb.AppendLine(" \\");
                        }
                        else
                        {
                            sb.AppendLine();
                        }
                        for (int i = 1; i < p.Description.Count; i++)
                        {
                            if (i == (p.Description.Count - 1))
                            {
                                sb.AppendLine($"         {p.Description[i]}");
                            }
                            else
                            {
                                sb.AppendLine($"         {p.Description[i]} \\");
                            }
                        }
                        if (type.IndexOf(' ') > 0)
                        {
                            sb.AppendLine($"      :type {p.Name}: {type}");
                        }
                    }
                }

                sb.AppendLine();
                if (returnInfo.Description.Count > 0)
                {
                    sb.Append($"      :return: {returnInfo.Description[0]}");
                    if (returnInfo.Description.Count > 1)
                    {
                        sb.AppendLine(" \\");
                    }
                    else
                    {
                        sb.AppendLine();
                    }
                    for (int i = 1; i < returnInfo.Description.Count; i++)
                    {
                        if (i == (returnInfo.Description.Count - 1))
                        {
                            sb.AppendLine($"         {returnInfo.Description[i]}");
                        }
                        else
                        {
                            sb.AppendLine($"         {returnInfo.Description[i]} \\");
                        }
                    }
                }
                sb.AppendLine($"      :rtype: {ToPythonType(returnInfo.Type)}");
            }

            string path = Path.Combine(rstDirectory.FullName, $"{pythonClass.ClassName}.rst");

            File.WriteAllText(path, sb.ToString());
        }