{"id":33078846,"url":"https://github.com/metafacture/metafacture-core","last_synced_at":"2026-01-11T16:59:00.945Z","repository":{"id":7181561,"uuid":"8483862","full_name":"metafacture/metafacture-core","owner":"metafacture","description":"Core package of the Metafacture tool suite for metadata processing.","archived":false,"fork":false,"pushed_at":"2025-10-28T15:42:09.000Z","size":10035,"stargazers_count":74,"open_issues_count":167,"forks_count":33,"subscribers_count":20,"default_branch":"master","last_synced_at":"2025-10-28T17:35:18.835Z","etag":null,"topics":["code4lib","etl","fix","java-library","metadata-processing","metafacture","metafix","metamorph"],"latest_commit_sha":null,"homepage":"https://metafacture.org","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/metafacture.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2013-02-28T17:14:05.000Z","updated_at":"2025-10-13T16:14:09.000Z","dependencies_parsed_at":"2023-02-18T05:30:43.632Z","dependency_job_id":"baf8a763-5539-4ef7-b7e4-521f0313f7f1","html_url":"https://github.com/metafacture/metafacture-core","commit_stats":null,"previous_names":["culturegraph/metafacture-core"],"tags_count":58,"template":false,"template_full_name":null,"purl":"pkg:github/metafacture/metafacture-core","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/metafacture%2Fmetafacture-core","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/metafacture%2Fmetafacture-core/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/metafacture%2Fmetafacture-core/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/metafacture%2Fmetafacture-core/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/metafacture","download_url":"https://codeload.github.com/metafacture/metafacture-core/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/metafacture%2Fmetafacture-core/sbom","scorecard":{"id":312640,"data":{"date":"2025-08-11","repo":{"name":"github.com/metafacture/metafacture-core","commit":"c0623228e92778320239fe5e03df7883be931ac5"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.1,"checks":[{"name":"Maintained","score":10,"reason":"12 commit(s) and 12 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build.yml:1","Warn: no topLevel permission defined: .github/workflows/deploy.yml:1","Warn: no topLevel permission defined: .github/workflows/publish.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":3,"reason":"Found 7/19 approved changesets -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":8,"reason":"binaries present in source code","details":["Warn: binary detected: gradle/wrapper/gradle-wrapper.jar:1","Warn: binary detected: misc/bin/editorconfig-checker:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/metafacture/metafacture-core/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/metafacture/metafacture-core/build.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/metafacture/metafacture-core/deploy.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/metafacture/metafacture-core/deploy.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/deploy.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/metafacture/metafacture-core/deploy.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/deploy.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/metafacture/metafacture-core/deploy.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/metafacture/metafacture-core/publish.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/publish.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/metafacture/metafacture-core/publish.yml/master?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/build.yml:23","Warn: npmCommand not pinned by hash: .github/workflows/deploy.yml:18","Warn: npmCommand not pinned by hash: .github/workflows/deploy.yml:30","Info:   0 out of   7 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   3 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/publish.yml:7"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":8,"reason":"5 out of the last 5 releases have a total of 5 signed artifacts.","details":["Info: signed release artifact: metafacture-core-7.0.0-dist.tar.gz.asc: https://github.com/metafacture/metafacture-core/releases/tag/metafacture-core-7.0.0","Info: signed release artifact: metafacture-core-7.0.0-rc1-dist.tar.gz.asc: https://github.com/metafacture/metafacture-core/releases/tag/metafacture-core-7.0.0-rc1","Info: signed release artifact: metafacture-core-6.2.0-dist.tar.gz.asc: https://github.com/metafacture/metafacture-core/releases/tag/metafacture-core-6.2.0","Info: signed release artifact: metafacture-core-6.1.2-dist.tar.gz.asc: https://github.com/metafacture/metafacture-core/releases/tag/metafacture-core-6.1.2","Info: signed release artifact: metafacture-core-6.1.1-dist.tar.gz.asc: https://github.com/metafacture/metafacture-core/releases/tag/metafacture-core-6.1.1","Warn: release artifact metafacture-core-7.0.0 does not have provenance: https://api.github.com/repos/metafacture/metafacture-core/releases/222759357","Warn: release artifact metafacture-core-7.0.0-rc1 does not have provenance: https://api.github.com/repos/metafacture/metafacture-core/releases/205623895","Warn: release artifact metafacture-core-6.2.0 does not have provenance: https://api.github.com/repos/metafacture/metafacture-core/releases/191433499","Warn: release artifact metafacture-core-6.1.2 does not have provenance: https://api.github.com/repos/metafacture/metafacture-core/releases/165415250","Warn: release artifact metafacture-core-6.1.1 does not have provenance: https://api.github.com/repos/metafacture/metafacture-core/releases/163564741"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 18 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-17T23:27:26.457Z","repository_id":7181561,"created_at":"2025-08-17T23:27:26.457Z","updated_at":"2025-08-17T23:27:26.457Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":285187928,"owners_count":27129352,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-11-19T02:00:05.673Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["code4lib","etl","fix","java-library","metadata-processing","metafacture","metafix","metamorph"],"created_at":"2025-11-14T11:00:34.713Z","updated_at":"2025-11-19T05:03:31.905Z","avatar_url":"https://github.com/metafacture.png","language":"Java","funding_links":[],"categories":["Uncategorized"],"sub_categories":["Uncategorized"],"readme":"![Metafacture](https://raw.github.com/wiki/metafacture/metafacture-core/img/metafacture.png)\n\n[![Build](https://github.com/metafacture/metafacture-core/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/metafacture/metafacture-core/actions?query=workflow%3ABuild)\n\nMetafacture is a toolkit for processing semi-structured data with a focus on library metadata. It provides a versatile set of tools for reading, writing and transforming data. Metafacture can be used as a stand-alone application or as a Java library in other applications. The name Metafacture is a portmanteau of the words *meta*data and manu*facture*.\n\nMetafacture includes a [large number of modules](https://github.com/metafacture/metafacture-documentation/blob/master/flux-commands.md) for operating on semi-structured data. These modules can be combined to build pipelines to perform complex metadata processing tasks. The pipelines can be constructed either in Java code or with the domain-specific language **Flux**. One of the core features of Metafacture is the **Metamorph** module. Metamorph is an XML-based language for specifying transformations of semi-structured data. It can be seamlessly integrated into Java code.\n\nAt its heart Metafacture is a framework for implementing modules for metadata processing. This makes Metafacture easily extendable with additional modules. The [plugins and tools page](https://github.com/metafacture/metafacture-core/wiki/Plugins-and-Tools) on the wiki shows supplementary packages and projects which extend Metafacture.\n\nOriginally, Metafacture was developed as part of the [Culturegraph](http://www.culturegraph.org) platform but it is developed independently now and used by others, too: [see who uses Metafacture](https://github.com/metafacture/metafacture-core/wiki/Who-uses-Metafacture).\n\n# Getting started\n\nYou can either use Metafacture as a stand-alone application or include it as a Java library in your own projects.\n\n## Metafacture as a stand-alone application\n\nIf you are only interested in running Flux scripts without doing any Java programming this is the way to go. The instructions assume that you are using a \\*nix-like shell. [See more information in the wiki page about Flux](https://github.com/metafacture/metafacture-core/wiki/Flux-user-guide).\nYou can `build` the stand-alone application yourself or `download` it.\n\na) Build\n\nProceed as described in [Building metafacture-core from source](#build_from_source).\n\nb) Download\n\nDownload the latest distribution package from the [release page](https://github.com/metafacture/metafacture-core/releases). Make sure that you do download a distribution package and *not* a source code package (the file name should include `*-dist*`).\n\nRegardless if you've built or downloaded, go on with:\n\n1. Extract the archive:\n    ```bash\n    $ tar xzf metafacture-core-$VERSION-dist.tar.gz\n    ```\n    This will create a new directory containing a ready-to-use Metafacture distribution.\n2. Change into the newly created directory:\n    ```bash\n    $ cd metafacture-core-$VERSION\n    ```\n3. Run one of the example scripts:\n    ```bash\n    $ ./flux.sh examples/read/marc21/read-marc21.flux\n    ```\n    This example will print a number of MARC 21 records on standard output.\n\nThe `examples` folder contains many more examples which provide a good starting point for learning Metafacture. If you have any questions please join our [mailing list](http://lists.dnb.de/mailman/listinfo/metafacture) or use our issue-based discussion forum over at [metafacture-documentation](https://github.com/metafacture/metafacture-documentation).\n\n## Using Metafacture as a Java library\n\nIf you want to use Metafacture in your own Java projects all you need is to add some dependencies to your project. As of Metafacture 5, the single metafacture-core package has been replaced with a number of domain-specific packages. You can find the list of packages on [Maven Central](https://search.maven.org/search?q=g:org.metafacture).\n\nAlternatively, you can simply guess the package names from the top-level folders in the source code repository -- they are the same. For instance, if you want to use Metamorph in your project, simply add the following dependency to your `pom.xml`:\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.metafacture\u003c/groupId\u003e\n    \u003cartifactId\u003emetamorph\u003c/artifactId\u003e\n    \u003cversion\u003e$VERSION\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nor if Gradle is your build tool of choice use:\n\n```groovy\ndependencies {\n    implementation 'org.metafacture:metamorph:$VERSION'\n}\n```\n\nOccasionally, we publish snapshot builds on [Sonatype OSS Repository](https://oss.sonatype.org/index.html#nexus-search;gav~org.metafacture~~~~). The version number is derived from the branch name. Snapshot builds from the master branch always have the version `master-SNAPSHOT`. We also provide sometimes pre releases as github packages.\n\n\u003c!--\nTODO: Link to getting started tutorial\n--\u003e\n\n\u003ca name=\"build_from_source\"\u003e\u003c/a\u003e\n# Building metafacture-core from source\n\nBuilding metafacture-core from source is easy. All you need is git and JDK 11:\n\n1. Clone the metafacture-core repository and change into the directory:\n    ```bash\n    $ git clone https://github.com/metafacture/metafacture-core.git\n    $ cd metafacture-core\n    ```\n\n2. Invoke the Gradle wrapper to download Gradle and build metafacture-core (on Windows call `gradlew.bat publishToMavenLocal` instead) and publish these to your local Maven repository:\n    ```bash\n    $ ./gradlew publishToMavenLocal\n    ```\n\n3. Create a distribution if you need one. The resulting distribution can be found in `metafacture-core/metafacture-runner/build/distributions/`:\n    ```bash\n    $ ./gradlew assembleDist\n    ```\n\n(To import the projects in Eclipse, choose `File \u003e Import \u003e Existing Gradle Project` and select the `metafacture-core` directory.)\n\nSee [Code Quality and Style](https://github.com/metafacture/metafacture-core/wiki/Code-Quality-and-Style) on the wiki for further information on the sources.\n\n\u003c!--\nTODO: Include a link to a page which explains how to write plugins\n--\u003e\n\n# Metafacture Fix\n\nMetafacture Fix (Metafix) is work in progress towards tools and an implementation of the Fix language for [Metafacture](https://metafacture.org/) as an alternative to configuring data transformations with [Metamorph](https://github.com/metafacture/metafacture-core/wiki#morph). Inspired by [Catmandu Fix](https://librecat.org/Catmandu/#fix-language), Metafix processes metadata not as a continuous data stream but as discrete records. The basic idea is to rebuild constructs from the (Catmandu) Fix language like [functions](https://librecat.org/Catmandu/#functions), [selectors](https://librecat.org/Catmandu/#selectors) and [binds](https://librecat.org/Catmandu/#binds) in Java and combine with additional functionalities from the Metamorph toolbox.\n\nSee also [Fix Interest Group](https://github.com/elag/FIG) for an initiative towards an implementation-independent specification for the Fix Language.\n\nThe project `metafix` contains the actual implementation of the Fix language as a Metafacture module and related components. It started as an [Xtext](#xtext) web project with a Fix grammar, from which a parser, a web editor, and a language server are generated. This project also contains an extension for VS code/codium based on that language server. (The web editor has effectively been replaced by the [Metafacture Playground](https://metafacture.org/playground), but remains here for its integration into the language server, which [we want to move over](https://github.com/metafacture/metafacture-playground/issues?q=is%3Aissue+language+server+is%3Aopen) to the playground.)\n\n## Usage\n\nThe project `metafix` contains and uses a new `Metafix` stream module for Metafacture which plays the role of the `Metamorph` module in Fix-based Metafacture workflows. For the current implementation of the `Metafix` stream module see the tests in `metafix/src/test/java`. To play around with some examples, check out the [Metafacture Playground](https://metafacture.org/playground). For real-world usage samples see [openRub.fix](https://gitlab.com/oersi/oersi-etl/-/blob/master/data/production/openRub/openRub.fix) and [duepublico.fix](https://gitlab.com/oersi/oersi-etl/-/blob/master/data/production/duepublico/duepublico.fix). For reference documentation, see [Functions and cookbook](#functions-and-cookbook).\n\n### Extension\n\nThe project `metafix-vsc` provides an extension for Visual Studio Code / Codium for `fix` via the language server protocol (LSP). In the current state the extension supports auto completion, simple syntax highlighting and auto closing brackets and quotes. This project was created using this [tutorial](https://www.typefox.io/blog/building-a-vs-code-extension-with-xtext-and-the-language-server-protocol) and the corresponding [example](https://github.com/TypeFox/languageserver-example).\n\nBuild extension:\n\n\u003e [!IMPORTANT]\n\u003e There is a problem when building the extension on Windows and installing the extension on a Linux system afterwards. In some cases the Xtext Server won't start. So if you want to use the extension not only on Windows, build the extension on a Linux system or on a Linux Subsystem on Windows.\n\n1. Install Visual Studio Code / alternative: VS Codium\n2. Install Node.js (including npm)\n3. In metafacture-core execute:\nUnix: `./gradlew installServer`\nWindows: `.\\gradlew.bat installServer`\n4. In `metafix-vsc/` execute (tip: if you use windows, install cygwin to execute npm commands):\n`npm install`\n\nTo start the extension in development mode (starting a second code/codium instance), follow A. To create a vsix file to install the extension permanently follow B.\n\nA) Run in dev mode:\n1. Open `metafix-vsc/` in Visual Studio Code / Codium\n2. Launch vscode extension by pressing F5 (opens new window of Visual Studio Code)\n3. Open new file (file-ending `.fix`) or open existing fix-file (see sample below)\n\nB) Install vsix file:\n1. Install vsce: `npm install -g vsce`\n2. In `metafix-vsc/` execute: `vsce package`\nvsce will create a vsix file in the vsc directory which can be used for installation:\n3. Open VS Code / Codium\n4. Click 'Extensions' section\n5. Click menu bar and choose 'Install from VSIX...'\n\n### Web editor\n\nStart the web server:\n\n`./gradlew jettyRun`\n\nVisit [http://localhost:8080/](http://localhost:8080/), and paste this into the editor:\n\n```\n# Fix is a macro-language for data transformations\n\n# Simple fixes\n\nadd_field(\"hello\", \"world\")\nremove_field(\"my.deep.nested.junk\")\ncopy_field(\"stats\", \"output.$append\")\n\n# Conditionals\n\nif exists(\"error\")\n  set_field(\"is_valid\", \"no\")\n  log(\"error\")\nelsif exists(\"warning\")\n  set_field(\"is_valid\", \"yes\")\n  log(\"warning\")\nelse\n  set_field(\"is_valid\", \"yes\")\nend\n\n# Loops\n\ndo list(path: \"foo\", \"var\": \"$i\")\n  add_field(\"$i.bar\", \"baz\")\nend\n```\n\nContent assist is triggered with Ctrl-Space. The input above is also used in `FixParsingTest.java`.\n\nRun workflows on the web server, passing `data`, `flux`, and `fix`:\n\n[http://localhost:8080/xtext-service/run?data='1'{'a': '5', 'z': 10}\u0026flux=as-lines|decode-formeta|fix|encode-formeta(style=\"multiline\")\u0026fix=copy_field(a,c)](http://localhost:8080/xtext-service/run?data=%271%27{%27a%27:%20%275%27,%20%27z%27:%2010}\u0026flux=as-lines|decode-formeta|fix|encode-formeta(style=%22multiline%22)\u0026fix=copy_field(a,c))\n\n## Functions and cookbook\n\n### Best practices and guidelines for working with Metafacture Fix\n\n- We recommend to use double quotation marks for arguments and values in functions, binds and conditionals.\n- If using a `list` bind with a variable, the `var` option requires quotation marks (`do list(path: \"\u003csourceField\u003e\", \"var\": \"\u003cvariableName\u003e\")`).\n- Fix turns repeated fields into arrays internally but only marked arrays (with `[]` at the end of the field name) are also emitted as \"arrays\" (entities with indexed literals), all other arrays are emitted as repeated fields.\n- Every Fix file should end with a final newline.\n\n### Glossary\n\n#### Array wildcards\n\nArray wildcards resemble [Catmandu's concept of wildcards](http://librecat.org/Catmandu/#wildcards).\n\nWhen working with arrays and repeated fields you can use wildcards instead of an index number to select elements of an array.\n\n| Wildcard | Meaning |\n|----------|:--------|\n| `*` | Selects _all_ elements of an array. |\n| `$first` | Selects only the _first_ element of an array. |\n| `$last` | Selects only the _last_ element of an array. |\n| `$prepend` | Selects the position _before_ the first element of an array. Can only be used when adding new elements to an array. |\n| `$append` | Selects the position _after_ the last element of an array. Can only be used when adding new elements to an array. |\n\n#### Path wildcards\n\nPath wildcards resemble [Metamorph's concept of wildcards](https://github.com/metafacture/metafacture-core/wiki/Metamorph-User-Guide#addressing-pieces-of-data). They are not supported in Catmandu (it has [specialized Fix functions](https://librecat.org/Catmandu/#marc-mab-pica-paths) instead).\n\nYou can use path wildcards to select fields matching a pattern. They only match path _segments_ (field names), though, not _whole_ paths of nested fields. These wildcards cannot be used to add new elements.\n\n| Wildcard | Meaning |\n|----------|:--------|\n| `*` | Placeholder for zero or more characters. |\n| `?` | Placeholder for exactly one character. |\n| `\\|` | Alternation of multiple patterns. |\n| `[...]` | Enumeration of characters. |\n\n### Functions\n\n#### Script-level functions\n\n##### `include`\n\nIncludes a Fix file and executes it as if its statements were written in place of the function call.\n\nParameters:\n\n- `path` (required): Path to Fix file (if the path starts with a `.`, it is resolved relative to the including file's directory; otherwise, it is resolved relative to the current working directory).\n\nOptions:\n\n- All options are made available as \"dynamic\" local variables in the included Fix file.\n\n```perl\ninclude(\"\u003cpath\u003e\"[, \u003cdynamicLocalVariables\u003e...])\n```\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/script/Include.java)\n\n##### `log`\n\nSends a message to the logs.\n\nParameters:\n\n- `logMessage` (required): Message to log.\n\nOptions:\n\n- `level`: Log level to log at (one of `DEBUG`, `INFO`, `WARN` or `ERROR`). (Default: `INFO`)\n\n```perl\nlog(\"\u003clogMessage\u003e\"[, level: \"\u003clogLevel\u003e\"])\n```\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/script/Log.java)\n\n##### `nothing`\n\nDoes nothing. It is used for benchmarking in Catmandu.\n\n```perl\nnothing()\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=nothing)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/script/Nothing.java)\n\n##### `put_filemap`\n\nDefines an external map for [lookup](#lookup) from a file or a URL. Maps with more than 2 columns are supported but are reduced to a defined key and a value column.\n\n```perl\nput_filemap(\"\u003csourceFile\u003e\", \"\u003cmapName\u003e\", sep_char: \"\\t\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=put_filemap)\n\nThe separator (`sep_char`) will vary depending on the source file, e.g.:\n\n| Type | Separator  |\n|------|------------|\n| CSV  | `,` or `;` |\n| TSV  | `\\t`       |\n\nOptions:\n\n- `allow_empty_values`: Sets whether to allow empty values in the filemap or to ignore these entries. (Default: `false`)\n- `compression`: Sets the compression of the file.\n- `decompress_concatenated`: Flags whether to use decompress concatenated file compression.\n- `encoding`: Sets the encoding used to open the resource.\n- `expected_columns`: Sets number of expected columns; lines with different number of columns are ignored. Set to `-1` to disable the check and allow arbitrary number of columns. (Default: `2`)\n- `key_column`: Defines the column to be used for keys. Uses zero index. (Default: `0`)\n- `value_column`: Defines the column to be used for values. Uses zero index. (Default: `1`)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/script/PutFileMap.java)\n\n##### `put_map`\n\nDefines an internal map for [lookup](#lookup) from key/value pairs.\n\n```perl\nput_map(\"\u003cmapName\u003e\",\n  \"dog\": \"mammal\",\n  \"parrot\": \"bird\",\n  \"shark\": \"fish\"\n)\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=put_map)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/script/PutMap.java)\n\n##### `put_rdfmap`\n\nDefines an external RDF map for lookup from a file or an HTTP(S) resource.\nAs the RDF map is reducing RDF triples to a key/value map it is mandatory to set the target.\nThe targeted RDF property can optionally be bound by an RDF language tag.\n\n```perl\nput_rdfmap(\"\u003crdfResource\u003e\", \"\u003crdfMapName\u003e\", target: \"\u003crdfProperty\u003e\")\nput_rdfmap(\"\u003crdfResource\u003e\", \"\u003crdfMapName\u003e\", target: \"\u003crdfProperty\u003e\", select_language: \"\u003crdfLanguageTag\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=put_rdfmap)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/script/PutRdfMap.java)\n\n##### `put_var`\n\nDefines a single global variable that can be referenced with `$[\u003cvariableName\u003e]`.\n\n```perl\nput_var(\"\u003cvariableName\u003e\", \"\u003cvariableValue\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=put_var)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/script/PutVar.java)\n\n##### `put_vars`\n\nDefines multiple global variables that can be referenced with `$[\u003cvariableName\u003e]`.\n\n```perl\nput_vars(\n  \"\u003cvariableName_1\u003e\": \"\u003cvariableValue_1\u003e\",\n  \"\u003cvariableName_2\u003e\": \"\u003cvariableValue_2\u003e\"\n)\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=put_vars)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/script/PutVars.java)\n\n##### `to_var`\n\nDefines a single global variable that can be referenced with `$[\u003cvariableName\u003e]` and assigns the value of the `\u003csourceField\u003e`.\n\n```perl\nto_var(\"\u003csourceField\u003e\", \"\u003cvariableName\u003e\")\n```\n\nOptions:\n\n- `default`: Default value if source field does not exist. The option needs to be written in quotation marks because it is a reserved word in Java. (Default: Empty string)\n\n[Example in Playground](https://metafacture.org/playground/?example=to_var)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/script/ToVar.java)\n\n#### Record-level functions\n\n##### `add_array`\n\nCreates a new array (with optional values).\n\n```perl\nadd_array(\"\u003ctargetFieldName\u003e\")\nadd_array(\"\u003ctargetFieldName\u003e\", \"\u003cvalue_1\u003e\"[, ...])\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=add_array)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/record/AddArray.java)\n\n##### `add_field`\n\nCreates a field with a defined value.\n\n```perl\nadd_field(\"\u003ctargetFieldName\u003e\", \"\u003cfieldValue\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=add_field)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/record/AddField.java)\n\n##### `add_hash`\n\nCreates a new hash (with optional values).\n\n```perl\nadd_hash(\"\u003ctargetFieldName\u003e\")\nadd_hash(\"\u003ctargetFieldName\u003e\", \"subfieldName\": \"\u003csubfieldValue\u003e\"[, ...])\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=add_hash)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/record/AddHash.java)\n\n##### `array`\n\nConverts a hash/object into an array.\n\n```perl\narray(\"\u003csourceField\u003e\")\n```\n\nE.g.:\n\n```perl\narray(\"foo\")\n# {\"name\":\"value\"} =\u003e [\"name\", \"value\"]\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=array)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/record/Array.java)\n\n##### `call_macro`\n\nCalls a named macro, i.e. a list of statements that have been previously defined with the [`do put_macro`](#do-put_macro) bind.\n\nParameters:\n\n- `name` (required): Unique name of the macro.\n\nOptions:\n\n- All options are made available as \"dynamic\" local variables in the macro.\n\n```perl\ndo put_macro(\"\u003cmacroName\u003e\"[, \u003cstaticLocalVariables\u003e...])\n  ...\nend\ncall_macro(\"\u003cmacroName\u003e\"[, \u003cdynamicLocalVariables\u003e...])\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=call_macro)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/record/CallMacro.java)\n\n##### `copy_field`\n\nCopies a field from an existing field.\n\n```perl\ncopy_field(\"\u003csourceField\u003e\", \"\u003ctargetField\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=copy_field)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/record/CopyField.java)\n\n##### `format`\n\nReplaces the value with a formatted (`sprintf`-like) version.\n\n---- TODO: THIS NEEDS MORE CONTENT -----\n\n```perl\nformat(\"\u003csourceField\u003e\", \"\u003cformatString\u003e\")\n```\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/record/Format.java)\n\n##### `hash`\n\nConverts an array into a hash/object.\n\n```perl\nhash(\"\u003csourceField\u003e\")\n```\n\nE.g.:\n```perl\nhash(\"foo\")\n# [\"name\", \"value\"] =\u003e {\"name\":\"value\"}\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=hash)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/record/Hash.java)\n\n##### `move_field`\n\nMoves a field from an existing field. Can be used to rename a field.\n\n```perl\nmove_field(\"\u003csourceField\u003e\", \"\u003ctargetField\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=move_field)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/record/MoveField.java)\n\n##### `parse_text`\n\nParses a text into an array or hash of values.\n\n---- TODO: THIS NEEDS MORE CONTENT -----\n\n```perl\nparse_text(\"\u003csourceField\u003e\", \"\u003cparsePattern\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=parse_text)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/record/ParseText.java)\n\n##### `paste`\n\nJoins multiple field values into a new field. Can be combined with additional literal strings.\n\nThe default `join_char` is a single space. Literal strings have to start with `~`.\n\n```perl\npaste(\"\u003ctargetField\u003e\", \"\u003csourceField_1\u003e\"[, ...][, \"join_char\": \", \"])\n```\n\nE.g.:\n\n```perl\n# a: eeny\n# b: meeny\n# c: miny\n# d: moe\npaste(\"my.string\", \"~Hi\", \"a\", \"~how are you?\")\n# \"my.string\": \"Hi eeny how are you?\"\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=paste)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/record/Paste.java)\n\n##### `print_record`\n\nPrints the current record as JSON either to standard output or to a file.\n\nParameters:\n\n- `prefix` (optional): Prefix to print before the record; may include [format directives](https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html#syntax) for counter and record ID (in that order). (Default: Empty string)\n\nOptions:\n\n- `append`: Whether to open files in append mode if they exist. (Default: `false`)\n- `compression` (file output only): Compression mode. (Default: `auto`)\n- `destination`: Destination to write the record to; may include [format directives](https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html#syntax) for counter and record ID (in that order). (Default: `stdout`)\n- `encoding` (file output only): Encoding used by the underlying writer. (Default: `UTF-8`)\n- `footer`: Footer which is written at the end of the output. (Default: `\\n`)\n- `header`: Header which is written at the beginning of the output. (Default: Empty string)\n- `id`: Field name which contains the record ID; if found, will be available for inclusion in `prefix` and `destination`. (Default: `_id`)\n- `internal`: Whether to print the record's internal representation instead of JSON. (Default: `false`)\n- `pretty`: Whether to use pretty printing. (Default: `false`)\n- `separator`: Separator which is written after the record. (Default: `\\n`)\n\n```perl\nprint_record([\"\u003cprefix\u003e\"][, \u003coptions\u003e...])\n```\n\nE.g.:\n\n```perl\nprint_record(\"%d) Before transformation: \")\nprint_record(destination: \"record-%2$s.json\", id: \"001\", pretty: \"true\")\nprint_record(destination: \"record-%03d.json.gz\", header: \"After transformation: \")\n```\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/record/PrintRecord.java)\n\n##### `random`\n\nCreates (or replaces) a field with a random number (less than the specified maximum).\n\n```perl\nrandom(\"\u003ctargetField\u003e\", \"\u003cmaximum\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=random)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/record/Random.java)\n\n##### `remove_field`\n\nRemoves a field.\n\n```perl\nremove_field(\"\u003csourceField\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=remove_field)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/record/RemoveField.java)\n\n##### `rename`\n\nReplaces a regular expression pattern in subfield names of a field. Does not change the name of the source field itself.\n\n```perl\nrename(\"\u003csourceField\u003e\", \"\u003cregexp\u003e\", \"\u003creplacement\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=rename)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/record/Rename.java)\n\n##### `retain`\n\nDeletes all fields except the ones listed (incl. subfields).\n\n```perl\nretain(\"\u003csourceField_1\u003e\"[, ...])\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=retain)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/record/Retain.java)\n\n##### `set_array`\n\nCreates a new array (with optional values), provided that the intermediate structures (i.e. parent fields) exist. To create any missing intermediate structures, use [`add_array`](#add_array) instead.\n\n```perl\nset_array(\"\u003ctargetFieldName\u003e\")\nset_array(\"\u003ctargetFieldName\u003e\", \"\u003cvalue_1\u003e\"[, ...])\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=set_array)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/record/SetArray.java)\n\n##### `set_field`\n\nCreates a field with a defined value, provided that the intermediate structures (i.e. parent fields) exist. To create any missing intermediate structures, use [`add_field`](#add_field) instead.\n\n```perl\nset_field(\"\u003ctargetFieldName\u003e\", \"\u003cfieldValue\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=set_field)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/record/SetField.java)\n\n##### `set_hash`\n\nCreates a new hash (with optional values), provided that the intermediate structures (i.e. parent fields) exist. To create any missing intermediate structures, use [`add_hash`](#add_hash) instead.\n\n```perl\nset_hash(\"\u003ctargetFieldName\u003e\")\nset_hash(\"\u003ctargetFieldName\u003e\", \"subfieldName\": \"\u003csubfieldValue\u003e\"[, ...])\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=set_hash)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/record/SetHash.java)\n\n##### `timestamp`\n\nCreates (or replaces) a field with the current timestamp.\n\nOptions:\n\n- `format`: Date and time pattern as in [java.text.SimpleDateFormat](https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html). (Default: `timestamp`)\n- `timezone`: Time zone as in [java.util.TimeZone](https://docs.oracle.com/javase/8/docs/api/java/util/TimeZone.html). (Default: `UTC`)\n- `language`: Language tag as in [java.util.Locale](https://docs.oracle.com/javase/8/docs/api/java/util/Locale.html). (Default: The locale of the host system)\n\n```perl\ntimestamp(\"\u003ctargetField\u003e\"[, format: \"\u003cformatPattern\u003e\"][, timezone: \"\u003ctimezoneCode\u003e\"][, language: \"\u003clanguageCode\u003e\"])\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=timestamp)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/record/Timestamp.java)\n\n##### `vacuum`\n\nDeletes empty fields, arrays and objects.\n\n```perl\nvacuum()\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=vacuum)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/record/Vacuum.java)\n\n#### Field-level functions\n\n##### `append`\n\nAdds a string at the end of a field value.\n\n```perl\nappend(\"\u003csourceField\u003e\", \"\u003cappendString\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=append)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/Append.java)\n\n##### `capitalize`\n\nUpcases the first character in a field value.\n\n```perl\ncapitalize(\"\u003csourceField\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=capitalize)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/Capitalize.java)\n\n##### `count`\n\nCounts the number of elements in an array or a hash and replaces the field value with this number.\n\n```perl\ncount(\"\u003csourceField\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=count)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/Count.java)\n\n##### `downcase`\n\nDowncases all characters in a field value.\n\n```perl\ndowncase(\"\u003csourceField\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=downcase)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/Downcase.java)\n\n##### `filter`\n\nOnly keeps field values that match the regular expression pattern. Works only with array of strings/repeated fields.\n\n```perl\nfilter(\"\u003csourceField\u003e\", \"\u003cregexp\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=filter)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/Filter.java)\n\n##### `flatten`\n\nFlattens a nested array field.\n\n```perl\nflatten(\"\u003csourceField\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=flatten)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/Flatten.java)\n\n##### `from_json`\n\nReplaces the string with its JSON deserialization.\n\nOptions:\n\n- `error_string`: Error message as a placeholder if the JSON couldn't be parsed. (Default: `null`)\n\n```perl\nfrom_json(\"\u003csourceField\u003e\"[, error_string: \"\u003cerrorValue\u003e\"])\n```\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/FromJson.java)\n\n##### `index`\n\nReturns the index position of a substring in a field and replaces the field value with this number.\n\n```perl\nindex(\"\u003csourceField\u003e\", \"\u003csubstring\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=index)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/Index.java)\n\n##### `isbn`\n\nExtracts an ISBN and replaces the field value with the normalized ISBN; optionally converts and/or validates the ISBN.\n\nOptions:\n\n- `to`: ISBN format to convert to (either `ISBN10` or `ISBN13`). (Default: Only normalize ISBN)\n- `verify_check_digit`: Whether the check digit should be verified. (Default: `false`)\n- `error_string`: Error message as a placeholder if the ISBN couldn't be validated. (Default: `null`)\n\n```perl\nisbn(\"\u003csourceField\u003e\"[, to: \"\u003cisbnFormat\u003e\"][, verify_check_digit: \"\u003cboolean\u003e\"][, error_string: \"\u003cerrorValue\u003e\"])\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=isbn)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/Isbn.java)\n\n##### `join_field`\n\nJoins an array of strings into a single string.\n\n```perl\njoin_field(\"\u003csourceField\u003e\", \"\u003cseparator\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=join_field)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/JoinField.java)\n\n##### `lookup`\n\nLooks up matching values in a map and replaces the field value with this match. [External files](#put_filemap), [internal maps](#put_map) as well as [RDF resources](#put_rdfmap) can be used.\n\nParameters:\n\n- `path` (required): Field path to look up.\n- `map` (optional): Name or path of the map in which to look up values.\n\nOptions:\n\n- `default`: Default value to use for unknown values. The option needs to be written in quotation marks because it is a reserved word in Java. (Default: Old value)\n- `delete`: Whether to delete unknown values. (Default: `false`)\n- `print_unknown`: Whether to print unknown values. (Default: `false`)\n\nAdditional options when printing unknown values:\n\n- `append`: Whether to open files in append mode if they exist. (Default: `true`)\n- `compression` (file output only): Compression mode. (Default: `auto`)\n- `destination`: Destination to write unknown values to; may include [format directives](https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html#syntax) for counter and record ID (in that order). (Default: `stdout`)\n- `encoding` (file output only): Encoding used by the underlying writer. (Default: `UTF-8`)\n- `footer`: Footer which is written at the end of the output. (Default: `\\n`)\n- `header`: Header which is written at the beginning of the output. (Default: Empty string)\n- `id`: Field name which contains the record ID; if found, will be available for inclusion in `prefix` and `destination`. (Default: `_id`)\n- `prefix`: Prefix to print before the unknown value; may include [format directives](https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html#syntax) for counter and record ID (in that order). (Default: Empty string)\n- `separator`: Separator which is written after the unknown value. (Default: `\\n`)\n\n```perl\nlookup(\"\u003csourceField\u003e\"[, \u003cmapName\u003e][, \u003coptions\u003e...])\n```\n\nE.g.:\n\n```perl\n# local (unnamed) map\nlookup(\"path.to.field\", key_1: \"value_1\", ...)\n\n# internal (named) map\nput_map(\"internal-map\", key_1: \"value_1\", ...)\nlookup(\"path.to.field\", \"internal-map\")\n\n# external file map (implicit)\nlookup(\"path.to.field\", \"path/to/file\", sep_char: \";\")\n\n# external file map (explicit)\nput_filemap(\"path/to/file\", \"file-map\", sep_char: \";\")\nlookup(\"path.to.field\", \"file-map\")\n\n# RDF map (explicit)\nput_rdfmap(\"path/to/file\", \"rdf-map\", target: \"\u003crdfProperty\u003e\")\nlookup(\"path.to.field\", \"rdf-map\")\n\n# with default value\nlookup(\"path.to.field\", \"map-name\", \"default\": \"NA\")\n\n# with printing unknown values to a file\nlookup(\"path.to.field\", \"map-name\", print_unknown: \"true\", destination: \"unknown.txt\")\n```\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/Lookup.java)\n\n##### `prepend`\n\nAdds a string at the beginning of a field value.\n\n```perl\nprepend(\"\u003csourceField\u003e\", \"\u003cprependString\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=prepend)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/Prepend.java)\n\n##### `replace_all`\n\nReplaces a regular expression pattern in field values with a replacement string. Regexp capturing is possible; refer to capturing groups by number (`$\u003cnumber\u003e`) or name (`${\u003cname\u003e}`).\n\n```perl\nreplace_all(\"\u003csourceField\u003e\", \"\u003cregexp\u003e\", \"\u003creplacement\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=replace_all)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/ReplaceAll.java)\n\n##### `reverse`\n\nReverses the character order of a string or the element order of an array.\n\n```perl\nreverse(\"\u003csourceField\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=reverse)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/Reverse.java)\n\n##### `sort_field`\n\nSorts strings in an array. Alphabetically and A-Z by default. Optional numerical and reverse sorting.\n\n```perl\nsort_field(\"\u003csourceField\u003e\")\nsort_field(\"\u003csourceField\u003e\", reverse: \"true\")\nsort_field(\"\u003csourceField\u003e\", numeric: \"true\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=sort_field)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/SortField.java)\n\n##### `split_field`\n\nSplits a string into an array and replaces the field value with this array.\n\n```perl\nsplit_field(\"\u003csourceField\u003e\", \"\u003cseparator\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=split_field)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/SplitField.java)\n\n##### `substring`\n\nReplaces a string with its substring as defined by the start position (offset) and length.\n\n```perl\nsubstring(\"\u003csourceField\u003e\", \"\u003cstartPosition\u003e\", \"\u003clength\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=substring)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/Substring.java)\n\n##### `sum`\n\nSums numbers in an array and replaces the field value with this number.\n\n```perl\nsum(\"\u003csourceField\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=sum)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/Sum.java)\n\n##### `to_base64`\n\nReplaces the value with its Base64 encoding.\n\nOptions:\n\n-`url_safe`: Perform URL-safe encoding (uses Base64URL format). (Default: `false`)\n\n```perl\nto_base64(\"\u003csourceField\u003e\"[, url_safe: \"\u003cboolean\u003e\"])\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=to_base64)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/ToBase64.java)\n\n##### `to_json`\n\nReplaces the value with its JSON serialization.\n\nOptions:\n\n- `error_string`: Error message as a placeholder if the JSON couldn't be generated. (Default: `null`)\n- `pretty`: Whether to use pretty printing. (Default: `false`)\n\n```perl\nto_json(\"\u003csourceField\u003e\"[, pretty: \"\u003cboolean\u003e\"][, error_string: \"\u003cerrorValue\u003e\"])\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=to_json)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/ToJson.java)\n\n##### `trim`\n\nDeletes whitespace at the beginning and the end of a field value.\n\n```perl\ntrim(\"\u003csourceField\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=trim)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/Trim.java)\n\n##### `uniq`\n\nDeletes duplicate values in an array.\n\n```perl\nuniq(\"\u003csourceField\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=uniq)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/Uniq.java)\n\n##### `upcase`\n\nUpcases all characters in a field value.\n\n```perl\nupcase(\"\u003csourceField\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=upcase)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/Upcase.java)\n\n##### `uri_encode`\n\nEncodes a field value as URI. Aka percent-encoding.\n\nOptions:\n\n- `plus_for_space`: Sets whether \"space\" (` `) will be substituted by a \"plus\" (`+`) or be percent escaped (`%20`). (Default: `true`)\n- `safe_chars`: Sets characters that won't be escaped. Safe characters are the ranges 0..9, a..z and A..Z. These are always safe and should not be specified. (Default: `.-*_`)\n\n```perl\nuri_encode(\"\u003csourceField\u003e\"[, \u003coptions\u003e...])\n```\n\nE.g.:\n\n```perl\nuri_encode(\"path.to.field\", plus_for_space:\"false\", safe_chars:\"\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=uri_encode)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/field/UriEncode.java)\n\n### Selectors\n\n#### `reject`\n\nIgnores records that match a condition.\n\n```perl\nif \u003ccondition\u003e\n  reject()\nend\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=reject)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/method/record/Reject.java)\n\n### Binds\n\n#### `do list`\n\nIterates over each element of an array. In contrast to Catmandu, it can also iterate over a single object or string.\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/bind/List.java)\n\n```perl\ndo list(path: \"\u003csourceField\u003e\")\n  ...\nend\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=do_list)\n\nOnly the current element is accessible in this case (as the root element).\n\nWhen specifying a variable name for the current element, the record remains accessible as the root element and the current element is accessible through the variable name:\n\n```perl\ndo list(path: \"\u003csourceField\u003e\", \"var\": \"\u003cvariableName\u003e\")\n  ...\nend\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=do_list_with_var)\n\n#### `do list_as`\n\nIterates over each _named_ element of an array (like [`do list`](#do-list) with a variable name). If multiple arrays are given, iterates over the _corresponding_ elements from each array (i.e., all elements with the same array index, skipping elements whose arrays have already been exhausted).\n\n[Example in Playground](https://metafacture.org/playground/?example=do+list_as)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/bind/ListAs.java)\n\n```perl\ndo list_as(element_1: \"\u003csourceField_1\u003e\"[, ...])\n  ...\nend\n```\n\nE.g.:\n\n```perl\n# \"ccm:university\":[\"https://ror.org/0304hq317\"]\n# \"ccm:university_DISPLAYNAME\":[\"Gottfried Wilhelm Leibniz Universität Hannover\"]\nset_array(\"sourceOrga[]\")\ndo list_as(orgId: \"ccm:university[]\", orgName: \"ccm:university_DISPLAYNAME[]\")\n  copy_field(orgId, \"sourceOrga[].$append.id\")\n  copy_field(orgName, \"sourceOrga[].$last.name\")\nend\n# {\"sourceOrga\":[{\"id\":\"https://ror.org/0304hq317\",\"name\":\"Gottfried Wilhelm Leibniz Universität Hannover\"}]}\n```\n\n#### `do once`\n\nExecutes the statements only once (when the bind is first encountered), not repeatedly for each record.\n\n```perl\ndo once()\n  ...\nend\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=do_once)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/bind/Once.java)\n\nIn order to execute multiple blocks only once, tag them with unique identifiers:\n\n```perl\ndo once(\"maps setup\")\n  ...\nend\ndo once(\"vars setup\")\n  ...\nend\n```\n\n#### `do put_macro`\n\nDefines a named macro, i.e. a list of statements that can be executed later with the [`call_macro`](#call_macro) function.\n\nVariables can be referenced with `$[\u003cvariableName\u003e]`, in the following order of precedence:\n\n1. \"dynamic\" local variables, passed as options to the `call_macro` function;\n2. \"static\" local variables, passed as options to the `do put_macro` bind;\n3. global variables, defined via [`put_var`](#put_var)/[`put_vars`](#put_vars).\n\nParameters:\n\n- `name` (required): Unique name of the macro.\n\nOptions:\n\n- All options are made available as \"static\" local variables in the macro.\n\n```perl\ndo put_macro(\"\u003cmacroName\u003e\"[, \u003cstaticLocalVariables\u003e...])\n  ...\nend\ncall_macro(\"\u003cmacroName\u003e\"[, \u003cdynamicLocalVariables\u003e...])\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=do_put_macro)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/bind/PutMacro.java)\n\n### Conditionals\n\nConditionals start with `if` in case of affirming the condition or `unless` rejecting the condition.\n\nConditionals require a final `end`.\n\nAdditional conditionals can be set with `elsif` and `else`.\n\n```perl\nif \u003ccondition(params, ...)\u003e\n  ...\nend\n```\n\n```perl\nunless \u003ccondition(params, ...)\u003e\n  ...\nend\n```\n\n```perl\nif \u003ccondition(params, ...)\u003e\n  ...\nelsif\n  ...\nelse\n  ...\nend\n```\n\n#### `contain`\n\n##### `all_contain`\n\nExecutes the functions if/unless the field contains the value. If it is an array or a hash all field values must contain the string.\n\n[Example in Playground](https://metafacture.org/playground/?example=all_contain)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/AllContain.java)\n\n##### `any_contain`\n\nExecutes the functions if/unless the field contains the value. If it is an array or a hash one or more field values must contain the string.\n\n[Example in Playground](https://metafacture.org/playground/?example=any_contain)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/AnyContain.java)\n\n##### `none_contain`\n\nExecutes the functions if/unless the field does not contain the value. If it is an array or a hash none of the field values may contain the string.\n\n[Example in Playground](https://metafacture.org/playground/?example=none_contain)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/NoneContain.java)\n\n##### `str_contain`\n\nExecutes the functions if/unless the first string contains the second string.\n\n[Example in Playground](https://metafacture.org/playground/?example=str_contain)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/StrContain.java)\n\n#### `equal`\n\n##### `all_equal`\n\nExecutes the functions if/unless the field value equals the string. If it is an array or a hash all field values must equal the string.\n\n[Example in Playground](https://metafacture.org/playground/?example=all_equal)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/AllEqual.java)\n\n##### `any_equal`\n\nExecutes the functions if/unless the field value equals the string. If it is an array or a hash one or more field values must equal the string.\n\n[Example in Playground](https://metafacture.org/playground/?example=any_equal)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/AnyEqual.java)\n\n##### `none_equal`\n\nExecutes the functions if/unless the field value does not equal the string. If it is an array or a hash none of the field values may equal the string.\n\n[Example in Playground](https://metafacture.org/playground/?example=none_equal)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/NoneEqual.java)\n\n##### `str_equal`\n\nExecutes the functions if/unless the first string equals the second string.\n\n[Example in Playground](https://metafacture.org/playground/?example=str_equal)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/StrEqual.java)\n\n#### `exists`\n\nExecutes the functions if/unless the field exists.\n\n```perl\nif exists(\"\u003csourceField\u003e\")\n```\n\n[Example in Playground](https://metafacture.org/playground/?example=exists)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/Exists.java)\n\n#### `greater_than`\n\nExecutes the functions if/unless the field value is greater than the given value.\n\n[Example in Playground](https://metafacture.org/playground/?example=greater_than)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/GreaterThan.java)\n\n#### `in`\n\nExecutes the functions if/unless the field value [is contained in](https://perldoc.perl.org/perlop#Smartmatch-Operator) the value of the other field.\n\n_Also aliased as [`is_contained_in`](#is_contained_in)._\n\n[Example in Playground](https://metafacture.org/playground/?example=in)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/In.java)\n\n#### `is_contained_in`\n\n_Alias for [`in`](#in)._\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/IsContainedIn.java)\n\n#### `is_array`\n\nExecutes the functions if/unless the field value is an array.\n\n[Example in Playground](https://metafacture.org/playground/?example=is_array)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/IsArray.java)\n\n#### `is_empty`\n\nExecutes the functions if/unless the field value is empty.\n\n[Example in Playground](https://metafacture.org/playground/?example=is_empty)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/IsEmpty.java)\n\n#### `is_false`\n\nExecutes the functions if/unless the field value equals `false` or `0`.\n\n[Example in Playground](https://metafacture.org/playground/?example=is_false)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/IsFalse.java)\n\n#### `is_hash`\n\n_Alias for [`is_object`](#is_object)._\n\n[Example in Playground](https://metafacture.org/playground/?example=is_hash)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/IsHash.java)\n\n#### `is_number`\n\nExecutes the functions if/unless the field value is a number.\n\n[Example in Playground](https://metafacture.org/playground/?example=is_number)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/IsNumber.java)\n\n#### `is_object`\n\nExecutes the functions if/unless the field value is a hash (object).\n\n_Also aliased as [`is_hash`](#is_hash)._\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/IsObject.java)\n\n#### `is_string`\n\nExecutes the functions if/unless the field value is a string (and not a number).\n\n[Example in Playground](https://metafacture.org/playground/?example=is_string)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/IsString.java)\n\n#### `is_true`\n\nExecutes the functions if/unless the field value equals `true` or `1`.\n\n[Example in Playground](https://metafacture.org/playground/?example=is_true)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/IsTrue.java)\n\n#### `less_than`\n\nExecutes the functions if/unless the field value is less than the given value.\n\n[Example in Playground](https://metafacture.org/playground/?example=less_than)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/LessThan.java)\n\n#### `match`\n\n##### `all_match`\n\nExecutes the functions if/unless the field value matches the regular expression pattern. If it is an array or a hash all field values must match the regular expression pattern.\n\n[Example in Playground](https://metafacture.org/playground/?example=all_match)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/AllMatch.java)\n\n##### `any_match`\n\nExecutes the functions if/unless the field value matches the regular expression pattern. If it is an array or a hash one or more field values must match the regular expression pattern.\n\n[Example in Playground](https://metafacture.org/playground/?example=any_match)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/AnyMatch.java)\n\n##### `none_match`\n\nExecutes the functions if/unless the field value does not match the regular expression pattern. If it is an array or a hash none of the field values may match the regular expression pattern.\n\n[Example in Playground](https://metafacture.org/playground/?example=none_match)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/NoneMatch.java)\n\n##### `str_match`\n\nExecutes the functions if/unless the string matches the regular expression pattern.\n\n[Example in Playground](https://metafacture.org/playground/?example=str_match)\n\n[Java Code](https://github.com/metafacture/metafacture-core/blob/master/metafix/src/main/java/org/metafacture/metafix/conditional/StrMatch.java)\n\n## Xtext\n\nThe Metafix projects have been originally set up with [Xtext](https://www.eclipse.org/Xtext/) 2.17.0 and Eclipse for Java 2019-03, following [https://www.eclipse.org/Xtext/documentation/104_jvmdomainmodel.html](https://www.eclipse.org/Xtext/documentation/104_jvmdomainmodel.html).\n\n# Stay updated\n\nFor support and discussion join the [mailing list](http://lists.dnb.de/mailman/listinfo/metafacture).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmetafacture%2Fmetafacture-core","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmetafacture%2Fmetafacture-core","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmetafacture%2Fmetafacture-core/lists"}