package tex
import "github.com/d2lang/mathjax-go/internal/mml"
type environmentFrame struct {
name string
parent *environmentFrame
stream, closed bool
ordinaryArray bool
casesBegin *casesBeginItem
}
type environmentEndItem struct {
name string
spread bool
}
func (item *environmentEndItem ) extra () error {
return texError ("MissingBeginExtraEnd" , "Missing \\begin{%s} or extra \\end{%s}" , item .name , item .name )
}
func (frame *environmentFrame ) missing () error {
return texError ("EnvMissingEnd" , "Missing \\end{%s}" , frame .name )
}
func (p *parser ) endEnvironment (name string ) ([]*mml .Node , error ) {
environment , err := p .readEnvironmentName (name )
if err != nil {
return nil , err
}
registered , item := p .sourceEndDefinition (environment )
if !item {
if err := p .countEnvironment (); err != nil {
return nil , err
}
}
if !registered {
return nil , texError ("UnknownEnv" , "Unknown environment '%s'" , environment )
}
if p .environmentOwner == nil && environment == "spreadlines" && !p .liveMatrix {
return nil , texError ("ExtraEnd" , "Extra \\end{%s}" , environment )
}
p .commandEnvironmentEnd = &environmentEndItem {name : environment , spread : environment == "spreadlines" }
return nil , nil
}
func (p *parser ) closeEnvironment (frame *environmentFrame , item *environmentEndItem ) error {
if frame == nil {
return item .extra ()
}
if item .name != frame .name {
return texError ("EnvBadEnd" , "\\begin{%s} ended with \\end{%s}" , frame .name , item .name )
}
if cases := frame .casesBegin ; cases != nil {
cases .entries --
if cases .end {
cases .end = false
cases .closing = item
}
frame .closed = cases .entries == 0
} else {
frame .closed = true
}
p .pendingEnvironmentEnd = nil
return nil
}
func (p *parser ) parseEnvironmentContinuation (frame *environmentFrame ) (*mml .Node , error ) {
previous , ordinary := p .environmentRow , p .ordinaryArray
arrayCell , matrixClose , cdArrayEntry , braket := p .arrayCell , p .matrixClose , p .cdArrayEntry , p .braketOwner
p .environmentRow , p .ordinaryArray = frame , nil
p .arrayCell , p .matrixClose , p .cdArrayEntry , p .braketOwner = nil , false , false , nil
defer func () {
p .environmentRow , p .ordinaryArray = previous , ordinary
p .arrayCell , p .matrixClose , p .cdArrayEntry , p .braketOwner = arrayCell , matrixClose , cdArrayEntry , braket
}()
children , _ , err := p .parseRowContinuation (0 , false , false , nil , "" , nil )
if err != nil {
return nil , err
}
if !frame .closed {
return nil , frame .missing ()
}
return row (children , true ), nil
}
The pages are generated with Golds v0.8.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .