// ImageWidth takes a file path (or sprite glob) and returns the // width in pixels of the image being referenced. func ImageWidth(ctx *libsass.Context, usv libsass.UnionSassValue) libsass.UnionSassValue { var ( glob, name string ) err := libsass.Unmarshal(usv, &name) // Check for sprite-file override first if err != nil { var inf interface{} var infs []interface{} // Can't unmarshal to []interface{}, so unmarshal to // interface{} then reflect it into a []interface{} err = libsass.Unmarshal(usv, &inf) k := reflect.ValueOf(&infs).Elem() k.Set(reflect.ValueOf(inf)) if err != nil { return libsass.Error(err) } glob = infs[0].(string) name = infs[1].(string) } imgs := sw.ImageList{ ImageDir: ctx.ImageDir, BuildDir: ctx.BuildDir, GenImgDir: ctx.GenImgDir, } if glob == "" { if hit, ok := ctx.Imgs.M[name]; ok { imgs = hit } else { imgs.Decode(name) imgs.Combine() ctx.Imgs.Lock() ctx.Imgs.M[name] = imgs ctx.Imgs.Unlock() } } else { ctx.Sprites.RLock() imgs = ctx.Sprites.M[glob] ctx.Sprites.RUnlock() } v := imgs.SImageWidth(name) vv := libsass.SassNumber{ Value: float64(v), Unit: "px", } res, err := libsass.Marshal(vv) if err != nil { fmt.Println(err) } return res }