Browse Source

REXM: Adding some `UpdateSourceMetadata()` -WIP-

Ray 2 weeks ago
parent
commit
9b99c5b04e
1 changed files with 148 additions and 6 deletions
  1. 148 6
      tools/rexm/rexm.c

+ 148 - 6
tools/rexm/rexm.c

@@ -166,16 +166,24 @@ static char **ScanExampleResources(const char *filePath, int *resPathCount);
 // Clear resource paths scanned
 static void ClearExampleResources(char **resPaths);
 
-// Add VS project (.vcxproj) to existing VS solution (.sln)
+// Add/remove VS project (.vcxproj) tofrom existing VS solution (.sln)
 static int AddVSProjectToSolution(const char *projFile, const char *slnFile, const char *category);
+//static int RemoveVSProjectFromSolution(const char *projFile, const char *slnFile, const char *category);
 
 // Generate unique UUID v4 string 
 // Output format: {9A2F48CC-0DA8-47C0-884E-02E37F9BE6C1} 
 static const char *GenerateUUIDv4(void);
 
+// Update source code header and comments metadata
+static void UpdateSourceMetadata(const char *exSrcPath, const rlExampleInfo *info);
 // Update generated Web example .html file metadata
 static void UpdateWebMetadata(const char *exHtmlPath, const char *exFilePath);
 
+// Get text between two strings
+static char *GetTextBetween(const char *text, const char *begin, const char *end);
+// Replace text between two specific strings
+static char *TextReplaceBetween(const char *text, const char *replace, const char *begin, const char *end);
+
 //------------------------------------------------------------------------------------
 // Program main entry point
 //------------------------------------------------------------------------------------
@@ -676,6 +684,13 @@ int main(int argc, char *argv[])
             FileCopy(TextFormat("%s/%s/%s.js", exBasePath, exRecategory, exRename),
                 TextFormat("%s/%s/%s.js", exWebPath, exRecategory, exRename));
 
+            // Create commit with changes (local)
+            ChangeDirectory("C:/GitHub/raylib");
+            int result = system(TextFormat("git commit -am \"REXM: RENAME: example: `%s` --> `%s`\"", exName, exRename)); // Commit changes (only tracked files)
+            if (result != 0) LOG("WARNING: Error committing changes\n");
+            //result = system("git push"); // Push to the remote (origin, current branch)
+            //if (result != 0) LOG("WARNING: Error pushing changes\n");
+
         } break;
         case OP_REMOVE:     // Remove
         {
@@ -2151,6 +2166,81 @@ static const char *GenerateUUIDv4(void)
     return uuid;
 }
 
