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