Add copy button to markdown code blocks (#17638)
* Add copy button to markdown code blocks Done mostly in JS because I think it's better not to try getting buttons past the markup sanitizer. * add svg module tests * fix sanitizer regexp * remove outdated comment * vertically center button in issue comments as well * add comment to css * fix undefined on view file line copy * combine animation less files * Update modules/markup/markdown/markdown.go Co-authored-by: wxiaoguang <wxiaoguang@gmail.com> * add test for different sizes * add cloneNode and add tests for it * use deep clone * remove useless optional chaining * remove the svg node cache * unify clipboard copy string and i18n * remove unused var * remove unused localization * minor css tweaks to the button * comment tweak * remove useless attribute Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>tokarchuk/v1.17
parent
d789670894
commit
23bd7b1211
@ -0,0 +1,16 @@ |
|||||||
|
import {svg} from '../svg.js'; |
||||||
|
|
||||||
|
export function renderCodeCopy() { |
||||||
|
const els = document.querySelectorAll('.markup .code-block code'); |
||||||
|
if (!els.length) return; |
||||||
|
|
||||||
|
const button = document.createElement('button'); |
||||||
|
button.classList.add('code-copy', 'ui', 'button'); |
||||||
|
button.innerHTML = svg('octicon-copy'); |
||||||
|
|
||||||
|
for (const el of els) { |
||||||
|
const btn = button.cloneNode(true); |
||||||
|
btn.setAttribute('data-clipboard-text', el.textContent); |
||||||
|
el.after(btn); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,7 @@ |
|||||||
|
import {svg} from './svg.js'; |
||||||
|
|
||||||
|
test('svg', () => { |
||||||
|
expect(svg('octicon-repo')).toStartWith('<svg'); |
||||||
|
expect(svg('octicon-repo', 16)).toInclude('width="16"'); |
||||||
|
expect(svg('octicon-repo', 32)).toInclude('width="32"'); |
||||||
|
}); |
@ -0,0 +1,32 @@ |
|||||||
|
.markup .code-block { |
||||||
|
position: relative; |
||||||
|
} |
||||||
|
|
||||||
|
.markup .code-copy { |
||||||
|
position: absolute; |
||||||
|
top: 8px; |
||||||
|
right: 6px; |
||||||
|
padding: 9px; |
||||||
|
visibility: hidden; |
||||||
|
animation: fadeout .2s both; |
||||||
|
} |
||||||
|
|
||||||
|
/* adjustments for comment content having only 14px font size */ |
||||||
|
.repository.view.issue .comment-list .comment .markup .code-copy { |
||||||
|
right: 5px; |
||||||
|
padding: 8px; |
||||||
|
} |
||||||
|
|
||||||
|
/* can not use regular transparent button colors for hover and active states because |
||||||
|
we need opaque colors here as code can appear behind the button */ |
||||||
|
.markup .code-copy:hover { |
||||||
|
background: var(--color-secondary) !important; |
||||||
|
} |
||||||
|
.markup .code-copy:active { |
||||||
|
background: var(--color-secondary-dark-1) !important; |
||||||
|
} |
||||||
|
|
||||||
|
.markup .code-block:hover .code-copy { |
||||||
|
visibility: visible; |
||||||
|
animation: fadein .2s both; |
||||||
|
} |
Loading…
Reference in new issue