+// Update source code header and comments metadata
+static void UpdateSourceMetadata(const char *exSrcPath, const rlExampleInfo *info)
+{
+    if (FileExists(exSrcPath) && IsFileExtension(exSrcPath, ".c"))
+    {
+        char *fileText = LoadFileText(exSrcPath);
+        char *fileTextUpdated[6] = { 0 };   // Pointers to multiple updated text versions
+
+        char exName[64] = { 0 };            // Example name: fileName without extension
+        char exCategory[16] = { 0 };        // Example category: core, shapes, text, textures, models, audio, shaders
+        char exDescription[256] = { 0 };    // Example description: example text line #3
+        char exTitle[64] = { 0 };           // Example title: fileName without extension, replacing underscores by spaces
+
+        // Update example header title (line #3 - ALWAYS)
+        // String: "*   raylib [shaders] example - texture drawing"
+
+
+        // Update example complexity rating
+        // String: "*   Example complexity rating: [★★☆☆] 2/4"
+        fileTextUpdated[0] = TextReplaceBetween(exSrcPath, "★★☆☆] 2", "Example complexity rating: [", "/4\n");
+
+
+        // Update example creation/update raylib versions
+        // String: "*   Example originally created with raylib 2.0, last time updated with raylib 3.7
+        
+
+        // Update contributors names
+        // String: "*   Example contributed by Contributor Name (@github_user) and reviewed by Ramon Santamaria (@raysan5)"
+        
+
+        // Update copyright message
+        // String: "*   Copyright (c) 2019-2025 Contributor Name (@github_user) and Ramon Santamaria (@raysan5)"
+        fileTextUpdated[0] = TextReplaceBetween(exSrcPath, "★★☆☆] 2", "Copyright (c) ", ")");
+
+        // Update window title
+        //"InitWindow(screenWidth, screenHeight, "raylib [shaders] example - texture drawing");"
+
+        /*
+        // Get example name: replace underscore by spaces
+        strcpy(exName, GetFileNameWithoutExt(exSrcPath));
+        strcpy(exTitle, exName);
+        for (int i = 0; (i < 256) && (exTitle[i] != '\0'); i++) { if (exTitle[i] == '_') exTitle[i] = ' '; }
+
+        // Get example category from exName: copy until first underscore
+        for (int i = 0; (exName[i] != '_'); i++) exCategory[i] = exName[i];
+
+        // Get example description: copy line #3 from example file
+        char *exText = LoadFileText(exFilePath);
+        int lineCount = 0;
+        char **lines = LoadTextLines(exText, &lineCount);
+        int lineLength = (int)strlen(lines[2]);
+        strncpy(exDescription, lines[2] + 4, lineLength - 4);
+        UnloadTextLines(lines);
+        UnloadFileText(exText);
+
+        // Update example.html required text
+        fileTextUpdated[0] = TextReplace(fileText, "raylib web game", exTitle);
+        fileTextUpdated[1] = TextReplace(fileTextUpdated[0], "New raylib web videogame, developed using raylib videogames library", exDescription);
+        fileTextUpdated[2] = TextReplace(fileTextUpdated[1], "https://www.raylib.com/common/raylib_logo.png",
+            TextFormat("https://raw.githubusercontent.com/raysan5/raylib/master/examples/%s/%s.png", exCategory, exName));
+        fileTextUpdated[3] = TextReplace(fileTextUpdated[2], "https://www.raylib.com/games.html",
+            TextFormat("https://www.raylib.com/examples/%s/%s.html", exCategory, exName));
+        fileTextUpdated[4] = TextReplace(fileTextUpdated[3], "raylib - example", TextFormat("raylib - %s", exName)); // og:site_name
+        fileTextUpdated[5] = TextReplace(fileTextUpdated[4], "https://github.com/raysan5/raylib",
+            TextFormat("https://github.com/raysan5/raylib/blob/master/examples/%s/%s.c", exCategory, exName));
+        */
+
+        SaveFileText(exSrcPath, fileTextUpdated[5]);
+
+        for (int i = 0; i < 6; i++) { MemFree(fileTextUpdated[i]); fileTextUpdated[i] = NULL; }
+
+        UnloadFileText(fileText);
+    }
+}
+
 // Update generated Web example .html file metadata
 static void UpdateWebMetadata(const char *exHtmlPath, const char *exFilePath)
 {
@@ -2164,11 +2254,6 @@ static void UpdateWebMetadata(const char *exHtmlPath, const char *exFilePath)
         char exDescription[256] = { 0 };    // Example description: example text line #3
         char exTitle[64] = { 0 };           // Example title: fileName without extension, replacing underscores by spaces
 
-        memset(exName, 0, 64);
-        memset(exTitle, 0, 64);
-        memset(exDescription, 0, 256);
-        memset(exCategory, 0, 16);
-
         // Get example name: replace underscore by spaces
         strcpy(exName, GetFileNameWithoutExt(exHtmlPath));
         strcpy(exTitle, exName);
@@ -2210,3 +2295,60 @@ static void UpdateWebMetadata(const char *exHtmlPath, const char *exFilePath)
         UnloadFileText(fileText);
     }
 }
+
+
+// Get text between two strings
+// NOTE: Using static string to return result, MAX: 1024 bytes
+static char *GetTextBetween(const char *text, const char *begin, const char *end)
+{
+#define MAX_TEXT_BETWEEN_SIZE   1024
+
+    static char between[MAX_TEXT_BETWEEN_SIZE] = { 0 };
+    memset(between, 0, MAX_TEXT_BETWEEN_SIZE);
+
+    int beginIndex = TextFindIndex(text, begin);
+
+    if (beginIndex > -1)
+    {
+        int beginLen = strlen(begin);
+        int endIndex = TextFindIndex(text + beginIndex + beginLen, end);
+
+        if (endIndex > -1)
+        {
+            endIndex += (beginIndex + beginLen);
+            int len = (endIndex - beginIndex - beginLen);
+            if (len < (MAX_TEXT_BETWEEN_SIZE - 1)) strncpy(between, text + beginIndex + beginLen, len);
+            else strncpy(between, text + beginIndex + beginLen, MAX_TEXT_BETWEEN_SIZE - 1);
+        }
+    }
+
+    return between;
+}
+
+// Replace text between two specific strings
+// WARNING: Returned string must be freed by user
+static char *TextReplaceBetween(const char *text, const char *replace, const char *begin, const char *end)
+{
+    char *result = NULL;
+    int beginIndex = TextFindIndex(text, begin);
+
+    if (beginIndex > -1)
+    {
+        int endIndex = TextFindIndex(text + beginIndex, end);
+
+        if (beginIndex > -1)
+        {
+            int textLen = strlen(text);
+            int replaceLen = strlen(replace);
+            int toreplaceLen = (endIndex + beginIndex) - (beginIndex + strlen(begin));
+            result = (char *)RL_CALLOC(textLen + replaceLen - toreplaceLen + 1, sizeof(char));
+
+            int beginLen = strlen(begin);
+            strncpy(result, text, textLen - beginIndex + strlen(begin)); // Copy first text part
+            strncpy(result + textLen - beginIndex + beginLen, replace, replaceLen); // Copy replace
+            strncpy(result + textLen - beginIndex + beginLen + replaceLen, text + beginIndex + toreplaceLen, textLen - endIndex); // Copy end text part
+        }
+    }
+
+    return result;
+}