dev/import-beats/images.go (124 lines of code) (raw):

// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. package main import ( "fmt" "image" _ "image/jpeg" _ "image/png" "io/ioutil" "log" "os" "path" "regexp" "strings" "github.com/pkg/errors" "github.com/elastic/package-registry/packages" ) var ( imageRe = regexp.MustCompile(`image::[^\[]+`) imageTitleReplacer = strings.NewReplacer("_", " ", "-", " ", "/", "") ) type imageContent struct { source string } type imageContentArray []imageContent func createImages(beatDocsPath, modulePath string) (imageContentArray, error) { var images []imageContent moduleDocsPath := path.Join(modulePath, "_meta", "docs.asciidoc") moduleDocsFile, err := ioutil.ReadFile(moduleDocsPath) if err != nil && !os.IsNotExist(err) { return nil, errors.Wrapf(err, "reading module docs file failed (path: %s)", moduleDocsPath) } else if os.IsNotExist(err) { log.Printf("\tNo docs found (path: %s), skipped", moduleDocsPath) } else { log.Printf("\tDocs found (path: %s)", moduleDocsPath) images = append(images, extractImages(beatDocsPath, moduleDocsFile)...) } dataStreamDirs, err := ioutil.ReadDir(modulePath) if err != nil { return nil, errors.Wrapf(err, "cannot read module directory %s", modulePath) } for _, dataStreamDir := range dataStreamDirs { if !dataStreamDir.IsDir() { continue } dataStreamName := dataStreamDir.Name() if dataStreamName == "_meta" { continue } log.Printf("\t%s: data stream found", dataStreamName) dataStreamDocsPath := path.Join(modulePath, dataStreamName, "_meta", "docs.asciidoc") dataStreamDocsFile, err := ioutil.ReadFile(dataStreamDocsPath) if err != nil && !os.IsNotExist(err) { return nil, errors.Wrapf(err, "reading data stream docs file failed (path: %s)", dataStreamDocsPath) } else if os.IsNotExist(err) { log.Printf("\t%s: no docs found (path: %s), skipped", dataStreamName, dataStreamDocsPath) continue } log.Printf("\t%s: docs found (path: %s)", dataStreamName, dataStreamDocsPath) images = append(images, extractImages(beatDocsPath, dataStreamDocsFile)...) } return images, nil } func extractImages(beatDocsPath string, docsFile []byte) []imageContent { matches := imageRe.FindAll(docsFile, -1) var contents []imageContent for _, match := range matches { contents = append(contents, imageContent{ source: path.Join(beatDocsPath, string(match[7:])), // skip: image:: }) } return contents } func (images imageContentArray) toManifestImages() ([]packages.Image, error) { var imgs []packages.Image for _, image := range images { i := strings.LastIndex(image.source, "/") sourceFileName := image.source[i:] imageSize, err := readImageSize(image.source) if err != nil { return nil, errors.Wrapf(err, "reading image size failed") } imageType, err := extractImageType(image.source) if err != nil { return nil, errors.Wrapf(err, "extracting image type failed") } imgs = append(imgs, packages.Image{ Src: path.Join("/img", sourceFileName), Title: toImageTitle(sourceFileName), Size: imageSize, Type: imageType, }) } return imgs, nil } func toImageTitle(fileName string) string { i := strings.LastIndex(fileName, ".") return imageTitleReplacer.Replace(fileName[:i]) } func readImageSize(imagePath string) (string, error) { f, err := os.Open(imagePath) if err != nil { return "", errors.Wrapf(err, "opening image failed (path: %s)", imagePath) } defer f.Close() var img image.Config if strings.HasSuffix(imagePath, ".svg") { img, err = SvgDecodeConfig(f) } else { img, _, err = image.DecodeConfig(f) } if err != nil { return "", errors.Wrapf(err, "opening image failed (path: %s)", imagePath) } return fmt.Sprintf("%dx%d", img.Width, img.Height), nil } func extractImageType(imagePath string) (string, error) { if strings.HasSuffix(imagePath, ".png") { return "image/png", nil } else if strings.HasSuffix(imagePath, ".jpg") { return "image/jpg", nil } else if strings.HasSuffix(imagePath, ".svg") { return "image/svg+xml", nil } return "", fmt.Errorf("unknown image type (path: %s)", imagePath) }