You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

410 lines
11 KiB

3 weeks ago
package eqn
import "fmt"
type RecordType uint8
type OptionType uint8
const (
END RecordType = 0
LINE RecordType = 1
CHAR RecordType = 2
TMPL RecordType = 3
PILE RecordType = 4
MATRIX RecordType = 5
EMBELL RecordType = 6
RULER RecordType = 7
FONT_STYLE_DEF RecordType = 8
SIZE RecordType = 9
FULL RecordType = 10
SUB RecordType = 11
SUB2 RecordType = 12
SYM RecordType = 13
SUBSYM RecordType = 14
COLOR RecordType = 15
COLOR_DEF RecordType = 16
FONT_DEF RecordType = 17
EQN_PREFS RecordType = 18
ENCODING_DEF RecordType = 19
FUTURE RecordType = 100
ROOT RecordType = 255
)
const (
MtefOptNudge OptionType = 0x08
MtefOptCharEmbell OptionType = 0x01
MtefOptCharFuncStart OptionType = 0x02
MtefOptCharEncChar8 OptionType = 0x04
MtefOptCharEncChar16 OptionType = 0x10
MtefOptCharEncNoMtcode OptionType = 0x20
MtefOptLineNull OptionType = 0x01
mtefOPT_LP_RULER OptionType = 0x02
MtefOptLineLspace OptionType = 0x04
MtefOptLpRuler OptionType = 0x02
MtefColorCmyk OptionType = 0x01
MtefColorSpot OptionType = 0x02
MtefColorName OptionType = 0x04
mtefCOLOR_CMYK OptionType = 0x01
mtefCOLOR_SPOT OptionType = 0x02
mtefCOLOR_NAME OptionType = 0x04
)
const (
fnTEXT uint8 = 1
fnFUNCTION uint8 = 2
fnVARIABLE uint8 = 3
fnLCGREEK uint8 = 4
fnUCGREEK uint8 = 5
fnSYMBOL uint8 = 6
fnVECTOR uint8 = 7
fnNUMBER uint8 = 8
fnUSER1 uint8 = 9
fnUSER2 uint8 = 10
fnMTEXTRA uint8 = 11
fnTEXT_FE uint8 = 12
fnEXPAND uint8 = 22
fnMARKER uint8 = 23
fnSPACE uint8 = 24
)
type MtTabStop struct {
next *MtTabStop
_type int16
offset int16
}
type MtRuler struct {
nStops int16
tabStopList *MtTabStop
}
type MtLine struct {
nudgeX int16
nudgeY int16
lineSpace uint8
null bool
ruler *MtRuler
objectList *MtObjList
}
type MtEmbell struct {
next *MtEmbell
nudgeX int16
nudgeY int16
embell uint8
}
type MtChar struct {
nudgeX int16
nudgeY int16
options uint8
typeface uint8
//16-bit integer MTCode value
mtcode uint16
//8-bit font position
bits8 uint8
//16-bit integer font position
bits16 uint16
embellishments *MtEmbell
}
type MtEqnPrefs struct {
sizes []string
spaces []string
styles []byte
}
type MtSize struct {
lsize uint8
dsize uint8
}
type MtfontStyleDef struct {
fontDefIndex uint8
name string
}
type MtfontDef struct {
encDefIndex uint8
name string
}
type MtColorDefIndex struct {
index uint8
}
type MtColorDef struct {
values []uint8
name string
}
type MtObjList struct {
next *MtObjList
tag RecordType
objPtr []MtObject
}
type MtTmpl struct {
nudgeX int16
nudgeY int16
selector uint8
variation uint16
options uint8
objectList *MtObjList
}
type MtPile struct {
nudgeX int16
nudgeY int16
halign uint8
valign uint8
//ruler可以不读不影响后面字节错位因为这个是一个完整的额外record数据
ruler *MtRuler
//objectList可以不读不影响后面字节错位因为这个是一个完整的额外record数据
objectList *MtObjList
}
type MtMatrix struct {
nudgeX int16
nudgeY int16
valign uint8
h_just uint8
v_just uint8
rows uint8
cols uint8
//row_parts uint8
//col_parts uint8
//objectList可以不读不影响后面字节错位因为这个是一个完整的额外record数据
objectList *MtObjList
}
type MtEmbellRd struct {
options uint8
nudgeX int16
nudgeY int16
embellType uint8
}
type MtAST struct {
tag RecordType
value MtObject
children []*MtAST
}
type MtObject interface{}
func (ast *MtAST) debug(indent int) {
fmt.Printf("> %#v MtAST %#v\n", indent, ast)
indent += 1
for _, ele := range ast.children {
ele.debug(indent)
}
}
type SelectorType uint8
//Template selectors and variations:
const (
//Fences (parentheses, etc.):
//selector symbol description class
tmANGLE SelectorType = 0 // angle brackets ParBoxClass
tmPAREN SelectorType = 1 // parentheses ParBoxClass
tmBRACE SelectorType = 2 // braces (curly brackets) ParBoxClass
tmBRACK SelectorType = 3 // square brackets ParBoxClass
tmBAR SelectorType = 4 // vertical bars ParBoxClass
tmDBAR SelectorType = 5 // double vertical bars ParBoxClass
tmFLOOR SelectorType = 6 // floor brackets ParBoxClass
tmCEILING SelectorType = 7 // ceiling brackets ParBoxClass
tmOBRACK SelectorType = 8 // open (white) brackets ParBoxClass
//variations variation bits symbol description
//0×0001 tvFENCE_L left fence is present
//0×0002 tvFENCE_R right fence is present
//Intervals:
//selector symbol description class
tmINTERVAL SelectorType = 9 // unmatched brackets and parentheses ParBoxClass
//variations variation bits symbol description
//0×0000 tvINTV_LEFT_LP left fence is left parenthesis
//0×0001 tvINTV_LEFT_RP left fence is right parenthesis
//0×0002 tvINTV_LEFT_LB left fence is left bracket
//0×0003 tvINTV_LEFT_RB left fence is right bracket
//0×0000 tvINTV_RIGHT_LP right fence is left parenthesis
//0×0010 tvINTV_RIGHT_RP right fence is right parenthesis
//0×0020 tvINTV_RIGHT_LB right fence is left bracket
//0×0030 tvINTV_RIGHT_RB right fence is right bracket
//Radicals (square and nth roots):
//selector symbol description class
tmROOT SelectorType = 10 // radical RootBoxClass
//variations variation symbol description
//0 tvROOT_SQ square root
//1 tvROOT_NTH nth root
//Fractions:
//selector symbol description class
tmFRACT SelectorType = 11 // fractions
//variations variation bits symbol description
//0×0001 tvFR_SMALL subscript-size slots (piece fraction)
//0×0002 tvFR_SLASH fraction bar is a slash
//0×0004 tvFR_BASE num. and denom. are baseline aligned
//Over and Underbars:
//selector symbol description class
tmUBAR SelectorType = 12 // underbar BarBoxClass
tmOBAR SelectorType = 13 // overbar BarBoxClass
//variations variation bits symbol description
//0×0001 tvBAR_DOUBLE bar is doubled, else single
//Arrows:
//selector symbol description class
tmARROW SelectorType = 14 // arrow ArroBoxClass
//variations variation symbol description
//0×0000 tvAR_SINGLE single arrow
//0×0001 tvAR_DOUBLE double arrow
//0×0002 tvAR_HARPOON harpoon
//0×0004 tvAR_TOP top slot is present
//0×0008 tvAR_BOTTOM bottom slot is present
//0×0010 tvAR_LEFT if single, arrow points left
//0×0020 tvAR_RIGHT if single, arrow points right
//0×0010 tvAR_LOS if double or harpoon, large over small
//0×0020 tvAR_SOL if double or harpoon, small over large
//Integrals (see Limit Variations):
//selector symbol description class
tmINTEG SelectorType = 15 // integral BigOpBoxClass
//variations variation symbol description
//0×0001 tvINT_1 single integral sign
//0×0002 tvINT_2 double integral sign
//0×0003 tvINT_3 triple integral sign
//0×0004 tvINT_LOOP has loop w/o arrows
//0×0008 tvINT_CW_LOOP has clockwise loop
//0×000C tvINT_CCW_LOOP has counter-clockwise loop
//0×0100 tvINT_EXPAND integral signs expand
//Sums, products, coproducts, unions, intersections, etc. (see Limit Variations):
//selector symbol description class
tmSUM SelectorType = 16 // sum BigOpBoxClass
tmPROD SelectorType = 17 // product BigOpBoxClass
tmCOPROD SelectorType = 18 // coproduct BigOpBoxClass
tmUNION SelectorType = 19 // union BigOpBoxClass
tmINTER SelectorType = 20 // intersection BigOpBoxClass
tmINTOP SelectorType = 21 // integral-style big operator BigOpBoxClass
tmSUMOP SelectorType = 22 // summation-style big operator BigOpBoxClass
//Limits (see Limit Variations):
//selector symbol description class
tmLIM SelectorType = 23 // limits LimBoxClass
//variations variation symbol description
//0 tvSUBAR single underbar
//1 tvDUBAR double underbar
//Horizontal braces and brackets:
//selector symbol description class
tmHBRACE SelectorType = 24 // horizontal brace HFenceBoxClass
tmHBRACK SelectorType = 25 // horizontal bracket HFenceBoxClass
//variations variation symbol description
//0×0001 tvHB_TOP slot is on the top, else on the bottom
//Long division:
//selector symbol description class
tmLDIV SelectorType = 26 // long division LDivBoxClass
//variations variation symbol description
//0×0001 tvLD_UPPER upper slot is present
//Subscripts and superscripts:
//selector symbol description class
tmSUB SelectorType = 27 // subscript ScrBoxClass
tmSUP SelectorType = 28 // superscript ScrBoxClass
tmSUBSUP SelectorType = 29 // subscript and superscript ScrBoxClass
//variations variation symbol description
//0×0001 tvSU_PRECEDES script precedes scripted item,
//else follows
//Dirac bra-ket notation:
//selector symbol description class
tmDIRAC SelectorType = 30 // bra-ket notation DiracBoxClass
//variations variation symbol description
//0×0001 tvDI_LEFT left part is present
//0×0002 tvDI_RIGHT right part is present
//Vectors:
//selector symbol description class
tmVEC SelectorType = 31 // vector HatBoxClass
//variations variation symbol description
//0×0001 tvVE_LEFT arrow points left
//0×0002 tvVE_RIGHT arrow points right
//0×0004 tvVE_UNDER arrow under slot, else over slot
//0×0008 tvVE_HARPOON harpoon
//Hats, arcs, tilde, joint status:
//selector symbol description class
tmTILDE SelectorType = 32 // tilde over characters HatBoxClass
tmHAT SelectorType = 33 // hat over characters HatBoxClass
tmARC SelectorType = 34 // arc over characters HatBoxClass
tmJSTATUS SelectorType = 35 // joint status construct HatBoxClass
//Overstrikes (cross-outs):
//selector symbol description class
tmSTRIKE SelectorType = 36 // overstrike (cross-out) StrikeBoxClass
//variations variation symbol description
//0×0001 tvST_HORIZ line is horizontal, else slashes
//0×0002 tvST_UP if slashes, slash from lower-left to upper-right is present
//0×0004 tvST_DOWN if slashes, slash from upper-left to lower-right is present
//Boxes:
//selector symbol description class
tmBOX SelectorType = 37 // box TBoxBoxClass
//variations variation symbol description
//0×0001 tvBX_ROUND corners are round, else square
//0×0002 tvBX_LEFT left side is present
//0×0004 tvBX_RIGHT right side is present
//0×0008 tvBX_TOP top side is present
//0×0010 tvBX_BOTTOM bottom side is present
)
type EmbellType uint8
const (
emb1DOT EmbellType = 2
emb2DOT EmbellType = 3
emb3DOT EmbellType = 4
emb1PRIME EmbellType = 5
emb2PRIME EmbellType = 6
embBPRIME EmbellType = 7
embTILDE EmbellType = 8
embHAT EmbellType = 9
embNOT EmbellType = 10
embRARROW EmbellType = 11
embLARROW EmbellType = 12
embBARROW EmbellType = 13
embR1ARROW EmbellType = 14
embL1ARROW EmbellType = 15
embMBAR EmbellType = 16
embOBAR EmbellType = 17
emb3PRIME EmbellType = 18
embFROWN EmbellType = 19
embSMILE EmbellType = 20
embX_BARS EmbellType = 21
embUP_BAR EmbellType = 22
embDOWN_BAR EmbellType = 23
emb4DOT EmbellType = 24
embU_1DOT EmbellType = 25
embU_2DOT EmbellType = 26
embU_3DOT EmbellType = 27
embU_4DOT EmbellType = 28
embU_BAR EmbellType = 29
embU_TILDE EmbellType = 30
embU_FROWN EmbellType = 31
embU_SMILE EmbellType = 32
embU_RARROW EmbellType = 33
embU_LARROW EmbellType = 34
embU_BARROW EmbellType = 35
embU_R1ARROW EmbellType = 36
embU_L1ARROW EmbellType = 37
)