00001 <?php
00002
00015
00016
00017
00018 import('xml.XMLCustomWriter');
00019
00020 class DOAJExportDom {
00026 function &generateJournalDom(&$doc, &$journal) {
00027 $issueDao =& DAORegistry::getDAO('IssueDAO');
00028 $sectionDao =& DAORegistry::getDAO('SectionDAO');
00029 $pubArticleDao =& DAORegistry::getDAO('PublishedArticleDAO');
00030
00031
00032 $records =& XMLCustomWriter::createElement($doc, 'records');
00033
00034 $pubArticles =& $pubArticleDao->getPublishedArticlesByJournalId($journal->getJournalId());
00035 while ($pubArticle =& $pubArticles->next()) {
00036 $issue =& $issueDao->getIssueById($pubArticle->getIssueId());
00037 $section =& $sectionDao->getSection($pubArticle->getSectionId());
00038
00039 $articleNode =& DOAJExportDom::generateArticleDom($doc, $journal, $issue, $section, $pubArticle);
00040
00041 XMLCustomWriter::appendChild($records, $articleNode);
00042
00043 unset($issue, $section, $articleNode);
00044 }
00045
00046 return $records;
00047 }
00048
00057 function &generateArticleDom(&$doc, &$journal, &$issue, &$section, &$article) {
00058 $root =& XMLCustomWriter::createElement($doc, 'record');
00059
00060
00061 XMLCustomWriter::createChildWithText($doc, $root, 'language', DOAJExportDom::mapLang($article->getLanguage()), false);
00062
00063
00064 XMLCustomWriter::createChildWithText($doc, $root, 'publisher', $journal->getSetting('publisherInstitution'), false);
00065
00066
00067 XMLCustomWriter::createChildWithText($doc, $root, 'journalTitle', $journal->getJournalTitle(), false);
00068
00069
00070 XMLCustomWriter::createChildWithText($doc, $root, 'issn', $journal->getSetting('printIssn'), false);
00071 XMLCustomWriter::createChildWithText($doc, $root, 'eissn', $journal->getSetting('onlineIssn'), false);
00072
00073
00074 XMLCustomWriter::createChildWithText($doc, $root, 'publicationDate', DOAJExportDom::formatDate($article->getDatePublished()), false);
00075
00076 XMLCustomWriter::createChildWithText($doc, $root, 'volume', $issue->getVolume(), false);
00077
00078 XMLCustomWriter::createChildWithText($doc, $root, 'issue', $issue->getNumber(), false);
00079
00080 XMLCustomWriter::createChildWithText($doc, $root, 'doi', $article->getDoi(), false);
00081
00087 $pages = $article->getPages();
00088 if (preg_match("/([0-9]+)\s*-\s*([0-9]+)/i", $pages, $matches)) {
00089
00090 XMLCustomWriter::createChildWithText($doc, $root, 'startPage', $matches[1]);
00091 XMLCustomWriter::createChildWithText($doc, $root, 'endPage', $matches[2]);
00092 } elseif (preg_match("/(e[0-9]+)/i", $pages, $matches)) {
00093
00094 XMLCustomWriter::createChildWithText($doc, $root, 'startPage', $matches[1]);
00095 XMLCustomWriter::createChildWithText($doc, $root, 'endPage', $matches[1]);
00096 }
00097
00098
00099 XMLCustomWriter::createChildWithText($doc, $root, 'publisherRecordId', $article->getPubId(), false);
00100
00101 XMLCustomWriter::createChildWithText($doc, $root, 'documentType', $article->getArticleType(), false);
00102
00103
00104 foreach ((array) $article->getTitle(null) as $locale => $title) {
00105 if (empty($title)) continue;
00106
00107 $titleNode =& XMLCustomWriter::createChildWithText($doc, $root, 'title', $title);
00108 if (strlen($locale) == 5) XMLCustomWriter::setAttribute($titleNode, 'language', DOAJExportDom::mapLang(String::substr($locale, 0, 2)));
00109 }
00110
00111
00112 $authors =& XMLCustomWriter::createElement($doc, 'authors');
00113 XMLCustomWriter::appendChild($root, $authors);
00114
00115 foreach ($article->getAuthors() as $author) {
00116 $authorNode =& DOAJExportDom::generateAuthorDom($doc, $root, $issue, $article, $author);
00117 XMLCustomWriter::appendChild($authors, $authorNode);
00118 unset($authorNode);
00119 }
00120
00121
00122 foreach ((array) $article->getAbstract(null) as $locale => $abstract) {
00123 if (empty($abstract)) continue;
00124
00125 $abstractNode =& XMLCustomWriter::createChildWithText($doc, $root, 'abstract', $abstract);
00126 if (strlen($locale) == 5) XMLCustomWriter::setAttribute($abstractNode, 'language', DOAJExportDom::mapLang(String::substr($locale, 0, 2)));
00127 }
00128
00129
00130 $fullTextUrl =& XMLCustomWriter::createChildWithText($doc, $root, 'fullTextUrl', Request::url(null, 'article', 'view', $article->getArticleId()));
00131 XMLCustomWriter::setAttribute($fullTextUrl, 'format', 'html');
00132
00133
00134 $keywords =& XMLCustomWriter::createElement($doc, 'keywords');
00135 XMLCustomWriter::appendChild($root, $keywords);
00136
00137 $subjects = array_map('trim', explode(';', $article->getArticleSubject()));
00138
00139 foreach ($subjects as $keyword) {
00140 XMLCustomWriter::createChildWithText($doc, $keywords, 'keyword', $keyword, false);
00141 }
00142
00143 return $root;
00144 }
00145
00154 function &generateAuthorDom(&$doc, &$journal, &$issue, &$article, &$author) {
00155 $root =& XMLCustomWriter::createElement($doc, 'author');
00156
00157 XMLCustomWriter::createChildWithText($doc, $root, 'name', $author->getFullName());
00158 XMLCustomWriter::createChildWithText($doc, $root, 'email', $author->getEmail(), false);
00159 XMLCustomWriter::createChildWithText($doc, $root, 'affiliation', $author->getAffiliation(), false);
00160
00161 return $root;
00162 }
00163
00164
00165
00171 function file_ext($filename) {
00172 return strtolower(str_replace(".", "", strrchr($filename, ".")));
00173 }
00174
00180 function formatDate($date) {
00181 if ($date == '') return null;
00182 return date('Y-m-d', strtotime($date));
00183 }
00184
00192 function mapLang($val) {
00193 switch ($val) {
00194 case "aa": return "aar"; break;
00195 case "ab": return "abk"; break;
00196 case "af": return "afr"; break;
00197 case "ak": return "aka"; break;
00198 case "sq": return "alb"; break;
00199 case "sqi": return "alb"; break;
00200 case "am": return "amh"; break;
00201 case "ar": return "ara"; break;
00202 case "an": return "arg"; break;
00203 case "hy": return "arm"; break;
00204 case "hye": return "arm"; break;
00205 case "as": return "asm"; break;
00206 case "av": return "ava"; break;
00207 case "ae": return "ave"; break;
00208 case "ay": return "aym"; break;
00209 case "az": return "aze"; break;
00210 case "ba": return "bak"; break;
00211 case "bm": return "bam"; break;
00212 case "eu": return "baq"; break;
00213 case "eus": return "baq"; break;
00214 case "be": return "bel"; break;
00215 case "bn": return "ben"; break;
00216 case "bh": return "bih"; break;
00217 case "bi": return "bis"; break;
00218 case "bo": return "tib"; break;
00219 case "bod": return "tib"; break;
00220 case "bs": return "bos"; break;
00221 case "br": return "bre"; break;
00222 case "bg": return "bul"; break;
00223 case "my": return "bur"; break;
00224 case "mya": return "bur"; break;
00225 case "ca": return "cat"; break;
00226 case "cs": return "cze"; break;
00227 case "ces": return "cze"; break;
00228 case "ch": return "cha"; break;
00229 case "ce": return "che"; break;
00230 case "zh": return "chi"; break;
00231 case "zho": return "chi"; break;
00232 case "cv": return "chv"; break;
00233 case "kw": return "cor"; break;
00234 case "co": return "cos"; break;
00235 case "cr": return "cre"; break;
00236 case "cy": return "wel"; break;
00237 case "cym": return "wel"; break;
00238 case "da": return "dan"; break;
00239 case "de": return "ger"; break;
00240 case "deu": return "ger"; break;
00241 case "dv": return "div"; break;
00242 case "nl": return "dut"; break;
00243 case "nld": return "dut"; break;
00244 case "dz": return "dzo"; break;
00245 case "el": return "gre"; break;
00246 case "ell": return "gre"; break;
00247 case "en": return "eng"; break;
00248 case "eo": return "epo"; break;
00249 case "et": return "est"; break;
00250 case "ee": return "ewe"; break;
00251 case "fo": return "fao"; break;
00252 case "fa": return "per"; break;
00253 case "fas": return "per"; break;
00254 case "fj": return "fij"; break;
00255 case "fi": return "fin"; break;
00256 case "fr": return "fre"; break;
00257 case "fra": return "fre"; break;
00258 case "fy": return "fry"; break;
00259 case "ff": return "ful"; break;
00260 case "ka": return "geo"; break;
00261 case "kat": return "geo"; break;
00262 case "gd": return "gla"; break;
00263 case "ga": return "gle"; break;
00264 case "gl": return "glg"; break;
00265 case "gv": return "glv"; break;
00266 case "gn": return "grn"; break;
00267 case "gu": return "guj"; break;
00268 case "ht": return "hat"; break;
00269 case "ha": return "hau"; break;
00270 case "he": return "heb"; break;
00271 case "hz": return "her"; break;
00272 case "hi": return "hin"; break;
00273 case "ho": return "hmo"; break;
00274 case "hr": return "scr"; break;
00275 case "hrv": return "scr"; break;
00276 case "hu": return "hun"; break;
00277 case "ig": return "ibo"; break;
00278 case "is": return "ice"; break;
00279 case "isl": return "ice"; break;
00280 case "io": return "ido"; break;
00281 case "ii": return "iii"; break;
00282 case "iu": return "iku"; break;
00283 case "ie": return "ile"; break;
00284 case "ia": return "ina"; break;
00285 case "id": return "ind"; break;
00286 case "ik": return "ipk"; break;
00287 case "it": return "ita"; break;
00288 case "jv": return "jav"; break;
00289 case "ja": return "jpn"; break;
00290 case "kl": return "kal"; break;
00291 case "kn": return "kan"; break;
00292 case "ks": return "kas"; break;
00293 case "kr": return "kau"; break;
00294 case "kk": return "kaz"; break;
00295 case "km": return "khm"; break;
00296 case "ki": return "kik"; break;
00297 case "rw": return "kin"; break;
00298 case "ky": return "kir"; break;
00299 case "kv": return "kom"; break;
00300 case "kg": return "kon"; break;
00301 case "ko": return "kor"; break;
00302 case "kj": return "kua"; break;
00303 case "ku": return "kur"; break;
00304 case "lo": return "lao"; break;
00305 case "la": return "lat"; break;
00306 case "lv": return "lav"; break;
00307 case "li": return "lim"; break;
00308 case "ln": return "lin"; break;
00309 case "lt": return "lit"; break;
00310 case "lb": return "ltz"; break;
00311 case "lu": return "lub"; break;
00312 case "lg": return "lug"; break;
00313 case "mk": return "mac"; break;
00314 case "mkd": return "mac"; break;
00315 case "mh": return "mah"; break;
00316 case "ml": return "mal"; break;
00317 case "mi": return "mao"; break;
00318 case "mri": return "mao"; break;
00319 case "mr": return "mar"; break;
00320 case "ms": return "may"; break;
00321 case "msa": return "may"; break;
00322 case "mg": return "mlg"; break;
00323 case "mt": return "mlt"; break;
00324 case "mo": return "mol"; break;
00325 case "mn": return "mon"; break;
00326 case "na": return "nau"; break;
00327 case "nv": return "nav"; break;
00328 case "nr": return "nbl"; break;
00329 case "nd": return "nde"; break;
00330 case "ng": return "ndo"; break;
00331 case "ne": return "nep"; break;
00332 case "nn": return "nno"; break;
00333 case "nb": return "nob"; break;
00334 case "no": return "nor"; break;
00335 case "ny": return "nya"; break;
00336 case "oc": return "oci"; break;
00337 case "oj": return "oji"; break;
00338 case "or": return "ori"; break;
00339 case "om": return "orm"; break;
00340 case "os": return "oss"; break;
00341 case "pa": return "pan"; break;
00342 case "pi": return "pli"; break;
00343 case "pl": return "pol"; break;
00344 case "pt": return "por"; break;
00345 case "ps": return "pus"; break;
00346 case "qu": return "que"; break;
00347 case "rm": return "roh"; break;
00348 case "ro": return "rum"; break;
00349 case "ron": return "rum"; break;
00350 case "rn": return "run"; break;
00351 case "ru": return "rus"; break;
00352 case "sg": return "sag"; break;
00353 case "sa": return "san"; break;
00354 case "sr": return "scc"; break;
00355 case "srp": return "scc"; break;
00356 case "si": return "sin"; break;
00357 case "sk": return "slo"; break;
00358 case "slk": return "slo"; break;
00359 case "sl": return "slv"; break;
00360 case "se": return "sme"; break;
00361 case "sm": return "smo"; break;
00362 case "sn": return "sna"; break;
00363 case "sd": return "snd"; break;
00364 case "so": return "som"; break;
00365 case "st": return "sot"; break;
00366 case "es": return "spa"; break;
00367 case "sc": return "srd"; break;
00368 case "ss": return "ssw"; break;
00369 case "su": return "sun"; break;
00370 case "sw": return "swa"; break;
00371 case "sv": return "swe"; break;
00372 case "ty": return "tah"; break;
00373 case "ta": return "tam"; break;
00374 case "tt": return "tat"; break;
00375 case "te": return "tel"; break;
00376 case "tg": return "tgk"; break;
00377 case "tl": return "tgl"; break;
00378 case "th": return "tha"; break;
00379 case "ti": return "tir"; break;
00380 case "to": return "ton"; break;
00381 case "tn": return "tsn"; break;
00382 case "ts": return "tso"; break;
00383 case "tk": return "tuk"; break;
00384 case "tr": return "tur"; break;
00385 case "tw": return "twi"; break;
00386 case "ug": return "uig"; break;
00387 case "uk": return "ukr"; break;
00388 case "ur": return "urd"; break;
00389 case "uz": return "uzb"; break;
00390 case "ve": return "ven"; break;
00391 case "vi": return "vie"; break;
00392 case "vo": return "vol"; break;
00393 case "wa": return "wln"; break;
00394 case "wo": return "wol"; break;
00395 case "xh": return "xho"; break;
00396 case "yi": return "yid"; break;
00397 case "yo": return "yor"; break;
00398 case "za": return "zha"; break;
00399 case "zu": return "zul"; break;
00400 default: return "";
00401 }
00402 }
00403 }
00404
00405 ?>