summaryrefslogtreecommitdiffstats
path: root/themes/danix-xyz-hacker/assets/js/code-copy.js
blob: 8591436bf32d798362fe37589b50d43efff0fdd3 (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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
(function () {
  var LANG_NAMES = {
    bash: 'Shell', sh: 'Shell', shell: 'Shell', zsh: 'Shell',
    js: 'JavaScript', javascript: 'JavaScript',
    ts: 'TypeScript', typescript: 'TypeScript',
    go: 'Go',
    py: 'Python', python: 'Python',
    rs: 'Rust', rust: 'Rust',
    html: 'HTML',
    css: 'CSS',
    toml: 'TOML',
    yaml: 'YAML', yml: 'YAML',
    json: 'JSON',
    sql: 'SQL',
    md: 'Markdown', markdown: 'Markdown',
    c: 'C',
    cpp: 'C++', 'c++': 'C++',
    java: 'Java',
    php: 'PHP',
    ruby: 'Ruby', rb: 'Ruby',
    swift: 'Swift',
    kotlin: 'Kotlin', kt: 'Kotlin',
    dockerfile: 'Dockerfile',
    makefile: 'Makefile',
    text: 'Text', txt: 'Text',
  };

  function prettyName(lang) {
    if (!lang) return '';
    var key = lang.toLowerCase();
    return LANG_NAMES[key] || (lang.charAt(0).toUpperCase() + lang.slice(1));
  }

  function getCodeText(wrapper) {
    var el = wrapper.querySelector('.lntd:last-child code')
           || wrapper.querySelector('.code-body code')
           || wrapper.querySelector('.code-body pre');
    return el ? el.innerText : '';
  }

  function initBlock(wrapper) {
    var header = wrapper.querySelector('.code-header');
    if (header) {
      var label = wrapper.querySelector('.code-lang-label');
      if (label) label.textContent = prettyName(header.getAttribute('data-lang') || '');
    }

    var btn = wrapper.querySelector('[data-copy-target]');
    if (!btn) return;

    btn.addEventListener('click', function () {
      var text = getCodeText(wrapper);
      if (!text) return;

      navigator.clipboard.writeText(text).then(function () {
        var copyIcon   = btn.querySelector('.icon-copy');
        var checkIcon  = btn.querySelector('.icon-check');
        var liveRegion = wrapper.querySelector('.code-copy-status');
        if (copyIcon)   copyIcon.classList.add('hidden');
        if (checkIcon)  checkIcon.classList.remove('hidden');
        btn.classList.add('is-copied');
        if (liveRegion) liveRegion.textContent = 'Code copied to clipboard.';

        setTimeout(function () {
          if (copyIcon)   copyIcon.classList.remove('hidden');
          if (checkIcon)  checkIcon.classList.add('hidden');
          btn.classList.remove('is-copied');
          if (liveRegion) liveRegion.textContent = '';
        }, 2000);
      }).catch(function () {
        // silent fail for insecure contexts
      });
    });
  }

  document.addEventListener('DOMContentLoaded', function () {
    document.querySelectorAll('.code-block-wrapper').forEach(initBlock);
  });
})();