UNPKG

salve-annos

Version:

A fork with support for documentation of Salve, a Javascript library which implements a validator able to validate an XML document on the basis of a subset of RelaxNG.

93 lines 4.16 kB
"use strict"; /** * This module contains the logic for converting a simplified schema to a * pattern. * * @author Louis-Dominique Dubeau * @license MPL 2.0 * @copyright Mangalam Research Center for Buddhist Languages */ Object.defineProperty(exports, "__esModule", { value: true }); exports.makePatternFromSimplifiedSchema = makePatternFromSimplifiedSchema; const name_patterns_1 = require("../name_patterns"); const patterns_1 = require("../patterns"); function walk(el) { switch (el.local) { // "param" is not needed as a separate case, because it is handled in // "data" // case "grammar": return new patterns_1.Grammar(el.path, walk(el.children[0]), el.children.slice(1) .map(x => walk(x))); case "except": case "start": return walk(el.children[0]); case "define": return new patterns_1.Define(el.path, el.mustGetAttribute("name"), walk(el.children[0])); case "ref": return new patterns_1.Ref(el.path, el.mustGetAttribute("name")); case "value": return new patterns_1.Value(el.path, el.text, el.mustGetAttribute("type"), el.mustGetAttribute("datatypeLibrary"), el.mustGetAttribute("ns"), el.documentation); case "data": const children = el.children; const length = children.length; const last = children[length - 1]; const except = (length !== 0 && last.local === "except") ? last : undefined; const params = (except === undefined ? children : children.slice(0, -1)) .map(param => ({ name: param.mustGetAttribute("name"), value: param.children[0].text })); return new patterns_1.Data(el.path, el.mustGetAttribute("type"), el.mustGetAttribute("datatypeLibrary"), params, except !== undefined ? walk(except) : undefined); case "group": return new patterns_1.Group(el.path, walk(el.children[0]), walk(el.children[1])); case "interleave": return new patterns_1.Interleave(el.path, walk(el.children[0]), walk(el.children[1])); case "choice": return new patterns_1.Choice(el.path, walk(el.children[0]), walk(el.children[1])); case "oneOrMore": return new patterns_1.OneOrMore(el.path, walk(el.children[0])); case "element": return new patterns_1.Element(el.path, walkNameClass(el.children[0]), walk(el.children[1])); case "attribute": return new patterns_1.Attribute(el.path, walkNameClass(el.children[0]), walk(el.children[1])); case "empty": return new patterns_1.Empty(el.path); case "text": return new patterns_1.Text(el.path); case "list": return new patterns_1.List(el.path, walk(el.children[0])); case "notAllowed": return new patterns_1.NotAllowed(el.path); default: throw new Error(`unexpected local name: ${el.local}`); } } function walkNameClass(el) { switch (el.local) { case "choice": return new name_patterns_1.NameChoice(walkNameClass(el.children[0]), walkNameClass(el.children[1])); case "name": return new name_patterns_1.Name(el.mustGetAttribute("ns"), el.text, el.documentation); case "nsName": return new name_patterns_1.NsName(el.mustGetAttribute("ns"), el.children.length !== 0 ? walkNameClass(el.children[0]) : undefined); case "anyName": return new name_patterns_1.AnyName(el.children.length !== 0 ? walkNameClass(el.children[0]) : undefined); case "except": return walkNameClass(el.children[0]); default: throw new Error(`unexpected local name: ${el.local}`); } } function makePatternFromSimplifiedSchema(tree) { const ret = walk(tree); if (!(ret instanceof patterns_1.Grammar)) { throw new Error("tree did not produce a Grammar!"); } return ret; } //# sourceMappingURL=convert-simplified.js.map