Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

Commit

Permalink
Load light theme prior to HTML export to ensure it is present (#7643)
Browse files Browse the repository at this point in the history
  • Loading branch information
t3chguy authored Jan 26, 2022
1 parent 79d9a0c commit 00912c0
Showing 1 changed file with 23 additions and 4 deletions.
27 changes: 23 additions & 4 deletions src/utils/exportUtils/exportCSS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ See the License for the specific language governing permissions and
limitations under the License.
*/

/* eslint-disable max-len, camelcase */

import customCSS from "!!raw-loader!./exportCustomCSS.css";

const cssSelectorTextClassesRegex = /\.[\w-]+/g;
Expand All @@ -34,15 +32,36 @@ function mutateCssText(css: string): string {
);
}

function isLightTheme(sheet: CSSStyleSheet): boolean {
return (<HTMLStyleElement>sheet.ownerNode).dataset.mxTheme?.toLowerCase() === "light";
}

async function getRulesFromCssFile(path: string): Promise<CSSStyleSheet> {
const doc = document.implementation.createHTMLDocument("");
const styleElement = document.createElement("style");

const res = await fetch(path);
styleElement.textContent = await res.text();
// the style will only be parsed once it is added to a document
doc.body.appendChild(styleElement);

return styleElement.sheet;
}

// naively culls unused css rules based on which classes are present in the html,
// doesn't cull rules which won't apply due to the full selector not matching but gets rid of a LOT of cruft anyway.
const getExportCSS = async (usedClasses: Set<string>): Promise<string> => {
// only include bundle.css and the data-mx-theme=light styling
const stylesheets = Array.from(document.styleSheets).filter(s => {
return s.href?.endsWith("bundle.css") ||
(s.ownerNode as HTMLStyleElement).dataset.mxTheme?.toLowerCase() === "light";
return s.href?.endsWith("bundle.css") || isLightTheme(s);
});

// If the light theme isn't loaded we will have to fetch & parse it manually
if (!stylesheets.some(isLightTheme)) {
const href = document.querySelector<HTMLLinkElement>('link[rel="stylesheet"][href$="theme-light.css"]').href;
stylesheets.push(await getRulesFromCssFile(href));
}

let css = "";
for (const stylesheet of stylesheets) {
for (const rule of stylesheet.cssRules) {
Expand Down

0 comments on commit 00912c0

Please sign in to comment.