diff --git a/ep.json b/ep.json index 7685599..98d1235 100644 --- a/ep.json +++ b/ep.json @@ -16,6 +16,7 @@ "eejsBlock_editbarMenuLeft": "ep_headings2/index", "collectContentPre": "ep_headings2/static/js/shared", "collectContentPost": "ep_headings2/static/js/shared", + "ccRegisterBlockElements": "ep_headings2/static/js/shared", "getLineHTMLForExport": "ep_headings2/index", "stylesForExport" : "ep_headings2/index" } diff --git a/package.json b/package.json index 507203f..bcaf085 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "url": "https://github.com/ether/ep_headings2/issues" }, "dependencies": { - "ep_plugin_helpers": "^0.3.2" + "ep_plugin_helpers": "^0.5.2" }, "devDependencies": { "eslint": "^8.57.1", diff --git a/static/js/shared.js b/static/js/shared.js index cd6f15f..8e0b065 100644 --- a/static/js/shared.js +++ b/static/js/shared.js @@ -8,3 +8,4 @@ const headings = lineAttribute({attr: 'heading', tags}); exports.collectContentPre = headings.collectContentPre; exports.collectContentPost = headings.collectContentPost; +exports.ccRegisterBlockElements = headings.ccRegisterBlockElements; diff --git a/static/tests/backend/specs/exportHTML.ts b/static/tests/backend/specs/exportHTML.ts index 6320db8..25b5bca 100644 --- a/static/tests/backend/specs/exportHTML.ts +++ b/static/tests/backend/specs/exportHTML.ts @@ -121,4 +121,35 @@ describe('ep_headings2 - export headings to HTML', function () { } }); }); + + context('when pad has adjacent

and

with no separator', function () { + // Regression for ether/etherpad#7568 round-trip. Without server-side + // ccRegisterBlockElements registered for the heading tags, + // contentcollector treats

/

as inline and adjacent ones + // merge into a single pad line. + before(async function () { + html = () => buildHTML('

Alpha

Beta

'); + }); + + it('keeps each heading on its own line', function (done) { + const expected = /

\s*Alpha\s*<\/h1>[\s\S]*

\s*Beta\s*<\/h2>/; + generateJWTToken().then((token) => { + agent.get(getHTMLEndPointFor(padID)) + .set('Authorization', token) + .end((err, res) => { + if (err) return done(err); + const out = res.body.data.html; + if (out.search(expected) === -1) { + return done(new Error( + `Adjacent headings merged or missing in: ${out}`)); + } + if (out.search(/AlphaBeta/) !== -1) { + return done(new Error( + `Headings merged into one line: ${out}`)); + } + done(); + }); + }).catch(done); + }); + }); });