Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save chriscorwin/dd6d490896da96bdf46665c5c093af6f to your computer and use it in GitHub Desktop.
Save chriscorwin/dd6d490896da96bdf46665c5c093af6f to your computer and use it in GitHub Desktop.
javascript: (function() {
let repoName;
if (document.querySelectorAll('.public .author').length !== 0) {
repoName = document.querySelectorAll('.public .author')[0].textContent;
} else if (document.querySelectorAll('.private .author').length !== 0) {
repoName = document.querySelectorAll('.private .author')[0].textContent;
}
let repoAuthor = document.querySelectorAll('.gh-header-meta .author')[0].textContent;
let issueNumber = document.querySelectorAll('.gh-header-number')[0].textContent;
issueNumber = issueNumber.replace('#', '');
const title = document.querySelectorAll('.js-issue-title')[0].textContent.trim();
const replacements = [
{name: 'mdot', replacement: ['·', '']},
{name: 'dot', replacement: [/\./g, '']},
{name: 'midDot', replacement: [/%C2%B7/g, '']},
{name: 'spaceMidDot', replacement: [' %C2%B7 ', '']},
{name: 'author', replacement: [repoAuthor + '\/', '']},
{name: 'repoName', replacement: [repoName, '']},
{name: 'issueNum', replacement: ['Issue #', '']},
{name: 'rBracketSpace', replacement: ['] ', '___']},
{name: 'ampSpace', replacement: [/ \& /g, '_and_']},
{name: 'amp', replacement: [/\&/g, '/']},
{name: 'comma', replacement: [/,/g, '_']},
{name: 'colSpace', replacement: [/: /g, '--']},
{name: 'col', replacement: [/:/g, '--']},
{name: 'dashSpace', replacement: [/ %E2%80%93 /g, '--']},
{name: 'mdashSpace', replacement: [/ %E2%80%94 /g, '---']},
{name: 'dash', replacement: [/%E2%80%93/g, '--']},
{name: 'mdash', replacement: [/%E2%80%94/g, '---']},
{name: 'slash', replacement: [/\//g, '_or_']},
{name: 'percent', replacement: [/\%/g, '-percent']},
{name: 'quot', replacement: [/\"/g, '']},
{name: 'squot', replacement: [/\'/g, '']},
{name: 'tick', replacement: [/`/g, '']},
{name: 'lquot', replacement: [/%E2%80%9C/g, '']},
{name: 'rquot', replacement: [/%E2%80%9D/g, '']},
{name: 'lsquot', replacement: [/%E2%80%98/g, '']},
{name: 'rsquot', replacement: [/%E2%80%99/g, '']},
{name: 'lparen', replacement: [/\(/g, '']},
{name: 'rparen', replacement: [/\)/g, '']},
{name: 'lstash', replacement: [/\{/g, '']},
{name: 'rstash', replacement: [/\}/g, '']},
{name: 'lbracket', replacement: [/\[/g, '']},
{name: 'rbracket', replacement: [/\]/g, '']},
{name: 'at', replacement: [/@/g, '']},
{name: 'dolladolla', replacement: [/\$/g, '']},
{name: 'star', replacement: [/\*/g, '']},
{name: 'pound', replacement: [/\#/g, '']},
{name: 'bang', replacement: [/\!/g, '']},
{name: 'parendash', replacement: [/^([a-z0-9])-/i, '$1-']},
{name: 'space', replacement: [/ /g, '-']},
{name: 'dishuedash', replacement: ['--' + issueNumber + '--', '']},
{name: 'dishue', replacement: ['--' + issueNumber, '']},
];
let filteredTitle = title;
replacements.forEach((r) => {
filteredTitle = filteredTitle.replace(r.replacement[0], r.replacement[1]);
});
const formattedTitle = 'GH-' + issueNumber + '---' + filteredTitle.toLowerCase() || "would-be-a-title-if-there-was-one";
function promptForCopyToClipboard(text) {
window.prompt("Copy:", text);
}
let newDivForCopy = document.createElement("div");
let newContent = document.createTextNode(formattedTitle);
newDivForCopy.appendChild(newContent);
let showIssueDiv = document.getElementsByTagName('body')[0];
let newChildForCopying = showIssueDiv.appendChild(newDivForCopy);
let range = document.createRange();
range.selectNode(newChildForCopying);
window.getSelection().addRange(range);
try {
let successful = document.execCommand('copy');
let msg = successful ? 'successful' : 'unsuccessful';
console.log(`Copied new GitHub branch (${formattedTitle}) to clipboard.`);
} catch (err) {
console.log('Oops, unable to copy automatically, opening prompt.');
promptForCopyToClipboard(formattedTitle);
}
window.getSelection().removeAllRanges();
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment