diff --git a/src/BrailleBuffer.coffee b/src/BrailleBuffer.coffee index 489fa79..5b49ae0 100644 --- a/src/BrailleBuffer.coffee +++ b/src/BrailleBuffer.coffee @@ -6,24 +6,34 @@ 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+2+4+8] + # "▐": [16+32+64+128] + "▀": [1+2+16+32] + "▄": [4+8+64+128] + "■": [2+4+32+64] + #"▓": [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 +43,8 @@ module.exports = class BrailleBuffer @pixelBuffer = new Buffer size @foregroundBuffer = new Buffer size @backgroundBuffer = new Buffer size + + @_mapBraille() @clear() clear: -> @@ -63,9 +75,27 @@ 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 + + reducer = (best, mask) -> + covered = utils.population(mask.mask&i) + return if not best or best.covered < covered + char: mask.char, covered: covered + else + best + + for i in [1..255] + @asciiToBraille[i] = masks.reduce(reducer, undefined).char + _termColor: (foreground, background) -> background = background or @globalBackground if foreground and background @@ -102,7 +132,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/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..2856379 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 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