cilium

Форк
0
/
copybutton.js 
136 строк · 5.1 Кб
1
function runWhenDOMLoaded(cb) {
2
  if (document.readyState !== "loading") {
3
    cb();
4
  } else if (document.addEventListener) {
5
    document.addEventListener("DOMContentLoaded", cb);
6
  } else {
7
    document.attachEvent("onreadystatechange", function() {
8
      if (document.readyState == "complete") cb();
9
    });
10
  }
11
}
12

13
function codeCellId(index) {
14
  return "codecell" + index;
15
}
16

17
function clearSelection() {
18
  if (window.getSelection) {
19
    window.getSelection().removeAllRanges();
20
  } else if (document.selection) {
21
    document.selection.empty();
22
  }
23
}
24

25
function addCopyButtonToCodeCells() {
26
  if (window.ClipboardJS === undefined) {
27
    setTimeout(addCopyButtonToCodeCells, 1000);
28
    return;
29
  }
30
  const promptRegExp = /^\s*(\$|#)\s/;
31
  var codeCells = document.querySelectorAll(".rst-content pre");
32
  codeCells.forEach(function(codeCell, index) {
33
    var wrapper = document.createElement("div");
34
    wrapper.className = "code-wrapper";
35
    codeCell.parentNode.insertBefore(wrapper, codeCell);
36
    wrapper.appendChild(codeCell);
37
    var id = codeCellId(index);
38
    codeCell.setAttribute("id", id);
39
    function clipboardButton(id) {
40
      var lines = codeCell.textContent.trim().split("\n");
41
      var linesCount = lines.length;
42
      var buttonHtml = [];
43
      buttonHtml.push('<div class="copybutton-wrapper">');
44
      buttonHtml.push(
45
        '<img class="copy-icon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAMAAABF0y+mAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAACiUExURUdwTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJkEv5MAAAA1dFJOUwAwnr/H5BShnG3DCRPPm5OdyC4jGzHhB7o4AmkDyTJE1vn6ymWjbAHtTIQE6dwNoGH71I2zlJ78SQAAAI9JREFUKM/t0kcOwkAMhWGnTZhUOoQWeu8w979aJEDiOWhGOQD/wpL1LbwxER32ivUU9E0e6zXsngDOfWLJGBZVwl36i6H4FL3mCDGfeqygDegkFjYZ9wEbQ37ZVoCu5Oj/sSLaBnSCTjPUYSv2upkOqSeigRbJcPPdYs1xNYMlPbHvvWyXgOcHe/vbdUPmCj5KFX8s6tJBAAAAAElFTkSuQmCC" alt="" />'
46
      );
47
      buttonHtml.push(
48
        '<a class="copybutton" data-clipboard-mode="first-line" data-clipboard-target="#' +
49
          id +
50
          '">'
51
      );
52
      buttonHtml.push(linesCount > 1 ? "Copy First Line" : "Copy Line");
53
      buttonHtml.push("</a>");
54
      if (linesCount > 1) {
55
        /*
56
         * Add a button to print commands for literal and code blocks that may
57
         * have prompt symbols to distinguish the commands from their output.
58
         *
59
         * Add it to:
60
         * - "code-block" with language "shell-session", with a parent of class
61
         *   ".highlight-shell-session"
62
         * - Literal blocks ("::"), with a parent of class ".highlight-default"
63
         * - Parsed literal blocks, with a parent of class ".literal-block"
64
         *
65
         * Do not add it to a "code-block" with a language other than
66
         * "shell-session".
67
         */
68
        if (codeCell.closest(".highlight-shell-session") ||
69
            codeCell.closest(".highlight-default") ||
70
            codeCell.closest("literal-block")) {
71
          for (const l of lines) {
72
            /* Additionally, only add button if we find at least one command */
73
            if (promptRegExp.test(l)) {
74
              buttonHtml.push(
75
                '<a class="copybutton" data-clipboard-mode="commands"  data-clipboard-target="#' +
76
                  id +
77
                  '">'
78
              );
79
              buttonHtml.push("Copy Commands");
80
              buttonHtml.push("</a>");
81
              break;
82
            }
83
          }
84
        }
85

86
        buttonHtml.push(
87
          '<a class="copybutton" data-clipboard-mode="all"  data-clipboard-target="#' +
88
            id +
89
            '">'
90
        );
91
        buttonHtml.push("Copy All");
92
        buttonHtml.push("</a>");
93
      }
94
      buttonHtml.push("</div>");
95
      return buttonHtml.join("\n");
96
    }
97
    codeCell.insertAdjacentHTML("afterend", clipboardButton(id));
98
  });
99

100
  new ClipboardJS(".copybutton", {
101
    text: function(trigger) {
102
      var parent = trigger.parentNode.parentNode;
103
      var code = parent.querySelector("pre");
104
      var mode = trigger.getAttribute("data-clipboard-mode");
105
      if (mode === "first-line") {
106
        return code.textContent
107
          .split("\n")[0]
108
          .trim()
109
          .replace(/^\$/, "")
110
          .trim();
111
      } else if (mode === "commands") {
112
        /*
113
         * Copy lines with "commands": each line starting with a prompt symbol
114
         * ($ or #), plus the continuation lines, for commands ending with a
115
         * backslash.
116
         */
117
        var cmds = "";
118
        var continuation = false;
119
        var lines = code.textContent.split("\n");
120
        for (const l of lines) {
121
          if (promptRegExp.test(l) || continuation) {
122
            /* Keep line but remove prompt */
123
            cmds += l.replace(promptRegExp, "") + "\n";
124
            /* Expect a continuation line if command ends with a backslash */
125
            continuation = /\\\s*$/.test(l);
126
          }
127
        }
128
        return cmds;
129
      } else {
130
        return code.textContent;
131
      }
132
    }
133
  });
134
}
135

136
runWhenDOMLoaded(addCopyButtonToCodeCells);
137

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.