From d7426722388070a38984801544cb3d7df2f33c15 Mon Sep 17 00:00:00 2001 From: Petr Sloup Date: Fri, 11 Mar 2016 09:48:35 +0100 Subject: [PATCH] Serve fonts --- src/serve_font.js | 42 ++++++++++++++++++++++++++++++++++++++++++ src/serve_style.js | 16 +++++++++++++++- src/server.js | 13 +++++++++++-- 3 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 src/serve_font.js diff --git a/src/serve_font.js b/src/serve_font.js new file mode 100644 index 0000000..bcd86ee --- /dev/null +++ b/src/serve_font.js @@ -0,0 +1,42 @@ +'use strict'; + +var path = require('path'), + fs = require('fs'); + +var clone = require('clone'), + express = require('express'); + + +module.exports = function(fontPath, allowedFonts) { + var app = express().disable('x-powered-by'); + + var rootPath = path.join(process.cwd(), fontPath || ''); + + app.get('/fonts/:fontstack/:range([\\d]+-[\\d]+).pbf', + function(req, res, next) { + var fontstack = decodeURI(req.params.fontstack); + var range = req.params.range; + + var fonts = fontstack.split(','); + if (fonts.length == 1) { + if (allowedFonts[fonts[0]]) { + var filename = rootPath + '/' + fonts[0] + '/' + range + '.pbf'; + return fs.readFile(filename, function(err, data) { + if (err) { + console.log('Font load error:', filename); + return res.status(404).send('File not found'); + } else { + res.header('Content-type', 'application/x-protobuf'); + return res.send(data); + } + }); + } else { + return res.status(403).send('Forbidden'); + } + } else { + return res.status(501).send('Not Yet Implemented'); + } + }); + + return app; +}; diff --git a/src/serve_style.js b/src/serve_style.js index b6603df..c2fbad1 100644 --- a/src/serve_style.js +++ b/src/serve_style.js @@ -7,7 +7,7 @@ var clone = require('clone'), express = require('express'); -module.exports = function(repo, options, id, reportVector) { +module.exports = function(repo, options, id, reportVector, reportFont) { var app = express().disable('x-powered-by'); var rootPath = path.join(process.cwd(), options.root || ''); @@ -25,6 +25,20 @@ module.exports = function(repo, options, id, reportVector) { } }); + var findFontReferences = function(obj) { + Object.keys(obj).forEach(function(key) { + var value = obj[key]; + if (key == 'text-font') { + if (value && value.length > 0) { + value.forEach(reportFont); + } + } else if (value && typeof value == 'object') { + findFontReferences(value); + } + }); + }; + styleJSON.layers.forEach(findFontReferences); + var spritePath = path.join(rootPath, styleJSON.sprite); styleJSON.sprite = 'local://styles/' + id + '/sprite'; diff --git a/src/server.js b/src/server.js index 580f58f..c373632 100644 --- a/src/server.js +++ b/src/server.js @@ -12,7 +12,8 @@ var clone = require('clone'), express = require('express'), morgan = require('morgan'); -var serve_raster = require('./serve_raster'), +var serve_font = require('./serve_font'), + serve_raster = require('./serve_raster'), serve_style = require('./serve_style'), serve_vector = require('./serve_vector'), utils = require('./utils'); @@ -22,7 +23,11 @@ module.exports = function(opts, callback) { serving = { styles: {}, raster: {}, - vector: {} + vector: {}, + fonts: { // default fonts, always expose these (if they exist) + 'Open Sans Regular': true, + 'Arial Unicode MS Regular': true + } }; app.enable('trust proxy'); @@ -65,6 +70,8 @@ module.exports = function(opts, callback) { }; return id; } + }, function(font) { + serving.fonts[font] = true; })); } if (item.raster !== false) { @@ -72,6 +79,8 @@ module.exports = function(opts, callback) { } }); + app.use('/', serve_font('glyphs', serving.fonts)); + //TODO: cors Object.keys(vector).forEach(function(id) {