function &generateArticleDom(&$doc, &$journal, &$issue, &$section, &$article)
{
// register the editor submission DAO for use later
$editorSubmissionDao = DAORegistry::getDAO('EditorSubmissionDAO');
/* --- Article --- */
$root =& XMLCustomWriter::createElement($doc, 'Article');
/* --- Journal --- */
$journalNode =& XMLCustomWriter::createElement($doc, 'Journal');
XMLCustomWriter::appendChild($root, $journalNode);
$publisherInstitution = $journal->getSetting('publisherInstitution');
$publisherNode = XMLCustomWriter::createChildWithText($doc, $journalNode, 'PublisherName', $publisherInstitution);
XMLCustomWriter::createChildWithText($doc, $journalNode, 'JournalTitle', $journal->getLocalizedName());
// check various ISSN fields to create the ISSN tag
if ($journal->getSetting('printIssn') != '') {
$ISSN = $journal->getSetting('printIssn');
} elseif ($journal->getSetting('issn') != '') {
$ISSN = $journal->getSetting('issn');
} elseif ($journal->getSetting('onlineIssn') != '') {
$ISSN = $journal->getSetting('onlineIssn');
} else {
$ISSN = '';
}
if ($ISSN != '') {
XMLCustomWriter::createChildWithText($doc, $journalNode, 'Issn', $ISSN);
}
if ($issue->getShowVolume()) {
XMLCustomWriter::createChildWithText($doc, $journalNode, 'Volume', $issue->getVolume());
}
if ($issue->getShowNumber()) {
XMLCustomWriter::createChildWithText($doc, $journalNode, 'Issue', $issue->getNumber(), false);
}
$datePublished = $article->getDatePublished();
if (!$datePublished) {
$datePublished = $issue->getDatePublished();
}
if ($datePublished) {
$pubDateNode =& PubMedExportDom::generatePubDateDom($doc, $datePublished, 'epublish');
XMLCustomWriter::appendChild($journalNode, $pubDateNode);
}
/* --- Replaces --- */
// this creates a blank replaces tag since OJS doesn't contain PMID metadata
// XMLCustomWriter::createChildWithText($doc, $root, 'Replaces', '');
/* --- ArticleTitle / VernacularTitle --- */
// there is some ambiguity between whether to use
// article->getlanguage or journal->getlocale
// PubMed requires english titles for ArticleTitle
$language = $article->getLanguage();
if ($language == 'en' || $language == '') {
XMLCustomWriter::createChildWithText($doc, $root, 'ArticleTitle', $article->getLocalizedTitle());
} else {
XMLCustomWriter::createChildWithText($doc, $root, 'VernacularTitle', $article->getLocalizedTitle());
}
/* --- FirstPage / LastPage --- */
// there is some ambiguity for online journals as to what
// "page numbers" are; for example, some journals (eg. JMIR)
// use the "e-location ID" as the "page numbers" in PubMed
$pages = $article->getPages();
if (preg_match("/([0-9]+)\\s*-\\s*([0-9]+)/i", $pages, $matches)) {
// simple pagination (eg. "pp. 3- 8")
XMLCustomWriter::createChildWithText($doc, $root, 'FirstPage', $matches[1]);
XMLCustomWriter::createChildWithText($doc, $root, 'LastPage', $matches[2]);
} elseif (preg_match("/(e[0-9]+)\\s*-\\s*(e[0-9]+)/i", $pages, $matches)) {
// e9 - e14, treated as page ranges
XMLCustomWriter::createChildWithText($doc, $root, 'FirstPage', $matches[1]);
XMLCustomWriter::createChildWithText($doc, $root, 'LastPage', $matches[2]);
} elseif (preg_match("/(e[0-9]+)/i", $pages, $matches)) {
// single elocation-id (eg. "e12")
XMLCustomWriter::createChildWithText($doc, $root, 'FirstPage', $matches[1]);
XMLCustomWriter::createChildWithText($doc, $root, 'LastPage', $matches[1]);
} else {
// we need to insert something, so use the best ID possible
XMLCustomWriter::createChildWithText($doc, $root, 'FirstPage', $article->getBestArticleId());
XMLCustomWriter::createChildWithText($doc, $root, 'LastPage', $article->getBestArticleId());
}
/* --- DOI --- */
if ($doi = $article->getStoredPubId('doi')) {
$doiNode =& XMLCustomWriter::createChildWithText($doc, $root, 'ELocationID', $doi, false);
XMLCustomWriter::setAttribute($doiNode, 'EIdType', 'doi');
}
/* --- Language --- */
XMLCustomWriter::createChildWithText($doc, $root, 'Language', strtoupper($article->getLanguage()), false);
/* --- AuthorList --- */
$authorListNode =& XMLCustomWriter::createElement($doc, 'AuthorList');
XMLCustomWriter::appendChild($root, $authorListNode);
$authorIndex = 0;
foreach ($article->getAuthors() as $author) {
$authorNode =& PubMedExportDom::generateAuthorDom($doc, $author, $authorIndex++);
XMLCustomWriter::appendChild($authorListNode, $authorNode);
}
/* --- ArticleIdList --- */
// Pubmed will accept two types of article identifier: pii and doi
// how this is handled is journal-specific, and will require either
// configuration in the plugin, or an update to the core code.
// this is also related to DOI-handling within OJS
if ($article->getStoredPubId('publisher-id')) {
$articleIdListNode =& XMLCustomWriter::createElement($doc, 'ArticleIdList');
XMLCustomWriter::appendChild($root, $articleIdListNode);
$articleIdNode =& XMLCustomWriter::createChildWithText($doc, $articleIdListNode, 'ArticleId', $article->getStoredPubId('publisher-id'));
XMLCustomWriter::setAttribute($articleIdNode, 'IdType', 'pii');
}
/* --- History --- */
$historyNode =& XMLCustomWriter::createElement($doc, 'History');
XMLCustomWriter::appendChild($root, $historyNode);
// date manuscript received for review
$receivedNode =& PubMedExportDom::generatePubDateDom($doc, $article->getDateSubmitted(), 'received');
XMLCustomWriter::appendChild($historyNode, $receivedNode);
// accepted for publication
$editordecisions = $editorSubmissionDao->getEditorDecisions($article->getId());
// if there are multiple decisions, make sure we get the accepted date
$editordecision = array_pop($editordecisions);
while ($editordecision['decision'] != SUBMISSION_EDITOR_DECISION_ACCEPT && count($editordecisions) > 0) {
$editordecision = array_pop($editordecisions);
}
if ($editordecision != '') {
$acceptedNode =& PubMedExportDom::generatePubDateDom($doc, $editordecision['dateDecided'], 'accepted');
XMLCustomWriter::appendChild($historyNode, $acceptedNode);
}
// article revised by publisher or author
// check if there is a revised version; if so, generate a revised tag
$revisedFileId = $article->getRevisedFileId();
if (!empty($revisedFileId)) {
$submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO');
$submissionFile = $submissionFileDao->getLatestRevision($revisedFileId);
if ($submissionFile) {
$revisedNode =& PubMedExportDom::generatePubDateDom($doc, $submissionFile->getDateModified(), 'revised');
XMLCustomWriter::appendChild($historyNode, $revisedNode);
}
}
/* --- Abstract --- */
if ($article->getLocalizedAbstract()) {
$abstractNode = XMLCustomWriter::createChildWithText($doc, $root, 'Abstract', strip_tags($article->getLocalizedAbstract()), false);
}
return $root;
}