Contact
Une erreur s'est produite en traitant le calibre.
Expression plid is undefined on line 419, column 55 in 10154#10192#15572964.
1<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.portlet.asset.service.AssetEntryLocalService") />
2<#assign classNameLocalService = serviceLocator.findService("com.liferay.portal.service.ClassNameLocalService") />
3<#assign assetLinkLocalService = serviceLocator.findService("com.liferay.portlet.asset.service.AssetLinkLocalService") />
4<#assign bookmarksEntryLocalService = serviceLocator.findService("com.liferay.portlet.bookmarks.service.BookmarksEntryLocalService") />
5<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.portlet.journal.service.JournalArticleLocalService") />
6<#assign journalStructureLocalService = serviceLocator.findService("com.liferay.portlet.dynamicdatamapping.service.DDMStructureLocalService") />
7<#assign dlFileEntryLocalService = serviceLocator.findService("com.liferay.portlet.documentlibrary.service.DLFileEntryLocalService") />
8<#assign resourcePermissionLocalService = serviceLocator.findService("com.liferay.portal.service.ResourcePermissionLocalService") />
9<#assign roleLocalService = serviceLocator.findService("com.liferay.portal.service.RoleLocalService") />
10<#assign typeJournalArticle = "com.liferay.portlet.journal.model.JournalArticle" />
11<#assign typeBookmarksEntry = "com.liferay.portlet.bookmarks.model.BookmarksEntry" />
12<#assign typeDLFileEntry = "com.liferay.portlet.documentlibrary.model.DLFileEntry" />
13
14<#assign journalArticle = journalArticleLocalService.getArticle(groupId, .vars['reserved-article-id'].data) />
15<#assign entry = assetEntryLocalService.getEntry(typeJournalArticle, journalArticle.getResourcePrimKey()) />
16
17<#assign serviceContextThreadLocal = staticUtil["com.liferay.portal.service.ServiceContextThreadLocal"] />
18<#assign themeDisplay = serviceContextThreadLocal.getServiceContext().getThemeDisplay() />
19
20<#assign layout = themeDisplay['plid'] />
21<#assign layoutService = serviceLocator.findService("com.liferay.portal.service.LayoutLocalService") />
22<#assign layoutObject = layoutService.getLayout(layout?number) />
23
24<#assign jaClassNameId = classNameLocalService.getClassNameId(typeJournalArticle) />
25
26<#assign pdfViewer = '/fu/js/pdfjs/web/viewer.html?zoom=page-fit&file=' />
27
28<#assign carouselNb = 0 />
29
30
31<div class="interior-article-container">
32
33 <article class="interior-article interior-article-displayed">
34
35 <section class="interior-article-mainContent" >
36
37 <div class="interior-article-title-wrapper">
38 <h1 class="interior-article-title">${.vars['reserved-article-title'].data}</h1>
39 </div>
40
41 <p class="interior-article-chapo">${Accroche.getData()}</p>
42
43 <#if content.getSiblings()?has_content>
44
45 <#list content.getSiblings() as contenu>
46
47 <#assign contentDisplay = contenu.content_display.getData() />
48 <#if contentDisplay == "default" >
49 <@displayDefaultContent contenu=contenu isZoom="" isAccordion="" />
50 <#elseif contentDisplay == "zoom" >
51 <@displayDefaultContent contenu=contenu isZoom="zoomed-paragraph" isAccordion="" />
52 <#elseif contentDisplay == "accordion" >
53 <@displayDefaultContent contenu=contenu isZoom="" isAccordion="accordion-paragraph" />
54 <#elseif contentDisplay == "corail" >
55 <@displayDefaultContent contenu=contenu isZoom="corail-paragraph" isAccordion="" title=articleTitle />
56 </#if>
57
58 </#list>
59
60 </#if>
61
62 </section>
63
64 </article>
65
66</div>
67
68
69<#--*************************************
70** CONTENT BLOCKS DISPLAY
71*************************************-->
72
73<#macro displayDefaultContent contenu isZoom isAccordion >
74
75 <#assign floatingMedia = "no-floating-media" />
76 <#assign alignValue = contenu.Media.media_options.alignment.getData() />
77 <#if alignValue == "flexLeft" || alignValue == "flexRight">
78 <#assign floatingMedia = "flex-media" />
79 </#if>
80
81 <#assign portletMedia = "" />
82 <#assign typeValue = contenu.Media.media_type.getData() />
83 <#if typeValue == "portlet">
84 <#assign portletMedia = "portlet-media" />
85 </#if>
86
87 <#assign contentTitle = contenu.content_title.getData() />
88 <#assign contentText = contenu.content_text.getData() />
89
90 <#assign innerMedia = contenu.Media />
91 <#assign mediaSrc = contenu.Media.media_doc.getData()/>
92 <#assign urlIframePortlet = contenu.Media.url_iframe_portlet.getData() />
93
94 <#if mediaSrc == "" && urlIframePortlet == "" >
95 <#assign floatingMedia = "no-floating-media" />
96 <#assign portletMedia = "" />
97 </#if>
98
99 <#assign titleAlone = "" />
100 <#if contentTitle!="" && contentText=="" && mediaSrc=="" && urlIframePortlet =="" >
101 <#assign titleAlone = "title-alone" />
102 </#if>
103
104 <#assign noTitle = "" />
105 <#if contentTitle=="" >
106 <#assign noTitle = "no-title" />
107 </#if>
108
109 <#if contentTitle!="" || contentText!="" || mediaSrc!="" || urlIframePortlet !="" >
110
111 <#if contenu.anchor?has_content>
112 <#assign anchor = contenu.anchor.getData() />
113 <#if anchor != "" >
114 <#assign anchor = 'id="'+anchor+'"' />
115 </#if>
116 </#if>
117
118 <#if isAccordion=="accordion-paragraph">
119 <div class="interior-article-paragraph ${isZoom} ${floatingMedia} ${portletMedia} ${titleAlone} ${noTitle}">
120 <#else>
121 <div ${anchor} class="interior-article-paragraph ${isZoom} ${floatingMedia} ${portletMedia} ${titleAlone} ${noTitle}">
122 </#if>
123
124 <#if contentTitle != '' >
125 <#if isAccordion=="accordion-paragraph">
126 <h3 ${anchor} class="accordion-title accordion-title-expanded"><button type="button" class="accordion-title-button">${contentTitle}</button></h3>
127 </#if>
128 </#if>
129
130 <#if isAccordion=="accordion-paragraph">
131 <div class="accordion-content">
132 </#if>
133
134 <#if floatingMedia == "no-floating-media" >
135
136 <#if contentTitle != '' && isAccordion=='' >
137 <h3>${contentTitle}</h3>
138 </#if>
139 ${contentText?replace("<p></p>","")}
140 <#if innerMedia??>
141 <@getMedia media=innerMedia mediaSrc=mediaSrc urlIframePortlet=urlIframePortlet alignment=alignValue />
142 </#if>
143
144
145 <#elseif floatingMedia == "flex-media">
146
147 <div class="flex-display flex-media-paragraph ${alignValue}">
148 <div class="flex-media-paragraph-content">
149 <#if contentTitle != '' && isAccordion=='' >
150 <h3>${contentTitle}</h3>
151 </#if>
152 ${contentText?replace("<p></p>","")}
153 </div>
154 <#if innerMedia??>
155 <@getMedia media=innerMedia mediaSrc=mediaSrc urlIframePortlet=urlIframePortlet alignment=alignValue />
156 </#if>
157 </div>
158
159 </#if>
160
161 <#if isAccordion=="accordion-paragraph">
162 </div>
163 </#if>
164
165 </div>
166
167 </#if>
168
169</#macro>
170
171
172<#--*************************************
173** MEDIA DISPLAY
174*************************************-->
175
176<#macro getMedia media mediaSrc urlIframePortlet alignment>
177
178 <#if mediaSrc != '' || urlIframePortlet != ''>
179
180 <#local mediaType = media.media_type.getData() />
181 <#assign carouselWrapper = "" />
182 <#if mediaType == "carousel">
183 <#assign carouselWrapper = "interior-article-media-carousel-wrapper" />
184 </#if>
185 <#local width = media.media_options.width.getData() />
186 <#local displayWidth = '' />
187 <#if width == 'null'>
188 <#local displayWidth = '' />
189 <#elseif width != "">
190 <#local displayWidth = 'style="width:'+width+'px;"' />
191 </#if>
192
193 <#local height = media.media_options.height.getData() />
194 <#if height == 'null'>
195 <#local height = '' />
196 </#if>
197 <#local displayMode = media.media_options.display_mode.getData() />
198 <#local imgMini = media.media_options.img_mini.getData() />
199 <#local legend = media.media_options.legend.getData() />
200 <#local altText = media.alt_text.getData() />
201 <#if altText == 'null'>
202 <#local altText = '' />
203 </#if>
204
205 <figure class="interior-article-media interior-article-media-${alignment} ${carouselWrapper}" ${displayWidth}>
206
207 <#switch mediaType>
208 <#case "image">
209 <#if displayMode == "normal">
210 <@getImageMedia mediaSrc=mediaSrc urlIframePortlet=urlIframePortlet altText=altText height=height />
211 <#elseif displayMode == "popup">
212 <@getImageMediaPopup imgMini=imgMini mediaSrc=mediaSrc altText=altText height=height />
213 </#if>
214 <#break >
215 <#case "video">
216 <#if displayMode == "normal">
217 <@getVideoMedia imgMini=imgMini mediaSrc=mediaSrc altText=altText height=height />
218 <#elseif displayMode == "popup">
219 <@getVideoMediaPopup imgMini=imgMini mediaSrc=mediaSrc altText=altText height=height />
220 </#if>
221 <#break >
222 <#case "pdf">
223 <#if displayMode == "normal">
224 <@getPdfMedia mediaSrc=mediaSrc altText=altText height=height />
225 <#elseif displayMode == "popup">
226 <@getPdfMediaPopup imgMini=imgMini mediaSrc=mediaSrc altText=altText height=height />
227 </#if>
228 <#break >
229 <#case "iframe">
230 <#if displayMode == "normal">
231 <@getIframeMedia urlIframePortlet=urlIframePortlet altText=altText height=height />
232 <#elseif displayMode == "popup">
233 <@getIframeMediaPopup imgMini=imgMini urlIframePortlet=urlIframePortlet altText=altText height=height />
234 </#if>
235 <#break >
236 <#case "portlet">
237 urlIframePortlet=${urlIframePortlet}
238 <#if displayMode == "normal">
239 <@getPortletMedia urlIframePortlet=urlIframePortlet height=height />
240 <#elseif displayMode == "popup">
241 <@getPortletMediaPopup imgMini=imgMini urlIframePortlet=urlIframePortlet altText=altText height=height />
242 </#if>
243 <#break >
244 <#case "carousel">
245 <#if displayMode == "normal">
246 <@getCarouselMedia media=media altText=altText height=height width=width />
247 <#assign carouselNb = carouselNb + 1 />
248 <#elseif displayMode == "popup">
249 <@getCarouselMediaPopup imgMini=imgMini media=media altText=altText height=height />
250 </#if>
251 <#break >
252 <#default>
253 </#switch>
254
255 <#local hasLegend = legend?length != 0 />
256 <#if hasLegend>
257 <figcaption class="interior-article-media-legend">${legend}</figcaption>
258 </#if>
259
260 </figure>
261
262 </#if>
263
264</#macro>
265
266
267<#macro getImageMedia mediaSrc urlIframePortlet altText height >
268 <#local displayedHeight = '' />
269 <#if height != "">
270 <#local displayedHeight = 'style="max-height:'+height+'px;"' />
271 </#if>
272 <#if urlIframePortlet != "">
273 <#assign target = "href='"+ urlIframePortlet +"'" />
274 <#if !isInternalLink(urlIframePortlet)>
275 <#assign target = target + " target='_blank' rel='noopener noreferrer'" />
276 </#if>
277 <a ${target} title="${htmlUtil.escapeAttribute(altText)}">
278 <img class="interior-article-media-image" src="${mediaSrc}" loading="lazy" alt="${htmlUtil.escapeAttribute(altText)}" ${displayedHeight} />
279 </a>
280 <#else>
281 <img class="interior-article-media-image" src="${mediaSrc}" loading="lazy" alt="${htmlUtil.escapeAttribute(altText)}" title="${htmlUtil.escapeAttribute(altText)}" ${displayedHeight} />
282 </#if>
283</#macro>
284
285
286<#macro getImageMediaPopup imgMini mediaSrc altText height >
287 <#local displayedHeight = '' />
288 <#if height != "">
289 <#local displayedHeight = 'style="max-height:'+height+'px;"' />
290 </#if>
291 <a class="link-img" href="${mediaSrc}" title="${htmlUtil.escapeAttribute(altText)}">
292 <img class="interior-article-media-image" src="${imgMini}" loading="lazy" alt="${htmlUtil.escapeAttribute(altText)}" ${displayedHeight} />
293 </a>
294</#macro>
295
296
297<#macro getVideoMedia imgMini mediaSrc height altText>
298 <div class="lazy-video" data-video="${mediaSrc}" data-height="${height}" data-text="${htmlUtil.escapeAttribute(altText)}" data-poster="${imgMini}" ></div>
299</#macro>
300
301
302<#macro getVideoMediaPopup imgMini mediaSrc altText height >
303 <#local displayedHeight = '' />
304 <#if height != "">
305 <#local displayedHeight = 'style="max-height:'+height+'px;"' />
306 </#if>
307 <a class="link-video" href="${mediaSrc}" title="${htmlUtil.escapeAttribute(altText)}">
308 <img class="interior-article-media-image" src="${imgMini}" loading="lazy" alt="${htmlUtil.escapeAttribute(altText)}" ${displayedHeight} />
309 </a>
310</#macro>
311
312
313<#macro getPdfMedia mediaSrc altText height >
314 <#local displayedHeight = '' />
315 <#if height != "">
316 <#local displayedHeight = 'style="height:'+height+'px;"' />
317 </#if>
318 <iframe class="interior-article-media-iframe" src="${pdfViewer+mediaSrc}" loading="lazy" title="${htmlUtil.escapeAttribute(altText)}" ${displayedHeight} allowfullscreen ></iframe>
319</#macro>
320
321
322<#macro getPdfMediaPopup imgMini mediaSrc altText height >
323 <#local displayedHeight = '' />
324 <#if height != "">
325 <#local displayedHeight = 'style="max-height:'+height+'px;"' />
326 </#if>
327 <a class="link-pdf" href="${mediaSrc}" title="${htmlUtil.escapeAttribute(altText)}">
328 <img class="interior-article-media-image" src="${imgMini}" loading="lazy" alt="${htmlUtil.escapeAttribute(altText)}" ${displayedHeight} />
329 </a>
330</#macro>
331
332
333<#macro getIframeMedia urlIframePortlet altText height >
334 <#local displayedHeight = '' />
335 <#if height != "">
336 <#local displayedHeight = 'style="height:'+height+'px;"' />
337 </#if>
338 <#if urlIframePortlet?contains("youtube")>
339 <#local youtubeId = urlIframePortlet?substring(urlIframePortlet?index_of("embed/")+6) />
340 <div class="interior-article-media-youtube-blocker" ${displayedHeight}>
341 <div class="youtube-blocker-img-wrapper">
342 <img class="youtube-blocker-img" src="https://img.youtube.com/vi/${youtubeId}/0.jpg" loading="lazy" alt="" />
343 </div>
344 <p class="youtube-blocker-text">Cette vidéo est fournie par la plateforme YouTube. En la visionnant vous acceptez les conditions d'utilisation de YouTube.</p>
345 <div class="youtube-blocker-btn-wrapper">
346 <button type="button" class="youtube-blocker-btn" data-src="${urlIframePortlet?replace('youtube.com','youtube-nocookie.com')}?autoplay=1" data-title="${htmlUtil.escapeAttribute(altText)}">Voir la vidéo</button>
347 <a href="https://www.youtube.com/static?template=terms&gl=FR" class="youtube-blocker-btn" target="_blank" rel="noopener noreferrer">En savoir plus</a>
348 </div>
349 </div>
350 <#else>
351 <iframe class="interior-article-media-iframe" src="${urlIframePortlet}" loading="lazy" title="${htmlUtil.escapeAttribute(altText)}" ${displayedHeight} allowfullscreen ></iframe>
352 </#if>
353</#macro>
354
355
356<#macro getIframeMediaPopup imgMini urlIframePortlet altText height >
357 <#local displayedHeight = '' />
358 <#if height != "">
359 <#local displayedHeight = 'style="max-height:'+height+'px;"' />
360 </#if>
361 <a class="link-iframe" href="${urlIframePortlet}" title="${htmlUtil.escapeAttribute(altText)}">
362 <img class="interior-article-media-image" src="${imgMini}" loading="lazy" alt="${htmlUtil.escapeAttribute(altText)}" ${displayedHeight} />
363 </a>
364</#macro>
365
366
367<#macro getPortletMedia urlIframePortlet height >
368
369 <#local displayedHeight = '' />
370 <#if height != "">
371 <#local displayedHeight = 'style="max-height:'+height+'px;"' />
372 </#if>
373
374 <#local hasInstanceId = urlIframePortlet?contains('INSTANCE') />
375 <#local hasQueryString = urlIframePortlet?contains('?') />
376 <#local queryString = '' />
377 <#local instanceId = '' />
378 <#local portletName = urlIframePortlet />
379 <#local portletId = urlIframePortlet />
380 <#local fullPortletName = '' />
381
382 <#if hasInstanceId>
383 <#if hasQueryString>
384 <#local instanceId = urlIframePortlet[(urlIframePortlet?index_of('INSTANCE')+9)..urlIframePortlet?index_of('?')-1] />
385 <#else>
386 <#local instanceId = urlIframePortlet[(urlIframePortlet?index_of('INSTANCE')+9)..] />
387 </#if>
388 <#local portletName = urlIframePortlet[0..(urlIframePortlet?index_of('INSTANCE'))-2] />
389 <#else>
390 <#if hasQueryString>
391 <#local portletName = urlIframePortlet[0..(urlIframePortlet?index_of('?'))-1] />
392 </#if>
393 </#if>
394
395 <#if hasQueryString>
396 <#local queryString = urlIframePortlet[(urlIframePortlet?index_of('?')+1)..] />
397 </#if>
398
399 <#if hasInstanceId>
400 <#local fullPortletName = portletName+'_INSTANCE_'+instanceId />
401 <#else>
402 <#local fullPortletName = portletName />
403 </#if>
404
405 <#local divId = "embedded-portlet-" + fullPortletName + randomNamespace />
406
407 <#--
408 <code class="hide">
409 urlIframePortlet=${urlIframePortlet}
410 portletName=${portletName}
411 instanceId=${instanceId}
412 queryString=${queryString}
413 fullPortletName=${fullPortletName}
414 </code>
415 -->
416
417 <#if urlIframePortlet?contains('cdalrEService') || urlIframePortlet?contains('cdalrEservice') || urlIframePortlet?contains('cuCreate')>
418
419 <#local queryString = queryString +"&p_l_id="+plid+"&p_p_lifecycle=0&p_p_mode=view&p_p_state=exclusive¤tURL=" + themeDisplay.getURLCurrent() />
420
421 <div id="${divId}" class="embedded-portlet" data-portlet="${fullPortletName}" data-remote-url="" data-querystring="${queryString}" ${displayedHeight}></div>
422
423 <#else>
424
425 <#local plid = themeDisplay.plid />
426 <#local portletURL = portletURLFactory.create(renderRequest, fullPortletName, plid, "RENDER_PHASE") />
427 <#local windowState = windowStateFactory.getWindowState("EXCLUSIVE") />
428 ${portletURL.setWindowState(windowState)}
429 <#local remoteUrl = portletURL.toString() + "&" + queryString + "¤tURL=" + themeDisplay.getURLCurrent() />
430
431 <div id="${divId}" class="embedded-portlet" data-portlet="${fullPortletName}" data-remote-url="${remoteUrl}" data-querystring="${queryString}" ${displayedHeight}></div>
432
433 </#if>
434
435</#macro>
436
437
438<#macro getPortletMediaPopup imgMini urlIframePortlet altText height >
439
440 <#local displayedHeight = '' />
441 <#if height != "">
442 <#local displayedHeight = 'style="max-height:'+height+'px;"' />
443 </#if>
444
445 <#local hasInstanceId = urlIframePortlet?contains('INSTANCE') />
446 <#local hasQueryString = urlIframePortlet?contains('?') />
447 <#local portletId = urlIframePortlet />
448 <#local queryString = '' />
449
450 <#if hasInstanceId>
451 <#local portletId = urlIframePortlet[0..(urlIframePortlet?index_of(instanceId))] />
452 </#if>
453 <#if hasQueryString>
454 <#local portletId = urlIframePortlet[0..(urlIframePortlet?index_of('?')-1)] />
455 <#local queryString = urlIframePortlet[(urlIframePortlet?index_of('?')+1)..] />
456 </#if>
457
458 <#local divId = "embedded-portlet-" + portletId />
459
460 <#if urlIframePortlet?contains('cdalrEService') || urlIframePortlet?contains('cdalrEservice')>
461
462 <#local queryString = queryString +"&p_l_id="+plid+"&p_p_lifecycle=0&p_p_mode=view&p_p_state=exclusive¤tURL=" +themeDisplay.getURLCurrent() />
463
464 <div class="link-portlet eservice-form-opener" data-divId="${divId}" data-portlet="${portletId}" data-querystring="${queryString}" data-remote-url="" tabindex="0">
465 <div class="eservice-form-opener-picto"></div>
466 <p class="eservice-form-opener-text">${htmlUtil.escapeAttribute(altText)}</p>
467 </div>
468
469 <#else>
470
471 <#local portletClass = "link-portlet" />
472 <#if urlIframePortlet?contains('19_WAR')>
473 <#local portletClass = "link-portlet planning-cmd-opener" />
474 </#if>
475 <#local plid = themeDisplay.plid />
476 <#local portletURL = portletURLFactory.create(renderRequest, portletId, plid, "RENDER_PHASE") />
477 <#local windowState = windowStateFactory.getWindowState("EXCLUSIVE") />
478 ${portletURL.setWindowState(windowState)}
479 <#local remoteUrl = portletURL.toString() + "&" + queryString + "¤tURL=" + themeDisplay.getURLCurrent() />
480
481 <div class="${portletClass}" data-divId="${divId}" data-portlet="${portletId}" data-querystring="${queryString}" data-remote-url="${remoteUrl}" tabindex="0">
482 <img class="interior-article-media-image" src="${imgMini}" loading="lazy" alt="${altText}" ${displayedHeight} />
483 </div>
484
485 </#if>
486
487</#macro>
488
489
490<#macro getCarouselMedia media altText height width >
491
492 <#local ratioDisplay = "" />
493 <#if height != "" && width != "" >
494 <#local ratio = height?number / width?number * 100 />
495 <#local ratioDisplay = 'style="padding-top:' + ratio + '%"' />
496 </#if>
497
498 <div class="carousel" id="carousel-${carouselNb}" data-carousel="carousel-${carouselNb}" ${ratioDisplay}>
499
500 <button type="button" id="carousel-${carouselNb}-arrow-prev" data-carousel="carousel-${carouselNb}" data-direction="prev" class="carousel-arrow carousel-arrow-prev"><span class="sr-only">Image précédente</span></button>
501 <button type="button" id="carousel-${carouselNb}-arrow-next" data-carousel="carousel-${carouselNb}" data-direction="next" class="carousel-arrow carousel-arrow-next"><span class="sr-only">Image suivante</span></button>
502
503 <#list media.media_doc.getSiblings() as node>
504 <#if node_index == 0>
505 <img id="carousel-${carouselNb}-img-${node_index}" data-carousel="carousel-${carouselNb}" data-img="${node_index}" class="carousel-img carousel-img-displayed" src="${node.getData()}" data-src="" alt="${altText}">
506 <#else>
507 <img id="carousel-${carouselNb}-img-${node_index}" data-carousel="carousel-${carouselNb}" data-img="${node_index}" class="carousel-img carousel-img-noDisplay" src="/pru-vls-theme/images/blank.png" data-src="${node.getData()}" alt="${altText}">
508 </#if>
509 </#list>
510
511 </div>
512
513</#macro>
514
515
516<#macro getCarouselMediaPopup imgMini media altText height >
517 <#local diapos = "" />
518 <#list media.media_doc.getSiblings() as node>
519 <#if node_index != 0>
520 <#local diapos = diapos + "," />
521 </#if>
522 <#local diapos = diapos + node.getData() />
523 </#list>
524 <#local displayedHeight = '' />
525 <#if height != "">
526 <#local displayedHeight = 'style="max-height:'+height+'px;"' />
527 </#if>
528 <a class="link-diapo" href="${mediaSrc}" title="${htmlUtil.escapeAttribute(altText)}" data-diapos="${diapos}">
529 <img class="interior-article-media-image" src="${imgMini}" loading="lazy" alt="${htmlUtil.escapeAttribute(altText)}" ${displayedHeight} />
530 </a>
531</#macro>
532
533
534<#function isInternalLink link>
535 <#local internal = link?contains("www.larochelle-zerocarbone.fr") || link?contains("www2.larochelle-zerocarbone.fr") || !link?contains("//")>
536 <#return internal>
537</#function>