1<#assign
2journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")
3assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")
4categoryPropertyService = serviceLocator.findService("com.liferay.asset.category.property.service.AssetCategoryPropertyLocalService")
5vocabularyService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService")
6
7journalArticle = journalArticleLocalService.getArticle(getterUtil.getLong(groupId), getterUtil.getString(.vars['reserved-article-id'].data))
8assetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", journalArticle.getResourcePrimKey())
9magazinVocabulary = vocabularyService.fetchGroupVocabulary(themeDisplay.getCompanyGroupId(), "magazin badges")
10/>
11<#setting locale="de_DE">
12<#assign
13displayDate = .vars['reserved-article-display-date'].data
14displayDate = displayDate?datetime("EEE, d MMM yyyy HH:mm:ss Z")
15/>
16
17<@liferay_util["html-top"]>
18 <#assign articleImageUrl = (artikelBild.getData()?trim?has_content)?then(themeDisplay.getPortalURL() + artikelBild.getData(), themeDisplay.getPortalURL() + image.getData())>
19 <#assign rawContent = (content.getData()!"") />
20
21 <#-- Html stuff und scripts rausfiltern -->
22 <#assign cleanText = htmlUtil.extractText(rawContent) />
23 <#assign cleanText = cleanText?replace("(?i)<script.*$", "", "r") />
24
25 <#-- Backslashes rausfiltern -->
26 <#assign cleanText = cleanText?replace("\\\\(['\"])", "$1", "r") />
27 <#assign cleanText = cleanText?replace("\\\\", "", "r") />
28
29 <#-- Anführungszeichen und Leerzeichen aller Art löschen-->
30 <#assign cleanText = cleanText?replace("'", "") />
31 <#assign cleanText = cleanText?replace('"', "") />
32 <#assign cleanText = cleanText?replace("„", "") />
33 <#assign cleanText = cleanText?replace("“", "") />
34 <#assign cleanText = cleanText?replace("”", "") />
35 <#assign cleanText = cleanText?replace("“", "") />
36 <#assign cleanText = cleanText?replace("[\\r\\n\\t]+", " ", "r") />
37 <#assign cleanText = cleanText?replace("\\s+", " ", "r") />
38 <#assign finalBody = cleanText?trim />
39 <#assign wordCount = (finalBody?word_list?size)!0 />
40
41 <#assign readingTimeMinutes = (wordCount / 200)?ceiling />
42 <#if (readingTimeMinutes < 1)><#assign readingTimeMinutes = 1 /></#if>
43 <#assign isoTimeRequired = "PT" + readingTimeMinutes + "M" />
44
45 <#assign allCategories = assetEntry.getCategories()![] />
46 <#assign metaKeywords = [] />
47
48 <#list allCategories as category>
49 <#assign metaKeywords = metaKeywords + [category.getName()] />
50 </#list>
51
52 <#assign categoryBadge = getCategoryBadge(assetEntry) />
53
54 <script data-senna-track="temporary" type="application/ld+json">
55 {
56 "@context": "https://schema.org",
57 "@type": "BlogPosting",
58 "headline": "${(headline.getData()!"")?js_string}",
59 "image": "${articleImageUrl}",
60 "datePublished": "${displayDate?string("yyyy-MM-dd'T'HH:mm:ssXXX")}",
61 "dateModified": "${journalArticle.getModifiedDate()?string("yyyy-MM-dd'T'HH:mm:ssXXX")}",
62 "author": {
63 "@type": "Person",
64 "name": "${(assetEntry.getUserName()!"")?js_string}",
65 "affiliation": {
66 "@type": "Organization",
67 "name": "pme Familienservice"
68 }
69 },
70 "publisher": {
71 "@type": "Organization",
72 "name": "pme Familienservice",
73 "logo": {
74 "@type": "ImageObject",
75 "url": "${themeDisplay.getPathThemeImages()}/logo.png"
76 }
77 },
78 "articleSection": "${(categoryBadge["label"]!"")?js_string}",
79 "keywords": "${metaKeywords?join(", ")?js_string}",
80 "wordCount": "${wordCount}",
81 "timeRequired": "${isoTimeRequired}",
82 "articleBody": "${finalBody}"
83 }
84 </script>
85</@>
86
87<article class="article-details blog-details">
88 <div class="image-container">
89 <#if artikelBild.getData()?trim?has_content>
90 <img src="${artikelBild.getData()}" alt="${altTextOtherImage.getData()}" />
91 <#else>
92 <img src="${image.getData()}" alt="${altTextImgForTeaser.getData()}" />
93 </#if>
94 </div>
95
96 <#assign categoryBadge = getCategoryBadge(assetEntry)/>
97 <#if categoryBadge["color"] != "" && categoryBadge["label"] != "">
98 <span class='category-badge ${categoryBadge["color"]} white'>
99 ${categoryBadge["label"]}
100 </span>
101 </#if>
102
103 <div class="text-container">
104 <div class="blog-metadata">
105 <!-- Publish Date -->
106 <span class="metadata-info">
107 <img class="meta-data-icon" src="${themeDisplay.getPathThemeImages()}/article_detail/calendar.svg" alt="published" aria-hidden="true" />
108 <span class="article-meta-data">${displayDate?string["dd.MM.yyyy"]}</span>
109 </span>
110 <!-- Author -->
111 <span class="metadata-info">
112 <img class="meta-data-icon" src="${themeDisplay.getPathThemeImages()}/article_detail/user.svg" alt="author" aria-hidden="true" />
113 <span class="article-meta-data">${assetEntry.getUserName()}</span>
114 </span>
115 <!-- View Count -->
116 <span class="metadata-info">
117 <img class="meta-data-icon" src="${themeDisplay.getPathThemeImages()}/article_detail/eye.svg" alt="views" aria-hidden="true" />
118 <span class="article-meta-data">${assetEntry.getViewCount()}</span>
119 </span>
120 </div>
121
122 <h1 class="article-headline">${headline.getData()}</h1>
123
124 ${content.getData()}
125 </div>
126</article>
127
128<#function getCategoryBadge entry>
129 <#list entry.getCategories() as curCategory>
130 <#if (curCategory.getVocabularyId() == magazinVocabulary.getVocabularyId())>
131 <#assign
132 property = categoryPropertyService.getCategoryProperty(curCategory.getCategoryId(), "color")
133 label = curCategory.getName()
134 color = property.getValue()
135 />
136
137 <#return {"color":color, "label":label} />
138 </#if>
139 </#list>
140
141 <#return {"color":"", "label":""} />
142</#function>