Spaces:
Sleeping
Sleeping
| (function () { | |
| var URI_NS = require("../uri"), | |
| URI = URI_NS.URI, | |
| pctEncChar = URI_NS.pctEncChar, | |
| NID$ = "(?:[0-9A-Za-z][0-9A-Za-z\\-]{1,31})", | |
| PCT_ENCODED$ = "(?:\\%[0-9A-Fa-f]{2})", | |
| TRANS$$ = "[0-9A-Za-z\\(\\)\\+\\,\\-\\.\\:\\=\\@\\;\\$\\_\\!\\*\\'\\/\\?\\#]", | |
| NSS$ = "(?:(?:" + PCT_ENCODED$ + "|" + TRANS$$ + ")+)", | |
| URN_SCHEME = new RegExp("^urn\\:(" + NID$ + ")$"), | |
| URN_PATH = new RegExp("^(" + NID$ + ")\\:(" + NSS$ + ")$"), | |
| URN_PARSE = /^([^\:]+)\:(.*)/, | |
| URN_EXCLUDED = /[\x00-\x20\\\"\&\<\>\[\]\^\`\{\|\}\~\x7F-\xFF]/g, | |
| UUID = /^[0-9A-Fa-f]{8}(?:\-[0-9A-Fa-f]{4}){3}\-[0-9A-Fa-f]{12}$/; | |
| //RFC 2141 | |
| URI.SCHEMES["urn"] = { | |
| parse : function (components, options) { | |
| var matches = components.path.match(URN_PATH), | |
| scheme, schemeHandler; | |
| if (!matches) { | |
| if (!options.tolerant) { | |
| components.errors.push("URN is not strictly valid."); | |
| } | |
| matches = components.path.match(URN_PARSE); | |
| } | |
| if (matches) { | |
| scheme = "urn:" + matches[1].toLowerCase(); | |
| schemeHandler = URI.SCHEMES[scheme]; | |
| //in order to serialize properly, | |
| //every URN must have a serializer that calls the URN serializer | |
| if (!schemeHandler) { | |
| schemeHandler = URI.SCHEMES[scheme] = {}; | |
| } | |
| if (!schemeHandler.serialize) { | |
| schemeHandler.serialize = URI.SCHEMES["urn"].serialize; | |
| } | |
| components.scheme = scheme; | |
| components.path = matches[2]; | |
| if (schemeHandler.parse) { | |
| schemeHandler.parse(components, options); | |
| } | |
| } else { | |
| components.errors.push("URN can not be parsed."); | |
| } | |
| return components; | |
| }, | |
| serialize : function (components, options) { | |
| var scheme = components.scheme || options.scheme, | |
| matches; | |
| if (scheme && scheme !== "urn") { | |
| var matches = scheme.match(URN_SCHEME); | |
| if (!matches) { | |
| matches = ["urn:" + scheme, scheme]; | |
| } | |
| components.scheme = "urn"; | |
| components.path = matches[1] + ":" + (components.path ? components.path.replace(URN_EXCLUDED, pctEncChar) : ""); | |
| } | |
| return components; | |
| } | |
| }; | |
| //RFC 4122 | |
| URI.SCHEMES["urn:uuid"] = { | |
| serialize : function (components, options) { | |
| //ensure UUID is valid | |
| if (!options.tolerant && (!components.path || !components.path.match(UUID))) { | |
| //invalid UUIDs can not have this scheme | |
| components.scheme = undefined; | |
| } | |
| return URI.SCHEMES["urn"].serialize(components, options); | |
| } | |
| }; | |
| }()); |