Wiki source code of XWiki Syntax Guide
Last modified by superadmin on 2017/11/28 14:52
1 | {{velocity output="false"}} |
2 | #set($SUPPORTED_SYNTAXES = {}) |
3 | #set($void = $SUPPORTED_SYNTAXES.put('1.0', 'XWiki Syntax 1.0')) |
4 | #set($void = $SUPPORTED_SYNTAXES.put('2.0', 'XWiki Syntax 2.0')) |
5 | #set($void = $SUPPORTED_SYNTAXES.put('2.1', 'XWiki Syntax 2.1')) |
6 | ## |
7 | ## needed for sections that contain descriptions valid for several syntaxes |
8 | ## basically it is hack to reuse the 2.0 descriptions for 2.1 |
9 | #set($SUPPORTED_SYNTAX_ORDER = ['1.0', '2.0', '2.1']) |
10 | ## |
11 | ## filter all syntaxes that are not installed/configured |
12 | #set($configuredSyntaxes = $services.rendering.getConfiguredSyntaxes()) |
13 | #set($enabledSyntaxIds = []) |
14 | #foreach($syntax in $configuredSyntaxes) |
15 | #set($discard = $enabledSyntaxIds.add($syntax.toIdString())) |
16 | #end |
17 | #set($unavailableSyntaxes=[]) |
18 | #foreach($supportedSyntax in $SUPPORTED_SYNTAX_ORDER) |
19 | #set($fullSyntaxId = "xwiki/$supportedSyntax") |
20 | #if(!$enabledSyntaxIds.contains($fullSyntaxId)) |
21 | #set($discard = $unavailableSyntaxes.add($supportedSyntax)) |
22 | #end |
23 | #end |
24 | #foreach($unavailableSyntax in $unavailableSyntaxes) |
25 | #set($discard = $SUPPORTED_SYNTAX_ORDER.remove($unavailableSyntax)) |
26 | #set($discard = $SUPPORTED_SYNTAXES.removeKey($unavailableSyntax)) |
27 | #end |
28 | |
29 | #if ($request.xaction == 'switchContext') |
30 | $response.sendRedirect($request.target) |
31 | #stop |
32 | #end |
33 | |
34 | #set ($crtCategoryId = "$!{request.category}") |
35 | #if ($crtCategoryId != '') |
36 | #set ($crtCategoryId = $mathtool.toInteger($crtCategoryId)) |
37 | #end |
38 | #set ($crtSectionId = "$!{request.section}") |
39 | #set ($crtSyntaxVer = "$!{request.syntax}") |
40 | #if (!$SUPPORTED_SYNTAXES.containsKey($crtSyntaxVer)) |
41 | ## Default to the most current one (if we have any) |
42 | #if(!$SUPPORTED_SYNTAX_ORDER.isEmpty()) |
43 | #set ($crtSyntaxVer = $SUPPORTED_SYNTAX_ORDER.get($mathtool.sub($SUPPORTED_SYNTAX_ORDER.size(),1))) |
44 | #end |
45 | #end |
46 | #set($crtSyntaxPos = $SUPPORTED_SYNTAX_ORDER.indexOf($crtSyntaxVer)) |
47 | |
48 | #set ($extraParamList = []) |
49 | #if ($request.language) |
50 | #set ($discard = $extraParamList.add("language=$escapetool.url($request.language)")) |
51 | #end |
52 | #if ($request.xpage) |
53 | #set ($discard = $extraParamList.add("xpage=$escapetool.url($request.xpage)")) |
54 | #end |
55 | #if ($extraParamList.isEmpty()) |
56 | #set ($extraParams = '') |
57 | #else |
58 | #set ($extraParams = '&'+$stringtool.join($extraParamList,'&')) |
59 | #end |
60 | |
61 | ## |
62 | ## Syntax menu map |
63 | ## |
64 | #set($syntaxMenu = []) |
65 | #set($catCount = -1) |
66 | #set($catName = "") |
67 | #set($catChildren = []) |
68 | #set($results = $services.query.xwql('from doc.object(XWiki.XWikiSyntaxClass) as syntax order by syntax.category, syntax.section').addFilter('currentlanguage').addFilter('unique').execute()) |
69 | |
70 | #if($results.empty) |
71 | No syntax sections found! |
72 | #else |
73 | #foreach ($item in $results) |
74 | #set($sectionDoc = $xwiki.getDocument($item)) |
75 | #set($obj = $sectionDoc.getObject("XWiki.XWikiSyntaxClass")) |
76 | |
77 | ## detect if we entered a new category |
78 | #if($catCount < $obj.getProperty("category").value) |
79 | ## Put previous category into map (if existing), and reset children map |
80 | #if($catId) |
81 | #set($cat = { 'id' : $catId, 'name' : $catName, 'children' : $catChildren }) |
82 | $syntaxMenu.add($cat) |
83 | #set($catChildren = []) |
84 | #end |
85 | ## extract new catId and catName values, and sectionTitle as we are already traveling the DOM |
86 | #foreach($headerBlock in $sectionDoc.getDocument().getXDOM().getBlocks('class:HeaderBlock', 'DESCENDANT')) |
87 | #if($headerBlock.getLevel().getAsInt() == 1) |
88 | #set($catId = $headerBlock.getId().substring(1)) |
89 | #set($catName = $services.rendering.render($headerBlock, 'plain/1.0')) |
90 | #elseif($headerBlock.getLevel().getAsInt() == 2) |
91 | #set($sectionTitle = $services.rendering.render($headerBlock, 'plain/1.0')) |
92 | #break |
93 | #end |
94 | #end |
95 | #foreach($headerBlock in $sectionDoc.getTranslatedDocument().getDocument().getXDOM().getBlocks('class:HeaderBlock', 'DESCENDANT')) |
96 | #if($headerBlock.getLevel().getAsInt() == 1) |
97 | #set($catName = $services.rendering.render($headerBlock, 'plain/1.0')) |
98 | #elseif($headerBlock.getLevel().getAsInt() == 2) |
99 | #set($sectionTitle = $services.rendering.render($headerBlock, 'plain/1.0')) |
100 | #break ## otherwise finds nested example headlines |
101 | #end |
102 | #end |
103 | #set($catCount = $obj.getProperty("category").value) |
104 | #else |
105 | ## still in same category, only need new section title |
106 | #foreach($headerBlock in $sectionDoc.getTranslatedDocument().getDocument().getXDOM().getBlocks('class:HeaderBlock', 'DESCENDANT')) |
107 | #if($headerBlock.getLevel().getAsInt() == 2) |
108 | #set($sectionTitle = $services.rendering.render($headerBlock, 'plain/1.0')) |
109 | #break |
110 | #end |
111 | #end |
112 | #end |
113 | |
114 | ## Add new sections to category children map |
115 | #set($child = {'id' : $sectionDoc.getName().substring(11), 'minSyntax' : $obj.getProperty("minSyntaxId").value, 'maxSyntax' : $obj.getProperty("maxSyntaxId").value, 'name' : $sectionTitle}) |
116 | $catChildren.add($child) |
117 | #end |
118 | #end |
119 | #set($cat = { 'id' : $catId, 'name' : $catName, 'children' : $catChildren }) |
120 | $syntaxMenu.add($cat) |
121 | |
122 | |
123 | ## |
124 | ## Filter only the sections that are valid for a Syntax |
125 | ## |
126 | #set ($categoriesToRemove = []) |
127 | #foreach ($category in $syntaxMenu) |
128 | #set ($sectionsToRemove = []) |
129 | #foreach ($section on $category.children) |
130 | #set($minSyntaxPos = $SUPPORTED_SYNTAX_ORDER.indexOf($section.minSyntax)) |
131 | #if ($minSyntaxPos > $crtSyntaxPos) |
132 | #set ($discard = $sectionsToRemove.add($section)) |
133 | #if ($section.id == $crtSectionId) |
134 | #set ($crtSectionId = '') ## clear section if it doesn't exist (can happen when switching from 2.x to 1.0 syntax) |
135 | #end |
136 | #end |
137 | #end |
138 | #set ($discard = $category.children.removeAll($sectionsToRemove)) |
139 | #if ($category.children.size() == 0) |
140 | #set ($discard = $categoriesToRemove.add($category)) |
141 | #end |
142 | #end |
143 | #set ($discard = $syntaxMenu.removeAll($categoriesToRemove)) |
144 | #if ("$!crtCategoryId" != '' && $crtCategoryId >= $syntaxMenu.size()) |
145 | #set ($crtCategoryId = '') |
146 | #end |
147 | |
148 | #if ($crtSectionId != '') |
149 | #set ($crtItemId = $crtSectionId) |
150 | #elseif ($crtCategoryId != '') |
151 | #set ($crtItemId = $syntaxMenu.get($crtCategoryId).id) |
152 | #end |
153 | #set ($crtSection = $util.null) |
154 | #set ($crtCategory = $util.null) |
155 | |
156 | |
157 | ## |
158 | ## Prepare the Syntax menu map for processing |
159 | ## |
160 | #foreach ($category in $syntaxMenu) |
161 | ## "Standard" URLs and icons for categories |
162 | #set ($category.url = "?syntax=$escapetool.url(${crtSyntaxVer})&category=${mathtool.sub($velocityCount, 1)}${extraParams}") |
163 | #set ($category.cssClass = "${category.id}Icon") |
164 | #if ("$!{crtCategoryId}" != '' && $velocityCount == $mathtool.add($crtCategoryId, 1)) |
165 | #set ($crtCategory = $category) |
166 | #end |
167 | ## |
168 | ## Process each syntax section |
169 | #foreach ($section in $category.children) |
170 | #if ($xwiki.exists("XWiki.XWikiSyntax${section.id}")) |
171 | #if ($crtSectionId == $section.id) |
172 | #set ($crtSection = $section) |
173 | #set ($crtCategory = $category) |
174 | #end |
175 | #set ($section.url = "?syntax=$escapetool.url(${crtSyntaxVer})§ion=$escapetool.url(${section.id})${extraParams}") |
176 | #end |
177 | #end |
178 | #end |
179 | |
180 | #** |
181 | * Displays the sections from a syntax category |
182 | * |
183 | * Expected format: |
184 | * sections = vector of items |
185 | * item = map with the following fields: |
186 | * 'id' : mandatory |
187 | * 'name' : the text displayed for the corresponding menu item; |
188 | * optional, defaults to |
189 | * $services.localization.render("$!{translationPrefix}${item.id}") |
190 | * |
191 | * @param $sections the sections list, in the format described above |
192 | * @param $translationPrefix the translation prefix added to the id of each |
193 | * item, in order to generate the name and description; ignored when |
194 | * name or description are specified |
195 | * @param $heading the heading syntax |
196 | *# |
197 | #macro(syntax_displayCategory $sections $translationPrefix $heading) |
198 | #foreach ($section in $sections) |
199 | #syntax_displaySection($section $translationPrefix $heading) |
200 | #end |
201 | #end |
202 | |
203 | #macro(syntax_displaySection $section $translationPrefix $heading) |
204 | #set ($displayVersion = $crtSyntaxVer) |
205 | ## here is the hack to display the description for 2.0 if we have no description for 2.x |
206 | ## this likely needs more work if e.g. there is a 3.x which is not compatible with 2.x |
207 | #set($maxSyntaxPos = $SUPPORTED_SYNTAX_ORDER.indexOf($section.maxSyntax)) |
208 | #if ($crtSyntaxPos > $maxSyntaxPos) |
209 | #set ($displayVersion = $section.maxSyntax) |
210 | #end |
211 | #if($heading) |
212 | (% class="sectionheader" %) |
213 | $heading $section.name $heading |
214 | |
215 | #end |
216 | {{include reference="XWiki.XWikiSyntax${section.id}" section="H${displayVersion}${section.id}"/}} |
217 | #end |
218 | |
219 | |
220 | #** |
221 | * Displays the syntax categories |
222 | * |
223 | * Expected format: |
224 | * sections = vector of items |
225 | * item = map with the following fields: |
226 | * 'id' : mandatory |
227 | * 'name' : the text displayed for the corresponding menu item; |
228 | * optional, defaults to |
229 | * $services.localization.render("$!{translationPrefix}${item.id}") |
230 | * |
231 | * @param $sections the sections list, in the format described above |
232 | * @param $translationPrefix the translation prefix added to the id of each |
233 | * item, in order to generate the name and description; ignored when |
234 | * name or description are specified |
235 | *# |
236 | #macro(syntax_displayCategories $syntaxMenu $translationPrefix) |
237 | #set ($subHeading = '====') |
238 | #foreach ($category in $syntaxMenu) |
239 | == $category.name == |
240 | |
241 | #syntax_displayCategory($category.children 'syntax.' '===') |
242 | #end |
243 | #end |
244 | |
245 | #** |
246 | * Displays the drop down allowing to switch the syntax. |
247 | *# |
248 | #macro (syntaxSwitch) |
249 | #set ($crtSelection = "") |
250 | #if ("$!{crtCategoryId}" != '') |
251 | #set ($crtSelection = "category=$escapetool.url($!{crtCategoryId})") |
252 | #elseif ($crtSectionId != '') |
253 | #set ($crtSelection = "section=$escapetool.url($!{crtSectionId})") |
254 | #end |
255 | #if ($crtSelection != "") |
256 | #set ($crtSelection = "${crtSelection}${extraParams}") |
257 | #else |
258 | #set ($crtSelection = "$extraParams") |
259 | #end |
260 | {{html}} |
261 | <form id="change-context" class="xformInline" action="$doc.getURL()"> |
262 | <div> |
263 | <input type="hidden" name="xaction" value="switchContext" /> |
264 | #if ($request.language) |
265 | <input type="hidden" name="language" value="$escapetool.xml($request.language)" /> |
266 | #end |
267 | #if ($request.xpage) |
268 | <input type="hidden" name="xpage" value="$escapetool.xml($request.xpage)" /> |
269 | #end |
270 | <select id="goto-select" name="target" title="$escapetool.xml($services.localization.render("help.changesyntax"))"> |
271 | <optgroup label="$services.localization.render('help.choose_syntax')"> |
272 | #foreach($syntaxId in $SUPPORTED_SYNTAX_ORDER) |
273 | #set ($query = "syntax=${escapetool.url($syntaxId)}&${crtSelection}") |
274 | <option value="$escapetool.xml($doc.getURL('view', $query))"#if($crtSyntaxVer == $syntaxId) selected="selected"#end>$escapetool.html($SUPPORTED_SYNTAXES.get($syntaxId))</option> |
275 | #end |
276 | </optgroup> |
277 | </select> |
278 | <span class="buttonwrapper"><input type="submit" value="$escapetool.xml($services.localization.render('admin.switchContext'))" class="button" /></span> |
279 | </div> |
280 | </form> |
281 | {{/html}} |
282 | #end |
283 | {{/velocity}} |
284 | |
285 | {{velocity}} |
286 | ##************************************************************************************************** |
287 | ## From the Administration Sheet, used to display a common UI for some wiki features |
288 | ## here used to display all categories / sections of the syntax guide |
289 | ##************************************************************************************************** |
290 | $xwiki.get('jsx').use($doc.getFullName())## |
291 | $xwiki.get('ssx').use($doc.getFullName())## |
292 | #if ($crtSectionId != '') |
293 | #set ($sectionName = ${crtSection.name}) |
294 | #elseif ($crtCategoryId != '') |
295 | #set ($sectionName = ${crtCategory.name}) |
296 | #else |
297 | #set ($sectionName = $services.localization.render("help.syntaxall")) |
298 | #end |
299 | #set ($syntaxTitle = $services.localization.render("help.syntaxtitle", ["${crtSyntaxVer}"])) |
300 | #syntaxSwitch() |
301 | ((( |
302 | #set ($query = "syntax=$escapetool.url(${crtSyntaxVer})${extraParams}") |
303 | #if ($crtCategory){{html}}<a href="${doc.getURL('view', ${query})}">$syntaxTitle</a>{{/html}}#{else}(% class="current" %)$syntaxTitle#{end}#if ($crtCategory) » #if ($crtSection){{html}}<a href="${crtCategory.url}">${crtCategory.name}</a>{{/html}}#{else}(% class="current" %)${crtCategory.name}#{end}#if ($crtSection) » (% class="current" %)${crtSection.name}#end#end |
304 | ))) |
305 | == $syntaxTitle: $sectionName == |
306 | |
307 | #verticalNavigation($syntaxMenu {'translationPrefix' : 'syntax.', 'crtItemId' : "$!crtItemId", 'cssClass' : 'syntax-menu'}) |
308 | ##----------------------------------------- |
309 | ## syntax-page display |
310 | ##----------------------------------------- |
311 | #set ($subHeading = '===') |
312 | (% id="syntax-page-content" %)((( |
313 | #if(!$crtSection && !$crtCategory) |
314 | #syntax_displayCategories($syntaxMenu 'syntax.') |
315 | #elseif (!$crtSection) |
316 | #syntax_displayCategory($crtCategory.children 'syntax.' '==') |
317 | #else |
318 | #syntax_displaySection($crtSection 'syntax.' false) |
319 | #end |
320 | ))) ## syntax-page-content |
321 | {{/velocity}} |