diff --git a/README.md b/README.md
index 322437f..fc0c826 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,5 @@
# Validator for the standard csv format for imports to museum-digital
+
+## Dependencies
+
+- [JSZip](https://github.com/Stuk/jszip), dual-licensed under MIT & GPLv3
diff --git a/inc/constants.php b/inc/constants.php
index f1d00b9..285b2d1 100644
--- a/inc/constants.php
+++ b/inc/constants.php
@@ -33,26 +33,51 @@ const AUTOLOAD_DIRS = [
const AUTOLOAD_CLASS_MAP = [
'CsvxmlAvailableFields' => __DIR__ . '/../classes/CsvxmlAvailableFields.php',
+ 'FieldEntry' => __DIR__ . '/../classes/FieldEntry.php',
'MDTlLoader' => __DIR__ . '/../classes/MDTlLoader/src/MDTlLoader.php',
'MDFormatter' => __DIR__ . '/../classes/MD_STD/src/MDFormatter.php',
'MD_JAIL' => __DIR__ . '/../classes/MD_STD/src/MD_JAIL.php',
'MD_STD' => __DIR__ . '/../classes/MD_STD/src/MD_STD.php',
'MD_STD_CACHE' => __DIR__ . '/../classes/MD_STD/src/MD_STD_CACHE.php',
+ 'MD_STD_DEBUG' => __DIR__ . '/../classes/MD_STD/src/MD_STD_DEBUG.php',
'MD_STD_IN' => __DIR__ . '/../classes/MD_STD/src/MD_STD_IN.php',
'MD_STD_SEC' => __DIR__ . '/../classes/MD_STD/src/MD_STD_SEC.php',
+ 'MD_STD_SORT' => __DIR__ . '/../classes/MD_STD/src/MD_STD_SORT.php',
+ 'MDActorVariantTypesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDActorVariantTypesSet.php',
+ 'MDAppointmentAttendanceModeSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDAppointmentAttendanceModeSet.php',
+ 'MDAppointmentContributorsSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDAppointmentContributorsSet.php',
'MDAppointmentRecordingSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDAppointmentRecordingSet.php',
+ 'MDAppointmentStatusSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDAppointmentStatusSet.php',
+ 'MDBlockedMailserverSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDBlockedMailserverSet.php',
+ 'MDCloserLocationTypesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDCloserLocationTypesSet.php',
+ 'MDColorsSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDColorsSet.php',
'MDConservationReportTypeSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDConservationReportTypeSet.php',
+ 'MDConservationStatusSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDConservationStatusSet.php',
'MDCurrenciesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDCurrenciesSet.php',
+ 'MDDataHistorySubjectsSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDDataHistorySubjectsSet.php',
'MDEntryTypesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDEntryTypesSet.php',
'MDEventsSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDEventsSet.php',
+ 'MDExhibitionContributorsSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDExhibitionContributorsSet.php',
+ 'MDExternalHostingSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDExternalHostingSet.php',
'MDLanguagesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDLanguagesSet.php',
'MDLicensesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDLicensesSet.php',
+ 'MDLoanTypesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDLoanTypesSet.php',
'MDMarkingTypesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDMarkingTypesSet.php',
+ 'MDNodaRepositoriesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDNodaRepositoriesSet.php',
'MDObjectPositionsSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDObjectPositionsSet.php',
'MDObjectPublicationBackgrounds' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDObjectPublicationBackgrounds.php',
+ 'MDObjectStatusSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDObjectStatusSet.php',
+ 'MDObjectSyndicationSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDObjectSyndicationSet.php',
+ 'MDPhoneTypesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDPhoneTypesSet.php',
'MDPlacetypesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDPlacetypesSet.php',
'MDPodcastContributorsSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDPodcastContributorsSet.php',
+ 'MDProcessTypesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDProcessTypesSet.php',
+ 'MDRecordingTypesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDRecordingTypesSet.php',
+ 'MDRequirementsSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDRequirementsSet.php',
+ 'MDResearchStatusSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDResearchStatusSet.php',
'MDSourceTypeSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDSourceTypeSet.php',
+ 'MDSpaceAccessStatusSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDSpaceAccessStatusSet.php',
+ 'MDSpaceTypesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDSpaceTypesSet.php',
'MDTitleTypesSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDTitleTypesSet.php',
'MDUnitsSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDUnitsSet.php',
'MDValueSet' => __DIR__ . '/../classes/MDAllowedValueSets/src/MDValueSet.php',
@@ -66,8 +91,10 @@ const AUTOLOAD_CLASS_MAP = [
'MDFileDoesNotExist' => __DIR__ . '/../classes/MDErrorReporter/exceptions/generic/MDFileDoesNotExist.php',
'MDFileIsNotReadable' => __DIR__ . '/../classes/MDErrorReporter/exceptions/generic/MDFileIsNotReadable.php',
'MDInaccessiblePropertyException' => __DIR__ . '/../classes/MDErrorReporter/exceptions/generic/MDInaccessiblePropertyException.php',
+ 'MDInputTooLongException' => __DIR__ . '/../classes/MDErrorReporter/exceptions/generic/MDInputTooLongException.php',
'MDInvalidColorCode' => __DIR__ . '/../classes/MDErrorReporter/exceptions/generic/MDInvalidColorCode.php',
'MDInvalidEmail' => __DIR__ . '/../classes/MDErrorReporter/exceptions/generic/MDInvalidEmail.php',
+ 'MDInvalidEmptyInputException' => __DIR__ . '/../classes/MDErrorReporter/exceptions/generic/MDInvalidEmptyInputException.php',
'MDInvalidUrl' => __DIR__ . '/../classes/MDErrorReporter/exceptions/generic/MDInvalidUrl.php',
'MDOutputBufferNotStarted' => __DIR__ . '/../classes/MDErrorReporter/exceptions/generic/MDOutputBufferNotStarted.php',
'MDRequiredConfigNotSet' => __DIR__ . '/../classes/MDErrorReporter/exceptions/generic/MDRequiredConfigNotSet.php',
@@ -81,6 +108,7 @@ const AUTOLOAD_CLASS_MAP = [
'MDpageParameterMissingException' => __DIR__ . '/../classes/MDErrorReporter/exceptions/page/MDpageParameterMissingException.php',
'MDpageParameterNotNumericException' => __DIR__ . '/../classes/MDErrorReporter/exceptions/page/MDpageParameterNotNumericException.php',
'MDDuplicateLinkException' => __DIR__ . '/../classes/MDErrorReporter/exceptions/updates/MDDuplicateLinkException.php',
+ 'MDFileIsNotWritable' => __DIR__ . '/../classes/MDErrorReporter/exceptions/updates/MDFileIsNotWritable.php',
'MDFileUploadNotAcceptedException' => __DIR__ . '/../classes/MDErrorReporter/exceptions/updates/MDFileUploadNotAcceptedException.php',
'MDInvalidCurrency' => __DIR__ . '/../classes/MDErrorReporter/exceptions/updates/MDInvalidCurrency.php',
'MDInvalidInputDate' => __DIR__ . '/../classes/MDErrorReporter/exceptions/updates/MDInvalidInputDate.php',
diff --git a/inc/zeichen.php b/inc/zeichen.php
deleted file mode 100644
index 1fc0bf6..0000000
--- a/inc/zeichen.php
+++ /dev/null
@@ -1,56 +0,0 @@
-', ' ', $transform);
- $transform = str_replace('
', ' ', $transform);
- $transform = str_replace('’', '\'', $transform);
- $transform = str_replace(chr(11), ' ', $transform);
-
- $transform = str_replace('<', '<', $transform);
- $transform = str_replace('>', '>', $transform);
- $transform = str_replace('´', ''', $transform);
- $transform = str_replace('&sbquo', '\'', $transform);
- $transform = str_replace('&lsquo', '\'', $transform);
- $transform = str_replace(chr(96), '\'', $transform);
- $transform = str_replace(chr(130), '\'', $transform);
- $transform = str_replace(chr(145), '\'', $transform);
- $transform = str_replace(chr(146), '\'', $transform);
- return $transform;
-
-}
-
-/**
- * Function for sanitizing contents for prospective XML contents.
- *
- * @param string $tagify Input string.
- *
- * @return string
- */
-function tagify(string $tagify):string {
- $tagify = str_replace(' ', '_', $tagify);
- $tagify = str_replace('/', '_', $tagify);
- $tagify = str_replace(',', '_', $tagify);
- $tagify = str_replace('__', '_', $tagify);
- $tagify = str_replace('Ä', 'ae', $tagify);
- $tagify = str_replace('ä', 'ae', $tagify);
- $tagify = str_replace('Ö', 'oe', $tagify);
- $tagify = str_replace('ö', 'oe', $tagify);
- $tagify = str_replace('Ü', 'ue', $tagify);
- $tagify = str_replace('ü', 'ue', $tagify);
- $tagify = str_replace('ß', 'ss', $tagify);
- $tagify = str_replace(chr(41), '', $tagify);
- $tagify = str_replace(chr(40), '', $tagify);
- return $tagify;
-
-}
diff --git a/inc/zip.php b/inc/zip.php
deleted file mode 100644
index 1ee628e..0000000
--- a/inc/zip.php
+++ /dev/null
@@ -1,440 +0,0 @@
-zipFile = tmpfile();
- } else {
- $this->zipData = "";
- }
- }
-
- function __destruct() {
- if (!is_null($this->zipFile)) {
- fclose($this->zipFile);
- }
- $this->zipData= null;
- }
-
- /**
- * Set Zip archive comment.
- *
- * @param string $newComment New comment. null to clear.
- */
- public function setComment($newComment = null) {
- $this->zipComment = $newComment;
- }
-
- /**
- * Set zip file to write zip data to.
- * This will cause all present and future data written to this class to be written to this file.
- * This can be used at any time, even after the Zip Archive have been finalized. Any previous file will be closed.
- * Warning: If the given file already exists, it will be overwritten.
- *
- * @param string $fileName
- */
- public function setZipFile($fileName) {
- if (file_exists($fileName)) {
- unlink ($fileName);
- }
- $fd=fopen($fileName, "x+b");
- if (!is_null($this->zipFile)) {
- rewind($this->zipFile);
- while(!feof($this->zipFile)) {
- fwrite($fd, fread($this->zipFile, $this->streamChunkSize));
- }
-
- fclose($this->zipFile);
- } else {
- fwrite($fd, $this->zipData);
- $this->zipData = null;
- }
- $this->zipFile = $fd;
- }
-
- /**
- * Add an empty directory entry to the zip archive.
- * Basically this is only used if an empty directory is added.
- *
- * @param string $directoryPath Directory Path and name to be added to the archive.
- * @param int $timestamp (Optional) Timestamp for the added directory, if omitted or set to 0, the current time will be used.
- * @param string $fileComment (Optional) Comment to be added to the archive for this directory. To use fileComment, timestamp must be given.
- */
- public function addDirectory($directoryPath, $timestamp = 0, $fileComment = null) {
- if ($this->isFinalized) {
- return;
- }
- $this->buildZipEntry($directoryPath, $fileComment, "\x00\x00", "\x00\x00", $timestamp, "\x00\x00\x00\x00", 0, 0, 16);
- }
-
- /**
- * Add a file to the archive at the specified location and file name.
- *
- * @param string $data File data.
- * @param string $filePath Filepath and name to be used in the archive.
- * @param int $timestamp (Optional) Timestamp for the added file, if omitted or set to 0, the current time will be used.
- * @param string $fileComment (Optional) Comment to be added to the archive for this file. To use fileComment, timestamp must be given.
- */
- public function addFile($data, $filePath, $timestamp = 0, $fileComment = null) {
- if ($this->isFinalized) {
- return;
- }
-
- $gzType = "\x08\x00"; // Compression type 8 = deflate
- $gpFlags = "\x02\x00"; // General Purpose bit flags for compression type 8 it is: 0=Normal, 1=Maximum, 2=Fast, 3=super fast compression.
- $dataLength = strlen($data);
- $fileCRC32 = pack("V", crc32($data));
-
- $gzData = gzcompress($data);
- $gzData = substr( substr($gzData, 0, strlen($gzData) - 4), 2); // gzcompress adds a 2 byte header and 4 byte CRC we can't use.
- // The 2 byte header does contain useful data, though in this case the 2 parameters we'd be interrested in will always be 8 for compression type, and 2 for General purpose flag.
- $gzLength = strlen($gzData);
-
- if ($gzLength >= $dataLength) {
- $gzLength = $dataLength;
- $gzData = $data;
- $gzType = "\x00\x00"; // Compression type 0 = stored
- $gpFlags = "\x00\x00"; // Compression type 0 = stored
- }
-
- if (is_null($this->zipFile) && ($this->offset + $gzLength) > $this->zipMemoryThreshold) {
- $this->zipFile = tmpfile();
- fwrite($this->zipFile, $this->zipData);
- $this->zipData = null;
- }
-
- $this->buildZipEntry($filePath, $fileComment, $gpFlags, $gzType, $timestamp, $fileCRC32, $gzLength, $dataLength, 32);
- if (is_null($this->zipFile)) {
- $this->zipData .= $gzData;
- } else {
- fwrite($this->zipFile, $gzData);
- }
- }
-
- /**
- * Add a file to the archive at the specified location and file name.
- *
- * @param string $dataFile File name/path.
- * @param string $filePath Filepath and name to be used in the archive.
- * @param int $timestamp (Optional) Timestamp for the added file, if omitted or set to 0, the current time will be used.
- * @param string $fileComment (Optional) Comment to be added to the archive for this file. To use fileComment, timestamp must be given.
- */
- public function addLargeFile($dataFile, $filePath, $timestamp = 0, $fileComment = null) {
- if ($this->isFinalized) {
- return;
- }
-
- $this->openStream($filePath, $timestamp, $fileComment);
-
- $fh = fopen($dataFile, "rb");
- while(!feof($fh)) {
- $this->addStreamData(fread($fh, $this->streamChunkSize));
- }
- fclose($fh);
-
- $this->closeStream();
- }
-
- /**
- * Create a stream to be used for large entries.
- *
- * @param string $filePath Filepath and name to be used in the archive.
- * @param int $timestamp (Optional) Timestamp for the added file, if omitted or set to 0, the current time will be used.
- * @param string $fileComment (Optional) Comment to be added to the archive for this file. To use fileComment, timestamp must be given.
- */
- public function openStream($filePath, $timestamp = 0, $fileComment = null) {
- if ($this->isFinalized) {
- return;
- }
-
- if (is_null($this->zipFile)) {
- $this->zipFile = tmpfile();
- fwrite($this->zipFile, $this->zipData);
- $this->zipData = null;
- }
-
- if (strlen($this->streamFilePath) > 0) {
- closeStream();
- }
- $this->streamFile = tempnam(sys_get_temp_dir(), 'Zip');
- $this->streamData = gzopen($this->streamFile, "w9");
- $this->streamFilePath = $filePath;
- $this->streamTimestamp = $timestamp;
- $this->streamFileComment = $fileComment;
- $this->streamFileLength = 0;
- }
-
- public function addStreamData($data) {
- $length = gzwrite($this->streamData, $data, strlen($data));
- if ($length != strlen($data)) {
- print "
Length mismatch
\n"; - } - $this->streamFileLength += $length; - return $length; - } - - /** - * Close the current stream. - */ - public function closeStream() { - if ($this->isFinalized || strlen($this->streamFilePath) == 0) { - return; - } - - fflush($this->streamData); - gzclose($this->streamData); - - $gzType = "\x08\x00"; // Compression type 8 = deflate - $gpFlags = "\x02\x00"; // General Purpose bit flags for compression type 8 it is: 0=Normal, 1=Maximum, 2=Fast, 3=super fast compression. - - $file_handle = fopen($this->streamFile, "rb"); - $stats = fstat($file_handle); - $eof = $stats['size']; - - fseek($file_handle, $eof-8); - $fileCRC32 = fread($file_handle, 4); - $dataLength = $this->streamFileLength;//$gzl[1]; - - $gzLength = $eof-10; - $eof -= 9; - - fseek($file_handle, 10); - - $this->buildZipEntry($this->streamFilePath, $this->streamFileComment, $gpFlags, $gzType, $this->streamTimestamp, $fileCRC32, $gzLength, $dataLength, 32); - while(!feof($file_handle)) { - fwrite($this->zipFile, fread($file_handle, $this->streamChunkSize)); - } - - unlink($this->streamFile); - $this->streamFile = null; - $this->streamData = null; - $this->streamFilePath = null; - $this->streamTimestamp = null; - $this->streamFileComment = null; - $this->streamFileLength = 0; - } - - /** - * Close the archive. - * A closed archive can no longer have new files added to it. - */ - public function finalize() { - if(!$this->isFinalized) { - if (strlen($this->streamFilePath) > 0) { - $this->closeStream(); - } - $cd = implode("", $this->cdRec); - - $cdRec = $cd . $this->endOfCentralDirectory - . pack("v", sizeof($this->cdRec)) - . pack("v", sizeof($this->cdRec)) - . pack("V", strlen($cd)) - . pack("V", $this->offset); - if (!is_null($this->zipComment)) { - $cdRec .= pack("v", strlen($this->zipComment)) . $this->zipComment; - } else { - $cdRec .= "\x00\x00"; - } - - if (is_null($this->zipFile)) { - $this->zipData .= $cdRec; - } else { - fwrite($this->zipFile, $cdRec); - fflush($this->zipFile); - } - $this->isFinalized = true; - $cd = null; - $this->cdRec = null; - } - } - - /** - * Get the handle ressource for the archive zip file. - * If the zip haven't been finalized yet, this will cause it to become finalized - * - * @return zip file handle - */ - public function getZipFile() { - if(!$this->isFinalized) { - $this->finalize(); - } - if (is_null($this->zipFile)) { - $this->zipFile = tmpfile(); - fwrite($this->zipFile, $this->zipData); - $this->zipData = null; - } - rewind($this->zipFile); - return $this->zipFile; - } - - /** - * Get the zip file contents - * If the zip haven't been finalized yet, this will cause it to become finalized - * - * @return zip data - */ - public function getZipData() { - if(!$this->isFinalized) { - $this->finalize(); - } - if (is_null($this->zipFile)) { - return $this->zipData; - } else { - rewind($this->zipFile); - $filestat = fstat($this->zipFile); - return fread($this->zipFile, $filestat['size']); - } - } - - /** - * Send the archive as a zip download - * - * @param String $fileName The name of the Zip archive, ie. "archive.zip". - * @return void - */ - function sendZip($fileName) { - if(!$this->isFinalized) { - $this->finalize(); - } - - if (!headers_sent($headerFile, $headerLine) or die("Error: Unable to send file $fileName. HTML Headers have already been sent from $headerFile in line $headerLine
")) { - if (ob_get_contents() === false or die("\nError: Unable to send file $fileName.epub. Output buffer contains the following text (typically warnings or errors):
" . ob_get_contents() . "