16 import(
'lib.pkp.plugins.importexport.native.filter.NativeExportFilter');
25 parent::__construct($filterGroup);
35 return 'plugins.importexport.crossref.filter.PreprintCrossrefXmlFilter';
48 $doc =
new DOMDocument(
'1.0',
'utf-8');
49 $doc->preserveWhiteSpace =
false;
50 $doc->formatOutput =
true;
52 $context = $deployment->getContext();
56 $doc->appendChild($rootNode);
62 $bodyNode = $doc->createElementNS($deployment->getNamespace(),
'body');
63 $rootNode->appendChild($bodyNode);
65 foreach($pubObjects as $pubObject) {
66 $publications = $pubObject->getData(
'publications');
68 $publications = array_reverse($publications,
true);
69 foreach ($publications as $publication) {
70 if ($publication->getStoredPubId(
'doi')) {
72 $bodyNode->appendChild($postedContentNode);
90 $rootNode = $doc->createElementNS($deployment->getNamespace(), $deployment->getRootElementName());
91 $rootNode->setAttributeNS(
'http://www.w3.org/2000/xmlns/',
'xmlns:xsi', $deployment->getXmlSchemaInstance());
92 $rootNode->setAttributeNS(
'http://www.w3.org/2000/xmlns/',
'xmlns:jats', $deployment->getJATSNamespace());
93 $rootNode->setAttributeNS(
'http://www.w3.org/2000/xmlns/',
'xmlns:ai', $deployment->getAINamespace());
94 $rootNode->setAttributeNS(
'http://www.w3.org/2000/xmlns/',
'xmlns:rel', $deployment->getRELNamespace());
95 $rootNode->setAttribute(
'version', $deployment->getXmlSchemaVersion());
96 $rootNode->setAttribute(
'xsi:schemaLocation', $deployment->getNamespace() .
' ' . $deployment->getSchemaFilename());
107 $context = $deployment->getContext();
108 $plugin = $deployment->getPlugin();
109 $headNode = $doc->createElementNS($deployment->getNamespace(),
'head');
110 $headNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(),
'doi_batch_id', htmlspecialchars($context->getData(
'initials', $context->getPrimaryLocale()) .
'_' . time(), ENT_COMPAT,
'UTF-8')));
111 $headNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(),
'timestamp', time()));
112 $depositorNode = $doc->createElementNS($deployment->getNamespace(),
'depositor');
113 $depositorName = $plugin->getSetting($context->getId(),
'depositorName');
114 if (empty($depositorName)) {
115 $depositorName = $context->getData(
'supportName');
117 $depositorEmail = $plugin->getSetting($context->getId(),
'depositorEmail');
118 if (empty($depositorEmail)) {
119 $depositorEmail = $context->getData(
'supportEmail');
121 $depositorNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(),
'depositor_name', htmlspecialchars($depositorName, ENT_COMPAT,
'UTF-8')));
122 $depositorNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(),
'email_address', htmlspecialchars($depositorEmail, ENT_COMPAT,
'UTF-8')));
123 $headNode->appendChild($depositorNode);
124 $publisherServer = $context->getLocalizedName();
125 $headNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(),
'registrant', htmlspecialchars($publisherServer, ENT_COMPAT,
'UTF-8')));
135 assert(is_a($publication,
'Publication'));
137 $context = $deployment->getContext();
140 $locale = $publication->getData(
'locale');
142 $postedContentNode = $doc->createElementNS($deployment->getNamespace(),
'posted_content');
143 $postedContentNode->setAttribute(
'type',
'preprint');
146 $contributorsNode = $doc->createElementNS($deployment->getNamespace(),
'contributors');
147 $authors = $publication->getData(
'authors');
149 foreach ($authors as $author) {
150 $personNameNode = $doc->createElementNS($deployment->getNamespace(),
'person_name');
151 $personNameNode->setAttribute(
'contributor_role',
'author');
153 $personNameNode->setAttribute(
'sequence',
'first');
155 $personNameNode->setAttribute(
'sequence',
'additional');
158 $familyNames = $author->getFamilyName(
null);
159 $givenNames = $author->getGivenName(
null);
162 if (isset($familyNames[$locale]) && isset($givenNames[$locale])) {
164 $personNameNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(),
'given_name', htmlspecialchars(ucfirst($givenNames[$locale]), ENT_COMPAT,
'UTF-8')));
165 $personNameNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(),
'surname', htmlspecialchars(ucfirst($familyNames[$locale]), ENT_COMPAT,
'UTF-8')));
168 foreach($familyNames as $otherLocal => $familyName) {
169 if ($otherLocal != $locale && isset($familyName) && !empty($familyName)) {
171 $altNameNode = $doc->createElementNS($deployment->getNamespace(),
'alt-name');
172 $personNameNode->appendChild($altNameNode);
177 $nameNode = $doc->createElementNS($deployment->getNamespace(),
'name');
180 $nameNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(),
'surname', htmlspecialchars(ucfirst($familyName), ENT_COMPAT,
'UTF-8')));
181 if (isset($givenNames[$otherLocal]) && !empty($givenNames[$otherLocal])) {
182 $nameNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(),
'given_name', htmlspecialchars(ucfirst($givenNames[$otherLocal]), ENT_COMPAT,
'UTF-8')));
185 $altNameNode->appendChild($nameNode);
190 $personNameNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(),
'surname', htmlspecialchars(ucfirst($author->getFullName(
false)), ENT_COMPAT,
'UTF-8')));
193 if ($author->getData(
'orcid')) {
194 $personNameNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(),
'ORCID', $author->getData(
'orcid')));
196 $contributorsNode->appendChild($personNameNode);
199 $postedContentNode->appendChild($contributorsNode);
202 $titlesNode = $doc->createElementNS($deployment->getNamespace(),
'titles');
203 $titlesNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(),
'title', htmlspecialchars($publication->getData(
'title', $submission->getLocale()), ENT_COMPAT,
'UTF-8')));
204 if ($subtitle = $publication->getData(
'subtitle', $submission->getLocale())) $titlesNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(),
'subtitle', htmlspecialchars($subtitle, ENT_COMPAT,
'UTF-8')));
205 $postedContentNode->appendChild($titlesNode);
208 $postedContentNode->appendChild($this->
createPostedDateNode($doc, $publication->getData(
'datePublished')));
211 if ($publication->getData(
'licenseUrl')) {
212 $licenseNode = $doc->createElementNS($deployment->getAINamespace(),
'ai:program');
213 $licenseNode->setAttribute(
'name',
'AccessIndicators');
214 $licenseNode->appendChild($node = $doc->createElementNS($deployment->getAINamespace(),
'ai:license_ref', htmlspecialchars($publication->getData(
'licenseUrl'), ENT_COMPAT,
'UTF-8')));
215 $postedContentNode->appendChild($licenseNode);
219 if ($submission->getLatestPublication()->getStoredPubId(
'doi') && $submission->getLatestPublication()->getStoredPubId(
'doi') != $publication->getStoredPubId(
'doi')){
220 $postedContentNode->appendChild($this->
createRelationsDataNode($doc, $submission->getLatestPublication()->getStoredPubId(
'doi')));
224 $postedContentNode->appendChild($this->
createDOIDataNode($doc, $publication->getStoredPubId(
'doi'), $request->getDispatcher()->url($request, ROUTE_PAGE,
null,
'preprint',
'view', [$submission->getBestId(),
'version', $publication->getId()],
null,
null,
true)));
226 return $postedContentNode;
237 $postedDate = strtotime($objectPostedDate);
238 $postedDateNode = $doc->createElementNS($deployment->getNamespace(),
'posted_date');
239 if (date(
'm', $postedDate)) {
240 $postedDateNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(),
'month', date(
'm', $postedDate)));
242 if (date(
'd', $postedDate)) {
243 $postedDateNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(),
'day', date(
'd', $postedDate)));
245 $postedDateNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(),
'year', date(
'Y', $postedDate)));
246 return $postedDateNode;
258 $doiDataNode = $doc->createElementNS($deployment->getNamespace(),
'doi_data');
259 $doiDataNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(),
'doi', htmlspecialchars($doi, ENT_COMPAT,
'UTF-8')));
260 $doiDataNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(),
'resource', htmlspecialchars($url, ENT_COMPAT,
'UTF-8')));
272 $relationsDataNode = $doc->createElementNS($deployment->getRELNamespace(),
'rel:program');
273 $relationsDataNode->setAttribute(
'name',
'relations');
275 $relatedItemNode = $doc->createElementNS($deployment->getRELNamespace(),
'rel:related_item');
276 $intraWorkRelationNode = $doc->createElementNS($deployment->getRELNamespace(),
'rel:intra_work_relation', htmlspecialchars($parentDoi, ENT_COMPAT,
'UTF-8'));
277 $intraWorkRelationNode->setAttribute(
'relationship-type',
'isVersionOf');
278 $intraWorkRelationNode->setAttribute(
'identifier-type',
'doi');
279 $relatedItemNode->appendChild($intraWorkRelationNode);
280 $relationsDataNode->appendChild($relatedItemNode);
282 return $relationsDataNode;