# eXeLearning — Full Documentation Bundle > This is a single-file concatenation of the eXeLearning ELPX-format > documentation set, plus the project's architecture and conventions > documents. It is generated by `scripts/build-llms-full.sh` from the > Markdown sources under `doc/`. Use this file when a context window > prefers one large document over following links from `/llms.txt`. > Source files (in order): > - `doc/elpx-format.md` > - `doc/elpx-format/container.md` > - `doc/elpx-format/content-xml.md` > - `doc/elpx-format/ids.md` > - `doc/elpx-format/metadata.md` > - `doc/elpx-format/pages-blocks.md` > - `doc/elpx-format/idevices/catalog.md` > - `doc/elpx-format/idevices/patterns.md` > - `doc/elpx-format/idevices/config-xml.md` > - `doc/elpx-format/idevices/snippets.md` > - `doc/elpx-format/themes.md` > - `doc/elpx-format/libraries.md` > - `doc/elpx-format/assets.md` > - `doc/elpx-format/screenshot.md` > - `doc/elpx-format/export-pipeline.md` > - `doc/elpx-format/import-pipeline.md` > - `doc/elpx-format/validation.md` > - `doc/elpx-format/ai-generation.md` > - `doc/elpx-format/examples/minimal-content-xml.md` > - `doc/elpx-format/examples/multi-page-content-xml.md` > - `doc/elpx-format/examples/full-package-tree.md` > - `doc/architecture.md` > - `doc/conventions.md` --- # ===== doc/elpx-format.md ===== # ELPX Format Documentation This is the hub for the `.elpx` file format used by eXeLearning v3+. The format is documented across a focused subdoc set under [`doc/elpx-format/`](elpx-format/) — start here, then jump to the specific reference you need. > **For AI / LLM agents**: read [`elpx-format/ai-generation.md`](elpx-format/ai-generation.md) first, then the [`/llms.txt`](../llms.txt) index at the repo root, then the subdocs cited from each. > **For the legacy `.elp` format** (eXeLearning 2.x), see [contentv3-format.md](contentv3-format.md). --- ## What is `.elpx`? An `.elpx` file is a **ZIP archive** containing a complete, self-contained eXeLearning project. It was introduced in eXeLearning v3.0 to replace the legacy Python-pickle `.elp` format. A single `.elpx` carries: - **`content.xml`** — the project structure in ODE 2.0 XML, validatable against a bundled DTD, re-importable for editing. - **`index.html` + `html/`** — pre-rendered HTML output, viewable directly in a browser without unpacking. - **`theme/`, `libs/`, `idevices/`, `content/`** — every CSS, JavaScript, image, font, and asset the rendered content depends on. - **`screenshot.png`** — 1280×720 PNG project thumbnail at the ZIP root (always present in v4 packages; legacy files without one can be patched with [`scripts/add-screenshot.ts`](../scripts/add-screenshot.ts)). Because the package contains both the editable source and the rendered output, `.elpx` is the recommended exchange format: human-readable in any browser, re-importable into eXeLearning for editing, and validatable end-to-end. --- ## Quick reference | Property | Value | |----------|-------| | Container | ZIP (deflate) | | Required root files | `content.xml`, `content.dtd`, `index.html`, `screenshot.png` | | Required directories | `theme/`, `libs/`, `idevices//` for each used type | | Optional root files | `search_index.js` (when search box is enabled) | | Asset layout | `content/resources//` (user folders preserved; legacy v3 UUID subfolders normalised away) | | Asset reference form | `{{context_path}}/` inside `` / `` where `` is `/` (or just `` when no folder); `{{context_path}}` resolves to `content/resources/` at render time | | XML namespace | `http://www.intef.es/xsd/ode` | | Format version | ODE `2.0` (root ``) | | Runtime version | constant `ODE_VERSION` = `"3.0"` (XML key `exe_version`) | | ID format | `[0-9]{14}[A-Z0-9]{6}` | | iDevice catalog | 43 types (see [catalog](elpx-format/idevices/catalog.md)) | | Schemas | DTD bundled at root + XSD in repo | --- ## Documentation map ### Container and structure - **[container.md](elpx-format/container.md)** — every file and directory inside an `.elpx` ZIP, mandatory vs optional, where each entry comes from in the export pipeline. - **[content-xml.md](elpx-format/content-xml.md)** — full element-by-element reference for `content.xml` (DOCTYPE, root, ``, ``, ``, ``, plus the bundled DTD verbatim and pointer to the XSD). - **[ids.md](elpx-format/ids.md)** — ODE identifier format, generation, lifecycle, cross-hierarchy synchronization rules. - **[metadata.md](elpx-format/metadata.md)** — every `pp_*` property key, type, default, plus `userPreferences` and `odeResources`. - **[pages-blocks.md](elpx-format/pages-blocks.md)** — flat-list navigation model, parent-child IDs, ordering, `exe-node:` internal links. ### iDevices - **[idevices/catalog.md](elpx-format/idevices/catalog.md)** — every iDevice type (modern names, legacy/FPD aliases, downloadable flag, category). - **[idevices/patterns.md](elpx-format/idevices/patterns.md)** — the four content-storage patterns (Standard JSON, URI-encoded JSON, ` ``` **Older exports:** a `
` with `style="display:none"`: ```html ``` Both are inside the CDATA-wrapped ``. The `` element is also present (also CDATA-wrapped) and holds a separately maintained editor copy of the video configuration; the two may diverge if the user edits one path and not the other. ### How to read it ``` raw_html = odeComponent.htmlView.textContent // CDATA body — verbatim dom = parse_html(raw_html) el = dom.getElementById('exe-interactive-video-contents') slides = json_parse(el.textContent.trim()) ``` ### How to write it 1. Build the slides JSON object. 2. Serialize to a JSON string (no URI encoding needed). 3. Place the JSON string as the text content of `
]]>
1 visibility true ``` --- ## Page 03 — child of Page 01, with a UDL iDevice (htmlView-only) Page 03 is the second child of PAGE01. It holds a `udl-content` iDevice that uses **Pattern 4 (htmlView-only)**: the iDevice stores no `` state — the `` element is present but empty. The rendered HTML in `` is both the display artefact and the persistence mechanism; the importer reads it back as-is. This pattern is typical for iDevices whose entire state is captured by their HTML output, such as structured accessibility overlays or static layout blocks. ```xml 20251217062007PAGE03 20251217062007PAGE01 Topic B 2 titlePage Topic B hidePageTitle false visibility true 20251217062007PAGE03 20251217062007BLK04 UDL Content Block 1 visibility true teacherOnly false allowToggle true minimized false 20251217062007PAGE03 20251217062007BLK04 20251217062007IDEV4 udl-content

