text: "use strict";
  
  var os = require("os");
  var gulp = require("gulp");
  var gutil = require("gulp-util");
  var sass = require("gulp-ruby-sass");
  var jshint = require("gulp-jshint");
  var uglify = require("gulp-uglifyjs");
  var rename = require("gulp-rename");
  var concat = require("gulp-concat");
  var notify = require("gulp-notify");
  var header = require("gulp-header");
  var minifycss = require("gulp-minify-css");
  //var jsdoc        = require("gulp-jsdoc");
  //var jsdoc2md     = require("gulp-jsdoc-to-markdown");
  var pkg = require("./package.json");
  var dateFormat = require("dateformatter").format;
  var replace = require("gulp-replace");
  
  pkg.name = "Editor.md";
  pkg.today = dateFormat;
  
  var headerComment = ["/*",
      " * <%= pkg.name %>",
      " *",
      " * @file        <%= fileName(file) %> ",
      " * @version     v<%= pkg.version %> ",
      " * @description <%= pkg.description %>",
      " * @license     MIT License",
      " * @author      <%= pkg.author %>",
      " * {@link       <%= pkg.homepage %>}",
      " * @updateTime  <%= pkg.today('Y-m-d') %>",
      " */",
      "\r\n"].join("\r\n");
  
  var headerMiniComment = "/*! <%= pkg.name %> v<%= pkg.version %> | <%= fileName(file) %> | <%= pkg.description %> | MIT License | By: <%= pkg.author %> | <%= pkg.homepage %> | <%=pkg.today('Y-m-d') %> */\r\n";
  
  var scssTask = function (fileName, path) {
  
      path = path || "scss/";
  
      var distPath = "css";
  
      return sass(path + fileName + ".scss", {style: "expanded", sourcemap: false, noCache: true})
          .pipe(gulp.dest(distPath))
          .pipe(header(headerComment, {
              pkg: pkg, fileName: function (file) {
                  var name = file.path.split(file.base);
                  return name[1].replace("\\", "");
              }
          }))
          .pipe(gulp.dest(distPath))
          .pipe(rename({suffix: ".min"}))
          .pipe(gulp.dest(distPath))
          .pipe(minifycss())
          .pipe(gulp.dest(distPath))
          .pipe(header(headerMiniComment, {
              pkg: pkg, fileName: function (file) {
                  var name = file.path.split(file.base);
                  return name[1].replace("\\", "");
              }
          }))
          .pipe(gulp.dest(distPath))
          .pipe(notify({message: fileName + ".scss task completed!"}));
  };
  
  gulp.task("scss", function () {
      return scssTask("editormd");
  });
  
  gulp.task("scss2", function () {
      return scssTask("editormd.preview");
  });
  
  gulp.task("scss3", function () {
      return scssTask("editormd.logo");
  });
  
  gulp.task("js", function () {
      return gulp.src("./src/editormd.js")
          .pipe(jshint("./.jshintrc"))
          .pipe(jshint.reporter("default"))
          .pipe(header(headerComment, {
              pkg: pkg, fileName: function (file) {
                  var name = file.path.split(file.base);
                  return name[1].replace(/[\\\/]?/, "");
              }
          }))
          .pipe(gulp.dest("./"))
          .pipe(rename({suffix: ".min"}))
          .pipe(uglify())  // {outSourceMap: true, sourceRoot: './'}
          .pipe(gulp.dest("./"))
          .pipe(header(headerMiniComment, {
              pkg: pkg, fileName: function (file) {
                  var name = file.path.split(file.base + ( (os.platform() === "win32") ? "\\" : "/"));
                  return name[1].replace(/[\\\/]?/, "");
              }
          }))
          .pipe(gulp.dest("./"))
          .pipe(notify({message: "editormd.js task complete"}));
  });
  
  gulp.task("amd", function () {
      var replaceText1 = [
          'var cmModePath  = "codemirror/mode/";',
          '            var cmAddonPath = "codemirror/addon/";',
          '',
          '            var codeMirrorModules = [',
          '                "jquery", "marked", "prettify",',
          '                "katex", "raphael", "underscore", "flowchart",  "jqueryflowchart",  "sequenceDiagram",',
          '',
          '                "codemirror/lib/codemirror",',
          '                cmModePath + "css/css",',
          '                cmModePath + "sass/sass",',
          '                cmModePath + "shell/shell",',
          '                cmModePath + "sql/sql",',
          '                cmModePath + "clike/clike",',
          '                cmModePath + "php/php",',
          '                cmModePath + "xml/xml",',
          '                cmModePath + "markdown/markdown",',
          '                cmModePath + "javascript/javascript",',
          '                cmModePath + "htmlmixed/htmlmixed",',
          '                cmModePath + "gfm/gfm",',
          '                cmModePath + "http/http",',
          '                cmModePath + "go/go",',
          '                cmModePath + "dart/dart",',
          '                cmModePath + "coffeescript/coffeescript",',
          '                cmModePath + "nginx/nginx",',
          '                cmModePath + "python/python",',
          '                cmModePath + "perl/perl",',
          '                cmModePath + "lua/lua",',
          '                cmModePath + "r/r", ',
          '                cmModePath + "ruby/ruby", ',
          '                cmModePath + "rst/rst",',
          '                cmModePath + "smartymixed/smartymixed",',
          '                cmModePath + "vb/vb",',
          '                cmModePath + "vbscript/vbscript",',
          '                cmModePath + "velocity/velocity",',
          '                cmModePath + "xquery/xquery",',
          '                cmModePath + "yaml/yaml",',
          '                cmModePath + "erlang/erlang",',
          '                cmModePath + "jade/jade",',
          '',
          '                cmAddonPath + "edit/trailingspace", ',
          '                cmAddonPath + "dialog/dialog", ',
          '                cmAddonPath + "search/searchcursor", ',
          '                cmAddonPath + "search/search", ',
          '                cmAddonPath + "scroll/annotatescrollbar", ',
          '                cmAddonPath + "search/matchesonscrollbar", ',
          '                cmAddonPath + "display/placeholder", ',
          '                cmAddonPath + "edit/closetag", ',
          '                cmAddonPath + "fold/foldcode",',
          '                cmAddonPath + "fold/foldgutter",',
          '                cmAddonPath + "fold/indent-fold",',
          '                cmAddonPath + "fold/brace-fold",',
          '                cmAddonPath + "fold/xml-fold", ',
          '                cmAddonPath + "fold/markdown-fold",',
          '                cmAddonPath + "fold/comment-fold", ',
          '                cmAddonPath + "mode/overlay", ',
          '                cmAddonPath + "selection/active-line", ',
          '                cmAddonPath + "edit/closebrackets", ',
          '                cmAddonPath + "display/fullscreen",',
          '                cmAddonPath + "search/match-highlighter"',
          '            ];',
          '',
          '            define(codeMirrorModules, factory);'
      ].join("\r\n");
  
      var replaceText2 = [
          "if (typeof define == \"function\" && define.amd) {",
          "       $          = arguments[0];",
          "       marked     = arguments[1];",
          "       prettify   = arguments[2];",
          "       katex      = arguments[3];",
          "       Raphael    = arguments[4];",
          "       _          = arguments[5];",
          "       flowchart  = arguments[6];",
          "       CodeMirror = arguments[9];",
          "   }"
      ].join("\r\n");
  
      gulp.src("src/editormd.js")
          .pipe(rename({suffix: ".amd"}))
          .pipe(gulp.dest('./'))
          .pipe(header(headerComment, {
              pkg: pkg, fileName: function (file) {
                  var name = file.path.split(file.base);
                  return name[1].replace(/[\\\/]?/, "");
              }
          }))
          .pipe(gulp.dest("./"))
          .pipe(replace("/* Require.js define replace */", replaceText1))
          .pipe(gulp.dest('./'))
          .pipe(replace("/* Require.js assignment replace */", replaceText2))
          .pipe(gulp.dest('./'))
          .pipe(rename({suffix: ".min"}))
          .pipe(uglify()) //{outSourceMap: true, sourceRoot: './'}
          .pipe(gulp.dest("./"))
          .pipe(header(headerMiniComment, {
              pkg: pkg, fileName: function (file) {
                  var name = file.path.split(file.base + ( (os.platform() === "win32") ? "\\" : "/"));
                  return name[1].replace(/[\\\/]?/, "");
              }
          }))
          .pipe(gulp.dest("./"))
          .pipe(notify({message: "amd version task complete"}));
  });
  
  
  var codeMirror = {
      path: {
          src: {
              mode: "lib/codemirror/mode",
              addon: "lib/codemirror/addon"
          },
          dist: "lib/codemirror"
      },
      modes: [
          "css",
          "sass",
          "shell",
          "sql",
          "clike",
          "php",
          "xml",
          "markdown",
          "javascript",
          "htmlmixed",
          "gfm",
          "http",
          "go",
          "dart",
          "coffeescript",
          "nginx",
          "python",
          "perl",
          "lua",
          "r",
          "ruby",
          "rst",
          "smartymixed",
          "vb",
          "vbscript",
          "velocity",
          "xquery",
          "yaml",
          "erlang",
          "jade",
      ],
  
      addons: [
          "edit/trailingspace",
          "dialog/dialog",
          "search/searchcursor",
          "search/search",
          "scroll/annotatescrollbar",
          "search/matchesonscrollbar",
          "display/placeholder",
          "edit/closetag",
          "fold/foldcode",
          "fold/foldgutter",
          "fold/indent-fold",
          "fold/brace-fold",
          "fold/xml-fold",
          "fold/markdown-fold",
          "fold/comment-fold",
          "mode/overlay",
          "selection/active-line",
          "edit/closebrackets",
          "display/fullscreen",
          "search/match-highlighter"
      ]
  };
  
  gulp.task("cm-mode", function () {
  
      var modes = [
          codeMirror.path.src.mode + "/meta.js"
      ];
  
      for (var i in codeMirror.modes) {
          var mode = codeMirror.modes[i];
          modes.push(codeMirror.path.src.mode + "/" + mode + "/" + mode + ".js");
      }
  
      return gulp.src(modes)
          .pipe(concat("modes.min.js"))
          .pipe(gulp.dest(codeMirror.path.dist))
          .pipe(uglify()) // {outSourceMap: true, sourceRoot: codeMirror.path.dist}
          .pipe(gulp.dest(codeMirror.path.dist))
          .pipe(header(headerMiniComment, {
              pkg: pkg, fileName: function (file) {
                  var name = file.path.split(file.base + "\\");
                  return (name[1] ? name[1] : name[0]).replace(/\\/g, "");
              }
          }))
          .pipe(gulp.dest(codeMirror.path.dist))
          .pipe(notify({message: "codemirror-mode task complete!"}));
  });
  
  gulp.task("cm-addon", function () {
  
      var addons = [];
  
      for (var i in codeMirror.addons) {
          var addon = codeMirror.addons[i];
          addons.push(codeMirror.path.src.addon + "/" + addon + ".js");
      }
  
      return gulp.src(addons)
          .pipe(concat("addons.min.js"))
          .pipe(gulp.dest(codeMirror.path.dist))
          .pipe(uglify()) //{outSourceMap: true, sourceRoot: codeMirror.path.dist}
          .pipe(gulp.dest(codeMirror.path.dist))
          .pipe(header(headerMiniComment, {
              pkg: pkg, fileName: function (file) {
                  var name = file.path.split(file.base + "\\");
                  return (name[1] ? name[1] : name[0]).replace(/\\/g, "");
              }
          }))
          .pipe(gulp.dest(codeMirror.path.dist))
          .pipe(notify({message: "codemirror-addon.js task complete"}));
  });
  /*
   gulp.task("jsdoc", function(){
   return gulp.src(["./src/editormd.js", "README.md"])
   .pipe(jsdoc.parser())
   .pipe(jsdoc.generator("./docs/html"));
   });
  
   gulp.task("jsdoc2md", function() {
   return gulp.src("src/js/editormd.js")
   .pipe(jsdoc2md())
   .on("error", function(err){
   gutil.log(gutil.colors.red("jsdoc2md failed"), err.message);
   })
   .pipe(rename(function(path) {
   path.extname = ".md";
   }))
   .pipe(gulp.dest("docs/markdown"));
   });
   */
  gulp.task("watch", function () {
      gulp.watch("scss/editormd.scss", ["scss"]);
      gulp.watch("scss/editormd.preview.scss", ["scss", "scss2"]);
      gulp.watch("scss/editormd.logo.scss", ["scss", "scss3"]);
      gulp.watch("src/editormd.js", ["js", "amd"]);
  });
  
  gulp.task("default", function () {
      gulp.run("scss");
      gulp.run("scss2");
      gulp.run("scss3");
      gulp.run("js");
      gulp.run("amd");
      gulp.run("cm-addon");
      gulp.run("cm-mode");
  });