diff options
| author | Greg Roach <greg@subaqua.co.uk> | 2022-02-15 09:59:01 +0000 |
|---|---|---|
| committer | Greg Roach <greg@subaqua.co.uk> | 2022-02-18 08:43:18 +0000 |
| commit | 1c6adce825f16611bd8b75a22114302de4b41cfe (patch) | |
| tree | 637405c351f9c4f686d5b88bc3c9b3b3092d0be1 /app/Http/RequestHandlers/ExportGedcomClient.php | |
| parent | 6f6acc7a1debce8fb3392dc3c800623417f681b4 (diff) | |
| download | webtrees-1c6adce825f16611bd8b75a22114302de4b41cfe.tar.gz webtrees-1c6adce825f16611bd8b75a22114302de4b41cfe.tar.bz2 webtrees-1c6adce825f16611bd8b75a22114302de4b41cfe.zip | |
Fix: #1663 - add support for ANSEL encoding
Diffstat (limited to 'app/Http/RequestHandlers/ExportGedcomClient.php')
| -rw-r--r-- | app/Http/RequestHandlers/ExportGedcomClient.php | 57 |
1 files changed, 28 insertions, 29 deletions
diff --git a/app/Http/RequestHandlers/ExportGedcomClient.php b/app/Http/RequestHandlers/ExportGedcomClient.php index 874eea305f..9d42cbcd37 100644 --- a/app/Http/RequestHandlers/ExportGedcomClient.php +++ b/app/Http/RequestHandlers/ExportGedcomClient.php @@ -20,11 +20,17 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; +use Fisharebest\Webtrees\Encodings\ANSEL; +use Fisharebest\Webtrees\Encodings\ASCII; +use Fisharebest\Webtrees\Encodings\UTF16BE; +use Fisharebest\Webtrees\Encodings\UTF8; +use Fisharebest\Webtrees\Encodings\Windows1252; use Fisharebest\Webtrees\GedcomRecord; use Fisharebest\Webtrees\Http\ViewResponseTrait; use Fisharebest\Webtrees\Registry; use Fisharebest\Webtrees\Services\GedcomExportService; use Fisharebest\Webtrees\Tree; +use Fisharebest\Webtrees\Validator; use Illuminate\Database\Capsule\Manager as DB; use League\Flysystem\Filesystem; use League\Flysystem\FilesystemException; @@ -88,13 +94,11 @@ class ExportGedcomClient implements RequestHandlerInterface $data_filesystem = Registry::filesystem()->data(); - $params = (array) $request->getParsedBody(); - - $convert = (bool) ($params['convert'] ?? false); - $zip = (bool) ($params['zip'] ?? false); - $media = (bool) ($params['media'] ?? false); - $media_path = $params['media-path'] ?? ''; - $privatize_export = $params['privatize_export']; + $format = Validator::parsedBody($request)->isInArray(['gedcom', 'zip'])->requiredString('format'); + $privacy = Validator::parsedBody($request)->isInArray(['none', 'gedadmin', 'user', 'visitor'])->requiredString('privacy'); + $encoding = Validator::parsedBody($request)->isInArray([UTF8::NAME, UTF16BE::NAME, ANSEL::NAME, ASCII::NAME, Windows1252::NAME])->requiredString('encoding'); + $line_endings = Validator::parsedBody($request)->isInArray(['CRLF', 'LF'])->requiredString('line_endings'); + $media_path = Validator::parsedBody($request)->string('media_path') ?? ''; $access_levels = [ 'gedadmin' => Auth::PRIV_NONE, @@ -103,8 +107,7 @@ class ExportGedcomClient implements RequestHandlerInterface 'none' => Auth::PRIV_HIDE, ]; - $access_level = $access_levels[$privatize_export]; - $encoding = $convert ? 'ANSI' : 'UTF-8'; + $access_level = $access_levels[$privacy]; // What to call the downloaded file $download_filename = $tree->name(); @@ -114,8 +117,8 @@ class ExportGedcomClient implements RequestHandlerInterface $download_filename .= '.ged'; } - if ($zip || $media) { - $resource = $this->gedcom_export_service->export($tree, true, $encoding, $access_level, $media_path); + if ($format === 'zip') { + $resource = $this->gedcom_export_service->export($tree, true, $encoding, $access_level, $media_path, $line_endings); $path = $tree->getPreference('MEDIA_DIRECTORY'); @@ -127,22 +130,20 @@ class ExportGedcomClient implements RequestHandlerInterface $zip_filesystem->writeStream($download_filename, $resource); fclose($resource); - if ($media) { - $media_filesystem = $tree->mediaFilesystem($data_filesystem); + $media_filesystem = $tree->mediaFilesystem($data_filesystem); - $records = DB::table('media') - ->where('m_file', '=', $tree->id()) - ->get() - ->map(Registry::mediaFactory()->mapper($tree)) - ->filter(GedcomRecord::accessFilter()); + $records = DB::table('media') + ->where('m_file', '=', $tree->id()) + ->get() + ->map(Registry::mediaFactory()->mapper($tree)) + ->filter(GedcomRecord::accessFilter()); - foreach ($records as $record) { - foreach ($record->mediaFiles() as $media_file) { - $from = $media_file->filename(); - $to = $path . $media_file->filename(); - if (!$media_file->isExternal() && $media_filesystem->fileExists($from) && !$zip_filesystem->fileExists($to)) { - $zip_filesystem->writeStream($to, $media_filesystem->readStream($from)); - } + foreach ($records as $record) { + foreach ($record->mediaFiles() as $media_file) { + $from = $media_file->filename(); + $to = $path . $media_file->filename(); + if (!$media_file->isExternal() && $media_filesystem->fileExists($from) && !$zip_filesystem->fileExists($to)) { + $zip_filesystem->writeStream($to, $media_filesystem->readStream($from)); } } } @@ -157,13 +158,11 @@ class ExportGedcomClient implements RequestHandlerInterface } $resource = $this->gedcom_export_service->export($tree, true, $encoding, $access_level, $media_path); - - $charset = $convert ? 'ISO-8859-1' : 'UTF-8'; - $stream = $this->stream_factory->createStreamFromResource($resource); + $stream = $this->stream_factory->createStreamFromResource($resource); return $this->response_factory->createResponse() ->withBody($stream) - ->withHeader('Content-Type', 'text/x-gedcom; charset=' . $charset) + ->withHeader('Content-Type', 'text/x-gedcom; charset=' . UTF8::NAME) ->withHeader('Content-Disposition', 'attachment; filename="' . addcslashes($download_filename, '"') . '"'); } } |
