data.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // License: GPLv3 Copyright: 2023, Kovid Goyal, <kovid at kovidgoyal.net>
  2. package shell_integration
  3. import (
  4. "archive/tar"
  5. _ "embed"
  6. "errors"
  7. "fmt"
  8. "io"
  9. "kitty/tools/utils"
  10. "regexp"
  11. "strings"
  12. "sync"
  13. )
  14. var _ = fmt.Print
  15. //go:embed data_generated.bin
  16. var embedded_data string
  17. type Entry struct {
  18. Metadata *tar.Header
  19. Data []byte
  20. }
  21. type Container map[string]Entry
  22. var Data = sync.OnceValue(func() Container {
  23. tr := tar.NewReader(utils.ReaderForCompressedEmbeddedData(embedded_data))
  24. ans := make(Container, 64)
  25. for {
  26. hdr, err := tr.Next()
  27. if errors.Is(err, io.EOF) {
  28. break
  29. }
  30. if err != nil {
  31. panic(err)
  32. }
  33. data, err := utils.ReadAll(tr, int(hdr.Size))
  34. if err != nil {
  35. panic(err)
  36. }
  37. ans[hdr.Name] = Entry{hdr, data}
  38. }
  39. return ans
  40. })
  41. func (self Container) FilesMatching(prefix string, exclude_patterns ...string) []string {
  42. ans := make([]string, 0, len(self))
  43. patterns := make([]*regexp.Regexp, len(exclude_patterns))
  44. for i, exp := range exclude_patterns {
  45. patterns[i] = regexp.MustCompile(exp)
  46. }
  47. for name := range self {
  48. if strings.HasPrefix(name, prefix) {
  49. excluded := false
  50. for _, pat := range patterns {
  51. if matched := pat.FindString(name); matched != "" {
  52. excluded = true
  53. break
  54. }
  55. }
  56. if !excluded {
  57. ans = append(ans, name)
  58. }
  59. }
  60. }
  61. return ans
  62. }