mdzip-core 0.1.0

Read and write MDZip (.mdz) archives: Markdown documents and their images in one portable file.
Documentation
{
  "description": "Whole-archive entry name checks (SPEC Section 5.4, 1.2.0). `entries` lists stored names in order; a name ending in `/` is a directory entry. An archive is valid when no two entries are equal after NFC normalization (ERR_DUPLICATE_PATH) and no file's path is also a directory of another entry (ERR_PATH_CONFLICT). Non-ASCII names are written as JSON \\u escapes so normalization differences stay visible. Names that differ only in case are valid (SHOULD NOT, not MUST NOT); consumers may warn.",
  "cases": [
    {
      "name": "distinct files are valid",
      "entries": [
        "index.md",
        "docs/intro.md",
        "images/logo.png"
      ],
      "valid": true
    },
    {
      "name": "optional directory entries are valid",
      "entries": [
        "docs/",
        "docs/intro.md",
        "index.md"
      ],
      "valid": true
    },
    {
      "name": "NFC duplicates are rejected",
      "entries": [
        "caf\u00e9.md",
        "cafe\u0301.md"
      ],
      "valid": false,
      "errorCode": "ERR_DUPLICATE_PATH"
    },
    {
      "name": "names differing only in case are valid",
      "entries": [
        "Index.md",
        "index.md"
      ],
      "valid": true,
      "note": "Section 5.4 SHOULD NOT; consumers may warn about extraction collisions (Section 13.1)."
    },
    {
      "name": "a file that is also a directory is rejected",
      "entries": [
        "docs",
        "docs/intro.md"
      ],
      "valid": false,
      "errorCode": "ERR_PATH_CONFLICT"
    },
    {
      "name": "a file that is also a directory entry is rejected",
      "entries": [
        "docs",
        "docs/"
      ],
      "valid": false,
      "errorCode": "ERR_PATH_CONFLICT"
    },
    {
      "name": "a file and a directory equal after NFC are rejected",
      "entries": [
        "caf\u00e9",
        "cafe\u0301/menu.md"
      ],
      "valid": false,
      "errorCode": "ERR_PATH_CONFLICT"
    },
    {
      "name": "a nested file that is also a directory is rejected",
      "entries": [
        "a/b",
        "a/b/c.md",
        "index.md"
      ],
      "valid": false,
      "errorCode": "ERR_PATH_CONFLICT"
    }
  ]
}