Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions classes/CrossrefSettings.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@ public function getSchema(): \stdClass
],
'testMode' => (object) [
'type' => 'boolean',
],
'crossmarkPolicyDOI' => (object) [
'type' => 'string',
'validation' => ['nullable', 'max:255'],
]
],
];
Expand Down Expand Up @@ -97,6 +101,16 @@ public function getFields(Context $context): array
['value' => true, 'label' => __('plugins.importexport.crossref.settings.form.testMode.description')]
],
'value' => (bool) $this->agencyPlugin->getSetting($context->getId(), 'testMode'),
]),
new FieldHTML('crossmarkSection', [
'label' => __('plugins.importexport.crossref.settings.crossmark.title'),
'description' => __('plugins.importexport.crossref.settings.crossmark.description'),
]),
new FieldText('crossmarkPolicyDOI', [
'label' => __('plugins.importexport.crossref.settings.form.crossmarkPolicyDOI'),
'description' => __('plugins.importexport.crossref.settings.form.crossmarkPolicyDOI.description'),
'value' => $this->agencyPlugin->getSetting($context->getId(), 'crossmarkPolicyDOI'),
'inputType' => 'text',
])
];
}
Expand Down
62 changes: 52 additions & 10 deletions filter/ArticleCrossrefXmlFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public function createJournalNode($doc, $pubObject)
* @param DOMDocument $doc
* @param Submission $submission
*
* @return DOMElement|null
* @return DOMElement
*/
public function createJournalIssueNode($doc, $submission)
{
Expand All @@ -72,13 +72,7 @@ public function createJournalIssueNode($doc, $submission)
$context = $deployment->getContext();
$cache = $deployment->getCache();
assert($submission instanceof Submission);

$issueId = $submission->getCurrentPublication()->getData('issueId');

if (!$issueId) {
return null;
}

if ($cache->isCached('issues', $issueId)) {
$issue = $cache->get('issues', $issueId);
} else {
Expand Down Expand Up @@ -268,14 +262,60 @@ public function createJournalArticleNode($doc, $submission)
}
}

// Add Crossmark BEFORE doi_data with full structure
$version = $publication->getData('version') ?? '1';
$plugin = $deployment->getPlugin();
$crossmarkPolicyDOI = $plugin->getSetting($context->getId(), 'crossmarkPolicyDOI');
if (!empty($crossmarkPolicyDOI)) {
$crossmarkNode = $doc->createElementNS($deployment->getNamespace(), 'crossmark');

// Crossmark policy
$crossmarkPolicyNode = $doc->createElementNS($deployment->getNamespace(), 'crossmark_policy', htmlspecialchars($crossmarkPolicyDOI, ENT_COMPAT, 'UTF-8'));
$crossmarkNode->appendChild($crossmarkPolicyNode);

// Crossmark domains
$crossmarkDomainsNode = $doc->createElementNS($deployment->getNamespace(), 'crossmark_domains');
$crossmarkDomainNode = $doc->createElementNS($deployment->getNamespace(), 'crossmark_domain');

// Get domain from journal URL
$journalUrl = $request->getBaseUrl();
$parsedUrl = parse_url($journalUrl);
$domainName = $parsedUrl['host'] ?? $context->getPath();

$domainNode = $doc->createElementNS($deployment->getNamespace(), 'domain', $domainName);
$crossmarkDomainNode->appendChild($domainNode);
$crossmarkDomainsNode->appendChild($crossmarkDomainNode);
$crossmarkNode->appendChild($crossmarkDomainsNode);

// Crossmark domain exclusive
$crossmarkDomainExclusiveNode = $doc->createElementNS($deployment->getNamespace(), 'crossmark_domain_exclusive', 'false');
$crossmarkNode->appendChild($crossmarkDomainExclusiveNode);

// Custom metadata
$customMetadataNode = $doc->createElementNS($deployment->getNamespace(), 'custom_metadata');

// Add license to custom_metadata
if ($publication->getData('licenseUrl')) {
$aiProgramNode = $doc->createElementNS($deployment->getAINamespace(), 'ai:program');
$aiProgramNode->setAttribute('name', 'AccessIndicators');
$aiLicenseRefNode = $doc->createElementNS($deployment->getAINamespace(), 'ai:license_ref', htmlspecialchars($publication->getData('licenseUrl'), ENT_COMPAT, 'UTF-8'));
$aiLicenseRefNode->setAttribute('applies_to', 'vor');
$aiProgramNode->appendChild($aiLicenseRefNode);
$customMetadataNode->appendChild($aiProgramNode);
}

$crossmarkNode->appendChild($customMetadataNode);
$journalArticleNode->appendChild($crossmarkNode);
}

