diff --git a/frontend/src/components/Notes/RenderInWindow.js b/frontend/src/components/Notes/RenderInWindow.js index 8914584..c34734e 100644 --- a/frontend/src/components/Notes/RenderInWindow.js +++ b/frontend/src/components/Notes/RenderInWindow.js @@ -1,13 +1,104 @@ -import React, {useState, useEffect,useRef} from 'react' -import ReactDOM from "react-dom"; +import ReactDOM from 'react-dom'; +import { useState, useEffect, useRef, useCallback } from 'react'; export default function RenderInWindow(props) { const [container, setContainer] = useState(null); const newWindow = useRef(null); + // `copyStyles`, `fixUrlForRule` and `getKeyFrameText` taken from + // https://github.com/rmariuzzo/react-new-window/blob/master/src/NewWindow.js + const fixUrlForRule = useCallback( + (cssRule) => + cssRule.cssText + .split('url(') + .map((line) => { + if (line[1] === '/') { + return `${line.slice(0, 1)}${window.location.origin}${line.slice( + 1 + )}`; + } + return line; + }) + .join('url('), + [] + ); + + const getKeyFrameText = useCallback((cssRule) => { + const tokens = ['@keyframes', cssRule.name, '{']; + Array.from(cssRule.cssRules).forEach((cssRule) => { + // type === CSSRule.KEYFRAME_RULE should always be true + tokens.push(cssRule.keyText, '{', cssRule.style.cssText, '}'); + }); + tokens.push('}'); + return tokens.join(' '); + }, []); + + const copyStyles = useCallback( + (source, target) => { + // Store style tags, avoid reflow in the loop + const headFrag = target.createDocumentFragment(); + + Array.from(source.styleSheets).forEach((styleSheet) => { + // For