Dokuteka
Se ha producido un error al procesar la plantilla.
Java method "com.liferay.portal.json.JSONFactoryImpl.createJSONObject(String)" threw an exception when invoked on com.liferay.portal.json.JSONFactoryImpl object "com.liferay.portal.json.JSONFactoryImpl@5b64356f"; see cause exception in the Java stack trace.
----
FTL stack trace ("~" means nesting-related):
- Failed at: #assign irudiaJson = jsonFactoryUtil... [in template "20902#20940#7085098" at line 240, column 41]
----
1<#-- VARIABLES -->
2<#assign inprimatujarduera = "Inprimatu jarduera">
3<#assign bajar = "Jaitsi">
4<#assign transcripcion = "Transkripzioa">
5<#assign completa = "completa">
6<#assign irekijarduera = "Ireki jarduera">
7<#assign idioma=locale?substring(0,locale?index_of("_")) >
8
9<#-- TRADUCCION -->
10<#if locale=='en_US'>
11 <#assign irekijarduera = 'Go to the exercise'>
12 <#assign inprimatujarduera = 'Print exercise'>
13 <#assign bajar = "Download">
14 <#assign transcripcion = "Transcription">
15</#if>
16<#if locale=='fr_FR'>
17 <#assign irekijarduera = "Aller à l'exercice">
18 <#assign inprimatujarduera = "Imprimer l’exercice">
19 <#assign bajar = "Télécharger">
20 <#assign transcripcion = "Transcription">
21</#if>
22<#if locale=='es_ES'>
23<#assign irekijarduera = 'Abrir tarea'>
24 <#assign inprimatujarduera = 'Imprimir tarea'>
25 <#assign bajar = "Bajar">
26 <#assign transcripcion = "Transcripción">
27</#if>
28
29<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
30
31<#-- JAVASCRIPT -->
32<script type="text/javascript">
33 document.addEventListener("DOMContentLoaded", function () {
34
35 if (window.innerWidth <= 768) {
36
37 const relacionados = document.getElementById(
38 "embedded-articlenextevents-portlet"
39 );
40
41 const column2 = document.getElementById("column-2");
42
43 if (relacionados && column2) {
44 column2.after(relacionados);
45 }
46
47 document.querySelectorAll('#deskribapena p').forEach(p => {
48 const estaVacio = p.textContent.trim() === '';
49 const tieneImagen = p.querySelector('img, picture');
50
51 if (estaVacio && !tieneImagen) {
52 p.style.display = 'none';
53 }
54 });
55
56 }
57
58 // --- Botones abrir/cerrar transkripzioa ---
59 $("#trasnkripzioazabaldu").on("click", function (event) {
60 $("#trasnkripzioedukia").css("display", "block");
61 /*$("#trasnkripzioedukia").show();*/
62 $("#trasnkripzioazabaldu").hide();
63 /*$("#trasnkripzioaestutu").show();*/
64 $("#trasnkripzioaestutu").css("display", "inline");
65
66 return false;
67 });
68
69 $("#trasnkripzioaestutu").on("click", function (event) {
70 $("#trasnkripzioedukia").hide();
71 $("#trasnkripzioazabaldu").css("display", "inline");
72 /*$("#trasnkripzioazabaldu").show();*/
73 $("#trasnkripzioaestutu").hide();
74 return false;
75 });
76
77 const deskribapenak = document.querySelectorAll(".deskribapena:not(.row)");
78 const transkripzioa = document.getElementById("transkripzioa");
79
80 const tieneTabla = [...deskribapenak].some(el => el.querySelector("table"));
81
82 if (tieneTabla && transkripzioa) {
83 transkripzioa.style.paddingTop = "10px";
84 transkripzioa.style.paddingLeft = "18px";
85 }
86});
87
88</script>
89
90<link rel="stylesheet" href="/o/x61tThemeIkasbilWAR-theme/css/scriptVideo.css">
91<style type="text/css">
92 .play-video-icon{
93 position:absolute;
94 top:50%;
95 left:50%;
96 transform:translate(-50%, -50%);
97 font-size:3rem;
98 color:white;
99 cursor:pointer;
100 opacity:0.9;
101 text-shadow:0 0 10px rgba(0,0,0,0.7);
102 transition:transform 0.2s ease;
103 z-index: 1;
104 }
105
106 .play-video-icon:hover{transform:translate(-50%, -50%) scale(1.1);}
107
108 .card-video div video {
109 width: 100%;
110 height: 100%;
111 position: relative;
112 overflow: hidden;
113 z-index: 1;
114 }
115
116 .card-video div video {
117 width: 100%;
118 height: 100%;
119 position: relative;
120 overflow: hidden;
121 z-index: 1;
122 }
123
124 .ikasbil .fitxa #deskribapena {text-align: left !important;word-break: break-word;}
125 .ikasbil .fitxa #deskribapena p{font-size:0.75em;}
126 #deskribapena figcaption {font-size: .9rem;width: 90%;line-height: normal;}
127
128.fullscreen {z-index: 2789034264 !important; position: absolute !important; width: 80% !important; bottom: 3% !important; left: 10% !important; right: 10% !important; }
129 .fullscreenBtn {
130 text-indent: 0px;
131 color: #fabd48;
132 background-color: none;
133
134 padding: 0px;
135 font-weight: bold;
136 padding-bottom: 3px;
137 }
138 .exitFullScreenBtn{
139 text-indent: 0px;
140 color: #fabd48;
141 background-color: none;
142 padding: 0px;
143 font-weight: bold;
144 padding-bottom: 3px;
145 }
146
147 .printhide {
148 display: none;
149 }
150 #trasnkripzioedukia {
151 padding: 1em;
152 background-color: #e7e7e7;
153 color: black !important;
154 display: none;
155 }
156 #transkripzioa {
157 margin-top: 1em;
158 margin-bottom: 1em;
159 }
160
161 #caja-video {float: left;}
162 #caja-video .botonEnlaceDokuteka {font-size: 16px !important;padding:.5rem;}
163 .preview-img{object-fit:cover;}
164 .col img {padding-right: 10px;}
165
166 table {width: 100% !important;}
167 .videoVertical table {width: 65% !important;}
168 .videoHorizontal table {width: 100% !important;}
169
170 .bideo-enlaces {
171 position: relative;
172 z-index: 1;
173 }
174
175 @media (max-width: 768px){
176 .videoVertical table {width: 100% !important;}
177 .fitxa #deskribapena img{object-fit:cover;height:200px;}
178 }
179</style>
180
181
182<#assign id = paramUtil.getString(request, "articleId")>
183<#assign DLAppService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLAppService")>
184<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
185
186<#assign getterUtil = staticUtil["com.liferay.portal.kernel.util.GetterUtil"] />
187
188
189
190<#if id?has_content>
191
192 <#if journalArticleLocalService??>
193 <!-- VISUALIZAR EN PREVIEW -->
194 <#assign deskribapena = deskribapena.getData() />
195 <#assign izenburua = izenburua.getData() />
196 <#assign laburpena = laburpena.getData() />
197 <#assign irudia = irudia.getData() />
198 <#assign idMoodle = id_moodle.getData() />
199 <#assign idExternalMoodle = id_external_moodle.getData() />
200 <#-- <#assign bideoa = bideoa.getData()!"" />
201 <#assign youtubeko_bideoa = youtubeko_bideoa.getData()!"" />
202 <#assign transkripzioa = transkripzioa.getData()!"" />
203 <#assign audio = audioa.getData()!"" />
204 <#assign irrati_nobela = irratinobelaren_zenbakia.getData()!"" /> -->
205
206 <!-- VISUALIZAR EN PAGINA DETALLE -->
207 <#attempt>
208 <#assign articleById = journalArticleLocalService.getDisplayArticle(groupId?long, id)>
209 <#assign document = articleById.getDocumentByLocale(locale)>
210 <#recover>
211 <#assign articleById = 0>
212 </#attempt>
213
214 <#if articleById?has_content && document?has_content>
215 <#assign izenburua = document.valueOf("//dynamic-element[@field-reference='izenburua']/dynamic-content/text()") />
216 <#assign laburpena = document.valueOf("//dynamic-element[@field-reference='laburpena']/dynamic-content/text()") />
217 <#assign deskribapena = document.valueOf("//dynamic-element[@field-reference='deskribapena']/dynamic-content/text()") />
218 <#assign irudia = document.valueOf("//dynamic-element[@field-reference='irudia']/dynamic-content/text()") />
219 <#assign idMoodle = document.valueOf("//dynamic-element[@field-reference='id_moodle']/dynamic-content/text()") />
220 <#assign idExternalMoodle = document.valueOf("//dynamic-element[@field-reference='id_external_moodle']/dynamic-content/text()") />
221 <#assign bideoa = document.valueOf("//dynamic-element[@field-reference='bideoa2']/dynamic-content/text()") />
222
223 <#--Si no encuentra bideoa2 al ser de estructura vieja, coger el campo bideo-->
224 <#if !bideoa?has_content>
225 <#assign bideoa = document.valueOf("//dynamic-element[@field-reference='bideoa']/dynamic-content/text()") />
226 </#if>
227
228 <#assign bertikal = document.valueOf("//dynamic-element[@field-reference='bertikal']/dynamic-content/text()")!"" >
229 <#assign youtubeko_bideoa = document.valueOf("//dynamic-element[@field-reference='youtubeko_bideoa']/dynamic-content/text()") />
230 <#assign transkripzioa = document.valueOf("//dynamic-element[@field-reference='transkripzioa']/dynamic-content/text()") />
231 <#assign audio = document.valueOf("//dynamic-element[@field-reference='audioa']/dynamic-content/text()") />
232 <#assign irrati_nobela = document.valueOf("//dynamic-element[@field-reference='irratinobelaren_zenbakia']/dynamic-content/text()") />
233 </#if>
234
235 <#assign videoUrl = "" />
236 <#assign posterUrl = "" />
237
238 <#-- Procesar irudia si tiene contenido -->
239 <#if irudia?has_content && irudia?contains("uuid")>
240 <#assign irudiaJson = jsonFactoryUtil.createJSONObject(irudia) />
241 <#assign posterEntry = DLAppService.getFileEntryByUuidAndGroupId(irudiaJson.getString("uuid"), irudiaJson.getLong("groupId")) />
242 <#assign posterUrl = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/"
243 + posterEntry.getGroupId() + "/" + posterEntry.getFolderId() + "/" + htmlUtil.escapeURL(posterEntry.getTitle()) + "/" + posterEntry.getUuid()
244 + "?t=" + posterEntry.getModifiedDate()?long />
245 </#if>
246
247 <#-- Procesar bideoa si tiene contenido -->
248 <#if bideoa?has_content && bideoa?contains("uuid")>
249 <#assign bideoJson = jsonFactoryUtil.createJSONObject(bideoa) />
250 <#assign videoEntry = DLAppService.getFileEntryByUuidAndGroupId(bideoJson.getString("uuid"), bideoJson.getLong("groupId")) />
251 <#assign videoUrl = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/"
252 + videoEntry.getGroupId() + "/" + videoEntry.getFolderId() + "/" + htmlUtil.escapeURL(videoEntry.getTitle()) + "/" + videoEntry.getUuid()
253 + "?t=" + videoEntry.getModifiedDate()?long />
254 </#if>
255
256 <#-- IF AUDIO TIENE CONTENIDO -->
257 <#if audio?has_content && audio?contains("uuid")>
258 <#assign audioJson = jsonFactoryUtil.createJSONObject(audio) />
259 <#assign posterEntryA = DLAppService.getFileEntryByUuidAndGroupId(audioJson.getString("uuid"), audioJson.getLong("groupId")) />
260 <#assign audioUrl = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/"
261 + posterEntryA.getGroupId() + "/" + posterEntryA.getFolderId() + "/" + htmlUtil.escapeURL(posterEntryA.getTitle()) + "/" + posterEntryA.getUuid()
262 + "?t=" + posterEntryA.getModifiedDate()?long />
263 </#if>
264
265 <div class="fitxa separadorIzq">
266 <#if irrati_nobela !="">
267 <div id="numCapi"></div>
268 <#assign articleIrrati = journalArticleLocalService.getDisplayArticle(getterUtil.getLong(groupId), irrati_nobela) />
269 <#assign documentIrrati = saxReaderUtil.read(articleIrrati.getContentByLocale(locale)) >
270 <#assign zenbakiakIrrati = documentIrrati.valueOf("//dynamic-element[@name='zenbakiak']") />
271 <#assign numeros = documentIrrati.selectNodes("//dynamic-element[@name='zenbakiak']") />
272 <#assign primero= '0' />
273 <#assign ultimo= '0' />
274 <#assign anterior= '0' />
275 <#assign siguiente= '0' />
276
277 <#assign atzera= '0' />
278 <#assign aurrera= '0' />
279 <#assign lehena= '0' />
280 <#assign azkeana= '0' />
281 <#assign atzekoa= '0' />
282 <#assign aurkitua= false />
283 <#list numeros as numero>
284 <#assign zenbakia = numero.valueOf("dynamic-content/text()") />
285 <#if primero == '0'>
286 <#assign primero= zenbakia />
287 </#if>
288 <#if anterior == '0'>
289 <#assign anterior= zenbakia />
290 </#if>
291 <#if id == zenbakia>
292 <#assign atzera= anterior />
293 <#assign aurkitua= true />
294 </#if>
295 <#if aurkitua && anterior == id >
296 <#assign aurrera= zenbakia />
297 <#assign aurkitua= true />
298 </#if>
299 <#if lehena =='0'>
300 <#assign lehena= id />
301 </#if>
302 <#assign anterior= zenbakia />
303
304 <#assign ultimo= zenbakia />
305 </#list>
306
307 <#assign url_docuteka_detalle= "/${idioma}/dokutekako-fitxa?articleId=" />
308 <div class="paginacion">
309 <div id="paginacionMenuIni">
310
311 <#if primero!=id>
312 <a id="orriajalehena" href="${url_docuteka_detalle}${primero}" >< < |</a>
313 <#else>
314 <span class="aurreraatzerades">< < |</span>
315 </#if>
316 <#if atzera !='0' >
317 <a id="orriajaatzera" href="${url_docuteka_detalle}${atzera}" >< |</a>
318 <#else>
319 <span class="aurreraatzerades">< |</span>
320 </#if>
321 <a href="/${idioma}/irrati-nobelak-fitxa?articleId=${irrati_nobela}"> Irrati Nobeletako Fitxara joan </a>
322 <#if aurrera != '0'>
323 <a id="orriajaaurrera" href="${url_docuteka_detalle}${aurrera}" >| ></a>
324 <#else>
325 <span class="aurreraatzerades">| ></span>
326 </#if>
327 <#if ultimo != '0'>
328 <a id="orriajaazkena" href="${url_docuteka_detalle}${ultimo}" >| > ></a>
329 <#else>
330 <span class="aurreraatzerades">| > ></span>
331 </#if>
332 </div>
333 </div>
334 </#if>
335
336 <#-- <h2>${izenburua}</h2> -->
337 <h2>${izenburua!""}</h2>
338
339 <div id="impedukia" class="col-xs-12 col-md-12 col-lg-12">
340
341
342 <h3>${laburpena!""}</h3>
343
344 <div id="ataza">
345 <#if idMoodle !="" || idExternalMoodle !="">
346 <a class="jarduerabtn" href="#"><label>${irekijarduera}</label></a>
347 </#if>
348
349 </div>
350
351 <!--
352 DESKRIBAPENA - Disenu barria 2026-02-13
353 -->
354 <#assign bideoVertikal = bertikal == "true">
355
356 <div class="deskribapena <#if bideoVertikal && videoUrl?has_content>videoVertical<#elseif !bideoVertikal && videoUrl?has_content>videoHorizontal</#if>" id="deskribapena">
357 <div id="caja-video" <#if bideoVertikal && videoUrl?has_content> class="col-12 col-md-4" <#elseif !bideoVertikal && videoUrl?has_content> class="col-12 col-md-5"</#if> >
358 <#if videoUrl?has_content>
359 <div id="bideo" class="card-video">
360
361 <#if !videoUrl?contains(".flv")>
362 <div class="h-100 video-wrapper position-relative">
363 <!-- PREVIEW (imagen + play) -->
364 <div class="h-100 mb-2 video-preview position-relative w-100">
365 <img src="${posterUrl}" class="img-fluid w-100 h-100 preview-img">
366 <i class="bi bi-play-circle-fill play-video-icon"></i>
367 </div>
368
369 <!-- VIDEO OCULTO -->
370 <video
371 class="nireBideoa d-none w-100 h-100"
372 controls
373 preload="auto"
374
375 playsinline>
376 <source src="${videoUrl}" type="video/mp4">
377 </video>
378
379 <#--<video class="nireBideoa d-none w-100 h-100" src="${videoUrl}" controls preload="auto" playsinline></video>-->
380 </div>
381 </#if>
382
383 </div>
384
385 <!-- DESCARGA VIDEO -->
386 <#if videoUrl?has_content>
387 <div class="mt-2 bideo-enlaces">
388 <a class="botonEnlaceDokuteka" href="${videoUrl}" target="_blank">${bajar} <i class="fa fa-download"></i></a>
389 </div>
390 </#if>
391
392 <!-- DESCARGA AUDIO -->
393 <#if audio?has_content>
394 <a class="botonEnlaceDokuteka" href="${audioUrl}" target="_blank">${bajar} <i class="fa fa-download"></i> </a>
395 <div style="clear:both"></div>
396 </#if>
397 </#if>
398 </div>
399 <!-- DESKRIBAPENA -->
400 <#if videoUrl?has_content>
401 <#assign deskribapenaSinImg = deskribapena?replace("<img[^>]*>", "", "r")>
402 <!--Quitar "Irudia: XX" en videos horizontales a peticion de Eider-->
403 <#assign deskribapenaSinImg = deskribapenaSinImg?replace(
404 "<p[^>]*>.*Irudia:.*</p>",
405 "",
406 "r"
407 )>
408 <#else>
409 <#assign deskribapenaSinImg = deskribapena>
410 </#if>
411
412 <div class="col">${deskribapenaSinImg}</div>
413 </div>
414
415 <!-- AUDIO CONTROLS -->
416 <#if audio?has_content>
417 <a class="botonEnlaceDokuteka" style="margin-top:10px;margin-left:18px" href="${audioUrl}" target="_blank">${bajar} <i class="fa fa-download"></i> </a>
418 <div id="audio">
419 <div>
420 <audio controls class="anchoAudio">
421 <source src="audio.ogg" type="audio/ogg">
422 <source src="${audioUrl}" type="audio/mp3">
423 </audio>
424 </div>
425 </div>
426 </#if>
427
428 <#if transkripzioa !="">
429 <div id="transkripzioa">
430 <a id="trasnkripzioazabaldu" class="botonEnlaceDokuteka" href="#"> ${transcripcion}:[+]</a>
431 <a id="trasnkripzioaestutu" href="#" class="printhide botonEnlaceDokuteka"> ${transcripcion}:[-]</a>
432 <!-- VER / OCULTAR TRANSCRIPCION -->
433 <div id="trasnkripzioedukia">
434 ${transkripzioa}
435 </div>
436 </div>
437 </#if>
438
439
440 <#--<#if videoUrl?has_content>
441 <div id="bideo">
442 <a class="botonEnlaceDokuteka" href="${videoUrl}" target="_blank">${bajar} <i class="fa fa-download"></i></a>
443 <#if !videoUrl?contains(".flv")>
444 <div>
445 <video controls width="95%" <#if posterUrl?has_content>poster="${posterUrl}"</#if>>
446 <source src="${videoUrl}" type="video/mp4">
447 Your browser does not support the video tag.
448 </video>
449 </div>
450 </#if>
451 </div>
452 </#if>-->
453
454 <!-- YOUTUBE BIDEOA -->
455 <#if youtubeko_bideoa !="">
456 <div id="bideoyoutubeko">
457 ${youtubeko_bideoa}
458 </div>
459 </#if>
460
461
462 </div>
463 </div>
464
465 <div id="embedded-articlenextevents-portlet">
466 <@liferay_portlet["runtime"] portletName="x61pRelaContWAR_WAR_x61pRelaContWARportlet" queryString="idArticulo=${id}&visualizacion=${completa}"/>
467 </div>
468
469 </#if>
470</#if>
471<#if bideoa?has_content>
472 <script src="/o/x61tThemeIkasbilWAR-theme/js/scriptVideo9.js"></script>
473</#if>
474
475<script>
476document.addEventListener("DOMContentLoaded", () => {
477 const videos = document.querySelectorAll(".nireBideoa");
478
479 videos.forEach(video => {
480 video.addEventListener("play", () => {
481 videos.forEach(other => {
482 if (other !== video) {
483 other.pause();
484 }
485 });
486 });
487 });
488
489
490 document.querySelectorAll(".video-wrapper").forEach(wrapper => {
491
492 const preview = wrapper.querySelector(".video-preview");
493 const playIcon = wrapper.querySelector(".play-video-icon");
494 const video = wrapper.querySelector(".nireBideoa");
495
496
497 if (!preview || !playIcon || !video) return;
498
499 playIcon.addEventListener("click", e => {
500 e.preventDefault();
501 e.stopPropagation();
502
503 // Ocultar preview del actual
504 preview.classList.add("d-none");
505
506 // Mostrar vídeo actual
507 video.classList.remove("d-none");
508
509 // Reproducir actual
510 video.currentTime = 0;
511 video.play();
512 });
513 });
514});
515</script>
