fix(noter): monotype tager hele markeringen, og farvelægningen taber ingen linjer
Meldt ind: "kun den øverste sætning af det jeg markerede blev lavet om til monotype". Det førte til en anden fejl, der var værre. --- den meldte --- Monotype går uden om execCommand, fordi formatBlock pakker et <p> ind i <pre>'en i stedet for at lave den om. Den vej spurgte efter `currentBlock()`, og det er ét blok — markørens. Så af en markering over ti linjers terminaludskrift blev den første linje til kode og resten stod tilbage som brødtekst. `selectedBlocks()` læser hele markeringen, og de markerede blokke lægges sammen til ÉN blok. Ikke én pr. linje: en udskrift, man indsætter, er ét stykke kode, og tre blokke ved siden af hinanden ser næsten ens ud på skærmen og bliver til tre hegn i filen. Vejen ud af monotype tager nu også hele markeringen. `swapTag()` bytter tagget uden at røre markøren — tekstknuderne flytter med over, så den range browseren holder på stadig peger på noget i dokumentet, og formatBlock kan klare resten bagefter. --- den anden, som prøven fandt --- `watchForTrouble` meldte "ReferenceError: codeText is not defined" fra et rekursivt kald, jeg havde glemt at omdøbe. Ved siden af det lå en KOPI af "hvad er teksten i en blok", inde i editoren, med præcis den <br>-fejl, der blev rettet i #91: `textContent` på et <br> er den tomme streng. Den kopi bruges af farvelægningen, som maler resultatet TILBAGE ind i blokken. Så en kodeblok skrevet med shift+retur fik sine linjer skrevet sammen i det øjeblik, man klikkede væk fra den — på skærmen, ikke kun i filen, og uden at nogen havde rørt teksten. Målt mod den gamle kode: "echo enecho to". Kommentaren over kopien sagde ordret, at de to læsninger skulle være ét sted, FORDI en uenighed ville ende i noten. Den var sand, da den blev skrevet; kopien kom senere. `blockText` i richtext.js er nu det ene sted, eksporteret og brugt begge steder. Begge prøver er efterprøvet mod den gamle kode. Fuld chromium-suite kørt to gange: 94 bestået, 0 fejlet, begge gange. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
dba99b7ecc
commit
b497b76be4
@@ -4992,6 +4992,108 @@ test('en punktliste kan have niveauer, der overlever gemningen', async ({ page }
|
||||
expect(trouble).toEqual([]);
|
||||
});
|
||||
|
||||
/**
|
||||
* Farvelægningen skriver ikke linjerne sammen i en blok, man lige har forladt.
|
||||
*
|
||||
* Blokken farves, når markøren forlader den, og resultatet males TILBAGE ind i
|
||||
* den. Den læsning havde sin egen kopi af "hvad er teksten i en blok", og kopien
|
||||
* brugte `textContent` — hvor et <br> er den tomme streng. Så en blok skrevet med
|
||||
* shift+retur fik sine linjer skrevet sammen i det øjeblik, man klikkede væk. På
|
||||
* skærmen, ikke kun i filen, og uden at man havde rørt teksten.
|
||||
*
|
||||
* Kommentaren over kopien sagde "ét sted, fordi to steder skal bruge det samme
|
||||
* svar". Der var to, og de var uenige om netop det tegn.
|
||||
*/
|
||||
test('et klik væk fra en kodeblok skriver ikke dens linjer sammen', async ({ page }) => {
|
||||
const trouble = watchForTrouble(page);
|
||||
await page.goto('/noter');
|
||||
|
||||
await nyNote(page);
|
||||
await page.keyboard.type('Farvelagt');
|
||||
await page.keyboard.press('Enter');
|
||||
await page.getByRole('button', { name: 'Formatér' }).click();
|
||||
await page.getByRole('menuitem', { name: 'Monotype' }).click();
|
||||
await page.keyboard.type('echo en');
|
||||
await page.keyboard.press('Shift+Enter');
|
||||
await page.keyboard.type('echo to');
|
||||
|
||||
const ed = page.getByRole('textbox', { name: 'Notens tekst' });
|
||||
// Ud af blokken, så farvelægningen tager fat i den.
|
||||
await page.keyboard.press('ArrowDown');
|
||||
await page.keyboard.press('End');
|
||||
await ed.getByText('Farvelagt', { exact: true }).click();
|
||||
|
||||
// Kopiér-knappen ligger inde i blokken for at kunne sidde i hjørnet af den, så
|
||||
// den skal ud, før teksten læses — præcis det, koden selv gør.
|
||||
const tekst = await ed.locator('pre').evaluate((el) => {
|
||||
const kopi = el.cloneNode(true);
|
||||
kopi.querySelectorAll('.copy').forEach((b) => b.remove());
|
||||
return kopi.innerText.trim();
|
||||
});
|
||||
expect(tekst).toBe('echo en\necho to');
|
||||
|
||||
expect(trouble).toEqual([]);
|
||||
});
|
||||
|
||||
/**
|
||||
* Flere markerede afsnit bliver til ÉN monotypeblok — ikke kun det øverste.
|
||||
*
|
||||
* Monotype går uden om `execCommand`, fordi formatBlock pakker et <p> ind i
|
||||
* <pre>'en i stedet for at lave den om. Den vej spurgte efter `currentBlock()`,
|
||||
* altså det ene blok markøren står i — så af en markering over ti linjers
|
||||
* terminaludskrift blev den første linje til kode og resten stod tilbage som
|
||||
* brødtekst.
|
||||
*
|
||||
* Og det skal være én blok, ikke tre. En udskrift, man indsætter, er ét stykke
|
||||
* kode; tre blokke ved siden af hinanden ser næsten ens ud på skærmen og er tre
|
||||
* hegn i filen.
|
||||
*/
|
||||
test('flere markerede afsnit bliver til én monotypeblok', async ({ page }) => {
|
||||
const trouble = watchForTrouble(page);
|
||||
await page.goto('/noter');
|
||||
|
||||
await nyNote(page);
|
||||
await page.keyboard.type('Udskrift');
|
||||
await page.keyboard.press('Enter');
|
||||
await page.keyboard.type('linje et');
|
||||
await page.keyboard.press('Enter');
|
||||
await page.keyboard.type('linje to');
|
||||
await page.keyboard.press('Enter');
|
||||
await page.keyboard.type('linje tre');
|
||||
|
||||
const ed = page.getByRole('textbox', { name: 'Notens tekst' });
|
||||
await expect(ed.locator('p')).toHaveCount(3);
|
||||
|
||||
// Markér alle tre, som man gør det med musen eller tastaturet: fra begyndelsen
|
||||
// af den første til enden af den sidste.
|
||||
await ed.getByText('linje et', { exact: true }).click();
|
||||
await page.keyboard.press('Home');
|
||||
await page.keyboard.press('Shift+ArrowDown');
|
||||
await page.keyboard.press('Shift+ArrowDown');
|
||||
await page.keyboard.press('Shift+End');
|
||||
|
||||
await page.getByRole('button', { name: 'Formatér' }).click();
|
||||
await page.getByRole('menuitem', { name: 'Monotype' }).click();
|
||||
|
||||
// Én blok med alle tre linjer, og ingen brødtekst tilbage.
|
||||
const blok = ed.locator('pre');
|
||||
await expect(blok).toHaveCount(1);
|
||||
await expect(ed.locator('p')).toHaveCount(0);
|
||||
|
||||
const gemt = noteGemt(page);
|
||||
await ed.blur();
|
||||
await gemt;
|
||||
await page.reload();
|
||||
await page.getByRole('button', { name: /Udskrift/ }).click();
|
||||
|
||||
await expect(ed.locator('pre')).toHaveCount(1);
|
||||
expect(await ed.locator('pre code').evaluate((el) => el.textContent.trim())).toBe(
|
||||
'linje et\nlinje to\nlinje tre'
|
||||
);
|
||||
|
||||
expect(trouble).toEqual([]);
|
||||
});
|
||||
|
||||
/**
|
||||
* En kodeblok med flere linjer kommer tilbage med dem alle.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user