@@ -0,0 +1,915 @@
( function ( ) {
'use strict' ;
var xhtml = "http://www.w3.org/1999/xhtml" ;
var namespaces = {
svg : "http://www.w3.org/2000/svg" ,
xhtml : xhtml ,
xlink : "http://www.w3.org/1999/xlink" ,
xml : "http://www.w3.org/XML/1998/namespace" ,
xmlns : "http://www.w3.org/2000/xmlns/"
} ;
function namespace ( name ) {
var prefix = name += "" , i = prefix . indexOf ( ":" ) ;
if ( i >= 0 && ( prefix = name . slice ( 0 , i ) ) !== "xmlns" ) name = name . slice ( i + 1 ) ;
return namespaces . hasOwnProperty ( prefix ) ? { space : namespaces [ prefix ] , local : name } : name ;
}
function creatorInherit ( name ) {
return function ( ) {
var document = this . ownerDocument ,
uri = this . namespaceURI ;
return uri === xhtml && document . documentElement . namespaceURI === xhtml
? document . createElement ( name )
: document . createElementNS ( uri , name ) ;
} ;
}
function creatorFixed ( fullname ) {
return function ( ) {
return this . ownerDocument . createElementNS ( fullname . space , fullname . local ) ;
} ;
}
function creator ( name ) {
var fullname = namespace ( name ) ;
return ( fullname . local
? creatorFixed
: creatorInherit ) ( fullname ) ;
}
function none ( ) { }
function selector ( selector ) {
return selector == null ? none : function ( ) {
return this . querySelector ( selector ) ;
} ;
}
function selection _select ( select ) {
if ( typeof select !== "function" ) select = selector ( select ) ;
for ( var groups = this . _groups , m = groups . length , subgroups = new Array ( m ) , j = 0 ; j < m ; ++ j ) {
for ( var group = groups [ j ] , n = group . length , subgroup = subgroups [ j ] = new Array ( n ) , node , subnode , i = 0 ; i < n ; ++ i ) {
if ( ( node = group [ i ] ) && ( subnode = select . call ( node , node . _ _data _ _ , i , group ) ) ) {
if ( "__data__" in node ) subnode . _ _data _ _ = node . _ _data _ _ ;
subgroup [ i ] = subnode ;
}
}
}
return new Selection ( subgroups , this . _parents ) ;
}
function empty ( ) {
return [ ] ;
}
function selectorAll ( selector ) {
return selector == null ? empty : function ( ) {
return this . querySelectorAll ( selector ) ;
} ;
}
function selection _selectAll ( select ) {
if ( typeof select !== "function" ) select = selectorAll ( select ) ;
for ( var groups = this . _groups , m = groups . length , subgroups = [ ] , parents = [ ] , j = 0 ; j < m ; ++ j ) {
for ( var group = groups [ j ] , n = group . length , node , i = 0 ; i < n ; ++ i ) {
if ( node = group [ i ] ) {
subgroups . push ( select . call ( node , node . _ _data _ _ , i , group ) ) ;
parents . push ( node ) ;
}
}
}
return new Selection ( subgroups , parents ) ;
}
function matcher ( selector ) {
return function ( ) {
return this . matches ( selector ) ;
} ;
}
function selection _filter ( match ) {
if ( typeof match !== "function" ) match = matcher ( match ) ;
for ( var groups = this . _groups , m = groups . length , subgroups = new Array ( m ) , j = 0 ; j < m ; ++ j ) {
for ( var group = groups [ j ] , n = group . length , subgroup = subgroups [ j ] = [ ] , node , i = 0 ; i < n ; ++ i ) {
if ( ( node = group [ i ] ) && match . call ( node , node . _ _data _ _ , i , group ) ) {
subgroup . push ( node ) ;
}
}
}
return new Selection ( subgroups , this . _parents ) ;
}
function sparse ( update ) {
return new Array ( update . length ) ;
}
function selection _enter ( ) {
return new Selection ( this . _enter || this . _groups . map ( sparse ) , this . _parents ) ;
}
function EnterNode ( parent , datum ) {
this . ownerDocument = parent . ownerDocument ;
this . namespaceURI = parent . namespaceURI ;
this . _next = null ;
this . _parent = parent ;
this . _ _data _ _ = datum ;
}
EnterNode . prototype = {
constructor : EnterNode ,
appendChild : function ( child ) { return this . _parent . insertBefore ( child , this . _next ) ; } ,
insertBefore : function ( child , next ) { return this . _parent . insertBefore ( child , next ) ; } ,
querySelector : function ( selector ) { return this . _parent . querySelector ( selector ) ; } ,
querySelectorAll : function ( selector ) { return this . _parent . querySelectorAll ( selector ) ; }
} ;
function constant ( x ) {
return function ( ) {
return x ;
} ;
}
var keyPrefix = "$" ; // Protect against keys like “__proto__”.
function bindIndex ( parent , group , enter , update , exit , data ) {
var i = 0 ,
node ,
groupLength = group . length ,
dataLength = data . length ;
// Put any non-null nodes that fit into update.
// Put any null nodes into enter.
// Put any remaining data into enter.
for ( ; i < dataLength ; ++ i ) {
if ( node = group [ i ] ) {
node . _ _data _ _ = data [ i ] ;
update [ i ] = node ;
} else {
enter [ i ] = new EnterNode ( parent , data [ i ] ) ;
}
}
// Put any non-null nodes that don’ t fit into exit.
for ( ; i < groupLength ; ++ i ) {
if ( node = group [ i ] ) {
exit [ i ] = node ;
}
}
}
function bindKey ( parent , group , enter , update , exit , data , key ) {
var i ,
node ,
nodeByKeyValue = { } ,
groupLength = group . length ,
dataLength = data . length ,
keyValues = new Array ( groupLength ) ,
keyValue ;
// Compute the key for each node.
// If multiple nodes have the same key, the duplicates are added to exit.
for ( i = 0 ; i < groupLength ; ++ i ) {
if ( node = group [ i ] ) {
keyValues [ i ] = keyValue = keyPrefix + key . call ( node , node . _ _data _ _ , i , group ) ;
if ( keyValue in nodeByKeyValue ) {
exit [ i ] = node ;
} else {
nodeByKeyValue [ keyValue ] = node ;
}
}
}
// Compute the key for each datum.
// If there a node associated with this key, join and add it to update.
// If there is not (or the key is a duplicate), add it to enter.
for ( i = 0 ; i < dataLength ; ++ i ) {
keyValue = keyPrefix + key . call ( parent , data [ i ] , i , data ) ;
if ( node = nodeByKeyValue [ keyValue ] ) {
update [ i ] = node ;
node . _ _data _ _ = data [ i ] ;
nodeByKeyValue [ keyValue ] = null ;
} else {
enter [ i ] = new EnterNode ( parent , data [ i ] ) ;
}
}
// Add any remaining nodes that were not bound to data to exit.
for ( i = 0 ; i < groupLength ; ++ i ) {
if ( ( node = group [ i ] ) && ( nodeByKeyValue [ keyValues [ i ] ] === node ) ) {
exit [ i ] = node ;
}
}
}
function selection _data ( value , key ) {
if ( ! value ) {
data = new Array ( this . size ( ) ) , j = - 1 ;
this . each ( function ( d ) { data [ ++ j ] = d ; } ) ;
return data ;
}
var bind = key ? bindKey : bindIndex ,
parents = this . _parents ,
groups = this . _groups ;
if ( typeof value !== "function" ) value = constant ( value ) ;
for ( var m = groups . length , update = new Array ( m ) , enter = new Array ( m ) , exit = new Array ( m ) , j = 0 ; j < m ; ++ j ) {
var parent = parents [ j ] ,
group = groups [ j ] ,
groupLength = group . length ,
data = value . call ( parent , parent && parent . _ _data _ _ , j , parents ) ,
dataLength = data . length ,
enterGroup = enter [ j ] = new Array ( dataLength ) ,
updateGroup = update [ j ] = new Array ( dataLength ) ,
exitGroup = exit [ j ] = new Array ( groupLength ) ;
bind ( parent , group , enterGroup , updateGroup , exitGroup , data , key ) ;
// Now connect the enter nodes to their following update node, such that
// appendChild can insert the materialized enter node before this node,
// rather than at the end of the parent node.
for ( var i0 = 0 , i1 = 0 , previous , next ; i0 < dataLength ; ++ i0 ) {
if ( previous = enterGroup [ i0 ] ) {
if ( i0 >= i1 ) i1 = i0 + 1 ;
while ( ! ( next = updateGroup [ i1 ] ) && ++ i1 < dataLength ) ;
previous . _next = next || null ;
}
}
}
update = new Selection ( update , parents ) ;
update . _enter = enter ;
update . _exit = exit ;
return update ;
}
function selection _exit ( ) {
return new Selection ( this . _exit || this . _groups . map ( sparse ) , this . _parents ) ;
}
function selection _join ( onenter , onupdate , onexit ) {
var enter = this . enter ( ) , update = this , exit = this . exit ( ) ;
enter = typeof onenter === "function" ? onenter ( enter ) : enter . append ( onenter + "" ) ;
if ( onupdate != null ) update = onupdate ( update ) ;
if ( onexit == null ) exit . remove ( ) ; else onexit ( exit ) ;
return enter && update ? enter . merge ( update ) . order ( ) : update ;
}
function selection _merge ( selection ) {
for ( var groups0 = this . _groups , groups1 = selection . _groups , m0 = groups0 . length , m1 = groups1 . length , m = Math . min ( m0 , m1 ) , merges = new Array ( m0 ) , j = 0 ; j < m ; ++ j ) {
for ( var group0 = groups0 [ j ] , group1 = groups1 [ j ] , n = group0 . length , merge = merges [ j ] = new Array ( n ) , node , i = 0 ; i < n ; ++ i ) {
if ( node = group0 [ i ] || group1 [ i ] ) {
merge [ i ] = node ;
}
}
}
for ( ; j < m0 ; ++ j ) {
merges [ j ] = groups0 [ j ] ;
}
return new Selection ( merges , this . _parents ) ;
}
function selection _order ( ) {
for ( var groups = this . _groups , j = - 1 , m = groups . length ; ++ j < m ; ) {
for ( var group = groups [ j ] , i = group . length - 1 , next = group [ i ] , node ; -- i >= 0 ; ) {
if ( node = group [ i ] ) {
if ( next && node . compareDocumentPosition ( next ) ^ 4 ) next . parentNode . insertBefore ( node , next ) ;
next = node ;
}
}
}
return this ;
}
function selection _sort ( compare ) {
if ( ! compare ) compare = ascending ;
function compareNode ( a , b ) {
return a && b ? compare ( a . _ _data _ _ , b . _ _data _ _ ) : ! a - ! b ;
}
for ( var groups = this . _groups , m = groups . length , sortgroups = new Array ( m ) , j = 0 ; j < m ; ++ j ) {
for ( var group = groups [ j ] , n = group . length , sortgroup = sortgroups [ j ] = new Array ( n ) , node , i = 0 ; i < n ; ++ i ) {
if ( node = group [ i ] ) {
sortgroup [ i ] = node ;
}
}
sortgroup . sort ( compareNode ) ;
}
return new Selection ( sortgroups , this . _parents ) . order ( ) ;
}
function ascending ( a , b ) {
return a < b ? - 1 : a > b ? 1 : a >= b ? 0 : NaN ;
}
function selection _call ( ) {
var callback = arguments [ 0 ] ;
arguments [ 0 ] = this ;
callback . apply ( null , arguments ) ;
return this ;
}
function selection _nodes ( ) {
var nodes = new Array ( this . size ( ) ) , i = - 1 ;
this . each ( function ( ) { nodes [ ++ i ] = this ; } ) ;
return nodes ;
}
function selection _node ( ) {
for ( var groups = this . _groups , j = 0 , m = groups . length ; j < m ; ++ j ) {
for ( var group = groups [ j ] , i = 0 , n = group . length ; i < n ; ++ i ) {
var node = group [ i ] ;
if ( node ) return node ;
}
}
return null ;
}
function selection _size ( ) {
var size = 0 ;
this . each ( function ( ) { ++ size ; } ) ;
return size ;
}
function selection _empty ( ) {
return ! this . node ( ) ;
}
function selection _each ( callback ) {
for ( var groups = this . _groups , j = 0 , m = groups . length ; j < m ; ++ j ) {
for ( var group = groups [ j ] , i = 0 , n = group . length , node ; i < n ; ++ i ) {
if ( node = group [ i ] ) callback . call ( node , node . _ _data _ _ , i , group ) ;
}
}
return this ;
}
function attrRemove ( name ) {
return function ( ) {
this . removeAttribute ( name ) ;
} ;
}
function attrRemoveNS ( fullname ) {
return function ( ) {
this . removeAttributeNS ( fullname . space , fullname . local ) ;
} ;
}
function attrConstant ( name , value ) {
return function ( ) {
this . setAttribute ( name , value ) ;
} ;
}
function attrConstantNS ( fullname , value ) {
return function ( ) {
this . setAttributeNS ( fullname . space , fullname . local , value ) ;
} ;
}
function attrFunction ( name , value ) {
return function ( ) {
var v = value . apply ( this , arguments ) ;
if ( v == null ) this . removeAttribute ( name ) ;
else this . setAttribute ( name , v ) ;
} ;
}
function attrFunctionNS ( fullname , value ) {
return function ( ) {
var v = value . apply ( this , arguments ) ;
if ( v == null ) this . removeAttributeNS ( fullname . space , fullname . local ) ;
else this . setAttributeNS ( fullname . space , fullname . local , v ) ;
} ;
}
function selection _attr ( name , value ) {
var fullname = namespace ( name ) ;
if ( arguments . length < 2 ) {
var node = this . node ( ) ;
return fullname . local
? node . getAttributeNS ( fullname . space , fullname . local )
: node . getAttribute ( fullname ) ;
}
return this . each ( ( value == null
? ( fullname . local ? attrRemoveNS : attrRemove ) : ( typeof value === "function"
? ( fullname . local ? attrFunctionNS : attrFunction )
: ( fullname . local ? attrConstantNS : attrConstant ) ) ) ( fullname , value ) ) ;
}
function defaultView ( node ) {
return ( node . ownerDocument && node . ownerDocument . defaultView ) // node is a Node
|| ( node . document && node ) // node is a Window
|| node . defaultView ; // node is a Document
}
function styleRemove ( name ) {
return function ( ) {
this . style . removeProperty ( name ) ;
} ;
}
function styleConstant ( name , value , priority ) {
return function ( ) {
this . style . setProperty ( name , value , priority ) ;
} ;
}
function styleFunction ( name , value , priority ) {
return function ( ) {
var v = value . apply ( this , arguments ) ;
if ( v == null ) this . style . removeProperty ( name ) ;
else this . style . setProperty ( name , v , priority ) ;
} ;
}
function selection _style ( name , value , priority ) {
return arguments . length > 1
? this . each ( ( value == null
? styleRemove : typeof value === "function"
? styleFunction
: styleConstant ) ( name , value , priority == null ? "" : priority ) )
: styleValue ( this . node ( ) , name ) ;
}
function styleValue ( node , name ) {
return node . style . getPropertyValue ( name )
|| defaultView ( node ) . getComputedStyle ( node , null ) . getPropertyValue ( name ) ;
}
function propertyRemove ( name ) {
return function ( ) {
delete this [ name ] ;
} ;
}
function propertyConstant ( name , value ) {
return function ( ) {
this [ name ] = value ;
} ;
}
function propertyFunction ( name , value ) {
return function ( ) {
var v = value . apply ( this , arguments ) ;
if ( v == null ) delete this [ name ] ;
else this [ name ] = v ;
} ;
}
function selection _property ( name , value ) {
return arguments . length > 1
? this . each ( ( value == null
? propertyRemove : typeof value === "function"
? propertyFunction
: propertyConstant ) ( name , value ) )
: this . node ( ) [ name ] ;
}
function classArray ( string ) {
return string . trim ( ) . split ( /^|\s+/ ) ;
}
function classList ( node ) {
return node . classList || new ClassList ( node ) ;
}
function ClassList ( node ) {
this . _node = node ;
this . _names = classArray ( node . getAttribute ( "class" ) || "" ) ;
}
ClassList . prototype = {
add : function ( name ) {
var i = this . _names . indexOf ( name ) ;
if ( i < 0 ) {
this . _names . push ( name ) ;
this . _node . setAttribute ( "class" , this . _names . join ( " " ) ) ;
}
} ,
remove : function ( name ) {
var i = this . _names . indexOf ( name ) ;
if ( i >= 0 ) {
this . _names . splice ( i , 1 ) ;
this . _node . setAttribute ( "class" , this . _names . join ( " " ) ) ;
}
} ,
contains : function ( name ) {
return this . _names . indexOf ( name ) >= 0 ;
}
} ;
function classedAdd ( node , names ) {
var list = classList ( node ) , i = - 1 , n = names . length ;
while ( ++ i < n ) list . add ( names [ i ] ) ;
}
function classedRemove ( node , names ) {
var list = classList ( node ) , i = - 1 , n = names . length ;
while ( ++ i < n ) list . remove ( names [ i ] ) ;
}
function classedTrue ( names ) {
return function ( ) {
classedAdd ( this , names ) ;
} ;
}
function classedFalse ( names ) {
return function ( ) {
classedRemove ( this , names ) ;
} ;
}
function classedFunction ( names , value ) {
return function ( ) {
( value . apply ( this , arguments ) ? classedAdd : classedRemove ) ( this , names ) ;
} ;
}
function selection _classed ( name , value ) {
var names = classArray ( name + "" ) ;
if ( arguments . length < 2 ) {
var list = classList ( this . node ( ) ) , i = - 1 , n = names . length ;
while ( ++ i < n ) if ( ! list . contains ( names [ i ] ) ) return false ;
return true ;
}
return this . each ( ( typeof value === "function"
? classedFunction : value
? classedTrue
: classedFalse ) ( names , value ) ) ;
}
function textRemove ( ) {
this . textContent = "" ;
}
function textConstant ( value ) {
return function ( ) {
this . textContent = value ;
} ;
}
function textFunction ( value ) {
return function ( ) {
var v = value . apply ( this , arguments ) ;
this . textContent = v == null ? "" : v ;
} ;
}
function selection _text ( value ) {
return arguments . length
? this . each ( value == null
? textRemove : ( typeof value === "function"
? textFunction
: textConstant ) ( value ) )
: this . node ( ) . textContent ;
}
function htmlRemove ( ) {
this . innerHTML = "" ;
}
function htmlConstant ( value ) {
return function ( ) {
this . innerHTML = value ;
} ;
}
function htmlFunction ( value ) {
return function ( ) {
var v = value . apply ( this , arguments ) ;
this . innerHTML = v == null ? "" : v ;
} ;
}
function selection _html ( value ) {
return arguments . length
? this . each ( value == null
? htmlRemove : ( typeof value === "function"
? htmlFunction
: htmlConstant ) ( value ) )
: this . node ( ) . innerHTML ;
}
function raise ( ) {
if ( this . nextSibling ) this . parentNode . appendChild ( this ) ;
}
function selection _raise ( ) {
return this . each ( raise ) ;
}
function lower ( ) {
if ( this . previousSibling ) this . parentNode . insertBefore ( this , this . parentNode . firstChild ) ;
}
function selection _lower ( ) {
return this . each ( lower ) ;
}
function selection _append ( name ) {
var create = typeof name === "function" ? name : creator ( name ) ;
return this . select ( function ( ) {
return this . appendChild ( create . apply ( this , arguments ) ) ;
} ) ;
}
function constantNull ( ) {
return null ;
}
function selection _insert ( name , before ) {
var create = typeof name === "function" ? name : creator ( name ) ,
select = before == null ? constantNull : typeof before === "function" ? before : selector ( before ) ;
return this . select ( function ( ) {
return this . insertBefore ( create . apply ( this , arguments ) , select . apply ( this , arguments ) || null ) ;
} ) ;
}
function remove ( ) {
var parent = this . parentNode ;
if ( parent ) parent . removeChild ( this ) ;
}
function selection _remove ( ) {
return this . each ( remove ) ;
}
function selection _cloneShallow ( ) {
return this . parentNode . insertBefore ( this . cloneNode ( false ) , this . nextSibling ) ;
}
function selection _cloneDeep ( ) {
return this . parentNode . insertBefore ( this . cloneNode ( true ) , this . nextSibling ) ;
}
function selection _clone ( deep ) {
return this . select ( deep ? selection _cloneDeep : selection _cloneShallow ) ;
}
function selection _datum ( value ) {
return arguments . length
? this . property ( "__data__" , value )
: this . node ( ) . _ _data _ _ ;
}
var filterEvents = { } ;
if ( typeof document !== "undefined" ) {
var element = document . documentElement ;
if ( ! ( "onmouseenter" in element ) ) {
filterEvents = { mouseenter : "mouseover" , mouseleave : "mouseout" } ;
}
}
function filterContextListener ( listener , index , group ) {
listener = contextListener ( listener , index , group ) ;
return function ( event ) {
var related = event . relatedTarget ;
if ( ! related || ( related !== this && ! ( related . compareDocumentPosition ( this ) & 8 ) ) ) {
listener . call ( this , event ) ;
}
} ;
}
function contextListener ( listener , index , group ) {
return function ( event1 ) {
try {
listener . call ( this , this . _ _data _ _ , index , group ) ;
} finally {
}
} ;
}
function parseTypenames ( typenames ) {
return typenames . trim ( ) . split ( /^|\s+/ ) . map ( function ( t ) {
var name = "" , i = t . indexOf ( "." ) ;
if ( i >= 0 ) name = t . slice ( i + 1 ) , t = t . slice ( 0 , i ) ;
return { type : t , name : name } ;
} ) ;
}
function onRemove ( typename ) {
return function ( ) {
var on = this . _ _on ;
if ( ! on ) return ;
for ( var j = 0 , i = - 1 , m = on . length , o ; j < m ; ++ j ) {
if ( o = on [ j ] , ( ! typename . type || o . type === typename . type ) && o . name === typename . name ) {
this . removeEventListener ( o . type , o . listener , o . capture ) ;
} else {
on [ ++ i ] = o ;
}
}
if ( ++ i ) on . length = i ;
else delete this . _ _on ;
} ;
}
function onAdd ( typename , value , capture ) {
var wrap = filterEvents . hasOwnProperty ( typename . type ) ? filterContextListener : contextListener ;
return function ( d , i , group ) {
var on = this . _ _on , o , listener = wrap ( value , i , group ) ;
if ( on ) for ( var j = 0 , m = on . length ; j < m ; ++ j ) {
if ( ( o = on [ j ] ) . type === typename . type && o . name === typename . name ) {
this . removeEventListener ( o . type , o . listener , o . capture ) ;
this . addEventListener ( o . type , o . listener = listener , o . capture = capture ) ;
o . value = value ;
return ;
}
}
this . addEventListener ( typename . type , listener , capture ) ;
o = { type : typename . type , name : typename . name , value : value , listener : listener , capture : capture } ;
if ( ! on ) this . _ _on = [ o ] ;
else on . push ( o ) ;
} ;
}
function selection _on ( typename , value , capture ) {
var typenames = parseTypenames ( typename + "" ) , i , n = typenames . length , t ;
if ( arguments . length < 2 ) {
var on = this . node ( ) . _ _on ;
if ( on ) for ( var j = 0 , m = on . length , o ; j < m ; ++ j ) {
for ( i = 0 , o = on [ j ] ; i < n ; ++ i ) {
if ( ( t = typenames [ i ] ) . type === o . type && t . name === o . name ) {
return o . value ;
}
}
}
return ;
}
on = value ? onAdd : onRemove ;
if ( capture == null ) capture = false ;
for ( i = 0 ; i < n ; ++ i ) this . each ( on ( typenames [ i ] , value , capture ) ) ;
return this ;
}
function dispatchEvent ( node , type , params ) {
var window = defaultView ( node ) ,
event = window . CustomEvent ;
if ( typeof event === "function" ) {
event = new event ( type , params ) ;
} else {
event = window . document . createEvent ( "Event" ) ;
if ( params ) event . initEvent ( type , params . bubbles , params . cancelable ) , event . detail = params . detail ;
else event . initEvent ( type , false , false ) ;
}
node . dispatchEvent ( event ) ;
}
function dispatchConstant ( type , params ) {
return function ( ) {
return dispatchEvent ( this , type , params ) ;
} ;
}
function dispatchFunction ( type , params ) {
return function ( ) {
return dispatchEvent ( this , type , params . apply ( this , arguments ) ) ;
} ;
}
function selection _dispatch ( type , params ) {
return this . each ( ( typeof params === "function"
? dispatchFunction
: dispatchConstant ) ( type , params ) ) ;
}
var root = [ null ] ;
function Selection ( groups , parents ) {
this . _groups = groups ;
this . _parents = parents ;
}
function selection ( ) {
return new Selection ( [ [ document . documentElement ] ] , root ) ;
}
Selection . prototype = selection . prototype = {
constructor : Selection ,
select : selection _select ,
selectAll : selection _selectAll ,
filter : selection _filter ,
data : selection _data ,
enter : selection _enter ,
exit : selection _exit ,
join : selection _join ,
merge : selection _merge ,
order : selection _order ,
sort : selection _sort ,
call : selection _call ,
nodes : selection _nodes ,
node : selection _node ,
size : selection _size ,
empty : selection _empty ,
each : selection _each ,
attr : selection _attr ,
style : selection _style ,
property : selection _property ,
classed : selection _classed ,
text : selection _text ,
html : selection _html ,
raise : selection _raise ,
lower : selection _lower ,
append : selection _append ,
insert : selection _insert ,
remove : selection _remove ,
clone : selection _clone ,
datum : selection _datum ,
on : selection _on ,
dispatch : selection _dispatch
} ;
function select ( selector ) {
return typeof selector === "string"
? new Selection ( [ [ document . querySelector ( selector ) ] ] , [ document . documentElement ] )
: new Selection ( [ [ selector ] ] , root ) ;
}
/*
Uses the Mediawiki API to display a list of recent images and a link to
the page where the image has been used/placed.
Makes use of the following API calls:
* https://www.mediawiki.org/wiki/API:Allimages
* https://www.mediawiki.org/wiki/API:Imageinfo
* https://www.mediawiki.org/wiki/API:Imageusage
*/
var PAGE _COUNT = 25 ; /* how many edits to show per load*/
var main = select ( "#content" ) ,
baseurl = "/mw/api.php?action=query&list=recentchanges&rclimit=25&rcnamespace=0&rctoponly=1&format=json&formatversion=2&aisort=timestamp&aidir=older&aiprop=timestamp|user|url|mime|size" ,
url = baseurl ;
async function get _json ( url ) {
var resp = await fetch ( url ) ;
return await resp . json ( ) ;
}
function url _for _title ( title ) {
return "/w/" + encodeURI ( title . replace ( / /g , "_" ) ) ;
}
async function load ( ) {
let count = 0 ;
while ( count < PAGE _COUNT ) {
// console.log("starting loop", "count", count, "url", url);
let data = await get _json ( url ) ,
recentchanges = data . query . recentchanges ;
console . log ( "recentchanges" , recentchanges ) ;
let items = main . selectAll ( "div.edit" )
. data ( recentchanges , d => d . title )
. enter ( )
. append ( "div" )
. attr ( "class" , "edit" )
. append ( "a" )
. attr ( "href" , d => url _for _title ( d . title ) )
. attr ( "target" , "wikiframe" )
. text ( d => d . title ) ;
if ( data . continue ) {
url = baseurl + "&rccontinue=" + data . continue . rccontinue ;
} else {
return ;
}
count += recentchanges . length ;
}
}
document . addEventListener ( "DOMContentLoaded" , load ) ;
document . querySelector ( "a#more" ) . addEventListener ( "click" , function ( e ) {
e . preventDefault ( ) ;
load ( ) ;
} ) ;
} ( ) ) ;