Jump to content

User:Opencooper/talkCount.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// Shows the number of discussions on the talk page
// Namespace # reference: https://www.mediawiki.org/wiki/Manual:Namespace#Built-in_namespaces

// License: CC0

function setup() {
    // If we're not reading an article, do nothing
    if (!(mw.config.get('wgAction') === 'view'
          && mw.config.get('wgIsArticle')
          && !location.search.split('oldid=')[1] // Old revision
          && !mw.config.get("wgIsMainPage"))) {
        return;
    }

    // Check if we're on a talk page
    var namespace = mw.config.get( 'wgNamespaceNumber' );
    if (namespace % 2 == 1) { // All talk namespaces have odd numbers
    	return;
    }

    // Make sure there's a talk tab
    if (!$("#ca-talk").length) {
    	return;
    }

    // Check if talk page is a redlink
    if ($("#ca-talk.new").length !== 0) {
        return;
    }

    var talkUrl = $("#ca-talk a").attr("href");
    var talkTitle = talkUrl.split("/wiki/")[1];
    talkTitle = decodeURI(talkTitle);
    // Mediawiki encodes these while decodeURI doesnt reverse it
    talkTitle = talkTitle.replace(/%26/, "&").replace(/%2B/, "+").replace(/%3D/, "=").replace(/%3F/, "?");

    determineTalkType(talkTitle);
}

function determineTalkType(talkTitle) {
	// Find out whether the talk page is a flow page or not
    // API docs: https://www.wikidata.org/w/api.php?action=help&modules=query%2Binfo
    $.ajax({
        url: apiUrl,
        data: {
            action: "query",
            format: "json",
            titles: talkTitle,
            prop: "info"
        },
        success: function(queryResponse) {
        	var page = queryResponse.query.pages;
        	var pageId = Object.keys(page)[0];
        	var contentModel = page[pageId].contentmodel;
        	
        	if (contentModel == "flow-board") {
        		getFlowTopics(talkTitle);
        	} else {
        		parseTalk(talkTitle);
        	}
        }
    });
}

function getFlowTopics(talkTitle) {
	// Get section info from Flow API
    // API docs: https://www.wikidata.org/w/api.php?action=help&modules=flow%2Bview-topiclist
    $.ajax({
        url: apiUrl,
        data: {
            action: "flow",
            submodule: "view-topiclist",
            vtltoconly: "true",
            vtllimit: "max",
            format: "json",
            page: talkTitle,
        },
        success: parseFlow
    });
}

function parseFlow(flowResponse) {
    var topicList = flowResponse.flow["view-topiclist"].result.topiclist;

    var roots = topicList.roots;
    var posts = [];
    for (let i = 0; i<roots.length; i++) {
    	root = roots[i];
    	// Assuming roots have a 1:1 mapping to posts
    	posts.push(topicList.posts[root][0]);
    }
    
    var revisions = topicList.revisions;
    var sectionTitles = [];
    for (let i = 0; i<posts.length; i++) {
    	var key = posts[i];
    	var title = revisions[key].content.content;
    	sectionTitles.push(title);
    }
    var sectionsCount = sectionTitles.length;

    displayCount(sectionsCount, sectionTitles);
}

function parseTalk(talkTitle) {
	// Get parsed talk page section info
    // API docs: https://en.wikipedia.org/w/api.php?action=help&modules=parse
    $.ajax({
        url: apiUrl,
        data: {
            action: "parse",
            format: "json",
            page: talkTitle,
            redirects: "yes",
            prop: "sections"
        },
        success: parseSections
    });
}

function parseSections(sectionsResponse) {
    var sectionsCount = sectionsResponse.parse.sections.length;
    var sectionTitles = [];
    for (let i = 0; i < sectionsCount; i++) {
        sectionHeader = sectionsResponse.parse.sections[i].line;
        sectionTitles.push(sectionHeader);
    }

    displayCount(sectionsCount, sectionTitles);
}

function displayCount(sectionsCount, sectionTitles) {
    var formattedTitles = "";
    for (let i = 0; i < sectionsCount; i++) {
        formattedTitles += i+1 + ". " + sectionTitles[i];

        if (i != sectionsCount-1) {
            formattedTitles += "\n";
        }
    }
    formattedTitles = formattedTitles.replace(/'/g, "&apos;"); // escape

    var countHTML = "&nbsp;<small id='talkCount' title='"+ formattedTitles + "'>("
                    + sectionsCount + ")</small>";
    $("#ca-talk a").append(countHTML);
}

var apiUrl = location.origin + "/w/api.php";
setup();