// license
if ($publication->getData('licenseUrl')) {
if ($publication->getData('licenseUrl') && empty($crossmarkPolicyDOI)) {
$licenseNode = $doc->createElementNS($deployment->getAINamespace(), 'ai:program');
$licenseNode->setAttribute('name', 'AccessIndicators');
$licenseNode->appendChild($node = $doc->createElementNS($deployment->getAINamespace(), 'ai:license_ref', htmlspecialchars($publication->getData('licenseUrl'), ENT_COMPAT, 'UTF-8')));
$journalArticleNode->appendChild($licenseNode);
}

// DOI data
$dispatcher = $this->_getDispatcher($request);
$url = $dispatcher->url($request, PKPApplication::ROUTE_PAGE, $context->getPath(), 'article', 'view', [$publication->getData('urlPath') ?? $submission->getId()], null, null, true, '');
Expand Down Expand Up @@ -328,6 +368,8 @@ public function createJournalArticleNode($doc, $submission)
// text-mining - collection nodes
$submissionGalleys = array_merge($submissionGalleys, $remoteGalleys);
$this->appendTextMiningCollectionNodes($doc, $doiDataNode, $submission, $submissionGalleys);


$journalArticleNode->appendChild($doiDataNode);

// component list (supplementary files)
Expand Down Expand Up @@ -465,4 +507,4 @@ public function createComponentListNode($doc, $submission, $componentGalleys)
}
return $componentListNode;
}
}
}
11 changes: 11 additions & 0 deletions locale/en/locale.po
Original file line number Diff line number Diff line change
Expand Up @@ -183,3 +183,14 @@ msgstr "The submission \"{$publicationTitle}\" is not associated with a DOI and
msgid "plugins.generic.crossref.doi.url"
msgstr "The submission \"{$publicationTitle}\" is not associated with a valid DOI url and cannot be deposited with CrossRef."

msgid "plugins.importexport.crossref.settings.crossmark.title"
msgstr "Crossmark Settings"

msgid "plugins.importexport.crossref.settings.crossmark.description"
msgstr "Crossmark provides readers with quick and easy access to current publication status information."

msgid "plugins.importexport.crossref.settings.form.crossmarkPolicyUrl"
msgstr "Crossmark Policy URL"

msgid "plugins.importexport.crossref.settings.form.crossmarkPolicyUrl.description"
msgstr "Enter the URL of your journal's Crossmark policy page (e.g., https://doi.org/10.xxxxxx/policy)."
24 changes: 24 additions & 0 deletions locale/vi/locale.po
Original file line number Diff line number Diff line change
Expand Up @@ -208,3 +208,27 @@ msgstr ""
"xem bài nộp trong <a href=\"https://doi.crossref.org/servlet/"
"submissionAdmin?sf=detail&submissionID={$submissionId}\">bảng quản trị "
"Crossref</a>."

msgid "plugins.generic.crossref.issueId.required"
msgstr "Bài báo \"{$publicationTitle}\" phải được gán vào một số tạp chí trước khi có thể xuất bản."

msgid "plugins.generic.crossref.doi.required"
msgstr "Bài báo \"{$publicationTitle}\" phải có DOI được gán trước khi có thể xuất bản."

msgid "plugins.generic.crossref.doi.url"
msgstr "Bài báo \"{$publicationTitle}\" phải có URL DOI hợp lệ trước khi có thể xuất bản."

msgid "plugins.generic.crossref.issn.requiredWithout"
msgstr "Phải cấu hình ISSN online hoặc ISSN in trước khi các bài báo có thể được xuất bản."

msgid "plugins.importexport.crossref.settings.crossmark.title"
msgstr "Cài đặt Crossmark"

msgid "plugins.importexport.crossref.settings.crossmark.description"
msgstr "Crossmark cung cấp cho người đọc quyền truy cập nhanh chóng và dễ dàng vào thông tin trạng thái xuất bản hiện tại."

msgid "plugins.importexport.crossref.settings.form.crossmarkPolicyUrl"
msgstr "URL Chính sách Crossmark"

msgid "plugins.importexport.crossref.settings.form.crossmarkPolicyUrl.description"
msgstr "Nhập URL của trang chính sách Crossmark của tạp chí của bạn (ví dụ: https://doi.org/10.xxxxxx/policy)."