From 6a7fc32d1b1ac6fe02c69139c8d75fbcc6638d96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9=20=D0=91=D0=B0?= =?UTF-8?q?=D0=B4=D1=8F=D0=B5=D0=B2?= Date: Thu, 13 Apr 2023 19:34:27 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D1=8C=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B0?= =?UTF-8?q?=20drawio=20=D0=B2=D0=BD=D1=83=D1=82=D1=80=D0=B8=20xvfb-run?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 3 ++- cmd/drawio-export/options.go | 3 +++ pkg/drawio/export.go | 7 +++++-- pkg/drawio/export_test.go | 10 ---------- pkg/drawio/options.go | 26 +++++++++++++++++++++++++- 5 files changed, 35 insertions(+), 14 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 769b075..c4e7e43 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -33,6 +33,7 @@ "tamerh", "usestdlibvars", "wdir", - "xmlparser" + "xmlparser", + "Xvfb" ] } \ No newline at end of file diff --git a/cmd/drawio-export/options.go b/cmd/drawio-export/options.go index 0d34320..62552c1 100644 --- a/cmd/drawio-export/options.go +++ b/cmd/drawio-export/options.go @@ -19,6 +19,9 @@ func init() { // Application flag.StringVar(&opts.Application, "A", "", "Draw.io Desktop Application") flag.StringVar(&opts.Application, "application", "", "Draw.io Desktop Application") + // EnableXvfb + flag.BoolVar(&opts.EnableXvfb, "X", false, "Run drawio inside xvfb-run") + flag.BoolVar(&opts.EnableXvfb, "enable-xvfb", false, "Run drawio inside xvfb-run") // Output flag.StringVar(&opts.Output, "o", "", "Exported folder name [default: export]") flag.StringVar(&opts.Output, "output", "", "Exported folder name [default: export]") diff --git a/pkg/drawio/export.go b/pkg/drawio/export.go index 51a677b..e25c8c0 100644 --- a/pkg/drawio/export.go +++ b/pkg/drawio/export.go @@ -149,14 +149,17 @@ func (exp Exporter) ExportFile( outName += "-" + name } outName += exp.opts.OutExt() - drawioArgs := make([]string, len(args), len(args)+4) + drawioArgs := make([]string, len(args), len(args)+10) copy(drawioArgs, args) drawioArgs = append(drawioArgs, "--page-index", strconv.Itoa(i), "--output", path.Join(output, outName), "--export", filePath, - "--no-sandbox", ) + if exp.opts.EnableXvfb { + drawioArgs = append(drawioArgs, + "--disable-gpu", "--headless", "--no-sandbox") + } cmd := exec.Command(exp.opts.App(), drawioArgs...) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr diff --git a/pkg/drawio/export_test.go b/pkg/drawio/export_test.go index 9c956fb..8cb4b44 100644 --- a/pkg/drawio/export_test.go +++ b/pkg/drawio/export_test.go @@ -142,7 +142,6 @@ var testData = []exportTest{ "drawio", "--page-index", "0", "--output", "export/diagrams-1.pdf", "--export", "source/diagrams.drawio", - "--no-sandbox", }, }, { @@ -151,7 +150,6 @@ var testData = []exportTest{ "drawio", "--page-index", "1", "--output", "export/diagrams-2.pdf", "--export", "source/diagrams.drawio", - "--no-sandbox", }, }, { @@ -160,7 +158,6 @@ var testData = []exportTest{ "drawio", "--page-index", "2", "--output", "export/diagrams-3.pdf", "--export", "source/diagrams.drawio", - "--no-sandbox", }, }, }, @@ -230,7 +227,6 @@ var testData = []exportTest{ "drawio", "--page-index", "0", "--output", "export/diagrams-1.pdf", "--export", "source/diagrams.drawio", - "--no-sandbox", }, }, { @@ -239,7 +235,6 @@ var testData = []exportTest{ "drawio", "--page-index", "1", "--output", "export/diagrams-2.pdf", "--export", "source/diagrams.drawio", - "--no-sandbox", }, }, { @@ -248,7 +243,6 @@ var testData = []exportTest{ "drawio", "--page-index", "2", "--output", "export/diagrams-3.pdf", "--export", "source/diagrams.drawio", - "--no-sandbox", }, }, }, @@ -272,7 +266,6 @@ var testData = []exportTest{ "drawio", "--page-index", "0", "--output", "export/additional-Один.pdf", "--export", "source/additional.xml", - "--no-sandbox", }, }, { @@ -281,7 +274,6 @@ var testData = []exportTest{ "drawio", "--page-index", "1", "--output", "export/additional-Два.pdf", "--export", "source/additional.xml", - "--no-sandbox", }, }, }, @@ -306,7 +298,6 @@ var testData = []exportTest{ "drawio", "--page-index", "0", "--output", "export/subdir/Вложенные диаграммы-Первая диаграмма.pdf", "--export", "source/subdir/Вложенные диаграммы.drawio", - "--no-sandbox", }, }, { @@ -315,7 +306,6 @@ var testData = []exportTest{ "drawio", "--page-index", "1", "--output", "export/subdir/Вложенные диаграммы-Вторая диаграмма.pdf", "--export", "source/subdir/Вложенные диаграммы.drawio", - "--no-sandbox", }, }, }, diff --git a/pkg/drawio/options.go b/pkg/drawio/options.go index e9e9c58..c9d621e 100644 --- a/pkg/drawio/options.go +++ b/pkg/drawio/options.go @@ -76,6 +76,7 @@ func (f Format) ext() string { // Параметры экспортёра диаграмм type Options struct { Application string // Путь к приложению drawio + EnableXvfb bool // Запускать drawio внутри xvfb-run Output string // Путь к папке с экспортированными файлами Format Format // Формат экспортированных файлов Recursive bool // Рекурсивно сканировать вложенные папки с файлами @@ -104,9 +105,12 @@ type ReadDirFunc func(string) ([]os.DirEntry, error) // Путь к приложению drawio func (opts Options) App() string { + if opts.EnableXvfb { + return "xvfb" + } app := opts.Application if len(app) == 0 { - app = "drawio" + return "drawio" } return app } @@ -132,6 +136,13 @@ func (opts Options) OutExt() string { // Аргументы командной строки drawio func (opts Options) Args() []string { args := []string{} + if opts.EnableXvfb { + app := "drawio" + if len(opts.Application) > 0 { + app = opts.Application + } + args = append(args, "-a", "-l", app) + } if len(opts.Format) > 0 { args = append(args, "--format", string(opts.Format)) } @@ -184,6 +195,19 @@ func (opt optionApplication) apply(opts *Options) { opts.Application = string(opt) } +// Запускать drawio внутри xvfb-run +func WithXvfb() Option { + return optionXvfb{} +} + +type optionXvfb struct{} + +var _ Option = optionXvfb{} + +func (opt optionXvfb) apply(opts *Options) { + opts.EnableXvfb = true +} + // Путь к папке с экспортированными файлами func WithOutput(path string) Option { return optionOutput(path)