#! /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()