From cc592d5a7525df5bce86bfe4f52d1a4892165e70 Mon Sep 17 00:00:00 2001 From: Brian Richter Date: Wed, 13 Sep 2023 13:32:28 -0700 Subject: [PATCH] Init --- .github/workflows/build-test.yml | 18 + .github/workflows/docs-deploy.yml | 55 + .github/workflows/publish-github.yml | 22 + .github/workflows/publish-npm.yml | 18 + .github/workflows/test-docs-deploy.yml | 29 + README.md | 33 + __tests__/.github/workflows/build-test.yml | 18 + __tests__/.github/workflows/docs-deploy.yml | 55 + .../.github/workflows/publish-github.yml | 22 + __tests__/.github/workflows/publish-npm.yml | 18 + .../.github/workflows/test-docs-deploy.yml | 29 + __tests__/.gitignore | 99 + __tests__/README.md | 37 + __tests__/content/config.yaml | 6 + __tests__/content/default.html | 1393 ++++++++++++++ .../content/glossaries/mrg.tev2.terms.yaml | 1488 +++++++++++++++ __tests__/content/mockup.md | 9 + __tests__/content/saf.yaml | 54 + __tests__/hrgt.test.js | 49 + __tests__/package-lock.json | 1657 +++++++++++++++++ __tests__/package.json | 49 + __tests__/tsconfig.json | 16 + package.json | 49 + src/Generator.ts | 88 + src/Glossary.ts | 247 +++ src/Report.ts | 111 ++ src/Run.ts | 97 + src/api/MRGApi.ts | 44 + src/models/Curator.ts | 9 + src/models/Email.ts | 7 + src/models/MRGEntry.ts | 7 + src/models/MRGModel.ts | 9 + src/models/SAFModel.ts | 9 + src/models/Scope.ts | 16 + src/models/ScopeRef.ts | 3 + src/models/Term.ts | 28 + src/models/Terminology.ts | 8 + src/models/Version.ts | 9 + src/processors/GeneratorContext.ts | 45 + src/processors/ModelWrangler.ts | 0 tsconfig.json | 16 + 41 files changed, 5976 insertions(+) create mode 100644 .github/workflows/build-test.yml create mode 100644 .github/workflows/docs-deploy.yml create mode 100644 .github/workflows/publish-github.yml create mode 100644 .github/workflows/publish-npm.yml create mode 100644 .github/workflows/test-docs-deploy.yml create mode 100644 README.md create mode 100644 __tests__/.github/workflows/build-test.yml create mode 100644 __tests__/.github/workflows/docs-deploy.yml create mode 100644 __tests__/.github/workflows/publish-github.yml create mode 100644 __tests__/.github/workflows/publish-npm.yml create mode 100644 __tests__/.github/workflows/test-docs-deploy.yml create mode 100644 __tests__/.gitignore create mode 100644 __tests__/README.md create mode 100644 __tests__/content/config.yaml create mode 100644 __tests__/content/default.html create mode 100644 __tests__/content/glossaries/mrg.tev2.terms.yaml create mode 100644 __tests__/content/mockup.md create mode 100644 __tests__/content/saf.yaml create mode 100644 __tests__/hrgt.test.js create mode 100644 __tests__/package-lock.json create mode 100644 __tests__/package.json create mode 100644 __tests__/tsconfig.json create mode 100644 package.json create mode 100644 src/Generator.ts create mode 100644 src/Glossary.ts create mode 100644 src/Report.ts create mode 100644 src/Run.ts create mode 100644 src/api/MRGApi.ts create mode 100644 src/models/Curator.ts create mode 100644 src/models/Email.ts create mode 100644 src/models/MRGEntry.ts create mode 100644 src/models/MRGModel.ts create mode 100644 src/models/SAFModel.ts create mode 100644 src/models/Scope.ts create mode 100644 src/models/ScopeRef.ts create mode 100644 src/models/Term.ts create mode 100644 src/models/Terminology.ts create mode 100644 src/models/Version.ts create mode 100644 src/processors/GeneratorContext.ts create mode 100644 src/processors/ModelWrangler.ts create mode 100644 tsconfig.json diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml new file mode 100644 index 0000000..b57ab82 --- /dev/null +++ b/.github/workflows/build-test.yml @@ -0,0 +1,18 @@ +name: 'build-test' +on: # rebuild any PRs and main branch changes + pull_request: + push: + branches: + - main + - 'releases/*' + +jobs: + build: # make sure build/ci work properly + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - run: | + npm install + npm run build + npm install -g + npm test diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml new file mode 100644 index 0000000..f35f0f7 --- /dev/null +++ b/.github/workflows/docs-deploy.yml @@ -0,0 +1,55 @@ +name: 'Deploy Docusaurus to GitHub Pages' +on: + push: + branches: + - main + paths: + - docs/** + # Review gh actions docs if you want to further define triggers, paths, etc + # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on + workflow_dispatch: + +jobs: + deploy: + defaults: + run: + shell: bash + name: Deploy to GitHub Pages + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 18 + cache: yarn + cache-dependency-path: docs + # Terminology reference resolution + - name: Install TRRT + run: npm install -g @tno-terminology-design/trrt@1.x + - name: Run TRRT + run: trrt --output . --scopedir __tests__/content '**/*.md' --force + + - name: Install dependencies + run: yarn install --frozen-lockfile + working-directory: docs + - name: Build website + run: yarn build + working-directory: docs + + # Popular action to deploy to GitHub Pages: + # Docs: https://github.com/peaceiris/actions-gh-pages#%EF%B8%8F-docusaurus + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + # Build output to publish to the `gh-pages` branch: + publish_dir: ./docs/build + # The following lines assign commit authorship to the official + # GH-Actions bot for deploys to `gh-pages` branch: + # https://github.com/actions/checkout/issues/13#issuecomment-724415212 + # The GH actions bot is used by default if you didn't specify the two fields. + # You can swap them out with your own user credentials. + # user_name: github-actions[bot] + # user_email: 41898282+github-actions[bot]@users.noreply.github.com diff --git a/.github/workflows/publish-github.yml b/.github/workflows/publish-github.yml new file mode 100644 index 0000000..ce28a88 --- /dev/null +++ b/.github/workflows/publish-github.yml @@ -0,0 +1,22 @@ +name: Publish package to GitHub Packages +on: + release: + types: [published] +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: '18.x' + registry-url: 'https://npm.pkg.github.com' + scope: '@tno-terminology-design' + - run: npm ci + - run: npm run build + - run: npm publish --access public + env: + NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml new file mode 100644 index 0000000..3d3f5af --- /dev/null +++ b/.github/workflows/publish-npm.yml @@ -0,0 +1,18 @@ +name: Publish Package to npmjs +on: + release: + types: [published] +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: '18.x' + registry-url: 'https://registry.npmjs.org' + - run: npm ci + - run: npm run build + - run: npm publish --access public + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/test-docs-deploy.yml b/.github/workflows/test-docs-deploy.yml new file mode 100644 index 0000000..f5462d0 --- /dev/null +++ b/.github/workflows/test-docs-deploy.yml @@ -0,0 +1,29 @@ +name: 'Test docusaurus deployment' +on: + pull_request: + branches: + - main + # Review gh actions docs if you want to further define triggers, paths, etc + # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on + +jobs: + test-deploy: + # defaults: + # run: + # shell: bash + # working-directory: docs + name: Test deployment + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 18 + cache: yarn + cache-dependency-path: docs + - name: Install dependencies + run: yarn install --frozen-lockfile + working-directory: ./docs + - name: Test build website + run: yarn build + working-directory: ./docs \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..9c2c5f5 --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +# Machine Readable Glossary Tool (MRGT) + +## Overview + +The **Machine Readable Glossary Tool (MRGT)** generates a Machine Readable Glossary (MRG) for each of the versions of the terminology that are maintained with that scope by reading the SAF. There is more information about here: +- [overview of the TEv2 tools](https://tno-terminology-design.github.io/tev2-specifications/docs/tev2-overview) of which the TRRT is a part. + +## Installation + +Install from the command line and make globally available. + +```bash +npm install @aviarytech/mrgt -g +``` + +## Calling the Tool + +The behavior of the MRGT can be configured per call e.g. by a configuration file and/or command-line parameters. The command-line syntax is as follows: + +```bash +mrgt [ ] +``` + +The MRGT takes in the following parameters: + +| Flags | Description | Required | +|--------------------------|-----------------------------------------------------------------------------------|:--------:| +| -c, --config \ | Path (including the filename) of the tool's (YAML) configuration file | No | +| -s, --scopedir \ | Path of the scope directory where the SAF is located | Yes | +| -v, --vsntag \ | Version tag for which the MRG will be generated. When omitted, an MRG will be generated for every version of the terminology that is specified in the versions section of the SAF | No | +| -e, --onNotExist \ | Specifies the action to take if a vsntag was specified but wasn't found in the SAF. Default is 'throw'. Options: 'throw', 'warn', 'log', 'ignore' | No | + + diff --git a/__tests__/.github/workflows/build-test.yml b/__tests__/.github/workflows/build-test.yml new file mode 100644 index 0000000..b57ab82 --- /dev/null +++ b/__tests__/.github/workflows/build-test.yml @@ -0,0 +1,18 @@ +name: 'build-test' +on: # rebuild any PRs and main branch changes + pull_request: + push: + branches: + - main + - 'releases/*' + +jobs: + build: # make sure build/ci work properly + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - run: | + npm install + npm run build + npm install -g + npm test diff --git a/__tests__/.github/workflows/docs-deploy.yml b/__tests__/.github/workflows/docs-deploy.yml new file mode 100644 index 0000000..f35f0f7 --- /dev/null +++ b/__tests__/.github/workflows/docs-deploy.yml @@ -0,0 +1,55 @@ +name: 'Deploy Docusaurus to GitHub Pages' +on: + push: + branches: + - main + paths: + - docs/** + # Review gh actions docs if you want to further define triggers, paths, etc + # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on + workflow_dispatch: + +jobs: + deploy: + defaults: + run: + shell: bash + name: Deploy to GitHub Pages + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 18 + cache: yarn + cache-dependency-path: docs + # Terminology reference resolution + - name: Install TRRT + run: npm install -g @tno-terminology-design/trrt@1.x + - name: Run TRRT + run: trrt --output . --scopedir __tests__/content '**/*.md' --force + + - name: Install dependencies + run: yarn install --frozen-lockfile + working-directory: docs + - name: Build website + run: yarn build + working-directory: docs + + # Popular action to deploy to GitHub Pages: + # Docs: https://github.com/peaceiris/actions-gh-pages#%EF%B8%8F-docusaurus + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + # Build output to publish to the `gh-pages` branch: + publish_dir: ./docs/build + # The following lines assign commit authorship to the official + # GH-Actions bot for deploys to `gh-pages` branch: + # https://github.com/actions/checkout/issues/13#issuecomment-724415212 + # The GH actions bot is used by default if you didn't specify the two fields. + # You can swap them out with your own user credentials. + # user_name: github-actions[bot] + # user_email: 41898282+github-actions[bot]@users.noreply.github.com diff --git a/__tests__/.github/workflows/publish-github.yml b/__tests__/.github/workflows/publish-github.yml new file mode 100644 index 0000000..ce28a88 --- /dev/null +++ b/__tests__/.github/workflows/publish-github.yml @@ -0,0 +1,22 @@ +name: Publish package to GitHub Packages +on: + release: + types: [published] +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: '18.x' + registry-url: 'https://npm.pkg.github.com' + scope: '@tno-terminology-design' + - run: npm ci + - run: npm run build + - run: npm publish --access public + env: + NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/__tests__/.github/workflows/publish-npm.yml b/__tests__/.github/workflows/publish-npm.yml new file mode 100644 index 0000000..3d3f5af --- /dev/null +++ b/__tests__/.github/workflows/publish-npm.yml @@ -0,0 +1,18 @@ +name: Publish Package to npmjs +on: + release: + types: [published] +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: '18.x' + registry-url: 'https://registry.npmjs.org' + - run: npm ci + - run: npm run build + - run: npm publish --access public + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/__tests__/.github/workflows/test-docs-deploy.yml b/__tests__/.github/workflows/test-docs-deploy.yml new file mode 100644 index 0000000..f5462d0 --- /dev/null +++ b/__tests__/.github/workflows/test-docs-deploy.yml @@ -0,0 +1,29 @@ +name: 'Test docusaurus deployment' +on: + pull_request: + branches: + - main + # Review gh actions docs if you want to further define triggers, paths, etc + # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on + +jobs: + test-deploy: + # defaults: + # run: + # shell: bash + # working-directory: docs + name: Test deployment + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 18 + cache: yarn + cache-dependency-path: docs + - name: Install dependencies + run: yarn install --frozen-lockfile + working-directory: ./docs + - name: Test build website + run: yarn build + working-directory: ./docs \ No newline at end of file diff --git a/__tests__/.gitignore b/__tests__/.gitignore new file mode 100644 index 0000000..120e52e --- /dev/null +++ b/__tests__/.gitignore @@ -0,0 +1,99 @@ +# Dependency directory +node_modules + +# Rest pulled from https://github.com/github/gitignore/blob/master/Node.gitignore +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# OS metadata +.DS_Store +Thumbs.db + +# Ignore built files +__tests__/output +lib diff --git a/__tests__/README.md b/__tests__/README.md new file mode 100644 index 0000000..fe62e43 --- /dev/null +++ b/__tests__/README.md @@ -0,0 +1,37 @@ +# Human Readable Glossary Tool (HRGT) + +## Overview + +The **Human Readable Glossary Tool (HRGT)** generates a Human Readable Glossary (HRG) that consists of (a selection of) the terms that are part of the terminology of a specific scope. The HRGT takes one specific MRG as its input, and converts (a selection of) its MRG entries into one of the supported output formats, e.g. HTML, or PDF. The file that contains the MRG is named mrg...yaml, where the combination of and identify a particular terminology. See the MRG file naming conventions for details. There is more information about +- [overview of the TEv2 tools](https://tno-terminology-design.github.io/tev2-specifications/docs/tev2-overview) of which the TRRT is a part. + +## Installation + +Install from the command line and make globally available. + +```bash +npm install @aviarytech/hrgt -g +``` + +## Calling the Tool + +The behavior of the HRGT can be configured per call e.g. by a configuration file and/or command-line parameters. The command-line syntax is as follows: + +```bash +hrgt [ ] [ ] +``` + +The HRGT takes in the following parameters: + +|Flags |Description |Required| +|------------------------------|------------------------------------------------------------------------|:------:| +|-c, --config \ |Path (including the filename) of the tool's (YAML) configuration file |No | +|input \ |Glob pattern that specifies the set of (input) files |No | +|-o, --output \ |text that is used as the last part of the name of the file(s) that contain(s) the generated HRG(s). |No | +|-s, --scopedir \ |Path of the scope directory where the SAF is located |No | +|-v, --vsntag \ |Default version to use when no version is set in term ref |No | +|-f, --force |Allow overwriting of existing files |No | +|-t, --termselcrit \ |List of term selection criteria that are used to generate |No | +|-m, --method \ |The method that is used to create the output (default HTML) |No | +|-l, --license \ |File that contains the licensing conditions |No | + diff --git a/__tests__/content/config.yaml b/__tests__/content/config.yaml new file mode 100644 index 0000000..915a6f1 --- /dev/null +++ b/__tests__/content/config.yaml @@ -0,0 +1,6 @@ +# TRRT configuration file (yaml) +# output: __tests__/output +scopedir: __tests__/content +# glob pattern strings for files to be processed +# input: +# - __tests__/content/*.md diff --git a/__tests__/content/default.html b/__tests__/content/default.html new file mode 100644 index 0000000..7616a39 --- /dev/null +++ b/__tests__/content/default.html @@ -0,0 +1,1393 @@ + + + + + + +Glossary + + +
+