Read

Photosynthesis is the process by which plants convert sunlight into glucose. The overall equation is: 6CO2 + 6H2O → C6H12O6 + 6O2.

Watch

View diagram

Do

  1. Label the parts of a chloroplast.
  2. Write the photosynthesis equation from memory.
]]>
1 visibility true
``` --- ## Page tree summary The three `` elements above produce this navigation tree: ``` Overview (PAGE01, order 1, no parent) └── Topic A (PAGE02, order 1, parent=PAGE01) └── Topic B (PAGE03, order 2, parent=PAGE01) ``` The importer rebuilds this tree by iterating all `` elements and grouping them by ``. Order within a level is determined by ``. Pages must appear in depth-first order in the XML (parent before its children) — the generator in `OdeXmlGenerator.ts` guarantees this by construction. --- ## Validation Validate the assembled XML the same way as the minimal example: ```bash # From the directory containing both content.xml and content.dtd: xmllint --noout --dtdvalid content.dtd content.xml && echo "valid" ``` Common validation errors in multi-page files: - **Mismatched `` inside a block** — the `` inside each `` must equal the `` of the enclosing ``. - **Mismatched `` inside a component** — the `` inside each `` must equal the `` of the enclosing ``. - **Missing ``** — this element must always be present; the generator writes `visibility=true` as a default when no explicit properties are set. - **`]]>` inside a CDATA section** — if `` or `` content contains the sequence `]]>`, it must be split: `]]]]>`. The generator handles this automatically via `escapeCdata()` in `OdeXmlGenerator.ts`. --- ## Next steps - Validate the full element vocabulary in [../content-xml.md](../content-xml.md). - See how this `content.xml` fits inside the ZIP archive in [full-package-tree.md](full-package-tree.md). - Browse ready-to-use iDevice HTML/JSON snippets in [../idevices/snippets.md](../idevices/snippets.md). - Understand how IDs are generated and scoped in [../ids.md](../ids.md). # ===== doc/elpx-format/examples/full-package-tree.md ===== # Full package tree This page annotates the complete `unzip -l` listing of the fixture file `test/fixtures/really-simple-test-project.elpx`. That file is a real export produced by the eXeLearning v4 codebase in this repository, so every entry name, size, and timestamp is authoritative. Use this listing as a quick orientation map. Each section below points to the subdoc that covers the relevant files in depth. Full container reference: [../container.md](../container.md). Minimal content.xml walkthrough: [minimal-content-xml.md](minimal-content-xml.md). Multi-page content.xml walkthrough: [multi-page-content-xml.md](multi-page-content-xml.md). --- ## Raw listing ``` Archive: really-simple-test-project.elpx Length Date Time Name --------- ---------- ----- ---- 10696 04-27-2026 21:11 search_index.js 13032 04-27-2026 21:11 content/css/base.css 1996 04-27-2026 21:11 content/img/exe_powered_logo.png 21476 04-27-2026 21:11 theme/screenshot.png 4307 04-27-2026 21:11 theme/style.js 490 04-27-2026 21:11 theme/config.xml 12855 04-27-2026 21:11 theme/style.css 1978 04-27-2026 21:11 theme/img/licenses.gif 4813 04-27-2026 21:11 theme/img/icons.png -- 50 PNG icons under theme/icons/ (activity.png, ask.png, book.png, …) -- 1902 04-27-2026 21:11 theme/icons/info.png 2133 04-27-2026 21:11 theme/icons/roadmap.png … 2745 04-27-2026 21:11 theme/icons/english.png -- end of theme/icons/ -- 87533 04-27-2026 21:11 libs/jquery/jquery.min.js 80743 04-27-2026 21:11 libs/bootstrap/bootstrap.bundle.min.js 232018 04-27-2026 21:11 libs/bootstrap/bootstrap.min.css 332347 04-27-2026 21:11 libs/bootstrap/bootstrap.bundle.min.js.map 589698 04-27-2026 21:11 libs/bootstrap/bootstrap.min.css.map 33609 04-27-2026 21:11 libs/exe_export.js 115416 04-27-2026 21:11 libs/common.js 2889 04-27-2026 21:11 libs/favicon.ico 3107 04-27-2026 21:11 libs/common_i18n.js -- exe_atools (accessibility toolbar) — 14 files -- 23647 04-27-2026 21:11 libs/exe_atools/exe_atools.js 6200 04-27-2026 21:11 libs/exe_atools/exe_atools.css 2297 04-27-2026 21:11 libs/exe_atools/exe_atools.png 144200 04-27-2026 21:11 libs/exe_atools/exe_atools_od_b.woff 132640 04-27-2026 21:11 libs/exe_atools/exe_atools_od_bi.woff 132408 04-27-2026 21:11 libs/exe_atools/exe_atools_od.woff 130192 04-27-2026 21:11 libs/exe_atools/exe_atools_od_i.woff 17184 04-27-2026 21:11 libs/exe_atools/exe_atools_ah.woff2 9328 04-27-2026 21:11 libs/exe_atools/exe_atools_ah_ext.woff2 14940 04-27-2026 21:11 libs/exe_atools/exe_atools_mo.woff2 13508 04-27-2026 21:11 libs/exe_atools/exe_atools_mo_ext.woff2 8636 04-27-2026 21:11 libs/exe_atools/exe_atools_mo_cy.woff2 9584 04-27-2026 21:11 libs/exe_atools/exe_atools_mo_cy_ext.woff2 5080 04-27-2026 21:11 libs/exe_atools/exe_atools_mo_vi.woff2 -- end of exe_atools -- 52 04-27-2026 21:11 idevices/text/text.html 1314 04-27-2026 21:11 idevices/text/exequextsq.svg 342 04-27-2026 21:11 idevices/text/text.css 8211 04-27-2026 21:11 idevices/text/text.js 4955 04-27-2026 21:11 index.html 5069 04-27-2026 21:11 html/page-1---1.html 5110 04-27-2026 21:11 html/page-1---1--1.html 5075 04-27-2026 21:11 html/page-1---2.html 5040 04-27-2026 21:11 html/page-2.html 5053 04-27-2026 21:11 html/page-2---1.html 31098 04-27-2026 21:11 content.xml 2251 04-27-2026 21:11 content.dtd 67239 04-27-2026 21:11 screenshot.png --------- ------- 2444866 95 files ``` The 50-icon and 14-font groups are collapsed for readability; the actual archive lists each file individually. Run `unzip -l test/fixtures/really-simple-test-project.elpx` in the repository root to see the full enumeration. --- ## Section walkthrough ### Root files | File | Size | Description | |------|------|-------------| | `content.xml` | 31 KB | The ODE 2.0 project structure. The **only** file the importer requires — every other file is part of the rendered HTML payload. See [minimal-content-xml.md](minimal-content-xml.md) and the full reference in [../content-xml.md](../content-xml.md). | | `content.dtd` | 2.2 KB | Bundled DTD for offline validation of `content.xml`. Generated from `ODE_DTD_CONTENT` in `src/shared/export/constants.ts:1006`. Always emitted by `ElpxExporter` in v4 packages. | | `index.html` | 4.9 KB | First page rendered as a self-contained HTML5 document. It includes navigation, theme, and iDevice scripts via relative paths. This is what browsers open when the ZIP is extracted. | | `screenshot.png` | 67 KB | 1280×720 PNG project thumbnail at the archive root. v4 packages always carry one; legacy packages without it are patched by [`scripts/add-screenshot.ts`](../../../scripts/add-screenshot.ts). See [../screenshot.md](../screenshot.md). | | `search_index.js` | 11 KB | Pre-built search index for the runtime search box. Emitted only when `pp_addSearchBox` is `true` in ``. | This fixture has the search box enabled, hence the presence of `search_index.js`. Distinct from `theme/screenshot.png`, which is the **theme** preview thumbnail used in the theme picker — see the [`theme/`](#theme--active-theme-files) section. --- ### `html/` — per-page HTML files ``` html/page-1---1.html 5.1 KB Page "Page 1 - 1" (child of Page 1) html/page-1---1--1.html 5.1 KB Page "Page 1 - 1 - 1" (child of Page 1-1) html/page-1---2.html 5.1 KB Page "Page 1 - 2" (child of Page 1) html/page-2.html 5.0 KB Page "Page 2" (root page) html/page-2---1.html 5.1 KB Page "Page 2 - 1" (child of Page 2) ``` One `.html` file per page, except the first root page which becomes `index.html`. Filenames are slugified from page titles; spaces become `-` and the slugifier escapes literal hyphens by doubling them — that is why `Page 1 - 1` becomes `page-1---1.html` (three dashes: the original `-` plus the two delimiter dashes around the spaces). Internal links use relative paths (`../html/page-2.html`); `exe-node:` URIs in `content.xml` are resolved to these relative paths at export time. The exporter that writes these files is `src/shared/export/exporters/Html5Exporter.ts`. See [../container.md](../container.md) for the complete naming algorithm. --- ### `content/css/` — base stylesheet ``` content/css/base.css 13 KB Core layout + utility classes for all themes ``` `base.css` defines the structural layout (`.exe-layout`, `.exe-block`, block visibility toggles, accessibility toolbar) that is theme-independent. Themes layer their own `theme/style.css` on top. > **Note**: previous v3-era exports also wrote `content/css/icons/*.svg` (around 75 small > SVG files for the runtime UI). The v4 exporter no longer ships them at this path — > icon glyphs are inlined into `base.css` and `theme/style.css` as data URIs or referenced > from the active theme's own `icons/` directory. See [../themes.md](../themes.md) for the CSS layering model. --- ### `content/img/` — branding image ``` content/img/exe_powered_logo.png 2 KB "Powered by eXeLearning" badge ``` Displayed in the footer when `pp_addExeLink` is `true` in ``. The exporter injects a `