diff --git a/.changeset/old-keys-run.md b/.changeset/old-keys-run.md new file mode 100644 index 0000000..de8501f --- /dev/null +++ b/.changeset/old-keys-run.md @@ -0,0 +1,5 @@ +--- +'jats-utils': patch +--- + +Update serialization pretty-print diff --git a/.changeset/strange-mugs-remain.md b/.changeset/strange-mugs-remain.md new file mode 100644 index 0000000..bf56c81 --- /dev/null +++ b/.changeset/strange-mugs-remain.md @@ -0,0 +1,5 @@ +--- +'jats-xml': patch +--- + +Ensure table-wrap has correct order diff --git a/packages/jats-utils/src/serialize.ts b/packages/jats-utils/src/serialize.ts index 60028dd..810313f 100644 --- a/packages/jats-utils/src/serialize.ts +++ b/packages/jats-utils/src/serialize.ts @@ -43,7 +43,10 @@ const both = [ 'body', 'sec', 'fig', + 'statement', + 'list', 'disp-formula', + 'disp-formula-group', 'table-wrap', 'caption', 'table', @@ -74,6 +77,7 @@ const first = [ 'meta-value', 'title', 'p', + 'license-p', 'tr', 'label', 'graphic', diff --git a/packages/jats-xml/src/jats.ts b/packages/jats-xml/src/jats.ts index fbd3973..1b6c2c9 100644 --- a/packages/jats-xml/src/jats.ts +++ b/packages/jats-xml/src/jats.ts @@ -30,7 +30,7 @@ import type { } from 'jats-tags'; import type { Logger } from 'myst-cli-utils'; import { tic } from 'myst-cli-utils'; -import { articleMetaOrder } from './order.js'; +import { articleMetaOrder, tableWrapOrder } from './order.js'; import { serializeJatsXml, type SerializationOptions, @@ -220,6 +220,11 @@ export class Jats { articleMetaOrder.findIndex((x) => x === b.type), ); } + (selectAll('table-wrap', this.tree) as GenericParent[]).forEach((tw) => { + tw.children = tw.children.sort( + (a, b) => (tableWrapOrder[a.type] ?? -1) - (tableWrapOrder[b.type] ?? -1), + ); + }); } serialize(opts?: WriteOptions): string { diff --git a/packages/jats-xml/src/order.ts b/packages/jats-xml/src/order.ts index 65f9dbf..1658daa 100644 --- a/packages/jats-xml/src/order.ts +++ b/packages/jats-xml/src/order.ts @@ -47,3 +47,42 @@ export const articleMetaOrder = [ 'counts', 'custom-meta-group', ]; + +function order(tags: (string | string[])[]): Record { + return Object.fromEntries( + tags + .map((tag, i) => { + if (typeof tag === 'string') return [[tag, i]]; + return tag.map((t) => [t, i]); + }) + .flat() as [string, number][], + ); +} + +export const tableWrapOrder = order([ + 'object-id', + 'label', + 'caption', + 'abstract', + 'kwd-group', + 'subj-group', + ['alt-text', 'long-desc', 'email', 'ext-link', 'uri'], + [ + 'disp-quote', + 'speech', + 'statement', + 'verse-group', + 'def-list', + 'list', + 'alternatives', + 'chem-struct-wrap', + 'code', + 'disp-formula', + 'graphic', + 'media', + 'preformat', + 'table', + 'xref', + ], + ['table-wrap-foot', 'attrib', 'permissions'], +]);