root/SPARQLBuilderWWW/web/sparqlbuilder.js @ 215

リビジョン 215, 38.7 KB (コミッタ: atsuko, 10 年 前)

SPARQL生成APIのJSON形式を変更

  • 属性 svn:mime-type の設定値 text/plain
Rev行番号 
[209]1var SPARQLBuilder = function(result,endpoint) {
2    this.result = result;
3    this.builder = this.createBuilder('http://www.sparqlbuilder.org/forms/guiform.php');
4    this.showBuilder();
5    this.drawGraph = null;
6    this.startClass = null;
7    this.endClass = null;
8    this.endPoint = endpoint;
9};
10
11SPARQLBuilder.prototype.createBuilder = function(form) {
12    var builder = $('<div class="SparqlBuilder"></div>');
13    var content = $('<div class="SparqlBuilderContent"></div>');
14    builder.prepend(content);
15    var self = this;
16    $.ajax({
17        type : "GET",
18        url : form,
19        async : false,
20        success : function(data) {
21            content.prepend($(data));
22        }
23    });
24    $("body").prepend(builder);
25    return builder;
26}
27
28SPARQLBuilder.prototype.showBuilder = function() {
29    var width = $(document).width();
30    var height = $(document).height();
31    this.builder.css("width", width);
32    this.builder.css("height", height);
33    this.builder.css("display", "block");
34
35    document.getElementById("sparqlBuilderAjaxload").style.width = width;
36    document.getElementById("sparqlBuilderAjaxload").style.height = height;
37    this.loadIcon("hide");
38
39    var self = this;
40    this.loadEndPointList();
41
42    $("#EndPointSelect").change(function() {
43        self.changeEndPoint();
44    });
45    //$("#SetClassButton").click(function() {
46    //    self.startClass = $("#StartClassSelect").val();
47    //    self.endClass = $("#EndClassSelect").val();
48    //    self.loadPathList();
49    //});
50    $("#StartClassSelect").change(function() {
51        self.startClass = $("#StartClassSelect").val();
52        self.loadPathList();
53    });
54    $("#EndClassSelect").change(function() {
55        self.endClass = $("#EndClassSelect").val();
56        self.loadPathList();
57    });
58    $("#sparqlBuilderViewall").click(function() {
59        self.drawGraph.setPathLimit(0);
60        self.drawGraph.view_map();
61    });
62    $("#GenerateSPARQLButton").click(function() {
63        var sparql = self.generateSPARQL(self.drawGraph.pathobj);
64    });
65    $("#SparqlBuilderCancel").click(function() {
66        self.hideBuilder();
67    });
68}
69
70SPARQLBuilder.prototype.loadIcon = function(mode) {
71   if(mode == "view"){
72      document.getElementById("sparqlBuilderAjaxload").style.display = "block";
73   }else{
74      document.getElementById("sparqlBuilderAjaxload").style.display = "none";
75   }
76}
77
78SPARQLBuilder.prototype.loadEndPointList = function() {
79    var url = 'http://www.sparqlbuilder.org/api/eplist';
80    $.ajax({
81        url: url,
82        success: function(data) {
83            var list = eval(data);
84            $("#EndPointSelect").empty();
85            $("#EndPointSelect").append('<option>SELECT</option>');
86            for (var i = 0; i < list.length; ++i) {
87                $("#EndPointSelect").append('<option value="' + list[i] + '">' + list[i] + '</option>');
88            }
89        },
90    });
91}
92
93SPARQLBuilder.prototype.loadClassList = function() {
94    var url = "http://www.sparqlbuilder.org/api/clist?ep=" + encodeURIComponent(this.endpoint);
[215]95    //var url = "http://localhost:8080/api/clist?ep=" + encodeURIComponent(this.endpoint);
[209]96    $.ajax({
97        type : "GET",
98        url : url,
99        async : false,
100        success : function(data) {
101            list = eval(data);
102            $("#StartClassSelect").empty();
103            $("#EndClassSelect").empty();
104            for (var i = 0; i < list.length; ++i) {
105                //$("#StartClassSelect").append('<option value="' + list[i]['uri'] + '">' + list[i]['display'] + '</option>');
106                //$("#EndClassSelect").append('<option value="' + list[i]['uri'] + '">' + list[i]['display'] + '</option>');
107                $("#StartClassSelect").append('<option value="' + list[i]['uri'] + '">' + list[i]['label'] + ' (' + list[i]['number'] + ')' + '</option>');
108                $("#EndClassSelect").append('<option value="' + list[i]['uri'] + '">' + list[i]['label'] + ' (' + list[i]['number'] + ')' + '</option>');
109            }
110        }
111    });
112}
113
114SPARQLBuilder.prototype.loadPathList = function() {
115    if (this.startClass == null || this.endClass == null ){ return; }
116    var startclass = $("#StartClassSelect").val();
117    var endclass = $("#EndClassSelect").val();
118    var url = "http://www.sparqlbuilder.org/api/plist?ep=" + encodeURIComponent(this.endpoint)
119                                          + "&startclass=" + encodeURIComponent(startclass)
120                                          + "&endclass="   + encodeURIComponent(endclass);
[215]121    //var url = "http://localhost:8080/api/plist?ep=" + encodeURIComponent(this.endpoint)
122    //                                      + "&startclass=" + encodeURIComponent(startclass)
123    //                                      + "&endclass="   + encodeURIComponent(endclass);
[209]124    var self = this;
125    self.loadIcon("view");
126    setTimeout(function(){
127
128        $.ajax({
129            type : "GET",
130            url : url,
131            async : false,
132            timeout : 1000000,
133            success : function(data) {
134                var width = $(".SparqlBuilderContent").width();
135                self.drawGraph = new SPARQLBuilderDrawGraph(data, width, 10);
136                self.loadIcon("hide");
137                self.drawGraph.view_map();
138            },
139            error: function(data){
140                self.loadIcon("hide");
141                alert("error: ", data);
142            }
143        });
144    }, 100)
145}
146
147SPARQLBuilder.prototype.changeEndPoint = function() {
148    this.endpoint = $("#EndPointSelect").val();
149    this.loadClassList();
150}
151
152SPARQLBuilder.prototype.hideBuilder = function() {
153    this.builder.hide();
154}
155
156SPARQLBuilder.prototype.generateSPARQL = function(pathobj) {
157    var path = JSON.stringify(pathobj);
[215]158    var url = 'http://www.sparqlbuilder.org/api/sparql?path=' + encodeURIComponent(path);
159    //var url = 'http://localhost:8080/api/sparql?path=' + encodeURIComponent(path);
[209]160    var sparql = '';
161    var self = this;
162    $.ajax({
163        type: "GET",
164        url : url,
165        dataType: 'text',
166        async: false,
167        success : function(data) {
168            $("#" + self.result).val(data);
169            //$("#" + self.endPoint).val($('EndPointSelect').val());
170            $("#" + self.endPoint).val(self.endpoint);
171            self.hideBuilder();
172        }
173    });
174}
175
176var SPARQLBuilderDrawGraph = function(jsontext, width, pathlimit) {
177    this.jsontext = jsontext;
178    this.width = width;
179    this.pathlimit = pathlimit;
180    this.pathobj = null;
181    this.NODEHEIGHT = 50;
182    this.MOUSEMOVED = 0;
183}
184
185SPARQLBuilderDrawGraph.prototype.setPathLimit = function(pathlimit) {
186    this.pathlimit = pathlimit;
187}
188
189SPARQLBuilderDrawGraph.prototype.view_map = function(){
190
191    // make_data繝。繧ス繝�ラ縺ョ邨先棡繧貞叙蠕�
192    var json = this.make_data(0);
193
194    // SVG縺悟ュ伜惠縺吶k縺ェ繧峨�蜑企勁
195    if (d3.select("#sparqlBuilderGraph").select("svg")) {
196        d3.select("#sparqlBuidlerGraph").select("svg").remove();
197    }
198
199    if(json['nodes'].length != 0){
200
201        // 蜃コ譚・荳翫′縺」縺溽オ先棡繧呈ク。縺励※繝槭ャ繝嶺ク翫�繝ュ繧ア繝シ繧キ繝ァ繝ウ繧偵そ繝�ヨ
202        this.set_map_location(0, json['nodes'], json['links']);
203
204        // SVG縺ョ蟷�→鬮倥&繧定ィュ螳夲シ亥ケ�シ夂判髱「縺�▲縺ア縺�€€鬮倥&�壹ヱ繧ケ縺ョ謨ー縺ォ蠢懊§險ュ螳夲シ�
205        var width = this.width;
206        var height = ((this.NODEHEIGHT * 1.5) * this.PATHNUM) + (this.NODEHEIGHT / 2);
207
208        // 繧ォ繝ゥ繝シ繧貞叙蠕�
209        var color = d3.scale.category20();
210
211        // 逕サ髱「繧オ繧、繧コ縺ォ蜷医o縺婀VG縺ョ霑ス蜉
212        var svg = d3.select("#sparqlBuilderGraph").append("svg")
213            .attr("width", width)
214            .attr("height", height);
215
216        // 閭梧勹縺ョ霑ス蜉
217        var bg = svg
218            .append("rect")
219            .attr("x", 0)
220            .attr("y", 0)
221            .attr("width", width)
222            .attr("height", height)
223            .attr("fill", "#fafafa");
224
225        // links驟榊�繧呈ク。縺励Μ繝ウ繧ッ縺ョ菴懈�
226        var link = svg.selectAll(".link")
227            .data(json.links)
228            .enter().append("line")
229            .attr("class", "link")
230            .style("stroke-width", function(d) { return Math.sqrt(d.value);});
231
232        // nodes驟榊�繧呈ク。縺励ヮ繝シ繝峨�菴懈�
233        var node = svg.selectAll(".node")
234            .data(json.nodes)
235            .enter().append("circle")
236            .attr("class", "node")
237            .attr("r", (this.NODEHEIGHT / 2))
238            .attr("cx", function(d) { return d.x;} )
239            .attr("cy",  function(d) { return d.y; })
240            .style("stroke", function(d) { return '#fafafa'; })
241            .style("stroke-width", function(d) { return '1.5px'; })
242            .style("fill", function(d) { return d.nodecolor; })
243            .style("cursor", function(d) { return 'pointer'; });
244
245        // nodes驟榊�繧呈ク。縺励ヮ繝シ繝峨ユ繧ュ繧ケ繝医�菴懈�
246        var tnode = svg.selectAll("text.node")
247            .data(json.nodes)
248            .enter().append("svg:text")
249            .attr("class", "tnode")
250            .attr("x", function(d) { return d.x; })
251            .attr("y", function(d) { return d.y; })
252            .text(function(d) { return d.name; })
253            .style("fill", function(d) { return '#000000'; })
254            .style("text-anchor", function(d) { return 'middle'; })
255            .style("pointer-events", "none");
256
257        // 繝ェ繝ウ繧ッ繝�く繧ケ繝医�菴懈�
258        var tlink = svg.selectAll("text.link")
259            .data(json.links)
260            .enter().append("svg:text")
261            .attr("class", "tlink")
262            .attr("x", function(d) { return (json.nodes[d.source].x + json.nodes[d.target].x) / 2; })
263            .attr("y", function(d) { return (json.nodes[d.source].y + json.nodes[d.target].y) / 2; })
264            .style("fill", function(d) { return '#000000'; })
265            .style("text-anchor", function(d) { return 'middle'; });
266
267        // 繝弱�繝峨∈縺ョ繧ェ繝ウ繝槭え繧ケ縺ァ繝代せ謗「邏「縲√ヱ繧ケ荳ュ縺ョ繝ェ繝ウ繧ッ譁�ュ励r陦ィ遉コ
268        var self = this;
269        node.on("mouseover", function(d){
270
271            // 繝槭え繧ケ縺ョ蜍輔″繧ォ繧ヲ繝ウ繝医r繝ェ繧サ繝�ヨ
272            this.MOUSEMOVED = 0;
273
274            // 陦ィ遉コ縺吶k繝代せ菫晏ュ倡畑驟榊�
275            var path = [];
276            // 繝��繝ォ繝√ャ繝励∈縺ョ蜷榊燕陦ィ遉コ逕ィ驟榊�
277            var pathname = [];
278
279            // 繝ォ繝シ繝医ヮ繝シ繝我サ・螟悶↑繧�
280            if(d.nodeid != 0){
281                // 縺セ縺壹が繝ウ繝槭え繧ケ縺輔l縺溘ヮ繝シ繝峨�id縺ィ蜷榊燕繧偵◎繧後◇繧瑚ソス蜉
282                path.push(d.nodeid);
283                pathname.push(d.name);
284
285                // 繝代せ謗「邏「
286                do{
287                    // 繝ェ繝ウ繧ッ縺ョ謨ー縺縺醍ケー繧願ソ斐@
288                    for(var i = 0; i < link.data().length; i++){
289                        // 迴セ蝨ィ縺ョ譛€蠕悟ーセ縺ォ郢九′繧九Μ繝ウ繧ッ縺後≠繧後�
290                        if(path[(path.length-1)] == link.data()[i].target){
291                            // 縺昴�繝ェ繝ウ繧ッ縺ョ繧ス繝シ繧ケ蛛エ繝弱�繝峨�id繧定ソス蜉
292                            path.push(link.data()[i].source);
293                            // 縺昴�繝ェ繝ウ繧ッ縺ョ蜷榊燕縺ィ繧ス繝シ繧ケ蛛エ繝弱�繝峨�蜷榊燕繧定ソス蜉
294                            pathname.push(link.data()[i].property);
295                            pathname.push(node.data()[link.data()[i].source].name);
296                        }
297                    }
298                // 繝ォ繝シ繝医ヮ繝シ繝峨↓霎ソ繧顔捩縺上∪縺ァ郢ー繧願ソ斐☆
299                }while(path[(path.length-1)] != 0);
300
301                // 譛ォ遶ッ繝弱�繝峨〒縺ェ縺�↑繧�
302                if(d.path == "notend"){
303                    // 繝��繝ォ繝√ャ繝励r髱櫁。ィ遉コ縺ォ
304                    document.getElementById("sparqlBuilderShowpath").style.display = "none";
305                }else{
306                    // 譛ォ遶ッ繝弱�繝峨↑繧峨ヤ繝シ繝ォ繝√ャ繝励�諠�ア繧呈峩譁ー
307                    var resultText = "<h3>Selected Path</h3>";
308                    // 繝代せ縺ョ蜷榊燕驟榊�蛻�セ後m縺九i郢ー繧願ソ斐@縺ェ縺後i
309                    for (var i = pathname.length;i > 0; i--){
310                        // 螂�焚逡ェ逶ョ�医ヮ繝シ繝峨�蜷榊燕�峨�螟ェ蟄励↓
311                        if(i % 2 == 1){
312                            resultText = resultText + "<span style=\"font-weight: bold;\">" + pathname[i - 1] + "</span><br><br>";
313                        // 蛛カ謨ー逡ェ逶ョ�医Μ繝ウ繧ッ縺ョ蜷榊燕�峨�縺昴�縺セ縺セ縺ァ陦ィ遉コ
314                        }else{
315                            resultText = resultText + pathname[i - 1] + "<br><br>";
316                        }
317                    }
318                    // 繝��繝ォ繝√ャ繝励�蜀�ョケ繧呈嶌縺肴鋤縺�
319                    document.getElementById("sparqlBuilderSelectpath").innerHTML=(resultText);
320                    document.getElementById("sparqlBuilderShowpath").style.display = "block";
321
322                    // 繧オ繝シ繝悶Ξ繝�ヨ縺ォ騾√j霑斐☆繝代せ繧ェ繝悶ず繧ァ繧ッ繝医r菫晏ュ�
323                    self.pathobj = d.path;
324
325                    // 繝��繝ォ繝√ャ繝苓。ィ遉コ譎ゅ�蠎ァ讓呻シ医が繝ウ繝槭え繧ケ縺輔l縺溘ヮ繝シ繝峨�讓ェ縺ォ繝懊ち繝ウ縺梧擂繧九h縺��鄂ョ��
326                    var xPosition = parseFloat(d3.select(this).attr("cx")) + parseFloat(d3.select(this).style("stroke-width")) + (self.NODEHEIGHT * 0.5);
327                    var yPosition = parseFloat(d3.select(this).attr("cy") - document.getElementById("sparqlBuilderShowpath").offsetHeight + 50 + document.getElementById("sparqlBuilderSetting").offsetHeight) + (self.NODEHEIGHT * 0.5);
328
329                    // 繝��繝ォ繝√ャ繝励′逕サ髱「螟悶↓蜃コ縺ェ縺�h縺�」懈ュ」
330                    if(xPosition < 0){
331                        xPosition = 0;
332                    }
333                    if(yPosition < 0){
334                        yPosition = 0;
335                    }
336
337                    // 逕滓�縺励◆蠎ァ讓吶↓繝��繝ォ繝√ャ繝励r陦ィ遉コ
338                    document.getElementById("sparqlBuilderShowpath").style.left = xPosition + "px"
339                    document.getElementById("sparqlBuilderShowpath").style.top = yPosition + "px"
340                }
341            // 繝ォ繝シ繝医ヮ繝シ繝峨□縺」縺溘↑繧�
342            }else{
343                // 繝��繝ォ繝√ャ繝励r髱櫁。ィ遉コ
344                document.getElementById("sparqlBuilderShowpath").style.display = "none";
345            }
346
347            // 繧ェ繝ウ繝槭え繧ケ縺輔l縺溘ヮ繝シ繝峨�鬮倥&縺ォ隕ェ繧貞粋繧上○繧九◆繧√↓蜷医o縺帙k鬮倥&繧剃ソ晏ュ�
348            var movey = d.y;
349
350            // 蜷�ヮ繝シ繝峨↓蟇セ縺�
351            node
352                // 霈ェ驛ュ邱壹�濶イ繧定ィュ螳�
353                .style("stroke", function(d){
354                    // 縺セ縺壹�閭梧勹濶イ�医ョ繝輔か繝ォ繝茨シ峨r謖�ョ�
355                    var strokecolor = "#fafafa";
356
357                    // 繝代せ蛻、螳壹�蜑榊�逅�
358                    // 陦ィ遉コ繝輔Λ繧ー縺系ow�亥燕蝗槭が繝ウ繝槭え繧ケ縺ァ蜍輔>縺ヲ縺�◆繝弱�繝会シ峨↑繧�
359                    if(d.view == "now"){
360                        // 繝弱�繝峨�陦ィ遉コ繝輔Λ繧ー繧地o縺ォ
361                        d.view = "no";
362                    }
363                    // 陦ィ遉コ繝輔Λ繧ー縺稽oved�医け繝ェ繝�け縺輔l蝗コ螳壽ク医∩縺縺悟燕蝗槫虚縺�※縺�◆繝弱�繝会シ峨↑繧�
364                    if(d.view == "moved"){
365                        // 陦ィ遉コ繝輔Λ繧ー繧団licked縺ォ謌サ縺�
366                        d.view = "clicked";
367                    }
368
369                    // 陦ィ遉コ繝輔Λ繧ー縺系o縺ョ繧ゅ�縺九i遒コ隱�
370                    if(d.view == "no"){
371                        // 繝代せ縺ョ繝弱�繝画焚縺縺醍ケー繧願ソ斐@縺ェ縺後i
372                        for(var n = 0; n < path.length; n++){
373                            // 繝代せ蜀�↓蜷ォ縺セ繧後k繝弱�繝峨□縺」縺溘i
374                            if(path[n] == d.nodeid){
375                                // 霈ェ驛ュ邱壹r襍、縺ォ
376                                strokecolor = "#ffaaaa";
377                                // 陦ィ遉コ繝輔Λ繧ー繧地ow�井サ雁屓蜍輔>縺溘ヮ繝シ繝会シ峨↓
378                                d.view = "now";
379                            }
380                        }
381                    // 蝗コ螳壽ク医∩繝弱�繝峨□縺」縺溘i
382                    }else if(d.view == "clicked"){
383                        // 縺セ縺壹�霈ェ驛ュ邱壹r襍、縺ォ
384                        strokecolor = "#ffaaaa";
385                        // 繝代せ蜀�↓蜷ォ縺セ繧後k繝弱�繝峨°繝√ぉ繝�け
386                        for(var n = 0; n < path.length; n++){
387                            if(path[n] == d.nodeid){
388                                // 蜷ォ縺セ繧後※縺�◆縺ェ繧我サ雁屓蜍輔°縺吶◆繧√ヵ繝ゥ繧ー繧知oved縺ォ
389                                d.view = "moved";
390                            }
391                        }
392                    }
393
394                    // 縺薙%縺セ縺ァ縺ァ蠕励i繧後◆霈ェ驛ュ邱壹�濶イ繧定ソ斐☆
395                    return strokecolor;
396                })
397                // 鬮倥&縺ョ蛟、
398                .attr("cy", function(d){
399                    // 繝弱�繝峨′莉雁屓繧ェ繝ウ繝槭え繧ケ縺輔l縺溘�縺セ縺溘�蝗コ螳壽ク医∩縺縺檎ァサ蜍輔ヵ繝ゥ繧ー繧偵▽縺代i繧後※縺�l縺ー
400                    if(d.view == "now" || d.view == "moved"){
401                        // 迴セ蝨ィ縺ョ鬮倥&繧貞叙蠕�
402                        var curty = d.y;
403                        // d.y縺ォ蟄舌ヮ繝シ繝峨�鬮倥&繧偵そ繝�ヨ
404                        d.y = movey;
405                        // 迴セ蝨ィ縺ョ鬮倥&繧定ソ斐☆�医%縺ョ譎らせ縺ァ縺ッ迴セ蝨ィ菴咲スョ縺ォ謠冗判縺輔l縲〉edraw髢「謨ー縺ァd.y縺ォ繧「繝九Γ繝シ繧キ繝ァ繝ウ縺輔l繧具シ�
406                        return curty;
407                    // 遘サ蜍募ッセ雎。縺ァ縺ェ縺�↑繧�
408                    }else{
409                        // 迴セ蝨ィ菴咲スョ繧偵◎縺ョ縺セ縺セ霑斐☆
410                        return d.y;
411                    }
412                });
413
414            // 蜷�Μ繝ウ繧ッ繝�く繧ケ繝医↓蟇セ縺�
415            tlink
416                // 繝�く繧ケ繝郁。ィ遉コ蛻、螳�
417                .text(function(d) {
418                    // 繝�ヵ繧ゥ繝ォ繝医〒遨コ繧偵そ繝�ヨ
419                    var linktext = "";
420                    // 陦ィ遉コ繝輔Λ繧ー縺系ow�亥燕蝗櫁。ィ遉コ縺輔l縺ヲ縺�◆繝ェ繝ウ繧ッ�峨↑繧�
421                    if(d.view == "now"){
422                        // 陦ィ遉コ繝輔Λ繧ー繧定ァ」髯、
423                        d.view = "no";
424                    }
425
426                    // 陦ィ遉コ繝輔Λ繧ー縺系o縺ェ繧�
427                    if(d.view == "no"){
428                        // 繝代せ縺ョ繝弱�繝画焚蛻�ケー繧願ソ斐@
429                        for(var t = 0; t < path.length; t++){
430                            // 閾ェ霄ォ縺後◎縺ョ繝弱�繝峨∈謗・邯壹@縺ヲ縺�k繝ェ繝ウ繧ッ�医°縺、縺昴�繝弱�繝峨′謚倥j縺溘◆縺セ繧後※縺�↑縺代l縺ー��
431                            if(path[t] == d.target && node.data()[d.target].view != "hide"){
432                                // 繝ェ繝ウ繧ッ繝�く繧ケ繝医↓繝励Ο繝代ユ繧」縺ョ蛟、繧偵そ繝�ヨ
433                                linktext = d.property
434                                // 陦ィ遉コ繝輔Λ繧ー縺ォnow繧偵そ繝�ヨ
435                                d.view = "now";
436                            }
437                        }
438                    // 陦ィ遉コ繝輔Λ繧ー縺掲ix�医け繝ェ繝�け縺輔l縺溘ヱ繧ケ縺ョ繝ェ繝ウ繧ッ�峨↑繧峨��医°縺、郢九′繧句�縺ョ繝弱�繝峨′謚倥j縺溘◆縺セ繧後※縺�↑縺代l縺ー��
439                    }else if(d.view == "fix" && node.data()[d.target].view != "hide"){
440                        // 繝ェ繝ウ繧ッ繝�く繧ケ繝医↓繝励Ο繝代ユ繧」縺ョ蛟、繧偵そ繝�ヨ
441                        linktext = d.property
442                    }
443                    // 縺薙%縺セ縺ァ縺ァ縺ァ縺阪◆繝ェ繝ウ繧ッ繝�く繧ケ繝医r霑斐☆
444                    return linktext;
445                });
446
447            // 蜷�Μ繝ウ繧ッ縺ォ蟇セ縺�
448            link
449                // 邱壹�濶イ蛻、螳�
450                .style("stroke", function(d){
451                    // 陦ィ遉コ繝輔Λ繧ー縺系o縺ェ繧峨�
452                    if(d.view == "no"){
453                        // 濶イ繧偵ョ繝輔か繝ォ繝医↓
454                        return "#999";
455                    // 縺昴l莉・螟厄シ亥崋螳壹d繧ェ繝ウ繝槭え繧ケ縺輔l縺溘ヱ繧ケ縺ォ蜷ォ縺セ繧後k�峨↑繧�
456                    }else{
457                        // 濶イ繧定オ、縺ォ
458                        return "#ffaaaa";
459                    }
460                });
461
462            // 縺薙%縺セ縺ァ縺ョ險ュ螳壹r蜈�↓蜀肴緒逕サ
463            redraw();
464
465        // 繝弱�繝峨∈縺ョ繧ッ繝ェ繝�け縺ァ驕ク謚槫崋螳壼喧�亥所縺ウ謚倥j逡ウ縺ソ蜃ヲ逅�シ�
466        }).on("click", function(d){
467
468            // 蜷�ヮ繝シ繝峨↓蟇セ縺�
469            node
470                // 霈ェ驛ュ邱壹�蛻、螳�
471                .style("stroke", function(d) {
472                    // 繝�ヵ繧ゥ繝ォ繝医�濶イ繧偵そ繝�ヨ
473                    var strokecolor = "#fafafa"
474                    // 陦ィ遉コ繝輔Λ繧ー縺後が繝ウ繝槭え繧ケ荳ュ繝サ蝗コ螳壻クュ繝サ遘サ蜍穂クュ�磯∈謚槭&繧後※縺�k繝弱�繝会シ峨↑繧峨�
475                    if(d.view == "now" || d.view == "clicked" || d.view == "moved"){
476                        // 濶イ繧定オ、縺ォ
477                        strokecolor = "#ffaaaa"
478                        // 陦ィ遉コ繝輔Λ繧ー繧貞崋螳壻クュ縺ォ
479                        d.view = "clicked";
480                    }
481                    // 縺薙%縺セ縺ァ縺ァ縺ァ縺阪◆濶イ繧定ソ斐☆
482                    return strokecolor;
483                });
484
485            // 縺薙%縺九i蟄舌ヮ繝シ繝峨�逡ウ縺ソ霎シ縺ソ蜃ヲ逅�シ育樟蝨ィ縺ッ蟒�ュ「縲∝ソオ縺ョ縺溘a繧ウ繝シ繝峨�谿九@縺ヲ縺翫¥��
486            /*
487            var childs = [];
488            var prevchilds = [];
489            prevchilds.push(d.nodeid);
490
491            //
492            do{
493                var tmpchilds = [];
494                var curchilds = [];
495                for(var p = 0; p < prevchilds.length; p++){
496                    tmpchilds = this.get_children(prevchilds[p], json['links']);
497                    curchilds = curchilds.concat(tmpchilds);
498                }
499                prevchilds = curchilds;
500                childs = childs.concat(curchilds);
501
502            }while(curchilds.length != 0);
503
504            var childy = d.y;
505            for(var c = 0; c < childs.length; c++){
506                if(node.data()[childs[c]].y < childy){
507                    childy = node.data()[childs[c]].y;
508                }
509            }
510
511            d.y = childy;
512
513            var maxdy = 0;
514            var mindy = 0;
515
516            for(var c = 0; c < childs.length; c++){
517                if(node.data()[childs[c]].view != "hide"){
518                    var dy = node.data()[childs[c]].y - d.y;
519                    if(dy > maxdy){
520                        maxdy = dy;
521                    }
522                    node.data()[childs[c]].x = d.x;
523                    node.data()[childs[c]].y = d.y;
524                    node.data()[childs[c]].dy = dy;
525                    node.data()[childs[c]].view = "hide";
526                    node.data()[childs[c]].hideparent = d.nodeid;
527                }else{
528                    if(node.data()[childs[c]].hideparent == d.nodeid){
529                        node.data()[childs[c]].x = d.x + (this.TREESPACE * (node.data()[childs[c]].group - d.group));
530                        node.data()[childs[c]].y = node.data()[childs[c]].y + node.data()[childs[c]].dy;
531                        if(-node.data()[childs[c]].dy < mindy){
532                            mindy = -node.data()[childs[c]].dy;
533                        }
534                        node.data()[childs[c]].view = "appear";
535                        node.data()[childs[c]].hideparent = -1;
536                    }
537                }
538            }
539
540            node
541            .attr("r", function(d){
542                if(d.view == "appear"){
543                    d.view = "no";
544                }else if(d.y > childy){
545                    d.y = d.y - maxdy - mindy;
546                }
547                if(d.view == "hide"){
548                    d.x = node.data()[d.hideparent].x;
549                    d.y = node.data()[d.hideparent].y;
550                }
551                if(d.nodeid == 0){
552                    d.y = childy;
553                }
554                return (this.NODEHEIGHT / 2);
555            });
556            */
557
558            // 蜷�Μ繝ウ繧ッ縺ォ蟇セ縺�
559            tlink
560                // 繝�く繧ケ繝郁。ィ遉コ蛻、螳�
561                .text(function(d) {
562                    // 繝�ヵ繧ゥ繝ォ繝医〒遨コ縺ォ
563                    var linktext = "";
564                    // 陦ィ遉コ繝輔Λ繧ー縺檎樟蝨ィ陦ィ遉コ荳ュ縺セ縺溘�蝗コ螳壼喧貂医∩縺ェ繧峨��医°縺、謚倥j逡ウ縺ソ荳ュ縺ァ縺ェ縺代l縺ー��
565                    if((d.view == "now" || d.view == "fix") && (node.data()[d.target].view != "hide")){
566                        // 繝ェ繝ウ繧ッ繝�く繧ケ繝医↓繝励Ο繝代ユ繧」縺ョ蛟、繧偵そ繝�ヨ
567                        linktext = d.property
568                        // 陦ィ遉コ繝輔Λ繧ー繧貞崋螳壻クュ縺ォ
569                        d.view = "fix";
570                    }
571                    // 繝�く繧ケ繝医r霑斐☆
572                    return linktext;
573                });
574
575            // 縺薙%縺セ縺ァ縺ョ蜃ヲ逅�オ先棡繧貞�縺ォ蜀肴緒逕サ
576            redraw();
577
578        });
579
580        // 蜀肴緒逕サ髢「謨ー
581        var redraw = function (duration){
582
583            // 縺九¢繧区凾髢薙′譛ェ謖�ョ壹↑繧峨�
584            if(duration == undefined){
585                // 0.5遘偵°縺代※繧「繝九Γ繝シ繧キ繝ァ繝ウ
586                duration = 500;
587            }
588
589            // 蜷�Μ繝ウ繧ッ縺ォ縺、縺�※險ュ螳壹&繧後◆菴咲スョ縺ォ蜀肴緒逕サ
590            link
591                .transition()
592                .duration(duration)
593                .attr("x1", function(d) {return node.data()[d.source].x;})
594                .attr("y1", function(d) {return node.data()[d.source].y;})
595                .attr("x2", function(d) {return node.data()[d.target].x;})
596                .attr("y2", function(d) {return node.data()[d.target].y;});
597
598            // 蜷�Μ繝ウ繧ッ繝�く繧ケ繝医↓縺、縺�※險ュ螳壹&繧後◆菴咲スョ縺ォ蜀肴緒逕サ
599            tlink
600                .transition()
601                .duration(duration)
602                .attr("x", function(d) {return (node.data()[d.source].x + node.data()[d.target].x) / 2;})
603                .attr("y", function(d) {return ((node.data()[d.source].y + node.data()[d.target].y) / 2) + 5;});
604
605            // 蜷�ヮ繝シ繝峨↓縺、縺�※險ュ螳壹&繧後◆菴咲スョ縺ォ蜀肴緒逕サ�医°縺、謚倥j縺溘◆縺セ繧御クュ縺ョ蝣エ蜷医�謠冗判蛻�イ仙�逅�シ�
606            node
607                .transition()
608                .duration(duration)
609                .attr("cx", function(d) {return d.x;})
610                .attr("cy", function(d) {return d.y;})
611                .style("opacity", function(d){
612                    var opa = 1.0;
613                    if(d.view == "hide"){
614                        opa = 0.0;
615                    }
616                    return opa;
617                })
618                .style("fill", function(d) {
619                    var fcolor = d.nodecolor;
620
621                    for(var n = 0; n < node.data().length; n++){
622                        if(d.nodeid == node.data()[n].hideparent){
623                            fcolor = "ffaaaa";
624                        }
625                    }
626                    return fcolor;
627                })
628                .style("pointer-events", function(d){
629                    var pe = "auto";
630                    if(d.view == "hide"){
631                        pe = "none";
632                    }
633                    return pe;
634                });
635
636            // 蜷�ヮ繝シ繝峨ユ繧ュ繧ケ繝医↓縺、縺�※險ュ螳壹&繧後◆菴咲スョ縺ォ蜀肴緒逕サ縲√ユ繧ュ繧ケ繝域緒逕サ菴咲スョ繧剃ク贋ク九↓謖ッ繧具シ医°縺、謚倥j縺溘◆縺セ繧御クュ縺ョ蝣エ蜷医�謠冗判蛻�イ仙�逅�シ�
637            tnode
638            .transition()
639            .duration(duration)
640            .attr("x", function(d) {return d.x;})
641            .attr("y", function(d) {
642                // 繝�ヵ繧ゥ繝ォ繝医〒蟆代@荳九£繧�
643                var updown = (self.NODEHEIGHT * 0.4);
644                // 螂�焚逡ェ逶ョ縺ョ豺ア縺輔↑繧牙ー代@荳翫£繧�
645                if(d.group % 2 == 1){
646                    updown = -(self.NODEHEIGHT * 0.2);
647                }
648                // 縺昴�蛟、繧帝ォ倥&縺ォ霑斐☆縺薙→縺ァ繝�く繧ケ繝域緒逕サ菴咲スョ縺御コ偵>驕輔>縺ォ縺ェ繧�
649                return d.y + updown;
650            })
651            // 謚倥j逡ウ縺ソ迥カ諷九↑繧峨ユ繧ュ繧ケ繝郁。ィ遉コ繧呈カ医☆
652            .text(function(d){
653                var nodetext = d.name
654                if(d.view == "hide"){
655                    nodetext = "";
656                }
657                return nodetext;
658            });
659
660        };
661
662        // 閭梧勹驛ィ蛻�′繧ッ繝ェ繝�け縺輔l縺溘i陦ィ遉コ縺ョ蝗コ螳壼喧繧定ァ」髯、
663        bg.on("click", function() {
664            // 繝��繝ォ繝√ャ繝励r髱櫁。ィ遉コ
665            document.getElementById("sparqlBuilderShowpath").style.display = "none";
666            d3.selectAll(".node").style("stroke-width", function(d) { return '1.5px'; });
667            d3.selectAll(".node").style("stroke", function(d) { return '#ffffff'; });
668
669            // 蜷�ヮ繝シ繝峨�霈ェ驛ュ邱壹�濶イ繧偵ョ繝輔か繝ォ繝医↓
670            node
671                .style("stroke", function(d){
672                    if(d.view != "hide"){
673                        d.view = "no";
674                    }
675                    return "#fafafa";
676                });
677
678            // 繝ェ繝ウ繧ッ繝�く繧ケ繝医r蜈ィ縺ヲ遨コ縺ォ
679            tlink
680                .text(function(d) {
681                    d.view = "no";
682                    return "";
683                });
684
685            // 繝ェ繝ウ繧ッ縺ョ濶イ繧貞�縺ヲ繝�ヵ繧ゥ繝ォ繝医↓
686            link
687                .style("stroke", function(d){
688                    return "#999";
689                });
690
691        });
692
693        // 閭梧勹荳翫〒繝槭え繧ケ縺悟虚縺上#縺ィ縺ォ
694        bg.on("mousemove", function(){
695            // MOUSEMOVED繧定ソス蜉�医ヮ繝シ繝峨↓繧ェ繝ウ繝槭え繧ケ縺輔l繧句コヲ縺ォ繧ォ繧ヲ繝ウ繝医Μ繧サ繝�ヨ��
696            this.MOUSEMOVED++;
697            // 30繧定カ�∴縺溘i
698            if(this.MOUSEMOVED > 30){
699                // 繝��繝ォ繝√ャ繝励r髱櫁。ィ遉コ縺ォ縺励※繧ォ繧ヲ繝ウ繝医Μ繧サ繝�ヨ
700                document.getElementById("sparqlBuilderShowpath").style.display = "none";
701                this.MOUSEMOVED = 0;
702            }
703        });
704
705        // 蛻晏屓縺ョ縺ソduration繧�縺ィ謖�ョ壹@蜀肴緒逕サ�医い繝九Γ繝シ繧キ繝ァ繝ウ縺ェ縺暦シ�
706        redraw(0);
707    }
708}
709
710// 繝��繧ソ縺ョ菴懈�繝。繧ス繝�ラ
711SPARQLBuilderDrawGraph.prototype.make_data = function(tdepth, ret, parent, depth){
712    // ret縺梧悴螳夂セゥ縺ェ繧峨�螳夂セゥ縺励※莉」蜈・
713    if (ret == undefined){
714        ret = new Object();
715        ret['nodes'] = new Array();
716        ret['links'] = new Array();
717    }
718
719    this.PATHNUM = 0;
720    this.MAXDEPTH = 0;
721    this.TREESPACE = 0;
722    this.DRAWHEIGHT = this.NODEHEIGHT;
723
724    var viewnum;
725
726    var obj = this.jsontext;
727
728    document.getElementById("sparqlBuilderResultmessage").style.color = "black";
729    document.getElementById("sparqlBuilderResultmessage").style.fontWeight = "normal";
730
731    document.getElementById("sparqlBuilderPlural").innerHTML = "s";
732
[213]733    if(obj.length == 0){
[209]734        document.getElementById("sparqlBuilderResultmessage").style.color = "red";
735        document.getElementById("sparqlBuilderResultmessage").style.fontWeight = "bold";
736        document.getElementById("sparqlBuilderPlural").innerHTML = "";
[213]737    }else if(obj.length == 1){
[209]738        document.getElementById("sparqlBuilderPlural").innerHTML = "";
739    }
740
[213]741    if(obj.length <= 10){
742        viewnum = obj.length;
[209]743        document.getElementById("sparqlBuilderViewall").style.display = "none";
744    }else if(this.pathlimit == 10){
745        viewnum = 10;
746        document.getElementById("sparqlBuilderViewall").style.display = "block";
747    }else{
[213]748        viewnum = obj.length;
[209]749        document.getElementById("sparqlBuilderViewall").style.display = "none";
750    }
751
[213]752    document.getElementById("sparqlBuilderPathnum").innerHTML = obj.length;
[209]753    document.getElementById("sparqlBuilderResultmessage").style.display = "block";
754
755    // obj繝医ャ繝鈴嚴螻、縺ョ謨ー縺縺醍ケー繧願ソ斐@縺ェ縺後i
756    for(var i = 0; i < viewnum; i++){
757        if(i == 0){
758            // 蛻晏屓縺縺代Ν繝シ繝医ヮ繝シ繝峨r繝励ャ繧キ繝・
[213]759            ret['nodes'].push({'name': obj[0]['label'], 'uri': obj[0]['startClass'], 'group': 0, 'x':50, 'y':50, 'nodeid':ret['nodes'].length, 'view' : 'no', 'path': 'notend', 'nodecolor': '#d0a36a'});
[209]760        }
761        // 蜈医↓source縺ォ0�医Ν繝シ繝茨シ峨r莉」蜈・
762        var source = 0;
763        // 蜈ア騾壹Ν繝シ繝亥愛螳壹rtrue縺ォ
764        var isCommon = true;
765
766        // classLinks縺ョ謨ー縺縺醍ケー繧願ソ斐@縺ェ縺後i
[213]767        for(var j = 0;j < obj[i]['classLinks'].length; j++){
[209]768
769            // 繝ェ繝ウ繧ッ縺ョ蜷榊燕繧旦RL譛ォ蟆セ縺九i蜿門セ�
[213]770            var propertytext = obj[i]['classLinks'][j]['predicate'];
[209]771            var propertysplit1 = propertytext.split("/");
772            var propertysplit2 = propertysplit1[propertysplit1.length - 1];
773            var propertysplit3 = propertysplit2.split("#");
774            propertytext = propertysplit3[propertysplit3.length - 1];
775
776            if(this.MAXDEPTH < j+1){
777                this.MAXDEPTH = j+1;
778            }
779            // 縺薙%縺セ縺ァ蜈ア騾壹Ν繝シ繝医↑繧�
780            if(isCommon){
781                // 莉雁屓繧ょ�騾壹°遒コ隱阪☆繧九◆繧√�繝輔Λ繧ー
782                var isCommonNow = false;
783                // nodes驟榊�縺ォ蜷後§linkedClass縺梧里縺ォ縺ゅk縺狗「コ隱�
784                var targets = [];
785                for(var k = 0; k < ret['nodes'].length; k++){
786                    // 蜷碁嚴螻、縺九▽蜷後§蜷榊燕縺ョ繧ゅ�縺後≠縺」縺溘itargets驟榊�縺ォ逡ェ蜿キ繧定ソス蜉
[213]787                    if(ret['nodes'][k]['group'] == (j+1) && obj[i]['classLinks'][j]['linkedClass'] == ret['nodes'][k]['uri']){
[209]788                        targets.push(k);
789                    }
790                }
791
792                // 譌「縺ォ縺ゅ▲縺溷エ蜷医�links驟榊�縺ォ蜷後§link縺悟ュ伜惠縺吶k縺狗「コ隱�
793                if(targets.length != 0){
794                    // 蜈医⊇縺ゥ隕九▽縺代◆targets縺ョ謨ー縺縺醍ケー繧願ソ斐@縺ェ縺後i
795                    for(var l = 0; l <targets.length; l++){
796                        // links驟榊�縺ォ蜈ィ縺丞酔縺俶擅莉カ縺ョ繧ゅ�縺後≠繧九°遒コ隱�
797                        for(var m = 0; m < ret['links'].length; m++){
798                            // 縺ゅ▲縺溷エ蜷井サ雁屓縺ョ繧ゅ�縺ッ霑ス蜉縺帙★source繧呈峩譁ー縺励※谺。縺ク
[213]799                            if(ret['links'][m]['source'] == source && ret['links'][m]['target'] == targets[l] && ret['links'][m]['uri'] == obj[i]['classLinks'][j]['propertyURI'] && !isCommonNow){
[209]800                                // 蜈ア騾壹Ν繝シ繝医ヵ繝ゥ繧ー繧偵が繝ウ
801                                isCommonNow = true;
802                                source = targets[l];
803                            }
804                        }
805                    }
806
807                    // 蜷дarget繧堤「コ隱阪@縺ヲ蜈ア騾壹Ν繝シ繝医〒縺ッ縺ェ縺九▲縺溷エ蜷域眠隕剰ソス蜉
808                    if(!isCommonNow){
809                        isCommon = false;
[213]810                        ret['nodes'].push({'name': obj[i]['classLinks'][j]['label'], 'uri': obj[i]['classLinks'][j]['linkedClass'], 'group': (j+1), 'x':0, 'y':0, 'dy':0, 'nodeid':ret['nodes'].length, 'view' : 'no', 'path': 'notend', 'nodecolor': '#cccccc'});
811                        ret['links'].push({'source':source, 'target':ret['nodes'].length - 1, 'value':5, 'property': propertytext, 'uri': obj[i]['classLinks'][j]['predicate'], 'view' : 'no'});
[209]812                        source = ret['nodes'].length - 1;
813                    }
814
815                // 縺ェ縺九▲縺溷エ蜷医�蛻・譚。莉カ縺ェ縺ョ縺ァ譁ー隕剰ソス蜉縺励※谺。縺ク
816                }else{
817
818                    isCommon = false;
[213]819                    ret['nodes'].push({'name': obj[i]['classLinks'][j]['label'], 'uri': obj[i]['classLinks'][j]['linkedClass'], 'group': (j+1), 'x':0, 'y':0, 'dy':0, 'nodeid':ret['nodes'].length, 'view' : 'no', 'path': 'notend', 'nodecolor': '#cccccc'});
820                    ret['links'].push({'source':source, 'target':ret['nodes'].length - 1, 'value':5, 'property': propertytext, 'uri': obj[i]['classLinks'][j]['predicate'], 'view' : 'no'});
[209]821                    source = ret['nodes'].length - 1;
822                }
823            // 譌「縺ォ蜈ア騾壹Ν繝シ繝医〒縺ェ縺�↑繧画眠隕剰ソス蜉縺励※谺。縺ク
824            }else{
[213]825                ret['nodes'].push({'name': obj[i]['classLinks'][j]['label'], 'uri': obj[i]['classLinks'][j]['linkedClass'], 'group': (j+1), 'x':0, 'y':0, 'dy':0, 'nodeid':ret['nodes'].length, 'view' : 'no', 'path': 'notend', 'nodecolor': '#cccccc'});
826                ret['links'].push({'source':source, 'target':ret['nodes'].length - 1, 'value':5, 'property': propertytext, 'uri': obj[i]['classLinks'][j]['predicate'], 'view' : 'no'});
[209]827                source = ret['nodes'].length - 1;
828            }
829
830        }
[213]831        ret['nodes'][ret['nodes'].length - 1]['path'] = obj[i];
[209]832        ret['nodes'][ret['nodes'].length - 1]['nodecolor'] = '#8cddc0';
833        this.PATHNUM++;
834    }
835    this.TREESPACE = (window.innerWidth - 200) / (this.MAXDEPTH + 1);
836
837    // 縺ァ縺阪◆邨先棡繧定ソ斐☆
838    return ret;
839}
840
841// 逕滓�縺輔l縺溘ョ繝シ繧ソ縺ョ螳滄圀縺ョ繝ュ繧ア繝シ繧キ繝ァ繝ウ繧定ィ育ョ励☆繧九Γ繧ス繝�ラ�亥�蝗槭�myNodeIndex縺�縲]odes縺ォ逕滓�縺輔l縺殤odes驟榊�縲〕inks縺ォ逕滓�縺輔l縺殕inks驟榊�縺梧ク。縺輔l繧具シ�
842SPARQLBuilderDrawGraph.prototype.set_map_location = function(myNodeIndex, nodes, links, depth, fromAngle, toAngle){
843
844    // depth縺梧悴螳夂セゥ縺ェ繧峨�0繧偵そ繝�ヨ
845    if (depth == undefined){
846        depth = 0;
847    }
848
849    // 蜷�ィョ蛻晄悄蛹�
850    var children = undefined;
851    var parent = undefined;
852    var parentsChildren = undefined;
853
854    // links驟榊�縺ョ謨ー縺縺醍ケー繧願ソ斐@縺ェ縺後i
855    for (var i=0; i<links.length; i++){
856        // 縺昴�links縺ョtarget縺稽yNodeIndex縺ェ繧英arent繧偵そ繝�ヨ
857        if (links[i].target == myNodeIndex){
858            parent = links[i].source;
859        }
860    }
861
862    // parent縺瑚ヲ九▽縺九▲縺ヲ縺�◆縺ェ繧峨�
863    if (parent != undefined){
864        // parent縺ィlinks繧呈ク。縺揚et_children繝。繧ス繝�ラ繧貞ョ溯。�
865        parentsChildren = this.get_children(parent, links);
866    }
867
868    if(myNodeIndex != 0){
869        this.DRAWHEIGHT += (this.NODEHEIGHT * 1.5);
870        var x = (depth * this.TREESPACE) + (this.TREESPACE / 3);
871        var y = this.DRAWHEIGHT;
872        nodes[myNodeIndex].x = x;
873        nodes[myNodeIndex].y = y;
874    }else{
875        var x = this.TREESPACE / 2;
876        var y = (this.NODEHEIGHT * 1.5) * ((this.PATHNUM - 1) / 2) + this.NODEHEIGHT;
877        nodes[myNodeIndex].x = x;
878        nodes[myNodeIndex].y = y;
879    }
880
881    children = this.get_children(myNodeIndex, links);
882
883    for (var i=0; i<children.length; i++){
884        if(i == 0){
885            this.DRAWHEIGHT -= (this.NODEHEIGHT * 1.5);
886        }
887        var child = children[i];
888        this.set_map_location(child, nodes, links, depth+1, fromAngle + ((toAngle - fromAngle) / children.length) * i, fromAngle + ((toAngle - fromAngle) / children.length) * (i+1));
889    }
890
891}
892
893// 謖�ョ壹&繧後◆隕ェ縺梧戟縺、蟄舌r霑斐☆
894SPARQLBuilderDrawGraph.prototype.get_children = function(index, links){
895    var children = new Array();
896    // links縺ョ謨ー縺縺醍「コ隱阪@縺ェ縺後i
897    for (var i=0; i<links.length; i++){
898        // 隕ェ縺梧ク。縺輔l縺溯ヲェ縺ィ荳€閾エ縺吶k譎ゅ�蟄舌r霑ス蜉
899        if (links[i].source == index){
900            children.push(links[i].target);
901        }
902    }
903    return children;
904}
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。