package font
type Variant string
const (
Normal Variant = "normal"
Bold Variant = "bold"
Italic Variant = "italic"
BoldItalic Variant = "bold-italic"
DoubleStruck Variant = "double-struck"
Fraktur Variant = "fraktur"
BoldFraktur Variant = "bold-fraktur"
Script Variant = "script"
BoldScript Variant = "bold-script"
SansSerif Variant = "sans-serif"
BoldSansSerif Variant = "bold-sans-serif"
SansSerifItalic Variant = "sans-serif-italic"
SansSerifBoldItalic Variant = "sans-serif-bold-italic"
Monospace Variant = "monospace"
SmallOp Variant = "-smallop"
LargeOp Variant = "-largeop"
Size3 Variant = "-size3"
Size4 Variant = "-size4"
TeXCalligraphic Variant = "-tex-calligraphic"
TeXBoldCalligraphic Variant = "-tex-bold-calligraphic"
TeXMathItalic Variant = "-tex-mathit"
TeXOldStyle Variant = "-tex-oldstyle"
TeXBoldOldStyle Variant = "-tex-bold-oldstyle"
TeXVariant Variant = "-tex-variant"
)
var variants = [...]Variant {
Normal , Bold , Italic , BoldItalic , DoubleStruck , Fraktur , BoldFraktur ,
Script , BoldScript , SansSerif , BoldSansSerif , SansSerifItalic ,
SansSerifBoldItalic , Monospace , SmallOp , LargeOp , Size3 , Size4 ,
TeXCalligraphic , TeXBoldCalligraphic , TeXMathItalic , TeXOldStyle ,
TeXBoldOldStyle , TeXVariant ,
}
func Variants () []Variant { return append ([]Variant (nil ), variants [:]...) }
func ValidVariant (variant Variant ) bool {
_ , ok := glyphTables [variant ]
return ok
}
type Metrics struct {
Height float64
Depth float64
Width float64
ItalicCorrection float64
Skew float64
HasItalicCorrection bool
HasSkew bool
}
type Glyph struct {
Codepoint rune
Variant Variant
Metrics Metrics
Path string
Content string
}
type glyphData struct {
Metrics Metrics
Path string
Content string
}
type variantRule struct {
inherit Variant
link Variant
}
var variantRules = map [Variant ]variantRule {
Normal : {},
Bold : {inherit : Normal },
Italic : {inherit : Normal },
BoldItalic : {inherit : Italic , link : Bold },
DoubleStruck : {inherit : Bold },
Fraktur : {inherit : Normal },
BoldFraktur : {inherit : Bold , link : Fraktur },
Script : {inherit : Italic },
BoldScript : {inherit : BoldItalic , link : Script },
SansSerif : {inherit : Normal },
BoldSansSerif : {inherit : Bold , link : SansSerif },
SansSerifItalic : {inherit : Italic , link : SansSerif },
SansSerifBoldItalic : {inherit : BoldItalic , link : BoldSansSerif },
Monospace : {inherit : Normal },
SmallOp : {inherit : Normal },
LargeOp : {inherit : Normal },
Size3 : {inherit : Normal },
Size4 : {inherit : Normal },
TeXCalligraphic : {inherit : Italic },
TeXBoldCalligraphic : {inherit : BoldItalic },
TeXMathItalic : {inherit : Italic },
TeXOldStyle : {inherit : Normal },
TeXBoldOldStyle : {inherit : Bold },
TeXVariant : {inherit : Normal },
}
func LookupExact (variant Variant , codepoint rune ) (Glyph , bool ) {
table , ok := glyphTables [variant ]
if !ok {
return Glyph {}, false
}
data , ok := table [codepoint ]
if !ok {
return Glyph {}, false
}
return Glyph {Codepoint : codepoint , Variant : variant , Metrics : data .Metrics , Path : data .Path , Content : data .Content }, true
}
func lookupOwn(variant Variant , codepoint rune ) (Glyph , bool ) {
if glyph , ok := LookupExact (variant , codepoint ); ok {
return glyph , true
}
if smp , ok := smpCodepoint (variant , codepoint ); ok {
return Glyph {Codepoint : smp , Variant : variant }, true
}
return Glyph {}, false
}
func lookupEffective(variant Variant , codepoint rune ) (Glyph , bool ) {
if glyph , ok := lookupOwn (variant , codepoint ); ok {
return glyph , true
}
rule , ok := variantRules [variant ]
if !ok {
return Glyph {}, false
}
if rule .link != "" {
if glyph , ok := lookupOwn (rule .link , codepoint ); ok {
return glyph , true
}
}
if rule .inherit != "" {
return lookupEffective (rule .inherit , codepoint )
}
return Glyph {}, false
}
func RemapCodepoint (variant Variant , codepoint rune ) rune {
glyph , ok := lookupEffective (variant , codepoint )
if ok && glyph .Codepoint != codepoint && glyph .Path == "" && glyph .Content == "" && glyph .Metrics == (Metrics {}) {
return glyph .Codepoint
}
return codepoint
}
func Lookup (variant Variant , codepoint rune ) (Glyph , bool ) {
if !ValidVariant (variant ) {
return Glyph {}, false
}
glyph , ok := lookupEffective (variant , codepoint )
if !ok {
return Glyph {}, false
}
if glyph .Codepoint != codepoint && glyph .Path == "" && glyph .Content == "" && glyph .Metrics == (Metrics {}) {
return lookupEffective (variant , glyph .Codepoint )
}
return glyph , true
}
func LookupMetrics (variant Variant , codepoint rune ) (Metrics , bool ) {
glyph , ok := Lookup (variant , codepoint )
return glyph .Metrics , ok
}
func LookupPath (variant Variant , codepoint rune ) (path , content string , ok bool ) {
glyph , ok := Lookup (variant , codepoint )
if !ok {
return "" , "" , false
}
return glyph .Path , glyph .Content , true
}
func ExactGlyphCount (variant Variant ) int { return len (glyphTables [variant ]) }
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 .