-
Notifications
You must be signed in to change notification settings - Fork 112
/
FragmentMap.groovy
72 lines (64 loc) · 2.24 KB
/
FragmentMap.groovy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
* Copyright 2015, Emanuel Rabina (http://www.ultraq.net.nz/)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package nz.net.ultraq.thymeleaf.fragments
import org.thymeleaf.context.IContext
import org.thymeleaf.model.IModel
import org.thymeleaf.processor.element.IElementModelStructureHandler
/**
* Holds the layout fragments encountered across layout and content templates
* for later use.
*
* @author Emanuel Rabina
*/
class FragmentMap extends HashMap<String,List<IModel>> {
private static final String FRAGMENT_COLLECTION_KEY = 'LayoutDialect::FragmentCollection'
/**
* Retrieves either the fragment map for the current context, or returns a new
* fragment map.
*
* @param context
* @return A new or existing fragment collection for the context.
*/
static FragmentMap get(IContext context) {
return context[FRAGMENT_COLLECTION_KEY] ?: new FragmentMap()
}
/**
* Set the fragment collection to contain whatever it initially had, plus the
* given fragments, just for the scope of the current node.
*
* @param context
* @param structureHandler
* @param fragments The new fragments to add to the map.
* @param isIncludeProcessing
*/
static void setForNode(IContext context, IElementModelStructureHandler structureHandler,
Map<String,List<IModel>> fragments, boolean isIncludeProcessing = false) {
structureHandler.setLocalVariable(FRAGMENT_COLLECTION_KEY,
get(context).inject(fragments.clone()) { accumulator, fragmentName, fragmentList ->
if (accumulator[fragmentName]) {
accumulator[fragmentName] += fragmentList
if (isIncludeProcessing) {
accumulator[fragmentName].reverse(true)
}
}
else {
accumulator[fragmentName] = fragmentList
}
return accumulator
}
)
}
}