// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function (mod) {
    if (typeof exports == "object" && typeof module == "object") // CommonJS
        mod(require("../../lib/codemirror"), require("../../addon/mode/simple"));
    else if (typeof define == "function" && define.amd) // AMD
        define(["../../lib/codemirror", "../../addon/mode/simple"], mod);
    else // Plain browser env
        mod(CodeMirror);
})(function (CodeMirror) {
    "use strict";

    // Collect all Dockerfile directives
    var instructions = ["from", "maintainer", "run", "cmd", "expose", "env",
            "add", "copy", "entrypoint", "volume", "user",
            "workdir", "onbuild"],
        instructionRegex = "(" + instructions.join('|') + ")",
        instructionOnlyLine = new RegExp(instructionRegex + "\\s*$", "i"),
        instructionWithArguments = new RegExp(instructionRegex + "(\\s+)", "i");

    CodeMirror.defineSimpleMode("dockerfile", {
        start: [
            // Block comment: This is a line starting with a comment
            {
                regex: /#.*$/,
                token: "comment"
            },
            // Highlight an instruction without any arguments (for convenience)
            {
                regex: instructionOnlyLine,
                token: "variable-2"
            },
            // Highlight an instruction followed by arguments
            {
                regex: instructionWithArguments,
                token: ["variable-2", null],
                next: "arguments"
            },
            {
                regex: /./,
                token: null
            }
        ],
        arguments: [
            {
                // Line comment without instruction arguments is an error
                regex: /#.*$/,
                token: "error",
                next: "start"
            },
            {
                regex: /[^#]+\\$/,
                token: null
            },
            {
                // Match everything except for the inline comment
                regex: /[^#]+/,
                token: null,
                next: "start"
            },
            {
                regex: /$/,
                token: null,
                next: "start"
            },
            // Fail safe return to start
            {
                token: null,
                next: "start"
            }
        ]
    });

    CodeMirror.defineMIME("text/x-dockerfile", "dockerfile");
});
