diff --git a/src/BrailleBuffer.coffee b/src/BrailleBuffer.coffee index 489fa79..643cb0e 100644 --- a/src/BrailleBuffer.coffee +++ b/src/BrailleBuffer.coffee @@ -6,24 +6,35 @@ Implementation inspired by node-drawille (https://github.com/madbence/node-drawille) * added color support - * added support for filled polygons * added text label support * general optimizations - -> more bit shifting/operations, less Math.floors Will either be merged into node-drawille or become an own module at some point ### stringWidth = require 'string-width' config = require './config' +utils = require './utils' module.exports = class BrailleBuffer - characterMap: [[0x1, 0x8],[0x2, 0x10],[0x4, 0x20],[0x40, 0x80]] + brailleMap: [[0x1, 0x8],[0x2, 0x10],[0x4, 0x20],[0x40, 0x80]] + asciiMap: + # "▬": [2+32, 4+64] + # "¯": [1+16] + "▀": [1+2+16+32] + "▄": [4+8+64+128] + "■": [2+4+32+64] + "▌": [1+2+4+8] + "▐": [16+32+64+128] + # "▓": [1+4+32+128, 2+8+16+64] + "█": [255] pixelBuffer: null charBuffer: null foregroundBuffer: null backgroundBuffer: null + asciiToBraille: [] + globalBackground: null termReset: "\x1B[39;49m" @@ -33,6 +44,8 @@ module.exports = class BrailleBuffer @pixelBuffer = new Buffer size @foregroundBuffer = new Buffer size @backgroundBuffer = new Buffer size + + @_mapBraille() @clear() clear: -> @@ -63,9 +76,28 @@ module.exports = class BrailleBuffer _locate: (x, y, cb) -> return unless 0 <= x < @width and 0 <= y < @height idx = @_project x, y - mask = @characterMap[y&3][x&1] + mask = @brailleMap[y&3][x&1] cb idx, mask + _mapBraille: -> + @asciiToBraille = [" "] + + masks = [] + for char, bits of @asciiMap + continue unless bits instanceof Array + masks.push mask: mask, char: char for mask in bits + + for i in [1..255] + braille = (i&7) + ((i&56)<<1) + ((i&64)>>3) + (i&128) + + @asciiToBraille[i] = masks.reduce(((best, mask) -> + covered = utils.population(mask.mask&braille) + if not best or best.covered < covered + char: mask.char, covered: covered + else + best + ), undefined).char + _termColor: (foreground, background) -> background = background or @globalBackground if foreground and background @@ -102,7 +134,10 @@ module.exports = class BrailleBuffer char else if not skip - String.fromCharCode 0x2800+@pixelBuffer[idx] + if config.useBraille + String.fromCharCode 0x2800+@pixelBuffer[idx] + else + @asciiToBraille[@pixelBuffer[idx]] else skip-- '' diff --git a/src/Mapscii.coffee b/src/Mapscii.coffee index fedcfa8..c463dc5 100644 --- a/src/Mapscii.coffee +++ b/src/Mapscii.coffee @@ -179,6 +179,10 @@ module.exports = class Mapscii when "up" then @moveBy 6/Math.pow(2, @zoom), 0 when "down" then @moveBy -6/Math.pow(2, @zoom), 0 + when "c" + config.useBraille = !config.useBraille + true + else null diff --git a/src/Renderer.coffee b/src/Renderer.coffee index 209ed83..bb58bde 100644 --- a/src/Renderer.coffee +++ b/src/Renderer.coffee @@ -175,9 +175,8 @@ module.exports = class Renderer @canvas.polygon points, feature.color when "symbol" - genericSymbol = null text = feature.label or - genericSymbol = "◉" + genericSymbol = config.poiMarker return false if @_seen[text] and not genericSymbol @@ -192,8 +191,8 @@ module.exports = class Renderer break else if config.layers[feature.layer]?.cluster and - @labelBuffer.writeIfPossible "◉", point.x, point.y, feature, 3 - @canvas.text "◉", point.x, point.y, feature.color + @labelBuffer.writeIfPossible config.poiMarker, point.x, point.y, feature, 3 + @canvas.text config.poiMarker, point.x, point.y, feature.color placed = true break diff --git a/src/Tile.coffee b/src/Tile.coffee index 45f5631..173ca50 100644 --- a/src/Tile.coffee +++ b/src/Tile.coffee @@ -57,8 +57,8 @@ class Tile feature.properties.$type = type = [undefined, "Point", "LineString", "Polygon"][feature.type] if @styler - style = @styler.getStyleFor name, feature - continue unless style + style = @styler.getStyleFor name, feature + continue unless style color = style.paint['line-color'] or diff --git a/src/config.coffee b/src/config.coffee index 45fd8cc..9267745 100644 --- a/src/config.coffee +++ b/src/config.coffee @@ -15,6 +15,8 @@ module.exports = simplifyPolylines: false + useBraille: true + # Downloaded files get persisted in ~/.mapscii persistDownloadedTiles: true @@ -34,4 +36,6 @@ module.exports = headless: false - delimeter: "\n\r" \ No newline at end of file + delimeter: "\n\r" + + poiMarker: "◉" \ No newline at end of file diff --git a/src/utils.coffee b/src/utils.coffee index 57f08e0..9e05419 100644 --- a/src/utils.coffee +++ b/src/utils.coffee @@ -64,4 +64,11 @@ utils = ll + population: (val) -> + bits = 0 + while val>0 + bits += val & 1 + val >>= 1 + bits + module.exports = utils