Toggle navigation
Log-in
Register
Home
Page Index
User Index
Application Index
Global
Languages
Default Language
Wiki Index
XWiki
XWiki Syntax Guide
Wiki source code of
XWiki Syntax Guide
Last modified by
Marcel Heckel
on 2017/01/25 10:29
Hide line numbers
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}}