// CodeMirror, copyright (c) by Marijn Haverbeke and others

// Distributed under an MIT license: https://codemirror.net/LICENSE



(function(mod) {

  if (typeof exports == "object" && typeof module == "object") // CommonJS

    mod(require("../../lib/codemirror"));

  else if (typeof define == "function" && define.amd) // AMD

    define(["../../lib/codemirror"], mod);

  else // Plain browser env

    mod(CodeMirror);

})(function(CodeMirror) {

  "use strict";



  function errorIfNotEmpty(stream) {

    var nonWS = stream.match(/^\s*\S/);

    stream.skipToEnd();

    return nonWS ? "error" : null;

  }



  CodeMirror.defineMode("asciiarmor", function() {

    return {

      token: function(stream, state) {

        var m;

        if (state.state == "top") {

          if (stream.sol() && (m = stream.match(/^-----BEGIN (.*)?-----\s*$/))) {

            state.state = "headers";

            state.type = m[1];

            return "tag";

          }

          return errorIfNotEmpty(stream);

        } else if (state.state == "headers") {

          if (stream.sol() && stream.match(/^\w+:/)) {

            state.state = "header";

            return "atom";

          } else {

            var result = errorIfNotEmpty(stream);

            if (result) state.state = "body";

            return result;

          }

        } else if (state.state == "header") {

          stream.skipToEnd();

          state.state = "headers";

          return "string";

        } else if (state.state == "body") {

          if (stream.sol() && (m = stream.match(/^-----END (.*)?-----\s*$/))) {

            if (m[1] != state.type) return "error";

            state.state = "end";

            return "tag";

          } else {

            if (stream.eatWhile(/[A-Za-z0-9+\/=]/)) {

              return null;

            } else {

              stream.next();

              return "error";

            }

          }

        } else if (state.state == "end") {

          return errorIfNotEmpty(stream);

        }

      },

      blankLine: function(state) {

        if (state.state == "headers") state.state = "body";

      },

      startState: function() {

        return {state: "top", type: null};

      }

    };

  });



  CodeMirror.defineMIME("application/pgp", "asciiarmor");

  CodeMirror.defineMIME("application/pgp-encrypted", "asciiarmor");

  CodeMirror.defineMIME("application/pgp-keys", "asciiarmor");

  CodeMirror.defineMIME("application/pgp-signature", "asciiarmor");

});

