mathtype 0.0.8 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.travis.yml +7 -0
  4. data/Rakefile +8 -0
  5. data/lib/file_parser/ole.rb +15 -0
  6. data/lib/file_parser/parser.rb +19 -0
  7. data/lib/file_parser/wmf.rb +28 -0
  8. data/lib/mathtype.rb +30 -7
  9. data/lib/mathtype/version.rb +1 -1
  10. data/lib/records/bintypes.rb +18 -0
  11. data/lib/records/mtef.rb +8 -114
  12. data/lib/records/nudge.rb +9 -5
  13. data/lib/records/ruler.rb +1 -1
  14. data/lib/records/typesizes.rb +5 -10
  15. data/lib/records3/char.rb +53 -0
  16. data/lib/records3/embell.rb +109 -0
  17. data/lib/records3/font.rb +27 -0
  18. data/lib/records3/line.rb +47 -0
  19. data/lib/records3/matrix.rb +80 -0
  20. data/lib/records3/mtef.rb +97 -0
  21. data/lib/records3/options.rb +5 -0
  22. data/lib/records3/pile.rb +43 -0
  23. data/lib/records3/size.rb +75 -0
  24. data/lib/records3/snapshot.rb +19 -0
  25. data/lib/records3/tmpl.rb +751 -0
  26. data/lib/{records → records5}/char.rb +6 -12
  27. data/lib/{records → records5}/color.rb +1 -1
  28. data/lib/{records → records5}/color_def.rb +8 -8
  29. data/lib/{records → records5}/embell.rb +2 -2
  30. data/lib/{records → records5}/encoding_def.rb +1 -1
  31. data/lib/{records → records5}/eqn_prefs.rb +2 -2
  32. data/lib/{records → records5}/font_def.rb +1 -1
  33. data/lib/{records → records5}/font_style_def.rb +1 -1
  34. data/lib/{records → records5}/future.rb +1 -1
  35. data/lib/{records → records5}/line.rb +3 -3
  36. data/lib/{records → records5}/matrix.rb +11 -3
  37. data/lib/records5/mtef.rb +129 -0
  38. data/lib/{records → records5}/pile.rb +2 -2
  39. data/lib/{records → records5}/size.rb +9 -7
  40. data/lib/records5/snapshot.rb +19 -0
  41. data/lib/{records → records5}/tmpl.rb +2 -2
  42. data/spec/fixtures/expected/mathtype3/ceil.xml +38 -0
  43. data/spec/fixtures/expected/mathtype3/fence.xml +77 -0
  44. data/spec/fixtures/expected/mathtype3/floor.xml +38 -0
  45. data/spec/fixtures/expected/mathtype3/frac.xml +136 -0
  46. data/spec/fixtures/expected/mathtype3/large_nudge.xml +135 -0
  47. data/spec/fixtures/expected/mathtype3/lim_embell.xml +247 -0
  48. data/spec/fixtures/expected/mathtype3/matrix_2x1.xml +500 -0
  49. data/spec/fixtures/expected/mathtype3/pile.xml +188 -0
  50. data/spec/fixtures/expected/mathtype3/sigma_subsup.xml +46 -0
  51. data/spec/fixtures/expected/mathtype3/small_nudge.xml +90 -0
  52. data/spec/fixtures/expected/mathtype3/sqrt.xml +132 -0
  53. data/spec/fixtures/expected/{299.xml → mathtype5/299.xml} +30 -15
  54. data/spec/fixtures/expected/{arrows.xml → mathtype5/arrows.xml} +30 -15
  55. data/spec/fixtures/expected/{embedded.xml → mathtype5/embedded.xml} +29 -14
  56. data/spec/fixtures/expected/{embellishments.xml → mathtype5/embellishments.xml} +30 -15
  57. data/spec/fixtures/expected/{equation1.xml → mathtype5/equation1.xml} +30 -15
  58. data/spec/fixtures/expected/{equation10.xml → mathtype5/equation10.xml} +30 -15
  59. data/spec/fixtures/expected/{equation11.xml → mathtype5/equation11.xml} +30 -15
  60. data/spec/fixtures/expected/{equation12.xml → mathtype5/equation12.xml} +30 -15
  61. data/spec/fixtures/expected/{equation13.xml → mathtype5/equation13.xml} +30 -15
  62. data/spec/fixtures/expected/{equation2.xml → mathtype5/equation2.xml} +30 -15
  63. data/spec/fixtures/expected/{equation3.xml → mathtype5/equation3.xml} +30 -15
  64. data/spec/fixtures/expected/{equation4.xml → mathtype5/equation4.xml} +30 -15
  65. data/spec/fixtures/expected/{equation5.xml → mathtype5/equation5.xml} +30 -15
  66. data/spec/fixtures/expected/{equation6.xml → mathtype5/equation6.xml} +30 -15
  67. data/spec/fixtures/expected/{equation7.xml → mathtype5/equation7.xml} +30 -15
  68. data/spec/fixtures/expected/{equation8.xml → mathtype5/equation8.xml} +30 -15
  69. data/spec/fixtures/expected/{equation9.xml → mathtype5/equation9.xml} +30 -15
  70. data/spec/fixtures/expected/{fences.xml → mathtype5/fences.xml} +30 -15
  71. data/spec/fixtures/expected/{integrals.xml → mathtype5/integrals.xml} +30 -15
  72. data/spec/fixtures/expected/mathtype5/matrix-border.xml +365 -0
  73. data/spec/fixtures/expected/mathtype5/matrix.xml +382 -0
  74. data/spec/fixtures/expected/{sizes.xml → mathtype5/sizes.xml} +30 -15
  75. data/spec/fixtures/input/mathtype3/ceil.bin +0 -0
  76. data/spec/fixtures/input/mathtype3/fence.bin +0 -0
  77. data/spec/fixtures/input/mathtype3/floor.bin +0 -0
  78. data/spec/fixtures/input/mathtype3/frac.bin +0 -0
  79. data/spec/fixtures/input/mathtype3/large_nudge.bin +0 -0
  80. data/spec/fixtures/input/mathtype3/lim_embell.bin +0 -0
  81. data/spec/fixtures/input/mathtype3/matrix_2x1.bin +0 -0
  82. data/spec/fixtures/input/mathtype3/pile.bin +0 -0
  83. data/spec/fixtures/input/mathtype3/sigma_subsup.bin +0 -0
  84. data/spec/fixtures/input/mathtype3/small_nudge.bin +0 -0
  85. data/spec/fixtures/input/mathtype3/sqrt.bin +0 -0
  86. data/spec/fixtures/input/{299.bin → mathtype5/299.bin} +0 -0
  87. data/spec/fixtures/input/{arrows.bin → mathtype5/arrows.bin} +0 -0
  88. data/spec/fixtures/input/{embedded.bin → mathtype5/embedded.bin} +0 -0
  89. data/spec/fixtures/input/{embellishments.bin → mathtype5/embellishments.bin} +0 -0
  90. data/spec/fixtures/input/{equation1.bin → mathtype5/equation1.bin} +0 -0
  91. data/spec/fixtures/input/{equation10.bin → mathtype5/equation10.bin} +0 -0
  92. data/spec/fixtures/input/{equation11.bin → mathtype5/equation11.bin} +0 -0
  93. data/spec/fixtures/input/{equation12.bin → mathtype5/equation12.bin} +0 -0
  94. data/spec/fixtures/input/{equation13.bin → mathtype5/equation13.bin} +0 -0
  95. data/spec/fixtures/input/{equation2.bin → mathtype5/equation2.bin} +0 -0
  96. data/spec/fixtures/input/{equation3.bin → mathtype5/equation3.bin} +0 -0
  97. data/spec/fixtures/input/{equation4.bin → mathtype5/equation4.bin} +0 -0
  98. data/spec/fixtures/input/{equation5.bin → mathtype5/equation5.bin} +0 -0
  99. data/spec/fixtures/input/{equation6.bin → mathtype5/equation6.bin} +0 -0
  100. data/spec/fixtures/input/{equation7.bin → mathtype5/equation7.bin} +0 -0
  101. data/spec/fixtures/input/{equation8.bin → mathtype5/equation8.bin} +0 -0
  102. data/spec/fixtures/input/{equation9.bin → mathtype5/equation9.bin} +0 -0
  103. data/spec/fixtures/input/{fences.bin → mathtype5/fences.bin} +0 -0
  104. data/spec/fixtures/input/{integrals.bin → mathtype5/integrals.bin} +0 -0
  105. data/spec/fixtures/input/mathtype5/matrix-border.bin +0 -0
  106. data/spec/fixtures/input/mathtype5/matrix.bin +0 -0
  107. data/spec/fixtures/input/{sizes.bin → mathtype5/sizes.bin} +0 -0
  108. data/spec/mathtype_spec.rb +11 -9
  109. data/test-mathtype.rb +2 -0
  110. metadata +168 -97
