hierogloss 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +4 -0
- data/README.md +7 -3
- data/examples/disjunction.md +1 -1
- data/hierogloss.gemspec +1 -0
- data/lib/hierogloss/dictionary.rb +36 -18
- data/lib/hierogloss/gloss.rb +12 -4
- data/lib/hierogloss/mdc.rb +144 -0
- data/lib/hierogloss/metrics/data.rb +1084 -0
- data/lib/hierogloss/metrics.rb +47 -0
- data/lib/hierogloss/version.rb +1 -1
- data/lib/hierogloss.rb +2 -0
- data/src/dump_metrics.rb +45 -0
- data/test/test_dictionary.rb +2 -9
- data/test/test_gloss.rb +4 -2
- data/test/test_mdc.rb +55 -0
- data/test/test_metrics.rb +29 -0
- metadata +24 -2
@@ -0,0 +1,47 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
module Hierogloss
|
4
|
+
# :nodoc: Internal utilities for measuring hieroglyphs for layout
|
5
|
+
# purposes.
|
6
|
+
class Metrics
|
7
|
+
# The nominal size of a quadrat relative to Data::SIGN_SIZES.
|
8
|
+
QUADRAT_DATA_SIZE = 0.55
|
9
|
+
|
10
|
+
# The nominal size of a quadrat in our API units.
|
11
|
+
QUADRAT_SIZE = 12
|
12
|
+
|
13
|
+
# A conversion factor.
|
14
|
+
QUADRAT_CONV = QUADRAT_SIZE / QUADRAT_DATA_SIZE
|
15
|
+
|
16
|
+
class << self
|
17
|
+
def find(char)
|
18
|
+
size = Data::SIGN_SIZES[char]
|
19
|
+
new(conv(size[0]),conv(size[1]))
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
|
24
|
+
# Round things to reasonable sizes. This is ad hoc and will require
|
25
|
+
# extensive adjustment.
|
26
|
+
def conv(x)
|
27
|
+
rounded = (x*QUADRAT_CONV).round
|
28
|
+
case rounded
|
29
|
+
when 1..4 then 3
|
30
|
+
when 5..7 then 6
|
31
|
+
when 8..9 then 9
|
32
|
+
when 10..14 then 12
|
33
|
+
else rounded
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
attr_reader :width, :height
|
39
|
+
|
40
|
+
def initialize(width, height)
|
41
|
+
@width = width
|
42
|
+
@height = height
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
require "hierogloss/metrics/data"
|
data/lib/hierogloss/version.rb
CHANGED
data/lib/hierogloss.rb
CHANGED
data/src/dump_metrics.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
|
4
|
+
# Requires ttfunk 1.1 to operate, which conflicts with the
|
5
|
+
# currently-released version of prawn.
|
6
|
+
|
7
|
+
require "ttfunk"
|
8
|
+
|
9
|
+
def metrics(file, codepoint)
|
10
|
+
glyph_id = file.cmap.unicode.first[codepoint]
|
11
|
+
return nil if glyph_id == 0
|
12
|
+
glyph = file.glyph_outlines.for(glyph_id)
|
13
|
+
[codepoint, glyph.x_max-glyph.x_min, glyph.y_max-glyph.y_min]
|
14
|
+
end
|
15
|
+
|
16
|
+
f = TTFunk::File.open(File.join(File.dirname(__FILE__), 'Gardiner.ttf'))
|
17
|
+
|
18
|
+
metrics = (0x13000..0x1342F).map {|cp| metrics(f, cp) }.compact
|
19
|
+
max_width = metrics.map {|m| m[1] }.max
|
20
|
+
max_height = metrics.map {|m| m[2] }.max
|
21
|
+
unit = 1.0*([max_width, max_height].max)
|
22
|
+
|
23
|
+
print <<EOD
|
24
|
+
# -*- coding: utf-8 -*-
|
25
|
+
|
26
|
+
# :nodoc: This file is generated automatically using dump_metrics.rb.
|
27
|
+
# It contains the relative width and height of each sign in the Gardiner.ttf
|
28
|
+
# font for use in layout algorithms.
|
29
|
+
module Hierogloss
|
30
|
+
class Metrics
|
31
|
+
module Data
|
32
|
+
SIGN_SIZES = {
|
33
|
+
EOD
|
34
|
+
|
35
|
+
metrics.each do |cp, w, h|
|
36
|
+
c = [cp].pack("U")
|
37
|
+
printf "\"%s\"=>[%0.2f,%0.2f],\n", c, w/unit, h/unit
|
38
|
+
end
|
39
|
+
|
40
|
+
print <<EOD
|
41
|
+
}
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
EOD
|
data/test/test_dictionary.rb
CHANGED
@@ -37,14 +37,7 @@ class TestDictionary < Minitest::Test
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def test_should_provide_gardiner_signs_for_most_signs
|
40
|
-
assert_equal("A1", Hierogloss::Dictionary.
|
41
|
-
assert_equal("D4", Hierogloss::Dictionary.
|
42
|
-
end
|
43
|
-
|
44
|
-
def test_should_not_provide_gardiner_signs_for_uniliterals
|
45
|
-
# Let's not link these common characters.
|
46
|
-
"𓄿𓇋𓏭𓂝𓅱𓏲𓃀𓊪𓆑𓅓𓈖𓂋𓉔𓎛𓐍𓄡𓊃𓋴𓈙𓈎𓎡𓎼𓏏𓍿𓂧𓆓".each_char do |c|
|
47
|
-
assert_nil(Hierogloss::Dictionary.gardiner(c), "should not translate #{c}")
|
48
|
-
end
|
40
|
+
assert_equal("A1", Hierogloss::Dictionary.sign_to_gardiner("𓀀"))
|
41
|
+
assert_equal("D4", Hierogloss::Dictionary.sign_to_gardiner("𓁹"))
|
49
42
|
end
|
50
43
|
end
|
data/test/test_gloss.rb
CHANGED
@@ -6,7 +6,7 @@ class TestGloss < MiniTest::Test
|
|
6
6
|
|
7
7
|
def setup
|
8
8
|
input = <<EOD
|
9
|
-
H:
|
9
|
+
H: 𓊃:𓀀*𓏤 | z:t*B1
|
10
10
|
L: s | s.t
|
11
11
|
G: homme | femme
|
12
12
|
T: l'homme et la femme
|
@@ -22,7 +22,9 @@ EOD
|
|
22
22
|
|
23
23
|
def test_should_parse_gloss_into_appropriate_rows
|
24
24
|
assert_equal(4, @gloss.rows.length)
|
25
|
-
assert_row(HieroglyphRow, ["
|
25
|
+
assert_row(HieroglyphRow, ["𓊃:𓀀*𓏤", "z:t*B1"], @gloss.rows[0])
|
26
|
+
assert_equal(["𓊃𓀀𓏤", "𓊃𓏏𓁐"],
|
27
|
+
@gloss.rows[0].cells.map {|c| c.to_linear_hieroglyphs })
|
26
28
|
assert_row(TransliterationRow, ["s", "s.t"], @gloss.rows[1])
|
27
29
|
assert_row(Row, ["homme", "femme"], @gloss.rows[2])
|
28
30
|
|
data/test/test_mdc.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'minitest_helper'
|
3
|
+
|
4
|
+
class TestCodage < MiniTest::Test
|
5
|
+
def assert_parse(expected, input)
|
6
|
+
assert_equal(expected, Hierogloss::MdC.parse(input).to_debug)
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_should_parse_separated_signs
|
10
|
+
assert_parse(["i"], "i")
|
11
|
+
assert_parse(["i", "A2"], "i-A2")
|
12
|
+
assert_parse(["i", "A2"], "i A2")
|
13
|
+
assert_parse(["i", "A2"], "i A2")
|
14
|
+
assert_parse(["i", "A2"], "i_A2")
|
15
|
+
assert_parse(["i", "A2"], "i__A2")
|
16
|
+
# A non-standard extension, but I rather like using a proper input
|
17
|
+
# method to type hieroglyphs.
|
18
|
+
assert_parse(["𓇋", "𓀁"], "𓇋𓀁")
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_should_parse_stacked_signs
|
22
|
+
assert_parse([[:stack, "D", "d"], "n"], "D:d-n")
|
23
|
+
assert_parse([[:stack, "D", "d", "n"]], "D:d:n")
|
24
|
+
assert_parse([[:stack, "𓆓", "𓂧"], "𓈖"], "𓆓:𓂧𓈖")
|
25
|
+
assert_parse([[:stack, "𓆓", "𓂧", "𓈖"]], "𓆓:𓂧:𓈖")
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_should_parse_juxtaposed_signs
|
29
|
+
assert_parse([[:stack, "𓇾", ["𓏤", "𓈇"]]], "𓇾:𓏤*𓈇")
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_should_honor_parens
|
33
|
+
assert_parse([[:stack, ["p", [:stack, "t", "Z4"]], "pt"]], "p*(t:Z4):pt")
|
34
|
+
end
|
35
|
+
|
36
|
+
def assert_linear_hieroglyphs(expected, input)
|
37
|
+
assert_equal(expected, Hierogloss::MdC.parse(input).to_linear_hieroglyphs)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_should_convert_mdc_to_linear_hieroglyphs
|
41
|
+
assert_linear_hieroglyphs("𓆓𓂧𓈖", "𓆓:𓂧𓈖")
|
42
|
+
assert_linear_hieroglyphs("𓊪𓏏𓏭𓇯", "p*(t:Z4):pt")
|
43
|
+
end
|
44
|
+
|
45
|
+
def assert_mdc(expected, input)
|
46
|
+
assert_equal(expected, Hierogloss::MdC.parse(input).to_mdc)
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_should_convert_mdc_to_mdc_string
|
50
|
+
assert_mdc("D:d-n", "𓆓:𓂧𓈖")
|
51
|
+
assert_mdc("p*(t:Z4):pt", "p*(t:Z4):pt")
|
52
|
+
# Compound signs are always placed in parens.
|
53
|
+
assert_mdc("(N33*N33:N33*N33)", "𓃌")
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'minitest_helper'
|
3
|
+
|
4
|
+
class TestMetrics < MiniTest::Test
|
5
|
+
# For our purposes, an ordinary quadrat is 12 units by 12 units, mostly
|
6
|
+
# because this allows us to use most small fractions (1/1 through 1/4)
|
7
|
+
# easily.
|
8
|
+
def assert_metrics(width, height, char)
|
9
|
+
m = Hierogloss::Metrics.find(char)
|
10
|
+
assert_equal width, m.width, "Expected width of #{char} to be #{width}"
|
11
|
+
assert_equal height, m.height, "Expected hieght of #{char} to be #{height}"
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_signs_should_have_plausible_metrics
|
15
|
+
# These numbers are a bit arbitrary. They're based on my
|
16
|
+
# interpretation of common hieroglyphic layouts and the sizes of the
|
17
|
+
# signs extracted from the Gardiner font. The idea is that anything
|
18
|
+
# adding up to 12x12 should make a nice square quadrat without any
|
19
|
+
# further scaling. The ultimate answer here, of course, is whatever
|
20
|
+
# looks good.
|
21
|
+
assert_metrics(9, 12, "𓀀")
|
22
|
+
assert_metrics(6, 12, "𓁐")
|
23
|
+
assert_metrics(3, 12, "𓋴")
|
24
|
+
assert_metrics(12, 3, "𓈖")
|
25
|
+
assert_metrics(12, 3, "𓆑")
|
26
|
+
assert_metrics(12, 6, "𓂧")
|
27
|
+
assert_metrics(12, 12, "𓆓")
|
28
|
+
end
|
29
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hierogloss
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Kidd
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: kramdown
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: parslet
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.4'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.4'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: prawn
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -115,16 +129,22 @@ files:
|
|
115
129
|
- lib/hierogloss.rb
|
116
130
|
- lib/hierogloss/dictionary.rb
|
117
131
|
- lib/hierogloss/gloss.rb
|
132
|
+
- lib/hierogloss/mdc.rb
|
133
|
+
- lib/hierogloss/metrics.rb
|
134
|
+
- lib/hierogloss/metrics/data.rb
|
118
135
|
- lib/hierogloss/version.rb
|
119
136
|
- lib/kramdown/converter/bbcode.rb
|
120
137
|
- lib/kramdown/converter/htlal.rb
|
121
138
|
- lib/kramdown/parser/hierogloss.rb
|
122
139
|
- src/Gardiner.ttf
|
140
|
+
- src/dump_metrics.rb
|
123
141
|
- test/minitest_helper.rb
|
124
142
|
- test/test_dictionary.rb
|
125
143
|
- test/test_gloss.rb
|
126
144
|
- test/test_hierogloss.rb
|
127
145
|
- test/test_kramdown_extensions.rb
|
146
|
+
- test/test_mdc.rb
|
147
|
+
- test/test_metrics.rb
|
128
148
|
homepage: https://github.com/emk/hierogloss
|
129
149
|
licenses:
|
130
150
|
- Public domain + other open source licenses
|
@@ -155,3 +175,5 @@ test_files:
|
|
155
175
|
- test/test_gloss.rb
|
156
176
|
- test/test_hierogloss.rb
|
157
177
|
- test/test_kramdown_extensions.rb
|
178
|
+
- test/test_mdc.rb
|
179
|
+
- test/test_metrics.rb
|