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.