Files
catena/crates/seriesof/README.md
T

5.5 KiB

seriesof

The series a book belongs to, and which volume of it this is.

Part of catena.

What it does

Reads a series and a volume off a title, and says nothing about the books it cannot place.

A shelf groups by series and volume, and most catalogues have neither set on most books. What that looks like from the reading chair: four records all reading "A History of Philosophy" with nothing to say which volume any of them is, and five volumes of one work sorting as five unrelated books.

When you would use it

  • Before importing a shelf into anything that browses by series.
  • Auditing a catalogue that was built from filenames, where the series was in the title all along and nobody read it.
  • Finding the volumes of a work you already have, which is a query you cannot ask until the series field exists.

Install

cargo install --git https://git.pumpin.online/funkpower/catena seriesof

Example

$ seriesof catalogue.ndjson | jq -r '"\(.series)\t#\(.volume // "—")\t\(.method)"'
The Philokalia	#3	volume
A History of Philosophy	#4	volume
The Art of Computer Programming	#3	volume
Cambridge Companions	#—	publisher
Very Short Introductions	#—	publisher
Blackwell Companions	#—	publisher
Raven Son	#1	volume

The whole record, for a title that carries a volume:

$ seriesof catalogue.ndjson | head -1
{"v":1,"title":"The Philokalia Vol 3","author":"Palmer","series":"The Philokalia","volume":3,"method":"volume"}

And for publisher shorthand, which proposes a title as well:

$ seriesof catalogue.ndjson | jq -c 'select(.method == "publisher") | {series, proposed_title}' | head -2
{"series":"Cambridge Companions","proposed_title":"The Cambridge Companion to Aquinas"}
{"series":"Very Short Introductions","proposed_title":"Logic: A Very Short Introduction"}

Plain titles, for a directory rather than a catalogue:

$ ls *.epub | sed 's/\.epub$//' | seriesof --titles
{"v":1,"title":"The Philokalia Vol 3","series":"The Philokalia","volume":3,"method":"volume"}

Nothing to propose is an answer:

$ printf '{"title":"Being and Time"}\n' | seriesof
$ echo $?
1

Applying only what you believe:

seriesof catalogue.ndjson \
  | jq -r 'select(.volume) | "UPDATE book SET series = \(.series|@json), series_index = \(.volume) WHERE title = \(.title|@json);"' \
  | psql

Options

Option Effect
--titles Read plain titles, one per line, rather than records
--man Write this page as a manual page, in roff

Exit codes

Code Meaning
0 Something was proposed
1 Nothing was
64 The command line was wrong
65 The input was not records
74 The file could not be read

How it decides

Two shapes are recoverable, and they are not the same kind of fact.

A volume marker is a position

"The Philokalia Vol 3", "Collected Works, Volume 9", "(Raven Son Book 1)". The unit word is required — Vol, Volume, Book, Part, Pt, Tome, Bk — because a bare trailing number is far more often a year, an edition or noise. Arabic and roman numerals both count, in any script, up to two hundred.

The series is what comes before the marker. Whatever follows is that volume's own subtitle: "The Art of Computer Programming, Volume 3: Sorting and Searching" is volume 3 of the former, and gluing the halves back together gives a title nobody published.

Except where the convention puts the series inside a bracket — "The Song of the Sirin (Raven Son Book 1)" is book one of Raven Son, not of "The Song of the Sirin (Raven Son".

A marker with nothing usable before it is left alone. "Vol. 2. PLATO, EPICTETUS, MARCUS AURELIUS" is a volume of something whose name is not in the field at all, and filing it under its own contents is worse than not filing it.

Publisher shorthand is only membership

A title of "Aquinas (Companion)" against an author of "Cambridge" means the publisher landed in the author column and the collection name was flattened into a parenthetical. The work is The Cambridge Companion to Aquinas.

These get a series and no number, deliberately. Cambridge Companions are not numbered, nobody knows what "#3" would mean, and cataloguing software defaults a missing index to 1 — so filing them as a numbered series makes every one display as volume one, asserting an order the data does not have.

A title is only reconstructed where it reliably can be. Cambridge and Routledge front theirs with the imprint; Blackwell does not — its Companions to Philosophy are "A Companion to Nietzsche", while a few of its religion titles genuinely are "The Blackwell Companion to …". The shorthand cannot tell which, so Blackwell gets its series and no title claim.

Recognised: Cambridge, Oxford, Blackwell, Wiley Blackwell, Routledge, SUNY, Palgrave and Springer, across companions, concise companions, handbooks, guidebooks, Very Short Introductions, Contemporary Debates, contemporary introductions, anthologies and studies.

As a library

let found = seriesof::series_of("The Philokalia Vol 3", None).expect("a series");
assert_eq!(found.series, "The Philokalia");
assert_eq!(found.volume, Some(3));

parse_volume and publisher_series answer each half on its own, and roman_or_int reads a numeral in any script.

See also

  • bibclean — the rest of what a catalogue record needs before it is worth keeping.
  • booksniff — what the file actually is.