You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
rev validate counts what the journal counts. A limit stated as "including tables/figure captions, statements and references list" was checked against body prose alone: the reference list does not exist in the sources, since citeproc renders it at build time, and figure captions were removed with their image. On a manuscript with 31 references and 5 figures that is 1,661 words the count never saw. The parts are now measured separately and the profile says which of them its limit covers, through wordLimit.includeReferences / includeFigureCaptions / includeTableCells / includeAbstract. The reference list is rendered with the project's own bibliography and CSL, through the same pandoc + citeproc pass the build uses, so a style that prints every author of a consortium paper is counted at what it actually prints. The stats table shows each part and whether it was counted.
The abstract ended at its first z.\Z is not a JavaScript escape; written into the extraction pattern it matched a literal Z, and under /i a literal z, so an abstract was cut at its first one. A 356-word abstract was reported as 162 and passed a 350-word limit. A trailing Keywords: line is also dropped, since journals limit the two separately.
The title was the first heading. A rev project carries its title in rev.yaml, so the first H1 in the sections is "Abstract" and the reported title length was 8 characters. validate reads the configured title.
A table was counted as five rows.countTables divided the row total by an assumed rows-per-table, so the figure was a function of table length: 8 tables reported as 15. One table is now one run of consecutive rows.
A cross-reference counted as a reference.@fig:one was recorded under the key fig, because the guard tested the captured key for a colon the pattern had already stopped at.
sections: {required: [...]} no longer dies at validation time. The --new template suggested that shape, and it reached the validator as an object, which failed with "req.sections is not iterable". Both the list and the nested form are accepted; the template and the documented example now write the list.
Added
keywords.max and dataAvailability in a profile are read: both were accepted, stored, and never checked.
countTableCellWords and countFigureCaptionWords in lib/utils.ts, and renderBibliography in the new lib/bibliography.ts.
[0.12.3] - 2026-09-09
Fixed
rev validate counts the prose between two tables.countWords stripped table content with /\|[^|]+\|/g, and [^|] matches a newline, so the pattern ran from the last pipe of one table to the first pipe of the next and deleted every paragraph standing between them. On an 8-table results section it dropped about 2,000 words of running text, and the reported count fell as prose was added between tables and rose as a table was removed. /\{[^}]+\}/g had the same shape and joined one figure's attribute block to the next. Both are now bounded: table rows are dropped line by line, so a table contributes nothing and nothing else is taken with it, and every pattern without a same-line closing delimiter is confined to one line.
A citation no longer leaves its brackets behind as words.[@Ellenberg_1991; @Diekmann_2003] had its keys removed and the residue [; ] counted as two words. Bracketed citations are removed whole, and a token carrying no letter or digit is not counted.
A cross-reference label with a hyphen is removed in full.@\w+ stopped at the hyphen of @fig:sample-efficiency, leaving -efficiency to be counted.
Frontmatter is recognized only at the top of the document. The ^---[\s\S]*?--- pattern carried the m flag, so a horizontal rule mid-document could open a match and delete everything up to the next one. Horizontal rules are likewise matched as whole lines, not as any run of three dashes inside a word.