New Doc Generation

This commit is contained in:
Josef 2025-07-04 20:19:37 +02:00
parent b8fea8ce40
commit c3d7848d30
28 changed files with 641 additions and 167 deletions

View File

@ -81,6 +81,11 @@ namespace Rokojori
}
}
static void EnsureCachedProjectPath( string cachePath )
{
}
public override void _DisablePlugin()
{

View File

@ -0,0 +1 @@
uid://mlwd123bf2ba

View File

@ -79,6 +79,15 @@ namespace Rokojori
a = temp.a;
}
public void ClampToLimits()
{
h = MathX.EnsureValidFloat( h );
h = MathX.Repeat( h, 360 );
s = MathX.Clamp01( s );
l = MathX.Clamp01( l );
a = MathX.Clamp01( a );
}
public static HSLColor FromRGBA( Color c )
{
float h = 0;
@ -101,7 +110,8 @@ namespace Rokojori
{
float delta = cmax - cmin;
s = ( l <= .5f ) ? ( delta / ( cmax + cmin ) ) : ( delta / ( 2f - ( cmax + cmin ) ) );
s = ( l <= 0.5f ) ? ( delta / ( cmax + cmin ) ) :
( delta / ( 2f - ( cmax + cmin ) ) );
h = 0;
@ -146,7 +156,12 @@ namespace Rokojori
public static float BlendHueInRGB( HSLColor x, HSLColor y, float weight )
{
return HSLColor.FromRGBA( ColorX.Lerp( x.ToRGBA(), y.ToRGBA(), weight ) ).h;
var rgbLerped = ColorX.Lerp( x.ToRGBA(), y.ToRGBA(), weight );
rgbLerped = rgbLerped.Clamp();
var hsl = HSLColor.FromRGBA( rgbLerped );
return MathX.EnsureValidFloat( hsl.h );
}
public static HSLColor LerpWithHueInRGB( HSLColor x, HSLColor y, Vector4 v )
@ -170,17 +185,19 @@ namespace Rokojori
}
public Color ToRGBA( )
public Color ToRGBA()
{
float r, g, b, a;
a = this.a;
var r = 0f;
var g = 0f;
var b = 0f;
float m1, m2;
var m1 = 0f;
var m2 = 0f;
m2 = ( l <= .5f ) ? ( l * ( 1f + s ) ) : ( l + s - l * s );
m2 = ( l <= 0.5f ) ? ( l * ( 1f + s ) ) : ( l + s - l * s );
m1 = 2f * l - m2;
if ( s == 0f )
if ( s <= 0f )
{
r = g = b = l;
}
@ -196,7 +213,6 @@ namespace Rokojori
static float Value( float n1, float n2, float hue )
{
hue = MathX.Repeat( hue, 360f );
if ( hue < 60f )

View File

@ -216,10 +216,30 @@ namespace Rokojori
static float CustomModulo( float a, float n )
{
return a - Mathf.Floor( a / n ) * n;
}
public static bool IsInvalidFloat( float value )
{
return float.IsNaN( value ) || float.IsInfinity( value );
}
public static float Clamp01( float value )
public static float EnsureValidFloat( float value, float invalidValue = 0f )
{
if ( float.IsNaN( value ) || float.IsInfinity( value ) )
{
return invalidValue;
}
return value;
}
public static float Clamp01( float value, float invalidValue = 0f )
{
if ( float.IsNaN( value ) || float.IsInfinity( value ) )
{
return invalidValue;
}
return Mathf.Clamp( value, 0, 1 );
}

View File

@ -1,10 +1,11 @@
using Godot;
using Rokojori.Tools;
using System.Collections.Generic;
namespace Rokojori
{
{
[Tool]
[GlobalClass]
public partial class NetworkNode : Node, INetworkNode
{
[ExportGroup("Network Settings")]
@ -20,6 +21,19 @@ namespace Rokojori
protected List<NetworkNodeMember> _networkNodeMembers = null;
protected NetworkNodeSlot _networkNodeSlot = new NetworkNodeSlot();
#if TOOLS
[ExportGroup("Help")]
[ExportToolButton( "Open Online Docs")]
public Callable openOnlineDocsButton => Callable.From(
()=>
{
OnlineDocs.Open( GetType() );
}
);
#endif
public virtual List<NetworkNodeMember> GetNetworkNodeMembers()
{
if ( _networkNodeMembers != null )

View File

@ -30,9 +30,19 @@ namespace Rokojori
[Export(PropertyHint.Range, "-100,100 suffix:%")]
public float gamma = 0;
[Export]
public Gradient gradient;
[Export(PropertyHint.Range, "0,100 suffix:%")]
public float gradientStrength = 50f;
[Export(PropertyHint.Range, "-1,1")]
public float gradientLumaType = 0f;
protected override Color _Modify( Color sourceColor )
{
var hslColor = HSLColor.FromRGBA( sourceColor );
var luminance = hslColor.l;
hslColor.h = MathX.Repeat( hslColor.h + hue, 360 );
hslColor.s = MathX.Clamp01( hslColor.s + saturation/100f );
@ -50,8 +60,33 @@ namespace Rokojori
hslColor.l = ( hslColor.l - 0.5f ) * Mathf.Pow( 2, contrast/100f ) + 0.5f;
hslColor.l = MathX.Clamp01( hslColor.l + brightness/100f );
hslColor.ClampToLimits();
var rgb = hslColor.ToRGBA();
rgb = rgb.Gamma( Mathf.Pow( 2.2f, gamma/100f ) );
rgb = rgb.Clamp();
if ( gradient != null )
{
var hsl2 = HSLColor.FromRGBA( rgb );
var currentLuminance = hsl2.l;
var lumaLookUp = Mathf.Lerp( currentLuminance, luminance, gradientLumaType * 0.5f + 0.5f );
var sampledGradient = gradient.Sample( lumaLookUp );
var gradientColorHSL = HSLColor.FromRGBA( sampledGradient );
var weigths = new Vector4( 1f * gradientColorHSL.s, 0.2f, 0.1f, 1f ) ;
weigths = weigths * ( gradientStrength / 100f ) * sampledGradient.A;
// weigths.W = 1f;
var combined = HSLColor.LerpWithHueInRGB( hsl2, gradientColorHSL, weigths );
combined.ClampToLimits();
rgb = combined.ToRGBA();
rgb = rgb.Clamp();
}
return rgb;

View File

@ -15,8 +15,16 @@ namespace Rokojori
[Export(PropertyHint.Range, "0,100 suffix:%")]
public float amount = 100;
[Export]
public bool enabled = true;
public Color Apply( Color color )
{
if ( ! enabled )
{
return color;
}
var modified = _Modify( color );
return ColorX.Lerp( color, modified, amount / 100f );

View File

@ -0,0 +1 @@
uid://cxrrn0fyf3k2d

1
Runtime/Text/Text.cs.uid Normal file
View File

@ -0,0 +1 @@
uid://clb5lj3q5t5yu

View File

@ -14,10 +14,6 @@ altHold = 2
shiftHold = 2
modifiersMode = 0
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[sub_resource type="Resource" id="Resource_75e6s"]
script = ExtResource("1_ikub8")
@ -27,29 +23,17 @@ numVisible = 0
inputIcons = []
useInputIconsFromSensors = true
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[sub_resource type="Resource" id="Resource_gmj7t"]
script = ExtResource("3_1wc0w")
axis = 1
type = 0
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[sub_resource type="Resource" id="Resource_687xx"]
script = ExtResource("4_wj7li")
button = 12
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[sub_resource type="Resource" id="Resource_unhue"]
script = ExtResource("1_ikub8")
@ -59,10 +43,6 @@ numVisible = 1
inputIcons = []
useInputIconsFromSensors = true
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[resource]
script = ExtResource("1_ikub8")
@ -72,7 +52,3 @@ numVisible = 0
inputIcons = []
useInputIconsFromSensors = true
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5

View File

@ -13,10 +13,6 @@ altHold = 2
shiftHold = 2
modifiersMode = 0
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[sub_resource type="Resource" id="Resource_jvxvp"]
script = ExtResource("1_e8w3r")
@ -26,19 +22,11 @@ numVisible = 0
inputIcons = []
useInputIconsFromSensors = true
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[sub_resource type="Resource" id="Resource_3ovg5"]
script = ExtResource("3_pyik4")
button = 10
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[sub_resource type="Resource" id="Resource_yhdev"]
script = ExtResource("1_e8w3r")
@ -48,10 +36,6 @@ numVisible = 0
inputIcons = []
useInputIconsFromSensors = true
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[resource]
script = ExtResource("1_e8w3r")
@ -61,7 +45,3 @@ numVisible = 0
inputIcons = []
useInputIconsFromSensors = true
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5

View File

@ -14,10 +14,6 @@ altHold = 2
shiftHold = 2
modifiersMode = 0
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[sub_resource type="Resource" id="Resource_nj1ud"]
script = ExtResource("1_r4ul7")
@ -27,29 +23,17 @@ numVisible = 0
inputIcons = []
useInputIconsFromSensors = true
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[sub_resource type="Resource" id="Resource_mxixb"]
script = ExtResource("3_nh2m3")
axis = 1
type = 1
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[sub_resource type="Resource" id="Resource_c1vyq"]
script = ExtResource("3_dyhbp")
button = 11
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[sub_resource type="Resource" id="Resource_vhtjx"]
script = ExtResource("1_r4ul7")
@ -59,10 +43,6 @@ numVisible = 1
inputIcons = []
useInputIconsFromSensors = true
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[resource]
script = ExtResource("1_r4ul7")
@ -72,7 +52,3 @@ numVisible = 0
inputIcons = []
useInputIconsFromSensors = true
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5

View File

@ -14,10 +14,6 @@ altHold = 2
shiftHold = 2
modifiersMode = 0
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[sub_resource type="Resource" id="Resource_qts7v"]
script = ExtResource("1_w0cyl")
@ -27,29 +23,17 @@ numVisible = 0
inputIcons = []
useInputIconsFromSensors = true
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[sub_resource type="Resource" id="Resource_gmj7t"]
script = ExtResource("3_ushvr")
axis = 0
type = 1
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[sub_resource type="Resource" id="Resource_687xx"]
script = ExtResource("4_53tr6")
button = 13
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[sub_resource type="Resource" id="Resource_0hx40"]
script = ExtResource("1_w0cyl")
@ -59,10 +43,6 @@ numVisible = 1
inputIcons = []
useInputIconsFromSensors = true
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[resource]
script = ExtResource("1_w0cyl")
@ -72,7 +52,3 @@ numVisible = 0
inputIcons = []
useInputIconsFromSensors = true
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5

View File

@ -14,10 +14,6 @@ altHold = 2
shiftHold = 2
modifiersMode = 0
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[sub_resource type="Resource" id="Resource_d1suo"]
script = ExtResource("1_vdwin")
@ -27,29 +23,17 @@ numVisible = 0
inputIcons = []
useInputIconsFromSensors = true
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[sub_resource type="Resource" id="Resource_c7ebh"]
script = ExtResource("3_4antj")
axis = 0
type = 0
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[sub_resource type="Resource" id="Resource_md70b"]
script = ExtResource("4_ucs5r")
button = 14
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[sub_resource type="Resource" id="Resource_fhaor"]
script = ExtResource("1_vdwin")
@ -59,10 +43,6 @@ numVisible = 1
inputIcons = []
useInputIconsFromSensors = true
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[resource]
script = ExtResource("1_vdwin")
@ -72,7 +52,3 @@ numVisible = 0
inputIcons = []
useInputIconsFromSensors = true
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5

View File

@ -13,10 +13,6 @@ altHold = 2
shiftHold = 2
modifiersMode = 0
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[sub_resource type="Resource" id="Resource_pqldp"]
script = ExtResource("1_5263n")
@ -26,19 +22,11 @@ numVisible = 0
inputIcons = []
useInputIconsFromSensors = true
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[sub_resource type="Resource" id="Resource_ivi7v"]
script = ExtResource("3_ejsq1")
button = 9
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[sub_resource type="Resource" id="Resource_0uxqa"]
script = ExtResource("1_5263n")
@ -48,10 +36,6 @@ numVisible = 1
inputIcons = []
useInputIconsFromSensors = true
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[resource]
script = ExtResource("1_5263n")
@ -61,7 +45,3 @@ numVisible = 0
inputIcons = []
useInputIconsFromSensors = true
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5

View File

@ -9,10 +9,6 @@ script = ExtResource("3_5t03r")
axis = 5
type = 0
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[resource]
script = ExtResource("1_lnrk8")
@ -22,7 +18,3 @@ numVisible = 0
inputIcons = []
useInputIconsFromSensors = true
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5

View File

@ -9,10 +9,6 @@ script = ExtResource("3_pu70j")
axis = 4
type = 0
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5
[resource]
script = ExtResource("1_w21si")
@ -22,7 +18,3 @@ numVisible = 0
inputIcons = []
useInputIconsFromSensors = true
continous = false
_value = 0.0
_wasActive = false
_active = false
_activeTreshold = 0.5

View File

@ -0,0 +1 @@
uid://bhs6rkhfbopbc

View File

@ -0,0 +1 @@
uid://6qukkvril5b8

View File

@ -0,0 +1,185 @@
using Godot;
using Rokojori;
using System.Collections.Generic;
using System;
using System.Reflection;
using System.Text.RegularExpressions;
namespace Rokojori.DocGenerator
{
public class ClassDocGenerator
{
ClassDocInfo info = new ClassDocInfo();
public string GetIcon( string classFile, string name, List<string> baseTypes, List<string> icons )
{
var iconMatcher = new Regex( "Icon\\(\"res://addons/rokojori_action_library/Icons/(\\w+\\.svg)" );
var result = iconMatcher.Matches( classFile );
if ( result != null && result.Count == 1 )
{
return result[ 0 ].Groups[ 1 ].Value;
}
if ( icons.IndexOf( name + ".svg" ) != -1 )
{
return name + ".svg";
}
foreach ( var bt in baseTypes )
{
if ( icons.IndexOf( bt + ".svg" ) != -1 )
{
return bt + ".svg";
}
}
return "CSharp.svg";
}
public ClassDocInfo Create( string filePath, Type type, List<string> icons )
{
var data = filePath == null ? "" : FilesSync.LoadUTF8( filePath );
var comments = new DocComments();
comments.Grab( data );
RJLog.Log( type.Name, "Comments:", comments.entries.Count );
info.name = type.Name;
info.csNameSpace = type.Namespace;
info.doc = comments.FindDoc( "class", type.Name );
info.generics = Lists.Map( type.GenericTypeArguments, t => t + "" );
var allBindings = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly;
var fields = Lists.ToList( type.GetFields( allBindings ) );
fields = Lists.Filter( fields, f => ! f.IsPrivate );
var godotTypes = new List<string>()
{
"Node", "Resource"
};
var it = type.BaseType;
while ( it != null )
{
if ( godotTypes.IndexOf( it.Name) != -1 )
{
if ( "Node" == it.Name )
{
info.extendingClasses.AddRange( new string[]{ "Node", "Object" } );
}
else if ( "Resource" == it.Name )
{
info.extendingClasses.AddRange( new string[]{ "Resource", "RefCounted", "Object" } );
}
it = null;
}
else
{
info.extendingClasses.Add( it.Name );
it = it.BaseType;
}
}
info.icon = GetIcon( data, info.name, info.extendingClasses, icons );
fields.ForEach(
( f )=>
{
var memberInfo = MemberInfo.CreateField();
memberInfo.name = f.Name;
memberInfo.csNameSpace = f.FieldType.Namespace;
memberInfo.dataType = f.FieldType.Name;
memberInfo.generics = Lists.Map( f.FieldType.GetGenericArguments(), t => t + "" );
memberInfo.doc = comments.FindDoc( "field", f.Name );
if ( f.IsStatic )
{
memberInfo.modifiers.Add( "static" );
}
memberInfo.modifiers.Add( f.IsPublic ? "public" : "protected" );
info.memberInfos.Add( memberInfo );
}
);
var methods = Lists.ToList( type.GetMethods( allBindings ) );
methods = Lists.Filter( methods, m => ! m.IsPrivate );
var godotInternalMethods = new List<string>()
{
"GetGodotMethodList",
"InvokeGodotClassMethod",
"HasGodotClassMethod",
"SetGodotClassPropertyValue",
"GetGodotClassPropertyValue",
"GetGodotPropertyList",
"GetGodotPropertyDefaultValues",
"SaveGodotObjectData",
"RestoreGodotObjectData"
};
methods.ForEach(
m =>
{
if ( godotInternalMethods.IndexOf( m.Name ) != -1 )
{
return;
}
var memberInfo = MemberInfo.CreateMethod();
memberInfo.name = m.Name;
memberInfo.dataType = m.ReturnType.Name;
memberInfo.csNameSpace = m.ReturnType.Namespace;
memberInfo.generics = Lists.Map( m.GetGenericArguments(), t => t + "" );
memberInfo.doc = comments.FindDoc( "method", m.Name );
if ( m.IsStatic )
{
memberInfo.modifiers.Add( "static" );
}
memberInfo.modifiers.Add( m.IsPublic ? "public" : "protected" );
var parameters = Lists.ToList( m.GetParameters() );
parameters.ForEach(
( p )=>
{
var parameterType = new ParameterType();
parameterType.name = p.Name;
parameterType.type = p.ParameterType.Name;
parameterType.csNameSpace = p.ParameterType.Namespace;
parameterType.generics = Lists.Map( p.ParameterType.GenericTypeArguments, t => t + "" );
memberInfo.parameters.Add( parameterType );
}
);
info.memberInfos.Add( memberInfo );
}
);
return info;
}
}
}

View File

@ -0,0 +1,58 @@
using System.Collections.Generic;
namespace Rokojori.DocGenerator
{
public class ParameterType
{
public string name;
public string type;
public string csNameSpace;
public List<string> generics;
}
public class MemberInfo
{
public string doc;
public string memberType;
public string name;
public string dataType;
public string csNameSpace;
public List<string> modifiers = new List<string>();
public List<string> generics;
public List<ParameterType> parameters = new List<ParameterType>();
public static readonly string Field = "Field";
public static readonly string Method = "Method";
public static MemberInfo Create( string memberType )
{
var m = new MemberInfo();
m.memberType = memberType;
return m;
}
public static MemberInfo CreateField()
{
return MemberInfo.Create( MemberInfo.Field );
}
public static MemberInfo CreateMethod()
{
return MemberInfo.Create( MemberInfo.Method );
}
}
public class ClassDocInfo
{
public string csNameSpace = "";
public string name ="";
public string doc;
public string icon;
public List<string> generics = new List<string>();
public List<string> extendingClasses = new List<string>();
public List<MemberInfo> memberInfos = new List<MemberInfo>();
}
}

59
Tools/docs/CreateDoc.cs Normal file
View File

@ -0,0 +1,59 @@
using Godot;
using System.Collections.Generic;
namespace Rokojori.DocGenerator
{
public class SomeArrayClass
{
public int index = 2;
public string value = "Hello World";
}
public class SomeClass
{
public float x = 0;
public float GetX()
{
return x * 2;
}
public List<SomeArrayClass> values = new List<SomeArrayClass>();
}
[GlobalClass][Tool]
public partial class CreateDoc : Node
{
[Export]
public string outputPath ="res://addons/rokojori_action_library/Tools/docs/output";
[ExportToolButton( "Create")]
public Callable createButton => Callable.From( ()=>{ Generate(); } );
void Test()
{
var obj = new SomeClass();
var sa = new SomeArrayClass();
var sb = new SomeArrayClass();
sb.value = "Huhu";
obj.values.Add( sa );
obj.values.Add( sb );
var testJSON = JSON.StringifyObject( obj );
RJLog.Log( testJSON );
}
void Generate()
{
var absoluteLibraryPath = ProjectSettings.GlobalizePath( "res://addons/rokojori_action_library/Runtime" );
var absoluteIconPath = ProjectSettings.GlobalizePath( "res://addons/rokojori_action_library/Icons" );
var absoluteOutputPath = ProjectSettings.GlobalizePath( outputPath );
var generator = new DocGenerator();
var icons = Lists.Map( FilesSync.GetFiles( absoluteIconPath, ( fp => fp.fileExtension == ".svg" ) ), fp => fp.fullFileName );
generator.Generate( absoluteLibraryPath, absoluteOutputPath, icons );
}
}
}

View File

@ -0,0 +1 @@
uid://bx30sgaoxsav5

86
Tools/docs/DocComments.cs Normal file
View File

@ -0,0 +1,86 @@
using Godot;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace Rokojori.DocGenerator
{
public class DocCommentEntry
{
public string type;
public string name;
public string doc;
}
public class DocComments
{
public Regex commentStartOld = new Regex( "\\/\\*\\*\\s*<\\s*summary\\s+for\\s*=\\s*\"\\s*(\\w+)\\s+(\\w+)\\s*\"" );
public Regex commentStart =
RegexBuilder.Create()
[ "/**" ]._[ "<" ]._[ "summary" ].__[ "for" ]._[ "=" ]._[ "\"" ]._.Word.__.Word._[ "\"" ]
.ToRegex();
public string classInfo = "class";
public string fieldInfo = "field";
public string methodInfo = "method";
public List<DocCommentEntry> entries = new List<DocCommentEntry>();
public void Grab( string data )
{
var lexEvents = CSharpLexer.Lex( data );
//RJLog.Log( "Num lex events:", lexEvents.Count );
lexEvents.ForEach(
( le )=>
{
if ( ! LexerMatcherLibrary.MultiLineCommentMatcher.Matches( le ) )
{
return;
}
var match = le.match;
if ( ! commentStart.IsMatch( match ) )
{
Regex isStartPartially = new Regex( "/\\*\\*\\s*<\\s*summary\\s*" );
//RJLog.Log( "Not doc Comment:", isStartPartially.IsMatch( match ), match );
return;
}
var result = commentStart.Matches( match );
var type = result[ 0 ].Groups[ 1 ].Value;
var name = result[ 0 ].Groups[ 2 ].Value;
var bodyStart = match.IndexOf( ">" ) + 1;
var bodyEnd = match.LastIndexOf( "<" );
var body = match.Substring( bodyStart, bodyEnd - bodyStart );
var entry = new DocCommentEntry();
entry.name = name;
entry.type = type;
entry.doc = body;
entries.Add( entry );
RJLog.Log( "Doc Comment:", entry.type, entry.name, ">>\n", entry.doc );
}
);
}
public string FindDoc( string type, string name )
{
var e= entries.Find( e => e.type == type && e.name == name );
return e == null ? null : e.doc;
}
}
}

111
Tools/docs/DocGenerator.cs Normal file
View File

@ -0,0 +1,111 @@
using Godot;
using Rokojori;
using System.Collections.Generic;
using System;
namespace Rokojori.DocGenerator
{
public class ClassTypeEntry
{
public Type type;
public string path;
}
public class DocGenerator
{
string path = "";
string outputPath = "";
List<string> icons = new List<string>();
public List<FilePath> classFiles = new List<FilePath>();
public List<ClassTypeEntry> classTypes = new List<ClassTypeEntry>();
public void Generate( string path, string outputPath, List<string> icons )
{
this.path = path;
this.outputPath = outputPath;
this.icons = icons;
GetFiles();
CreateTypesFromFiles();
IncludeDefaultTypes();
GenerateDocsFromTypes();
}
void GetFiles()
{
classFiles = FilesSync.GetFiles( path, f => f.fileExtension == ".cs", true );
}
void IncludeDefaultTypes()
{
var defaultTypes = new List<Type>()
{
typeof( NetworkNode ),
typeof( Action ),
typeof( Sensor ),
typeof( Selector )
};
defaultTypes.ForEach(
( dt )=>
{
var entry = new ClassTypeEntry();
entry.type = dt;
entry.path = null;
classTypes.Add( entry);
}
);
}
void CreateTypesFromFiles()
{
var genericType = new EventSlot<int>().GetType();
var namespaceLabel = "Rokojori";
var assembly = genericType.Assembly;
classFiles.ForEach(
( cf )=>
{
var name = cf.fileName;
var type = ReflectionHelper.GetTypeByName( namespaceLabel + "." + name );
if ( type == null )
{
type = ReflectionHelper.GetTypeByNameFromAssembly( name, assembly );
}
if ( type != null )
{
var entry = new ClassTypeEntry();
entry.type = type;
entry.path = cf.fullPath;
classTypes.Add( entry);
}
}
);
}
void GenerateDocsFromTypes()
{
classTypes.ForEach(
( c )=>
{
var cdg = new ClassDocGenerator();
var cinfo = cdg.Create( c.path, c.type, icons );
var outputPath = FilePath.Join( this.outputPath, cinfo.name + ".json" );
FilesSync.SaveJSON( outputPath, cinfo );
}
);
}
}
}

22
Tools/docs/OnlineDocs.cs Normal file
View File

@ -0,0 +1,22 @@
#if TOOLS
using Godot;
using Rokojori;
using System.Diagnostics;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Rokojori.Tools
{
public class OnlineDocs
{
static string docsPath = "https://rokojori.com/en/labs/godot/docs/4.3/";
public static void Open( System.Type type )
{
var name = type.Name + "-class";
var path = docsPath + name;
OS.ShellOpen( path );
}
}
}
#endif

View File

@ -0,0 +1 @@
uid://bb1yh8iwo8vde

View File

@ -1,7 +1,7 @@
[plugin]
name="Rokojori Action Library"
description="Rokojori plugin for the library"
description="Library for actions, assets and effects"
author="Rokojori"
version="1.0"
version="0.1"
script="RokojoriPlugin.cs"