Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/assets/javascripts/code_navigation/utils/dom_utils.js')
-rw-r--r--app/assets/javascripts/code_navigation/utils/dom_utils.js31
1 files changed, 31 insertions, 0 deletions
diff --git a/app/assets/javascripts/code_navigation/utils/dom_utils.js b/app/assets/javascripts/code_navigation/utils/dom_utils.js
new file mode 100644
index 00000000000..1a65c1a64a2
--- /dev/null
+++ b/app/assets/javascripts/code_navigation/utils/dom_utils.js
@@ -0,0 +1,31 @@
+const TEXT_NODE = 3;
+
+const isTextNode = ({ nodeType }) => nodeType === TEXT_NODE;
+
+const isBlank = (str) => !str || /^\s*$/.test(str);
+
+const isMatch = (s1, s2) => !isBlank(s1) && s1.trim() === s2.trim();
+
+const createSpan = (content) => {
+ const span = document.createElement('span');
+ span.innerText = content;
+ return span;
+};
+
+const wrapSpacesWithSpans = (text) => text.replace(/ /g, createSpan(' ').outerHTML);
+
+const wrapTextWithSpan = (el, text) => {
+ if (isTextNode(el) && isMatch(el.textContent, text)) {
+ const newEl = createSpan(text.trim());
+ el.replaceWith(newEl);
+ }
+};
+
+const wrapNodes = (text) => {
+ const wrapper = createSpan();
+ wrapper.innerHTML = wrapSpacesWithSpans(text);
+ wrapper.childNodes.forEach((el) => wrapTextWithSpan(el, text));
+ return wrapper.childNodes;
+};
+
+export { wrapNodes, isTextNode };