Jump to content

MediaWiki:Gadget-TemplatePreloader.js

From Wikisource

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/* Preload Template:Header when adding a new text */
/* For help, see '''Help:Header preloading script gadget''' */
function preloadHeaderTemplate()
{
    var wpTextbox1 = document.getElementById("wpTextbox1")
    if (wpTextbox1.value == "")
    {
        //fill in header template
        var subpageDepth = 0
        var isSubpage
        var pathToTOC = "" //typically "../"
        var subpageTitle
        var subpageTitleRegExp
        var rawBasePageRequest
        var tocPageTitle
        var beginningOfShortSectionTitle //for example, if tocPageTitle == "Democracy in America/Volume 2", then beginningOfShortSectionTitle == "Volume 2, " - this is used to determine the values for "previous" and "next"
        var rawTocPageRequest //table of contents page
        var rawTocPageWithoutHeader
        
        //title
        var wpTextbox1value = "{{header\n | title      = "
        if (mw.config.get('wgTitle').indexOf("/") != -1) //a slash could indicate that it's a subpage
        {
            rawBasePageRequest = new XMLHttpRequest()
            
            //determine where the base page name ends and where the subpage name begins
            for (var slashPosition = mw.config.get('wgTitle').indexOf("/"); slashPosition != -1; slashPosition = mw.config.get('wgTitle').indexOf("/", slashPosition + 1))
            {
                rawBasePageRequest.open("GET", mw.config.get('wgServer') + mw.config.get('wgScript') + "?title=" + mw.config.get('wgTitle').substr(0, slashPosition) + "&action=raw", false)
                rawBasePageRequest.send(null)
                
                if (rawBasePageRequest.responseText != "") //base page found
                {
                    wpTextbox1value += "[["
                    
                    //output however many "../" will take us to the base page
                    for (var i = mw.config.get('wgTitle').lastIndexOf("/"); i >= slashPosition; i = mw.config.get('wgTitle').lastIndexOf("/", i - 1))
                    {
                        wpTextbox1value += "../"
                        subpageDepth += 1
                    }
                    
                    wpTextbox1value += "]]"
                    
                    isSubpage = true
                    break
                }
            }
            
            //output
            if (isSubpage == false) //despite the slash in this page's title, no base page was found, so assume that this page is the base page (for example, "9/11 Commission Report")
            {
                wpTextbox1value += mw.config.get('wgTitle')
            }
            
            //round 2: find the table of contents page, not necessarily the same as the base page
            var slashPosition = mw.config.get('wgTitle').lastIndexOf("/")
            if (subpageDepth > 1)
            {
                rawTocPageRequest = new XMLHttpRequest()
                
                for (; slashPosition != -1; slashPosition = mw.config.get('wgTitle').lastIndexOf("/", slashPosition - 1))
                {
                    pathToTOC += "../"
                    
                    tocPageTitle = mw.config.get('wgTitle').substr(0, slashPosition) //will be used later
                    rawTocPageRequest.open("GET", mw.config.get('wgServer') + mw.config.get('wgScript') + "?title=" + tocPageTitle + "&action=raw", false)
                    rawTocPageRequest.send(null)
                    
                    if (rawTocPageRequest.responseText != "") //TOC page found
                    {
                        break
                    }
                }
            }
            else //if the depth is only 1 then the base page and the TOC page are the same
            {
                //set up variables without going through the whole loop
                pathToTOC = "../"
                tocPageTitle = mw.config.get('wgTitle').substr(0, slashPosition)
                rawTocPageRequest = rawBasePageRequest
            }
            //for later
            subpageTitle = mw.config.get('wgTitle').substr(slashPosition + 1) //subpageTitle is relative to the table of contents, not the base page
            var indexOfSlashInTocPageTitle = tocPageTitle.indexOf("/")
            if (indexOfSlashInTocPageTitle != -1)
            {
                beginningOfShortSectionTitle = tocPageTitle.substring(tocPageTitle.indexOf("/") + 1).replace(/\//g, ", ") + ", " //change / to , - better than doing nothing
            }
            else
            {
                beginningOfShortSectionTitle = ""
            }
        }
        else //definitely not a subpage
        {
            wpTextbox1value += mw.config.get('wgTitle')
        }
        
        //author
        wpTextbox1value += "\n | author     = "
        if (isSubpage)
        {
            try
            {
                wpTextbox1value += /\{\{[\s]*[Hh]eader[2]?[\s]*[\s\S]*\|[\s]*author[\s]*\=([^\||\}\}]*)/.exec(rawTocPageRequest.responseText)[1].replace(/^\s+/,"").replace(/\s+$/,"")
            }
            catch (e)
            {
                //if there was an error, just leave the field blank
            }
        }
        
        //translator
        wpTextbox1value += "\n | translator = "
        if (isSubpage)
        {
            try
            {
                wpTextbox1value += /\{\{[\s]*[Hh]eader[2]?[\s]*[\s\S]*\|[\s]*translator[\s]*\=([^\||\}\}]*)/.exec(rawTocPageRequest.responseText)[1].replace(/^\s+/,"").replace(/\s+$/,"")
            }
            catch (e)
            {
                //if there was an error, just leave the field blank
            }
        }
        
        //section
        wpTextbox1value += "\n | section    = "
        if (isSubpage) //only subpages have section titles
        {
            try
            {
                subpageTitleRegExp = subpageTitle.replace(/[ _]/, "[ _]")  //subpageTitleRegExp will also be used later
                subpageTitleRegExp = "[" + subpageTitleRegExp[0].toUpperCase() + subpageTitleRegExp[0].toLowerCase() + "]" + subpageTitleRegExp.substr(1) //MediaWiki is not case-sensitive on the first letter
                
                wpTextbox1value += (new RegExp("\\[\\[/" + subpageTitleRegExp + "\\|(.*)\]\]")).exec(rawTocPageRequest.responseText)[1]
            }
            catch (e)
            {
                //if there was an error, fall back on just adding the section name
                wpTextbox1value += subpageTitle.replace(/\//g, ", ")
            }
        }
        
        //used for both previous page and next page determination
        var indexOfCurrentPageInTableOfContents = -1 //the -1 makes sure that if the value can't be found, "undefined" isn't used instead
        
        //previous
        wpTextbox1value += "\n | previous   = "
        try
        {
            rawTocPageWithoutHeader = rawTocPageRequest.responseText.substring(/(\{\{[Hh]eader[2]?[^\}\}]*)/.exec(rawTocPageRequest.responseText)[1].length) //cut off the header before searching
            
            indexOfCurrentPageInTableOfContents = rawTocPageWithoutHeader.indexOf((new RegExp("\\[\\[/" + subpageTitleRegExp + "[\\||\\]\\]]")).exec(rawTocPageWithoutHeader)[0])
            
            var indexOfTargetLink = rawTocPageWithoutHeader.lastIndexOf("[[/", indexOfCurrentPageInTableOfContents - 3)
            var previousPageTitle = /\[\[\/([^\||\]\]]*)/.exec(rawTocPageWithoutHeader.substring(indexOfTargetLink, indexOfCurrentPageInTableOfContents))[1]
            
            wpTextbox1value += "[[" + pathToTOC + previousPageTitle + "|" + beginningOfShortSectionTitle + previousPageTitle.replace(/\//g, ", ") + "]]" //change / to , - better than doing nothing
        }
        catch (e)
        {
            //if there was an error, just leave the field blank
        }
        
        //next
        wpTextbox1value += "\n | next       = "
        try
        {
            if (indexOfCurrentPageInTableOfContents != -1) //if we don't know where we are in the list, do not wrap back to the beginning - strangely, an exception doesn't get thrown if I leave indexOfCurrentPageInTableOfContents alone, and the "next" algorithm jumped back to the beginning of the table of contents page
            {
                var indexOfTargetLink = rawTocPageWithoutHeader.indexOf("[[/", indexOfCurrentPageInTableOfContents + subpageTitle.length + 2)
                if (indexOfTargetLink != -1) //if we're at the end of the list, do not wrap back to the beginning
                {
                    var nextPageTitle = /\[\[\/([^\||\]\]]*)/.exec(rawTocPageWithoutHeader.substring(indexOfTargetLink))[1]
                    wpTextbox1value += "[[" + pathToTOC + nextPageTitle + "|" + beginningOfShortSectionTitle + nextPageTitle.replace(/\//g, ", ") + "]]" //change / to , - better than doing nothing
                }
            }
        }
        catch (e)
        {
            //if there was an error, just leave the field blank
        }
        
        wpTextbox1.value = wpTextbox1value + "\n | notes      = \n}}\n\n"
    }
}

/* Preload Template:Textinfo when starting a discussion page */
function preloadTextinfoTemplate()
{
    var wpTextbox1 = document.getElementById("wpTextbox1")
    if (wpTextbox1.value == "")
    {
        wpTextbox1.value = "{{textinfo\n | edition      = \n | source       = \n | contributors = \n | progress     = \n | notes        = \n | proofreaders = \n}}\n"
    }
}

/* Preload Template:Author when starting an author page */
function preloadAuthorTemplate()
{
    var wpTextbox1 = document.getElementById("wpTextbox1")
    if (wpTextbox1.value == "")
    {
        wpTextbox1.value = "{{author\n | firstname      = \n | lastname       = \n | last_initial   = \n | birthyear      = \n | deathyear      = \n | description    = \n | image          = \n | wikipedia_link = \n | wikiquote_link = \n | commons_link   = \n}}\n\n==Works==\n\n"
    }
}

if (mw.config.get('wgAction') == "edit")
{
    switch (mw.config.get('wgNamespaceNumber'))
    {
        case 0: //main
            $(document).ready(preloadHeaderTemplate)
            break
        case 1: //Talk
            $(document).ready(preloadTextinfoTemplate)
            break
        case 102: //Author
            $(document).ready(preloadAuthorTemplate)
    }
}