2018-09-10 09:14:05 +00:00
|
|
|
/*
|
2020-05-08 16:43:25 +00:00
|
|
|
@licstart The following is the entire license notice for the JavaScript code in this file.
|
2018-09-10 09:14:05 +00:00
|
|
|
|
2020-05-08 16:43:25 +00:00
|
|
|
The MIT License (MIT)
|
2018-09-10 09:14:05 +00:00
|
|
|
|
2020-05-08 16:43:25 +00:00
|
|
|
Copyright (C) 1997-2020 by Dimitri van Heesch
|
2018-09-10 09:14:05 +00:00
|
|
|
|
2020-05-08 16:43:25 +00:00
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
|
|
|
|
and associated documentation files (the "Software"), to deal in the Software without restriction,
|
|
|
|
including without limitation the rights to use, copy, modify, merge, publish, distribute,
|
|
|
|
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
|
|
|
|
furnished to do so, subject to the following conditions:
|
2018-09-10 09:14:05 +00:00
|
|
|
|
2020-05-08 16:43:25 +00:00
|
|
|
The above copyright notice and this permission notice shall be included in all copies or
|
|
|
|
substantial portions of the Software.
|
2018-09-10 09:14:05 +00:00
|
|
|
|
2020-05-08 16:43:25 +00:00
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
|
|
|
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
|
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
|
|
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
|
|
|
|
@licend The above is the entire license notice for the JavaScript code in this file
|
2018-09-10 09:14:05 +00:00
|
|
|
*/
|
2024-01-21 12:30:23 +00:00
|
|
|
|
2024-08-28 11:20:19 +00:00
|
|
|
function toggleVisibility(linkObj) {
|
|
|
|
return dynsection.toggleVisibility(linkObj);
|
|
|
|
}
|
|
|
|
|
2024-01-21 12:30:23 +00:00
|
|
|
let dynsection = {
|
|
|
|
|
|
|
|
// helper function
|
|
|
|
updateStripes : function() {
|
|
|
|
$('table.directory tr').
|
|
|
|
removeClass('even').filter(':visible:even').addClass('even');
|
|
|
|
$('table.directory tr').
|
|
|
|
removeClass('odd').filter(':visible:odd').addClass('odd');
|
|
|
|
},
|
|
|
|
|
|
|
|
toggleVisibility : function(linkObj) {
|
|
|
|
const base = $(linkObj).attr('id');
|
|
|
|
const summary = $('#'+base+'-summary');
|
|
|
|
const content = $('#'+base+'-content');
|
|
|
|
const trigger = $('#'+base+'-trigger');
|
|
|
|
const src=$(trigger).attr('src');
|
|
|
|
if (content.is(':visible')===true) {
|
|
|
|
content.hide();
|
|
|
|
summary.show();
|
|
|
|
$(linkObj).addClass('closed').removeClass('opened');
|
|
|
|
$(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
|
2017-06-20 09:17:23 +00:00
|
|
|
} else {
|
2024-01-21 12:30:23 +00:00
|
|
|
content.show();
|
|
|
|
summary.hide();
|
|
|
|
$(linkObj).removeClass('closed').addClass('opened');
|
|
|
|
$(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
|
2017-06-20 09:17:23 +00:00
|
|
|
}
|
2024-01-21 12:30:23 +00:00
|
|
|
return false;
|
|
|
|
},
|
|
|
|
|
|
|
|
toggleLevel : function(level) {
|
|
|
|
$('table.directory tr').each(function() {
|
|
|
|
const l = this.id.split('_').length-1;
|
|
|
|
const i = $('#img'+this.id.substring(3));
|
|
|
|
const a = $('#arr'+this.id.substring(3));
|
|
|
|
if (l<level+1) {
|
|
|
|
i.removeClass('iconfopen iconfclosed').addClass('iconfopen');
|
|
|
|
a.html('▼');
|
|
|
|
$(this).show();
|
|
|
|
} else if (l==level+1) {
|
|
|
|
i.removeClass('iconfclosed iconfopen').addClass('iconfclosed');
|
|
|
|
a.html('►');
|
|
|
|
$(this).show();
|
|
|
|
} else {
|
|
|
|
$(this).hide();
|
|
|
|
}
|
2023-11-08 17:01:19 +00:00
|
|
|
});
|
2024-01-21 12:30:23 +00:00
|
|
|
this.updateStripes();
|
|
|
|
},
|
|
|
|
|
|
|
|
toggleFolder : function(id) {
|
|
|
|
// the clicked row
|
|
|
|
const currentRow = $('#row_'+id);
|
|
|
|
|
|
|
|
// all rows after the clicked row
|
|
|
|
const rows = currentRow.nextAll("tr");
|
|
|
|
|
|
|
|
const re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
|
|
|
|
|
|
|
|
// only match elements AFTER this one (can't hide elements before)
|
|
|
|
const childRows = rows.filter(function() { return this.id.match(re); });
|
|
|
|
|
|
|
|
// first row is visible we are HIDING
|
|
|
|
if (childRows.filter(':first').is(':visible')===true) {
|
|
|
|
// replace down arrow by right arrow for current row
|
|
|
|
const currentRowSpans = currentRow.find("span");
|
|
|
|
currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
|
|
|
|
currentRowSpans.filter(".arrow").html('►');
|
|
|
|
rows.filter("[id^=row_"+id+"]").hide(); // hide all children
|
|
|
|
} else { // we are SHOWING
|
|
|
|
// replace right arrow by down arrow for current row
|
|
|
|
const currentRowSpans = currentRow.find("span");
|
|
|
|
currentRowSpans.filter(".iconfclosed").removeClass("iconfclosed").addClass("iconfopen");
|
|
|
|
currentRowSpans.filter(".arrow").html('▼');
|
|
|
|
// replace down arrows by right arrows for child rows
|
|
|
|
const childRowsSpans = childRows.find("span");
|
|
|
|
childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
|
|
|
|
childRowsSpans.filter(".arrow").html('►');
|
|
|
|
childRows.show(); //show all children
|
2023-11-08 17:01:19 +00:00
|
|
|
}
|
2024-01-21 12:30:23 +00:00
|
|
|
this.updateStripes();
|
|
|
|
},
|
|
|
|
|
|
|
|
toggleInherit : function(id) {
|
|
|
|
const rows = $('tr.inherit.'+id);
|
|
|
|
const img = $('tr.inherit_header.'+id+' img');
|
|
|
|
const src = $(img).attr('src');
|
|
|
|
if (rows.filter(':first').is(':visible')===true) {
|
|
|
|
rows.css('display','none');
|
|
|
|
$(img).attr('src',src.substring(0,src.length-8)+'closed.png');
|
|
|
|
} else {
|
|
|
|
rows.css('display','table-row'); // using show() causes jump in firefox
|
|
|
|
$(img).attr('src',src.substring(0,src.length-10)+'open.png');
|
|
|
|
}
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
let codefold = {
|
|
|
|
opened : true,
|
|
|
|
|
|
|
|
// in case HTML_COLORSTYLE is LIGHT or DARK the vars will be replaced, so we write them out explicitly and use double quotes
|
|
|
|
plusImg: [ "var(--fold-plus-image)", "var(--fold-plus-image-relpath)" ],
|
|
|
|
minusImg: [ "var(--fold-minus-image)", "var(--fold-minus-image-relpath)" ],
|
|
|
|
|
|
|
|
// toggle all folding blocks
|
|
|
|
toggle_all : function(relPath) {
|
|
|
|
if (this.opened) {
|
|
|
|
$('#fold_all').css('background-image',this.plusImg[relPath]);
|
|
|
|
$('div[id^=foldopen]').hide();
|
|
|
|
$('div[id^=foldclosed]').show();
|
|
|
|
} else {
|
|
|
|
$('#fold_all').css('background-image',this.minusImg[relPath]);
|
|
|
|
$('div[id^=foldopen]').show();
|
|
|
|
$('div[id^=foldclosed]').hide();
|
|
|
|
}
|
|
|
|
this.opened=!this.opened;
|
|
|
|
},
|
|
|
|
|
|
|
|
// toggle single folding block
|
|
|
|
toggle : function(id) {
|
|
|
|
$('#foldopen'+id).toggle();
|
|
|
|
$('#foldclosed'+id).toggle();
|
|
|
|
},
|
|
|
|
|
|
|
|
init : function(relPath) {
|
|
|
|
$('span[class=lineno]').css({
|
|
|
|
'padding-right':'4px',
|
|
|
|
'margin-right':'2px',
|
|
|
|
'display':'inline-block',
|
|
|
|
'width':'54px',
|
|
|
|
'background':'linear-gradient(var(--fold-line-color),var(--fold-line-color)) no-repeat 46px/2px 100%'
|
|
|
|
});
|
|
|
|
// add global toggle to first line
|
|
|
|
$('span[class=lineno]:first').append('<span class="fold" id="fold_all" '+
|
|
|
|
'onclick="javascript:codefold.toggle_all('+relPath+');" '+
|
|
|
|
'style="background-image:'+this.minusImg[relPath]+';"></span>');
|
|
|
|
// add vertical lines to other rows
|
|
|
|
$('span[class=lineno]').not(':eq(0)').append('<span class="fold"></span>');
|
|
|
|
// add toggle controls to lines with fold divs
|
|
|
|
$('div[class=foldopen]').each(function() {
|
|
|
|
// extract specific id to use
|
|
|
|
const id = $(this).attr('id').replace('foldopen','');
|
|
|
|
// extract start and end foldable fragment attributes
|
|
|
|
const start = $(this).attr('data-start');
|
|
|
|
const end = $(this).attr('data-end');
|
|
|
|
// replace normal fold span with controls for the first line of a foldable fragment
|
|
|
|
$(this).find('span[class=fold]:first').replaceWith('<span class="fold" '+
|
|
|
|
'onclick="javascript:codefold.toggle(\''+id+'\');" '+
|
|
|
|
'style="background-image:'+codefold.minusImg[relPath]+';"></span>');
|
|
|
|
// append div for folded (closed) representation
|
|
|
|
$(this).after('<div id="foldclosed'+id+'" class="foldclosed" style="display:none;"></div>');
|
|
|
|
// extract the first line from the "open" section to represent closed content
|
|
|
|
const line = $(this).children().first().clone();
|
|
|
|
// remove any glow that might still be active on the original line
|
|
|
|
$(line).removeClass('glow');
|
|
|
|
if (start) {
|
|
|
|
// if line already ends with a start marker (e.g. trailing {), remove it
|
|
|
|
$(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),''));
|
|
|
|
}
|
|
|
|
// replace minus with plus symbol
|
|
|
|
$(line).find('span[class=fold]').css('background-image',codefold.plusImg[relPath]);
|
|
|
|
// append ellipsis
|
|
|
|
$(line).append(' '+start+'<a href="javascript:codefold.toggle(\''+id+'\')">…</a>'+end);
|
|
|
|
// insert constructed line into closed div
|
|
|
|
$('#foldclosed'+id).html(line);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
};
|
2018-09-10 09:14:05 +00:00
|
|
|
/* @license-end */
|