Jump to content

User:Opencooper/talkCount.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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();