Changes

52,326 bytes added ,  17:47, 14 March 2022
apply updates
Line 1: Line 1:  
$(document).ready(function() {
 
$(document).ready(function() {
 +
 
     $.getScript('https://unpkg.com/vis-network/standalone/umd/vis-network.min.js').done(function() {
 
     $.getScript('https://unpkg.com/vis-network/standalone/umd/vis-network.min.js').done(function() {
      if( $('#visNetworkGraph').length ) {//check if div element(s) exist
+
    var pathId = 0;
      var input = JSON.parse($("#visNetworkGraph").text());
+
    var newNodes = {};
      wikiUrl = "";
+
    var editNodes = {};
     
+
    var editDeletedEdges = {};
      // create an array with nodes
+
    var editDeletedNodes = {};
      var nodes = new vis.DataSet([]);
+
   
      // create an array with edges
+
    $(".visNetworkGraph").each(function(index) {
      var edges = new vis.DataSet([]);
+
        if ($('.visNetworkGraph').length) { //check if div element(s) exist
     
+
            var input = JSON.parse(this.innerHTML);
      var colors = ['#ff7878', '#73ff77', '#e878ff', '#ffae57', '#80f8ff', '#ffff75', '#adadad', '#b482ff'];
+
 +
            // create an array with nodes
 +
            var nodes = new vis.DataSet([]);
 +
            // create an array with edges
 +
            var edges = new vis.DataSet([]);
 +
            //colors for the graph
 +
            var colors = [];
 +
            var oldGroups = {};
 +
var givenDiv = this;
 +
givenDiv.style.position = "relative";
 +
givenDiv.style.display = "inline-block";
 +
 +
 
 +
 +
            function getColor() {
 +
                return "hsl(" + 360 * Math.random() + ',' +
 +
                    (25 + 70 * Math.random()) + '%,' +
 +
                    (85 + 10 * Math.random()) + '%)';
 +
            }
 +
 
 +
            var h = Math.random();
 +
            var golden = 0.618033988749895;
 +
            function randomHSL() {
 +
            h += golden;
 +
            h %= 1;
 +
            //~~(360 * Math.random())
 +
                return "hsla(" + (360 * h) + "," +
 +
                    "70%," +
 +
                    "80%,1)";
 +
            }
 +
 
 +
            for (var i = 0; i < input.properties.length; i++) {
 +
                colors.push(randomHSL());
 +
            }
 +
 
 +
            function isLabelSet(id) {
 +
                node = nodes.get(id);
 +
                if (node === null) return false;
 +
                else return id;
 +
            }
 +
 
 +
            //var colors = ['#ff7878', '#73ff77', '#e878ff', '#ffae57', '#80f8ff', '#ffff75', '#adadad', '#b482ff'];
 +
 
 +
            nodes.add({
 +
                id: input.root,
 +
                label: input.root, //todo: query display title
 +
                color: '#6dbfa9'
 +
            });
 +
 
 +
            //Creates API query Url with the given root and properties
 +
            function createUrl(root, properties) {
 +
                var url = `/w/api.php?action=ask&query=[[${encodeURIComponent(root)}]]`;
 +
                var propertiesVar = '';
 +
                for (var i = 0; i < properties.length; i++) {
 +
                    propertiesVar += '|?' + encodeURIComponent(properties[i]);
 +
 
 +
                }
 +
 
 +
                url = url + propertiesVar + '&format=json';
 +
                return url;
 +
            }
 +
 
 +
            //Makes an API call with the given parameters and adds the results to the nodes and edges datasets.
 +
            //With a given nodeID the edges are set to the nodeID, else they are set to the root node.
 +
            function fetchData(root, properties, nodeID, setGroup, setColor) {
 +
                fetch(createUrl(root, properties))
 +
                    .then(response => response.json())
 +
                    .then(data => {
 +
                   
 +
                        for (var i = 0; i < properties.length; i++) {
 +
                            for (var j = 0; j < data.query.results[root].printouts[properties[i]].length; j++) {
 +
                           
 +
                           
 +
                            //define colors
 +
                                if(!(properties[i] in legendColors) && setColor) {legendColors[properties[i]] = colors[i]; }
 +
                                else {setColor = legendColors[properties[i]]; colors[i] = legendColors[properties[i]]; colors[i] = legendColors[properties[i]];}
 +
                                //define id and label. use displaytitle if available. Use string representation of non-page properties
 +
                                var id = "";
 +
                                var label = "";
 +
                                if (data.query.results[root].printouts[properties[i]][j].fulltext) id = data.query.results[root].printouts[properties[i]][j].fulltext;
 +
                                else if(data.query.results[root].printouts[properties[i]][j].value) id = '' + data.query.results[root].printouts[properties[i]][j].value + ' ' + data.query.results[root].printouts[properties[i]][j].unit; 
 +
                                else id = data.query.results[root].printouts[properties[i]][j].toString();
 +
                                if (data.query.results[root].printouts[properties[i]][j].displaytitle) label = data.query.results[root].printouts[properties[i]][j].displaytitle;
 +
                                if (label === "") label = id;
 +
 +
                                if (isLabelSet(id) === false) {
 +
 
 +
                                    if (setGroup && setColor) {
 +
                                        nodes.add({
 +
                                            id: id,
 +
                                            label: label,
 +
                                            color: setColor,
 +
                                            group: setGroup[0],
 +
                                            hidden: false,
 +
                                            url: data.query.results[root].printouts[properties[i]][j].fullurl,
 +
                                            oncontext: true,
 +
                                        });
 +
                                        oldGroups["" + id] = setGroup[0];
 +
                                    } else {
 +
                                        nodes.add({
 +
                                            id: id,
 +
                                            label: label,
 +
                                            color: colors[i],
 +
                                            group: properties[i],
 +
                                            hidden: false,
 +
                                            url: data.query.results[root].printouts[properties[i]][j].fullurl
 +
                                        });
 +
                                        oldGroups["" + id] = properties[i];
 +
                                    }
 +
                                    if (nodeID) {
 +
                                        edges.add({
 +
                                            from: nodeID,
 +
                                            to: id,
 +
                                            label: properties[i],
 +
                                            color: colors[i],
 +
                                            group: properties[i]
 +
                                        });
 +
                                    } else {
 +
                                        edges.add({
 +
                                            from: input.root,
 +
                                            to: id,
 +
                                            label: properties[i],
 +
                                            color: colors[i],
 +
                                            group: properties[i]
 +
                                        });
 +
                                    }
 +
                                   
 +
                                } else {
 +
                                    edges.add({
 +
                                        from: nodeID,
 +
                                        to: isLabelSet(id),
 +
                                        label: properties[i],
 +
                                        color: setColor,
 +
                                        group: properties[i]
 +
                                    });
 +
                                }
 +
                            }
 +
                        }
 +
                        network.setOptions(options);
 +
                        network.body.emitter.emit('_dataChanged');
 +
                        network.redraw();
 +
                       
 +
                    });
 +
            }
 +
            fetchData(input.root, input.properties);
 +
            // create a network
 +
            var container = this; //document.getElementById("visNetworkGraph");
 +
            var data = {
 +
                nodes: nodes,
 +
                edges: edges,
 +
            };
 +
            var options = {
 +
                width: "100%",
 +
                height: "100%",
 +
                interaction: {
 +
                    hover: true
 +
                },
 +
                manipulation: {
 +
                    enabled: true,
 +
                    editEdge: false,
 +
                    deleteNode: function (data, callback) {deleteSelectedNode(data, callback)}.bind(this),
 +
                    deleteEdge: function (data, callback) {deleteSelectedEdge(data, callback)}.bind(this),
 +
                    addNode: function (data, callback) {
 +
                   
 +
        // filling in the popup DOM elements
 +
        document.getElementById("node-operation").innerText = "Add Node";
 +
        dragElement(document.getElementById("node-popUp"));
 +
        editNode(data, clearNodePopUp, callback);
 +
      },
 +
      addEdge: function (data, callback) {
 +
        if (data.from == data.to) {
 +
          var r = confirm("Do you want to connect the node to itself?");
 +
          if (r != true) {
 +
            callback(null);
 +
            return;
 +
          }
 +
        }
 +
        document.getElementById("edge-operation").innerText = "Add Edge";
 +
        dragElement(document.getElementById("edge-popUp"));
 +
        editEdgeWithoutDrag(data, callback);
 +
      },
 +
          },
 +
                edges: {
 +
                    arrows: {
 +
                        to: {
 +
                            enabled: true
 +
                        },
 +
                        //from:{enabled: true}
 +
                    }
 +
                },
 +
                groups: {
 +
                    useDefaultGroups: false
 +
                },
 +
                physics: {
 +
                    stabilization: {
 +
                        enabled: true,
 +
                    },
 +
                    barnesHut: {
 +
                        gravitationalConstant: -40000,
 +
                        centralGravity: 0,
 +
                        springLength: 0,
 +
                        springConstant: 0.5,
 +
                        damping: 1,
 +
                        avoidOverlap: 0
 +
                    },
 +
                    maxVelocity: 5
 +
                },
 +
 
 +
            };
 +
            //Creates groups in the options and sets them all to hidden:false.
 +
            for (var i = 0; i < input.properties.length; i++) {
 +
                options.groups[input.properties[i]] = {
 +
                    hidden: false
 +
                };
 +
            }
 +
            var network = new vis.Network(container, data, options);
 +
           
 +
 
 +
 
 +
 
 +
function getAllEdgesBetween(node1,node2) {
 +
    return edges.get().filter(function (edge) {
 +
        return (edge.from === node1 && edge.to === node2 )|| (edge.from === node2 && edge.to === node1);
 +
    });
 +
}
 +
 
 +
function getAllCombs(arrays){
 +
    var numberOfCombs = 1;
 +
    for(var i=0; i<arrays.length; i++){
 +
        numberOfCombs = numberOfCombs * arrays[i].length;
 +
    }
 +
    var allCombs = new Array(numberOfCombs);
 +
    for(var i=0; i<allCombs.length; i++){
 +
        allCombs[i] = new Array(arrays.length);
 +
    }
 +
   
 +
    for(var i=0; i<arrays.length; i++){
 +
        var current = arrays[i];
 +
        for(var c=0; c<numberOfCombs; c++){
 +
 +
            for(var j=0; j<current.length; j++){
 +
                allCombs[c][i] = current[c%current.length];
 +
               
 +
            }
 +
        }
 +
    }
 
 
      var id = 1;
+
    return allCombs;
      nodes.add({id: id, label: input.root});
+
}
      id++;
+
 +
function getEdgePathsForPath(path){
 +
  var arraysOfEdgesForNodeInPath = [];
 +
  for(var i=1; i<path.length; i++){
 +
    var edgesBetween = getAllEdgesBetween(path[i-1], path[i]);
 +
    var localedgesBetween = edgesBetween.slice();
 +
    arraysOfEdgesForNodeInPath.push(localedgesBetween);
 +
  }
 +
  var allEdgePaths = getAllCombs(arraysOfEdgesForNodeInPath);
 +
return allEdgePaths;
 +
}
 +
 
 +
function reverseLabel(label){
 +
  if(label[0] == "-"){
 +
    return label.substring(1);
 +
  }
 +
  else{
 +
    return "-" + label;
 +
  }
 +
}
   −
      function createUrl(root, properties){
+
function getEdgeLabelStringsForPath(path){
      var url = `${wikiUrl}/w/api.php?action=ask&query=[[${root}]]`;
+
  var allEdgePaths = getEdgePathsForPath(path);
      var propertiesVar ='';
+
  var allStrings = new Array(allEdgePaths.length);
      for (var i = 0; i < properties.length; i++) {
+
  for(var i=0; i<allEdgePaths.length; i++){
      propertiesVar += '|?'+ properties[i];
+
    var s = "";
     
+
    for(var j=0; j<allEdgePaths[i].length;j++){
 +
     
 +
      var edge = allEdgePaths[i][j];
 +
      var label = edge.label;
 +
      var nodeId1 = path[j];
 +
      var nodeId2 = path[j+1];
 +
      if(edge.to == nodeId1 && edge.from == nodeId2){
 +
        label = reverseLabel(label);
 
       }
 
       }
+
      if(j == (allEdgePaths[i].length - 1)){
      url = url + propertiesVar + '&format=json';
+
        s = s + label;
       return url;
+
       }
 +
      else{
 +
        s = s + label + ".";
 
       }
 
       }
 +
   
 +
     
 +
    }
 +
    allStrings[i] = s;
 +
  }
 +
  return allStrings;
 +
}
 +
 +
function getAllStringsForAllPaths(paths){
 +
  var arrayOfAllStrings = [];
 +
  for(var i=0; i<paths.length;i++){
 +
    var path = paths[i];
 +
    var allStrings = getEdgeLabelStringsForPath(path);
 +
    arrayOfAllStrings.push(allStrings);
 +
  }
 +
return arrayOfAllStrings;
 +
}
 +
 +
 +
 +
function removeItem(arr, value) {
 +
  var index = arr.indexOf(value);
 +
  if (index > -1) {
 +
    arr.splice(index, 1);
 +
  }
 +
  return arr;
 +
}
 +
 +
       +
function findAllPaths(startNode, endNode){
 +
    var visitedNodes = [];
 +
    var currentPath = [];
 +
    var allPaths =  [];
 +
    dfs(startNode, endNode, currentPath, allPaths, visitedNodes);
 +
    return allPaths;
 +
}
   −
      function fetchData(root, properties, nodeID){
+
function dfs(start, end, currentPath, allPaths, visitedNodes){
      fetch(createUrl(root, properties))
+
    if(visitedNodes.includes(start)) return;
        .then(response => response.json())
+
    visitedNodes.push(start);
        .then(data => {
+
    currentPath.push(start);
       
+
    if(start == end){
       
+
    var localCurrentPath = currentPath.slice();
       
+
        allPaths.push(localCurrentPath);
        for (var i = 0; i < properties.length; i++) {
+
        removeItem(visitedNodes, start);
        for (var j = 0; j < data.query.results[root].printouts[properties[i]].length; j++) {
+
        currentPath.pop();
        if(data.query.results[root].printouts[properties[i]].length == 1){
+
         return;
        if(data.query.results[root].printouts[properties[i]][j].fulltext){
+
    }
        nodes.add({id: id, label: data.query.results[root].printouts[properties[i]][j].fulltext, color: colors[i], group: properties[i], hidden:false});
+
   
        if(nodeID){edges.add({from: nodeID, to: id, label: properties[i], color: colors[i], group: properties[i]});}
+
    var neighbours = network.getConnectedNodes(start);
        else{
+
     for(var i = 0; i < neighbours.length; i++){  
        edges.add({from: 1, to: id, label: properties[i], color: colors[i], group: properties[i]});}
+
        var current = neighbours[i];
        id++;
+
        dfs(current, end, currentPath, allPaths, visitedNodes);
       
  −
        }else{
  −
       
  −
        nodes.add({id: id, label: data.query.results[root].printouts[properties[i]][0].toString(), color: colors[i], group: properties[i], hidden:false});
  −
        if(nodeID){edges.add({from: nodeID, to: id, label: properties[i], color: colors[i], group: properties[i]});}else{
  −
        edges.add({from: 1, to: id, label: properties[i], color: colors[i], group: properties[i]});}
  −
        id++;}
  −
        }else if(!data.query.results[root].printouts[properties[i]][j].fulltext){
  −
        nodes.add({id: id, label: data.query.results[root].printouts[properties[i]][j], color: colors[i], group: properties[i], hidden:false});
  −
        if(nodeID){edges.add({from: nodeID, to: id, label: properties[i], color: colors[i], group: properties[i]});}else{
  −
        edges.add({from: 1, to: id, label: properties[i], color: colors[i], group: properties[i]});}
  −
        id++;
  −
       
  −
       
  −
        }else{
  −
        nodes.add({id: id, label: data.query.results[root].printouts[properties[i]][j].fulltext, color: colors[i], group: properties[i], hidden:false});
  −
        if(nodeID){edges.add({from: nodeID, to: id, label: properties[i], color: colors[i], group: properties[i]});}else{
  −
        edges.add({from: 1, to: id, label: properties[i], color: colors[i], group: properties[i]});}
  −
        id++;
  −
       
  −
       
  −
        }
  −
       
  −
       
  −
        }
  −
        }
  −
       
  −
         });
  −
      }  
  −
      fetchData(input.root, input.properties);
  −
      // create a network
  −
      var container = document.getElementById("visNetworkGraph");
  −
      var data = {
  −
        nodes: nodes,
  −
        edges: edges,
  −
      };
  −
     
  −
     
  −
      var options = {width: "100%", height: "100%", interaction: { hover: true },
  −
  manipulation: {
  −
    enabled: true,
  −
  }, /*layout:{improvedLayout:false},*/
  −
  groups: {
  −
  useDefaultGroups: false
  −
  },
  −
  physics:{
  −
  stabilization: {
  −
      enabled: true,
  −
      /*iterations: 1,
  −
      updateInterval: 25,
  −
      onlyDynamicEdges: false,
  −
      fit: true*/
  −
    },
  −
  barnesHut: {
  −
      gravitationalConstant: -40000,
  −
      centralGravity: 0,
  −
      springLength: 0,
  −
      springConstant: 0.5,
  −
      damping: 1,
  −
      avoidOverlap: 0
  −
    },
  −
    maxVelocity: 5
  −
  },
  −
     
  −
      };
  −
     
  −
     for(var i=0;i<input.properties.length;i++){
  −
    options.groups[input.properties[i]] = {hidden: false};
   
     }
 
     }
      console.log(options);
  −
   
  −
      var network = new vis.Network(container, data, options);
  −
      var x = -visNetworkGraph.clientWidth / 2 + 50;
  −
var y = -visNetworkGraph.clientHeight / 2 + 50;
  −
var step = 70;
  −
var legendID = 1000;
  −
for (var i = 0; i < input.properties.length; i++) {
  −
        if(i<1){
  −
       
  −
        nodes.add({
  −
    id: legendID,
  −
    x: x,
  −
    y: y,
  −
    label: input.properties[i],
  −
    /*group: input.properties[i],*/
  −
    value: 1,
  −
    fixed: true,
  −
    physics: false,
  −
    color: colors[i],
  −
});legendID++;
  −
       
  −
        }else{
  −
  −
    nodes.add({
  −
    id: legendID,
  −
    x: x,
  −
    y: y + i * step,
  −
    label: input.properties[i],
  −
    /*group: input.properties[i],*/
  −
    value: 1,
  −
    fixed: true,
  −
    physics: false,
  −
    color: colors[i],
  −
    });
  −
    legendID++;
  −
  −
}
  −
}
  −
      function deleteNodes(node){
  −
     
  −
      var deleteNode = network.getConnectedNodes(node);
  −
      for(var i = 1; i < deleteNode.length;i++){
  −
      if(network.getConnectedNodes(deleteNode[i]).length > 1){
  −
      deleteNodes(deleteNode[i]);
  −
     
  −
     
  −
     
  −
      }else{
  −
     
  −
      nodes.remove([deleteNode[i]]);
  −
      if(node === 1){
  −
     
  −
      deleteNodes(deleteNode[0]);
  −
      nodes.remove([deleteNode[0]]);
  −
      }
  −
     
  −
      }
  −
     
  −
      }
  −
      for( i = 1; i < deleteNode.length;i++){
  −
      nodes.remove([deleteNode[i]]);
  −
      }
  −
     
  −
      }
  −
     
  −
     
  −
      var nodesArray = [];
  −
      //var isInArray = false;
  −
      var legendClicked = false;
     −
+
    currentPath.pop();
 +
    removeItem(visitedNodes, start);
 +
 
 +
}
 +
 
 +
 
 +
 
 +
 
 +
 
 +
           
 +
           
 +
 
 +
            //This function deletes all children of a given node.
 +
            function getAllReachableNodesTo(nodeId, excludeIds, reachableNodes) {
 +
 
 +
                if (reachableNodes.includes(nodeId) || excludeIds.includes(nodeId)) { return;}
 +
                var children = network.getConnectedNodes(nodeId);
 +
                reachableNodes.push(nodeId);
 +
                for (var i = 0; i < children.length; i++) {
 +
                    getAllReachableNodesTo(children[i], excludeIds, reachableNodes);
 +
                    //if(excludeIds.includes(children[i]))continue;
 +
                    //reachableNodes.push(children[i]);
 +
                }
 +
            }
 +
           
 +
            function deleteNodesChildren(nodeId, deleteEdge) {
 +
                var excludedIds = [];
 +
                if(deleteEdge === true){
 +
                console.log("deleteEdge true")
 +
                }else{
 +
                excludedIds.push(nodeId);
 +
                }
 +
                var reachableNodesTo = [];
 +
                getAllReachableNodesTo(input.root, excludedIds, reachableNodesTo);
 +
                var nodesToDelete = [];
 +
                var allIds = nodes.getIds();
 +
 
 +
                for (var i = 0; i < allIds.length; i++) {
 +
                    if (reachableNodesTo.includes(allIds[i])) continue;
 +
                    if (allIds[i] == nodeId) {
 +
                    deleteEdges(nodeId);
 +
                    continue;
 +
                    }
 +
                    nodesToDelete.push(allIds[i]);
 +
                    deleteEdges(allIds[i]);
 +
                    nodes.remove(allIds[i]);
 +
                    delete oldGroups["" + allIds[i]];
 +
                    delete objClickedProps["" + allIds[i]];
 +
                }
   −
var oldGroups = [];
+
                return nodesToDelete;
     
+
            }
      network.on("click", function (params) {
+
           
      if(params.nodes[0]){
+
function deleteEdges(nodeID){
//////////////////////////////////////////////////////////
+
var fromEdges = edges.get({
var legendGroup;
+
                    filter: function (item) {
var group;
+
                        return item.from == nodeID;
var nodeChildren;
+
                    }
+
                });
if(params.nodes[0] > 999){
+
               
legendGroup = nodes.get(params.nodes[0]).label;
+
        for(var j = 0; j < fromEdges.length; j++){
if(options.groups[legendGroup].hidden === false){
+
        edges.remove(fromEdges[j]);
 +
        }
 +
}
 +
var nodesClicked = [];
 +
var tip = '<p><strong>Hinweis:</strong> Um sich einen Pfad zwischen zwei Knoten ausgeben zu lassen, <em>Strg</em> gedrückt halten und die gewünschten zwei Knoten mit der <em>linken Maustaste</em> anklicken. </p>'
 +
this.insertAdjacentHTML('afterbegin', tip);
 +
 +
network.on("click", function(params) {
 
 
group = nodes.get({
+
                if (params.nodes[0] && params.event.srcEvent.ctrlKey) {
filter: function (item) {
+
               
    return item.group == legendGroup;
+
                if(nodesClicked.length < 2){
}
+
                nodesClicked.push(params.nodes[0]);
 +
                }
 +
                if(nodesClicked.length == 2 && nodesClicked[0] != nodesClicked[1]){
 +
                var foundPaths = findAllPaths(nodesClicked[0],nodesClicked[1]);
 +
                //.querySelector('[id^="poll-"]').id;
 +
                if(document.querySelectorAll('[id^="fullPath"]')){
 +
                for(var i=0; i < document.querySelectorAll('[id^="fullPath"]').length; i++){
 +
                document.querySelectorAll('[id^="fullPath"]')[i].remove();
 +
                }
 +
                }
 +
                var element = '<div id="fullPath'+ pathId +'"></div>'
 +
givenDiv.children[0].insertAdjacentHTML('afterend', element);
 +
 
 +
                var allStringsArray = getAllStringsForAllPaths(foundPaths);
 +
               
 +
                var stringDiv = givenDiv.querySelector('#fullPath' + pathId);
 +
               
 +
                if(foundPaths.length == 1){stringDiv.innerHTML = "<strong>Gefundener Pfad:</strong><br>"}else{stringDiv.innerHTML = "<strong>Gefundene Pfade:</strong><br>"}
 +
               
 +
                for(var s=0; s<foundPaths.length; s++){
 +
                if(foundPaths.length == 1){var pathNumb = ""}else{var pathNumb = "<strong>" + (s+1) + ". Pfad:</strong> <br>"}
 +
               
 +
                stringDiv.innerHTML += pathNumb + "<strong>Knoten: </strong>";
 +
  for(var t=0; t<foundPaths[s].length; t++){
 +
    var currentFoundPath = foundPaths[s][t];
 +
   
 +
    if(t == (foundPaths[s].length - 1)){
 +
        stringDiv.innerHTML = stringDiv.innerHTML + currentFoundPath + " ";
 +
    }
 +
    else{
 +
        stringDiv.innerHTML = stringDiv.innerHTML + currentFoundPath + " - ";
 +
    }
 +
  }
 +
  stringDiv.innerHTML += "<br>"
 +
  stringDiv.innerHTML += "<strong>Kanten:</strong> "
 +
  for(var t=0; t<allStringsArray[s].length; t++){
 +
    var currentString = allStringsArray[s][t];
 +
    var currentFoundPath = foundPaths[s][t];
 +
    var stringDiv = givenDiv.querySelector('#fullPath' + pathId);
 +
    stringDiv.innerHTML = stringDiv.innerHTML + currentString;
 +
  }
 +
  stringDiv.innerHTML += "<br>"
 +
}
 +
 
 +
                nodesClicked = [];
 +
 +
                }
 +
                if(nodesClicked[0] === nodesClicked[1] || nodesClicked.length > 2){
 +
                nodesClicked = [];
 +
                }
 +
               
 +
               
 +
                }
 +
pathId++;
 +
});
 +
 
 +
$(document).keyup(function(event) {
 +
  if(!event.ctrlKey){
 +
  nodesClicked = [];
 +
  }
 
});
 
});
console.log(options.groups);
+
for(var i = 0; i<group.length;i++){
+
 +
 +
 +
 +
 
 +
            var contextCreatedProps = [];
 +
 
 +
            network.on("doubleClick", function(params) {
 
 
+
                if (params.nodes[0]) {
//nodes.update({id:group[i].id, hidden:true});
+
               
nodeChildren = network.getConnectedNodes(group[i].id, 'to');
+
                var conManNodes = network.getConnectedNodes(params.nodes[0], 'to');
options.groups[legendGroup].hidden = true;
+
               
      //console.log(options.groups[legendGroup]);
+
                var onlyConManNodes = true;
      network.body.emitter.emit('_dataChanged');
+
                for(var i = 0; i < conManNodes.length;i++){
      network.redraw();
+
               
+
               
 +
                if(!(nodes.get(conManNodes[i]).oncontext || nodes.get(conManNodes[i]).manually)){
 +
                onlyConManNodes = false;
 +
                }
 +
                }
 +
               
 +
                //Node is expanded -> delete it and all nodes related to its expansion
 +
                    if (network.getConnectedNodes(params.nodes[0]).length > 1 && onlyConManNodes == false) {
 +
                        deleteNodesChildren(params.nodes[0]);
 +
                        for (var i = 0; i < contextCreatedProps.length; i++) {
 +
                            var noNodesInNetwork = true;
 +
                            for (var j = 0; j < nodes.getIds().length; j++) {
 +
                                if (contextCreatedProps[i] == nodes.get(nodes.getIds()[j]).group) {
 +
                                    noNodesInNetwork = false;
 +
                                }
 +
                            }
 +
                            if (noNodesInNetwork === true) {
 +
                                givenDiv.querySelector('#' + contextCreatedProps[i]).remove();
 +
                                contextCreatedProps.splice(contextCreatedProps.indexOf(contextCreatedProps[i]), 1);
 +
                                i--;
 +
                            }
 +
                        }
 +
                        delete objClickedProps["" + params.nodes[0]];
 +
                       
 +
                        //nodesArray.splice(nodesArray.indexOf(params.nodes[0]), 1);
 +
                    } else {
 +
                    //Node is unexpanded -> expand it
 +
                        var nodeById = nodes.get(params.nodes[0]);
 +
                        fetchData(nodeById.id, input.properties, params.nodes[0]);
 +
                        //nodesArray.push(params.nodes[0]);
 +
                    }
 +
 
 +
                }
 +
            });
 +
           
 +
            function newGroup(node, legendGroup) {
 +
               
 +
                nodes.update({
 +
                    id: node,
 +
                    group: legendGroup
 +
                });
 +
 
 +
 
 +
                var connectedNodes = network.getConnectedNodes(node, 'to');
 +
 
 +
                for (var i = 0; i < connectedNodes.length; i++) {
 +
                    newGroup(connectedNodes[i], legendGroup);
 +
                }
 +
            }
 +
 
 +
//Checks, if a node has a path over visible edges to the root node.
 +
//If not, the nodes gets hidden
 +
function setNodeVisibilityByVisiblePath(nodeId, rootNodeId){
 +
if (nodeId == rootNodeId) return true; //root is always visible
 +
var node = nodes.get(nodeId);
 +
if (node.visited) return !node.hidden //prevent circles. ToDo: Reuse results between runs
 +
node.visited = true;
 +
node.hidden = true;
 +
var connectedEdgesIds = network.getConnectedEdges(nodeId);
 +
var connectedEdges = edges.get(connectedEdgesIds);
 +
connectedEdges.forEach(function(edge) {
 +
if (edge.hidden) return; //don't follow hidden edges
 +
                    var connectedNodesIds = network.getConnectedNodes(edge.id);
 +
                    var connectedNodes = nodes.get(connectedNodesIds);
 +
                    connectedNodes.forEach(function(connectedNode) {
 +
                    if (connectedNode.id == nodeId) return; //prevent self evaluation
 +
                    if (setNodeVisibilityByVisiblePath(connectedNode.id, rootNodeId)) {
 +
                    node.hidden = false; //set node visible, if at least one connected node is visible
 +
                    }
 +
                    });
 +
                });
 +
                node.physics = !node.hidden;//disable physics for hidden nodes
 +
                return !node.hidden;
 +
}
 +
 
 +
            function legendFunctionality() {
 +
 
 +
                var legendGroup;
 +
                var group;
 +
                var nodeChildren;
 +
                legendGroup = this.parentNode.childNodes[1].innerHTML;
 +
               
 +
               
 +
                var strategy = "strategy2"
 +
               
 +
                if (strategy == "strategy2"){
 +
                //A node is visible if at least one path over visible edges to the root node exists.
 +
                options.groups[legendGroup].hidden = !options.groups[legendGroup].hidden; //toggle state
 +
                if(options.groups[legendGroup].hidden) this.parentNode.childNodes[1].style.background = '#FFFFFF';
 +
                else this.parentNode.childNodes[1].style.background = '#DEF';
 +
                //update all edges
 +
                edges.forEach(function(edge) {
 +
                    edge.hidden = options.groups[edge.label].hidden;
 +
                    edge.physics = !edge.hidden;
 +
                });
 +
                //reset nodes
 +
                    nodes.forEach(function(node) {
 +
                    node.hidden = false;
 +
                    node.physics = !node.hidden;
 +
                    node.visited = false;
 +
                    });
 +
                    //check each node
 +
                    nodes.forEach(function(node) {
 +
                    setNodeVisibilityByVisiblePath(node.id, input.root)
 +
                    //reset visited state. Todo: Reuse visited nodes between runs
 +
                    nodes.forEach(function(node) {
 +
                    node.visited = false;
 +
                    });
 +
                    });
 +
                }
 +
               
 +
                network.setOptions(options);
 +
                network.body.emitter.emit('_dataChanged');
 +
                network.redraw();
 +
 
 +
                var allFalse = Object.keys(options.groups).every(function(k) {
 +
                    if (k === 'useDefaultGroups') {
 +
                        return true
 +
                    }
 +
                    return options.groups[k].hidden === false
 +
                });
 +
                if (allFalse === true) {
 +
                    /*oldGroups = {};*/
 +
                }
 +
            };
 +
 
 +
            var legendDiv = document.createElement("div");
 +
            this.append(legendDiv);
 +
            legendDiv.style.width = '100%';
 +
            legendDiv.style.position = 'relative';
 +
            legendDiv.style.display = 'inline-block';
 +
           
 +
            legendDiv.id = "legendContainer";
 +
            var legendColors = {};
 +
            for (var i = 0; i < input.properties.length; i++) {
 +
                legendColors[input.properties[i]] = colors[i];
 +
                var propertyContainer = document.createElement("div");
 +
                var propertyColor = document.createElement("div");
 +
                var propertyName = document.createElement("div");
 +
 
 +
                propertyContainer.className = "legend-element-container";
 +
                propertyContainer.id = input.properties[i];
 +
 
 +
                propertyColor.className = "color-container";
 +
 
 +
                propertyName.className = "name-container";
 +
 
 +
                propertyColor.style.float = "left";
 +
                propertyName.style.float = "left";
 +
                propertyColor.style.border = "1px solid black";
 +
                propertyName.style.border = "1px solid black";
 +
 
 +
                propertyColor.style.background = colors[i];
 +
                propertyColor.innerHTML = "";
 +
                propertyName.innerHTML = input.properties[i];
 +
 
 +
                propertyColor.style.width = "30px";
 +
                propertyColor.style.height = "30px";
 +
                propertyName.style.height = "30px";
 +
                propertyName.style.background = '#DEF';
 +
 
 +
                //propertyName.text-align = 'center';
 +
                propertyContainer.paddinng = '5px 5px 5px 5px';
 +
 
 +
                propertyName.addEventListener("click", legendFunctionality);
 +
                propertyColor.addEventListener("click", legendFunctionality);
 +
 
 +
                legendDiv.append(propertyContainer);
 +
                propertyContainer.append(propertyColor);
 +
                propertyContainer.append(propertyName);
 +
 
 +
            }
 +
 
 +
            var ul = document.createElement("ul");
 +
            ul.className = 'custom-menu';
 +
            document.body.append(ul);
 +
            objClickedProps = {};
 +
            objColors = {};
 +
            var start = 0;
 +
           
 +
 
 +
            network.on("oncontext", function(params) {
 +
            params.event.preventDefault();
 +
            var timeNow = Date.now();
 +
            var timeDiff = timeNow - start
 +
            if(timeDiff > 300){
 +
            start = Date.now();
 +
                console.log(nodes.get(network.getNodeAt({ x: params.pointer.DOM.x, y: params.pointer.DOM.y })));
 +
               
 +
//console.log(edges.get(network.getEdgeAt({ x: params.pointer.DOM.x, y: params.pointer.DOM.y })));
 +
               
 +
                $('.custom-menu').each( function(index) {
 +
                while (this.lastElementChild) {
 +
                    this.removeChild(this.lastElementChild);
 +
                }});
 +
                if(!(network.getEdgeAt({ x: params.pointer.DOM.x, y: params.pointer.DOM.y }) && network.getNodeAt({ x: params.pointer.DOM.x, y: params.pointer.DOM.y }))){
 +
                if(edges.get(network.getEdgeAt({ x: params.pointer.DOM.x, y: params.pointer.DOM.y })).from){
 +
                params.event.preventDefault();
 +
     
 +
                if(edges.get(network.getEdgeAt({ x: params.pointer.DOM.x, y: params.pointer.DOM.y })).label == 'Category'){
 +
               
 +
                var li = document.createElement("li");
 +
                        li.innerHTML = '' + '\uD83D\uDD17' + ' ' + edges.get(network.getEdgeAt({ x: params.pointer.DOM.x, y: params.pointer.DOM.y })).to;
 +
 
 +
                                li.addEventListener("click", function NewTab() {
 +
                                window.open('/wiki/' + edges.get(network.getEdgeAt({ x: params.pointer.DOM.x, y: params.pointer.DOM.y })).to);
 +
                                });
 +
                                ul.prepend(li);}else{
 +
                                var li = document.createElement("li");
 +
                        li.innerHTML = '' + '\uD83D\uDD17' + ' ' + edges.get(network.getEdgeAt({ x: params.pointer.DOM.x, y: params.pointer.DOM.y })).label;
 +
 
 +
                                li.addEventListener("click", function NewTab() {
 +
                                window.open('/wiki/' + 'Property:' + edges.get(network.getEdgeAt({ x: params.pointer.DOM.x, y: params.pointer.DOM.y })).label);
 +
                                });
 +
                                ul.prepend(li);
 +
                                }
 +
                        $(".custom-menu").finish().toggle(100).css({
 +
                        top: params.event.pageY + "px",
 +
                        left: params.event.pageX + "px",
 +
                        display: "block"
 +
                    });
 +
                }
 +
                }
 +
                if (network.getNodeAt({
 +
                        x: params.pointer.DOM.x,
 +
                        y: params.pointer.DOM.y
 +
                    })) {
 +
                    params.event.preventDefault();
 +
 
 +
                    fetch('/w/api.php?action=smwbrowse&browse=subject&params={"subject":"' + encodeURIComponent(nodes.get(network.getNodeAt({
 +
                            x: params.pointer.DOM.x,
 +
                            y: params.pointer.DOM.y
 +
                        })).id) + '","ns":0}&format=json')
 +
                        .then(response => response.json())
 +
                        .then(data => {
 +
                        var selected_node =  nodes.get(network.getNodeAt({
 +
                            x: params.pointer.DOM.x,
 +
                            y: params.pointer.DOM.y
 +
                        }));
 +
                        if (selected_node.url){
 +
                       
 +
                        var li = document.createElement("li");
 +
                        li.innerHTML = '' + '\uD83D\uDD17' + ' ' + selected_node.label;
 +
 
 +
                                li.addEventListener("click", function NewTab() {
 +
                                window.open(selected_node.url);
 +
                                });
 +
                               
 +
                                ul.prepend(li);
 +
                       
 +
                        }
 +
                        var page_properties = data.query.data; //normal page
 +
                        if (selected_node.id.includes('#')) { //subobject
 +
                        for (var i = 0; i < data.query.sobj.length; i++) {
 +
                        if (data.query.sobj[i].subject.endsWith(selected_node.id.split('#').pop().replace(' ',''))){
 +
                        page_properties = data.query.sobj[i].data
 +
                        break;
 +
                        }
 +
                        }
 +
                        }
 +
                        for (var i = 0; i < page_properties.length; i++) {
 +
                            if (!page_properties[i].property.startsWith("_")) {
 +
                                var li = document.createElement("li");
 +
                                li.dataset.action = page_properties[i].property;
 +
                                li.innerHTML = page_properties[i].property;
 +
                                ul.append(li);
 +
                            }
 +
                        }
 +
 
 +
                            $(".custom-menu li").click(function() {
 +
 
 +
                                var clickedProperty = [$(this).attr("data-action")]
 +
                               
 +
                                var clickedPropertyColor = randomHSL();
 +
                               
 +
                                if(!(clickedProperty in legendColors)){legendColors[clickedProperty] = clickedPropertyColor; }else{clickedPropertyColor = legendColors[clickedProperty]; }
 +
 
 +
                               
 +
 
 +
                                if (objColors[clickedProperty]) {
 +
                                    clickedPropertyColor = objColors[clickedProperty]
 +
                                } else {
 +
                                    objColors[clickedProperty] = clickedPropertyColor;
 +
                                }
 +
 
 +
 
 +
                                if (!objClickedProps[nodes.get(network.getNodeAt({
 +
                                        x: params.pointer.DOM.x,
 +
                                        y: params.pointer.DOM.y
 +
                                    })).id]) {
 +
                                    objClickedProps[nodes.get(network.getNodeAt({
 +
                                        x: params.pointer.DOM.x,
 +
                                        y: params.pointer.DOM.y
 +
                                    })).id] = new Array();
 +
                                }
 +
 
 +
 
 +
 
 +
                                if (!objClickedProps["" + nodes.get(network.getNodeAt({
 +
                                        x: params.pointer.DOM.x,
 +
                                        y: params.pointer.DOM.y
 +
                                    })).id].includes(clickedProperty[0])) {
 +
                                    fetchData(nodes.get(network.getNodeAt({
 +
                                        x: params.pointer.DOM.x,
 +
                                        y: params.pointer.DOM.y
 +
                                    })).id, clickedProperty, nodes.get(network.getNodeAt({
 +
                                        x: params.pointer.DOM.x,
 +
                                        y: params.pointer.DOM.y
 +
                                    })).id, clickedProperty, clickedPropertyColor)
 +
                                    objClickedProps["" + nodes.get(network.getNodeAt({
 +
                                        x: params.pointer.DOM.x,
 +
                                        y: params.pointer.DOM.y
 +
                                    })).id].push(clickedProperty[0]);
 +
                                }
 +
 
 +
                                if (!(contextCreatedProps.includes(clickedProperty[0]) || input.properties.includes(clickedProperty[0]) /*|| legendColors[clickedProperty[0]]*/ )) {
 +
 
 +
                                    contextCreatedProps.push(clickedProperty[0]);
 +
 
 +
                                    options.groups[clickedProperty] = {
 +
                                        hidden: false
 +
                                    };
 +
 
 +
                                    var propertyContainer = document.createElement("div");
 +
                                    var propertyColor = document.createElement("div");
 +
                                    var propertyName = document.createElement("div");
 +
                                   
 +
 
 +
                                    propertyContainer.className = "legend-element-container";
 +
                                    propertyContainer.id = clickedProperty;
 +
 
 +
                                    propertyColor.className = "color-container";
 +
 
 +
                                    propertyName.className = "name-container";
 +
 
 +
                                    propertyColor.style.float = "left";
 +
                                    propertyName.style.float = "left";
 +
                                    propertyColor.style.border = "1px solid black";
 +
                                    propertyName.style.border = "1px solid black";
 +
                                    propertyContainer.style = "margin-right: 5px";
 +
 
 +
 
 +
                                    propertyColor.style.background = clickedPropertyColor;
 +
                                    propertyColor.innerHTML = "";
 +
                                    propertyName.innerHTML = clickedProperty;
 +
 
 +
                                    propertyColor.style.width = "30px";
 +
                                    propertyColor.style.height = "30px";
 +
                                    propertyName.style.height = "30px";
 +
                                    propertyName.style.background = '#DEF';
 +
 
 +
                                    //propertyName.text-align = 'center';
 +
                                    propertyName.margin = 'auto 5px auto 5px';
 +
 
 +
                                    propertyName.addEventListener("click", legendFunctionality);
 +
                                    propertyColor.addEventListener("click", legendFunctionality);
 +
 
 +
 
 +
                                    legendDiv.append(propertyContainer);
 +
                                    propertyContainer.append(propertyColor);
 +
                                    propertyContainer.append(propertyName);
 +
 
 +
                                }
 +
 
 +
                                $(".custom-menu").hide(100);
 +
                            });
 +
                        });
 +
 
 +
                    $(".custom-menu").finish().toggle(100).css({
 +
                        top: params.event.pageY + "px",
 +
                        left: params.event.pageX + "px",
 +
                        display: "block"
 +
                    });
 +
                }
 +
            }
 +
            });
 +
            // If the document is clicked somewhere
 +
            $(document).bind("mousedown", function(e) {
 +
 
 +
                // If the clicked element is not the menu
 +
                if (!$(e.target).parents(".custom-menu").length > 0) {
 +
 
 +
                    // Hide it
 +
                    $(".custom-menu").hide(100);
 +
                }
 +
            });
 +
         
 +
function editNode(data, cancelAction, callback) {
 +
var newNodeActive = true;
 +
  document.getElementById("node-label").value = data.label;
 +
  document.getElementById("node-saveButton").onclick = saveNodeData.bind(
 +
    this,
 +
    data,
 +
    callback
 +
  );
 +
  document.getElementById("node-cancelButton").onclick = cancelAction.bind(
 +
    this,
 +
    callback
 +
  );
 +
  //document.getElementById("node-popUp")
 +
 
 +
 
 +
  $('canvas').on('click', function(e) {
 +
  if(newNodeActive === true){
 +
    $("#node-popUp").css({
 +
                        top: e.pageY + "px",
 +
                        left: e.pageX + "px",
 +
                        display: "block"
 +
                        });}
 +
                        newNodeActive = false;
 +
                       
 +
});
 +
 
 +
}
 +
 
 +
// Callback passed as parameter is ignored
 +
function clearNodePopUp() {
 +
  document.getElementById("node-saveButton").onclick = null;
 +
  document.getElementById("node-cancelButton").onclick = null;
 +
  document.getElementById("node-popUp").style.display = "none";
 +
}
 +
 
 +
function cancelNodeEdit(callback) {
 +
  clearNodePopUp();
 +
  callback(null);
 +
}
 +
 
 +
function saveNodeData(data, callback) {
 +
  data.label = document.getElementById("node-label").value;
 +
  data.id = document.getElementById("node-label").value;
 +
  data.hidden = false;
 +
  data.physics = false;
 +
  document.getElementById("node-label").value = "";
 +
  clearNodePopUp();
 +
  callback(data);
 +
}
 +
 
 +
function editEdgeWithoutDrag(data, callback) {
 +
var newEdgeActive = true;
 +
  // filling in the popup DOM elements
 +
  document.getElementById("edge-label").value = data.label;
 +
    /*if(data.from === "H.1"){
 +
  console.log("here");
 +
  return;}*/
 +
  document.getElementById("edge-saveButton").onclick = saveEdgeData.bind(
 +
    this,
 +
    data,
 +
    callback
 +
  );
 +
  document.getElementById("edge-cancelButton").onclick = cancelEdgeEdit.bind(
 +
    this,
 +
    callback
 +
  );
 +
 
 +
  $('canvas').on('click', function(e) {
 +
  if(newEdgeActive === true){
 +
    $("#edge-popUp").css({
 +
                        top: e.pageY + "px",
 +
                        left: e.pageX + "px",
 +
                        display: "block"
 +
                        });}
 +
                        newEdgeActive = false;
 +
});
 +
  //document.getElementById("edge-popUp").style.display = "block";
 +
}
 +
 
 +
function clearEdgePopUp() {
 +
  document.getElementById("edge-saveButton").onclick = null;
 +
  document.getElementById("edge-cancelButton").onclick = null;
 +
  document.getElementById("edge-popUp").style.display = "none";
 +
}
 +
 
 +
function cancelEdgeEdit(callback) {
 +
  clearEdgePopUp();
 +
  callback(null);
 +
}
 +
 
 +
function isLabelReversed(label){
 +
  if(label[0] == "-"){
 +
    return true;
 +
  }
 +
  else{
 +
    return false;
 +
  }
 +
}
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
var pageBool;
 +
async function pageExists(id){
 +
 +
await fetch('/w/api.php?action=parse&page='+ id +'&prop=wikitext&format=json')
 +
                        .then(response => response.json())
 +
                        .then(data => {
 +
                       
 +
                        if(data.error){
 +
                        pageBool = false;
 +
                        }else{
 +
                        pageBool = true;
 +
                        }
 +
                       
 +
                        })
 +
return pageBool;
 +
}
   −
if(nodeChildren.length === 0){
+
var wikiText = "";
+
var semantic = "";
continue;
+
async function editWikiText(node){
}else{
+
await fetch('/w/api.php?action=parse&page='+ node +'&prop=wikitext&format=json')
+
                        .then(response => response.json())
for(var j = 0; j<nodeChildren.length;j++){
+
                        .then(data => {
console.log(nodes.get(nodeChildren[j]).group);
+
                        wikiText = data.parse.wikitext['*'];
oldGroups.push({id: nodes.get(nodeChildren[j]).id, group:nodes.get(nodeChildren[j]).group});
+
                        semantic = "";
 +
if(wikiText.search(/(\{\{Semantic\/[^}]*[\r\n]*\}[\r\n]*\})/g) >= 0){
 +
//var edgeStringFound = wikiText.search(re) >= 0;
 +
const found = wikiText.match(/(\{\{Semantic\/[^}]*[\r\n]*\}[\r\n]*\})/g);
 +
 +
var newWikiText = wikiText;
 +
for(var i=0; i<found.length;i++){
 +
if(i == found.length-1){
 +
semantic += found[i];
 +
newWikiText = newWikiText.replace(/(\{\{Semantic\/[^}]*[\r\n]*\}[\r\n]*\}[\r\n]*\}[\r\n]*\})/g, "");
 +
}else{
 +
semantic += found[i];
 +
newWikiText = newWikiText.replace(found[i], "");
 +
}
 +
}
 +
wikiText = newWikiText;
 +
 
 
nodes.update({id: nodeChildren[j], group:legendGroup});
+
 
console.log(nodes.get(nodeChildren[j]));
+
 
network.body.emitter.emit('_dataChanged');
+
}
      network.redraw();
+
});
+
return [semantic, wikiText];
 +
}
 +
 
 +
 
 +
 
 +
async function saveEdgeData(data, callback) {
 +
  if (typeof data.to === "object") data.to = data.to.id;
 +
  if (typeof data.from === "object") data.from = data.from.id;
 +
 
 +
  data.label = document.getElementById("edge-label").value;
 +
  options.groups[data.label] = {hidden: false};
 +
  var toNode = nodes.get(data.to);
 +
  var fromNode = nodes.get(data.from);
 +
  fromNode.physics = true;
 +
  toNode.physics = true;
 +
  delete fromNode.x;
 +
  delete fromNode.y;
 +
  delete toNode.x;
 +
  delete toNode.y;
 +
  if(!toNode.group){toNode.group = data.label}
 +
  if(!fromNode.group){fromNode.group = data.label}
 +
  if(legendColors[data.label]){data.color = legendColors[data.label];}else{data.color = randomHSL(); }
 +
  if(!toNode.color){toNode.color = data.color; toNode.manually = true;}
 +
  if(!fromNode.color){fromNode.color = data.color; fromNode.manually = true;}
 +
 
 +
  if(!(contextCreatedProps.includes(data.label) || input.properties.includes(data.label))){
 +
  contextCreatedProps.push(data.label);
 +
var propertyContainer = document.createElement("div");
 +
    var propertyColor = document.createElement("div");
 +
    var propertyName = document.createElement("div");
 +
   
 +
 
 +
    propertyContainer.className = "legend-element-container";
 +
    propertyContainer.id = data.label;
 +
 
 +
    propertyColor.className = "color-container";
 +
 
 +
    propertyName.className = "name-container";
 +
 
 +
    propertyColor.style.float = "left";
 +
    propertyName.style.float = "left";
 +
    propertyColor.style.border = "1px solid black";
 +
    propertyName.style.border = "1px solid black";
 +
    propertyContainer.style = "margin-right: 5px";
 +
 
 +
 
 +
    propertyColor.style.background = data.color;
 +
    propertyColor.innerHTML = "";
 +
    propertyName.innerHTML = data.label;
 +
 
 +
    propertyColor.style.width = "30px";
 +
    propertyColor.style.height = "30px";
 +
    propertyName.style.height = "30px";
 +
    propertyName.style.background = '#DEF';
 +
 
 +
    //propertyName.text-align = 'center';
 +
    propertyName.margin = 'auto 5px auto 5px';
 +
 
 +
    propertyName.addEventListener("click", legendFunctionality);
 +
    propertyColor.addEventListener("click", legendFunctionality);
 +
 
 +
 
 +
    legendDiv.append(propertyContainer);
 +
    propertyContainer.append(propertyColor);
 +
    propertyContainer.append(propertyName);
 +
  legendColors[data.label] = data.color;
 +
  }
 +
  if(isLabelReversed(data.label)){
 +
  if(await pageExists(fromNode.id) === false){
 +
  if(!(newNodes[fromNode.id])){
 +
  newNodes[fromNode.id] = '' + '{{Semantic/Element' +
 +
'|label=' + fromNode.label +
 +
'|description=test' +
 +
'|relations=';
 +
  }
 +
 
 +
  }
 +
 
 +
  if(await pageExists(toNode.id) === true){
 +
  var splitWikiText = await editWikiText(toNode.id);
 +
  if(editNodes[toNode.id]){
 +
  editNodes[toNode.id] += '' + '{{Semantic/Link'+
 +
'|property=' + reverseLabel(data.label) +
 +
'|value=' + fromNode.id +
 +
'}}' + '';
 +
 
 +
  }else{
 +
  if(splitWikiText[0]){
 +
  editNodes[toNode.id] = splitWikiText[1] + splitWikiText[0] + '{{Semantic/Link'+
 +
'|property=' + reverseLabel(data.label) +
 +
'|value=' + fromNode.id +
 +
'}}' + '';
 +
  }else{
 +
  editNodes[toNode.id] = splitWikiText[1] + '{{Semantic/Element' +
 +
'|label=' + toNode.label +
 +
'|description=test' +
 +
'|relations='+
 +
  '{{Semantic/Link'+
 +
'|property=' + reverseLabel(data.label) +
 +
'|value=' + fromNode.id +
 +
'}}' + '';
 +
  }
 +
  }
 +
  }else{
 +
  if(newNodes[toNode.id]){
 +
  newNodes[toNode.id] += '' + '{{Semantic/Link'+
 +
'|property=' + reverseLabel(data.label) +
 +
'|value=' + fromNode.id +
 +
'}}' + '';
 +
  }else{
 +
  newNodes[toNode.id] = '' + '{{Semantic/Element' +
 +
'|label=' + toNode.label +
 +
'|description=test' +
 +
'|relations={{Semantic/Link'+
 +
'|property=' + reverseLabel(data.label) +
 +
'|value=' + fromNode.id +
 +
'}}'+
 +
'';
 +
  }
 +
  }
 +
 
 +
  }else{
 +
 
 +
  if(await pageExists(toNode.id) === false){
 +
  if(!(newNodes[toNode.id])){
 +
  newNodes[toNode.id] = '' + '{{Semantic/Element' +
 +
'|label=' + toNode.label +
 +
'|description=test' +
 +
'|relations=';
 +
  }
 +
  }
 +
  if(await pageExists(fromNode.id) === true){
 +
  var splitWikiText = await editWikiText(fromNode.id);
 +
  if(editNodes[fromNode.id]){
 +
  editNodes[fromNode.id] += '' + '{{Semantic/Link'+
 +
'|property=' + data.label +
 +
'|value=' + toNode.id +
 +
'}}' + '';
 +
  }else{
 +
  if(splitWikiText[0]){
 +
  editNodes[fromNode.id] = splitWikiText[1] +  splitWikiText[0] + '{{Semantic/Link'+
 +
'|property=' + data.label +
 +
'|value=' + toNode.id +
 +
'}}' + '';
 +
  }else{
 +
  editNodes[fromNode.id] = splitWikiText[1] + '{{Semantic/Element' +
 +
'|label=' + fromNode.label +
 +
'|description=test' +
 +
'|relations='+
 +
  '{{Semantic/Link'+
 +
'|property=' + data.label +
 +
'|value=' + toNode.id +
 +
'}}' + '';
 +
  }
 +
  }
 +
  }else{
 +
  if(newNodes[fromNode.id]){
 +
  newNodes[fromNode.id] += '' + '{{Semantic/Link'+
 +
'|property=' + data.label +
 +
'|value=' + toNode.id +
 +
'}}' + '';
 +
 
 +
  }else{
 +
  newNodes[fromNode.id] = '' + '{{Semantic/Element' +
 +
'|label=' + fromNode.label +
 +
'|description=test' +
 +
'|relations={{Semantic/Link'+
 +
'|property=' + data.label +
 +
'|value=' + toNode.id +
 +
'}}'+
 +
'';
 +
 +
  }
 +
  }
 +
 
 +
  }
 +
 
 +
  //console.log(toNode);
 +
  //console.log(fromNode);
 +
 
 +
console.log(editNodes);
 +
console.log(newNodes);
 +
 
 +
  clearEdgePopUp();
 +
  callback(data);
 +
  network.setOptions(options);
 +
  network.body.emitter.emit('_dataChanged');
 +
  network.redraw();
 +
}
 +
    var saveBtn= document.createElement("button");
 +
            saveBtn.addEventListener("click", saveGraphChanges);
 +
            saveBtn.innerHTML = "Speichern";
 +
            saveBtn.style.width = "auto";
 +
            saveBtn.style.height = "auto";
 +
 
 +
givenDiv.appendChild(saveBtn);
 +
function saveGraphChanges() {
 +
var alertString = "";
 +
OO.ui.confirm( 'Änderungen übernehmen?' ).done( async function ( confirmed ) {
 +
    if ( confirmed ) {
 +
for (const [key, value] of Object.entries(newNodes)) {
 +
  var params = {
 +
action: 'edit',
 +
title: '' + key,
 +
appendtext: '' + value + '}}',
 +
format: 'json'
 +
},
 +
api = new mw.Api();
 
 
 +
await api.postWithToken( 'csrf', params ).done( function ( data ) {
 +
console.log( data );
 +
alertString += "Seite " + key + " erstellt!\r\n"
 +
} );
 +
}
 +
 +
for (const [key, value] of Object.entries(editNodes)) {
 +
  var params = {
 +
action: 'edit',
 +
title: '' + key,
 +
text: '' + value + '}}',
 +
format: 'json'
 +
},
 +
api = new mw.Api();
 
 
 +
await api.postWithToken( 'csrf', params ).done( function ( data ) {
 +
console.log( data );
 +
alertString += "Seite " + key + " bearbeitet!\r\n"
 +
} );
 +
}
 +
 +
for (const [key, value] of Object.entries(editDeletedEdges)) {
 +
  var params = {
 +
action: 'edit',
 +
title: '' + key,
 +
text: '' + value,
 +
format: 'json'
 +
},
 +
api = new mw.Api();
 
 
}console.log(oldGroups);
+
await api.postWithToken( 'csrf', params ).done( function ( data ) {
 +
console.log( data );
 +
alertString += "Auf der Seite " + key + " wurde ein Attribut gelöscht!\r\n"
 +
} );
 
}
 
}
 
 
 +
for (const [key, value] of Object.entries(editDeletedNodes)) {
 +
  var params = {
 +
action: 'delete',
 +
title: '' + key,
 +
format: 'json'
 +
},
 +
api = new mw.Api();
 +
await api.postWithToken( 'csrf', params ).done( function ( data ) {
 +
console.log( data );
 +
alertString += "Seite " + key + " wurde gelöscht!\r\n"
 +
} );
 +
}
 +
console.log( alertString );
 +
// Example: Customize the displayed actions at the time the window is opened.
 +
var messageDialog = new OO.ui.MessageDialog();
 
 
 +
// Create and append a window manager.
 +
var windowManager = new OO.ui.WindowManager();
 +
$( 'body' ).append( windowManager.$element );
 
 
}
+
// Add the dialog to the window manager.
network.body.emitter.emit('_dataChanged');
+
windowManager.addWindows( [ messageDialog ] );
      network.redraw();
  −
 
  −
     
  −
     
  −
     
  −
     
  −
     
  −
      }else{
  −
     
  −
group = nodes.get({
  −
filter: function (item) {
  −
    return item.group == legendGroup;
  −
}
  −
});
  −
console.log(options.groups);
  −
      for( i = 0; i<group.length;i++){
  −
     
   
 
nodeChildren = network.getConnectedNodes(group[i].id, 'to');
+
// Configure the message dialog when it is opened with the window manager's openWindow() method.
options.groups[legendGroup].hidden = false;
  −
      //options.groups[legendGroup].hidden = false;
  −
      network.body.emitter.emit('_dataChanged');
  −
      network.redraw();
  −
console.log(nodeChildren.length);
  −
if(nodeChildren.length === 0){
  −
continue;
  −
}else{
  −
for( j = 0; j<oldGroups.length;j++){
  −
console.log(oldGroups[j],id);
  −
nodes.update({id: oldGroups[j].id, group:oldGroups[j].group});
  −
network.body.emitter.emit('_dataChanged');
  −
      network.redraw();
  −
  −
  −
}
  −
}
   
 
 +
windowManager.openWindow( messageDialog, {
 +
  title: 'Folgende Änderugnen wurden übernommen:',
 +
  message: '' + alertString,
 +
  verbose: true,
 +
  actions: [
 +
    {
 +
      action: 'accept',
 +
      label: 'Okay',
 +
      flags: 'primary'
 +
    }
 +
  ]
 +
});
 +
/*OO.ui.alert( "" + alertString ).done( function () {
 +
    console.log( alertString );
 +
} );*/
 
 
 +
    } else {
 +
       
 +
    }
 +
   
 +
} );
 
 
 +
 
}
 
}
network.body.emitter.emit('_dataChanged');
+
      network.redraw();
+
 
      oldGroups = [];
+
 
     
+
 
     
+
function deleteSelectedNode(data, callback){
      }}
+
console.log(contextCreatedProps);
/////////////////////////////////////////////////////////////////////////////////////     
+
deleteNodesChildren(data.nodes[0]);
     
+
nodes.remove(data.nodes[0]);
      /*for( i = 0; i < nodesArray.length; i++){
+
                        for (var i = 0; i < contextCreatedProps.length; i++) {
      if(params.nodes[0] == nodesArray[i]){
+
                            var noNodesInNetwork = true;
      isInArray = true;
+
                            for (var j = 0; j < nodes.getIds().length; j++) {
      }}*/
+
                                if (contextCreatedProps[i] == nodes.get(nodes.getIds()[j]).group) {
      if(network.getConnectedNodes(params.nodes[0]).length >1 ){
+
                               
      deleteNodes(params.nodes[0]);
+
                                    noNodesInNetwork = false;
      nodesArray.splice(nodesArray.indexOf(params.nodes[0]),1);
+
                                }
      //|| (params.nodes[0]===1)
+
                            }
     
+
                            if (noNodesInNetwork === true) {
      //isInArray = false;
+
                           
      }else{
+
                                givenDiv.querySelector('#' + contextCreatedProps[i]).remove();
      var nodeById = nodes.get(params.nodes[0]);
+
                                contextCreatedProps.splice(contextCreatedProps.indexOf(contextCreatedProps[i]), 1);
      fetchData(nodeById.label, input.properties, params.nodes[0]);
+
                                i--;
      nodesArray.push(params.nodes[0]);
+
                            }
     
+
                        }
      }
+
 
 +
                       
 +
    delete oldGroups["" + data.nodes[0]];
 +
                       
 +
                        delete objClickedProps["" + data.nodes[0]];
 +
                        callback();
 +
                        document.querySelector('.vis-delete').remove();
 +
editDeletedNodes[""+data.nodes[0]] = "";
 +
delete newNodes[""+data.nodes[0]];
 +
delete editNodes[""+data.nodes[0]];
 +
console.log(editDeletedNodes);
 +
 
 +
}
 +
 
 +
async function deleteSelectedEdge(data, callback){
 +
var edgeToNode = edges.get(data.edges[0]).to;
 +
var edgeFromNode = edges.get(data.edges[0]).from;
 +
var edgeLabel = edges.get(data.edges[0]).label;
 +
console.log(edgeLabel);
 +
edges.remove(data.edges[0]);
 +
deleteNodesChildren(edgeToNode, true);
 +
deleteNodesChildren(edgeFromNode, true);
 +
 +
for (var i = 0; i < contextCreatedProps.length; i++) {
 +
                            var noNodesInNetwork = true;
 +
                            for (var j = 0; j < nodes.getIds().length; j++) {
 +
                                if (contextCreatedProps[i] == nodes.get(nodes.getIds()[j]).group) {
 +
                               
 +
                                    noNodesInNetwork = false;
 +
                                }
 +
                            }
 +
                            if (noNodesInNetwork === true) {
 +
                           
 +
                                givenDiv.querySelector('#' + contextCreatedProps[i]).remove();
 +
                                contextCreatedProps.splice(contextCreatedProps.indexOf(contextCreatedProps[i]), 1);
 +
                                i--;
 +
                            }
 +
                        }
 +
 +
if(edgeLabel[0] == "-"){
 +
if(await pageExists(edgeToNode) === true){
 +
await fetch('/w/api.php?action=parse&page='+ edgeToNode +'&prop=wikitext&format=json')
 +
                        .then(response => response.json())
 +
                        .then(data => {
 +
                        var wikiText = data.parse.wikitext['*'];
 +
console.log(wikiText);
 +
 +
                        var edgeString = `(\{\{Semantic\/Link[\\r\\n]*\\|[\\r\\n]*property=`+reverseLabel(edgeLabel)+`[\\r\\n]*\\|[\\r\\n]*value=`+edgeFromNode+`[\\r\\n]*\\}[\\r\\n]*\\}[\\r\\n]*)`
 +
//var edgeString = '(\\{\\{Semantic\/Element[^}]*[\\r\\n]*\\}[\\r\\n]*\\}[\\r\\n]*[\\r\\n]*\\}[\\r\\n]*\\})'
 +
var re = new RegExp(edgeString,"g");
 +
                       
 +
                        var edgeStringFound = wikiText.search(re) >= 0;
 +
                       
 +
                        if(edgeStringFound){
 +
                        if(editDeletedEdges[""+ edgeToNode]){
 +
                        var newWikiText = editDeletedEdges[""+ edgeToNode].replace(re, "");
 +
                        editDeletedEdges[""+ edgeToNode] = newWikiText;
 +
                        }else{
 +
                        var newWikiText = wikiText.replace(re, "");
 +
                        console.log(newWikiText)
 +
                        editDeletedEdges[""+ edgeToNode] = newWikiText;
 +
                        }
 +
   
 +
                        }
 +
                       
 +
                        if(newNodes[""+edgeToNode]){
 +
                       
 +
                        var newWikiText = newNodes[""+edgeToNode].replace(re, "");
 +
                        newNodes[""+edgeToNode] = newWikiText;
 +
 
 +
                        }
 +
                       
 +
                        if(editNodes[""+edgeToNode]){
 +
                       
 +
                        var newWikiText = editNodes[""+edgeToNode].replace(re, "");
 +
                        editNodes[""+edgeToNode] = newWikiText;
 +
                       
 +
                        }
 +
 
 +
                        });}else{
 +
                        if(network.getConnectedNodes(edgeToNode).length == 0){
 +
                        delete newNodes[""+edgeToNode];
 +
                        }else{
 +
                        var edgeString = `(\{\{Semantic\/Link[\\r\\n]*\\|[\\r\\n]*property=`+reverseLabel(edgeLabel)+`[\\r\\n]*\\|[\\r\\n]*value=`+edgeFromNode+`[\\r\\n]*\\}[\\r\\n]*\\}[\\r\\n]*)`;
 +
 
 +
                        var re = new RegExp(edgeString,"g");
 +
                        var wikiText = newNodes[""+edgeToNode];
 +
                        var newWikiText = wikiText.replace(re,"");
 +
                        newNodes[""+edgeToNode] = newWikiText;
 +
                        }
 +
                        }
 +
}else{
 +
if(await pageExists(edgeFromNode) === true){
 +
await fetch('/w/api.php?action=parse&page='+ edgeFromNode +'&prop=wikitext&format=json')
 +
                        .then(response => response.json())
 +
                        .then(data => {
 +
                        var wikiText = data.parse.wikitext['*'];
 +
console.log(wikiText);
 +
 +
                        var edgeString = `(\{\{Semantic\/Link[\\r\\n]*\\|[\\r\\n]*property=`+edgeLabel+`[\\r\\n]*\\|[\\r\\n]*value=`+edgeToNode+`[\\r\\n]*\\}[\\r\\n]*\\}[\\r\\n]*)`;
 +
//var edgeString = '(\\{\\{Semantic\/Element[^}]*[\\r\\n]*\\}[\\r\\n]*\\}[\\r\\n]*[\\r\\n]*\\}[\\r\\n]*\\})'
 +
var re = new RegExp(edgeString,"g");
 +
                       
 +
                        var edgeStringFound = wikiText.search(re) >= 0;
 +
                       
 +
                        if(edgeStringFound){
 +
                        if(editDeletedEdges[""+ edgeFromNode]){
 +
                        var newWikiText = editDeletedEdges[""+ edgeFromNode].replace(re, "");
 +
                        editDeletedEdges[""+ edgeFromNode] = newWikiText;
 +
                        }else{
 +
                        var newWikiText = wikiText.replace(re, "");
 +
                        console.log(newWikiText)
 +
                        editDeletedEdges[""+ edgeFromNode] = newWikiText;
 +
                        }
 +
   
 +
                        }
 +
                       
 +
                        if(newNodes[""+edgeFromNode]){
 +
                       
 +
                        var newWikiText = newNodes[""+edgeFromNode].replace(re, "");
 +
                        newNodes[""+edgeFromNode] = newWikiText;
 +
 
 +
                        }
 +
                       
 +
                        if(editNodes[""+edgeFromNode]){
 +
                       
 +
                        var newWikiText = editNodes[""+edgeFromNode].replace(re, "");
 +
                        editNodes[""+edgeFromNode] = newWikiText;
 +
                       
 +
                        }
 +
 
 +
                       
 +
                        });}else{
 +
                        if(network.getConnectedNodes(edgeFromNode).length == 0){
 +
                        delete newNodes[""+edgeFromNode];
 +
                        }else{
 +
                        var edgeString = `(\{\{Semantic\/Link[\\r\\n]*\\|[\\r\\n]*property=`+edgeLabel+`[\\r\\n]*\\|[\\r\\n]*value=`+edgeToNode+`[\\r\\n]*\\}[\\r\\n]*\\}[\\r\\n]*)`;
 +
 
 +
                        var re = new RegExp(edgeString,"g");
 +
                        var wikiText = newNodes[""+edgeFromNode];
 +
                        var newWikiText = wikiText.replace(re,"");
 +
                        newNodes[""+edgeFromNode] = newWikiText;
 +
                        }
 +
                        console.log(newNodes);
 +
                        }
 +
                       
 +
}
 +
 +
 +
 +
 +
console.log(editDeletedEdges);
 +
//nodes.remove(edges.get(data.edges[0]).to);
 +
 +
callback(data);
 +
document.querySelector('.vis-delete').remove();
 +
console.log(objClickedProps);
 +
    console.log(oldGroups);
 +
}
 +
 
 +
var editHtml = '' +
   −
      }
+
'<div id="node-popUp">' +
 +
'  <span id="node-operation" style="cursor: move;">node</span> <br />' +
 +
'  <table style="margin: auto">' +
 +
'    <tbody>' +
 +
'      <tr>' +
 +
'        <td>label</td>' +
 +
'        <td><input id="node-label" value="" /></td>' +
 +
'      </tr>' +
 +
'    </tbody>' +
 +
'  </table>' +
 +
'  <input type="button" value="save" id="node-saveButton" />' +
 +
'  <input type="button" value="cancel" id="node-cancelButton" />' +
 +
'</div>' +
 +
'' +
 +
'<div id="edge-popUp">' +
 +
'  <span id="edge-operation" style="cursor: move;">edge</span> <br />' +
 +
'  <table style="margin: auto">' +
 +
'    <tbody>' +
 +
'      <tr>' +
 +
'        <td>label</td>' +
 +
'        <td><input id="edge-label" value="" /></td>' +
 +
'      </tr>' +
 +
'    </tbody>' +
 +
'  </table>' +
 +
'  <input type="button" value="save" id="edge-saveButton" />' +
 +
'  <input type="button" value="cancel" id="edge-cancelButton" />' +
 +
'</div>' +
 +
'';
 +
 
 +
 
 +
 
 +
 
 +
var editHtmlDiv = document.createElement("div");
 +
editHtmlDiv.innerHTML = editHtml;
 +
document.body.appendChild(editHtmlDiv);
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
//dragElement(document.getElementById("node-popUp"));
 +
//dragElement(document.getElementById("edge-popUp"));
 +
 
 +
function dragElement(elmnt) {
 +
  var pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
 +
  if (document.getElementById(elmnt.id)) {
 +
 
 +
    // if present, the header is where you move the DIV from:
 +
    document.getElementById("node-operation").onmousedown = dragMouseDown;
 +
    document.getElementById("edge-operation").onmousedown = dragMouseDown;
 +
  } else {
 +
    // otherwise, move the DIV from anywhere inside the DIV:
 +
    elmnt.onmousedown = dragMouseDown;
 +
  }
 +
 
 +
  function dragMouseDown(e) {
 +
    e = e || window.event;
 +
    e.preventDefault();
 +
    // get the mouse cursor position at startup:
 +
    pos3 = e.clientX;
 +
    pos4 = e.clientY;
 +
    document.onmouseup = closeDragElement;
 +
    // call a function whenever the cursor moves:
 +
    document.onmousemove = elementDrag;
 +
  }
 +
 
 +
  function elementDrag(e) {
 +
    e = e || window.event;
 +
    e.preventDefault();
 +
    // calculate the new cursor position:
 +
    pos1 = pos3 - e.clientX;
 +
    pos2 = pos4 - e.clientY;
 +
    pos3 = e.clientX;
 +
    pos4 = e.clientY;
 +
    // set the element's new position:
 +
    elmnt.style.top = (elmnt.offsetTop - pos2) + "px";
 +
    elmnt.style.left = (elmnt.offsetLeft - pos1) + "px";
 +
  }
   −
      });
+
  function closeDragElement() {
     
+
    // stop moving when mouse button is released:
     
+
     document.onmouseup = null;
      
+
     document.onmousemove = null;
    
+
  }
    });
+
}
});
     −
/*groups: {
  −
  useDefaultGroups: false,
  −
'Kategorie': {},
  −
  '-IsLocatedIn': {}
  −
  }*/
      +
        }
 +
    });
 +
    });
   −
/*for (var key in data.query.results[input.root].printouts) {
+
});
    if (data.query.results[input.root].printouts.hasOwnProperty(key)) {
  −
    for(var key2 in data.query.results[input.root].printouts[key]){
  −
        console.log(data.query.results[input.root].printouts[key][key2].fulltext);
  −
    }
  −
    }
  −
}*/
 
Bots, bulkpusher, Bureaucrats, checkuser, filepusher, Interface administrators, oversight, pusher, rdfioadministrator, rdfiocurator, Administrators (Semantic MediaWiki), Curators (Semantic MediaWiki), Editors (Semantic MediaWiki), Administrators
5,444

edits