mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Add Mermaid copy button, avoid unnecessary tooltip hide (#22225)
- Add Copy button to mermaid diagrams which copies their source. - Set tippy to not hide on click and avoid tooltip re-creation for temporary tooltips. This avoids hide and show when copying repo url. Popovers still hide the tooltip as usual. <img width="815" alt="Screenshot 2022-12-23 at 14 02 32" src="https://user-images.githubusercontent.com/115237/209341696-98e30953-f246-46d9-9157-2ececfd791c9.png"> Co-authored-by: Lauris BH <lauris@nix.lv> Co-authored-by: KN4CK3R <admin@oldschoolhack.me>
This commit is contained in:
		@@ -1,15 +1,18 @@
 | 
				
			|||||||
import {svg} from '../svg.js';
 | 
					import {svg} from '../svg.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function makeCodeCopyButton() {
 | 
				
			||||||
 | 
					  const button = document.createElement('button');
 | 
				
			||||||
 | 
					  button.classList.add('code-copy', 'ui', 'button');
 | 
				
			||||||
 | 
					  button.innerHTML = svg('octicon-copy');
 | 
				
			||||||
 | 
					  return button;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function renderCodeCopy() {
 | 
					export function renderCodeCopy() {
 | 
				
			||||||
  const els = document.querySelectorAll('.markup .code-block code');
 | 
					  const els = document.querySelectorAll('.markup .code-block code');
 | 
				
			||||||
  if (!els.length) return;
 | 
					  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) {
 | 
					  for (const el of els) {
 | 
				
			||||||
    const btn = button.cloneNode(true);
 | 
					    const btn = makeCodeCopyButton();
 | 
				
			||||||
    btn.setAttribute('data-clipboard-text', el.textContent);
 | 
					    btn.setAttribute('data-clipboard-text', el.textContent);
 | 
				
			||||||
    el.after(btn);
 | 
					    el.after(btn);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,6 @@
 | 
				
			|||||||
import {isDarkTheme} from '../utils.js';
 | 
					import {isDarkTheme} from '../utils.js';
 | 
				
			||||||
 | 
					import {makeCodeCopyButton} from './codecopy.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const {mermaidMaxSourceCharacters} = window.config;
 | 
					const {mermaidMaxSourceCharacters} = window.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const iframeCss = `
 | 
					const iframeCss = `
 | 
				
			||||||
@@ -58,7 +60,13 @@ export async function renderMermaid() {
 | 
				
			|||||||
        iframe.sandbox = 'allow-scripts';
 | 
					        iframe.sandbox = 'allow-scripts';
 | 
				
			||||||
        iframe.style.height = `${Math.ceil(parseFloat(heightStr))}px`;
 | 
					        iframe.style.height = `${Math.ceil(parseFloat(heightStr))}px`;
 | 
				
			||||||
        iframe.srcdoc = `<html><head><style>${iframeCss}</style></head><body>${svgStr}</body></html>`;
 | 
					        iframe.srcdoc = `<html><head><style>${iframeCss}</style></head><body>${svgStr}</body></html>`;
 | 
				
			||||||
        el.closest('pre').replaceWith(iframe);
 | 
					        const mermaidBlock = document.createElement('div');
 | 
				
			||||||
 | 
					        mermaidBlock.classList.add('mermaid-block');
 | 
				
			||||||
 | 
					        mermaidBlock.append(iframe);
 | 
				
			||||||
 | 
					        const btn = makeCodeCopyButton();
 | 
				
			||||||
 | 
					        btn.setAttribute('data-clipboard-text', source);
 | 
				
			||||||
 | 
					        mermaidBlock.append(btn);
 | 
				
			||||||
 | 
					        el.closest('pre').replaceWith(mermaidBlock);
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    } catch (err) {
 | 
					    } catch (err) {
 | 
				
			||||||
      displayError(el, err);
 | 
					      displayError(el, err);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,6 +6,7 @@ export function createTippy(target, opts = {}) {
 | 
				
			|||||||
    placement: target.getAttribute('data-placement') || 'top-start',
 | 
					    placement: target.getAttribute('data-placement') || 'top-start',
 | 
				
			||||||
    animation: false,
 | 
					    animation: false,
 | 
				
			||||||
    allowHTML: false,
 | 
					    allowHTML: false,
 | 
				
			||||||
 | 
					    hideOnClick: false,
 | 
				
			||||||
    interactiveBorder: 30,
 | 
					    interactiveBorder: 30,
 | 
				
			||||||
    ignoreAttributes: true,
 | 
					    ignoreAttributes: true,
 | 
				
			||||||
    maxWidth: 500, // increase over default 350px
 | 
					    maxWidth: 500, // increase over default 350px
 | 
				
			||||||
@@ -46,7 +47,7 @@ export function showTemporaryTooltip(target, content) {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  tippy.setContent(content);
 | 
					  tippy.setContent(content);
 | 
				
			||||||
  tippy.show();
 | 
					  if (!tippy.state.isShown) tippy.show();
 | 
				
			||||||
  tippy.setProps({
 | 
					  tippy.setProps({
 | 
				
			||||||
    onHidden: (tippy) => {
 | 
					    onHidden: (tippy) => {
 | 
				
			||||||
      if (oldContent) {
 | 
					      if (oldContent) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,5 @@
 | 
				
			|||||||
.markup .code-block {
 | 
					.markup .code-block,
 | 
				
			||||||
 | 
					.markup .mermaid-block {
 | 
				
			||||||
  position: relative;
 | 
					  position: relative;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -26,7 +27,8 @@
 | 
				
			|||||||
  background: var(--color-secondary-dark-1) !important;
 | 
					  background: var(--color-secondary-dark-1) !important;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.markup .code-block:hover .code-copy {
 | 
					.markup .code-block:hover .code-copy,
 | 
				
			||||||
 | 
					.markup .mermaid-block:hover .code-copy {
 | 
				
			||||||
  visibility: visible;
 | 
					  visibility: visible;
 | 
				
			||||||
  animation: fadein .2s both;
 | 
					  animation: fadein .2s both;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user