@@ -0,0 +1,109 @@
1
+ require_relative "snapshot"
2
+
3
+ # EMBELL record (6):
4
+ # Consists of:
5
+ # record type (6)
6
+ # options
7
+ # [nudge] if mtefOPT_NUDGE is set
8
+ # [embell] embellishment type
9
+ # The embellishment types are:
10
+
11
+ # value symbol description
12
+ # 2 emb1DOT over single dot
13
+ # 3 emb2DOT over double dot
14
+ # 4 emb3DOT over triple dot
15
+ # 5 emb1PRIME single prime
16
+ # 6 emb2PRIME double prime
17
+ # 7 embBPRIME backwards prime (left of character)
18
+ # 8 embTILDE tilde
19
+ # 9 embHAT hat (circumflex)
20
+ # 10 embNOT diagonal slash through character
21
+ # 11 embRARROW over right arrow
22
+ # 12 embLARROW over left arrow
23
+ # 13 embBARROW over both arrow (left and right)
24
+ # 14 embR1ARROW over right single-barbed arrow
25
+ # 15 embL1ARROW over left single-barbed arrow
26
+ # 16 embMBAR mid-height horizontal bar
27
+ # 17 embOBAR over-bar
28
+ # 18 emb3PRIME triple prime
29
+ # 19 embFROWN over-arc, concave downward
30
+ # 20 embSMILE over-arc, concave upward
31
+ # 21 embX_BARS double diagonal bars
32
+ # 22 embUP_BAR bottom-left to top-right diagonal bar
33
+ # 23 embDOWN_BAR top-left to bottom-right diagonal bar
34
+ # 24 emb4DOT over quad dot
35
+ # 25 embU_1DOT under single dot
36
+ # 26 embU_2DOT under double dot
37
+ # 27 embU_3DOT under triple dot
38
+ # 28 embU_4DOT under quad dot
39
+ # 29 embU_BAR under bar
40
+ # 30 embU_TILDE under tilde (~)
41
+ # 31 embU_FROWN under arc (ends point down)
42
+ # 32 embU_SMILE under arc (ends point up)
43
+ # 33 embU_RARROW under right arrow
44
+ # 34 embU_LARROW under left arrow
45
+ # 35 embU_BARROW under both arrow (left and right)
46
+ # 36 embU_R1ARROW under right arrow (1 barb)
47
+ # 37 embU_L1ARROW under left arrow (1 barb)
48
+
49
+ module Mathtype3
50
+ class RecordEmbell < BinData::Record
51
+ include Snapshot
52
+ EXPOSED_IN_SNAPSHOT = %i(options nudge embell)
53
+
54
+ EMBELL = {
55
+ 2 => "emb1DOT", # over single dot
56
+ 3 => "emb2DOT", # over double dot
57
+ 4 => "emb3DOT", # over triple dot
58
+ 5 => "emb1PRIME", # single prime
59
+ 6 => "emb2PRIME", # double prime
60
+ 7 => "embBPRIME", # backwards prime (left of character)
61
+ 8 => "embTILDE", # tilde
62
+ 9 => "embHAT", # hat (circumflex)
63
+ 10 => "embNOT", # diagonal slash through character
64
+ 11 => "embRARROW", # over right arrow
65
+ 12 => "embLARROW", # over left arrow
66
+ 13 => "embBARROW", # over both arrow (left and right)
67
+ 14 => "embR1ARROW", # over right single-barbed arrow
68
+ 15 => "embL1ARROW", # over left single-barbed arrow
69
+ 16 => "embMBAR", # mid-height horizontal bar
70
+ 17 => "embOBAR", # over-bar
71
+ 18 => "emb3PRIME", # triple prime
72
+ 19 => "embFROWN", # over-arc, concave downward
73
+ 20 => "embSMILE", # over-arc, concave upward
74
+ 21 => "embX_BARS", # double diagonal bars
75
+ 22 => "embUP_BAR", # bottom-left to top-right diagonal bar
76
+ 23 => "embDOWN_BAR", # top-left to bottom-right diagonal bar
77
+ 24 => "emb4DOT", # over quad dot
78
+ 25 => "embU_1DOT", # under single dot
79
+ 26 => "embU_2DOT", # under double dot
80
+ 27 => "embU_3DOT", # under triple dot
81
+ 28 => "embU_4DOT", # under quad dot
82
+ 29 => "embU_BAR", # under bar
83
+ 30 => "embU_TILDE", # under tilde (~)
84
+ 31 => "embU_FROWN", # under arc (ends point down)
85
+ 32 => "embU_SMILE", # under arc (ends point up)
86
+ 33 => "embU_RARROW", # under right arrow
87
+ 34 => "embU_LARROW", # under left arrow
88
+ 35 => "embU_BARROW", # under both arrow (left and right)
89
+ 36 => "embU_R1ARROW", # under right arrow (1 barb)
90
+ 37 => "embU_L1ARROW", # under left arrow (1 barb)
91
+ }
92
+ mandatory_parameter :_options
93
+
94
+ virtual :_tag_options, :value => lambda{ _options }
95
+
96
+ record_nudge :nudge, onlyif: lambda { _options & OPTIONS["xfLMOVE"] > 0 }
97
+
98
+ int8 :_embell
99
+ int8 :_none
100
+
101
+ def embell
102
+ EMBELL[_embell]
103
+ end
104
+
105
+ def options
106
+ _tag_options
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,27 @@
1
+ require_relative "snapshot"
2
+
3
+ module Mathtype3
4
+ class RecordFont < BinData::Record
5
+ include Snapshot
6
+ EXPOSED_IN_SNAPSHOT = %i(options name typeface style)
7
+
8
+ endian :little
9
+
10
+ mandatory_parameter :_options
11
+
12
+ virtual :_tag_options, :value => lambda{ _options }
13
+
14
+ int8 :_typeface
15
+
16
+ int8 :style
17
+
18
+ stringz :name
19
+ def typeface
20
+ _typeface + 128
21
+ end
22
+
23
+ def options
24
+ _tag_options
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,47 @@
1
+ # LINE record (1):
2
+ # Consists of:
3
+ # record type (1)
4
+ # options
5
+ # [nudge] if mtefOPT_NUDGE is set
6
+ # [line spacing] if mtefOPT_LINE_LSPACE is set (16-bit integer)
7
+ # [RULER record] if mtefOPT_LP_RULER is set
8
+ # object list of line (single pile, characters and templates, or nothing)
9
+ # The line spacing value, if present, is the distance between the baseline of
10
+ # this line and the line above it.
11
+
12
+ require_relative "snapshot"
13
+
14
+ module Mathtype3
15
+ class NamedRecord < BinData::Record; end
16
+ class RecordLine < BinData::Record
17
+ include Snapshot
18
+ EXPOSED_IN_SNAPSHOT = %i(options nudge line_spacing ruler object_list)
19
+ endian :little
20
+
21
+ mandatory_parameter :_options
22
+
23
+ virtual :_tag_options, :value => lambda{ _options }
24
+
25
+ record_nudge :nudge, onlyif: lambda { _options & OPTIONS["xfLMOVE"] > 0 }
26
+
27
+ mtef16 :line_spacing, onlyif: (lambda do
28
+ _options & OPTIONS["xfLSPACE"] > 0
29
+ end)
30
+
31
+ record_ruler :ruler, onlyif: (lambda do
32
+ _options & OPTIONS["xfRULER"] > 0
33
+ end)
34
+
35
+ array :object_list,
36
+ onlyif: lambda { _options & OPTIONS["xfNULL"] == 0 },
37
+ read_until: lambda { element.record_type == 0 } do
38
+ named_record
39
+ end
40
+
41
+ def to_formatted_s(indent = 0); to_s; end
42
+
43
+ def options
44
+ _tag_options
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,80 @@
1
+ require_relative "snapshot"
2
+
3
+ # MATRIX record (5):
4
+ # record type (5)
5
+ # options
6
+ # [nudge] if mtefOPT_NUDGE is set
7
+ # [valign] vertical alignment of matrix within container
8
+ # [h_just] horizontal alignment within columns
9
+ # [v_just] vertical alignment within columns
10
+ # [rows] number of rows
11
+ # [cols] number of columns
12
+ # [row_parts] row partition line types (see below)
13
+ # [col_parts] column partition line types (see below)
14
+ # [object list] list of lines, one for each element of the matrix, in order from
15
+ # left-to-right and top-to-bottom
16
+ # The values for valign, h_just, and v_just are described in PILE above.
17
+
18
+ # The row partition line type list consists of two-bit values for each possible
19
+ # partition line (one more than the number of rows), rounded out to the nearest
20
+ # byte. Each value determines the line style of the corresponding partition line
21
+ # (0 for none, 1 for solid, 2 for dashed, or 3 for dotted). Similarly for the
22
+ # column partition lines.
23
+
24
+ module Mathtype3
25
+ class RecordMatrix < BinData::Record
26
+ include Snapshot
27
+ EXPOSED_IN_SNAPSHOT = %i(options nudge valign h_just v_just rows cols
28
+ row_parts col_parts object_list)
29
+
30
+
31
+ mandatory_parameter :_options
32
+
33
+ virtual :_tag_options, :value => lambda{ _options }
34
+
35
+ record_nudge :nudge, onlyif: lambda { _options & OPTIONS["xfLMOVE"] > 0 }
36
+
37
+ int8 :_valign
38
+ int8 :_h_just
39
+ int8 :_v_just
40
+ int8 :rows
41
+ int8 :cols
42
+
43
+ array :row_parts, initial_length: lambda { rows + 1 } do
44
+ bit nbits: 2
45
+ end
46
+
47
+ bit :_realign_rows, nbits: lambda { realign(rows) }
48
+
49
+ array :col_parts, initial_length: lambda { cols + 1 } do
50
+ bit nbits: 2
51
+ end
52
+
53
+ bit :_realign_cols, nbits: lambda { realign(cols) }
54
+
55
+ array :object_list, read_until: lambda { element.record_type == 0 } do
56
+ named_record
57
+ end
58
+
59
+ def valign
60
+ VALIGN[_valign]
61
+ end
62
+
63
+ def h_just
64
+ HALIGN[_h_just]
65
+ end
66
+
67
+ def v_just
68
+ VALIGN[_v_just]
69
+ end
70
+
71
+ def options
72
+ _tag_options
73
+ end
74
+
75
+ def realign (nparts)
76
+ offset = (((nparts + 1) * 2) % 8)
77
+ return offset == 0 ? 0 : (8 - offset)
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,97 @@
1
+ require_relative "line"
2
+ require_relative "embell"
3
+ require_relative "char"
4
+ require_relative "pile"
5
+ require_relative "tmpl"
6
+ require_relative "font"
7
+ require_relative "matrix"
8
+ require_relative "size"
9
+
10
+ module Mathtype3
11
+ class RecordEnd < Mathtype::RecordEnd; end
12
+ class RecordNudge < Mathtype::RecordNudge; end
13
+ class RecordRuler < Mathtype::RecordRuler; end
14
+ class RecordNudge < Mathtype::RecordNudge; end
15
+ class RecordFull < Mathtype::RecordFull; end
16
+ class RecordSub < Mathtype::RecordSub; end
17
+ class RecordSub2 < Mathtype::RecordSub2; end
18
+ class RecordSym < Mathtype::RecordSym; end
19
+ class RecordSubsym < Mathtype::RecordSubsym; end
20
+
21
+ HALIGN = Mathtype::HALIGN
22
+ VALIGN = Mathtype::VALIGN
23
+
24
+ RECORD_NAMES = {
25
+ 0 => "end",
26
+ 1 => "slot",
27
+ 2 => "char",
28
+ 3 => "tmpl",
29
+ 4 => "pile",
30
+ 5 => "matrix",
31
+ 6 => "embell",
32
+ 7 => "ruler",
33
+ 8 => "font",
34
+ 9 => "size",
35
+ 10 => "full",
36
+ 11 => "sub",
37
+ 12 => "sub2",
38
+ 13 => "sym",
39
+ 14 => "subsym",
40
+ }
41
+
42
+ OPTIONS = {
43
+ # value => symbol # description
44
+ # Option flag values for all equation structure records:
45
+ "xfLMOVE" => 0x08, # nudge values follow tag
46
+ # Option flag values for CHAR records:
47
+ "xfLAUTO" => 0x01, # character is followed by an embellishment list
48
+ "xfEMBELL" => 0x02, # character starts a function (sin, cos, etc.)
49
+ # Option flag values for LINE records:
50
+ "xfNULL" => 0x01, # line is a placeholder only (i.e. not displayed)
51
+ "xfLSPACE" => 0x04, # line spacing value follows tag
52
+ # Option flag values for LINE and PILE records:
53
+ "xfRULER" => 0x02, # RULER record follows LINE or PILE record
54
+ }
55
+
56
+ class Payload < BinData::Choice
57
+ opt = {:_options => :options}
58
+ record_end 0 # end is a reserved keyword
59
+ record_line 1, opt
60
+ record_char 2, opt
61
+ record_tmpl 3, opt
62
+ record_pile 4, opt
63
+ record_matrix 5, opt
64
+ record_embell 6, opt
65
+ record_ruler 7, opt
66
+ record_font 8, opt
67
+ record_size 9, opt
68
+ record_full 10, opt
69
+ record_sub 11, opt
70
+ record_sub2 12, opt
71
+ record_sym 13, opt
72
+ record_subsym 14, opt
73
+ end
74
+
75
+ ## Payload is the most important class to understand.
76
+ ## This abstraction allows recursive formats.
77
+ ## eg. lists can contain lists can contain lists.
78
+
79
+ class NamedRecord < BinData::Record
80
+ bit4 :record_options
81
+ bit4 :record_type
82
+ payload :payload, :onlyif => :not_end_tag?, :selection => :record_type, :options => :record_options
83
+
84
+ def not_end_tag?
85
+ record_type != 0
86
+ end
87
+ end
88
+
89
+ class Equation < Mathtype::Equation
90
+ EXPOSED_IN_SNAPSHOT = %i(mtef_version platform product product_version
91
+ product_subversion equation)
92
+
93
+ array :equation, read_until: lambda { element.record_type == 0 } do
94
+ named_record
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,5 @@
1
+ module Mathtype3
2
+ class mtef_options < BinData::Record
3
+
4
+ end
5
+ end
@@ -0,0 +1,43 @@
1
+ require_relative "snapshot"
2
+
3
+ # PILE record (4):
4
+
5
+ # Consists of:
6
+
7
+ # record type (4)
8
+ # options
9
+ # [nudge] if mtefOPT_NUDGE is set
10
+ # [halign] horizontal alignment
11
+ # [valign] vertical alignment
12
+ # [[RULER record]] if mtefOPT_LP_RULER is set
13
+ # [object list] list of lines contained by the pile
14
+
15
+ module Mathtype3
16
+ class RecordPile < BinData::Record
17
+ include Snapshot
18
+ EXPOSED_IN_SNAPSHOT = %i(options halign valign object_list)
19
+
20
+ mandatory_parameter :_options
21
+
22
+ virtual :options, :value => lambda{ _options }
23
+
24
+ record_nudge :nudge, onlyif: lambda { _options & OPTIONS["xfLMOVE"] > 0 }
25
+
26
+ int8 :_halign
27
+ int8 :_valign
28
+
29
+ record_ruler :ruler, onlyif: lambda { _options & OPTIONS["xfRULER"] > 0 }
30
+
31
+ array :object_list, read_until: lambda { element.record_type == 0 } do
32
+ named_record
33
+ end
34
+
35
+ def halign
36
+ HALIGN[_halign]
37
+ end
38
+
39
+ def valign
40
+ VALIGN[_valign]
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,75 @@
1
+ require_relative "snapshot"
2
+
3
+ # SIZE record (9):
4
+ # Consists of one of the following cases:
5
+
6
+ # if lsize < 0 (explicit point size):
7
+ # record type (9)
8
+ # 101
9
+ # -point size (16 bit integer)
10
+ # else if -128 < dsize < +128:
11
+ # record type (9)
12
+ # lsize (typesize)
13
+ # dsize + 128
14
+ # else: (large delta)
15
+ # record type (9)
16
+ # 100
17
+ # lsize (typesize)
18
+ # dsize (16 bit integer)
19
+ # Sizes in MathType are represented as a pair of values, lsize and dsize. Lsize
20
+ # stands for "logical size", dsize for "delta size". If it is negative, it is an
21
+ # explicit point size (in 32nds of a point) negated and dsize is ignored.
22
+ # Otherwise, lsize is a typesize value and dsize is a delta from that size:
23
+ # Simple typesizes, without a delta value, are written using the records
24
+ # described in the next section.
25
+
26
+ module Mathtype3
27
+ class RecordSize < BinData::Record
28
+ include Snapshot
29
+ EXPOSED_IN_SNAPSHOT = %i(options lsize dsize point_size)
30
+
31
+ endian :little
32
+
33
+ mandatory_parameter :_options
34
+
35
+ virtual :_tag_options, :value => lambda{ _options }
36
+
37
+ int8 :_size_select
38
+
39
+ mtef16 :_point_size, onlyif: lambda { _size_select == 101 }
40
+ uint8 :_lsize_large_delta, onlyif: lambda { _size_select == 100 }
41
+
42
+ uint8 :_dsize, onlyif: lambda { _size_select != 100 && _size_select != 101 }
43
+ mtef16 :_dsize_large, onlyif: lambda { _size_select == 100 }
44
+
45
+ def dsize
46
+ case _size_select
47
+ when 100
48
+ _dsize_large / 32
49
+ when 101
50
+ nil
51
+ else
52
+ (_dsize - 128) / 32 # in 32nds of a point
53
+ end
54
+ end
55
+
56
+ def lsize
57
+ case _size_select
58
+ when 100
59
+ _lsize_large_delta
60
+ when 101
61
+ nil
62
+ else
63
+ _size_select
64
+ end
65
+ end
66
+
67
+ def point_size
68
+ -_point_size if _point_size != 0
69
+ end
70
+
71
+ def options
72
+ _tag_options
73
+ end
74
+ end
75
+ end