From 2b1203bb3aa7f77b0cd393da0af72086eafe0b9a Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Sat, 11 Jul 2015 16:15:30 -0700 Subject: [PATCH] add BigText element. fix video args. --- README.md | 29 + lib/widget.js | 1 + lib/widgets/bigtext.js | 149 + lib/widgets/video.js | 12 +- test/widget-bigtext.js | 30 + usr/fonts/AUTHORS | 1 + usr/fonts/LICENSE | 94 + usr/fonts/README | 340 + usr/fonts/ter-u14b.json | 17826 ++++++++++++++++++++++++++++++++++++++ usr/fonts/ter-u14n.json | 17826 ++++++++++++++++++++++++++++++++++++++ 10 files changed, 36306 insertions(+), 2 deletions(-) create mode 100644 lib/widgets/bigtext.js create mode 100644 test/widget-bigtext.js create mode 100644 usr/fonts/AUTHORS create mode 100644 usr/fonts/LICENSE create mode 100644 usr/fonts/README create mode 100644 usr/fonts/ter-u14b.json create mode 100644 usr/fonts/ter-u14n.json diff --git a/README.md b/README.md index 24ef360..4ad62cd 100644 --- a/README.md +++ b/README.md @@ -145,6 +145,7 @@ screen.render(); - [Line](#line-from-box) - [ScrollableBox](#scrollablebox-from-box) (deprecated) - [ScrollableText](#scrollabletext-from-scrollablebox) (deprecated) + - [BigText](#bigtext-from-box) - [Lists](#lists) - [List](#list-from-box) - [FileManager](#filemanager-from-list) @@ -754,6 +755,33 @@ pre-existing newlines and escape codes. - Inherits all from ScrollableBox. +#### BigText (from Box) + +A box which can render content drawn as 8x14 cell characters using the terminus +font. + +##### Options: + +- Inherits all from Box. +- __font__ - bdf->json font file to use (see [ttystudio][ttystudio] for + instructions on compiling BDFs to JSON). +- __fontBold__ - bdf->json bold font file to use (see [ttystudio][ttystudio] + for instructions on compiling BDFs to JSON). +- __fch__ - foreground character. (default: `' '`) + +##### Properties: + +- Inherits all from Box. + +##### Events: + +- Inherits all from Box. + +##### Methods: + +- Inherits all from Box. + + ### Lists @@ -2239,3 +2267,4 @@ See LICENSE for more info. [urwid]: http://urwid.org/reference/index.html [curses-ui]: http://search.cpan.org/~mdxi/Curses-UI-0.9609/lib/Curses/UI.pm [termbox]: https://github.com/nsf/termbox-go +[ttystudio]: https://github.com/chjj/ttystudio#choosing-a-new-font-for-your-terminal-recording diff --git a/lib/widget.js b/lib/widget.js index dfb7993..a2a13f4 100644 --- a/lib/widget.js +++ b/lib/widget.js @@ -15,6 +15,7 @@ widget.classes = [ 'Line', 'ScrollableBox', 'ScrollableText', + 'BigText', 'List', 'Form', 'Input', diff --git a/lib/widgets/bigtext.js b/lib/widgets/bigtext.js new file mode 100644 index 0000000..5dfceaa --- /dev/null +++ b/lib/widgets/bigtext.js @@ -0,0 +1,149 @@ +/** + * bigtext.js - bigtext element for blessed + * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License). + * https://github.com/chjj/blessed + */ + +/** + * Modules + */ + +var fs = require('fs'); + +var helpers = require('../helpers'); + +var Node = require('./node'); +var Box = require('./box'); + +/** + * BigText + */ + +function BigText(options) { + if (!(this instanceof Node)) { + return new BigText(options); + } + options = options || {}; + options.font = options.font + || __dirname + '/../../usr/fonts/ter-u14n.json'; + options.fontBold = options.font + || __dirname + '/../../usr/fonts/ter-u14b.json'; + this.fch = options.fch; + this.ratio = {}; + this.font = this.loadFont(options.font); + this.fontBold = this.loadFont(options.font); + Box.call(this, options); + if (this.style.bold) { + this.font = this.fontBold; + } +} + +BigText.prototype.__proto__ = Box.prototype; + +BigText.prototype.type = 'bigtext'; + +BigText.prototype.loadFont = function(filename) { + var self = this + , data + , font; + + data = JSON.parse(fs.readFileSync(filename, 'utf8')); + + this.ratio.width = data.width; + this.ratio.height = data.height; + + function convertLetter(ch, lines) { + while (lines.length > self.ratio.height) { + lines.shift(); + lines.pop(); + } + lines = lines.map(function(line) { + var chs = line.split(''); + chs = chs.map(function(ch) { + return ch === ' ' ? 0 : 1; + }); + while (chs.length < self.ratio.width) chs.push(0); + return chs; + }); + while (lines.length < self.ratio.height) lines.push([0, 0, 0, 0, 0, 0, 0, 0]); + return lines; + } + + font = Object.keys(data.glyphs).reduce(function(out, ch) { + var lines = data.glyphs[ch].map; + out[ch] = convertLetter(ch, lines); + return out; + }, {}); + + delete font[' ']; + + return font; +}; + +BigText.prototype.setContent = function(content) { + this.content = ''; + this.text = content || ''; +}; + +BigText.prototype.render = function() { + if (this.position.width == null || this._shrinkWidth) { + // if (this.width - this.iwidth < this.ratio.width * this.text.length + 1) { + this.position.width = this.ratio.width * this.text.length + 1; + this._shrinkWidth = true; + // } + } + if (this.position.height == null || this._shrinkHeight) { + // if (this.height - this.iheight < this.ratio.height + 0) { + this.position.height = this.ratio.height + 0; + this._shrinkHeight = true; + // } + } + + var coords = this._render(); + if (!coords) return; + + var lines = this.screen.lines + , left = coords.xi + this.ileft + , top = coords.yi + this.itop + , right = coords.xl - this.iright + , bottom = coords.yl - this.ibottom; + + var dattr = this.sattr(this.style) + , bg = dattr & 0x1ff + , fg = (dattr >> 9) & 0x1ff + , flags = (dattr >> 18) & 0x1ff + , attr = (flags << 18) | (bg << 9) | fg; + + for (var x = left, i = 0; x < right; x += this.ratio.width, i++) { + var ch = this.text[i]; + if (!ch) break; + var map = this.font[ch]; + if (!map) continue; + for (var y = top; y < Math.min(bottom, top + this.ratio.height); y++) { + if (!lines[y]) continue; + var mline = map[y - top]; + if (!mline) continue; + for (var mx = 0; mx < this.ratio.width; mx++) { + var mcell = mline[mx]; + if (mcell == null) break; + if (this.fch && this.fch !== ' ') { + lines[y][x + mx][0] = dattr; + lines[y][x + mx][1] = mcell === 1 ? this.fch : ' '; + } else { + lines[y][x + mx][0] = mcell === 1 ? attr : dattr; + lines[y][x + mx][1] = ' '; + } + } + lines[y].dirty = true; + } + } + + return coords; +}; + +/** + * Expose + */ + +module.exports = BigText; + diff --git a/lib/widgets/video.js b/lib/widgets/video.js index 5881565..d0397d8 100644 --- a/lib/widgets/video.js +++ b/lib/widgets/video.js @@ -61,7 +61,11 @@ function Video(options) { this.now = Date.now() / 1000 | 0; this.start = opts.start || 0; if (this.start) { - opts.args.unshift('--start', this.start + ''); + if (shell === 'mplayer') { + opts.args.unshift('-ss', this.start + ''); + } else if (shell === 'mpv') { + opts.args.unshift('--start', this.start + ''); + } } var DISPLAY = process.env.DISPLAY; @@ -91,7 +95,11 @@ function Video(options) { var watched = (Date.now() / 1000 | 0) - self.now; self.now = Date.now() / 1000 | 0; self.start += watched; - opts.args.unshift('--start', self.start + ''); + if (shell === 'mplayer') { + opts.args.unshift('-ss', self.start + ''); + } else if (shell === 'mpv') { + opts.args.unshift('--start', self.start + ''); + } var DISPLAY = process.env.DISPLAY; delete process.env.DISPLAY; diff --git a/test/widget-bigtext.js b/test/widget-bigtext.js new file mode 100644 index 0000000..d849916 --- /dev/null +++ b/test/widget-bigtext.js @@ -0,0 +1,30 @@ +var blessed = require('../') + , screen; + +screen = blessed.screen({ + dump: __dirname + '/logs/bigtext.log', + smartCSR: true +}); + +var box = blessed.bigtext({ + parent: screen, + content: 'Hello', + shrink: true, + width: '80%', + // height: '80%', + height: 'shrink', + // width: 'shrink', + border: 'line', + fch: ' ', + style: { + fg: 'red', + bold: false + } +}); + +screen.key('q', function() { + return process.exit(0); +}); + +screen.render(); + diff --git a/usr/fonts/AUTHORS b/usr/fonts/AUTHORS new file mode 100644 index 0000000..f0ba3b6 --- /dev/null +++ b/usr/fonts/AUTHORS @@ -0,0 +1 @@ +Dimitar Zhekov diff --git a/usr/fonts/LICENSE b/usr/fonts/LICENSE new file mode 100644 index 0000000..60181c9 --- /dev/null +++ b/usr/fonts/LICENSE @@ -0,0 +1,94 @@ +Copyright (c) 2014 Dimitar Toshkov Zhekov, +with Reserved Font Name "Terminus Font". + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/usr/fonts/README b/usr/fonts/README new file mode 100644 index 0000000..3f2fa2d --- /dev/null +++ b/usr/fonts/README @@ -0,0 +1,340 @@ +NOTE: This directory contains the terminus font compiled to a JSON format. + +Contents: + +1. About. +1.1. Quick installation. +1.2. Legend. +1.3. Variants. +1.4. Notes. + +2. Linux console. +2.1. consoletools. +2.2. kbd. +2.3. Quick reference. +2.4. Legend. +2.5. Notes. + +3. UNIX console. +3.1. bsd-pcvt. +3.2. Legend. +3.3. Notes. + +4. X11 Window System. +4.1. Installation. +4.2. Notes. + +5. Frequently Asked Questions. + +6. Legal information. +6.1. Licenses. +6.2. Copyright. + + +1. About. + +This archive contains source code for generating and installing Terminus +Font for Linux console, BSD console and X11 Window System. + +- version 4.39 +- sizes 6x12, 8x14, 8x16, 10x18, 10x20, 11x22, 12x24, 14x28, 16x32 +- styles normal, bold, EGA/VGA bold +- characters 891 +- format Bitmap Distribution Format (BDF) version 2.1 + +The character set covers about 120 language sets and supports ISO8859-1/2/5/ +7/9/13/15/16, Paratype-PT154/PT254, KOI8-R/U/E/F, Esperanto and many IBM, +Windows and Macintosh code pages, as well as the IBM VGA, vt100 and xterm +pseudographic characters. + +1.1. Quick installation. + +The commands: + +$ ./configure [--prefix=PREFIX] +$ make +# make install fontdir + +compile and install the Linux console and X11 Window System fonts. +The default PREFIX is /usr/local. + +1.2. Legend. + +The file names are structured as follows: + +ter-u