Se ha producido un error al procesar la plantilla.
Range start index 0 is out of bounds, because the sliced string has only 0 character(s). (Note that indices are 0-based).
The blamed expression:
==> startUid..endUid  [in template "42020#42061#124053" at line 161, column 48]

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #assign uid = urlBase[startUid..endUid]  [in template "42020#42061#124053" at line 161, column 25]
----
1<#-- 
2	Se usa para mostrar el detalle de un proyecto 
3 --> 
4  
5 <style> 
6.swiper-container-free-mode>.swiper-wrapper { 
7    transition-timing-function: ease-out; 
8    margin: 0 auto; 
9    width: 1170px; 
10    display: flex; 
11    justify-content: center; 
12
13 </style> 
14 
15<#assign AssetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService")> 
16<#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")> 
17<#assign AssetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")> 
18<#assign AssetVocabularyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService")> 
19<#assign AssetLinkLocalService = serviceLocator.findService("com.liferay.asset.link.service.AssetLinkLocalService")> 
20 
21<#assign statusApproved = 0> 
22<#assign journalArticle = JournalArticleLocalService.fetchLatestArticle(groupId, reserved\-article\-id.data, statusApproved)> 
23<#assign assetEntry = AssetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", journalArticle.getResourcePrimKey())> 
24<#assign categories = AssetCategoryLocalService.getEntryCategories(assetEntry.getEntryId())> 
25 
26<#assign DLFileEntryLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryLocalService")> 
27 
28<#assign DLFileEntryMetadataLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryMetadataLocalService")> 
29 
30<#assign DDMStorageLinkLocalService = serviceLocator.findService("com.liferay.dynamic.data.mapping.service.DDMStorageLinkLocalService")> 
31 
32<#assign DDMContentLocalService = serviceLocator.findService("com.liferay.dynamic.data.mapping.service.DDMContentLocalService")> 
33 
34<#assign currentUrl = themeDisplay.getPortalURL() + themeDisplay.getURLCurrent() /> 
35 
36<#assign allEntries = [] /> 
37 
38<#-- Se añade la home --> 
39<#assign site_default_url = htmlUtil.escape(themeDisplay.getLayout().getGroup().getDisplayURL(themeDisplay, false)) /> 
40<#assign site_name = htmlUtil.escape(themeDisplay.getLayout().getGroup().getDescriptiveName()) /> 
41<#assign allEntries = allEntries + [{'name' : site_name, 'url' : site_default_url }] />	 
42 
43<#-- Se añaden las paginas intermedias --> 
44<#assign entries = themeDisplay.getLayout().getAncestors()?reverse /> 
45<#list entries as itemLayout>  
46	<#assign allEntries = allEntries + [{'name' : itemLayout.getName(locale), 'url' : portalUtil.getLayoutFriendlyURL(itemLayout, themeDisplay) }] />		 
47</#list> 
48 
49<#-- Se añade la propia pagina --> 
50<#assign allEntries = allEntries + [{'name' : titular.getData(), 'url' : currentUrl }] /> 
51 
52<div class="container"> 
53	<div class="breadcrumbs-rrss-container"> 
54		<div class="breadcrumbs-blog">			 
55			<#-- Pinto los elementos del breadcrumb --> 
56			<#assign position = 1>			 
57			<#list allEntries as item>  
58				<#if item?is_last > 
59                    <span>${item.name}</span> 
60                <#else> 
61                    <a href="${item.url}">${item.name}</a>               
62                </#if>				             
63				<#assign position++> 
64			</#list> 
65		</div>         
66		<div class="text-share-rrss text-right"> 
67			<span class="text text-blue hidden-xs hidden-sm">${languageUtil.get(locale, "share")}:</span> 
68			<ul class="share-social js-share-social">				 
69				<li><a class="facebook" href="" onclick="window.open('http://www.facebook.com/sharer.php?u=${currentUrl}', '${titular.getData()}', 'width=600,height=400'); return false;" aria-label="Compartir en Facebook"><span class="icon-sm-facebook"></span></a></li> 
70				<li><a class="twitter" href="" onclick="window.open('https://twitter.com/intent/tweet?text=${titular.getData()}&amp;tw_p=tweetbutton&amp;url=${currentUrl}', '${titular.getData()}', 'width=600,height=400'); return false;" aria-label="Compartir en Twitter"><span class="icon-sm-twitter"></span></a></li> 
71				<li><a class="linkedin" href="" onclick="window.open('http://www.linkedin.com/shareArticle?&amp;title=${titular.getData()}&amp;mini=true&amp;url=${currentUrl}&amp;summary=', '${titular.getData()}', 'width=600,height=400'); return false;" aria-label="Compartir en Linkedin"><span class="icon-sm-linkedin"></span></a></li> 
72			</ul> 
73		</div>  
74	</div>        
75</div> 
76 
77 
78<#-- Imagen de fondo --> 
79<div class="bg-image-detail-info" style="background-image: url('');"></div> 
80 
81 
82<#assign VOC_TIPO = "SACYR_GLOBAL_VOC_TIPO_MULTIMEDIA"> 
83<#assign VOC_TAG = "SACYR_VOC_TAGS"> 
84<#assign STR_PAIS = "SACYR_GLOBAL_STR_PAIS"> 
85 
86<#-- Seccion proyecto --> 
87<div class="container"> 
88    <div class="detail-info detail-info--photos"> 
89        <div class="categories-list"> 
90            <ul> 
91                <#list categories as cat> 
92                    <#assign voc = AssetVocabularyLocalService.getAssetVocabulary(cat.getVocabularyId())> 
93                    <#if voc.getName()?lower_case == VOC_TIPO?lower_case> 
94                        <li>${cat.getTitle(locale)}</li> 
95                        <#break> 
96                    </#if> 
97                </#list> 
98            </ul> 
99        </div> 
100        <#-- Titulo --> 
101        <div class="title"> 
102            ${titular.getData()} 
103        </div> 
104        <div class="subtitle"> 
105            ${subtitular.getData()} 
106        </div> 
107        <div class=""> 
108            <#assign fecha_Data = getterUtil.getString(fecha.getData())> 
109            <#if validator.isNotNull(fecha_Data)> 
110                <#assign fecha_DateObj = dateUtil.parseDate("yyyy-MM-dd", fecha_Data, locale)> 
111                ${dateUtil.getDate(fecha_DateObj, "dd MMM yyyy - HH:mm:ss", locale)} 
112            </#if> 
113        </div> 
114 
115        <#-- Sección 2 --> 
116        <div class="main-content"> 
117            <div class="row"> 
118 
119            </div> 
120        </div> 
121    </div> 
122</div> 
123 
124 
125<#-- Carrusel fotos --> 
126<div class="gallery-slider__container js-gallery-slider"> 
127    <div class="container"> 
128        <div class="swiper-container gallery-slider js-gallery-top"> 
129            <div class="swiper-wrapper"> 
130                <#if documento.getSiblings()?has_content> 
131                    <#list documento.getSiblings() as cur_documento> 
132                       <#assign urlBase = cur_documento.getData()/> 
133 
134 
135                        <div class="swiper-slide"> 
136                            <div class="photo-stream"> 
137                                <img class="image" src="${urlBase}"/> 
138                            </div> 
139                            <#--<div class="photo-caption"> 
140                                <p class="photo-title">Titulo</p> 
141                                <p class="photo-description">Descripcio</p> 
142                            </div> --> 
143                        </div> 
144                    </#list> 
145                </#if> 
146            </div> 
147        </div> 
148</div> 
149 
150        <!-- Add Arrows --> 
151        <div class="gallery-slider-next"></div> 
152        <div class="gallery-slider-prev"></div> 
153        <div class="swiper-container gallery-slider-thumbs js-gallery-thumbs"> 
154            <div class="swiper-wrapper"> 
155                <#if documento.getSiblings()?has_content> 
156                    <#assign counter = 0> 
157                    <#list documento.getSiblings() as cur_documento> 
158                        <#assign urlBase = cur_documento.getData()/> 
159                        <#assign startUid = urlBase?last_index_of("/")+1 /> 
160                        <#assign endUid = urlBase?last_index_of("?")-1 /> 
161                        <#assign uid = urlBase[startUid..endUid]/> 
162                        <#assign doc = DLFileEntryLocalService.fetchDLFileEntryByUuidAndGroupId(uid,groupId)/> 
163                        <#assign dlFileEntry = doc.getDLFileEntryType() > 
164                        <#assign raw = DLFileEntryMetadataLocalService.getFileVersionFileEntryMetadatas(doc.getFileVersion().fileVersionId)> 
165                        <#assign metadata = raw[0]/> 
166                        <#assign stStart = metadata?last_index_of("DDMStructureId")/> 
167                        <#assign stTemp = metadata[stStart..]/> 
168                        <#assign stEnd = stTemp?index_of(",")-1/> 
169                        <#assign ddmStructureId = stTemp[0..stEnd]?split(":")[1]?trim/> 
170 
171                        <div class="swiper-slide slide_${counter}" id="${(counter == 0)?then('active-thumb','')}"> 
172                            <div class="photo-stream"> 
173                                <img src="${urlBase}"/> 
174                            </div> 
175                        </div> 
176                        <#assign counter = counter + 1> 
177                    </#list> 
178                </#if> 
179            </div> 
180        </div> 
181    </div> 
182</div> 
183 
184<div class="container"> 
185    <div class="gallery-actions"> 
186        <div class="row"> 
187            <div class="col-sm-6"> 
188                <button id="downloadImages" class="btn download-btn"> 
189                    <span class="icon icon--jpg"></span>  
190                    <span class="text">${languageUtil.get(locale, "download")}</span> 
191                </button> 
192            </div> 
193            <div class="col-sm-6"> 
194                <#-- Compartir en Redes sociales parte inferior --> 
195                <div class="text-share-rrss"> 
196                    <span class="text text-blue">${languageUtil.get(locale, "share")}:</span> 
197                    <ul class="share-social">				 
198                        <li><a class="facebook" href="" onclick="window.open('http://www.facebook.com/sharer.php?u=${currentUrl}', '${titular.getData()}', 'width=600,height=400'); return false;" aria-label="Compartir en Facebook"><span class="icon-sm-facebook"></span></a></li> 
199                        <li><a class="twitter" href="" onclick="window.open('https://twitter.com/intent/tweet?text=${titular.getData()}&amp;tw_p=tweetbutton&amp;url=${currentUrl}', '${titular.getData()}', 'width=600,height=400'); return false;" aria-label="Compartir en Twitter"><span class="icon-sm-twitter"></span></a></li> 
200                        <li><a class="linkedin" href="" onclick="window.open('http://www.linkedin.com/shareArticle?&amp;title=${titular.getData()}&amp;mini=true&amp;url=${currentUrl}&amp;summary=', '${titular.getData()}', 'width=600,height=400'); return false;" aria-label="Compartir en Linkedin"><span class="icon-sm-linkedin"></span></a></li> 
201                    </ul> 
202                </div>  
203            </div>  
204        </div> 
205    </div> 
206</div> 
207 
208 
209 
210<script> 
211 
212	$('#downloadImages').on( "click", function() { 
213	 
214		var zip = new JSZip();	 
215		 
216		$('.image').each(function( index ) {		   
217		  var imgData = getBase64Image(this); 
218		  var srcArray = this.src.split("/"); 
219		  var name = srcArray[srcArray.length - 2]; 
220		  name = name.replace(/\+/g, " ");		   
221		  zip.file(name, imgData, {base64: true}); 
222		}); 
223															 
224		zip.generateAsync({type:"blob"}) 
225		.then(function(content) {			 
226			saveAs(content, "imagenes.zip"); 
227		}); 
228	}); 
229	 
230	 
231	function getBase64Image(img) { 
232	  var canvas = document.createElement("canvas"); 
233	  canvas.width = img.naturalWidth; 
234	  canvas.height = img.naturalHeight; 
235	  var ctx = canvas.getContext("2d"); 
236	  ctx.drawImage(img, 0, 0); 
237	  var dataURL = canvas.toDataURL("image/png"); 
238	  return dataURL.replace(/^data:image\/(png|jpg);base64,/, ""); 
239
240	 
241</script> 
242 
243<@liferay_util["html-top"] outputKey="htmltop" > 
244    <#-- Pinto el marcado enriquecido para el SEO --> 
245    <#assign position=1> 
246    <script type="application/ld+json"> 
247
248        "@context": "http://schema.org", 
249        "@type": "BreadcrumbList", 
250        "itemListElement": [ 
251        <#list allEntries as item>  
252
253                "@type": "ListItem", 
254                "position": ${position}, 
255                "item": { 
256                    "@id": "${item.url}", 
257                    "name": "${item.name}" 
258
259            <#if position < allEntries?size> 
260            }, 
261            <#else> 
262
263            </#if> 
264            <#assign position=position+1> 
265        </#list> 
266        ]} 
267    </script> 
268</@> 

Este sitio web utiliza cookies propias y de terceros para mejorar la experiencia del usuario y analizar su comportamiento con el fin de mejorar el servicio ofrecido.
Puede consultar información adicional sobre las cookies instaladas en nuestra Política de Cookies.

Configuración de Cookies

Declaración de cookies

TÉCNICAS

Estas cookies se encuentran exceptuadas del cumplimiento del artículo 22.2 de la LSSI de acuerdo con las recomendaciones indicadas por la autoridad europea en materia de privacidad y cookies. De acuerdo con lo anterior y aunque no es posible su configuración, aceptación o denegación, el editor de este sitio web ofrece información sobre las mismas en un ejercicio de transparencia con el usuario.

  • Nombre: LFR_Sesión_STATE_*, Proveedor: Liferay, Propósito: Administra la sesión como usuario registrado, Caducidad: Sesión, Tipo: HTTP

  • Nombre: GUEST_LANGUAGE_ID, Proveedor: Liferay, Propósito: Determina el idioma con el que accede, para mostrar el mismo en la próxima sesión, Caducidad: 1 año, Tipo: HTTP

  • Nombre: ANONYMOUS_USER_ID, Proveedor: Liferay, Propósito: Administra la sesión como usuario no registrado, Caducidad: 1 año, Tipo: HTTP

  • Nombre: COOKIE_SUPPORT, Proveedor: Liferay, Propósito: Identifica que es necesario el uso de cookies para el funcionamiento del portal, Caducidad: 1 año, Tipo: HTTP

  • Nombre: JSessionID, Proveedor: Liferay, Propósito: Administra el inicio de sesión e indica que está usando el sitio, Caducidad: Sesión, Tipo: HTTP

  • Nombre: SACYRGDPR, Proveedor: Sacyr, Propósito: Utilizada para gestionar la política de cookies, Caducidad: Sesión, Tipo: HTTP