// ==UserScript== // @name (Re)fork any gist, including your own // @namespace https://github.com/johan // @description Adds a "fork" button to gists missing one at gist.github.com, so you can create multiple forks // @match https://gist.github.com/* // @include https://gist.github.com/* // ==/UserScript== var resourceUri; // Only create the button on initial load and reuse on pjax reloads var reforkListItem = (function () { var li = document.createElement('li') , a = document.createElement('a') , sp = document.createElement('span'); a.className = 'minibutton fork-button'; // Apply button look and feel a.title = 'Create another fork of this gist'; // Set hover text // When clicked, append an http form for the uri/fork post and submit it a.addEventListener('click', function () { var f = document.body.appendChild(document.createElement('form')); f.method = 'POST'; f.action = resourceUri + '/fork'; f.appendChild(document.querySelector('input[name=authenticity_token]')); f.submit(); return false; }); sp.className = 'mini-icon mini-icon-fork';; // Apply the fork icon // Create the control tree li.appendChild(a); a.appendChild(sp); a.appendChild(document.createTextNode('(Re)Fork')); return li; })(); // If missing and appropriate, add in the fork button function injectForkButton() { var pageActions = document.querySelector('.pagehead-actions'); var resourceLink = document.querySelector('input[name="link-field"]'); // Only attempt to inject when on an actual gist url (https://gist.github.com/\d+) // and only when a '.pagehead-actions' element exists // and only when the 'input[name="link-field"]' element exists // and only when an existing '.fork-button' element is missing if (/*/^\/\d+/.test(location.pathname) &&*/ pageActions && resourceLink && !document.querySelector('.fork-button')) { resourceUri = resourceLink.getAttribute('value'); pageActions.appendChild(reforkListItem); // Leave logging in for a while to confirm expected behavior console.log('(Re)fork button injected'); } } // Initial page load injection injectForkButton(); // Dynamic injection after pjax load and subsequent dom update of '#js-pjax-container' // // Observe 'childList' changes to '#js-pjax-container' and rerun injectForkButton var target = document.querySelector('#js-pjax-container'); var JsMutationObserver = window.MutationObserver || window.WebKitMutationObserver; var observer = new JsMutationObserver(function (mutations) { console.log('pjax-container mutation - checking for fork button'); injectForkButton(); }); observer.observe(target, { childList: true }); // TODO: Is it necessary to call observer.disconnect()