diff --git a/application/source/defaults.go b/application/source/defaults.go index 7642800e8281ebc10c89269c883f15af3217c3ec..02ae4cdd21ffac4348930539a3b189b69e881525 100644 --- a/application/source/defaults.go +++ b/application/source/defaults.go @@ -10,6 +10,10 @@ const exitCodeCatchAll = 1 const defaultOverviewTemplate = ` +--- +block-headings: true +--- + {{ if .HasChangelog }} ## Changelog @@ -103,7 +107,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -184,21 +188,20 @@ Privacy: {{ end }} - {{ if .Privacy }} #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** - -{{ .Description }} +{{ if .Purposes }}**{{ .Purposes }}** {{ end }}**({{ .ID }})** -| | | -|--|--| -| Category | {{ .Category }} | +{{ if .Description }} {{ .Description }} +{{ end }} +| | | +|-----------------------|----------------------------| +| Category | {{ .Category }} | | Data Retention Period | {{ .DataRetentionPeriod }} | -| Legal Basis | {{ .LegalBasis }} | -| Transfers | {{ .Transfers }} | +| Legal Basis | {{ .LegalBasis }} | +| Transfers | {{ .Transfers }} | {{ end }} {{ end }} diff --git a/application/source/util.go b/application/source/util.go index 4d067ea4cd21b035df3b550ab3b2ac75c616be36..7bbfac902748e94b8cd06f3b8191bc82bf8b380d 100644 --- a/application/source/util.go +++ b/application/source/util.go @@ -40,12 +40,23 @@ func splitYamlParts(content []byte) (error, contentRequirement) { text += before - a, b, found := strings.Cut(remaining, "...") + a, b, found := strings.Cut(remaining, "\n...") if !found { - a, b, found = strings.Cut(remaining, "---") + a, b, found = strings.Cut(remaining, "\n---") if !found { - return errors.New("the file does not contain a definition block"), contentRequirement{} + + a, b, found = strings.Cut(remaining, "...") + + if !found { + + a, b, found = strings.Cut(remaining, "---") + + if !found { + return errors.New("the file does not contain a definition block"), contentRequirement{} + } + + } } } @@ -65,10 +76,32 @@ func splitYamlParts(content []byte) (error, contentRequirement) { return err, contentRequirement{} } + tempItem := []Item{} for i, _ := range data.Items { + + if data.Items[i].ID == "" { + continue + } + data.Items[i].ID = data.ID + "-" + data.Items[i].ID + tempItem = append(tempItem, data.Items[i]) + } + + data.Items = tempItem + + p := []Privacy{} + for i, _ := range data.Privacy { + if data.Privacy[i].ID == "" { + continue + } + + data.Privacy[i].ID = data.ID + "-" + data.Privacy[i].ID + p = append(p, data.Privacy[i]) + } + data.Privacy = p + req := contentRequirement{} req.data = data diff --git a/development/examples/example1/req1/1/test1.md b/development/examples/example1/req1/1/test1.md index 294156a55f608d5a003dda927e756b55068ac23a..a0356a553994fca3d0b25eb508024952f042f833 100644 --- a/development/examples/example1/req1/1/test1.md +++ b/development/examples/example1/req1/1/test1.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -117,6 +117,7 @@ Privacy: ... + ### {{ .Title }} - {{ .ID }} #### Subheading @@ -130,33 +131,46 @@ Privacy: | ID | Name | Delivery until | Provided on | |--------------------|--------------|----------------------:|-----------------------------------------:| -{{ range .Items - }}| {{ .ID }} | {{ .Name }} | {{ .DeliveryUntil.Format "02.Jan" }} | {{ .ProvidedOn.Format "02.Jan" }} | +{{ range .Items +}}| {{ .ID }} | {{ .Name }} | {{ .DeliveryUntil.Format "02.Jan" }} | {{ .ProvidedOn.Format "02.Jan" }} | {{ end }} {{ end }} - {{ if .Privacy }} #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** - -{{ .Description }} +{{ if .Purposes }}**{{ .Purposes }}** {{ end }}**({{ .ID }})** -| | | -|--|--| -| Category | {{ .Category }} | +{{ if .Description }} {{ .Description }} +{{ end }} +| | | +|-----------------------|----------------------------| +| Category | {{ .Category }} | | Data Retention Period | {{ .DataRetentionPeriod }} | -| Legal Basis | {{ .LegalBasis }} | -| Transfers | {{ .Transfers }} | +| Legal Basis | {{ .LegalBasis }} | +| Transfers | {{ .Transfers }} | {{ end }} {{ end }} +## Level 2 + +test + +### Level 3 + +test + +#### Level 4 + +test + +##### Level 5 +test diff --git a/development/examples/example1/req1/1/test2.md b/development/examples/example1/req1/1/test2.md index 3b40198dff81eea31b7aaae1bcd96220629ca596..3e1bcd0b480d913e7b9d83091dc9b98ef55a7665 100644 --- a/development/examples/example1/req1/1/test2.md +++ b/development/examples/example1/req1/1/test2.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/1/test3.md b/development/examples/example1/req1/1/test3.md index 5cf0860638774acd00b1d353334e77cb79deea29..e591c572180f49b3efd9d7cc6ada6e24ab2296ea 100644 --- a/development/examples/example1/req1/1/test3.md +++ b/development/examples/example1/req1/1/test3.md @@ -53,9 +53,9 @@ Last Update: null # the individual items as a list Items: - - ID: null + - ID: XXX Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/1/test4.md b/development/examples/example1/req1/1/test4.md index d206d5aecaf4ae17888b64620cbb1ea0ad6fcd85..366200b67ffe6dbb0761a651de1ec77ed02d0888 100644 --- a/development/examples/example1/req1/1/test4.md +++ b/development/examples/example1/req1/1/test4.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/2/test1.md b/development/examples/example1/req1/2/test1.md index a0a38f687dd1ace0220220e7aa63bd1cfa9e48ef..94fd88afcfb49ba500cd6463e768e87a32994bfa 100644 --- a/development/examples/example1/req1/2/test1.md +++ b/development/examples/example1/req1/2/test1.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/2/test2.md b/development/examples/example1/req1/2/test2.md index bc5ae9494404884a9888a8f2c81b6f63431a0bf8..8818faa60c478e4d4cea5753d2fb2f777e1b0f66 100644 --- a/development/examples/example1/req1/2/test2.md +++ b/development/examples/example1/req1/2/test2.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/2/test3.md b/development/examples/example1/req1/2/test3.md index 5daaf15aee13b77b53f93e3c6f6abd588c176f5d..029be2d3ccefd2e99a50207b23947e924e8ad556 100644 --- a/development/examples/example1/req1/2/test3.md +++ b/development/examples/example1/req1/2/test3.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/2/test4.md b/development/examples/example1/req1/2/test4.md index 5f04a179d64eb7cd83cef9619b76c2e25c003165..d8f78479f9956fbbdd2bca31137b9c48992baaae 100644 --- a/development/examples/example1/req1/2/test4.md +++ b/development/examples/example1/req1/2/test4.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/2/test5.md b/development/examples/example1/req1/2/test5.md index 52152251880d040e0c7e06b75ba131b69f46917c..96505e049cce4f3dcc0fce014812835d15cbb9a7 100644 --- a/development/examples/example1/req1/2/test5.md +++ b/development/examples/example1/req1/2/test5.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/2/test6.md b/development/examples/example1/req1/2/test6.md index 56222a8bd331e8dfe5c9adf256a6868b495a7fbe..c85e98190c458d9d78ccb60cea625a6db58b30ac 100644 --- a/development/examples/example1/req1/2/test6.md +++ b/development/examples/example1/req1/2/test6.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/3/test1.md b/development/examples/example1/req1/3/test1.md index d55bd996df78c879ad40d14f1ccb4bdb99c31db7..220bccb519dff6299e71e2f6c3ed362fd170deaa 100644 --- a/development/examples/example1/req1/3/test1.md +++ b/development/examples/example1/req1/3/test1.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/3/test2.md b/development/examples/example1/req1/3/test2.md index 94766fea47525a2a3cb5262653a267e71a1d5ad8..d710863a1c9860180fd3203363170915c41acb85 100644 --- a/development/examples/example1/req1/3/test2.md +++ b/development/examples/example1/req1/3/test2.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/3/test3.md b/development/examples/example1/req1/3/test3.md index efdc5398c4d9679fcb5a789c5fa16205b52f63a1..b9b168eaebf9c639b89eb6afb3c54a2b0db36752 100644 --- a/development/examples/example1/req1/3/test3.md +++ b/development/examples/example1/req1/3/test3.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/3/test4.md b/development/examples/example1/req1/3/test4.md index 2e22e63039072e21fe9348da91c84ed63f03d230..caa64b43baf6f80c892b2a3696cb784594a1f077 100644 --- a/development/examples/example1/req1/3/test4.md +++ b/development/examples/example1/req1/3/test4.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/3/test5.md b/development/examples/example1/req1/3/test5.md index 3e49e985deceae4d32bdd026cb872b2f66b1d6c4..03987e6fc98e3c863ee4b50aedffc7b62cc3501d 100644 --- a/development/examples/example1/req1/3/test5.md +++ b/development/examples/example1/req1/3/test5.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/3/test6.md b/development/examples/example1/req1/3/test6.md index 7e1af1d2df12b97855ef576ff234d6ad24db55f7..272adc751ef2a56ad88af5b1eea86b37c27e872a 100644 --- a/development/examples/example1/req1/3/test6.md +++ b/development/examples/example1/req1/3/test6.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/3/test7.md b/development/examples/example1/req1/3/test7.md index 765583a711778d40488acd7df476511591fb2906..e818028e10508c50fb466846935c99ce1fab1906 100644 --- a/development/examples/example1/req1/3/test7.md +++ b/development/examples/example1/req1/3/test7.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/4/test1.md b/development/examples/example1/req1/4/test1.md index ac1cabb3f33fadc81c923a12f3b81875fda58539..ef0e376529c5b2831382170a5832aea47651f0b8 100644 --- a/development/examples/example1/req1/4/test1.md +++ b/development/examples/example1/req1/4/test1.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/4/test2.md b/development/examples/example1/req1/4/test2.md index 209372df7cd6e47817b2a0936cb23839248d472d..d5a9cf935e3120595bf66a24f128cc1dc052e420 100644 --- a/development/examples/example1/req1/4/test2.md +++ b/development/examples/example1/req1/4/test2.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/4/test3.md b/development/examples/example1/req1/4/test3.md index 5151ddee6a3e2d436beda503da57df1a5e9678e0..75097d0836c45c1f25cb36ed4828a6a31f68e746 100644 --- a/development/examples/example1/req1/4/test3.md +++ b/development/examples/example1/req1/4/test3.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/4/test4.md b/development/examples/example1/req1/4/test4.md index 11045bb61fc3a523e36129a6ab76f1a015991758..291745b7dbfd3dde6add3e014b22202bd08ebb2d 100644 --- a/development/examples/example1/req1/4/test4.md +++ b/development/examples/example1/req1/4/test4.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/5/test1.md b/development/examples/example1/req1/5/test1.md index 3dc845fa2c6050970bfec1743a2078d29c240e1b..0001465a963464a8d16d3c96c9d1b671a234a3c1 100644 --- a/development/examples/example1/req1/5/test1.md +++ b/development/examples/example1/req1/5/test1.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/5/test2.md b/development/examples/example1/req1/5/test2.md index c31f84c5a99b8c73543d1984afd581f3a941c576..31abd4a13ae092ab4da01a1bc503bc2076f98622 100644 --- a/development/examples/example1/req1/5/test2.md +++ b/development/examples/example1/req1/5/test2.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/6/test1.md b/development/examples/example1/req1/6/test1.md index 1c24095f1abf0c6d015b214886158f97abbed0b4..db80588d9bfb2249a5d550dd96569dac34ebfc11 100644 --- a/development/examples/example1/req1/6/test1.md +++ b/development/examples/example1/req1/6/test1.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }} diff --git a/development/examples/example1/req1/6/test2.md b/development/examples/example1/req1/6/test2.md index 071b74c03ed0d6b32dc7d505d5e48dcb236ee258..23e82ffd43604b38c0d853361850e3126f13ff92 100644 --- a/development/examples/example1/req1/6/test2.md +++ b/development/examples/example1/req1/6/test2.md @@ -55,7 +55,7 @@ Last Update: null Items: - ID: null Name: null - # what is it, a image, font, legal information, access data, texts, decisions, ... + # what is it, a image, font, legal information, access data, texts, decisions, etc. Type: null # does this belong to a group Group: null @@ -141,7 +141,7 @@ Privacy: #### Privacy {{ range .Privacy }} -**{{ .Purpose }} ({{ .ID }})** +**{{ .Purposes }} ({{ .ID }})** {{ .Description }}