2026年4月

internal final class CIG_TabPageRunUtil
{

public static void runNewTabPage(str className, str staticMethodName, container taskValue)
{
    str taskId = CIG_TabPageRunUtil::newTaskId();
    CIG_TabPageTask taskTb;
    taskTb.TaskId = taskId;
    taskTb.ClassName = className;
    taskTb.StaticMethodName = staticMethodName;
    taskTb.Value    = taskValue;
    taskTb.insert();

    str url = URLUtility::getUrl();
    Map map = CIG_TabPageRunUtil::getQueryMap(url);
    CIG_TabPageRunUtil::mapReplace(map, "mi", "CIG_TabPageRun");
    CIG_TabPageRunUtil::mapReplace(map, "taskId", taskId);

    url = CIG_TabPageRunUtil::genURL(url, map);
    Browser browser = new Browser();
    browser.navigate(url, true, false);
}

public static str queryValue(str url, str key)
{
    str ret;
    str pattern = strFmt(@"(?<=[?&]%1=)([^&]+)", key);

    ret = new System.Text.RegularExpressions.Regex( pattern).Match( new System.Uri(url).Query ).Value;
    return ret;
}

public static str newTaskId(int len = 5)
{   
    str chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    int mapLen = strLen(chars);;
    str ret;
    Random random = new Random();
    for(int i = 0; i<len; i++)
    {
        ret += subStr(chars, (random.nextInt() mod mapLen)+1, 1);
    }

    return ret;
}

public static str genURL(str host, Map mapQuery)
{
    str ret;
    str query = "?";
    MapEnumerator  em = mapQuery.getEnumerator();
    while(em.moveNext())
    {
        query += strFmt("&%1=%2", em.currentKey(), em.currentValue());
    }
    ret = "http://" + new System.Uri(host).Host + query;
    return ret;
}

public static Map getQueryMap(str url)
{
    str key,value;
    container conCurrent;
    str strQuery = new System.Uri(url).Query;
    Map map = new Map(Types::String, Types::String);
    if(strQuery)
    {
        strQuery = subStr( strQuery, 2, strLen(strQuery)-1);
        List list = strSplit(strQuery,"&");
        ListEnumerator em = list.getEnumerator();
        while(em.moveNext())
        {
            conCurrent = str2con( em.current(), '=');
            if(conLen(conCurrent) ==2)
            {
                map.add( any2Str(conPeek(conCurrent,1)), any2Str(conPeek(conCurrent,2)));
            }
        }
    }
    return map;
}

public static Map mapReplace(Map map, str key, str value)
{
    if(map.exists(key))
    {
        map.remove(key);
    }
    map.add(key,value);

    return map;
}

}