├── annimate_desktop ├── .nvmrc ├── .gitignore ├── .prettierignore ├── src-tauri │ ├── .gitignore │ ├── build.rs │ ├── icons │ │ ├── 32x32.png │ │ ├── icon.icns │ │ ├── icon.ico │ │ ├── icon.png │ │ ├── 128x128.png │ │ ├── 128x128@2x.png │ │ ├── StoreLogo.png │ │ ├── Square30x30Logo.png │ │ ├── Square44x44Logo.png │ │ ├── Square71x71Logo.png │ │ ├── Square89x89Logo.png │ │ ├── Square107x107Logo.png │ │ ├── Square142x142Logo.png │ │ ├── Square150x150Logo.png │ │ ├── Square284x284Logo.png │ │ └── Square310x310Logo.png │ ├── nsis-media │ │ └── header.bmp │ ├── capabilities │ │ └── default.json │ ├── src │ │ ├── error.rs │ │ ├── state.rs │ │ └── preload.rs │ ├── Cargo.toml │ ├── release.toml │ └── tauri.conf.json ├── .prettierrc.json ├── src │ ├── setup-tests.ts │ ├── vite-env.d.ts │ ├── lib │ │ ├── __mocks__ │ │ │ ├── assert-type.ts │ │ │ └── mock-release-notes.md │ │ ├── urls.ts │ │ ├── query-node-utils.ts │ │ ├── utils.ts │ │ └── query-node-utils.spec.ts │ ├── global.ts │ ├── components │ │ ├── main-page │ │ │ ├── columns │ │ │ │ ├── utils.ts │ │ │ │ ├── props.ts │ │ │ │ ├── utils.spec.ts │ │ │ │ ├── layout.tsx │ │ │ │ ├── anno-corpus-column.tsx │ │ │ │ ├── anno-document-column.tsx │ │ │ │ ├── query-nodes-display.tsx │ │ │ │ ├── anno-select.tsx │ │ │ │ └── anno-match-column.tsx │ │ │ ├── export-section.tsx │ │ │ ├── export-format-select.tsx │ │ │ └── main-page.tsx │ │ ├── store-provider.tsx │ │ ├── ui │ │ │ ├── custom │ │ │ │ ├── spinner.tsx │ │ │ │ ├── select-list.tsx │ │ │ │ └── auto-scroller.ts │ │ │ ├── collapsible.tsx │ │ │ ├── label.tsx │ │ │ ├── separator.tsx │ │ │ ├── progress.tsx │ │ │ ├── textarea.tsx │ │ │ ├── toaster.tsx │ │ │ ├── input.tsx │ │ │ ├── checkbox.tsx │ │ │ ├── radio-group.tsx │ │ │ ├── badge.tsx │ │ │ ├── tooltip.tsx │ │ │ ├── alert.tsx │ │ │ ├── tabs.tsx │ │ │ ├── card.tsx │ │ │ ├── button.tsx │ │ │ ├── resizable.tsx │ │ │ └── scroll-area.tsx │ │ ├── dialogs │ │ │ ├── use-dialog-state.ts │ │ │ ├── delete-corpus-dialog.tsx │ │ │ └── corpus-set-dialog.tsx │ │ ├── error-alert.tsx │ │ ├── error-boundary.tsx │ │ ├── app.tsx │ │ ├── manage-page │ │ │ ├── manage-page.tsx │ │ │ ├── corpora-section.tsx │ │ │ ├── advanced-section.tsx │ │ │ └── corpora-in-set-list.tsx │ │ └── update-app-trigger.tsx │ ├── main.tsx │ └── assets │ │ ├── annimate-logo.svg │ │ └── github-mark.svg ├── pnpm-workspace.yaml ├── tsconfig.node.json ├── index.html ├── components.json ├── tsconfig.json ├── vite.config.ts ├── eslint.config.mjs └── package.json ├── .tokeignore ├── release.json ├── package.json ├── .vscode └── extensions.json ├── pages ├── img │ ├── annimate-logo.png │ └── github-mark.svg └── index.html ├── docs ├── readme │ ├── images │ │ └── screenshot.png │ └── documents │ │ └── 2025-ids-methodenmesse-poster.pdf └── user-guide │ ├── src │ ├── img │ │ ├── export-run.png │ │ ├── macos-home.png │ │ ├── import-menu.png │ │ ├── macos-update.png │ │ ├── manage-back.png │ │ ├── update-error.png │ │ ├── annimate-logo.png │ │ ├── column-number.png │ │ ├── export-columns.png │ │ ├── export-finished.png │ │ ├── export-format.png │ │ ├── import-continue.png │ │ ├── import-dialog.png │ │ ├── import-manage.png │ │ ├── macos-archive.png │ │ ├── macos-damaged.png │ │ ├── macos-extracted.png │ │ ├── macos-terminal.png │ │ ├── projects-load.png │ │ ├── projects-save.png │ │ ├── export-add-column.png │ │ ├── export-query-meta.png │ │ ├── import-add-to-set.png │ │ ├── projects-partial.png │ │ ├── export-missing-info.png │ │ ├── export-query-invalid.png │ │ ├── export-query-partof.png │ │ ├── export-query-valid.png │ │ ├── macos-applications.png │ │ ├── manage-delete-corpus.png │ │ ├── projects-load-dialog.png │ │ ├── projects-save-dialog.png │ │ ├── column-corpus-metadata.png │ │ ├── export-select-corpora.png │ │ ├── macos-terminal-button.png │ │ ├── manage-add-corpus-set.png │ │ ├── column-document-metadata.png │ │ ├── column-match-annotation.png │ │ ├── column-match-in-context.png │ │ ├── manage-add-corpus-to-set.png │ │ ├── manage-delete-corpus-set.png │ │ ├── manage-remove-corpus-from-set.png │ │ ├── arrow-left.svg │ │ ├── pencil.svg │ │ ├── trash-2.svg │ │ ├── grip-vertical.svg │ │ └── settings.svg │ ├── SUMMARY.md │ ├── columns │ │ ├── number.md │ │ └── metadata.md │ └── introduction.md │ ├── book.toml │ ├── README.md │ └── rea-prenominal-genitive.anmt ├── annimate_core ├── tests │ ├── data │ │ ├── empty_graphml.zip │ │ ├── pcc2_v7_relANNIS.zip │ │ ├── subtok.demo_graphml.zip │ │ ├── subtok.demo2_relANNIS.zip │ │ ├── subtok.demo3_relANNIS.zip │ │ ├── subtok.demo4_relANNIS.zip │ │ ├── subtok.demo_relANNIS.zip │ │ ├── nocoverage.demo_graphml.zip │ │ ├── subtok.demo_renamed_graphml.zip │ │ ├── nondefaultsegmentation.demo_graphml.zip │ │ └── README.md │ ├── snapshots │ │ ├── segmentations__pcc2.snap │ │ ├── segmentations__subtok.snap │ │ ├── segmentations__subtok_renamed.snap │ │ ├── export_matches__empty.snap │ │ ├── segmentations__nondefaultsegmentation.snap │ │ ├── metadata__11_delete_corpus_set_with_corpora.snap │ │ ├── project__default.snap │ │ ├── project__with_export_format_xlsx.snap │ │ ├── metadata__00-default.snap │ │ ├── project__with_aql_query.snap │ │ ├── project__with_query_language_aql_quirks_v3.snap │ │ ├── project__with_corpus_set.snap │ │ ├── project__with_aql_query_complex.snap │ │ ├── project__with_one_corpus_name.snap │ │ ├── metadata__02_toggle1.snap │ │ ├── project__with_two_corpus_names.snap │ │ ├── metadata__11_delete_corpus_set_only.snap │ │ ├── export_matches__nocoverage.snap │ │ ├── metadata__01_initial.snap │ │ ├── metadata__03_toggle2.snap │ │ ├── metadata__06_add_corpora_to_set_new1.snap │ │ ├── metadata__04_add_corpora_to_set_existing1.snap │ │ ├── metadata__05_add_corpora_to_set_existing2.snap │ │ ├── metadata__10_delete_corpus.snap │ │ ├── import__import-2.snap │ │ ├── project__with_export_columns_with_segmentation.snap │ │ ├── project__with_export_columns_with_asymmetric_context.snap │ │ ├── export_matches__subtok_varying_number_of_match_nodes_with_explicit_primary_node_indices.snap │ │ ├── export_matches__subtok_optional_nodes.snap │ │ ├── metadata__07_add_corpora_to_set_new2.snap │ │ ├── export_matches__nondefaultsegmentation.snap │ │ ├── metadata__08_create_corpus_set.snap │ │ ├── project__with_export_columns_with_node_indices.snap │ │ ├── metadata__09_rename_corpus_set.snap │ │ ├── export_matches__subtok_annos.snap │ │ ├── export_matches__subtok_renamed.snap │ │ ├── project__with_export_columns_with_annos.snap │ │ ├── project__with_export_columns_default.snap │ │ ├── exportable_anno_keys__empty.snap │ │ ├── export_matches__subtok_multiple_corpora.snap │ │ ├── export_matches__subtok_segmentation_norm.snap │ │ ├── export_matches__subtok_segmentation_tokens.snap │ │ ├── export_matches__subtok_segmentation_diplomatic.snap │ │ ├── export_matches__subtok_gap.snap │ │ ├── export_matches__subtok_varying_number_of_match_nodes.snap │ │ ├── project__full.snap │ │ └── import__import.snap │ ├── validation.rs │ ├── segmentations.rs │ └── exportable_anno_keys.rs ├── build.rs ├── src │ ├── version.rs │ └── format │ │ ├── csv.rs │ │ └── mod.rs └── Cargo.toml ├── .gitignore ├── rustfmt.toml ├── .github ├── workflows │ ├── audit-cargo.yml │ ├── fmt-check-cargo.yml │ ├── ci.yml │ ├── audit-pnpm.yml │ ├── check-cargo.yml │ ├── test-pnpm.yml │ ├── test-cargo.yml │ ├── fmt-check-pnpm.yml │ ├── check-pnpm.yml │ ├── docs.yml │ ├── udeps-cargo.yml │ └── build-macos.yml └── ISSUE_TEMPLATE │ ├── config.yml │ ├── 2-docs.yml │ └── 1-bug.yml ├── Cargo.toml └── renovate.json /annimate_desktop/.nvmrc: -------------------------------------------------------------------------------- 1 | 24.12.0 -------------------------------------------------------------------------------- /.tokeignore: -------------------------------------------------------------------------------- 1 | docs/**/*.css 2 | pnpm-lock.yaml -------------------------------------------------------------------------------- /annimate_desktop/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist -------------------------------------------------------------------------------- /release.json: -------------------------------------------------------------------------------- 1 | { 2 | "versionBump": "none" 3 | } 4 | -------------------------------------------------------------------------------- /annimate_desktop/.prettierignore: -------------------------------------------------------------------------------- 1 | **/gen/** 2 | pnpm-lock.yaml -------------------------------------------------------------------------------- /annimate_desktop/src-tauri/.gitignore: -------------------------------------------------------------------------------- 1 | # Tauri 2 | /gen/schemas -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "packageManager": "pnpm@10.22.0" 3 | } 4 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"] 3 | } 4 | -------------------------------------------------------------------------------- /pages/img/annimate-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/pages/img/annimate-logo.png -------------------------------------------------------------------------------- /docs/readme/images/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/readme/images/screenshot.png -------------------------------------------------------------------------------- /annimate_desktop/src-tauri/build.rs: -------------------------------------------------------------------------------- 1 | //! Build script for `annimate_desktop`. 2 | 3 | fn main() { 4 | tauri_build::build(); 5 | } 6 | -------------------------------------------------------------------------------- /docs/user-guide/src/img/export-run.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/export-run.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/macos-home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/macos-home.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/import-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/import-menu.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/macos-update.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/macos-update.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/manage-back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/manage-back.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/update-error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/update-error.png -------------------------------------------------------------------------------- /annimate_core/tests/data/empty_graphml.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_core/tests/data/empty_graphml.zip -------------------------------------------------------------------------------- /annimate_desktop/src-tauri/icons/32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_desktop/src-tauri/icons/32x32.png -------------------------------------------------------------------------------- /annimate_desktop/src-tauri/icons/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_desktop/src-tauri/icons/icon.icns -------------------------------------------------------------------------------- /annimate_desktop/src-tauri/icons/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_desktop/src-tauri/icons/icon.ico -------------------------------------------------------------------------------- /annimate_desktop/src-tauri/icons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_desktop/src-tauri/icons/icon.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/annimate-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/annimate-logo.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/column-number.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/column-number.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/export-columns.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/export-columns.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/export-finished.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/export-finished.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/export-format.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/export-format.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/import-continue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/import-continue.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/import-dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/import-dialog.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/import-manage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/import-manage.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/macos-archive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/macos-archive.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/macos-damaged.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/macos-damaged.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/macos-extracted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/macos-extracted.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/macos-terminal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/macos-terminal.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/projects-load.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/projects-load.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/projects-save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/projects-save.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Editor directories and files 2 | .vscode/* 3 | !.vscode/extensions.json 4 | 5 | # Cargo 6 | /target/ 7 | 8 | # mdbook 9 | /pages/user-guide -------------------------------------------------------------------------------- /annimate_core/tests/data/pcc2_v7_relANNIS.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_core/tests/data/pcc2_v7_relANNIS.zip -------------------------------------------------------------------------------- /annimate_desktop/src-tauri/icons/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_desktop/src-tauri/icons/128x128.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/export-add-column.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/export-add-column.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/export-query-meta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/export-query-meta.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/import-add-to-set.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/import-add-to-set.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/projects-partial.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/projects-partial.png -------------------------------------------------------------------------------- /annimate_core/tests/data/subtok.demo_graphml.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_core/tests/data/subtok.demo_graphml.zip -------------------------------------------------------------------------------- /annimate_desktop/.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": ["prettier-plugin-tailwindcss"], 3 | "singleQuote": true, 4 | "tailwindFunctions": ["cn"] 5 | } 6 | -------------------------------------------------------------------------------- /annimate_desktop/src-tauri/icons/128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_desktop/src-tauri/icons/128x128@2x.png -------------------------------------------------------------------------------- /annimate_desktop/src-tauri/icons/StoreLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_desktop/src-tauri/icons/StoreLogo.png -------------------------------------------------------------------------------- /annimate_desktop/src-tauri/nsis-media/header.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_desktop/src-tauri/nsis-media/header.bmp -------------------------------------------------------------------------------- /docs/user-guide/src/img/export-missing-info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/export-missing-info.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/export-query-invalid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/export-query-invalid.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/export-query-partof.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/export-query-partof.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/export-query-valid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/export-query-valid.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/macos-applications.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/macos-applications.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/manage-delete-corpus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/manage-delete-corpus.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/projects-load-dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/projects-load-dialog.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/projects-save-dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/projects-save-dialog.png -------------------------------------------------------------------------------- /annimate_core/tests/data/subtok.demo2_relANNIS.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_core/tests/data/subtok.demo2_relANNIS.zip -------------------------------------------------------------------------------- /annimate_core/tests/data/subtok.demo3_relANNIS.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_core/tests/data/subtok.demo3_relANNIS.zip -------------------------------------------------------------------------------- /annimate_core/tests/data/subtok.demo4_relANNIS.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_core/tests/data/subtok.demo4_relANNIS.zip -------------------------------------------------------------------------------- /annimate_core/tests/data/subtok.demo_relANNIS.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_core/tests/data/subtok.demo_relANNIS.zip -------------------------------------------------------------------------------- /docs/user-guide/src/img/column-corpus-metadata.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/column-corpus-metadata.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/export-select-corpora.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/export-select-corpora.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/macos-terminal-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/macos-terminal-button.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/manage-add-corpus-set.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/manage-add-corpus-set.png -------------------------------------------------------------------------------- /annimate_core/tests/data/nocoverage.demo_graphml.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_core/tests/data/nocoverage.demo_graphml.zip -------------------------------------------------------------------------------- /annimate_desktop/src-tauri/icons/Square30x30Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_desktop/src-tauri/icons/Square30x30Logo.png -------------------------------------------------------------------------------- /annimate_desktop/src-tauri/icons/Square44x44Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_desktop/src-tauri/icons/Square44x44Logo.png -------------------------------------------------------------------------------- /annimate_desktop/src-tauri/icons/Square71x71Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_desktop/src-tauri/icons/Square71x71Logo.png -------------------------------------------------------------------------------- /annimate_desktop/src-tauri/icons/Square89x89Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_desktop/src-tauri/icons/Square89x89Logo.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/column-document-metadata.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/column-document-metadata.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/column-match-annotation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/column-match-annotation.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/column-match-in-context.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/column-match-in-context.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/manage-add-corpus-to-set.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/manage-add-corpus-to-set.png -------------------------------------------------------------------------------- /docs/user-guide/src/img/manage-delete-corpus-set.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/manage-delete-corpus-set.png -------------------------------------------------------------------------------- /annimate_desktop/src-tauri/icons/Square107x107Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_desktop/src-tauri/icons/Square107x107Logo.png -------------------------------------------------------------------------------- /annimate_desktop/src-tauri/icons/Square142x142Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_desktop/src-tauri/icons/Square142x142Logo.png -------------------------------------------------------------------------------- /annimate_desktop/src-tauri/icons/Square150x150Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_desktop/src-tauri/icons/Square150x150Logo.png -------------------------------------------------------------------------------- /annimate_desktop/src-tauri/icons/Square284x284Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_desktop/src-tauri/icons/Square284x284Logo.png -------------------------------------------------------------------------------- /annimate_desktop/src-tauri/icons/Square310x310Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_desktop/src-tauri/icons/Square310x310Logo.png -------------------------------------------------------------------------------- /docs/readme/documents/2025-ids-methodenmesse-poster.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/readme/documents/2025-ids-methodenmesse-poster.pdf -------------------------------------------------------------------------------- /annimate_core/tests/data/subtok.demo_renamed_graphml.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_core/tests/data/subtok.demo_renamed_graphml.zip -------------------------------------------------------------------------------- /docs/user-guide/src/img/manage-remove-corpus-from-set.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/docs/user-guide/src/img/manage-remove-corpus-from-set.png -------------------------------------------------------------------------------- /annimate_desktop/src/setup-tests.ts: -------------------------------------------------------------------------------- 1 | import { cleanup } from '@testing-library/react'; 2 | import { afterEach } from 'vitest'; 3 | 4 | afterEach(() => { 5 | cleanup(); 6 | }); 7 | -------------------------------------------------------------------------------- /annimate_core/tests/data/nondefaultsegmentation.demo_graphml.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/matthias-stemmler/annimate/HEAD/annimate_core/tests/data/nondefaultsegmentation.demo_graphml.zip -------------------------------------------------------------------------------- /annimate_desktop/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | interface ImportMetaEnv { 5 | readonly VITE_MOCK?: string; 6 | } 7 | -------------------------------------------------------------------------------- /annimate_desktop/pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | autoInstallPeers: false 2 | minimumReleaseAge: 1440 3 | onlyBuiltDependencies: 4 | - '@tailwindcss/oxide' 5 | - esbuild 6 | strictDepBuilds: true 7 | verifyDepsBeforeRun: prompt 8 | -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | # unstable 2 | comment_width = 120 3 | doc_comment_code_block_width = 120 4 | format_code_in_doc_comments = true 5 | group_imports = "StdExternalCrate" 6 | imports_granularity = "Module" 7 | wrap_comments = true -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/segmentations__pcc2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/segmentations.rs 3 | info: 4 | corpus_paths: 5 | - pcc2_v7_relANNIS.zip 6 | corpus_names: 7 | - pcc2 8 | --- 9 | [] 10 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/segmentations__subtok.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/segmentations.rs 3 | info: 4 | corpus_paths: 5 | - subtok.demo_relANNIS.zip 6 | corpus_names: 7 | - subtok.demo 8 | --- 9 | [ 10 | "diplomatic", 11 | "norm", 12 | ] 13 | -------------------------------------------------------------------------------- /annimate_desktop/src/lib/__mocks__/assert-type.ts: -------------------------------------------------------------------------------- 1 | // This asserts that the mocked API module has the same interface as the real API module 2 | 3 | import * as api from '../api'; 4 | import * as apiMock from './api'; 5 | 6 | apiMock satisfies typeof api; 7 | api satisfies typeof apiMock; 8 | -------------------------------------------------------------------------------- /annimate_desktop/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true 8 | }, 9 | "include": ["vite.config.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /docs/user-guide/src/img/arrow-left.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /annimate_desktop/src/global.ts: -------------------------------------------------------------------------------- 1 | export {}; 2 | 3 | declare global { 4 | interface Window { 5 | __ANNIMATE__: { 6 | updateEnabled: boolean; 7 | versionInfo: { 8 | annimateVersion: string; 9 | graphannisVersion: string; 10 | }; 11 | }; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/segmentations__subtok_renamed.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/segmentations.rs 3 | info: 4 | corpus_paths: 5 | - subtok.demo_renamed_graphml.zip 6 | corpus_names: 7 | - subtok.demo_renamed 8 | --- 9 | [ 10 | "diplomatic", 11 | "norm", 12 | ] 13 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/export_matches__empty.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/export_matches.rs 3 | info: 4 | corpus_paths: 5 | - empty_graphml.zip 6 | corpus_names: 7 | - empty 8 | aql_query: doc 9 | query_language: AQL 10 | export_columns: 11 | - Number 12 | --- 13 | Number 14 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/segmentations__nondefaultsegmentation.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/segmentations.rs 3 | info: 4 | corpus_paths: 5 | - nondefaultsegmentation.demo_graphml.zip 6 | corpus_names: 7 | - nondefaultsegmentation.demo 8 | --- 9 | [ 10 | "diplomatic", 11 | "norm", 12 | ] 13 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/metadata__11_delete_corpus_set_with_corpora.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/metadata.rs 3 | --- 4 | Corpora { 5 | corpora: [], 6 | sets: [ 7 | "Test set 3", 8 | ], 9 | } 10 | 11 | -- 12 | 13 | metadata-version = 1 14 | 15 | [corpus-sets."Test set 3"] 16 | corpus-names = [] 17 | -------------------------------------------------------------------------------- /annimate_desktop/src/components/main-page/columns/utils.ts: -------------------------------------------------------------------------------- 1 | import { AnnoKey } from '@/lib/api-types'; 2 | 3 | export const annoKeyToValue = (annoKey: AnnoKey): string => 4 | `${annoKey.ns}:${annoKey.name}`; 5 | 6 | export const valueToAnnoKey = (value: string): AnnoKey => { 7 | const [ns, name] = value.split(':'); 8 | return { ns, name }; 9 | }; 10 | -------------------------------------------------------------------------------- /annimate_desktop/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Annimate 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /annimate_desktop/src/components/store-provider.tsx: -------------------------------------------------------------------------------- 1 | import { StoreContext, createStoreForContext } from '@/lib/store'; 2 | import { FC, PropsWithChildren, useState } from 'react'; 3 | 4 | export const StoreProvider: FC = ({ children }) => { 5 | const [store] = useState(createStoreForContext); 6 | return ; 7 | }; 8 | -------------------------------------------------------------------------------- /annimate_desktop/src/components/ui/custom/spinner.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from '@/lib/utils'; 2 | import { LoaderIcon } from 'lucide-react'; 3 | import { FC } from 'react'; 4 | 5 | export type SpinnerProps = { 6 | className?: string; 7 | }; 8 | 9 | export const Spinner: FC = ({ className }) => ( 10 | 11 | ); 12 | -------------------------------------------------------------------------------- /annimate_desktop/src/components/ui/collapsible.tsx: -------------------------------------------------------------------------------- 1 | import * as CollapsiblePrimitive from '@radix-ui/react-collapsible'; 2 | 3 | const Collapsible = CollapsiblePrimitive.Root; 4 | 5 | const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger; 6 | 7 | const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent; 8 | 9 | export { Collapsible, CollapsibleTrigger, CollapsibleContent }; 10 | -------------------------------------------------------------------------------- /docs/user-guide/src/img/pencil.svg: -------------------------------------------------------------------------------- 1 | 3 | 5 | 6 | -------------------------------------------------------------------------------- /annimate_desktop/src/lib/urls.ts: -------------------------------------------------------------------------------- 1 | export const URL_ANNIMATE = 'https://github.com/matthias-stemmler/annimate'; 2 | 3 | export const URL_ANNIMATE_USER_GUIDE = 4 | 'https://matthias-stemmler.github.io/annimate/user-guide/'; 5 | 6 | export const URL_AQL_OPERATORS = 7 | 'https://korpling.github.io/ANNIS/4.0/user-guide/aql/operators.html'; 8 | 9 | export const URL_GRAPHANNIS = 'https://corpus-tools.org/graphannis/'; 10 | -------------------------------------------------------------------------------- /docs/user-guide/book.toml: -------------------------------------------------------------------------------- 1 | [book] 2 | authors = ["Matthias Stemmler"] 3 | description = "User Guide for the Annimate corpus export tool" 4 | language = "en" 5 | src = "src" 6 | title = "Annimate User Guide" 7 | 8 | [build] 9 | build-dir = "../../pages/user-guide" 10 | create-missing = false 11 | 12 | [output.html] 13 | git-repository-url = "https://github.com/matthias-stemmler/annimate" 14 | smart-punctuation = true 15 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/project__default.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/project.rs 3 | info: 4 | corpus_set: ~ 5 | corpus_names: [] 6 | aql_query: "" 7 | query_language: AQL 8 | export_columns: [] 9 | export_format: Csv 10 | --- 11 | # Annimate project file 12 | # https://github.com/matthias-stemmler/annimate 13 | 14 | format-version = 1 15 | 16 | [project] 17 | query-language = "aql" 18 | export-format = "csv" 19 | -------------------------------------------------------------------------------- /annimate_desktop/components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "default", 4 | "rsc": false, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "", 8 | "css": "src/index.css", 9 | "baseColor": "slate", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils" 16 | }, 17 | "iconLibrary": "lucide" 18 | } 19 | -------------------------------------------------------------------------------- /docs/user-guide/src/img/trash-2.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/project__with_export_format_xlsx.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/project.rs 3 | info: 4 | corpus_set: ~ 5 | corpus_names: [] 6 | aql_query: "" 7 | query_language: AQL 8 | export_columns: [] 9 | export_format: Xlsx 10 | --- 11 | # Annimate project file 12 | # https://github.com/matthias-stemmler/annimate 13 | 14 | format-version = 1 15 | 16 | [project] 17 | query-language = "aql" 18 | export-format = "xlsx" 19 | -------------------------------------------------------------------------------- /docs/user-guide/src/img/grip-vertical.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /annimate_desktop/src/components/main-page/columns/props.ts: -------------------------------------------------------------------------------- 1 | import { AutoScroller } from '@/components/ui/custom/auto-scroller'; 2 | import { ExportColumnData, ExportColumnType } from '@/lib/api-types'; 3 | import { ExportColumnUpdate } from '@/lib/store'; 4 | 5 | export type ColumnProps = { 6 | autoScroller?: AutoScroller; 7 | data: ExportColumnData; 8 | onChange: (payload: (ExportColumnUpdate & { type: T })['payload']) => void; 9 | }; 10 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/metadata__00-default.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/metadata.rs 3 | --- 4 | Corpora { 5 | corpora: [ 6 | Corpus { 7 | name: "subtok.demo", 8 | included_in_sets: [], 9 | }, 10 | Corpus { 11 | name: "subtok.demo2", 12 | included_in_sets: [], 13 | }, 14 | ], 15 | sets: [], 16 | } 17 | 18 | -- 19 | 20 | metadata-version = 1 21 | 22 | [corpus-sets] 23 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/project__with_aql_query.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/project.rs 3 | info: 4 | corpus_set: ~ 5 | corpus_names: [] 6 | aql_query: Test AQL query 7 | query_language: AQL 8 | export_columns: [] 9 | export_format: Csv 10 | --- 11 | # Annimate project file 12 | # https://github.com/matthias-stemmler/annimate 13 | 14 | format-version = 1 15 | 16 | [project] 17 | query = "Test AQL query" 18 | query-language = "aql" 19 | export-format = "csv" 20 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/project__with_query_language_aql_quirks_v3.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/project.rs 3 | info: 4 | corpus_set: ~ 5 | corpus_names: [] 6 | aql_query: "" 7 | query_language: AQLQuirksV3 8 | export_columns: [] 9 | export_format: Csv 10 | --- 11 | # Annimate project file 12 | # https://github.com/matthias-stemmler/annimate 13 | 14 | format-version = 1 15 | 16 | [project] 17 | query-language = "aql-compatibility" 18 | export-format = "csv" 19 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/project__with_corpus_set.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/project.rs 3 | info: 4 | corpus_set: Test Corpus Set 5 | corpus_names: [] 6 | aql_query: "" 7 | query_language: AQL 8 | export_columns: [] 9 | export_format: Csv 10 | --- 11 | # Annimate project file 12 | # https://github.com/matthias-stemmler/annimate 13 | 14 | format-version = 1 15 | 16 | [project] 17 | corpus-set = "Test Corpus Set" 18 | query-language = "aql" 19 | export-format = "csv" 20 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/project__with_aql_query_complex.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/project.rs 3 | info: 4 | corpus_set: ~ 5 | corpus_names: [] 6 | aql_query: "a'''\"\nb" 7 | query_language: AQL 8 | export_columns: [] 9 | export_format: Csv 10 | --- 11 | # Annimate project file 12 | # https://github.com/matthias-stemmler/annimate 13 | 14 | format-version = 1 15 | 16 | [project] 17 | query = """ 18 | a'''" 19 | b""" 20 | query-language = "aql" 21 | export-format = "csv" 22 | -------------------------------------------------------------------------------- /docs/user-guide/src/SUMMARY.md: -------------------------------------------------------------------------------- 1 | [Introduction](introduction.md) 2 | 3 | - [Installation](installation.md) 4 | - [Importing Corpus Data](import.md) 5 | - [Exporting Query Results](export.md) 6 | - [Number](columns/number.md) 7 | - [Match in context](columns/match-in-context.md) 8 | - [Match annotation](columns/match-annotation.md) 9 | - [Corpus/document metadata](columns/metadata.md) 10 | - [Working With Projects](projects.md) 11 | - [Troubleshooting](troubleshooting.md) 12 | - [Links](links.md) 13 | -------------------------------------------------------------------------------- /.github/workflows/audit-cargo.yml: -------------------------------------------------------------------------------- 1 | name: Audit (Cargo) 2 | 3 | on: 4 | push: 5 | paths: 6 | - '**/Cargo.lock' 7 | schedule: 8 | - cron: "0 0 * * *" 9 | workflow_dispatch: 10 | 11 | jobs: 12 | audit: 13 | name: Audit 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - name: Checkout 18 | uses: actions/checkout@v6 19 | 20 | - name: Run audit 21 | uses: rustsec/audit-check@v2.0.0 22 | with: 23 | token: ${{ secrets.GITHUB_TOKEN }} 24 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/project__with_one_corpus_name.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/project.rs 3 | info: 4 | corpus_set: ~ 5 | corpus_names: 6 | - Test Corpus 1 7 | aql_query: "" 8 | query_language: AQL 9 | export_columns: [] 10 | export_format: Csv 11 | --- 12 | # Annimate project file 13 | # https://github.com/matthias-stemmler/annimate 14 | 15 | format-version = 1 16 | 17 | [project] 18 | corpora = ["Test Corpus 1"] 19 | query-language = "aql" 20 | export-format = "csv" 21 | -------------------------------------------------------------------------------- /docs/user-guide/README.md: -------------------------------------------------------------------------------- 1 | # Annimate User Guide Authoring 2 | 3 | ## Taking Screenshots 4 | 5 | - In `tauri.conf.json`, set window size to `1088x768` 6 | - In `main.rs`, comment the restoration of the window state 7 | - Configure window decorations appropriately 8 | - In KDE use `Breeze` with `Small` shadows of strength `50%`, otherwise keep the defaults 9 | - Start the application and navigate to the state of which you want to take a screenshot 10 | - Take a screenshot of the window with Spectacle 11 | - Add annotations as needed 12 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/metadata__02_toggle1.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/metadata.rs 3 | --- 4 | Corpora { 5 | corpora: [ 6 | Corpus { 7 | name: "subtok.demo", 8 | included_in_sets: [], 9 | }, 10 | Corpus { 11 | name: "subtok.demo2", 12 | included_in_sets: [], 13 | }, 14 | ], 15 | sets: [ 16 | "Test set", 17 | ], 18 | } 19 | 20 | -- 21 | 22 | metadata-version = 1 23 | 24 | [corpus-sets."Test set"] 25 | corpus-names = [] 26 | -------------------------------------------------------------------------------- /annimate_desktop/src/main.tsx: -------------------------------------------------------------------------------- 1 | import { App } from '@/components/app'; 2 | import '@/index.css'; 3 | import { StrictMode } from 'react'; 4 | import ReactDOM from 'react-dom/client'; 5 | 6 | if (import.meta.env.PROD) { 7 | document.addEventListener('contextmenu', (event) => { 8 | if (!(event.target instanceof HTMLTextAreaElement)) { 9 | event.preventDefault(); 10 | } 11 | }); 12 | } 13 | 14 | ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( 15 | 16 | 17 | , 18 | ); 19 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/project__with_two_corpus_names.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/project.rs 3 | info: 4 | corpus_set: ~ 5 | corpus_names: 6 | - Test Corpus 1 7 | - Test Corpus 2 8 | aql_query: "" 9 | query_language: AQL 10 | export_columns: [] 11 | export_format: Csv 12 | --- 13 | # Annimate project file 14 | # https://github.com/matthias-stemmler/annimate 15 | 16 | format-version = 1 17 | 18 | [project] 19 | corpora = [ 20 | "Test Corpus 1", 21 | "Test Corpus 2", 22 | ] 23 | query-language = "aql" 24 | export-format = "csv" 25 | -------------------------------------------------------------------------------- /annimate_desktop/src/lib/__mocks__/mock-release-notes.md: -------------------------------------------------------------------------------- 1 | ## [1.1.4] - 2024-10-01 2 | 3 | ### Added 4 | 5 | - New feature that will prove to be very useful once you work a bit with it so you get used to it 6 | - Another new feature 7 | - Yet another new feature 8 | 9 | ### Changed 10 | 11 | - Improved existing feature 12 | - Improved another existing feature 13 | - Improved yet another existing feature 14 | 15 | ### Fixed 16 | 17 | - Some bug 18 | - Another bug 19 | - Yet another bug 20 | 21 | [1.1.4]: https://github.com/matthias-stemmler/annimate/compare/v1.1.3...v1.1.4 22 | -------------------------------------------------------------------------------- /annimate_desktop/src/components/main-page/columns/utils.spec.ts: -------------------------------------------------------------------------------- 1 | import { 2 | annoKeyToValue, 3 | valueToAnnoKey, 4 | } from '@/components/main-page/columns/utils'; 5 | import { describe, expect, test } from 'vitest'; 6 | 7 | describe('utils', () => { 8 | test('annoKeyToValue', () => { 9 | const value = annoKeyToValue({ ns: 'ns', name: 'name' }); 10 | 11 | expect(value).toEqual('ns:name'); 12 | }); 13 | 14 | test('valueToAnnoKey', () => { 15 | const value = valueToAnnoKey('ns:name'); 16 | 17 | expect(value).toEqual({ ns: 'ns', name: 'name' }); 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/metadata__11_delete_corpus_set_only.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/metadata.rs 3 | --- 4 | Corpora { 5 | corpora: [ 6 | Corpus { 7 | name: "subtok.demo", 8 | included_in_sets: [ 9 | "Test set", 10 | ], 11 | }, 12 | ], 13 | sets: [ 14 | "Test set", 15 | "Test set 3", 16 | ], 17 | } 18 | 19 | -- 20 | 21 | metadata-version = 1 22 | 23 | [corpus-sets."Test set"] 24 | corpus-names = ["subtok.demo"] 25 | 26 | [corpus-sets."Test set 3"] 27 | corpus-names = [] 28 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/export_matches__nocoverage.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/export_matches.rs 3 | info: 4 | corpus_paths: 5 | - nocoverage.demo_graphml.zip 6 | corpus_names: 7 | - nocoverage.demo 8 | aql_query: "tok=\"no\"" 9 | query_language: AQL 10 | export_columns: 11 | - Number 12 | - Data: 13 | Text: 14 | left_context: 2 15 | right_context: 2 16 | segmentation: ~ 17 | primary_node_indices: ~ 18 | --- 19 | Number,Left context (tokens),Match (tokens),Right context (tokens) 20 | 1,There is,no,coverage . 21 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/metadata__01_initial.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/metadata.rs 3 | --- 4 | Corpora { 5 | corpora: [ 6 | Corpus { 7 | name: "subtok.demo", 8 | included_in_sets: [ 9 | "Test set", 10 | ], 11 | }, 12 | Corpus { 13 | name: "subtok.demo2", 14 | included_in_sets: [], 15 | }, 16 | ], 17 | sets: [ 18 | "Test set", 19 | ], 20 | } 21 | 22 | -- 23 | 24 | metadata-version = 1 25 | 26 | [corpus-sets."Test set"] 27 | corpus-names = ["subtok.demo"] 28 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/metadata__03_toggle2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/metadata.rs 3 | --- 4 | Corpora { 5 | corpora: [ 6 | Corpus { 7 | name: "subtok.demo", 8 | included_in_sets: [], 9 | }, 10 | Corpus { 11 | name: "subtok.demo2", 12 | included_in_sets: [ 13 | "Test set", 14 | ], 15 | }, 16 | ], 17 | sets: [ 18 | "Test set", 19 | ], 20 | } 21 | 22 | -- 23 | 24 | metadata-version = 1 25 | 26 | [corpus-sets."Test set"] 27 | corpus-names = ["subtok.demo2"] 28 | -------------------------------------------------------------------------------- /annimate_desktop/src/components/main-page/export-section.tsx: -------------------------------------------------------------------------------- 1 | import { ExportColumnList } from '@/components/main-page/export-column-list'; 2 | import { ExportFormatSelect } from '@/components/main-page/export-format-select'; 3 | import { ExportTrigger } from '@/components/main-page/export-trigger'; 4 | 5 | export const ExportSection = () => ( 6 |
7 | 8 | 9 |
10 | 11 | 12 |
13 |
14 | ); 15 | -------------------------------------------------------------------------------- /annimate_desktop/src/components/main-page/columns/layout.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from '@/lib/utils'; 2 | import { FC, PropsWithChildren } from 'react'; 3 | 4 | export const ColumnConfigGrid: FC = ({ children }) => ( 5 |
{children}
6 | ); 7 | 8 | export type ColumnConfigItemProps = PropsWithChildren<{ 9 | wide?: boolean; 10 | }>; 11 | 12 | export const ColumnConfigItem: FC = ({ 13 | children, 14 | wide = false, 15 | }) => ( 16 |
17 | {children} 18 |
19 | ); 20 | -------------------------------------------------------------------------------- /docs/user-guide/src/columns/number.md: -------------------------------------------------------------------------------- 1 | # Number 2 | 3 | !["Number" column](../img/column-number.png) 4 | 5 | This produces a single column that just contains the number of each match, i.e. it contains `1` for the first match, `2` for the second match and so on. 6 | 7 | This can be useful for referring to specific matches when analyzing the exported data. When exporting to Excel, it is particularly useful because Excel's automatic row numbering counts the header row as row number 1 and the first match row as row number 2, while a "Number" column produced by Annimate starts with 1 for the first match. The number next to the last match is the total number of matches. 8 | -------------------------------------------------------------------------------- /.github/workflows/fmt-check-cargo.yml: -------------------------------------------------------------------------------- 1 | name: Format check (Cargo) 2 | 3 | on: 4 | - workflow_call 5 | - workflow_dispatch 6 | 7 | env: 8 | RUSTFLAGS: --deny warnings 9 | 10 | jobs: 11 | fmt-check: 12 | name: Format check 13 | runs-on: ubuntu-latest 14 | 15 | steps: 16 | - name: Checkout 17 | uses: actions/checkout@v6 18 | 19 | - name: Install nightly toolchain with rustfmt 20 | uses: dtolnay/rust-toolchain@nightly 21 | with: 22 | components: rustfmt 23 | 24 | - name: Rust cache 25 | uses: swatinem/rust-cache@v2 26 | 27 | - name: Run format check 28 | run: cargo fmt --check 29 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: "\U0001F4A1 Idea" 4 | about: "Suggest a new feature to make Annimate better" 5 | url: https://github.com/matthias-stemmler/annimate/discussions/new?category=ideas 6 | - name: Start a Discussion 7 | about: "Start a discussion to share your experience with Annimate" 8 | url: https://github.com/matthias-stemmler/annimate/discussions/new/choose 9 | - name: Read the User Guide 10 | about: "Please make sure you have read the User Guide (especially the Troubleshooting section) before filing a bug report" 11 | url: https://matthias-stemmler.github.io/annimate/user-guide/ -------------------------------------------------------------------------------- /annimate_desktop/src/components/ui/label.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from '@/lib/utils'; 2 | import * as LabelPrimitive from '@radix-ui/react-label'; 3 | import { cva, type VariantProps } from 'class-variance-authority'; 4 | import { ComponentProps, FC } from 'react'; 5 | 6 | const labelVariants = cva( 7 | 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70', 8 | ); 9 | 10 | const Label: FC< 11 | ComponentProps & 12 | VariantProps 13 | > = ({ className, ...props }) => ( 14 | 15 | ); 16 | 17 | export { Label }; 18 | -------------------------------------------------------------------------------- /annimate_desktop/src-tauri/capabilities/default.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../gen/schemas/desktop-schema.json", 3 | "identifier": "default", 4 | "description": "Capability for the main window", 5 | "windows": ["main"], 6 | "permissions": [ 7 | "core:default", 8 | "dialog:allow-open", 9 | "dialog:allow-save", 10 | "dialog:default", 11 | "opener:default", 12 | "process:allow-exit", 13 | "process:allow-restart", 14 | "updater:default", 15 | "window-state:default", 16 | { 17 | "identifier": "opener:allow-open-path", 18 | "allow": [ 19 | { 20 | "path": "**/*" 21 | } 22 | ] 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /annimate_core/build.rs: -------------------------------------------------------------------------------- 1 | //! Build script for `annimate_core`. 2 | 3 | use cargo_metadata::MetadataCommand; 4 | 5 | fn main() { 6 | inject_graphannis_version(); 7 | } 8 | 9 | fn inject_graphannis_version() { 10 | let metadata = MetadataCommand::new() 11 | .exec() 12 | .expect("`cargo metadata` should run successfully"); 13 | 14 | let graphannis_version = metadata 15 | .packages 16 | .iter() 17 | .find(|p| p.name.as_str() == "graphannis") 18 | .expect("Cargo metadata should contain `graphannis` package") 19 | .version 20 | .to_string(); 21 | 22 | println!("cargo::rustc-env=GRAPHANNIS_VERSION={graphannis_version}"); 23 | } 24 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/metadata__06_add_corpora_to_set_new1.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/metadata.rs 3 | --- 4 | Corpora { 5 | corpora: [ 6 | Corpus { 7 | name: "subtok.demo", 8 | included_in_sets: [ 9 | "Test set", 10 | ], 11 | }, 12 | Corpus { 13 | name: "subtok.demo2", 14 | included_in_sets: [ 15 | "Test set", 16 | ], 17 | }, 18 | ], 19 | sets: [ 20 | "Test set", 21 | ], 22 | } 23 | 24 | -- 25 | 26 | metadata-version = 1 27 | 28 | [corpus-sets."Test set"] 29 | corpus-names = [ 30 | "subtok.demo", 31 | "subtok.demo2", 32 | ] 33 | -------------------------------------------------------------------------------- /annimate_desktop/src/components/ui/separator.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from '@/lib/utils'; 2 | import * as SeparatorPrimitive from '@radix-ui/react-separator'; 3 | import { ComponentProps, FC } from 'react'; 4 | 5 | const Separator: FC> = ({ 6 | className, 7 | orientation = 'horizontal', 8 | decorative = true, 9 | ...props 10 | }) => ( 11 | 21 | ); 22 | 23 | export { Separator }; 24 | -------------------------------------------------------------------------------- /annimate_desktop/src/lib/query-node-utils.ts: -------------------------------------------------------------------------------- 1 | import { QueryNodeRef } from '@/lib/api-types'; 2 | 3 | export const findEligibleQueryNodeRefIndex = ( 4 | eligibleNodeRefs: QueryNodeRef[], 5 | nodeRef: QueryNodeRef, 6 | ): number | undefined => { 7 | const eligibleNodeRefsWithIndex = eligibleNodeRefs 8 | .map((n, i): [QueryNodeRef, number] => [n, i]) 9 | .filter(([n]) => n.variables.some((v) => nodeRef.variables.includes(v))); 10 | 11 | if (eligibleNodeRefsWithIndex.length === 0) { 12 | return undefined; 13 | } 14 | 15 | const [, index] = 16 | eligibleNodeRefsWithIndex.find(([n]) => n.index === nodeRef.index) ?? 17 | eligibleNodeRefsWithIndex[0]; 18 | 19 | return index; 20 | }; 21 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/metadata__04_add_corpora_to_set_existing1.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/metadata.rs 3 | --- 4 | Corpora { 5 | corpora: [ 6 | Corpus { 7 | name: "subtok.demo", 8 | included_in_sets: [ 9 | "Test set", 10 | ], 11 | }, 12 | Corpus { 13 | name: "subtok.demo2", 14 | included_in_sets: [ 15 | "Test set", 16 | ], 17 | }, 18 | ], 19 | sets: [ 20 | "Test set", 21 | ], 22 | } 23 | 24 | -- 25 | 26 | metadata-version = 1 27 | 28 | [corpus-sets."Test set"] 29 | corpus-names = [ 30 | "subtok.demo", 31 | "subtok.demo2", 32 | ] 33 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/metadata__05_add_corpora_to_set_existing2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/metadata.rs 3 | --- 4 | Corpora { 5 | corpora: [ 6 | Corpus { 7 | name: "subtok.demo", 8 | included_in_sets: [ 9 | "Test set", 10 | ], 11 | }, 12 | Corpus { 13 | name: "subtok.demo2", 14 | included_in_sets: [ 15 | "Test set", 16 | ], 17 | }, 18 | ], 19 | sets: [ 20 | "Test set", 21 | ], 22 | } 23 | 24 | -- 25 | 26 | metadata-version = 1 27 | 28 | [corpus-sets."Test set"] 29 | corpus-names = [ 30 | "subtok.demo", 31 | "subtok.demo2", 32 | ] 33 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/metadata__10_delete_corpus.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/metadata.rs 3 | --- 4 | Corpora { 5 | corpora: [ 6 | Corpus { 7 | name: "subtok.demo", 8 | included_in_sets: [ 9 | "Test set", 10 | "Test set 2 new", 11 | ], 12 | }, 13 | ], 14 | sets: [ 15 | "Test set", 16 | "Test set 2 new", 17 | "Test set 3", 18 | ], 19 | } 20 | 21 | -- 22 | 23 | metadata-version = 1 24 | 25 | [corpus-sets."Test set"] 26 | corpus-names = ["subtok.demo"] 27 | 28 | [corpus-sets."Test set 2 new"] 29 | corpus-names = ["subtok.demo"] 30 | 31 | [corpus-sets."Test set 3"] 32 | corpus-names = [] 33 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/import__import-2.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/import.rs 3 | --- 4 | Corpora { 5 | corpora: [ 6 | Corpus { 7 | name: "empty", 8 | included_in_sets: [], 9 | }, 10 | Corpus { 11 | name: "subtok.demo", 12 | included_in_sets: [], 13 | }, 14 | Corpus { 15 | name: "subtok.demo2", 16 | included_in_sets: [], 17 | }, 18 | Corpus { 19 | name: "subtok.demo3", 20 | included_in_sets: [], 21 | }, 22 | Corpus { 23 | name: "subtok.demo4", 24 | included_in_sets: [], 25 | }, 26 | ], 27 | sets: [], 28 | } 29 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/project__with_export_columns_with_segmentation.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/project.rs 3 | info: 4 | corpus_set: ~ 5 | corpus_names: [] 6 | aql_query: "" 7 | query_language: AQL 8 | export_columns: 9 | - MatchInContext: 10 | context: 11 | Symmetric: 20 12 | primary_node_indices: ~ 13 | segmentation: Test Segmentation 14 | export_format: Csv 15 | --- 16 | # Annimate project file 17 | # https://github.com/matthias-stemmler/annimate 18 | 19 | format-version = 1 20 | 21 | [project] 22 | query-language = "aql" 23 | export-format = "csv" 24 | 25 | [[project.columns]] 26 | type = "match-in-context" 27 | segmentation = "Test Segmentation" 28 | context = 20 29 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/project__with_export_columns_with_asymmetric_context.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/project.rs 3 | info: 4 | corpus_set: ~ 5 | corpus_names: [] 6 | aql_query: "" 7 | query_language: AQL 8 | export_columns: 9 | - MatchInContext: 10 | context: 11 | Asymmetric: 12 | left: 5 13 | right: 10 14 | primary_node_indices: ~ 15 | segmentation: ~ 16 | export_format: Csv 17 | --- 18 | # Annimate project file 19 | # https://github.com/matthias-stemmler/annimate 20 | 21 | format-version = 1 22 | 23 | [project] 24 | query-language = "aql" 25 | export-format = "csv" 26 | 27 | [[project.columns]] 28 | type = "match-in-context" 29 | context = { left = 5, right = 10 } 30 | -------------------------------------------------------------------------------- /annimate_desktop/src/components/ui/progress.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from '@/lib/utils'; 2 | import * as ProgressPrimitive from '@radix-ui/react-progress'; 3 | import { ComponentProps, FC } from 'react'; 4 | 5 | const Progress: FC> = ({ 6 | className, 7 | value, 8 | ...props 9 | }) => ( 10 | 17 | 21 | 22 | ); 23 | 24 | export { Progress }; 25 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/export_matches__subtok_varying_number_of_match_nodes_with_explicit_primary_node_indices.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/export_matches.rs 3 | info: 4 | corpus_paths: 5 | - subtok.demo_relANNIS.zip 6 | corpus_names: 7 | - subtok.demo 8 | aql_query: "(pos=\"DT\" .5,5 pos=\"DT\") | pos=\"NN\"" 9 | query_language: AQL 10 | export_columns: 11 | - Data: 12 | Text: 13 | left_context: 1 14 | right_context: 1 15 | segmentation: ~ 16 | primary_node_indices: 17 | - 0 18 | - 1 19 | --- 20 | Context 1 (tokens),Match 1 (tokens),Context 2 (tokens),Match 2 (tokens),Context 3 (tokens) 21 | ,T his,is (...) of,a,sub- 22 | an,example,of,, 23 | tokenized,corpus,.,, 24 | -------------------------------------------------------------------------------- /annimate_core/tests/snapshots/export_matches__subtok_optional_nodes.snap: -------------------------------------------------------------------------------- 1 | --- 2 | source: annimate_core/tests/export_matches.rs 3 | info: 4 | corpus_paths: 5 | - subtok.demo_relANNIS.zip 6 | corpus_names: 7 | - subtok.demo 8 | aql_query: "norm? !.norm,3 norm" 9 | query_language: AQL 10 | export_columns: 11 | - Data: 12 | Anno: 13 | MatchNode: 14 | anno_key: 15 | - grammar 16 | - lemma 17 | index: 0 18 | - Data: 19 | Text: 20 | left_context: 1 21 | right_context: 1 22 | segmentation: norm 23 | primary_node_indices: ~ 24 | --- 25 | #2 lemma,Left context (norm),Match (norm),Right context (norm) 26 | This,,This,is 27 | be,This,is,an 28 | a,is,an,example 29 | -------------------------------------------------------------------------------- /annimate_desktop/src/components/main-page/export-format-select.tsx: -------------------------------------------------------------------------------- 1 | import { Select } from '@/components/ui/custom/select'; 2 | import { 3 | useExportFormat, 4 | useIsExporting, 5 | useSetExportFormat, 6 | } from '@/lib/store'; 7 | import { FC } from 'react'; 8 | 9 | export const ExportFormatSelect: FC = () => { 10 | const exportFormat = useExportFormat(); 11 | const setExportFormat = useSetExportFormat(); 12 | const isExporting = useIsExporting(); 13 | 14 | return ( 15 |