( url: string, isDocusaurus: boolean, )
| 121 | } |
| 122 | |
| 123 | export function getDocsLoader( |
| 124 | url: string, |
| 125 | isDocusaurus: boolean, |
| 126 | ): PlaywrightWebBaseLoader { |
| 127 | return new PlaywrightWebBaseLoader(url, { |
| 128 | launchOptions: { headless: true }, |
| 129 | gotoOptions: { waitUntil: "domcontentloaded" }, |
| 130 | evaluate: isDocusaurus |
| 131 | ? async function (page: Page, browser: Browser) { |
| 132 | await page.waitForLoadState("domcontentloaded"); |
| 133 | await new Promise((resolve) => setTimeout(resolve, 10000)); |
| 134 | let out = ""; |
| 135 | while (!out) { |
| 136 | await new Promise((resolve) => setTimeout(resolve, 1000)); |
| 137 | console.log("Attempting to get HTML"); |
| 138 | out = await page.evaluate(() => { |
| 139 | function removeFromHtml(node: HTMLBodyElement, tags: string[]) { |
| 140 | for (const tag of tags) { |
| 141 | let elements = node.getElementsByTagName(tag); |
| 142 | while (elements.length) { |
| 143 | if (!elements[0]) break; |
| 144 | elements[0].parentNode?.removeChild(elements[0]); |
| 145 | elements = node.getElementsByTagName(tag); |
| 146 | } |
| 147 | } |
| 148 | return node; |
| 149 | } |
| 150 | |
| 151 | let clone = document.body.cloneNode(true) as HTMLBodyElement; |
| 152 | if (!clone) return ""; |
| 153 | const mains = clone.getElementsByTagName("main"); |
| 154 | const main = mains[mains.length - 1]; |
| 155 | // @ts-ignore |
| 156 | if (main) clone = main; |
| 157 | // In Docusaurus, the title is <page name> | <site name> |
| 158 | const title = document.title.split("|")[0]; |
| 159 | |
| 160 | clone = removeFromHtml(clone, [ |
| 161 | "script", |
| 162 | "aside", |
| 163 | "button", |
| 164 | "header", |
| 165 | "nav", |
| 166 | "footer", |
| 167 | "style", |
| 168 | "noscript", |
| 169 | ]); |
| 170 | // In Docusaurus, the table of contents can be picked up if we don't smite it |
| 171 | clone.getElementsByClassName("table-of-contents")[0]?.remove(); |
| 172 | |
| 173 | return `<title>${title}</title>${clone.innerHTML}`; |
| 174 | }); |
| 175 | } |
| 176 | return out; |
| 177 | } |
| 178 | : async function (page: Page, browser: Browser) { |
| 179 | await page.waitForLoadState("domcontentloaded"); |
| 180 | await new Promise((resolve) => setTimeout(resolve, 10000)); |
no test coverage detected