Glossary

+
    +
  • +
    + Term: @ +
    +
    + Definition: + No glossary text available. +
    +
  • +
  • +
    + Term: author +
    +
    + Definition: + a person that creates a text that is meant to be read and understood by others - usually, a particular audience. +
    +
    + Alternative Terms: author +
    +
    + Alternative Terms: authors +
    +
  • +
  • +
    + Term: body +
    +
    + Definition: + the part of a [curated text](@) that comes after its [header](@), i.e. behind the so-called 'front-matter'. +
    +
    + Alternative Terms: body +
    +
    + Alternative Terms: bodys +
    +
    + Alternative Terms: bodies +
    +
  • +
  • +
    + Term: concept +
    +
    + Definition: + a [knowledge artifact](@) that captures the ideas/thoughts behind a classification of [entities](@) (what makes [entities](@) in that class 'the same'). +
    +
    + Alternative Terms: concept +
    +
    + Alternative Terms: concepts +
    +
  • +
  • +
    + Term: conceptualization +
    +
    + Definition: + a mental representation or abstract idea formed by a [party](@) to categorize, organize, and make sense of information, experiences, objects, or abstract notions; it allows the [party](@) to recognize similarities and differences between [entities](@) or events. +
    +
    + Alternative Terms: conceptualization +
    +
    + Alternative Terms: conceptualizations +
    +
  • +
  • +
    + Term: converter +
    +
    + Definition: + a software component that takes the output of an [interpreter](@), i.e., the set of moustache variables it has produced, and processes these, possibly with other data from e.g. a [MRG](@), to generate a new, converted text in a different format. The converter uses the values assigned to the moustache variables to produce the transformed output. +
    +
    + Alternative Terms: converter +
    +
    + Alternative Terms: converters +
    +
  • +
  • +
    + Term: corpus +
    +
    + Definition: + the documentation that describes the [knowledge](@) around a set of [terms](@) and [concepts](@). +
    +
    + Alternative Terms: corpus +
    +
    + Alternative Terms: corpora +
    +
    + Alternative Terms: corpus-of-terminology +
    +
  • +
  • +
    + Term: curate +
    +
    + Definition: + to select, organize, and present [terms](@), [definitions](@), and other, related content in a thoughtful and purposeful manner to establish shared understanding among a [community](@) working together on a particular set of objectives. +
    +
    + Alternative Terms: curates +
    +
    + Alternative Terms: curated +
    +
    + Alternative Terms: curating +
    +
    + Alternative Terms: curation +
    +
  • +
  • +
    + Term: curated-text +
    +
    + Definition: + a text that documents a [concept](@) or other [knowledge artifact](@) of a specific [community](@) or other [party](@), and is located within a [scope](@) that is owned by that [community](@)/[party](@). +
    +
    + Alternative Terms: curated-text +
    +
    + Alternative Terms: curated-texts +
    +
    + Alternative Terms: ctext +
    +
    + Alternative Terms: ctexts +
    +
    + Alternative Terms: curated-file +
    +
    + Alternative Terms: curated-files +
    +
    + Alternative Terms: cfile +
    +
    + Alternative Terms: cfiles +
    +
  • +
  • +
    + Term: curatedir +
    +
    + Definition: + a directory within a [scopedir](@) within which every file contains a [curated texts](@) for that [scope](@). +
    +
    + Alternative Terms: curatedir +
    +
    + Alternative Terms: curatedirs +
    +
    + Alternative Terms: curate-directory +
    +
    + Alternative Terms: curate-directorys +
    +
    + Alternative Terms: curate-directories +
    +
  • +
  • +
    + Term: curator +
    +
    + Definition: + a person responsible for curating, managing, and maintaining the [terminologies](@), to ensure shared understanding among a [community](@) working together on a particular set of objectives. +
    +
    + Alternative Terms: curator +
    +
    + Alternative Terms: curators +
    +
    + Alternative Terms: terminology-curator +
    +
    + Alternative Terms: terminology-curators +
    +
  • +
  • +
    + Term: define +
    +
    + Definition: + to provide a criterion and a [term](@), where the criterion can be used by people to determine whether or not something is an instance/example of a [concept](@) (or other [terminological artifact](@)), and the [term](@) is used to refer to that [concept](@), or an arbitrary instance thereof. +
    +
    + Alternative Terms: defines +
    +
    + Alternative Terms: defined +
    +
    + Alternative Terms: defining +
    +
  • +
  • +
    + Term: definition +
    +
    + Definition: + a text that helps [parties](@) to have the same understanding about the meaning of (and [concepts](@) behind) a [term](@), ideally in such a way that these [parties](@) can determine whether or not they make the same distinction. +
    +
    + Alternative Terms: definition +
    +
    + Alternative Terms: definitions +
    +
    + Alternative Terms: good-definition +
    +
    + Alternative Terms: good-definitions +
    +
  • +
  • +
    + Term: dictionary +
    +
    + Definition: + an alphabetically sorted list of [terms](@) with various meanings that they may have in different contexts. +
    +
    + Alternative Terms: dictionary +
    +
    + Alternative Terms: dictionarys +
    +
    + Alternative Terms: dictionaries +
    +
  • +
  • +
    + Term: formatted-text +
    +
    + Definition: + a text that has been processed and arranged to have a specific layout, style, and presentation, making it visually appealing and easy to read. +
    +
    + Alternative Terms: formatted-text +
    +
    + Alternative Terms: formatted-texts +
    +
  • +
  • +
    + Term: form-phrase +
    +
    + Definition: + a word or phrase, other than the actual [term](@) that, when used in a [TermRef](@) would typically also refer to this [term](@). Form phrases may include plural forms, possessive extensions, verb-conjugation forms, and other variations. +
    +
    + Alternative Terms: form-phrase +
    +
    + Alternative Terms: form-phrases +
    +
  • +
  • +
    + Term: glossary +
    +
    + Definition: + an alphabetically sorted list of [terms](@) with the (single) meaning it has in (at least) one context. +
    +
    + Alternative Terms: glossary +
    +
    + Alternative Terms: glossarys +
    +
    + Alternative Terms: glossaries +
    +
  • +
  • +
    + Term: glossarydir +
    +
    + Definition: + a directory within a [scopedir](@) within which the different versions of its ([machine readable](mrg@) and [human readable](hrg@)) [glossaries](@) are created and maintained. +
    +
    + Alternative Terms: glossarydir +
    +
    + Alternative Terms: glossarydirs +
    +
    + Alternative Terms: glossary-directory +
    +
    + Alternative Terms: glossary-directorys +
    +
    + Alternative Terms: glossary-directories +
    +
  • +
  • +
    + Term: grouptag +
    +
    + Definition: + a [tag](@) that is used to group [terms](@) within a specific [scope](@). +
    +
    + Alternative Terms: grouptag +
    +
    + Alternative Terms: grouptags +
    +
    + Alternative Terms: group-tag +
    +
    + Alternative Terms: group-tags +
    +
  • +
  • +
    + Term: header +
    +
    + Definition: + the part of a [curated text](@), which is at the beginning of that text, that starts with a line that (only) contains three subsequent '-'characters, and that ends with a second occurrance of such a line. +
    +
    + Alternative Terms: header +
    +
    + Alternative Terms: headers +
    +
  • +
  • +
    + Term: hrd +
    +
    + Definition: + a [dictionary](@) that presents terms and their meanings in a format that is easily understandable and accessible to humans, typically organized alphabetically. +
    +
    + Alternative Terms: hrd +
    +
    + Alternative Terms: hrds +
    +
    + Alternative Terms: human-readable-dictionary +
    +
    + Alternative Terms: human-readable-dictionarys +
    +
    + Alternative Terms: human-readable-dictionaries +
    +
    + Alternative Terms: human-readable-dictionary-hrd +
    +
    + Alternative Terms: human-readable-dictionary-hrds +
    +
  • +
  • +
    + Term: hrdt +
    +
    + Definition: + a software tool designed to create, manage, and process [Human Readable Dictionaries (HRDs)](hrd@). +
    +
    + Alternative Terms: human-readable-dictionary-tool +
    +
    + Alternative Terms: human-readable-dictionary-tools +
    +
    + Alternative Terms: hrd-tool +
    +
    + Alternative Terms: hrd-tools +
    +
    + Alternative Terms: hrdt +
    +
    + Alternative Terms: hrdts +
    +
  • +
  • +
    + Term: hrg-entry +
    +
    + Definition: + A specific kind of (human-readable) rendering of the combination of a [term](@) and a means that helps [readers](@) to understand the meaning of that [term](@) when it is used in a sentence. +
    +
    + Alternative Terms: hrg-entry +
    +
    + Alternative Terms: hrg-entrys +
    +
    + Alternative Terms: hrg-entries +
    +
  • +
  • +
    + Term: hrg +
    +
    + Definition: + a [glossary](@) that is designed to be easily understandable and accessible to humans. HRGs present terms and their meanings in a format that prioritizes human comprehension and may include additional contextual information to aid understanding. +
    +
    + Alternative Terms: hrg +
    +
    + Alternative Terms: hrgs +
    +
    + Alternative Terms: machine-readable-glossary +
    +
    + Alternative Terms: machine-readable-glossarys +
    +
    + Alternative Terms: machine-readable-glossaries +
    +
    + Alternative Terms: machine-readable-glossary-hrg +
    +
    + Alternative Terms: machine-readable-glossary-hrgs +
    +
    + Alternative Terms: machine-readable-glossarys-hrg +
    +
    + Alternative Terms: machine-readable-glossarys-hrgs +
    +
    + Alternative Terms: machine-readable-glossaries-hrg +
    +
    + Alternative Terms: machine-readable-glossaries-hrgs +
    +
  • +
  • +
    + Term: hrgt +
    +
    + Definition: + a software tool designed to create, manage, and process [Human Readable Glossaries (HRGs)](@), as [specified by TEv2](/docs/spec-tools/hrgt). HRGTs offer features for selecting [terms](@) that are [curated](@) within the [scope](@) it is run in, or from other [scopes](@). +
    +
    + Alternative Terms: hrgt +
    +
    + Alternative Terms: hrgts +
    +
    + Alternative Terms: machine-readable-glossary-tool +
    +
    + Alternative Terms: machine-readable-glossary-tools +
    +
    + Alternative Terms: machine-readable-glossary-tool-hrtt +
    +
    + Alternative Terms: machine-readable-glossary-tool-hrtts +
    +
    + Alternative Terms: machine-readable-glossary-tools-hrtt +
    +
    + Alternative Terms: machine-readable-glossary-tools-hrtts +
    +
  • +
  • +
    + Term: ict +
    +
    + Definition: + a software tool designed to check the integrity and conformity of various files used in the curation and management of [glossaries](@), [dictionaries](@), [curated texts](@), and other data within a terminology project. The ICT verifies that the files adhere to the [TEv2 file specifications](/docs-spec-files), ensuring the consistency and accuracy of the terminology data. +
    +
    + Alternative Terms: ict +
    +
    + Alternative Terms: integrity-checker +
    +
  • +
  • +
    + Term: identifier +
    +
    + Definition: + a character string that is being used for the identification of some [entity](@) (yet may refer to 0, 1, or more [entities](@), depending on the context within which it is being used). +
    +
    + Alternative Terms: identifier +
    +
    + Alternative Terms: identifiers +
    +
  • +
  • +
    + Term: identify +
    +
    + Definition: + an [act](@), by or on behalf of a [party](@), that results in the selection of either&#10- a single [partial identity](@) that the party [owns](@), given some (observed or received) data, or&#10- a single [entity](@) from a given set of entities that is the [subject](@) of a specified [partial identity](@) that the party [owns](@). +
    +
    + Alternative Terms: identify +
    +
    + Alternative Terms: identifys +
    +
    + Alternative Terms: identifies +
    +
    + Alternative Terms: identifier +
    +
    + Alternative Terms: identifying +
    +
    + Alternative Terms: identified +
    +
    + Alternative Terms: identifiable +
    +
    + Alternative Terms: identification +
    +
  • +
  • +
    + Term: ingestion +
    +
    + Definition: + the process that is run by a [terms-community](@), in which their members suggest, draft, and discuss [definitions](@) ([terms](@) + [criteria](@)) that are relevant for a particular [scope](@), and converting such contributions into [curated texts](@) that accurately document the [concepts](@) and other [terminologic artifacts](@) and that adhere to the [TEv2-specifications](/docs/spec-files/ctext). +
    +
    + Alternative Terms: ingestion-process +
    +
    + Alternative Terms: ingestion-processes +
    +
  • +
  • +
    + Term: ingestion-profile +
    +
    + Definition: + the specification of a method by which files that are in a particular place and format (e.g., wiki files) are turned into a [curated text](@). +
    +
    + Alternative Terms: ingestion-profile +
    +
    + Alternative Terms: ingestion-profiles +
    +
  • +
  • +
    + Term: interpreter +
    +
    + Definition: + a software component that reads a (source) text of a specific format, such as a wiki-page or JSON file, and produces a set of [moustache variables](@) based on a predefined profile. These [variables](moustache-variables@) represent extracted data or metadata from the source text. +
    +
    + Alternative Terms: interpreter +
    +
    + Alternative Terms: interpreters +
    +
  • +
  • +
    + Term: knowledge-artifact +
    +
    + Definition: + something that can be thought of as existing in a particular [knowledge](@), e.g. a [concept](@), or a [mental model](@). +
    +
    + Alternative Terms: knowledge-artifact +
    +
    + Alternative Terms: knowledge-artifacts +
    +
    + Alternative Terms: knowledge-artefact +
    +
    + Alternative Terms: knowledge-artefacts +
    +
  • +
  • +
    + Term: mental-model +
    +
    + Definition: + A [knowledge artifact](@) that relates a set of [concepts](@) (ideas), [relations](@) between them, and constraints about a certain topic, into a coherent and consistent whole (sometimes called 'viewpoint', or 'way of thinking'). +
    +
    + Alternative Terms: mental-model +
    +
    + Alternative Terms: mental-models +
    +
    + Alternative Terms: pattern +
    +
    + Alternative Terms: patterns +
    +
    + Alternative Terms: conceptual-model +
    +
    + Alternative Terms: conceptual-models +
    +
  • +
  • +
    + Term: moustache-variable +
    +
    + Definition: + a placeholder in the form of a 'moustache' tag, e.g. `{{variable_name}}``, within some text. They are used, e.g., by the [TRRT](@), where they get their values from an [interpreter](@), and where they are used in a selected [converter](@) for the purpose of replacing [TermRefs](@) with [renderable refs](@). +
    +
    + Alternative Terms: moustache-variable +
    +
    + Alternative Terms: moustache-variables +
    +
  • +
  • +
    + Term: mrd +
    +
    + Definition: + a type of [dictionary](@) that is formatted in a way that can be easily processed and interpreted by computers or software programs. It uses the YAML format to represent the [terms](@) and their [meanings](@). +
    +
    + Alternative Terms: machine-readable-dictionary +
    +
    + Alternative Terms: machine-readable-dictionarys +
    +
    + Alternative Terms: machine-readable-dictionaries +
    +
    + Alternative Terms: mrd +
    +
    + Alternative Terms: mrds +
    +
    + Alternative Terms: machine-readable-dictionary-mrd +
    +
    + Alternative Terms: machine-readable-dictionary-mrds +
    +
  • +
  • +
    + Term: mrdt +
    +
    + Definition: + a software tool designed to create, manage, and process [Machine Readable Dictionaries (MRDs)](mrd@). +
    +
    + Alternative Terms: machine-readable-dictionary-tool +
    +
    + Alternative Terms: machine-readable-dictionary-tools +
    +
    + Alternative Terms: mrd-tool +
    +
    + Alternative Terms: mrd-tools +
    +
    + Alternative Terms: mrdt +
    +
    + Alternative Terms: mrdts +
    +
  • +
  • +
    + Term: mrg-entry +
    +
    + Definition: + A machine-readable (and interpretable) artifact that contains (pointers to) data and meta-data about a particular [knowledge artifact](@), such as the associated [term(s)](@), its [definition](@), etc., to make it easy for IT-tools to create, e.g. documentation, [glossaries](@), [dictionaries](@), whitepapers, etc. that uses such [terms](@) ([definitions](@), etc.). +
    +
    + Alternative Terms: mrg-entry +
    +
    + Alternative Terms: mrg-entrys +
    +
    + Alternative Terms: mrg-entries +
    +
  • +
  • +
    + Term: mrg-importer +
    +
    + Definition: + is a tool in the [TEv2](@) toolbox that is run within a particular [scope](@) for the purpose of obtaining [MRGs](@) from other [scopes](@), as specified in the [scope's](@) [SAF](@), and putting them in the [scope's](@) [glossarydir](@). +
    +
    + Alternative Terms: mrg-importer +
    +
    + Alternative Terms: mrg-import-tool +
    +
  • +
  • +
    + Term: mrg +
    +
    + Definition: + a [glossary](@) for a particular (version of a) [terminology](@) that is formatted in YAML, according to the [TEv2 MRG specifications](/docs/spec-files/mrg), to enable automated processing and integration with software systems. +
    +
    + Alternative Terms: mrg +
    +
    + Alternative Terms: mrgs +
    +
    + Alternative Terms: machine-readable-glossary +
    +
    + Alternative Terms: machine-readable-glossarys +
    +
    + Alternative Terms: machine-readable-glossaries +
    +
    + Alternative Terms: machine-readable-glossary-mrg +
    +
    + Alternative Terms: machine-readable-glossary-mrgs +
    +
    + Alternative Terms: machine-readable-glossarys-mrg +
    +
    + Alternative Terms: machine-readable-glossarys-mrgs +
    +
    + Alternative Terms: machine-readable-glossaries-mrg +
    +
    + Alternative Terms: machine-readable-glossaries-mrgs +
    +
  • +
  • +
    + Term: mrgt +
    +
    + Definition: + a software tool designed to create, manage, and process [Machine Readable Glossaries (MRGs)](@), as [specified by TEv2](/docs/spec-tools/mrgt). MRGTs offer features for selecting [terms](@) that are [curated](@) within the [scope](@) it is run in, or from other [scopes](@). +
    +
    + Alternative Terms: mrgt +
    +
    + Alternative Terms: mrgts +
    +
    + Alternative Terms: machine-readable-glossary-tool +
    +
    + Alternative Terms: machine-readable-glossary-tools +
    +
    + Alternative Terms: machine-readable-glossary-tool-mrgt +
    +
    + Alternative Terms: machine-readable-glossary-tool-mrgts +
    +
    + Alternative Terms: machine-readable-glossary-tools-mrgt +
    +
    + Alternative Terms: machine-readable-glossary-tools-mrgts +
    +
  • +
  • +
    + Term: property +
    +
    + Definition: + a connection or association between a [concept](@) and a primitive data element, such as a text or a number, that represents some characteristic that instances of the [concept](@) may have. +
    +
    + Alternative Terms: property +
    +
    + Alternative Terms: propertys +
    +
    + Alternative Terms: properties +
    +
  • +
  • +
    + Term: reader +
    +
    + Definition: + a person that reads a text that is authored by another person (its [author](@)]), and that tries to understand the meaning of this text in the way its [author](@) intended. +
    +
    + Alternative Terms: reader +
    +
    + Alternative Terms: readers +
    +
  • +
  • +
    + Term: relation +
    +
    + Definition: + a (significant) connection or association between two or more [concepts](@). These connections define the way these [concepts](@) are interrelated, providing insights into how they interact and influence each other. +
    +
    + Alternative Terms: relation +
    +
    + Alternative Terms: relations +
    +
  • +
  • +
    + Term: renderable-ref +
    +
    + Definition: + a text with which the [TRRT](@) replaces a [TermRef](@), that can be processed by specific third party rendering tools, the result of which is a rendering of the original [TermRef](@) that has additional characteristics that help [readers](@) to (better) understand the intention of its [author](@). +
    +
    + Alternative Terms: renderable-ref +
    +
    + Alternative Terms: renderable-refs +
    +
    + Alternative Terms: renderable-reference +
    +
    + Alternative Terms: renderable-references +
    +
  • +
  • +
    + Term: saf +
    +
    + Definition: + a YAML file that contains essential data about a particular [scope](@) (e.g., specifying where its [curated texts](@), [glossaries](@) etc. live), the relationships this [scope](@) has with other [scopes](@), and the specifications of the different [terminologies](@) that are [curated](@) within that [scope](@). +
    +
    + Alternative Terms: saf +
    +
    + Alternative Terms: safs +
    +
    + Alternative Terms: scope-administration-file +
    +
    + Alternative Terms: scope-administration-files +
    +
    + Alternative Terms: scope-administration-file-saf +
    +
    + Alternative Terms: scope-administration-file-safs +
    +
    + Alternative Terms: scope-administration-files-saf +
    +
    + Alternative Terms: scope-administration-files-safs +
    +
    + Alternative Terms: saf-scope-administration-file +
    +
    + Alternative Terms: saf-scope-administration-files +
    +
    + Alternative Terms: safs-scope-administration-file +
    +
    + Alternative Terms: safs-scope-administration-files +
    +
  • +
  • +
    + Term: scope +
    +
    + Definition: + the extent of the [terms](@), [definitions](@) and other documentation that a [community](@) (which we call the [owner](@) of the [scope](@)) needs to express, communicate and validate its [knowledge](@) as relevant to achieving a specific subset of its [objectives](@). +
    +
    + Alternative Terms: scope +
    +
    + Alternative Terms: scopes +
    +
    + Alternative Terms: scope-context +
    +
    + Alternative Terms: scope-contexts +
    +
  • +
  • +
    + Term: scoped-term +
    +
    + Definition: + a [term](@) that represents (and [identifies](@)) a specific [knowledge artifact](@) of a particular [community](@) (or [party](@)). +
    +
    + Alternative Terms: scoped-term +
    +
    + Alternative Terms: scoped-terms +
    +
  • +
  • +
    + Term: scopedir +
    +
    + Definition: + a directory in a computer file system that contains all files that are either being [curated](@) within a particular [scope](@), or generated to serve some purpose within that [scope](@). +
    +
    + Alternative Terms: scopedir +
    +
    + Alternative Terms: scopedirs +
    +
    + Alternative Terms: scope-directory +
    +
    + Alternative Terms: scope-directorys +
    +
    + Alternative Terms: scope-directories +
    +
  • +
  • +
    + Term: scopetag +
    +
    + Definition: + a [tag](@) that is used to [identify](@) [scopes](@) from within a specific [scope](@) +
    +
    + Alternative Terms: scopetag +
    +
    + Alternative Terms: scopetags +
    +
    + Alternative Terms: scope-tag +
    +
    + Alternative Terms: scope-tags +
    +
  • +
  • +
    + Term: semantics +
    +
    + Definition: + a mapping between the (tangible/textual) [terms](@) and (intangible) ideas/[concepts](@) - their meaning. +
    +
    + Alternative Terms: semantics +
    +
  • +
  • +
    + Term: synonym +
    +
    + Definition: + a [term](@) that has the same (or similar) meaning as another [term](@). +
    +
    + Alternative Terms: synonym +
    +
    + Alternative Terms: synonyms +
    +
  • +
  • +
    + Term: tag +
    +
    + Definition: + an alphanumeric string that is used to identify [scopes](@) (so called 'scopetags'), group [terms](@) (so called 'grouptags'), or identify a specific version of a [terminology](@) (so called 'versiontags') from within a specific [scope](@). +
    +
    + Alternative Terms: tag +
    +
    + Alternative Terms: tags +
    +
  • +
  • +
    + Term: term-identifier +
    +
    + Definition: + a [text](identifier@) that [identifies](@) a [knowledge artifact](@) within a particular [scope](@), and hence also the [curated text](@) that describes it, which includes its [definition](@). +
    +
    + Alternative Terms: term-identifier +
    +
    + Alternative Terms: term-identifiers +
    +
  • +
  • +
    + Term: term-ref +
    +
    + Definition: + a word or phrase that is [marked up (in a specific way)](/docs/spec-syntax/term-ref-syntax) so that it refers to a particular [concept](@) (or other [knowledge artifact](@)), enabling it to be rendered in a variety of ways for the purpose of helping [readers](@) to (better) understand the intention of its [author](@). +
    +
    + Alternative Terms: term-ref +
    +
    + Alternative Terms: term-refs +
    +
    + Alternative Terms: termref +
    +
    + Alternative Terms: termrefs +
    +
    + Alternative Terms: term-reference +
    +
    + Alternative Terms: term-references +
    +
  • +
  • +
    + Term: term-selection-criteria +
    +
    + Definition: + criteria that are used within a particular [scope](@) for the selection of [terms](@) that are part of a particular [terminology](@). +
    +
    + Alternative Terms: term-selection-criteria +
    +
    + Alternative Terms: selection-criteria +
    +
  • +
  • +
    + Term: term-syntax +
    +
    + Definition: + the criterion that specifies which texts can serve as a [term](@), which is that the text must match with (PCRE) regex [`[A-Za-z0-9\s_]+`](https://www.debuggex.com/r/YQppbqxps5jI0t0P). +
    +
    + Alternative Terms: term-syntaxes +
    +
  • +
  • +
    + Term: term-type +
    +
    + Definition: + a [text](identifier@) that [identifies](@) a particular *kind* of [knowledge artifact](@) within a particular [scope](@). Examples include `concept`, `relation`, `pattern` (or `mental-model`). +
    +
    + Alternative Terms: term-type +
    +
    + Alternative Terms: term-types +
    +
  • +
  • +
    + Term: term +
    +
    + Definition: + a word or phrase (i.e.: text) that is used to represent ([identify](@)) a specific [knowledge artifact](@) (in some [scope](@)). +
    +
    + Alternative Terms: term +
    +
    + Alternative Terms: terms +
    +
    + Alternative Terms: word +
    +
    + Alternative Terms: words +
    +
    + Alternative Terms: phrase +
    +
    + Alternative Terms: phrases +
    +
  • +
  • +
    + Term: terminological-artifact +
    +
    + Definition: + a basic building block of meaning or representation, i.e., a 'semantic unit' within the 'mind' of a [scope](@), such as a [concept](@), a [relation](@), or a [property](@). +
    +
    + Alternative Terms: terminological-artifact +
    +
    + Alternative Terms: semantic-unit +
    +
    + Alternative Terms: cognitive-science-unit +
    +
  • +
  • +
    + Term: terminology-process +
    +
    + Definition: + a method for recognizing misunderstandings as such, and creating or maintaining [definitions](@) that resolve them. +
    +
    + Alternative Terms: terminology-processes +
    +
  • +
  • +
    + Term: terminology-under-construction +
    +
    + Definition: + a set of [terms](@) (that is initially empty), to which [terms](@) can be added or removed as specified by [term selection criteria](@), so as to ultimately result in a proper [terminology](@). +
    +
  • +
  • +
    + Term: terminology +
    +
    + Definition: + a set of [terms](scoped-term@) that are used within a single [scope](@) to refer to [concepts](@) and other [knowledge artifacts](@) of a single [party](@) (e.g. a [community](@)), enabling [parties](@) to reason and communicate ideas they have about one or more specific topics. +
    +
    + Alternative Terms: terminology +
    +
    + Alternative Terms: terminologys +
    +
    + Alternative Terms: terminologies +
    +
  • +
  • +
    + Term: terms-community +
    +
    + Definition: + a [community](@) that maintains a [terminology](@) for the purpose of avoiding misunderstandings between its members as they collaborate. +
    +
    + Alternative Terms: terms-community +
    +
    + Alternative Terms: terms-communitys +
    +
    + Alternative Terms: terms-communities +
    +
  • +
  • +
    + Term: tev2-tool +
    +
    + Definition: + any software application or utility designed to support and streamline various tasks related to terminology management following the TEv2 specifications. +
    +
    + Alternative Terms: tev2-tool +
    +
    + Alternative Terms: tev2-tools +
    +
    + Alternative Terms: tool +
    +
    + Alternative Terms: tools +
    +
  • +
  • +
    + Term: tev2-toolbox +
    +
    + Definition: + the collection of tools designed to support and facilitate the process of terminology management following the [TEv2 specifications](/docs/overview). These tools assist [curators](@) in various tasks related to the curation, creation, and maintenance of terminological assets. +
    +
  • +
  • +
    + Term: tev2 +
    +
    + Definition: + a set of specifications and tools that caters for the [curation](@) of [terminologies](@), as well as for its subsequent use in publications of different types (e.g. websites, whitepapers) and formats (e.g. html, LaTeX), as appropriate for different, individual [scopes](@). +
    +
  • +
  • +
    + Term: trrt +
    +
    + Definition: + a [TEv2 tool](@) that is designed to facilitate the visualization and rendering of [TermRefs](@). +
    +
    + Alternative Terms: trrt +
    +
    + Alternative Terms: trrts +
    +
    + Alternative Terms: termref-rendering-tool +
    +
    + Alternative Terms: termref-rendering-tools +
    +
  • +
  • +
    + Term: versiontag +
    +
    + Definition: + a [tag](@) that is used to [identify](@) a specific version of a [terminology](@) from within a specific [scope](@). +
    +
    + Alternative Terms: versiontag +
    +
    + Alternative Terms: versiontags +
    +
    + Alternative Terms: version-tag +
    +
    + Alternative Terms: version-tags +
    +
  • +
  • +
    + Term: vocabulary +
    +
    + Definition: + the sum or stock of words employed by a language, group, individual, or work or in a field of knowledge. +
    +
    + Alternative Terms: vocabulary +
    +
    + Alternative Terms: vocabularys +
    +
    + Alternative Terms: vocabularies +
    +
  • +
+
+ + \ No newline at end of file diff --git a/__tests__/content/glossaries/mrg.tev2.terms.yaml b/__tests__/content/glossaries/mrg.tev2.terms.yaml new file mode 100644 index 0000000..f7808df --- /dev/null +++ b/__tests__/content/glossaries/mrg.tev2.terms.yaml @@ -0,0 +1,1488 @@ +terminology: + scopetag: 'tev2' + scopedir: 'https://github.com/tno-terminology-design/tev2-specifications/tree/master/docs' + curatedir: 'terms' + vsntag: 'terms' + altvsntags: + - 'latest' +scopes: [] +entries: + - term: '@' + termType: 'error' + hoverText: 'Error - the reference cannot be resolved.' + sidebar_label: 'Term ref not found' + scopetag: 'tev2' + locator: '@.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/@' + headingids: + - 'error---the-reference-cannot-be-resolved' + - '"@"' + - id: 'author' + term: 'author' + termType: 'concept' + isa: null + glossaryTerm: 'Author' + glossaryText: 'a person that creates a text that is meant to be read and understood by others - usually, a particular audience.' + hoverText: 'Author: a person that creates a text that is meant to be read and understood by others - usually, a particular audience.' + synonymOf: null + grouptags: null + formPhrases: 'author{ss}' + status: 'proposed' + created: 20230723 + updated: 20230723 + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'author.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/author' + headingids: + - 'author' + - id: 'body' + term: 'body' + termType: 'concept' + isa: null + glossaryTerm: 'Body (of a Curated Text)' + glossaryText: 'the part of a [curated text](@) that comes after its [header](@), i.e. behind the so-called ''front-matter''.' + hoverText: 'Body (of a Curated Text) the part of a curated text that comes after its its header (also called the ''front-matter'').' + synonymOf: null + grouptags: null + formPhrases: 'bod{yies}' + status: 'proposed' + created: 20230723 + updated: 20230723 + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'body.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/body' + headingids: + - 'body' + - 'summary' + - term: 'concept' + termType: 'concept' + isa: 'knowledge-artifact' + glossaryTerm: null + glossaryText: 'a [knowledge artifact](@) that captures the ideas/thoughts behind a classification of [entities](@) (what makes [entities](@) in that class ''the same'').' + synonymOf: null + grouptags: null + formPhrases: 'concept{ss}' + status: 'proposed' + created: 2022-06-06T00:00:00.000Z + updated: 2022-06-06T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'concept.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/concept' + headingids: + - 'concept' + - 'summary' + - 'purpose' + - 'criteria' + - 'notes' + - id: 'conceptualization' + term: 'conceptualization' + termType: 'concept' + isa: null + glossaryTerm: 'Conceptualization' + glossaryText: 'a mental representation or abstract idea formed by a [party](@) to categorize, organize, and make sense of information, experiences, objects, or abstract notions; it allows the [party](@) to recognize similarities and differences between [entities](@) or events.' + hoverText: 'Conceptualization: a mental representation or abstract idea formed by a party to categorize, organize, and make sense of information, experiences, objects, or abstract notions; it allows the party to recognize similarities and differences between entities or events.' + synonymOf: null + grouptags: null + formPhrases: 'conceptualization{ss}' + status: 'proposed' + created: 20230723 + updated: 20230723 + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'conceptualization.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/conceptualization' + headingids: + - 'conceptualization' + - 'summary' + - 'background' + - id: 'converter' + term: 'converter' + termType: 'concept' + isa: null + glossaryTerm: 'Converter' + glossaryText: 'a software component that takes the output of an [interpreter](@), i.e., the set of moustache variables it has produced, and processes these, possibly with other data from e.g. a [MRG](@), to generate a new, converted text in a different format. The converter uses the values assigned to the moustache variables to produce the transformed output.' + synonymOf: 'text-converter' + grouptags: null + formPhrases: 'converter{ss}' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'converter.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/converter' + headingids: + - 'converter' + - term: 'corpus' + termType: 'concept' + isa: null + glossaryTerm: null + glossaryText: 'the documentation that describes the [knowledge](@) around a set of [terms](@) and [concepts](@).' + synonymOf: null + grouptags: null + formPhrases: 'corpus, corpora, corpus-of-terminology' + status: 'proposed' + created: 2022-06-06T00:00:00.000Z + updated: 2022-06-06T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'corpus.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/corpus' + headingids: + - 'corpus' + - 'short-description' + - 'purpose' + - 'acknowledgements' + - id: 'curate' + term: 'curate' + termType: 'concept' + isa: null + glossaryTerm: 'Curate' + glossaryText: 'to select, organize, and present [terms](@), [definitions](@), and other, related content in a thoughtful and purposeful manner to establish shared understanding among a [community](@) working together on a particular set of objectives.' + synonymOf: null + grouptags: 'terminology' + formPhrases: 'curates, curated, curating, curation' + status: 'proposed' + created: 20230723 + updated: 20230723 + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'curate.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/curate' + headingids: + - 'curate' + - 'notes' + - term: 'curated-text' + termType: 'concept' + isa: null + glossaryTerm: null + glossaryText: 'a text that documents a [concept](@) or other [knowledge artifact](@) of a specific [community](@) or other [party](@), and is located within a [scope](@) that is owned by that [community](@)/[party](@).' + synonymOf: null + grouptags: null + formPhrases: 'curated-text{ss}, ctext{ss}, curated-file{ss}, cfile{ss}' + status: 'proposed' + created: 2022-06-02T00:00:00.000Z + updated: 2022-08-04T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'curated-text.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/curated-text' + headingids: + - 'curated-text' + - 'summary' + - 'purpose' + - 'notes' + - term: 'curatedir' + termType: 'concept' + isa: null + glossaryTerm: null + glossaryText: 'a directory within a [scopedir](@) within which every file contains a [curated texts](@) for that [scope](@).' + synonymOf: null + grouptags: null + formPhrases: 'curatedir{ss}, curate-director{yies}' + status: 'proposed' + created: 2022-07-29T00:00:00.000Z + updated: 2022-07-29T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'curatedir.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/curatedir' + headingids: + - 'curatedir' + - 'summary' + - id: 'curator' + term: 'curator' + termType: 'concept' + isa: null + glossaryTerm: 'Curator (of a Scope)' + glossaryText: 'a person responsible for curating, managing, and maintaining the [terminologies](@), to ensure shared understanding among a [community](@) working together on a particular set of objectives.' + hoverText: 'Curator: {(noRefs glossaryText)}' + synonymOf: null + grouptags: 'terminology' + formPhrases: 'curator{ss}, terminology-curator{ss}' + status: 'proposed' + created: 20230723 + updated: 20230723 + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'curator.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/curator' + headingids: + - 'curator-(of-a-scope)' + - 'examples' + - 'notes' + - id: 'define' + term: 'define' + termType: 'concept' + isa: null + glossaryTerm: 'Define' + glossaryText: 'to provide a criterion and a [term](@), where the criterion can be used by people to determine whether or not something is an instance/example of a [concept](@) (or other [terminological artifact](@)), and the [term](@) is used to refer to that [concept](@), or an arbitrary instance thereof.' + synonymOf: null + grouptags: 'terminology' + formPhrases: 'defines, defined, defining' + status: 'proposed' + created: 20230723 + updated: 20230723 + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'define.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/define' + headingids: + - 'define' + - 'examples' + - 'notes' + - term: 'definition' + termType: 'concept' + isa: null + glossaryTerm: null + glossaryText: 'a text that helps [parties](@) to have the same understanding about the meaning of (and [concepts](@) behind) a [term](@), ideally in such a way that these [parties](@) can determine whether or not they make the same distinction.' + synonymOf: null + grouptags: null + formPhrases: 'definition{ss}, good-definition{ss}' + status: 'proposed' + created: 2022-06-06T00:00:00.000Z + updated: 2022-06-06T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'definition.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/definition' + headingids: + - 'definition' + - 'summary' + - 'purpose' + - 'criteria' + - 'examples' + - 'notes' + - term: 'dictionary' + termType: 'concept' + isa: null + glossaryTerm: null + glossaryText: 'an alphabetically sorted list of [terms](@) with various meanings that they may have in different contexts.' + synonymOf: null + grouptags: null + formPhrases: 'dictionar{yies}' + status: 'proposed' + created: 2022-06-06T00:00:00.000Z + updated: 2022-06-06T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'dictionary.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/dictionary' + headingids: + - 'dictionary' + - 'summary' + - 'purpose' + - 'criteria' + - 'examples' + - id: 'formatted-text' + term: 'formatted-text' + termType: 'concept' + isa: 'text-format' + glossaryTerm: 'Formatted Text' + glossaryText: 'a text that has been processed and arranged to have a specific layout, style, and presentation, making it visually appealing and easy to read.' + synonymOf: null + grouptags: null + formPhrases: 'formatted-text{ss}' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'formatted-text.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/formatted-text' + headingids: + - 'formatted-text' + - 'examples' + - 'notes' + - 'miscellanous' + - id: 'form-phrase' + term: 'form-phrase' + termType: 'concept' + isa: null + glossaryTerm: 'Form Phrase (of a [term](@))' + glossaryText: 'a word or phrase, other than the actual [term](@) that, when used in a [TermRef](@) would typically also refer to this [term](@). Form phrases may include plural forms, possessive extensions, verb-conjugation forms, and other variations.' + formPhrases: 'form-phrase{ss}' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'formphrase.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/formphrase' + headingids: + - 'form-phrase' + - 'examples' + - 'notes' + - 'miscellaneous' + - 'summary' + - term: 'glossary' + termType: 'concept' + isa: null + glossaryTerm: null + glossaryText: 'an alphabetically sorted list of [terms](@) with the (single) meaning it has in (at least) one context.' + synonymOf: null + grouptags: null + formPhrases: 'glossar{yies}' + status: 'proposed' + created: 2022-06-06T00:00:00.000Z + updated: 2022-06-06T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'glossary.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/glossary' + headingids: + - 'glossary' + - 'summary' + - 'purpose' + - 'criteria' + - 'examples' + - term: 'glossarydir' + termType: 'concept' + isa: 'scopedir' + glossaryTerm: null + glossaryText: 'a directory within a [scopedir](@) within which the different versions of its ([machine readable](mrg@) and [human readable](hrg@)) [glossaries](@) are created and maintained.' + synonymOf: null + grouptags: null + formPhrases: 'glossarydir{ss}, glossary-director{yies}' + status: 'proposed' + created: 2022-07-29T00:00:00.000Z + updated: 2022-07-29T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'glossarydir.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/glossarydir' + headingids: + - 'glossarydir' + - 'summary' + - term: 'grouptag' + termType: 'concept' + isa: 'tag' + glossaryTerm: null + glossaryText: 'a [tag](@) that is used to group [terms](@) within a specific [scope](@).' + synonymOf: null + grouptags: null + formPhrases: 'grouptag{ss}, group-tag{ss}' + status: 'proposed' + created: 2022-06-06T00:00:00.000Z + updated: 2022-07-28T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'grouptag.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/grouptag' + headingids: + - 'grouptag' + - 'summary' + - 'criteria' + - 'examples' + - id: 'header' + term: 'header' + termType: 'concept' + isa: null + glossaryTerm: 'Header (of a Curated Text)' + glossaryText: 'the part of a [curated text](@), which is at the beginning of that text, that starts with a line that (only) contains three subsequent ''-''characters, and that ends with a second occurrance of such a line.' + hoverText: 'Header (of a Curated Text): the part at the beginning of that curated text, that starts with a line that (only) contains three subsequent ''-''characters, and that ends with a second occurrance of such a line.' + synonymOf: null + grouptags: null + formPhrases: 'header{ss}' + status: 'proposed' + created: 20230723 + updated: 20230723 + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'header.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/header' + headingids: + - 'header' + - 'example' + - id: 'hrd' + term: 'hrd' + termType: 'concept' + isa: 'dictionary' + glossaryTerm: 'Human Readable Dictionary (HRD)' + glossaryText: 'a [dictionary](@) that presents terms and their meanings in a format that is easily understandable and accessible to humans, typically organized alphabetically.' + synonymOf: null + grouptags: 'dictionary, reference-materials' + formPhrases: 'hrd{ss}, human-readable-dictionar{yies}, human-readable-dictionary-hrd{ss}' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'hrd.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/hrd' + headingids: + - 'hrd---human-readable-dictionary' + - 'examples' + - id: 'hrdt' + term: 'hrdt' + termType: 'concept' + isa: 'tool' + glossaryTerm: 'Human Readable Dictionary Tool (HRDT)' + glossaryText: 'a software tool designed to create, manage, and process [Human Readable Dictionaries (HRDs)](hrd@).' + synonymOf: null + grouptags: 'tools, dictionary-tools' + formPhrases: 'human-readable-dictionary-tool{ss}, hrd-tool{ss}, hrdt{ss}' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'hrdt.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/hrdt' + headingids: + - 'hrdt---human-readable-dictionary-tool' + - id: 'hrg-entry' + term: 'hrg-entry' + termType: 'concept' + isa: 'glossary-entry' + glossaryTerm: 'HRG Entry' + glossaryText: 'A specific kind of (human-readable) rendering of the combination of a [term](@) and a means that helps [readers](@) to understand the meaning of that [term](@) when it is used in a sentence.' + synonymOf: null + grouptags: 'glossary-entries, reference-materials' + formPhrases: 'hrg-entr{yies}' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'hrg-entry.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/hrg-entry' + headingids: + - 'hrg-entry' + - 'purpose' + - id: 'hrg' + term: 'hrg' + termType: 'concept' + isa: 'glossary' + glossaryTerm: 'Human Readable Glossary (HRG)' + glossaryText: 'a [glossary](@) that is designed to be easily understandable and accessible to humans. HRGs present terms and their meanings in a format that prioritizes human comprehension and may include additional contextual information to aid understanding.' + synonymOf: null + grouptags: 'glossaries, data-structures' + formPhrases: 'hrg{ss}, machine-readable-glossar{yies}, machine-readable-glossar{yies}-hrg{ss}' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'hrg.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/hrg' + headingids: + - 'hrg---human-readable-glossary' + - id: 'hrgt' + term: 'hrgt' + termType: 'concept' + isa: 'tool' + glossaryTerm: 'Human Readable Glossary Tool (HRGT)' + glossaryText: 'a software tool designed to create, manage, and process [Human Readable Glossaries (HRGs)](@), as [specified by TEv2](/docs/spec-tools/hrgt). HRGTs offer features for selecting [terms](@) that are [curated](@) within the [scope](@) it is run in, or from other [scopes](@).' + synonymOf: 'human-readable-glossary-tool' + grouptags: 'tools, glossary-tools' + formPhrases: 'hrgt{ss}, machine-readable-glossary-tool{ss}, machine-readable-glossary-tool{ss}-hrtt{ss}' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'hrgt.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/hrgt' + headingids: + - 'hrgt---human-readable-glossary-tool' + - id: 'ict' + term: 'ict' + termType: 'acronym' + isa: 'tool' + glossaryTerm: 'Integrity Checker Tool (ICT)' + glossaryText: 'a software tool designed to check the integrity and conformity of various files used in the curation and management of [glossaries](@), [dictionaries](@), [curated texts](@), and other data within a terminology project. The ICT verifies that the files adhere to the [TEv2 file specifications](/docs-spec-files), ensuring the consistency and accuracy of the terminology data.' + synonymOf: 'integrity-checker' + grouptags: 'tools, quality-assurance' + formPhrases: 'ict, integrity-checker' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'ict.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/ict' + headingids: + - 'integrity-checker-tool-(ict)' + - term: 'identifier' + termType: 'concept' + isa: null + glossaryTerm: null + glossaryText: 'a character string that is being used for the identification of some [entity](@) (yet may refer to 0, 1, or more [entities](@), depending on the context within which it is being used).' + synonymOf: null + grouptags: null + formPhrases: 'identifier{ss}' + status: 'proposed' + created: 2021-06-01T00:00:00.000Z + updated: 2021-06-01T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'identifier.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/identifier' + headingids: + - 'identifier' + - 'short-description' + - 'purpose' + - 'criterion' + - 'examples' + - term: 'identify' + termType: 'concept' + isa: null + glossaryTerm: null + glossaryText: 'an [act](@), by or on behalf of a [party](@), that results in the selection of either - a single [partial identity](@) that the party [owns](@), given some (observed or received) data, or - a single [entity](@) from a given set of entities that is the [subject](@) of a specified [partial identity](@) that the party [owns](@).' + synonymOf: null + grouptags: null + formPhrases: 'identif{yies}, identif{ying}, identifiable, identification' + status: 'proposed' + created: 2021-06-01T00:00:00.000Z + updated: 2021-06-01T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'identify.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/identify' + headingids: + - 'identify' + - 'short-description' + - id: 'ingestion' + term: 'ingestion' + termType: 'concept' + isa: null + glossaryTerm: 'Ingestion (Process)' + glossaryText: 'the process that is run by a [terms-community](@), in which their members suggest, draft, and discuss [definitions](@) ([terms](@) + [criteria](@)) that are relevant for a particular [scope](@), and converting such contributions into [curated texts](@) that accurately document the [concepts](@) and other [terminologic artifacts](@) and that adhere to the [TEv2-specifications](/docs/spec-files/ctext).' + hoverText: 'Ingestion Process: {{noRefs glossaryText}}' + synonymOf: null + grouptags: null + formPhrases: 'ingestion-process, ingestion-processes' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'ingestion-process.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/ingestion-process' + headingids: + - 'ingestion-(process)' + - 'examples' + - 'notes' + - term: 'ingestion-profile' + termType: 'concept' + isa: null + glossaryTerm: null + glossaryText: 'the specification of a method by which files that are in a particular place and format (e.g., wiki files) are turned into a [curated text](@).' + synonymOf: null + grouptags: null + formPhrases: 'ingestion-profile{ss}' + status: 'proposed' + created: 2022-08-17T00:00:00.000Z + updated: 2022-08-17T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'ingestion-profile.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/ingestion-profile' + headingids: + - 'ingestion-profile' + - 'summary' + - 'purpose' + - 'notes' + - id: 'interpreter' + term: 'interpreter' + termType: 'concept' + isa: null + glossaryTerm: 'Interpreter' + glossaryText: 'a software component that reads a (source) text of a specific format, such as a wiki-page or JSON file, and produces a set of [moustache variables](@) based on a predefined profile. These [variables](moustache-variables@) represent extracted data or metadata from the source text.' + synonymOf: null + grouptags: null + formPhrases: 'interpreter{ss}' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'interpreter.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/interpreter' + headingids: + - 'interpreter' + - term: 'knowledge-artifact' + termType: 'concept' + isa: null + glossaryTerm: null + glossaryText: 'something that can be thought of as existing in a particular [knowledge](@), e.g. a [concept](@), or a [mental model](@).' + synonymOf: null + grouptags: null + formPhrases: 'knowledge-artifact{ss}, knowledge-artefact{ss}' + status: 'proposed' + created: 2022-07-27T00:00:00.000Z + updated: 2022-07-27T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'knowledge-artifact.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/knowledge-artifact' + headingids: + - 'knowledge-artifact' + - 'summary' + - 'purpose' + - 'criteria' + - term: 'mental-model' + termType: 'concept' + isa: 'knowledge-artifact' + glossaryTerm: null + glossaryText: 'A [knowledge artifact](@) that relates a set of [concepts](@) (ideas), [relations](@) between them, and constraints about a certain topic, into a coherent and consistent whole (sometimes called ''viewpoint'', or ''way of thinking'').' + synonymOf: null + grouptags: null + formPhrases: 'mental-model{ss}, pattern{ss}, conceptual-model{ss}' + status: 'proposed' + created: 2022-06-06T00:00:00.000Z + updated: 2022-06-07T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'mental-model.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/mental-model' + headingids: + - 'mental-model' + - 'summary' + - 'purpose' + - 'criteria' + - 'notes' + - 'on-using-(existing)-mental-models' + - 'on-the-construction-of-mental-models' + - id: 'moustache-variable' + term: 'moustache-variable' + termType: 'concept' + isa: null + glossaryTerm: 'Moustache Variable' + glossaryText: 'a placeholder in the form of a ''moustache'' tag, e.g. `{{variable_name}}``, within some text. They are used, e.g., by the [TRRT](@), where they get their values from an [interpreter](@), and where they are used in a selected [converter](@) for the purpose of replacing [TermRefs](@) with [renderable refs](@).' + synonymOf: null + grouptags: null + formPhrases: 'moustache-variable{ss}' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'moustache-variable.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/moustache-variable' + headingids: + - 'moustache-variable' + - 'notes' + - id: 'mrd' + term: 'mrd' + termType: 'concept' + isa: 'dictionary' + glossaryTerm: 'Machine Readable Dictionary (MRD)' + glossaryText: 'a type of [dictionary](@) that is formatted in a way that can be easily processed and interpreted by computers or software programs. It uses the YAML format to represent the [terms](@) and their [meanings](@).' + synonymOf: null + grouptags: null + formPhrases: 'machine-readable-dictionar{yies}, mrd{ss}, machine-readable-dictionary-mrd{ss}' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'mrd.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/mrd' + headingids: + - 'machine-readable-dictionary' + - 'examples' + - 'notes' + - id: 'mrdt' + term: 'mrdt' + termType: 'concept' + isa: 'tool' + glossaryTerm: 'Machine Readable Dictionary Tool (MRDT)' + glossaryText: 'a software tool designed to create, manage, and process [Machine Readable Dictionaries (MRDs)](mrd@).' + synonymOf: null + grouptags: 'tools, dictionary-tools' + formPhrases: 'machine-readable-dictionary-tool{ss}, mrd-tool{ss}, mrdt{ss}' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'mrdt.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/mrdt' + headingids: + - 'mrdt---machine-readable-dictionary-tool' + - term: 'mrg-entry' + termType: 'concept' + isa: null + glossaryTerm: null + glossaryText: 'A machine-readable (and interpretable) artifact that contains (pointers to) data and meta-data about a particular [knowledge artifact](@), such as the associated [term(s)](@), its [definition](@), etc., to make it easy for IT-tools to create, e.g. documentation, [glossaries](@), [dictionaries](@), whitepapers, etc. that uses such [terms](@) ([definitions](@), etc.).' + synonymOf: null + grouptags: null + formPhrases: 'mrg-entr{yies}' + status: 'proposed' + created: 2022-08-11T00:00:00.000Z + updated: 2022-08-11T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'mrg-entry.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/mrg-entry' + headingids: + - 'mrg-entry' + - 'purpose' + - id: 'mrg-importer' + term: 'mrg-importer' + termType: 'concept' + isa: null + glossaryTerm: 'MRG Importer' + glossaryText: 'is a tool in the [TEv2](@) toolbox that is run within a particular [scope](@) for the purpose of obtaining [MRGs](@) from other [scopes](@), as specified in the [scope''s](@) [SAF](@), and putting them in the [scope''s](@) [glossarydir](@).' + synonymOf: 'mrg-import-tool' + grouptags: 'glossary-entries, terminology-management-tools' + formPhrases: 'mrg-importer, mrg-import-tool' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'mrg-importer.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/mrg-importer' + headingids: + - 'mrg-importer' + - 'examples' + - 'notes' + - id: 'mrg' + term: 'mrg' + termType: 'concept' + isa: 'glossary' + glossaryTerm: 'Machine Readable Glossary (MRG)' + glossaryText: 'a [glossary](@) for a particular (version of a) [terminology](@) that is formatted in YAML, according to the [TEv2 MRG specifications](/docs/spec-files/mrg), to enable automated processing and integration with software systems.' + hoverText: 'MRG: {{noRefs glossaryText}}' + synonymOf: null + grouptags: 'glossaries, data-structures' + formPhrases: 'mrg{ss}, machine-readable-glossar{yies}, machine-readable-glossar{yies}-mrg{ss}' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'mrg.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/mrg' + headingids: + - 'mrg---machine-readable-glossary' + - id: 'mrgt' + term: 'mrgt' + termType: 'concept' + isa: 'tool' + glossaryTerm: 'Machine Readable Glossary Tool (MRGT)' + glossaryText: 'a software tool designed to create, manage, and process [Machine Readable Glossaries (MRGs)](@), as [specified by TEv2](/docs/spec-tools/mrgt). MRGTs offer features for selecting [terms](@) that are [curated](@) within the [scope](@) it is run in, or from other [scopes](@).' + hoverText: 'MRGT: {{noRefs glossaryText}}' + synonymOf: 'machine-readable-glossary-tool' + grouptags: 'tools, glossary-tools' + formPhrases: 'mrgt{ss}, machine-readable-glossary-tool{ss}, machine-readable-glossary-tool{ss}-mrgt{ss}' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'mrgt.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/mrgt' + headingids: + - 'mrgt---machine-readable-glossary-tool' + - id: 'property' + term: 'property' + termType: 'concept' + isa: null + glossaryTerm: 'Property (of a Concept)' + glossaryText: 'a connection or association between a [concept](@) and a primitive data element, such as a text or a number, that represents some characteristic that instances of the [concept](@) may have.' + synonymOf: null + grouptags: 'conceptual-modeling' + formPhrases: 'propert{yies}' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'property.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/property' + headingids: + - 'property-(of-a-concept)' + - 'examples' + - 'notes' + - id: 'reader' + term: 'reader' + termType: 'concept' + isa: null + glossaryTerm: 'Reader' + glossaryText: 'a person that reads a text that is authored by another person (its [author](@)]), and that tries to understand the meaning of this text in the way its [author](@) intended.' + synonymOf: null + grouptags: null + formPhrases: 'reader{ss}' + status: 'proposed' + created: 20230723 + updated: 20230723 + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'reader.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/reader' + headingids: + - 'reader' + - id: 'relation' + term: 'relation' + termType: 'concept' + isa: null + glossaryTerm: 'Relation (between Concepts)' + glossaryText: 'a (significant) connection or association between two or more [concepts](@). These connections define the way these [concepts](@) are interrelated, providing insights into how they interact and influence each other.' + synonymOf: null + grouptags: 'conceptual-modeling' + formPhrases: 'relation{ss}' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'relation.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/relation' + headingids: + - 'relation-(between-concepts)' + - 'examples' + - 'notes' + - term: 'renderable-ref' + termType: 'concept' + isa: null + glossaryTerm: null + glossaryText: 'a text with which the [TRRT](@) replaces a [TermRef](@), that can be processed by specific third party rendering tools, the result of which is a rendering of the original [TermRef](@) that has additional characteristics that help [readers](@) to (better) understand the intention of its [author](@).' + synonymOf: null + grouptags: null + formPhrases: 'renderable-ref{ss}, renderable-reference{ss}' + status: 'proposed' + created: 2022-06-06T00:00:00.000Z + updated: 2022-08-04T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'renderable-ref.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/renderable-ref' + headingids: + - 'renderable-ref' + - 'summary' + - 'purpose' + - id: 'saf' + term: 'saf' + termType: 'concept' + isa: null + glossaryTerm: 'Scope Administration File (SAF)' + glossaryText: 'a YAML file that contains essential data about a particular [scope](@) (e.g., specifying where its [curated texts](@), [glossaries](@) etc. live), the relationships this [scope](@) has with other [scopes](@), and the specifications of the different [terminologies](@) that are [curated](@) within that [scope](@).' + hoverText: 'SAF: {{noRefs glossaryText}}' + synonymOf: null + grouptags: 'terminology-management' + formPhrases: 'saf{ss}, scope-administration-file{ss}, scope-administration-file{ss}-saf{ss}, saf{ss}-scope-administration-file{ss}' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'saf.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/saf' + headingids: + - 'saf-(scope-administration-file)' + - 'specifications-and-examples' + - 'notes' + - term: 'scope' + termType: 'concept' + isa: null + glossaryTerm: null + glossaryText: 'the extent of the [terms](@), [definitions](@) and other documentation that a [community](@) (which we call the [owner](@) of the [scope](@)) needs to express, communicate and validate its [knowledge](@) as relevant to achieving a specific subset of its [objectives](@).' + synonymOf: null + grouptags: null + formPhrases: 'scope{ss}, scope-context{ss}' + status: 'proposed' + created: 2022-06-06T00:00:00.000Z + updated: 2022-08-04T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'scope.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/scope' + headingids: + - 'scope' + - 'summary' + - 'purpose' + - term: 'scoped-term' + termType: 'concept' + isa: 'term' + glossaryTerm: null + glossaryText: 'a [term](@) that represents (and [identifies](@)) a specific [knowledge artifact](@) of a particular [community](@) (or [party](@)).' + grouptags: null + formPhrases: 'scoped-term{ss}' + status: 'proposed' + created: 2022-06-06T00:00:00.000Z + updated: 2022-08-04T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'scoped-term.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/scoped-term' + headingids: + - 'scoped-term' + - 'summary' + - term: 'scopedir' + termType: 'concept' + isa: null + glossaryTerm: null + glossaryText: 'a directory in a computer file system that contains all files that are either being [curated](@) within a particular [scope](@), or generated to serve some purpose within that [scope](@).' + synonymOf: null + grouptags: null + formPhrases: 'scopedir{ss}, scope-director{yies}' + status: 'proposed' + created: 2022-07-29T00:00:00.000Z + updated: 2022-07-29T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'scopedir.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/scopedir' + headingids: + - 'scope-directory' + - 'summary' + - 'purpose' + - 'criteria' + - term: 'scopetag' + termType: 'concept' + isa: 'tag' + glossaryTerm: null + glossaryText: 'a [tag](@) that is used to [identify](@) [scopes](@) from within a specific [scope](@)' + synonymOf: null + grouptags: null + formPhrases: 'scopetag{ss}, scope-tag{ss}' + status: 'proposed' + created: 2022-06-06T00:00:00.000Z + updated: 2022-07-28T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'scopetag.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/scopetag' + headingids: + - 'scopetag' + - 'summary' + - 'criteria' + - 'examples' + - 'notes' + - term: 'semantics' + termType: 'concept' + isa: null + glossaryTerm: null + glossaryText: 'a mapping between the (tangible/textual) [terms](@) and (intangible) ideas/[concepts](@) - their meaning.' + synonymOf: null + grouptags: null + formPhrases: 'semantics' + status: 'proposed' + created: 2022-06-06T00:00:00.000Z + updated: 2022-06-06T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'semantics.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/semantics' + headingids: + - 'semantics' + - 'summary' + - 'purpose' + - 'criteria' + - term: 'synonym' + termType: 'concept' + isa: 'term' + glossaryTerm: null + glossaryText: 'a [term](@) that has the same (or similar) meaning as another [term](@).' + synonymOf: null + grouptags: null + formPhrases: 'synonym{ss}' + status: 'proposed' + created: 2022-11-27T00:00:00.000Z + updated: 2022-11-27T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'synonym.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/synonym' + headingids: + - 'synonym' + - 'summary' + - 'purpose' + - term: 'tag' + termType: 'concept' + isa: 'identifier' + glossaryTerm: null + glossaryText: 'an alphanumeric string that is used to identify [scopes](@) (so called ''scopetags''), group [terms](@) (so called ''grouptags''), or identify a specific version of a [terminology](@) (so called ''versiontags'') from within a specific [scope](@).' + synonymOf: null + grouptags: null + formPhrases: 'tag{ss}' + status: 'proposed' + created: 2022-06-06T00:00:00.000Z + updated: 2022-06-06T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'tag.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/tag' + headingids: + - 'tag' + - 'summary' + - 'criteria' + - 'examples' + - 'notes' + - term: 'term-identifier' + termType: 'concept' + isa: 'identifier' + glossaryTerm: 'Term Identifier' + glossaryText: 'a [text](identifier@) that [identifies](@) a [knowledge artifact](@) within a particular [scope](@), and hence also the [curated text](@) that describes it, which includes its [definition](@).' + synonymOf: null + grouptags: null + formPhrases: 'term-identifier{ss}' + status: 'proposed' + created: 2022-11-24T00:00:00.000Z + updated: 2022-11-24T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'term-identifier.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/term-identifier' + headingids: + - 'term-identifier' + - term: 'term-ref' + termType: 'concept' + isa: null + glossaryTerm: 'TermRef' + glossaryText: 'a word or phrase that is [marked up (in a specific way)](/docs/spec-syntax/term-ref-syntax) so that it refers to a particular [concept](@) (or other [knowledge artifact](@)), enabling it to be rendered in a variety of ways for the purpose of helping [readers](@) to (better) understand the intention of its [author](@).' + synonymOf: null + grouptags: null + formPhrases: 'term-ref{ss}, termref{ss}, term-reference{ss}' + status: 'proposed' + created: 2022-06-06T00:00:00.000Z + updated: 2022-08-04T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'term-ref.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/term-ref' + headingids: + - 'term-ref' + - 'summary' + - 'purpose' + - id: 'term-selection-criteria' + term: 'term-selection-criteria' + termType: 'concept' + isa: null + glossaryTerm: 'Term Selection Criteria' + glossaryText: 'criteria that are used within a particular [scope](@) for the selection of [terms](@) that are part of a particular [terminology](@).' + synonymOf: 'selection-criteria' + grouptags: 'glossary-entries, terminology-management' + formPhrases: 'term-selection-criteria, selection-criteria' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'term-selection-criteria.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/term-selection-criteria' + headingids: + - 'term-selection-criteria' + - 'examples' + - 'notes' + - term: 'term-syntax' + termType: 'concept' + isa: null + glossaryTerm: null + glossaryText: 'the criterion that specifies which texts can serve as a [term](@), which is that the text must match with (PCRE) regex [`[A-Za-z0-9\s_]+`](https://www.debuggex.com/r/YQppbqxps5jI0t0P).' + synonymOf: null + grouptags: 'syntax' + formPhrases: 'term-syntaxes' + status: 'proposed' + created: 2022-08-17T00:00:00.000Z + updated: 2022-08-17T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'term-syntax.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/term-syntax' + headingids: + - 'term-syntax' + - 'summary' + - 'purpose' + - 'criterion' + - term: 'term-type' + termType: 'concept' + isa: 'identifier' + glossaryTerm: 'Term Type' + glossaryText: 'a [text](identifier@) that [identifies](@) a particular *kind* of [knowledge artifact](@) within a particular [scope](@). Examples include `concept`, `relation`, `pattern` (or `mental-model`).' + synonymOf: null + grouptags: null + formPhrases: 'term-type{ss}' + status: 'proposed' + created: 2022-06-06T00:00:00.000Z + updated: 2023-08-01T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'term-type.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/term-type' + headingids: + - 'term-type' + - term: 'term' + termType: 'concept' + isa: 'identifier' + glossaryTerm: null + glossaryText: 'a word or phrase (i.e.: text) that is used to represent ([identify](@)) a specific [knowledge artifact](@) (in some [scope](@)).' + synonymOf: null + grouptags: null + formPhrases: 'term{ss}, word{ss}, phrase{ss}' + status: 'proposed' + created: 2022-06-06T00:00:00.000Z + updated: 2022-08-09T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'term.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/term' + headingids: + - 'term' + - 'summary' + - 'purpose' + - 'criteria' + - 'notes' + - id: 'terminological-artifact' + term: 'terminological-artifact' + termType: 'concept' + isa: null + glossaryTerm: 'Terminological Artifact' + glossaryText: 'a basic building block of meaning or representation, i.e., a ''semantic unit'' within the ''mind'' of a [scope](@), such as a [concept](@), a [relation](@), or a [property](@).' + synonymOf: 'terminological-artifact' + grouptags: 'glossary-entries, terminology-management' + formPhrases: 'terminological-artifact, semantic-unit, cognitive-science-unit' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'terminological-artifact.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/terminological-artifact' + headingids: + - 'terminological-artifact' + - id: 'terminology-process' + term: 'terminology-process' + termType: 'concept' + isa: null + glossaryTerm: 'Terminology Process' + glossaryText: 'a method for recognizing misunderstandings as such, and creating or maintaining [definitions](@) that resolve them.' + synonymOf: null + grouptags: null + formPhrases: 'terminology-processes' + status: 'proposed' + created: 20230723 + updated: 20230723 + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'terminology-process.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/terminology-process' + headingids: + - 'terminology-process' + - 'prerequisites' + - 'creating-or-changing-a-definition' + - 'conflict-mediation-and-resolution' + - 'background' + - 'notes' + - id: 'terminology-under-construction' + term: 'terminology-under-construction' + termType: 'concept' + isa: null + glossaryTerm: 'Terminology Under Construction' + glossaryText: 'a set of [terms](@) (that is initially empty), to which [terms](@) can be added or removed as specified by [term selection criteria](@), so as to ultimately result in a proper [terminology](@).' + synonymOf: null + grouptags: null + formPhrases: null + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'terminology-under-construction.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/terminology-under-construction' + headingids: + - 'terminology-under-construction' + - term: 'terminology' + termType: 'concept' + grouptags: null + synonymOf: null + formPhrases: 'terminolog{yies}' + status: 'proposed' + created: 2022-06-06T00:00:00.000Z + updated: 2022-08-11T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + glossaryTerm: null + glossaryText: 'a set of [terms](scoped-term@) that are used within a single [scope](@) to refer to [concepts](@) and other [knowledge artifacts](@) of a single [party](@) (e.g. a [community](@)), enabling [parties](@) to reason and communicate ideas they have about one or more specific topics.' + scopetag: 'tev2' + locator: 'terminology.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/terminology' + headingids: + - 'terminology' + - 'summary' + - 'purpose' + - term: 'terms-community' + termType: 'concept' + isa: 'community' + glossaryTerm: null + glossaryText: 'a [community](@) that maintains a [terminology](@) for the purpose of avoiding misunderstandings between its members as they collaborate.' + synonymOf: null + grouptags: null + formPhrases: 'terms-communit{yies}' + status: 'proposed' + created: 2022-06-06T00:00:00.000Z + updated: 2022-06-06T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'terms-community.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/terms-community' + headingids: + - 'terms-community' + - 'summary' + - 'purpose' + - 'criterion' + - 'example' + - 'notes' + - id: 'tev2-tool' + term: 'tev2-tool' + termType: 'concept' + isa: 'definition' + glossaryTerm: 'TEv2 Tool' + glossaryText: 'any software application or utility designed to support and streamline various tasks related to terminology management following the TEv2 specifications.' + synonymOf: null + grouptags: null + formPhrases: 'tev2-tool{ss}, tool{ss}' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'tev2-tool.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/tev2-tool' + headingids: + - 'tev2-tool' + - 'description' + - 'examples' + - 'notes' + - id: 'tev2-toolbox' + term: 'tev2-toolbox' + termType: 'concept' + isa: 'definition' + glossaryTerm: 'TEv2 Toolbox' + glossaryText: 'the collection of tools designed to support and facilitate the process of terminology management following the [TEv2 specifications](/docs/overview). These tools assist [curators](@) in various tasks related to the curation, creation, and maintenance of terminological assets.' + synonymOf: null + grouptags: null + formPhrases: null + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'tev2-toolbox.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/tev2-toolbox' + headingids: + - 'tev2-toolbox' + - 'description' + - 'functionality' + - 'examples' + - 'notes' + - term: 'tev2' + termType: 'concept' + isa: null + glossaryTerm: null + glossaryText: 'a set of specifications and tools that caters for the [curation](@) of [terminologies](@), as well as for its subsequent use in publications of different types (e.g. websites, whitepapers) and formats (e.g. html, LaTeX), as appropriate for different, individual [scopes](@).' + synonymOf: null + grouptags: null + formPhrases: null + status: 'proposed' + created: 2022-09-19T00:00:00.000Z + updated: 2022-09-19T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'tev2.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/tev2' + headingids: + - 'tev2-(terminology-engine,-version-2)' + - 'summary' + - id: 'trrt' + term: 'trrt' + termType: 'concept' + isa: 'tool' + glossaryTerm: 'TRRT (TermRef Rendering Tool)' + glossaryText: 'a [TEv2 tool](@) that is designed to facilitate the visualization and rendering of [TermRefs](@).' + synonymOf: 'trrt' + grouptags: 'tev2-tool, tev2-toolbox' + formPhrases: 'trrt{ss}, termref-rendering-tool{ss}' + status: 'proposed' + created: 2023-07-31T00:00:00.000Z + updated: 2023-07-31T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[TNO Terminology Design](https://tno-terminology-design.github.io/tev2-specifications/docs)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'trrt.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/trrt' + headingids: + - 'trrt---termref-rendering-tool' + - term: 'versiontag' + termType: 'concept' + isa: 'tag' + glossaryTerm: null + glossaryText: 'a [tag](@) that is used to [identify](@) a specific version of a [terminology](@) from within a specific [scope](@).' + synonymOf: null + grouptags: null + formPhrases: 'versiontag{ss}, version-tag{ss}' + status: 'proposed' + created: 2022-06-06T00:00:00.000Z + updated: 2022-07-28T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'versiontag.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/versiontag' + headingids: + - 'versiontag' + - 'summary' + - 'criteria' + - 'examples' + - 'notes' + - term: 'vocabulary' + termType: 'concept' + isa: null + glossaryTerm: null + glossaryText: 'the sum or stock of words employed by a language, group, individual, or work or in a field of knowledge.' + synonymOf: null + grouptags: null + formPhrases: 'vocabular{yies}' + status: 'proposed' + created: 2022-06-06T00:00:00.000Z + updated: 2022-06-06T00:00:00.000Z + contributors: 'RieksJ' + attribution: '[eSSIF-Lab](https://essif-lab.github.io/framework)' + originalLicense: '[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1)' + scopetag: 'tev2' + locator: 'vocabulary.md' + navurl: 'https:/tno-terminology-design.github.io/tev2-specifications/docs/terms/vocabulary' + headingids: + - 'vocabulary' + - 'summary' + - 'purpose' + - 'criteria' + - 'examples' diff --git a/__tests__/content/mockup.md b/__tests__/content/mockup.md new file mode 100644 index 0000000..6fa6ad4 --- /dev/null +++ b/__tests__/content/mockup.md @@ -0,0 +1,9 @@ +This file includes references to the term [body](@), meant to test the TRRT behavior. + +Syntax: `[show text](term#trait@scopetag:vsntag)` +Differing show text: [bodying](body@) +No term specified: [body](@) +Using a trait: [body](#summary@) +Different scope: [body](body#summary@trrt) +Formphrase test: [bodies](@) +Show text to term: [b'o(d)i'es](@) diff --git a/__tests__/content/saf.yaml b/__tests__/content/saf.yaml new file mode 100644 index 0000000..d1f3e12 --- /dev/null +++ b/__tests__/content/saf.yaml @@ -0,0 +1,54 @@ +# +# This is a Scope Administration File that can be used in conjunction with [Terminology Engine v2](https://tno-terminology-design.github.io/tev2-specifications/docs/tev2-overview). +# +# The first section defines meta-data concerning the scope itself, both for technical use and human use. +# It shows where directories and files live that ar part of the scope, and also +# ways in which people can contribute, raise issues, see what's going on, discuss, etc. +# +scope: + scopetag: tev2 # identifier that curators have determined for this terminology + scopedir: https://github.com/tno-terminology-design/tev2-specifications/tree/master/docs # URL of the scope-directory + curatedir: terms # directory where all curated files are located. Full URL is `scopedir`/`curatedir` + glossarydir: glossaries # directory where all glossary files and GDFs are located. Full URL is `scopedir`/`glossarydir` + website: https://tno-terminology-design.github.io/tev2-specifications/docs # base URL for creating links to rendered versions of Curated Texts. It should also serve as the home page of the Tterminology. + navpath: /terms # Path to the directory where Curated Texts are rendered. What `curatedir` is for Curated Texts is, `navpath` is for the rendered versions of Curated Texts. + defaultvsn: terms # vsntag that identifies the default terminology. MRG is located at `scopedir`/`glossarydir`/mrg.tev2.latest.yaml + license: LICENSE.md # file that contains the (default) licensing conditions. Full URL is `scopedir`/`license` + statuses: [proposed, approved, deprecated] # list of status tags that are defined for terminological artifacts in this scope + issues: https://github.com/tno-terminology-design/tev2-specifications/issues # URL where issues can be raised and handled + curators: # contacting individual curators + - name: RieksJ + email: # we split up the email address to reduce the likelihood of the address being harvested for spamming + id: rieks.joosten + at: tno.nl + mrgfile: mrg.tev2.terms.yaml +# +# The second section contains a mapping between scopetags that are used within the scope, and the associated scopedirs. +# This enables tools to find the [SAF](@) of these [scopes](@), and from there all other directories, files etc. +# that live within them, e.g. to use/import their data. +# +scopes: # + - scopetag: essiflab # definition of (scope) tag(s) that are used within this scope to refer to a specific terminology + scopedir: https://github.com/tno-terminology-design/tev2-specifications/tree/main/docs # URL of the scope-directory +# +# The third section specifies the versions that are actively maintained by the curators. +# For each version, the set of terms is selected that constitute the terminology. +# See the Glossary Generation Tool (GGT) for details about the syntax and semantics. +# +versions: + - vsntag: terms # this version contains all terms that are curated within this scope + altvsntags: [latest] # alternative verstiontags + termselcrit: + - "*@tev2" # import all tev2 terms. + - vsntag: test # this version MUST only be used for testing the MRG generator + altvsntags: # alternative verstiontags + - firstAltVsnTag + - secondAltVsnTag + termselcrit: + - "tags[management]@essif-lab" # import all terms from the mrg of `essif-lab:latest` that have grouptag `management`. + - "terms[party,community]@essif-lab:0.9.4" # import the terms `party` and `community` from the mrg of `essif-lab:0.9.4`. + - "-tags[terminology]" # remove all terms tagged with the grouptag `terminology` + - "*@tev2" # import all terms defined in the scope `tev2` + status: proposed + from: 20220312 + to: diff --git a/__tests__/hrgt.test.js b/__tests__/hrgt.test.js new file mode 100644 index 0000000..290677e --- /dev/null +++ b/__tests__/hrgt.test.js @@ -0,0 +1,49 @@ +import { spawn } from 'child_process'; +import path from 'path'; +import fs from 'fs'; +import { expect } from 'chai'; + +const __filename = new URL(import.meta.url).pathname; +const __dirname = path.dirname(__filename); + +describe('Run HRGT on provided test files', () => { + it('should create HRG', (done) => { + const hrgtPath = path.resolve(__dirname, '../lib/Run.js'); + const contentPath = path.resolve(__dirname, 'content'); + const configFile = path.resolve(contentPath, 'config.yaml'); + const outputFile = path.resolve(__dirname, 'output/__tests__/content'); + + const hrgtProcess = spawn('node', [hrgtPath, '-c', configFile]); + + let output = ''; + let consoleOutput = ''; + + hrgtProcess.stdout.on('data', (data) => { + output += data; + consoleOutput += data.toString(); + }); + + hrgtProcess.stderr.on('data', (data) => { + console.error(data.toString()); + }); + + hrgtProcess.on('close', (code) => { + console.log(consoleOutput) + + expect(code).to.equal(0); + + const termRegex = /(?:(?<=[^`\\])|^)\[(?=[^@\]]+\]\([#a-z0-9_-]*@[:a-z0-9_-]*\))(?[^\n\]@]+)\]\((?:(?[a-z0-9_-]*)?(?:#(?[a-z0-9_-]+))?)?@(?[a-z0-9_-]*)(?::(?[a-z0-9_-]+))?\)/g; + + // fs.readFile(inputFile, 'utf8', (_err, fileContent) => { + // const termMatches = fileContent.match(termRegex); + // const termCount = termMatches ? termMatches.length : 0; + // expect(consoleOutput).to.contain(`Number of terms converted: ${termCount}`); + + fs.readFile(outputFile, 'utf8', (_err, fileContent) => { + // expect(fileContent).to.contain(`=12" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@types/figlet": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/@types/figlet/-/figlet-1.5.6.tgz", + "integrity": "sha512-AOdn9cKJGXpqfHeif16xeGMwWefB4nsOyxkdRMpc+PEP3nUxzu3psJfIqhjrCNW4Sejt5i6rISWmEwK0sw03mA==", + "dev": true + }, + "node_modules/@types/js-yaml": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", + "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.17.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.15.tgz", + "integrity": "sha512-2yrWpBk32tvV/JAd3HNHWuZn/VDN1P+72hWirHnvsvTGSqbANi+kSeuQR9yAHnbvaBvHDsoTdXV0Fe+iRtHLKA==", + "dev": true + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chai": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.8.tgz", + "integrity": "sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/commander": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", + "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/figlet": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.6.0.tgz", + "integrity": "sha512-31EQGhCEITv6+hi2ORRPyn3bulaV9Fl4xOdR169cBzH/n1UqcxsiSB/noo6SJdD7Kfb1Ljit+IgR1USvF/XbdA==", + "bin": { + "figlet": "bin/index.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/glob": { + "version": "10.3.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.4.tgz", + "integrity": "sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.0.3", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/jackspeak": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.3.tgz", + "integrity": "sha512-R2bUw+kVZFS/h1AZqBKrSgDmdmjApzgY0AlCPumopFiAlbUxE2gf+SCuBzQ0cP5hHmUmFYF5yw55T97Th5Kstg==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", + "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/mocha/node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslog": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/tslog/-/tslog-4.9.2.tgz", + "integrity": "sha512-wBM+LRJoNl34Bdu8mYEFxpvmOUedpNUwMNQB/NcuPIZKwdDde6xLHUev3bBjXQU7gdurX++X/YE7gLH8eXYsiQ==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/fullstack-build/tslog?sponsor=1" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/__tests__/package.json b/__tests__/package.json new file mode 100644 index 0000000..7d2607c --- /dev/null +++ b/__tests__/package.json @@ -0,0 +1,49 @@ +{ + "name": "ctwg-toolkit-hrgt", + "version": "0.0.1", + "description": "Human Readable Glossary Tool (HRGT)", + "main": "lib/Run.js", + "types": "lib/Run.d.ts", + "bin": { + "trrt": "./lib/Run.js" + }, + "type": "module", + "scripts": { + "build": "rm -rf lib && tsc -p .", + "rebuild": "npm uninstall @aviarytech/hrgt -g && rm lib -rf && npm run build && npm i -g", + "test": "npm run build && mocha __tests__/**/*.test.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/aviarytech/ctwg-toolkit-hrgt" + }, + "keywords": [], + "author": "Aviary Tech", + "license": "ISC", + "bugs": { + "url": "https://github.com/aviarytech/ctwg-toolkit-hrgt/issues" + }, + "homepage": "https://github.com/aviarytech/ctwg-toolkit-hrgt#readme", + "dependencies": { + "chalk": "^4.1.2", + "commander": "10.0.0", + "figlet": "^1.6.0", + "glob": "^10.2.6", + "gray-matter": "^4.0.3", + "handlebars": "^4.7.7", + "js-yaml": "^4.1.0", + "mustache": "^4.2.0", + "tslog": "^4.4.4" + }, + "devDependencies": { + "@types/figlet": "^1.5.5", + "@types/js-yaml": "^4.0.5", + "@types/node": "^18.11.18", + "chai": "^4.3.7", + "mocha": "^10.2.0", + "typescript": "^4.9.5" + }, + "files": [ + "lib/**/*" + ] +} diff --git a/__tests__/tsconfig.json b/__tests__/tsconfig.json new file mode 100644 index 0000000..18cec84 --- /dev/null +++ b/__tests__/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "module": "node16", + "noImplicitAny": true, + "target": "ES2022", + "lib": ["es2022", "dom"], + "declaration": true, + "outDir": "lib", + "rootDir": "src", + "strict": true, + "types": ["node"], + "esModuleInterop": true, + "resolveJsonModule": true + }, + "exclude": ["node_modules", "**/*.test.ts"] +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..7d2607c --- /dev/null +++ b/package.json @@ -0,0 +1,49 @@ +{ + "name": "ctwg-toolkit-hrgt", + "version": "0.0.1", + "description": "Human Readable Glossary Tool (HRGT)", + "main": "lib/Run.js", + "types": "lib/Run.d.ts", + "bin": { + "trrt": "./lib/Run.js" + }, + "type": "module", + "scripts": { + "build": "rm -rf lib && tsc -p .", + "rebuild": "npm uninstall @aviarytech/hrgt -g && rm lib -rf && npm run build && npm i -g", + "test": "npm run build && mocha __tests__/**/*.test.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/aviarytech/ctwg-toolkit-hrgt" + }, + "keywords": [], + "author": "Aviary Tech", + "license": "ISC", + "bugs": { + "url": "https://github.com/aviarytech/ctwg-toolkit-hrgt/issues" + }, + "homepage": "https://github.com/aviarytech/ctwg-toolkit-hrgt#readme", + "dependencies": { + "chalk": "^4.1.2", + "commander": "10.0.0", + "figlet": "^1.6.0", + "glob": "^10.2.6", + "gray-matter": "^4.0.3", + "handlebars": "^4.7.7", + "js-yaml": "^4.1.0", + "mustache": "^4.2.0", + "tslog": "^4.4.4" + }, + "devDependencies": { + "@types/figlet": "^1.5.5", + "@types/js-yaml": "^4.0.5", + "@types/node": "^18.11.18", + "chai": "^4.3.7", + "mocha": "^10.2.0", + "typescript": "^4.9.5" + }, + "files": [ + "lib/**/*" + ] +} diff --git a/src/Generator.ts b/src/Generator.ts new file mode 100644 index 0000000..2d2cc34 --- /dev/null +++ b/src/Generator.ts @@ -0,0 +1,88 @@ +import mustache from 'mustache'; +import { log } from './Report.js'; +import { Entry, Glossary, Output } from './Glossary.js'; +import path, { resolve } from 'path'; +import { glob } from 'glob'; +import fs from "fs"; + +type AnyObject = { [key: string]: any }; + +export class Generator { + private method: string; + private scopedir: string; + private inputGlob: string | null; + private outputName: string; + private glossary!: Glossary; + private entries: Entry[]; + private htmlOutput!: string; + + public constructor({method, scopedir, input, output }: { + method: any, scopedir: string, input: string, output: string +}) { + this.entries = []; + this.method = method; + this.scopedir = scopedir; + this.inputGlob = input; + this.outputName = output; + log.info(`Using ${this.method} method with MRG ${this.inputGlob ?? '(from SAF scope.mrgfile)'} generating to ${this.outputName} in scopedir ${this.scopedir}`); + } + + async generate(): Promise { + try { + this.createGlossary(); + await this.processGlossaryData(); + await this.generateHTML(); + await this.writeToFile(); + + log.info("Generation completed successfully"); + return "Generation completed successfully"; + } catch (error) { + log.error("Generation failed: ", error); + throw new Error("Generation failed"); + } + } + + private createGlossary(): void { + this.glossary = new Glossary({ + scopedir: resolve(this.scopedir), + input: this.inputGlob + }); + } + + private async processGlossaryData(): Promise { + let outputs = []; + if (this.inputGlob) { + const files = await glob(this.inputGlob); + for (let i = 0; i < files.length; i++) { + outputs.push(await this.glossary.initialize(files[0])); + } + } else { + outputs.push(await this.glossary.initialize(null)); + } + this.entries = outputs.flatMap(o => { + return o.entries + }); + console.log(outputs) + } + + private async generateHTML(): Promise { + try { + const template = fs.readFileSync('./assets/hrg-template.mustache', 'utf8'); + console.log(this.entries) + this.htmlOutput = mustache.render(template, { entries: this.entries }); + } catch (error) { + log.error("Failed to generate HTML", error); + } + } + + private async writeToFile(): Promise { + const name = `${this.outputName}.html`; + try { + await fs.promises.writeFile(path.join(this.scopedir, name), this.htmlOutput, 'utf8'); + log.info(`Data successfully written to ${name}`); + } catch (error) { + log.error(`Failed to write data to file at ${name}`, error); + throw new Error("File write operation failed"); + } + } +} diff --git a/src/Glossary.ts b/src/Glossary.ts new file mode 100644 index 0000000..b9eb1f4 --- /dev/null +++ b/src/Glossary.ts @@ -0,0 +1,247 @@ +import { log, report } from './Report.js'; + +import fs = require("fs"); +import path = require('path'); +import yaml = require('js-yaml'); + +interface SAF { + scope: Scope; + scopes: Scopes[]; + versions: Version[]; +} + +interface Scope { + website: string; + scopetag: string; + scopedir: string; + curatedir: string; + glossarydir: string; + defaultvsn: string; + mrgfile: string; +} + +interface Scopes { + scopetags: string[]; + scopedir: string; +} + +interface Version { + vsntag: string; + mrgfile: string; + altvsntags: string[]; +} + +interface MRG { + terminology: Terminology; + scopes: Scopes[]; + entries: Entry[]; +} + +interface Terminology { + scopetag: string; + scopedir: string; + curatedir: string; + vsntag: string; + altvsntags: string[]; +} + +export interface Entry { + term: string; + altterms?: string[]; + vsntag: string; + scopetag: string; + locator: string; + formPhrases?: string; + glossaryText: string; + navurl?: string; + headingids?: string[]; + altvsntags?: string[]; + [key: string]: any; +} + +export interface Output { + entries: Entry[]; +} + +export class Glossary { + public scopedir: string; + public saf!: SAF; + public runtime: Output = { + entries: [] + }; + + public constructor({ scopedir, input }: { scopedir: string, input: string | null}) { + this.scopedir = scopedir; + this.saf = this.getSafMap(path.join(this.scopedir, 'saf.yaml')); + } + + /** + * Initializes the glossary by populating the runtime glossary. + * @returns A promise that resolves to the populated runtime glossary. + */ + public async initialize(mrgFileName: string | null): Promise { + let glossarydir = path.join(this.scopedir, this.saf.scope.glossarydir); + let mrgfile = path.join(glossarydir, mrgFileName ?? this.saf.scope.mrgfile); + + // Get the MRG map of the MRG file + const mrg = await this.getMrgMap(mrgfile); + console.log(mrgfile) + // Populate the runtime glossary with the MRG entries + if (mrg.entries) { + await this.populateRuntime(mrg, mrgfile); + } + + return this.runtime; + } + + /** + * Retrieves the SAF (Scope Administration File) map. + * @returns A promise that resolves to the SAF map. + */ + private getSafMap(safURL: string): SAF { + let saf = {} as SAF; + + try { + // Try to load the SAF map from the scopedir + saf = yaml.load(fs.readFileSync(safURL, 'utf8')) as SAF; + + // Check for missing required properties in SAF + type ScopeProperty = keyof Scope; + const requiredProperties: ScopeProperty[] = ['scopetag', 'scopedir', 'curatedir', 'defaultvsn']; + const missingProperties = requiredProperties.filter(prop => !saf.scope[prop]); + + if (missingProperties.length > 0) { + log.error(`E002 Missing required property in SAF at '${safURL}': '${missingProperties.join("', '")}'`); + process.exit(1); + } + } catch (err) { + log.error(`E004 An error occurred while attempting to load the SAF at '${safURL}':`, err); + process.exit(1); + } + + return saf; + } + + /** + * Retrieves the MRG (Machine Readable Glossary) map. + * @returns A promise that resolves to the MRG map. + */ + public async getMrgMap(mrgURL: string): Promise { + let mrg = {} as Promise; + + try { + // Try to load the MRG map from the `mrgURL` + const mrgfile = fs.readFileSync(mrgURL, 'utf8'); + mrg = yaml.load(mrgfile) as Promise; + + // Check for missing required properties in MRG terminology + type TerminologyProperty = keyof Terminology; + const requiredProperties: TerminologyProperty[] = ['scopetag', 'scopedir', 'curatedir', 'vsntag']; + const terminology = (await mrg).terminology; + const missingProperties = requiredProperties.filter(prop => !terminology[prop]); + + if (missingProperties.length > 0) { + log.error(`E003 Missing required property in MRG at '${mrgURL}': '${missingProperties.join("', '")}'`); + process.exit(1); + } + + const requiredEntryProperties = ['term', 'vsntag', 'scopetag', 'locator', 'glossaryText']; + + for (const entry of (await mrg).entries) { + // add vsntag, scopetag, and altvsntags from MRG to MRG entries + entry.vsntag = terminology.vsntag; + entry.scopetag = terminology.scopetag; + entry.altvsntags = terminology.altvsntags + + // Check for missing required properties in MRG entries + const missingProperties = requiredEntryProperties.filter(prop => !entry[prop]); + + if (missingProperties.length > 0) { + // Create a reference to the problematic entry using the first three property-value pairs + const reference = Object.keys(entry).slice(0, 3).map(prop => `${prop}: '${entry[prop]}'`).join(', '); + + const errorMessage = `MRG entry missing required property: '${missingProperties.join("', '")}'. Entry starts with values ${reference}`; + report.mrgHelp(mrgURL, -1, errorMessage); + } + } + } catch (err) { + const errorMessage = `E005 An error occurred while attempting to load an MRG: ${err}`; + report.mrgHelp(mrgURL, -1, errorMessage); + } + + return mrg; + } + + /** + * Populates the runtime glossary by processing MRG entries. + * @param mrg - The MRG (Machine Readable Glossary) map. + * @param filename - The filename of the MRG being processed. + * @returns A promise that resolves to the populated runtime glossary. + */ + public async populateRuntime(mrg: MRG, filename: string): Promise { + try { + const mrgEntries = mrg.entries; + + const regexMap: { [key: string]: string[] } = { + "{ss}": ["", "s"], + "{yies}": ["y", "ys", "ies"], + "{ying}": ["y", "ier", "ying", "ies", "ied"], + }; + + for (const entry of mrgEntries) { + const alternatives = entry.formPhrases ? entry.formPhrases.split(",").map(t => t.trim()) : []; + + // create a new set of alternatives that includes all possible macro replacements + const modifiedAlternatives = new Set(); + + for (const alternative of alternatives) { + const generatedAlternatives = applyMacroReplacements(alternative, regexMap); + for (const generatedAlternative of generatedAlternatives) { + modifiedAlternatives.add(generatedAlternative); + } + } + + entry.altvsntags = mrg.terminology.altvsntags; + entry.source = filename; + entry.altterms = Array.from(modifiedAlternatives); + + this.runtime.entries.push(entry); + } + } catch (err) { + log.error(`E006 An error occurred while attempting to process the MRG at '${filename}':`, err); + throw err; + } finally { + return this.runtime; + } + } +} + + +/** + * Apply macro replacements to the given input using the provided regexMap. + * @param input - The input string containing macros. + * @param regexMap - A map of macros and their possible replacements. + * @returns An array of strings with all possible alternatives after macro replacements. + */ +function applyMacroReplacements(input: string, regexMap: { [key: string]: string[] }): string[] { + const match = input.match(/\{(\w+)}/); + + if (!match) { + return [input]; + } + + const macroKey = match[1]; + const replacements = regexMap[`{${macroKey}}`] || []; + + const prefix = input.substring(0, match.index); + const suffix = input.substring(match.index! + match[0].length); + + const result: string[] = []; + + for (const replacement of replacements) { + const newAlternative = prefix + replacement + suffix; + result.push(...applyMacroReplacements(newAlternative, regexMap)); + } + + return result; +} diff --git a/src/Report.ts b/src/Report.ts new file mode 100644 index 0000000..8b76bd4 --- /dev/null +++ b/src/Report.ts @@ -0,0 +1,111 @@ +import { Logger } from 'tslog'; + +interface Output { + items: T[]; +} + +class Report { + termErrors: Output<{ file: string; line: number; message: string }> = { + items: [] + }; + converted: Output<{ content: string }> = { + items: [] + }; + fallback: Output<{ content: string }> = { + items: [] + }; + files: Output<{ content: string }> = { + items: [] + }; + errors = new Set(); + + public termHelp(file: string, line: number, message: string) { + this.termErrors.items.push({ file, line, message }); + } + + public mrgHelp(file: string, line: number, message: string) { + this.errors.add(this.formatMessage('MRG HELP', file, line, message)); + } + + public termConverted(term: any) { + if (term.fallback) { + this.fallback.items.push({ content: term }); + } else { + this.converted.items.push({ content: term }); + } + } + + public fileWritten(file: string) { + this.files.items.push({ content: file }); + } + + public print() { + console.log("\x1b[1;37m"); + console.log(" Resolution Report:"); + console.log(" \x1b[0mNumber of files modified: " + this.files.items.length); + console.log(" \x1b[0mNumber of terms converted: " + this.converted.items.length); + if (this.fallback.items.length > 0) { + console.log(" \x1b[0mNumber of terms with fallback: " + this.fallback.items.length); + } + + + if (this.termErrors.items.length > 0) { + console.log(" \x1b[1;37mTerm Errors:\x1b[0m"); + + const uniqueTermHelpMessages = new Map(); + + for (const item of this.termErrors.items) { + const key = item.message; + + if (uniqueTermHelpMessages.has(key)) { + uniqueTermHelpMessages.get(key)!.push(item); + } else { + uniqueTermHelpMessages.set(key, [item]); + } + } + + for (const [key, value] of uniqueTermHelpMessages) { + console.log(`\x1b[1;31m${'TERM HELP'.padEnd(12)} \x1b[0m${key}:`); + const filesMap = new Map(); + + for (const item of value) { + if (!filesMap.has(item.file)) { + filesMap.set(item.file, []); + } + filesMap.get(item.file)!.push(item.line); + } + + for (const [file, lines] of filesMap) { + const lineNumbers = lines.join(':'); + console.log(` \x1b[1;37m${file}:${lineNumbers}`); + } + } + } + + if (this.errors.size > 0) { + console.log("\n \x1b[1;37mMain Errors:\x1b[0m"); + + for (const err of this.errors) { + console.log(err); + } + } + } + + private formatMessage(type: string, file: string, line: number, message: string) { + let locator = `${file}`; + if (line > -1) { + locator += `:${line}`; + } + + if (locator.length > 50) { + locator = `...${locator.slice(-(50 - 5))}`; + } + locator = locator.padEnd(50); + + const formattedMessage = `\x1b[1;31m${type.padEnd(12)} \x1b[1;37m${locator} \x1b[0m${message}`; + return formattedMessage; + } +} + +export const report = new Report(); +export const log = new Logger(); diff --git a/src/Run.ts b/src/Run.ts new file mode 100644 index 0000000..1d6cc89 --- /dev/null +++ b/src/Run.ts @@ -0,0 +1,97 @@ +#!/usr/bin/env node + +import { Generator } from "./Generator.js"; +import { Glossary } from "./Glossary.js"; +import { Command } from "commander"; +import { readFileSync } from "fs"; +import { resolve } from "path"; +import { report, log } from "./Report.js"; + +import yaml from "js-yaml"; +import chalk from "chalk"; +import figlet from "figlet"; + +export let generator: Generator; +export let glossary: Glossary; +const program = new Command(); + +program + .name("mrgt") + .version("0.0.1") + .usage( + "[ ]\n" + + "- (optional) is a list of key-value pairs" + ) + .description("The CLI for the Machine Readable Glossary Tool (MRGT)") + .option( + "-c, --config ", + "Path (including the filename) of the tool's (YAML) configuration file" + ) + .option( + "-s, --scopedir ", + "Path of the scope directory where the SAF is located" + ) + .option( + "-v, --vsntag ", + "Version tag for which the MRG will be generated. When omitted, an MRG will be generated for every version of the terminology that is specified in the versions section of the SAF" + ) + .option( + "-e, --onNotExist ", + "Specifies the action to take if a vsntag was specified but wasn't found in the SAF. Default is 'throw'. Options: 'throw', 'warn', 'log', 'ignore'" + ) + .parse(process.argv); + +program.parse(); + +async function main(): Promise { + // Parse command line parameters + var options = program.opts(); + if (program.args[0]) { + options.input = program.args[0]; + } + + console.log( + chalk.red(figlet.textSync("hrgt-cli", { horizontalLayout: "full" })) + ); + + if (options.config) { + try { + const config = yaml.load( + readFileSync(resolve(options.config), "utf8") + ) as yaml.Schema; + + // Merge config options with command line options + options = { ...config, ...options }; + } catch (err) { + log.error( + `E011 Failed to read or parse the config file '${options.config}':`, + err + ); + process.exit(1); + } + } + + // Create a Generator with the provided options + generator = new Generator({ + method: options.method ?? "html", + scopedir: options.scopedir ?? ".", + input: options.input, + output: options.output ?? "default", + }); + + // Resolve terms + try { + await generator.generate(); + log.info("Generation complete..."); + report.print(); + process.exit(0); + } catch (err) { + log.error( + "E012 Something unexpected went wrong while generating HRG:", + err + ); + process.exit(1); + } +} + +main(); diff --git a/src/api/MRGApi.ts b/src/api/MRGApi.ts new file mode 100644 index 0000000..fae4da8 --- /dev/null +++ b/src/api/MRGApi.ts @@ -0,0 +1,44 @@ +import express from 'express'; +import { MRGlossaryGenerator } from './MRGlossaryGenerator'; +import { YamlWrangler } from './YamlWrangler'; + +class MRGApi { + private generator: MRGlossaryGenerator; + private yamlWrangler: YamlWrangler; + private router: express.Router; + + constructor(generator: MRGlossaryGenerator, yamlWrangler: YamlWrangler) { + this.generator = generator; + this.yamlWrangler = yamlWrangler; + this.router = express.Router(); + + this.router.get('/ctwg/mrg', this.mrgForm); + this.router.post('/ctwg/mrg', this.createMrg); + } + + mrgForm(req: express.Request, res: express.Response) { + res.render('mrg-form'); + } + + createMrg(req: express.Request, res: express.Response) { + const params = { + scopedir: req.body.scopedir, + safFilename: req.body.safFilename, + versionTag: req.body.versionTag, + }; + + try { + const mrg = this.generator.generate(params.scopedir, params.safFilename, params.versionTag); + const mrgString = this.yamlWrangler.asYamlString(mrg); + res.render('mrg-result', { mrg: mrgString }); + } catch (e) { + if (e instanceof MRGGenerationException) { + res.status(500).send(`Unable to generate MRG. Error was ${e.message}`); + } else { + res.status(500).send(`Unexpected error generating MRG. Error was ${e.message}`); + } + } + } +} + +export default MRGApi; \ No newline at end of file diff --git a/src/models/Curator.ts b/src/models/Curator.ts new file mode 100644 index 0000000..06b6456 --- /dev/null +++ b/src/models/Curator.ts @@ -0,0 +1,9 @@ +import { Email } from "./Email"; + +export class Curator { + constructor(public name: string, public email: Email) {} + + toString(): string { + return `${this.name} ${this.email.toString()}`; + } +} \ No newline at end of file diff --git a/src/models/Email.ts b/src/models/Email.ts new file mode 100644 index 0000000..562a69d --- /dev/null +++ b/src/models/Email.ts @@ -0,0 +1,7 @@ +export class Email { + constructor(public id: string, public at: string) {} + + toString(): string { + return `${this.id}@${this.at}`; + } +} \ No newline at end of file diff --git a/src/models/MRGEntry.ts b/src/models/MRGEntry.ts new file mode 100644 index 0000000..31729e2 --- /dev/null +++ b/src/models/MRGEntry.ts @@ -0,0 +1,7 @@ +import { Term } from './Term'; + +export class MRGEntry extends Term { + headingids: string[]; + locator: string; + navurl: string; +} \ No newline at end of file diff --git a/src/models/MRGModel.ts b/src/models/MRGModel.ts new file mode 100644 index 0000000..1c68b9f --- /dev/null +++ b/src/models/MRGModel.ts @@ -0,0 +1,9 @@ +import { Terminology } from './Terminology'; +import { ScopeRef } from './ScopeRef'; +import { MRGEntry } from './MRGEntry'; + +export interface MRGModel { + terminology: Terminology; + scopes: ScopeRef[]; + entries: MRGEntry[]; +} \ No newline at end of file diff --git a/src/models/SAFModel.ts b/src/models/SAFModel.ts new file mode 100644 index 0000000..f57481a --- /dev/null +++ b/src/models/SAFModel.ts @@ -0,0 +1,9 @@ +import { Scope } from './Scope'; +import { ScopeRef } from './ScopeRef'; +import { Version } from './Version'; + +export interface SAFModel { + scope: Scope; + scopes: ScopeRef[]; + versions: Version[]; +} \ No newline at end of file diff --git a/src/models/Scope.ts b/src/models/Scope.ts new file mode 100644 index 0000000..38b779d --- /dev/null +++ b/src/models/Scope.ts @@ -0,0 +1,16 @@ +import { Curator } from './Curator'; + +export class Scope { + scopetag: string; + scopedir: string; + curatedir: string; + glossarydir: string; + mrgfile: string; + hrgfile: string; + license: string; + statuses: string[]; + issues: string; + website: string; + slack: string; + curators: Curator[]; +} \ No newline at end of file diff --git a/src/models/ScopeRef.ts b/src/models/ScopeRef.ts new file mode 100644 index 0000000..2820d09 --- /dev/null +++ b/src/models/ScopeRef.ts @@ -0,0 +1,3 @@ +export class ScopeRef { + constructor(public scopetags: string[], public scopedir: string) {} +} \ No newline at end of file diff --git a/src/models/Term.ts b/src/models/Term.ts new file mode 100644 index 0000000..1f5609c --- /dev/null +++ b/src/models/Term.ts @@ -0,0 +1,28 @@ +export class Term { + term: string; + id: string; + scope: string; + scopetag: string; + locator: string; + isa: string; + termType: string; + status: string; + synonyms: string; + synonymOf: string; + grouptags: string; + glossaryText: string; + hoverText: string; + formPhrases: string; + created: string; + updated: string; + vsntag: string; + commit: string; + contributors: string; + sidebar_label: string; + displayed_sidebar: string; + attribution: string; + originalLicense: string; + filename: string; + navurl: string; + headings: string[]; +} \ No newline at end of file diff --git a/src/models/Terminology.ts b/src/models/Terminology.ts new file mode 100644 index 0000000..642e5e8 --- /dev/null +++ b/src/models/Terminology.ts @@ -0,0 +1,8 @@ +export class Terminology { + scopetag: string; + scopedir: string; + curatedir: string; + vsntag: string; + altvsntags: string[]; + license: string; +} \ No newline at end of file diff --git a/src/models/Version.ts b/src/models/Version.ts new file mode 100644 index 0000000..ca59425 --- /dev/null +++ b/src/models/Version.ts @@ -0,0 +1,9 @@ +export class Version { + vsntag: string; + altvsntags: string[]; + mrgfile: string; + termselcrit: string[]; + status: string; + from: string; + to: string; +} \ No newline at end of file diff --git a/src/processors/GeneratorContext.ts b/src/processors/GeneratorContext.ts new file mode 100644 index 0000000..55881c0 --- /dev/null +++ b/src/processors/GeneratorContext.ts @@ -0,0 +1,45 @@ +import {Term} from '../models/Term'; + +export class GeneratorContext { + private ownerRepo: string; + private absoluteRepo: string; + private safDirectory: string; + private safFilepath: string; + private curatedDir: string; + + private _scopetag?: string; + private _versionTag?: string; + private _addFilters: Array<(term: Term) => boolean> = []; + private _removeFilters: Array<(term: Term) => boolean> = []; + + constructor( + ownerRepo: string, + absoluteRepo: string, + safDirectory: string, + versionTag: string, + curatedDir: string + ) { + this.ownerRepo = ownerRepo; + this.absoluteRepo = absoluteRepo; + this.safDirectory = safDirectory; + this.curatedDir = curatedDir; + this._versionTag = versionTag; + this.safFilepath = `${safDirectory}/MRGlossaryGenerator.DEFAULT_SAF_FILENAME`; + } + + set scopetag(value: string) { + this._scopetag = value; + } + + set versionTag(value: string) { + this._versionTag = value; + } + + set addFilters(value: Array<(term: Term) => boolean>) { + this._addFilters = value; + } + + set removeFilters(value: Array<(term: Term) => boolean>) { + this._removeFilters = value; + } +} diff --git a/src/processors/ModelWrangler.ts b/src/processors/ModelWrangler.ts new file mode 100644 index 0000000..e69de29 diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..18cec84 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "module": "node16", + "noImplicitAny": true, + "target": "ES2022", + "lib": ["es2022", "dom"], + "declaration": true, + "outDir": "lib", + "rootDir": "src", + "strict": true, + "types": ["node"], + "esModuleInterop": true, + "resolveJsonModule": true + }, + "exclude": ["node_modules", "**/*.test.ts"] +} \ No newline at end of file