#! /usr/bin/python3
import sys, re
import html_gen as h
from process_funcs import bash
import html_report_funcs as hr
last_edit = "Last edited on 2026-05-19 14:09:08 by stolfi"
def main():
global last_edit
title = "[077] The Starred Parags is the Shennong Bencaojing"
st = h.new_doc(title, "#eeffdd", text_width = 1600)
h.section(st, 2, "Summary")
h.parags(st, """This series of reports is about the theory that the
Starred Parags section (SPS) of the Voynich Manuscript (VMS) is a version
of a famous old Chinese medical text, the Shennong Bencaojing (SBJ).
The SBJ is a materia medica (list of remedies and their
indications). The identification is based on the close match between
the structure of the longest entry of the SBJ ("Red rooster") with the
longest paragraph of the SPS (folio f105v, lines 32-38). Namely, both
can be parsed into eight sub-entries entries of matching sizes, seven
of them marked by the "keyword" 主 (meaning roughly "mainly [for]",
"treats", etc.) or 主"???" (meaning roughly "main uses", "indications",
etc.) in the SBJ version and the similar-looking words @daiin, @dair,
and @laiin in the SPS version.""")
h.section(st, 3, "Structural matching reports")
anf.dd_bencao_starps_matching_INFO(st)
anf.add_format_starps_parag_evaluation_INFO(st)
h.section(st, 3, "Subpages")
h.begin_enum(st, "ul")
hr.enum_item_link_parag(st, "sub", "0110_shennong_bencao", None, "The Shennong Bencaojing")
hr.enum_item_link_parag(st, "sub", "0210_starred_parags", None, "The Starred Parags section")
hr.enum_item_link_parag(st, "sub", "0310_occs_zhu3", None, "Usage of 'zhu3' in the SBJ")
hr.enum_item_link_parag(st, "sub", "0360_occs_daiin", None, "Usage of 'daiin' in the SPS")
hr.enum_item_link_parag(st, "sub", "ROOS_rooster_entry", None, "The longest SBJ entry: 'Red Rooster'")
hr.enum_item_link_parag(st, "sub", "FLYS_squirrel_entry", None, "The shortest SBJ entry: 'Flying Squirrel'")
hr.enum_item_link_parag(st, "sub", "0820_rooster_langs", None, "The 'Red Rooster' entry in various languages")
h.end_enum(st, "ul")
h.parags(st, """Beware that, at this point, the correspondence between
the Chinese and Voynichese texts is mostly guessed. Except for the 主
治"???" keywords, the alignment is based only on the counts of hanzi and
Voynichese words, and thus may be off by one word or more.
""")
h.section(st, 2, "Obstacles to further progress")
h.section(st, 2, "Identifying the Voynichese language")
h.parags(st, """The structure of the SPS words strongly suggest that
its text is a phonetic transcription of the SBJ, read and possibly
translated into some monosyllabic language, which has not yet been
identified. There are hundreds of possible candidates, including all
the so-called "dialects" of Chinese, as well as Vietnamese, Lao, Thai,
Burmese, Tibetan, and other languages that were spoken in East Asia
around 1400 (the presumed date of composition of the VMS).""")
h.section(st, 3, "Language change")
h.parags(st, """
Another major obstacle is that all the candidate languages have substantially
changed their pronunciation since the 1400s. The changes are
particularly large for languages with ideographic script (like all
Chinese "dialects" and Vietnamese) or with etymological rather than
phonetic spelling (like Thai and Tibetan).""")
h.section(st, 3, "Errors and uncertainties in the SBJ")
h.parags(st, """
Yet another major obstacle is that the original Chinese text of the SBJ as
it circulated in the 1400 has been lost. The existing versions are
reconstructions produced by scholars after the 1500s, from fragments
and quotes in other books. Thus there must be significant differences
between the digital version of the SBJ that we have today and the
version that the VMS Author transcribed around 1400.
The digital file of the SBJ that I have must be also contain
some transcription errors. I noticed and corrected a couple of them
by comparing two files that I obtained from the internet,
and by trying to parse the entries as described the division
of the SPS into parags is uncertain. A parag break can be reliably
inferred after any "short line" -- a line that starts on the left rail
of the text area but ends well before the right rail.
However, sometimes a parag ends with a will-width line, making the
break difficult to detect and locate. In those cases, transcribers had
to rely on secondary clues, such as variations of line spacing and the
enhanced frequency of puff gallows in head lines. It appears that the
head line of each parag was supposed to be marked by a star on the
left margin, as if it were a bullet. However, this is not a reliable
indicator of a parag break, because the star is often displaced by one
line or more from the head line, and a few stars seem to be missing or
spurious.
In fact, on each of pages f108v, f111r, and f11v, is evident that a
number of parags were run together by the Scribe into a single large
parag, with several stars randomly placed along its margin. In those
places, the parag breaks marked by any transcriber are almost
certainly wrong, because most of the true breaks must be somewhere
inside those lines, not between them.""")
hr.links_section(st)
h.section(st, 2, "Disclaimer about 'AI' use")
h.parags(st, """In this research I used Large Language Models ("AI"
systems), specifically Google AI and ChatGPT, to translate individual
Chinese SBJ recipes into English and other Asian languages, as well as
for punctual help with details of programming languages and other
software tools. I also used Google Translate (not the AI version) to
convert the Chinese text of the SBJ into phonetic Mandarin (pinyin).
On the other hand, apart from these translations, I did not use
any of those services to write the text of this report, or to develop
any of its conclusions and conjectures. All statistical and structural
analyses, of both the SBJ and the SPS, were done with programs
developed by myself. Those "AI" tools were also never asked to analyze
or process the SPS text. In particular, they had no role in the
identification of paragraph f105v.32-38 of the SPS as a version of the
"red rooster" entry of the SBJ.""", style = "font-size:60%")
h.output_doc(st, sys.stdout, 99, last_edit)
return 0
# ----------------------------------------------------------------------
main()