Inhaltsverzeichnis
keine Gliederung
/*** USAGE: TagCloud() build a tag cloud from a search query. PARAMETERS: query: str query string for selecting pages on which the tag could is built on (default: all pages) showCount: bool show number of occurrences of the tag (default: true) max: num limit tag cloud to top X tags (default: 10) order: str order tags by name or frequency (either "count" or "name"; default: "name) exclude: list list of tags to exclude from tag cloud fontSizeUnits: str display units for font size (default: "%") fontSizeMin: num smallest display font (default: 80) fontSizeMax: num largest display font size (default: 240) fontColorRMin: num lowest color value for red (default: 50) fontColorRMax: num highest color value for red (default: 50) fontColorGMin: num lowest color value for green (default: 200) fontColorGMax: num highest color value for green (default: 100) fontColorBMin: num lowest color value for blue (default: 50) fontColorBMax: num highest color value for blue (default: 50) ***/ var searchString = $query ?? ""; var hitShow = $showcount ?? true; var tagOrder = $order ?? "name"; var tagsLimit = $max ?? 10; var tagsToExclude = $exclude ?? [ ]; var fontSizeUnits = $fontSizeUnits ?? "%"; var fontSizeMin = $fontSizeMin ?? 80; var fontSizeMax = $fontSizeMax ?? 240; var fontColorRMin = $fontColorRMin ?? 50; var fontColorRMax = $fontColorRMax ?? 50; var fontColorGMin = $fontColorGMin ?? 200; var fontColorGMax = $fontColorGMax ?? 100; var fontColorBMin = $fontColorBMin ?? 50; var fontColorBMax = $fontColorBMax ?? 50; // TODO: figure out what this is supposed to do if(__request.args.q) { <div id='tagResults'> <b> "Pages tagged with "; <u> __request.args.q; </u> " in this section "; </b> wiki.search("tag:"..string.quote(__request.args.q).."", 1000, "title", searchString); <a href=("Special:Tags?tag=" .. web.UriEncode(__request.args.q))> "See all pages tagged with " .. __request.args.q .. " across entire site"; </a> " »"; var defined = __request.args.q; var found = wiki.getsearch("tag:" .. string.quote(defined), 1, _,"type:wiki"); if(#found) { var def = found[0].tags[defined].definition; if(def) { <br />; <a href=(def.uri)> "Go to the " .. __request.args.q .. " definition page"; </a> " »"; } } </div> } // convert list of excluded tags into a map (easier to check if tag is excluded) let tagsToExclude = { (t): true foreach var t in tagsToExclude }; // compute map of tags based on search string and excluded tags (note: only pages have tags) var myResults = wiki.getsearch(searchString, 1000, _, "type:wiki"); var tagMap = { }; foreach(var p in myResults, if __index < 250, var t in map.keys(p.tags ?? {}) where !tagsToExclude[t]) { var tag = string.startswith(t, "define:") ? string.substr(t, 7) : t; let tagMap ..= { (tag) : 1 + (tagMap[tag] ?? 0) }; } // compute list of tags sorted by occurrence count var tagListofMaps = [ { name: t, count: tagMap[t] } foreach var t in map.keys(tagMap) where tagMap[t] > 0 ]; var tagsTotal = #tagListofMaps; let tagListofMaps = list.sort(tagListofMaps, 'count', true); if ((tagsLimit > 0) && !__request.args.alltags) { let tagListofMaps = list.splice(tagListofMaps, tagsLimit); } var maxValue = tagListofMaps[0].count; var minValue = tagListofMaps[#tagListofMaps-1].count; // sort display of tags by frequency or name let tagListofMaps = (tagOrder == "name" ? list.sort(tagListofMaps, 'name', false) : list.sort(tagListofMaps, 'count', true)); // emit tag cloud <div id="tagCloud"> <ul> foreach (var tm in tagListofMaps) { var tag = string.tocamelcase(tm.name); var tagURI = page.uri & { q: tag } .. '#tagResults'; var count = tm.count; var weight = ( num.log(count) - num.log(minValue)) / ( num.log(maxValue) - num.log(minValue)); var fontSize = fontSizeMin + num.round((fontSizeMax - fontSizeMin) * weight); var fontColorR = fontColorRMin + num.round((fontColorRMax - fontColorRMin) * weight); var fontColorG = fontColorGMin + num.round((fontColorGMax - fontColorGMin) * weight); var fontColorB = fontColorBMin + num.round((fontColorBMax - fontColorBMin) * weight); <li style=("padding-left: 1ex; display: inline-block; font-size:" .. fontSize .. fontSizeUnits)> var rgb = "rgb(" ..fontColorR .. "," .. fontColorG .. "," .. fontColorB .. ")"; <a href=(tagURI) style=("color:" .. rgb .. ";")> tag </a> if(hitShow) { <sup style=("color:" .. rgb .. "; font-size: x-small;")>"(" .. count .. ")"</sup> } </li> } if (!__request.args.alltags && (tagsLimit > 0) && (tagsTotal > tagsLimit)) { <li style="display:block"> "Showing top " .. tagsLimit .. " tags. "; <a href=(page.uri & { alltags: _ } .. "#tagCloud")>"See all ".. tagsTotal .. " tags"</a>; " »"; </li> } </ul> </div>