root/SPARQLBuilderWWW/web/newsparqlbuilder.js @ 232

リビジョン 232, 36.8 KB (コミッタ: lenz, 10 年 前)

BH14.14の作業成果

新UIと埋め込み方式の変更、結果のダウンロードボタン

残タスク:サンプル関係。サンプルボタンもGETでいきなりオープンも指定結果のパーマリンク作成もまだ

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