Ocorreu um erro ao processar o template.
Java method "as.asac.template.tools.DLToolImpl.getDLFileEntryByPath(String)" threw an exception when invoked on as.asac.template.tools.DLToolImpl object "as.asac.template.tools.DLToolImpl@a8d4437"; see cause exception in the Java stack trace.
----
FTL stack trace ("~" means nesting-related):
- Failed at: #assign dlFileEntry = dlTool.getDLFil... [in template "37703#37743#1558463" at line 242, column 81]
----
1<#-- Services -->
2<#assign assetEntryLocalServiceUtil = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")/>
3<#assign assetLinkLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetLinkLocalService")/>
4<#assign journalArticleResourceServiceUtil = serviceLocator.findService("com.liferay.journal.service.JournalArticleResourceLocalService")/>
5<#assign assetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") />
6<#assign assetVocabularyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService") />
7
8<#-- Reserved vbles -->
9<#assign title = .vars['reserved-article-title'].data>
10<#assign articleId=.vars["reserved-article-id"].data />
11<#assign description=.vars["reserved-article-description"].data />
12<#assign smallImageUrl=.vars["reserved-article-small-image-url"].data />
13<#assign date=.vars["reserved-article-display-date"].data />
14<#assign request = .vars['request']>
15
16<#-- Init -->
17<#assign assetEntry = journalTool.getAssetEntryByArticleId(groupId, articleId)>
18<#assign journalArticle = journalTool.getJournalArticleByAssetEntry(assetEntry)>
19<#assign articleURL = themeDisplay.getURLPortal()+themeDisplay.getURLCurrent()>
20<#assign articleSocialBookmarks = themeDisplay.getThemeSetting("article-social-bookmarks")!>
21<#assign layoutSetBannerPath = layoutTool.getLayoutSetBannerPath(groupId, themeDisplay.getLayout().isPrivateLayout())!>
22<#assign articleMainImageThumbnail3 = dlTool.getThumbnail(smallImageUrl, "3", layoutSetBannerPath)! />
23<#assign articleMainImageThumbnail1 = dlTool.getThumbnail(smallImageUrl, "1")! />
24
25<#assign ddmStructureNameNormalize = "template-${friendlyURLNormalizerTool.normalize(journalArticle.getDDMStructure().getName(localeUtil.getDefault()))}" />
26
27<#function sanitizeURL url>
28 <#if !url?has_content>
29 <#return "" />
30 </#if>
31 <#assign urlTrimmed = url?trim />
32 <#if urlTrimmed?starts_with("javascript:") || urlTrimmed?starts_with("data:") || urlTrimmed?starts_with("vbscript:")>
33 <#return "" />
34 </#if>
35 <#return htmlUtil.escapeHREF(urlTrimmed) />
36</#function>
37
38<#function isExternalURL url>
39 <#if !url?has_content>
40 <#return false />
41 </#if>
42 <#assign portalURLlc = themeDisplay.getPortalURL()?lower_case />
43 <#assign urlLC = url?lower_case />
44 <#assign isHttp = urlLC?starts_with("http://") || urlLC?starts_with("https://") />
45 <#assign isInternal = (url?starts_with("/")) || (isHttp && urlLC?starts_with(portalURLlc)) />
46 <#return isHttp && !isInternal />
47</#function>
48
49<#-- Build -->
50<#if Nombre.data?has_content>
51 <#assign title = Nombre.data>
52</#if>
53<#assign altImgDestacada = title />
54<#if AltImagenDestacada ??>
55 <#if validator.isNotNull(AltImagenDestacada.getData())>
56 <#assign altImgDestacada = AltImagenDestacada.getData() />
57 </#if>
58</#if>
59<#assign articleMainImageThumbnail3Safe = sanitizeURL(articleMainImageThumbnail3) />
60<#assign articleMainImageThumbnail1Safe = sanitizeURL(articleMainImageThumbnail1) />
61
62<#-- Validaciones de TAB -->
63<#assign limitacionPeso = (AsturiasMascotas.LimitacionPeso.data)!"" />
64<#assign NumeroMaximoPersona = (AsturiasMascotas.NumeroMaximoPersona.data)!"" />
65<#assign NumeroMaximoInterior = (AsturiasMascotas.NumeroMaximoInterior.data)!"" />
66<#assign AccesoInterior = (AsturiasMascotas.AccesoInterior.data)!"" />
67<#assign admitePPP = (AsturiasMascotas.AdmitePPP.data)!"" />
68<#assign AccesoTerraza = (AsturiasMascotas.AccesoTerraza.data)!"" />
69<#assign otrasMascotas = (AsturiasMascotas.OtrasMascotas.data)!"" />
70<#assign otrosAnimales = (AsturiasMascotas.OtrosAnimales.data)!"" />
71<#assign detalleNormas = (AsturiasMascotas.DetalleNormas.data)!"" />
72
73<#assign hasIconos = limitacionPeso?has_content || NumeroMaximoPersona?has_content || NumeroMaximoInterior?has_content || AccesoInterior?has_content />
74<#assign hasNormas = admitePPP?has_content || AccesoTerraza?has_content || otrasMascotas?has_content || detalleNormas?has_content />
75
76<article class="template ${ddmStructureNameNormalize}" role="article">
77 <header class="article-header-wrapper row no-gutters">
78 <div class="article-header-container article-header-container-static">
79 <div class="container">
80 <div class="row no-gutters">
81 <div class="col-md-6">
82 <div class="article-image" style="background-image: url('${sanitizeURL(articleMainImageThumbnail3Safe)}')" role="img" aria-label="${altImgDestacada}">
83 <img class="hide-accessible" src="${sanitizeURL(articleMainImageThumbnail3Safe)}" alt=""/>
84 </div>
85 </div>
86 <div class="article-info-wrapper col-md-6">
87 <div class="article-info">
88 <h2 class="article-title" >${title}</h2>
89 <div class="article-list-wrapper">
90 <ul class="article-list list-unstyled article-list-info">
91 <li class="article-list-item mb-4">
92 <span class="fas fa-map-marker-alt" aria-hidden="true"></span>
93 <span class="hide-accessible">${languageUtil.get(request,"location")}</span>
94 <span class="field-wrapper">
95 <#if (Contacto.Concejo.data)!?has_content>
96 <span class="important">${Contacto.Concejo.data}</span>
97 </#if>
98 <#if (Contacto.Zona.data)!?has_content>
99 <span class="text d-block">${Contacto.Zona.data}</span>
100 </#if>
101 </span>
102 </li>
103 <#if (Contacto.Direccion.data)!?has_content || (Contacto.CP.data)!?has_content || (Contacto.Localidad.data)!?has_content>
104 <li class="article-list-item">
105 <span class="far fa-address-card" aria-hidden="true"></span>
106 <span class="hide-accessible">${languageUtil.get(request,"address")}</span>
107 <span class="field-wrapper">
108 <span class="field">${languageUtil.get(request, "address")}:</span>
109 <span class="text">${(Contacto.Direccion.data)!}</span><span aria-hidden="true"> ■ </span>
110 <span class="text">${(Contacto.CP.data)!} - ${(Contacto.Localidad.data)!}</span>
111 </span>
112 </li>
113 </#if>
114
115 <#if (Contacto.Telefono.data)!?has_content>
116 <li class="article-list-item">
117 <span class="fas fa-phone-alt" aria-hidden="true"></span>
118 <span class="hide-accessible">${languageUtil.get(request, "phone")}</span>
119 <span class="field-wrapper">
120 <span class="field">${languageUtil.get(request, "phone")}:</span>
121 <#list Contacto.Telefono.getSiblings() as telephone>
122 <#if telephone.data?has_content>
123 <#assign rawTelefono = telephone.data?trim />
124 <#assign cleanTelefono = rawTelefono?replace("\\(.*?\\)", "", "r") />
125 <#assign numberTelefono = cleanTelefono?replace("[^0-9]", "", "r") />
126 <#assign numberLength = numberTelefono?length />
127 <#if numberLength == 9>
128 <#assign hrefNumber = "+34${numberTelefono}" />
129 <#else>
130 <#assign hrefNumber = numberTelefono />
131 </#if>
132 <span class="text">
133 <a href="tel:${htmlUtil.escapeHREF(hrefNumber)}" aria-label="${languageUtil.format(request, 'call', rawTelefono)}">
134 ${rawTelefono}
135 </a>
136 <#if !telephone?is_last><span aria-hidden="true"> | </span></#if>
137 </span>
138 </#if>
139 </#list>
140 </span>
141 </li>
142 </#if>
143
144 <#if Contacto.Email.getData()?has_content>
145 <li class="article-list-item">
146 <span class="far fa-envelope" aria-hidden="true"></span>
147 <span class="hide-accessible">${languageUtil.get(request,"email")}</span>
148 <span class="field-wrapper">
149 <span class="field">${languageUtil.get(request, "email")}:</span>
150 <span class="text">
151 <#list Contacto.Email.getSiblings() as Item>
152 <#if Item.data?trim?has_content>
153 <#assign emailAddress = Item.data?trim />
154 <a href="mailto:${htmlUtil.escapeHREF(emailAddress)}" aria-label="${languageUtil.format(request,'email-to', emailAddress)}">
155 ${emailAddress}
156 </a>
157 <#if Item_has_next>, </#if>
158 </#if>
159 </#list>
160 </span>
161 </span>
162 </li>
163 </#if>
164
165 <#if Contacto.Web?? && Contacto.Web.getSiblings()?has_content>
166 <#assign hasValidURL = false />
167 <#list Contacto.Web.getSiblings() as web>
168 <#if web.data?trim?has_content>
169 <#assign linkURL = web.data?trim />
170 <#if !linkURL?starts_with("javascript:") && !linkURL?starts_with("data:") && !linkURL?starts_with("vbscript:")>
171 <#assign hasValidURL = true />
172 <#break>
173 </#if>
174 </#if>
175 </#list>
176 <#if hasValidURL>
177 <li class="article-list-item web">
178 <span class="fas fa-link" aria-hidden="true"></span>
179 <span class="field-wrapper d-inline-flex flex-wrap align-items-center gap-2">
180 <span class="field mr-1">${languageUtil.get(request, "site")}:</span>
181 <#assign webCount = 0 />
182 <#list Contacto.Web.getSiblings() as web>
183 <#if web.data?trim?has_content>
184 <#assign linkURL = web.data?trim />
185 <#if !linkURL?starts_with("javascript:") && !linkURL?starts_with("data:") && !linkURL?starts_with("vbscript:")>
186 <#assign webCount = webCount + 1 />
187 </#if>
188 </#if>
189 </#list>
190 <#assign validIndex = 0 />
191 <#list Contacto.Web.getSiblings() as web>
192 <#if web.data?trim?has_content>
193 <#assign linkURL = web.data?trim />
194 <#if !linkURL?starts_with("javascript:") && !linkURL?starts_with("data:") && !linkURL?starts_with("vbscript:")>
195 <#if !stringUtil.startsWith(linkURL, "http://") && !stringUtil.startsWith(linkURL, "https://")>
196 <#assign linkURL = "https://${linkURL}" />
197 </#if>
198 <#assign validIndex = validIndex + 1 />
199 <#assign linkNumber = validIndex />
200 <a href="${htmlUtil.escapeHREF(linkURL)}" target="_blank" rel="noopener noreferrer" aria-label="${languageUtil.get(request, 'site')} ${linkNumber} - ${htmlUtil.escape(title)} (${languageUtil.get(request, 'opens-new-window')})" class="text d-inline-flex align-items-center gap-1 text-nowrap">
201 <#if webCount gt 1>
202 ${languageUtil.get(request, "visit")} ${linkNumber}
203 <#else>
204 ${languageUtil.get(request, "visit")}
205 </#if>
206 <span class="fas fa-external-link-alt ml-1 font-size-08" aria-hidden="true"></span>
207 </a>
208 <#if validIndex lt webCount>
209 <span class="mx-2 text-muted">|</span>
210 </#if>
211 </#if>
212 </#if>
213 </#list>
214 </span>
215 </li>
216 </#if>
217 </#if>
218
219 <#if (Informacion.Horario.data)!?has_content || (Informacion.Tarifas.data)!?has_content>
220 <li class="article-list-item web">
221 <span class="fas fa-clock" aria-hidden="true"></span>
222 <span class="field-wrapper">
223 <span class="field">${languageUtil.get(request, "infoasturias-horarios-y-tarifas")}:</span>
224 <span class="text">
225 <a href="#tabContent2" class="internal-tab-link" data-tab-heading="tabHeading2" data-tab-content="tabContent2" aria-label="${languageUtil.get(request, 'infoasturias-horarios-y-tarifas')}">
226 ${languageUtil.get(request, "view")}
227 <span class="fas fa-caret-right ml-1 font-size-08" aria-hidden="true"></span>
228 </a>
229 </span>
230 </span>
231 </li>
232 </#if>
233 <#if (Informacion.Visit.data)!?has_content>
234 <li class="article-list-item web">
235 <span class="fas fa-door-open" aria-hidden="true"></span>
236 <span class="field-wrapper">
237 <span class="field">${Informacion.Visit.data}</span>
238 </span>
239 </li>
240 </#if>
241 <#if (Descargas.Archivo.data)!?has_content>
242 <#assign dlFileEntry = dlTool.getDLFileEntryByPath(Descargas.Archivo.data) />
243 <#if (dlFileEntry)!?has_content>
244 <#assign ext = dlFileEntry.getExtension()! />
245 <li class="article-list-item document document-${htmlUtil.escape(ext)}">
246 <span class="fas fa-file" aria-hidden="true"></span>
247 <span class="hide-accessible">${languageUtil.get(request,"related-documents")}</span>
248 <span class="field-wrapper">
249 <span class="field">${languageUtil.get(request, "related-documents")}:</span>
250 <span class="text">
251 <#list Descargas.Archivo.getSiblings() as Item>
252 <#if Item.data?has_content>
253 <#assign dlFileEntry = dlTool.getDLFileEntryByPath(Item.data) />
254 <#if validator.isNotNull(dlFileEntry)>
255 <#assign downloadURL = sanitizeURL("/documents/${groupId}/${dlFileEntry.getUuid()}") />
256 <#assign fileSize = dlFileEntry.getSize() />
257 <#assign fileSizeKB = (fileSize / 1024)?round />
258 <#assign fileExt = dlFileEntry.getExtension()?upper_case />
259 <#if Item.ArchivoTitulo.data?has_content>
260 <#assign fileName = Item.ArchivoTitulo.data />
261 <#else>
262 <#assign fileName = dlFileEntry.getTitle() />
263 </#if>
264 <#assign downloadLabel = languageUtil.get(request, 'download') />
265 <#assign formatLabel = languageUtil.get(request, 'format') />
266 <#assign sizeLabel = languageUtil.get(request, 'size') />
267 <#assign kbLabel = languageUtil.get(request, 'kb') />
268 <#assign ariaLabelText = "${downloadLabel} ${fileName}, ${formatLabel} ${fileExt}, ${sizeLabel} ${fileSizeKB} ${kbLabel}" />
269 <a href="${downloadURL}" download aria-label="${ariaLabelText}">
270 ${fileName}
271 <span class="file-info" aria-hidden="true">
272 (${fileExt}, ${fileSizeKB} KB)
273 </span>
274 <span class="fas fa-download ml-1" aria-hidden="true"></span>
275 </a>
276 <#if Item_has_next>, </#if>
277 </#if>
278 </#if>
279 </#list>
280 </span>
281 </span>
282 </li>
283 </#if>
284 </#if>
285 </ul>
286 </div>
287 <#if (RedesSociales.Facebook.data)!?has_content || (RedesSociales.Twitter.data)!?has_content || (RedesSociales.Instagram.data)!?has_content || (RedesSociales.Youtube.data)!?has_content || (RedesSociales.TikTok.data)!?has_content || (RedesSociales.Pinterest.data)!?has_content || (RedesSociales.Rss.data)!?has_content || (RedesSociales.OtrosCanales.NombreCanal.data)!?has_content>
288 <div class="article-socials-wrapper mt-4">
289 <div class="socials-wrapper">
290 <div class="socials">
291 <ul class="list-inline items socials">
292 <#if RedesSociales.Facebook.data?has_content>
293 <#assign linkURLRaw = RedesSociales.Facebook.data?trim />
294 <#if !linkURLRaw?starts_with("http://") && !linkURLRaw?starts_with("https://")>
295 <#assign linkURLRaw = "https://${linkURLRaw}" />
296 </#if>
297 <#assign linkURL = sanitizeURL(linkURLRaw) />
298 <#if linkURL?has_content>
299 <li class="list-inline-item item facebook">
300 <a href="${linkURL}" target="_blank" rel="noopener noreferrer" aria-label="${languageUtil.format(request,'go-to-x','Facebook')} ${languageUtil.get(request,'opens-new-window')}">
301 <span class="fab fa-facebook-f" aria-hidden="true"></span>
302 <span class="hide-accessible">${languageUtil.format(request,'go-to-x','Facebook')}</span>
303 </a>
304 </li>
305 </#if>
306 </#if>
307 <#if RedesSociales.Twitter.data?has_content>
308 <#assign linkURLRaw = RedesSociales.Twitter.data?trim />
309 <#if !linkURLRaw?starts_with("http://") && !linkURLRaw?starts_with("https://")>
310 <#assign linkURLRaw = "https://${linkURLRaw}" />
311 </#if>
312 <#assign linkURL = sanitizeURL(linkURLRaw) />
313 <#if linkURL?has_content>
314 <li class="list-inline-item item twitter">
315 <a href="${linkURL}" target="_blank" rel="noopener noreferrer" aria-label="${languageUtil.format(request,'go-to-x','X (Twitter)')} ${languageUtil.get(request,'opens-new-window')}">
316 <span class="fa-brands fa-x-twitter" aria-hidden="true"></span>
317 <span class="hide-accessible">${languageUtil.format(request,'go-to-x','X (Twitter)')}</span>
318 </a>
319 </li>
320 </#if>
321 </#if>
322 <#if RedesSociales.Instagram.data?has_content>
323 <#assign linkURLRaw = RedesSociales.Instagram.data?trim />
324 <#if !linkURLRaw?starts_with("http://") && !linkURLRaw?starts_with("https://")>
325 <#assign linkURLRaw = "https://${linkURLRaw}" />
326 </#if>
327 <#assign linkURL = sanitizeURL(linkURLRaw) />
328 <#if linkURL?has_content>
329 <li class="list-inline-item item instagram">
330 <a href="${linkURL}" target="_blank" rel="noopener noreferrer" aria-label="${languageUtil.format(request,'go-to-x','Instagram')} ${languageUtil.get(request,'opens-new-window')}">
331 <span class="fab fa-instagram" aria-hidden="true"></span>
332 <span class="hide-accessible">${languageUtil.format(request,'go-to-x','Instagram')}</span>
333 </a>
334 </li>
335 </#if>
336 </#if>
337 <#if RedesSociales.Youtube.data?has_content>
338 <#assign linkURLRaw = RedesSociales.Youtube.data?trim />
339 <#if !linkURLRaw?starts_with("http://") && !linkURLRaw?starts_with("https://")>
340 <#assign linkURLRaw = "https://${linkURLRaw}" />
341 </#if>
342 <#assign linkURL = sanitizeURL(linkURLRaw) />
343 <#if linkURL?has_content>
344 <li class="list-inline-item item youtube">
345 <a href="${linkURL}" target="_blank" rel="noopener noreferrer" aria-label="${languageUtil.format(request,'go-to-x','YouTube')} ${languageUtil.get(request,'opens-new-window')}">
346 <span class="fab fa-youtube" aria-hidden="true"></span>
347 <span class="hide-accessible">${languageUtil.format(request,'go-to-x','YouTube')}</span>
348 </a>
349 </li>
350 </#if>
351 </#if>
352 <#if (RedesSociales.Tiktok.data)!?has_content>
353 <#assign linkURLRaw = RedesSociales.Tiktok.data?trim />
354 <#if !linkURLRaw?starts_with("http://") && !linkURLRaw?starts_with("https://")>
355 <#assign linkURLRaw = "https://${linkURLRaw}" />
356 </#if>
357 <#assign linkURL = sanitizeURL(linkURLRaw) />
358 <#if linkURL?has_content>
359 <li class="list-inline-item item tiktok">
360 <a href="${linkURL}" target="_blank" rel="noopener noreferrer" aria-label="${languageUtil.format(request,'go-to-x','TikTok')} ${languageUtil.get(request,'opens-new-window')}">
361 <span class="fab fa-tiktok" aria-hidden="true"></span>
362 <span class="hide-accessible">${languageUtil.format(request,'go-to-x','TikTok')}</span>
363 </a>
364 </li>
365 </#if>
366 </#if>
367 <#if RedesSociales.Pinterest.data?has_content>
368 <#assign linkURLRaw = RedesSociales.Pinterest.data?trim />
369 <#if !linkURLRaw?starts_with("http://") && !linkURLRaw?starts_with("https://")>
370 <#assign linkURLRaw = "https://${linkURLRaw}" />
371 </#if>
372 <#assign linkURL = sanitizeURL(linkURLRaw) />
373 <#if linkURL?has_content>
374 <li class="list-inline-item item pinterest">
375 <a href="${linkURL}" target="_blank" rel="noopener noreferrer" aria-label="${languageUtil.format(request,'go-to-x','Pinterest')} ${languageUtil.get(request,'opens-new-window')}">
376 <span class="fab fa-pinterest-p" aria-hidden="true"></span>
377 <span class="hide-accessible">${languageUtil.format(request,'go-to-x','Pinterest')}</span>
378 </a>
379 </li>
380 </#if>
381 </#if>
382 <#if RedesSociales.Rss.data?has_content>
383 <#assign linkURLRaw = RedesSociales.Rss.data?trim />
384 <#if !linkURLRaw?starts_with("http://") && !linkURLRaw?starts_with("https://")>
385 <#assign linkURLRaw = "https://${linkURLRaw}" />
386 </#if>
387 <#assign linkURL = sanitizeURL(linkURLRaw) />
388 <#if linkURL?has_content>
389 <li class="list-inline-item item rss">
390 <a href="${linkURL}" target="_blank" rel="noopener noreferrer" aria-label="${languageUtil.format(request,'go-to-x','RSS')} ${languageUtil.get(request,'opens-new-window')}">
391 <span class="fas fa-rss" aria-hidden="true"></span>
392 <span class="hide-accessible">${languageUtil.format(request,'go-to-x','RSS')}</span>
393 </a>
394 </li>
395 </#if>
396 </#if>
397 <#if RedesSociales.OtrosCanales.NombreCanal??>
398 <#list RedesSociales.OtrosCanales.NombreCanal.getSiblings() as Canal>
399 <#if Canal.CanalUrl.data?trim?has_content && Canal.data?trim?has_content>
400 <#assign linkURLRaw = Canal.CanalUrl.data?trim />
401 <#assign canalName = Canal.data?trim />
402 <#if !linkURLRaw?starts_with("http://") && !linkURLRaw?starts_with("https://")>
403 <#assign linkURLRaw = "https://${linkURLRaw}" />
404 </#if>
405 <#assign linkURL = sanitizeURL(linkURLRaw) />
406 <#if linkURL?has_content>
407 <li class="list-inline-item item other-channel">
408 <a href="${linkURL}" target="_blank" rel="noopener noreferrer" aria-label="${languageUtil.format(request,'go-to-x', canalName)} ${languageUtil.get(request,'opens-new-window')}">
409 <span class="fas fa-share-alt" aria-hidden="true"></span>
410 <span class="hide-accessible">${languageUtil.format(request,'go-to-x', canalName)}</span>
411 </a>
412 </li>
413 </#if>
414 </#if>
415 </#list>
416 </#if>
417 </ul>
418 </div>
419 </div>
420 </div>
421 </#if>
422 </div>
423 </div>
424 </div>
425 </div>
426 </div>
427 </header>
428
429 <div class="sheet sheet-lg">
430 <div class="article-section">
431 <#if (Informacion.Titulo.data)!?has_content>
432 <div class="article-great">
433 ${Informacion.Titulo.data}
434 </div>
435 </#if>
436 <#if Contenido?? && Contenido.getSiblings()?has_content>
437 <#list Contenido.getSiblings() as Item>
438 <#-- Extraer datos con protección -->
439 <#assign tituloData = (Item.ContenidoTitulo.data)!"" />
440 <#assign textoData = (Item.ContenidoTexto.data)!"" />
441 <#assign imagenData = (Item.ContenidoTexto.ContentImagen.data)!"" />
442 <#if tituloData?has_content || textoData?has_content || imagenData?has_content>
443 <#assign tipoHeading = (Item.ContenidoTitulo.headingTipo.data)!"" />
444 <#assign cIndex = Item?index + 1 />
445 <section class="article-section-content" aria-label="${languageUtil.get(request, 'content-section')} ${cIndex}">
446 <#if themeDisplay.isSignedIn()>
447 <aside class="portlet-msg-info infoparrafo" role="note" aria-label="${languageUtil.get(request, 'only-administrators-can-use-this-portlet')}">
448 <p class="text-center mb-0">
449 <span class="fas fa-file-signature font-size-10 mr-2" aria-hidden="true"></span>
450 <#assign cIndex = Item?index + 1 />
451 <strong class="important mr-5">Contenido<#if Item?index gt 0> ${cIndex}</#if></strong>
452 <span class="d-inline font-size-09 mt-2">
453 <span class="fas fa-info-circle mr-1" aria-hidden="true"></span>
454 Información visible únicamente para usuarios logueados
455 </span>
456 </p>
457 </aside>
458 </#if>
459 <#if tituloData?has_content>
460 <#if tipoHeading == "h2">
461 <h2 class="h3 text-center mt-6 mb-5">
462 ${tituloData}
463 </h2>
464 <#elseif tipoHeading == "h3">
465 <h3 class="h3 font-weight-semi-bold mt-6 mb-4">
466 ${tituloData}
467 </h3>
468 <#elseif tipoHeading == "h4">
469 <h4 class="h4 font-weight-semi-bold mt-6 mb-4">
470 ${tituloData}
471 </h4>
472 <#else>
473 <div class="h4 font-weight-normal mt-6 mb-4">
474 ${tituloData}
475 </div>
476 </#if>
477 </#if>
478 <div class="article-section-info">
479 <#if Item.ContenidoTexto?? && Item.ContenidoTexto.getSiblings()?has_content>
480 <#list Item.ContenidoTexto.getSiblings() as secc>
481 <#assign seccionTexto = (secc.data)!"" />
482 <#if seccionTexto?has_content>
483 ${seccionTexto}
484 </#if>
485 <#assign imagenPath = (secc.ContentImagen.data)!"" />
486 <#if imagenPath?has_content>
487 <#assign imagenURL = sanitizeURL(dlTool.getThumbnail(imagenPath, '3')) />
488 <#if imagenURL?has_content>
489 <#assign imgAlt = (secc.ContentImagen.AltImage.data)!"" />
490 <#assign imgTitle = (secc.ContentImagen.TitleImage.data)!"" />
491 <#assign imgPie = (secc.ContentImagen.PieImage.data)!"" />
492 <#assign altText = imgAlt />
493 <#if !altText?has_content && imgTitle?has_content>
494 <#assign altText = imgTitle />
495 </#if>
496 <#if !altText?has_content && imgPie?has_content>
497 <#assign altText = htmlUtil.extractText(imgPie)?trim />
498 </#if>
499 <#if !altText?has_content>
500 <#assign altText = "${languageUtil.get(request, 'image')} ${cIndex}" />
501 </#if>
502 <div class="article-section-image-wrapper">
503 <div class="article-section-image">
504 <img src="${imagenURL}" class="rounded" alt="${htmlUtil.escape(altText)}" <#if imgTitle?has_content>title="${htmlUtil.escape(imgTitle)}"</#if> loading="lazy" />
505 <#if imgPie?has_content>
506 <div class="article-section-image-footer">
507 ${imgPie}
508 </div>
509 </#if>
510 </div>
511 </div>
512 </#if>
513 </#if>
514 </#list>
515 </#if>
516 </div>
517 </section>
518 </#if>
519 </#list>
520 </#if>
521 </div>
522
523 <#assign hasTab1 = ((Informacion.Texto.data)!)?has_content>
524 <#assign hasTab2 = ((Informacion.Horario.data)!)?has_content || ((Informacion.Tarifas.data)!)?has_content />
525 <#assign hasTab3 = ((Reservas.CompraEntradas.data)!)?has_content || ((Reservas.ReservasPhone.data)!)?has_content || ((Reservas.ReservasEmail.data)!)?has_content || ((Reservas.ReservasWhatsapp.data)!)?has_content>
526 <#assign hasTab4 = ((AsturiasMascotas.LimitacionPeso.data)!)?has_content>
527 <#assign hasTab5 = ((Geolocalizacion.Coordenadas.data)!)?has_content>
528 <#assign showFirstTab = true>
529 <div class="article-accordion accordion">
530 <#if Visualizador.Slide.getData()?has_content>
531 <h3 class="h3">${languageUtil.get(locale,"model.resource.com.liferay.portlet.imagegallery")}</h3>
532 <div class="slick article-slick article-section <#if Visualizador.Slide.getSiblings()?size==1>hide</#if>">
533 <#list Visualizador.Slide.getSiblings() as Slide>
534 <#if validator.isNotNull(Slide.getData()) || validator.isNotNull(Slide.SlideUrl.getData())>
535 <#assign slideThumbnail3 = dlTool.getThumbnailByJSON(Slide.data, "3")! />
536 <#assign slideThumbnail2Raw = dlTool.getThumbnailByJSON(Slide.data, "2")! />
537 <#assign slidePathRaw = dlTool.getPathByJSON(Slide.data, themeDisplay.getScopeGroupId())! />
538 <#assign slideUrlRaw = Slide.SlideUrl.data />
539 <#if slideUrlRaw?has_content>
540 <#assign slideTitleRaw = "${languageUtil.get(request, 'video')} ${Slide?index}" />
541 <#if Slide.SlideTitulo.data?has_content>
542 <#assign slideTitleRaw = Slide.SlideTitulo.data />
543 </#if>
544 <#assign slideUrl = stringUtil.replace(slideUrlRaw, 'watch?v=', 'embed/') />
545 <#assign slideThumbnail2Raw = stringUtil.replace(slideUrl, 'www', 'img') />
546 <#assign slideThumbnail2Raw = stringUtil.replace(slideThumbnail2Raw, 'embed', 'vi') />
547 <#assign slideThumbnail2Raw = '${slideThumbnail2Raw}/mqdefault.jpg' />
548 <#if slideUrl?contains("vimeo")>
549 <#assign slideUrl = stringUtil.replace(slideUrl, 'http://vimeo.com/', 'https://player.vimeo.com/video/') />
550 <#assign slideVimeoId = stringUtil.extractLast(slideUrl, 'https://player.vimeo.com/video/') />
551 <#if slideVimeoId?has_content>
552 <#assign slideVimeoJsonPath = 'http://vimeo.com/api/v2/video/${slideVimeoId}.json' />
553 <#assign slideVimeoJsonContent = getUrlContent.getContent(slideVimeoJsonPath)! />
554 <#if slideVimeoJsonContent?has_content>
555 <#assign slideVimeoJsonArray = jsonFactoryUtil.createJSONArray(slideVimeoJsonContent) />
556 <#assign slideVimeoJsonItem = slideVimeoJsonArray.get(0) />
557 <#assign slideThumbnail2Raw = slideVimeoJsonItem.thumbnail_medium />
558 </#if>
559 </#if>
560 </#if>
561 <#assign slideUrlSafe = sanitizeURL(slideUrl) />
562 <#assign slideThumbnail2Safe = sanitizeURL(slideThumbnail2Raw) />
563 <#assign slideTitle = htmlUtil.escape(slideTitleRaw) />
564 <#if slideUrlSafe?has_content && slideThumbnail2Safe?has_content>
565 <div id="slide-${Slide?index}" class="slide">
566 <a class="card card-simple card-video" href="#" role="button" tabindex="0" onclick="event.preventDefault(); showDialogIframe('${slideUrlSafe}', '${slideTitle}', 800, 600, 'videoPopup', 'videoPopupIframe'); return false;" aria-label="${languageUtil.format(request, 'open-video-x', slideTitle)}">
567 <span class="d-block image-wrapper aspect-ratio-bg-cover aspect-ratio-4-to-3" style="background-image: url('${slideThumbnail2Safe}')" role="img" aria-label="${slideTitle}">
568 <img class="hide-accessible" src="${slideThumbnail2Safe}" alt="" />
569 </span>
570 </a>
571 </div>
572 </#if>
573 <#else>
574 <#assign slideTitleRaw = "${languageUtil.get(request, 'image')} ${Slide?index}" />
575 <#if Slide.SlideTitulo.data?has_content>
576 <#assign slideTitleRaw = Slide.SlideTitulo.data />
577 </#if>
578
579 <#assign slideAltRaw = slideTitleRaw />
580 <#if Slide.ImagenAlt??>
581 <#if Slide.ImagenAlt.data?has_content>
582 <#assign slideAltRaw = Slide.ImagenAlt.data />
583 </#if>
584 </#if>
585 <#assign slidePath = sanitizeURL(slidePathRaw) />
586 <#assign slideThumbnail2Safe = sanitizeURL(slideThumbnail2Raw) />
587 <#assign slideTitle = htmlUtil.escape(slideTitleRaw) />
588 <#assign slideAlt = htmlUtil.escape(slideAltRaw) />
589 <#if slidePath?has_content && slideThumbnail2Safe?has_content>
590 <div class="slide">
591 <a class="card card-simple lightbox" href="${slidePath}" title="${slideTitle}" aria-label="${languageUtil.format(request, 'view-image-x', slideTitle)}">
592 <span class="d-block image-wrapper aspect-ratio-bg-cover aspect-ratio-4-to-3" style="background-image: url('${slideThumbnail2Safe}')" role="img" aria-label="${slideAlt}">
593 <img class="hide-accessible" src="${slideThumbnail2Safe}" alt="" />
594 </span>
595 </a>
596 </div>
597 </#if>
598 </#if>
599 </#if>
600 </#list>
601 </div>
602 </#if>
603
604 <#if hasTab1>
605 <div id="tab1" class="article-section accordion-item">
606 <a href="#tabContent1" id="tabHeading1" class="tab <#if !showFirstTab>collapsed</#if>" role="button" tabindex="0" aria-expanded="${showFirstTab?c}" aria-controls="tabContent1" data-toggle="liferay-collapse">
607 <h3 class="h3 accordion-header">${languageUtil.get(request,'info')}</h3>
608 </a>
609 <div id="tabContent1" class="article-section-content article-section-info accordion-collapse collapse <#if showFirstTab>show</#if>" role="region" aria-labelledby="tabHeading1">
610 <#if (Informacion.Texto.data)!?has_content>
611 ${Informacion.Texto.data}
612 </#if>
613 <#if (Informacion.FechaDeConstruccion.data)!?has_content>
614 <span class="field">${languageUtil.get(request, "infoasturias-fecha-de-construccion")}:</span>
615 <span class="text">${Informacion.FechaDeConstruccion.data}</span>
616 </#if>
617 </div>
618 </div>
619 <#assign showFirstTab = false>
620 </#if>
621
622 <#if hasTab2>
623 <div id="tab2" class="article-section accordion-item">
624 <a href="#tabContent2" id="tabHeading2" class="tab <#if !showFirstTab>collapsed</#if>" role="button" tabindex="0" aria-expanded="${showFirstTab?c}" aria-controls="tabContent2" data-toggle="liferay-collapse">
625 <h3 class="h3 accordion-header">${languageUtil.get(request,'infoasturias-horarios-y-tarifas')}</h3>
626 </a>
627 <div id="tabContent2" class="article-section-content article-section-color article-section-background accordion-collapse collapse <#if showFirstTab>show</#if>" role="region" aria-labelledby="tabHeading2">
628 <#if (Informacion.Horario.data)!?has_content>
629 <div class="mb-1 font-weight-semi-bold text-success"><span class="far fa-clock mr-2 text-success"></span>${languageUtil.get(request,'infoasturias-horario')}:</div>
630 <div class="mb-4">${Informacion.Horario.data}</div>
631 </#if>
632 <#if (Informacion.Tarifas.data)!?has_content>
633 <div class="mb-1 font-weight-semi-bold text-success"><span class="fas fa-coins mr-2 text-success"></span>${languageUtil.get(request,'infoasturias-tarifas')}:</div>
634 <div>${Informacion.Tarifas.data}</div>
635 </#if>
636 <#if (Informacion.Horario.data)!?has_content || (Informacion.Tarifas.data)!?has_content>
637 <#assign hasWeb = Contacto.Web.data?trim?has_content />
638 <#assign hasTelefono = Contacto.Telefono.data?trim?has_content />
639 <#if hasWeb || hasTelefono>
640 <div class="mt-4 font-size-09 font-italic">
641 <#if hasWeb>
642 ${languageUtil.get(request, 'infoasturias-horarios-web')}
643 <#assign siteURLRaw = Contacto.Web.data?trim />
644 <#if !siteURLRaw?starts_with("http://") && !siteURLRaw?starts_with("https://")>
645 <#assign siteURLRaw = "https://${siteURLRaw}" />
646 </#if>
647 <#assign siteURL = sanitizeURL(siteURLRaw) />
648 <#if siteURL?has_content>
649 <#assign isExternal = isExternalURL(siteURL) />
650 <a href="${siteURL}" <#if isExternal>target="_blank" rel="noopener noreferrer"</#if> aria-label="${languageUtil.get(request, 'site')} - ${title} <#if isExternal>${languageUtil.get(request, 'opens-new-window')}</#if>">
651 ${languageUtil.get(request,'visit')}
652 <#if isExternal>
653 <span class="fas fa-external-link-alt ml-1 font-size-08" aria-hidden="true"></span>
654 </#if>
655 </a>
656 </#if>
657 <#elseif hasTelefono>
658 ${languageUtil.get(request, 'infoasturias-horarios-telefono')}
659 <#list Contacto.Telefono.getSiblings() as telephone>
660 <#assign rawTelefono = telephone.data />
661 <#assign cleanTelefono = rawTelefono?replace("\\(.*?\\)", "", "r") />
662 <#assign numberTelefono = cleanTelefono?replace("[^0-9]", "", "r") />
663 <#assign numberLength = numberTelefono?length />
664 <#if numberLength == 9>
665 <#assign hrefNumber = "+34${numberTelefono}" />
666 <#else>
667 <#assign hrefNumber = numberTelefono />
668 </#if>
669 <span class="text">
670 <a href="tel:${hrefNumber}">${rawTelefono}</a>
671 <#if !telephone?is_last>|</#if>
672 </span>
673 </#list>
674 </#if>
675 </div>
676 </#if>
677 </#if>
678 </div>
679 </div>
680 <#assign showFirstTab = false>
681 </#if>
682
683 <#if hasTab3>
684 <#if (Reservas.CompraEntradas.data)!?has_content || (Reservas.ReservasPhone.data)!?has_content || (Reservas.ReservasEmail.data)!?has_content || (Reservas.ReservasWhatsapp.data)!?has_content>
685 <div id="tab3" class="article-section accordion-item">
686 <a href="#tabContent3" id="tabHeading3" class="tab <#if !showFirstTab>collapsed</#if>" role="button" tabindex="0" aria-expanded="${showFirstTab?c}" aria-controls="tabContent3"
687 data-toggle="liferay-collapse">
688 <h3 class="h3 accordion-header">${languageUtil.get(request,'booking-action')}</h3>
689 </a>
690 <div id="tabContent3" class="article-section-content article-section-color article-section-background accordion-collapse collapse <#if showFirstTab>show</#if>" aria-labelledby="tabHeading3" role="region">
691 <#if (Reservas.CompraEntradas.data)!?has_content>
692 <#assign compraURL = sanitizeURL(Reservas.CompraEntradas.data?trim) />
693 <#if compraURL?has_content>
694 <div class="text-center">
695 <a class="btn btn-primary mb-3" href="${compraURL}" target="_blank" rel="noopener noreferrer" aria-label="${languageUtil.get(request,'infoasturias-compra-entradas')} ${languageUtil.get(request,'opens-new-window')}">
696 <span class="fas fa-ticket-alt mr-2" aria-hidden="true"></span>
697 ${languageUtil.get(request,'infoasturias-compra-entradas')}
698 </a>
699 </div>
700 </#if>
701 </#if>
702 <#if (Reservas.ReservasPhone.data)!?has_content>
703 <#assign rawTelefono = Reservas.ReservasPhone.data?trim />
704 <#assign cleanTelefono = rawTelefono?replace("\\(.*?\\)", "", "r") />
705 <#assign numberTelefono = cleanTelefono?replace("[^0-9]", "", "r") />
706 <#assign numberLength = numberTelefono?length />
707 <#if numberLength == 9>
708 <#assign hrefNumber = "+34${numberTelefono}" />
709 <#else>
710 <#assign hrefNumber = numberTelefono />
711 </#if>
712 <div class="text-center">
713 <a class="btn btn-primary mb-3" href="tel:${htmlUtil.escapeHREF(hrefNumber)}" aria-label="${languageUtil.format(request,'call', rawTelefono)}">
714 <span class="fas fa-phone-alt mr-2" aria-hidden="true"></span>
715 ${languageUtil.get(request,'infoasturias-telefono')}
716 </a>
717 </div>
718 </#if>
719 <#if (Reservas.ReservasEmail.data)!?has_content>
720 <#assign emailAddress = Reservas.ReservasEmail.data?trim />
721 <div class="text-center">
722 <a class="btn btn-primary mb-3" href="mailto:${htmlUtil.escapeHREF(emailAddress)}" aria-label="${languageUtil.format(request,'email-to', emailAddress)}">
723 <span class="fas fa-envelope mr-2" aria-hidden="true"></span>
724 ${languageUtil.get(request,'infoasturias-email')}
725 </a>
726 </div>
727 </#if>
728 <#if (Reservas.ReservasWhatsapp.data)!?has_content>
729 <#assign rawWhatsapp = Reservas.ReservasWhatsapp.data?trim />
730 <#assign cleanWhatsapp = rawWhatsapp?replace("[^0-9]", "", "r") />
731 <#if cleanWhatsapp?has_content>
732 <#assign whatsappURL = "https://wa.me/34${cleanWhatsapp}" />
733 <#assign whatsappURLSafe = sanitizeURL(whatsappURL) />
734 <#if whatsappURLSafe?has_content>
735 <div class="text-center">
736 <a class="btn btn-primary mb-3" href="${whatsappURLSafe}" target="_blank" rel="noopener noreferrer" aria-label="${languageUtil.format(request,'go-to-x', rawWhatsapp)} ${languageUtil.get(request,'opens-new-window')}">
737 <span class="fab fa-whatsapp mr-2" aria-hidden="true"></span>
738 Whatsapp
739 </a>
740 </div>
741 </#if>
742 </#if>
743 </#if>
744 </div>
745 </div>
746 </#if>
747 <#assign showFirstTab = false />
748 </#if>
749
750 <#if hasTab4>
751 <div id="tab4" class="article-section accordion-item">
752 <a href="#tabContent4" id="tabHeading4" class="tab <#if !showFirstTab>collapsed</#if>" role="button" tabindex="0" aria-expanded="${showFirstTab?c}" aria-controls="tabContent4" data-toggle="liferay-collapse">
753 <h3 class="h3 accordion-header">${languageUtil.get(request,'infoasturias-info-mascotas')}</h3>
754 </a>
755 <div id="tabContent4" class="article-section-content article-section-color article-section-background accordion-collapse collapse <#if showFirstTab>show</#if>" aria-labelledby="tabHeading4" role="region">
756 <#if hasIconos>
757 <div class="list-iconos mb-3 d-flex flex-wrap justify-content-center">
758 <#if limitacionPeso?has_content>
759 <div class="col-xl-2 col-sm-6 col-12 text-center mb-4 icono">
760 <#assign imgArray = assetCategoryTool.getImagesByVocabularyCategoryName(groupId, "Mascotas", "Limitación de tamaño") />
761 <#if imgArray?has_content && imgArray[0]?has_content>
762 <div>
763 <img src="${imgArray[0]}" alt="${languageUtil.get(request,'infoasturias-mascotas-peso')}" loading="lazy">
764 <span class="value">${limitacionPeso}</span>
765 </div>
766 <span class="text-value">${languageUtil.get(request,'infoasturias-mascotas-peso')}</span>
767 </#if>
768 </div>
769 </#if>
770 <#if NumeroMaximoPersona?has_content>
771 <div class="col-xl-2 col-sm-6 col-12 text-center mb-4 icono">
772 <#assign imgArray = assetCategoryTool.getImagesByVocabularyCategoryName(groupId, "Mascotas", "Número máximo de perros por persona") />
773 <#if imgArray?has_content && imgArray[0]?has_content>
774 <div>
775 <img src="${imgArray[0]}" alt="${languageUtil.get(request,'infoasturias-mascotas-maximo-persona')}" loading="lazy">
776 <span class="value-icono">${NumeroMaximoPersona}</span>
777 </div>
778 <span class="text-value">${languageUtil.get(request,'infoasturias-mascotas-maximo-persona')}</span>
779 </#if>
780 </div>
781 </#if>
782 <#if NumeroMaximoPersona?has_content>
783 <div class="col-xl-2 col-sm-6 col-12 text-center mb-4 icono">
784 <#assign imgArray = assetCategoryTool.getImagesByVocabularyCategoryName(groupId, "Mascotas", "Cupo máximo de perros en el interior") />
785 <#if imgArray?has_content && imgArray[0]?has_content>
786 <div>
787 <img src="${imgArray[0]}" alt="${languageUtil.get(request,'infoasturias-mascotas-maximo-persona')}" loading="lazy">
788 <span class="value-icono">${NumeroMaximoPersona}</span>
789 </div>
790 <span class="text-value">${languageUtil.get(request,'infoasturias-maximo-interior')}</span>
791 </#if>
792 </div>
793 </#if>
794 <#if AccesoInterior?has_content>
795 <div class="col-xl-2 col-sm-6 col-12 text-center mb-4 icono">
796 <#if AccesoInterior == "Si">
797 <#assign imgArray = assetCategoryTool.getImagesByVocabularyCategoryName(groupId, "Mascotas", "Accesso al interior") />
798 <#if imgArray?has_content && imgArray[0]?has_content>
799 <div><img src="${imgArray[0]}" alt="${languageUtil.get(request,'infoasturias-mascotas-material')}" loading="lazy"></div>
800 <span class="text-value">${languageUtil.get(request,'infoasturias-mascotas-interior')}</span>
801 </#if>
802 <#else>
803 <#assign imgArray = assetCategoryTool.getImagesByVocabularyCategoryName(groupId, "Mascotas", "Sin acceso interior") />
804 <#if imgArray?has_content && imgArray[0]?has_content>
805 <div><img src="${imgArray[0]}" alt="${languageUtil.get(request,'infoasturias-mascotas-no-material')}" loading="lazy"></div>
806 <span class="text-value">${languageUtil.get(request,'infoasturias-mascotas-no-interior')}</span>
807 </#if>
808 </#if>
809 </div>
810 </#if>
811 </div>
812 </#if>
813 <#if hasNormas>
814 <div class="article-info-table mb-2">
815 <div class="normas-mascotas">
816 <h4 class="mb-4 text-success text-center article-info-border">
817 ${languageUtil.get(request,'infoasturias-normas-mascotas')}
818 </h4>
819 <ul class="list-unstyled" role="list">
820 <#if admitePPP?has_content>
821 <li class="d-flex align-items-start mb-2">
822 <span class="fas fa-paw text-success mr-2 mt-1 flex-shrink-0" aria-hidden="true"></span>
823 <span class="text-rule">
824 <#if admitePPP == "Si">
825 ${languageUtil.get(request,'infoasturias-mascotas-ppp')}.
826 <#else>
827 ${languageUtil.get(request,'infoasturias-mascotas-no-ppp')}.
828 </#if>
829 </span>
830 </li>
831 </#if>
832 <#if AccesoTerraza?has_content>
833 <li class="d-flex align-items-start mb-2">
834 <span class="fas fa-paw text-success mr-2 mt-1 flex-shrink-0" aria-hidden="true"></span>
835 <span class="text-rule">
836 <#if AccesoTerraza == "Si">
837 ${languageUtil.get(request,'infoasturias-mascotas-terraza')}.
838 <#else>
839 ${languageUtil.get(request,'infoasturias-mascotas-no-terraza')}.
840 </#if>
841 </span>
842 </li>
843 </#if>
844 <#if otrasMascotas?has_content>
845 <li class="d-flex align-items-start mb-2">
846 <span class="fas fa-paw text-success mr-2 mt-1 flex-shrink-0" aria-hidden="true"></span>
847 <span class="text-rule">
848 <#if otrasMascotas == "Si">
849 ${languageUtil.get(request,'infoasturias-otras-mascotas')}:
850 <#if otrosAnimales?has_content>
851 <strong>${otrosAnimales}</strong>
852 </#if>
853 <#else>
854 ${languageUtil.get(request,'infoasturias-no-otras-mascotas')}.
855 </#if>
856 </span>
857 </li>
858 </#if>
859 <#if detalleNormas?has_content>
860 <#assign normasParagraphs = detalleNormas?split('</p>') />
861 <#list normasParagraphs as parrafo>
862 <#if parrafo?trim?has_content>
863 <#assign cleanParrafo = parrafo?replace('<p>', '')?replace('<p[^>]*>', '', 'r')?trim />
864 <#if cleanParrafo?has_content>
865 <li class="d-flex align-items-start mb-2">
866 <span class="fas fa-paw text-success mr-2 mt-1 flex-shrink-0" aria-hidden="true"></span>
867 <span class="text-rule">${cleanParrafo}</span>
868 </li>
869 </#if>
870 </#if>
871 </#list>
872 </#if>
873 </ul>
874 </div>
875 </div>
876 </#if>
877 </div>
878 <#assign showFirstTab = false>
879 </div>
880 </#if>
881 <#if hasTab5>
882 <#assign coordenadas=stringUtil.split(Geolocalizacion.Coordenadas.data) />
883 <div id="tab5" class="article-section article-section-map accordion-item">
884 <a href="#tabContent5" id="tabHeading5" class="tab <#if !showFirstTab>collapsed</#if>" role="button" tabindex="0" aria-expanded="${showFirstTab?c}" aria-controls="tabContent5" data-toggle="liferay-collapse">
885 <h3 class="h3 accordion-header">${languageUtil.get(request,'infoasturias-how-to-get')}</h3>
886 </a>
887 <div id="tabContent5" class="article-section-content accordion-collapse collapse <#if showFirstTab>show</#if>" aria-labelledby="tabHeading5" role="region">
888 <div id="article-map-wrapper-${articleId}" class="article-map-wrapper">
889 <div id="article-map-content-${articleId}" style="width: 100%; height: 500px; z-index:1" role="application" aria-label="${languageUtil.format(request,'infoasturias-mapa-de', title)}"><!-- MAP --></div>
890 <div class="hide-accessible" aria-live="polite">
891 <p>${languageUtil.get(request,'first-name')}: ${title}</p>
892 <p>GPS: ${Geolocalizacion.Coordenadas.data}</p>
893 <#if (Contacto.Direccion.data)?has_content || ((Contacto.CP.data)?has_content) || ((Contacto.Localidad.data)?has_content)>
894 <p>${languageUtil.get(request,'address')}: ${((Contacto.Direccion.data)!)?js_string} ■ ${((Contacto.CP.data)!)} - ${((Contacto.Localidad.data)!)?js_string}</p>
895 </#if>
896 </div>
897 <div class="article-map-form">
898 <div class="name important">${title}</div>
899 <div class="gps"><span class="label">GPS:</span> <span class="value important">${Geolocalizacion.Coordenadas.data}</span></div>
900 <form action="https://maps.google.es/maps" method="get" target="_blank">
901 <input type="hidden" name="daddr" value="${coordenadas[0]},${coordenadas[1]}">
902 <label for="saddrText"><span class="label hide-accessible">${languageUtil.get(request,'infoasturias-insert-from')}: </span></label>
903 <label for="saddr"><span class="label">${languageUtil.get(request,'infoasturias-from')}: </span></label>
904 <input class="form-control" type="text" maxlength="40" name="saddrText" id="saddrText" value="" placeholder="${languageUtil.get(request,'infoasturias-insert-from')}">
905 <input class="form-control" type="hidden" name="saddr" id="saddr" value="" placeholder="${languageUtil.get(request,'infoasturias-insert-from')}">
906 <button class="btn btn-text" type="submit">${languageUtil.get(request,'infoasturias-como-llegar')} »</button>
907 </form>
908 </div>
909 </div>
910 <script src="/o/turismo-asturias-theme/js/leaflet/leaflet.js"></script>
911 <script type="text/javascript">
912 AUI().ready('aui-base', function(A){
913 var lat = ${coordenadas[0]},
914 lng = ${coordenadas[1]},
915 zoom = 16;
916 mapContent = new L.map('article-map-content-${articleId}', {center: [lat, lng], zoom: 16});
917
918 //Marker
919 var defaultIconTheme = '/o/turismo-asturias-theme/css/images/icons/mark-box.png';
920 var defaultIcon = L.icon({
921 iconUrl: defaultIconTheme,
922 iconSize: [36, 53],
923 iconAnchor: [18, 53],
924 iconShadow: [0,0],
925 popupAnchor: [0, -30]
926 });
927 var marker = L.marker([lat, lng], {icon: defaultIcon}).addTo(mapContent);
928
929 var contentString = '<div class="row">';
930 contentString += '<div class="col-12">';
931 contentString += '<div class="h4">${htmlUtil.escape(title)}</div>';
932 contentString += '</div>';
933 contentString += '</div>';
934
935 contentString += '<div class="row">';
936 contentString += '<div class="col-12">';
937 <#if validator.isNotNull(articleMainImageThumbnail1Safe)>
938 contentString += '<img class="pull-right mb-2 ml-2" src="${articleMainImageThumbnail1Safe}" alt="$title"/>';
939 </#if>
940 contentString += '<dl class="mb-0">';
941 <#if (Contacto.Direccion.data)?has_content || ((Contacto.CP.data)?has_content) || ((Contacto.Localidad.data)?has_content)>
942 contentString += '<dt class="important">${languageUtil.get(request,"address")}</dt>';
943 contentString += '<dd>${((Contacto.Direccion.data)!)?js_string}<br>${((Contacto.CP.data)!)} - ${((Contacto.Localidad.data)!)?js_string}</dd>';
944 </#if>
945 <#if Contacto.Telefono.data?has_content>
946 contentString += '<dt class="important">${languageUtil.get(request,'phone')}</dt>';
947 contentString += '<dd>${Contacto.Telefono.data}</dd>';
948 </#if>
949 <#if Contacto.Email.getData()?has_content>
950 contentString += '<dt class="important">${languageUtil.get(request,'email')}</dt>';
951 <#list Contacto.Email.getSiblings() as Item>
952 contentString += '<dd><a href="mailto:${Item.data}" title="${languageUtil.format(request,'go-to-x', 'email')}">${Item.data}</a></dd>';
953 </#list>
954 </#if>
955 <#if Contacto.Web.data?has_content>
956 <#assign linkURL = Contacto.Web.data/>
957 <#if !stringUtil.startsWith(linkURL, "http")>
958 <#assign linkURL = "https://${Contacto.Web.data}"/>
959 </#if>
960 contentString += '<dt class="important">${languageUtil.get(request,'site')}</dt>';
961 contentString += '<dd><a href="${linkURL}" title="${languageUtil.format(request,'go-to-x', 'site')}">${Contacto.Web.data}</a></dd>';
962 </#if>
963 contentString += '</dl>';
964 contentString += '</div>';
965 contentString += '</div>';
966 <#if validator.isNotNull(description)>
967 contentString += '<div class="row"><div class="col-12">${description}</div></div>';
968 </#if>
969 marker.bindPopup(contentString);
970
971 //Contributor
972 L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
973 attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors.'
974 }).addTo(mapContent);
975
976 }); //AUI.ready
977 </script>
978 </div>
979 </div>
980 <#assign showFirstTab = false>
981 </#if>
982 </div>
983 <#if (Informacion.Observaciones.data)!?has_content || (Contacto.MasInformacion.data)!?has_content>
984 <div class="article-border">
985 <#if (Informacion.Observaciones.data)!?has_content>
986 <div class="observations mb-3">
987 ${Informacion.Observaciones.data}
988 </div>
989 </#if>
990 <#if (Contacto.MasInformacion.data)!?has_content>
991 <div class="more-info">
992 <#list Contacto.MasInformacion.getSiblings() as Item>
993 <#if Item.data?trim?has_content>
994 <#assign itemData = Item.data?trim />
995 <#if itemData?matches("^https?://.*") || itemData?starts_with("//")>
996 <#assign itemURL = itemData />
997 <#if itemURL?starts_with("//")>
998 <#assign itemURL = "https:${itemURL}" />
999 </#if>
1000 <#assign itemURLSafe = sanitizeURL(itemURL) />
1001 <#if itemURLSafe?has_content>
1002 <#assign isExternal = isExternalURL(itemURLSafe) />
1003 <div class="mb-2">
1004 <a class="link" href="${itemURLSafe}" <#if isExternal>target="_blank" rel="noopener noreferrer"</#if> aria-label="${languageUtil.format(request,'visit-link-x', itemData)} <#if isExternal>${languageUtil.get(request,'opens-new-window')}</#if>">
1005 ${itemData}
1006 <#if isExternal>
1007 <span class="fas fa-external-link-alt ml-1" aria-hidden="true"></span>
1008 </#if>
1009 </a>
1010 </div>
1011 </#if>
1012 <#else>
1013 <div class="mb-2">
1014 <span>${itemData}</span>
1015 </div>
1016 </#if>
1017 </#if>
1018 </#list>
1019 </div>
1020 </#if>
1021 </div>
1022 </#if>
1023 </div>
1024
1025 <#-- Related Articles -->
1026 <#assign relatedJournalArticles = assetTool.getRelatedJournalArticlesApproved(assetEntry) />
1027 <#if validator.isNotNull(relatedJournalArticles) && relatedJournalArticles?size gt 0>
1028 <div class="article-related portlet-background-grey-container">
1029 <div class="container">
1030 <h3 class="title-section">${languageUtil.get(request,'related-assets')}</h3>
1031 <div class="slick article-related-slick">
1032 <#list relatedJournalArticles as currentJournalArticle>
1033 <#assign viewURLRaw = journalTool.getDisplayPage(currentJournalArticle, themeDisplay, true) />
1034 <#assign viewURL = sanitizeURL(viewURLRaw) />
1035 <#assign articleTitle = currentJournalArticle.getTitle(locale) />
1036 <#assign smallImageURLRaw = currentJournalArticle.getSmallImageURL() />
1037 <#assign smallImageURL = sanitizeURL(smallImageURLRaw) />
1038 <#if viewURL?has_content && smallImageURL?has_content && articleTitle?has_content>
1039 <div class="slide">
1040 <a class="card background card-background-9-14" href="${viewURL}" aria-label="${languageUtil.format(request, 'go-to-x', articleTitle)}">
1041 <span class="d-block image-wrapper aspect-ratio-bg-cover" style="background-image: url('${smallImageURL}')" role="img" aria-label="${articleTitle}">
1042 <img class="hide-accessible" src="${smallImageURL}" alt="" />
1043 <span class="card-body">
1044 <span class="card-title">${articleTitle}</span>
1045 </span>
1046 </span>
1047 </a>
1048 </div>
1049 </#if>
1050 </#list>
1051 </div>
1052 </div>
1053 </div>
1054 </#if>
1055
1056 <#-- Nearby Articles -->
1057 <#assign classTypeIds = [] />
1058 <#assign assetsNearJournalArticles = assetNearTool.getNearJournalArticles(themeDisplay.getScopeGroupId(), assetEntry.getEntryId(), 50.0, classTypeIds, 25)! />
1059 <#if validator.isNotNull(assetsNearJournalArticles) && assetsNearJournalArticles?size gt 0>
1060 <div class="article-nearby portlet-container-margin">
1061 <div class="container">
1062 <div class="article-nearby-container">
1063 <h3 class="title-section">${languageUtil.get(request,'infoasturias-near-here')}</h3>
1064 <div class="slick article-nearby-slick">
1065 <#list assetsNearJournalArticles as currentJournalArticle>
1066 <#assign viewURLRaw = journalTool.getDisplayPage(currentJournalArticle, themeDisplay, true) />
1067 <#assign viewURL = sanitizeURL(viewURLRaw) />
1068 <#assign articleTitle = currentJournalArticle.getTitle(locale) />
1069 <#assign articleDescription = currentJournalArticle.getDescription(locale) />
1070 <#assign smallImageURLRaw = currentJournalArticle.getSmallImageURL() />
1071 <#assign smallImageURL = sanitizeURL(smallImageURLRaw) />
1072 <#assign distanceKm = currentJournalArticle.getVersion() />
1073 <#assign categoriesNamesRaw = journalTool.getCategoriesNames(groupId, currentJournalArticle.getArticleId(), locale, ["Concejos"]) />
1074 <#assign categoriesNames = htmlUtil.escape(categoriesNamesRaw) />
1075
1076 <#if viewURL?has_content && smallImageURL?has_content && articleTitle?has_content>
1077 <div class="slide">
1078 <a class="card" href="${viewURL}" aria-label="${languageUtil.format(request, 'go-to-x', articleTitle)}">
1079 <span class="d-block image-wrapper aspect-ratio-bg-cover aspect-ratio-4-to-3" style="background-image: url('${smallImageURL}')" role="img" aria-label="${articleTitle}">
1080 <img class="hide-accessible" src="${smallImageURL}" alt="" />
1081 <#if articleDescription?has_content>
1082 <span class="card-hover">
1083 <span class="card-text">${articleDescription}</span>
1084 </span>
1085 </#if>
1086 </span>
1087 <span class="card-body">
1088 <span class="card-title">${articleTitle}</span>
1089 <span class="card-subtitle">
1090 <span class="d-block">
1091 <span class="sr-only">${languageUtil.get(request, 'distance')}: </span>
1092 ${distanceKm} ${languageUtil.get(request, 'km')}
1093 </span>
1094 <#if categoriesNames?has_content>
1095 <span class="d-block">${categoriesNames}</span>
1096 </#if>
1097 </span>
1098 </span>
1099 </a>
1100 </div>
1101 </#if>
1102 </#list>
1103 </div>
1104 </div>
1105 </div>
1106 </div>
1107 </#if>
1108</article>
1109<#assign vocabCultura = assetVocabularyLocalService.fetchGroupVocabulary(groupId, "Cultura")! />
1110<#assign schemaTypes = ["CivicStructure", "TouristAttraction"] />
1111<#if vocabCultura?has_content>
1112 <#assign categoriasCultura = assetCategoryLocalService.getVocabularyCategories(vocabCultura.getVocabularyId(), -1, -1, null) />
1113 <#assign categoriaPadre = "" />
1114 <#list categoriasCultura as cat>
1115 <#if cat.getName() == "Museos y espacios culturales">
1116 <#assign categoriaPadre = cat />
1117 <#break>
1118 </#if>
1119 </#list>
1120 <#if categoriaPadre?has_content>
1121 <#assign categoriasArticulo = assetCategoryLocalService.getCategories("com.liferay.journal.model.JournalArticle", journalArticle.resourcePrimKey ) />
1122 <#list categoriasArticulo as cat>
1123 <#if cat.getVocabularyId() == vocabCultura.getVocabularyId() && cat.getParentCategoryId() == categoriaPadre.getCategoryId()>
1124 <#assign nombreCategoria = cat.getName() />
1125 <#if nombreCategoria == "Museos" || nombreCategoria == "Colecciones Museográficas">
1126 <#assign schemaTypes = ["Museum", "LocalBusiness", "TouristAttraction"] />
1127 <#break>
1128 <#elseif nombreCategoria == "Castros y espacios arqueológicos">
1129 <#assign schemaTypes = ["ArchaeologicalSite", "LocalBusiness", "TouristAttraction"] />
1130 <#break>
1131 <#elseif nombreCategoria == "Conjuntos etnográficos">
1132 <#assign schemaTypes = ["LandmarksOrHistoricalBuildings", "LocalBusiness", "TouristAttraction"] />
1133 <#break>
1134 <#elseif nombreCategoria == "Centros de interpretación">
1135 <#assign schemaTypes = ["VisitorCenter", "LocalBusiness", "TouristAttraction"] />
1136 <#break>
1137 <#elseif nombreCategoria == "Otros espacios culturales">
1138 <#assign schemaTypes = ["CivicStructure", "LocalBusiness", "TouristAttraction"] />
1139 <#break>
1140 </#if>
1141 </#if>
1142 </#list>
1143 </#if>
1144</#if>
1145<script type="application/ld+json">
1146{
1147 "@context": "https://schema.org",
1148 "@type": [
1149 <#list schemaTypes as t>"${t}"<#if t_has_next>,</#if></#list>
1150 ],
1151 "@id": "${articleURL}",
1152 "name": "${title}",
1153 "url": "${articleURL}"
1154 <#if articleMainImageThumbnail3Safe?has_content>
1155 ,"image": [
1156 "${themeDisplay.getPortalURL()}${articleMainImageThumbnail3Safe}"
1157 <#if Visualizador.Slide.getData()?has_content>
1158 <#list Visualizador.Slide.getSiblings() as Slide>
1159 <#if validator.isNotNull(Slide.getData()) && !Slide.SlideUrl.getData()?has_content>
1160 <#assign slidePathRaw = dlTool.getPathByJSON(Slide.data, themeDisplay.getScopeGroupId())! />
1161 <#assign slidePath = sanitizeURL(slidePathRaw) />
1162 <#if slidePath?has_content>
1163 ,"${themeDisplay.getPortalURL()}${slidePath}"
1164 </#if>
1165 </#if>
1166 </#list>
1167 </#if>
1168 ]
1169 </#if>
1170 <#if (Informacion.Texto.data)!?has_content>
1171 <#assign cleanDesc = htmlUtil.extractText(Informacion.Texto.data)?trim />
1172 <#if cleanDesc?has_content>
1173 ,"description": "${cleanDesc}"
1174 </#if>
1175 </#if>
1176 <#if (Contacto.Direccion.data)!?has_content || (Contacto.CP.data)!?has_content>
1177 ,"address": {
1178 "@type": "PostalAddress"
1179 <#if (Contacto.Direccion.data)!?has_content>
1180 ,"streetAddress": "${(Contacto.Direccion.data)!}"
1181 </#if>
1182 <#if (Contacto.CP.data)!?has_content>
1183 ,"postalCode": "${(Contacto.CP.data)!}"
1184 </#if>
1185 <#if (Contacto.Localidad.data)!?has_content>
1186 ,"addressLocality": "${(Contacto.Localidad.data)!}"
1187 </#if>
1188 <#if (Contacto.Concejo.data)!?has_content>
1189 ,"addressRegion": "${(Contacto.Concejo.data)!}"
1190 </#if>
1191 ,"addressCountry": "ES"
1192 }
1193 </#if>
1194 <#if (Geolocalizacion.Coordenadas.data)!?has_content>
1195 <#assign coordenadas = stringUtil.split(Geolocalizacion.Coordenadas.data) />
1196 ,"geo": {
1197 "@type": "GeoCoordinates",
1198 "latitude": "${coordenadas[0]}",
1199 "longitude": "${coordenadas[1]}"
1200 }
1201 </#if>
1202 <#if (Contacto.Telefono.data)!?has_content>
1203 ,"telephone": [
1204 <#assign phoneList = [] />
1205 <#list Contacto.Telefono.getSiblings() as telephone>
1206 <#if telephone.data?has_content>
1207 <#assign rawTelefono = telephone.data?trim />
1208 <#assign cleanTelefono = rawTelefono?replace("\\(.*?\\)", "", "r") />
1209 <#assign numberTelefono = cleanTelefono?replace("[^0-9]", "", "r") />
1210 <#if numberTelefono?length == 9>
1211 <#assign phoneList = phoneList + ["+34${numberTelefono}"] />
1212 <#elseif numberTelefono?has_content>
1213 <#assign phoneList = phoneList + [numberTelefono] />
1214 </#if>
1215 </#if>
1216 </#list>
1217 <#if phoneList?has_content>
1218 <#list phoneList as phone>
1219 "${phone}"<#if phone_has_next>,</#if>
1220 </#list>
1221 </#if>
1222 ]
1223 </#if>
1224 <#if (Contacto.Email.getData())!?has_content>
1225 ,"email": [
1226 <#assign emailList = [] />
1227 <#list Contacto.Email.getSiblings() as Item>
1228 <#if Item.data?trim?has_content>
1229 <#assign emailList = emailList + [Item.data?trim] />
1230 </#if>
1231 </#list>
1232 <#if emailList?has_content>
1233 <#list emailList as email>
1234 "${email}"<#if email_has_next>,</#if>
1235 </#list>
1236 </#if>
1237 ]
1238 </#if>
1239 <#if (Informacion.Horario.data)!?has_content>
1240 <#assign cleanHorario = htmlUtil.extractText(Informacion.Horario.data)?trim />
1241 <#if cleanHorario?has_content>
1242 ,"openingHoursSpecification": {
1243 "@type": "OpeningHoursSpecification",
1244 "description": "${cleanHorario}"
1245 }
1246 </#if>
1247 </#if>
1248}
1249</script>
1250<script type="text/javascript">
1251 (function() {
1252 'use strict';
1253 setTimeout(function() {
1254 var links = document.querySelectorAll('.internal-tab-link');
1255 links.forEach(function(link) {
1256 link.addEventListener('click', function(e) {
1257 e.preventDefault();
1258
1259 var tabHeadingId = this.getAttribute('data-tab-heading');
1260 var tabContentId = this.getAttribute('data-tab-content');
1261 var tabControl = document.getElementById(tabHeadingId);
1262 var tabContent = document.getElementById(tabContentId);
1263
1264 if (!tabControl || !tabContent) return;
1265
1266 var isExpanded = tabControl.getAttribute('aria-expanded') === 'true';
1267 if (!isExpanded) {
1268 tabControl.click();
1269 setTimeout(function() {
1270 scrollToElement(tabControl);
1271 }, 350);
1272 } else {
1273 scrollToElement(tabControl);
1274 }
1275 });
1276 });
1277 }, 500);
1278
1279 function scrollToElement(element) {
1280 var elementPosition = element.getBoundingClientRect().top;
1281 var offsetPosition = elementPosition + window.pageYOffset - 140;
1282 window.scrollTo({
1283 top: offsetPosition,
1284 behavior: 'smooth'
1285 });
1286 setTimeout(function() {
1287 element.focus();
1288 }, 400);
1289 }
1290 })();
1291</script>