O CodeMirror é um utilitário incrível para apresentar códigos em um ambiente de navegador. O destaque de sintaxe, os widgets e várias funções avançadas fazem dele uma ferramenta única e útil. Ao usar o CodeMirror dentro do depurador DevTools do Firefox, descobri que adicionar centenas de widgets de ponto de interrupção de coluna a linhas de código muito longas realmente prejudicava o desempenho, e com certeza não posso proporcionar aos senhores uma experiência horrível durante a depuração do JavaScript.


Eu queria ser extravagante para garantir que o desempenho fosse bom, por isso decidi mexer apenas com a exibição de widgets de ponto de interrupção de coluna que apareciam na janela de visualização. Para fazer isso, precisei calcular a linha inicial, a coluna inicial, a linha final e a coluna final do conteúdo do editor CodeMirror, alguns dos quais não pareciam ser fornecidos nos métodos do CodeMirror.


Minha experimentação me levou a uma solução com a qual estou bastante satisfeito; o código é limpo, o desempenho é bom e o método tem sido incrivelmente confiável. Aqui está ela:



function getLocationsInViewport(editor) {
  const charWidth = editor.defaultCharWidth();
  const scrollArea = editor.getScrollInfo();
  const { scrollLeft } = editor.doc;
  const rect = editor.getWrapperElement().getBoundingClientRect();

  const topVisibleLine = editor.lineAtHeight(rect.top, "window");
  const bottomVisibleLine = editor.lineAtHeight(
    rect.bottom,
    "window"
  );

  const leftColumn = Math.floor(scrollLeft > 0 ? scrollLeft / charWidth : 0);
  const rightPosition = scrollLeft + (scrollArea.clientWidth - 30);
  const rightColumn = Math.floor(rightPosition / charWidth);
   return {
    start: {
      line: topVisibleLine,
      column: leftColumn
    },
    end: {
      line: bottomVisibleLine,
      column: rightColumn
    }
  };
}


O CodeMirror fornece métodos fáceis para obter as linhas iniciais e finais na viewport (lineAtHeight), mas não há uma funcionalidade semelhante para colunas. Optei por obter o scrollLeft do scroller do CodeMirror e, em seguida, usar a largura padrão do caractere e outras dimensões para obter a coluna aproximada nessa posição. Meus testes com usuários mostraram que esse método é muito confiável, seja com o caractere exato ou com um caractere a menos (provavelmente devido à matemática de subpixel).


Nunca proclamei ser o melhor desenvolvedor do mundo (estou longe disso), mas ser inteligente para encontrar soluções para problemas interessantes é algo de que sempre me orgulhei.