summaryrefslogtreecommitdiff
path: root/app/Http/RequestHandlers/ExportGedcomClient.php
diff options
context:
space:
mode:
authorGreg Roach <greg@subaqua.co.uk>2022-02-15 09:59:01 +0000
committerGreg Roach <greg@subaqua.co.uk>2022-02-18 08:43:18 +0000
commit1c6adce825f16611bd8b75a22114302de4b41cfe (patch)
tree637405c351f9c4f686d5b88bc3c9b3b3092d0be1 /app/Http/RequestHandlers/ExportGedcomClient.php
parent6f6acc7a1debce8fb3392dc3c800623417f681b4 (diff)
downloadwebtrees-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.php57
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, '"') . '"');
}
}