diff --git a/.gitignore b/.gitignore index 6dfeca7..a6de6a8 100755 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ build/Release node_modules .DS_Store +.vscode/settings.json diff --git a/index.js b/index.js index 3b89620..323c70b 100755 --- a/index.js +++ b/index.js @@ -35,6 +35,38 @@ class J2M { static to_markdown(str) { return ( str + // jira emoticons https://confluence.atlassian.com/doc/files/136870/947169184/1/1521512577368/Emoticons.png + .replace(/:\)/g, '😊') + .replace(/:\(/g, 'â˜šī¸') + .replace(/:p/g, '😛') + .replace(/:P/g, '😛') + .replace(/:D/g, '😀') + .replace(/;\)/g, '😉') + + .replace(/\(y\)/g, '👍') + .replace(/\(n\)/g, '👎') + .replace(/\(on\)/g, '(ON)') + .replace(/\(off\)/g, '(OFF)') + .replace(/\(!\)/g, 'âš ī¸') + + .replace(/\(\*\)/g, '⭐') + .replace(/\(\*r\)/g, '⭐(red)') + .replace(/\(\*g\)/g, '⭐(green)') + .replace(/\(\*b\)/g, '⭐(blue)') + .replace(/\(\*y\)/g, '⭐(yellow)') + + .replace(/\(\/\)/g, '✅') + .replace(/\(x\)/g, '❌') + .replace(/\(i\)/g, 'â„šī¸') + .replace(/\(\+\)/g, '➕') + .replace(/\(-\)/g, '➖') + + .replace(/\(\?\)/g, '❓') + .replace(/<3/g, 'â¤ī¸') + .replace(/<\/3/g, '💔') + + .replace(/\(flag\)/g, '🚩') + .replace(/\(flagoff\)/g, 'đŸŗī¸') // Un-Ordered Lists .replace(/^[ \t]*(\*+)\s+/gm, (match, stars) => { return `${Array(stars.length).join(' ')}* `; @@ -73,7 +105,16 @@ class J2M { // Un-named Links .replace(/\[([^|]+?)\]/g, '<$1>') // Images - .replace(/!(.+)!/g, '![]($1)') + // .replace(/!(.+)!/g, '![]($1)') + .replace(/!([^|!]+)\|?(.*)!/g, ($1, $2, $3) => { + let size = ''; + if ($3 === 'thumbnail') { + size = '|200'; + } else if ($3.includes('width=') && $3.includes('height=')) { + size = $3.replace(/width=(\d+),height=(\d+)/g, '|$1x$2'); + } + return `![${size}](${$2})`; + }) // Named Links .replace(/\[(.+?)\|(.+?)\]/g, '[$1]($2)') // Single Paragraph Blockquote @@ -189,12 +230,54 @@ class J2M { .replace(/`([^`]+)`/g, '{{$1}}') // Images .replace(/!\[[^\]]*\]\(([^)]+)\)/g, '!$1!') + // TODO: enable transformation of size-information + // .replace(/!([^|!]+)\|?(.*)!/g, ($1, $2, $3) => { + // let size = ''; + // if ($3 === 'thumbnail') { + // size = '|200'; + // } else if ($3.includes('width=') && $3.includes('height=')) { + // size = $3.replace(/width=(\d+),height=(\d+)/g, '|$1x$2'); + // } + // return `![${size}](${$2})`; + // }) // Named Link .replace(/\[([^\]]+)\]\(([^)]+)\)/g, '[$1|$2]') // Un-Named Link .replace(/<([^>]+)>/g, '[$1]') // Single Paragraph Blockquote .replace(/^>/gm, 'bq.') + // Jira emoticons https://confluence.atlassian.com/doc/files/136870/947169184/1/1521512577368/Emoticons.png + // TODO: test the following + .replace('😊', ':') + .replace('â˜šī¸', ':') + .replace('😛', ':p') + .replace('😀', ':D') + .replace('😉', ';)') + + .replace('👍', '(y)') + .replace('👎', '(n)') + .replace('(ON)', '(on)') + .replace('(OFF)', '(off)') + .replace('âš ī¸', '(!)') + + .replace('⭐', '(*)') + .replace('⭐(red)', '(*r)') + .replace('⭐(green)', '(*)') + .replace('⭐(blue)', '(*b)') + .replace('⭐(yellow)', '(*y)') + + .replace('✅', '(/)') + .replace('❌', '(x)') + .replace('â„šī¸', '(i)') + .replace('➕', '(+)') + .replace('➖', '(-)') + + .replace('❓', '(?)') + .replace('â¤ī¸', '<3') + .replace('💔', '<3') + + .replace('🚩', '(flag)') + .replace('đŸŗī¸', '(flagoff)') ); } }