MediaWiki:Gadget-GlossaryGraph.js: Difference between revisions

From OODA WIKI
Jump to navigation Jump to search
AdminIsidore (talk | contribs)
No edit summary
AdminIsidore (talk | contribs)
No edit summary
Line 12: Line 12:


             var term = pageTitle.split(':').pop().toLowerCase();
             var term = pageTitle.split(':').pop().toLowerCase();
            var smwQuery = encodeURIComponent('[[Category:Glossary Entries]]|?Glossary-Term|?Glossary-Definition|limit=50');
             new mw.Api().get({
             new mw.Api().get({
                 action: 'ask',
                 action: 'askargs',
                 query: smwQuery,
                 conditions: 'Category:Glossary Entries',
                printouts: 'Glossary-Term|Glossary-Definition',
                parameters: 'limit=50',
                 format: 'json',
                 format: 'json',
                 formatversion: 2
                 formatversion: 2
Line 105: Line 106:
                     responseText: jqXHR.responseText,
                     responseText: jqXHR.responseText,
                     statusCode: jqXHR.status,
                     statusCode: jqXHR.status,
                     url: 'https://www.ooda.wiki/api.php?action=ask&query=' + smwQuery + '&format=json&formatversion=2'
                     url: 'https://www.ooda.wiki/api.php?action=askargs&conditions=Category:Glossary%20Entries&printouts=Glossary-Term|Glossary-Definition&parameters=limit=50&format=json&formatversion=2'
                 });
                 });
             });
             });

Revision as of 02:25, 30 August 2025

$(function() {
    'use strict';
    mw.loader.using(['ext.gadget.d3', 'mediawiki.api'], function() {
        $('.glossary-graph').each(function() {
            var $container = $(this);
            var pageTitle = $container.data('page-title');
            if (!pageTitle) {
                $container.text('Error: No page title');
                console.error('No page title found for container');
                return;
            }

            var term = pageTitle.split(':').pop().toLowerCase();
            new mw.Api().get({
                action: 'askargs',
                conditions: 'Category:Glossary Entries',
                printouts: 'Glossary-Term|Glossary-Definition',
                parameters: 'limit=50',
                format: 'json',
                formatversion: 2
            }).done(function(data) {
                console.log('SMW API response:', JSON.stringify(data, null, 2));
                var results = data.query.results || {};
                var links = [];
                for (var page in results) {
                    if (results.hasOwnProperty(page) && page !== pageTitle) {
                        var definitions = results[page].printouts['Glossary-Definition'] || [];
                        if (definitions.length > 0 && definitions.some(function(def) {
                            return def.toLowerCase().indexOf(term) !== -1;
                        })) {
                            links.push({ title: page });
                        }
                    }
                }

                if (links.length === 0) {
                    $container.text('No connections found.');
                    console.log('No connections found for term:', term);
                    return;
                }

                var nodes = [{ id: pageTitle }];
                var edges = [];
                links.forEach(function(link) {
                    nodes.push({ id: link.title });
                    edges.push({ source: pageTitle, target: link.title });
                });

                $container.empty();
                var width = 400, height = 300;
                var svg = d3.select($container[0])
                    .append('svg')
                    .attr('width', width)
                    .attr('height', height)
                    .style('background-color', '#000000');

                var simulation = d3.forceSimulation(nodes)
                    .force('link', d3.forceLink(edges).id(d => d.id).distance(100))
                    .force('charge', d3.forceManyBody().strength(-200))
                    .force('center', d3.forceCenter(width / 2, height / 2));

                var link = svg.append('g')
                    .selectAll('line')
                    .data(edges)
                    .enter().append('line')
                    .attr('stroke', '#00FF00')
                    .attr('stroke-width', 2);

                var node = svg.append('g')
                    .selectAll('circle')
                    .data(nodes)
                    .enter().append('circle')
                    .attr('r', 10)
                    .attr('fill', '#00CC00')
                    .call(d3.drag()
                        .on('start', function(event, d) {
                            if (!event.active) simulation.alphaTarget(0.3).restart();
                            d.fx = d.x;
                            d.fy = d.y;
                        })
                        .on('drag', function(event, d) {
                            d.fx = event.x;
                            d.fy = event.y;
                        })
                        .on('end', function(event, d) {
                            if (!event.active) simulation.alphaTarget(0);
                            d.fx = null;
                            d.fy = null;
                        }));

                node.append('title').text(d => d.id);

                simulation.on('tick', function() {
                    link.attr('x1', d => d.source.x)
                        .attr('y1', d => d.source.y)
                        .attr('x2', d => d.target.x)
                        .attr('y2', d => d.target.y);
                    node.attr('cx', d => d.x)
                        .attr('cy', d => d.y);
                });
            }).fail(function(jqXHR, textStatus, errorThrown) {
                $container.text('Error: API request failed');
                console.error('SMW API error details:', {
                    status: textStatus,
                    error: errorThrown,
                    responseText: jqXHR.responseText,
                    statusCode: jqXHR.status,
                    url: 'https://www.ooda.wiki/api.php?action=askargs&conditions=Category:Glossary%20Entries&printouts=Glossary-Term|Glossary-Definition&parameters=limit=50&format=json&formatversion=2'
                });
            });
        });
    });
});