您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Choose your favorite DOM node and its content will be automatically copied to the clipboard in markdown format
当前为
- // ==UserScript==
- // @name ivnote-web-clipper
- // @version 0.4
- // @description Choose your favorite DOM node and its content will be automatically copied to the clipboard in markdown format
- // @author Ivan Jiang
- // @match *://*/*
- // @grant GM_addStyle
- // @require //cdn.bootcss.com/to-markdown/3.0.3/to-markdown.min.js
- // @namespace http://ivnote.xyz
- // ==/UserScript==
- /* globals GM_addStyle */
- GM_addStyle(` .ivnote-hover { background: rgba(124, 201, 191, .7); }
- .ivnote-web-clipper-icon {
- position: fixed; bottom: 15px; right: 15px;
- height: 50px; width: 50px; border-radius: 50%;
- background: RGBA(124, 201, 191, .6) url('//github.com/iplus26/ivnote/blob/master/toggle-icon.png') no-repeat center center / 80%;
- opacity: .7; cursor: pointer;
- transition: all .3s ease-in-out;
- z-index: 9999;
- }
- .ivnote-web-clipper-icon.ivnote-web-clipper-enable {
- opacity: 1; transform: rotate(180deg);
- right: 50px;
- }
- .ivnote-web-clipper-icon:hover {
- opacity: 1;
- transform: rotate(180deg)
- }`);
- (function() {
- 'use strict';
- // Utils =========================================================================
- var classCache = {};
- var _ = {
- hasClass: hasClass,
- addClass: addClass,
- removeClass: removeClass,
- };
- function hasClass(node, name) {
- if (!name) {
- return false;
- }
- return classRE(name).test(className(node));
- }
- function addClass(node, name) {
- if (!name) {
- return node;
- }
- if (!('className' in node)) {
- return;
- }
- var classList = [];
- var cls = className(node); // get node's className
- name.split(/\s+/g).forEach(function(klass) {
- if (!hasClass(node, klass)) {
- classList.push(klass);
- }
- });
- return classList.length && className(node, cls + (cls ? ' ' : '') + classList.join(' '));
- }
- function removeClass(node, name) {
- if (!('className' in node)) {
- return;
- }
- if (name === undefined) {
- return className(node, '');
- }
- let cls = className(node);
- name.split(/\s+/g)
- .forEach((klass) => cls = cls.replace(classRE(klass), ' '));
- className(node, cls.trim());
- }
- function classRE(name) {
- return name in classCache ?
- classCache[name] : (classCache[name] = new RegExp('(^|\\s)' + name + '(\\s|$)'));
- }
- // access className property while respecting SVGAnimatedString
- function className(el, value) {
- var klass = el.className || '',
- svg = klass && klass.baseVal !== undefined;
- // get className
- if (value === undefined) {
- return svg ? klass.baseVal : klass;
- }
- // set className
- return svg ? (klass.baseVal = value) : (el.className = value);
- }
- // Toggle icon =====================================================================
- var toggle = document.createElement('div');
- toggle.className = "ivnote-web-clipper-icon";
- document.body.appendChild(toggle);
- var enable = false;
- toggle.addEventListener('click', function(e) {
- if (_.hasClass(toggle, 'ivnote-web-clipper-enable')) {
- // turn it off
- _.removeClass(toggle, 'ivnote-web-clipper-enable');
- enable = false;
- } else {
- // turn it on
- _.addClass(toggle, 'ivnote-web-clipper-enable');
- enable = true;
- }
- e.stopPropagation();
- });
- // Manipulate the doms ==============================================================
- document.addEventListener('mouseover', function(e) {
- if (enable) _.addClass(e.target, 'ivnote-hover');
- });
- document.addEventListener('mouseout', function(e) {
- if (enable) {
- _.removeClass(e.target, 'ivnote-hover');
- // To be safe
- var select = document.querySelectorAll('.ivnote-hover');
- Array.prototype.slice.call(select).forEach(function(el) { _.removeClass(el, 'ivnote-hover'); });
- }
- });
- document.addEventListener('click', function(e) {
- if (enable) {
- var el = e.target;
- var markdown = '*The note is clipped from [here](' + location.href + ').*\n\n' +
- (document.title ? '#' + document.title + '\n\n' : '') +
- toMarkdown(el.outerHTML, { converters: [{
- filter: 'div',
- replacement: function(content) { return '\n' + content + '\n'; }
- }, {
- filter: 'span',
- replacement: function(content) { return content; }
- }]});
- copyTextToClipboard(markdown);
- }
- });
- // Copy to the clipboard ============================================================
- // Copyright (c) Dean Taylor. Original post: http://stackoverflow.com/a/30810322/4158282
- function copyTextToClipboard(text) {
- var textArea = document.createElement("textarea");
- textArea.style.position = 'fixed';
- textArea.style.top = 0;
- textArea.style.left = 0;
- textArea.style.width = '2em';
- textArea.style.height = '2em';
- textArea.style.padding = 0;
- textArea.style.border = 'none';
- textArea.style.outline = 'none';
- textArea.style.boxShadow = 'none';
- textArea.style.background = 'transparent';
- textArea.value = text;
- document.body.appendChild(textArea);
- textArea.select();
- try {
- var successful = document.execCommand('copy');
- var msg = successful ? 'successful' : 'unsuccessful';
- console.log('Copying text command was ' + msg);
- } catch (err) {
- console.log('Oops, unable to copy');
- }
- document.body.removeChild(textArea);
- }
- })();