text: // 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")
      mod(require("../../codemirror"));
    else if (typeof define == "function" && define.amd)
      define(["../../codemirror"], mod);
    else
      mod(CodeMirror);
  })(function(CodeMirror) {
  "use strict";
  
  CodeMirror.defineMode('troff', function() {
  
    var words = {};
  
    function tokenBase(stream) {
      if (stream.eatSpace()) return null;
  
      var sol = stream.sol();
      var ch = stream.next();
  
      if (ch === '\\') {
        if (stream.match('fB') || stream.match('fR') || stream.match('fI') ||
            stream.match('u')  || stream.match('d')  ||
            stream.match('%')  || stream.match('&')) {
          return 'string';
        }
        if (stream.match('m[')) {
          stream.skipTo(']');
          stream.next();
          return 'string';
        }
        if (stream.match('s+') || stream.match('s-')) {
          stream.eatWhile(/[\d-]/);
          return 'string';
        }
        if (stream.match('\(') || stream.match('*\(')) {
          stream.eatWhile(/[\w-]/);
          return 'string';
        }
        return 'string';
      }
      if (sol && (ch === '.' || ch === '\'')) {
        if (stream.eat('\\') && stream.eat('\"')) {
          stream.skipToEnd();
          return 'comment';
        }
      }
      if (sol && ch === '.') {
        if (stream.match('B ') || stream.match('I ') || stream.match('R ')) {
          return 'attribute';
        }
        if (stream.match('TH ') || stream.match('SH ') || stream.match('SS ') || stream.match('HP ')) {
          stream.skipToEnd();
          return 'quote';
        }
        if ((stream.match(/[A-Z]/) && stream.match(/[A-Z]/)) || (stream.match(/[a-z]/) && stream.match(/[a-z]/))) {
          return 'attribute';
        }
      }
      stream.eatWhile(/[\w-]/);
      var cur = stream.current();
      return words.hasOwnProperty(cur) ? words[cur] : null;
    }
  
    function tokenize(stream, state) {
      return (state.tokens[0] || tokenBase) (stream, state);
    };
  
    return {
      startState: function() {return {tokens:[]};},
      token: function(stream, state) {
        return tokenize(stream, state);
      }
    };
  });
  
  CodeMirror.defineMIME('text/troff', 'troff');
  CodeMirror.defineMIME('text/x-troff', 'troff');
  CodeMirror.defineMIME('application/x-troff', 'troff');
  
  });
  