README.md 17.9 KB
Newer Older
1
# TIDO
Mathias Goebel's avatar
Mathias Goebel committed
2

3
Text vIewer for Digital Objects.
Mathias Goebel's avatar
Mathias Goebel committed
4

5
**Note:**
6
Although TIDO is designed as a generic viewer for digital editions, it is currently developed within the scope of the [Ahiqar project](https://gitlab.gwdg.de/subugoe/ahiqar).
nwindis's avatar
nwindis committed
7

8
9
This is the reason for "Ahiqar" being mentioned several times in the docs of this repo.

nwindis's avatar
nwindis committed
10
Demo: <https://subugoe.pages.gwdg.de/emo/tido/develop>
Nils Windisch's avatar
MINOR    
Nils Windisch committed
11

12
13
(For newer branches the demo is deployed in a directory named with branch name lowercased, shortened to 63 bytes, and with everything except `0-9` and `a-z` replaced with `-` (CI_COMMIT_REF_SLUG).
Also the commit short hash can be used to see a demo.
mrodzis's avatar
mrodzis committed
14

nwindis's avatar
nwindis committed
15
## Overview
16
17
18
19

<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->

20
- [Latest Version and Integration](#latest-version-and-integration)
Mathias Goebel's avatar
Mathias Goebel committed
21
  - [Get the Viewer](#get-the-viewer)
22
23
24
    - [Registry setup](#registry-setup)
    - [Installation](#installation)
  - [Integration](#integration)
Mathias Goebel's avatar
Mathias Goebel committed
25
  - [Config](#config)
26
- [Getting Started (Developers)](#getting-started-developers)
27
  - [Prerequisites](#prerequisites)
28
  - [Environment setup](#environment-setup)
schneider210's avatar
schneider210 committed
29
30
31
32
    - [Set up `nvm` and the recent stable version of `node.js`](#set-up-nvm-and-the-recent-stable-version-of-nodejs)
    - [Set up `global` project requirements via `npm`](#set-up-global-project-requirements-via-npm)
    - [Clone the repository](#clone-the-repository)
    - [Get the dependencies](#get-the-dependencies)
33
34
  - [Usage](#usage)
    - [`development mode` (hot reloading, error reporting, etc.)](#development-mode-hot-reloading-error-reporting-etc)
schneider210's avatar
schneider210 committed
35
36
    - [`Linting`](#linting)
    - [`Testing`](#testing)
37
38
    - [`Building` the app for production](#building-the-app-for-production)
- [Configuration](#configuration)
39
40
  - [The Keys in Detail](#the-keys-in-detail)
  - [Configure the Panels](#configure-the-panels)
41
    - [The Panel Keys in Detail](#the-panel-keys-in-detail)
Mathias Goebel's avatar
Mathias Goebel committed
42
- [Viewer Architecture](#viewer-architecture)
43
44
- [Dockerfile](#dockerfile)
- [Connecting the Viewer to a Backend](#connecting-the-viewer-to-a-backend)
schneider210's avatar
schneider210 committed
45
- [Architecture](#architecture)
46
47
48
49
50
51
- [Contributing](#contributing)
- [Versioning](#versioning)
- [Authors](#authors)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

52
## Latest Version and Integration
53

Mathias Goebel's avatar
Mathias Goebel committed
54
TiDO is provided as **npm package**. Please follow the steps below to include it for production:
schneider210's avatar
schneider210 committed
55

Mathias Goebel's avatar
Mathias Goebel committed
56
### Get the Viewer
57
58
59

#### Registry setup

Mathias Goebel's avatar
Mathias Goebel committed
60
Since npm communicates with the package API, it is necessary to setup a valid endpoint.
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75

```bash
echo @subugoe:registry=https://gitlab.gwdg.de/api/v4/packages/npm/ >>.npmrc
```

**Note**: fire this command inside the **root** of your **project directory**.

#### Installation

```bash
npm i @subugoe/tido
```

### Integration

Mathias Goebel's avatar
Mathias Goebel committed
76
Add this line to your **main.js** file:
77
78
79
80
81
82
83

```js
import '@subugoe/tido/dist/tido'
```

**Note**: `main.js` serves as your *entrypoint* usually located at **/[projectdir]/src/main.js**. It depends on your individual project setup.

Mathias Goebel's avatar
Mathias Goebel committed
84
### Config
schneider210's avatar
schneider210 committed
85

Mathias Goebel's avatar
Mathias Goebel committed
86
Copy the config object into your **index.html** and follow the instructions given [here](#configuration).
schneider210's avatar
schneider210 committed
87

88
**Note**: Please make sure to provide a valid *entrypoint* that points to the manifest / collection that you want to be displayed.
nwindis's avatar
nwindis committed
89

90
## Getting Started (Developers)
mrodzis's avatar
mrodzis committed
91
92
93

### Prerequisites

94
To get TIDO up and running you should have the following software installed:
mrodzis's avatar
mrodzis committed
95

96
97
98
- **curl**
- **npm**
- **nvm**
mrodzis's avatar
mrodzis committed
99

100
**Note**:
mrodzis's avatar
mrodzis committed
101

nwindis's avatar
nwindis committed
102
103
104
105
We recommend to make use of `nvm`, since there might be issues with npm regarding permissions.  
The main purpose of `nvm` is to have multiple node versions installed in regards to different projects which might demand some sort of backwards compatibility.  
It enables you to just switch to the appropriate node version.  
Besides it also keeps track of resolving permission issues, since all your global installations go to your home directory (~/.nvm/) instead of being applied systemwide.
mrodzis's avatar
mrodzis committed
106

107
### Environment setup
schneider210's avatar
schneider210 committed
108
109

#### Set up `nvm` and the recent stable version of `node.js`
mrodzis's avatar
mrodzis committed
110

111
112
113
114
```bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
nvm install stable
```
115

116
**Note**:
117
After the nvm installation is done, please `restart` your shell session once. That's due to changes to your profile environment.
118

schneider210's avatar
schneider210 committed
119
#### Set up `global` project requirements via `npm`
120

nwindis's avatar
nwindis committed
121
122
123
```bash
npm install -g @vue/cli @vue/cli-service-global @quasar/cli
```
124
125
126

#### Clone the repository

nwindis's avatar
nwindis committed
127
```bash
nwindis's avatar
nwindis committed
128
git clone git@gitlab.gwdg.de:subugoe/emo/tido.git
nwindis's avatar
nwindis committed
129
```
130
131
132

#### Get the dependencies

133
Head over to your project directory, where you just cloned the repository to as described above and get all the dependencies needed by typing:
134

nwindis's avatar
nwindis committed
135
136
137
138
```bash
cd /path/to/projectdir
npm install
```
139

schneider210's avatar
schneider210 committed
140
That's it. You should now be able to run the Viewer.
141

142
### Usage
Mathias Goebel's avatar
Mathias Goebel committed
143

144
#### `development mode` (hot reloading, error reporting, etc.)
145

Mathias Goebel's avatar
Mathias Goebel committed
146
```bash
147
npm run dev
Mathias Goebel's avatar
Mathias Goebel committed
148
```
149

schneider210's avatar
schneider210 committed
150
(usually located at: `localhost:8080` since this port isn't already occupied)
Nils Windisch's avatar
Nils Windisch committed
151

schneider210's avatar
schneider210 committed
152
#### `Linting`
153

Mathias Goebel's avatar
Mathias Goebel committed
154
```bash
155
156
npm run lint            # to lint all the files at once
npm run lint:js         # to lint js files only
157
npm run lint:markdown   # to lint the markdown
158
159
npm run lint:scss       # to lint the styles
npm run lint:vue        # to lint vue files only
Mathias Goebel's avatar
Mathias Goebel committed
160
161
```

schneider210's avatar
schneider210 committed
162
163
164
165
166
167
#### `Testing`

```bash
npm run test:unit
```

Mathias Goebel's avatar
Mathias Goebel committed
168
169
The Viewer uses **jest**; a JavaScript test suite.

schneider210's avatar
schneider210 committed
170
171
Tests reside under **tests/unit/specs/** and are supposed to have a file ending of either `*.test.js` or `*.spec.js`.

172
#### `Building` the app for production
173

Mathias Goebel's avatar
Mathias Goebel committed
174
```bash
175
npm run build
Mathias Goebel's avatar
Mathias Goebel committed
176
177
```

Mathias Goebel's avatar
Mathias Goebel committed
178
**Note**: The complete build is located at `/dist/`.
schneider210's avatar
schneider210 committed
179

180
## Configuration
181

182
183
The Viewer is build with **Vue.js** and **Quasar**.
If you want to change the Quasar configuration, please [refer to their respective docs](https://quasar.dev/quasar-cli/quasar-conf-js) (Configuring quasar.conf.js).
mrodzis's avatar
mrodzis committed
184

185
You can fully customize the Viewer's behaviour:
186

187
There are options to
188

189
- change the color scheme
190
- show or hide individual bars (titles, navigation, toggles)
191
192
193
- group multiple components inside a single panel
- set the order of the panels
- rename labels and / or panel headings
nwindis's avatar
nwindis committed
194
- switch project header on or off and provide descriptive strings
195
- and **more** ...
196

197
As a rule of thumb, each key with a boolean value (e.g. *true* or *false*) defaults to `true` and denotes to show the appropriate element.
198

schneider210's avatar
schneider210 committed
199
```html
200
  <script id="tido-config" type="application/json">
schneider210's avatar
schneider210 committed
201
  {
202
    "entrypoint": "https://subugoe.pages.gwdg.de/emo/backend/sampledata/collection.json",
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
      "annotations": {
        "show": true,
        "types": [
          {
            "contenttype": "Person",
            "icon": "fasUser",
            "label": "Names"
          },
          {
            "contenttype": "Place",
            "icon": "fasMapMarkerAlt",
            "label": "Places"
          },
          {
            "contenttype": "Editorial Comment",
            "icon": "fasComment",
            "label": "Comments"
          },
          {
            "contenttype": "Motif",
            "icon": "fasHighlighter",
            "label": "Motifs"
          }
        ],
        "tabs":{
          "Editorial": ["Person", "Place", "Editorial Comment"],
          "Motif": ["Motif"]
        }
      },
      "breadcrumbNavigation": {
233
        "source": "external",
234
        "search_page_path": "search.html",
235
        "search_query_param": "searchTerm",
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
        "title_homepage_key": "title_homepage",
        "title_viewer_key": "title_viewer",
        "website": "https://ahikar.sub.uni-goettingen.de/website/"
      },
      "colors": {
        "primary": "",
        "secondary": "",
        "accent": ""
      },
      "header_section": {
        "show": true,
        "navigation": true,
        "panelheadings": true,
        "titles": true,
        "toggle": true
      },
      "labels": {
        "item": "Sheet",
        "manifest": "Manuscript"
      },
      "lang": "de-de",
      "language-switch": true,
      "meta": {
        "collection": {
          "all": true
        },
        "manifest": {
          "all": true
        },
        "item": {
          "all": true
        }
      },
      "notificationColors": {
        "info":"blue-9",
        "warning":"red-9"
      },
      "panels": [
Mathias Goebel's avatar
Mathias Goebel committed
274
        {
275
276
277
278
          "connector": [1, 2],
          "panel_label": "contentsMetadata",
          "show": true,
          "toggle": true
Mathias Goebel's avatar
Mathias Goebel committed
279
280
        },
        {
281
282
283
284
          "connector": [3],
          "panel_label": "Image",
          "show": true,
          "toggle": true
Mathias Goebel's avatar
Mathias Goebel committed
285
286
        },
        {
287
288
289
290
          "connector": [4],
          "panel_label": "Text",
          "show": true,
          "toggle": true
Mathias Goebel's avatar
Mathias Goebel committed
291
292
        },
        {
293
294
295
296
          "connector": [5],
          "panel_label": "Annotations",
          "show": true,
          "toggle": true
Mathias Goebel's avatar
Mathias Goebel committed
297
298
        }
      ],
299
      "rtl": false
300
  }  </script>
301
302
```

dindigala's avatar
dindigala committed
303
**Note**: its a *JSON* object. So if you are going to make any changes and you have to quote these (e.g. see *labels* or *colors*), please use **double quotes** only.
304

305
### The Keys in Detail
306

307
- **entrypoint**
308

nwindis's avatar
nwindis committed
309
310
  to link the viewer to a backend, the entrypoint should point to the collection you want to be displayed.
  (Further details below: [Connecting the Viewer to a Backend](#connecting-the-viewer-to-a-backend))
311

312
  **Note**: You have to provide at least a valid entrypoint (see below). Otherwise the Viewer won't show anything at all!
313

Mathias Goebel's avatar
Mathias Goebel committed
314
315
316
317
318
319
320
321
322
323
324
325
- **annotations**

  - **types**

      the types-array consists of an arbitrary number of objects, each representing an annotation type (e.g. Person, Place, Organization, ...).

      each object in turn consists of similar building blocks:

    - **content-type**

        refers to the **x-content-type** in the **API** you are using.

dindigala's avatar
dindigala committed
326
        **Note**: This content-type has to match its API-counterpart explicitely, otherwise TIDO isn't able to show the related annotations.
Mathias Goebel's avatar
Mathias Goebel committed
327
328
329
330
331
332
333
334
335

    - **icon**

        TIDO uses [Font Awesome Icons](https://fontawesome.com/). Choose an icon that fits your needs.

    - **label**

        The label of the annotation type respectively

336
337
338
339
  - **tabs**

    the tabs-object represents different types of annotations to be displayed in tabs accordingly.
    it consists of further extensible sub keys called group labels, either of it representing a single group of annotations, e.g. *editorial*, *motifs*.
dindigala's avatar
dindigala committed
340
    these labels act as your tab heading and its naming is up to your liking.
341
342
343
344
345
346
347
348
349
350

    e.g.

  ```JSON
  "tabs": {
    "First group": ["Person", "Place", "Editorial Comment"],
    "Second one": ["Motif"]
  }
  ```

dindigala's avatar
dindigala committed
351
  **Note**: The strings contained within the group label keys (e.g. *Person*, *Place*, ...) have to match its API-counterpart explicitely. Please refer to the note above (content-type).
352

353
354
- **breadcrumbNavigation**

355
356
357
358
359
360
361
362
363
364
    **Note**: To display the project header or breadcrumb Navigation in TIDO, we need to pass "source" parameter from Website Search resulted page selected item.

  - **source**

    Defines if a project header should be displayed when we navigated from an external website.

    **Note**: This value of source should be same as the one we passed from url parameter of the website.

    Defaults to `external`, can be changed to project specific parameter.

365
  - **search_page_path**
366

367
    Defines redirected path to search page when navigating from TIDO to a website.
368
369
370
371

    **Note** We do not need to provide this specifically if the redirection to the search page is handle by routes.

  - **search_query_param**
372

373
    Defines query parameter than can be displayed in the search breadcrumb of project header. When clicked on it, we can navigate back to the search page with their results displayed.
374

375
    Shows a "Search Icon"
376
377
378

  - **title_homepage_key**

379
    Defines the string shown as first item in the breadcrumb. Shows a "Home Icon"
380

381
    **Note**: To change this title please navigate to "tido/src/i18n/en or tido/src/i18n/de" and find "title_homepage".
382
383
384
385
386

    Has to be set!

  - **title_viewer_key**

387
    Defines the string shown as last item in the breadcrumb. Shows a "Document Icon"
388

389
    **Note**: To change this title please navigate to "tido/src/i18n/en or tido/src/i18n/de" and find "title_viewer".
390
391
392
393
394
395
396

    Has to be set!

  - **website**

    Navigates to the Home Page page on website.

397
398
- **colors**

Mathias Goebel's avatar
Mathias Goebel committed
399
  set the colors used in the frontend.
400

dindigala's avatar
dindigala committed
401
  `primary` and `accent` should be a darker tone, so that white text is visible if used as background. its the other way around with `secondary`.
402
403
404
405
406

  Hex values (like `#a1a1a1`) or color names (like `hotpink`) are fine.

  If any value is left blank (e.g. `"primary": "",`), a default color scheme will be used.

407
- **header_section**
408

Mathias Goebel's avatar
Mathias Goebel committed
409
  - **show**
nwindis's avatar
nwindis committed
410

Mathias Goebel's avatar
Mathias Goebel committed
411
412
413
      set this value to `false` if you want to completely switch off all the headerbars at once.  
      This value takes **precedence** over the other *header-keys*.  
      If it is set to `false`, the other settings for the individual bars are not taken into account.
nwindis's avatar
nwindis committed
414

Mathias Goebel's avatar
Mathias Goebel committed
415
      *(A use case might be to embed the Viewer into an existing website and you simply need more screen space)*
416

nwindis's avatar
nwindis committed
417
418
  - **navigation**

Mathias Goebel's avatar
Mathias Goebel committed
419
      set this value to `false` if you want to switch off the NavBar
nwindis's avatar
nwindis committed
420

421
422
423
424
  - **panelheadings**

    set this value to `false` if you want to switch off the panels' headings respectively

425
426
427
428
    - **titles**

    set this value to `false` if you want to switch off the Titlebar (a.k.a. breadcrumbs)  

nwindis's avatar
nwindis committed
429
430
  - **toggle**

Mathias Goebel's avatar
Mathias Goebel committed
431
      set this value to `false` if you want to switch off the ToggleBar.
nwindis's avatar
nwindis committed
432

Mathias Goebel's avatar
Mathias Goebel committed
433
      **Note**: if you turn this one off, you won't be able to toggle the panels anymore.
434

Mathias Goebel's avatar
Mathias Goebel committed
435
    All header values default to `true`
436
437
438

- **labels**

nwindis's avatar
nwindis committed
439
  - **item**:
440

Mathias Goebel's avatar
Mathias Goebel committed
441
442
443
      The label of the item respectively  
      Assuming your collection consists of letters, you'd maybe want to name it "letter" or just "sheet" for instance.  
      This change affects the captions of the navbuttons located in the headerbar and the metadata section.
444

Mathias Goebel's avatar
Mathias Goebel committed
445
      Defaults to `Sheet`
446

nwindis's avatar
nwindis committed
447
  - **manifest**:
448

Mathias Goebel's avatar
Mathias Goebel committed
449
      Same as for `item` but related to the manifest title.
schneider210's avatar
schneider210 committed
450

Mathias Goebel's avatar
Mathias Goebel committed
451
      Defaults to `Manuscript`
nwindis's avatar
nwindis committed
452

453
454
455
456
457
458
459
460
461
462
463
464
465
466
- **lang (language)**

  refers to the default language of the application.

  set the value to `de-de` if you would like to turn the viewer into "German" language by default.

  Defaults to `en-us`

- **language-switch**

  set this value to `false` if you don't want to switch the language. this setting hides the appropriate toggle.

  Defaults to `true`

467
468
469
470
471
472
- **notificationColors**

  sets the colors used in frontend to apply for icons in notification messages.

  `info` and `warning` are set to `blue-9` `red-9` respectively which can be changed according to the project requirements.

dindigala's avatar
dindigala committed
473
  There is a re-usable component called notification.vue (src/components/notification.vue) which receives the type of notification (ex: `info` or `warning`). Based on the type we send, this component searches for it and its respective icon which in turn gets displayed before the title message of Notifications.
474
475
476
477
478

  If we do not send any type, than there is no `icon` set to the notification message.

  **Note**: Can add additional types ex: `success`, `error`, `positive`, `negative`. Based on these we need to add them at the component level as well and their icons respectively.

479
- **rtl (right to left)**
nwindis's avatar
nwindis committed
480

Mathias Goebel's avatar
Mathias Goebel committed
481
    refers to the direction the text inside the text panel will be displayed.
nwindis's avatar
nwindis committed
482

Mathias Goebel's avatar
Mathias Goebel committed
483
    set the value to `true` if you want text to be displayed from right to left; e.g. Arabic.
schneider210's avatar
schneider210 committed
484

Mathias Goebel's avatar
Mathias Goebel committed
485
    Defaults to `false`
486
487

### Configure the Panels
schneider210's avatar
schneider210 committed
488

489
490
491
492
493
```json
"panels": [
  {
    "connector": [1],
    "panel_label": "Contents",
494
495
    "show": true,
    "toggle": true
496
497
498
499
  },
  {
    "connector": [3],
    "panel_label": "Image",
500
501
    "show": true,
    "toggle": true
502
503
504
505
  },
  {
    "connector": [4],
    "panel_label": "Text",
506
    "show": true,
Mathias Goebel's avatar
Mathias Goebel committed
507
    "toggle": true
508
509
510
511
  },
  {
    "connector": [2],
    "panel_label": "Metadata",
512
513
    "show": true,
    "toggle": true
514
515
  }
],
schneider210's avatar
schneider210 committed
516
517
518

```

519
The panel-array consists of four objects according to the maximum number of panels, that can be shown at once.
nwindis's avatar
nwindis committed
520

Mathias Goebel's avatar
Mathias Goebel committed
521
Each object inside that constant consists of similar keys: `connector`, `panel_label`, `show` and `toggle`.
nwindis's avatar
nwindis committed
522

523
#### The Panel Keys in Detail
nwindis's avatar
nwindis committed
524
525

- **connector**
dindigala's avatar
dindigala committed
526

527
  The numbers below reflect each component's (Text, Image, Meta, ...) id.
528

nwindis's avatar
nwindis committed
529
530
  - 1 = Treeview
  - 2 = Metadata
531
532
  - 3 = Image
  - 4 = Text
nwindis's avatar
nwindis committed
533
  - 5 = Annotations
534

535
536
537
  **Note**: These **IDs** are supposed to be **unique**, so please make sure not to repeat these!

  Example given:
538

539
540
  Assuming you want to combine the **Metadata**, **Text** and **Annotations** panels, the configuration could look like this:

Mathias Goebel's avatar
Mathias Goebel committed
541
  ```json
542
    {
Mathias Goebel's avatar
Mathias Goebel committed
543
544
545
546
      "connector": [2, 4, 5],
      "panel_label": "Meta, Text & Anno",
      "show": true,
      "toggle": true
547
548
    }
  ```
549

nwindis's avatar
nwindis committed
550
551
- **panel_label**

Mathias Goebel's avatar
Mathias Goebel committed
552
  refers to the heading in each panel's *toolbar*. To rename it, change the corresponding `label` according to your needs.
553
554

  **Note**: Please make sure to also change the name, if you are going to reorder the panels or turn them into tabs.
nwindis's avatar
nwindis committed
555
556
557
558
559

- **show**

  toggles (`show` or rather `hide`) the appropriate panel respectively

560
561
562
563
564
565
- **toggle**

  whether to show the related panel toggle or not

  Defaults to `true`.

nwindis's avatar
nwindis committed
566
**Note**:
567

Mathias Goebel's avatar
Mathias Goebel committed
568
## Viewer Architecture
569
570
571

![Viewer components](img/Viewer.png)

572
## Dockerfile
Nils Windisch's avatar
Nils Windisch committed
573

nwindis's avatar
nwindis committed
574
The dockerfile is used for GitLab CI.  
575
It needs to be updated when either `node` or `quasar-cli` should be updated.
Nils Windisch's avatar
Nils Windisch committed
576
577

```bash
nwindis's avatar
nwindis committed
578
579
docker build --pull -t docker.gitlab.gwdg.de/subugoe/emo/tido/node .
docker push docker.gitlab.gwdg.de/subugoe/emo/tido/node
580
```
581

582
## Connecting the Viewer to a Backend
583

nwindis's avatar
nwindis committed
584
The viewer expects JSON that complies to the [SUB's generic TextAPI](https://subugoe.pages.gwdg.de/emo/text-api/) in order to function properly.  
585
586
587
588
589
590
591
592
To establish a link to the backend, the viewer's entrypoint in `src/index.template.html` has to be modified:

```html
"entrypoint": "https://{server}{/prefix}/{collection}/collection.json"
```

The entrypoint should point to the collection you want to be displayed.

593
594
## Architecture

595
![Architecture diagram of TIDO](img/emo_architecture.png)
596

597
598
599
600
601
602
## Contributing

Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on our code of conduct, and the process for submitting pull requests to us.

## Versioning

nwindis's avatar
nwindis committed
603
We use [SemVer](https://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://gitlab.gwdg.de/subugoe/emo/tido/-/tags).
604
605
606

## Authors

nwindis's avatar
nwindis committed
607
See the list of [contributors](https://gitlab.gwdg.de/subugoe/emo/tido/-/graphs/develop) who participated in this project.