rfc2253Parser.js 1.75 KB
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.parseDn = parseDn;

function parseDn(seq) {
  let quoted = false;
  let key = null;
  let token = "";
  let nextNonSpace = 0;
  seq = seq.trim();
  const result = new Map();

  for (let i = 0; i <= seq.length; i++) {
    if (i === seq.length) {
      if (key !== null) {
        result.set(key, token);
      }

      break;
    }

    const ch = seq[i];

    if (quoted) {
      if (ch === '"') {
        quoted = false;
        continue;
      }
    } else {
      if (ch === '"') {
        quoted = true;
        continue;
      }

      if (ch === "\\") {
        i++;
        const ord = parseInt(seq.slice(i, i + 2), 16);

        if (Number.isNaN(ord)) {
          token += seq[i];
        } else {
          i++;
          token += String.fromCharCode(ord);
        }

        continue;
      }

      if (key === null && ch === "=") {
        key = token;
        token = "";
        continue;
      }

      if (ch === "," || ch === ";" || ch === "+") {
        if (key !== null) {
          result.set(key, token);
        }

        key = null;
        token = "";
        continue;
      }
    }

    if (ch === " " && !quoted) {
      if (token.length === 0) {
        continue;
      }

      if (i > nextNonSpace) {
        let j = i;

        while (seq[j] === " ") {
          j++;
        }

        nextNonSpace = j;
      }

      if (nextNonSpace >= seq.length || seq[nextNonSpace] === "," || seq[nextNonSpace] === ";" || key === null && seq[nextNonSpace] === "=" || key !== null && seq[nextNonSpace] === "+") {
        i = nextNonSpace - 1;
        continue;
      }
    }

    token += ch;
  }

  return result;
} 
// __ts-babel@6.0.4
//# sourceMappingURL=rfc2253Parser.js.map