mirror of
https://github.com/hedgedoc/hedgedoc.git
synced 2025-05-22 19:25:18 -04:00
fix: Move content into to frontend directory
Doing this BEFORE the merge prevents a lot of merge conflicts. Signed-off-by: Tilman Vatteroth <git@tilmanvatteroth.de>
This commit is contained in:
parent
4e18ce38f3
commit
762a0a850e
1051 changed files with 0 additions and 35 deletions
53
frontend/src/components/render-page/word-counter.ts
Normal file
53
frontend/src/components/render-page/word-counter.ts
Normal file
|
@ -0,0 +1,53 @@
|
|||
/*
|
||||
* SPDX-FileCopyrightText: 2022 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 {@link true} if the node should be excluded, {@link 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 {@link true} if the node should be excluded, {@link 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 be 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)
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue