From 26c336eb6ddd6819cec4e6b389a4e0d206a1f8cf Mon Sep 17 00:00:00 2001 From: George Cushen Date: Wed, 27 May 2026 03:29:52 +0100 Subject: [PATCH] feat(publications): improve structure + awards/funding/license metadata Restructure `publication` frontmatter from a flat Markdown string into a structured object (name, short_name, volume, issue, pages, publisher), resolved through a new `functions/resolve_publication.html` partial that also emits a per-page warning pointing legacy sites at `hugoblox migrate publications`. APA/MLA citation rendering and the publication metadata row both consume the resolver - no parsing of conventional Markdown strings at render time. Add work-level metadata fields surfaced via a new reusable `components/award_badge.html` partial (variants: pill, card-corner, inline, row; level-driven icon + colour tokens; pagefind filter): - `awards[]` - name, level (winner/runner_up/honorable_mention/nominee/ selected/featured), issuer, date, note, url; skim-row pills above the featured image, full row in the metadata grid, corner badges on card and slides-gallery views, inline marker on citation views, pill on date-title-summary - `funding[]` - funder + grant + url, rendered as a metadata grid row - `license` - SPDX-friendly string, metadata grid row - `peer_reviewed`, `open_access` - status pills, decoupled from the publication block so preprints can surface them Demo content updated in academic-cv (and the same shape in research-lab). --- modules/blox/i18n/en.yaml | 33 ++++ .../_partials/components/award_badge.html | 169 ++++++++++++++++++ .../functions/resolve_publication.html | 97 ++++++++++ .../blox/layouts/_partials/views/card.html | 19 +- .../layouts/_partials/views/citation.html | 19 +- .../_partials/views/date-title-summary.html | 5 + .../_partials/views/slides-gallery.html | 5 + modules/blox/layouts/single.html | 52 +++++- templates/academic-cv/content/_index.md | 2 +- .../publications/conference-paper/index.md | 26 ++- .../publications/journal-article/index.md | 26 ++- .../content/publications/preprint/index.md | 13 +- 12 files changed, 439 insertions(+), 27 deletions(-) create mode 100644 modules/blox/layouts/_partials/components/award_badge.html create mode 100644 modules/blox/layouts/_partials/functions/resolve_publication.html diff --git a/modules/blox/i18n/en.yaml b/modules/blox/i18n/en.yaml index 353b573a..c2ed1795 100644 --- a/modules/blox/i18n/en.yaml +++ b/modules/blox/i18n/en.yaml @@ -318,6 +318,39 @@ - id: publication_type translation: Type +- id: awards + translation: Awards + +- id: funding + translation: Funding + +- id: license + translation: License + +- id: peer_reviewed + translation: Peer-reviewed + +- id: open_access + translation: Open access + +- id: award_level_winner + translation: Winner + +- id: award_level_runner_up + translation: Runner-up + +- id: award_level_honorable_mention + translation: Honorable mention + +- id: award_level_nominee + translation: Nominee + +- id: award_level_selected + translation: Selected + +- id: award_level_featured + translation: Featured + - id: date translation: Date diff --git a/modules/blox/layouts/_partials/components/award_badge.html b/modules/blox/layouts/_partials/components/award_badge.html new file mode 100644 index 00000000..38f68c15 --- /dev/null +++ b/modules/blox/layouts/_partials/components/award_badge.html @@ -0,0 +1,169 @@ +{{/* + Award badge — single source of truth for rendering an award entry. + + Args (dict): + award Award entry (dict with name, level, issuer, date, note, url). + Bare-string entries are coerced to {name: }. + page Owning page (used to fall back issuer to publication, date to page date). + variant Visual style — one of: + "pill" horizontal pill (default; used in skim rows) + "card-corner" absolute-positioned corner pill (for card/grid views) + "row" full row with name + note (for metadata grid) + "inline" compact inline marker for citations + + Falls back gracefully when fields are missing. +*/}} +{{- $award := .award -}} +{{- $page := .page -}} +{{- $variant := .variant | default "pill" -}} + +{{/* Coerce bare-string entries to {name: ...} */}} +{{- if not (reflect.IsMap $award) -}} + {{- $award = dict "name" $award -}} +{{- end -}} + +{{- $name := $award.name | default "" -}} +{{- $level := $award.level | default "winner" -}} +{{- $note := $award.note | default "" -}} +{{- $url := $award.url | default "" -}} + +{{/* Issuer fallback: explicit → publication short_name → publication name → empty */}} +{{- $issuer := $award.issuer | default "" -}} +{{- if not $issuer -}} + {{- with $page -}} + {{- $pub := partial "functions/resolve_publication.html" . -}} + {{- $issuer = $pub.short_name | default $pub.name | default "" -}} + {{- end -}} +{{- end -}} + +{{/* Date fallback: explicit → page date year */}} +{{- $date := $award.date | default "" -}} +{{- if not $date -}} + {{- with $page -}} + {{- with .Date -}}{{- $date = .Format "2006" -}}{{- end -}} + {{- end -}} +{{- end -}} + +{{/* Icon + colour token per level */}} +{{- $icon := "trophy" -}} +{{- $tone := "amber" -}} +{{- if eq $level "winner" -}}{{- $icon = "trophy" -}}{{- $tone = "amber" -}} +{{- else if eq $level "runner_up" -}}{{- $icon = "medal" -}}{{- $tone = "slate" -}} +{{- else if eq $level "honorable_mention" -}}{{- $icon = "ribbon" -}}{{- $tone = "rose" -}} +{{- else if eq $level "nominee" -}}{{- $icon = "star" -}}{{- $tone = "sky" -}} +{{- else if eq $level "selected" -}}{{- $icon = "sparkles" -}}{{- $tone = "violet" -}} +{{- else if eq $level "featured" -}}{{- $icon = "bookmark-star" -}}{{- $tone = "emerald" -}} +{{- end -}} + +{{/* Tailwind class shards keyed by tone (full classes for the extractor) */}} +{{- $bg := "" -}}{{- $text := "" -}}{{- $ring := "" -}} +{{- if eq $tone "amber" -}} + {{- $bg = "bg-amber-100 dark:bg-amber-900/40" -}} + {{- $text = "text-amber-900 dark:text-amber-200" -}} + {{- $ring = "ring-amber-500/30 dark:ring-amber-400/30" -}} +{{- else if eq $tone "slate" -}} + {{- $bg = "bg-slate-100 dark:bg-slate-800/60" -}} + {{- $text = "text-slate-900 dark:text-slate-200" -}} + {{- $ring = "ring-slate-500/30 dark:ring-slate-400/30" -}} +{{- else if eq $tone "rose" -}} + {{- $bg = "bg-rose-100 dark:bg-rose-900/40" -}} + {{- $text = "text-rose-900 dark:text-rose-200" -}} + {{- $ring = "ring-rose-500/30 dark:ring-rose-400/30" -}} +{{- else if eq $tone "sky" -}} + {{- $bg = "bg-sky-100 dark:bg-sky-900/40" -}} + {{- $text = "text-sky-900 dark:text-sky-200" -}} + {{- $ring = "ring-sky-500/30 dark:ring-sky-400/30" -}} +{{- else if eq $tone "violet" -}} + {{- $bg = "bg-violet-100 dark:bg-violet-900/40" -}} + {{- $text = "text-violet-900 dark:text-violet-200" -}} + {{- $ring = "ring-violet-500/30 dark:ring-violet-400/30" -}} +{{- else if eq $tone "emerald" -}} + {{- $bg = "bg-emerald-100 dark:bg-emerald-900/40" -}} + {{- $text = "text-emerald-900 dark:text-emerald-200" -}} + {{- $ring = "ring-emerald-500/30 dark:ring-emerald-400/30" -}} +{{- end -}} + +{{/* Inline SVG icons (small, self-contained — no dependency on external icon system at render time) */}} +{{- $svg := "" -}} +{{- if eq $icon "trophy" -}} + {{- $svg = `` -}} +{{- else if eq $icon "medal" -}} + {{- $svg = `` -}} +{{- else if eq $icon "ribbon" -}} + {{- $svg = `` -}} +{{- else if eq $icon "star" -}} + {{- $svg = `` -}} +{{- else if eq $icon "sparkles" -}} + {{- $svg = `` -}} +{{- else if eq $icon "bookmark-star" -}} + {{- $svg = `` -}} +{{- end -}} + +{{/* Build subtitle: "Issuer · Year" or just whichever is present */}} +{{- $subtitle := "" -}} +{{- if and $issuer $date -}} + {{- $subtitle = printf "%s · %s" $issuer $date -}} +{{- else if $issuer -}} + {{- $subtitle = $issuer -}} +{{- else if $date -}} + {{- $subtitle = $date -}} +{{- end -}} + +{{- $tooltip := $name -}} +{{- with $subtitle -}}{{- $tooltip = printf "%s — %s" $name . -}}{{- end -}} + +{{- if $name -}} + {{- if eq $variant "pill" -}} + {{- if $url -}} + + {{ $svg | safeHTML }} + {{ $name }} + {{- with $subtitle }}{{ end -}} + + {{- else -}} + + {{ $svg | safeHTML }} + {{ $name }} + {{- with $subtitle }}{{ end -}} + + {{- end -}} + {{- else if eq $variant "card-corner" -}} + {{- if $url -}} + + {{ $svg | safeHTML }} + {{ $name }} + + {{- else -}} + + {{ $svg | safeHTML }} + {{ $name }} + + {{- end -}} + {{- else if eq $variant "inline" -}} + {{- if $url -}} + + {{ $svg | safeHTML }} + {{ $name }} + + {{- else -}} + + {{ $svg | safeHTML }} + {{ $name }} + + {{- end -}} + {{- else if eq $variant "row" -}} +
+ + {{ $svg | safeHTML }} + +
+
+ {{- if $url -}}{{ $name }} + {{- else -}}{{ $name }}{{- end -}} +
+ {{- with $subtitle -}}
{{ . }}
{{- end -}} + {{- with $note -}}
{{ . | markdownify }}
{{- end -}} +
+
+ {{- end -}} +{{- end -}} diff --git a/modules/blox/layouts/_partials/functions/resolve_publication.html b/modules/blox/layouts/_partials/functions/resolve_publication.html new file mode 100644 index 00000000..ea93226f --- /dev/null +++ b/modules/blox/layouts/_partials/functions/resolve_publication.html @@ -0,0 +1,97 @@ +{{/* + Resolve publication metadata from page params. + + Supports the structured shape and warns on the legacy flat shape: + Structured: publication: { name, short_name, volume, issue, pages, publisher } + Legacy: publication: "*Journal Name*, 12(3)" + publication_short: "*JN*" + + Legacy pages emit a per-page suppressible warning pointing users to the + `hugoblox migrate publications` CLI command. + + Args: + A page context (`.`) + + Returns dict: + name Full publication name (empty for legacy) + short_name Abbreviated name + volume Volume number as string + issue Issue number as string + pages Page range + publisher Publisher name + display Markdown-ready display string, e.g. "*Name*, 12(3), 100-120" + display_short Markdown-ready compact form (uses short_name when set) + is_legacy true if the page used the legacy flat string shape + is_empty true if no publication info is set +*/}} +{{- $page := . -}} +{{- $raw := $page.Params.publication -}} +{{- $legacy_short := $page.Params.publication_short -}} + +{{- $name := "" -}} +{{- $short_name := "" -}} +{{- $volume := "" -}} +{{- $issue := "" -}} +{{- $pages := "" -}} +{{- $publisher := "" -}} +{{- $is_legacy := false -}} +{{- $is_empty := false -}} + +{{- if reflect.IsMap $raw -}} + {{- $name = $raw.name | default "" -}} + {{- $short_name = $raw.short_name | default "" -}} + {{- with $raw.volume -}}{{- $volume = printf "%v" . -}}{{- end -}} + {{- with $raw.issue -}}{{- $issue = printf "%v" . -}}{{- end -}} + {{- $pages = $raw.pages | default "" -}} + {{- $publisher = $raw.publisher | default "" -}} +{{- else if $raw -}} + {{- $is_legacy = true -}} + {{- $name = $raw -}} + {{- $short_name = $legacy_short | default "" -}} + {{- partial "functions/logger.html" (dict + "page" $page + "level" "warn" + "id" (printf "pub-legacy-%s" $page.RelPermalink) + "message" (printf "%s uses the legacy flat `publication` string. Migrate to the structured shape `publication: {name, short_name, volume, issue, pages, publisher}` by running: hugoblox migrate publications" $page.RelPermalink) + ) -}} +{{- else -}} + {{- $is_empty = true -}} +{{- end -}} + +{{- $display := "" -}} +{{- $display_short := "" -}} + +{{- if $is_legacy -}} + {{- $display = $name -}} + {{- $display_short = $short_name | default $name -}} +{{- else if not $is_empty -}} + {{- $core := "" -}} + {{- with $name -}}{{- $core = printf "*%s*" . -}}{{- end -}} + {{- with $volume -}}{{- $core = printf "%s, %s" $core . -}}{{- end -}} + {{- with $issue -}}{{- $core = printf "%s(%s)" $core . -}}{{- end -}} + {{- with $pages -}}{{- $core = printf "%s, %s" $core . -}}{{- end -}} + {{- $display = $core -}} + + {{- $short_core := "" -}} + {{- if $short_name -}} + {{- $short_core = printf "*%s*" $short_name -}} + {{- else if $name -}} + {{- $short_core = printf "*%s*" $name -}} + {{- end -}} + {{- with $volume -}}{{- $short_core = printf "%s, %s" $short_core . -}}{{- end -}} + {{- with $issue -}}{{- $short_core = printf "%s(%s)" $short_core . -}}{{- end -}} + {{- with $pages -}}{{- $short_core = printf "%s, %s" $short_core . -}}{{- end -}} + {{- $display_short = $short_core -}} +{{- end -}} + +{{- return (dict + "name" $name + "short_name" $short_name + "volume" $volume + "issue" $issue + "pages" $pages + "publisher" $publisher + "display" $display + "display_short" $display_short + "is_legacy" $is_legacy + "is_empty" $is_empty +) -}} diff --git a/modules/blox/layouts/_partials/views/card.html b/modules/blox/layouts/_partials/views/card.html index 1e2c7871..2f963c3d 100644 --- a/modules/blox/layouts/_partials/views/card.html +++ b/modules/blox/layouts/_partials/views/card.html @@ -25,12 +25,19 @@
- {{ with $item.Params.content_meta }} - {{ if .trending }} -
- {{ i18n "trending" | default "Trending" }} - -
+ {{/* Award badge takes priority over trending — awards are higher-signal */}} + {{ $top_award := "" }} + {{ with $item.Params.awards }}{{ $top_award = index . 0 }}{{ end }} + {{ with $top_award }} + {{ partial "components/award_badge.html" (dict "award" . "page" $item "variant" "card-corner") }} + {{ else }} + {{ with $item.Params.content_meta }} + {{ if .trending }} +
+ {{ i18n "trending" | default "Trending" }} + +
+ {{ end }} {{ end }} {{ end }} {{ with $resource }} diff --git a/modules/blox/layouts/_partials/views/citation.html b/modules/blox/layouts/_partials/views/citation.html index c0c5eaef..69745574 100644 --- a/modules/blox/layouts/_partials/views/citation.html +++ b/modules/blox/layouts/_partials/views/citation.html @@ -2,6 +2,9 @@ {{ $year_value := $item.Params.event_start | default $item.Date }} {{ $year := (time $year_value).Format "2006" }} {{ $has_attachments := partial "functions/has_attachments" $item }} +{{ $pub := partial "functions/resolve_publication.html" $item }} +{{ $top_award := "" }} +{{ with $item.Params.awards }}{{ $top_award = index . 0 }}{{ end }}
@@ -14,10 +17,9 @@ ({{- $year -}}). {{ $item.Title }}. - {{ if $item.Params.publication_short }} - {{- $item.Params.publication_short | markdownify -}}. - {{ else if $item.Params.publication }} - {{- $item.Params.publication | markdownify -}}. + {{ with $pub.display_short }}{{- . | markdownify -}}.{{ end }} + {{ with $top_award }} + {{ partial "components/award_badge.html" (dict "award" . "page" $item "variant" "inline") }} {{ end }} {{ if $has_attachments }} @@ -33,12 +35,11 @@ {{ partial "page_metadata_authors" $item }}. {{ $item.Title }}. - {{ if $item.Params.publication_short }} - {{- $item.Params.publication_short | markdownify -}}, - {{ else if $item.Params.publication }} - {{- $item.Params.publication | markdownify -}}, - {{ end }} + {{ with $pub.display_short }}{{- . | markdownify -}},{{ end }} {{- $year -}}. + {{ with $top_award }} + {{ partial "components/award_badge.html" (dict "award" . "page" $item "variant" "inline") }} + {{ end }} {{ if $has_attachments }}
diff --git a/modules/blox/layouts/_partials/views/date-title-summary.html b/modules/blox/layouts/_partials/views/date-title-summary.html index 8023868b..bd4bd1d3 100644 --- a/modules/blox/layouts/_partials/views/date-title-summary.html +++ b/modules/blox/layouts/_partials/views/date-title-summary.html @@ -11,6 +11,11 @@ {{$item.Title}} + {{ with $item.Params.awards }} +
+ {{ partial "components/award_badge.html" (dict "award" (index . 0) "page" $item "variant" "pill") }} +
+ {{ end }}
{{ end }} + {{/* Top award (top-right corner) */}} + {{ with $item.Params.awards }} + {{ partial "components/award_badge.html" (dict "award" (index . 0) "page" $item "variant" "card-corner") }} + {{ end }} + {{/* Slide Preview Image - 16:9 aspect ratio */}} {{ with $resource }} diff --git a/modules/blox/layouts/single.html b/modules/blox/layouts/single.html index c7d9b787..35de9744 100644 --- a/modules/blox/layouts/single.html +++ b/modules/blox/layouts/single.html @@ -142,6 +142,15 @@
{{ partial "page_links_div.html" . }}
+ + {{/* Awards skim row — visible badges above any featured image */}} + {{ with .Params.awards }} +
+ {{ range . }} + {{ partial "components/award_badge.html" (dict "award" . "page" $ "variant" "pill") }} + {{ end }} +
+ {{ end }}
@@ -227,6 +236,7 @@ {{end}} {{/* EVENT / PUBLICATION METADATA */}} + {{ $pub := partial "functions/resolve_publication.html" . }} {{ if .Params.abstract | or (eq .Type "publications") | or (eq .Type "events") }}
@@ -247,9 +257,47 @@
{{ end }} - {{ if .Params.publication }} + {{ if not $pub.is_empty }}
{{ i18n "publication" }}
-
{{ .Params.publication | markdownify }}
+
{{ $pub.display | markdownify }}{{ with $pub.publisher }}. {{ . | markdownify }}{{ end }}
+ {{ end }} + + {{/* Work-level flags — independent of whether a venue is set, so preprints can still surface OA/peer-review status. */}} + {{ $flags := slice }} + {{ if eq .Params.peer_reviewed true }}{{ $flags = $flags | append (i18n "peer_reviewed") }}{{ end }} + {{ if eq .Params.open_access true }}{{ $flags = $flags | append (i18n "open_access") }}{{ end }} + {{ with $flags }} +
{{ i18n "status" | default "Status" }}
+
+ {{ range . }} + {{ . }} + {{ end }} +
+ {{ end }} + + {{ with .Params.awards }} +
{{ i18n "awards" }}
+
+ {{ range . }} + {{ partial "components/award_badge.html" (dict "award" . "page" $ "variant" "row") }} + {{ end }} +
+ {{ end }} + + {{ with .Params.funding }} +
{{ i18n "funding" }}
+
+ {{ range . }} +
+ {{ if .url }}{{ .funder }}{{ else }}{{ .funder }}{{ end }}{{ with .grant }} ({{ . }}){{ end }} +
+ {{ end }} +
+ {{ end }} + + {{ with .Params.license }} +
{{ i18n "license" }}
+
{{ . }}
{{ end }} {{ if eq .Type "events" }} diff --git a/templates/academic-cv/content/_index.md b/templates/academic-cv/content/_index.md index 73ab8342..7ad7178d 100644 --- a/templates/academic-cv/content/_index.md +++ b/templates/academic-cv/content/_index.md @@ -122,6 +122,6 @@ sections: design: card: # Card background color (CSS class) - css_class: 'bg-primary-300 dark:bg-primary-700' + css_class: 'bg-gradient-to-br from-primary-500 via-primary-600 to-secondary-600 text-white shadow-2xl' css_style: '' --- diff --git a/templates/academic-cv/content/publications/conference-paper/index.md b/templates/academic-cv/content/publications/conference-paper/index.md index 1f25941e..d179799a 100644 --- a/templates/academic-cv/content/publications/conference-paper/index.md +++ b/templates/academic-cv/content/publications/conference-paper/index.md @@ -23,9 +23,29 @@ publishDate: '2017-01-01T00:00:00Z' # Enter a publication type from the CSL standard. publication_types: ['paper-conference'] -# Publication name and optional abbreviated publication name. -publication: In *HugoBlox Kit Conference* -publication_short: In *ICW* +# Publication metadata — structured fields used by citation styles and BibTeX export. +publication: + name: "Proceedings of the HugoBlox Kit Conference" + short_name: "ICW" + +peer_reviewed: true +open_access: true +license: CC-BY-4.0 + +# Awards, honors, and recognitions. Surfaced as badges on the page and in listings. +awards: + - name: "Best Paper Award" + level: winner + note: "Top 5 of 8000 submissions" + - name: "Oral Presentation" + level: selected + +# Funders and grants. Required by many funders for compliance reporting. +funding: + - funder: "National Science Foundation" + grant: "NSF-2401234" + - funder: "European Research Council" + grant: "ERC-StG-101234" abstract: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis posuere tellus ac convallis placerat. Proin tincidunt magna sed ex sollicitudin condimentum. Sed ac faucibus dolor, scelerisque sollicitudin nisi. Cras purus urna, suscipit quis sapien eu, pulvinar tempor diam. Quisque risus orci, mollis id ante sit amet, gravida egestas nisl. Sed ac tempus magna. Proin in dui enim. Donec condimentum, sem id dapibus fringilla, tellus enim condimentum arcu, nec volutpat est felis vel metus. Vestibulum sit amet erat at nulla eleifend gravida. diff --git a/templates/academic-cv/content/publications/journal-article/index.md b/templates/academic-cv/content/publications/journal-article/index.md index ffdcb7ce..29efae20 100644 --- a/templates/academic-cv/content/publications/journal-article/index.md +++ b/templates/academic-cv/content/publications/journal-article/index.md @@ -16,9 +16,29 @@ publishDate: "2017-01-01T00:00:00Z" # Enter a publication type from the CSL standard. publication_types: ["article-journal"] -# Publication name and optional abbreviated publication name. -publication: "*Journal of Source Themes, 1*(1)" -publication_short: "" +# Publication metadata — structured fields used by citation styles and BibTeX export. +publication: + name: "Journal of Source Themes" + volume: 1 + issue: 1 + +peer_reviewed: true +open_access: true +license: CC-BY-4.0 + +# Awards, honors, and recognitions. Surfaced as badges on the page and in listings. +# Note: a Test of Time award years after publication uses an explicit `date` that differs from the page date. +awards: + - name: "Test of Time Award" + level: winner + date: "2025" + note: "Awarded for sustained impact 10 years after publication." + - name: "Editor's Choice" + level: featured + +funding: + - funder: "National Science Foundation" + grant: "NSF-1234567" abstract: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis posuere tellus ac convallis placerat. Proin tincidunt magna sed ex sollicitudin condimentum. Sed ac faucibus dolor, scelerisque sollicitudin nisi. Cras purus urna, suscipit quis sapien eu, pulvinar tempor diam. Quisque risus orci, mollis id ante sit amet, gravida egestas nisl. Sed ac tempus magna. Proin in dui enim. Donec condimentum, sem id dapibus fringilla, tellus enim condimentum arcu, nec volutpat est felis vel metus. Vestibulum sit amet erat at nulla eleifend gravida. diff --git a/templates/academic-cv/content/publications/preprint/index.md b/templates/academic-cv/content/publications/preprint/index.md index d0770bd9..8d56d39f 100644 --- a/templates/academic-cv/content/publications/preprint/index.md +++ b/templates/academic-cv/content/publications/preprint/index.md @@ -12,9 +12,16 @@ publishDate: "2017-01-01T00:00:00Z" # Enter a publication type from the CSL standard. publication_types: ["article"] -# Publication name and optional abbreviated publication name. -publication: "" -publication_short: "" +# Publication metadata — structured fields used by citation styles and BibTeX export. +# Preprints typically have no formal venue; omit `publication` until the work is accepted. + +peer_reviewed: false +open_access: true +license: CC-BY-4.0 + +funding: + - funder: "Wellcome Trust" + grant: "WT-219123/Z/19/Z" abstract: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis posuere tellus ac convallis placerat. Proin tincidunt magna sed ex sollicitudin condimentum. Sed ac faucibus dolor, scelerisque sollicitudin nisi. Cras purus urna, suscipit quis sapien eu, pulvinar tempor diam. Quisque risus orci, mollis id ante sit amet, gravida egestas nisl. Sed ac tempus magna. Proin in dui enim. Donec condimentum, sem id dapibus fringilla, tellus enim condimentum arcu, nec volutpat est felis vel metus. Vestibulum sit amet erat at nulla eleifend gravida.