nineteen-eighty-two 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8adb225e0b27b75def30e8cbcf6cfaf4d93ec5b
|
4
|
+
data.tar.gz: 437eb48a19094395b0a30193727bbd36784d3ac2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1853d80dc42dfec864e4e9fde5803aebcd90842d027ec8d7ecb84eb44d8744b236422b0666255e0ee0053f5972f4986c14650bc962fc55e65f1f475a22c588a7
|
7
|
+
data.tar.gz: d319135567cc68edb911f1ce80a9e68afb329e41d8b2887b389f7087077c29cbee9a6098c7196e711f2ca504ddaa7b3ed9696946dd23d91160a0f39c1f142506
|
data/README.md
CHANGED
@@ -5,8 +5,190 @@
|
|
5
5
|
[![Gem Version](http://img.shields.io/gem/v/nineteen-eighty-two.svg?style=flat-square)](https://rubygems.org/gems/nineteen-eighty-two)
|
6
6
|
[![License](http://img.shields.io/:license-mit-blue.svg?style=flat-square)](http://pikesley.mit-license.org)
|
7
7
|
|
8
|
-
#1982
|
8
|
+
# 1982
|
9
9
|
|
10
|
-
##Sinclair Spectrum font as a Rubygem
|
10
|
+
## Sinclair Spectrum font as a Rubygem
|
11
11
|
|
12
|
-
|
12
|
+
A massively over-engineered solution to a problem that I'm almost 100% certain does not exist - rendering text in the 1982 Sinclair Spectrum character set, in a variety of formats
|
13
|
+
|
14
|
+
git clone https://github.com/pikesley/nineteen-eighty-two
|
15
|
+
cd nineteen-eighty-two
|
16
|
+
bundle
|
17
|
+
rake
|
18
|
+
|
19
|
+
Or just
|
20
|
+
|
21
|
+
gem install nineteen-eighty-two
|
22
|
+
|
23
|
+
## API
|
24
|
+
|
25
|
+
From the [specs](https://github.com/pikesley/nineteen-eighty-two/tree/master/spec/nineteen/eighty/two):
|
26
|
+
|
27
|
+
### Just the data
|
28
|
+
|
29
|
+
#### Transform a string into an array-of-arrays of bits
|
30
|
+
|
31
|
+
require 'nineteen/eighty/two'
|
32
|
+
|
33
|
+
module Nineteen::Eighty::Two
|
34
|
+
describe Spectrum do
|
35
|
+
it 'returns an array of arrays' do
|
36
|
+
expect(described_class['ab']).to eq [
|
37
|
+
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
38
|
+
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
|
39
|
+
[0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
|
40
|
+
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0],
|
41
|
+
[0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0],
|
42
|
+
[0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0],
|
43
|
+
[0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0],
|
44
|
+
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
45
|
+
]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
### Specific output formats
|
51
|
+
|
52
|
+
#### HTML table
|
53
|
+
|
54
|
+
require 'nineteen/eighty/two'
|
55
|
+
|
56
|
+
module Nineteen::Eighty::Two
|
57
|
+
module Formats
|
58
|
+
describe HTMLTable do
|
59
|
+
it 'makes a table' do
|
60
|
+
expect(described_class.format 'a').to eq (
|
61
|
+
"""<!-- a -->
|
62
|
+
<table class='sinclair'>
|
63
|
+
<tr><td class='off'> </td><td class='off'> </td><td class='off'> </td><td class='off'> </td><td class='off'> </td><td class='off'> </td><td class='off'> </td><td class='off'> </td></tr>
|
64
|
+
<tr><td class='off' colspan='8'> </td></tr>
|
65
|
+
<tr><td class='off' colspan='8'> </td></tr>
|
66
|
+
<tr><td class='off' colspan='2'> </td><td class='on' colspan='3'> </td><td class='off' colspan='3'> </td></tr>
|
67
|
+
<tr><td class='off' colspan='5'> </td><td class='on'> </td><td class='off' colspan='2'> </td></tr>
|
68
|
+
<tr><td class='off' colspan='2'> </td><td class='on' colspan='4'> </td><td class='off' colspan='2'> </td></tr>
|
69
|
+
<tr><td class='off'> </td><td class='on'> </td><td class='off' colspan='3'> </td><td class='on'> </td><td class='off' colspan='2'> </td></tr>
|
70
|
+
<tr><td class='off' colspan='2'> </td><td class='on' colspan='4'> </td><td class='off' colspan='2'> </td></tr>
|
71
|
+
<tr><td class='off' colspan='8'> </td></tr>
|
72
|
+
</table>"""
|
73
|
+
)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
#### JSON
|
79
|
+
|
80
|
+
require 'nineteen/eighty/two'
|
81
|
+
|
82
|
+
module Nineteen::Eighty::Two
|
83
|
+
module Formats
|
84
|
+
describe JSON do
|
85
|
+
expect(described_class.format 'ab').to eq ({
|
86
|
+
:id => 'ab',
|
87
|
+
:data => [
|
88
|
+
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
89
|
+
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
|
90
|
+
[0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
|
91
|
+
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0],
|
92
|
+
[0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0],
|
93
|
+
[0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0],
|
94
|
+
[0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0],
|
95
|
+
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
96
|
+
]
|
97
|
+
}.to_json)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
#### SVG
|
103
|
+
|
104
|
+
require 'nineteen/eighty/two'
|
105
|
+
|
106
|
+
module Nineteen::Eighty::Two
|
107
|
+
module Formats
|
108
|
+
describe SVG do
|
109
|
+
it 'returns an SVG' do
|
110
|
+
expect(described_class.format '/').to eq (
|
111
|
+
"""<svg viewBox='0 0 8 8' xmlns='http://www.w3.org/2000/svg'>
|
112
|
+
<style type='text/css'>
|
113
|
+
<![CDATA[
|
114
|
+
rect.on {
|
115
|
+
fill: #000000;
|
116
|
+
}
|
117
|
+
]]>
|
118
|
+
</style>
|
119
|
+
<g>
|
120
|
+
<rect x='6' y='2' width='1' height='1' class='on' />
|
121
|
+
<rect x='5' y='3' width='1' height='1' class='on' />
|
122
|
+
<rect x='4' y='4' width='1' height='1' class='on' />
|
123
|
+
<rect x='3' y='5' width='1' height='1' class='on' />
|
124
|
+
<rect x='2' y='6' width='1' height='1' class='on' />
|
125
|
+
</g>
|
126
|
+
</svg>
|
127
|
+
""")
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'sets the colour' do
|
131
|
+
expect(described_class.format '/', {colour: '#fa8100'}).to match /fill: #fa8100;/
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
#### Text
|
138
|
+
|
139
|
+
require 'nineteen/eighty/two'
|
140
|
+
|
141
|
+
module Nineteen::Eighty::Two
|
142
|
+
module Formats
|
143
|
+
describe Text do
|
144
|
+
it 'gives the correct string' do
|
145
|
+
expect(described_class.format 'ab').to eq (
|
146
|
+
"""
|
147
|
+
0000000000000000
|
148
|
+
0000000000100000
|
149
|
+
0011100000100000
|
150
|
+
0000010000111100
|
151
|
+
0011110000100010
|
152
|
+
0100010000100010
|
153
|
+
0011110000111100
|
154
|
+
0000000000000000
|
155
|
+
"""
|
156
|
+
).strip
|
157
|
+
end
|
158
|
+
|
159
|
+
it 'returns characters other than zeroes and ones' do
|
160
|
+
expect(described_class.format 'Sam', {on: 'X', off: '.'}).to eq (
|
161
|
+
"""
|
162
|
+
........................
|
163
|
+
..XXXX..................
|
164
|
+
.X........XXX....XX.X...
|
165
|
+
..XXXX.......X...X.X.X..
|
166
|
+
......X...XXXX...X.X.X..
|
167
|
+
.X....X..X...X...X.X.X..
|
168
|
+
..XXXX....XXXX...X.X.X..
|
169
|
+
........................
|
170
|
+
"""
|
171
|
+
).strip
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
## FAQ
|
177
|
+
|
178
|
+
Your questions, answered
|
179
|
+
|
180
|
+
### Why the stupid module structure?
|
181
|
+
|
182
|
+
I realise that `Nineteen::Eighty::Two::Formats::HTMLTable.format` is a ludicrously long method name, but it turns out if you do `bundle gem nineteen-eighty-two`, this module hierarchy is what you're presented with, and I actually kind of like it (I did try to call it `1982` but apparently that's not a kosher Gem name)
|
183
|
+
|
184
|
+
### Why doesn't it output in _${other_format}_
|
185
|
+
|
186
|
+
If you can think of another format I could support, let me know and I'll have a go. I am also [open to PRs](https://github.com/pikesley/nineteen-eighty-two/pulls), of course
|
187
|
+
|
188
|
+
### Where can I play with this?
|
189
|
+
|
190
|
+
I've wrapped this Gem in a RESTful API [over here](http://uncleclive.herokuapp.com/)
|
191
|
+
|
192
|
+
### Why have you done this?
|
193
|
+
|
194
|
+
Have you met me? Also, because I'm [moderately obsessed with this font](https://www.youtube.com/watch?v=Qt_J0jNqtZg)
|
@@ -6,7 +6,7 @@ module Nineteen
|
|
6
6
|
def self.format text
|
7
7
|
lines = Spectrum[text]
|
8
8
|
|
9
|
-
t = File.read File.open File.join templates_dir, 'table.eruby'
|
9
|
+
t = File.read File.open File.join Nineteen::Eighty::Two.templates_dir, 'html', 'table', 'table.eruby'
|
10
10
|
context = {
|
11
11
|
title: text,
|
12
12
|
blanks: blanks(lines.first),
|
@@ -16,7 +16,7 @@ module Nineteen
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def self.blanks lines
|
19
|
-
t = File.read File.open File.join templates_dir, 'row.eruby'
|
19
|
+
t = File.read File.open File.join Nineteen::Eighty::Two.templates_dir, 'html', 'table', 'row.eruby'
|
20
20
|
context = {
|
21
21
|
cells: lines.map { |b| cell Span.new(0, 1) }.join
|
22
22
|
}
|
@@ -24,7 +24,7 @@ module Nineteen
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def self.cell span
|
27
|
-
t = File.read File.open File.join templates_dir, 'cell.eruby'
|
27
|
+
t = File.read File.open File.join Nineteen::Eighty::Two.templates_dir, 'html', 'table', 'cell.eruby'
|
28
28
|
context = {
|
29
29
|
style: span.type == 1 ? 'on' : 'off',
|
30
30
|
}
|
@@ -33,16 +33,12 @@ module Nineteen
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def self.row list
|
36
|
-
t = File.read File.open File.join templates_dir, 'row.eruby'
|
36
|
+
t = File.read File.open File.join Nineteen::Eighty::Two.templates_dir, 'html', 'table', 'row.eruby'
|
37
37
|
context = {
|
38
38
|
cells: Decorators::RunLengthEncoder.encode(list).map { |i| cell i }.join
|
39
39
|
}
|
40
40
|
Erubis::Eruby.new(t).evaluate(context).strip
|
41
41
|
end
|
42
|
-
|
43
|
-
def self.templates_dir
|
44
|
-
File.join File.dirname(__FILE__),'..', 'templates', 'html', 'table'
|
45
|
-
end
|
46
42
|
end
|
47
43
|
end
|
48
44
|
end
|
@@ -4,10 +4,12 @@ module Nineteen
|
|
4
4
|
module Formats
|
5
5
|
class SVG
|
6
6
|
def self.format text, options = {}
|
7
|
-
|
7
|
+
text = [text] unless text.is_a? Array
|
8
|
+
|
9
|
+
t = File.read File.open File.join Nineteen::Eighty::Two.templates_dir, 'svg', 'document.eruby'
|
8
10
|
context = {
|
9
|
-
width: text.
|
10
|
-
height: 8,
|
11
|
+
width: text.longest * 8,
|
12
|
+
height: text.count * 8,
|
11
13
|
fill_colour: options.fetch(:colour, '#000000'),
|
12
14
|
body: body(text)
|
13
15
|
}
|
@@ -15,11 +17,16 @@ module Nineteen
|
|
15
17
|
end
|
16
18
|
|
17
19
|
def self.body text
|
18
|
-
|
19
|
-
|
20
|
-
rows
|
20
|
+
s = ''
|
21
|
+
text.each_with_index do |line, count|
|
22
|
+
rows = []
|
23
|
+
Spectrum[line].each_with_index do |line, index|
|
24
|
+
rows.push row(line, index + (count * 8))
|
25
|
+
end
|
26
|
+
s << rows.join("\n")
|
21
27
|
end
|
22
|
-
|
28
|
+
|
29
|
+
s.strip
|
23
30
|
end
|
24
31
|
|
25
32
|
def self.row list, index = 0
|
@@ -27,7 +34,7 @@ module Nineteen
|
|
27
34
|
cells = []
|
28
35
|
Decorators::RunLengthEncoder.encode(list).each do |item|
|
29
36
|
if item.type == 1
|
30
|
-
t = File.read File.open File.join templates_dir, 'cell.eruby'
|
37
|
+
t = File.read File.open File.join Nineteen::Eighty::Two.templates_dir, 'svg', 'cell.eruby'
|
31
38
|
context = {
|
32
39
|
x: x,
|
33
40
|
y: index,
|
@@ -43,8 +50,8 @@ module Nineteen
|
|
43
50
|
cells.join("\n").strip
|
44
51
|
end
|
45
52
|
|
46
|
-
def self.
|
47
|
-
|
53
|
+
def self.longest list
|
54
|
+
list.map { |i| i.length }.max
|
48
55
|
end
|
49
56
|
end
|
50
57
|
end
|
data/lib/nineteen/eighty/two.rb
CHANGED
@@ -12,16 +12,32 @@ require 'nineteen/eighty/two/formatters/json_formatter'
|
|
12
12
|
require 'nineteen/eighty/two/formatters/html_table_formatter'
|
13
13
|
require 'nineteen/eighty/two/formatters/svg_formatter'
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
module Nineteen
|
16
|
+
module Eighty
|
17
|
+
module Two
|
18
|
+
class Span < Hash
|
19
|
+
def initialize type, width
|
20
|
+
self[type] = width
|
21
|
+
end
|
22
|
+
|
23
|
+
def type
|
24
|
+
self.keys.first
|
25
|
+
end
|
19
26
|
|
20
|
-
|
21
|
-
|
27
|
+
def width
|
28
|
+
self.values.first
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.templates_dir
|
33
|
+
File.join File.dirname(__FILE__), 'two', 'templates'
|
34
|
+
end
|
35
|
+
end
|
22
36
|
end
|
37
|
+
end
|
23
38
|
|
24
|
-
|
25
|
-
|
39
|
+
class Array
|
40
|
+
def longest
|
41
|
+
self.map { |i| i.length }.max
|
26
42
|
end
|
27
43
|
end
|