nineteen-eighty-two 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
|
[](https://rubygems.org/gems/nineteen-eighty-two)
|
6
6
|
[](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
|