v-md-editor
Version:
A markdown editor built on Vue
62 lines (61 loc) • 2.54 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.default = createCopyCodePreview;
var _copyToClipboard = _interopRequireDefault(require("copy-to-clipboard"));
function isCopyButton(el) {
return el.classList.contains('v-md-copy-code-btn');
}
function findCodeWrapperEl(el) {
if (el.classList.contains('v-md-pre-wrapper')) {
return el;
}
return findCodeWrapperEl(el.parentNode);
}
function getPreviewEl(el) {
var previewElClass = 'v-md-editor-preview';
return el.classList.contains(previewElClass) ? el : el.querySelector("." + previewElClass);
}
var timerId = null;
function createCopyCodePreview() {
return {
install: function install(VMdEditor) {
if (!VMdEditor.mixins) VMdEditor.mixins = [];
VMdEditor.mixins.push({
emits: ['copy-code-success'],
mounted: function mounted() {
var _this = this;
this.$nextTick(function () {
var previewEl = getPreviewEl(_this.$el);
previewEl.addEventListener('click', _this.handleCopyCodeClick);
});
},
beforeUnmount: function beforeUnmount() {
var previewEl = getPreviewEl(this.$el);
previewEl.removeEventListener('click', this.handleCopyCodeClick);
},
methods: {
handleCopyCodeClick: function handleCopyCodeClick(_ref) {
var target = _ref.target;
if (isCopyButton(target)) {
var codeWrapper = findCodeWrapperEl(target.parentNode);
if (codeWrapper && timerId === null) {
var code = codeWrapper.querySelector('code').innerText;
var domI = target.getElementsByTagName("i")[0];
var svgCopy = domI.innerHTML;
var svgSuccess = '<svg viewBox="0 0 1024 1024" focusable="false" data-icon="copy" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M375.552 754.995L130.15 498.227a38.4 38.4 0 0 0-55.5 53.043l272.588 285.236a38.4 38.4 0 0 0 54.99 0.563L902.4 334.285a38.4 38.4 0 0 0-54.528-54.221l-472.371 474.88z" p-id="18613"></path></svg>';
(0, _copyToClipboard.default)(code);
domI.innerHTML = svgSuccess;
timerId = setTimeout(function () {
domI.innerHTML = svgCopy;
timerId = null;
}, 2000);
this.$emit('copy-code-success', code);
}
}
}
}
});
}
};
}