📄 whfhost.js
字号:
}
else
{
a_Result.strNormalizedOrg = strUpper;
a_Result.bUpperCase = true;
}
}
this.stemWith = function( a_strWord, a_strSuffix )
{
var s = a_strSuffix.split( "," );
var strSuffix = s[0];
var bRemoveOnly = ( s[1] == '1' );
var ss = a_strWord.match( "^..+" + strSuffix + "$" );
if ( ss == null )
return null;
var nLenRest = a_strWord.length - strSuffix.length;
var bAddE = false;
if ( !bRemoveOnly )
{
if ( !this.isVowel( a_strWord.charAt( nLenRest - 1 ) ) )
{
if ( a_strWord.charAt( nLenRest - 1 ) == a_strWord.charAt( nLenRest - 2 ) )
nLenRest--;
else
bAddE = true;
}
}
var strStem = a_strWord.substr( 0, nLenRest );
if ( strStem.length <= 2 )
return null;
return strStem;
}
this.helStem = function( a_Result )
{
var strWord = a_Result.strNormalizedOrg.toLowerCase();
var nSuffixNum = g_RunesHelSuffixes.length;
var nStemFound = 0;
var strStem = null;
for ( var i = 0; i < nSuffixNum; i++ )
{
strStem = this.stemWith( strWord, g_RunesHelSuffixes[i] );
if ( strStem != null )
{
nStemFound = i + 1;
break;
}
}
if ( strStem == null )
strStem = strWord;
a_Result.strHelStem = strStem;
a_Result.nHelWordShape = a_Result.bUpperCase ? nStemFound * 2 + 1 : nStemFound * 2;
}
this.isVowel = function( a_ch )
{
return g_RunesVowels.indexOf( a_ch ) >= 0;
}
this.isWordBreak = function( a_ch )
{
return ( !this.isQuote( a_ch ) && g_RunesWordBreaks.indexOf( a_ch ) >= 0 );
}
this.isWhiteSpace = function( a_ch )
{
return ( g_RunesWhiteSpaces.indexOf( a_ch ) >= 0 );
}
this.isQuote = function( a_ch )
{
return ( a_ch == g_RunesQuote );
}
this.isAND = function( a_strOp )
{ return ( a_strOp == "and" ); }
this.isOR = function( a_strOp )
{ return ( a_strOp == "or" ); }
this.isNOT = function( a_strOp )
{ return ( a_strOp == "not" ); }
this.isOperator = function( strOp )
{ if ( strOp == "and" ||
strOp == "or" ||
strOp == "not" )
return true;
}
}
// Runes.js----------------------------------
var ESNT_AND = 1;
var ESNT_OR = 2;
var ESNT_NOT = 3;
var ESNT_DEFAULT = 4;
var ESNT_PHRASE = 5;
function RunesContext( a_strSrc )
{
this.strSrc = a_strSrc;
this.nCur = 0;
this.bFailed = false;
this.bNot = false;
this.nWordIndex = 0;
this.getCurChar = function()
{
return this.strSrc.charAt( this.nCur );
}
this.getChar = function( i )
{
return this.strSrc.charAt( i );
}
this.reachEnd = function()
{
return this.nCur >= this.strSrc.length;
}
}
function DolWord( a_strWord, a_nPosition )
{
this.strWord = a_strWord;
this.nPosition = a_nPosition;
}
function SolNode(){}
function RunesService()
{
this.langSev = new LanguageService();
this.isOperator = function( a_str, a_nFrom )
{
var strOp = this.getWord( a_str, a_nFrom ).toLowerCase();
if ( this.langSev.isOperator( strOp ) )
return true;
return false;
}
this.getLengthOfWordBreak = function( a_str, a_nFrom )
{
var i = a_nFrom, nLen = a_str.length;
while ( i < nLen && this.langSev.isWordBreak( a_str.charAt( i ) ) )
i++;
return i - a_nFrom;
}
this.getLengthOfWord = function( a_str, a_nFrom )
{
var i = a_nFrom, nLen = a_str.length;
while ( i < nLen &&
!this.langSev.isWordBreak( a_str.charAt( i ) ) &&
!this.langSev.isQuote( a_str.charAt( i ) ) )
++i;
return i - a_nFrom;
}
this.getWord = function( a_str, a_nFrom )
{
var nLen = this.getLengthOfWord( a_str, a_nFrom );
return a_str.substr( a_nFrom, nLen );
}
this.getPositionInc = function( a_str, a_nFrom )
{
var i = a_nFrom, nLen = a_str.length, nInc = 1;
while ( i < nLen && this.langSev.isWordBreak( a_str.charAt( i ) ) )
{
if ( !this.langSev.isWhiteSpace( a_str.charAt( i ) ) )
nInc++;
i++;
}
return nInc;
}
this.getTerm = function( a_Context, a_Rslt )
{
if ( this.langSev.isQuote( a_Context.getCurChar() ) )
{
a_Context.nCur++;
var nLen = this.getLengthOfPhrase( a_Context.strSrc, a_Context.nCur );
if ( nLen <= 0 )
return false;
a_Rslt.eType = ESNT_PHRASE;
a_Rslt.strTerm = a_Context.strSrc.substr( a_Context.nCur, nLen );
a_Context.nCur += nLen + 1;
}
else
{
var nLen = this.getLengthOfDefault( a_Context.strSrc, a_Context.nCur );
if ( nLen <= 0 )
return false;
a_Rslt.eType = ESNT_DEFAULT;
a_Rslt.strTerm = a_Context.strSrc.substr( a_Context.nCur, nLen );
a_Context.nCur += nLen;
}
return true;
}
this.getOperator = function( a_Context, a_Rslt )
{
if ( a_Context.reachEnd() )
return false;
var strOp = this.getWord( a_Context.strSrc, a_Context.nCur ).toLowerCase();
if ( this.langSev.isAND( strOp ) )
{
a_Rslt.eType = ESNT_AND;
a_Context.nCur += strOp.length;
}
else if ( this.langSev.isOR( strOp ) )
{
a_Rslt.eType = ESNT_OR;
a_Context.nCur += strOp.length;
}
else if ( this.langSev.isNOT( strOp ) )
{
a_Rslt.eType = ESNT_NOT;
a_Context.nCur += strOp.length;
}
else
{
a_Rslt.eType = ESNT_OR;
}
return true;
}
this.getLengthOfPhrase = function( a_str, a_nFrom )
{
var i = a_nFrom, nLen = a_str.length;
while ( i < nLen )
{
if ( this.langSev.isQuote( a_str.charAt( i ) ) )
return i - a_nFrom;
++i;
}
return -1;
}
this.getLengthOfDefault = function( a_str, a_nFrom )
{
var i = a_nFrom, nLen = a_str.length;
while ( i < nLen &&
!this.isOperator( a_str, i ) &&
!this.langSev.isQuote( a_str.charAt( i ) ) )
{
i += this.getLengthOfWord( a_str, i );
i += this.getLengthOfWordBreak( a_str, i );
}
return i - a_nFrom;
}
this.parseOperator = function( a_Context, a_Result, a_bNotAllowed )
{
a_Context.nCur += this.getLengthOfWordBreak( a_Context.strSrc, a_Context.nCur );
var rslt = new Object;
if ( !this.getOperator( a_Context, rslt ) )
return false;
if ( rslt.eType == ESNT_NOT )
{
if (a_bNotAllowed)
{
if ( a_Context.bNOT )
{
rslt.eType = ESNT_OR;
}
else
{
a_Context.bNOT = true;
}
}
else
{
a_Context.bFailed = true;
return false ;
}
}
a_Result.eType = rslt.eType;
a_Result.right = new SolNode();
if ( !this.parseTerm( a_Context, a_Result.right ) )
return false;
return true;
}
this.parseTerm = function( a_Context, a_Result )
{
a_Context.nCur += this.getLengthOfWordBreak( a_Context.strSrc, a_Context.nCur );
var rslt = new Object;
if ( !this.getTerm( a_Context, rslt ) )
{
if (( this.parseOperator( a_Context, rslt, true ) )&&(rslt.eType == ESNT_NOT))
{
a_Result.eType = rslt.eType;
if (rslt.right.eType == ESNT_DEFAULT)
{
a_Result.strTerm = rslt.right.strTerm;
return true ;
}
else
{
a_Context.bFailed = true;
return false;
}
}
else
{
a_Context.bFailed = true;
return false;
}
}
if ( this.parseOperator( a_Context, a_Result, false ) )
{
a_Result.left = new SolNode();
a_Result.left.eType = rslt.eType;
a_Result.left.strTerm = rslt.strTerm;
}
else
{
a_Result.eType = rslt.eType;
a_Result.strTerm = rslt.strTerm;
}
return true;
}
this.extractTerm = function( a_Context, a_Term )
{
a_Term.aWords = new Array();
this.dolSegment( a_Term.strTerm, a_Term.aWords );
if ( a_Term.aWords.length == 0 )
return false;
for ( var i = 0; i < a_Term.aWords.length; i++ )
{
a_Term.aWords[i].nWordId = a_Term.aWords[i].nPosition + a_Context.nWordIndex;
}
a_Context.nWordIndex = a_Term.aWords[a_Term.aWords.length - 1].nWordId + 1;
return true;
}
this.parsePhraseAndDefault = function( a_Context, a_Node )
{
if ( a_Node.eType == ESNT_PHRASE || a_Node.eType == ESNT_DEFAULT || a_Node.eType == ESNT_NOT)
{
if ( !this.extractTerm( a_Context, a_Node ) &&
a_Node.eType == ESNT_PHRASE )
a_Context.bFailed = true;
}
else
{
this.parsePhraseAndDefault( a_Context, a_Node.left );
this.parsePhraseAndDefault( a_Context, a_Node.right );
}
}
this.helStem = function( a_strOrg, a_Result )
{
this.langSev.getNormalizedOrg( a_strOrg, a_Result );
this.langSev.helStem( a_Result );
}
this.dolSegment = function( a_strSrc, a_Result )
{
var nLen = a_strSrc.length;
var nCur = 0;
var nPosition = 1;
var strWord = "";
nCur += this.getLengthOfWordBreak( a_strSrc, nCur );
while ( nCur < nLen )
{
strWord = this.getWord( a_strSrc, nCur );
a_Result[a_Result.length] = new DolWord( strWord, nPosition );
nCur += strWord.length;
nPosition += this.getPositionInc( a_strSrc, nCur );
nCur += this.getLengthOfWordBreak( a_strSrc, nCur );
}
}
this.solParse = function( a_strSrc, a_Result )
{
var context = new RunesContext( a_strSrc );
this.parseTerm( context, a_Result );
if ( context.bFailed )
return false;
this.parsePhraseAndDefault( context, a_Result );
if ( context.bFailed )
return false;
return true;
}
}
// HuginInput.js--------------------------------
function _helStemNode( a_Runes, a_Node )
{
with ( a_Node )
{
if ( eType == ESNT_PHRASE || eType == ESNT_DEFAULT || eType == ESNT_NOT)
{
for ( var i = 0; i < aWords.length; i++ )
{
a_Runes.helStem( aWords[i].strWord, aWords[i] )
}
}
else
{
_helStemNode( a_Runes, left );
_helStemNode( a_Runes, right );
}
}
}
function parseQueryExpression( a_strQuery )
{
var runes = new RunesService();
var expression = new SolNode();
if ( !runes.solParse( a_strQuery, expression ) )
return null;
_helStemNode( runes, expression )
return expression;
}
// RankingCalculator.js-------------------------
var EWMT_NotMatch = 0;
var EWMT_SynonymMatch = 1;
var EWMT_WordMatch = 2;
var EWMT_ShapeMatch = 3;
var WEIGHT_OF_SHAPE_MATCH = 0.5;
var WEIGHT_OF_SINGLE_WORD_SCORE = 0.5;
var HUGIN_KEYWORD_FLAG = 0x0040;
var HUGIN_TITLE_FLAG = 0x0080;
var WORDSHAPE_SYNONYM = -2;
function _rank_ULaw( a_fX )
{
if ( a_fX < 0.0 )
return 0.0;
return 1.0 - 1.0 / ( a_fX + 1.0 );
}
function _rank_Weaken( a_fWeight, a_fPercent )
{
var fPercent = ( a_fPercent < 0.0 ) ? 0.0 :
( a_fPercent > 1.0 ) ? 1.0 : a_fPercent;
return 1 - fPercent + a_fWeight * fPercent;
}
function _isKeyWord( a_uEmphasis )
{
return ( a_uEmphasis & HUGIN_KEYWORD_FLAG ) != 0;
}
function _isTitle( a_uEmphasis )
{
return ( a_uEmphasis & HUGIN_TITLE_FLAG ) != 0;
}
function _isUpperCaseShape( a_nWordShape )
{
return a_nWordShape % 2 != 0;
}
function _emphasisToScore( a_uEmphasis )
{
var nScore = 0;
//H1 = 64, H2 = 32, H3 = 16, H4 = 8, H5 = 4, H6 = 2
for ( var i = 5, nInc = 2; i >= 0; i--, nInc *= 2 )
nScore += nInc * ( ( a_uEmphasis >> i ) & 1 );
return nScore;
}
function _getWordMatchType( a_Word, a_Tile, a_nPosition, a_nOffset )
{
var eRslt = EWMT_NotMatch;
// The term must be consecutive.
if ( a_nPosition - a_nOffset != a_Word.nWordId )
return eRslt;
for ( var i = 0; i < a_Tile.aWords.length; i++ )
{
var eCur = EWMT_NotMatch;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -