files
   1| 
   2| 
   3| 
   4| 
   5| 
   6| 
   7| 
   8| 
   9| 
  10| 
  11| 
  12| 
  13| 
  14| 
  15| 
  16| 
  17| 
  18| 
  19| 
  20| 
  21| 
  22| 
  23| 
  24| 
  25| 
  26| 
  27| 
  28| 
  29| 
  30| 
  31| 
  32| 
  33| 
  34| 
  35| 
  36| 
  37| 
  38| 
  39| 
  40| 
  41| 
  42| 
  43| 
  44| 
  45| 
  46| 
  47| 
  48| 
  49| 
  50| 
  51| 
  52| 
  53| 
  54| 
  55| 
  56| 
  57| 
  58| 
  59| 
  60| 
  61| 
  62| 
  63| 
  64| 
  65| 
  66| 
  67| 
  68| 
  69| 
  70| 
  71| 

    
import { dirname } from "path";
import { mkdir, writeFile } from "fs/promises";

export const myWriteFile = async (path: string, content: string) => {
  const folder = dirname(path);
  await mkdir(folder, { recursive: true });
  await writeFile(path, content);
};

export type Addition = {
  position: {
    line: number;
    character: number;
  };
  text: string;
};

export const putInSrc = (highlight: string, additions: Addition[]) => {
  const key = (i: number, j: number) => `${i},${j}`;
  const additionMap = new Map();
  const addsInPlace = (i: number, j: number) => {
    const a = additionMap.get(key(i, j));
    if (a) {
      return a.join('');
    }
    return '';
  };
  additions.forEach((add) => {
    const p = add.position;
    const k = key(p.line, p.character);
    let cur = additionMap.get(k) ?? [];
    additionMap.set(k, cur);
    cur.push(add.text);
  });
  let result = "";
  let i = 0;
  let j = 0;
  let hline = highlight;
  let p = 0;
  while (p < hline.length) {
    while (hline[p] == '<') {
      while (hline[p] != '>') {
        result += hline[p];
        p += 1;
      }
      result += hline[p];
      p += 1;
    }
    result += addsInPlace(i, j);
    j += 1;
    if (p >= hline.length) break;
    if (hline[p] == '\n') {
      result += hline[p];
      p += 1;
      j = 0;
      i += 1;
      continue;  
    }
    if (hline[p] == '&') {
      while (hline[p] != ';') {
        result += hline[p];
        p += 1;
      }
    }
    result += hline[p];
    p += 1;
  }
  result += addsInPlace(i, j);
  return result;
};