diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..053c9066 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.own linguist-language=Scala diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 00000000..15ba0c83 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,55 @@ +name: docs + +on: + push: + branches: [ "latest" ] + +jobs: + docs-build: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [16] + java: [21] + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v3 + with: + version: 8 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: pnpm + cache-dependency-path: docs/pnpm-lock.yaml + - name: Install dependencies + run: cd docs && pnpm install + + - name: Set up JDK ${{ matrix.java }} + uses: actions/setup-java@v4 + with: + java-version: ${{ matrix.java }} + distribution: 'temurin' + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + - name: Build docs + run: ./gradlew buildDocs + + - name: Clear docs + uses: appleboy/ssh-action@v1.0.3 + with: + host: ${{ secrets.SSH_HOST }} + username: ${{ secrets.SSH_USERNAME }} + port: ${{ secrets.SSH_PORT }} + key: ${{ secrets.SSH_KEY }} + script: ${{ secrets.DOCS_CLEAR_SCRIPT }} + - name: Upload docs + uses: appleboy/scp-action@v0.1.7 + with: + host: ${{ secrets.SSH_HOST }} + username: ${{ secrets.SSH_USERNAME }} + port: ${{ secrets.SSH_PORT }} + key: ${{ secrets.SSH_KEY }} + source: './docs/docs/.vuepress/dist/*' + target: ${{ secrets.DOCS_UPLOAD_PATH }} + strip_components: 4 diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml new file mode 100644 index 00000000..5d69a63c --- /dev/null +++ b/.github/workflows/gradle.yml @@ -0,0 +1,26 @@ +name: build + +on: + push: + branches: [ "latest" ] + pull_request: + branches: [ "latest" ] + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + java: [ '17', '21' ] + name: Test + steps: + - uses: actions/checkout@v4 + - name: Set up JDK ${{ matrix.java }} + uses: actions/setup-java@v4 + with: + java-version: ${{ matrix.java }} + distribution: 'temurin' + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + - name: Run tests + run: ./gradlew test diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..ee9683a7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +/.gradle/ +/.idea/ +/.nb-gradle/ +**/build/ +/out/ +/store/ +/optimizations/ +OwnLang.iml +*.sh \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..7662d625 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,25 @@ +FROM gradle:8.13.0-jdk21-alpine AS cache +RUN mkdir -p /home/gradle/cache_home +ENV GRADLE_USER_HOME=/home/gradle/cache_home +COPY build.gradle /home/gradle/java-code/ +WORKDIR /home/gradle/java-code +RUN GRADLE_OPTS="-Xmx256m" gradle build --build-cache --stacktrace -i --no-daemon + +FROM gradle:8.13.0-jdk21-alpine AS builder +COPY --from=cache /home/gradle/cache_home /home/gradle/.gradle +COPY . /usr/src/java-code +WORKDIR /usr/src/java-code +RUN GRADLE_OPTS="-Xmx256m" gradle shadowJar --build-cache --stacktrace --no-daemon + +FROM eclipse-temurin:21-jre-alpine +WORKDIR /opt/ownlang +ENV PATH /opt/ownlang:$PATH +COPY --from=builder /usr/src/java-code/ownlang-desktop/build/libs/*.jar libs/OwnLang.jar +COPY --from=builder /usr/src/java-code/modules/jdbc/build/libs/*.jar modules/ +COPY --from=builder /usr/src/java-code/modules/server/build/libs/*.jar modules/ +COPY --from=builder /usr/src/java-code/modules/socket/build/libs/*.jar modules/ +COPY dist/own . +COPY dist/ownlang . +RUN chmod +x own ownlang +ENTRYPOINT ["ownlang"] + diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..b9f4d675 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2015-2016 Victor Melnik + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..dfd9473a --- /dev/null +++ b/README.md @@ -0,0 +1,157 @@ +# OwnLang + +OwnLang - dynamic functional programming language inspired by Scala and Python. Available for PC, Android and Java ME devices. + +## Installing + +| Free | Pro | Desktop | +| :--: | :-: |:------------------------------------------------------------------------------------------:| +| [![Free](https://developer.android.com/images/brand/en_generic_rgb_wo_45.png)](https://play.google.com/store/apps/details?id=com.annimon.ownlang.free) | [![Pro](https://developer.android.com/images/brand/en_generic_rgb_wo_45.png)](https://play.google.com/store/apps/details?id=com.annimon.ownlang) | [v2.1.0](https://github.com/aNNiMON/Own-Programming-Language-Tutorial/releases/tag/v2.1.0) | + +Also available as AUR package: + +``` +yay -S ownlang +``` + +## Key features + +#### Higher-order functions + +Functions are values, so we can store them to variables for operating. + +```scala +operations = { + "+" : def(a,b) = a+b, + "-" : def(a,b) = a-b, + "*" : def(a,b) = a*b, + "/" : ::division +} + +def division(v1, v2) { + if (v2 == 0) return "error: division by zero" + return v1 / v2 +} + +for name, operation : operations { + println "2 " + name + " 3 = " + operation(2, 3) +} +``` + +#### Pattern Matching + +Pattern matching with value pattern, tuple pattern, list pattern and optional condition. + +```scala +def factorial(n) = match n { + case 0: 1 + case n if n < 0: 0 + case _: n * factorial(n - 1) +} + +def fizzbuzz(limit = 100) { + for i = 1, i <= limit, i++ { + println match [i % 3 == 0, i % 5 == 0] { + case (true, false): "Fizz" + case (false, true): "Buzz" + case (true, true): "FizzBuzz" + case _: i + } + } +} + +// run +fizzbuzz() +``` + +#### Functional data operations + +Operate data in functional style. + +```scala +use std, functional + +nums = [1,2,3,4,5,6,7,8,9,10] +nums = filter(nums, def(x) = x % 2 == 0) +// Squares of even numbers +squares = map(nums, def(x) = x * x) +foreach(squares, ::echo) +// Sum of squares +sum = reduce(squares, 0, def(x, y) = x + y) +println "Sum: " + sum +// Same using stream +println "Sum: " + stream(range(1, 11)) + .filter(def(x) = x % 2 == 0) + .map(def(x) = x * x) + .reduce(0, def(x, y) = x + y) +``` + +#### Operator overloading + +Why not? + +```scala +use std, types, math + +def `..`(a, b) = range(a, b) +def `**`(a, b) = int(pow(a, b)) +for y : 1 .. 10 { + println sprintf("2 ^ %d = %d", y, 2 ** y) +} +``` + +#### Network module + +Easy async HTTP requests with `http` module. + +```scala +use std, http, functional, json + +// GET request +http("https://api.github.com/events", def(r) { + events = jsondecode(r) + println events[0] +}) + +// POST request +http("http://jsonplaceholder.typicode.com/users", "POST", { + "name": "OwnLang", + "versionCode": 10 +}, ::echo) + +// PATCH request +http("http://jsonplaceholder.typicode.com/users/2", "PATCH", {"name": "Patched Name"}, ::patch_callback) + +def patch_callback(v) { + println v +} +``` + +## Language specification + +[English](https://annimon.com/docs/ownlang/en/) and [Russian](https://annimon.com/docs/ownlang/ru/) + +[Examples](examples/) + + +## Build + +Build using Gradle `./gradlew shadowJar` + +or take a look to [latest release](https://github.com/aNNiMON/Own-Programming-Language-Tutorial/releases/latest) for binaries. + + +## Run + +To run script use command + +`java -jar OwnLang.jar -f input.own` + +or + +`java -jar OwnLang.jar < input.own` + + +## License + +MIT - see [MIT license information](LICENSE) diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..b4573e47 --- /dev/null +++ b/build.gradle @@ -0,0 +1,34 @@ +ext { + versions = [ + project: '2.1.0', + + json: '20240303', // org.json:json + snakeyaml: '1.33', // org.yaml:snakeyaml + okhttp: '4.12.0', // com.squareup.okhttp3:okhttp + socket: '2.1.1', // io.socket:socket.io-client + jline: '2.14.6', // jline:jline + + javalin: '6.3.0', // io.javalin:javalin + slf4j: '2.0.16', // org.slf4j:slf4j-simple + jackson: '2.18.0', // com.fasterxml.jackson.core:jackson-databind + + junit: '5.11.2', // org.junit:junit-bom + jmh: '1.37', // org.openjdk.jmh:jmh-core + assertj: '3.26.3' // org.assertj:assertj-core + ] +} + +allprojects { + repositories { + mavenCentral() + } + + gradle.projectsEvaluated { + tasks.withType(JavaCompile).tap { + configureEach { + [compileJava, compileTestJava]*.options*.encoding = 'UTF-8' + options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" + } + } + } +} diff --git a/build.xml b/build.xml deleted file mode 100644 index f3b3e8f2..00000000 --- a/build.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - Builds, tests, and runs the project OwnLang. - - - diff --git a/dist/icon.png b/dist/icon.png new file mode 100644 index 00000000..608745a0 Binary files /dev/null and b/dist/icon.png differ diff --git a/dist/own b/dist/own new file mode 100755 index 00000000..00f7a6f8 --- /dev/null +++ b/dist/own @@ -0,0 +1,2 @@ +#!/usr/bin/env sh +ownlang run own "$@" \ No newline at end of file diff --git a/dist/own.cmd b/dist/own.cmd new file mode 100644 index 00000000..76496d75 --- /dev/null +++ b/dist/own.cmd @@ -0,0 +1,2 @@ +@echo off +ownlang run own %* \ No newline at end of file diff --git a/dist/ownlang b/dist/ownlang new file mode 100755 index 00000000..a717400c --- /dev/null +++ b/dist/ownlang @@ -0,0 +1,38 @@ +#!/usr/bin/env sh +(set -o igncr) 2>/dev/null && set -o igncr; # cygwin encoding fix + +# resolve links - $0 may be a softlink +PRG="$0" +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`/"$link" + fi +done +PRGDIR=`dirname "$PRG"` + +_classpath=".:$PRGDIR/OwnLang.jar" +if [ `uname -a | grep -i -c cygwin` -ne 0 ]; then # Cygwin, translate the path + for k in "$PRGDIR"/modules/*.jar + do + _classpath="${_classpath};`cygpath -w ${k}`" + done + for k in "$PRGDIR"/libs/*.jar + do + _classpath="${_classpath};`cygpath -w ${k}`" + done +else + for k in "$PRGDIR"/modules/*.jar + do + _classpath="${_classpath}:${k}" + done + for k in "$PRGDIR"/libs/*.jar + do + _classpath="${_classpath}:${k}" + done +fi + +java -cp "${_classpath}" com.annimon.ownlang.Main "$@" \ No newline at end of file diff --git a/dist/ownlang-runner.cmd b/dist/ownlang-runner.cmd new file mode 100644 index 00000000..a7099924 --- /dev/null +++ b/dist/ownlang-runner.cmd @@ -0,0 +1,4 @@ +@echo off +set JAVA=java +%JAVA% -cp "%~dp0/*;%~dp0modules/*;%~dp0libs/*" com.annimon.ownlang.Main --file %1 +pause \ No newline at end of file diff --git a/dist/ownlang.cmd b/dist/ownlang.cmd new file mode 100644 index 00000000..8595d86d --- /dev/null +++ b/dist/ownlang.cmd @@ -0,0 +1,5 @@ +@echo off + +set JAVA=java +%JAVA% ^ + -cp "%~dp0/*;%~dp0modules/*;%~dp0libs/*" com.annimon.ownlang.Main %* diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 00000000..c561d8e5 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,6 @@ +node_modules +.temp +.cache +docs/.vuepress/configs/modules.js +docs/.vuepress/dist/ +docs/*/modules/ diff --git a/docs/build.gradle b/docs/build.gradle new file mode 100644 index 00000000..72811d40 --- /dev/null +++ b/docs/build.gradle @@ -0,0 +1,54 @@ +plugins { + id 'java' +} + +group = 'com.annimon' +version = versions.project + +dependencies { + implementation project(":ownlang-core") + implementation project(":ownlang-parser") + implementation project(":ownlang-utils") + implementation project(":modules:main") + implementation project(":modules:canvasfx") + implementation project(":modules:server") + + implementation "org.yaml:snakeyaml:${versions.snakeyaml}" +} + +tasks.register('generateMarkdownModules') { + group = "documentation" + def ownlangExec = tasks.getByPath(':ownlang-desktop:ownlangExec') + doFirst { + ownlangExec.configure { + workingDir '../docs/src' + args '-f', 'docgen-md.own' + } + } + finalizedBy ownlangExec +} + +tasks.register('runDocsDev', Exec) { + group = "documentation" + description = "Start docs dev server" + dependsOn generateMarkdownModules + workingDir '../docs/docs' + commandLine 'pnpm', 'docs:dev' +} + +tasks.register('buildDocs', Exec) { + group = "documentation" + description = "Build docs to static site" + dependsOn generateMarkdownModules + workingDir '../docs/docs' + commandLine 'pnpm', 'docs:build' +} + +tasks.register('generateModuleInfo', JavaExec) { + group = "documentation" + description = "Run sample program" + dependsOn classes + mainClass = 'com.annimon.ownlang.docs.ModulesInfoCreator' + classpath = sourceSets.main.runtimeClasspath + args 'server', 'okhttp' +} \ No newline at end of file diff --git a/docs/docs/.vuepress/components/Scope.vue b/docs/docs/.vuepress/components/Scope.vue new file mode 100644 index 00000000..0d5cd18e --- /dev/null +++ b/docs/docs/.vuepress/components/Scope.vue @@ -0,0 +1,30 @@ + + + + + \ No newline at end of file diff --git a/docs/docs/.vuepress/components/Since.vue b/docs/docs/.vuepress/components/Since.vue new file mode 100644 index 00000000..62232ab3 --- /dev/null +++ b/docs/docs/.vuepress/components/Since.vue @@ -0,0 +1,32 @@ + + + + + \ No newline at end of file diff --git a/docs/docs/.vuepress/config.js b/docs/docs/.vuepress/config.js new file mode 100644 index 00000000..78845b53 --- /dev/null +++ b/docs/docs/.vuepress/config.js @@ -0,0 +1,63 @@ +import { defineUserConfig, defaultTheme } from 'vuepress' +import { getDirname, path } from '@vuepress/utils' +import { registerComponentsPlugin } from '@vuepress/plugin-register-components' +import { prismjsPlugin } from '@vuepress/plugin-prismjs' +import { searchPlugin } from '@vuepress/plugin-search' +import { sidebarConfig } from './configs/sidebar' +import { navbarConfig } from './configs/navbar' +import Prism from 'prismjs'; +import definePrismOwnLang from '../../../editors/prismjs/own-language.js' + +definePrismOwnLang(Prism) +const __dirname = getDirname(import.meta.url) + +export default defineUserConfig({ + base: "/docs/ownlang/", + locales: { + '/en/': { + lang: 'en-US', + title: 'OwnLang', + description: 'OwnLang documentation', + }, + '/ru/': { + lang: 'ru-RU', + title: 'OwnLang', + description: 'Документация OwnLang', + } + }, + + theme: defaultTheme({ + repo: 'aNNiMON/Own-Programming-Language-Tutorial', + docsBranch: 'next', + editLinkPattern: ':repo/blob/:branch/docs/docs/:path', + editLinkText: 'View source', + contributors: false, + locales: { + '/en/': { + selectLanguageName: 'English', + sidebar: sidebarConfig.en, + navbar: navbarConfig.en + }, + '/ru/': { + selectLanguageName: 'Русский', + sidebar: sidebarConfig.ru, + navbar: navbarConfig.ru + } + } + }), + + plugins: [ + prismjsPlugin({ + preloadLanguages: ['own', 'json'] + }), + registerComponentsPlugin({ + componentsDir: path.resolve(__dirname, './components'), + }), + searchPlugin({ + locales: { + '/en/': { placeholder: 'Search' }, + '/ru/': { placeholder: 'Поиск' }, + }, + }), + ], +}) diff --git a/docs/docs/.vuepress/configs/navbar.js b/docs/docs/.vuepress/configs/navbar.js new file mode 100644 index 00000000..2c7a2a69 --- /dev/null +++ b/docs/docs/.vuepress/configs/navbar.js @@ -0,0 +1,16 @@ +import pages from './pages' + +let navbar = {} +for (let lang of ['en', 'ru']) { + let config = [] + for (let [relativePath, entry] of Object.entries(pages)) { + const path = '/' + lang + relativePath + config.push({ + text: entry.text[lang], + children: entry.pages.map(r => path + r) + }) + } + navbar[lang] = config +} + +export const navbarConfig = navbar \ No newline at end of file diff --git a/docs/docs/.vuepress/configs/pages.js b/docs/docs/.vuepress/configs/pages.js new file mode 100644 index 00000000..d60daba0 --- /dev/null +++ b/docs/docs/.vuepress/configs/pages.js @@ -0,0 +1,31 @@ +import modules from './modules' +export default { + '/': { + text: {'en': 'OwnLang', 'ru': 'OwnLang'}, + pages: [ + 'README.md', + 'links.md', + 'changelog.md', + ] + }, + + '/basics/': { + text: {'en': 'Basics', 'ru': 'Основы'}, + pages: [ + 'comments.md', + 'strings.md', + 'types.md', + 'loops.md', + 'functions.md', + 'destructuring_assignment.md', + 'pattern_matching.md', + 'string_functions.md', + 'array_functions.md' + ] + }, + + '/modules/': { + text: {'en': 'Modules', 'ru': 'Модули'}, + pages: modules + } +} \ No newline at end of file diff --git a/docs/docs/.vuepress/configs/sidebar.js b/docs/docs/.vuepress/configs/sidebar.js new file mode 100644 index 00000000..057ca20d --- /dev/null +++ b/docs/docs/.vuepress/configs/sidebar.js @@ -0,0 +1,17 @@ +import pages from './pages' + +let sidebar = {} +for (let lang of ['en', 'ru']) { + let config = {} + for (let [relativePath, entry] of Object.entries(pages)) { + const path = '/' + lang + relativePath + config[path] = (path in config) ? config[path] : [] + config[path].push({ + text: entry.text[lang], + children: entry.pages.map(r => path + r) + }) + } + sidebar[lang] = config +} + +export const sidebarConfig = sidebar \ No newline at end of file diff --git a/docs/docs/.vuepress/styles/palette.scss b/docs/docs/.vuepress/styles/palette.scss new file mode 100644 index 00000000..c4f3dd38 --- /dev/null +++ b/docs/docs/.vuepress/styles/palette.scss @@ -0,0 +1,15 @@ +:root { + --c-brand: #f15d15; + --c-brand-light: #ff9562; + --c-badge-danger: #f63f3f; + --c-badge-warning: #d0af01; + + --usc-since: var(--c-badge-warning); + --usc-scope: var(--c-brand); +} +html.dark { + --c-brand: #e1792d; + --c-brand-light: #ff8e3d; + --c-badge-danger: #d94657; + --c-badge-danger-text: #160304; +} \ No newline at end of file diff --git a/docs/docs/README.md b/docs/docs/README.md new file mode 100644 index 00000000..4b8be740 --- /dev/null +++ b/docs/docs/README.md @@ -0,0 +1,15 @@ +--- +home: true +title: OwnLang +heroText: OwnLang +tagline: Dynamic functional programming language +actions: + - text: English + link: /en/ + type: primary + - text: Русский + link: /ru/ + type: primary +footer: © 2024 aNNiMON +--- + \ No newline at end of file diff --git a/docs/docs/code/basics/destructuring_assignment1.own b/docs/docs/code/basics/destructuring_assignment1.own new file mode 100644 index 00000000..893d4c8a --- /dev/null +++ b/docs/docs/code/basics/destructuring_assignment1.own @@ -0,0 +1,5 @@ +arr = ["a", "b", "c"] +extract(var1, var2, var3) = arr +print var1 // a +print var2 // b +print var3 // c \ No newline at end of file diff --git a/docs/docs/code/basics/destructuring_assignment2.own b/docs/docs/code/basics/destructuring_assignment2.own new file mode 100644 index 00000000..bb1b128a --- /dev/null +++ b/docs/docs/code/basics/destructuring_assignment2.own @@ -0,0 +1,4 @@ +arr = ["a", "b", "c"] +var1 = arr[0] +var2 = arr[1] +var3 = arr[2] \ No newline at end of file diff --git a/docs/docs/code/basics/destructuring_assignment3.own b/docs/docs/code/basics/destructuring_assignment3.own new file mode 100644 index 00000000..1c8a6a14 --- /dev/null +++ b/docs/docs/code/basics/destructuring_assignment3.own @@ -0,0 +1,4 @@ +map = {"key1": 1, "test": "text"} +extract(var1, var2) = map +println var1 // [key1, 1] +println var2 // [test, text] \ No newline at end of file diff --git a/docs/docs/code/basics/destructuring_assignment4.own b/docs/docs/code/basics/destructuring_assignment4.own new file mode 100644 index 00000000..3538b909 --- /dev/null +++ b/docs/docs/code/basics/destructuring_assignment4.own @@ -0,0 +1,3 @@ +extract(x, , z) = [93, 58, 90] +println x // 93 +println z // 90 \ No newline at end of file diff --git a/docs/docs/code/basics/fibonacci.own b/docs/docs/code/basics/fibonacci.own new file mode 100644 index 00000000..eae9e8bf --- /dev/null +++ b/docs/docs/code/basics/fibonacci.own @@ -0,0 +1,9 @@ +def fibonacci(count) { + def fib(n) { + if n < 2 return n + return fib(n-2) + fib(n-1) + } + return fib(count) +} + +println fibonacci(10) // 55 \ No newline at end of file diff --git a/docs/docs/code/basics/loops1.own b/docs/docs/code/basics/loops1.own new file mode 100644 index 00000000..4a2ae95b --- /dev/null +++ b/docs/docs/code/basics/loops1.own @@ -0,0 +1,9 @@ +arr = [1, 2, 3, 4] +for v : arr { + println v +} + +map = {"key1": 1, "key2": 2} +for key, value : map + println key + " = " value +} \ No newline at end of file diff --git a/docs/docs/code/basics/pattern_matching1.own b/docs/docs/code/basics/pattern_matching1.own new file mode 100644 index 00000000..a67666f8 --- /dev/null +++ b/docs/docs/code/basics/pattern_matching1.own @@ -0,0 +1,7 @@ +x = 2 +print match x { + case 1: "One" + case 2: "Two" + case "str": "String" + case _: "Unknown" +} \ No newline at end of file diff --git a/docs/docs/code/basics/pattern_matching2.own b/docs/docs/code/basics/pattern_matching2.own new file mode 100644 index 00000000..80e6dccb --- /dev/null +++ b/docs/docs/code/basics/pattern_matching2.own @@ -0,0 +1,9 @@ +x = "str" +match x { + case "": { + println "Empty string" + } + case "str": { + println "String!" + } +} \ No newline at end of file diff --git a/docs/docs/code/basics/pattern_matching3.own b/docs/docs/code/basics/pattern_matching3.own new file mode 100644 index 00000000..ddacb268 --- /dev/null +++ b/docs/docs/code/basics/pattern_matching3.own @@ -0,0 +1,10 @@ +def test(x) = match x { + case a: "case a: " + a + case b: "case b: " + b + case c: "case c: " + c +} +a = 10 +b = 20 +println test(15) // case c: 15 +println test(20) // case b: 20 +println test("test") // case c: test \ No newline at end of file diff --git a/docs/docs/code/basics/pattern_matching4.own b/docs/docs/code/basics/pattern_matching4.own new file mode 100644 index 00000000..3ddbd67e --- /dev/null +++ b/docs/docs/code/basics/pattern_matching4.own @@ -0,0 +1,9 @@ +def test(x) = match x { + case x if x < 0: "(-∞ .. 0)" + case x if x > 0: "(0 .. +∞)" + case x: "0" +} + +println test(-10) // (-∞ .. 0) +println test(0) // 0 +println test(10) // (0 .. +∞) \ No newline at end of file diff --git a/docs/docs/code/basics/pattern_matching5.own b/docs/docs/code/basics/pattern_matching5.own new file mode 100644 index 00000000..97d5e40d --- /dev/null +++ b/docs/docs/code/basics/pattern_matching5.own @@ -0,0 +1,7 @@ +def arrayRecursive(arr) = match arr { + case [head :: tail]: "[" + head + ", " + arrayRecursive(tail) + "]" + case []: "[]" + case last: "[" + last + ", []]" +} + +println arrayRecursive([1, 2, 3, 4, 5, 6, 7]) // [1, [2, [3, [4, [5, [6, [7, []]]]]]]] \ No newline at end of file diff --git a/docs/docs/code/basics/pattern_matching6.own b/docs/docs/code/basics/pattern_matching6.own new file mode 100644 index 00000000..0ff5e70a --- /dev/null +++ b/docs/docs/code/basics/pattern_matching6.own @@ -0,0 +1,8 @@ +for i = 1, i <= 100, i++ { + println match [i % 3 == 0, i % 5 == 0] { + case (true, false): "Fizz" + case (false, true): "Buzz" + case (true, true): "FizzBuzz" + case _: i + } +} \ No newline at end of file diff --git a/docs/docs/code/basics/string_functions1.own b/docs/docs/code/basics/string_functions1.own new file mode 100644 index 00000000..954d1714 --- /dev/null +++ b/docs/docs/code/basics/string_functions1.own @@ -0,0 +1,7 @@ +str = " ababcaab " +println indexOf(str, "abc") +println str.indexOf("abc") + +def isBlank(s) = s.trim().isEmpty() +println isBlank(str) +println str.isBlank() \ No newline at end of file diff --git a/docs/docs/code/functional_en.own b/docs/docs/code/functional_en.own new file mode 100644 index 00000000..9de63c2e --- /dev/null +++ b/docs/docs/code/functional_en.own @@ -0,0 +1,15 @@ +use std, functional + +nums = [1,2,3,4,5,6,7,8,9,10] +nums = filter(nums, def(x) = x % 2 == 0) +// Squares of even numbers +squares = map(nums, def(x) = x * x) +foreach(squares, ::echo) +// Sum of squares +sum = reduce(squares, 0, def(x, y) = x + y) +println "Sum: " + sum +// Same using stream +println "Sum: " + stream(range(1, 11)) + .filter(def(x) = x % 2 == 0) + .map(def(x) = x * x) + .reduce(0, def(x, y) = x + y) diff --git a/docs/docs/code/functional_ru.own b/docs/docs/code/functional_ru.own new file mode 100644 index 00000000..ef710b16 --- /dev/null +++ b/docs/docs/code/functional_ru.own @@ -0,0 +1,15 @@ +use std, functional + +nums = [1,2,3,4,5,6,7,8,9,10] +nums = filter(nums, def(x) = x % 2 == 0) +// Квадраты чётных чисел +squares = map(nums, def(x) = x * x) +foreach(squares, ::echo) +// Сумма квадратов +sum = reduce(squares, 0, def(x, y) = x + y) +println "Сумма: " + sum +// То же самое с использованием stream +println "Сумма: " + stream(range(1, 11)) + .filter(def(x) = x % 2 == 0) + .map(def(x) = x * x) + .reduce(0, def(x, y) = x + y) diff --git a/docs/docs/code/high_order_functions_en.own b/docs/docs/code/high_order_functions_en.own new file mode 100644 index 00000000..a6c24356 --- /dev/null +++ b/docs/docs/code/high_order_functions_en.own @@ -0,0 +1,14 @@ +operations = { + "+" : def(a,b) = a+b, + "-" : def(a,b) = a-b, + "*" : def(a,b) = a*b, + "/" : ::division +} +def division(v1, v2) { + if (v2 == 0) return "error: division by zero" + return v1 / v2 +} + +for operation : operations { + println operation(2, 3) +} \ No newline at end of file diff --git a/docs/docs/code/high_order_functions_ru.own b/docs/docs/code/high_order_functions_ru.own new file mode 100644 index 00000000..f3abd153 --- /dev/null +++ b/docs/docs/code/high_order_functions_ru.own @@ -0,0 +1,14 @@ +operations = { + "+" : def(a,b) = a+b, + "-" : def(a,b) = a-b, + "*" : def(a,b) = a*b, + "/" : ::division +} +def division(v1, v2) { + if (v2 == 0) return "ошибка: деление на ноль" + return v1 / v2 +} + +for operation : operations { + println operation(2, 3) +} \ No newline at end of file diff --git a/docs/docs/code/http_en.own b/docs/docs/code/http_en.own new file mode 100644 index 00000000..38e283b1 --- /dev/null +++ b/docs/docs/code/http_en.own @@ -0,0 +1,20 @@ +use std, http, functional + +// GET request +http("https://api.github.com/events", def(r) { + use json + events = jsondecode(r) +}) + +// POST request +http("http://jsonplaceholder.typicode.com/users", "POST", { + "name": "OwnLang", + "versionCode": 10 +}, ::echo) + +// PATCH request +http("http://jsonplaceholder.typicode.com/users/2", "PATCH", {"name": "Patched Name"}, ::patch_callback) + +def patch_callback(v) { + println v +} diff --git a/docs/docs/code/http_ru.own b/docs/docs/code/http_ru.own new file mode 100644 index 00000000..abc3f799 --- /dev/null +++ b/docs/docs/code/http_ru.own @@ -0,0 +1,20 @@ +use std, http, functional + +// GET-запрос +http("https://api.github.com/events", def(r) { + use json + events = jsondecode(r) +}) + +// POST-запрос +http("http://jsonplaceholder.typicode.com/users", "POST", { + "name": "OwnLang", + "versionCode": 10 +}, ::echo) + +// PATCH-запрос +http("http://jsonplaceholder.typicode.com/users/2", "PATCH", {"name": "Патч"}, ::patch_callback) + +def patch_callback(v) { + println v +} diff --git a/docs/docs/code/operator_overloading.own b/docs/docs/code/operator_overloading.own new file mode 100644 index 00000000..d823b227 --- /dev/null +++ b/docs/docs/code/operator_overloading.own @@ -0,0 +1,7 @@ +use std, types, math + +def `..`(a, b) = range(a, b - 1) +def `**`(a, b) = int(pow(a, b)) +for y : 1 .. 10 { + println sprintf("2 ^ %d = %d", y, 2 ** y) +} \ No newline at end of file diff --git a/docs/docs/code/pattern_matching.own b/docs/docs/code/pattern_matching.own new file mode 100644 index 00000000..6beb3e85 --- /dev/null +++ b/docs/docs/code/pattern_matching.own @@ -0,0 +1,16 @@ +def factorial(n) = match n { + case 0: 1 + case n if n < 0: 0 + case _: n * factorial(n - 1) +} + +def fizzbuzz(limit = 100) { + for i = 1, i <= limit, i++ { + println match [i % 3 == 0, i % 5 == 0] { + case (true, false): "Fizz" + case (false, true): "Buzz" + case (true, true): "FizzBuzz" + case _: i + } + } +} \ No newline at end of file diff --git a/docs/docs/en/README.md b/docs/docs/en/README.md new file mode 100644 index 00000000..7b4b5931 --- /dev/null +++ b/docs/docs/en/README.md @@ -0,0 +1,35 @@ +# Overview + +OwnLang — dynamic functional programming language inspired by Scala and Python. Available for PC and Android devices. + +## Key features + +### Higher-order functions + +Functions are values, so we can store them to variables for operating. + +@[code](../code/high_order_functions_en.own) + +### Pattern Matching + +Pattern matching with value pattern, tuple pattern, list pattern and optional condition. + +@[code](../code/pattern_matching.own) + +### Functional data operations + +Operate data in functional style. + +@[code](../code/functional_en.own) + +### Operator overloading + +Why not? + +@[code](../code/operator_overloading.own) + +### Network module + +Easy async HTTP requests with `http` module. + +@[code](../code/http_en.own) \ No newline at end of file diff --git a/docs/docs/en/basics/README.md b/docs/docs/en/basics/README.md new file mode 100644 index 00000000..b68cc02f --- /dev/null +++ b/docs/docs/en/basics/README.md @@ -0,0 +1,11 @@ +# Basics + +* [Comments](comments.md) +* [Strings](strings.md) +* [Types](types.md) +* [Loops](loops.md) +* [Functions definition](functions.md) +* [Destructuring assignment](destructuring_assignment.md) +* [Pattern matching](pattern_matching.md) +* [String functions](string_functions.md) +* [Array functions](array_functions.md) diff --git a/docs/docs/en/basics/array_functions.md b/docs/docs/en/basics/array_functions.md new file mode 100644 index 00000000..16e827dc --- /dev/null +++ b/docs/docs/en/basics/array_functions.md @@ -0,0 +1,8 @@ +# Array functions + +Fields: + - `length` - number of elements of the array + +Functions: + - `isEmpty()` - returns true, if the array is empty + - `joinToString(delimiter = "", prefix = "", suffix = "")` - joins array into a string diff --git a/docs/docs/en/basics/comments.md b/docs/docs/en/basics/comments.md new file mode 100644 index 00000000..01eaa68b --- /dev/null +++ b/docs/docs/en/basics/comments.md @@ -0,0 +1,9 @@ +# Comments + +```own +// Line comment +/* multiline + comment +*/ +print /*inner comment*/ "Text" +``` \ No newline at end of file diff --git a/docs/docs/en/basics/destructuring_assignment.md b/docs/docs/en/basics/destructuring_assignment.md new file mode 100644 index 00000000..fca2558b --- /dev/null +++ b/docs/docs/en/basics/destructuring_assignment.md @@ -0,0 +1,19 @@ +# Destructuring assignment + +Destructuring assignment allows to define multiple variables for each element of an array or map. + +For arrays, value is assigned to variable: + +@[code](../../code/basics/destructuring_assignment1.own) + +Which is equivalent to: + +@[code](../../code/basics/destructuring_assignment2.own) + +For maps, key and value are assigned to variable: + +@[code](../../code/basics/destructuring_assignment3.own) + +To skip value just leave argument empty: + +@[code](../../code/basics/destructuring_assignment4.own) diff --git a/docs/docs/en/basics/functions.md b/docs/docs/en/basics/functions.md new file mode 100644 index 00000000..b12be6e2 --- /dev/null +++ b/docs/docs/en/basics/functions.md @@ -0,0 +1,54 @@ +# Functions definition + +To define function uses the `def` keyword: + +```own +def function(arg1, arg2) { + println arg1 +} +``` + +## Shorthand definition + +There is short syntax fot function body: + +```own +def repeat(str, count) = str * count +``` + +Which is equivalent to: + +```own +def repeat(str, count) { + return str * count +} +``` + +## Default arguments + +Function arguments can have default values. + +```own +def repeat(str, count = 5) = str * count +``` + +In this case only `str` argument is required. + +```own +repeat("*") // ***** +repeat("+", 3) // +++ +``` + +Default arguments can't be declared before required arguments. + +```own +def repeat(str = "*", count) = str * count +``` + +Causes parsing error: `ParseError on line 1: Required argument cannot be after optional` + +## Inner functions + +You can define function in other function. + +@[code](../../code/basics/fibonacci.own) diff --git a/docs/docs/en/basics/loops.md b/docs/docs/en/basics/loops.md new file mode 100644 index 00000000..ace5bff0 --- /dev/null +++ b/docs/docs/en/basics/loops.md @@ -0,0 +1,113 @@ +# Loops + +## while loop + +```own +while condition { + body +} +``` + +Parentheses in condition are not necessary. + +```own +i = 0 +while i < 5 { + print i++ +} + +// or + +i = 0 +while (i < 5) { + print i++ +} +``` + +## do-while loop + +```own +do { + body +} while condition +``` + +Parentheses in condition are not necessary. + +```own +i = 0 +do { + print i++ +} while i < 5 + +// or + +i = 0 +do { + print i++ +} while (i < 5) +``` + +## for loop + +```own +for initializing, condition, increment { + body +} + +for (initializing, condition, increment) { + body +} +``` + +```own +for i = 0, i < 5, i++ + print i++ + +// or + +for (i = 0, i < 5, i++) { + print i++ +} +``` + +## foreach loop + +Iterates elements of an string, array or map. + +Iterating over string: + +```own +for char : string { + body +} +for char, code : string { + body +} +``` + +Iterating over array: + +```own +for value : array { + body +} +for value, index : array { + body +} +``` + +Iterating over map: + +```own +for key, value : map { + body +} +for (key, value : map) { + body +} +``` + +Parentheses are not necessary. + +@[code](../../code/basics/loops1.own) diff --git a/docs/docs/en/basics/pattern_matching.md b/docs/docs/en/basics/pattern_matching.md new file mode 100644 index 00000000..86d775cc --- /dev/null +++ b/docs/docs/en/basics/pattern_matching.md @@ -0,0 +1,79 @@ +# Pattern matching + +The `match` operator allows to match values by pattern. + +@[code](../../code/basics/pattern_matching1.own) + +@[code](../../code/basics/pattern_matching2.own) + +In this case value and type are checking. If none of `case` branches doesn't match, the body of `case _` branch will executes. + + +In addition to the constant values, you can set variable name to `case`. + +@[code](../../code/basics/pattern_matching3.own) + +In this case there is two scenarios: + +1. Variable is already defined. Matching to its value. +2. Variable is not defined. Assign matching value to it and executes body of the `case` branch. + +In the example above, the interpreter sees the first two branches as: + +```own +case 10: +case 20: +``` + +For the last branch `c` variable is not defined, so assign `c = x` and execute body of the `case c` branch. + + +## Refinements + +`case` branch may have additional comparison + +@[code](../../code/basics/pattern_matching4.own) + + +## Matching arrays + +To compare elements of arrays, the following syntax is used: + +* `case []:` executes if there are no elements in array +* `case [a]:` executes if an array contains one element +* `case [a :: b]:` executes if an array contains two or more elements +* `case [a :: b :: c :: d :: e]:` executes if an array contain five or more elements + +There are two rules for the last two cases: + +* If variables count matches array elements count - all variables are assigned to the value of the array. + +```own +match [0, 1, 2] { + case [x :: y :: z]: // x = 0, y = 1, z = 2 +} +``` + +* If array elements count is greater, then the rest of the array will be assigned to the last variable. + +```own +match [0, 1, 2, 3, 4] { + case [x :: y :: z]: // x = 0, y = 1, z = [2, 3, 4] +} +``` + +An example of a recursive output array + +@[code](../../code/basics/pattern_matching5.own) + + +## Matching array's value + +To compare values of array's elements, the following syntax is used: + +* `case (expr1, expr2, expr3):` executes if an array contain 3 elements and first element is equal to expr1 result, second element is equal to expr2 and third element is equal to expr3. +* `case (expr1, _):` executes if an array contain 2 elements and first element is equal to expr1 result and result of the second element is not importand. + +FizzBuzz classical problem can be solved using Pattern Matching: + +@[code](../../code/basics/pattern_matching6.own) diff --git a/docs/docs/en/basics/string_functions.md b/docs/docs/en/basics/string_functions.md new file mode 100644 index 00000000..070dcb63 --- /dev/null +++ b/docs/docs/en/basics/string_functions.md @@ -0,0 +1,20 @@ +# String functions + +Fields: + - `length` - string length + - `lower` - lower case string + - `upper` - upper case string + - `chars` - ASCII characters array + +Functions: + - `trim()` - removes any leading and trailing whitespaces in string + - `startsWith(str, offset = 0)` - checks whether the string starts with the substring str at offset + - `endsWith(str)` - checks whether the string ends with the str + - `matches(regex)` - checks whether the string matches regex pattern + - `contains(str)` - checks whether the string contains substring str + - `equalsIgnoreCase(str)` - checks equality of two strings ignore case (tEsT = TEST) + - `isEmpty()` - returns true, if the string is empty + +In addition, there are automatic function extensions available if the function accepts a string as the first argument: + +@[code](../../code/basics/string_functions1.own) diff --git a/docs/docs/en/basics/strings.md b/docs/docs/en/basics/strings.md new file mode 100644 index 00000000..d44a99bb --- /dev/null +++ b/docs/docs/en/basics/strings.md @@ -0,0 +1,12 @@ +# Strings + +Strings are defined in double quotes and can be multiline. Escaping Unicode characters is also supported.: + +```own +str = "\n\tThis is +\tmultiline +\ttext +" +``` + +`print` and `println` operators are used to output text. \ No newline at end of file diff --git a/docs/docs/en/basics/types.md b/docs/docs/en/basics/types.md new file mode 100644 index 00000000..c7b5b116 --- /dev/null +++ b/docs/docs/en/basics/types.md @@ -0,0 +1,25 @@ +# Types + +OwnLang types are: + + * Number - numbers (integer, float) + * String - strings + * Array - arrays + * Map - objects (an associative arrays) + * Function - functions + * Class + +Since OwnLang is dynamic programming language, which means that explicitly declare the types is not necessary. + +```own +x = 10 // integer +y = 1.61803 // float +z = "abcd" // string +``` + +If some function requires string as argument, but number was passed, then numeric value will automatically converts to string. + +```own +x = 90 +print x // Ok, 90 converts to "90" +``` \ No newline at end of file diff --git a/docs/docs/en/changelog.md b/docs/docs/en/changelog.md new file mode 100644 index 00000000..89621261 --- /dev/null +++ b/docs/docs/en/changelog.md @@ -0,0 +1,113 @@ +# Changelog + +## Next + + +## 2.1.0 + +### Changes +- Add `own` package manager. Usage examples: `own`, `own init`, `own add openai`. +- Use relative path in include statement. + +### Fixes +- Fix passing command-line arguments to scripts. +- Fix `this` in non-static class methods. +- Fix program is not finished if using any http call (okhttp issue). +- Fix visitor and linter checks inside functions. + +### Modules +- [okhttp] Added `okhttp.newClient()` and `HttpClientBuilderValue`. +- [canvasfx] Updated JavaFX version. + + +## 2.0.0 + +### Breaking changes +- Minimal Java version is 17. +- Simplified use statement. `use std, math` instead of `use ["std", "math"]`. +- Change `case [x]` behavior in list pattern matching to match single element. +- More strict lexer. Fixed escaping backslash in strings. Fixed HEX numbers println 0x0123456789, 0x०१२३४५६७८९. + +### Changes +- Introducing Constants. Constant can be imported only when using a module. +- Support for long number declaration: `700L`, `0xABL` +- Fixed variables scope in shadowing. +- Better error visualizing. Parse errors shows exact line in which an error occurs. Same for Linter and Runtime errors. +- Semantic linter as a required stage. +- Preserve the order of Map elements by default. +- Ability to run programs from resources by adding "resource:" prefix to path. +- Added internal scripts and command `ownlang run` to run them. Added script `checkUpdate` that checks app updates. +- Updated [documentation](https://annimon.com/docs/ownlang/). New documentation engine based on vuepress. + +### Modules +- [std] Added parseDouble, nanotime, exit, getenv, getprop functions. +- [http] Added httpSync function. +- [functional] Added groupby, tomap, Stream.groupBy, Stream.filterNot, Stream.forEachIndexed, Stream::toMap, Stream.anyMatch, Stream.allMatch, Stream.noneMatch operators. +- [canvasfx] Works for Java 17+ with Java FX 17 (Windows only). +- [server] New server module. + + +## 1.5.0 + +- Added modules `zip`, `gzip`, `okhttp` +- Added functions `std::getBytes`, `std::stringFromBytes`, `std::stripMargin` +- Added JProgressBar, JTextArea, JScrollPane to `forms`, methods for JButton, JTextField and WindowListener +- Added function `joining` to `functional::stream` +- Added array properties: `arr.length`, `arr.isEmpty()`, `arr.joinToString(...)` +- Added null coalesce operator `??` +- Added basic support for classes +- Strict string to number conversion +- `for` supports iterating strings and arrays with index: + `for ch : "test"` + `for ch, code : "test"` + `for el : arr` + `for el, index : arr` +- Pretty-print for `jsonencode`: + `jsonencode(obj)` — minified json + `jsonencode(obj, 2)` — pretty-print json with 2 spaces indent +- Ability to set options for yaml parser/dumper +- Fixed mysql connection in `jdbc` +- Fixed `str::range` for reversed ranges +- Fixed files::readBytes with offset and length +- Fixed matching class constructor in `java::new`. Ability to instantiate classes with `new` operator +- Other minor changes + + +## 1.4.0 + +- Added modules `downloader`, `regex` +- Added functions `std::arraySplice`, `std::default` +- Added constant `std::OwnLang` which stores language version and platform metadata +- Added `peek`, `sorted` to StreamValue +- An ability to import several modules `use ["std", "types", "math"]` +- String internal fields support (length, lower, upper, chars, trim(), startsWith(s), endsWith(s), matches(s), contains(s), equalsIgnoreCase(s), isEmpty()). Also support for extensions: `"%d. %s".sprintf(1, "OwnLang")` -> `sprintf("%d. %s", 1, "OwnLang")` +- Added kawaii-operator `^^` +- Improved REPL mode. Now command history (up key) supported on all platforms. Added autocompletion by Tab key. +- Improved error output +- Updated examples + + +## 1.3.0 + +- Function and function call chaining support (`func().func()` and `func()()`) +- Added `takewhile`, `dropwhile`, `stream` functions to `functional` module +- Added `parseInt`, `parseLong`, `toHexString` functions to `std` module +- Added `copy` function to `files` module +- Added `socket`, `base64`, `java`, `forms`, `jdbc` modules +- Improved optimization +- Updated examples +- Minor fixes and improvements + +## 1.2.0 + +- Added `canvasfx`, `date`, `yml`, `aimp` modules +- Updated `std`, `math`, `files`, `functional` modules +- Added `std::ARGS` constant for accessing command-line arguments +- Added REPL mode, Beautifier, Linter, Optimizer +- Fixed error recovering in parser and deadlock in lexer +- Added merging objects operation `map1 + map2` +- Fixed variables scope +- Speed up files reading +- Added NumberValue cache +- Updated Netbeans plugin +- Added examples and help diff --git a/docs/docs/en/links.md b/docs/docs/en/links.md new file mode 100644 index 00000000..345725c1 --- /dev/null +++ b/docs/docs/en/links.md @@ -0,0 +1,13 @@ +# Links + +## Downloads + +Android: [Free](https://play.google.com/store/apps/details?id=com.annimon.ownlang.free) / [Pro](https://play.google.com/store/apps/details?id=com.annimon.ownlang) +PC / Netbeans Plugin / etc: [GitHub Releases](https://github.com/aNNiMON/Own-Programming-Language-Tutorial/releases) +Source code: [GitHub](https://github.com/aNNiMON/Own-Programming-Language-Tutorial) + +Also available as AUR package: + +``` +paru -S ownlang +``` diff --git a/docs/docs/ru/README.md b/docs/docs/ru/README.md new file mode 100644 index 00000000..0e7c2b2e --- /dev/null +++ b/docs/docs/ru/README.md @@ -0,0 +1,35 @@ +# Возможности + +OwnLang — скриптовый функциональный язык программирования с динамической типизацией для ПК и Android устройств. + +## Ключевые особенности + +### Функции высшего порядка + +Функции выступают как значения, а значит мы можем сохранять их в переменные для дальнейшего использования. + +@[code](../code/high_order_functions_ru.own) + +### Pattern Matching + +Сопоставление по образцу с шаблоном значений, шаблоном кортежей, шаблоном списков и дополнительным сравнением. + +@[code](../code/pattern_matching.own) + +### Функциональные операции над данными + +Оперирование данными в функциональном стиле. + +@[code](../code/functional_ru.own) + +### Перегрузка операторов + +Почему бы и нет? + +@[code](../code/operator_overloading.own) + +### Модуль для работы с сетью Интернет + +Простые асинхронные HTTP-запросы с модулем `http`. + +@[code](../code/http_ru.own) \ No newline at end of file diff --git a/docs/docs/ru/basics/README.md b/docs/docs/ru/basics/README.md new file mode 100644 index 00000000..0b843ddb --- /dev/null +++ b/docs/docs/ru/basics/README.md @@ -0,0 +1,11 @@ +# Синтаксис и основы языка + +* [Комментарии](comments.md) +* [Строки](strings.md) +* [Типы](types.md) +* [Циклы](loops.md) +* [Определение функций](functions.md) +* [Реструктуризующее присваивание](destructuring_assignment.md) +* [Pattern matching](pattern_matching.md) (сопоставление с образцом) +* [Функции строк](string_functions.md) +* [Функции массивов](array_functions.md) \ No newline at end of file diff --git a/docs/docs/ru/basics/array_functions.md b/docs/docs/ru/basics/array_functions.md new file mode 100644 index 00000000..cba7892e --- /dev/null +++ b/docs/docs/ru/basics/array_functions.md @@ -0,0 +1,8 @@ +# Функции массивов + +Поля: + - `length` - количество элементов массива + +Функции: + - `isEmpty()` - возвращает true, если массив пуст + - `joinToString(delimiter = "", prefix = "", suffix = "")` - склеивает массив в строку diff --git a/docs/docs/ru/basics/comments.md b/docs/docs/ru/basics/comments.md new file mode 100644 index 00000000..189f8405 --- /dev/null +++ b/docs/docs/ru/basics/comments.md @@ -0,0 +1,9 @@ +# Комментарии + +```own +// Однострочный комментарий +/* многострочный + комментарий +*/ +print /*или так*/ "Текст" +``` \ No newline at end of file diff --git a/docs/docs/ru/basics/destructuring_assignment.md b/docs/docs/ru/basics/destructuring_assignment.md new file mode 100644 index 00000000..b2b21cb3 --- /dev/null +++ b/docs/docs/ru/basics/destructuring_assignment.md @@ -0,0 +1,19 @@ +# Реструктуризующее присваивание + +Реструктуризующее (деструктивное) присваивание позволяет определить сразу несколько переменных по каждому элементу массива или объекта. + +Для массивов, переменным присваивается значение. + +@[code](../../code/basics/destructuring_assignment1.own) + +Что равносильно: + +@[code](../../code/basics/destructuring_assignment2.own) + +Для объектов, переменным присваивается массив [ключ, значение] + +@[code](../../code/basics/destructuring_assignment3.own) + +Если нужно пропустить какое-либо значение, название переменной можно не писать: + +@[code](../../code/basics/destructuring_assignment4.own) \ No newline at end of file diff --git a/docs/docs/ru/basics/functions.md b/docs/docs/ru/basics/functions.md new file mode 100644 index 00000000..a1cc0fc5 --- /dev/null +++ b/docs/docs/ru/basics/functions.md @@ -0,0 +1,54 @@ +# Определение функций + +Для определения функции используется ключевое слово `def`. Затем идёт имя, аргументы и тело функции. Пример: + +```own +def function(arg1, arg2) { + println arg1 +} +``` + +## Короткий синтаксис + +Возможен короткий синтаксис: + +```own +def repeat(str, count) = str * count +``` + +что равносильно: + +```own +def repeat(str, count) { + return str * count +} +``` + +## Аргументы по умолчанию + +Аргументы функции могут иметь значения по умолчанию. + +```own +def repeat(str, count = 5) = str * count +``` + +В этом случае обязательным будет только аргумент `str` + +```own +repeat("*") // ***** +repeat("+", 3) // +++ +``` + +Аргументы по умолчанию обязательно должны идти после обязательных аргументов, если такие были. + +```own +def repeat(str = "*", count) = str * count +``` + +Приведёт к ошибки парсинга: `ParseError on line 1: Required argument cannot be after optional` + +## Внутренние функции + +Внутри функции можно объявить другую функцию. + +@[code](../../code/basics/fibonacci.own) \ No newline at end of file diff --git a/docs/docs/ru/basics/loops.md b/docs/docs/ru/basics/loops.md new file mode 100644 index 00000000..fae20b42 --- /dev/null +++ b/docs/docs/ru/basics/loops.md @@ -0,0 +1,115 @@ +# Циклы + +## Цикл while + +```own +while условие { + тело цикла +} +``` + +Скобки в условии необязательны. + +```own +i = 0 +while i < 5 { + print i++ +} + +// или + +i = 0 +while (i < 5) { + print i++ +} +``` + +## Цикл do-while + +```own +do { + тело цикла +} while условие +``` + +Скобки в условии необязательны. + +```own +i = 0 +do { + print i++ +} while i < 5 + +// или + +i = 0 +do { + print i++ +} while (i < 5) +``` + +## Цикл for + +```own +for инициализация, условие_работы, инкремент { + тело цикла +} + +for (инициализация, условие_работы, инкремент) { + тело цикла +} +``` + +Скобки в условии необязательны. + +```own +for i = 0, i < 5, i++ + print i++ + +// или + +for (i = 0, i < 5, i++) { + print i++ +} +``` + +## Цикл foreach + +Перебирает элементы строки, массива или карты. + +Перебор строки: + +```own +for символ : строка { + тело цикла +} +for символ, код : строка { + тело цикла +} +``` + +Перебор массива: + +```own +for значение : массив { + тело цикла +} +for значение, индекс : массив { + тело цикла +} +for (значение : массив) { + тело цикла +} +``` + +Перебор карты: + +```own +for (ключ, значение : карта) { + тело цикла +} +``` + +Скобки необязательны. + +@[code](../../code/basics/loops1.own) \ No newline at end of file diff --git a/docs/docs/ru/basics/pattern_matching.md b/docs/docs/ru/basics/pattern_matching.md new file mode 100644 index 00000000..ab96bc37 --- /dev/null +++ b/docs/docs/ru/basics/pattern_matching.md @@ -0,0 +1,79 @@ +# Pattern Matching (сопоставление с образцом) + +Оператор `match` позволяет выполнить сопоставление значения с образцом. + +@[code](../../code/basics/pattern_matching1.own) + +@[code](../../code/basics/pattern_matching2.own) + +Проверяется тип и значение. Если ни одна из веток `case` не обнаружила совпадение, выполняется тело ветки `case _`. + + +Помимо константных значений, в `case` может присутствовать имя переменной. + +@[code](../../code/basics/pattern_matching3.own) + +В таком случае возможен один из двух сценариев: + +1. Переменная уже определена. Сравнивается её значение. +2. Переменная не определена. Ей присваивается сопоставляемое значение и выполняется ветка `case`. + +В примере выше, интерпретатор видит первые две ветки так: + +```own +case 10: +case 20: +``` + +Для последней ветки переменная `c` не определена, поэтому выполнится присваивание `c = x`, после чего вызов передаётся телу ветки `case c`. + + +## Уточнения + +Ветка `case` может иметь дополнительное сравнение + +@[code](../../code/basics/pattern_matching4.own) + + +## Сопоставление массивов + +Для сопоставления элементов массивов, в блоке case используется следующий синтаксис: + +* `case []:` выполняется, если в массиве нет элементов +* `case [a]:` выполняется, если в массиве есть один элемент +* `case [a :: b]:` выполняется, если в массиве есть два и более элементов +* `case [a :: b :: c :: d :: e]:` выполняется, если в массиве есть пять и более элементов + +Для двух последних случаев справедливы такие правила: + +* Если количество переменных в списке совпадает с количество элементов массива, то всем переменным присваивается значение массива. + +```own +match [0, 1, 2] { + case [x :: y :: z]: // x = 0, y = 1, z = 2 +} +``` + +* Если элементов массива больше, то в последней переменной будут сохранены оставшиеся элементы массива. + +```own +match [0, 1, 2, 3, 4] { + case [x :: y :: z]: // x = 0, y = 1, z = [2, 3, 4] +} +``` + +Пример рекурсивного вывода элементов массива + +@[code](../../code/basics/pattern_matching5.own) + + +## Сопоставление значений массивов + +Для сопоставления значений элементов массивов, используется синтаксис: + +* `case (expr1, expr2, expr3):` выполняется, если в массиве есть 3 элемента и первый элемент равен результату выражения expr1, второй - результату expr2 и третий - результату expr3. +* `case (expr1, _):` выполняется, если в массиве есть 2 элемента и первый элемент равен результату выражения expr1, а результат второго не важен. + +Классическая задача FizzBuzz может быть решена с использованием Pattern Matching: + +@[code](../../code/basics/pattern_matching6.own) diff --git a/docs/docs/ru/basics/string_functions.md b/docs/docs/ru/basics/string_functions.md new file mode 100644 index 00000000..17d1c9ed --- /dev/null +++ b/docs/docs/ru/basics/string_functions.md @@ -0,0 +1,20 @@ +# Функции строк + +Поля: + - `length` - длина строки + - `lower` - строка в нижнем регистре + - `upper` - строка в верхнем регистре + - `chars` - массив символов в виде ASCII-кодов + +Функции: + - `trim()` - обрезает пробельные невидимые символы по обоим концам строки + - `startsWith(str, offset = 0)` - проверяет, начинается ли строка с подстроки str в позиции offset + - `endsWith(str)` - проверяет, заканчивается ли строка подстрокой str + - `matches(regex)` - проверяет соответствие строки с заданным шаблоном + - `contains(str)` - проверяет, содержится ли в строке подстрока str + - `equalsIgnoreCase(str)` - проверяет, равны ли строки вне зависимости от регистра (tEsT = TEST) + - `isEmpty()` - возвращает true, если строка пустая + +Кроме того, доступны автоматические функции-расширения, если функция принимает в качестве первого аргумента строку: + +@[code](../../code/basics/string_functions1.own) diff --git a/docs/docs/ru/basics/strings.md b/docs/docs/ru/basics/strings.md new file mode 100644 index 00000000..8ad5fa99 --- /dev/null +++ b/docs/docs/ru/basics/strings.md @@ -0,0 +1,12 @@ +# Строки + +Строки задаются в двойных кавычках и могут быть многострочные. Поддерживается юникод и экранирование символов: + +```own +str = "\n\tЭто +\tмногострочный +\tтекст +" +``` + +Для вывода строк есть два оператора `print` и `println` \ No newline at end of file diff --git a/docs/docs/ru/basics/types.md b/docs/docs/ru/basics/types.md new file mode 100644 index 00000000..0d0f55ca --- /dev/null +++ b/docs/docs/ru/basics/types.md @@ -0,0 +1,25 @@ +# Типы + +В OwnLang есть такие типы: + + * Number - числа (охватывает как целые, так и вещественные числа) + * String - строки + * Array - массивы + * Map - объекты (ассоциативные массивы) + * Function - функции + * Class - классы + +Поскольку OwnLang - динамически типизируемый язык программирования, это значит, что явно объявлять типы не нужно. + +```own +x = 10 // целое число +y = 1.61803 // вещественное число +z = "abcd" // строка +``` + +Если какая-либо функция предполагает использование строк в качестве аргументов, а были переданы числа, то значения автоматически приведутся к строке. + +```own +x = 90 +print x +``` \ No newline at end of file diff --git a/docs/docs/ru/changelog.md b/docs/docs/ru/changelog.md new file mode 100644 index 00000000..f996edcd --- /dev/null +++ b/docs/docs/ru/changelog.md @@ -0,0 +1,115 @@ +# История изменений + +## Next + + +## 2.1.0 + +### Изменения +- Добавлен `own` пакетный менеджер. Примеры испльзования: `own`, `own init`, `own add openai`. +- Относительные пути в include. + +### Исправления +- Исправлена передача аргументов командной строки скриптам. +- Исправлен `this` в нестатических методах классов. +- Исправлено завершение программы при использовании любого http запроса (баг в okhttp). +- Исправлен visitor и проверки линтера внутри функций. + +### Модули +- [okhttp] Добавлен `okhttp.newClient()` и `HttpClientBuilderValue`. +- [canvasfx] Обновлена версия JavaFX. + + +## 2.0.0 + +### Критические изменения +- Минимальная версия Java — 17. +- Упрощён оператор use. `use std, math` вместо `use ["std", "math"]`. +- `case [x]` при сопоставлении списков теперь соответствует лишь одному элементу. +- Более строгий лексер. Исправлено экранирование обратного слэша в строках. Исправлены HEX числа println 0x0123456789, 0x०१२३४५६७८९. + +### Изменения +- Добавлены константы. Константа может быть импортирована только при подключении модуля. +- Возможность задать числа типа long: `700L`, `0xABL` +- Исправлена область видимости переменных при шедоуинге. +- Улучшена визуализация ошибок. Ошибки парсинга показывают конкретное место, где возникла ошибка. То же самое с линтером и ошибками времени исполнения. +- Семантический линтер как обязательный этап работы интерпретатора. +- Сохранение порядка элементов в Map по умолчанию. +- Возможность запускать программы из ресурсов, указав "resource:" в качестве префикса пути. +- Добавлены внутренние скрипты и команда `ownlang run` для их запуска. Добавлен скрипт `checkUpdate` для проверки новых версий. +- Обновлена [документация](https://annimon.com/docs/ownlang/). Новый движок документации, основанный на vuepress. + +### Модули +- [std] Добавлены функции parseDouble, nanotime, exit, getenv, getprop. +- [http] Добавлена функция httpSync. +- [functional] Добавлены функции groupby, tomap и операторы Stream.groupBy, Stream.filterNot, Stream.forEachIndexed, Stream::toMap, Stream.anyMatch, Stream.allMatch, Stream.noneMatch +- [canvasfx] Исправлено для Java 17+ с Java FX 17 (только Windows) +- [server] Новый модуль сервера + + +## 1.5.0 + +- Добавлены модули `zip`, `gzip`, `okhttp` +- Добавлены функции `std::getBytes`, `std::stringFromBytes`, `std::stripMargin` +- В `forms` добавлены JProgressBar, JTextArea, JScrollPane, методы для JButton, JTextField и WindowListener +- В `functional::stream` добавлена функция `joining` +- Добавлены свойства и функции для массивов: `arr.length`, `arr.isEmpty()`, `arr.joinToString(...)` +- Добавлен оператор объединения с null `??` (null coalesce) +- Добавлены классы (пока без наследования, как структура) +- Строгое преобразование строк в числа (раньше int("test") выдавало 0, а теперь ошибку) +- В `for` теперь можно итерировать строки и массивы с индексом: + `for ch : "test"` + `for ch, code : "test"` + `for el : arr` + `for el, index : arr` +- В jsonencode можно задать отступ для читабельного форматирования: + `jsonencode(obj)` — минифицированный json + `jsonencode(obj, 2)` — pretty-print с отступом в 2 пробела +- Возможность задать параметры парсера/дампера yaml +- Исправлено подключение к mysql в модуле `jdbc` +- Исправлен `str::range` для реверсивных промежутков +- Исправлена функция files::readBytes с заданными offset и length +- Исправлен поиск подходящего конструктора класса в `java::new`, так же можно инстанцировать класс через оператор new +- Другие мелкие изменения + + +## 1.4.0 + +- Добавлены модули `downloader`, `regex` +- Добавлены функции `std::arraySplice`, `std::default` +- Добавлена константа `OwnLang` в модуль `std`, содержащая метаинформацию о версии языка и платформы +- В StreamValue добавлены функции `peek`, `sorted` +- Возможность импортировать сразу несколько модулей `use ["std", "types", "math"]` +- Поддержка внутренних полей и функций у строк (length, lower, upper, chars, trim(), startsWith(s), endsWith(s), matches(s), contains(s), equalsIgnoreCase(s), isEmpty()). Также доступны автоматические функции расширения: `"%d. %s".sprintf(1, "OwnLang")` -> `sprintf("%d. %s", 1, "OwnLang")` +- Добавлен kawaii-оператор `^^` для возможного переопределения +- Улучшен режим REPL, теперь история команд (клавиша вверх) поддерживается на всех платформах, а по табу теперь всплывают подсказки автодополнения +- Немного улучшен вывод ошибок +- Обновлены примеры + + +## 1.3.0 + +- Поддержка цепочек функций и функциональных вызовов (`func().func()` и `func()()`) +- Добавлены функции `takewhile`, `dropwhile`, `stream` в модуль `functional` +- Добавлены функции `parseInt`, `parseLong`, `toHexString` в модуль `std` +- Добавлена функция `copy` в модуль `files` +- Добавлены модули `socket`, `base64`, `java`, `forms`, `jdbc` +- Улучшена оптимизация +- Обновлены примеры +- Мелкие исправления и улучшения + + +## 1.2.0 + +- Добавлены модули `canvasfx`, `date`, `yml`, `aimp` +- Обновлены модули `std`, `math`, `files`, `functional` +- Добавлена константа `std::ARGS` для доступа к аргументам командной строки +- Добавлен режим REPL, Beautifier, линтер, оптимизатор +- Добавлена операция слияния объектов `map1 + map2` +- Исправлено восстановление при ошибках парсинга и зависание в лексере +- Исправлена область видимости переменных +- Ускорено чтение файлов +- Добавлен кэш числовых значений +- Обновлён плагин для Netbeans +- Добавлены примеры и помощь + diff --git a/docs/docs/ru/links.md b/docs/docs/ru/links.md new file mode 100644 index 00000000..60d91f40 --- /dev/null +++ b/docs/docs/ru/links.md @@ -0,0 +1,13 @@ +# Ссылки + +## Загрузки + +Android: [Free](https://play.google.com/store/apps/details?id=com.annimon.ownlang.free) / [Pro](https://play.google.com/store/apps/details?id=com.annimon.ownlang) +PC / плагин Netbeans / прочее: [GitHub Releases](https://github.com/aNNiMON/Own-Programming-Language-Tutorial/releases) +Исходный код: [GitHub](https://github.com/aNNiMON/Own-Programming-Language-Tutorial) + +Также доступно в виде пакета в AUR: + +``` +paru -S ownlang +``` diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 00000000..ef6505e1 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,27 @@ +{ + "name": "ownlang-docs", + "version": "1.0.0", + "description": "OwnLang Documentation", + "main": "index.js", + "scripts": { + "docs:dev": "vuepress dev docs", + "docs:build": "vuepress build docs" + }, + "keywords": [ + "documentation", + "ownlang", + "programming-language" + ], + "author": "aNNiMON", + "license": "MIT", + "devDependencies": { + "@vuepress/client": "2.0.0-rc.0", + "@vuepress/plugin-prismjs": "2.0.0-rc.0", + "@vuepress/plugin-register-components": "2.0.0-rc.0", + "@vuepress/plugin-search": "2.0.0-rc.0", + "@vuepress/utils": "2.0.0-rc.0", + "prismjs": "^1.30.0", + "vue": "^3.4.20", + "vuepress": "2.0.0-rc.0" + } +} diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml new file mode 100644 index 00000000..03c204d5 --- /dev/null +++ b/docs/pnpm-lock.yaml @@ -0,0 +1,2177 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@vuepress/client': + specifier: 2.0.0-rc.0 + version: 2.0.0-rc.0 + '@vuepress/plugin-prismjs': + specifier: 2.0.0-rc.0 + version: 2.0.0-rc.0 + '@vuepress/plugin-register-components': + specifier: 2.0.0-rc.0 + version: 2.0.0-rc.0 + '@vuepress/plugin-search': + specifier: 2.0.0-rc.0 + version: 2.0.0-rc.0 + '@vuepress/utils': + specifier: 2.0.0-rc.0 + version: 2.0.0-rc.0 + prismjs: + specifier: ^1.30.0 + version: 1.30.0 + vue: + specifier: ^3.4.20 + version: 3.4.20 + vuepress: + specifier: 2.0.0-rc.0 + version: 2.0.0-rc.0(@types/node@20.11.20)(@vuepress/client@2.0.0-rc.0)(sass@1.71.1)(vue@3.4.20) + +packages: + + '@babel/helper-string-parser@7.23.4': + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.23.9': + resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.23.9': + resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} + engines: {node: '>=6.9.0'} + + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@mdit-vue/plugin-component@1.0.0': + resolution: {integrity: sha512-ZXsJwxkG5yyTHARIYbR74cT4AZ0SfMokFFjiHYCbypHIeYWgJhso4+CZ8+3V9EWFG3EHlGoKNGqKp9chHnqntQ==} + + '@mdit-vue/plugin-frontmatter@1.0.0': + resolution: {integrity: sha512-MMA7Ny+YPZA7eDOY1t4E+rKuEWO39mzDdP/M68fKdXJU6VfcGkPr7gnpnJfW2QBJ5qIvMrK/3lDAA2JBy5TfpA==} + + '@mdit-vue/plugin-headers@1.0.0': + resolution: {integrity: sha512-0rK/iKy6x13d/Pp5XxdLBshTD0+YjZvtHIaIV+JO+/H2WnOv7oaRgs48G5d44z3XJVUE2u6fNnTlI169fef0/A==} + + '@mdit-vue/plugin-sfc@1.0.0': + resolution: {integrity: sha512-agMUe0fY4YHxsZivSvplBwRwrFvsIf/JNUJCAYq1+2Sg9+2hviTBZwjZDxYqHDHOVLtiNr+wuo68tE24mAx3AQ==} + + '@mdit-vue/plugin-title@1.0.0': + resolution: {integrity: sha512-8yC60fCZ95xcJ/cvJH4Lv43Rs4k+33UGyKrRWj5J8TNyMwUyGcwur0XyPM+ffJH4/Bzq4myZLsj/TTFSkXRxvw==} + + '@mdit-vue/plugin-toc@1.0.0': + resolution: {integrity: sha512-WN8blfX0X/5Nolic0ClDWP7eVo9IB+U4g0jbycX3lolIZX5Bai1UpsD3QYZr5VVsPbQJMKMGvTrCEtCNTGvyWQ==} + + '@mdit-vue/shared@1.0.0': + resolution: {integrity: sha512-nbYBfmEi+pR2Lm0Z6TMVX2/iBjfr/kGEsHW8CC0rQw+3+sG5dY6VG094HuFAkiAmmvZx9DZZb+7ZMWp9vkwCRw==} + + '@mdit-vue/types@1.0.0': + resolution: {integrity: sha512-xeF5+sHLzRNF7plbksywKCph4qli20l72of2fMlZQQ7RECvXYrRkE9+bjRFQCyULC7B8ydUYbpbkux5xJlVWyw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@rollup/rollup-android-arm-eabi@4.22.4': + resolution: {integrity: sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.22.4': + resolution: {integrity: sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.22.4': + resolution: {integrity: sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.22.4': + resolution: {integrity: sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.22.4': + resolution: {integrity: sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.22.4': + resolution: {integrity: sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.22.4': + resolution: {integrity: sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.22.4': + resolution: {integrity: sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.22.4': + resolution: {integrity: sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.22.4': + resolution: {integrity: sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.22.4': + resolution: {integrity: sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.22.4': + resolution: {integrity: sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.22.4': + resolution: {integrity: sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.22.4': + resolution: {integrity: sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.22.4': + resolution: {integrity: sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.22.4': + resolution: {integrity: sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==} + cpu: [x64] + os: [win32] + + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + + '@types/hash-sum@1.0.2': + resolution: {integrity: sha512-UP28RddqY8xcU0SCEp9YKutQICXpaAq9N8U2klqF5hegGha7KzTOL8EdhIIV3bOSGBzjEpN9bU/d+nNZBdJYVw==} + + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + + '@types/linkify-it@3.0.5': + resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==} + + '@types/markdown-it-emoji@2.0.4': + resolution: {integrity: sha512-H6ulk/ZmbDxOayPwI/leJzrmoW1YKX1Z+MVSCHXuYhvqckV4I/c+hPTf6UiqJyn2avWugfj30XroheEb6/Ekqg==} + + '@types/markdown-it@13.0.7': + resolution: {integrity: sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==} + + '@types/mdurl@1.0.5': + resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/node@20.11.20': + resolution: {integrity: sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==} + + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + + '@vitejs/plugin-vue@4.6.2': + resolution: {integrity: sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 || ^5.0.0 + vue: ^3.2.25 + + '@vue/compiler-core@3.4.20': + resolution: {integrity: sha512-l7M+xUuL8hrGtRLkrf+62d9zucAdgqNBTbJ/NufCOIuJQhauhfyAKH9ra/qUctCXcULwmclGAVpvmxjbBO30qg==} + + '@vue/compiler-dom@3.4.20': + resolution: {integrity: sha512-/cSBGL79HFBYgDnqCNKErOav3bPde3n0sJwJM2Z09rXlkiowV/2SG1tgDAiWS1CatS4Cvo0o74e1vNeCK1R3RA==} + + '@vue/compiler-sfc@3.4.20': + resolution: {integrity: sha512-nPuTZz0yxTPzjyYe+9nQQsFYImcz/57UX8N3jyhl5oIUUs2jqqAMaULsAlJwve3qNYfjQzq0bwy3pqJrN9ecZw==} + + '@vue/compiler-ssr@3.4.20': + resolution: {integrity: sha512-b3gFQPiHLvI12C56otzBPpQhZ5kgkJ5RMv/zpLjLC2BIFwX5GktDqYQ7xg0Q2grP6uFI8al3beVKvAVxFtXmIg==} + + '@vue/devtools-api@6.6.1': + resolution: {integrity: sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==} + + '@vue/reactivity@3.4.20': + resolution: {integrity: sha512-P5LJcxUkG6inlHr6MHVA4AVFAmRYJQ7ONGWJILNjMjoYuEXFhYviSCb9BEMyszSG/1kWCZbtWQlKSLasFRpThw==} + + '@vue/runtime-core@3.4.20': + resolution: {integrity: sha512-MPvsQpGAxoBqLHjqopt4YPtUYBpq0K6oAWDTwIR1CTNZ3y9O/J2ZVh+i2JpxKNYwANJBiZ20O99NE20uisB7xw==} + + '@vue/runtime-dom@3.4.20': + resolution: {integrity: sha512-OkbPVP69H+8m74543zMAAx/LIkajxufYyow41gc0s5iF0uplT5uTQ4llDYu1GeJZEI8wjL5ueiPQruk4qwOMmA==} + + '@vue/server-renderer@3.4.20': + resolution: {integrity: sha512-w3VH2GuwxQHA6pJo/HCV22OfVC8Mw4oeHQM+vKeqtRK0OPE1Wilnh+P/SDVGGxPjJsGmyfphi0dbw8UKZQJH9w==} + peerDependencies: + vue: 3.4.20 + + '@vue/shared@3.4.20': + resolution: {integrity: sha512-KTEngal0aiUvNJ6I1Chk5Ew5XqChsFsxP4GKAYXWb99zKJWjNU72p2FWEOmZWHxHcqtniOJsgnpd3zizdpfEag==} + + '@vuepress/bundler-vite@2.0.0-rc.0': + resolution: {integrity: sha512-rX8S8IYpqqlJfNPstS/joorpxXx/4WuE7+gDM31i2HUrxOKGZVzq8ZsRRRU2UdoTwHZSd3LpUS4sMtxE5xLK1A==} + + '@vuepress/cli@2.0.0-rc.0': + resolution: {integrity: sha512-XWSIFO9iOR7N4O2lXIwS5vZuLjU9WU/aGAtmhMWEMxrdMx7TQaJbgrfpTUEbHMf+cPI1DXBbUbtmkqIvtfOV0w==} + hasBin: true + + '@vuepress/client@2.0.0-rc.0': + resolution: {integrity: sha512-TwQx8hJgYONYxX+QltZ2aw9O5Ym6SKelfiUduuIRb555B1gece/jSVap3H/ZwyBhpgJMtG4+/Mrmf8nlDSHjvw==} + + '@vuepress/core@2.0.0-rc.0': + resolution: {integrity: sha512-uoOaZP1MdxZYJIAJcRcmYKKeCIVnxZeOuLMOOB9CPuAKSalT1RvJ1lztw6RX3q9SPnlqtSZPQXDncPAZivw4pA==} + + '@vuepress/markdown@2.0.0-rc.0': + resolution: {integrity: sha512-USmqdKKMT6ZFHYRztTjKUlO8qgGfnEygMAAq4AzC/uYXiEfrbMBLAWJhteyGS56P3rGLj0OPAhksE681bX/wOg==} + + '@vuepress/plugin-active-header-links@2.0.0-rc.0': + resolution: {integrity: sha512-UJdXLYNGL5Wjy5YGY8M2QgqT75bZ95EHebbqGi8twBdIJE9O+bM+dPJyYtAk2PIVqFORiw3Hj+PchsNSxdn9+g==} + + '@vuepress/plugin-back-to-top@2.0.0-rc.0': + resolution: {integrity: sha512-6GPfuzV5lkAnR00BxRUhqMXwMWt741alkq2R6bln4N8BneSOwEpX/7vi19MGf232aKdS/Va4pF5p0/nJ8Sed/g==} + + '@vuepress/plugin-container@2.0.0-rc.0': + resolution: {integrity: sha512-b7vrLN11YE7qiUDPfA3N9P7Z8fupe9Wbcr9KAE/bmfZ9VT4d6kzpVyoU7XHi99XngitsmnkaXP4aBvBF1c2AnA==} + + '@vuepress/plugin-external-link-icon@2.0.0-rc.0': + resolution: {integrity: sha512-o8bk0oIlj/BkKc02mq91XLDloq1VOz/8iNcRwKAeqBE6svXzdYiyoTGet0J/4iPuAetsCn75S57W6RioDJHMnQ==} + + '@vuepress/plugin-git@2.0.0-rc.0': + resolution: {integrity: sha512-r7UF77vZxaYeJQLygzodKv+15z3/dTLuGp4VcYO21W6BlJZvd4u9zqgiV7A//bZQvK4+3Hprylr0G3KgXqMewA==} + + '@vuepress/plugin-medium-zoom@2.0.0-rc.0': + resolution: {integrity: sha512-peU1lYKsmKikIe/0pkJuHzD/k6xW2TuqdvKVhV4I//aOE1WxsREKJ4ACcldmoIsnysoDydAUqKT6xDPGyDsH2g==} + + '@vuepress/plugin-nprogress@2.0.0-rc.0': + resolution: {integrity: sha512-rI+eK0Pg1KiZE+7hGmDUeSbgdWCid8Vnw0hFKNmjinDzGVmx4m03M6qfvclsI0SryH+lR7itZGLaR4gbTlrz/w==} + + '@vuepress/plugin-palette@2.0.0-rc.0': + resolution: {integrity: sha512-wW70SCp3/K7s1lln5YQsBGTog2WXaQv5piva5zhXcQ47YGf4aAJpThDa5C/ot4HhkPOKn8Iz5s0ckxXZzW8DIg==} + + '@vuepress/plugin-prismjs@2.0.0-rc.0': + resolution: {integrity: sha512-c5WRI7+FhVjdbymOKQ8F2KY/Bnv7aQtWScVk8vCMUimNi7v7Wff/A/i3KSFNz/tge3LxiAeH/Dc2WS/OnQXwCg==} + + '@vuepress/plugin-register-components@2.0.0-rc.0': + resolution: {integrity: sha512-yN71x93j8ce99bqOwHn3lVfgiwsfhv21ByW/3em1kGXANjzOOoXOvt7ITbXNa5g6bsfjdJpoeUkUtFPwfK8dNA==} + + '@vuepress/plugin-search@2.0.0-rc.0': + resolution: {integrity: sha512-1ikJUgIN+7QrcAftxpWUKTrNVHEN2+k/az0Sjz7Ok7EthMHcG6qQsIb+AoK4WIQMsJkwVPLxwym/M1FbBTZDWQ==} + + '@vuepress/plugin-theme-data@2.0.0-rc.0': + resolution: {integrity: sha512-FXY3/Ml+rM6gNKvwdBF6vKAcwnSvtXCzKgQwJAw3ppQTKUkLcbOxqM+h4d8bzHWAAvdnEvQFug5uEZgWllBQbA==} + + '@vuepress/shared@2.0.0-rc.0': + resolution: {integrity: sha512-ikdSfjRv5LGM1iv4HHwF9P6gqTjaFCXKPK+hzlkHFHNZO1GLqk7/BPc4F51tAG1s8TcLhUZc+54LrfgS7PkXXA==} + + '@vuepress/theme-default@2.0.0-rc.0': + resolution: {integrity: sha512-I8Y08evDmMuD1jh3NftPpFFSlCWOizQDJLjN7EQwcg7jiAP4A7c2REo6nBN2EmP24Mi7UrRM+RnytHR5V+pElA==} + peerDependencies: + sass-loader: ^13.3.2 + peerDependenciesMeta: + sass-loader: + optional: true + + '@vuepress/utils@2.0.0-rc.0': + resolution: {integrity: sha512-Q1ay/woClDHcW0Qe91KsnHoupdNN0tp/vhjvVLuAYxlv/1Obii7hz9WFcajyyGEhmsYxdvG2sGmcxFA02tuKkw==} + + '@vueuse/core@10.8.0': + resolution: {integrity: sha512-G9Ok9fjx10TkNIPn8V1dJmK1NcdJCtYmDRyYiTMUyJ1p0Tywc1zmOoCQ2xhHYyz8ULBU4KjIJQ9n+Lrty74iVw==} + + '@vueuse/metadata@10.8.0': + resolution: {integrity: sha512-Nim/Vle5OgXcXhAvGOgkJQXB1Yb+Kq/fMbLuv3YYDYbiQrwr39ljuD4k9fPeq4yUyokYRo2RaNQmbbIMWB/9+w==} + + '@vueuse/shared@10.8.0': + resolution: {integrity: sha512-dUdy6zwHhULGxmr9YUg8e+EnB39gcM4Fe2oKBSrh3cOsV30JcMPtsyuspgFCUo5xxFNaeMf/W2yyKfST7Bg8oQ==} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + autoprefixer@10.4.17: + resolution: {integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + caniuse-lite@1.0.30001589: + resolution: {integrity: sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.4.681: + resolution: {integrity: sha512-1PpuqJUFWoXZ1E54m8bsLPVYwIVCRzvaL+n5cjigGga4z854abDnFRc+cTa2th4S79kyGqya/1xoR7h+Y5G5lg==} + + emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + + entities@3.0.1: + resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + engines: {node: '>=0.12'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + envinfo@7.11.1: + resolution: {integrity: sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==} + engines: {node: '>=4'} + hasBin: true + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + globby@14.0.1: + resolution: {integrity: sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==} + engines: {node: '>=18'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + hash-sum@2.0.0: + resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + immutable@4.3.5: + resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + lilconfig@3.1.1: + resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + engines: {node: '>=14'} + + linkify-it@4.0.1: + resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==} + + log-symbols@5.1.0: + resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} + engines: {node: '>=12'} + + magic-string@0.30.7: + resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==} + engines: {node: '>=12'} + + markdown-it-anchor@8.6.7: + resolution: {integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==} + peerDependencies: + '@types/markdown-it': '*' + markdown-it: '*' + + markdown-it-container@3.0.0: + resolution: {integrity: sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==} + + markdown-it-emoji@2.0.2: + resolution: {integrity: sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ==} + + markdown-it@13.0.2: + resolution: {integrity: sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==} + hasBin: true + + mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + + medium-zoom@1.1.0: + resolution: {integrity: sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + ora@7.0.1: + resolution: {integrity: sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==} + engines: {node: '>=16'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-type@5.0.0: + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} + engines: {node: '>=12'} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.35: + resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} + engines: {node: ^10 || ^12 || >=14} + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.22.4: + resolution: {integrity: sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + sass@1.71.1: + resolution: {integrity: sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==} + engines: {node: '>=14.0.0'} + hasBin: true + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stdin-discarder@0.1.0: + resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + string-width@6.1.0: + resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} + engines: {node: '>=16'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-debounce@4.0.0: + resolution: {integrity: sha512-+1iDGY6NmOGidq7i7xZGA4cm8DAa6fqdYcvO5Z6yBevH++Bdo9Qt/mN0TzHUgcCcKv1gmh9+W5dHqz8pMWbCbg==} + + uc.micro@1.0.6: + resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + upath@2.0.1: + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} + + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vite@5.0.13: + resolution: {integrity: sha512-/9ovhv2M2dGTuA+dY93B9trfyWMDRQw2jdVBhHNP6wr0oF34wG2i/N55801iZIpgUpnHDm4F/FabGQLyc+eOgg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vue-demi@0.14.7: + resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-router@4.3.0: + resolution: {integrity: sha512-dqUcs8tUeG+ssgWhcPbjHvazML16Oga5w34uCUmsk7i0BcnskoLGwjpa15fqMr2Fa5JgVBrdL2MEgqz6XZ/6IQ==} + peerDependencies: + vue: ^3.2.0 + + vue@3.4.20: + resolution: {integrity: sha512-xF4zDKXp67NjgORFX/HOuaiaKYjgxkaToK0KWglFQEYlCw9AqgBlj1yu5xa6YaRek47w2IGiuvpvrGg/XuQFCw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + vuepress-vite@2.0.0-rc.0: + resolution: {integrity: sha512-+2XBejeiskPyr2raBeA2o4uDFDsjtadpUVmtio3qqFtQpOhidz/ORuiTLr2UfLtFn1ASIHP6Vy2YjQ0e/TeUVw==} + engines: {node: '>=18.16.0'} + hasBin: true + peerDependencies: + '@vuepress/client': 2.0.0-rc.0 + vue: ^3.3.4 + + vuepress@2.0.0-rc.0: + resolution: {integrity: sha512-sydt/B7+pIw926G5PntYmptLkC5o2buXKh+WR1+P2KnsvkXU+UGnQrJJ0FBvu/4RNuY99tkUZd59nyPhEmRrCg==} + engines: {node: '>=18.16.0'} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + yaml@2.4.0: + resolution: {integrity: sha512-j9iR8g+/t0lArF4V6NE/QCfT+CO7iLqrXAHZbJdo+LfjqP1vR8Fg5bSiaq6Q2lOD1AUEVrEVIgABvBFYojJVYQ==} + engines: {node: '>= 14'} + hasBin: true + +snapshots: + + '@babel/helper-string-parser@7.23.4': {} + + '@babel/helper-validator-identifier@7.22.20': {} + + '@babel/parser@7.23.9': + dependencies: + '@babel/types': 7.23.9 + + '@babel/types@7.23.9': + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + '@esbuild/aix-ppc64@0.19.12': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + + '@esbuild/linux-riscv64@0.19.12': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@mdit-vue/plugin-component@1.0.0': + dependencies: + '@types/markdown-it': 13.0.7 + markdown-it: 13.0.2 + + '@mdit-vue/plugin-frontmatter@1.0.0': + dependencies: + '@mdit-vue/types': 1.0.0 + '@types/markdown-it': 13.0.7 + gray-matter: 4.0.3 + markdown-it: 13.0.2 + + '@mdit-vue/plugin-headers@1.0.0': + dependencies: + '@mdit-vue/shared': 1.0.0 + '@mdit-vue/types': 1.0.0 + '@types/markdown-it': 13.0.7 + markdown-it: 13.0.2 + + '@mdit-vue/plugin-sfc@1.0.0': + dependencies: + '@mdit-vue/types': 1.0.0 + '@types/markdown-it': 13.0.7 + markdown-it: 13.0.2 + + '@mdit-vue/plugin-title@1.0.0': + dependencies: + '@mdit-vue/shared': 1.0.0 + '@mdit-vue/types': 1.0.0 + '@types/markdown-it': 13.0.7 + markdown-it: 13.0.2 + + '@mdit-vue/plugin-toc@1.0.0': + dependencies: + '@mdit-vue/shared': 1.0.0 + '@mdit-vue/types': 1.0.0 + '@types/markdown-it': 13.0.7 + markdown-it: 13.0.2 + + '@mdit-vue/shared@1.0.0': + dependencies: + '@mdit-vue/types': 1.0.0 + '@types/markdown-it': 13.0.7 + markdown-it: 13.0.2 + + '@mdit-vue/types@1.0.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@rollup/rollup-android-arm-eabi@4.22.4': + optional: true + + '@rollup/rollup-android-arm64@4.22.4': + optional: true + + '@rollup/rollup-darwin-arm64@4.22.4': + optional: true + + '@rollup/rollup-darwin-x64@4.22.4': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.22.4': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.22.4': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.22.4': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.22.4': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.22.4': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.22.4': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.22.4': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.22.4': + optional: true + + '@rollup/rollup-linux-x64-musl@4.22.4': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.22.4': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.22.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.22.4': + optional: true + + '@sindresorhus/merge-streams@2.3.0': {} + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + + '@types/estree@1.0.5': {} + + '@types/fs-extra@11.0.4': + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 20.11.20 + + '@types/hash-sum@1.0.2': {} + + '@types/jsonfile@6.1.4': + dependencies: + '@types/node': 20.11.20 + + '@types/linkify-it@3.0.5': {} + + '@types/markdown-it-emoji@2.0.4': + dependencies: + '@types/markdown-it': 13.0.7 + + '@types/markdown-it@13.0.7': + dependencies: + '@types/linkify-it': 3.0.5 + '@types/mdurl': 1.0.5 + + '@types/mdurl@1.0.5': {} + + '@types/ms@0.7.34': {} + + '@types/node@20.11.20': + dependencies: + undici-types: 5.26.5 + + '@types/web-bluetooth@0.0.20': {} + + '@vitejs/plugin-vue@4.6.2(vite@5.0.13(@types/node@20.11.20)(sass@1.71.1))(vue@3.4.20)': + dependencies: + vite: 5.0.13(@types/node@20.11.20)(sass@1.71.1) + vue: 3.4.20 + + '@vue/compiler-core@3.4.20': + dependencies: + '@babel/parser': 7.23.9 + '@vue/shared': 3.4.20 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.0.2 + + '@vue/compiler-dom@3.4.20': + dependencies: + '@vue/compiler-core': 3.4.20 + '@vue/shared': 3.4.20 + + '@vue/compiler-sfc@3.4.20': + dependencies: + '@babel/parser': 7.23.9 + '@vue/compiler-core': 3.4.20 + '@vue/compiler-dom': 3.4.20 + '@vue/compiler-ssr': 3.4.20 + '@vue/shared': 3.4.20 + estree-walker: 2.0.2 + magic-string: 0.30.7 + postcss: 8.4.35 + source-map-js: 1.0.2 + + '@vue/compiler-ssr@3.4.20': + dependencies: + '@vue/compiler-dom': 3.4.20 + '@vue/shared': 3.4.20 + + '@vue/devtools-api@6.6.1': {} + + '@vue/reactivity@3.4.20': + dependencies: + '@vue/shared': 3.4.20 + + '@vue/runtime-core@3.4.20': + dependencies: + '@vue/reactivity': 3.4.20 + '@vue/shared': 3.4.20 + + '@vue/runtime-dom@3.4.20': + dependencies: + '@vue/runtime-core': 3.4.20 + '@vue/shared': 3.4.20 + csstype: 3.1.3 + + '@vue/server-renderer@3.4.20(vue@3.4.20)': + dependencies: + '@vue/compiler-ssr': 3.4.20 + '@vue/shared': 3.4.20 + vue: 3.4.20 + + '@vue/shared@3.4.20': {} + + '@vuepress/bundler-vite@2.0.0-rc.0(@types/node@20.11.20)(sass@1.71.1)': + dependencies: + '@vitejs/plugin-vue': 4.6.2(vite@5.0.13(@types/node@20.11.20)(sass@1.71.1))(vue@3.4.20) + '@vuepress/client': 2.0.0-rc.0 + '@vuepress/core': 2.0.0-rc.0 + '@vuepress/shared': 2.0.0-rc.0 + '@vuepress/utils': 2.0.0-rc.0 + autoprefixer: 10.4.17(postcss@8.4.35) + connect-history-api-fallback: 2.0.0 + postcss: 8.4.35 + postcss-load-config: 4.0.2(postcss@8.4.35) + rollup: 4.22.4 + vite: 5.0.13(@types/node@20.11.20)(sass@1.71.1) + vue: 3.4.20 + vue-router: 4.3.0(vue@3.4.20) + transitivePeerDependencies: + - '@types/node' + - '@vue/composition-api' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + - ts-node + - typescript + + '@vuepress/cli@2.0.0-rc.0': + dependencies: + '@vuepress/core': 2.0.0-rc.0 + '@vuepress/shared': 2.0.0-rc.0 + '@vuepress/utils': 2.0.0-rc.0 + cac: 6.7.14 + chokidar: 3.6.0 + envinfo: 7.11.1 + esbuild: 0.19.12 + transitivePeerDependencies: + - '@vue/composition-api' + - supports-color + - typescript + + '@vuepress/client@2.0.0-rc.0': + dependencies: + '@vue/devtools-api': 6.6.1 + '@vuepress/shared': 2.0.0-rc.0 + '@vueuse/core': 10.8.0(vue@3.4.20) + vue: 3.4.20 + vue-router: 4.3.0(vue@3.4.20) + transitivePeerDependencies: + - '@vue/composition-api' + - typescript + + '@vuepress/core@2.0.0-rc.0': + dependencies: + '@vuepress/client': 2.0.0-rc.0 + '@vuepress/markdown': 2.0.0-rc.0 + '@vuepress/shared': 2.0.0-rc.0 + '@vuepress/utils': 2.0.0-rc.0 + vue: 3.4.20 + transitivePeerDependencies: + - '@vue/composition-api' + - supports-color + - typescript + + '@vuepress/markdown@2.0.0-rc.0': + dependencies: + '@mdit-vue/plugin-component': 1.0.0 + '@mdit-vue/plugin-frontmatter': 1.0.0 + '@mdit-vue/plugin-headers': 1.0.0 + '@mdit-vue/plugin-sfc': 1.0.0 + '@mdit-vue/plugin-title': 1.0.0 + '@mdit-vue/plugin-toc': 1.0.0 + '@mdit-vue/shared': 1.0.0 + '@mdit-vue/types': 1.0.0 + '@types/markdown-it': 13.0.7 + '@types/markdown-it-emoji': 2.0.4 + '@vuepress/shared': 2.0.0-rc.0 + '@vuepress/utils': 2.0.0-rc.0 + markdown-it: 13.0.2 + markdown-it-anchor: 8.6.7(@types/markdown-it@13.0.7)(markdown-it@13.0.2) + markdown-it-emoji: 2.0.2 + mdurl: 1.0.1 + transitivePeerDependencies: + - supports-color + + '@vuepress/plugin-active-header-links@2.0.0-rc.0': + dependencies: + '@vuepress/client': 2.0.0-rc.0 + '@vuepress/core': 2.0.0-rc.0 + '@vuepress/utils': 2.0.0-rc.0 + ts-debounce: 4.0.0 + vue: 3.4.20 + vue-router: 4.3.0(vue@3.4.20) + transitivePeerDependencies: + - '@vue/composition-api' + - supports-color + - typescript + + '@vuepress/plugin-back-to-top@2.0.0-rc.0': + dependencies: + '@vuepress/client': 2.0.0-rc.0 + '@vuepress/core': 2.0.0-rc.0 + '@vuepress/utils': 2.0.0-rc.0 + ts-debounce: 4.0.0 + vue: 3.4.20 + transitivePeerDependencies: + - '@vue/composition-api' + - supports-color + - typescript + + '@vuepress/plugin-container@2.0.0-rc.0': + dependencies: + '@types/markdown-it': 13.0.7 + '@vuepress/core': 2.0.0-rc.0 + '@vuepress/markdown': 2.0.0-rc.0 + '@vuepress/shared': 2.0.0-rc.0 + '@vuepress/utils': 2.0.0-rc.0 + markdown-it: 13.0.2 + markdown-it-container: 3.0.0 + transitivePeerDependencies: + - '@vue/composition-api' + - supports-color + - typescript + + '@vuepress/plugin-external-link-icon@2.0.0-rc.0': + dependencies: + '@vuepress/client': 2.0.0-rc.0 + '@vuepress/core': 2.0.0-rc.0 + '@vuepress/markdown': 2.0.0-rc.0 + '@vuepress/shared': 2.0.0-rc.0 + '@vuepress/utils': 2.0.0-rc.0 + vue: 3.4.20 + transitivePeerDependencies: + - '@vue/composition-api' + - supports-color + - typescript + + '@vuepress/plugin-git@2.0.0-rc.0': + dependencies: + '@vuepress/core': 2.0.0-rc.0 + '@vuepress/utils': 2.0.0-rc.0 + execa: 8.0.1 + transitivePeerDependencies: + - '@vue/composition-api' + - supports-color + - typescript + + '@vuepress/plugin-medium-zoom@2.0.0-rc.0': + dependencies: + '@vuepress/client': 2.0.0-rc.0 + '@vuepress/core': 2.0.0-rc.0 + '@vuepress/utils': 2.0.0-rc.0 + medium-zoom: 1.1.0 + vue: 3.4.20 + transitivePeerDependencies: + - '@vue/composition-api' + - supports-color + - typescript + + '@vuepress/plugin-nprogress@2.0.0-rc.0': + dependencies: + '@vuepress/client': 2.0.0-rc.0 + '@vuepress/core': 2.0.0-rc.0 + '@vuepress/utils': 2.0.0-rc.0 + vue: 3.4.20 + vue-router: 4.3.0(vue@3.4.20) + transitivePeerDependencies: + - '@vue/composition-api' + - supports-color + - typescript + + '@vuepress/plugin-palette@2.0.0-rc.0': + dependencies: + '@vuepress/core': 2.0.0-rc.0 + '@vuepress/utils': 2.0.0-rc.0 + chokidar: 3.6.0 + transitivePeerDependencies: + - '@vue/composition-api' + - supports-color + - typescript + + '@vuepress/plugin-prismjs@2.0.0-rc.0': + dependencies: + '@vuepress/core': 2.0.0-rc.0 + prismjs: 1.30.0 + transitivePeerDependencies: + - '@vue/composition-api' + - supports-color + - typescript + + '@vuepress/plugin-register-components@2.0.0-rc.0': + dependencies: + '@vuepress/core': 2.0.0-rc.0 + '@vuepress/utils': 2.0.0-rc.0 + chokidar: 3.6.0 + transitivePeerDependencies: + - '@vue/composition-api' + - supports-color + - typescript + + '@vuepress/plugin-search@2.0.0-rc.0': + dependencies: + '@vuepress/client': 2.0.0-rc.0 + '@vuepress/core': 2.0.0-rc.0 + '@vuepress/shared': 2.0.0-rc.0 + '@vuepress/utils': 2.0.0-rc.0 + chokidar: 3.6.0 + vue: 3.4.20 + vue-router: 4.3.0(vue@3.4.20) + transitivePeerDependencies: + - '@vue/composition-api' + - supports-color + - typescript + + '@vuepress/plugin-theme-data@2.0.0-rc.0': + dependencies: + '@vue/devtools-api': 6.6.1 + '@vuepress/client': 2.0.0-rc.0 + '@vuepress/core': 2.0.0-rc.0 + '@vuepress/shared': 2.0.0-rc.0 + '@vuepress/utils': 2.0.0-rc.0 + vue: 3.4.20 + transitivePeerDependencies: + - '@vue/composition-api' + - supports-color + - typescript + + '@vuepress/shared@2.0.0-rc.0': + dependencies: + '@mdit-vue/types': 1.0.0 + '@vue/shared': 3.4.20 + + '@vuepress/theme-default@2.0.0-rc.0': + dependencies: + '@vuepress/client': 2.0.0-rc.0 + '@vuepress/core': 2.0.0-rc.0 + '@vuepress/plugin-active-header-links': 2.0.0-rc.0 + '@vuepress/plugin-back-to-top': 2.0.0-rc.0 + '@vuepress/plugin-container': 2.0.0-rc.0 + '@vuepress/plugin-external-link-icon': 2.0.0-rc.0 + '@vuepress/plugin-git': 2.0.0-rc.0 + '@vuepress/plugin-medium-zoom': 2.0.0-rc.0 + '@vuepress/plugin-nprogress': 2.0.0-rc.0 + '@vuepress/plugin-palette': 2.0.0-rc.0 + '@vuepress/plugin-prismjs': 2.0.0-rc.0 + '@vuepress/plugin-theme-data': 2.0.0-rc.0 + '@vuepress/shared': 2.0.0-rc.0 + '@vuepress/utils': 2.0.0-rc.0 + '@vueuse/core': 10.8.0(vue@3.4.20) + sass: 1.71.1 + vue: 3.4.20 + vue-router: 4.3.0(vue@3.4.20) + transitivePeerDependencies: + - '@vue/composition-api' + - supports-color + - typescript + + '@vuepress/utils@2.0.0-rc.0': + dependencies: + '@types/debug': 4.1.12 + '@types/fs-extra': 11.0.4 + '@types/hash-sum': 1.0.2 + '@vuepress/shared': 2.0.0-rc.0 + debug: 4.3.4 + fs-extra: 11.2.0 + globby: 14.0.1 + hash-sum: 2.0.0 + ora: 7.0.1 + picocolors: 1.0.0 + upath: 2.0.1 + transitivePeerDependencies: + - supports-color + + '@vueuse/core@10.8.0(vue@3.4.20)': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.8.0 + '@vueuse/shared': 10.8.0(vue@3.4.20) + vue-demi: 0.14.7(vue@3.4.20) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/metadata@10.8.0': {} + + '@vueuse/shared@10.8.0(vue@3.4.20)': + dependencies: + vue-demi: 0.14.7(vue@3.4.20) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + ansi-regex@6.0.1: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + autoprefixer@10.4.17(postcss@8.4.35): + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001589 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.35 + postcss-value-parser: 4.2.0 + + base64-js@1.5.1: {} + + binary-extensions@2.2.0: {} + + bl@5.1.0: + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.23.0: + dependencies: + caniuse-lite: 1.0.30001589 + electron-to-chromium: 1.4.681 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + cac@6.7.14: {} + + caniuse-lite@1.0.30001589: {} + + chalk@5.3.0: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + cli-cursor@4.0.0: + dependencies: + restore-cursor: 4.0.0 + + cli-spinners@2.9.2: {} + + connect-history-api-fallback@2.0.0: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.1.3: {} + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.4.681: {} + + emoji-regex@10.3.0: {} + + entities@3.0.1: {} + + entities@4.5.0: {} + + envinfo@7.11.1: {} + + esbuild@0.19.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + + escalade@3.1.2: {} + + esprima@4.0.1: {} + + estree-walker@2.0.2: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + fraction.js@4.3.7: {} + + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + get-stream@8.0.1: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + globby@14.0.1: + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.2 + ignore: 5.3.1 + path-type: 5.0.0 + slash: 5.1.0 + unicorn-magic: 0.1.0 + + graceful-fs@4.2.11: {} + + gray-matter@4.0.3: + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + + hash-sum@2.0.0: {} + + human-signals@5.0.0: {} + + ieee754@1.2.1: {} + + ignore@5.3.1: {} + + immutable@4.3.5: {} + + inherits@2.0.4: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.2.0 + + is-extendable@0.1.1: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-interactive@2.0.0: {} + + is-number@7.0.0: {} + + is-stream@3.0.0: {} + + is-unicode-supported@1.3.0: {} + + isexe@2.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + kind-of@6.0.3: {} + + lilconfig@3.1.1: {} + + linkify-it@4.0.1: + dependencies: + uc.micro: 1.0.6 + + log-symbols@5.1.0: + dependencies: + chalk: 5.3.0 + is-unicode-supported: 1.3.0 + + magic-string@0.30.7: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + markdown-it-anchor@8.6.7(@types/markdown-it@13.0.7)(markdown-it@13.0.2): + dependencies: + '@types/markdown-it': 13.0.7 + markdown-it: 13.0.2 + + markdown-it-container@3.0.0: {} + + markdown-it-emoji@2.0.2: {} + + markdown-it@13.0.2: + dependencies: + argparse: 2.0.1 + entities: 3.0.1 + linkify-it: 4.0.1 + mdurl: 1.0.1 + uc.micro: 1.0.6 + + mdurl@1.0.1: {} + + medium-zoom@1.1.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.5: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + ms@2.1.2: {} + + nanoid@3.3.7: {} + + node-releases@2.0.14: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + ora@7.0.1: + dependencies: + chalk: 5.3.0 + cli-cursor: 4.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 1.3.0 + log-symbols: 5.1.0 + stdin-discarder: 0.1.0 + string-width: 6.1.0 + strip-ansi: 7.1.0 + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-type@5.0.0: {} + + picocolors@1.0.0: {} + + picomatch@2.3.1: {} + + postcss-load-config@4.0.2(postcss@8.4.35): + dependencies: + lilconfig: 3.1.1 + yaml: 2.4.0 + optionalDependencies: + postcss: 8.4.35 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.35: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + prismjs@1.30.0: {} + + queue-microtask@1.2.3: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + restore-cursor@4.0.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + reusify@1.0.4: {} + + rollup@4.22.4: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.22.4 + '@rollup/rollup-android-arm64': 4.22.4 + '@rollup/rollup-darwin-arm64': 4.22.4 + '@rollup/rollup-darwin-x64': 4.22.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.22.4 + '@rollup/rollup-linux-arm-musleabihf': 4.22.4 + '@rollup/rollup-linux-arm64-gnu': 4.22.4 + '@rollup/rollup-linux-arm64-musl': 4.22.4 + '@rollup/rollup-linux-powerpc64le-gnu': 4.22.4 + '@rollup/rollup-linux-riscv64-gnu': 4.22.4 + '@rollup/rollup-linux-s390x-gnu': 4.22.4 + '@rollup/rollup-linux-x64-gnu': 4.22.4 + '@rollup/rollup-linux-x64-musl': 4.22.4 + '@rollup/rollup-win32-arm64-msvc': 4.22.4 + '@rollup/rollup-win32-ia32-msvc': 4.22.4 + '@rollup/rollup-win32-x64-msvc': 4.22.4 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.2.1: {} + + sass@1.71.1: + dependencies: + chokidar: 3.6.0 + immutable: 4.3.5 + source-map-js: 1.0.2 + + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + slash@5.1.0: {} + + source-map-js@1.0.2: {} + + sprintf-js@1.0.3: {} + + stdin-discarder@0.1.0: + dependencies: + bl: 5.1.0 + + string-width@6.1.0: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 10.3.0 + strip-ansi: 7.1.0 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-bom-string@1.0.0: {} + + strip-final-newline@3.0.0: {} + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-debounce@4.0.0: {} + + uc.micro@1.0.6: {} + + undici-types@5.26.5: {} + + unicorn-magic@0.1.0: {} + + universalify@2.0.1: {} + + upath@2.0.1: {} + + update-browserslist-db@1.0.13(browserslist@4.23.0): + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.0 + + util-deprecate@1.0.2: {} + + vite@5.0.13(@types/node@20.11.20)(sass@1.71.1): + dependencies: + esbuild: 0.19.12 + postcss: 8.4.35 + rollup: 4.22.4 + optionalDependencies: + '@types/node': 20.11.20 + fsevents: 2.3.3 + sass: 1.71.1 + + vue-demi@0.14.7(vue@3.4.20): + dependencies: + vue: 3.4.20 + + vue-router@4.3.0(vue@3.4.20): + dependencies: + '@vue/devtools-api': 6.6.1 + vue: 3.4.20 + + vue@3.4.20: + dependencies: + '@vue/compiler-dom': 3.4.20 + '@vue/compiler-sfc': 3.4.20 + '@vue/runtime-dom': 3.4.20 + '@vue/server-renderer': 3.4.20(vue@3.4.20) + '@vue/shared': 3.4.20 + + vuepress-vite@2.0.0-rc.0(@types/node@20.11.20)(@vuepress/client@2.0.0-rc.0)(sass@1.71.1)(vue@3.4.20): + dependencies: + '@vuepress/bundler-vite': 2.0.0-rc.0(@types/node@20.11.20)(sass@1.71.1) + '@vuepress/cli': 2.0.0-rc.0 + '@vuepress/client': 2.0.0-rc.0 + '@vuepress/core': 2.0.0-rc.0 + '@vuepress/theme-default': 2.0.0-rc.0 + vue: 3.4.20 + transitivePeerDependencies: + - '@types/node' + - '@vue/composition-api' + - less + - lightningcss + - sass + - sass-loader + - stylus + - sugarss + - supports-color + - terser + - ts-node + - typescript + + vuepress@2.0.0-rc.0(@types/node@20.11.20)(@vuepress/client@2.0.0-rc.0)(sass@1.71.1)(vue@3.4.20): + dependencies: + vuepress-vite: 2.0.0-rc.0(@types/node@20.11.20)(@vuepress/client@2.0.0-rc.0)(sass@1.71.1)(vue@3.4.20) + transitivePeerDependencies: + - '@types/node' + - '@vue/composition-api' + - '@vuepress/client' + - less + - lightningcss + - sass + - sass-loader + - stylus + - sugarss + - supports-color + - terser + - ts-node + - typescript + - vue + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + yaml@2.4.0: {} diff --git a/docs/src/docgen-md.own b/docs/src/docgen-md.own new file mode 100644 index 00000000..53e61abe --- /dev/null +++ b/docs/src/docgen-md.own @@ -0,0 +1,200 @@ +use std, types, files, json, yaml, functional + +INPUT_PATH_FMT = "./modules/%s.yml" +OUTPUT_DIR_FMT = "../docs/%s/modules" +OUTPUT_PATH_FMT = OUTPUT_DIR_FMT + "/%s.md" + +LANGS = ["en", "ru"] +MODULES = [ + "std", + "collections", + "date", + "downloader", + "files", + "functional", + "http", + "okhttp", + "java", + "math", + "ounit", + "regex", + "robot", + "socket", + "types", + // formats + "base64", + "json", + "yaml", + "gzip", + "zip" + + // Desktop-only + "canvas", + "canvasfx", + "forms", + "jdbc", + "server", + + // Android-only + "android", + "canvas_android", + "forms_android", + "gps_android", + "imageprocessing_android" +] + +messages = { + "constants": {"en": "Constants", "ru": "Константы"}, + "functions": {"en": "Functions", "ru": "Функции"}, + "types": {"en": "Types", "ru": "Типы"}, + "example": {"en": "Example", "ru": "Пример"}, + "since": {"en": "Since", "ru": "Начиная с"}, + "elements": {"en": " elements", "ru": " элементов"} +} + +// Write modules pages to vuepress config +modulesPages = jsonencode(map(MODULES, def(m) = m + ".md")) +f = fopen("../docs/.vuepress/configs/modules.js", "w") +writeLine(f, "export default " + modulesPages) +flush(f) +fclose(f) + +// Create output dirs +for lang : LANGS { + mkdirs(sprintf(OUTPUT_DIR_FMT, lang)) +} + +for moduleName : MODULES { + module = readYml(sprintf(INPUT_PATH_FMT, moduleName)) + for lang : LANGS { + println "" + module.name + " / " + lang + file = sprintf(OUTPUT_PATH_FMT, lang, moduleName) + f = fopen(file, "w") + + writeHeader(f, module, lang) + writeConstants(f, module.constants ?? [], lang) + writeFunctions(f, module.functions ?? [], lang, 2); + writeTypes(f, module.types ?? [], lang); + + flush(f) + fclose(f) + } +} + +// -- write +def writeHeader(f, module, lang) { + writeText(f, header(module.name, 1)) + if length(module.scope ?? "") && (module.scope != "both") { + writeText(f, " (" + module.scope + ")") + } + writeLine(f, "\n") + if length(module.since ?? "") { + writeSince(f, module.since, lang) + } + writeDescription(f, module, lang, "\n%s\n") +} + +def writeConstants(f, constants, lang) { + if (constants.isEmpty()) return 0 + + writeLine(f, "\n\n## " + messages.constants[lang]) + for info : constants { + writeText(f, "\n`%s` : *%s*".sprintf(info.name, info.typeName)) + writeScope(f, info.scope ?? "") + writeText(f, " = ") + constValue = getValue(info, "value", lang) + if (info.type != MAP && info.type != CLASS) { + writeText(f, "`%s`".sprintf(constValue)) + } else { + mapValues = constValue.substring(1, constValue.length - 1).split(", ") + if (mapValues.length >= 7) { + writeText(f, "\n\n::: details %d %s".sprintf(mapValues.length, messages.elements[lang])); + writeText(f, "\n\n```own:no-line-numbers\n{\n "); + writeText(f, mapValues.joinToString(",\n ")); + writeText(f, "\n}\n```"); + writeText(f, "\n:::"); + } else { + writeText(f, "`%s`".sprintf(constValue)); + } + } + writeLine(f, "") + writeDescription(f, info, lang, "\n%s\n") + } + +} + +def writeFunctions(f, functions, lang, level = 2) { + if (functions.isEmpty()) return 0 + + writeLine(f, "\n\n" + header(messages.functions[lang], level)) + for info : functions { + writeText(f, "\n`%s(%s)`".sprintf(info.name, info.args)) + writeScope(f, info.scope ?? "") + if length(info.since ?? "") { + writeSince(f, info.since, lang, true) + } + writeDescription(f, info, lang, " — %s") + writeLine(f, "") + + writeExample(f, info, lang) + } +} + +def writeTypes(f, types, lang) { + if (types.isEmpty()) return 0 + + writeLine(f, "\n\n" + header(messages.types[lang])) + for info : types { + writeText(f, "\n\n" + header("`%s`".sprintf(info.name), 3)) + writeScope(f, info.scope ?? "") + writeDescription(f, info, lang, "%s\n") + writeFunctions(f, info.functions ?? [], lang, 4); + writeLine(f, "") + writeExample(f, info, lang) + } +} + +def writeScope(f, scope) = match(scope) { + case "android": writeText(f, " ") + case "desktop": writeText(f, " ") + case _: { } +} + +def writeDescription(f, obj, lang, format = "%s") { + str = getValue(obj, "desc", lang) + if (str != "") { + writeText(f, sprintf(format, str)) + } +} + +def writeSince(f, version, lang, isInline = false) { + if (isInline) { + writeText(f, "".sprintf(version)) + } else { + writeText(f, "".sprintf(messages.since[lang], version)) + } +} + +def writeExample(f, info, lang) { + example = getValue(info, "example", lang) + if (length(example ?? "")) { + writeLine(f, "\n```own") + writeLine(f, example) + writeLine(f, "```") + } +} + +// -- utils +def getValue(object, key, lang = "en") { + newKey = (lang != "en") ? (key + "_" + lang) : key + return object[newKey] ?? object[key] ?? "" +} + +def header(text, level = 2) = ("#" * level) + " " + text + +def readYml(filename) { + f = fopen(filename, "r") + s = readText(f) + fclose(f) + return yamldecode(s) +} \ No newline at end of file diff --git a/docs/src/main/java/com/annimon/ownlang/docs/ModuleInfo.java b/docs/src/main/java/com/annimon/ownlang/docs/ModuleInfo.java new file mode 100644 index 00000000..d47f0fec --- /dev/null +++ b/docs/src/main/java/com/annimon/ownlang/docs/ModuleInfo.java @@ -0,0 +1,84 @@ +package com.annimon.ownlang.docs; + +import com.annimon.ownlang.Version; +import com.annimon.ownlang.lib.MapValue; +import com.annimon.ownlang.lib.Types; +import com.annimon.ownlang.lib.Value; +import java.util.*; +import java.util.stream.Collectors; + +public class ModuleInfo { + private final String name; + final List functions; + final Map constants; + final List types; + + public ModuleInfo(String name) { + this.name = name; + functions = new ArrayList<>(); + constants = new HashMap<>(); + types = new ArrayList<>(); + } + + public String name() { + return name; + } + + public List> functions() { + return functions.stream().sorted() + .map(f -> { + final Map function = new LinkedHashMap<>(); + function.put("name", f); + function.put("args", ""); + function.put("desc", ""); + function.put("desc_ru", ""); + return function; + }) + .collect(Collectors.toList()); + } + + public List> constants() { + final List> result = new ArrayList<>(); + constants.entrySet().stream() + .sorted(Map.Entry.comparingByKey()) + .forEach(entry -> { + final Value value = entry.getValue(); + + final Map constant = new LinkedHashMap<>(); + constant.put("name", entry.getKey()); + constant.put("type", value.type()); + constant.put("typeName", Types.typeToString(value.type())); + if (value.type() == Types.MAP) { + String text = ((MapValue) value).getMap().entrySet().stream() + .sorted(Comparator.comparing( + e -> ((MapValue) value).size() > 16 ? e.getKey() : e.getValue())) + .map(Object::toString) + .collect(Collectors.joining(", ", "{", "}")); + constant.put("value", text); + } else { + constant.put("value", value.asString()); + } + result.add(constant); + }); + return result; + } + + public Map info() { + final Map result = new LinkedHashMap<>(); + result.put("name", name); + result.put("since", "%d.%d.%d".formatted(Version.VERSION_MAJOR, Version.VERSION_MINOR, Version.VERSION_PATCH)); + result.put("scope", "both"); + result.put("constants", constants()); + result.put("functions", functions()); + if (!types.isEmpty()) { + result.put("types", types.stream().sorted() + .map(s -> { + final Map type = new HashMap<>(); + type.put("name", s); + return type; + }) + .toArray()); + } + return result; + } +} \ No newline at end of file diff --git a/docs/src/main/java/com/annimon/ownlang/docs/ModulesInfoCreator.java b/docs/src/main/java/com/annimon/ownlang/docs/ModulesInfoCreator.java new file mode 100644 index 00000000..8c069911 --- /dev/null +++ b/docs/src/main/java/com/annimon/ownlang/docs/ModulesInfoCreator.java @@ -0,0 +1,78 @@ +package com.annimon.ownlang.docs; + +import com.annimon.ownlang.lib.ModuleLoader; +import com.annimon.ownlang.lib.Value; +import com.annimon.ownlang.modules.Module; +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.Yaml; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public final class ModulesInfoCreator { + + public static void main(String[] args) { + if (args.length == 0) { + System.err.println("No modules provided.\nUsage: ModulesInfoCreator ..."); + System.exit(1); + } + + final Class clazz = Module.class; // get classloader for package + + final List moduleInfos = new ArrayList<>(); + + for (String moduleName : args) { + final Module module = ModuleLoader.load(moduleName); + + final ModuleInfo moduleInfo = new ModuleInfo(moduleName); + moduleInfo.functions.addAll(module.functions().keySet()); + moduleInfo.constants.putAll(module.constants()); + moduleInfo.types.addAll(listValues(module.getClass())); + moduleInfos.add(moduleInfo); + } + + printAsYaml(moduleInfos); + + System.out.println("Total functions: " + moduleInfos.stream() + .mapToLong(m -> m.functions.size()) + .sum() + ); + System.out.println("Total constants: " + moduleInfos.stream() + .mapToLong(m -> m.constants.keySet().size()) + .sum() + ); + } + + private static void printAsYaml(List moduleInfos) { + DumperOptions options = new DumperOptions(); + options.setIndent(2); + options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + + final Yaml yaml = new Yaml(options); + for (ModuleInfo moduleInfo : moduleInfos) { + final String separator = "-".repeat(moduleInfo.name().length() + 12); + System.out.println(separator); + System.out.print("--- "); + System.out.print(moduleInfo.name() + ".yml"); + System.out.println(" ---"); + System.out.println(separator); + System.out.println(yaml.dump(moduleInfo.info())); + } + } + + private static List listValues(Class moduleClass) { + return Arrays.stream(moduleClass.getDeclaredClasses()) + .filter(clazz -> getAllInterfaces(clazz).stream().anyMatch(i -> i.equals(Value.class))) + .map(Class::getSimpleName) + .collect(Collectors.toList()); + } + + private static Set> getAllInterfaces(Class clazz) { + if (clazz.getSuperclass() == null) { + return Collections.emptySet(); + } + return Stream.concat(Arrays.stream(clazz.getInterfaces()), getAllInterfaces(clazz.getSuperclass()).stream()) + .collect(Collectors.toSet()); + } + +} diff --git a/docs/src/modules/android.yml b/docs/src/modules/android.yml new file mode 100644 index 00000000..8880db8b --- /dev/null +++ b/docs/src/modules/android.yml @@ -0,0 +1,62 @@ +name: android +scope: "android" +desc: "Contains common Android functions" +desc_ru: "Содержит вспомогательные функции для Android" +constants: + - name: "Intent" + typeName: map + type: 4 + value: "{ACTION_BOOT_COMPLETED=android.intent.action.BOOT_COMPLETED, ACTION_DEFAULT=android.intent.action.VIEW, ACTION_DELETE=android.intent.action.DELETE, ACTION_EDIT=android.intent.action.EDIT, ACTION_INSTALL_PACKAGE=android.intent.action.INSTALL_PACKAGE, ACTION_LOCATION_SOURCE_SETTINGS=android.settings.LOCATION_SOURCE_SETTINGS, ACTION_MAIN=android.intent.action.MAIN, ACTION_MEDIA_MOUNTED=android.intent.action.MEDIA_MOUNTED, ACTION_REBOOT=android.intent.action.REBOOT, ACTION_RUN=android.intent.action.RUN, ACTION_SEARCH=android.intent.action.SEARCH, ACTION_SEND=android.intent.action.SEND, ACTION_VIEW=android.intent.action.VIEW, ACTION_WEB_SEARCH=android.intent.action.WEB_SEARCH}" + - name: R + type: 4 + typeName: map + value: '{array={}, attr={}, color={}, drawable={}, id={}, integer={}, layout={}, string={}}' + desc: "Resource constants from android.R.xxx class" + desc_ru: "Константы ресурсов класса android.R.xxx" + - name: SDK_INT + type: 1 + typeName: number + value: 'Android version SDK' + desc: "Android version SDK" + desc_ru: "Версия SDK Android" + - name: "Span" + typeName: map + type: 4 + value: "{COLOR=0, ABSOLUTE_SIZE=1, RELATIVE_SIZE=2, URL=3, STYLE=4, CLICKABLE=5, TYPEFACE=6, HTML=7}" +functions: + - name: "assetBitmap" + args: "path" + desc: "loads bitmap from the file in apk's assets folder" + desc_ru: "загружает изображение из файла в папке assets внутри apk" + - name: "assetBytes" + args: "path" + desc: "reads bytes of the file in apk's assets folder" + desc_ru: "читает массив байт из файла в папке assets внутри apk" + - name: "assetText" + args: "path" + desc: "reads text content of the file in apk's assets folder" + desc_ru: "читает текст файла в папке assets внутри apk" + - name: "chooser" + args: "" + desc: "" + desc_ru: "" + - name: "listAssets" + args: "path" + desc: "returns list of files in apk's assets folder" + desc_ru: "возвращает список файлов в папке assets внутри apk" + - name: "spannable" + args: "type, text, ..." + desc: "" + desc_ru: "" + - name: "startActivity" + args: "intent, uri = \"\", bundle = []" + desc: "starts an activity" + desc_ru: "запускает Activity" + - name: "toast" + args: "text, duration = 0" + desc: "shows toast notification" + desc_ru: "показывает всплывающее уведомление (toast)" + - name: "uithread" + args: "function, ..." + desc: "runs function in main UI-thread" + desc_ru: "выполняет функцию в главном UI-потоке" \ No newline at end of file diff --git a/docs/src/modules/base64.yml b/docs/src/modules/base64.yml new file mode 100644 index 00000000..ab771c50 --- /dev/null +++ b/docs/src/modules/base64.yml @@ -0,0 +1,24 @@ +name: base64 +scope: both +desc: "Contains base64 encoding and decoding functions" +desc_ru: "Содержит функции кодирования данных в base64 и наоборот" +constants: + - name: BASE64_URL_SAFE + type: 1 + typeName: number + value: '8' + desc: 'Url safe encoding output' + desc_ru: 'Вывод данных в безопасном для ссылок формате' +functions: + - name: base64decode + args: 'data, type = 0' + desc: 'decodes base64-encoded byte array or string into byte array' + desc_ru: 'декодирует массив байт или строку, закодированную в base64, в массив байт' + - name: base64encode + args: 'data, type = 0' + desc: 'encodes byte array or string into base64-encoded byte array' + desc_ru: 'кодирует массив байт или строку в закодированный base64 массив байт' + - name: base64encodeToString + args: 'data, type = 0' + desc: 'encodes byte array or string into base64-encoded string' + desc_ru: 'кодирует массив байт или строку в закодированную base64 строку' \ No newline at end of file diff --git a/docs/src/modules/canvas.yml b/docs/src/modules/canvas.yml new file mode 100644 index 00000000..101f829a --- /dev/null +++ b/docs/src/modules/canvas.yml @@ -0,0 +1,98 @@ +name: canvas +scope: "desktop" +desc: "Contains functions for working with graphics" +desc_ru: "Содержит функции для работы с графикой" +constants: + - name: "VK_DOWN" + typeName: number + type: 1 + value: "40" + desc: "arrow down key code" + desc_ru: "код клавиши стрелка вниз" + - name: "VK_ESCAPE" + typeName: number + type: 1 + value: "27" + desc: "Esc key code" + desc_ru: "код клавиши Esc" + - name: "VK_FIRE" + typeName: number + type: 1 + value: "10" + desc: "Enter key code" + desc_ru: "код клавиши Enter" + - name: "VK_LEFT" + typeName: number + type: 1 + value: "37" + desc: "arrow left key code" + desc_ru: "код клавиши стрелка влево" + - name: "VK_RIGHT" + typeName: number + type: 1 + value: "39" + desc: "arrow left key code" + desc_ru: "код клавиши стрелка вправо" + - name: "VK_UP" + typeName: number + type: 1 + value: "38" + desc: "arrow up key code" + desc_ru: "код клавиши стрелка вверх" +functions: + - name: "clip" + args: "x, y, w, h" + desc: "sets the current clip to the rectangle specified by the given coordinates" + desc_ru: "устанавливает текущий клип в прямоугольник, заданный данными координатами" + - name: "color" + args: "rgb" + desc: "sets color drawing. `rgb` - color with the specified combined RGB value" + desc_ru: "устанвливает цвет рисования. `rgb` - целое, комбинация цветов RGB, например `#FFGGFF`" + - name: "color" + args: "red, green, blue" + desc: "sets color with the specified red, green, and blue values in the range (0 - 255)" + desc_ru: "устанвливает цвет рисования c отдельными уровнями красного, зеленого и синего в диапазоне (0 - 255)" + - name: "drawstring" + args: "text, x, y" + desc: "draws string `text` at position `x`, `y`" + desc_ru: "рисует строку `text` с координатами `x`, `y`" + - name: "foval" + args: "x, y, w, h" + desc: "draws a filled oval at position `x`,` y`, size `w`,` h`" + desc_ru: "рисует закрашенный овал на позиции `x`, `y`, размером `w`, `h`" + - name: "frect" + args: "x, y, w, h" + desc: "draws a filled rectangle at position `x`,` y`, size `w`,` h`" + desc_ru: "рисует закрашенный прямоугольник на позиции `x`, `y`, размером `w`, `h`" + - name: "keypressed" + args: "" + desc: "returns the code of the pressed key (see the constant section)" + desc_ru: "возрвращает код нажатой клавиши (см. раздел константы)" + - name: "line" + args: "x1, y1, x2, y2" + desc: "draws line from point (`x1`;y1`) to (`x2`;y2`)" + desc_ru: "рисует линию от позиции (`x1`;y1`) до (`x2`;y2`)" + - name: "mousehover" + args: "" + desc: "returns array with current mouse pointer coordinates" + desc_ru: "возвращает массив с текущими координатами указателя мыши" + - name: "oval" + args: "x, y, w, h" + desc: "draws a oval at position `x`,` y`, size `w`,` h`" + desc_ru: "рисует овал на позиции `x`, `y`, размером `w`, `h`" + - name: "prompt" + args: "message" + desc: "displays a dialog box that prompts the visitor for input" + desc_ru: "показывает диалог для ввода значения от пользователя" + - name: "rect" + args: "x, y, w, h" + desc: "draws a rectangle at position `x`,` y`, size `w`,` h`" + desc_ru: "рисует прямоугольник на позиции `x`, `y`, размером `w`, `h`" + - name: "repaint" + args: "" + desc: "draws elements from graphics buffer on canvas" + desc_ru: "прорисовывает элементы из буфера на холсте" + - name: "window" + args: "name, width, hight" + desc: "creates a new window with the specified `name` and size `width`x`height`" + desc_ru: "создает новое окно с именем `name` и размером `width`x`height`" \ No newline at end of file diff --git a/docs/src/modules/canvas_android.yml b/docs/src/modules/canvas_android.yml new file mode 100644 index 00000000..a224c722 --- /dev/null +++ b/docs/src/modules/canvas_android.yml @@ -0,0 +1,658 @@ +name: canvas +scope: "android" +desc: "Contains functions for working with graphics on Android" +desc_ru: "Содержит функции для работы с графикой в Android" +constants: + - name: "VertexMode" + typeName: map + type: 4 + value: "{TRIANGLES=0, TRIANGLE_STRIP=1, TRIANGLE_FAN=2}" + - name: "Action" + typeName: map + type: 4 + value: "{DOWN=0, UP=1, MOVE=2, MULTIPLE=2, CANCEL=3, OUTSIDE=4, POINTER_DOWN=5, POINTER_UP=6, POINTER_INDEX_SHIFT=8, MASK=255, POINTER_INDEX_MASK=65280}" + - name: "BitmapCompressFormat" + typeName: map + type: 4 + value: "{JPEG=0, PNG=1, WEBP=2}" + - name: "EdgeType" + typeName: map + type: 4 + value: "{BW=0, AA=1}" + - name: "Cap" + typeName: map + type: 4 + value: "{BUTT=0, ROUND=1, SQUARE=2}" + - name: "Style" + typeName: map + type: 4 + value: "{FILL=0, STROKE=1, FILL_AND_STROKE=2}" + - name: "BitmapConfig" + typeName: map + type: 4 + value: "{ALPHA_8=0, RGB_565=1, ARGB_4444=2, ARGB_8888=3}" + - name: "Join" + typeName: map + type: 4 + value: "{MITER=0, ROUND=1, BEVEL=2}" + - name: "Align" + typeName: map + type: 4 + value: "{LEFT=0, CENTER=1, RIGHT=2}" + - name: "DisplayMetrics" + typeName: map + type: 4 + value: "{density=, densityDpi=, scaledDensity=, widthPixels=, heightPixels=, xdpi=, ydpi=}" + since: 1.5.1 +functions: + - name: "createBitmap" + args: "..." + desc: |- + `createBitmap(bitmap)` - creates a copy of the bitmap. + + `createBitmap(bytes)` - creates bitmap from byte array. + + `createBitmap(w, h)` - creates new bitmap with the given size. + + `createBitmap(w, h, config)` - creates new bitmap with the given size and config. + + `createBitmap(bytes, offset, length)` - creates bitmap from byte array starting from offset. + + `createBitmap(pixels, w, h, config)` - creates new bitmap from pixels array. + + `createBitmap(bitmap, x, y, w, h)` - creates new bitmap from the part of the `bitmap`. + + `createBitmap(pixels, offset, stride, w, h, config)` - creates new bitmap from pixels array starting from offset. + + Returns BitmapValue. + desc_ru: |- + `createBitmap(bitmap)` - создаёт копию изображения. + + `createBitmap(bytes)` - создаёт изображение из массива байт. + + `createBitmap(w, h)` - создаёт новое изображение с заданным размером. + + `createBitmap(w, h, config)` - создаёт новое изображение с заданным размером и конфигурацией. + + `createBitmap(bytes, offset, length)` - создаёт изображение из массива байт, начиная с offset. + + `createBitmap(pixels, w, h, config)` - создаёт изображение из массива пикселей. + + `createBitmap(bitmap, x, y, w, h)` - создаёт изображение из части другого изображения. + + `createBitmap(pixels, offset, stride, w, h, config)` - создаёт изображение из массива пикселей, начиная с offset. + + Возвращает BitmapValue. + example: |- + use http, canvas + + g = showcanvas() + url = "http://lorempixel.com/640/480/nature" + imageBytes = download(url) + bitmap = createBitmap(imageBytes) + g.drawBitmap(bitmap, 0, 0) + repaint() + - name: "createScaledBitmap" + args: "srcBitmap, width, height, filter" + desc: "scales bitmap to size and returns new BitmapValue" + desc_ru: "возвращает BitmapValue с изменённым размером заданного изображения" + - name: "getScreenBitmap" + args: "" + desc: "returns current screen as bitmap" + desc_ru: "возвращает содержимое экрана в виде изображения" + - name: "hidecanvas" + args: "" + desc: "closes canvas screen and releases resources" + desc_ru: "закрывает экран канваса и освобождает ресурсы" + - name: "newPath" + args: "path = null" + desc: "creates new PathValue" + desc_ru: "создаёт новый PathValue" + since: 1.5.1 + - name: "newLinearGradient" + args: "x0, y0, x1, y1, colors|color1, positions|color2, tileMode" + desc: "creates new shader" + desc_ru: "создаёт новый шейдер" + since: 1.5.1 + - name: "newRadialGradient" + args: "cx, cy, radius, colors|color1, positions|color2, tileMode" + desc: "creates new shader" + desc_ru: "создаёт новый шейдер" + since: 1.5.1 + - name: "newSweepGradient" + args: "cx, cy, colors|color1, positions|color2" + desc: "creates new shader" + desc_ru: "создаёт новый шейдер" + since: 1.5.1 + - name: "newBitmapShader" + args: "bitmap, modeX, modeY" + desc: "creates new bitmap shader" + desc_ru: "создаёт новый шейдер из картинки" + since: 1.5.1 + - name: "newComposeShader" + args: "shader1, shader2, mode = SRC_OVER" + desc: "creates new composition shader" + desc_ru: "создаёт новый композитный шейдер" + since: 1.5.1 + - name: "repaint" + args: "" + desc: "" + desc_ru: "" + - name: "setOnKeyDownEvent" + args: "" + desc: "" + desc_ru: "" + - name: "setOnKeyUpEvent" + args: "" + desc: "" + desc_ru: "" + - name: "setOnLongPressEvent" + args: "" + desc: "" + desc_ru: "" + - name: "setOnTouchEvent" + args: "" + desc: "" + desc_ru: "" + - name: "setGestureDetectorListener" + args: "listener" + desc: "sets gesture detector listener" + desc_ru: "устанавливает обработчик детектора жестов" + since: 1.5.1 + - name: "showcanvas" + args: "" + desc: "shows canvas screen and returns GraphicsValue" + desc_ru: "показывает экран канваса и возвращает GraphicsValue" + example: |- + use canvas + g = showcanvas() +types: + - name: "BitmapValue" + functions: + - name: "compress" + args: "" + desc: "" + desc_ru: "" + - name: "copy" + args: "" + desc: "" + desc_ru: "" + - name: "eraseColor" + args: "" + desc: "" + desc_ru: "" + - name: "extractAlpha" + args: "" + desc: "" + desc_ru: "" + - name: "getAllocationByteCount" + args: "" + desc: "" + desc_ru: "" + - name: "getByteCount" + args: "" + desc: "" + desc_ru: "" + - name: "getDensity" + args: "" + desc: "" + desc_ru: "" + - name: "getGraphics" + args: "" + desc: "" + desc_ru: "" + - name: "getWidth" + args: "" + desc: "" + desc_ru: "" + - name: "getHeight" + args: "" + desc: "" + desc_ru: "" + - name: "getRowBytes" + args: "" + desc: "" + desc_ru: "" + - name: "getPixel" + args: "" + desc: "" + desc_ru: "" + - name: "getPixels" + args: "" + desc: "" + desc_ru: "" + - name: "getScaledWidth" + args: "" + desc: "" + desc_ru: "" + - name: "getScaledHeight" + args: "" + desc: "" + desc_ru: "" + - name: "hasAlpha" + args: "" + desc: "" + desc_ru: "" + - name: "hasMipMap" + args: "" + desc: "" + desc_ru: "" + - name: "isMutable" + args: "" + desc: "" + desc_ru: "" + - name: "isPremultiplied" + args: "" + desc: "" + desc_ru: "" + - name: "isRecycled" + args: "" + desc: "" + desc_ru: "" + - name: "prepareToDraw" + args: "" + desc: "" + desc_ru: "" + - name: "recycle" + args: "" + desc: "" + desc_ru: "" + - name: "setPixel" + args: "" + desc: "" + desc_ru: "" + - name: "setPixels" + args: "" + desc: "" + desc_ru: "" + - name: "GraphicsValue" + functions: + - name: "ascent" + args: "" + desc: "" + desc_ru: "" + - name: "breakText" + args: "" + desc: "" + desc_ru: "" + - name: "clearShadowLayer" + args: "" + desc: "" + desc_ru: "" + - name: "clipPath" + args: "path" + desc: "" + desc_ru: "" + since: 1.5.1 + - name: "clipRect" + args: "x, y, w, h, op = 0" + desc: "" + desc_ru: "" + - name: "descent" + args: "" + desc: "" + desc_ru: "" + - name: "drawARGB" + args: "" + desc: "" + desc_ru: "" + - name: "drawArc" + args: "" + desc: "" + desc_ru: "" + - name: "drawBitmap" + args: "" + desc: "" + desc_ru: "" + - name: "drawCircle" + args: "" + desc: "" + desc_ru: "" + - name: "drawColor" + args: "" + desc: "" + desc_ru: "" + - name: "drawLine" + args: "" + desc: "" + desc_ru: "" + - name: "drawOval" + args: "" + desc: "" + desc_ru: "" + - name: "drawPath" + args: "path" + desc: "" + desc_ru: "" + since: 1.5.1 + - name: "drawPoint" + args: "" + desc: "" + desc_ru: "" + - name: "drawRGB" + args: "" + desc: "" + desc_ru: "" + - name: "drawRect" + args: "" + desc: "" + desc_ru: "" + - name: "drawRoundRect" + args: "" + desc: "" + desc_ru: "" + - name: "drawText" + args: "" + desc: "" + desc_ru: "" + - name: "drawTextOnPath" + args: "text, path, hOffset, vOffset" + desc: "" + desc_ru: "" + since: 1.5.1 + - name: "fillCircle" + args: "" + desc: "" + desc_ru: "" + - name: "fillOval" + args: "" + desc: "" + desc_ru: "" + - name: "fillRect" + args: "" + desc: "" + desc_ru: "" + - name: "fillRoundRect" + args: "" + desc: "" + desc_ru: "" + - name: "getAlpha" + args: "" + desc: "" + desc_ru: "" + - name: "getClipBounds" + args: "" + desc: "" + desc_ru: "" + - name: "getColor" + args: "" + desc: "" + desc_ru: "" + - name: "getFillPath" + args: "src, dst" + desc: "" + desc_ru: "" + since: 1.5.1 + - name: "getDensity" + args: "" + desc: "" + desc_ru: "" + - name: "getFlags" + args: "" + desc: "" + desc_ru: "" + - name: "getFontSpacing" + args: "" + desc: "" + desc_ru: "" + - name: "getHeight" + args: "" + desc: "" + desc_ru: "" + - name: "getSaveCount" + args: "" + desc: "" + desc_ru: "" + - name: "getStrokeCap" + args: "" + desc: "" + desc_ru: "" + - name: "getStrokeJoin" + args: "" + desc: "" + desc_ru: "" + - name: "getStrokeMiter" + args: "" + desc: "" + desc_ru: "" + - name: "getStrokeWidth" + args: "" + desc: "" + desc_ru: "" + - name: "getStyle" + args: "" + desc: "" + desc_ru: "" + - name: "getTextAlign" + args: "" + desc: "" + desc_ru: "" + - name: "getTextBounds" + args: "" + desc: "" + desc_ru: "" + - name: "getTextScaleX" + args: "" + desc: "" + desc_ru: "" + - name: "getTextSize" + args: "" + desc: "" + desc_ru: "" + - name: "getTextSkewX" + args: "" + desc: "" + desc_ru: "" + - name: "getTextWidths" + args: "" + desc: "" + desc_ru: "" + - name: "getTypeface" + args: "" + desc: "" + desc_ru: "" + - name: "getWidth" + args: "" + desc: "" + desc_ru: "" + - name: "isAntiAlias" + args: "" + desc: "" + desc_ru: "" + - name: "isDither" + args: "" + desc: "" + desc_ru: "" + - name: "isFakeBoldText" + args: "" + desc: "" + desc_ru: "" + - name: "isFilterBitmap" + args: "" + desc: "" + desc_ru: "" + - name: "isLinearText" + args: "" + desc: "" + desc_ru: "" + - name: "isOpaque" + args: "" + desc: "" + desc_ru: "" + - name: "isStrikeThruText" + args: "" + desc: "" + desc_ru: "" + - name: "isSubpixelText" + args: "" + desc: "" + desc_ru: "" + - name: "isUnderlineText" + args: "" + desc: "" + desc_ru: "" + - name: "measureText" + args: "" + desc: "" + desc_ru: "" + - name: "quickReject" + args: "" + desc: "" + desc_ru: "" + - name: "reset" + args: "" + desc: "" + desc_ru: "" + - name: "restore" + args: "" + desc: "" + desc_ru: "" + - name: "restoreToCount" + args: "" + desc: "" + desc_ru: "" + - name: "rotate" + args: "" + desc: "" + desc_ru: "" + - name: "save" + args: "" + desc: "" + desc_ru: "" + - name: "saveLayer" + args: "" + desc: "" + desc_ru: "" + - name: "saveLayerAlpha" + args: "" + desc: "" + desc_ru: "" + - name: "scale" + args: "" + desc: "" + desc_ru: "" + - name: "setAlpha" + args: "" + desc: "" + desc_ru: "" + - name: "setAntiAlias" + args: "" + desc: "" + desc_ru: "" + - name: "setBitmap" + args: "" + desc: "" + desc_ru: "" + - name: "setColor" + args: "" + desc: "" + desc_ru: "" + - name: "setDensity" + args: "" + desc: "" + desc_ru: "" + - name: "setDither" + args: "" + desc: "" + desc_ru: "" + - name: "setFakeBoldText" + args: "" + desc: "" + desc_ru: "" + - name: "setFilterBitmap" + args: "" + desc: "" + desc_ru: "" + - name: "setFlags" + args: "" + desc: "" + desc_ru: "" + - name: "setLinearText" + args: "" + desc: "" + desc_ru: "" + - name: "setShader" + args: "shader" + desc: "" + desc_ru: "" + since: 1.5.1 + - name: "setShadowLayer" + args: "radius, dx, dy, shadowColor" + desc: "" + desc_ru: "" + - name: "setStrikeThruText" + args: "isEnabled" + desc: "" + desc_ru: "" + - name: "setStrokeCap" + args: "cap" + desc: "" + desc_ru: "" + - name: "setStrokeJoin" + args: "join" + desc: "" + desc_ru: "" + - name: "setStrokeMiter" + args: "miter" + desc: "" + desc_ru: "" + - name: "setStrokeWidth" + args: "" + desc: "" + desc_ru: "" + - name: "setStyle" + args: "" + desc: "" + desc_ru: "" + - name: "setSubpixelText" + args: "" + desc: "" + desc_ru: "" + - name: "setTextAlign" + args: "" + desc: "" + desc_ru: "" + - name: "setTextScaleX" + args: "" + desc: "" + desc_ru: "" + - name: "setTextSize" + args: "" + desc: "" + desc_ru: "" + - name: "setTextSkewX" + args: "" + desc: "" + desc_ru: "" + - name: "setTypeface" + args: "" + desc: "" + desc_ru: "" + - name: "setUnderlineText" + args: "" + desc: "" + desc_ru: "" + - name: "skew" + args: "" + desc: "" + desc_ru: "" + - name: "strokeCircle" + args: "" + desc: "" + desc_ru: "" + - name: "strokeOval" + args: "" + desc: "" + desc_ru: "" + - name: "strokeRect" + args: "" + desc: "" + desc_ru: "" + - name: "strokeRoundRect" + args: "" + desc: "" + desc_ru: "" + - name: "translate" + args: "" + desc: "" + desc_ru: "" \ No newline at end of file diff --git a/docs/src/modules/canvasfx.yml b/docs/src/modules/canvasfx.yml new file mode 100644 index 00000000..4e97a63d --- /dev/null +++ b/docs/src/modules/canvasfx.yml @@ -0,0 +1,417 @@ +name: canvasfx +scope: "desktop" +desc: "Contains functions for working with Java FX graphics" +desc_ru: "Содержит функции для работы с графикой Java FX" +constants: + - name: "ArcType" + typeName: map + type: 4 + value: "{OPEN=0, CHORD=1, ROUND=2}" + - name: "BlendMode" + typeName: map + type: 4 + value: "{SRC_OVER=0, SRC_ATOP=1, ADD=2, MULTIPLY=3, SCREEN=4, OVERLAY=5, DARKEN=6, LIGHTEN=7, COLOR_DODGE=8, COLOR_BURN=9, HARD_LIGHT=10, SOFT_LIGHT=11, DIFFERENCE=12, EXCLUSION=13, RED=14, GREEN=15, BLUE=16}" + - name: "Color" + typeName: map + type: 4 + value: "{hsb=def(hue,saturation,brightness,opacity=1.0), new=def(rgb) def(r,g,b,opacity=1.0), rgb=def(r,g,b,opacity=1.0), web=def(name,opacity=1.0, ALICEBLUE=ColorValue 0xf0f8ffff, ANTIQUEWHITE=ColorValue 0xfaebd7ff, AQUA=ColorValue 0x00ffffff, AQUAMARINE=ColorValue 0x7fffd4ff, AZURE=ColorValue 0xf0ffffff, BEIGE=ColorValue 0xf5f5dcff, BISQUE=ColorValue 0xffe4c4ff, BLACK=ColorValue 0x000000ff, BLANCHEDALMOND=ColorValue 0xffebcdff, BLUE=ColorValue 0x0000ffff, BLUEVIOLET=ColorValue 0x8a2be2ff, BROWN=ColorValue 0xa52a2aff, BURLYWOOD=ColorValue 0xdeb887ff, CADETBLUE=ColorValue 0x5f9ea0ff, CHARTREUSE=ColorValue 0x7fff00ff, CHOCOLATE=ColorValue 0xd2691eff, CORAL=ColorValue 0xff7f50ff, CORNFLOWERBLUE=ColorValue 0x6495edff, CORNSILK=ColorValue 0xfff8dcff, CRIMSON=ColorValue 0xdc143cff, CYAN=ColorValue 0x00ffffff, DARKBLUE=ColorValue 0x00008bff, DARKCYAN=ColorValue 0x008b8bff, DARKGOLDENROD=ColorValue 0xb8860bff, DARKGRAY=ColorValue 0xa9a9a9ff, DARKGREEN=ColorValue 0x006400ff, DARKGREY=ColorValue 0xa9a9a9ff, DARKKHAKI=ColorValue 0xbdb76bff, DARKMAGENTA=ColorValue 0x8b008bff, DARKOLIVEGREEN=ColorValue 0x556b2fff, DARKORANGE=ColorValue 0xff8c00ff, DARKORCHID=ColorValue 0x9932ccff, DARKRED=ColorValue 0x8b0000ff, DARKSALMON=ColorValue 0xe9967aff, DARKSEAGREEN=ColorValue 0x8fbc8fff, DARKSLATEBLUE=ColorValue 0x483d8bff, DARKSLATEGRAY=ColorValue 0x2f4f4fff, DARKSLATEGREY=ColorValue 0x2f4f4fff, DARKTURQUOISE=ColorValue 0x00ced1ff, DARKVIOLET=ColorValue 0x9400d3ff, DEEPPINK=ColorValue 0xff1493ff, DEEPSKYBLUE=ColorValue 0x00bfffff, DIMGRAY=ColorValue 0x696969ff, DIMGREY=ColorValue 0x696969ff, DODGERBLUE=ColorValue 0x1e90ffff, FIREBRICK=ColorValue 0xb22222ff, FLORALWHITE=ColorValue 0xfffaf0ff, FORESTGREEN=ColorValue 0x228b22ff, FUCHSIA=ColorValue 0xff00ffff, GAINSBORO=ColorValue 0xdcdcdcff, GHOSTWHITE=ColorValue 0xf8f8ffff, GOLD=ColorValue 0xffd700ff, GOLDENROD=ColorValue 0xdaa520ff, GRAY=ColorValue 0x808080ff, GREEN=ColorValue 0x008000ff, GREENYELLOW=ColorValue 0xadff2fff, GREY=ColorValue 0x808080ff, HONEYDEW=ColorValue 0xf0fff0ff, HOTPINK=ColorValue 0xff69b4ff, INDIANRED=ColorValue 0xcd5c5cff, INDIGO=ColorValue 0x4b0082ff, IVORY=ColorValue 0xfffff0ff, KHAKI=ColorValue 0xf0e68cff, LAVENDER=ColorValue 0xe6e6faff, LAVENDERBLUSH=ColorValue 0xfff0f5ff, LAWNGREEN=ColorValue 0x7cfc00ff, LEMONCHIFFON=ColorValue 0xfffacdff, LIGHTBLUE=ColorValue 0xadd8e6ff, LIGHTCORAL=ColorValue 0xf08080ff, LIGHTCYAN=ColorValue 0xe0ffffff, LIGHTGOLDENRODYELLOW=ColorValue 0xfafad2ff, LIGHTGRAY=ColorValue 0xd3d3d3ff, LIGHTGREEN=ColorValue 0x90ee90ff, LIGHTGREY=ColorValue 0xd3d3d3ff, LIGHTPINK=ColorValue 0xffb6c1ff, LIGHTSALMON=ColorValue 0xffa07aff, LIGHTSEAGREEN=ColorValue 0x20b2aaff, LIGHTSKYBLUE=ColorValue 0x87cefaff, LIGHTSLATEGRAY=ColorValue 0x778899ff, LIGHTSLATEGREY=ColorValue 0x778899ff, LIGHTSTEELBLUE=ColorValue 0xb0c4deff, LIGHTYELLOW=ColorValue 0xffffe0ff, LIME=ColorValue 0x00ff00ff, LIMEGREEN=ColorValue 0x32cd32ff, LINEN=ColorValue 0xfaf0e6ff, MAGENTA=ColorValue 0xff00ffff, MAROON=ColorValue 0x800000ff, MEDIUMAQUAMARINE=ColorValue 0x66cdaaff, MEDIUMBLUE=ColorValue 0x0000cdff, MEDIUMORCHID=ColorValue 0xba55d3ff, MEDIUMPURPLE=ColorValue 0x9370dbff, MEDIUMSEAGREEN=ColorValue 0x3cb371ff, MEDIUMSLATEBLUE=ColorValue 0x7b68eeff, MEDIUMSPRINGGREEN=ColorValue 0x00fa9aff, MEDIUMTURQUOISE=ColorValue 0x48d1ccff, MEDIUMVIOLETRED=ColorValue 0xc71585ff, MIDNIGHTBLUE=ColorValue 0x191970ff, MINTCREAM=ColorValue 0xf5fffaff, MISTYROSE=ColorValue 0xffe4e1ff, MOCCASIN=ColorValue 0xffe4b5ff, NAVAJOWHITE=ColorValue 0xffdeadff, NAVY=ColorValue 0x000080ff, OLDLACE=ColorValue 0xfdf5e6ff, OLIVE=ColorValue 0x808000ff, OLIVEDRAB=ColorValue 0x6b8e23ff, ORANGE=ColorValue 0xffa500ff, ORANGERED=ColorValue 0xff4500ff, ORCHID=ColorValue 0xda70d6ff, PALEGOLDENROD=ColorValue 0xeee8aaff, PALEGREEN=ColorValue 0x98fb98ff, PALETURQUOISE=ColorValue 0xafeeeeff, PALEVIOLETRED=ColorValue 0xdb7093ff, PAPAYAWHIP=ColorValue 0xffefd5ff, PEACHPUFF=ColorValue 0xffdab9ff, PERU=ColorValue 0xcd853fff, PINK=ColorValue 0xffc0cbff, PLUM=ColorValue 0xdda0ddff, POWDERBLUE=ColorValue 0xb0e0e6ff, PURPLE=ColorValue 0x800080ff, RED=ColorValue 0xff0000ff, ROSYBROWN=ColorValue 0xbc8f8fff, ROYALBLUE=ColorValue 0x4169e1ff, SADDLEBROWN=ColorValue 0x8b4513ff, SALMON=ColorValue 0xfa8072ff, SANDYBROWN=ColorValue 0xf4a460ff, SEAGREEN=ColorValue 0x2e8b57ff, SEASHELL=ColorValue 0xfff5eeff, SIENNA=ColorValue 0xa0522dff, SILVER=ColorValue 0xc0c0c0ff, SKYBLUE=ColorValue 0x87ceebff, SLATEBLUE=ColorValue 0x6a5acdff, SLATEGRAY=ColorValue 0x708090ff, SLATEGREY=ColorValue 0x708090ff, SNOW=ColorValue 0xfffafaff, SPRINGGREEN=ColorValue 0x00ff7fff, STEELBLUE=ColorValue 0x4682b4ff, TAN=ColorValue 0xd2b48cff, TEAL=ColorValue 0x008080ff, THISTLE=ColorValue 0xd8bfd8ff, TOMATO=ColorValue 0xff6347ff, TRANSPARENT=ColorValue 0x00000000, TURQUOISE=ColorValue 0x40e0d0ff, VIOLET=ColorValue 0xee82eeff, WHEAT=ColorValue 0xf5deb3ff, WHITE=ColorValue 0xffffffff, WHITESMOKE=ColorValue 0xf5f5f5ff, YELLOW=ColorValue 0xffff00ff, YELLOWGREEN=ColorValue 0x9acd32ff}" + - name: "Events" + typeName: map + type: 4 + value: "{DRAG_DETECTED=0, MOUSE_CLICKED=1, MOUSE_DRAGGED=2, MOUSE_ENTERED=3, MOUSE_ENTERED_TARGET=4, MOUSE_EXITED=5, MOUSE_EXITED_TARGET=6, MOUSE_MOVED=7, MOUSE_PRESSED=8, MOUSE_RELEASED=9, KEY_PRESSED=10, KEY_RELEASED=11, KEY_TYPED=12, SWIPE_DOWN=13, SWIPE_LEFT=14, SWIPE_RIGHT=15, SWIPE_UP=16}" + - name: "FillRule" + typeName: map + type: 4 + value: "{EVEN_ODD=0, NON_ZERO=1}" + - name: "KeyCode" + typeName: map + type: 4 + value: "{A=36, ACCEPT=158, ADD=76, AGAIN=180, ALL_CANDIDATES=168, ALPHANUMERIC=162, ALT=7, ALT_GRAPH=185, AMPERSAND=134, ASTERISK=135, AT=141, B=37, BACK_QUOTE=112, BACK_SLASH=63, BACK_SPACE=1, BEGIN=186, BRACELEFT=139, BRACERIGHT=140, C=38, CANCEL=3, CAPS=9, CHANNEL_DOWN=218, CHANNEL_UP=217, CIRCUMFLEX=143, CLEAR=4, CLOSE_BRACKET=64, CODE_INPUT=170, COLON=142, COLORED_KEY_0=206, COLORED_KEY_1=207, COLORED_KEY_2=208, COLORED_KEY_3=209, COMMA=20, COMMAND=222, COMPOSE=184, CONTEXT_MENU=154, CONTROL=6, CONVERT=156, COPY=177, CUT=176, D=39, DEAD_ABOVEDOT=124, DEAD_ABOVERING=126, DEAD_ACUTE=119, DEAD_BREVE=123, DEAD_CARON=128, DEAD_CEDILLA=129, DEAD_CIRCUMFLEX=120, DEAD_DIAERESIS=125, DEAD_DOUBLEACUTE=127, DEAD_GRAVE=118, DEAD_IOTA=131, DEAD_MACRON=122, DEAD_OGONEK=130, DEAD_SEMIVOICED_SOUND=133, DEAD_TILDE=121, DEAD_VOICED_SOUND=132, DECIMAL=79, DELETE=81, DIGIT0=24, DIGIT1=25, DIGIT2=26, DIGIT3=27, DIGIT4=28, DIGIT5=29, DIGIT6=30, DIGIT7=31, DIGIT8=32, DIGIT9=33, DIVIDE=80, DOLLAR=144, DOWN=19, E=40, EJECT_TOGGLE=210, END=14, ENTER=0, EQUALS=35, ESCAPE=10, EURO_SIGN=145, EXCLAMATION_MARK=146, F=41, F1=84, F10=93, F11=94, F12=95, F13=96, F14=97, F15=98, F16=99, F17=100, F18=101, F19=102, F2=85, F20=103, F21=104, F22=105, F23=106, F24=107, F3=86, F4=87, F5=88, F6=89, F7=90, F8=91, F9=92, FAST_FWD=213, FINAL=155, FIND=181, FULL_WIDTH=165, G=42, GAME_A=198, GAME_B=199, GAME_C=200, GAME_D=201, GREATER=138, H=43, HALF_WIDTH=166, HELP=110, HIRAGANA=164, HOME=15, I=44, INFO=205, INPUT_METHOD_ON_OFF=175, INSERT=109, INVERTED_EXCLAMATION_MARK=147, J=45, JAPANESE_HIRAGANA=172, JAPANESE_KATAKANA=171, JAPANESE_ROMAN=173, K=46, KANA=160, KANA_LOCK=174, KANJI=161, KATAKANA=163, KP_DOWN=115, KP_LEFT=116, KP_RIGHT=117, KP_UP=114, L=47, LEFT=16, LEFT_PARENTHESIS=148, LESS=137, M=48, META=111, MINUS=21, MODECHANGE=159, MULTIPLY=75, MUTE=221, N=49, NONCONVERT=157, NUMBER_SIGN=149, NUMPAD0=65, NUMPAD1=66, NUMPAD2=67, NUMPAD3=68, NUMPAD4=69, NUMPAD5=70, NUMPAD6=71, NUMPAD7=72, NUMPAD8=73, NUMPAD9=74, NUM_LOCK=82, O=50, OPEN_BRACKET=62, P=51, PAGE_DOWN=13, PAGE_UP=12, PASTE=178, PAUSE=8, PERIOD=22, PLAY=211, PLUS=150, POUND=203, POWER=204, PREVIOUS_CANDIDATE=169, PRINTSCREEN=108, PROPS=182, Q=52, QUOTE=113, QUOTEDBL=136, R=53, RECORD=212, REWIND=214, RIGHT=18, RIGHT_PARENTHESIS=151, ROMAN_CHARACTERS=167, S=54, SCROLL_LOCK=83, SEMICOLON=34, SEPARATOR=77, SHIFT=5, SHORTCUT=223, SLASH=23, SOFTKEY_0=188, SOFTKEY_1=189, SOFTKEY_2=190, SOFTKEY_3=191, SOFTKEY_4=192, SOFTKEY_5=193, SOFTKEY_6=194, SOFTKEY_7=195, SOFTKEY_8=196, SOFTKEY_9=197, SPACE=11, STAR=202, STOP=183, SUBTRACT=78, T=55, TAB=2, TRACK_NEXT=216, TRACK_PREV=215, U=56, UNDEFINED=187, UNDERSCORE=152, UNDO=179, UP=17, V=57, VOLUME_DOWN=220, VOLUME_UP=219, W=58, WINDOWS=153, X=59, Y=60, Z=61}" + - name: "MouseButton" + typeName: map + type: 4 + value: "{NONE=0, PRIMARY=1, MIDDLE=2, SECONDARY=3}" + - name: "StrokeLineCap" + typeName: map + type: 4 + value: "{SQUARE=0, BUTT=1, ROUND=2}" + - name: "StrokeLineJoin" + typeName: map + type: 4 + value: "{MITER=0, BEVEL=1, ROUND=2}" + - name: "TextAlignment" + typeName: map + type: 4 + value: "{LEFT=0, CENTER=1, RIGHT=2, JUSTIFY=3}" + - name: "VPos" + typeName: map + type: 4 + value: "{TOP=0, CENTER=1, BASELINE=2, BOTTOM=3}" +functions: + - name: "BlendEffect" + args: "" + desc: "" + desc_ru: "" + - name: "BloomEffect" + args: "" + desc: "" + desc_ru: "" + - name: "BoxBlurEffect" + args: "" + desc: "" + desc_ru: "" + - name: "ColorAdjustEffect" + args: "" + desc: "" + desc_ru: "" + - name: "ColorInputEffect" + args: "" + desc: "" + desc_ru: "" + - name: "DropShadowEffect" + args: "" + desc: "" + desc_ru: "" + - name: "GaussianBlurEffect" + args: "" + desc: "" + desc_ru: "" + - name: "GlowEffect" + args: "" + desc: "" + desc_ru: "" + - name: "InnerShadowEffect" + args: "" + desc: "" + desc_ru: "" + - name: "LightingEffect" + args: "" + desc: "" + desc_ru: "" + - name: "MotionBlurEffect" + args: "" + desc: "" + desc_ru: "" + - name: "PerspectiveTransformEffect" + args: "" + desc: "" + desc_ru: "" + - name: "ReflectionEffect" + args: "" + desc: "" + desc_ru: "" + - name: "SepiaToneEffect" + args: "" + desc: "" + desc_ru: "" + - name: "ShadowEffect" + args: "" + desc: "" + desc_ru: "" + - name: "addEventFilter" + args: "" + desc: "" + desc_ru: "" + - name: "addEventHandler" + args: "" + desc: "" + desc_ru: "" + - name: "createImage" + args: "..." + desc: |- + `createImage(url)` - creates an image from url. + + `createImage(w, h)` - creates an image with the given size. + + `createBitmap(w, h, pixels)` - creates an image from pixels array. + + Returns ImageFXValue. + desc_ru: |- + `createImage(url)` - создаёт изображение из пути к ресурсу. + + `createImage(w, h)` - создаёт новое изображение с заданным размером. + + `createBitmap(w, h, pixels)` - создаёт изображение из массива пикселей. + + Возвращает ImageFXValue. + example: |- + use canvasfx + + g = showcanvas() + url = "http://lorempixel.com/640/480/nature" + bitmap = createImage(url) + g.drawBitmap(bitmap, 0, 0) + bitmap = createImage("file:image.png") + g.drawBitmap(bitmap, 200, 0) + - name: "repaint" + args: "" + desc: "" + desc_ru: "" + - name: "window" + args: "" + desc: "" + desc_ru: "" +types: + - name: "ColorValue" + - name: "EffectValue" + - name: "GraphicsFXValue" + functions: + - name: "appendSVGPath" + args: "" + desc: "" + desc_ru: "" + - name: "applyEffect" + args: "" + desc: "" + desc_ru: "" + - name: "arc" + args: "" + desc: "" + desc_ru: "" + - name: "arcTo" + args: "" + desc: "" + desc_ru: "" + - name: "beginPath" + args: "" + desc: "" + desc_ru: "" + - name: "bezierCurveTo" + args: "" + desc: "" + desc_ru: "" + - name: "clearRect" + args: "" + desc: "" + desc_ru: "" + - name: "clip" + args: "" + desc: "" + desc_ru: "" + - name: "closePath" + args: "" + desc: "" + desc_ru: "" + - name: "fill" + args: "" + desc: "" + desc_ru: "" + - name: "fillArc" + args: "" + desc: "" + desc_ru: "" + - name: "fillOval" + args: "" + desc: "" + desc_ru: "" + - name: "fillPolygon" + args: "" + desc: "" + desc_ru: "" + - name: "fillRect" + args: "" + desc: "" + desc_ru: "" + - name: "fillRoundRect" + args: "" + desc: "" + desc_ru: "" + - name: "fillText" + args: "" + desc: "" + desc_ru: "" + - name: "getFill" + args: "" + desc: "" + desc_ru: "" + - name: "getFillRule" + args: "" + desc: "" + desc_ru: "" + - name: "getGlobalAlpha" + args: "" + desc: "" + desc_ru: "" + - name: "getGlobalBlendMode" + args: "" + desc: "" + desc_ru: "" + - name: "getLineCap" + args: "" + desc: "" + desc_ru: "" + - name: "getLineJoin" + args: "" + desc: "" + desc_ru: "" + - name: "getLineWidth" + args: "" + desc: "" + desc_ru: "" + - name: "getMiterLimit" + args: "" + desc: "" + desc_ru: "" + - name: "getStroke" + args: "" + desc: "" + desc_ru: "" + - name: "getTextAlign" + args: "" + desc: "" + desc_ru: "" + - name: "getTextBaseline" + args: "" + desc: "" + desc_ru: "" + - name: "isPointInPath" + args: "" + desc: "" + desc_ru: "" + - name: "lineTo" + args: "" + desc: "" + desc_ru: "" + - name: "moveTo" + args: "" + desc: "" + desc_ru: "" + - name: "quadraticCurveTo" + args: "" + desc: "" + desc_ru: "" + - name: "rect" + args: "" + desc: "" + desc_ru: "" + - name: "restore" + args: "" + desc: "" + desc_ru: "" + - name: "rotate" + args: "" + desc: "" + desc_ru: "" + - name: "save" + args: "" + desc: "" + desc_ru: "" + - name: "scale" + args: "" + desc: "" + desc_ru: "" + - name: "setEffect" + args: "" + desc: "" + desc_ru: "" + - name: "setFill" + args: "" + desc: "" + desc_ru: "" + - name: "setFillRule" + args: "" + desc: "" + desc_ru: "" + - name: "setGlobalAlpha" + args: "" + desc: "" + desc_ru: "" + - name: "setGlobalBlendMode" + args: "" + desc: "" + desc_ru: "" + - name: "setLineCap" + args: "" + desc: "" + desc_ru: "" + - name: "setLineJoin" + args: "" + desc: "" + desc_ru: "" + - name: "setLineWidth" + args: "" + desc: "" + desc_ru: "" + - name: "setMiterLimit" + args: "" + desc: "" + desc_ru: "" + - name: "setStroke" + args: "" + desc: "" + desc_ru: "" + - name: "setTextAlign" + args: "" + desc: "" + desc_ru: "" + - name: "setTextBaseline" + args: "" + desc: "" + desc_ru: "" + - name: "stroke" + args: "" + desc: "" + desc_ru: "" + - name: "strokeArc" + args: "" + desc: "" + desc_ru: "" + - name: "strokeLine" + args: "x1, y1, x2, y2" + desc: "" + desc_ru: "" + - name: "strokeOval" + args: "" + desc: "" + desc_ru: "" + - name: "strokePolygon" + args: "" + desc: "" + desc_ru: "" + - name: "strokePolyline" + args: "" + desc: "" + desc_ru: "" + - name: "strokeRect" + args: "" + desc: "" + desc_ru: "" + - name: "strokeRoundRect" + args: "" + desc: "" + desc_ru: "" + - name: "strokeText" + args: "" + desc: "" + desc_ru: "" + - name: "transform" + args: "" + desc: "" + desc_ru: "" + - name: "translate" + args: "" + desc: "" + desc_ru: "" + - name: "ImageFXValue" + constants: + - name: "width" + typeName: number + type: 1 + value: "/*width of the image*/" + - name: "height" + typeName: number + type: 1 + value: "/*height of the image*/" + - name: "preserveRatio" + typeName: number + type: 1 + value: "/*is preserve ratio*/" + - name: "smooth" + typeName: number + type: 1 + value: "/*is smooth*/" + functions: + - name: "getPixels" + args: "" + desc: "returns pixels array of the image" + desc_ru: "возвращает массив пикселей изображения" \ No newline at end of file diff --git a/docs/src/modules/collections.yml b/docs/src/modules/collections.yml new file mode 100644 index 00000000..07f37667 --- /dev/null +++ b/docs/src/modules/collections.yml @@ -0,0 +1,26 @@ +name: collections +scope: both +desc: Contains functions for working with collections +desc_ru: Содержит функции для работы с коллекциями +since: 2.0.0 +functions: + - name: hashMap + args: "fromMap = {}" + desc: creates a new HashMap based on `fromMap` values + desc_ru: создаёт новый HashMap из значений `fromMap` + - name: linkedHashMap + args: "fromMap = {}" + desc: creates a new LinkedHashMap based on `fromMap` values + desc_ru: создаёт новый LinkedHashMap из значений `fromMap` + - name: concurrentHashMap + args: "fromMap = {}" + desc: creates a new ConcurrentHashMap based on `fromMap` values + desc_ru: создаёт новый ConcurrentHashMap из значений `fromMap` + - name: treeMap + args: "fromMap = {}, comparator = def(a, b) = 0" + desc: creates a new TreeMap based on `fromMap` values and `comparator` + desc_ru: создаёт новый TreeMap из значений `fromMap` и компаратора `comparator` + - name: concurrentSkipListMap + args: "fromMap = {}, comparator = def(a, b) = 0" + desc: creates a new ConcurrentSkipListMap based on `fromMap` values and `comparator` + desc_ru: создаёт новый ConcurrentSkipListMap из значений `fromMap` и компаратора `comparator` diff --git a/docs/src/modules/date.yml b/docs/src/modules/date.yml new file mode 100644 index 00000000..7614ffc5 --- /dev/null +++ b/docs/src/modules/date.yml @@ -0,0 +1,107 @@ +name: date +scope: "both" +desc: "Contains functions for working with date and time" +desc_ru: "Содержит функции для работы с датой и временем" +constants: + - name: "STYLE_FULL" + typeName: number + type: 1 + value: "0" + - name: "STYLE_LONG" + typeName: number + type: 1 + value: "1" + - name: "STYLE_MEDIUM" + typeName: number + type: 1 + value: "2" + - name: "STYLE_SHORT" + typeName: number + type: 1 + value: "3" +functions: + - name: "newDate" + args: "..." + desc: |- + `newDate()` - returns current date. + + `newDate(timestamp)` - returns date by given timestamp. + + `newDate(dateString)` - parses and returns date by given string. + + `newDate(pattern, dateString)` - parses and returns date by given string in `pattern` format. + + `newDate(year, month, day)` - returns date by year, month and day. + + `newDate(year, month, day, hour, minute)` - returns date by year, month, day, hour and minute. + + `newDate(year, month, day, hour, minute, second)` - returns date by year, month, day, hour, minute and second. + + Returns DateValue. + desc_ru: |- + `newDate()` - возвращает текущую дату. + + `newDate(timestamp)` - возвращает дату для указанной метки времени. + + `newDate(dateString)` - парсит и возвращает дату, записанную в виде строки. + + `newDate(pattern, dateString)` - парсит и возвращает дату, записанную в виде строки в формате `pattern`. + + `newDate(year, month, day)` - возвращает дату для указанных года, месяца и дня. + + `newDate(year, month, day, hour, minute)` - возвращает дату для указанных года, месяца, дня, часа и минуты. + + `newDate(year, month, day, hour, minute, second)` - возвращает дату для указанных года, месяца, дня, часа, минуты и секунды. + + Возвращает DateValue. + - name: "newFormat" + args: "..." + desc: |- + `newFormat()` - returns default date format. + + `newFormat(pattern)` - returns date format by given pattern. + + `newFormat(type)` - returns format: 0 - default, 1 - date, 2 - time, 3 - date and time. + + `newFormat(pattern, locale)` - returns date format by given pattern and locale. + + `newFormat(type, style)` - returns format: 0 - default, 1 - date, 2 - time, 3 - date and time. `style`: 0 - full, 1 - long, 2 - medium, 3 - short. + + Returns DateFormatValue. + desc_ru: |- + `newFormat()` - возвращает формат даты по умолчанию. + + `newFormat(pattern)` - возвращает формат с указанным шаблоном. + + `newFormat(type)` - возвращает формат: 0 - по умолчанию, 1 - для даты, 2 - для времени, 3 - для времени и даты. + + `newFormat(pattern, locale)` - возвращает формат для указанного шаблона в заданной локализации. + + `newFormat(type, style)` - возвращает формат: 0 - по умолчанию, 1 - для даты, 2 - для времени, 3 - для времени и даты. `style`: 0 - полный, 1 - длинный, 2 - средний, 3 - короткий. + + Возвращает DateFormatValue. + - name: "formatDate" + args: "date, format = default" + desc: formats date by given format and returns string + desc_ru: форматирует дату в указанном формате и возвращает строку + example: |- + use date + + d = newDate(2016, 4, 8) + println formatDate(d, newFormat("yyyy/MM/dd")) // "2016/05/08" + - name: "parseDate" + args: "dateString, format = default" + desc: parses date from string by given pattern. Returns DateValue + desc_ru: парсит дату из строки в указанном шаблоне. Возвращает DateValue + example: |- + use date + + println parseDate("2016/05/08", newFormat("yyyy/MM/dd")) + - name: "toTimestamp" + args: "date" + desc: returns timestamp in milliseconds + desc_ru: возвращает время в миллисекундах +types: + - name: "DateValue" + value: "year, month, day, hour, minute, second, millisecond" + - name: "DateFormatValue" \ No newline at end of file diff --git a/docs/src/modules/downloader.yml b/docs/src/modules/downloader.yml new file mode 100644 index 00000000..64410d3b --- /dev/null +++ b/docs/src/modules/downloader.yml @@ -0,0 +1,24 @@ +name: downloader +scope: both +desc: "Contains functions for downloading large files" +desc_ru: "Содержит функции для скачивания больших файлов" +functions: + - name: getContentLength + args: 'url' + desc: 'gets content length by sending HEAD request to the given url' + desc_ru: 'получает значение заголовка Content-Length путём отправки HEAD-запроса на указанный url' + - name: downloader + args: 'downloadUrl, filePath, progressCallback = def() {}, bufferSize = 16384' + desc: 'downloads file from `downloadUrl` to `filePath`' + desc_ru: 'скачивает файл по адресу `downloadUrl` и сохраняет в `filePath`' + example: |- + use downloader, std + + MBYTES = 1048576.0 // 1024*1024 + url = "http://www.ovh.net/files/10Mb.dat" + file = "10Mb.dat" + + downloader(url, file, def(progress, bytesDownloaded, bytesMax) { + bar = "#" * (progress / 2) + print sprintf("%-50s %d%% %.2f / %.2f MiB\\r", bar, progress, bytesDownloaded / MBYTES, bytesMax / MBYTES) + }) \ No newline at end of file diff --git a/docs/src/modules/files.yml b/docs/src/modules/files.yml new file mode 100644 index 00000000..684e9d8d --- /dev/null +++ b/docs/src/modules/files.yml @@ -0,0 +1,288 @@ +name: files +scope: "both" +desc: "Contains functions for working with files" +desc_ru: "Содержит функции для работы с файлами" +constants: + - name: "FILES_COMPARATOR" + typeName: "function" + scope: "both" + type: 5 + value: "def(f1, f2) = compare(f1, f2)" + desc: "function which compares two file descriptors" + desc_ru: "функция, которая сравнивает два файловых дескриптора" + - name: "SDCARD" + typeName: string + scope: "android" + type: 2 + value: "path to SDCARD" + desc: "path to SDCARD" + desc_ru: "путь к внешнему хранилищу" +functions: + - name: "canExecute" + args: "f" + desc: "checks execute permission of the descriptor `f`" + desc_ru: "проверяет права на выполнение дескриптора `f`" + - name: "canRead" + args: "f" + desc: "checks read permission of the descriptor `f`" + desc_ru: "проверяет права на чтение дескриптора `f`" + - name: "canWrite" + args: "f" + desc: "checks write permission of the descriptor `f`" + desc_ru: "проверяет права на запись дескриптора `f`" + - name: copy + args: 'src, dst' + desc: 'copies file src to dst location' + desc_ru: 'копирует файл src в dst' + - name: "delete" + args: "f" + desc: "removes file or directory. Returns 1 if delete was successfull, 0 otherwise" + desc_ru: "удаляет файл или папку. Возвращает 1, если удаление прошло успешно, иначе - 0" + - name: "exists" + args: "f" + desc: "checks file or directory existing. Returns 1 if exists, 0 otherwise" + desc_ru: "проверяет, существует ли файл или папка. Возвращает 1, если существует, иначе - 0" + - name: "fclose" + args: "f" + desc: "closes file" + desc_ru: "закрывает файл" + - name: "fileSize" + args: "f" + desc: "returns file size in bytes" + desc_ru: "возвращает размер файла в байтах" + - name: "flush" + args: "f" + desc: "flushes write buffer into file" + desc_ru: "сбрасывает буфер записи в файл" + - name: "fopen" + args: "path, mode = \"r\"" + desc: |- + opens file файл with `path` in given `mode`: + + - "" - opens file or directory for getting info; + - "r" - opens file for read in text mode; + - "rb" - opens file for read in binary mode; + - "w" - opens file for write in text mode; + - "w+" - opens file for append in text mode; + - "wb" - opens file for write in binary mode; + - "wb+" - opens file for append in binary mode. + + Returns a file descriptor for using in other functions. + desc_ru: |- + открывает файл по пути `path` в заданном режиме `mode`: + + - "" - открывает файл или папку для получения информации; + - "r" - открывает файл для чтения в текстовом режиме; + - "rb" - открывает файл для чтения в бинарном режиме; + - "w" - открывает файл для записи в текстовом режиме; + - "w+" - открывает файл для дозаписи в текстовом режиме; + - "wb" - открывает файл для записи в бинарном режиме; + - "wb+" - открывает файл для дозаписи в бинарном режиме. + + Возвращает дескриптор файла, который необходим для остальных функций. + example: |- + use files + + f1 = fopen("text.txt") // opens file text.txt for read in text mode + f2 = fopen("E:/1.dat", "rbwb") // opens file 1.dat on drive E for binary read and write" + example_ru: |- + use files + + f1 = fopen("text.txt") // открывает файл text.txt для текстового чтения + f2 = fopen("E:/1.dat", "rbwb") // открывает файл 1.dat на диске E для бинарного чтения и записи" + - name: "getParent" + args: "f" + desc: "returns parent path of the given descriptor `f`" + desc_ru: "возвращает родительский путь для заданного дескриптора `f`" + - name: "isDirectory" + args: "f" + desc: "checks if descriptor `f` is directory" + desc_ru: "проверяет, является ли дескриптор `f` папкой. 1 - является, 0 - нет" + - name: "isFile" + args: "f" + desc: "checks if descriptor `f` is file" + desc_ru: "проверяет, является ли дескриптор f файлом. 1 - является, 0 - нет" + - name: "isHidden" + args: "f" + desc: "checks if descriptor `f` is hidden" + desc_ru: "проверяет, скрыт ли дескриптор f. 1 - скрыт, 0 - нет" + - name: "lastModified" + args: "f" + desc: "returns last modification time" + desc_ru: "возвращает время последнего изменения" + - name: "listFiles" + args: "f" + desc: "returns array with filenames in given directory.\n\n f - directory descriptor" + desc_ru: "возвращает массив с именами файлов в указанной директории.\n\n f - дескриптор папки" + example: |- + use files + + f1 = fopen("E:/examples", "") // opens directory examples for getting information + list = listFiles(f1) // gets array with filenames in directory + example_ru: |- + use files + + f1 = fopen("E:/examples", "") // открыть папку examples для получения информации + list = listFiles(f1) // получить массив с именами файлов в этой папке + - name: "mkdir" + args: "f" + desc: "creates the directory. Returns 1 if operation was successfull, 0 otherwise" + desc_ru: "создаёт папку. Возвращает 1, если создание прошло успешно, иначе - 0" + - name: "mkdirs" + args: "f" + desc: "creates the directories. Returns 1 if operation was successfull, 0 otherwise" + desc_ru: "создаёт папки. Возвращает 1, если создание прошло успешно, иначе - 0" + - name: "readAllBytes" + args: "f" + desc: "reads all bytes from file. Returns array with bytes" + desc_ru: "чтение всех байт файла. Возвращает массив байт файла" + example: |- + use std, files + + f1 = fopen("file.bin", "rb") + array = readAllBytes(f1) + println length(array) + - name: "readBoolean" + args: "f" + desc: "reads boolean (1 byte). Returns 0 if byte was 0, 1 otherwise" + desc_ru: "чтение boolean-значения (1 байт). Возвращает 0, если байт имеет значение 0, 1 - если значение не равно 0" + - name: "readByte" + args: "f" + desc: "reads one byte" + desc_ru: "чтение одного байта" + - name: "readBytes" + args: "f, array, offset = 0, length = length(array)" + desc: "reads `length` bytes of file `f` and stores to `array` starting from `offset+1` byte. Returns number of read bytes" + desc_ru: "чтение заданного количества байт в массив `array`. Возвращает число прочитанных байт. \nЕсли offset и length не указаны, то читается количество байт равное длине массива. \nЕсли offset и length указаны, то читается length байт в массив array, начиная с `offset+1` байта" + example: |- + use files + + f1 = fopen("file.bin", "rb") // file.bin must contain more than 5000 bytes + array = newarray(2048) + readCount = readBytes(f1, array) // reads 2048 bytes + readCount = readBytes(f1, array, 10) // reads 2048 bytes starting from 11 byte + readCount = readBytes(f1, array, 20, 10) // reads 10 bytes, starting from 21 byte + example_ru: |- + use files + + f1 = fopen("file.bin", "rb") // file.bin должен иметь больше 5000 байтов + array = newarray(2048) + readCount = readBytes(f1, array) // читает 2048 байт из файла + readCount = readBytes(f1, array, 10) // читает 2048 байт, начиная с 11 байта + readCount = readBytes(f1, array, 20, 10) // читает 10 байт, начиная с 21 байта + - name: "readChar" + args: "f" + desc: "reads one char (2 bytes). Returns number char's code" + desc_ru: "чтение одного символа (2 байта). Возвращает число - код символа" + - name: "readDouble" + args: "f" + desc: "reads 8 bytes double number" + desc_ru: "чтение 8 байт (вещественное число двойной точности)" + - name: "readFloat" + args: "f" + desc: "reads 4 bytes float number" + desc_ru: "чтение 4 байт (вещественное число)" + - name: "readInt" + args: "f" + desc: "reads 4 bytes integer number" + desc_ru: "чтение 4 байт (целое число)" + - name: "readLine" + args: "f" + desc: "reads line from file opened in text mode" + desc_ru: "чтение строки в текстовом режиме" + - name: "readLong" + args: "f" + desc: "reads 8 bytes long number" + desc_ru: "чтение 8 байт (длинное целое число)" + - name: "readShort" + args: "f" + desc: "reads 2 bytes short number" + desc_ru: "чтение 2 байт (короткое целое число)" + - name: "readText" + args: "f" + desc: "reads all file's content as string" + desc_ru: "чтение всего файла в текстовом режиме в строку" + - name: "readUTF" + args: "f" + desc: "reads string in binary mode" + desc_ru: "чтение строки в бинарном режиме" + - name: "rename" + args: "from, to" + desc: "renames (or moves) file" + desc_ru: "переименование (или перемещение) файла" + example: |- + use files + + f1 = fopen("C:/file1", "i") + f2 = fopen("E:/file2", "i") + rename(f1, f2) + fclose(f1) + fclose(f2) + - name: "setLastModified" + args: "f, time" + desc: "sets last modified time" + desc_ru: "устанавливает время изменения" + - name: "setReadOnly" + args: "f" + desc: "marks descriptor read only" + desc_ru: "помечает дескриптор только для чтения" + - name: "setExecutable" + args: "f, executable, ownerOnly = true" + desc: "sets execute permission" + desc_ru: "устанавливает права на выполнение" + - name: "setReadable" + args: "f, readable, ownerOnly = true" + desc: "sets read permission" + desc_ru: "устанавливает права на чтение" + - name: "setWritable" + args: "f, writable, ownerOnly = true" + desc: "sets write permission" + desc_ru: "устанавливает права на запись" + - name: "writeBoolean" + args: "f, v" + desc: "writes boolean (0 or 1) to file" + desc_ru: "запись одного байта boolean (0 или 1) в файл" + - name: "writeByte" + args: "f, v" + desc: "writes one byte to file" + desc_ru: "запись одного байта в файл" + - name: "writeBytes" + args: "f, array, offset = 0, length = length(array)" + desc: "writes `length` bytes to file `f` from byte `array` starting from `offset`" + desc_ru: "запись заданного количества байт в файл `f` из массива байт `array`. \nЕсли offset и length не указаны, то записывается количество байт равное длине массива. \nЕсли offset и length указаны, то пропускается offset байт и записывается length байт" + - name: "writeChar" + args: "f, v" + desc: "writes one char (2 bytes) to file. `v` can be number - writes number, or string - writes code of first symbol" + desc_ru: "запись одного символа (2 байта) в файл. `v` может быть как числом (пишется это число), так и строкой (пишется код первого символа)" + - name: "writeDouble" + args: "f, v" + desc: "writes 8 bytes double number to file" + desc_ru: "запись 8 байт (вещественное число двойной точности)" + - name: "writeFloat" + args: "f, v" + desc: "writes 4 bytes float number to file" + desc_ru: "запись 4 байт (вещественное число)" + - name: "writeInt" + args: "f, v" + desc: "writes 4 bytes integer number to file" + desc_ru: "запись 4 байт (целое число)" + - name: "writeLine" + args: "f, v" + desc: "writes string to file in text mode **adds line break at the end of the string**" + desc_ru: "запись строки в текстовом режиме **Добавляет в конец символ переноса строки**" + - name: "writeLong" + args: "f, v" + desc: "writes 8 bytes long number to file" + desc_ru: "запись 8 байт (длинное целое число)" + - name: "writeShort" + args: "f, v" + desc: "writes 2 bytes short number to file" + desc_ru: "запись двух байт (короткое целое число)" + - name: "writeText" + args: "f, v" + desc: "writes string to file in text mode. Unlike `writeLine` does not add line break" + desc_ru: "запись всего текста в текстовом режиме. В отличие от `writeLine`, не добавляет символ переноса строки" + - name: "writeUTF" + args: "f, v" + desc: "writes string to file in binary mode" + desc_ru: "запись строки в бинарном режиме" \ No newline at end of file diff --git a/docs/src/modules/forms.yml b/docs/src/modules/forms.yml new file mode 100644 index 00000000..cc6d6640 --- /dev/null +++ b/docs/src/modules/forms.yml @@ -0,0 +1,89 @@ +name: forms +scope: desktop +desc: "Contains functions for working with forms" +desc_ru: "Содержит функции для работы с формами" +constants: + - name: BorderLayout + type: 4 + typeName: map + value: '{AFTER_LINE_ENDS=After, LINE_END=After, LINE_START=Before, BEFORE_LINE_BEGINS=Before, CENTER=Center, EAST=East, BEFORE_FIRST_LINE=First, PAGE_START=First, AFTER_LAST_LINE=Last, PAGE_END=Last, NORTH=North, SOUTH=South, WEST=West}' + - name: BoxLayout + type: 4 + typeName: map + value: '{X_AXIS=0, Y_AXIS=1, LINE_AXIS=2, PAGE_AXIS=3}' + - name: DISPOSE_ON_CLOSE + type: 1 + typeName: number + value: '2' + - name: DO_NOTHING_ON_CLOSE + type: 1 + typeName: number + value: '0' + - name: EXIT_ON_CLOSE + type: 1 + typeName: number + value: '3' + - name: HIDE_ON_CLOSE + type: 1 + typeName: number + value: '1' + - name: SwingConstants + type: 4 + typeName: map + value: '{BOTTOM=3, CENTER=0, EAST=3, HORIZONTAL=0, LEADING=10, LEFT=2, NEXT=12, NORTH=1, NORTH_EAST=2, NORTH_WEST=8, PREVIOUS=13, RIGHT=4, SOUTH=5, SOUTH_EAST=4, SOUTH_WEST=6, TOP=1, TRAILING=11, VERTICAL=1, WEST=7}' +functions: + - name: borderLayout + args: 'hgap = 0, vgap = 0' + desc: 'creates BorderLayout' + desc_ru: 'создаёт BorderLayout' + - name: boxLayout + args: 'panel, axis = BoxLayout.PAGE_AXIS' + desc: 'creates BoxLayout' + desc_ru: 'создаёт BoxLayout' + - name: cardLayout + args: 'hgap = 0, vgap = 0' + desc: 'creates CardLayout' + desc_ru: 'создаёт CardLayout' + - name: flowLayout + args: 'align = FlowLayout.CENTER, hgap = 5, vgap = 5' + desc: 'creates FlowLayout' + desc_ru: 'создаёт FlowLayout' + - name: gridLayout + args: 'rows = 1, cols = 0, hgap = 0, vgap = 0' + desc: 'creates GridLayout' + desc_ru: 'создаёт GridLayout' + - name: newButton + args: 'text = ""' + desc: 'creates new button' + desc_ru: 'создаёт новую кнопку' + - name: newLabel + args: 'text = "", align = SwingConstants.LEADING' + desc: 'creates new label' + desc_ru: 'создаёт новую текстовую метку' + - name: newPanel + args: 'layoutManager = ...' + desc: 'creates new panel with optional layout manager' + desc_ru: 'создаёт новую панель с опциональным LayoutManager' + - name: newProgressBar + args: 'isVertical = false, min = 0, max = 100' + desc: 'creates new progress bar' + desc_ru: 'создаёт новый прогрессбар' + since: 1.5.0 + - name: newScrollPane + args: 'view, verticalPolicy = AS_NEEDED, horizontalPolicy = AS_NEEDED' + desc: 'creates new scroll pane' + desc_ru: 'создаёт новую область прокрутки' + since: 1.5.0 + - name: newTextArea + args: 'text = ""' + desc: 'creates new text area' + desc_ru: 'создаёт новую область ввода' + since: 1.5.0 + - name: newTextField + args: 'text = "", rows = 0, cols = 0' + desc: 'creates new text field' + desc_ru: 'создаёт новое поле ввода' + - name: newWindow + args: 'title = ""' + desc: 'creates new window and returns JFrameValue' + desc_ru: 'создаёт новое окно и возвращает JFrameValue' \ No newline at end of file diff --git a/docs/src/modules/forms_android.yml b/docs/src/modules/forms_android.yml new file mode 100644 index 00000000..a5f3385a --- /dev/null +++ b/docs/src/modules/forms_android.yml @@ -0,0 +1,2015 @@ +name: forms +scope: android +desc: "Contains functions for working with forms" +desc_ru: "Содержит функции для работы с формами" +constants: + - name: Gravity + type: 4 + typeName: map + value: '{NONE=0, NO_GRAVITY=0, CENTER_HORIZONTAL=1, LEFT=3, RIGHT=5, FILL_HORIZONTAL=7, CLIP_HORIZONTAL=8, CENTER_VERTICAL=16, CENTER=17, TOP=48, BOTTOM=80, FILL_VERTICAL=112, FILL=119, CLIP_VERTICAL=128}' + - name: InputType + type: 4 + typeName: map + value: '{TYPE_CLASS_DATETIME=4, TYPE_CLASS_NUMBER=2, TYPE_CLASS_PHONE=3, TYPE_CLASS_TEXT=1, TYPE_DATETIME_VARIATION_DATE=16, TYPE_DATETIME_VARIATION_NORMAL=0, TYPE_DATETIME_VARIATION_TIME=32, TYPE_MASK_CLASS=15, TYPE_MASK_FLAGS=16773120, TYPE_MASK_VARIATION=4080, TYPE_NULL=0, TYPE_NUMBER_FLAG_DECIMAL=8192, TYPE_NUMBER_FLAG_SIGNED=4096, TYPE_NUMBER_VARIATION_NORMAL=0, TYPE_NUMBER_VARIATION_PASSWORD=16, TYPE_TEXT_FLAG_AUTO_COMPLETE=65536, TYPE_TEXT_FLAG_AUTO_CORRECT=32768, TYPE_TEXT_FLAG_CAP_CHARACTERS=4096, TYPE_TEXT_FLAG_CAP_SENTENCES=16384, TYPE_TEXT_FLAG_CAP_WORDS=8192, TYPE_TEXT_FLAG_IME_MULTI_LINE=262144, TYPE_TEXT_FLAG_MULTI_LINE=131072, TYPE_TEXT_FLAG_NO_SUGGESTIONS=524288, TYPE_TEXT_VARIATION_EMAIL_ADDRESS=32, TYPE_TEXT_VARIATION_EMAIL_SUBJECT=48, TYPE_TEXT_VARIATION_FILTER=176, TYPE_TEXT_VARIATION_LONG_MESSAGE=80, TYPE_TEXT_VARIATION_NORMAL=0, TYPE_TEXT_VARIATION_PASSWORD=128, TYPE_TEXT_VARIATION_PERSON_NAME=96, TYPE_TEXT_VARIATION_PHONETIC=192, TYPE_TEXT_VARIATION_POSTAL_ADDRESS=112, TYPE_TEXT_VARIATION_SHORT_MESSAGE=64, TYPE_TEXT_VARIATION_URI=16, TYPE_TEXT_VARIATION_VISIBLE_PASSWORD=144, TYPE_TEXT_VARIATION_WEB_EDIT_TEXT=160, TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS=208, TYPE_TEXT_VARIATION_WEB_PASSWORD=224}' + - name: LinearLayout + type: 4 + typeName: map + value: '{HORIZONTAL=0, VERTICAL=1}' + - name: MATCH_PARENT + type: 1 + typeName: number + value: '-1' + - name: PorterDuff + type: 4 + typeName: map + value: '{ADD=16, CLEAR=0, DARKEN=12, DST=2, DST_ATOP=10, DST_IN=6, DST_OUT=8, DST_OVER=4, LIGHTEN=13, MULTIPLY=14, OVERLAY=17, SCREEN=15, SRC=1, SRC_ATOP=9, SRC_IN=5, SRC_OUT=7, SRC_OVER=3, XOR=11}' + - name: ScaleType + type: 4 + typeName: map + value: '{MATRIX=0, FIT_XY=1, FIT_START=2, FIT_CENTER=3, FIT_END=4, CENTER=5, CENTER_CROP=6, CENTER_INSIDE=7}' + - name: WRAP_CONTENT + type: 1 + typeName: number + value: '-2' +functions: + - name: showForm + args: 'view, layoutParams = {}' + desc: 'shows view' + desc_ru: 'показывает форму' + - name: inflate + args: 'resourceId, rootView = null, attachToRoot = false' + desc: 'Inflates view from resource xml' + desc_ru: 'Создаёт view из xml-ресурса' + - name: newArrayAdapter + args: 'resourceId = R.layout.simple_list_item_1, elements = []' + desc: 'Creates ArrayAdapter to use in ListView' + desc_ru: 'Создаёт ArrayAdapter для использования в ListView' + - name: newBaseAdapter + args: 'mapWithFunctions' + desc: '' + desc_ru: '' + example: |- + use std, android, forms + + img1 = assetBitmap("ownlang.png") + img2 = img1 + + items = [ + {"img" : img1, "text" : "Item 1"}, + {"img" : img2, "text" : "Item 2"} + ] + adapter = newBaseAdapter({ + "getCount": def() = length(items) + "getItem": def(pos) = items[pos] + "getItemId": def(pos) = pos + "getView": def(pos, view, parent) { + if (view == 0) { + view = newLinearLayout() + view.setOrientation(LinearLayout.HORIZONTAL) + imageView = newImageView() + view.addView(imageView) + textView = newTextView() + view.addView(textView) + view.setTag([imageView, textView]) + } else { + extract(imageView, textView) = view.getTag() + } + + imageView.setImageBitmap(items[pos].img); + textView.setText(items[pos].text); + return view + } + }); + + listView = newListView() + listView.setAdapter(adapter) + listView.onItemClick(def(v, pos, id) { + toast(adapter.getItem(pos).text + " selected") + }) + + panel = newLinearLayout() + panel.addView(newTextView("ListView with BaseAdapter demo")) + panel.addView(listView) + + showForm(panel) + - name: newButton + args: 'text = ""' + desc: 'creates Button' + desc_ru: 'создаёт Button' + - name: newCheckBox + args: '' + desc: 'creates CheckBox' + desc_ru: 'создаёт CheckBox' + - name: newEditText + args: '' + desc: 'creates EditText' + desc_ru: 'создаёт EditText' + - name: newFrameLayout + args: '' + desc: 'creates FrameLayout container' + desc_ru: 'создаёт контейнер FrameLayout' + - name: newImageButton + args: '' + desc: 'creates ImageButton' + desc_ru: 'создаёт ImageButton' + - name: newImageView + args: '' + desc: 'creates ImageView' + desc_ru: 'создаёт ImageView' + - name: newLinearLayout + args: '' + desc: 'creates LinearLayout container' + desc_ru: 'создаёт контейнер LinearLayout' + - name: newListView + args: '' + desc: 'creates ListView' + desc_ru: 'создаёт ListView' + - name: newProgressBar + args: 'style = R.attr.progressBarStyle' + desc: 'creates ProgressBar' + desc_ru: 'создаёт ProgressBar' + example: |- + use android, forms + pb1 = newProgressBar(R.attr.progressBarStyleHorizontal) + pb1.setMax(100) + pb1.setProgress(10) + pb2 = newProgressBar() + pb2.setIndeterminate(true) + + panel = newLinearLayout() + panel.addView(pb1) + panel.addView(pb2) + showForm(panel) + - name: newRadioButton + args: '' + desc: 'creates RadioButton' + desc_ru: 'создаёт RadioButton' + - name: newRadioGroup + args: '' + desc: 'creates RadioGroup container' + desc_ru: 'создаёт контейнер RadioGroup' + - name: newRelativeLayout + args: '' + desc: 'creates RelativeLayout container' + desc_ru: 'создаёт контейнер RelativeLayout' + - name: newScrollView + args: '' + desc: 'creates ScrollView container' + desc_ru: 'создаёт контейнер ScrollView' + - name: newSeekBar + args: '' + desc: 'creates SeekBar' + desc_ru: 'создаёт SeekBar' + - name: newSwitch + args: '' + desc: 'creates Switch (available for SDK_INT >= 14)' + desc_ru: 'создаёт Switch (доступен для SDK_INT >= 14)' + - name: newTextView + args: 'text = ""' + desc: 'creates TextView' + desc_ru: 'создаёт TextView' + - name: newToggleButton + args: '' + desc: 'creates ToggleButton' + desc_ru: 'создаёт ToggleButton' +types: + - name: ViewValue + functions: + - name: bringToFront + args: '' + desc: '' + desc_ru: '' + - name: buildDrawingCache + args: '' + desc: '' + desc_ru: '' + - name: callOnClick + args: '' + desc: 'available for SDK_INT >= 15' + desc_ru: 'доступно для SDK_INT >= 15' + - name: cancelLongPress + args: '' + desc: '' + desc_ru: '' + - name: clearAnimation + args: '' + desc: '' + desc_ru: '' + - name: clearFocus + args: '' + desc: '' + desc_ru: '' + - name: computeScroll + args: '' + desc: '' + desc_ru: '' + - name: destroyDrawingCache + args: '' + desc: '' + desc_ru: '' + - name: dispatchDisplayHint + args: '' + desc: '' + desc_ru: '' + - name: findFocus + args: '' + desc: '' + desc_ru: '' + - name: findViewById + args: '' + desc: '' + desc_ru: '' + - name: focusSearch + args: '' + desc: '' + desc_ru: '' + - name: forceLayout + args: '' + desc: '' + desc_ru: '' + - name: getAlpha + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: getBaseline + args: '' + desc: '' + desc_ru: '' + - name: getBottom + args: '' + desc: '' + desc_ru: '' + - name: getContentDescription + args: '' + desc: '' + desc_ru: '' + - name: getDrawingCacheBackgroundColor + args: '' + desc: '' + desc_ru: '' + - name: getDrawingCacheQuality + args: '' + desc: '' + desc_ru: '' + - name: getDrawingTime + args: '' + desc: '' + desc_ru: '' + - name: getHeight + args: '' + desc: '' + desc_ru: '' + - name: getHorizontalFadingEdgeLength + args: '' + desc: '' + desc_ru: '' + - name: getId + args: '' + desc: '' + desc_ru: '' + - name: getKeepScreenOn + args: '' + desc: '' + desc_ru: '' + - name: getLeft + args: '' + desc: '' + desc_ru: '' + - name: getMeasuredHeight + args: '' + desc: '' + desc_ru: '' + - name: getMeasuredHeightAndState + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: getMeasuredState + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: getMeasuredWidth + args: '' + desc: '' + desc_ru: '' + - name: getMeasuredWidthAndState + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: getNextFocusDownId + args: '' + desc: '' + desc_ru: '' + - name: getNextFocusForwardId + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: getNextFocusLeftId + args: '' + desc: '' + desc_ru: '' + - name: getNextFocusRightId + args: '' + desc: '' + desc_ru: '' + - name: getNextFocusUpId + args: '' + desc: '' + desc_ru: '' + - name: getOverScrollMode + args: '' + desc: '' + desc_ru: '' + - name: getPaddingBottom + args: '' + desc: '' + desc_ru: '' + - name: getPaddingEnd + args: '' + desc: 'available for SDK_INT >= 17' + desc_ru: 'доступно для SDK_INT >= 17' + - name: getPaddingLeft + args: '' + desc: '' + desc_ru: '' + - name: getPaddingRight + args: '' + desc: '' + desc_ru: '' + - name: getPaddingStart + args: '' + desc: 'available for SDK_INT >= 17' + desc_ru: 'доступно для SDK_INT >= 17' + - name: getPaddingTop + args: '' + desc: '' + desc_ru: '' + - name: getPivotX + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: getPivotY + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: getRight + args: '' + desc: '' + desc_ru: '' + - name: getRootView + args: '' + desc: '' + desc_ru: '' + - name: getRotation + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: getRotationX + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: getRotationY + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: getScaleX + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: getScaleY + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: getScrollBarFadeDuration + args: '' + desc: 'available for SDK_INT >= 16' + desc_ru: 'доступно для SDK_INT >= 16' + - name: getScrollBarSize + args: '' + desc: 'available for SDK_INT >= 16' + desc_ru: 'доступно для SDK_INT >= 16' + - name: getScrollBarStyle + args: '' + desc: '' + desc_ru: '' + - name: getScrollX + args: '' + desc: '' + desc_ru: '' + - name: getScrollY + args: '' + desc: '' + desc_ru: '' + - name: getSolidColor + args: '' + desc: '' + desc_ru: '' + - name: getSystemUiVisibility + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: getTag + args: '' + desc: '' + desc_ru: '' + - name: getTextAlignment + args: '' + desc: 'available for SDK_INT >= 17' + desc_ru: 'доступно для SDK_INT >= 17' + - name: getTextDirection + args: '' + desc: 'available for SDK_INT >= 17' + desc_ru: 'доступно для SDK_INT >= 17' + - name: getTop + args: '' + desc: '' + desc_ru: '' + - name: getTranslationX + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: getTranslationY + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: getTranslationZ + args: '' + desc: 'available for SDK_INT >= 21' + desc_ru: 'доступно для SDK_INT >= 21' + - name: getVerticalFadingEdgeLength + args: '' + desc: '' + desc_ru: '' + - name: getVerticalScrollbarPosition + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: getVerticalScrollbarWidth + args: '' + desc: '' + desc_ru: '' + - name: getVisibility + args: '' + desc: '' + desc_ru: '' + - name: getWidth + args: '' + desc: '' + desc_ru: '' + - name: getWindowSystemUiVisibility + args: '' + desc: 'available for SDK_INT >= 16' + desc_ru: 'доступно для SDK_INT >= 16' + - name: getWindowVisibility + args: '' + desc: '' + desc_ru: '' + - name: getX + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: getY + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: getZ + args: '' + desc: 'available for SDK_INT >= 21' + desc_ru: 'доступно для SDK_INT >= 21' + - name: hasFocus + args: '' + desc: '' + desc_ru: '' + - name: hasFocusable + args: '' + desc: '' + desc_ru: '' + - name: hasNestedScrollingParent + args: '' + desc: 'available for SDK_INT >= 21' + desc_ru: 'доступно для SDK_INT >= 21' + - name: hasOnClickListeners + args: '' + desc: 'available for SDK_INT >= 15' + desc_ru: 'доступно для SDK_INT >= 15' + - name: hasOverlappingRendering + args: '' + desc: 'available for SDK_INT >= 16' + desc_ru: 'доступно для SDK_INT >= 16' + - name: hasTransientState + args: '' + desc: 'available for SDK_INT >= 16' + desc_ru: 'доступно для SDK_INT >= 16' + - name: hasWindowFocus + args: '' + desc: '' + desc_ru: '' + - name: invalidate + args: '' + desc: '' + desc_ru: '' + - name: invalidateDrawable + args: '' + desc: '' + desc_ru: '' + - name: invalidateOutline + args: '' + desc: 'available for SDK_INT >= 21' + desc_ru: 'доступно для SDK_INT >= 21' + - name: isAccessibilityFocused + args: '' + desc: 'available for SDK_INT >= 21' + desc_ru: 'доступно для SDK_INT >= 21' + - name: isActivated + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: isAttachedToWindow + args: '' + desc: 'available for SDK_INT >= 19' + desc_ru: 'доступно для SDK_INT >= 19' + - name: isClickable + args: '' + desc: '' + desc_ru: '' + - name: isContextClickable + args: '' + desc: 'available for SDK_INT >= 23' + desc_ru: 'доступно для SDK_INT >= 23' + - name: isDirty + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: isDrawingCacheEnabled + args: '' + desc: '' + desc_ru: '' + - name: isDuplicateParentStateEnabled + args: '' + desc: '' + desc_ru: '' + - name: isEnabled + args: '' + desc: '' + desc_ru: '' + - name: isFocusable + args: '' + desc: '' + desc_ru: '' + - name: isFocusableInTouchMode + args: '' + desc: '' + desc_ru: '' + - name: isFocused + args: '' + desc: '' + desc_ru: '' + - name: isHapticFeedbackEnabled + args: '' + desc: '' + desc_ru: '' + - name: isHardwareAccelerated + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: isHorizontalFadingEdgeEnabled + args: '' + desc: '' + desc_ru: '' + - name: isHorizontalScrollBarEnabled + args: '' + desc: '' + desc_ru: '' + - name: isHovered + args: '' + desc: 'available for SDK_INT >= 14' + desc_ru: 'доступно для SDK_INT >= 14' + - name: isImportantForAccessibility + args: '' + desc: 'available for SDK_INT >= 21' + desc_ru: 'доступно для SDK_INT >= 21' + - name: isInEditMode + args: '' + desc: '' + desc_ru: '' + - name: isInLayout + args: '' + desc: 'available for SDK_INT >= 18' + desc_ru: 'доступно для SDK_INT >= 18' + - name: isInTouchMode + args: '' + desc: '' + desc_ru: '' + - name: isLaidOut + args: '' + desc: 'available for SDK_INT >= 19' + desc_ru: 'доступно для SDK_INT >= 19' + - name: isLayoutDirectionResolved + args: '' + desc: 'available for SDK_INT >= 19' + desc_ru: 'доступно для SDK_INT >= 19' + - name: isLayoutRequested + args: '' + desc: '' + desc_ru: '' + - name: isLongClickable + args: '' + desc: '' + desc_ru: '' + - name: isNestedScrollingEnabled + args: '' + desc: 'available for SDK_INT >= 21' + desc_ru: 'доступно для SDK_INT >= 21' + - name: isOpaque + args: '' + desc: '' + desc_ru: '' + - name: isPaddingRelative + args: '' + desc: 'available for SDK_INT >= 17' + desc_ru: 'доступно для SDK_INT >= 17' + - name: isPressed + args: '' + desc: '' + desc_ru: '' + - name: isSaveEnabled + args: '' + desc: '' + desc_ru: '' + - name: isSaveFromParentEnabled + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: isScrollContainer + args: '' + desc: 'available for SDK_INT >= 16' + desc_ru: 'доступно для SDK_INT >= 16' + - name: isScrollbarFadingEnabled + args: '' + desc: '' + desc_ru: '' + - name: isSelected + args: '' + desc: '' + desc_ru: '' + - name: isShown + args: '' + desc: '' + desc_ru: '' + - name: isSoundEffectsEnabled + args: '' + desc: '' + desc_ru: '' + - name: isTextAlignmentResolved + args: '' + desc: 'available for SDK_INT >= 19' + desc_ru: 'доступно для SDK_INT >= 19' + - name: isTextDirectionResolved + args: '' + desc: 'available for SDK_INT >= 19' + desc_ru: 'доступно для SDK_INT >= 19' + - name: isVerticalFadingEdgeEnabled + args: '' + desc: '' + desc_ru: '' + - name: isVerticalScrollBarEnabled + args: '' + desc: '' + desc_ru: '' + - name: jumpDrawablesToCurrentState + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: offsetLeftAndRight + args: '' + desc: '' + desc_ru: '' + - name: offsetTopAndBottom + args: '' + desc: '' + desc_ru: '' + - name: onClick + args: '' + desc: '' + desc_ru: '' + - name: onFocusChange + args: '' + desc: '' + desc_ru: '' + - name: onKey + args: '' + desc: '' + desc_ru: '' + - name: onLongClick + args: '' + desc: '' + desc_ru: '' + - name: performClick + args: '' + desc: '' + desc_ru: '' + - name: performHapticFeedback + args: '' + desc: '' + desc_ru: '' + - name: performLongClick + args: '' + desc: '' + desc_ru: '' + - name: playSoundEffect + args: '' + desc: '' + desc_ru: '' + - name: post + args: '' + desc: '' + desc_ru: '' + - name: postDelayed + args: '' + desc: '' + desc_ru: '' + - name: postInvalidate + args: '' + desc: '' + desc_ru: '' + - name: refreshDrawableState + args: '' + desc: '' + desc_ru: '' + - name: requestFocus + args: '' + desc: '' + desc_ru: '' + - name: requestFocusFromTouch + args: '' + desc: '' + desc_ru: '' + - name: requestLayout + args: '' + desc: '' + desc_ru: '' + - name: scrollBy + args: '' + desc: '' + desc_ru: '' + - name: scrollTo + args: '' + desc: '' + desc_ru: '' + - name: sendAccessibilityEvent + args: '' + desc: '' + desc_ru: '' + - name: setActivated + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: setAlpha + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: setBackground + args: '' + desc: '' + desc_ru: '' + - name: setBackgroundColor + args: '' + desc: '' + desc_ru: '' + - name: setBackgroundDrawable + args: '' + desc: '' + desc_ru: '' + - name: setBackgroundResource + args: '' + desc: '' + desc_ru: '' + - name: setBottom + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: setCameraDistance + args: '' + desc: 'available for SDK_INT >= 12' + desc_ru: 'доступно для SDK_INT >= 12' + - name: setClickable + args: '' + desc: '' + desc_ru: '' + - name: setClipToOutline + args: '' + desc: 'available for SDK_INT >= 21' + desc_ru: 'доступно для SDK_INT >= 21' + - name: setContentDescription + args: '' + desc: '' + desc_ru: '' + - name: setContextClickable + args: '' + desc: 'available for SDK_INT >= 23' + desc_ru: 'доступно для SDK_INT >= 23' + - name: setDrawingCacheBackgroundColor + args: '' + desc: '' + desc_ru: '' + - name: setDrawingCacheEnabled + args: '' + desc: '' + desc_ru: '' + - name: setDrawingCacheQuality + args: '' + desc: '' + desc_ru: '' + - name: setDuplicateParentStateEnabled + args: '' + desc: '' + desc_ru: '' + - name: setEnabled + args: '' + desc: '' + desc_ru: '' + - name: setFadingEdgeLength + args: '' + desc: '' + desc_ru: '' + - name: setFilterTouchesWhenObscured + args: '' + desc: '' + desc_ru: '' + - name: setFitsSystemWindows + args: '' + desc: 'available for SDK_INT >= 14' + desc_ru: 'доступно для SDK_INT >= 14' + - name: setFocusable + args: '' + desc: '' + desc_ru: '' + - name: setFocusableInTouchMode + args: '' + desc: '' + desc_ru: '' + - name: setForeground + args: '' + desc: '' + desc_ru: '' + - name: setHapticFeedbackEnabled + args: '' + desc: '' + desc_ru: '' + - name: setHorizontalFadingEdgeEnabled + args: '' + desc: '' + desc_ru: '' + - name: setHorizontalScrollBarEnabled + args: '' + desc: '' + desc_ru: '' + - name: setHovered + args: '' + desc: 'available for SDK_INT >= 14' + desc_ru: 'доступно для SDK_INT >= 14' + - name: setId + args: '' + desc: '' + desc_ru: '' + - name: setImportantForAccessibility + args: '' + desc: 'available for SDK_INT >= 16' + desc_ru: 'доступно для SDK_INT >= 16' + - name: setKeepScreenOn + args: '' + desc: '' + desc_ru: '' + - name: setLabelFor + args: '' + desc: 'available for SDK_INT >= 17' + desc_ru: 'доступно для SDK_INT >= 17' + - name: setLayoutDirection + args: '' + desc: 'available for SDK_INT >= 17' + desc_ru: 'доступно для SDK_INT >= 17' + - name: setLeft + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: setLongClickable + args: '' + desc: '' + desc_ru: '' + - name: setMinimumHeight + args: '' + desc: '' + desc_ru: '' + - name: setMinimumWidth + args: '' + desc: '' + desc_ru: '' + - name: setNestedScrollingEnabled + args: '' + desc: 'available for SDK_INT >= 21' + desc_ru: 'доступно для SDK_INT >= 21' + - name: setNextFocusDownId + args: '' + desc: '' + desc_ru: '' + - name: setNextFocusForwardId + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: setNextFocusLeftId + args: '' + desc: '' + desc_ru: '' + - name: setNextFocusRightId + args: '' + desc: '' + desc_ru: '' + - name: setNextFocusUpId + args: '' + desc: '' + desc_ru: '' + - name: setOnClickListener + args: '' + desc: '' + desc_ru: '' + - name: setOnFocusChangeListener + args: '' + desc: '' + desc_ru: '' + - name: setOnKeyListener + args: '' + desc: '' + desc_ru: '' + - name: setOnLongClickListener + args: '' + desc: '' + desc_ru: '' + - name: setOverScrollMode + args: '' + desc: '' + desc_ru: '' + - name: setPadding + args: '' + desc: '' + desc_ru: '' + - name: setPaddingRelative + args: '' + desc: 'available for SDK_INT >= 17' + desc_ru: 'доступно для SDK_INT >= 17' + - name: setPivotX + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: setPivotY + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: setPressed + args: '' + desc: '' + desc_ru: '' + - name: setRight + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: setRotation + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: setRotationX + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: setRotationY + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: setSaveEnabled + args: '' + desc: '' + desc_ru: '' + - name: setSaveFromParentEnabled + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: setScaleX + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: setScaleY + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: setScrollBarDefaultDelayBeforeFade + args: '' + desc: 'available for SDK_INT >= 16' + desc_ru: 'доступно для SDK_INT >= 16' + - name: setScrollBarFadeDuration + args: '' + desc: 'available for SDK_INT >= 16' + desc_ru: 'доступно для SDK_INT >= 16' + - name: setScrollBarSize + args: '' + desc: 'available for SDK_INT >= 16' + desc_ru: 'доступно для SDK_INT >= 16' + - name: setScrollBarStyle + args: '' + desc: '' + desc_ru: '' + - name: setScrollContainer + args: '' + desc: '' + desc_ru: '' + - name: setScrollX + args: '' + desc: 'available for SDK_INT >= 14' + desc_ru: 'доступно для SDK_INT >= 14' + - name: setScrollY + args: '' + desc: 'available for SDK_INT >= 14' + desc_ru: 'доступно для SDK_INT >= 14' + - name: setSelected + args: '' + desc: '' + desc_ru: '' + - name: setSoundEffectsEnabled + args: '' + desc: '' + desc_ru: '' + - name: setSystemUiVisibility + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: setTag + args: '' + desc: '' + desc_ru: '' + - name: setTextAlignment + args: '' + desc: 'available for SDK_INT >= 17' + desc_ru: 'доступно для SDK_INT >= 17' + - name: setTextDirection + args: '' + desc: 'available for SDK_INT >= 17' + desc_ru: 'доступно для SDK_INT >= 17' + - name: setTop + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: setTranslationX + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: setTranslationY + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: setTranslationZ + args: '' + desc: 'available for SDK_INT >= 21' + desc_ru: 'доступно для SDK_INT >= 21' + - name: setVerticalFadingEdgeEnabled + args: '' + desc: '' + desc_ru: '' + - name: setVerticalScrollbarPosition + args: '' + desc: '' + desc_ru: '' + - name: setVisibility + args: '' + desc: '' + desc_ru: '' + - name: setWillNotCacheDrawing + args: '' + desc: '' + desc_ru: '' + - name: setWillNotDraw + args: '' + desc: '' + desc_ru: '' + - name: setX + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: setY + args: '' + desc: 'available for SDK_INT >= 11' + desc_ru: 'доступно для SDK_INT >= 11' + - name: setZ + args: '' + desc: 'available for SDK_INT >= 21' + desc_ru: 'доступно для SDK_INT >= 21' + - name: showContextMenu + args: '' + desc: '' + desc_ru: '' + - name: willNotCacheDrawing + args: '' + desc: '' + desc_ru: '' + - name: willNotDraw + args: '' + desc: '' + desc_ru: '' + - name: TextViewValue + desc: 'Inheritance hierarchy: ViewValue' + desc_ru: 'Иерархия наследования: ViewValue' + functions: + - name: beginBatchEdit + args: '' + desc: '' + desc_ru: '' + - name: endBatchEdit + args: '' + desc: '' + desc_ru: '' + - name: getAutoLinkMask + args: '' + desc: '' + desc_ru: '' + - name: getCompoundDrawablePadding + args: '' + desc: '' + desc_ru: '' + - name: getCompoundPaddingBottom + args: '' + desc: '' + desc_ru: '' + - name: getCompoundPaddingLeft + args: '' + desc: '' + desc_ru: '' + - name: getCompoundPaddingRight + args: '' + desc: '' + desc_ru: '' + - name: getCompoundPaddingTop + args: '' + desc: '' + desc_ru: '' + - name: getCurrentHintTextColor + args: '' + desc: '' + desc_ru: '' + - name: getCurrentTextColor + args: '' + desc: '' + desc_ru: '' + - name: getEditableText + args: '' + desc: '' + desc_ru: '' + - name: getEllipsize + args: '' + desc: '' + desc_ru: '' + - name: getError + args: '' + desc: '' + desc_ru: '' + - name: getExtendedPaddingBottom + args: '' + desc: '' + desc_ru: '' + - name: getExtendedPaddingTop + args: '' + desc: '' + desc_ru: '' + - name: getFreezesText + args: '' + desc: '' + desc_ru: '' + - name: getGravity + args: '' + desc: '' + desc_ru: '' + - name: getHighlightColor + args: '' + desc: '' + desc_ru: '' + - name: getHint + args: '' + desc: '' + desc_ru: '' + - name: getImeActionId + args: '' + desc: '' + desc_ru: '' + - name: getImeActionLabel + args: '' + desc: '' + desc_ru: '' + - name: getImeOptions + args: '' + desc: '' + desc_ru: '' + - name: getInputType + args: '' + desc: '' + desc_ru: '' + - name: getLineCount + args: '' + desc: '' + desc_ru: '' + - name: getLineHeight + args: '' + desc: '' + desc_ru: '' + - name: getLinksClickable + args: '' + desc: '' + desc_ru: '' + - name: getSelectionEnd + args: '' + desc: '' + desc_ru: '' + - name: getSelectionStart + args: '' + desc: '' + desc_ru: '' + - name: getText + args: '' + desc: '' + desc_ru: '' + - name: getTextScaleX + args: '' + desc: '' + desc_ru: '' + - name: getTextSize + args: '' + desc: '' + desc_ru: '' + - name: getTotalPaddingBottom + args: '' + desc: '' + desc_ru: '' + - name: getTotalPaddingLeft + args: '' + desc: '' + desc_ru: '' + - name: getTotalPaddingRight + args: '' + desc: '' + desc_ru: '' + - name: getTotalPaddingTop + args: '' + desc: '' + desc_ru: '' + - name: hasSelection + args: '' + desc: '' + desc_ru: '' + - name: isCursorVisible + args: '' + desc: '' + desc_ru: '' + - name: isInputMethodTarget + args: '' + desc: '' + desc_ru: '' + - name: isSuggestionsEnabled + args: '' + desc: '' + desc_ru: '' + - name: isTextSelectable + args: '' + desc: '' + desc_ru: '' + - name: length + args: '' + desc: '' + desc_ru: '' + - name: moveCursorToVisibleOffset + args: '' + desc: '' + desc_ru: '' + - name: setAllCaps + args: '' + desc: '' + desc_ru: '' + - name: setAutoLinkMask + args: '' + desc: '' + desc_ru: '' + - name: setBreakStrategy + args: '' + desc: '' + desc_ru: '' + - name: setCompoundDrawablePadding + args: '' + desc: '' + desc_ru: '' + - name: setCompoundDrawables + args: '' + desc: '' + desc_ru: '' + - name: setCursorVisible + args: '' + desc: '' + desc_ru: '' + - name: setEllipsize + args: '' + desc: '' + desc_ru: '' + - name: setEms + args: '' + desc: '' + desc_ru: '' + - name: setError + args: '' + desc: '' + desc_ru: '' + - name: setFreezesText + args: '' + desc: '' + desc_ru: '' + - name: setGravity + args: '' + desc: '' + desc_ru: '' + - name: setHeight + args: '' + desc: '' + desc_ru: '' + - name: setHighlightColor + args: '' + desc: '' + desc_ru: '' + - name: setHint + args: '' + desc: '' + desc_ru: '' + - name: setHintTextColor + args: '' + desc: '' + desc_ru: '' + - name: setHorizontallyScrolling + args: '' + desc: '' + desc_ru: '' + - name: setImeOptions + args: '' + desc: '' + desc_ru: '' + - name: setInputType + args: '' + desc: '' + desc_ru: '' + - name: setLines + args: '' + desc: '' + desc_ru: '' + - name: setLinkTextColor + args: '' + desc: '' + desc_ru: '' + - name: setLinksClickable + args: '' + desc: '' + desc_ru: '' + - name: setMaxEms + args: '' + desc: '' + desc_ru: '' + - name: setMaxHeight + args: '' + desc: '' + desc_ru: '' + - name: setMaxLines + args: '' + desc: '' + desc_ru: '' + - name: setMaxWidth + args: '' + desc: '' + desc_ru: '' + - name: setMinEms + args: '' + desc: '' + desc_ru: '' + - name: setMinHeight + args: '' + desc: '' + desc_ru: '' + - name: setMinLines + args: '' + desc: '' + desc_ru: '' + - name: setMinWidth + args: '' + desc: '' + desc_ru: '' + - name: setPaintFlags + args: '' + desc: '' + desc_ru: '' + - name: setRawInputType + args: '' + desc: '' + desc_ru: '' + - name: setSelectAllOnFocus + args: '' + desc: '' + desc_ru: '' + - name: setSingleLine + args: '' + desc: '' + desc_ru: '' + - name: setText + args: '' + desc: '' + desc_ru: '' + - name: setTextColor + args: '' + desc: '' + desc_ru: '' + - name: setTextIsSelectable + args: '' + desc: '' + desc_ru: '' + - name: setTextScaleX + args: '' + desc: '' + desc_ru: '' + - name: setTextSize + args: '' + desc: '' + desc_ru: '' + - name: setWidth + args: '' + desc: '' + desc_ru: '' + - name: EditTextValue + desc: 'Inheritance hierarchy: TextViewValue < ViewValue' + desc_ru: 'Иерархия наследования: TextViewValue < ViewValue' + functions: + - name: extendSelection + args: '' + desc: '' + desc_ru: '' + - name: selectAll + args: '' + desc: '' + desc_ru: '' + - name: setSelection + args: '' + desc: '' + desc_ru: '' + - name: ButtonValue + desc: 'Inheritance hierarchy: TextViewValue < ViewValue' + desc_ru: 'Иерархия наследования: TextViewValue < ViewValue' + functions: [] + - name: CompoundButtonValue + desc: 'Inheritance hierarchy: ButtonValue < TextViewValue < ViewValue' + desc_ru: 'Иерархия наследования: ButtonValue < TextViewValue < ViewValue' + functions: + - name: isChecked + args: '' + desc: '' + desc_ru: '' + - name: onCheck + args: '' + desc: '' + desc_ru: '' + - name: setButtonDrawable + args: '' + desc: '' + desc_ru: '' + - name: setChecked + args: '' + desc: '' + desc_ru: '' + - name: toggle + args: '' + desc: '' + desc_ru: '' + - name: ToggleButtonValue + desc: 'Inheritance hierarchy: CompoundButtonValue < ButtonValue < TextViewValue < ViewValue' + desc_ru: 'Иерархия наследования: CompoundButtonValue < ButtonValue < TextViewValue < ViewValue' + functions: + - name: getTextOff + args: '' + desc: '' + desc_ru: '' + - name: getTextOn + args: '' + desc: '' + desc_ru: '' + - name: setTextOff + args: '' + desc: '' + desc_ru: '' + - name: setTextOn + args: '' + desc: '' + desc_ru: '' + - name: SwitchValue + desc: 'Inheritance hierarchy: CompoundButtonValue < ButtonValue < TextViewValue < ViewValue' + desc_ru: 'Иерархия наследования: CompoundButtonValue < ButtonValue < TextViewValue < ViewValue' + functions: + - name: getTextOff + args: '' + desc: '' + desc_ru: '' + - name: getTextOn + args: '' + desc: '' + desc_ru: '' + - name: setTextOff + args: '' + desc: '' + desc_ru: '' + - name: setTextOn + args: '' + desc: '' + desc_ru: '' + - name: ImageViewValue + desc: 'Inheritance hierarchy: ViewValue' + desc_ru: 'Иерархия наследования: ViewValue' + functions: + - name: clearColorFilter + args: '' + desc: '' + desc_ru: '' + - name: getScaleType + args: '' + desc: '' + desc_ru: '' + - name: setAdjustViewBounds + args: '' + desc: '' + desc_ru: '' + - name: setColorFilter + args: '' + desc: '' + desc_ru: '' + - name: setImageAlpha + args: '' + desc: '' + desc_ru: '' + - name: setImageBitmap + args: '' + desc: '' + desc_ru: '' + - name: setImageDrawable + args: '' + desc: '' + desc_ru: '' + - name: setImageLevel + args: '' + desc: '' + desc_ru: '' + - name: setImageResource + args: '' + desc: '' + desc_ru: '' + - name: setImageURI + args: '' + desc: '' + desc_ru: '' + - name: setMaxHeight + args: '' + desc: '' + desc_ru: '' + - name: setMaxWidth + args: '' + desc: '' + desc_ru: '' + - name: setScaleType + args: '' + desc: '' + desc_ru: '' + - name: ImageButtonValue + desc: 'Inheritance hierarchy: ImageViewValue < ViewValue' + desc_ru: 'Иерархия наследования: ImageViewValue < ViewValue' + functions: [] + - name: ViewGroupValue + desc: 'Inheritance hierarchy: ViewValue' + desc_ru: 'Иерархия наследования: ViewValue' + functions: + - name: addView + args: '' + desc: '' + desc_ru: '' + - name: bringChildToFront + args: '' + desc: '' + desc_ru: '' + - name: clearChildFocus + args: '' + desc: '' + desc_ru: '' + - name: getChildAt + args: '' + desc: '' + desc_ru: '' + - name: getChildCount + args: '' + desc: '' + desc_ru: '' + - name: indexOfChild + args: '' + desc: '' + desc_ru: '' + - name: recomputeViewAttributes + args: '' + desc: '' + desc_ru: '' + - name: removeAllViews + args: '' + desc: '' + desc_ru: '' + - name: removeAllViewsInLayout + args: '' + desc: '' + desc_ru: '' + - name: removeView + args: '' + desc: '' + desc_ru: '' + - name: removeViewAt + args: '' + desc: '' + desc_ru: '' + - name: removeViewInLayout + args: '' + desc: '' + desc_ru: '' + - name: LinearLayoutValue + desc: 'Inheritance hierarchy: ViewGroupValue < ViewValue' + desc_ru: 'Иерархия наследования: ViewGroupValue < ViewValue' + functions: + - name: getOrientation + args: '' + desc: '' + desc_ru: '' + - name: getWeightSum + args: '' + desc: '' + desc_ru: '' + - name: setGravity + args: '' + desc: '' + desc_ru: '' + - name: setHorizontalGravity + args: '' + desc: '' + desc_ru: '' + - name: setOrientation + args: '' + desc: '' + desc_ru: '' + - name: setVerticalGravity + args: '' + desc: '' + desc_ru: '' + - name: setWeightSum + args: '' + desc: '' + desc_ru: '' + - name: RelativeLayoutValue + desc: 'Inheritance hierarchy: ViewGroupValue < ViewValue' + desc_ru: 'Иерархия наследования: ViewGroupValue < ViewValue' + functions: + - name: getGravity + args: '' + desc: '' + desc_ru: '' + - name: setGravity + args: '' + desc: '' + desc_ru: '' + - name: setHorizontalGravity + args: '' + desc: '' + desc_ru: '' + - name: setIgnoreGravity + args: '' + desc: '' + desc_ru: '' + - name: setVerticalGravity + args: '' + desc: '' + desc_ru: '' + - name: FrameLayoutValue + desc: 'Inheritance hierarchy: ViewGroupValue < ViewValue' + desc_ru: 'Иерархия наследования: ViewGroupValue < ViewValue' + functions: [] + - name: ScrollViewValue + desc: 'Inheritance hierarchy: FrameLayoutValue < ViewGroupValue < ViewValue' + desc_ru: 'Иерархия наследования: FrameLayoutValue < ViewGroupValue < ViewValue' + functions: + - name: isFillViewport + args: '' + desc: '' + desc_ru: '' + - name: isSmoothScrollingEnabled + args: '' + desc: '' + desc_ru: '' + - name: setFillViewport + args: '' + desc: '' + desc_ru: '' + - name: setSmoothScrollingEnabled + args: '' + desc: '' + desc_ru: '' + - name: AdapterViewValue + desc: 'Inheritance hierarchy: ViewGroupValue < ViewValue' + desc_ru: 'Иерархия наследования: ViewGroupValue < ViewValue' + functions: + - name: getAdapter + args: '' + desc: '' + desc_ru: '' + - name: getCount + args: '' + desc: '' + desc_ru: '' + - name: getEmptyView + args: '' + desc: '' + desc_ru: '' + - name: getFirstVisiblePosition + args: '' + desc: '' + desc_ru: '' + - name: getItemAtPosition + args: '' + desc: '' + desc_ru: '' + - name: getItemIdAtPosition + args: '' + desc: '' + desc_ru: '' + - name: getLastVisiblePosition + args: '' + desc: '' + desc_ru: '' + - name: getPositionForView + args: '' + desc: '' + desc_ru: '' + - name: getSelectedItem + args: '' + desc: '' + desc_ru: '' + - name: getSelectedItemId + args: '' + desc: '' + desc_ru: '' + - name: getSelectedItemPosition + args: '' + desc: '' + desc_ru: '' + - name: getSelectedView + args: '' + desc: '' + desc_ru: '' + - name: onItemClick + args: '' + desc: '' + desc_ru: '' + - name: onItemLongClick + args: '' + desc: '' + desc_ru: '' + - name: onItemSelected + args: '' + desc: '' + desc_ru: '' + - name: performItemClick + args: '' + desc: '' + desc_ru: '' + - name: setAdapter + args: '' + desc: '' + desc_ru: '' + - name: setEmptyView + args: '' + desc: '' + desc_ru: '' + - name: ListViewValue + desc: 'Inheritance hierarchy: AdapterViewValue < ViewGroupValue < ViewValue' + desc_ru: 'Иерархия наследования: AdapterViewValue < ViewGroupValue < ViewValue' + functions: + - name: addFooterView + args: '' + desc: '' + desc_ru: '' + - name: addHeaderView + args: '' + desc: '' + desc_ru: '' + - name: getDividerHeight + args: '' + desc: '' + desc_ru: '' + - name: getFooterViewsCount + args: '' + desc: '' + desc_ru: '' + - name: getHeaderViewsCount + args: '' + desc: '' + desc_ru: '' + - name: getItemsCanFocus + args: '' + desc: '' + desc_ru: '' + - name: getMaxScrollAmount + args: '' + desc: '' + desc_ru: '' + - name: removeFooterView + args: '' + desc: '' + desc_ru: '' + - name: removeHeaderView + args: '' + desc: '' + desc_ru: '' + - name: setCacheColorHint + args: '' + desc: '' + desc_ru: '' + - name: setDividerHeight + args: '' + desc: '' + desc_ru: '' + - name: setFooterDividersEnabled + args: '' + desc: '' + desc_ru: '' + - name: setHeaderDividersEnabled + args: '' + desc: '' + desc_ru: '' + - name: setItemsCanFocus + args: '' + desc: '' + desc_ru: '' + - name: setSelection + args: '' + desc: '' + desc_ru: '' + - name: setSelectionAfterHeaderView + args: '' + desc: '' + desc_ru: '' + - name: smoothScrollToPosition + args: '' + desc: '' + desc_ru: '' + - name: RadioGroupValue + desc: 'Inheritance hierarchy: LinearLayoutValue < ViewGroupValue < ViewValue' + desc_ru: 'Иерархия наследования: LinearLayoutValue < ViewGroupValue < ViewValue' + functions: + - name: check + args: '' + desc: '' + desc_ru: '' + - name: clearCheck + args: '' + desc: '' + desc_ru: '' + - name: getCheckedRadioButtonId + args: '' + desc: '' + desc_ru: '' + - name: onCheck + args: '' + desc: '' + desc_ru: '' + - name: setOnCheckedChangeListener + args: '' + desc: '' + desc_ru: '' + - name: ProgressBarValue + desc: 'Inheritance hierarchy: ViewValue' + desc_ru: 'Иерархия наследования: ViewValue' + functions: + - name: getMax + args: '' + desc: '' + desc_ru: '' + - name: getProgress + args: '' + desc: '' + desc_ru: '' + - name: getSecondaryProgress + args: '' + desc: '' + desc_ru: '' + - name: incrementProgressBy + args: '' + desc: '' + desc_ru: '' + - name: incrementSecondaryProgressBy + args: '' + desc: '' + desc_ru: '' + - name: setIndeterminate + args: '' + desc: '' + desc_ru: '' + - name: setIndeterminateDrawable + args: '' + desc: '' + desc_ru: '' + - name: setMax + args: '' + desc: '' + desc_ru: '' + - name: setProgress + args: '' + desc: '' + desc_ru: '' + - name: setProgressDrawable + args: '' + desc: '' + desc_ru: '' + - name: setSecondaryProgress + args: '' + desc: '' + desc_ru: '' + - name: SeekBarValue + desc: 'Inheritance hierarchy: ProgressBarValue < ViewValue' + desc_ru: 'Иерархия наследования: ProgressBarValue < ViewValue' + functions: + - name: getKeyProgressIncrement + args: '' + desc: '' + desc_ru: '' + - name: getThumbOffset + args: '' + desc: '' + desc_ru: '' + - name: onSeekBarChange + args: '' + desc: '' + desc_ru: '' + - name: setKeyProgressIncrement + args: '' + desc: '' + desc_ru: '' + - name: setOnSeekBarChangeListener + args: '' + desc: '' + desc_ru: '' + - name: setThumb + args: '' + desc: '' + desc_ru: '' + - name: setThumbOffset + args: '' + desc: '' + desc_ru: '' + - name: AdapterValue + functions: + - name: getCount + args: '' + desc: '' + desc_ru: '' + - name: getItem + args: '' + desc: '' + desc_ru: '' + - name: getItemId + args: '' + desc: '' + desc_ru: '' + - name: getItemViewType + args: '' + desc: '' + desc_ru: '' + - name: getView + args: '' + desc: '' + desc_ru: '' + - name: getViewTypeCount + args: '' + desc: '' + desc_ru: '' + - name: hasStableIds + args: '' + desc: '' + desc_ru: '' + - name: isEmpty + args: '' + desc: '' + desc_ru: '' + - name: ListAdapterValue + desc: 'Inheritance hierarchy: AdapterValue' + desc_ru: 'Иерархия наследования: AdapterValue' + functions: + - name: areAllItemsEnabled + args: '' + desc: '' + desc_ru: '' + - name: isEnabled + args: '' + desc: '' + desc_ru: '' \ No newline at end of file diff --git a/docs/src/modules/functional.yml b/docs/src/modules/functional.yml new file mode 100644 index 00000000..3ab6bba8 --- /dev/null +++ b/docs/src/modules/functional.yml @@ -0,0 +1,266 @@ +name: functional +scope: "both" +desc: "Contains functions for operating data in functional style" +desc_ru: "Содержит функции для работы с данными в функциональном стиле" +constants: + - name: "IDENTITY" + typeName: "function" + type: 5 + value: "def(x) = x" + desc: "function which returns passed argument" + desc_ru: "функция, которая возвращает переданный в неё аргумент" +functions: + - name: chain + args: "data, functions..." + desc: "" + desc_ru: "" + - name: combine + args: "functions..." + desc: "combines functions" + desc_ru: "комбинирует функции (композиция)" + example: |- + use functional + + def f1() = 2 + def f2(a) = a*2 + def f3(a) = a/4 + + f = combine(::f1, ::f2, ::f3) + println f() // 1 + // same as + f = def() = f3(f2(f1())) + println f() // 1 + example_ru: |- + use functional + + def f1() = 2 + def f2(a) = a*2 + def f3(a) = a/4 + + f = combine(::f1, ::f2, ::f3) + println f() // 1 + // равносильно + f = def() = f3(f2(f1())) + println f() // 1 + - name: dropwhile + args: 'data, predicate' + desc: 'skips elements while predicate function returns true' + desc_ru: 'пропускает элементы пока функция-предикат возвращает true' + - name: "filter" + args: "data, predicate" + desc: "filters array or object.\n\n`predicate` is a function which takes one argument for arrays or two arguments for objects" + desc_ru: "фильтрует массив или объект и возвращает массив только с теми элементами, которые удовлетворяют предикату `predicate`.\n\n`predicate` - функция которая принимает один (для массивов) и два (для объектов) аргумента" + example: |- + use functional + + nums = [1,2,3,4,5] + print filter(nums, def(x) = x % 2 == 0) // [2, 4] + - name: flatmap + args: "array, mapper" + desc: "converts each element of an array to other array" + desc_ru: "преобразует каждый элемент массива в массив элементов" + example: |- + use functional + + nums = [1,2,3,4] + print flatmap(nums, def(x) { + arr = newarray(x) + for i = 0, i < x, i++ + arr[i] = x + return arr + }) // [1, 2, 2, 3, 3, 3, 4, 4, 4, 4] + - name: foreach + args: "data, consumer" + desc: "invokes function `consumer` for each element of array or map `data`\n\nIf `data` - массив, то в функции consumer необходим один параметр, если объект - два (ключ и значение)." + desc_ru: "для каждого элемента в массиве или объекте `data` вызывает функцию `consumer`\n\nЕсли `data` - массив, то в функции `consumer` необходим один параметр, если объект - два (ключ и значение)." + example: |- + use functional + + foreach([1, 2, 3], def(v) { print v }) + foreach({"key": 1, "key2": "text"}, def(key, value) { + print key + ": " + value + }) + - name: map + args: "data, mapper..." + desc: "converts elements of array or map. If `data` is array - `mapper` converts his elements, if `data` is object - you need to pass `keyMapper` - converts keys and `valueMapper` - converts values" + desc_ru: "преобразует элементы массива или объекта.\n\nЕсли `data` - массив, то функция `mapper` преобразует значения, если объект - необходимо передать две функции: `keyMapper` - преобразует ключи и `valueMapper` - преобразует значения" + example: |- + use functional + + nums = [3,4,5] + print map(nums, def(x) = x * x) // [9, 16, 25] + - name: reduce + args: "data, identity, accumulator" + desc: "converts elements of an array or a map to one value, e.g. sum of elements or concatenation string. `accumulator` takes one argument for array and two arguments for object (key and value)." + desc_ru: "преобразует элементы массива или объекта в одно значение, например сумма элементов или объединение в строку.\n\nЕсли `data` - массив, то в функции `accumulator` необходим один параметр, если объект - два (ключ и значение)" + example: |- + use functional + + nums = [1,2,3,4,5] + print reduce(nums, 0, def(x, y) = x + y) // 15 + - name: sortby + args: "array, function" + desc: "sorts elements of an array or a map by `function` result" + desc_ru: "сортирует элементы массива или объекта по данным в функции `function`" + example: |- + use functional + + data = [ + {"k1": 2, "k2": "x"}, + {"k1": 7, "k2": "d"}, + {"k1": 4, "k2": "z"}, + {"k1": 5, "k2": "p"}, + ] + println sortby(data, def(v) = v.k1) // [{k1=2, k2=x}, {k1=4, k2=z}, {k1=5, k2=p}, {k1=7, k2=d}] + println sortby(data, def(v) = v.k2) // [{k1=7, k2=d}, {k1=5, k2=p}, {k1=2, k2=x}, {k1=4, k2=z}] + - name: groupby + args: "data, function" + desc: "groups elements of an array or a map by `function` result" + desc_ru: "группирует элементы массива или объекта на основе результата функции `function`" + since: 2.0.0 + example: |- + use functional + + data = [ + {"k1": 2, "k2": "x"}, + {"k1": 4, "k2": "z"}, + {"k1": 5, "k2": "p"}, + ] + println groupby(data, def(e) = e.k1) // {"2"=[{k1=2, k2=x}], "4"=[{k1=4, k2=z}], "5"=[{k2=p, k1=5}]} + println groupby(data, def(e) = e.k2) // {"x"=[{k1=2, k2=x}], "z"=[{k1=4, k2=z}], "p"=[{k2=p, k1=5}]} + - name: tomap + args: "data, keyMapper, valueMapper = def(v) = v, merger = def(oldValue, newValue) = newValue" + desc: "converts elements of an array or a map to a map based on `keyMapper` and `valueMapper` functions result. `merger` function resolves collisions" + desc_ru: "преобразует элементы массива или объекта в объект, основываясь на результате функций `keyMapper` и `valueMapper`. Функция `merger` используется для разрешения коллизий" + since: 2.0.0 + example: |- + use functional + + data = ["apple", "banana"] + println tomap(data, def(str) = str.substring(0, 1)) // {"a": "apple", "b": "banana"} + println tomap(data, def(str) = str.substring(0, 1), ::toUpperCase) // {"a": "APPLE", "b": "BANANA"} + - name: stream + args: data + desc: creates stream from data and returns `StreamValue` + desc_ru: создаёт stream из данных и возвращает `StreamValue` + - name: takewhile + args: 'data, predicate' + desc: 'takes elements while predicate function returns true' + desc_ru: 'собирает элементы пока функция-предикат возвращает true' +types: + - name: StreamValue + functions: + - name: filter + args: func + desc: filters elements based on predicate function result (true - remain, false - drop) + desc_ru: фильтрует элементы на основе результата функции-предиката (true - оставить, false - убрать) + - name: filterNot + args: func + desc: filters elements based on negated predicate function result (false - remain, true - drop) + desc_ru: фильтрует элементы на основе обратного результата функции-предиката (false - оставить, true - убрать) + since: 2.0.0 + - name: map + args: func + desc: converts each element + desc_ru: преобразует каждый элемент + - name: flatMap + args: func + desc: converts each element to array + desc_ru: преобразует каждый элемент в массив + - name: sorted + args: func + desc: sorts elements with comparator function + desc_ru: сортирует элементы в соответствии с функцией-компаратором + - name: sortBy + args: func + desc: applies function, then sorts elements + desc_ru: применяет функцию, затем сортирует элементы + - name: groupBy + args: func + desc: groups elements based on function result + desc_ru: группирует элементы на основе результата выполнения функции + since: 2.0.0 + - name: takeWhile + args: func + desc: takes elements while predicate function returns true + desc_ru: собирает элементы пока функция-предикат возвращает true + - name: dropWhile + args: func + desc: skips elements while predicate function returns true, returns remaining elements + desc_ru: пропускает элементы пока функция-предикат возвращает true + - name: peek + args: func + desc: executes function for each element and returns stream + desc_ru: вызывает функцию для каждого элемента и возвращает stream + - name: skip + args: count + desc: skips `count` elements + desc_ru: пропускает указанное количество элементов + - name: limit + args: count + desc: limits elements size + desc_ru: ограничивает количество элементов + - name: custom + args: func + desc: performs custom operation + desc_ru: выполняет пользовательскую операцию над данными + example: |- + use std, functional + + println stream([1, 2, 3, 4]) + .custom(::reverse) + .toArray() + + def reverse(container) { + size = length(container) + result = newarray(size) + for i : range(size) { + result[size - i - 1] = container[i] + } + return result + } + - name: reduce + args: func + desc: converts elements to one value + desc_ru: преобразует элементы в одно значение + - name: forEach + args: func + desc: executes function for each element + desc_ru: вызывает функцию для каждого элемента + - name: forEachIndexed + args: func + desc: executes function for each element and its index + desc_ru: вызывает функцию для каждого элемента и его порядкового номера + since: 2.0.0 + - name: joining + args: delimiter = "", prefix = "", suffix = "" + desc: joins elements into a string + desc_ru: склеивает элементы в строку + - name: toArray + args: "" + desc: returns array of elements + desc_ru: возвращает массив элементов + - name: toMap + args: "keyMapper, valueMapper = def(v) = v, merger = def(oldValue, newValue) = newValue" + desc: "converts elements to a map based on `keyMapper` and `valueMapper` functions result. `merger` function resolves collisions" + desc_ru: "преобразует элементы в объект, основываясь на результате функций `keyMapper` и `valueMapper`. Функция `merger` используется для разрешения коллизий" + since: 2.0.0 + - name: anyMatch + args: predicate + desc: "returns `true` if there is any element matching the given `predicate`, otherwise returns `false`" + desc_ru: "возвращает `true`, если хотя бы один элемент удовлетворяет функции `predicate`, иначе возвращает `false`" + since: 2.0.0 + - name: allMatch + args: predicate + desc: "returns `true` if all elements match the given `predicate`, otherwise returns `false`" + desc_ru: "возвращает `true`, если все элементы удовлетворяют функции `predicate`, иначе возвращает `false`" + since: 2.0.0 + - name: noneMatch + args: predicate + desc: "returns `true` if no elements match the given `predicate`, otherwise returns `false`" + desc_ru: "возвращает `true`, если нет элементов, удовлетворяющих функции `predicate`, иначе возвращает `false`" + since: 2.0.0 + - name: count + args: "" + desc: returns the elements count + desc_ru: возвращает количество элементов diff --git a/docs/src/modules/gps_android.yml b/docs/src/modules/gps_android.yml new file mode 100644 index 00000000..f1ae79d0 --- /dev/null +++ b/docs/src/modules/gps_android.yml @@ -0,0 +1,45 @@ +name: gps +scope: "android" +desc: |- + Contains functions for working with GPS. +desc_ru: |- + Содержит функции для работы с GPS. +constants: + - name: GPS_PROVIDER + type: 2 + typeName: string + value: gps + - name: NETWORK_PROVIDER + type: 2 + typeName: string + value: network +functions: + - name: isEnabled + args: "provider" + desc: "checks if the given location service provider is enabled" + desc_ru: "проверяет доступность указанного провайдера местоположения" + - name: lastKnownLocation + args: "provider" + desc: "gets last known location with the given location provider, or zero if it is unable to get location" + desc_ru: "получает последнее сохранённое местоположение для указанного провайдера, либо 0, если получить местоположение не удалось" + - name: getProviders + args: "enabledOnly = false" + desc: "returns an array of location providers" + desc_ru: "возвращает массив провайдеров местоположения" + - name: "requestUpdates" + args: "provider, minTime, minDistance, callback" + desc: |- + subscribes to the location listener + desc_ru: |- + подписывается на обработчик получения местоположения + example: |- + use std, gps + + provider = "gps" // or passive, network if exists + // requestUpdates(provider, 0, 25, def(loc) = echo("location changed: ", loc)) + requestUpdates(provider, 10 * 1000, 25, { + "onLocationChanged" : def(loc) = echo("location changed: ", loc) + "onStatusChanged" : def(p, status) = echo("status changed: ", p, " is ", getStatus(status)) + "onProviderEnabled" : def(p) = echo("provider ", p, " is now enabled") + "onProviderDisabled" : def(p) = echo("provider ", p, " is now disabled") + }) diff --git a/docs/src/modules/gzip.yml b/docs/src/modules/gzip.yml new file mode 100644 index 00000000..af290dd9 --- /dev/null +++ b/docs/src/modules/gzip.yml @@ -0,0 +1,43 @@ +name: gzip +since: 1.5.0 +scope: both +desc: "Contains functions for working with gzip compression" +desc_ru: "Содержит функции для работы с gzip компрессией" +constants: [] +functions: + - name: gzip + args: "inputFile, outputFile" + desc: |- + creates a gzip archive with the `inputFile` file and saves to `outputFile`. + Returns 1 if compression was successfull, -1 otherwise. + desc_ru: |- + создаёт gzip архив с файлом `inputFile` и сохраняет в `outputFile`. + Возвращает 1 если компрессия завершилась успешно, и -1 в противном случае. + example: |- + use gzip + gzip("/tmp/readme.md", "/tmp/readme.md.gz") + - name: gzipBytes + args: "bytes" + desc: returns gzip-compressed input bytes. + desc_ru: возвращает сжатый в gzip массив байт. + example: |- + use gzip + bytes = gzipBytes([0, 119, 87, 80/* ... */]) + - name: ungzip + args: "inputFile, outputFile" + desc: |- + unpacks a gzip archive to `outputFile` file. + Returns 1 if operation was successfull, -1 otherwise. + desc_ru: |- + распаковывает gzip архив в файл `outputFile`. + Возвращает 1 если операция завершилась успешно, и -1 в противном случае. + example: |- + use gzip + gzip("/tmp/readme.md.gz", "/tmp/readme.md") + - name: ungzipBytes + args: "bytes" + desc: returns uncompressed bytes. + desc_ru: возвращает распакованный gzip массив байт. + example: |- + use gzip + bytes = ungzipBytes([0, 119, 87, 80/* ... */]) \ No newline at end of file diff --git a/docs/src/modules/http.yml b/docs/src/modules/http.yml new file mode 100644 index 00000000..ed84e7a7 --- /dev/null +++ b/docs/src/modules/http.yml @@ -0,0 +1,95 @@ +name: http +scope: "both" +desc: "Contains network functions" +desc_ru: "Содержит функции для взаимодействия с сетью" +constants: [] +functions: + - name: http + args: "url, ..." + desc: |- + performs GET-request to `url`. + + `http(url, method)` - performs request with `method` (GET, POST, PUT, DELETE, PATCH, OPTIONS) to `url`. + + `http(url, callback)` - performs GET-request to `url`, response will be send to function `callback`. + + `http(url, method, params)` - performs request with given `method` and object `params` to `url`. + + `http(url, method, callback)` - performs request with given `method` to `url`, response will be send to function `callback`. + + `http(url, method, params, callback)` - performs request with given `method` and object `params` to `url`, response will be send to function `callback`. + + `http(url, method, params, options, callback)` - performs request with given `method`, object `params` and connection `options` to `url`, response will be send to function `callback`. + + Connection options is a object (map): + + - `header` - sets http-header (string or array). + - `encoded` - is `params` object already urlencoded. + - `content_type` - sets Content-Type. + - `extended_result` - marks that response should be extended and should contains: + - `text` - server response text + - `message` - server response message + - `code` - server response code + - `headers` - response http-header + - `content_length` - Content-Length + - `content_type` - Content-Type + desc_ru: |- + `http(url)` - выполняет GET-запрос на указанный адрес `url`. + + `http(url, method)` - выполняет запрос на указанный адрес `url` методом method (GET, POST, PUT, DELETE, PATCH, OPTIONS). + + `http(url, callback)` - выполняет GET-запрос на указанный адрес `url`, ответ сервера передаёт в функцию `callback`. + + `http(url, method, params)` - выполняет запрос на указанный адрес `url`, методом `method` c данными `params` (объект). + + `http(url, method, callback)` - выполняет запрос на указанный адрес `url`, методом `method`, ответ сервера передаёт в функцию `callback`. + + `http(url, method, params, callback)` - выполняет запрос на указанный адрес `url`, методом `method`, с данными `params`, ответ сервера передаёт в функцию `callback`. + + `http(url, method, params, options, callback)` - выполняет запрос на указанный адрес `url`, методом `method`, с данными `params`, параметрами подключения `options`, ответ сервера передаёт в функцию `callback`. + + Параметрами подключения выступает объект. Допустимы следующие параметры + + - `header` - задаёт http-заголовок, если передана строка или несколько заголовков, если массив. + - `encoded` - указывает, что данные `params` уже закодированы в URL-формате. + - `content_type` - указывает Content-Type. + - `extended_result` - указывает, что ответ сервера нужно вернуть в расширенном виде, а именно объектом с данными: + - `text` - текст ответа сервера + - `message` - сообщение сервера + - `code` - код ответа сервера + - `headers` - http-заголовки ответа + - `content_length` - Content-Length + - `content_type` - Content-Type + example: |- + use http + http("http://jsonplaceholder.typicode.com/users", "POST", {"name": "OwnLang", "versionCode": 10}, def(v) { + println "Added: " + v + }) + - name: httpSync + args: 'url, method = "GET", requestParams = {}, options = {}' + desc: Synchronous version of `http` function. See above for parameters description. + desc_ru: Синхронная версия функции `http`. См. выше описание параметров. + since: 2.0.0 + example: |- + use http + extract(isOk, content) = httpSync("http://jsonplaceholder.typicode.com/users", "POST", {"name": "OwnLang", "versionCode": 10}) + if (isOk) { + println "Added: " + content + } else { + println "Failure" + } + - name: "download" + args: "url" + desc: "downloads content by url as bytes array" + desc_ru: "получает содержимое по указанному адресу в виде массива байт" + example: |- + use http, files + bytes = download("http://url") + f = fopen("file", "wb") + writeBytes(f, bytes) + flush(f) + fclose(f) + - name: "urlencode" + args: "str" + desc: "converts string to URL-format" + desc_ru: "преобразует строку в URL-формат" \ No newline at end of file diff --git a/docs/src/modules/imageprocessing_android.yml b/docs/src/modules/imageprocessing_android.yml new file mode 100644 index 00000000..f0354425 --- /dev/null +++ b/docs/src/modules/imageprocessing_android.yml @@ -0,0 +1,109 @@ +name: imageprocessing +scope: "android" +desc: |- + Contains functions for image processing. + + You can apply effect in two ways: + + 1. Pass BitmapValue and parameters array. The result will be a BitmapValue. `bitmap = boxBlur(bitmap, [20, 40])` + 2. Pass width, height, pixels array and parameters array. The result will be an array [width, height, pixels]. `extract(width, height, pixels) = boxBlur(w, h, pixels, [20, 40])` +desc_ru: |- + Содержит функции для обработки изображений. + + Применить эффект можно двумя способами: + + 1. Передать BitmapValue и массив параметров. Результатом будет BitmapValue. `bitmap = boxBlur(bitmap, [20, 40])` + 2. Передать ширину, высоту, массив пикселей и массив параметров. Результатом будет массив [ширина, высота, пиксели]. `extract(width, height, pixels) = boxBlur(w, h, pixels, [20, 40])` +functions: + - name: "boxBlur" + args: "horizontalBlur = 10 (min 1, max 100), verticalBlur = 10 (min 1, max 100)" + desc: "applies quick blur effect" + desc_ru: "применяет быстрый эффект размытия" + - name: "contrast" + args: "level = 40 (min -100, max 100)" + desc: "changes contrast of the image" + desc_ru: "изменяет контрастность изображения" + - name: "decolour" + args: "" + desc: "converts color image to grayscale" + desc_ru: "преобразует цветное изображение в оттенки серого" + - name: "edgeDetection" + args: "operator = 1, mode = 0" + desc: |- + applies edge detection effect. + + `operator` 0 - Roberts, 1 - Prewitt, 2 - Sobel, 3 - Scharr + `mode` 0 - color edges, 1 - gray edges, 2 - subtract edges + desc_ru: |- + применяет эффект выделения границ. + + `operator` 0 - оператор Робертса, 1 - Прюитт, 2 - Собеля, 3 - Шарра + `mode` 0 - цветные грани, 1 - чёрно-белые грани, 2 - вычитание границ + - name: "emboss" + args: "azimuth = 45 (min 0, max 360), elevation = 45 (min 0, max 90), edgeHeight = 140 (min 0, max 256), edgeThickness = 80 (min 2, max 100), emboss = 0 (min 0, max 1)" + desc: "applies emboss effect" + desc_ru: "применяет эффект выдавливания" + - name: "extractChannel" + args: "channel = 0, monochrome = 0" + desc: |- + extracts given channel from image. + + `channel` 0 - red, 1 - green, 2 - blue + `monochrome` 0 - off, 1 - on + desc_ru: |- + извлекает заданный канал из изображения. + + `channel` 0 - красный, 1 - зелёный, 2 - синий + `monochrome` конвертировать полученную маску в чёрно-белый, 0 - нет, 1 - да + - name: "gamma" + args: "level = 20 (min -50, max 50)" + desc: "changes gamma of the image" + desc_ru: "изменяет гамму изображения" + - name: "hsbCorrection" + args: "hue = 45 (min 0, max 360), saturation = 0 (min -100, max 100), brightness = 0 (min -100, max 100), tone = 0 (min 0, max 1)" + desc: "changes hue, saturation and brightness of the image" + desc_ru: "изменяет оттенок, насыщенность и яркость изображения, тонирует при `tone` = 1" + - name: "invert" + args: "invertAlpha = 0, invertRed = 1, invertGreen = 2, invertBlue = 3" + desc: "inverts channels of the image" + desc_ru: "инвертирует заданные каналы изображения" + - name: "monochrome" + args: "level = 128 (min 0, max 255)" + desc: "converts color image to monochrome" + desc_ru: "преобразует цветное изображение в монохромное" + - name: "mosaic" + args: "size = 4 (min 1, max 50)" + desc: "applies mosaic effect" + desc_ru: "применяет эффект мозайки" + - name: "noiseGeneration" + args: "amount = 50 (min 0, max 255), monochrome = 0" + desc: "adds noise to images" + desc_ru: "добавляет шум к изображению" + - name: "posterization" + args: "level = 64 (min 1, max 255)" + desc: "applies posterization effect" + desc_ru: "применяет эффект постеризации" + - name: "rgbCorrection" + args: "alpha = 0 (min -255, max 255), red = 0 (min -255, max 255), green = 0 (min -255, max 255), blue = 0 (min -255, max 255)" + desc: "changes alpha, red, green and blue channels of the image" + desc_ru: "изменяет прозрачность, красный, зелёный, синий каналы изображения" + - name: "rotate" + args: "angle = 45 (min 0, max 360)" + desc: "rotates image" + desc_ru: "поворачивает изображение" + - name: "saturation" + args: "level = 64 (min -255, max 255)" + desc: "changes saturation of the image" + desc_ru: "изменяет насыщенность изображения" + - name: "scatter" + args: "horizontalScatter = 10 (min 1, max 100), verticalScatter = 10 (min 1, max 100)" + desc: "applies pixel scatter effect" + desc_ru: "применяет эффект рассеивания пикселей" + - name: "smooth" + args: "level = 3 (min 1, max 25)" + desc: "applies smooth effect" + desc_ru: "применяет эффект сглаживания" + - name: "xor" + args: "level = 64 (min 0, max 255)" + desc: "applies xor operation for each pixel of the image" + desc_ru: "применяет операцию ИСКЛЮЧАЮЩЕЕ ИЛИ для каждого пикселя изображения" \ No newline at end of file diff --git a/docs/src/modules/java.yml b/docs/src/modules/java.yml new file mode 100644 index 00000000..4488b821 --- /dev/null +++ b/docs/src/modules/java.yml @@ -0,0 +1,253 @@ +name: java +scope: both +constants: + - name: Object.class + type: 4 + typeName: map + value: 'java.lang.Object' + - name: Object[].class + type: 4 + typeName: map + value: 'java.lang.Object[]' + - name: Object[][].class + type: 4 + typeName: map + value: 'java.lang.Object[][]' + - name: String.class + type: 4 + typeName: map + value: 'java.lang.String' + - name: String[].class + type: 4 + typeName: map + value: 'java.lang.String[]' + - name: String[][].class + type: 4 + typeName: map + value: 'java.lang.String[][]' + - name: boolean.class + type: 4 + typeName: map + value: 'boolean' + - name: boolean[].class + type: 4 + typeName: map + value: 'boolean[]' + - name: boolean[][].class + type: 4 + typeName: map + value: 'boolean[][]' + - name: byte.class + type: 4 + typeName: map + value: 'byte' + - name: byte[].class + type: 4 + typeName: map + value: 'byte[]' + - name: byte[][].class + type: 4 + typeName: map + value: 'byte[][]' + - name: char.class + type: 4 + typeName: map + value: 'char' + - name: char[].class + type: 4 + typeName: map + value: 'char[]' + - name: char[][].class + type: 4 + typeName: map + value: 'char[][]' + - name: double.class + type: 4 + typeName: map + value: 'double' + - name: double[].class + type: 4 + typeName: map + value: 'double[]' + - name: double[][].class + type: 4 + typeName: map + value: 'double[][]' + - name: float.class + type: 4 + typeName: map + value: 'float' + - name: float[].class + type: 4 + typeName: map + value: 'float[]' + - name: float[][].class + type: 4 + typeName: map + value: 'float[][]' + - name: int.class + type: 4 + typeName: map + value: 'int' + - name: int[].class + type: 4 + typeName: map + value: 'int[]' + - name: int[][].class + type: 4 + typeName: map + value: 'int[][]' + - name: long.class + type: 4 + typeName: map + value: 'long' + - name: long[].class + type: 4 + typeName: map + value: 'long[]' + - name: long[][].class + type: 4 + typeName: map + value: 'long[][]' + - name: 'null' + type: 482862660 + typeName: unknown (482862660) + value: 'null' + - name: short.class + type: 4 + typeName: map + value: 'short' + - name: short[].class + type: 4 + typeName: map + value: 'short[]' + - name: short[][].class + type: 4 + typeName: map + value: 'short[][]' +functions: + - name: isNull + args: 'values...' + desc: 'checks if one or more values are null' + desc_ru: 'проверяет, является ли одно или несколько значений null' + - name: newClass + args: 'name' + desc: 'creates ClassValue' + desc_ru: 'создаёт ClassValue' + - name: toObject + args: 'ownlangValue' + desc: 'converts ownlangValue to Java object' + desc_ru: 'конвертирует ownlangValue в Java объект' + - name: toValue + args: 'javaObject' + desc: 'converts javaObject to OwnLang value' + desc_ru: 'конвертирует javaObject в OwnLang значение' +types: + - name: ClassValue + functions: + - name: "asSubclass" + args: "" + desc: "" + desc_ru: "" + - name: "canonicalName" + args: "" + desc: "" + desc_ru: "" + - name: "cast" + args: "" + desc: "" + desc_ru: "" + - name: "genericString" + args: "" + desc: "" + desc_ru: "" + - name: "getComponentType" + args: "" + desc: "" + desc_ru: "" + - name: "getDeclaringClass" + args: "" + desc: "" + desc_ru: "" + - name: "getEnclosingClass" + args: "" + desc: "" + desc_ru: "" + - name: "getSuperclass" + args: "" + desc: "" + desc_ru: "" + - name: "getClasses" + args: "" + desc: "" + desc_ru: "" + - name: "getDeclaredClasses" + args: "" + desc: "" + desc_ru: "" + - name: "getInterfaces" + args: "" + desc: "" + desc_ru: "" + - name: "isAnnotation" + args: "" + desc: "" + desc_ru: "" + - name: "isAnonymousClass" + args: "" + desc: "" + desc_ru: "" + - name: "isArray" + args: "" + desc: "" + desc_ru: "" + - name: "isAssignableFrom" + args: "" + desc: "" + desc_ru: "" + - name: "isEnum" + args: "" + desc: "" + desc_ru: "" + - name: "isInterface" + args: "" + desc: "" + desc_ru: "" + - name: "isLocalClass" + args: "" + desc: "" + desc_ru: "" + - name: "isMemberClass" + args: "" + desc: "" + desc_ru: "" + - name: "isPrimitive" + args: "" + desc: "" + desc_ru: "" + - name: "isSynthetic" + args: "" + desc: "" + desc_ru: "" + - name: "modifiers" + args: "" + desc: "" + desc_ru: "" + - name: "name" + args: "" + desc: "" + desc_ru: "" + - name: "new" + args: "" + desc: "creates new instance of class" + desc_ru: "создаёт новый экземпляр класса" + - name: "simpleName" + args: "" + desc: "" + desc_ru: "" + - name: "typeName" + args: "" + desc: "" + desc_ru: "" + - name: NullValue + - name: ObjectValue \ No newline at end of file diff --git a/docs/src/modules/jdbc.yml b/docs/src/modules/jdbc.yml new file mode 100644 index 00000000..04e79833 --- /dev/null +++ b/docs/src/modules/jdbc.yml @@ -0,0 +1,685 @@ +name: jdbc +scope: desktop +constants: + - name: CLOSE_ALL_RESULTS + type: 1 + typeName: number + value: '3' + - name: CLOSE_CURRENT_RESULT + type: 1 + typeName: number + value: '1' + - name: CLOSE_CURSORS_AT_COMMIT + type: 1 + typeName: number + value: '2' + - name: CONCUR_READ_ONLY + type: 1 + typeName: number + value: '1007' + - name: CONCUR_UPDATABLE + type: 1 + typeName: number + value: '1008' + - name: EXECUTE_FAILED + type: 1 + typeName: number + value: '-3' + - name: FETCH_FORWARD + type: 1 + typeName: number + value: '1000' + - name: FETCH_REVERSE + type: 1 + typeName: number + value: '1001' + - name: FETCH_UNKNOWN + type: 1 + typeName: number + value: '1002' + - name: HOLD_CURSORS_OVER_COMMIT + type: 1 + typeName: number + value: '1' + - name: KEEP_CURRENT_RESULT + type: 1 + typeName: number + value: '2' + - name: NO_GENERATED_KEYS + type: 1 + typeName: number + value: '2' + - name: RETURN_GENERATED_KEYS + type: 1 + typeName: number + value: '1' + - name: SUCCESS_NO_INFO + type: 1 + typeName: number + value: '-2' + - name: TRANSACTION_NONE + type: 1 + typeName: number + value: '0' + - name: TRANSACTION_READ_COMMITTED + type: 1 + typeName: number + value: '2' + - name: TRANSACTION_READ_UNCOMMITTED + type: 1 + typeName: number + value: '1' + - name: TRANSACTION_REPEATABLE_READ + type: 1 + typeName: number + value: '4' + - name: TRANSACTION_SERIALIZABLE + type: 1 + typeName: number + value: '8' + - name: TYPE_FORWARD_ONLY + type: 1 + typeName: number + value: '1003' + - name: TYPE_SCROLL_INSENSITIVE + type: 1 + typeName: number + value: '1004' + - name: TYPE_SCROLL_SENSITIVE + type: 1 + typeName: number + value: '1005' +functions: + - name: getConnection + args: '...' + desc: |- + `getConnection(connectionUrl)` + + `getConnection(connectionUrl, driverClassName)` + + `getConnection(connectionUrl, user, password)` + + `getConnection(connectionUrl, user, password, driverClassName)` + + Creates connection and returns ConnectionValue. + desc_ru: |- + `getConnection(connectionUrl)` + + `getConnection(connectionUrl, driverClassName)` + + `getConnection(connectionUrl, user, password)` + + `getConnection(connectionUrl, user, password, driverClassName)` + + Создаёт подключение и возвращает ConnectionValue. + - name: mysql + args: 'connectionUrl' + desc: 'creates mysql connection' + desc_ru: 'создаёт mysql подключение' + - name: sqlite + args: 'connectionUrl' + desc: 'creates sqlite connection' + desc_ru: 'создаёт sqlite подключение' +types: + - name: ConnectionValue + functions: + - name: "clearWarnings" + args: "" + desc: "" + desc_ru: "" + - name: "close" + args: "" + desc: "" + desc_ru: "" + - name: "commit" + args: "" + desc: "" + desc_ru: "" + - name: "createStatement" + args: "" + desc: "" + desc_ru: "" + - name: "getAutoCommit" + args: "" + desc: "" + desc_ru: "" + - name: "getCatalog" + args: "" + desc: "" + desc_ru: "" + - name: "getHoldability" + args: "" + desc: "" + desc_ru: "" + - name: "getNetworkTimeout" + args: "" + desc: "" + desc_ru: "" + - name: "getSchema" + args: "" + desc: "" + desc_ru: "" + - name: "getTransactionIsolation" + args: "" + desc: "" + desc_ru: "" + - name: "getUpdateCount" + args: "" + desc: "" + desc_ru: "" + - name: "isClosed" + args: "" + desc: "" + desc_ru: "" + - name: "isReadOnly" + args: "" + desc: "" + desc_ru: "" + - name: "prepareStatement" + args: "" + desc: "" + desc_ru: "" + - name: "rollback" + args: "" + desc: "" + desc_ru: "" + - name: "setHoldability" + args: "" + desc: "" + desc_ru: "" + - name: "setTransactionIsolation" + args: "" + desc: "" + desc_ru: "" + - name: ResultSetValue + functions: + - name: "absolute" + args: "" + desc: "" + desc_ru: "" + - name: "afterLast" + args: "" + desc: "" + desc_ru: "" + - name: "beforeFirst" + args: "" + desc: "" + desc_ru: "" + - name: "cancelRowUpdates" + args: "" + desc: "" + desc_ru: "" + - name: "clearWarnings" + args: "" + desc: "" + desc_ru: "" + - name: "close" + args: "" + desc: "" + desc_ru: "" + - name: "deleteRow" + args: "" + desc: "" + desc_ru: "" + - name: "findColumn" + args: "" + desc: "" + desc_ru: "" + - name: "first" + args: "" + desc: "" + desc_ru: "" + - name: "getArray" + args: "" + desc: "" + desc_ru: "" + - name: "getBigDecimal" + args: "" + desc: "" + desc_ru: "" + - name: "getBoolean" + args: "" + desc: "" + desc_ru: "" + - name: "getByte" + args: "" + desc: "" + desc_ru: "" + - name: "getBytes" + args: "" + desc: "" + desc_ru: "" + - name: "getConcurrency" + args: "" + desc: "" + desc_ru: "" + - name: "getCursorName" + args: "" + desc: "" + desc_ru: "" + - name: "getDate" + args: "" + desc: "" + desc_ru: "" + - name: "getDouble" + args: "" + desc: "" + desc_ru: "" + - name: "getFetchDirection" + args: "" + desc: "" + desc_ru: "" + - name: "getFetchSize" + args: "" + desc: "" + desc_ru: "" + - name: "getFloat" + args: "" + desc: "" + desc_ru: "" + - name: "getHoldability" + args: "" + desc: "" + desc_ru: "" + - name: "getInt" + args: "" + desc: "" + desc_ru: "" + - name: "getLong" + args: "" + desc: "" + desc_ru: "" + - name: "getNString" + args: "" + desc: "" + desc_ru: "" + - name: "getRow" + args: "" + desc: "" + desc_ru: "" + - name: "getRowId" + args: "" + desc: "" + desc_ru: "" + - name: "getShort" + args: "" + desc: "" + desc_ru: "" + - name: "getStatement" + args: "" + desc: "" + desc_ru: "" + - name: "getString" + args: "" + desc: "" + desc_ru: "" + - name: "getTime" + args: "" + desc: "" + desc_ru: "" + - name: "getTimestamp" + args: "" + desc: "" + desc_ru: "" + - name: "getType" + args: "" + desc: "" + desc_ru: "" + - name: "getURL" + args: "" + desc: "" + desc_ru: "" + - name: "insertRow" + args: "" + desc: "" + desc_ru: "" + - name: "isAfterLast" + args: "" + desc: "" + desc_ru: "" + - name: "isBeforeFirst" + args: "" + desc: "" + desc_ru: "" + - name: "isClosed" + args: "" + desc: "" + desc_ru: "" + - name: "isFirst" + args: "" + desc: "" + desc_ru: "" + - name: "isLast" + args: "" + desc: "" + desc_ru: "" + - name: "last" + args: "" + desc: "" + desc_ru: "" + - name: "moveToCurrentRow" + args: "" + desc: "" + desc_ru: "" + - name: "moveToInsertRow" + args: "" + desc: "" + desc_ru: "" + - name: "next" + args: "" + desc: "" + desc_ru: "" + - name: "previous" + args: "" + desc: "" + desc_ru: "" + - name: "refreshRow" + args: "" + desc: "" + desc_ru: "" + - name: "relative" + args: "" + desc: "" + desc_ru: "" + - name: "rowDeleted" + args: "" + desc: "" + desc_ru: "" + - name: "rowInserted" + args: "" + desc: "" + desc_ru: "" + - name: "rowUpdated" + args: "" + desc: "" + desc_ru: "" + - name: "setFetchDirection" + args: "" + desc: "" + desc_ru: "" + - name: "setFetchSize" + args: "" + desc: "" + desc_ru: "" + - name: "updateBigDecimal" + args: "" + desc: "" + desc_ru: "" + - name: "updateBoolean" + args: "" + desc: "" + desc_ru: "" + - name: "updateByte" + args: "" + desc: "" + desc_ru: "" + - name: "updateBytes" + args: "" + desc: "" + desc_ru: "" + - name: "updateDate" + args: "" + desc: "" + desc_ru: "" + - name: "updateDouble" + args: "" + desc: "" + desc_ru: "" + - name: "updateFloat" + args: "" + desc: "" + desc_ru: "" + - name: "updateInt" + args: "" + desc: "" + desc_ru: "" + - name: "updateLong" + args: "" + desc: "" + desc_ru: "" + - name: "updateNString" + args: "" + desc: "" + desc_ru: "" + - name: "updateNull" + args: "" + desc: "" + desc_ru: "" + - name: "updateRow" + args: "" + desc: "" + desc_ru: "" + - name: "updateShort" + args: "" + desc: "" + desc_ru: "" + - name: "updateString" + args: "" + desc: "" + desc_ru: "" + - name: "updateTime" + args: "" + desc: "" + desc_ru: "" + - name: "updateTimestamp" + args: "" + desc: "" + desc_ru: "" + - name: "wasNull" + args: "" + desc: "" + desc_ru: "" + - name: StatementValue + functions: + - name: "addBatch" + args: "" + desc: "" + desc_ru: "" + - name: "cancel" + args: "" + desc: "" + desc_ru: "" + - name: "clearBatch" + args: "" + desc: "" + desc_ru: "" + - name: "clearParameters" + args: "" + desc: "" + desc_ru: "" + - name: "clearWarnings" + args: "" + desc: "" + desc_ru: "" + - name: "close" + args: "" + desc: "" + desc_ru: "" + - name: "closeOnCompletion" + args: "" + desc: "" + desc_ru: "" + - name: "execute" + args: "" + desc: "" + desc_ru: "" + - name: "executeBatch" + args: "" + desc: "" + desc_ru: "" + - name: "executeLargeBatch" + args: "" + desc: "" + desc_ru: "" + - name: "executeLargeUpdate" + args: "" + desc: "" + desc_ru: "" + - name: "executeQuery" + args: "" + desc: "" + desc_ru: "" + - name: "executeUpdate" + args: "" + desc: "" + desc_ru: "" + - name: "getFetchDirection" + args: "" + desc: "" + desc_ru: "" + - name: "getFetchSize" + args: "" + desc: "" + desc_ru: "" + - name: "getGeneratedKeys" + args: "" + desc: "" + desc_ru: "" + - name: "getMaxFieldSize" + args: "" + desc: "" + desc_ru: "" + - name: "getMaxRows" + args: "" + desc: "" + desc_ru: "" + - name: "getMoreResults" + args: "" + desc: "" + desc_ru: "" + - name: "getQueryTimeout" + args: "" + desc: "" + desc_ru: "" + - name: "getResultSet" + args: "" + desc: "" + desc_ru: "" + - name: "getResultSetConcurrency" + args: "" + desc: "" + desc_ru: "" + - name: "getResultSetHoldability" + args: "" + desc: "" + desc_ru: "" + - name: "getResultSetType" + args: "" + desc: "" + desc_ru: "" + - name: "getUpdateCount" + args: "" + desc: "" + desc_ru: "" + - name: "isCloseOnCompletion" + args: "" + desc: "" + desc_ru: "" + - name: "isClosed" + args: "" + desc: "" + desc_ru: "" + - name: "isPoolable" + args: "" + desc: "" + desc_ru: "" + - name: "setBigDecimal" + args: "" + desc: "" + desc_ru: "" + - name: "setBoolean" + args: "" + desc: "" + desc_ru: "" + - name: "setByte" + args: "" + desc: "" + desc_ru: "" + - name: "setBytes" + args: "" + desc: "" + desc_ru: "" + - name: "setCursorName" + args: "" + desc: "" + desc_ru: "" + - name: "setDate" + args: "" + desc: "" + desc_ru: "" + - name: "setDouble" + args: "" + desc: "" + desc_ru: "" + - name: "setEscapeProcessing" + args: "" + desc: "" + desc_ru: "" + - name: "setFetchDirection" + args: "" + desc: "" + desc_ru: "" + - name: "setFetchSize" + args: "" + desc: "" + desc_ru: "" + - name: "setFloat" + args: "" + desc: "" + desc_ru: "" + - name: "setInt" + args: "" + desc: "" + desc_ru: "" + - name: "setLargeMaxRows" + args: "" + desc: "" + desc_ru: "" + - name: "setLong" + args: "" + desc: "" + desc_ru: "" + - name: "setMaxFieldSize" + args: "" + desc: "" + desc_ru: "" + - name: "setMaxRows" + args: "" + desc: "" + desc_ru: "" + - name: "setNString" + args: "" + desc: "" + desc_ru: "" + - name: "setNull" + args: "" + desc: "" + desc_ru: "" + - name: "setPoolable" + args: "" + desc: "" + desc_ru: "" + - name: "setQueryTimeout" + args: "" + desc: "" + desc_ru: "" + - name: "setShort" + args: "" + desc: "" + desc_ru: "" + - name: "setString" + args: "" + desc: "" + desc_ru: "" + - name: "setTime" + args: "" + desc: "" + desc_ru: "" + - name: "setTimestamp" + args: "" + desc: "" + desc_ru: "" + - name: "setURL" + args: "" + desc: "" + desc_ru: "" \ No newline at end of file diff --git a/docs/src/modules/json.yml b/docs/src/modules/json.yml new file mode 100644 index 00000000..3bd555db --- /dev/null +++ b/docs/src/modules/json.yml @@ -0,0 +1,25 @@ +name: json +scope: "both" +desc: "Contains functions for working with the json format" +desc_ru: "Содержит функции преобразования данных в формат json и наоборот" +constants: [] +functions: + - name: "jsondecode" + args: "data" + desc: "converts data to json string" + desc_ru: "преобразует переданные данные в строку в формате json" + example: |- + use json + print jsondecode("{\"key1\":1,\"key2\":[1,2,3],\"key3\":\"text\"}") // {key2=[1, 2, 3], key3=text, key1=1} + - name: "jsonencode" + args: "jsonString, indent = 0" + desc: "converts string to data" + desc_ru: "преобразует строку в формате json в данные" + example: |- + use json + data = { + "key1": 1, + "key2": [1, 2, 3], + "key3": "text" + } + print jsonencode(data) // {"key1":1,"key2":[1,2,3],"key3":"text"} \ No newline at end of file diff --git a/docs/src/modules/math.yml b/docs/src/modules/math.yml new file mode 100644 index 00000000..643a8f2b --- /dev/null +++ b/docs/src/modules/math.yml @@ -0,0 +1,162 @@ +name: math +scope: "both" +desc: "Contains math functions and constants" +desc_ru: "Содержит математические функции и константы" +constants: + - name: "E" + typeName: number + type: 1 + value: "2.718281828459045" + - name: "PI" + typeName: number + type: 1 + value: "3.141592653589793" +functions: + - name: "abs" + args: "x" + desc: "absolute value of `x`" + desc_ru: "модуль числа `x`" + - name: "acos" + args: "x" + desc: "arc cosine" + desc_ru: "арккосинус" + - name: "asin" + args: "x" + desc: "arc sine" + desc_ru: "арксинус" + - name: "atan" + args: "x" + desc: "arc tangent" + desc_ru: "арктангенс" + - name: "atan2" + args: "y, x" + desc: "returns angle θ whose tangent is the ratio of two numbers" + desc_ru: "угол θ, тангенс которого равен отношению двух указанных чисел" + - name: "cbrt" + args: "x" + desc: "cube root" + desc_ru: "кубический корень числа x" + - name: "ceil" + args: "x" + desc: "returns the ceiling of `x`" + desc_ru: "округляет вещественное число в большую сторону" + example: |- + use math + + ceil(6.4) // 7 + - name: "copySign" + args: "magnitude, sign" + desc: "returns a value with the magnitude of x and the sign of y" + desc_ru: "возвращает значение с величиной x и знаком y" + - name: "cos" + args: "x" + desc: "trigonometric cosine" + desc_ru: "косинус" + - name: "cosh" + args: "x" + desc: "hyperbolic cosine" + desc_ru: "гиперболический косинус" + - name: "exp" + args: "x" + desc: "ex" + desc_ru: "ex" + - name: "expm1" + args: "x" + desc: "ex-1" + desc_ru: "ex-1" + - name: "floor" + args: "x" + desc: "returns floor of `x`" + desc_ru: "округляет вещественное число в меньшую сторону" + example: |- + use math + + floor(3.8) // 3 + - name: "getExponent" + args: "x" + desc: "returns the unbiased exponent used in the representation of a double or float" + desc_ru: "возвращают несмещенное значение экспоненты числа" + - name: "hypot" + args: "x, y" + desc: "returns the square root of the sum of squares of its arguments" + desc_ru: "расчёт гипотенузы sqrt(x2 + y2) без переполнения" + - name: "IEEEremainder" + args: "x, y" + desc: "returns the remainder resulting from the division of a specified number by another specified number. This operation complies with the remainder operation defined in Section 5.1 of ANSI/IEEE Std 754-1985; IEEE Standard for Binary Floating-Point Arithmetic; Institute of Electrical and Electronics Engineers, Inc; 1985." + desc_ru: "возвращает остаток от деления x на y по стандарту ANSI/IEEE Std 754-1985, раздел 5.1" + - name: "log" + args: "x" + desc: "returns the logarithm of a specified number" + desc_ru: "логарифм" + - name: "log1p" + args: "x" + desc: "" + desc_ru: "натуральный логарифм от x + 1 (`ln(x + 1)`)" + - name: "log10" + args: "x" + desc: "returns the base 10 logarithm of a specified number" + desc_ru: "десятичный логарифм" + - name: "max" + args: "x, y" + desc: "returns the larger of two specified numbers" + desc_ru: "максимальное из двух чисел" + - name: "min" + args: "x, y" + desc: "returns the smaller of two numbers" + desc_ru: "минимальное из двух чисел" + - name: "nextAfter" + args: "x, y" + desc: "" + desc_ru: "" + - name: "nextUp" + args: "x" + desc: "" + desc_ru: "" + - name: "pow" + args: "x, y" + desc: "returns a specified number raised to the specified power" + desc_ru: "возведение x в степень y" + - name: "rint" + args: "x" + desc: "" + desc_ru: "" + - name: "round" + args: "x" + desc: "rounds a value to the nearest integer or to the specified number of fractional digits" + desc_ru: "округляет вещественное число до ближайшего целого" + - name: "signum" + args: "x" + desc: "returns an integer that indicates the sign of a number" + desc_ru: "возвращает целое число, указывающее знак числа" + - name: "sin" + args: "x" + desc: "" + desc_ru: "синус" + - name: "sinh" + args: "x" + desc: "" + desc_ru: "гиперболический синус" + - name: "sqrt" + args: "x" + desc: "" + desc_ru: "квадратный корень" + - name: "tan" + args: "x" + desc: "" + desc_ru: "тангенс" + - name: "tanh" + args: "x" + desc: "" + desc_ru: "гиперболический тангенс" + - name: "toDegrees" + args: "x" + desc: "" + desc_ru: "перевод радиан в градусы" + - name: "toRadians" + args: "x" + desc: "" + desc_ru: "перевод градусов в радианы" + - name: "ulp" + args: "x" + desc: "" + desc_ru: "" \ No newline at end of file diff --git a/docs/src/modules/okhttp.yml b/docs/src/modules/okhttp.yml new file mode 100644 index 00000000..09c74f88 --- /dev/null +++ b/docs/src/modules/okhttp.yml @@ -0,0 +1,241 @@ +name: okhttp +since: 1.5.0 +scope: both +constants: + - name: MultipartBody + type: 4 + typeName: map + value: MultipartBodyValue + - name: RequestBody + type: 4 + typeName: map + value: RequestBodyValue + - name: okhttp + type: 4 + typeName: map + value: OkHttpValue +functions: [] +types: + - name: CallValue + functions: + - name: cancel + args: '' + desc: '' + desc_ru: '' + - name: enqueue + args: 'onResponse, onFailure=def(call, errorMessage)' + desc: '' + desc_ru: '' + - name: execute + args: '' + desc: '' + desc_ru: '' + - name: isCanceled + args: '' + desc: '' + desc_ru: '' + - name: isExecuted + args: '' + desc: '' + desc_ru: '' + - name: MultipartBodyValue + constants: + - name: ALTERNATIVE + type: 2 + typeName: string + value: multipart/alternative + - name: DIGEST + type: 2 + typeName: string + value: multipart/digest + - name: FORM + type: 2 + typeName: string + value: multipart/form-data + - name: MIXED + type: 2 + typeName: string + value: multipart/mixed + - name: PARALLEL + type: 2 + typeName: string + value: multipart/parallel + functions: + - name: builder + args: '' + desc: returns MultipartBodyBuilderValue + desc_ru: dозвращает MultipartBodyBuilderValue + - name: MultipartBodyBuilderValue + functions: + - name: addFormData + args: 'data' + desc: '' + desc_ru: '' + - name: addFormDataPart + args: 'name, value, requestBody = empty' + desc: '' + desc_ru: '' + - name: addPart + args: 'requestBody, headers = {}' + desc: '' + desc_ru: '' + - name: build + args: '' + desc: creates and returns MultipartBodyValue + desc_ru: создаёт и возвращает MultipartBodyValue + - name: setType + args: 'type' + desc: '' + desc_ru: '' + - name: RequestBuilderValue + functions: + - name: addHeader + args: 'name, value' + desc: '' + desc_ru: '' + - name: cacheControl + args: '' + desc: '' + desc_ru: '' + - name: delete + args: 'requestBody = empty' + desc: '' + desc_ru: '' + - name: get + args: '' + desc: '' + desc_ru: '' + - name: head + args: '' + desc: '' + desc_ru: '' + - name: header + args: 'name, value' + desc: '' + desc_ru: '' + - name: headers + args: 'headersMap' + desc: '' + desc_ru: '' + - name: method + args: 'method, requestBody = empty' + desc: '' + desc_ru: '' + - name: newCall + args: 'client' + desc: creates new call, returns CallValue + desc_ru: создаёт новый вызов, возвращает CallValue + - name: patch + args: 'requestBody = empty' + desc: '' + desc_ru: '' + - name: post + args: 'requestBody = empty' + desc: '' + desc_ru: '' + - name: put + args: 'requestBody = empty' + desc: '' + desc_ru: '' + - name: removeHeader + args: 'name' + desc: '' + desc_ru: '' + - name: url + args: 'url' + desc: '' + desc_ru: '' + - name: RequestBodyValue + functions: + - name: bytes + args: 'contentType, bytes, offset = 0, bytesCount = bytes.length' + desc: '' + desc_ru: '' + - name: file + args: 'contentType, filePath' + desc: '' + desc_ru: '' + - name: string + args: 'contentType, content' + desc: '' + desc_ru: '' + - name: OkHttpValue + constants: + - name: client + type: 4 + typeName: map + value: HttpClientValue + functions: + - name: request + args: '' + desc: returns RequestBuilderValue + desc_ru: возвращает RequestBuilderValue + - name: newClient + args: '' + desc: returns HttpClientBuilderValue + desc_ru: возвращает HttpClientBuilderValue + - name: HttpClientValue + functions: + - name: connectTimeoutMillis + args: '' + desc: '' + desc_ru: '' + - name: followRedirects + args: '' + desc: '' + desc_ru: '' + - name: followSslRedirects + args: '' + desc: '' + desc_ru: '' + - name: newCall + args: 'request' + desc: creates new call, returns CallValue + desc_ru: создаёт новый вызов, возвращает CallValue + - name: newWebSocket + args: 'request, callbacks' + desc: '' + desc_ru: '' + - name: pingIntervalMillis + args: '' + desc: '' + desc_ru: '' + - name: readTimeoutMillis + args: '' + desc: '' + desc_ru: '' + - name: retryOnConnectionFailure + args: '' + desc: '' + desc_ru: '' + - name: writeTimeoutMillis + args: '' + desc: '' + desc_ru: '' + - name: HttpClientBuilderValue + functions: + - name: callTimeout + args: 'duration, timeUnit' + desc: 'Sets call timeout for `duration` and `timeUnit` one of "millis"/"milliseconds", "seconds", "minutes", "hours", "days"' + desc_ru: 'Устанавливает таймаут вызова в `duration` и `timeUnit` один из "millis"/"milliseconds", "seconds", "minutes", "hours", "days"' + - name: connectTimeout + args: 'duration, timeUnit' + desc: 'Sets connect timeout for `duration` and `timeUnit` one of "millis"/"milliseconds", "seconds", "minutes", "hours", "days"' + desc_ru: 'Устанавливает таймаут соединения в `duration` и `timeUnit` один из "millis"/"milliseconds", "seconds", "minutes", "hours", "days"' + - name: readTimeout + args: 'duration, timeUnit' + desc: 'Sets read timeout for `duration` and `timeUnit` one of "millis"/"milliseconds", "seconds", "minutes", "hours", "days"' + desc_ru: 'Устанавливает таймаут чтения в `duration` и `timeUnit` один из "millis"/"milliseconds", "seconds", "minutes", "hours", "days"' + - name: writeTimeout + args: 'duration, timeUnit' + desc: 'Sets write timeout for `duration` and `timeUnit` one of "millis"/"milliseconds", "seconds", "minutes", "hours", "days"' + desc_ru: 'Устанавливает таймаут записи в `duration` и `timeUnit` один из "millis"/"milliseconds", "seconds", "minutes", "hours", "days"' + - name: retryOnConnectionFailure + args: 'flag' + desc: 'Enables or disables retry on connection failure' + desc_ru: 'Включает или выключает повтор при ошибках соединения' + - name: build + args: '' + desc: 'Returns new HttpClientValue' + desc_ru: 'Возвращает новый HttpClientValue' + diff --git a/docs/src/modules/ounit.yml b/docs/src/modules/ounit.yml new file mode 100644 index 00000000..85f49d9a --- /dev/null +++ b/docs/src/modules/ounit.yml @@ -0,0 +1,60 @@ +name: ounit +scope: "both" +desc: "Contains functions for testing. Invokes all functions with prefix `test` and checks expected and actual values, counts execution time" +desc_ru: "Содержит функции для тестирования. Поочерёдно вызывает все функции программы, которые имеют приставку `test` и подсчитывает время выполнение и расхождения с ожидаемыми значениями" +constants: [] +functions: + - name: "assertEquals" + args: "expected, actual" + desc: "checks that two values are equal" + desc_ru: "проверяет, равны ли два значения" + - name: "assertFalse" + args: "actual" + desc: "checks that value is false (equals 0)" + desc_ru: "проверяет, является ли значение ложным (равным нулю)" + - name: "assertNotEquals" + args: "expected, actual" + desc: "checks that two values are not equal" + desc_ru: "проверяет, отличаются ли два значения" + - name: "assertSameType" + args: "expected, actual" + desc: "checks that types of two values are equal" + desc_ru: "проверяет, одинаковы ли типы у двух значений" + - name: "assertTrue" + args: "actual" + desc: "checks that value is true (not equals 0)" + desc_ru: "проверяет, является ли значение истинным (не равным нулю)" + - name: "runTests" + args: "" + desc: "executes tests and returns information about it's results" + desc_ru: "запускает тесты и возвращает информацию о них по завершению работы в виде строки" + example: |- + use ounit + + def testAdditionOnNumbers() { + assertEquals(6, 0 + 1 + 2 + 3) + } + + def testTypes() { + assertSameType(0, 0.0) + } + + def testFail() { + assertTrue(false) + } + + println runTests() + + /* + testTypes [passed] + Elapsed: 0,0189 sec + + testAdditionOnNumbers [passed] + Elapsed: 0,0008 sec + + testFail [FAILED] + Expected true, but found false. + Elapsed: 0,0001 sec + + Tests run: 3, Failures: 1, Time elapsed: 0,0198 sec + */ \ No newline at end of file diff --git a/docs/src/modules/regex.yml b/docs/src/modules/regex.yml new file mode 100644 index 00000000..057d5e15 --- /dev/null +++ b/docs/src/modules/regex.yml @@ -0,0 +1,147 @@ +name: regex +since: 1.4.0 +constants: + - name: Pattern + type: 4 + typeName: map + value: "{UNIX_LINES=1, CASE_INSENSITIVE=2, I=2, COMMENTS=4, MULTILINE=8, M=8, LITERAL=16, S=32, DOTALL=32, UNICODE_CASE=64, CANON_EQ=128, UNICODE_CHARACTER_CLASS=256, U=256, quote=def(s) { return string }, matches=def(str,pattern) { return boolean }, split=def(str,pattern,limit = 0) { return array }, compile=def(pattern,flags = 0) { return PatternValue }}" +functions: + - name: regex + args: 'pattern, flags = 0' + desc: 'creates pattern and returns PatternValue' + desc_ru: 'создаёт шаблон регулярного выражения и возвращает PatternValue' +types: + - name: PatternValue + functions: + - name: "flags" + args: "" + desc: "returns pattern flags" + desc_ru: "возвращает флаги шаблона" + - name: "pattern" + args: "" + desc: "returns pattern as string" + desc_ru: "возвращает шаблон в виде строки" + - name: "matcher" + args: "input" + desc: "returns MatcherValue" + desc_ru: "возвращает MatcherValue" + - name: "matches" + args: "input" + desc: "checks if input matches the pattern" + desc_ru: "проверяет, соответствует ли входная строка шаблону" + - name: "split" + args: "input, limit = 0" + desc: "splits input around matches of this pattern" + desc_ru: "разбивает строку на основе совпадений шаблона" + - name: "replaceCallback" + args: "input, callback" + desc: "replaces input with the result of the given callback" + desc_ru: "заменяет строку результатом заданной функции" + example: |- + use regex + in = "dog cat" + pattern = regex("(\w+)\s(\w+)", Pattern.I) + println pattern.replaceCallback(in, def(m) = m.group(2) + "" + m.group(1)) + example_ru: |- + use regex + in = "пёс кот" + pattern = regex("(\w+)\s(\w+)", Pattern.U | Pattern.I) + println pattern.replaceCallback(in, def(m) = m.group(2) + "о" + m.group(1)) + - name: MatcherValue + functions: + - name: "start" + args: "group = ..." + desc: "returns the start index of matched subsequence" + desc_ru: "возвращает начальную позицию найденного совпадения" + - name: "end" + args: "group = ..." + desc: "returns the offset after last character of matched subsequence" + desc_ru: "возвращает позицию, следующую за последним символов найденного совпадения" + - name: "find" + args: "start = 0" + desc: "resets this matcher and attempts to find the next matched subsequence" + desc_ru: "сбрасывает состояние матчера и пытается найти следующее совпадение" + - name: "group" + args: "group = 0" + desc: "returns matched group" + desc_ru: "возвращает найденную группу" + - name: "pattern" + args: "" + desc: "returns the pattern" + desc_ru: "возвращает шаблон" + - name: "region" + args: "start, end" + desc: "sets the limits of this matcher's region" + desc_ru: "задаёт ограничения для текущего региона" + - name: "replaceFirst" + args: "replacement" + desc: "replaces first matched subsequence with the given replacement string" + desc_ru: "заменяет первое совпадение на заданную строку" + - name: "replaceAll" + args: "replacement" + desc: "replaces all matched subsequences with the given replacement string" + desc_ru: "заменяет все совпадения на заданную строку" + - name: "replaceCallback" + args: "callback" + desc: "replaces input with the result of the given callback" + desc_ru: "заменяет строку результатом заданной функции" + example: |- + use regex + in = "dog cat" + pattern = regex("(\w+)\s(\w+)", Pattern.I) + matcher = pattern.matcher(in) + println matcher.replaceCallback(def(m) = m.group(2) + m.group(1)) + example_ru: |- + use regex + in = "пёс кот" + pattern = regex("(\w+)\s(\w+)", Pattern.U | Pattern.I) + matcher = pattern.matcher(in) + println matcher.replaceCallback(def(m) = m.group(2) + "о" + m.group(1)) + - name: "reset" + args: input = "" + desc: "" + desc_ru: "" + - name: "usePattern" + args: "patternvalue" + desc: "" + desc_ru: "" + - name: "useAnchoringBounds" + args: "status" + desc: "" + desc_ru: "" + - name: "hasAnchoringBounds" + args: "" + desc: "" + desc_ru: "" + - name: "useTransparentBounds" + args: "status" + desc: "" + desc_ru: "" + - name: "hasTransparentBounds" + args: "" + desc: "" + desc_ru: "" + - name: "hitEnd" + args: "" + desc: "" + desc_ru: "" + - name: "lookingAt" + args: "" + desc: "" + desc_ru: "" + - name: "matches" + args: "" + desc: "" + desc_ru: "" + - name: "groupCount" + args: "" + desc: "" + desc_ru: "" + - name: "regionStart" + args: "" + desc: "" + desc_ru: "" + - name: "regionEnd" + args: "" + desc: "" + desc_ru: "" \ No newline at end of file diff --git a/docs/src/modules/robot.yml b/docs/src/modules/robot.yml new file mode 100644 index 00000000..9cf8e764 --- /dev/null +++ b/docs/src/modules/robot.yml @@ -0,0 +1,139 @@ +name: robot +scope: "both" +desc: "Contains functions for working with clipboard, processes, automation" +desc_ru: "Содержит функции для работы с буфером обмена, процессами, автоматизацией" +constants: + - name: "BUTTON1" + typeName: number + type: 1 + value: "16" + desc: "left mouse button code" + desc_ru: "код левой кнопки мыши" + - name: "BUTTON2" + typeName: number + type: 1 + value: "8" + desc: "middle mouse button code" + desc_ru: "код средней кнопки мыши" + - name: "BUTTON3" + typeName: number + type: 1 + value: "4" + desc: "right mouse button code" + desc_ru: "код правой кнопки мыши" + - name: "VK_DOWN" + typeName: number + type: 1 + value: "40" + desc: "key down code" + desc_ru: "код клавиши вниз" + - name: "VK_ESCAPE" + typeName: number + type: 1 + value: "27" + desc: "Escape key code" + desc_ru: "код клавиши Escape" + - name: "VK_FIRE" + typeName: number + type: 1 + value: "10" + desc: "Enter key code" + desc_ru: "код клавиши Enter" + - name: "VK_LEFT" + typeName: number + type: 1 + value: "37" + desc: "key left code" + desc_ru: "код клавиши влево" + - name: "VK_RIGHT" + typeName: number + type: 1 + value: "39" + desc: "key right code" + desc_ru: "код клавиши вправо" +functions: + - name: "click" + args: "buttons" + scope: "desktop" + desc: "performs click with given mouse buttons" + desc_ru: "осуществляет клик мышью с заданными клавишами" + example: |- + use robot + + click(BUTTON3) // right mouse button click + example_ru: |- + use robot + + click(BUTTON3) // клик правой кнопкой мыши + - name: "delay" + args: "ms" + scope: "desktop" + desc: "delay by given milliseconds" + desc_ru: "задержка на заданной количество миллисекунд" + - name: "execProcess" + args: "args..." + desc: "executes the process with parameters" + desc_ru: "запускает процесс с параметрами\n\n Если функции переданы несколько аргументов, то они все передаются как параметры.\n Если функции передан только один параметр - массив, то его элементы передаются как параметры.\n Если функции передан только один параметр, то он служит единственным параметром." + example: |- + use robot + + execProcess("mkdir", "Test") + execProcess("mkdir Test") + execProcess(["mkdir", "Test"]) + - name: "execProcessAndWait" + args: "args..." + desc: "same as `execProcess`, but waits until process completes, returns it's exit code" + desc_ru: "аналогичен функции `execProcess`, но ожидает завершение порождаемого процесса и возвращает его статус" + - name: "fromClipboard" + args: "" + desc: "gets text from clipboard" + desc_ru: "получает строку из буфера обмена" + - name: "keyPress" + args: "key" + scope: "desktop" + desc: "performs pressing key" + desc_ru: "осуществляет зажатие клавиши с кодом key" + - name: "keyRelease" + args: "key" + scope: "desktop" + desc: "performs releasing key" + desc_ru: "осуществляет отпускание клавиши с кодом key" + - name: "mouseMove" + args: "x, y" + scope: "desktop" + desc: "moves mouse pointer to given point" + desc_ru: "перемещает указатель мыши в заданную координату" + - name: "mousePress" + args: "buttons" + scope: "desktop" + desc: "performs pressing the given mouse button" + desc_ru: "осуществляет зажатие заданной кнопки мыши" + - name: "mouseRelease" + args: "buttons" + scope: "desktop" + desc: "performs releasing the given mouse button" + desc_ru: "осуществляет отпускание заданной кнопки мыши" + - name: "mouseWheel" + args: "value" + scope: "desktop" + desc: "performs scrolling (< 0 - up, > 0 - down)" + desc_ru: "осуществляет прокрутку колеса мыши (отрицательное значение - вверх, положительное - вниз)" + - name: "setAutoDelay" + args: "ms" + scope: "desktop" + desc: "sets delay after each automation event" + desc_ru: "установка длительности автоматической задержки после каждого события автоматизации" + - name: "toClipboard" + args: "text" + desc: "adds text to clipboards" + desc_ru: "копирует строку в буфер обмена" + - name: "typeText" + args: "text" + scope: "desktop" + desc: "performs typing text by pressing keys for each character" + desc_ru: "осуществляет последовательное нажатие клавиш для набора заданного текста" + - name: "sudo" + args: "args..." + scope: "android" + desc: "same as `execProcess`, but executes command as root (requires rooted device)" + desc_ru: "аналогичен функции `execProcess`, но выполняет команду от имени администратора (нужен Root)" \ No newline at end of file diff --git a/docs/src/modules/server.yml b/docs/src/modules/server.yml new file mode 100644 index 00000000..a603e493 --- /dev/null +++ b/docs/src/modules/server.yml @@ -0,0 +1,290 @@ +name: server +since: 2.0.0 +scope: desktop +constants: + - name: Header + type: 4 + typeName: map + value: '{ACCEPT=Accept, ACCEPT_CHARSET=Accept-Charset, ACCEPT_ENCODING=Accept-Encoding, + ACCEPT_LANGUAGE=Accept-Language, ACCEPT_RANGES=Accept-Ranges, ACCESS_CONTROL_ALLOW_CREDENTIALS=Access-Control-Allow-Credentials, + ACCESS_CONTROL_ALLOW_HEADERS=Access-Control-Allow-Headers, ACCESS_CONTROL_ALLOW_METHODS=Access-Control-Allow-Methods, + ACCESS_CONTROL_ALLOW_ORIGIN=Access-Control-Allow-Origin, ACCESS_CONTROL_EXPOSE_HEADERS=Access-Control-Expose-Headers, + ACCESS_CONTROL_MAX_AGE=Access-Control-Max-Age, ACCESS_CONTROL_REQUEST_HEADERS=Access-Control-Request-Headers, + ACCESS_CONTROL_REQUEST_METHOD=Access-Control-Request-Method, AGE=Age, ALLOW=Allow, + AUTHORIZATION=Authorization, CACHE_CONTROL=Cache-Control, CLEAR_SITE_DATA=Clear-Site-Data, + CONNECTION=Connection, CONTENT_DISPOSITION=Content-Disposition, CONTENT_ENCODING=Content-Encoding, + CONTENT_LANGUAGE=Content-Language, CONTENT_LENGTH=Content-Length, CONTENT_LOCATION=Content-Location, + CONTENT_RANGE=Content-Range, CONTENT_SECURITY_POLICY=Content-Security-Policy, + CONTENT_TYPE=Content-Type, COOKIE=Cookie, CROSS_ORIGIN_EMBEDDER_POLICY=Cross-Origin-Embedder-Policy, + CROSS_ORIGIN_OPENER_POLICY=Cross-Origin-Opener-Policy, CROSS_ORIGIN_RESOURCE_POLICY=Cross-Origin-Resource-Policy, + DATE=Date, ETAG=ETag, EXPECT=Expect, EXPIRES=Expires, FROM=From, HOST=Host, + IF_MATCH=If-Match, IF_MODIFIED_SINCE=If-Modified-Since, IF_NONE_MATCH=If-None-Match, + IF_RANGE=If-Range, IF_UNMODIFIED_SINCE=If-Unmodified-Since, LAST_MODIFIED=Last-Modified, + LINK=Link, LOCATION=Location, MAX_FORWARDS=Max-Forwards, ORIGIN=Origin, PRAGMA=Pragma, + PROXY_AUTHENTICATE=Proxy-Authenticate, PROXY_AUTHORIZATION=Proxy-Authorization, + RANGE=Range, REFERER=Referer, REFERRER_POLICY=Referrer-Policy, RETRY_AFTER=Retry-After, + SEC_WEBSOCKET_KEY=Sec-WebSocket-Key, SERVER=Server, SET_COOKIE=Set-Cookie, STRICT_TRANSPORT_SECURITY=Strict-Transport-Security, + TE=TE, TRAILER=Trailer, TRANSFER_ENCODING=Transfer-Encoding, UPGRADE=Upgrade, + USER_AGENT=User-Agent, VARY=Vary, VIA=Via, WARNING=Warning, WWW_AUTHENTICATE=WWW-Authenticate, + X_ACCEL_BUFFERING=X-Accel-Buffering, X_CONTENT_TYPE_OPTIONS=X-Content-Type-Options, + X_FORWARDED_FOR=X-Forwarded-For, X_FORWARDED_PROTO=X-Forwarded-Proto, X_FRAME_OPTIONS=X-Frame-Options, + X_HTTP_METHOD_OVERRIDE=X-HTTP-Method-Override, X_PERMITTED_CROSS_DOMAIN_POLICIES=X-Permitted-Cross-Domain-Policies}' +functions: + - name: newServer + args: 'config = {}' + desc: Initializes server using provided config. Returns ServerValue. + desc_ru: Инициализирует сервер, используя заданный конфиг. Возвращает ServerValue. + example: |- + use std, server + + newServer() + .get("/", def(ctx) = ctx.json({"message": "Hello, world!"})) + .start(8081) + - name: serve + args: 'port = 8080, dir = "."' + desc: Starts a server on the `port` and hosts the directory `dir` + desc_ru: Запускает сервер на указанном порту и хостит директорию `dir` + example: |- + use server + serve(8083, "./public_html") +types: + - name: ServerValue + functions: + - name: get + args: 'path, handler, roles...' + desc: adds a GET request handler + desc_ru: добавляет обработчик GET запросов + - name: post + args: 'path, handler, roles...' + desc: adds a POST request handler + desc_ru: добавляет обработчик POST запросов + - name: put + args: 'path, handler, roles...' + desc: adds a PUT request handler + desc_ru: добавляет обработчик PUT запросов + - name: patch + args: 'path, handler, roles...' + desc: adds a PATCH request handler + desc_ru: добавляет обработчик PATCH запросов + - name: head + args: 'path, handler, roles...' + desc: adds a HEAD request handler + desc_ru: добавляет обработчик HEAD запросов + - name: delete + args: 'path, handler, roles...' + desc: adds a DELETE request handler + desc_ru: добавляет обработчик DELETE запросов + - name: options + args: 'path, handler, roles...' + desc: adds a OPTIONS request handler + desc_ru: добавляет обработчик OPTIONS запросов + - name: error + args: 'status, handler, contentType = "*"' + desc: adds an error handler + desc_ru: добавляет обработчик ошибок + - name: exception + args: 'className, handler' + desc: adds an exception handler + desc_ru: добавляет обработчик исключений + - name: start + args: 'port = 8080, host = ""' + desc: Starts a server. Use `port` 0 to start a server on a random port. + desc_ru: Запускает сервер. Укажите `port` 0, чтобы запустить сервер на случайном порте + - name: stop + args: '' + desc: Stops a server + desc_ru: Останавливает работу сервера + - name: ContextValue + functions: + - name: appData + args: 'key' + desc: gets an appData value by key. See config.appData + desc_ru: получает значение appData по ключу `key`. См. config.appData + - name: attribute + args: 'key, value = ""' + desc: gets or sets an attribute by key + desc_ru: получает или устанавливает аттрибут по ключу `key` + - name: basicAuthCredentials + args: '' + desc: returns a basic authorization credentials, an array with two elements — username and password + desc_ru: возвращает простые данные авторизации, массив с двумя элементами — имя пользователя и пароль + example: |- + extract(username, password) = ctx.basicAuthCredentials() + - name: body + args: '' + desc: returns a response body as a string + desc_ru: возвращает тело ответа в виде строки + - name: bodyAsBytes + args: '' + desc: returns a response body as a byte array + desc_ru: возвращает тело ответа в виде массива байт + - name: characterEncoding + args: '' + desc: returns a character encoding from Content-Type if possible + desc_ru: возвращает кодировку символов из заголовка Content-Type, если возможно + - name: cookie + args: 'name, value = "", maxAge = -1' + desc: gets or sets a cookie + desc_ru: получает или устанавливает значение куки + - name: contentLength + args: '' + desc: returns a content length in bytes + desc_ru: возвращает длину контента в байтах + - name: contentType + args: 'contentType = ""' + desc: gets or sets a Content-Type header + desc_ru: получает или устанавливает заголовок Content-Type + - name: contextPath + args: '' + desc: returns a request context path + desc_ru: возвращает путь контекста запроса + - name: endpointHandlerPath + args: '' + desc: returns a matched endpoint handler path + desc_ru: возвращает путь обработчика совпавшего эндпоинта + - name: formParam + args: 'key' + desc: returns a form parameter + desc_ru: возвращает параметр формы + - name: fullUrl + args: '' + desc: returns a full url + desc_ru: возвращает полный адрес + - name: handlerType + args: '' + desc: returns a current handler type + desc_ru: возвращает тип текущего обработчика + - name: header + args: 'name, value =""' + desc: gets or sets header + desc_ru: получает или устанавливает заголовок по названию `name` + - name: host + args: '' + desc: returns a host + desc_ru: возвращает имя хоста + - name: html + args: 'html' + desc: sets result to the specified html string. Also sets Content-Type header to text/html + desc_ru: устанавливает указанную html-строку в качестве результата. Также устанавливает заголовок Content-Type в text/html + - name: ip + args: '' + desc: returns an IP address + desc_ru: возвращает IP адрес + - name: isHttpMethod + args: '' + desc: returns true if the request is http method + desc_ru: возвращает true, если запрос — http метод + - name: isMultipartFormData + args: '' + desc: returns true if the request is multipart/formdata + desc_ru: возвращает true, если запрос — multipart/formdata + - name: isMultipart + args: '' + desc: returns true if the request is multipart + desc_ru: возвращает true, если запрос — multipart + - name: json + args: 'obj' + desc: serializes an object to json string and sets it as the result + desc_ru: сериализует объект в json строку и устанавливает в качестве результата + - name: jsonStream + args: 'obj' + desc: serializes an object to json stream and sets it as the result + desc_ru: сериализует объект в json потом и устанавливает в качестве результата + - name: matchedPath + args: '' + desc: returns a matched request path + desc_ru: возвращает совпавший путь запроса + - name: method + args: '' + desc: returns a method (GET, POST, ...) + desc_ru: возвращает метод (GET, POST, ...) + - name: path + args: '' + desc: returns a request path + desc_ru: возвращает путь запроса + - name: pathParam + args: 'key' + desc: returns a request path parameter + desc_ru: возвращает параметр пути запроса + - name: port + args: '' + desc: returns a port number + desc_ru: возвращает номер порта + - name: protocol + args: '' + desc: returns a protocol + desc_ru: возвращает протокол + - name: queryParam + args: 'key' + desc: returns a query parameter + desc_ru: возвращает параметр запроса + - name: queryString + args: '' + desc: returns a query string + desc_ru: возвращает строку запроса + - name: redirect + args: 'location, statusCode = 302' + desc: redirects to a location with the given status. By default, the status is 302 FOUND + desc_ru: редиректит на указанный путь с указанным статусом. По умолчанию, статус — 302 FOUND + - name: removeCookie + args: 'name, path = "/"' + desc: removes a cookie by name and path + desc_ru: удаляет куки по имени и пути + - name: render + args: 'filePath, data = {}' + desc: renders a file with specified data and sets it as the result + desc_ru: рендерит файл с указанными данными и устанавливает в качестве результата + - name: result + args: 'value = ""' + desc: gets or sets a result. `value` can be a string or a byte array + desc_ru: получает или устанавливает результат. `value` может быть строкой или массивом байт + - name: status + args: 'status = ...' + desc: gets or sets a status code. `status` can be an integer status code (404, 500) or a string status name ("NOT_FOUND", "INTERNAL_SERVER_ERROR"). + desc_ru: получает или устанавливает код статуса. `status` может быть числовым кодом (404, 500) или строкой имени статуса ("NOT_FOUND", "INTERNAL_SERVER_ERROR") + - name: statusCode + args: '' + desc: returns a response status code + desc_ru: возвращает код статуса ответа + - name: scheme + args: '' + desc: returns a request scheme + desc_ru: возвращает схему запроса + - name: url + args: '' + desc: returns a request url + desc_ru: возвращает адрес запроса + - name: userAgent + args: '' + desc: returns an User-Agent header + desc_ru: возвращает заголовок User-Agent + - name: Config + example: |- + { + "webjars": true, + "classpathDirs": ["dir1", "dir2"], + "externalDirs": ["dir1", "dir2"], + + "asyncTimeout": 6_000, + "defaultContentType": "text/plain", + "etags": true, + "maxRequestSize": 1_000_000, + + "defaultHost": "localhost", + "defaultPort": 8000, + + "caseInsensitiveRoutes": true, + "ignoreTrailingSlashes": true, + "multipleSlashesAsSingle": true, + "contextPath": "/", + + "basicAuth": ["user", "password"], + "dev": true, + "showBanner": false, + "sslRedirects": true, + "virtualThreads": true, + "appData": { + "key1": "value1", + "key2": "value2" + } + } \ No newline at end of file diff --git a/docs/src/modules/socket.yml b/docs/src/modules/socket.yml new file mode 100644 index 00000000..4a12016e --- /dev/null +++ b/docs/src/modules/socket.yml @@ -0,0 +1,161 @@ +name: socket +scope: both +constants: + - name: EVENT_CONNECT + type: 2 + typeName: string + value: connect + - name: EVENT_CONNECTING + type: 2 + typeName: string + value: connecting + - name: EVENT_CONNECT_ERROR + type: 2 + typeName: string + value: connect_error + - name: EVENT_CONNECT_TIMEOUT + type: 2 + typeName: string + value: connect_timeout + - name: EVENT_DISCONNECT + type: 2 + typeName: string + value: disconnect + - name: EVENT_ERROR + type: 2 + typeName: string + value: error + - name: EVENT_MESSAGE + type: 2 + typeName: string + value: message + - name: EVENT_PING + type: 2 + typeName: string + value: ping + - name: EVENT_PONG + type: 2 + typeName: string + value: pong + - name: EVENT_RECONNECT + type: 2 + typeName: string + value: reconnect + - name: EVENT_RECONNECTING + type: 2 + typeName: string + value: reconnecting + - name: EVENT_RECONNECT_ATTEMPT + type: 2 + typeName: string + value: reconnect_attempt + - name: EVENT_RECONNECT_ERROR + type: 2 + typeName: string + value: reconnect_error + - name: EVENT_RECONNECT_FAILED + type: 2 + typeName: string + value: reconnect_failed +functions: + - name: newSocket + args: 'url, options = {}' + desc: |- + creates new SocketValue + + options (map with keys): + - forceNew (boolean) + - multiplex (boolean) + - reconnection (boolean) + - rememberUpgrade (boolean) + - secure (boolean) + - timestampRequests (boolean) + - upgrade (boolean) + - policyPort (integer) + - port (integer) + - reconnectionAttempts (integer) + - reconnectionDelay (timestamp - long) + - reconnectionDelayMax (timestamp - long) + - timeout (timestamp - long) - set -1 to disable + - randomizationFactor (double) + - host (string) + - hostname (string) + - path (string) + - query (string) + - timestampParam (string) + - transports (array of strings) + desc_ru: |- + создаёт новый SocketValue + + options (map с ключами): + - forceNew (boolean) + - multiplex (boolean) + - reconnection (boolean) + - rememberUpgrade (boolean) + - secure (boolean) + - timestampRequests (boolean) + - upgrade (boolean) + - policyPort (integer) + - port (integer) + - reconnectionAttempts (integer) + - reconnectionDelay (timestamp - long) + - reconnectionDelayMax (timestamp - long) + - timeout (timestamp - long) - -1 для отключения + - randomizationFactor (double) + - host (string) + - hostname (string) + - path (string) + - query (string) + - timestampParam (string) + - transports (array of strings) +types: + - name: SocketValue + functions: + - name: "close" + args: "" + desc: "disconnects the socket" + desc_ru: "закрывает соединение сокета" + - name: "connect" + args: "" + desc: "connects the socket" + desc_ru: "подключает сокет" + - name: "connected" + args: "" + desc: "returns connected status (1 - connected, 0 - no)" + desc_ru: "возвращает состояние подключения (1 - подключен, 0 - нет)" + - name: "disconnect" + args: "" + desc: "disconnects the socket" + desc_ru: "закрывает соединение сокета" + - name: "emit" + args: "event, data" + desc: "emits an event" + desc_ru: "посылает событие" + - name: "hasListeners" + args: "event" + desc: "returns true if there is listeners for specified event" + desc_ru: "возвращает true, если для указанного события есть обработчики" + - name: "id" + args: "" + desc: "returns socket id" + desc_ru: "возвращает id сокета" + - name: "off" + args: "event = .." + desc: "removes specified event handler, or removes all if no arguments were passed" + desc_ru: "удаляет обработчик указанного события или удаляет все обработчики, если не было передано ни одного аргумента" + - name: "on" + args: "event, listener" + desc: "adds event listener" + desc_ru: "добавляет обработчик указанного события" + - name: "once" + args: "event, listener" + desc: "adds one time event listener" + desc_ru: "добавляет одноразовый обработчик указанного события" + - name: "open" + args: "" + desc: "connects the socket" + desc_ru: "подключает сокет" + - name: "send" + args: "data" + desc: "send messages" + desc_ru: "отправляет сообщения" \ No newline at end of file diff --git a/docs/src/modules/std.yml b/docs/src/modules/std.yml new file mode 100644 index 00000000..92abeba2 --- /dev/null +++ b/docs/src/modules/std.yml @@ -0,0 +1,328 @@ +name: std +scope: "both" +desc: "Contains common functions" +desc_ru: "Содержит вспомогательные функции общего назначения" +constants: + - name: "ARGS" + typeName: string + scope: "desktop" + type: 2 + value: "command-line arguments" + - name: OwnLang + typeName: map + type: 4 + value: "{PLATFORM=android/desktop, VERSION=2.0.1_000000, VERSION_MAJOR=2, VERSION_MINOR=0, VERSION_PATCH=1}" + since: 1.4.0 +functions: + - name: arrayCombine + args: "keys, values" + desc: "creates map by combining two arrays" + desc_ru: "создаёт объект на основе двух массивов" + - name: arrayKeyExists + args: "key, map" + desc: "checks existing key in map. 1 - exists, 0 - no" + desc_ru: "проверяет, содержится ли ключ key в объекте map. 1 - содержится, 0 - нет" + - name: arrayKeys + args: "map" + desc: "returns array of map keys" + desc_ru: "возвращает массив ключей карты" + - name: arraySplice + args: "array, start, deleteCount = length(array) - start, additions = []" + desc: "returns new array with removed `deleteCount` elements starting from `start` and/or added new elements from `start` index" + desc_ru: "возвращает новый массив с удалёнными `deleteCount` элементами, начиная с позиции `start` и/или добавляет новые элементы с позиции `start`" + - name: arrayValues + args: "map" + desc: "returns array of map values" + desc_ru: "возвращает массив значений карты" + - name: charAt + args: "input, index" + desc: returns char code in position `index` of string `input` + desc_ru: возвращает код символа в позиции `index` строки `input` + - name: clearConsole + scope: "android" + args: "" + desc: "clears console" + desc_ru: "очищает консоль" + - name: default + args: a, b + desc: returns value `a` if it it non empty, returns `b` otherwise + desc_ru: возвращает значение `a`, если оно не пустое, иначе возвращается значение `b` + since: 1.4.0 + example: |- + use std + + user = {"name": "", "lastname": "Doe"} + name = default(user.name, "Unknown") + lastname = default(user.lastname, "Unknown") + println name + " " + lastname // Unknown Doe + example_ru: |- + use std + + user = {"name": "", "lastname": "Иванов"} + name = default(user.name, "Имя неизвестно") + lastname = default(user.lastname, "фамилия неизвестна") + println name + " " + lastname // Имя неизвестно Иванов + - name: echo + args: "arg..." + desc: "prints values to console, separate them by space and puts newline at the end. Takes variable number of arguments" + desc_ru: "выводит значения в консоль, разделяя их пробелом, а потом ставит перенос строки. Может принимать переменное значение аргументов" + example: |- + use std + + echo(1, "abc") // prints "1 abc" to console + echo(1, 2, 3, 4, 5, "a", "b") // prints "1 2 3 4 5 a b" + example_ru: |- + use std + + echo(1, "abc") // выведет строку "1 abc" в консоль + echo(1, 2, 3, 4, 5, "a", "b") // выведет строку "1 2 3 4 5 a b" в консоль" + - name: exit + args: status + desc: terminates an application with provided status code. Non-zero values indicates abnormal termination + desc_ru: завершает работу приложения с заданным кодом. Ненулевое значение означает завершение с ошибкой + since: 2.0.0 + example: |- + use std + + println "Bye!" + exit(0) + example_ru: |- + use std + + println "До свидания!" + exit(0) + - name: getBytes + args: input, charset = "UTF-8" + desc: returns byte array of the string in the given charset + desc_ru: возвращает массив байт строки в заданной кодировке + since: 1.5.0 + - name: getenv + args: key, defaultValue = "" + desc: returns the value of the specified environment variable if it's exists, returns `defaultValue` otherwise + desc_ru: возвращает значение указанной переменной среды, если такова существует. В противном случае возвращает `defaultValue` + since: 2.0.0 + example: |- + use std + println getenv("JAVA_HOME") + - name: getprop + args: key, defaultValue = "" + desc: returns the value of the system property if it's exists, returns `defaultValue` otherwise + desc_ru: возвращает значение системного свойства, если оно существует. В противном случае возвращает `defaultValue` + since: 2.0.0 + - name: indexOf + args: "input, what, index = 0" + desc: "finds first occurrence of `what` in string `input`, starting at position `index`" + desc_ru: "поиск первого вхождения подстроки `what` в строке `input`, начиная с позиции `index`" + - name: join + args: "array, delimiter = \"\", prefix = \"\", suffix = \"\"" + desc: "join array to string with `delimiter`, `prefix` and `suffix`" + desc_ru: "объединяет массив в строку с разделителем `delimiter`, префиксом `prefix` и суффиксом `suffix`" + - name: lastIndexOf + args: "input, what, index = 0" + desc: "finds last occurrence of `what` in string `input`, starting at position `index`" + desc_ru: "поиск последнего вхождения подстроки `what` в строке `input`, начиная с позиции `index`" + - name: length + args: "x" + desc: "returns length of string, array/map size or number of function arguments" + desc_ru: "возвращает длину строки, размер массива/объекта или количество аргументов функции в зависимости от типа аргумента x" + - name: nanotime + args: "" + desc: returns VM time source in nanoseconds for elapsed time purposes + desc_ru: возвращает время виртуальной машины в наносекундах, для отсчёта затраченного времени + since: 2.0.0 + - name: newarray + args: "size..." + desc: "creates array with `size`.\n`newarray(x)` - creates 1D array, `newarray(x,y)` - creates 2D array" + desc_ru: "оздаёт массив с размером size. Если указать 1 аргумент - создаётся одномерный массив, если 2 аргумента - двухмерный и т.д" + example: |- + use std + + println newarray(4) // [0, 0, 0, 0] + println newarray(2, 3) // [[0, 0, 0], [0, 0, 0]] + - name: parseInt + args: str, radix + desc: parses the input string into an integer with `radix` base + desc_ru: преобразует строку в целое число с указанным основанием + - name: parseLong + args: str, radix + desc: parses the input string into a long integer with `radix` base + desc_ru: преобразует строку в длинное целое число с указанным основанием + - name: parseDouble + args: str + desc: parses the input string into a double + desc_ru: преобразует строку в вещественное число типа double + since: 2.0.0 + - name: rand + args: "from = 0, to = .." + desc: |- + returns pseudo-random number. + `rand()` - returns float number from 0 to 1 + `rand(max)` - returns random number from 0 to max + `rand(from, to)` - return random number from `from` to `to` + desc_ru: "возвращает псевдослучайное число. Если вызвать функцию без аргументов, возвращается вещественное число от 0 до 1. Если указан один аргумент - возвращается целое число в диапазоне [0...значение). Если указаны два аргумента - возвращается псевдослучайное число в промежутке [from...to)" + - name: range + args: "from = 0, to, step = 1" + desc: |- + creates lazy array by number range. + `range(to)` - creates range from 0 to `to` (exclusive) with step 1 + `range(from, to)` - creates range from `from` to `to` (exclusive) with step 1 + `range(from, to, step)` - creates range from `from` to `to` (exclusive) with step `step` + desc_ru: |- + создаёт массив с элементами числового промежутка. Элементы вычисляются по мере их использования, так что в цикле foreach можно использовать любые промежутки. + `range(to)` - создаёт промежуток от 0 до `to` (не включительно) с шагом 1 + `range(from, to)` - создаёт промежуток от `from` до `to` (не включительно) с шагом 1 + `range(from, to, step)` - создаёт промежуток от `from` до `to` (не включительно) с шагом `step` + example: |- + use std + + println range(3) // [0, 1, 2] + r = range(-5, 0) // [-5, -4, -3, -2, -1] + println r[0] // -5 + println r[2] // -3 + for x : range(20, 9, -5) { + println x + } // 20 15 10 + - name: readln + scope: "desktop" + args: "x" + desc: "reads a line from console" + desc_ru: "чтение строки из консоли" + - name: replace + args: "str, target, replacement" + desc: "replaces all occurrences of string `target` with string `replacement`" + desc_ru: "заменяет все вхождения подстроки `target` на строку `replacement`" + - name: replaceAll + args: "str, regex, replacement" + desc: "replaces all occurrences of regular expression `regex` with string `replacement`" + desc_ru: "заменяет все вхождения регулярного выражения `regex` на строку `replacement`" + - name: replaceFirst + args: "str, regex, replacement" + desc: "replaces first occurrence of regular expression `regex` with string `replacement`" + desc_ru: "заменяет первое вхождение регулярного выражения `regex` на строку `replacement`" + - name: sleep + args: "time" + desc: "causes current thread to sleep for `time` milliseconds" + desc_ru: "приостановка текущего потока на time миллисекунд" + - name: sort + args: "array, comparator = .." + desc: "sorts array by natural order or by `comparator` function" + desc_ru: "сортирует массив. Если задана функция `comparator`, то сортировка будет производится на основе результата функции сравнения" + - name: split + args: "str, regex, limit = 0" + desc: "splits string `str` with regular expression `regex` into array. `limit` parameter affects the length of resulting array" + desc_ru: "разделяет строку `str` по шаблону `regex` и помещает элементы в массив. Если указан параметр `limit`, то будет произведено не более limit разбиений, соответственно размер результирующего массива будет ограничен этим значением limit" + example: |- + use std + + println split("a5b5c5d5e", "5") // ["a", "b", "c", "d", "e"] + println split("a5b5c5d5e", "5", 3) // ["a", "b", "c5d5e"] + - name: sprintf + args: "format, args..." + desc: "formats string by arguments" + desc_ru: "форматирует строку" + - name: stringFromBytes + args: input, charset = "UTF-8" + desc: returns a string from byte array in the given charset + desc_ru: возвращает строку из массива байт в заданной кодировке + since: 1.5.0 + - name: stripMargin + args: input, marginPrefix = "|" + desc: trims leading whitespaces followed by `marginPrefix` on each line and removes the first and the last lines if they are blank + desc_ru: обрезает начальные пробелы, сопровождаемые `marginPrefix` в каждой строке, и удаляет первую и последнюю строки, если они пустые + since: 1.5.0 + example: |- + use std + + println " + |123 + |456 + ".stripMargin() // "123\n456" + - name: substring + args: "str, startIndex, endIndex = .." + desc: "returns string from `startIndex` to `endIndex` or to end of string if `endIndex` is not set" + desc_ru: "обрезает строку `str`, начиная от символа после позиции `startIndex` и по `endIndex`. Если `endIndex` не указан, обрезается до конца строки" + example: |- + use std + + println substring("abcde", 1) // bcde + println substring("abcde", 2, 4) // cd + - name: sync + args: "callback" + desc: calls an asynchronous function synchronously + desc_ru: делает асинхронный вызов синхронным + example: |- + use std, http + + url = "https://whatthecommit.com/index.txt" + result = sync(def(ret) { + http(url, def(t) = ret(t)) + }) + println result + - name: thread + args: "func, args..." + desc: "creates new thread with parameters if passed" + desc_ru: |- + создаёт новый поток и передаёт параметры, если есть. + + `func` - функция, ссылка на функцию (`::function`) или имя функции (`"function"`) + + `args` - 0 или более аргументов, которые необходимо передать в функцию func + example: |- + use std + + thread(def() { + println "New Thread" + }) + + thread(::newthread, 10) + thread("newthread", 20) + + def newthread(x) { + println "New Thread. x = " + x + } + - name: time + args: "" + desc: "returns current time in milliseconds from 01.01.1970" + desc_ru: "возвращает текущее время в миллисекундах начиная с 1970 года" + - name: toChar + args: "code" + desc: "converts char code to string" + desc_ru: "переводит код символа в строку" + example: |- + use std + + println toChar(48) // "0" + - name: toHexString + args: 'number' + desc: 'converts number into hex string' + desc_ru: 'конвертирует число в строку с шестнадцатиричным представлением' + - name: toLowerCase + args: "str" + desc: "converts all symbols to lower case" + desc_ru: "переводит все символы строки в нижний регистр" + - name: toUpperCase + args: "str" + desc: "converts all symbols to upper case" + desc_ru: "переводит все символы строки в верхний регистр" + - name: trim + args: "str" + desc: "removes any leading and trailing whitespaces in string" + desc_ru: "обрезает пробельные невидимые символы по обоим концам строки" + - name: try + args: "unsafeFunction, catchFunction = def(type, message) = -1" + desc: suppress any error in `unsafeFunction` and returns the result of the `catchFunction` if any error occurs + desc_ru: подавляет любые ошибки в `unsafeFunction` и возрвщает результат функции `catchFunction`, если была ошибка + example: |- + use std + + println try(def() = "success") // success + println try(def() = try + 2) // -1 + println try(def() = try(), def(type, message) = sprintf("Error handled:\ntype: %s\nmessage: %s", type, message)) + println try(def() = try(), 42) // 42 + example_ru: |- + use std + + println try(def() = "успех") // успех + println try(def() = try + 2) // -1 + println try(def() = try(), def(type, message) = sprintf("Обработана ошибка:\nтип: %s\nсообщение: %s", type, message)) + println try(def() = try(), 42) // 42 \ No newline at end of file diff --git a/docs/src/modules/types.yml b/docs/src/modules/types.yml new file mode 100644 index 00000000..8b06f088 --- /dev/null +++ b/docs/src/modules/types.yml @@ -0,0 +1,80 @@ +name: types +scope: "both" +desc: "Contains functions for type checking and conversion" +desc_ru: "Содержит функции для проверки и преобразования типов" +constants: + - name: "OBJECT" + typeName: number + type: 1 + value: "0" + - name: "NUMBER" + typeName: number + type: 1 + value: "1" + - name: "STRING" + typeName: number + type: 1 + value: "2" + - name: "ARRAY" + typeName: number + type: 1 + value: "3" + - name: "MAP" + typeName: number + type: 1 + value: "4" + - name: "FUNCTION" + typeName: number + type: 1 + value: "5" +functions: + - name: "byte" + args: "value" + desc: "converts value to byte" + desc_ru: "преобразует значение к типу byte" + - name: "double" + args: "value" + desc: "converts value to double" + desc_ru: "преобразует значение к типу double" + - name: "float" + args: "value" + desc: "converts value to float" + desc_ru: "преобразует значение к типу float" + - name: "int" + args: "value" + desc: "converts value to int" + desc_ru: "преобразует значение к типу int" + - name: "long" + args: "value" + desc: "converts value to long" + desc_ru: "преобразует значение к типу long" + - name: "number" + args: "value" + desc: "converts value to number if possible" + desc_ru: "преобразует значение к числу, если это возможно" + example: |- + use types + + println typeof(number("2.3")) // 1 (NUMBER) + - name: "short" + args: "value" + desc: "converts value to short" + desc_ru: "преобразует значение к типу short" + - name: "string" + args: "value" + desc: "converts value to string" + desc_ru: "преобразует значение в строку" + example: |- + use types + + println typeof(string(1)) // 2 (STRING) + - name: "typeof" + args: "value" + desc: "returns the type of value" + desc_ru: "возвращает тип переданного значения" + example: |- + use types + + println typeof(1) // 1 (NUMBER) + println typeof("text") // 2 (STRING) + println typeof([]) // 3 (ARRAY) \ No newline at end of file diff --git a/docs/src/modules/yaml.yml b/docs/src/modules/yaml.yml new file mode 100644 index 00000000..7960bffa --- /dev/null +++ b/docs/src/modules/yaml.yml @@ -0,0 +1,14 @@ +name: yaml +scope: desktop +desc: "Contains functions for working with the yaml format" +desc_ru: "Содержит функции преобразования данных в формат yaml и наоборот" +constants: [] +functions: + - name: yamldecode + args: "data" + desc: "converts data to yaml string" + desc_ru: "преобразует переданные данные в строку в формате yaml" + - name: yamlencode + args: "yamlString" + desc: "converts yaml string to data" + desc_ru: "преобразует строку в формате yaml в данные" \ No newline at end of file diff --git a/docs/src/modules/zip.yml b/docs/src/modules/zip.yml new file mode 100644 index 00000000..e34f5376 --- /dev/null +++ b/docs/src/modules/zip.yml @@ -0,0 +1,98 @@ +name: zip +since: 1.5.0 +scope: both +desc: "Contains functions for working with zip archives" +desc_ru: "Содержит функции для работы с zip архивами" +constants: [] +functions: + - + name: zip + args: "inputPath, outputFile, mapper = def(entryPath) = entryPath" + desc: |- + creates a zip archive with the contents of `inputPath` and saves to `outputFile`. + `mapper` is used to set the name of the final file inside the archive and for filtering. If the mapper returns an empty string, the file will be skipped. + Returns the number of archived files, or -1 if the archive could not be created. + desc_ru: |- + создаёт zip архив с содержимым `inputPath` и сохраняет в `outputFile`. + `mapper` используется для задания имени конечного файла внутри архива, а также для фильтрации. Если в mapper вернуть пустую строку, то файл будет пропущен. + Возвращает количество заархивированных файлов, либо -1, если создать архив не удалось. + example: |- + use zip + // Zip all files in directory + zip("/tmp/dir", "/tmp/1.zip") + // Zip .txt files + zip("/tmp/dir", "/tmp/2.zip", def(p) = p.endsWith(".txt") ? p : "") + example_ru: |- + use zip + // Архивировать все файлы в директории + zip("/tmp/dir", "/tmp/1.zip") + // Архивировать .txt файлы + zip("/tmp/dir", "/tmp/2.zip", def(p) = p.endsWith(".txt") ? p : "") + - + name: zipFiles + args: "input, outputFile" + desc: |- + creates a zip archive with the contents of `inputPath` and saves to `outputFile`. + If `input` is a string, then a single file or the contents of a folder is archived. + If `input` is an array, then the files and folders listed in it are archived. + If `input` is an associative array, then the files and folders listed in the keys are archived and the names inside the archive will be the values of an array. + Returns the number of archived files, or -1 if the archive could not be created. + desc_ru: |- + создаёт zip архив с содержимым `input` и сохраняет в `outputFile`. + Если `input` — строка, то архивируется один файл или содержимое папки. + Если `input` — массив, то архивируются файлы и папки, перечисленные в нём. + Если `input` — ассоциативный массив, то архивируются файлы и папки перечисленные в ключах, а именами внутри архива будут служить значения. + Возвращает количество заархивированных файлов, либо -1, если создать архив не удалось. + example: |- + use zip + zipFiles("/tmp/dir/file.txt", "/tmp/1.zip") + zipFiles(["/tmp/dir/file.txt", "/tmp/dir/readme.md"], "/tmp/2.zip") + zipFiles({"/tmp/dir/file.txt" : "docs/1.md", "/tmp/dir/readme.md" : "docs/2.md"}, "/tmp/3.zip") + - + name: unzip + args: "input, output, mapper = def(entryName) = entryPath" + desc: |- + unpacks a zip archive to `output` directory. + `mapper` is used to set the name of the final file and for filtering. If the mapper returns an empty string, the file will be skipped. + Returns the number of unzipped files, or -1 if unzipping the archive was failed. + desc_ru: |- + распаковывает zip архив `input` в папку `output`. + `mapper` используется для задания имени конечного файла, а также для фильтрации. Если в mapper вернуть пустую строку, то файл будет пропущен. + Возвращает количество разархивированных файлов, либо -1, если разархивировать архив не удалось. + example: |- + use zip + // Unzip all files in directory + unzip("/tmp/1.zip", "/tmp/dir") + // Unzip .txt files + unzip("/tmp/2.zip", "/tmp/dir", def(p) = p.endsWith(".txt") ? p : "") + example_ru: |- + use zip + // Распаковать все файлы в директории + unzip("/tmp/1.zip", "/tmp/dir") + // Распаковать .txt файлы + unzip("/tmp/2.zip", "/tmp/dir", def(p) = p.endsWith(".txt") ? p : "") + - + name: unzipFiles + args: "input, output" + desc: |- + unpacks a `output` files from zip archive . + If `output` is a string, then a single file is unzipped. + If `output` is an array, then the files listed in it are unzipped. + If `output` is an associative array, the files listed in the keys are unzipped and the values will be file names. + Returns the number of unzipped files, or -1 if unzipping the archive was failed. + desc_ru: |- + распаковывает `output` файлы из zip архива. + Если `output` — строка, то разархивируется один файл. + Если `output` — массив, то разархивируются файлы, перечисленные в нём. + Если `output` — ассоциативный массив, то разархивируются файлы перечисленные в ключах, а именами файлов будут служить значения. + Возвращает количество разархивированных файлов, либо -1, если разархивировать архив не удалось. + example: |- + use zip + unzipFiles("/tmp/1.zip", "file.txt") + unzipFiles("/tmp/2.zip", ["file.txt", "readme.md"]) + unzipFiles("/tmp/3.zip", {"docs/1.md" : "/tmp/dir/file.txt", "docs/2.md" : "/tmp/dir/readme.md"}) + - + name: listZipEntries + args: "input" + desc: returns an array of zip archive filenames + desc_ru: возвращает массив с именами файлов zip архива \ No newline at end of file diff --git a/editors/README.md b/editors/README.md new file mode 100644 index 00000000..d58f6aa6 --- /dev/null +++ b/editors/README.md @@ -0,0 +1,19 @@ +# Syntax for Editors + +## Intellij IDEA + +1. Open an `idea` folder +2. Add all files and folders to zip archive, e.g. `settings.zip` +3. File -> Manage IDE Settings -> Import. Select your zip file. + +## Prism.js + +```javascript +import Prism from 'prismjs'; +import definePrismOwnLang from './prismjs/own-language.js' +definePrismOwnLang(Prism) +``` + +## GTKSourceView + +Place `ownlang.lang` in `/usr/share/gtksourceview-3.0/language-specs/ownlang.lang` \ No newline at end of file diff --git a/editors/gtksourceview/ownlang.lang b/editors/gtksourceview/ownlang.lang new file mode 100644 index 00000000..7d852cfa --- /dev/null +++ b/editors/gtksourceview/ownlang.lang @@ -0,0 +1,89 @@ + + + + text/x-own + *.own + // + /* + */ + + + +