Template:TagCloud

    Inhaltsverzeichnis
    keine Gliederung

    Version seit 21:36, 23 Nov 2024

    zu dieser Version.

    Zurück zu Versionshistorie.

    Zeige aktuelle Version

    /***
        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 ?? 0;
    var tagsToExclude = $exclude ?? [ ];
    var fontSizeUnits = $fontSizeUnits ?? "%"; 
    var fontSizeMin = $fontSizeMin ?? 80; 
    var fontSizeMax = $fontSizeMax ?? 240;
    var fontColorRMin = $fontColorRMin ?? 236;
    var fontColorRMax = $fontColorRMax ?? 224;
    var fontColorGMin = $fontColorGMin ?? 95;
    var fontColorGMax = $fontColorGMax ?? 10;
    var fontColorBMin = $fontColorBMin ?? 11;
    var fontColorBMax = $fontColorBMax ?? 27;
    
    // 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>
    
    Deki Appliance - Powered by TurnKey Linux