/
LatteConfiguration.java
196 lines (163 loc) · 5.86 KB
/
LatteConfiguration.java
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
package com.jantvrdik.intellij.latte.config;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
import static com.jantvrdik.intellij.latte.config.LatteMacro.Type.*;
public class LatteConfiguration {
/** globally available class instance */
public static final LatteConfiguration INSTANCE = new LatteConfiguration();
/** list of standard macros, indexed by macro name */
private Map<String, LatteMacro> standardMacros = new HashMap<String, LatteMacro>();
/** list of custom macros, indexed by project and macro name */
private Map<Project, Map<String, LatteMacro>> customMacros = new HashMap<Project, Map<String, LatteMacro>>();
public LatteConfiguration() {
initStandardMacros();
}
/**
* Initializes standard macros, currently based on Nette 2.1.2.
*/
private void initStandardMacros() {
// Built-in
addStandardMacro("syntax", PAIR);
// CacheMacro
addStandardMacro("cache", PAIR);
// CoreMacros
addStandardMacro("if", PAIR);
addStandardMacro("ifset", PAIR);
addStandardMacro("else", UNPAIRED);
addStandardMacro("elseif", UNPAIRED);
addStandardMacro("elseifset", UNPAIRED);
addStandardMacro("ifcontent", PAIR);
addStandardMacro("switch", PAIR);
addStandardMacro("case", UNPAIRED);
addStandardMacro("foreach", PAIR);
addStandardMacro("for", PAIR);
addStandardMacro("while", PAIR);
addStandardMacro("continueIf", UNPAIRED);
addStandardMacro("breakIf", UNPAIRED);
addStandardMacro("first", PAIR);
addStandardMacro("last", PAIR);
addStandardMacro("sep", PAIR);
addStandardMacro("var", UNPAIRED);
addStandardMacro("assign", UNPAIRED);
addStandardMacro("default", UNPAIRED);
addStandardMacro("dump", UNPAIRED);
addStandardMacro("debugbreak", UNPAIRED);
addStandardMacro("l", UNPAIRED);
addStandardMacro("r", UNPAIRED);
addStandardMacro("_", PAIR);
addStandardMacro("=", UNPAIRED);
addStandardMacro("?", UNPAIRED);
addStandardMacro("php", UNPAIRED);
addStandardMacro("capture", PAIR);
addStandardMacro("include", UNPAIRED);
addStandardMacro("use", UNPAIRED);
addStandardMacro("class", ATTR_ONLY);
addStandardMacro("attr", ATTR_ONLY);
// FormMacros
addStandardMacro("form", PAIR);
addStandardMacro("formContainer", PAIR);
addStandardMacro("label", AUTO_EMPTY);
addStandardMacro("input", UNPAIRED);
addStandardMacro("name", ATTR_ONLY);
addStandardMacro("inputError", UNPAIRED);
// BlockMacros
LatteMacro includeBlock = addStandardMacro("includeblock", UNPAIRED);
includeBlock.deprecated = true;
includeBlock.deprecatedMessage = "Macro includeblock is deprecated in Latte 2.4. Use import macro instead.";
addStandardMacro("import", UNPAIRED);
addStandardMacro("extends", UNPAIRED);
addStandardMacro("layout", UNPAIRED);
addStandardMacro("block", PAIR);
addStandardMacro("define", PAIR);
addStandardMacro("snippet", PAIR);
addStandardMacro("snippetArea", PAIR);
// addStandardMacro("ifset", PAIR);
addStandardMacro("widget", UNPAIRED);
addStandardMacro("control", UNPAIRED);
addStandardMacro("href", ATTR_ONLY);
addStandardMacro("plink", UNPAIRED);
addStandardMacro("link", UNPAIRED);
addStandardMacro("ifCurrent", PAIR);
addStandardMacro("contentType", UNPAIRED);
addStandardMacro("status", UNPAIRED);
}
/**
* @return macro with given name or null macro is not available
*/
@Nullable
public LatteMacro getMacro(Project project, String name) {
if (standardMacros.containsKey(name)) {
return standardMacros.get(name);
}
Map<String, LatteMacro> projectMacros = getCustomMacros(project);
if (projectMacros.containsKey(name)) {
return projectMacros.get(name);
}
return null;
}
/**
* @return list of standard macros
*/
@NotNull
public Map<String, LatteMacro> getStandardMacros() {
return Collections.unmodifiableMap(standardMacros);
}
/**
* @return custom (project-specific) macros
*/
@NotNull
public Map<String, LatteMacro> getCustomMacros(Project project) {
if (!customMacros.containsKey(project)) {
Map<String, LatteMacro> projectMacros = new HashMap<String, LatteMacro>();
for (LatteMacro.Type type : LatteMacro.Type.values()) {
for (String name : getCustomMacroList(project, type)) {
projectMacros.put(name, new LatteMacro(name, type));
}
}
customMacros.put(project, projectMacros);
}
return Collections.unmodifiableMap(customMacros.get(project));
}
private void addStandardMacro(LatteMacro macro) {
standardMacros.put(macro.name, macro);
}
private LatteMacro addStandardMacro(String name, LatteMacro.Type type) {
LatteMacro macro = new LatteMacro(name, type);
addStandardMacro(macro);
return macro;
}
/**
* Registers a custom (project-specific) macro.
*/
public void addCustomMacro(Project project, LatteMacro macro) {
getCustomMacros(project);
customMacros.get(project).put(macro.name, macro);
PropertiesComponent storage = PropertiesComponent.getInstance(project);
String key = getStorageKey(macro.type);
List<String> list = getCustomMacroList(project, macro.type);
list.add(macro.name);
storage.setValues(key, list.toArray(new String[list.size()]));
}
@NotNull
private List<String> getCustomMacroList(Project project, LatteMacro.Type macroType) {
PropertiesComponent storage = PropertiesComponent.getInstance(project);
String key = getStorageKey(macroType);
String[] values = storage.getValues(key);
List<String> list = new ArrayList<String>();
if (values != null) Collections.addAll(list, values);
return list;
}
@NotNull
private String getStorageKey(LatteMacro.Type macroType) {
String key = "latte.";
if (macroType == PAIR) key += "pair";
else if (macroType == UNPAIRED) key += "unpaired";
else if (macroType == ATTR_ONLY) key += "attr_only";
else if (macroType == AUTO_EMPTY) key += "auto_empty";
else key += "wtf";
return key;
}
}