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

index.js « utils « code_navigation « javascripts « assets « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 46038df2f864e3719661bbb3199abc9a57f71512 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import { wrapNodes, isTextNode } from './dom_utils';

export const cachedData = new Map();

export const getCurrentHoverElement = () => cachedData.get('current');
export const setCurrentHoverElement = (el) => cachedData.set('current', el);

export const addInteractionClass = ({ path, d, wrapTextNodes }) => {
  const lineNumber = d.start_line + 1;
  const lines = document
    .querySelector(`[data-path="${path}"]`)
    .querySelectorAll(`.blob-content #LC${lineNumber}, .line_content:not(.old) #LC${lineNumber}`);
  if (!lines?.length) return;

  lines.forEach((line) => {
    let charCount = 0;

    if (wrapTextNodes) {
      line.childNodes.forEach((elm) => {
        if (isTextNode(elm)) {
          // Highlight.js does not wrap all text nodes by default
          // We need all text nodes to be wrapped in order to append code nav attributes
          elm.replaceWith(...wrapNodes(elm.textContent));
        }
      });
    }

    const el = [...line.childNodes].find(({ textContent }) => {
      if (charCount === d.start_char) return true;
      charCount += textContent.length;
      return false;
    });

    if (el && !isTextNode(el)) {
      el.dataset.charIndex = d.start_char;
      el.dataset.lineIndex = d.start_line;
      el.classList.add('cursor-pointer', 'code-navigation', 'js-code-navigation');
      el.closest('.line').classList.add('code-navigation-line');
    }
  });
};