Add word count in document info modal (#738)

Co-authored-by: Tilman Vatteroth <git@tilmanvatteroth.de>
This commit is contained in:
Erik Michelson 2021-06-17 22:31:28 +02:00 committed by GitHub
parent 4b3990d0db
commit 57f46f489b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 242 additions and 9 deletions

View file

@ -0,0 +1,50 @@
/*
* SPDX-FileCopyrightText: 2021 The HedgeDoc developers (see AUTHORS file)
*
* SPDX-License-Identifier: AGPL-3.0-only
*/
import wordsCount from 'words-count'
/** List of HTML tag names that should not be counted. */
const EXCLUDED_TAGS = ['img', 'pre', 'nav']
/** List of class names that should not be counted. */
const EXCLUDED_CLASSES = ['katex-mathml']
/**
* Checks whether the given node is an excluded HTML tag and therefore should be
* excluded from counting.
* @param node The node to test.
* @return true if the node should be excluded, false otherwise.
*/
const isExcludedTag = (node: Element | ChildNode): boolean => {
return EXCLUDED_TAGS.includes(node.nodeName.toLowerCase())
}
/**
* Checks whether the given node is a HTML element with an excluded class name,
* so that it should be excluded.
* @param node The node to test.
* @return true if the node should be excluded, false otherwise.
*/
const isExcludedClass = (node: Element | ChildNode): boolean => {
return EXCLUDED_CLASSES.some((excludedClass) => (node as HTMLElement).classList?.contains(excludedClass))
}
/**
* Counts the words of the given node while ignoring empty nodes and excluded
* nodes. Child nodes will recursively counted as well.
* @param node The node whose content's words should be counted.
* @return The number of words counted in this node and its children.
*/
export const countWords = (node: Element | ChildNode): number => {
if (!node.textContent || isExcludedTag(node) || isExcludedClass(node)) {
return 0
}
if (!node.hasChildNodes()) {
return wordsCount(node.textContent)
}
return [...node.childNodes].reduce((words, childNode) => {
return words + countWords(childNode)
}, 0)
}