115 lines
3.5 KiB

define( function ( require, exports, module ) {
var data = ( function ( origin ) {
var ret = [],
length = origin.length,
i;
var id = 1000;
for ( i = 0; i < length; i++ ) {
if ( +( origin[ i ][ 1 ] ) >= 0 ) {
ret.push( {
id: id++,
seq: origin[ i ][ 0 ].split( '->' ),
length: +origin[ i ][ 1 ],
uv: +origin[ i ][ 2 ]
} );
}
}
return ret;
} )( require( '../pathdiagram/data' ) );
var length = data.length;
var abs = Math.abs;
function subseqIndex( seq, sub ) {
var i = 0,
j = 0,
iLength = seq.length,
jLength = sub.length,
iPreserve = 0;
while ( true ) {
if ( seq[ i ] != sub[ j ] ) {
i = ++iPreserve;
j = 0;
if ( i >= iLength ) {
return -1;
}
continue;
}
if ( seq[ i ] == sub[ j ] ) {
i++;
j++;
}
if ( j == jLength ) {
return iPreserve;
}
}
}
return {
random: function ( minUv ) {
var keywords = [];
for ( var i = 0; i < length; i++ ) {
if ( data[ i ].length === 0 ) {
keywords.push( data[ i ] );
}
}
minUv = minUv || 5000;
var ret;
while ( !ret || ret.uv < minUv ) {
ret = keywords[ Math.floor( Math.random() * keywords.length ) ];
}
ret.word = ret.seq[0];
return ret;
},
search: function( keyword ) {
var result = [], ret;
for ( var i = 0; i < length; i++ ) {
if ( data[ i ].length === 0 && data[i].seq[0].indexOf(keyword) != -1 ) {
result.push( data[i] );
}
}
if(!result.length) {
return this.random();
}
result.sort(function(a, b) {
return b.uv - a.uv;
});
ret = result[0];
ret.word = ret.seq[0];
return ret;
},
upstream: function ( path ) {
var upstream = [];
for ( var i = 0; i < length; i++ ) {
if ( subseqIndex( data[ i ].seq, path.seq ) > 0 &&
data[ i ].length == path.length + 1 ) {
upstream.push( {
id: data[ i ].id,
seq: data[ i ].seq,
length: data[ i ].length,
uv: data[ i ].uv,
word: data[ i ].seq[ 0 ]
} );
}
}
return upstream;
},
downstream: function ( path ) {
var downstream = [];
for ( var i = 0; i < length; i++ ) {
if ( subseqIndex( data[ i ].seq, path.seq ) === 0 &&
data[ i ].length == path.length + 1 ) {
downstream.push( {
id: data[ i ].id,
seq: data[ i ].seq,
length: data[ i ].length,
uv: data[ i ].uv,
word: data[ i ].seq[ data[ i ].length - 1 ]
} );
}
}
return downstream;
}
};
} );