@aksp/opencrew 1.6.1 → 1.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,21 @@
|
|
|
3
3
|
All notable changes to opencrew are documented here.
|
|
4
4
|
The format is based on [Keep a Changelog](https://keepachangelog.com/).
|
|
5
5
|
|
|
6
|
+
## [1.6.2] — 2026-10-05
|
|
7
|
+
|
|
8
|
+
Correção da 1.6.1. Chega a quem já usa com um `npx @aksp/opencrew@latest update`.
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
- **Node 20: o verificador não esgota mais a memória com texto grande.** Um post, tweet ou
|
|
12
|
+
legenda de dezenas de milhares de caracteres numa peça só derrubava o verificador no Node 20,
|
|
13
|
+
sem relatório (o runner avisava que a verificação não rodou). A contagem de caracteres passou a
|
|
14
|
+
ser feita em janelas, com o mesmo resultado. O defeito vinha da 1.5.0; Node 22 e 24 não o
|
|
15
|
+
tinham.
|
|
16
|
+
|
|
17
|
+
### Internal
|
|
18
|
+
- Release: a tag só sai depois do CI verde nas quatro células (Ubuntu e Windows, Node 20 e 22).
|
|
19
|
+
A 1.6.1 foi publicada com o CI do Node 20 vermelho, porque a publicação roda só no Node 22.
|
|
20
|
+
|
|
6
21
|
## [1.6.1] — 2026-10-05
|
|
7
22
|
|
|
8
23
|
Fase R1 "Reparos da 1.6.0: o verificador mede de verdade" (`specs/fase-r1-reparos-1-6-1.md`),
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.6.
|
|
1
|
+
1.6.2
|
|
@@ -13,10 +13,41 @@ export const FALTA_INFO = 'Falta informação sua';
|
|
|
13
13
|
export const NAO_MEDIDO = 'Não medido';
|
|
14
14
|
export const NAO_VERIFICADO = 'Não verificado';
|
|
15
15
|
|
|
16
|
+
const JANELA = 1024;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Quantos grafemas o texto tem, contados em janelas e sem guardar os segmentos. No Node 20 cada
|
|
20
|
+
* segmento carrega uma cópia da entrada: com o texto inteiro de uma vez a memória cresce ao
|
|
21
|
+
* quadrado, e 200 mil caracteres derrubavam o processo. O último grafema de uma janela pode
|
|
22
|
+
* continuar na seguinte, por isso fica para ela; a janela nunca corta um par substituto.
|
|
23
|
+
*/
|
|
24
|
+
export function grafemas(texto, janela = JANELA) {
|
|
25
|
+
let total = 0;
|
|
26
|
+
let tamanho = janela;
|
|
27
|
+
for (let inicio = 0; inicio < texto.length;) {
|
|
28
|
+
let fim = Math.min(inicio + tamanho, texto.length);
|
|
29
|
+
if (fim < texto.length && texto.codePointAt(fim - 1) > 0xffff) fim++;
|
|
30
|
+
let quantos = 0;
|
|
31
|
+
let ultimo = 0;
|
|
32
|
+
for (const { index } of segmentador.segment(texto.slice(inicio, fim))) {
|
|
33
|
+
quantos++;
|
|
34
|
+
ultimo = index;
|
|
35
|
+
}
|
|
36
|
+
const acabou = fim === texto.length;
|
|
37
|
+
if (!acabou && quantos === 1) tamanho *= 2; // um grafema maior que a janela: tenta de novo
|
|
38
|
+
else {
|
|
39
|
+
total += acabou ? quantos : quantos - 1;
|
|
40
|
+
inicio = acabou ? fim : inicio + ultimo;
|
|
41
|
+
tamanho = janela;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return total;
|
|
45
|
+
}
|
|
46
|
+
|
|
16
47
|
/** Caracteres visíveis: sem marcadores de negrito/itálico; emoji conta 1; quebra de linha conta. */
|
|
17
48
|
export function contar(texto) {
|
|
18
49
|
const limpo = String(texto).replace(/\*\*|__/g, '').replace(/\*([^*\n]+)\*/g, '$1').trim();
|
|
19
|
-
return
|
|
50
|
+
return grafemas(limpo);
|
|
20
51
|
}
|
|
21
52
|
|
|
22
53
|
export const item = (nome, medido, limite, nivel, detalhe = '') => ({ item: nome, medido, limite, nivel, detalhe });
|