mathtype 0.0.2
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 +7 -0
- data/.gitignore +14 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +40 -0
- data/Rakefile +2 -0
- data/lib/mathtype/version.rb +3 -0
- data/lib/mathtype.rb +61 -0
- data/lib/records/char.rb +84 -0
- data/lib/records/color.rb +13 -0
- data/lib/records/color_def.rb +37 -0
- data/lib/records/embell.rb +103 -0
- data/lib/records/encoding_def.rb +22 -0
- data/lib/records/end.rb +8 -0
- data/lib/records/eqn_prefs.rb +44 -0
- data/lib/records/font_def.rb +14 -0
- data/lib/records/font_style_def.rb +14 -0
- data/lib/records/future.rb +14 -0
- data/lib/records/line.rb +36 -0
- data/lib/records/matrix.rb +41 -0
- data/lib/records/mtef.rb +118 -0
- data/lib/records/nudge.rb +34 -0
- data/lib/records/pile.rb +28 -0
- data/lib/records/ruler.rb +22 -0
- data/lib/records/size.rb +44 -0
- data/lib/records/snapshot.rb +19 -0
- data/lib/records/tmpl.rb +449 -0
- data/lib/records/typesizes.rb +24 -0
- data/mathtype.gemspec +28 -0
- data/spec/fixtures/expected/embelishments.xml +848 -0
- data/spec/fixtures/expected/equation1.xml +492 -0
- data/spec/fixtures/expected/equation10.xml +369 -0
- data/spec/fixtures/expected/equation11.xml +370 -0
- data/spec/fixtures/expected/equation12.xml +433 -0
- data/spec/fixtures/expected/equation13.xml +680 -0
- data/spec/fixtures/expected/equation2.xml +429 -0
- data/spec/fixtures/expected/equation3.xml +1374 -0
- data/spec/fixtures/expected/equation4.xml +360 -0
- data/spec/fixtures/expected/equation5.xml +377 -0
- data/spec/fixtures/expected/equation6.xml +364 -0
- data/spec/fixtures/expected/equation7.xml +369 -0
- data/spec/fixtures/expected/equation8.xml +362 -0
- data/spec/fixtures/expected/equation9.xml +355 -0
- data/spec/fixtures/input/embelishments.bin +0 -0
- data/spec/fixtures/input/equation1.bin +0 -0
- data/spec/fixtures/input/equation10.bin +0 -0
- data/spec/fixtures/input/equation11.bin +0 -0
- data/spec/fixtures/input/equation12.bin +0 -0
- data/spec/fixtures/input/equation13.bin +0 -0
- data/spec/fixtures/input/equation2.bin +0 -0
- data/spec/fixtures/input/equation3.bin +0 -0
- data/spec/fixtures/input/equation4.bin +0 -0
- data/spec/fixtures/input/equation5.bin +0 -0
- data/spec/fixtures/input/equation6.bin +0 -0
- data/spec/fixtures/input/equation7.bin +0 -0
- data/spec/fixtures/input/equation8.bin +0 -0
- data/spec/fixtures/input/equation9.bin +0 -0
- data/spec/mathtype_spec.rb +16 -0
- data/spec/spec_helper.rb +64 -0
- metadata +233 -0
data/lib/records/mtef.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
require_relative "end"
|
2
|
+
require_relative "nudge"
|
3
|
+
require_relative "ruler"
|
4
|
+
require_relative "line"
|
5
|
+
require_relative "embell"
|
6
|
+
require_relative "char"
|
7
|
+
require_relative "pile"
|
8
|
+
require_relative "tmpl"
|
9
|
+
require_relative "eqn_prefs"
|
10
|
+
require_relative "font_def"
|
11
|
+
require_relative "typesizes"
|
12
|
+
require_relative "font_style_def"
|
13
|
+
require_relative "matrix"
|
14
|
+
require_relative "encoding_def"
|
15
|
+
require_relative "embell"
|
16
|
+
require_relative "size"
|
17
|
+
require_relative "color"
|
18
|
+
require_relative "color_def"
|
19
|
+
require_relative "future"
|
20
|
+
|
21
|
+
module Mathtype
|
22
|
+
RECORD_NAMES = {
|
23
|
+
0 => "end",
|
24
|
+
1 => "slot",
|
25
|
+
2 => "char",
|
26
|
+
3 => "tmpl",
|
27
|
+
4 => "pile",
|
28
|
+
5 => "matrix",
|
29
|
+
6 => "embell",
|
30
|
+
7 => "ruler",
|
31
|
+
8 => "font_style_def",
|
32
|
+
9 => "size",
|
33
|
+
10 => "full",
|
34
|
+
11 => "sub",
|
35
|
+
12 => "sub2",
|
36
|
+
13 => "sym",
|
37
|
+
14 => "subsym",
|
38
|
+
15 => "color",
|
39
|
+
16 => "color_def",
|
40
|
+
17 => "font_def",
|
41
|
+
18 => "eqn_prefs",
|
42
|
+
19 => "encoding_def",
|
43
|
+
100 => "future"
|
44
|
+
}
|
45
|
+
|
46
|
+
OPTIONS = {
|
47
|
+
# value => symbol # description
|
48
|
+
# Option flag values for all equation structure records:
|
49
|
+
"mtefOPT_NUDGE" => 0x08, # nudge values follow tag
|
50
|
+
# Option flag values for CHAR records:
|
51
|
+
"mtefOPT_CHAR_EMBELL" => 0x01, # character is followed by an embellishment list
|
52
|
+
"mtefOPT_CHAR_FUNC_START" => 0x02, # character starts a function (sin, cos, etc.)
|
53
|
+
"mtefOPT_CHAR_ENC_CHAR_8" => 0x04, # character is written with an 8-bit encoded value
|
54
|
+
"mtefOPT_CHAR_ENC_CHAR_16" => 0x10, # character is written with an 16-bit encoded value
|
55
|
+
"mtefOPT_CHAR_ENC_NO_MTCODE" => 0x20, # character is written without an 16-bit MTCode value
|
56
|
+
# Option flag values for LINE records:
|
57
|
+
"mtefOPT_LINE_NULL" => 0x01, # line is a placeholder only (i.e. not displayed)
|
58
|
+
"mtefOPT_LINE_LSPACE" => 0x04, # line spacing value follows tag
|
59
|
+
# Option flag values for LINE and PILE records:
|
60
|
+
"mtefOPT_LP_RULER" => 0x02, # RULER record follows LINE or PILE record
|
61
|
+
# Option flag values for COLOR_DEF records:
|
62
|
+
"mtefCOLOR_CMYK" => 0x01, # color model is CMYK, else RGB
|
63
|
+
"mtefCOLOR_SPOT" => 0x02, # color is a spot color, else a process color
|
64
|
+
"mtefCOLOR_NAME" => 0x04, # color has a name, else no name
|
65
|
+
}
|
66
|
+
|
67
|
+
## Payload is the most important class to understand.
|
68
|
+
## This abstraction allows recursive formats.
|
69
|
+
## eg. lists can contain lists can contain lists.
|
70
|
+
|
71
|
+
class Payload < BinData::Choice
|
72
|
+
record_end 0 # end is a reserved keyword
|
73
|
+
record_line 1
|
74
|
+
record_char 2
|
75
|
+
record_tmpl 3
|
76
|
+
record_pile 4
|
77
|
+
record_matrix 5
|
78
|
+
record_embell 6
|
79
|
+
record_ruler 7
|
80
|
+
record_font_style_def 8
|
81
|
+
record_size 9
|
82
|
+
record_full 10
|
83
|
+
record_sub 11
|
84
|
+
record_sub2 12
|
85
|
+
record_sym 13
|
86
|
+
record_subsym 14
|
87
|
+
record_color 15
|
88
|
+
record_color_def 16
|
89
|
+
record_font_def 17
|
90
|
+
record_eqn_prefs 18
|
91
|
+
record_encoding_def 19
|
92
|
+
record_future 100
|
93
|
+
end
|
94
|
+
|
95
|
+
class NamedRecord < BinData::Record
|
96
|
+
int8 :record_type
|
97
|
+
payload :payload, :onlyif => :not_end_tag?, :selection => :record_type
|
98
|
+
|
99
|
+
def not_end_tag?
|
100
|
+
record_type != 0
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
class Equation < BinData::Record
|
105
|
+
endian :little
|
106
|
+
uint8 :mtef_version
|
107
|
+
uint8 :platform
|
108
|
+
uint8 :product
|
109
|
+
uint8 :product_version
|
110
|
+
uint8 :product_subversion
|
111
|
+
stringz :application_key
|
112
|
+
uint8 :equation_options
|
113
|
+
|
114
|
+
array :equation, read_until: lambda { element.record_type == 0 } do
|
115
|
+
named_record
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# Nudge values:
|
2
|
+
# LINE, CHAR, TMPL, PILE, MATRIX, and EMBELL records may store the result of
|
3
|
+
# nudging (small offsets applied by the user). A nudged record has the
|
4
|
+
# mtefOPT_NUDGE option (0x8) and the option byte is followed immediately by
|
5
|
+
# the nudge offset. The nudge offset consists of either two bytes or six,
|
6
|
+
# depending on the amount of offset. If -128 <= dx < +128 and
|
7
|
+
# -128 <= dy < +128, then the offsets are stored as two bytes, dx followed
|
8
|
+
# by dy, where each value has 128 added to it before it is written. Otherwise,
|
9
|
+
# two bytes of 128 are stored, followed by the offsets, dx and dy, stored as
|
10
|
+
# 16-bit values, low byte followed by high byte.
|
11
|
+
|
12
|
+
require_relative "snapshot"
|
13
|
+
|
14
|
+
module Mathtype
|
15
|
+
class Nudge < BinData::Record
|
16
|
+
include Snapshot
|
17
|
+
EXPOSED_IN_SNAPSHOT = %i(dx dy)
|
18
|
+
|
19
|
+
endian :little
|
20
|
+
|
21
|
+
int8 :_small_dx
|
22
|
+
int8 :_small_dy
|
23
|
+
int16 :_large_dx, :onlyif => lambda { _small_dx == 128 }
|
24
|
+
int16 :_large_dy, :onlyif => lambda { _small_dy == 128 }
|
25
|
+
|
26
|
+
def dx
|
27
|
+
_small_dx == 128 ? _large_dx : (_small_dx - 128)
|
28
|
+
end
|
29
|
+
|
30
|
+
def dy
|
31
|
+
_small_dy == 128 ? _large_dy : (_small_dy - 128)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/records/pile.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# PILE record (4):
|
2
|
+
|
3
|
+
# Consists of:
|
4
|
+
|
5
|
+
# record type (4)
|
6
|
+
# options
|
7
|
+
# [nudge] if mtefOPT_NUDGE is set
|
8
|
+
# [halign] horizontal alignment
|
9
|
+
# [valign] vertical alignment
|
10
|
+
# [[RULER record]] if mtefOPT_LP_RULER is set
|
11
|
+
# [object list] list of lines contained by the pile
|
12
|
+
|
13
|
+
module Mathtype
|
14
|
+
class RecordPile < BinData::Record
|
15
|
+
int8 :options
|
16
|
+
|
17
|
+
nudge :nudge, onlyif: lambda { options & OPTIONS["mtefOPT_NUDGE"] > 0 }
|
18
|
+
|
19
|
+
int8 :halign
|
20
|
+
int8 :valign
|
21
|
+
|
22
|
+
record_ruler :ruler, onlyif: lambda { options & OPTIONS["mtefOPT_LP_RULER"] > 0 }
|
23
|
+
|
24
|
+
array :object_list, read_until: lambda { element.record_type == 0 } do
|
25
|
+
named_record
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# RULER record (7):
|
2
|
+
# Consists of:
|
3
|
+
# record type (7)
|
4
|
+
# [n_stops] number of tab-stops
|
5
|
+
# [tab-stop list] tab-stops in order from left-to-right
|
6
|
+
# Each tab stop is described by a tab-stop type
|
7
|
+
# (0 for left, 1 for center, 2 for right, 3 for equal, 4 for decimal),
|
8
|
+
# followed by a 16-bit integer offset from the left end of the slot or pile
|
9
|
+
# with which it is associated.
|
10
|
+
|
11
|
+
module Mathtype
|
12
|
+
class RecordRuler < BinData::Record
|
13
|
+
endian :little
|
14
|
+
|
15
|
+
int8 :n_stops
|
16
|
+
|
17
|
+
array :tab_stops, initial_length: :n_stops do
|
18
|
+
int8 :tab_stop_type
|
19
|
+
int16 :tab_stop
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/records/size.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# SIZE record (9):
|
2
|
+
# Consists of one of the following cases:
|
3
|
+
|
4
|
+
# if lsize < 0 (explicit point size):
|
5
|
+
# record type (9)
|
6
|
+
# 101
|
7
|
+
# -point size (16 bit integer)
|
8
|
+
# else if -128 < dsize < +128:
|
9
|
+
# record type (9)
|
10
|
+
# lsize (typesize)
|
11
|
+
# dsize + 128
|
12
|
+
# else: (large delta)
|
13
|
+
# record type (9)
|
14
|
+
# 100
|
15
|
+
# lsize (typesize)
|
16
|
+
# dsize (16 bit integer)
|
17
|
+
# Sizes in MathType are represented as a pair of values, lsize and dsize. Lsize
|
18
|
+
# stands for "logical size", dsize for "delta size". If it is negative, it is an
|
19
|
+
# explicit point size (in 32nds of a point) negated and dsize is ignored.
|
20
|
+
# Otherwise, lsize is a typesize value and dsize is a delta from that size:
|
21
|
+
# Simple typesizes, without a delta value, are written using the records
|
22
|
+
# described in the next section.
|
23
|
+
|
24
|
+
module Mathtype
|
25
|
+
class RecordSize < BinData::Record
|
26
|
+
endian :little
|
27
|
+
int8 :lsize
|
28
|
+
|
29
|
+
uint16 :point_size, onlyif: lambda { lsize == 101 }
|
30
|
+
|
31
|
+
dsize_choice = lambda do
|
32
|
+
if lsize == 100
|
33
|
+
100
|
34
|
+
elsif lsize != 100 && lsize != 101
|
35
|
+
0
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
choice :dsize, selection: dsize_choice do
|
40
|
+
uint16 100
|
41
|
+
uint16 0
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require "bindata"
|
2
|
+
|
3
|
+
module Mathtype
|
4
|
+
module Snapshot
|
5
|
+
def snapshot
|
6
|
+
snapshot = BinData::Record::Snapshot.new
|
7
|
+
exposed = self.class.const_get(:EXPOSED_IN_SNAPSHOT)
|
8
|
+
exposed.each do |name|
|
9
|
+
obj = find_obj_for_name(name)
|
10
|
+
if obj
|
11
|
+
snapshot[name] = obj.snapshot if include_obj?(obj)
|
12
|
+
else
|
13
|
+
snapshot[name] = self.send(name)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
snapshot
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|