ref: 7e48ef89b6b053c7566d90312ae7f758a5fba147
parent: 905263542c6f19b3d66f94e323995af7880c9355
author: Philip Silva <philip.silva@protonmail.com>
date: Sat Apr 3 06:00:39 EDT 2021
Font handling, remove placeholders, style attribute parsing - check which font sizes are actually available (unix)
--- a/browser/browser.go
+++ b/browser/browser.go
@@ -820,8 +820,6 @@
}
return &Box{- Padding: duit.SpaceXY(6, 4),
- Margin: duit.SpaceXY(6, 4),
Kids: duit.NewKids(finalUis...),
}
} else {--- a/style/fonts_plan9.go
+++ b/style/fonts_plan9.go
@@ -9,15 +9,6 @@
func initFontserver() {}-func matchClosestFontSize(desired float64, available []int) (closest int) {- for _, a := range available {- if closest == 0 || math.Abs(float64(a)-desired) < math.Abs(float64(closest)-desired) {- closest = a
- }
- }
- return
-}
-
func (cs Map) FontFilename() string { fontSize := matchClosestFontSize(cs.FontSize(), []int{5,6,7,8,9,10,12,14,16,18,20,24,28,32}) return fmt.Sprintf("/lib/font/bit/lucida/unicode.%v.font", fontSize)--- a/style/fonts_unix.go
+++ b/style/fonts_unix.go
@@ -4,11 +4,14 @@
import (
"fmt"
- "math"
"os/exec"
+ "regexp"
+ "strconv"
"strings"
)
+var availableFontSizes = make(map[string][]int)
+
func initFontserver() { buf, err := exec.Command("fontsrv", "-p", ".").Output() if err == nil {@@ -18,9 +21,40 @@
}
}
+func fontSizes(fontName string) (fss []int, err error) {+ re := regexp.MustCompile(`^(\d+)$`)
+ fss = make([]int, 0, 20)
+
+ buf, err := exec.Command("fontsrv", "-p", fontName).Output()+ if err != nil {+ return
+ }
+ for _, s := range strings.Split(string(buf), "\n") {+ s = strings.TrimSpace(s)
+ s = strings.TrimSuffix(s, "/")
+ if !re.MatchString(s) {+ continue
+ }
+ fs, err := strconv.Atoi(s)
+ if err != nil {+ log.Errorf("%v: %v", fs, err)+ }
+ fss = append(fss, fs)
+ }
+
+ return
+}
+
func (cs Map) FontFilename() string {- pref := cs.preferedFontName([]string{"HelveticaNeue", "Helvetica"})- fontSize := 2 * /*dui.Scale(*/int(math.RoundToEven(cs.FontSize()))/*)*/
+ f := cs.preferedFontName([]string{"HelveticaNeue", "Helvetica"})+ if _, ok := availableFontSizes[f]; !ok {+ fss, err := fontSizes(f)
+ if err != nil {+ log.Errorf("font sizes %v: %v", f, err)+ }
+ availableFontSizes[f] = fss
+ }
+ s := matchClosestFontSize(2*cs.FontSize(), availableFontSizes[f])
- return fmt.Sprintf("/mnt/font/"+pref+"%va/font", fontSize)-}
\ No newline at end of file
+ return fmt.Sprintf("/mnt/font/"+f+"%va/font", s)+}
--- a/style/stylesheets.go
+++ b/style/stylesheets.go
@@ -10,6 +10,7 @@
"golang.org/x/image/colornames"
"golang.org/x/net/html"
"github.com/psilva261/opossum/logger"
+ "math"
"regexp"
"strconv"
"strings"
@@ -210,7 +211,11 @@
for _, a := range n.Attr { if a.Key == "style" {- decls, err := parser.ParseDeclarations(a.Val)
+ v := strings.TrimSpace(a.Val)
+ if !strings.HasSuffix(v, ";") {+ v += ";"
+ }
+ decls, err := parser.ParseDeclarations(v)
if err != nil { log.Printf("could not parse '%v'", a.Val)@@ -302,6 +307,15 @@
}
return avails[0]
+}
+
+func matchClosestFontSize(desired float64, available []int) (closest int) {+ for _, a := range available {+ if closest == 0 || math.Abs(float64(a)-desired) < math.Abs(float64(closest)-desired) {+ closest = a
+ }
+ }
+ return
}
func (cs Map) FontSize() float64 {--- a/style/stylesheets_test.go
+++ b/style/stylesheets_test.go
@@ -10,8 +10,8 @@
)
func init() {- quiet := true
- logger.Quiet = &quiet
+ f := false
+ logger.Quiet = &f
logger.Init()
log = &logger.Logger{Debug: true}}
@@ -183,6 +183,42 @@
t.Fail()
}
t.Logf("m=%+v", m)+}
+
+func TestNewMapStyle(t *testing.T) {+ htms := []string{+ `<h2 style="color: green;">a header</h2>`,
+ `<h2 style="color: green">a header</h2>`,
+ }
+ for _, htm := range htms {+ doc, err := html.Parse(strings.NewReader(htm))
+ if err != nil {+ t.Fail()
+ }
+
+ h2 := grep(doc, "h2")
+ m := NewMap(h2)
+
+ if m.Declarations["color"].Value != "green" {+ t.Errorf("%+v", m)+ }
+ }
+}
+
+func grep(nn *html.Node, tag string) *html.Node {+ var f func(n *html.Node) *html.Node
+ f = func(n *html.Node) *html.Node {+ if n.Data == tag {+ return n
+ }
+ for c := n.FirstChild; c != nil; c = c.NextSibling {+ if m := f(c); m != nil {+ return m
+ }
+ }
+ return nil
+ }
+ return f(nn)
}
func TestSmaller(t *testing.T) {--
⑨