Fehler bei der Verarbeitung der Vorlage.
?substring(...) argument #2 had invalid value: The index must be at least 0, but was -1.

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #local lResult = lResult?substring(0,...  [in template "10155#10193#6634329" in function "getShortTitle" at line 141, column 9]
	- Reached through: #assign lShortTitle = getShortTitle(l...  [in template "10155#10193#6634329" in macro "archiveDisplay" at line 86, column 9]
	- Reached through: @archiveDisplay entry  [in template "10155#10193#6634329" at line 28, column 57]
----
1<#setting url_escaping_charset='ISO-8859-1'> 
2<#assign liferay_ui = taglibLiferayHash["/META-INF/liferay-ui.tld"] /> 
3<#assign redirectURL = renderResponse.createRenderURL() /> 
4<#assign backLink = currentURL?url/> 
5<#assign lBiImage = "/documents/804663/804682/bi-img/b3ae601e-5ecc-422a-9527-2a556bbd36da?t=1427875520771" /> 
6<#assign lBiType = "BI" /> 
7<#assign lBiStructureId = 769975/> 
8<#global assetCategoryService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService")> 
9<#global assetVocabularyService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService")>  		 
10<#global lClassNameLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.ClassNameLocalService")>  	 
11<#global lDDMStructureLocalService = serviceLocator.findService("com.liferay.dynamic.data.mapping.service.DDMStructureLocalService")> 	 
12<#global journalClassName="com.liferay.journal.model.JournalArticle"/>	 
13 
14<#global DLFileEntryLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryLocalService") /> 
15 
16<#assign lClassId = lClassNameLocalService.getClassNameId(journalClassName) /> 
17<#if entries?has_content> 
18	<section class="section-communications"> 
19		<#list entries as entry> 
20			<article class="communication-item grid__row"> 
21				<#assign lChapo = "" /> 
22				<#assign entry = entry /> 
23				<#assign className = lClassNameLocalService.getClassName(entry.getClassNameId()).getValue() > 
24				<#if className == journalClassName > 
25					<#if entry.getAssetRenderer()??> 
26						<#assign renderer = entry.getAssetRenderer() > 
27						<#if renderer.getArticle()??> 
28							<@archiveDisplay entry/> 
29						</#if>	 
30					</#if> 
31				</#if> 
32				<#if renderer.hasEditPermission(themeDisplay.getPermissionChecker())> 
33					<div class="lfr-meta-actions" style="float: right;"><@getEditIcon /></div> 
34				</#if> 
35			</article> 
36			 
37		</#list> 
38	</section> 
39</#if> 
40 
41<#macro archiveDisplay entry> 
42	<#assign availableLanguages = entry.getAvailableLanguageIds() /> 
43	<#assign journalArticle = renderer.getArticle() > 
44	<#assign viewURL = "/web/communication/detail?groupId=${entry.getGroupId()}&articleId=${journalArticle.getArticleId()}&redirect=${backLink}" /> 
45	<#assign lStructureId = journalArticle.getStructureId() /> 
46	<#assign lStructure = lDDMStructureLocalService.getStructure(themeDisplay.getCompanyGroupId(),lClassId,lStructureId?string) /> 
47	<#assign lStructureName = lStructure.getName()?trim /> 
48	<#assign rootElement = getContentXml(entry) /> 
49	<#if lStructure.getStructureId() == lBiStructureId> 
50		<#assign image = lBiImage /> 
51	<#else> 
52		<#assign image = "" > 
53		<#assign image = getStructureValue2("Image",rootElement, availableLanguages) /> 
54		 
55			<#if image == "" > 
56				<#assign image = "noImage" > 
57			<#else> 
58				<#local imageJson = jsonFactoryUtil.createJSONObject(image)/> 
59				<#local imageObject = DLFileEntryLocalService.getFileEntryByUuidAndGroupId(imageJson.getString("uuid"),imageJson.getString("groupId")?number) /> 
60				<#local imageUrl = "/documents/"+imageObject.getGroupId()+"/"+imageObject.getFolderId()+"/"+ imageJson.getString("title")+"/"+imageJson.getString("uuid") /> 
61			</#if> 
62	</#if> 
63 
64	<#assign lChapoNode =  getNodes("Lead", rootElement) /> 
65 
66	<#if lChapoNode?size!=0> 
67		<#assign lChapo = getStructureValue(lChapoNode[0], "fr_FR")/> 
68	</#if> 
69	<#if image != "noImage"> 
70		<div class="grid__col-xxs--12 grid__col-m--5"> 
71			<figure class="communication-img" style="height: auto;"> 
72				<a class="loading" href="${viewURL}"> 
73					<img src="${imageUrl}" alt="" class="js-lazy is-loaded"> 
74					<span>Lire la suite</span> 
75					<i class="icon icon_arrow-right"> 
76						<svg viewBox="0 0 37.1 12" class="svg_arrow-right"> 
77							<use xlink:href="/documents/10181/2591868/sprite.svg#svg-arrow-right"></use> 
78							<use xlink:href="#svg-arrow-right"></use> 
79						</svg> 
80					</i> 
81				</a> 
82			</figure>	 
83		</div> 
84	</#if>	 
85	<#assign lTitle = entry.getTitle(locale) /> 
86	<#assign lShortTitle = getShortTitle(lTitle) /> 
87	<#assign eSummary = entry.getSummary(locale, true) /> 
88	<#assign eSummary = stringUtil.shorten(eSummary, 230) /> 
89	 
90	<#if image != "noImage"> 
91		<div class="grid__col-xxs--12 grid__col-m--7"> 
92	<#else> 
93		<div class="grid__col-xxs--12"> 
94			<div class="grid__col-m--12 col-xs-no-gutter col-n-gutter"> 
95	</#if> 
96		<div class="communication-info"> 
97			<@entryLinkCreator linkText="" entry=entry type="title" /> 
98		</div> 
99 
100		<h3 class="communication-title"><a href="${viewURL}">${lShortTitle}</a></h3> 
101		<p class="communication-desc">${eSummary}</p> 
102		<!--<p class="communication-cat"><@getPouvoir entry=entry /></p>--> 
103		 
104		 
105		 
106	<#if image != "noImage"> 
107		</div> 
108	<#else> 
109			</div> 
110			 
111		</div> 
112	</#if> 
113	 
114		 
115	<a class="communication-link" href="${viewURL}" ></a> 
116 
117		 
118		 
119		<#-- 
120		<#if lChapo??> 
121			<#if lChapo!=""> 
122				${lChapo} 
123			</#if> 
124		</#if> 
125		 
126		<#if eSummary?has_content> 
127			<#if eSummary!=lTitle> 
128				<br/> 
129			</#if> 
130		</#if> 
131		--> 
132		 
133</#macro>  
134 
135<#function getShortTitle pTitle=''> 
136    <#local lResult = pTitle?trim /> 
137    <#-- Test if last 22 chars is a timestamp --> 
138    <#local lMatch = lResult?matches("^.*([01][0-9]|2[0-3]):[0-5]\\d:[0-5]\\d$") /> 
139    <#if lMatch> 
140     
141        <#local lResult = lResult?substring(0,lResult?length-22) /> 
142         
143    </#if> 
144    <#return lResult /> 
145</#function> 
146 
147<#macro getCategoryDate entry> 
148    <#assign lTypologie = "" /> 
149    <#assign lPouvoir = "" /> 
150    <#assign dateFormat = "dd.MM.yyyy" /> 
151	<#assign categories = entry.getCategories()> 
152	 
153	<#list categories as category> 
154        <#if assetVocabularyService.getVocabulary(category.vocabularyId)??> 
155    		<#assign vocabulary = assetVocabularyService.getVocabulary(category.vocabularyId) /> 
156    		<#if vocabulary.name = "020 Typologies"> 
157    			<#assign lCategory = category.getDescription(locale)?trim /> 
158    			<#if lCategory=="" > 
159    				<#assign lCategory = category.getDescription(locale)?trim /> 
160    			</#if> 
161    			<#assign lTypologie = lTypologie+" | "+lCategory /> 
162    		</#if> 
163    		<#if vocabulary.name = "010 Pouvoirs"> 
164    			<#assign lCategory = category.getDescription(themeDisplay.getLocale())?trim /> 
165    			<#if lCategory=="" > 
166    				<#assign lCategory = category.getDescription(locale)?trim /> 
167    			</#if> 
168    			<#assign lPouvoir = lPouvoir+" | "+lCategory /> 
169    		</#if> 
170    	</#if> 
171	</#list> 
172	${dateUtil.getDate(entry.getPublishDate(), dateFormat, locale)} 
173 
174	<#if lTypologie??> 
175		${lTypologie} 
176	</#if> 
177 
178</#macro> 
179 
180<#macro getPouvoir entry> 
181     
182    <#assign lPouvoir = "" /> 
183   
184	<#assign categories = entry.getCategories()> 
185	 
186	<#list categories as category> 
187        <#if assetVocabularyService.getVocabulary(category.vocabularyId)?? > 
188    		<#assign vocabulary = assetVocabularyService.getVocabulary(category.vocabularyId) /> 
189    		<#if vocabulary.name = "010 Pouvoirs"> 
190    			<#assign lCategory = category.getDescription(themeDisplay.getLocale())?trim /> 
191    			<#if lCategory=="" > 
192    				<#assign lCategory = category.getTitle(themeDisplay.getLocale())?trim /> 
193    			</#if> 
194    			<#assign lPouvoir = lCategory /> 
195    		</#if> 
196		</#if> 
197	</#list> 
198	 
199	<#if lPouvoir??> 
200		${lPouvoir} 
201	</#if> 
202</#macro> 
203  
204<#macro entryLinkCreator entry linkText type> 
205	<#assign entryRenderURL = renderResponse.createRenderURL() /> 
206	${entryRenderURL.setParameter("struts_action", "/asset_publisher/view_content")} 
207	${entryRenderURL.setParameter("assetEntryId", entry.getEntryId()?string)} 
208	${entryRenderURL.setParameter("redirect", renderResponse.encodeURL("${currentURL}"))} 
209	${entryRenderURL.setParameter("portlet_id", "test")} 
210	${entryRenderURL.setWindowState("maximized")} 
211	${entryRenderURL.setParameter("type", entry.getAssetRendererFactory().getType())} 
212	<#if type == "title"> 
213		    <@getCategoryDate entry/> 
214	<#else> 
215		    ${linkText} 
216	</#if> 
217</#macro> 
218 
219 
220<#function getNodes pElementName pXmlContent> 
221    <#assign lElementXPath = "dynamic-element[@name='"+pElementName+"']"/> 
222    <#assign lXPathSelector = saxReaderUtil.createXPath(lElementXPath) /> 
223    <#assign lResult = lXPathSelector.selectNodes(pXmlContent) /> 
224    <#return  lResult/> 
225</#function> 
226 
227<#function getStructureValue pNode pDefaultLanguage> 
228    <#assign lResult = "" /> 
229    <#assign lCurElementXPath = "dynamic-content[@language-id='" + locale + "']" /> 
230    <#assign lXPathSelector = saxReaderUtil.createXPath(lCurElementXPath) /> 
231    <#if lXPathSelector.selectSingleNode(pNode)??> 
232        <#assign lValue = lXPathSelector.selectSingleNode(pNode) /> 
233        <#assign lResult = lValue.getStringValue() />  
234    <#else> 
235        <#assign lCurElementXPath = "dynamic-content[@language-id='fr_FR']" /> 
236        <#assign lXPathSelector = saxReaderUtil.createXPath(lCurElementXPath) /> 
237        <#if lXPathSelector.selectSingleNode(pNode)?? > 
238            <#assign lValue = lXPathSelector.selectSingleNode(pNode) /> 
239            <#assign lResult = lValue.getStringValue() /> 
240        <#else> 
241            <#assign lCurElementXPath = "dynamic-content[@language-id='" + pDefaultLanguage + "']" /> 
242            <#assign lXPathSelector = saxReaderUtil.createXPath(lCurElementXPath) /> 
243            <#assign lValue = lXPathSelector.selectSingleNode(pNode) /> 
244            <#assign lResult = lValue.getStringValue() /> 
245        </#if> 
246    </#if> 
247    <#return lResult?string />                    
248</#function> 
249 
250<#function getContentXml entry> 
251    <#assign renderer = entry.getAssetRenderer() /> 
252    <#assign className = renderer.getClassName() /> 
253    <#if className == "com.liferay.journal.model.JournalArticle"> 
254        <#assign journalArticle = renderer.getArticle() /> 
255        <#assign document = saxReaderUtil.read(journalArticle.getContent())/>  
256        <#assign rootElement = document.getRootElement() /> 
257        <#return rootElement/> 
258    </#if> 
259    <#return "noJournalArticle"/> 
260</#function> 
261 
262<#function getStructureValue2 elementName xmlContent availableLanguages> 
263    <#assign availableLanguagesXPathSelector = saxReaderUtil.createXPath("/*/@available-locales") /> 
264    <#if availableLanguagesXPathSelector.selectSingleNode(xmlContent)?? > 
265        <#assign available = availableLanguagesXPathSelector.selectSingleNode(xmlContent) /> 
266    </#if> 
267    <#if availableLanguages?seq_contains(locale.toString())> 
268        <#assign curElementXPath = "dynamic-element[@name='"+elementName+"']/dynamic-content[@language-id='" + locale + "']" />  
269    <#else> 
270        <#assign curElementXPath = "dynamic-element[@name='"+elementName+"']/dynamic-content[@language-id='" + entry.getDefaultLanguageId() + "']" /> 
271    </#if> 
272    <#assign xPathSelector = saxReaderUtil.createXPath(curElementXPath) /> 
273    <#if xPathSelector.selectSingleNode(xmlContent)?? > 
274        <#assign structureValue = xPathSelector.selectSingleNode(xmlContent).getStringValue() /> 
275    <#else> 
276        <#assign structureValue = "" /> 
277    </#if> 
278    <#return structureValue/>                    
279</#function> 
280 
281<#macro getEditIcon> 
282	<#local redirectURL = renderResponse.createRenderURL() /> 
283 
284	${redirectURL.setParameter("struts_action", "/asset_publisher/add_asset_redirect")} 
285	${redirectURL.setWindowState("pop_up")} 
286 
287	<#local editPortletURL = renderer.getURLEdit(renderRequest, renderResponse, windowStateFactory.getWindowState("pop_up"), redirectURL) /> 
288 
289	<#if validator.isNotNull(editPortletURL)> 
290		<#local title = languageUtil.get(locale, "edit") /> 
291 
292		<@liferay_ui["icon"] 
293			iconCssClass="icon-pencil" 
294			message=title 
295			url="javascript:Liferay.Util.openWindow({dialog: {width: 960}, id:'" + renderResponse.getNamespace() + "editAsset', title: '" + title + "', uri:'" + htmlUtil.escapeURL(editPortletURL.toString()) + "'});" 
296		/> 
297	</#if> 
298</#macro>