Fehler bei der Verarbeitung der Vorlage.
Error while invoking the "replace-content" JSP custom tag; see cause exception

----
FTL stack trace ("~" means nesting-related):
	- Failed at: @ait_contentreplacer["replace-content"]  [in template "20116#20152#BKS-SEITENTITEL-TEXT" at line 5, column 1]
----
1<#assign 
2	ait_contentreplacer = taglibLiferayHash["/META-INF/ait-contentreplacer.tld"] 
3/> 
4 
5<@ait_contentreplacer["replace-content"]> 
6 
7	<div class="content-large"> 
8		${Content.getData()} 
9	</div> 
10 
11</@> 
Trigos Info-Frühstück
Fehler bei der Verarbeitung der Vorlage.
Error while invoking the "replace-content" JSP custom tag; see cause exception

----
FTL stack trace ("~" means nesting-related):
	- Failed at: @ait_contentreplacer["replace-content"]  [in template "20116#20152#BKS-STANDARD-WEB-CONTENT" at line 9, column 1]
----
1<#assign 
2	ait_contentreplacer = taglibLiferayHash["/META-INF/ait-contentreplacer.tld"] 
3 
4	DLFileEntryService = serviceLocator.findService('com.liferay.document.library.kernel.service.DLFileEntryService') 
5	DLAppService = serviceLocator.findService('com.liferay.document.library.kernel.service.DLAppService') 
6	DLUtil = serviceLocator.findService('com.liferay.document.library.kernel.util.DLUtil') 
7/> 
8 
9<@ait_contentreplacer["replace-content"]> 
10 
11	<@initMediaValues/> 
12	<#assign mediaData = getMediaTypeData(Video VideoFileEntry Image) /> 
13 
14	<#if VideoPreview??> 
15		<#assign 
16			videoPreview = VideoPreview 
17		/> 
18	<#else> 
19		<#assign videoPreview = '' /> 
20	</#if> 
21 
22	<#if mediaData['hasMedia']> 
23		<figure class="content-media-element media-element-left ${mediaData['mediaCssClass']}"> 
24			<@renderMedia Video VideoFileEntry Image mediaData videoPreview/> 
25 
26			<#if Caption.getData()?? && Caption.getData() != ""> 
27				<figcaption class="media-element-caption">${Caption.getData()}</figcaption> 
28			</#if> 
29		</figure> 
30	</#if> 
31	${content.getData()} 
32 
33 
34	<#function getDLFileEntryAltText Image> 
35		<#if Image.getAttribute("id")?? && Image.getAttribute("id") != ""> 
36			<#return ""> 
37		<#else> 
38			<#assign dlFileEntry = getDLFileEntry(Image) > 
39			<#return dlFileEntry.getDescription()/> 
40		</#if> 
41	</#function> 
42 
43	<#function getDLFileEntry fileEntry> 
44		<#assign dlFileEntry = ''> 
45		<#if fileEntry.getAttribute("fileEntryId")?? && fileEntry.getAttribute("fileEntryId") != ""> 
46			<#assign 
47			dlFileEntry = DLFileEntryService.getFileEntry(fileEntry.getAttribute("fileEntryId")?number) 
48			/> 
49		<#else> 
50			<#assign 
51			dlFileEntry = getDLFileEntryFromUrl(fileEntry.getData()) 
52			/> 
53		</#if> 
54		<#return dlFileEntry> 
55	</#function> 
56 
57	<#function getDLFileEntryFromUrl fileUrl> 
58		<#assign counter = 0 > 
59		<#list "${fileUrl}"?split("/") as pathSegemtent> 
60			<#if counter == 2> 
61				<#assign groupId = pathSegemtent?number > 
62			</#if> 
63			<#if counter == 5> 
64				<#assign subCounter = 0 > 
65				<#list "${pathSegemtent}"?split("?") as subSegemtent> 
66					<#if subCounter == 0> 
67						<#assign uuId = subSegemtent > 
68					</#if> 
69					<#assign subCounter = subCounter+1 > 
70				</#list> 
71			</#if> 
72			<#assign counter = counter+1 > 
73		</#list> 
74 
75		<#assign dlFileEntry = DLFileEntryService.getFileEntryByUuidAndGroupId(uuId,groupId) > 
76 
77		<#return dlFileEntry> 
78	</#function> 
79 
80	<#macro initMediaValues> 
81	<#-- If either one of the needed Media Types is not present create the Variable with an empty string --> 
82	<#-- needed since some Articles might not have them --> 
83		<#if !Video??> 
84			<#assign Video = ''/> 
85		</#if> 
86		<#if !VideoFiles??> 
87			<#assign VideoFileEntry = ''/> 
88		<#else> 
89			<#assign 
90			VideoFileEntry = VideoFiles.VideoFileEntry 
91			/> 
92		</#if> 
93		<#if !Image??> 
94			<#assign Image = ''/> 
95		</#if> 
96	</#macro> 
97 
98	<#macro renderYoutubeVideo videoId> 
99		<iframe 
100				data-name="youtube" 
101				data-src="https://www.youtube-nocookie.com/embed/${videoId}?color=white&amp;controls=2&amp;hl=${locale.getLanguage()}&amp;iv_load_policy=3&amp;modestbranding=1&amp;rel=0&amp;showinfo=0" 
102				frameborder="0" 
103				allow="autoplay; encrypted-media" 
104				allowfullscreen 
105		></iframe> 
106	</#macro> 
107 
108	<#macro renderVideoPlayer videoFiles videoPreview videoPlayerId=randomNamespace> 
109		<#assign 
110		previewImage = '' 
111 
112		theme_path = themeDisplay.getPathThemeCss() 
113 
114		videojsCssPath = theme_path + '/theme/video-js/video-js.min.css' 
115		/> 
116 
117		<#if !videoPreview?is_string > 
118			<#if videoPreview.getData()?? && videoPreview.getData() != ''> 
119				<#assign 
120				previewImage = videoPreview.getData() 
121				/> 
122			</#if> 
123		</#if> 
124 
125		<video id="media_teaser_video_${videoPlayerId}" class="video-js vjs-fluid vjs-big-play-centered video-js-bks"> 
126			<#list videoFiles.getSiblings() as videoFile> 
127				<#if videoFile.getData()?? && videoFile.getData() != ''> 
128					<#assign 
129					videoFileEntry = getFileEntryFromUrl(videoFile.getData()) 
130					mimeType = videoFileEntry.getMimeType() 
131					/> 
132					<#if previewImage == ''> 
133						<#assign 
134						previewImage = DLUtil.getImagePreviewURL(videoFileEntry, videoFileEntry.getFileVersion(), themeDisplay) 
135						/> 
136					</#if> 
137					<source src="${videoFile.getData()}" type="${mimeType}"> 
138				</#if> 
139			</#list> 
140			<p class="vjs-no-js">Um dieses Video anzusehen, aktivieren Sie bitte JavaScript, und verwenden Sie einen Browser der <a href="http://videojs.com/html5-video-support/" target="_blank">Videos im HTML5 Standard unterstützt.</a></p> 
141		</video> 
142 
143		<script> 
144			Liferay.Loader.require([ 
145						"bks-main-theme-js-modules@2.0.0/video-js/video.min" 
146					], 
147					function(videojs) { 
148						var allCssElements=document.getElementsByTagName("link"); 
149						var cssAlreadyExists = false; 
150 
151						for (var i=allCssElements.length; i>=0; i--){ //search backwards within nodelist for matching elements to remove 
152							if (allCssElements[i] && allCssElements[i].getAttribute("href")!=null && allCssElements[i].getAttribute("href").indexOf("${videojsCssPath}")!=-1){ 
153								cssAlreadyExists = true; 
154
155
156 
157						if (!cssAlreadyExists) { 
158							var newCssFile=document.createElement("link"); 
159							newCssFile.setAttribute("rel", "stylesheet"); 
160							newCssFile.setAttribute("type", "text/css"); 
161							newCssFile.setAttribute("href", "${videojsCssPath}"); 
162 
163							document.getElementsByTagName('head')[0].appendChild(newCssFile); 
164
165 
166						videojs('media_teaser_video_${videoPlayerId}', { 
167							controls: true, 
168							autoplay: false, 
169							preload: 'auto', 
170							aspectRatio: "16:9", 
171							fluid: 1, 
172							language: "${locale.getLanguage()}", 
173							poster: "${previewImage}" 
174						}); 
175 
176						Liferay.on('startNavigate', function() { 
177							videojs('media_teaser_video_${videoPlayerId}').dispose(); 
178						}); 
179					}, 
180					function(error) { 
181						console.error(error); 
182
183			); 
184		</script> 
185	</#macro> 
186 
187	<#-- Get FileEntry NOT DlFileEntry!!! --> 
188	<#function getFileEntryFromUrl fileUrl> 
189		<#assign counter = 0 > 
190		<#list "${fileUrl}"?split("/") as pathSegemtent> 
191			<#if counter == 2> 
192				<#assign groupId = pathSegemtent?number > 
193			</#if> 
194			<#if counter == 5> 
195				<#assign subCounter = 0 > 
196				<#list "${pathSegemtent}"?split("?") as subSegemtent> 
197					<#if subCounter == 0> 
198						<#assign uuId = subSegemtent > 
199					</#if> 
200					<#assign subCounter = subCounter+1 > 
201				</#list> 
202			</#if> 
203			<#assign counter = counter+1 > 
204		</#list> 
205 
206		<#assign fileEntry = DLAppService.getFileEntryByUuidAndGroupId(uuId,groupId) > 
207 
208		<#return fileEntry> 
209	</#function> 
210 
211	<#function getYoutubeIdFromUrl url> 
212		<#assign pathSegments = "${url}"?split("/") > 
213		<#return pathSegments?last> 
214	</#function> 
215 
216	<#function getMediaTypeData Video VideoFileEntries Image> 
217		<#assign 
218		mediaTypeData = { 
219		"hasMedia" : false, 
220		"mediaType" : "", 
221		"mediaCssClass" : "" 
222
223		/> 
224		<#if Video?? && Video?has_content && Video.getData()?contains("youtube") || Video.getData()?contains("youtu.be")> 
225			<#assign 
226			mediaTypeData = { 
227			"hasMedia" : true, 
228			"mediaType" : "youtube", 
229			"mediaCssClass" : "media-element-fixed-width" 
230
231			/> 
232		<#elseif VideoFileEntries?? && VideoFileEntries?has_content && VideoFileEntries.getSiblings()?has_content> 
233			<#list VideoFileEntries.getSiblings() as videoFileEntryItem> 
234				<#if videoFileEntryItem.getData()?? && videoFileEntryItem.getData() != ''> 
235					<#assign 
236					mediaTypeData = { 
237					"hasMedia" : true, 
238					"mediaType" : "videofile", 
239					"mediaCssClass" : "media-element-fixed-width" 
240
241					/> 
242				</#if> 
243			</#list> 
244		</#if> 
245		<#if !mediaTypeData['hasMedia'] && Image?? && Image?has_content && Image.getData()?? && Image.getData() != ""> 
246			<#assign 
247			mediaTypeData = { 
248			"hasMedia" : true, 
249			"mediaType" : "image", 
250			"mediaCssClass" : "" 
251
252			/> 
253		</#if> 
254		<#return mediaTypeData/> 
255	</#function> 
256 
257	<#macro renderMedia Video VideoFileEntries Image mediaTypeData VideoPreview mediaId=randomNamespace> 
258		<#switch mediaTypeData['mediaType']> 
259			<#case 'youtube'> 
260				<#assign youtubeId = getYoutubeIdFromUrl(Video.getData()) /> 
261				<div class="aspect-ratio aspect-ratio-16-to-9"> 
262					<@renderYoutubeVideo youtubeId/> 
263				</div> 
264				<#break> 
265			<#case 'videofile'> 
266				<@renderVideoPlayer VideoFileEntries VideoPreview mediaId/> 
267				<#break> 
268			<#case 'image'> 
269				<#assign 
270				altText = Image.getAttribute("alt") 
271				/> 
272				<#if !Image.getAttribute("alt")?? || Image.getAttribute("alt") == ""> 
273					<#assign 
274					altText = getDLFileEntryAltText(Image) 
275					/> 
276				</#if> 
277				<img data-fileentryid="${Image.getAttribute("fileEntryId")}" alt="${altText}" src="${Image.getData()}" /> 
278				<#break> 
279		</#switch> 
280	</#macro> 
281 
282</@> 
Fehler bei der Verarbeitung der Vorlage.
Error while invoking the "replace-content" JSP custom tag; see cause exception

----
FTL stack trace ("~" means nesting-related):
	- Failed at: @ait_contentreplacer["replace-content"]  [in template "20116#20152#34018" at line 9, column 1]
----
1<#assign 
2	ait_contentreplacer = taglibLiferayHash["/META-INF/ait-contentreplacer.tld"] 
3 
4	journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") 
5	languageUtil = serviceLocator.findService("com.liferay.portal.kernel.language.LanguageUtil") 
6	webKeys = staticUtil["com.liferay.portal.kernel.util.WebKeys"] 
7/> 
8 
9<@ait_contentreplacer["replace-content"]> 
10 
11	<#assign 
12		defaultDateFormat = "dd.MM.yyyy" 
13		linkText = "Mehr Informationen" 
14	/> 
15 
16	<#-- Configuration --> 
17 
18	<#assign forcedBoxTemplateMapping = { 
19		"BKS-PRODUKT-DEPOT" : "BKS-PRODUKT-DEPOT-BOX", 
20		"BKS-PRODUKT-KARTE" : "BKS-PRODUKT-KARTE-BOX", 
21		"BKS-PRODUKT-KONTO-FIRMENKUNDEN" : "BKS-PRODUKT-KONTO-FIRMENKUNDEN-BOX", 
22		"BKS-PRODUKT-KONTO-PRIVATKUNDEN" : "BKS-PRODUKT-KONTO-PRIVATKUNDEN-BOX", 
23 
24		"BKS-HR-KONTO-PRIVAT" : "BKS-HR-KONTO-PRIVAT-BOX", 
25		"BKS-HR-MASTERCARD" : "BKS-HR-MASTERCARD-BOX", 
26 
27		"BKS-SL-ACTIVA MAESTRO" : "BKS-SL-ACTIVA-MAESTRO-BOX", 
28		"BKS-SL-ACTIVA MASTERCARD" : "BKS-SL-ACTIVA-MASTERCARD-BOX", 
29		"BKS-SL-KONTO PRIVAT" : "BKS-SL-KONTO-PRIVAT-BOX", 
30		"BKS-SL-PAKETI" : "BKS-SL-PAKETI-BOX" 
31	}> 
32 
33	<#function getTemplateKey article> 
34		<#local structureKey = article.getDDMStructureKey()> 
35		<#if forcedBoxTemplateMapping[structureKey]??> 
36			<#return forcedBoxTemplateMapping[structureKey]> 
37		<#else> 
38			<#return article.getDDMTemplateKey()> 
39		</#if> 
40	</#function> 
41 
42	<#-- Rendering --> 
43	<#if !entries?has_content> 
44		<#if !themeDisplay.isSignedIn()> 
45			${renderRequest.setAttribute("PORTLET_CONFIGURATOR_VISIBILITY", true)} 
46		</#if> 
47 
48		<div class="alert alert-info"> 
49			<@liferay_ui["message"] key="no-entries-were-found" /> 
50		</div> 
51	<#else> 
52		<#list entries as entry> 
53			<#assign 
54			assetRenderer = entry.getAssetRenderer() 
55 
56			entryTitle = htmlUtil.escape(assetRenderer.getTitle(locale)) 
57 
58			entryClassName = assetRenderer.getClassName() 
59 
60			article = entry.getAssetRenderer().getArticle() 
61
62			 
63			<#if stringUtil.equals(entryClassName, "com.liferay.journal.model.JournalArticle")> 
64				<div class="lfr-portal-asset-edit-tooltip"> 
65					<@getEditIcon /> 
66				</div> 
67			 
68				<#assign templateKey = getTemplateKey(article) /> 
69			 
70				<#if templateKey == "BKS-NEWSEINTRAG"> 
71					<#assign 
72						viewURL = assetPublisherHelper.getAssetViewURL(renderRequest, renderResponse, assetRenderer, entry, !stringUtil.equals(assetLinkBehavior, "showFullContent")) 
73 
74						articleDocument = saxReaderUtil.read(article.getContent()) 
75						articleRootElement = articleDocument.getRootElement() 
76 
77						articleImage = "" 
78						articleHeading = "" 
79						articleSummary = "" 
80
81 
82					<#list articleRootElement.elements() as dynamicElement> 
83						<#switch dynamicElement.attributeValue("name")> 
84							<#case "Image"> 
85								<#assign articleImage = dynamicElement.element("dynamic-content").getText()> 
86								<#break> 
87							<#case "Heading"> 
88								<#assign 
89									articleHeading = dynamicElement.element("dynamic-content").getText() 
90                                    articleHeadingType = dynamicElement.attributeValue("type") 
91								/> 
92								<#break> 
93							<#case "Summary"> 
94								<#assign articleSummary = dynamicElement.element("dynamic-content").getText()> 
95								<#if articleSummary?length &gt; 250> 
96									<#assign articleSummary = articleSummary?substring(0,250) + " &hellip;"> 
97								</#if> 
98								<#break> 
99						</#switch> 
100					</#list> 
101				 
102					<div class="card card-index"> 
103						<div class="card-index-content"> 
104							<p class="card-index-category">NEWS - <@getMetadataField fieldName="publish-date" /></p> 
105							<#if articleHeadingType != 'text'> 
106                                ${articleHeading} 
107							<#else> 
108								<h2>${articleHeading}</h2> 
109							</#if> 
110							<p>${articleSummary}</p> 
111						</div> 
112						<div class="card-index-footer"> 
113							<a class="btn btn-secondary" href="${viewURL}" title="<@liferay.language key="read-more" />">${linkText} <svg aria-hidden="true" class="lexicon-icon scale-lexicon-icon icon-btn-right"><use xlink:href="#icn_arrow-right" /></svg></a> 
114						</div> 
115					</div> 
116				<#else> 
117					<#assign articleDisplay = journalArticleLocalService.getArticleDisplay( 
118						article.getGroupId(), 
119						article.getArticleId(), 
120						article.getVersion(), 
121						getTemplateKey(article), 
122						"view", 
123						languageUtil.getLanguageId(renderRequest), 
124						renderRequest.getAttribute(webKeys.THEME_DISPLAY)) 
125
126		 
127					${articleDisplay.getContent()} 
128				</#if> 
129			<#else> 
130				<#if themeDisplay.isSignedIn()> 
131					<div class="alert alert-warning"> 
132						<@liferay_ui["message"] key="asset-type" /> <@liferay_ui["message"] key="not-supported" /> 
133					</div> 
134				</#if> 
135			</#if> 
136		</#list> 
137	</#if> 
138 
139	<#macro getEditIcon> 
140		<#if assetRenderer.hasEditPermission(themeDisplay.getPermissionChecker())> 
141			<#assign editPortletURL = assetRenderer.getURLEdit(renderRequest, renderResponse, windowStateFactory.getWindowState("NORMAL"), themeDisplay.getURLCurrent())!"" /> 
142 
143			<#if validator.isNotNull(editPortletURL)> 
144				<#assign title = languageUtil.format(locale, "edit-x", entryTitle, false) /> 
145 
146				<@liferay_ui["icon"] 
147					cssClass="icon-monospaced visible-interaction" 
148					icon="pencil" 
149					markupView="lexicon" 
150					message=title 
151					url=editPortletURL.toString() 
152				/> 
153			</#if> 
154		</#if> 
155	</#macro> 
156 
157	<#macro getMetadataField 
158	fieldName 
159
160		<#if stringUtil.split(metadataFields)?seq_contains(fieldName)> 
161			<span class="metadata-entry metadata-${fieldName}"> 
162				<#assign dateFormat = defaultDateFormat /> 
163 
164				<#if stringUtil.equals(fieldName, "author")> 
165					<@liferay.language key="by" /> ${htmlUtil.escape(portalUtil.getUserName(assetRenderer.getUserId(), assetRenderer.getUserName()))} 
166				<#elseif stringUtil.equals(fieldName, "categories")> 
167					<@liferay_ui["asset-categories-summary"] 
168					className=entry.getClassName() 
169					classPK=entry.getClassPK() 
170					portletURL=renderResponse.createRenderURL() 
171					/> 
172				<#elseif stringUtil.equals(fieldName, "create-date")> 
173					${dateUtil.getDate(entry.getCreateDate(), dateFormat, locale)} 
174				<#elseif stringUtil.equals(fieldName, "expiration-date")> 
175					${dateUtil.getDate(entry.getExpirationDate(), dateFormat, locale)} 
176				<#elseif stringUtil.equals(fieldName, "modified-date")> 
177					${dateUtil.getDate(entry.getModifiedDate(), dateFormat, locale)} 
178				<#elseif stringUtil.equals(fieldName, "priority")> 
179					${entry.getPriority()} 
180				<#elseif stringUtil.equals(fieldName, "publish-date")> 
181					${dateUtil.getDate(entry.getPublishDate(), dateFormat, locale)} 
182				<#elseif stringUtil.equals(fieldName, "tags")> 
183					<@liferay_ui["asset-tags-summary"] 
184					className=entry.getClassName() 
185					classPK=entry.getClassPK() 
186					portletURL=renderResponse.createRenderURL() 
187					/> 
188				<#elseif stringUtil.equals(fieldName, "view-count")> 
189					${entry.getViewCount()} <@liferay.language key="views" /> 
190				</#if> 
191			</span> 
192		</#if> 
193	</#macro> 
194	 
195</@> 
Fehler bei der Verarbeitung der Vorlage.
Error while invoking the "replace-content" JSP custom tag; see cause exception

----
FTL stack trace ("~" means nesting-related):
	- Failed at: @ait_contentreplacer["replace-content"]  [in template "20116#20152#BKS-INDEXBOX-AT" at line 7, column 1]
----
1<#assign 
2	ait_contentreplacer = taglibLiferayHash["/META-INF/ait-contentreplacer.tld"] 
3	 
4	DLFileEntryService = serviceLocator.findService('com.liferay.document.library.kernel.service.DLFileEntryService') 
5/> 
6 
7<@ait_contentreplacer["replace-content"]> 
8 
9	<#assign 
10		linkUrl = '' 
11		linkTitle = languageUtil.format(locale, "go-to-x", htmlUtil.stripHtml(htmlUtil.extractText(Heading.getData())), false) 
12		linkParams = '' 
13		linkText = languageUtil.get(locale, "bks-default-link-text") 
14	/> 
15 
16	<#if Link.LinkInternal.getData()?? && Link.LinkInternal.getData() != ""> 
17		<#assign linkUrl = Link.LinkInternal.getFriendlyUrl()/> 
18	<#elseif Link.DocumentInternal.getData()?? && Link.DocumentInternal.getData() != ""> 
19		<#assign linkUrl = Link.DocumentInternal.getData()/> 
20		<#assign linkParams = 'target="_blank" rel="external"'/> 
21	<#elseif Link.LinkExternal.getData()?? && Link.LinkExternal.getData() != ""> 
22		<#assign linkUrl = Link.LinkExternal.getData()/> 
23		<#assign linkParams = 'target="_blank" rel="external"'/> 
24	</#if> 
25	<#if Link.LinkText?? && Link.LinkText.getData()?? && Link.LinkText.getData() != ""> 
26		<#assign linkText = Link.LinkText.getData()/> 
27	</#if> 
28 
29 
30	<div class="card card-index"> 
31		<div class="card-index-content"> 
32			<#if Image.getData()?? && Image.getData() != ""> 
33				<#assign 
34					altText = Image.getAttribute("alt") 
35				/> 
36				<#if !Image.getAttribute("alt")?? || Image.getAttribute("alt") == ""> 
37					<#assign 
38						altText = getDLFileEntryAltText(Image) 
39					/> 
40				</#if> 
41				<div class="card-index-image aspect-ratio"> 
42					<img class="aspect-ratio-item aspect-ratio-item-top-center" data-fileentryid="${Image.getAttribute("fileEntryId")}" alt="${altText}" src="${Image.getData()}" /> 
43				</div> 
44			</#if> 
45 
46            <#if Heading.getType() != "text"> 
47                ${Heading.getData()} 
48            <#else> 
49				<h2>${Heading.getData()}</h2> 
50            </#if> 
51			<p>${Content.getData()}</p> 
52		</div> 
53		<#if linkUrl != ""> 
54			<div class="card-index-footer"> 
55				<a class="btn btn-secondary" href="${linkUrl}" title="${linkTitle}" ${linkParams}>${linkText} <svg aria-hidden="true" class="lexicon-icon scale-lexicon-icon icon-btn-right"><use xlink:href="#icn_arrow-right" /></svg></a> 
56			</div> 
57		</#if> 
58	</div> 
59 
60	<#function getDLFileEntryAltText Image> 
61		<#if Image.getAttribute("id")?? && Image.getAttribute("id") != ""> 
62			<#return ""> 
63		<#else> 
64			<#assign dlFileEntry = getDLFileEntry(Image) > 
65			<#return dlFileEntry.getDescription()/> 
66		</#if>	 
67	</#function> 
68 
69	<#function getDLFileEntry fileEntry> 
70		<#assign dlFileEntry = ''> 
71		<#if fileEntry.getAttribute("fileEntryId")?? && fileEntry.getAttribute("fileEntryId") != ""> 
72			<#assign 
73				dlFileEntry = DLFileEntryService.getFileEntry(fileEntry.getAttribute("fileEntryId")?number) 
74			/> 
75		<#else> 
76			<#assign 
77				dlFileEntry = getDLFileEntryFromUrl(fileEntry.getData()) 
78			/> 
79		</#if> 
80		<#return dlFileEntry> 
81	</#function> 
82 
83	<#function getDLFileEntryFromUrl fileUrl> 
84		<#assign counter = 0 > 
85		<#list "${fileUrl}"?split("/") as pathSegemtent> 
86			<#if counter == 2> 
87				<#assign groupId = pathSegemtent?number > 
88			</#if> 
89			<#if counter == 5> 
90				<#assign subCounter = 0 > 
91				<#list "${pathSegemtent}"?split("?") as subSegemtent> 
92					<#if subCounter == 0> 
93						<#assign uuId = subSegemtent > 
94					</#if> 
95					<#assign subCounter = subCounter+1 > 
96				</#list> 
97			</#if> 
98			<#assign counter = counter+1 > 
99		</#list> 
100 
101		<#assign dlFileEntry = DLFileEntryService.getFileEntryByUuidAndGroupId(uuId,groupId) > 
102 
103		<#return dlFileEntry> 
104	</#function> 
105 
106</@>