mozilla
Your Search Results

    Template:ContentFromWikimo

    <%
    // Fetches the content from the specified wiki.mozilla.org page,
    // then extracts the block with the specified ID, returning
    // it.
    //
    // Parameters:
    //  $0  Page to fetch (the text after https://wiki.mozilla.org/
    //  $1  ID of the block to return
    //  $2  Class to add to the returned block (optional)
    //  $3  Name of an attribute to remove from the block (usually "style") (optional)
    
    var output = "";
    
    var mdn = require("MDN:Common");
    
    var addClass = $2 || "";
    var removeAttribute = $3 || "";
    
    //------ HTML parser from http://ejohn.org/files/htmlparser.js
    
    function makeMap(str){
        var obj = {}, items = str.split(",");
    	for ( var i = 0; i < items.length; i++ )
    		obj[ items[i] ] = true;
    	return obj;
    }
    
    // Regular Expressions for parsing tags and attributes
    var startTag = /^<([-A-Za-z0-9_]+)((?:\s+\w+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,
    	endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/,
    	attr = /([-A-Za-z0-9_]+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;
    	
    // Empty Elements - HTML 4.01
    var empty = makeMap("area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed");
    
    // Block Elements - HTML 4.01
    var block = makeMap("address,applet,blockquote,body,button,center,dd,del,dir,div,dl,dt,fieldset,form,frameset,hr,html,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,p,pre,script,table,tbody,td,tfoot,th,thead,tr,ul");
    
    // Inline Elements - HTML 4.01
    var inline = makeMap("a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var");
    
    // Elements that you can, intentionally, leave open
    // (and which close themselves)
    var closeSelf = makeMap("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr");
    
    // Attributes that have their values filled in disabled="disabled"
    var fillAttrs = makeMap("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected");
    
    // Special Elements (can contain anything)
    var special = makeMap("script,style");
    
    function HTMLParser( html, handler ) {
    	var index, chars, match, stack = [], last = html;
    
        stack.last = function() {
    		return this[ this.length - 1 ];
    	};
    
    	while ( html ) {
    		chars = true;
    
    		// Make sure we're not in a script or style element
    		if ( !stack.last() || !special[ stack.last() ] ) {
    
    			// Comment
    			if ( html.indexOf("<!--") == 0 ) {
    				index = html.indexOf("-->");
    
    				if ( index >= 0 ) {
    					if ( handler.comment )
    						handler.comment( html.substring( 4, index ) );
    					html = html.substring( index + 3 );
    					chars = false;
    				}
    
    			// end tag
    			} else if ( html.indexOf("</") == 0 ) {
    				match = html.match( endTag );
    
    				if ( match ) {
    					html = html.substring( match[0].length );
    					match[0].replace( endTag, parseEndTag );
    					chars = false;
    				}
    
    			// start tag
    			} else if ( html.indexOf("<") == 0 ) {
    				match = html.match( startTag );
    
    				if ( match ) {
    					html = html.substring( match[0].length );
    					match[0].replace( startTag, parseStartTag );
    					chars = false;
    				}
    			}
    
    			if ( chars ) {
    				index = html.indexOf("<");
    				
    				var text = index < 0 ? html : html.substring( 0, index );
    				html = index < 0 ? "" : html.substring( index );
    				
    				if ( handler.chars )
    					handler.chars( text );
    			}
    
    		} else {
    			html = html.replace(new RegExp("(.*)<\/" + stack.last() + "[^>]*>"), function(all, text){
    				text = text.replace(/<!--(.*?)-->/g, "$1")
    					.replace(/<!\[CDATA\[(.*?)]]>/g, "$1");
    
    				if ( handler.chars )
    					handler.chars( text );
    
    				return "";
    			});
    
    			parseEndTag( "", stack.last() );
    		}
    
    		if ( html == last ) {
                log.debug("Parse error at: " + html);
                break;
    		}
    		last = html;
    	}
    	
    	// Clean up any remaining tags
    	parseEndTag();
    
    	function parseStartTag( tag, tagName, rest, unary ) {
    		tagName = tagName.toLowerCase();
    
    		if ( block[ tagName ] ) {
    			while ( stack.last() && inline[ stack.last() ] ) {
    				parseEndTag( "", stack.last() );
    			}
    		}
    
    		if ( closeSelf[ tagName ] && stack.last() == tagName ) {
    			parseEndTag( "", tagName );
    		}
    
    		unary = empty[ tagName ] || !!unary;
    
    		if ( !unary )
    			stack.push( tagName );
    		
    		if ( handler.start ) {
    			var attrs = [];
    
    			rest.replace(attr, function(match, name) {
    				var value = arguments[2] ? arguments[2] :
    					arguments[3] ? arguments[3] :
    					arguments[4] ? arguments[4] :
    					fillAttrs[name] ? name : "";
    				
    				attrs.push({
    					name: name,
    					value: value,
    					escaped: value.replace(/(^|[^\\])"/g, '$1\\\"') //"
    				});
    			});
    
    			if ( handler.start )
    				handler.start( tagName, attrs, unary );
    		}
    	}
    
    	function parseEndTag( tag, tagName ) {
            var pos = 0;
            
    		// If no tag name is provided, clean shop
    		if ( !tagName ) {
    			pos = 0;
    		// Find the closest opened tag of the same type
    		} else {
    			for ( pos = stack.length - 1; pos >= 0; pos-- )
    				if ( stack[ pos ] == tagName )
    					break;
    		}
    		
    		if ( pos >= 0 ) {
    			// Close all the open elements, up the stack
    			for ( var i = stack.length - 1; i >= pos; i-- )
    				if ( handler.end )
    					handler.end( stack[ i ] );
    			
    			// Remove the open elements from the stack
    			stack.length = pos;
    		}
    	}
    };
    //------ Function to get the block with a specified ID
    
    function findBlockByID(html, id) {
        var result = "";
        var inRequestedBlock = false;
        var done = false;
        var depth = 0;
                
        HTMLParser(html, {
            start: function(tag, attrs, unary) {
                var inserted = false;
                
                if (!done) {
                    for (var i=0; i<attrs.length; i++) {
                        if (attrs[i].name.toLowerCase() == "id") {
                            if (attrs[i].value == id) {
                                inRequestedBlock = true;
                                result += "<" + tag;
                                
                                for (i=0; i<attrs.length; i++) {
                                    if (attrs[i].name.toLowerCase() != removeAttribute) {
                                        result += " " + attrs[i].name + '="' + attrs[i].escaped + '"';
                                    }
                                }
                                
                                // Now add our custom class, if any
                                
                                if (addClass.length) {
                                    result += " class='" + addClass + "'";
                                }
                                
                                result += ">";
                                depth = 0;  // When depth reaches 0 again, we've closed this tag
                                inserted = true;
                                break;      // Stop scanning attributes here
                            }
                        }
                    }
                }
                
                if (!done && inRequestedBlock) {
                    if (!inserted) {
                        result += "<" + tag;
                        
                        for (i=0; i<attrs.length; i++) {
                            result += " " + attrs[i].name + '="' + attrs[i].escaped + '"';
                        }
                        
                        result += ">";
                    }
                    depth++;
                }
            },
            
            end: function(tag) {            // End tag (tag = tag's name)
                if (inRequestedBlock && !done) {
                    result += "</" + tag + ">";
                    depth--;
                    if (!depth) {
                        done = true;
                    }
                }
            },
            
            chars: function(text) {         // Text that's not part of a tag
                if (inRequestedBlock && !done) {
                    result += text;
                }
            },
            
            comment: function(text) {       // Comment string
                // We don't care about comments, so do nothing
            }
        });
        
        return result;
    };
    
    //------ Main code --------
    
    var domain = encodeURI("https://wiki.mozilla.org");
    var title = encodeURI($0);
    var url = domain + '/api.php?format=json&action=query&titles=' + title + '&prop=revisions&rvprop=content&rvparse=1&indexpageids';
    
    var reply = mdn.fetchJSONResource(url);
    
    if (reply != null) {
        var pageid = reply.query.pageids[0];
        if (pageid) {
            output = "<div style='border:1px solid #ddd; padding:0px 2px; display:inline-block;'>";
            output += findBlockByID(reply.query.pages[pageid].revisions[0]["*"], $1);
            
            // Add license information
            
            var tooltip = mdn.localString({
                "en-US":    "This content from MozillaWiki is licensed under the Creative Commons Attribution-ShareAlike license (CC-BY-SA) version 3.0 or later."
            });
            
            output += "<a href='http://creativecommons.org/licenses/by-sa/3.0/' style='float:right;' title='" + tooltip + "'><img src='/files/8305/cc-by-sa-icon.png'></a>";
            output += "</div>";
        }
    }
    %>
    <%-output%>
    Search for pages that use Template:ContentFromWikimo to see example use cases and how many pages use this macro.

    Document Tags and Contributors

    Contributors to this page: Sheppy
    Last updated by: Sheppy,