mirror of
https://github.com/iib0011/omni-tools.git
synced 2025-09-20 22:49:33 +02:00
109 lines
2.8 KiB
TypeScript
109 lines
2.8 KiB
TypeScript
import { InitialValuesType } from './types';
|
|
import { TopItemsList } from '../../list/find-most-popular/service';
|
|
|
|
function countLines(text: string, options: InitialValuesType): number {
|
|
const numberofLines = options.emptyLines
|
|
? text.split('\n').length
|
|
: text.split('\n').filter((line) => line.trim() !== '').length;
|
|
|
|
return numberofLines;
|
|
}
|
|
|
|
function countCharacters(text: string): number {
|
|
return text.length;
|
|
}
|
|
|
|
function countSentences(text: string, options: InitialValuesType): number {
|
|
const sentenceDelimiters = options.sentenceDelimiters
|
|
? options.sentenceDelimiters.split(',').map((s) => s.trim())
|
|
: ['.', '!', '?', '...'];
|
|
|
|
const regex = new RegExp(`[${sentenceDelimiters.join('')}]`, 'g');
|
|
const sentences = text
|
|
.split(regex)
|
|
.filter((sentence) => sentence.trim() !== '');
|
|
return sentences.length;
|
|
}
|
|
|
|
function wordsStats(
|
|
text: string,
|
|
options: InitialValuesType
|
|
): [number, string] {
|
|
const defaultDelimiters = `\\s.,;:!?"“”«»()…`;
|
|
const wordDelimiters = options.wordDelimiters || defaultDelimiters;
|
|
const regex = new RegExp(`[${wordDelimiters}]`, 'gu');
|
|
const words = text.split(regex).filter((word) => word.trim() !== '');
|
|
|
|
const wordsFrequency = TopItemsList(
|
|
'regex',
|
|
'count',
|
|
'percentage',
|
|
'',
|
|
words,
|
|
false,
|
|
true,
|
|
false
|
|
);
|
|
|
|
return options.wordCount
|
|
? [words.length, wordsFrequency]
|
|
: [words.length, ''];
|
|
}
|
|
|
|
function countParagraphs(text: string): number {
|
|
return text
|
|
.split(/\r?\n\s*\r?\n/)
|
|
.filter((paragraph) => paragraph.trim() !== '').length;
|
|
}
|
|
|
|
function charactersStatistic(text: string, options: InitialValuesType): string {
|
|
if (!options.characterCount) return '';
|
|
const result = TopItemsList(
|
|
'symbol',
|
|
'count',
|
|
'percentage',
|
|
'',
|
|
text,
|
|
true,
|
|
true,
|
|
false
|
|
);
|
|
return result;
|
|
}
|
|
|
|
export function textStatistics(
|
|
input: string,
|
|
options: InitialValuesType
|
|
): string {
|
|
if (!input) return '';
|
|
|
|
const numberofLines = countLines(input, options);
|
|
const numberofCharacters = countCharacters(input);
|
|
const numberofSentences = countSentences(input, options);
|
|
const [numberofWords, wordsFrequency] = wordsStats(input, options);
|
|
const numberofParagraphs = countParagraphs(input);
|
|
const characterStats = charactersStatistic(input, options);
|
|
|
|
const stats = `Text Statistics
|
|
==================
|
|
Characters: ${numberofCharacters}
|
|
Words: ${numberofWords}
|
|
Lines: ${numberofLines}
|
|
Sentences: ${numberofSentences}
|
|
Paragraphs: ${numberofParagraphs}`;
|
|
|
|
const charStats = `Characters Frequency
|
|
==================
|
|
${characterStats}`;
|
|
|
|
const wordStatsOutput = `Words Frequency
|
|
==================
|
|
${wordsFrequency}`;
|
|
|
|
let result = stats;
|
|
if (options.wordCount) result += `\n\n${wordStatsOutput}`;
|
|
if (options.characterCount) result += `\n\n${charStats}`;
|
|
|
|
return result;
|
|
}
|