mirror of
https://github.com/Ryujinx/GtkSharp.git
synced 2024-09-07 15:33:20 +02:00
![Bertrand Lorentz](/assets/img/avatar_default.png)
The gen-apidiff-html tool takes all apidiff files in a directory, merges them and then applies mono-api.xsl to produce a nice HTML page that shows the information about the API changes. The various resources needed by the HTML page (images, CSS, javascript) are added in the html/ directory. This is all adapted from an older version of the tools in Mono git master, under mcs/tools/corcompare.
585 lines
13 KiB
JavaScript
585 lines
13 KiB
JavaScript
// FIXME:
|
|
// It still does not update icons previous to a type/member name when
|
|
// certain icon kinds are unchecked (when an item has "todo" and "missing",
|
|
// the default display is "missing" and when "missing" is unchecked it
|
|
// should turn into "todo").
|
|
|
|
function toggle (elt)
|
|
{
|
|
if (elt == null)
|
|
return;
|
|
|
|
var eltLink = firstElement (elt);
|
|
if (eltLink != null && eltLink.className == 't') // toggle
|
|
{
|
|
var ich = elt.className.indexOf ('_');
|
|
if (ich < 0)
|
|
{
|
|
eltLink.src = 'tp.gif';
|
|
elt.className += '_';
|
|
}
|
|
else
|
|
{
|
|
eltLink.src = 'tm.gif';
|
|
elt.className = elt.className.slice (0, ich);
|
|
}
|
|
}
|
|
}
|
|
|
|
function setView (elt, fView)
|
|
{
|
|
var eltLink = firstElement (elt);
|
|
if (eltLink != null && eltLink.className == 't') // toggle
|
|
{
|
|
var ich = elt.className.indexOf ('_');
|
|
if (ich < 0 && !fView)
|
|
{
|
|
eltLink.src = 'tp.gif';
|
|
elt.className += '_';
|
|
}
|
|
else if (ich >= 0 && fView)
|
|
{
|
|
eltLink.src = 'tm.gif';
|
|
elt.className = elt.className.slice (0, ich);
|
|
}
|
|
}
|
|
}
|
|
|
|
function firstElement (elt)
|
|
{
|
|
var c = elt.firstChild;
|
|
while (c != null) {
|
|
if (c.nodeType == 1) // Node.ELEMENT_NODE (IE6 does not recognize it)
|
|
return c;
|
|
c = c.nextSibling;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function trimSrc (strSrc)
|
|
{
|
|
return strSrc.slice (strSrc.lastIndexOf ('/') + 1, strSrc.lastIndexOf ('.'));
|
|
}
|
|
|
|
function getChildrenByTagName (elt, strTag)
|
|
{
|
|
strTag = strTag.toLowerCase ();
|
|
var rgChildren = new Array ();
|
|
var eltChild = firstElement (elt);
|
|
while (eltChild)
|
|
{
|
|
if (eltChild.tagName && eltChild.tagName.toLowerCase () == strTag)
|
|
rgChildren.push (eltChild);
|
|
eltChild = eltChild.nextSibling;
|
|
}
|
|
return rgChildren;
|
|
}
|
|
|
|
function viewAll (elt, dictTypes)
|
|
{
|
|
var fView = isShown (elt, dictTypes);
|
|
|
|
var aCounts = new Array (4);
|
|
for (i = 0; i < 4; i++)
|
|
aCounts [i] = 0;
|
|
var rgElts = getChildrenByTagName (elt, 'DIV');
|
|
for (iElt in rgElts) {
|
|
var aChildRet = viewAll (rgElts [iElt], dictTypes);
|
|
if (aChildRet != null) {
|
|
fView = true;
|
|
for (i = 0; i < 4; i++)
|
|
aCounts [i] += aChildRet [i];
|
|
}
|
|
}
|
|
|
|
elt.style.display = fView ? '' : 'none';
|
|
|
|
if (!fView)
|
|
return null;
|
|
|
|
rgShownDivs = getChildrenByTagName (elt, 'DIV');
|
|
for (i = 0; i < rgShownDivs.length; i++) {
|
|
var cDiv = rgShownDivs [i];
|
|
if (cDiv.style.display == 'none')
|
|
continue;
|
|
incrementCount (cDiv, aCounts, dictTypes);
|
|
}
|
|
|
|
// update the numbers
|
|
rgSpans = getChildrenByTagName (elt, 'SPAN');
|
|
for (iSpan in rgSpans) {
|
|
var cSpan = rgSpans [iSpan];
|
|
var cImage = firstElement (cSpan);
|
|
if (cImage == null)
|
|
continue;
|
|
switch (trimSrc (cImage.src)) {
|
|
case 'st': cSpan.lastChild.nodeValue = ": " + aCounts [0]; break;
|
|
case 'sm': cSpan.lastChild.nodeValue = ": " + aCounts [1]; break;
|
|
case 'sx': cSpan.lastChild.nodeValue = ": " + aCounts [2]; break;
|
|
case 'se': cSpan.lastChild.nodeValue = ": " + aCounts [3]; break;
|
|
}
|
|
}
|
|
return aCounts;
|
|
}
|
|
|
|
function isShown (elt, dictTypes)
|
|
{
|
|
if (!isShownMarkType (elt, dictTypes))
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
function isShownMarkType (elt, dictTypes)
|
|
{
|
|
var rgImages = getChildrenByTagName (elt, 'IMG');
|
|
var cImages = rgImages.length;
|
|
for (var iImage = 0; iImage < cImages; iImage++)
|
|
{
|
|
var strImage = trimSrc (rgImages [iImage].src);
|
|
if (dictTypes [strImage])
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function incrementCount (cDiv, aCounts, dictTypes)
|
|
{
|
|
switch (cDiv.className) {
|
|
case 'y': case 'y_': // assembly
|
|
case 'n': case 'n_': // namespace
|
|
// types
|
|
case 'c': case 'c_': case 'i': case 'i_':
|
|
case 'en': case 'en_': case 'd': case 'd_':
|
|
// members
|
|
case 'r': case 'r_': case 'x': case 'x_': case 'm': case 'm_':
|
|
case 'f': case 'f_': case 'e': case 'e_': case 'p': case 'p_':
|
|
case 'o': case 'o_': case 'a': case 'a_':
|
|
var rgImgs = getChildrenByTagName (cDiv, 'IMG');
|
|
for (iImg = 0; iImg < rgImgs.length; iImg++) {
|
|
var cImg = rgImgs [iImg];
|
|
if (cImg.className != 't')
|
|
continue;
|
|
var stype = trimSrc (cImg.src);
|
|
if (!dictTypes [stype])
|
|
continue;
|
|
switch (stype) {
|
|
case "st": aCounts [0]++; break;
|
|
case "sm": aCounts [1]++; break;
|
|
case "sx": aCounts [2]++; break;
|
|
case "se": aCounts [3]++; break;
|
|
default:
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* just for debugging use now.
|
|
function firstInnerText (elt)
|
|
{
|
|
var s = elt.innerText;
|
|
if (s != null)
|
|
return s;
|
|
var n = elt.firstChild;
|
|
while (n != null) {
|
|
s = n.nodeValue;
|
|
if (s != null && s.replace (/^\s+/g, '') != '')
|
|
return s;
|
|
s = firstInnerText (n);
|
|
if (s != null)
|
|
return s;
|
|
n = n.nextSibling;
|
|
}
|
|
return s;
|
|
}
|
|
*/
|
|
|
|
function getView (elt)
|
|
{
|
|
var eltLink = firstElement (elt);
|
|
if (eltLink != null && eltLink.className == 't') // toggle
|
|
{
|
|
var ich = elt.className.indexOf ('_');
|
|
if (ich < 0)
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function getParentDiv (elt)
|
|
{
|
|
if (elt)
|
|
{
|
|
do
|
|
{
|
|
elt = elt.parentNode;
|
|
}
|
|
while (elt && elt.tagName != 'DIV');
|
|
}
|
|
|
|
return elt;
|
|
}
|
|
|
|
function getName (elt)
|
|
{
|
|
var rgSpans = getChildrenByTagName (elt, 'SPAN');
|
|
for (var iSpan = 0; iSpan < rgSpans.length; iSpan ++)
|
|
{
|
|
var span = rgSpans [iSpan];
|
|
if (span.className == 'l') // label
|
|
{
|
|
if (span.innerText)
|
|
return span.innerText;
|
|
else
|
|
return span.firstChild.nodeValue;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function clickHandler (evt)
|
|
{
|
|
var elt;
|
|
if (document.layers)
|
|
elt = evt.taget;
|
|
else if (window.event && window.event.srcElement)
|
|
{
|
|
elt = window.event.srcElement;
|
|
evt = window.event;
|
|
}
|
|
else if (evt && evt.stopPropagation)
|
|
elt = evt.target;
|
|
|
|
if (!elt.className && elt.parentNode)
|
|
elt = elt.parentNode;
|
|
|
|
if (elt.className == 'l') // label
|
|
{
|
|
var strClass;
|
|
var strField;
|
|
var strNamespace;
|
|
var strAssembly;
|
|
var strFieldType;
|
|
|
|
elt = getParentDiv (elt);
|
|
var strEltClass = elt.className;
|
|
if (strEltClass.charAt (strEltClass.length - 1) == '_')
|
|
strEltClass = strEltClass.slice (0, strEltClass.length - 1);
|
|
|
|
if (strEltClass == 'x') // constructor
|
|
{
|
|
strField = 'ctor';
|
|
elt = getParentDiv (elt);
|
|
}
|
|
else
|
|
if (strEltClass == 'm' || // method
|
|
strEltClass == 'p' || // property
|
|
strEltClass == 'e' || // event
|
|
strEltClass == 'f') // field
|
|
{
|
|
strFieldType = strEltClass;
|
|
strField = getName (elt);
|
|
var match = strField.match ( /[\.A-Z0-9_]*/i );
|
|
if (match)
|
|
strField = match [0];
|
|
elt = getParentDiv (elt);
|
|
|
|
}
|
|
|
|
var strEltClass = elt.className;
|
|
if (strEltClass.charAt (strEltClass.length - 1) == '_')
|
|
strEltClass = strEltClass.slice (0, strEltClass.length - 1);
|
|
|
|
if (strEltClass == 'c' || // class
|
|
strEltClass == 's' || // struct
|
|
strEltClass == 'i' || // struct
|
|
strEltClass == 'd' || // delegate
|
|
strEltClass == 'en') // enum
|
|
{
|
|
strClass = getName (elt);
|
|
if (strEltClass == 'en')
|
|
strField = null;
|
|
elt = getParentDiv (elt);
|
|
}
|
|
|
|
var strEltClass = elt.className;
|
|
if (strEltClass.charAt (strEltClass.length - 1) == '_')
|
|
strEltClass = strEltClass.slice (0, strEltClass.length - 1);
|
|
|
|
if (strEltClass == 'n')
|
|
{
|
|
strNamespace = getName (elt);
|
|
elt = getParentDiv (elt);
|
|
}
|
|
|
|
var strEltClass = elt.className;
|
|
if (strEltClass.charAt (strEltClass.length - 1) == '_')
|
|
strEltClass = strEltClass.slice (0, strEltClass.length - 1);
|
|
|
|
if (strEltClass == 'y')
|
|
{
|
|
strAssembly = getName (elt);
|
|
}
|
|
|
|
if (evt.ctrlKey)
|
|
{
|
|
var strRoot = 'http://anonsvn.mono-project.com/viewcvs/trunk/mcs/class/';
|
|
var strExtra = '';
|
|
|
|
if (strAssembly)
|
|
{
|
|
if (strAssembly == 'mscorlib')
|
|
strAssembly = 'corlib';
|
|
else if (strAssembly == 'System.Xml')
|
|
strAssembly = 'System.XML';
|
|
|
|
strRoot = strRoot + strAssembly + '/';
|
|
if (strNamespace)
|
|
{
|
|
strRoot = strRoot + strNamespace + '/';
|
|
if (strClass)
|
|
{
|
|
strRoot += strClass + '.cs';
|
|
strExtra += '?view=markup';
|
|
}
|
|
}
|
|
window.open (strRoot + strExtra, 'CVS');
|
|
}
|
|
}
|
|
else if (strNamespace)
|
|
{
|
|
if (document.getElementById ('TargetMsdn1').checked)
|
|
{
|
|
var re = /\./g ;
|
|
strNamespace = strNamespace.toLowerCase ().replace (re, '');
|
|
if (strClass)
|
|
strNamespace += strClass.toLowerCase () + 'class';
|
|
if (strField)
|
|
strNamespace += strField;
|
|
if (strClass || strField)
|
|
strNamespace += 'topic';
|
|
|
|
window.open ('http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrf' + strNamespace + '.asp', 'MSDN');
|
|
|
|
}
|
|
else
|
|
{
|
|
if (strClass)
|
|
strNamespace += '.' + strClass;
|
|
if (strField)
|
|
strNamespace += '.' + strField;
|
|
if (document.getElementById ('TargetMonodoc').checked)
|
|
{
|
|
var category = null;
|
|
if (strClass == null)
|
|
category = "N:";
|
|
else if (strField == null)
|
|
category = "T:";
|
|
else {
|
|
switch (strFieldType) {
|
|
case 'f': category = "F:"; break;
|
|
case 'p': category = "P:"; break;
|
|
case 'm': category = "M:"; break;
|
|
case 'e': category = "E:"; break;
|
|
}
|
|
}
|
|
if (category != null)
|
|
window.open ('http://www.go-mono.com/docs/monodoc.ashx?link=' + category + strNamespace);
|
|
}
|
|
else
|
|
{
|
|
window.open ('http://msdn2.microsoft.com/library/' + strNamespace + '.aspx', 'MSDN');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (elt.parentNode && elt.parentNode.className == 't') // toggle
|
|
elt = elt.parentNode;
|
|
else if (elt.className != 't') // toggle
|
|
return;
|
|
|
|
while (elt != null && elt.tagName != 'DIV')
|
|
elt = elt.parentNode;
|
|
|
|
if (evt.shiftKey)
|
|
{
|
|
var rgElts = getChildrenByTagName (elt, 'DIV');
|
|
var cElts = rgElts.length;
|
|
if (cElts != 0)
|
|
{
|
|
var fView = false;
|
|
var iElt;
|
|
for (iElt = 0; iElt < cElts; iElt ++)
|
|
{
|
|
if (getView (rgElts [iElt]))
|
|
{
|
|
fView = true;
|
|
break;
|
|
}
|
|
}
|
|
for (iElt = 0; iElt < cElts; iElt ++)
|
|
{
|
|
setView (rgElts [iElt], !fView);
|
|
}
|
|
}
|
|
}
|
|
else if (evt.ctrlKey)
|
|
{
|
|
setView (elt, true);
|
|
var eltParent = getParentDiv (elt);
|
|
while (eltParent)
|
|
{
|
|
var rgSiblings = getChildrenByTagName (eltParent, 'DIV');
|
|
var cSiblings = rgSiblings.length;
|
|
for (var iSibling = 0; iSibling < cSiblings; iSibling++)
|
|
{
|
|
var eltSibling = rgSiblings [iSibling];
|
|
if (eltSibling != elt)
|
|
{
|
|
setView (eltSibling, false);
|
|
}
|
|
}
|
|
elt = eltParent;
|
|
eltParent = getParentDiv (elt);
|
|
}
|
|
}
|
|
else
|
|
toggle (elt);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function filterTree ()
|
|
{
|
|
var eltMissing = document.getElementById ('missing');
|
|
var eltTodo = document.getElementById ('todo');
|
|
var eltExtra = document.getElementById ('extra');
|
|
var eltErrors = document.getElementById ('errors');
|
|
var eltStable = document.getElementById ('stable');
|
|
|
|
var dictTypes = new Object ();
|
|
if (eltMissing.checked)
|
|
dictTypes ['sm'] = true;
|
|
if (eltTodo.checked)
|
|
dictTypes ['st'] = true;
|
|
if (eltErrors.checked)
|
|
dictTypes ['se'] = true;
|
|
if (eltExtra.checked)
|
|
dictTypes ['sx'] = true;
|
|
if (eltStable.checked)
|
|
dictTypes ['sc'] = true;
|
|
|
|
viewAll (document.getElementById ('ROOT'), dictTypes);
|
|
}
|
|
|
|
function addAndFilter ()
|
|
{
|
|
var newInput = document.getElementById ('NewFilterTarget');
|
|
var newAttr = newInput.value;
|
|
if (newAttr.length > 0) {
|
|
var selection = document.getElementById ('FilteredAttributes');
|
|
var newElem = document.createElement ('option');
|
|
newElem.appendChild (document.createTextNode (newAttr));
|
|
selection.appendChild (newElem);
|
|
newInput.value = '';
|
|
filterTree ();
|
|
}
|
|
}
|
|
|
|
function removeAndFilter ()
|
|
{
|
|
var selection = document.getElementById ('FilteredAttributes');
|
|
if (selection.selectedIndex >= 0) {
|
|
var newInput = document.getElementById ('NewFilterTarget');
|
|
if (newInput.value.length == 0)
|
|
newInput.value = selection.options [selection.selectedIndex].firstChild.nodeValue;
|
|
selection.removeChild (selection.options [selection.selectedIndex]);
|
|
filterTree ();
|
|
}
|
|
}
|
|
|
|
function selectMissing ()
|
|
{
|
|
toggleFilter ('missing');
|
|
}
|
|
|
|
function selectTodo ()
|
|
{
|
|
toggleFilter ('todo');
|
|
}
|
|
|
|
function selectExtra ()
|
|
{
|
|
toggleFilter ('extra');
|
|
}
|
|
|
|
function selectErrors ()
|
|
{
|
|
toggleFilter ('errors');
|
|
}
|
|
|
|
function selectStable ()
|
|
{
|
|
toggleFilter ('stable');
|
|
}
|
|
|
|
function toggleAttributeFilter (attrName)
|
|
{
|
|
toggleFilter (attrName);
|
|
}
|
|
|
|
function toggleFilter (strFilter)
|
|
{
|
|
var eltTodo = document.getElementById ('todo');
|
|
var eltMissing = document.getElementById ('missing');
|
|
var eltExtra = document.getElementById ('extra');
|
|
var eltErrors = document.getElementById ('errors');
|
|
|
|
var eltToggle = document.getElementById (strFilter);
|
|
if (window && window.event && window.event.shiftKey)
|
|
{
|
|
eltMissing.checked = eltTodo.checked = eltExtra.checked = eltErrors.checked = false;
|
|
eltToggle.checked = true;
|
|
}
|
|
else
|
|
if (!eltTodo.checked && !eltMissing.checked && !eltExtra.checked && !eltErrors.checked)
|
|
{
|
|
eltMissing.checked = eltTodo.checked = eltExtra.checked = eltErrors.checked = true;
|
|
eltToggle.checked = false;
|
|
}
|
|
filterTree ();
|
|
}
|
|
|
|
function onLoad ()
|
|
{
|
|
var eltMissing = document.getElementById ('missing');
|
|
var eltTodo = document.getElementById ('todo');
|
|
var eltExtra = document.getElementById ('extra');
|
|
var eltErrors = document.getElementById ('errors');
|
|
eltMissing.checked = eltTodo.checked = eltExtra.checked = eltErrors.checked = true;
|
|
filterTree ();
|
|
}
|
|
|
|
if (document.layers)
|
|
{
|
|
document.captureEvents (Event.MOUSEUP);
|
|
document.onmouseup = clickHandler;
|
|
}
|
|
else if (document.attachEvent)
|
|
{
|
|
document.attachEvent('onclick', clickHandler);
|
|
}
|
|
else if (document.addEventListener)
|
|
{
|
|
document.addEventListener('click', clickHandler, false);
|
|
}
|
|
else
|
|
document.onclick = clickHandler;
|
|
|