/*______________
| ______ | U I Z E J A V A S C R I P T F R A M E W O R K
| / / | ---------------------------------------------------
| / O / | MODULE : Uize.Loc.Strings.Metrics Package
| / / / |
| / / / /| | ONLINE : http://uize.com
| /____/ /__/_| | COPYRIGHT : (c)2013-2016 UIZE
| /___ | LICENSE : Available under MIT License or GNU General Public License
|_______________| http://uize.com/license.html
*/
/* Module Meta Data
type: Package
importance: 1
codeCompleteness: 100
docCompleteness: 5
*/
/*?
Introduction
The =Uize.Loc.Strings.Metrics= module provides methods for obtaining metrics, such as word and character counts, from resource strings.
*DEVELOPERS:* `Chris van Rensburg`
*/
Uize.module ({
name:'Uize.Loc.Strings.Metrics',
required:[
'Uize.Str.Split',
'Uize.Util.RegExpComposition.WordSplitter',
'Uize.Loc.Strings.StringPath',
'Uize.Array.Sort'
],
builder:function () {
'use strict';
var
/*** Variables for Performance Optimization ***/
_split = Uize.Str.Split.split,
_toStringPath = Uize.Loc.Strings.StringPath.to,
/*** General Variables ***/
_defaultWordSplitter = Uize.Util.RegExpComposition.WordSplitter.get ('wordSplitter')
;
return Uize.package ({
getStringMetrics:function (_sourceStr,_wordSplitter,_tokenRegExp) {
var
_words = 0,
_chars = 0,
_tokens = []
;
if (_sourceStr) {
if (_tokenRegExp) {
var
_match,
_tokenName,
_tokenAdded = {}
;
_tokenRegExp.lastIndex = 0;
while (_match = _tokenRegExp.exec (_sourceStr)) {
if (!(_tokenName = _match [1])) {
for (var _matchSegmentNo = _match.length; !_tokenName && --_matchSegmentNo >= 0;)
_tokenName = _match [_matchSegmentNo]
;
}
if (!_tokenAdded [_tokenName]) {
_tokens.push (_tokenName);
_tokenAdded [_tokenName] = 1;
}
}
}
for (
var
_stringSegmentNo = -2,
_stringSegments = _split (_sourceStr,_wordSplitter || _defaultWordSplitter,null,'match'),
_stringSegmentsLength = _stringSegments.length,
_wordChars
;
(_stringSegmentNo += 2) < _stringSegmentsLength;
) {
if (_wordChars = _stringSegments [_stringSegmentNo].length) {
_words++;
_chars += _wordChars;
}
}
}
return {
words:_words,
chars:_chars,
tokens:_tokens
};
},
getStringsMetrics:function (_stringsInfo) {
var
_totalResourceStrings = 0,
_totalBrandSpecificResourceStrings = 0,
_totalResourceStringPerBrand = {},
_totalWordCount = 0,
_totalBrandSpecificWordCount = 0,
_totalWordCountPerBrand = {},
_totalCharCount = 0,
_totalBrandSpecificCharCount = 0,
_totalCharCountPerBrand = {},
_totalTokens = 0,
_totalTokenizedResourceStrings = 0,
_totalHtmlResourceStrings = 0,
_totalLongResourceStrings = 0,
_totalInvalidKeyResourceStrings = 0,
_totalWeakTokenResourceStrings = 0,
_totalNonTranslatableResourceStrings = 0,
_totalDupedResourceStrings = 0,
_valuesLookup = {},
_dupedResourceStringsDetails = {},
_tokenUsage = {},
_tokenUsageSummary,
_tokenHistogram = {},
_wordCountHistogram = {},
_charCountHistogram = {}
;
/*** calculate metrics on resource strings ***/
Uize.forEach (
_stringsInfo,
function (_stringInfo) {
var
_value = _stringInfo.value,
_stringFullPath = _toStringPath (_stringInfo.path)
;
/*** update information on duplicates ***/
if (_valuesLookup [_value]) {
_totalDupedResourceStrings++;
(
_dupedResourceStringsDetails [_value] ||
(_dupedResourceStringsDetails [_value] = [_valuesLookup [_value]])
).push (_stringFullPath);
} else {
_valuesLookup [_value] = _stringFullPath;
}
/*** get metrics for string ***/
var
_stringMetrics = _stringInfo.metrics,
_isTranslatable = _stringInfo.isTranslatable,
_words = _isTranslatable * _stringMetrics.words,
_chars = _isTranslatable * _stringMetrics.chars,
_stringTokens = _stringMetrics.tokens,
_stringTokensLength = _stringTokens.length
;
_stringInfo.hasHtml && _totalHtmlResourceStrings++;
_stringInfo.isLong && _totalLongResourceStrings++;
_stringInfo.isKeyValid || _totalInvalidKeyResourceStrings++;
_stringInfo.hasWeakTokens && _totalWeakTokenResourceStrings++;
_stringInfo.isTranslatable || _totalNonTranslatableResourceStrings++;
/*** update general metrics ***/
_totalResourceStrings++;
_totalWordCount += _words;
_totalCharCount += _chars;
if (_stringInfo.isBrandSpecific) {
_totalBrandSpecificResourceStrings++;
_totalBrandSpecificWordCount += _words;
_totalBrandSpecificCharCount += _chars;
var _stringBrand = _stringInfo.brand;
if (_stringBrand) {
_totalResourceStringPerBrand [_stringBrand] =
(_totalResourceStringPerBrand [_stringBrand] || 0) + 1
;
_totalWordCountPerBrand [_stringBrand] =
(_totalWordCountPerBrand [_stringBrand] || 0) + _words
;
_totalCharCountPerBrand [_stringBrand] =
(_totalCharCountPerBrand [_stringBrand] || 0) + _chars
;
}
}
_wordCountHistogram [_words] = (_wordCountHistogram [_words] || 0) + 1;
_charCountHistogram [_chars] = (_charCountHistogram [_chars] || 0) + 1;
/*** update metrics on tokenized strings and token usage ***/
_tokenHistogram [_stringTokensLength] = (_tokenHistogram [_stringTokensLength] || 0) + 1;
if (_stringTokensLength) {
Uize.forEach (
_stringTokens,
function (_tokenName) {
(_tokenUsage [_tokenName] || (_tokenUsage [_tokenName] = [])).push (
_stringFullPath
);
}
);
_totalTokens += _stringTokensLength;
_totalTokenizedResourceStrings++;
}
}
);
/*** build token usage summary ***/
_tokenUsageSummary = Uize.Array.Sort.sortBy (
Uize.map (
Uize.keys (_tokenUsage),
function (_tokenName) {
var _stringsFoundInCount = _tokenUsage [_tokenName].length;
return {
name:_tokenName,
stringsFoundInCount:_stringsFoundInCount,
stringsFoundInPercent:_stringsFoundInCount / _totalResourceStrings * 100
};
}
),
'value.stringsFoundInCount',
-1
);
return {
resourceStrings:{
all:_totalResourceStrings,
brandSpecific:_totalBrandSpecificResourceStrings,
tokenized:_totalTokenizedResourceStrings,
html:_totalHtmlResourceStrings,
long:_totalLongResourceStrings,
invalidKey:_totalInvalidKeyResourceStrings,
weakTokens:_totalWeakTokenResourceStrings,
nonTranslatable:_totalNonTranslatableResourceStrings,
duped:_totalDupedResourceStrings,
perBrand:_totalResourceStringPerBrand
},
wordCount:{
all:_totalWordCount,
brandSpecific:_totalBrandSpecificWordCount,
perBrand:_totalWordCountPerBrand
},
charCount:{
all:_totalCharCount,
brandSpecific:_totalBrandSpecificCharCount,
perBrand:_totalCharCountPerBrand
},
tokens:_totalTokens,
dupedResourceStringsDetails:_dupedResourceStringsDetails,
tokenUsage:_tokenUsage,
tokenUsageSummary:_tokenUsageSummary,
tokenHistogram:_tokenHistogram,
wordCountHistogram:_wordCountHistogram,
charCountHistogram:_charCountHistogram
};
/*?
Static Methods
Uize.Loc.Strings.Metrics.getStringsMetrics
Returns a strings metrics object, containing metrics information produced by an analysis of the specified strings info array.
SYNTAX
..................................................................................
stringsMetricsOBJ = Uize.Loc.Strings.Metrics.getStringsMetrics (stringsInfoARRAY);
..................................................................................
*/
}
});
}
});