www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

server.js (3197B)


      1 /* eslint no-console:0 */
      2 const fs = require("fs");
      3 const path = require("path");
      4 
      5 const babelify = require("babelify");
      6 const browserify = require("browserify");
      7 const express = require("express");
      8 const glob = require("glob");
      9 const less = require("less");
     10 
     11 const app = express();
     12 
     13 if (require.main === module) {
     14     app.use(require("morgan")(
     15         ":date[iso] :method :url HTTP/:http-version - :status"));
     16 }
     17 
     18 function serveBrowserified(file, standaloneName, doBabelify) {
     19     return function(req, res, next) {
     20         let files;
     21         if (Array.isArray(file)) {
     22             files = file.map(function(f) { return path.join(__dirname, f); });
     23         } else if (file.indexOf("*") !== -1) {
     24             files = glob.sync(file, {cwd: __dirname});
     25         } else {
     26             files = [path.join(__dirname, file)];
     27         }
     28 
     29         const options = {};
     30         if (doBabelify) {
     31             options.transform = [babelify];
     32         }
     33         if (standaloneName) {
     34             options.standalone = standaloneName;
     35         }
     36         const b = browserify(files, options);
     37         const stream = b.bundle();
     38 
     39         let body = "";
     40         stream.on("data", function(s) { body += s; });
     41         stream.on("error", function(e) { next(e); });
     42         stream.on("end", function() {
     43             res.setHeader("Content-Type", "text/javascript");
     44             res.send(body);
     45         });
     46     };
     47 }
     48 
     49 function twoBrowserified(url, file, standaloneName) {
     50     app.get(url, serveBrowserified(file, standaloneName, false));
     51     app.get("/babel" + url, serveBrowserified(file, standaloneName, true));
     52 }
     53 
     54 function twoUse(url, handler) {
     55     app.use(url, handler);
     56     app.use("/babel" + url, handler);
     57 }
     58 
     59 function twoStatic(url, file) {
     60     twoUse(url, express.static(path.join(__dirname, file)));
     61 }
     62 
     63 twoBrowserified("/katex.js", "katex", "katex");
     64 twoUse("/test/jasmine", express.static(path.dirname(
     65     require.resolve("jasmine-core/lib/jasmine-core/jasmine.js"))));
     66 twoBrowserified("/test/katex-spec.js", "test/*[Ss]pec.js");
     67 twoBrowserified(
     68     "/contrib/auto-render/auto-render.js",
     69     "contrib/auto-render/auto-render",
     70     "renderMathInElement");
     71 
     72 twoUse("/katex.css", function(req, res, next) {
     73     const lessfile = path.join(__dirname, "static", "katex.less");
     74     fs.readFile(lessfile, {encoding: "utf8"}, function(err, data) {
     75         if (err) {
     76             next(err);
     77             return;
     78         }
     79 
     80         less.render(data, {
     81             paths: [path.join(__dirname, "static")],
     82             filename: "katex.less",
     83         }, function(err, output) {
     84             if (err) {
     85                 console.error(String(err));
     86                 next(err);
     87                 return;
     88             }
     89 
     90             res.setHeader("Content-Type", "text/css");
     91             res.send(output.css);
     92         });
     93     });
     94 });
     95 
     96 twoStatic("", "static");
     97 twoStatic("", "build");
     98 twoStatic("/test", "test");
     99 twoStatic("/contrib", "contrib");
    100 
    101 app.use(function(err, req, res, next) {
    102     console.error(err.stack);
    103     res.setHeader("Content-Type", "text/plain");
    104     res.send(500, err.stack);
    105 });
    106 
    107 if (require.main === module) {
    108     app.listen(7936);
    109     console.log("Serving on http://0.0.0.0:7936/ ...");
    110 }
    111 
    112 module.exports = app;