Skip to content

Instantly share code, notes, and snippets.

@saaj
Last active August 18, 2017 08:54
Show Gist options
  • Save saaj/fb58cfca7d682a4d3c8083239eafc174 to your computer and use it in GitHub Desktop.
Save saaj/fb58cfca7d682a4d3c8083239eafc174 to your computer and use it in GitHub Desktop.
This userscript converts between Jira markup and Markdown in Jira ticket textarea
// ==UserScript==
// @name Jira Markdown Converter
// @namespace https://gist.github.com/saaj/fb58cfca7d682a4d3c8083239eafc174
// @description This userscript converts between Jira markup and Markdown in Jira ticket textarea
// @version 0.1.2
// @author saaj
// @match https://*.atlassian.net/*
// ==/UserScript==
/**
* Subset of jira2md
* Copyright (c) Kyle Farris, Apache License v2
* https://github.com/kylefarris/J2M
*/
var J2M=function(){};J2M.prototype.to_markdown=function(e){return e.replace(/^[ \t]*(\*+)\s+/gm,function(e,r){return Array(r.length).join(" ")+"* "}).replace(/^[ \t]*(#+)\s+/gm,function(e,r){return Array(r.length).join(" ")+"1. "}).replace(/^h([0-6])\.(.*)$/gm,function(e,r,n){return Array(parseInt(r)+1).join("#")+n}).replace(/\*(\S.*)\*/g,"**$1**").replace(/\_(\S.*)\_/g,"*$1*").replace(/\{\{([^}]+)\}\}/g,"`$1`").replace(/\+([^+]*)\+/g,"<ins>$1</ins>").replace(/\^([^^]*)\^/g,"<sup>$1</sup>").replace(/~([^~]*)~/g,"<sub>$1</sub>").replace(/-(\S+.*?\S)-/g,"~~$1~~").replace(/\{code(:([a-z]+))?\}([^]*)\{code\}/gm,"```$2$3```").replace(/{noformat}/g,"```").replace(/\[([^|]+)\]/g,"<$1>").replace(/\[(.+?)\|(.+)\]/g,"[$1]($2)").replace(/^bq\.\s+/gm,"> ").replace(/\{color:[^}]+\}([^]*)\{color\}/gm,"$1").replace(/\{panel:title=([^}]*)\}\n?([^]*?)\n?\{panel\}/gm,"\n| $1 |\n| --- |\n| $2 |").replace(/^[ \t]*((?:\|\|.*?)+\|\|)[ \t]*$/gm,function(e,r){var n=r.replace(/\|\|/g,"|");return"\n"+n+"\n"+n.replace(/\|[^|]+/g,"| --- ")}).replace(/^[ \t]*\|/gm,"|")},J2M.prototype.to_jira=function(e){var r={cite:"??",del:"-",ins:"+",sup:"^",sub:"~"};return e.replace(/([*_]+)(\S.*?)\1/g,function(e,r,n){switch(r.length){case 1:return"_"+n+"_";case 2:return"*"+n+"*";case 3:return"_*"+n+"*_";default:return r+n*r}}).replace(/^([#]+)(.*?)$/gm,function(e,r,n){return"h"+r.length+"."+n}).replace(/^(.*?)\n([=-]+)$/gm,function(e,r,n){return"h"+("="===n[0]?1:2)+". "+r}).replace(/^([ \t]*)\d+\.\s+/gm,function(e,r){return Array(r.length+1).join("#")+"# "}).replace(/^([ \t]*)\*\s+/gm,function(e,r){return Array(r.length+1).join("*")+"* "}).replace(new RegExp("<("+Object.keys(r).join("|")+")>(.*?)</\\1>","g"),function(e,n,t){var c=r[n];return c+t+c}).replace(/~~(.*?)~~/g,"-$1-").replace(/`{3,}(\w+)?((?:\n|[^`])+)`{3,}/g,function(e,r,n){var t="{code";return r&&(t+=":"+r),t+"}"+n+"{code}"}).replace(/`([^`]+)`/g,"{{$1}}").replace(/\[([^\]]+)\]\(([^)]+)\)/g,"[$1|$2]").replace(/<([^>]+)>/g,"[$1]").replace(/^>/gm,"bq.").replace(/^\n((?:\|.*?)+\|)[ \t]*\n((?:\|\s*?\-{3,}\s*?)+\|)[ \t]*\n((?:(?:\|.*?)+\|[ \t]*\n)*)$/gm,function(e,r,n,t){var c=r.match(/[^|]+(?=\|)/g),a=n.match(/[^|]+(?=\|)/g);return c.length!==a.length?e:2===t.split("\n").length&&1===c.length?"{panel:title="+c[0].trim()+"}\n"+t.replace(/^\|(.*)[ \t]*\|/,"$1").trim()+"\n{panel}\n":"||"+c.join("||")+"||\n"+t})};
var markdownImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAATtJREFUWIXt1r1KA1EQBeAvMZUIgpY2ol0a8QesfQ+ttPMZbH0BnyBvobWNrZJYWaTwAUQQBdG1yBXW5V53szGJxR4Y2L1zdubM3bk/NGjQgB308YlshtbHtvAwy8Q/RLRC5a1Jp7EuWkFJXeSrWagToJ0QlbdehNMLvnZI3KkQJ4nifyliEYOcfxDGxo2T6oPSD6GLl2DdmoVEBcSmLoZ7nOae/wyxJqy7IsriRGc31oQzRRUBx5GxkwT3ULrrv8ePio6y5nnFbu59D28RXoYnrCfEwQaei/mqdO8Qq8GGv/AyXItvSh3cxPJVXT6XuKrAy3AW8Z9Hco0lYBzeO/ZzvgN8TENAfjsu+h+whBU8puLENqKqh1MZbxMXWMZaijTpaTgx2kaHy7xwx+haNI9b0S22pl5igwb/Hl/Theg0MJwuZQAAAABJRU5ErkJggg%3D%3D';
var jiraImage = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABX1BMVEUAAAAkSG0fP38cVHEmTHIiRXMhTW4qSnQkSHIjR3AnSXAmSG4lRnElSm8kSHEmSG4lSm8kSHElSW8lR28lSW8lSXAlSW4mSG8mSXAmSW8kR3AlSG8mSHAmR24kSW4lR28mSXAkR24kSXAmR3AmR24mSW8mSXAoSnEpTHItT3QuT3UvUXYyU3gzVHg0VHk2V3s3V3s4WHw5WXw7W348XH8/XoBCYYNFY4RFY4VHZYZLaIhQbItadZJdd5RfeZZie5dogZxpgZxqgp1thJ9xiKF2jKV5j6d+k6p/lKuEmK6KnbKNn7SRo7eSpLeXqLuZqbybq72hsMGntcWotsaquMeruMeyvsy3ws+9yNTBy9bDzdjGz9nU2+Ld4unf5Org5erh5uvi5+zj5+zp7PDr7/Ls7/Pu8fTx8/Xx9Pby9Pf19vj3+fr4+fv5+vv6+/z7+/z8/P38/f39/v7+/v7///8xyKpHAAAAJnRSTlMABwgJFBYXGDEyNDU2Nzg8Pj9lZ3l6pKWmp6iprOTm5/Hy8/X290bEoEkAAAFESURBVBgZvcH3O0IBFAbgE4Vo0NJSKF9ZJbJX9t4je++Qcf7/h+65Nw0/975UYdVNdqfT3lhF/7N4O6AIe8xUrsaPAj4DlWgIokjASEUa2lGizUgFaoNQLS9BFTDQHz8U+2u4OsfGLhQ+yrNAXB+hP4GTCwgTabzI6e+ORvArEu2NI6eZVNUdyFnMHMf65ubiydP3WeSEdCSaoBj85O3E82P8gDMxKKwk7BB7/DUzPbXAvAVhI+GE6Lnk18lUls86IRwknFAN3/Fblm+SUDlI2KEZe2C+HYLGRqIRmq7xJ74fgMZKoioMVXpn8oPTUIV0pPJAjDJPbPH3CISLNGaIVX7pjH/yCkQ95fmgmD9cBzYPUlC46Y8hgDIteipgbEOJ1joqYgygSEsdlTD4UMCtp3Km5hAUIVc9/U9ntTkcNquOKusH51hcdcnP68QAAAAASUVORK5CYII%3D';
function poll(selector, callback)
{
setInterval(function()
{
var element = document.querySelector(selector);
if(element && !element.dataset.rendered)
{
element.dataset.rendered = true;
callback(element);
}
}, 500);
}
function render(element)
{
var textarea = element.parentNode.parentNode.querySelector('textarea');
var j2m = new J2M();
var toMarkdown = document.createElement('input');
toMarkdown.type = 'image';
toMarkdown.src = markdownImage;
toMarkdown.height = '19';
toMarkdown.style.verticalAlign = 'text-top';
var toJira = document.createElement('input');
toJira.type = 'image';
toJira.src = jiraImage;
toJira.height = '18';
toJira.style.verticalAlign = 'text-top';
element.appendChild(toMarkdown);
toMarkdown.addEventListener('click', function(event)
{
event.preventDefault();
textarea.value = j2m.to_markdown(textarea.value);
});
element.appendChild(toJira);
toJira.addEventListener('click', function(event)
{
event.preventDefault();
textarea.value = j2m.to_jira(textarea.value);
});
}
poll('.field-tools', render);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment