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
The Campfire door (onlyworlds.campfire): python -m onlyworlds.campfire --file EXPORT.html OUT-DIR [--project NAME] [--plan] and import_campfire(source, out_dir, plan_only=False, project=None) read Campfire's export (File, Export Elements, the html format) into a world folder written through write_folder. No AI, no account, no new dependency (the Kanka door's HTML to Markdown). A documents door, said in its docstring (the schema owner's rules, Skeld, OW Market h40 #11368): Campfire's web app has no data export, only four documents of the same text (docx, pdf, html, rtf), and the door reads the html. Proven on one real export (Seethe's project on a free account, 2026-10-23; its bytes banked as tests/fixtures/campfire/campfire-export.html): the document's title, then one section.export-item per element, its name, its description, its pages of panels (custom panels of Label / value pairs, text panels), an em dash for an empty value. What becomes what: each element heading is an element, its description block the description; each filled panel's Label / value pairs are kept as x_campfire_<panel>_<label> in lower snake case (a text panel as x_campfire_<panel>, a number as a number), an em dash or an empty paragraph read as empty and not written; no panel fills an OnlyWorlds field. The type: the file names no module (no Characters or Locations heading, in the html or the docx), so the module is read from each template's own panel words (TEMPLATE_MODULES: Basic Information / Place of Residence and its neighbours for Characters, Location Details for Locations, each read on the real file) and the type from the module by one table, MODULE_TYPES, mapped against the definitions; the module from the panels and the table are as the schema owner ruled (Skeld, OW Market h40 #11396): Characters Character and Locations Location, seen; Species and Cultures Species, Items Object, Languages Language, Religions, Philosophies, Systems and Magic Construct ("a magic system is how the world works, not a thing anyone does"), Maps Map, believed; Timelines, Arcs, Manuscript, Encyclopedia and Research stay unknown, and Relationships too until a real file shows one with two ends (then Relation). A module not in the table is a Narrative with supertype Article and the module's name as subtype; an element whose panels match no known module, or two, a Narrative with supertype Article. The report names, per element, the panel words its module was read from (which panel and label matched which module), or that none matched (ImportReport.evidence, ModuleEvidence). Ids are UUIDv5, since the file has none, and the file holds no links: the report says both on every run (a second export gives the same ids only while the names hold; a renamed element comes in new). --project NAME (project=; Skeld, h40 #11396): the file names no project, so a project name given keys every id (campfire:<project>:<type>:<name>, the world campfire:<project>:world) and names the world. Without it each element is keyed campfire:<type>:<name> and the world campfire:world:<title>, named for the document's title, and the report says plainly that two projects exported under Campfire's default title "Campfire Export" would share ids, and that --project NAME keys them apart; a blank name is refused. One resolution: a Character's Place of Residence that equals a Location's name in the same export becomes its location link, else stays the x_campfire_ field; a name inside prose stays prose. No hidden rule: nothing in the file marks an element hidden, and the door says so. A second element of one type and name is keyed :2, an exact copy folds, text outside the parts read is kept as x_campfire_unread; all named. producer.input is campfire-export, the word on the folder spec's §4.2 list since v0.3.18 (Skeld, h40 #11396); the folder's format_version stays FORMAT_VERSION (0.3.17) until the next schema-dist serial moves it.
The real file becomes 2 elements: Ada Okafor a Character (x_campfire_basic_information_full_name, _place_of_residence "The quay", x_campfire_bio naming Mara Voss, kept as prose) and The Ferry Quay a Location (four numbers Campfire printed as 0, kept as 0 and named: the file cannot tell a 0 from a number never set). "The quay" is not "The Ferry Quay", so no link: the negative is the real file, the link a planted copy. The dist's folder lint passes both. Tests: the fixture's hash and size, and that it carries no script, no form and no mail address (each pattern watched catching a sample); counts, types and every field; the em dash; the link and its two negatives (no such Location, not exactly equal); prose stays prose; the report's lines on ids, links, hidden, modules and the default title; each element's module evidence; the report naming everything not placed; the table pinned whole; without --project today's ids (pinned as literals), with it every id keyed and stable across runs, two names two sets of ids, the world named, a second element of one name, a blank name refused, the flag on the command line and --plan with it writing nothing; the lint; two runs byte-identical; the round trip; --plan writing nothing; and on planted copies an element of no known module, a Magic module a Construct, a module not in the table, two modules, a missing panel, a second element of one name, an exact copy, unread text, a panel kind not yet seen, refusals and the command line. 26 mutants watched failing, one per rule.