121 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
// @ts-check
 | 
						|
 | 
						|
const fs = require("fs");
 | 
						|
const md = require("../markdown");
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * @param {string[]} input
 | 
						|
 * @param {boolean} isSync
 | 
						|
 */
 | 
						|
function transformValue(input, isSync) {
 | 
						|
  const out = [];
 | 
						|
  const suffix = [];
 | 
						|
  for (let line of input) {
 | 
						|
    let match = line.match(/const { (\w+) } = require\('playwright'\);/);
 | 
						|
    if (match) {
 | 
						|
      if (isSync) {
 | 
						|
        out.push('from playwright.sync_api import sync_playwright, Playwright');
 | 
						|
        out.push('');
 | 
						|
        out.push('def run(playwright: Playwright):');
 | 
						|
        out.push(`    ${match[1]} = playwright.${match[1]}`);
 | 
						|
        suffix.push(``);
 | 
						|
        suffix.push(`with sync_playwright() as playwright:`);
 | 
						|
        suffix.push(`    run(playwright)`);
 | 
						|
      } else {
 | 
						|
        out.push('import asyncio');
 | 
						|
        out.push('from playwright.async_api import async_playwright, Playwright');
 | 
						|
        out.push('');
 | 
						|
        out.push('async def run(playwright: Playwright):');
 | 
						|
        out.push(`    ${match[1]} = playwright.${match[1]}`);
 | 
						|
        suffix.push(``);
 | 
						|
        suffix.push(`async def main():`);
 | 
						|
        suffix.push(`    async with async_playwright() as playwright:`);
 | 
						|
        suffix.push(`        await run(playwright)`);
 | 
						|
        suffix.push(`asyncio.run(main())`);
 | 
						|
      }
 | 
						|
      continue;
 | 
						|
    }
 | 
						|
    if (line.trim() === '(async () => {' || line.trim() === '})();')
 | 
						|
      continue;
 | 
						|
    if (!line)
 | 
						|
      continue;
 | 
						|
    if (line.trim() === '}')
 | 
						|
      continue;
 | 
						|
    line = line.replace(/\$\$eval/g, 'eval_on_selector_all');
 | 
						|
    line = line.replace(/\$eval/g, 'eval_on_selector');
 | 
						|
    line = line.replace(/\$\$/g, 'query_selector_all');
 | 
						|
    line = line.replace(/\$/g, 'query_selector');
 | 
						|
    line = line.replace(/([a-zA-Z$]+)/g, (match, p1) => toSnakeCase(p1));
 | 
						|
    line = line.replace(/try {/, 'try:');
 | 
						|
    line = line.replace(/async \(([^)]+)\) => {/, 'lambda $1:');
 | 
						|
    line = line.replace(/} catch \(e\) {/, 'except Error as e:');
 | 
						|
    line = line.replace(/;$/, '');
 | 
						|
    line = line.replace(/  /g, '    ');
 | 
						|
    line = line.replace(/'/g, '"');
 | 
						|
    line = line.replace(/const /g, '');
 | 
						|
    line = line.replace(/{\s*(\w+):\s*([^} ]+)\s*}/, "$1=$2");
 | 
						|
    line = line.replace(/\/\/ /, "# ");
 | 
						|
    line = line.replace(/\(\) => /, 'lambda: ');
 | 
						|
    line = line.replace(/console.log/, 'print');
 | 
						|
    line = line.replace(/function /, 'def ');
 | 
						|
    line = line.replace(/{$/, '');
 | 
						|
    if (isSync)
 | 
						|
      line = line.replace(/await /g, "")
 | 
						|
    out.push(line)
 | 
						|
  }
 | 
						|
  return [...out, ...suffix].join("\n");
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 *
 | 
						|
 * @param {md.MarkdownNode} node
 | 
						|
 * @param {boolean} isSync
 | 
						|
 */
 | 
						|
function generateComment(node, isSync) {
 | 
						|
  const commentNode = md.clone(node)
 | 
						|
  commentNode.codeLang = isSync ? "python sync" : "python async";
 | 
						|
  commentNode.lines = ['# FIXME', ...transformValue(node.lines, isSync).split("\n")];
 | 
						|
  return commentNode;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 *
 | 
						|
 * @param {md.MarkdownNode[]} spec
 | 
						|
 */
 | 
						|
function multiplyComment(spec) {
 | 
						|
  const children = []
 | 
						|
  for (const node of (spec || [])) {
 | 
						|
    if (node.codeLang === "js")
 | 
						|
      children.push(node, generateComment(node, false), generateComment(node, true));
 | 
						|
    else
 | 
						|
      children.push(node);
 | 
						|
  }
 | 
						|
  return children;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * @param {string} name
 | 
						|
 */
 | 
						|
function toSnakeCase(name) {
 | 
						|
  const toSnakeCaseRegex = /((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z]))/g;
 | 
						|
  return name.replace(toSnakeCaseRegex, `_$1`).toLowerCase();
 | 
						|
}
 | 
						|
 | 
						|
for (const name of fs.readdirSync("docs/src")) {
 | 
						|
  if (!name.endsWith(".md"))
 | 
						|
    continue;
 | 
						|
  const inputFile = `docs/src/${name}`;
 | 
						|
  const fileContent = fs.readFileSync(inputFile).toString();
 | 
						|
  const nodes = md.parse(fileContent);
 | 
						|
  
 | 
						|
  md.visitAll(nodes, node => {
 | 
						|
    if (node.children)
 | 
						|
      node.children = multiplyComment(node.children);
 | 
						|
  });
 | 
						|
  
 | 
						|
 
 | 
						|
  const out = md.render(nodes, 120);
 | 
						|
  fs.writeFileSync(inputFile, out);
 | 
						|
}
 |