ace.define("ace/mode/mediawiki_highlight_rules", ["require", "exports", "module", "ace/lib/oop", "ace/mode/text_highlight_rules"], function (require, exports, module) {
  "use strict";

  var oop = require("../lib/oop");

  var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;

  var MediaWikiHighlightRules = function MediaWikiHighlightRules() {
    this.$rules = {
      start: [{
        include: "#switch"
      }, {
        include: "#redirect"
      }, {
        include: "#variable"
      }, {
        include: "#comment"
      }, {
        include: "#entity"
      }, {
        include: "#emphasis"
      }, {
        include: "#tag"
      }, {
        include: "#table"
      }, {
        include: "#hr"
      }, {
        include: "#heading"
      }, {
        include: "#link"
      }, {
        include: "#list"
      }, {
        include: "#template"
      }],
      "#hr": [{
        token: "markup.bold",
        regex: /^[-]{4,}/
      }],
      "#switch": [{
        token: "constant.language",
        regex: /(__NOTOC__|__FORCETOC__|__TOC__|__NOEDITSECTION__|__NEWSECTIONLINK__|__NONEWSECTIONLINK__|__NOWYSIWYG__|__NOGALLERY__|__HIDDENCAT__|__EXPECTUNUSEDCATEGORY__|__NOCONTENTCONVERT__|__NOCC__|__NOTITLECONVERT__|__NOTC__|__START__|__END__|__INDEX__|__NOINDEX__|__STATICREDIRECT__|__NOGLOBAL__|__DISAMBIG__)/
      }],
      "#redirect": [{
        token: ["keyword.control.redirect", "meta.keyword.control"],
        regex: /(^#REDIRECT|^#redirect|^#Redirect)(\s+)/
      }],
      "#variable": [{
        token: "storage.type.variable",
        regex: /{{{/,
        push: [{
          token: "storage.type.variable",
          regex: /}}}/,
          next: "pop"
        }, {
          token: ["text", "variable.other", "text", "keyword.operator"],
          regex: /(\s*)(\w+)(\s*)((?:\|)?)/
        }, {
          defaultToken: "storage.type.variable"
        }]
      }],
      "#entity": [{
        token: "constant.character.entity",
        regex: /&\w+;/
      }],
      "#list": [{
        token: "markup.bold",
        regex: /^[#*;:]+/,
        push: [{
          token: "markup.list",
          regex: /$/,
          next: "pop"
        }, {
          include: "$self"
        }, {
          defaultToken: "markup.list"
        }]
      }],
      "#template": [{
        token: ["storage.type.function", "meta.template", "entity.name.function", "meta.template"],
        regex: /({{)(\s*)([#\w: ]+)(\s*)/,
        push: [{
          token: "storage.type.function",
          regex: /}}/,
          next: "pop"
        }, {
          token: ["storage", "meta.structure.dictionary", "support.type.property-name", "meta.structure.dictionary", "punctuation.separator.dictionary.key-value", "meta.structure.dictionary", "meta.structure.dictionary.value"],
          regex: /(\|)(\s*)([a-zA-Z-]*)(\s*)(=)(\s*)([^|}]*)/,
          push: [{
            token: "meta.structure.dictionary",
            regex: /(?=}}|[|])/,
            next: "pop"
          }, {
            defaultToken: "meta.structure.dictionary"
          }]
        }, {
          token: ["storage", "meta.template.value"],
          regex: /(\|)(.*?)/,
          push: [{
            token: [],
            regex: /(?=}}|[|])/,
            next: "pop"
          }, {
            include: "$self"
          }, {
            defaultToken: "meta.template.value"
          }]
        }, {
          defaultToken: "meta.template"
        }]
      }],
      "#link": [{
        token: ["punctuation.definition.tag.begin", "meta.tag.link.internal", "entity.name.tag", "meta.tag.link.internal", "string.other.link.title", "meta.tag.link.internal", "punctuation.definition.tag"],
        regex: /(\[\[)(\s*)((?:Category|Wikipedia)?)(:?)([^\]\]\|]+)(\s*)((?:\|)*)/,
        push: [{
          token: "punctuation.definition.tag.end",
          regex: /\]\]/,
          next: "pop"
        }, {
          include: "$self"
        }, {
          defaultToken: "meta.tag.link.internal"
        }]
      }, {
        token: ["punctuation.definition.tag.begin", "meta.tag.link.external", "meta.tag.link.external", "string.unquoted", "punctuation.definition.tag.end"],
        regex: /(\[)(.*?)([\s]+)(.*?)(\])/
      }],
      "#comment": [{
        token: "punctuation.definition.comment.html",
        regex: /<!--/,
        push: [{
          token: "punctuation.definition.comment.html",
          regex: /-->/,
          next: "pop"
        }, {
          defaultToken: "comment.block.html"
        }]
      }],
      "#emphasis": [{
        token: ["punctuation.definition.tag.begin", "markup.italic.bold", "punctuation.definition.tag.end"],
        regex: /(''''')(?!')(.*?)('''''|$)/
      }, {
        token: ["punctuation.definition.tag.begin", "markup.bold", "punctuation.definition.tag.end"],
        regex: /(''')(?!')(.*?)('''|$)/
      }, {
        token: ["punctuation.definition.tag.begin", "markup.italic", "punctuation.definition.tag.end"],
        regex: /('')(?!')(.*?)(''|$)/
      }],
      "#heading": [{
        token: ["punctuation.definition.heading", "entity.name.section", "punctuation.definition.heading"],
        regex: /(={1,6})(.+?)(\1)(?!=)/
      }],
      "#tag": [{
        token: ["punctuation.definition.tag.begin", "entity.name.tag", "meta.tag.block.ref", "punctuation.definition.tag.end"],
        regex: /(<)(ref)((?:\s+.*?)?)(>)/,
        caseInsensitive: true,
        push: [{
          token: ["punctuation.definition.tag.begin", "entity.name.tag", "meta.tag.block.ref", "punctuation.definition.tag.end"],
          regex: /(<\/)(ref)(\s*)(>)/,
          caseInsensitive: true,
          next: "pop"
        }, {
          include: "$self"
        }, {
          defaultToken: "meta.tag.block.ref"
        }]
      }, {
        token: ["punctuation.definition.tag.begin", "entity.name.tag", "meta.tag.block.nowiki", "punctuation.definition.tag.end"],
        regex: /(<)(nowiki)((?:\s+.*?)?)(>)/,
        caseInsensitive: true,
        push: [{
          token: ["punctuation.definition.tag.begin", "entity.name.tag", "meta.tag.block.nowiki", "punctuation.definition.tag.end"],
          regex: /(<\/)(nowiki)(\s*)(>)/,
          caseInsensitive: true,
          next: "pop"
        }, {
          defaultToken: "meta.tag.block.nowiki"
        }]
      }, {
        token: ["punctuation.definition.tag.begin", "entity.name.tag"],
        regex: /(<\/?)(noinclude|includeonly|onlyinclude)(?=\W)/,
        caseInsensitive: true,
        push: [{
          token: ["invalid.illegal", "punctuation.definition.tag.end"],
          regex: /((?:\/)?)(>)/,
          next: "pop"
        }, {
          include: "#attribute"
        }, {
          defaultToken: "meta.tag.block.any"
        }]
      }, {
        token: ["punctuation.definition.tag.begin", "entity.name.tag"],
        regex: /(<)(br|wbr|hr|meta|link)(?=\W)/,
        caseInsensitive: true,
        push: [{
          token: "punctuation.definition.tag.end",
          regex: /\/?>/,
          next: "pop"
        }, {
          include: "#attribute"
        }, {
          defaultToken: "meta.tag.other"
        }]
      }, {
        token: ["punctuation.definition.tag.begin", "entity.name.tag"],
        regex: /(<\/?)(div|center|span|h1|h2|h3|h4|h5|h6|bdo|em|strong|cite|dfn|code|samp|kbd|var|abbr|blockquote|q|sub|sup|p|pre|ins|del|ul|ol|li|dl|dd|dt|table|caption|thead|tfoot|tbody|colgroup|col|tr|td|th|a|img|video|source|track|tt|b|i|big|small|strike|s|u|font|ruby|rb|rp|rt|rtc|math|figure|figcaption|bdi|data|time|mark|html)(?=\W)/,
        caseInsensitive: true,
        push: [{
          token: ["invalid.illegal", "punctuation.definition.tag.end"],
          regex: /((?:\/)?)(>)/,
          next: "pop"
        }, {
          include: "#attribute"
        }, {
          defaultToken: "meta.tag.block"
        }]
      }, {
        token: ["punctuation.definition.tag.begin", "invalid.illegal"],
        regex: /(<\/)(br|wbr|hr|meta|link)(?=\W)/,
        caseInsensitive: true,
        push: [{
          token: "punctuation.definition.tag.end",
          regex: /\/?>/,
          next: "pop"
        }, {
          include: "#attribute"
        }, {
          defaultToken: "meta.tag.other"
        }]
      }],
      "#caption": [{
        token: ["meta.tag.block.table-caption", "punctuation.definition.tag.begin"],
        regex: /^(\s*)(\|\+)/,
        push: [{
          token: "meta.tag.block.table-caption",
          regex: /$/,
          next: "pop"
        }, {
          defaultToken: "meta.tag.block.table-caption"
        }]
      }],
      "#tr": [{
        token: ["meta.tag.block.tr", "punctuation.definition.tag.begin", "meta.tag.block.tr", "invalid.illegal"],
        regex: /^(\s*)(\|\-)([\s]*)(.*)/
      }],
      "#th": [{
        token: ["meta.tag.block.th.heading", "punctuation.definition.tag.begin", "meta.tag.block.th.heading", "punctuation.definition.tag", "markup.bold"],
        regex: /^(\s*)(!)(?:(.*?)(\|))?(.*?)(?=!!|$)/,
        push: [{
          token: "meta.tag.block.th.heading",
          regex: /$/,
          next: "pop"
        }, {
          token: ["punctuation.definition.tag.begin", "meta.tag.block.th.inline", "punctuation.definition.tag", "markup.bold"],
          regex: /(!!)(?:(.*?)(\|))?(.*?)(?=!!|$)/
        }, {
          include: "$self"
        }, {
          defaultToken: "meta.tag.block.th.heading"
        }]
      }],
      "#td": [{
        token: ["meta.tag.block.td", "punctuation.definition.tag.begin"],
        regex: /^(\s*)(\|)/,
        push: [{
          token: "meta.tag.block.td",
          regex: /$/,
          next: "pop"
        }, {
          include: "$self"
        }, {
          defaultToken: "meta.tag.block.td"
        }]
      }],
      "#table": [{
        patterns: [{
          name: "meta.tag.block.table",
          begin: "^\\s*({\\|)(.*?)$",
          end: "^\\s*\\|}",
          beginCaptures: {
            1: {
              name: "punctuation.definition.tag.begin"
            },
            2: {
              patterns: [{
                include: "#attribute"
              }]
            },
            3: {
              name: "invalid.illegal"
            }
          },
          endCaptures: {
            0: {
              name: "punctuation.definition.tag.end"
            }
          },
          patterns: [{
            include: "#comment"
          }, {
            include: "#template"
          }, {
            include: "#caption"
          }, {
            include: "#tr"
          }, {
            include: "#th"
          }, {
            include: "#td"
          }]
        }],
        repository: {
          caption: {
            name: "meta.tag.block.table-caption",
            begin: "^\\s*(\\|\\+)",
            end: "$",
            beginCaptures: {
              1: {
                name: "punctuation.definition.tag.begin"
              }
            }
          },
          tr: {
            name: "meta.tag.block.tr",
            match: "^\\s*(\\|\\-)[\\s]*(.*)",
            captures: {
              1: {
                name: "punctuation.definition.tag.begin"
              },
              2: {
                name: "invalid.illegal"
              }
            }
          },
          th: {
            name: "meta.tag.block.th.heading",
            begin: "^\\s*(!)((.*?)(\\|))?(.*?)(?=(!!)|$)",
            end: "$",
            beginCaptures: {
              1: {
                name: "punctuation.definition.tag.begin"
              },
              3: {
                patterns: [{
                  include: "#attribute"
                }]
              },
              4: {
                name: "punctuation.definition.tag"
              },
              5: {
                name: "markup.bold"
              }
            },
            patterns: [{
              name: "meta.tag.block.th.inline",
              match: "(!!)((.*?)(\\|))?(.*?)(?=(!!)|$)",
              captures: {
                1: {
                  name: "punctuation.definition.tag.begin"
                },
                3: {
                  patterns: [{
                    include: "#attribute"
                  }]
                },
                4: {
                  name: "punctuation.definition.tag"
                },
                5: {
                  name: "markup.bold"
                }
              }
            }, {
              include: "$self"
            }]
          },
          td: {
            name: "meta.tag.block.td",
            begin: "^\\s*(\\|)",
            end: "$",
            beginCaptures: {
              1: {
                name: "punctuation.definition.tag.begin"
              },
              2: {
                patterns: [{
                  include: "#attribute"
                }]
              },
              3: {
                name: "punctuation.definition.tag"
              }
            },
            patterns: [{
              include: "$self"
            }]
          }
        }
      }],
      "#attribute": [{
        include: "#string"
      }, {
        token: "entity.other.attribute-name",
        regex: /\w+/
      }],
      "#string": [{
        token: "string.quoted.double",
        regex: /\"/,
        push: [{
          token: "string.quoted.double",
          regex: /\"/,
          next: "pop"
        }, {
          defaultToken: "string.quoted.double"
        }]
      }, {
        token: "string.quoted.single",
        regex: /\'/,
        push: [{
          token: "string.quoted.single",
          regex: /\'/,
          next: "pop"
        }, {
          defaultToken: "string.quoted.single"
        }]
      }],
      "#url": [{
        token: "markup.underline.link",
        regex: /(?:http(?:s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:\/?#\[\]@!\$&'\(\)\*\+,;=.]+/
      }, {
        token: "invalid.illegal",
        regex: /.*/
      }]
    };
    this.normalizeRules();
  };

  MediaWikiHighlightRules.metaData = {
    name: "MediaWiki",
    scopeName: "text.html.mediawiki",
    fileTypes: ["mediawiki", "wiki"]
  };
  oop.inherits(MediaWikiHighlightRules, TextHighlightRules);
  exports.MediaWikiHighlightRules = MediaWikiHighlightRules;
});
ace.define("ace/mode/mediawiki", ["require", "exports", "module", "ace/lib/oop", "ace/mode/text", "ace/mode/mediawiki_highlight_rules"], function (require, exports, module) {
  "use strict";

  var oop = require("../lib/oop");

  var TextMode = require("./text").Mode;

  var MediaWikiHighlightRules = require("./mediawiki_highlight_rules").MediaWikiHighlightRules;

  var Mode = function Mode() {
    this.HighlightRules = MediaWikiHighlightRules;
  };

  oop.inherits(Mode, TextMode);
  (function () {
    this.type = "text";
    this.blockComment = {
      start: "<!--",
      end: "-->"
    };
    this.$id = "ace/mode/mediawiki";
  }).call(Mode.prototype);
  exports.Mode = Mode;
});

(function () {
  ace.require(["ace/mode/mediawiki"], function (m) {
    if (typeof module == "object" && typeof exports == "object" && module) {
      module.exports = m;
    }
  });
})();