{"id":17643702,"url":"https://github.com/inyutin-maxim/vkscriptparser","last_synced_at":"2025-03-30T06:40:17.696Z","repository":{"id":84484381,"uuid":"257098332","full_name":"inyutin-maxim/vkscriptParser","owner":"inyutin-maxim","description":null,"archived":false,"fork":false,"pushed_at":"2020-05-06T11:50:34.000Z","size":141,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":4,"default_branch":"develop","last_synced_at":"2025-02-05T08:50:37.750Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/inyutin-maxim.png","metadata":{"files":{"readme":"README.MD","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-04-19T20:43:20.000Z","updated_at":"2022-08-25T06:22:16.000Z","dependencies_parsed_at":null,"dependency_job_id":"8b654960-8d07-4fdb-a1a1-9adf2a5e1bdb","html_url":"https://github.com/inyutin-maxim/vkscriptParser","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inyutin-maxim%2FvkscriptParser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inyutin-maxim%2FvkscriptParser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inyutin-maxim%2FvkscriptParser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inyutin-maxim%2FvkscriptParser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/inyutin-maxim","download_url":"https://codeload.github.com/inyutin-maxim/vkscriptParser/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246285663,"owners_count":20752953,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-23T09:23:49.487Z","updated_at":"2025-03-30T06:40:17.675Z","avatar_url":"https://github.com/inyutin-maxim.png","language":"C#","readme":"# Лексер, парсер, компилятор скриптового языка VKScript\n\n**VKScript** - язык, похожий на **JavaSсript** или **ActionScript** (предполагается совместимость с **ECMAScript**). Алгоритм должен завершаться командой **return %выражение%**. Операторы должны быть разделены точкой с запятой.\n\n\u003e Внутри **code** может содержаться не более 25 обращений к методам API.\n\nПример значения параметра code\n\n\u003e \u003cpre\u003e\n\u003e // присваивает переменной a результат поиска по фотографиям с данными параметрами\n\u003e var a = API.photos.search({\"q\":\"Nature\",\"count\":3});\n\u003e\n\u003e // присваивает переменной b список владельцев найденных фотографий\n\u003e var b = a.items@.owner_id;\n\u003e\n\u003e // присваивает переменной с данные о страницах владельцев из списка b\n\u003e var c = API.users.get({\"user_ids\":b});\n\u003e\n\u003e // возвращает список фамилий из данных о владельцах\n\u003e return c@.last_name;\n\u003e\n\u003e // пример цикла\n\u003e var a = 1;\n\u003e var b = 10;\n\u003e while (b != 0) {\n\u003e     b = b - 1;\n\u003e     a = a + 1;\n\u003e };\n\u003e return a;\n\u003e \u003c/pre\u003e\n\nТо же самое можно более коротко записать так:\n\n\u003e \u003cpre\u003ereturn API.users.get({\"user_ids\": API.photos.search({\"q\":\"Beatles\", \"count\":3}).items@.owner_id})@.last_name; \u003cbr\u003e\u003c/pre\u003e\n\nПоддерживаются:\n\n* арифметические операции\n* логические операции\n* создание массивов и списков ([X,Y])\n* **parseInt** и **parseDouble**\n* конкатенация (+)\n* конструкция **if**\n* фильтр массива по параметру (@.)\n* вызовы методов **API**, параметр **length**\n* циклы, используя оператор **while**\n* методы Javascript: **slice**, **push**, **pop**, **shift**, **unshift**, **splice**, **substr**, **split**\n* оператор **delete**\n* присваивания элементам маcсива,  например: row.user.action = \"test\";\n* поиск в массиве или строке — **indexOf**, например: \"123\".indexOf(2) = 1, [1, 2, 3].indexOf(3) = 2. Возвращает -1, если элемент не найден.\n\nВ данный момент не поддерживается создание функций.\n\nОбращение к элементам массива с результатом какого-либо метода всего должно основываться на структуре JSON, а не XML. Например, правильным обращением является\n\n\u003ctt\u003eAPI.photos.search({\"q\":\"Nature\",\"count\":3}).items@.owner_id;\u003c/tt\u003e, а не\n\n\u003ctt\u003eAPI.photos.search({\"q\":\"Nature\",\"count\":3}).items@.photo@.owner_id;\u003c/tt\u003e\n\n Метод **execute** также может использоваться и для получения результатов нескольких не связанных между собой запросов.\n\nПример значений параметра code\n\n\u003e \u003ctt\u003ereturn [API.users.isAppUser(), API.friends.get(), API.status.get()];\u003c/tt\u003e\n\n\u003e \u003ctt\u003ereturn {\"user\": API.users.isAppUser(), \"friends\": API.friends.get(), \"status\": API.status.get()};\u003c/tt\u003e\n\n В методе **execute** поддерживаются логические операции **\u003c** (меньше), **\u003e** (больше), **\u003c=** (меньше или равно), **\u003e=** (больше или равно), **==** (равно) и **!=** (не равно). В данный момент поддерживаются сравнения двух строк, двух чисел и строки и числа (в этом случае строка приводится к числу).\n\n Результат логического выражения может быть использован в управляющей конструкции **if** ... [**else** ...]:\n\nПример значения параметра code\n\n\u003e \u003ctt\u003e\u003cpre\u003evar posts = API.wall.get({\"count\": 1});\n\u003e if (posts.count\u0026lt;0) {\n\u003e   return {\"post\": null, \"copy_owner\": null};\n\u003e } else {\n\u003e   var post = posts.items[0];\n\u003e   var copy_owner=null;\n\u003e   if (post.copy_history[0]){\n\u003e     if (post.copy_history[0].owner_id \u0026gt; 0) {\n\u003e       copy_owner = API.users.get({\"user_id\": post.copy_history[0].owner_id})[0];\n\u003e     } else\n\u003e     if (post.copy_history[0].owner_id  \u0026lt; 0) {\n\u003e       copy_owner = API.groups.getById({\"group_ids\": -post.copy_history[0].owner_id})[0];\n\u003e     }\n\u003e     return {\"post\": post, \"copy_owner\": copy_owner};\n\u003e   } else {\n\u003e     return {\"post\": post, \"copy_owner\": null};\n\u003e   }\n\u003e }\u003c/pre\u003e\u003c/tt\u003e\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finyutin-maxim%2Fvkscriptparser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Finyutin-maxim%2Fvkscriptparser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finyutin-maxim%2Fvkscriptparser/lists"}