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</@> 
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</@>