コード例 #1
0
ファイル: modsxml.inc.php プロジェクト: Olari0/Finugriling
function modsRecord($row)
{
    global $databaseBaseURL;
    // these variables are defined in 'ini.inc.php'
    global $contentTypeCharset;
    global $fileVisibility;
    global $fileVisibilityException;
    global $filesBaseURL;
    global $convertExportDataToUTF8;
    // defined in 'transtab_unicode_charset.inc.php' and 'transtab_latin1_charset.inc.php'
    global $alnum, $alpha, $cntrl, $dash, $digit, $graph, $lower, $print, $punct, $space, $upper, $word, $patternModifiers;
    $exportPrivate = True;
    // This will be a global variable or will be used
    // when modsRow is called and will determine if we
    // export user-specific data
    $exportRecordURL = True;
    // Specifies whether an attribution string containing
    // the URL to the refbase database record (and the last
    // modification date) shall be written to the notes branch.
    // Note that this string is required by the "-A|--append"
    // feature of the 'refbase' command line client
    // convert this record's modified date/time info to UNIX time stamp format:
    // => "date('D, j M Y H:i:s O')", e.g. "Sat, 15 Jul 2006 22:24:16 +0200"
    // function 'generateRFC2822TimeStamp()' is defined in 'include.inc.php'
    $currentDateTimeStamp = generateRFC2822TimeStamp($row['modified_date'], $row['modified_time']);
    // --- BEGIN TYPE * ---
    //   |
    //   | These apply to everything
    // this is a stupid hack that maps the names of the '$row' array keys to those used
    // by the '$formVars' array (which is required by function 'generateCiteKey()')
    // (eventually, the '$formVars' array should use the MySQL field names as names for its array keys)
    $formVars = buildFormVarsArray($row);
    // function 'buildFormVarsArray()' is defined in 'include.inc.php'
    // generate or extract the cite key for this record
    // (note that charset conversion can only be done *after* the cite key has been generated,
    //  otherwise cite key generation will produce garbled text!)
    $citeKey = generateCiteKey($formVars);
    // function 'generateCiteKey()' is defined in 'include.inc.php'
    // Create an XML object for a single record.
    $record = new XML("mods");
    $record->setTagAttribute("version", "3.2");
    if (!empty($citeKey)) {
        $record->setTagAttribute("ID", $citeKey);
    }
    // titleInfo
    //   Regular Title
    if (!empty($row['title'])) {
        $record->setTagContent(encodeXMLField('title', $row['title']), "mods/titleInfo/title");
    }
    //   Translated Title
    //   NOTE: This field is excluded by the default cite SELECT method
    if (!empty($row['orig_title'])) {
        $orig_title = new XMLBranch("titleInfo");
        $orig_title->setTagAttribute("type", "translated");
        $orig_title->setTagContent(encodeXMLField('orig_title', $row['orig_title']), "titleInfo/title");
        $record->addXMLBranch($orig_title);
    }
    // name
    //   author
    if (!empty($row['author'])) {
        if (preg_match("/ *\\(eds?\\)\$/", $row['author'])) {
            $author = preg_replace("/[ \r\n]*\\(eds?\\)/i", "", $row['author']);
            $nameArray = separateNames("author", "/\\s*;\\s*/", "/\\s*,\\s*/", "/(?<=^|[{$word}])[^-{$word}]+|(?<=^|[{$upper}])(?=\$|[{$upper}])/{$patternModifiers}", $author, "personal", "editor");
        } else {
            if ($row['type'] == "Map") {
                $nameArray = separateNames("author", "/\\s*;\\s*/", "/\\s*,\\s*/", "/(?<=^|[{$word}])[^-{$word}]+|(?<=^|[{$upper}])(?=\$|[{$upper}])/{$patternModifiers}", $row['author'], "personal", "cartographer");
            } else {
                $nameArray = separateNames("author", "/\\s*;\\s*/", "/\\s*,\\s*/", "/(?<=^|[{$word}])[^-{$word}]+|(?<=^|[{$upper}])(?=\$|[{$upper}])/{$patternModifiers}", $row['author'], "personal", "author");
            }
        }
        foreach ($nameArray as $singleName) {
            $record->addXMLBranch($singleName);
        }
    }
    // originInfo
    if (!empty($row['year']) || !empty($row['publisher']) || !empty($row['place'])) {
        $origin = new XMLBranch("originInfo");
        // dateIssued
        if (!empty($row['year'])) {
            $origin->setTagContent(encodeXMLField('year', $row['year']), "originInfo/dateIssued");
        }
        // Book Chapters and Journal Articles only have a dateIssued
        // (editions, places, and publishers are associated with the host)
        if (!preg_match("/^(Book Chapter|Journal Article)\$/", $row['type'])) {
            // publisher
            if (!empty($row['publisher'])) {
                $origin->setTagContent(encodeXMLField('publisher', $row['publisher']), "originInfo/publisher");
            }
            // place
            if (!empty($row['place'])) {
                $origin->setTagContent(encodeXMLField('place', $row['place']), "originInfo/place/placeTerm");
                $origin->setTagAttribute("type", "text", "originInfo/place/placeTerm");
            }
            // edition
            if (!empty($row['edition'])) {
                $origin->setTagContent(encodeXMLField('edition', $row['edition']), "originInfo/edition");
            }
        }
        if ($origin->hasBranch()) {
            $record->addXMLBranch($origin);
        }
    }
    // language
    if (!empty($row['language'])) {
        $record->setTagContent(encodeXMLField('language', $row['language']), "mods/language");
    }
    // abstract
    // NOTE: This field is excluded by the default cite SELECT method
    if (!empty($row['abstract'])) {
        $abstract = new XMLBranch("abstract");
        $abstract->setTagContent(encodeXMLField('abstract', $row['abstract']));
        if (!empty($row['summary_language'])) {
            $abstract->setTagAttribute("lang", encodeXMLField('summary_language', $row['summary_language']));
        }
        $record->addXMLBranch($abstract);
    }
    // subject
    //   keywords
    if (!empty($row['keywords'])) {
        $subjectArray = array();
        $subjectArray = preg_split("/\\s*;\\s*/", $row['keywords']);
        // "unrelated" keywords
        foreach ($subjectArray as $singleSubject) {
            $subjectBranch = new XMLBranch("subject");
            $topicArray = array();
            $topicArray = preg_split("/\\s*,\\s*/", $singleSubject);
            // "related" keywords
            foreach ($topicArray as $singleTopic) {
                $topicBranch = new XMLBranch("topic");
                $topicBranch->setTagContent(encodeXMLField('keywords', $singleTopic));
                $subjectBranch->addXMLBranch($topicBranch);
            }
            $record->addXMLBranch($subjectBranch);
        }
    }
    //   user_keys
    //   NOTE: a copy of the above.  Needs to be a separate function later.
    if (!empty($row['user_keys']) && $exportPrivate) {
        $subjectArray = array();
        $subjectArray = preg_split("/\\s*;\\s*/", $row['user_keys']);
        // "unrelated" user_keys
        foreach ($subjectArray as $singleSubject) {
            $subjectBranch = new XMLBranch("subject");
            $topicArray = array();
            $topicArray = preg_split("/\\s*,\\s*/", $singleSubject);
            // "related" user_keys
            foreach ($topicArray as $singleTopic) {
                $topicBranch = new XMLBranch("topic");
                $topicBranch->setTagContent(encodeXMLField('user_keys', $singleTopic));
                $subjectBranch->addXMLBranch($topicBranch);
            }
            $record->addXMLBranch($subjectBranch);
        }
    }
    //   user_groups
    //   NOTE: a copy of the above.  Needs to be a separate function later.
    if (!empty($row['user_groups']) && $exportPrivate) {
        $subjectArray = array();
        $subjectArray = preg_split("/\\s*;\\s*/", $row['user_groups']);
        // "unrelated" user_groups
        foreach ($subjectArray as $singleSubject) {
            $subjectBranch = new XMLBranch("subject");
            $topicArray = array();
            $topicArray = preg_split("/\\s*,\\s*/", $singleSubject);
            // "related" user_groups
            foreach ($topicArray as $singleTopic) {
                $topicBranch = new XMLBranch("topic");
                $topicBranch->setTagContent(encodeXMLField('user_groups', $singleTopic));
                $subjectBranch->addXMLBranch($topicBranch);
            }
            $record->addXMLBranch($subjectBranch);
        }
    }
    // notes
    if (!empty($row['notes'])) {
        $record->setTagContent(encodeXMLField('notes', $row['notes']), "mods/note");
    }
    // user_notes
    if (!empty($row['user_notes']) && $exportPrivate) {
        // replaces any generic notes
        $record->setTagContent(encodeXMLField('user_notes', $row['user_notes']), "mods/note");
    }
    // refbase attribution string
    if ($exportRecordURL) {
        $attributionBranch = new XMLBranch("note");
        $attributionBranch->setTagContent("exported from refbase (" . $databaseBaseURL . "show.php?record=" . $row['serial'] . "), last updated on " . $currentDateTimeStamp);
        $record->addXMLBranch($attributionBranch);
    }
    // typeOfResource
    // maps are 'cartographic', software is 'software, multimedia',
    // and everything else is 'text'
    $type = new XMLBranch("typeOfResource");
    if ($row['type'] == "Map") {
        $type->setTagContent("cartographic");
    } else {
        if ($row['type'] == "Software") {
            $type->setTagContent("software, multimedia");
        } else {
            $type->setTagContent("text");
        }
    }
    if ($row['type'] == "Manuscript") {
        $type->setTagAttribute("manuscript", "yes");
    }
    $record->addXMLBranch($type);
    // location
    //   Physical Location
    //   NOTE: This field is excluded by the default cite SELECT method
    //         This should also be parsed later
    if (!empty($row['location'])) {
        $location = new XMLBranch("location");
        $locationArray = array();
        $locationArray = preg_split("/\\s*;\\s*/", $row['location']);
        foreach ($locationArray as $singleLocation) {
            $locationBranch = new XMLBranch("physicalLocation");
            $locationBranch->setTagContent(encodeXMLField('location', $singleLocation));
            $location->addXMLBranch($locationBranch);
        }
        $record->addXMLBranch($location);
    }
    //   URL (also an identifier, see below)
    //   NOTE: This field is excluded by the default cite SELECT method
    if (!empty($row['url'])) {
        $location = new XMLBranch("location");
        $location->setTagContent(encodeXMLField('url', $row['url']), "location/url");
        $record->addXMLBranch($location);
    }
    // Include a link to any corresponding FILE if one of the following conditions is met:
    // - the variable '$fileVisibility' (defined in 'ini.inc.php') is set to 'everyone'
    // - the variable '$fileVisibility' is set to 'login' AND the user is logged in
    // - the variable '$fileVisibility' is set to 'user-specific' AND the 'user_permissions' session variable contains 'allow_download'
    // - the array variable '$fileVisibilityException' (defined in 'ini.inc.php') contains a pattern (in array element 1) that matches the contents of the field given (in array element 0)
    if ($fileVisibility == "everyone" or $fileVisibility == "login" and isset($_SESSION['loginEmail']) or $fileVisibility == "user-specific" and (isset($_SESSION['user_permissions']) and preg_match("/allow_download/", $_SESSION['user_permissions'])) or !empty($fileVisibilityException) and preg_match($fileVisibilityException[1], $row[$fileVisibilityException[0]])) {
        //   file
        //   Note that when converting MODS to Endnote or RIS, Bibutils will include the above
        //   URL (if given), otherwise it'll take the URL from the 'file' field. I.e. for
        //   Endnote or RIS, the URL to the PDF is only included if no regular URL is available.
        if (!empty($row['file'])) {
            $location = new XMLBranch("location");
            if (preg_match('#^(https?|ftp|file)://#i', $row['file'])) {
                // if the 'file' field contains a full URL (starting with "http://", "https://",  "ftp://", or "file://")
                $URLprefix = "";
                // we don't alter the URL given in the 'file' field
            } else {
                // if the 'file' field contains only a partial path (like 'polarbiol/10240001.pdf') or just a file name (like '10240001.pdf')
                // use the base URL of the standard files directory as prefix:
                if (preg_match('#^/#', $filesBaseURL)) {
                    // absolute path -> file dir is located outside of refbase root dir
                    $URLprefix = 'http://' . $_SERVER['HTTP_HOST'] . $filesBaseURL;
                } else {
                    // relative path -> file dir is located within refbase root dir
                    $URLprefix = $databaseBaseURL . $filesBaseURL;
                }
            }
            $location->setTagContent(encodeXMLField('file', $URLprefix . $row['file']), "location/url");
            $location->setTagAttribute("displayLabel", "Electronic full text", "location/url");
            // the 'access' attribute requires MODS v3.2 or greater:
            $location->setTagAttribute("access", "raw object", "location/url");
            $record->addXMLBranch($location);
        }
    }
    // identifier
    //   url
    if (!empty($row['url'])) {
        $identifier = new XMLBranch("identifier");
        $identifier->setTagContent(encodeXMLField('url', $row['url']));
        $identifier->setTagAttribute("type", "uri");
        $record->addXMLBranch($identifier);
    }
    //   doi
    if (!empty($row['doi'])) {
        $identifier = new XMLBranch("identifier");
        $identifier->setTagContent(encodeXMLField('doi', $row['doi']));
        $identifier->setTagAttribute("type", "doi");
        $record->addXMLBranch($identifier);
    }
    //   pubmed
    //   NOTE: Until refbase stores PubMed & arXiv IDs in a better way,
    //         we extract them from the 'notes' field
    if (preg_match("/PMID *: *\\d+/i", $row['notes'])) {
        $identifier = new XMLBranch("identifier");
        $identifier->setTagContent(preg_replace("/.*?PMID *: *(\\d+).*/i", "\\1", $row['notes']));
        $identifier->setTagAttribute("type", "pubmed");
        $record->addXMLBranch($identifier);
    }
    //   arxiv
    //   NOTE: see note for pubmed
    if (preg_match("/arXiv *: *[^ ;]+/i", $row['notes'])) {
        $identifier = new XMLBranch("identifier");
        $identifier->setTagContent(preg_replace("/.*?arXiv *: *([^ ;]+).*/i", "\\1", $row['notes']));
        $identifier->setTagAttribute("type", "arxiv");
        $record->addXMLBranch($identifier);
    }
    //   cite_key
    if (!empty($citeKey)) {
        $identifier = new XMLBranch("identifier");
        $identifier->setTagContent(encodeXMLField('cite_key', $citeKey));
        $identifier->setTagAttribute("type", "citekey");
        $record->addXMLBranch($identifier);
    }
    //   local--CALL NUMBER
    //   NOTE: This should really be parsed!
    if (!empty($row['call_number'])) {
        $identifierArray = array();
        $identifierArray = preg_split("/\\s*;\\s*/", $row['call_number']);
        foreach ($identifierArray as $singleIdentifier) {
            if (!preg_match("/@\\s*\$/", $singleIdentifier)) {
                $identifierBranch = new XMLBranch("identifier");
                $identifierBranch->setTagContent(encodeXMLField('call_number', $singleIdentifier));
                $identifierBranch->setTagAttribute("type", "local");
                $record->addXMLBranch($identifierBranch);
            }
        }
    }
    // --- END TYPE * ---
    // -----------------------------------------
    // --- BEGIN TYPE != ABSTRACT || BOOK CHAPTER || CONFERENCE ARTICLE || JOURNAL ARTICLE || MAGAZINE ARTICLE || NEWSPAPER ARTICLE ---
    //   |
    //   | BOOK WHOLE, CONFERENCE VOLUME, JOURNAL, MANUAL, MANUSCRIPT, MAP, MISCELLANEOUS, PATENT,
    //   | REPORT, and SOFTWARE have some info as a branch off the root, whereas ABSTRACT, BOOK CHAPTER,
    //   | CONFERENCE ARTICLE, JOURNAL ARTICLE, MAGAZINE ARTICLE and NEWSPAPER ARTICLE place it in the relatedItem branch.
    if (!preg_match("/^(Abstract|Book Chapter|Conference Article|Journal Article|Magazine Article|Newspaper Article)\$/", $row['type'])) {
        // name
        //   editor
        if (!empty($row['editor'])) {
            $editor = $row['editor'];
            $author = $row['author'];
            if (preg_match("/ *\\(eds?\\)\$/", $editor)) {
                $editor = preg_replace("/[ \r\n]*\\(eds?\\)/i", "", $editor);
            }
            if (preg_match("/ *\\(eds?\\)\$/", $author)) {
                $author = preg_replace("/[ \r\n]*\\(eds?\\)/i", "", $author);
            }
            if ($editor != $author) {
                $nameArray = separateNames("editor", "/\\s*;\\s*/", "/\\s*,\\s*/", "/(?<=^|[{$word}])[^-{$word}]+|(?<=^|[{$upper}])(?=\$|[{$upper}])/{$patternModifiers}", $editor, "personal", "editor");
                foreach ($nameArray as $singleName) {
                    $record->addXMLBranch($singleName);
                }
            }
        }
        //   corporate
        //   (we treat a 'corporate_author' similar to how Bibutils converts the BibTeX
        //   'organization' field to MODS XML, i.e., we add a separate name element with
        //    a 'type="corporate"' attribute and an 'author' role (or a 'degree grantor'
        //    role in case of theses))
        if (!empty($row['corporate_author'])) {
            $nameBranch = new XMLBranch("name");
            $nameBranch->setTagAttribute("type", "corporate");
            $nameBranch->setTagContent(encodeXMLField('corporate_author', $row['corporate_author']), "name/namePart");
            if (empty($row['thesis'])) {
                $nameBranch->setTagContent("author", "name/role/roleTerm");
            } else {
                // thesis
                $nameBranch->setTagContent("degree grantor", "name/role/roleTerm");
            }
            $nameBranch->setTagAttribute("authority", "marcrelator", "name/role/roleTerm");
            $nameBranch->setTagAttribute("type", "text", "name/role/roleTerm");
            $record->addXMLBranch($nameBranch);
        }
        //   conference
        if (!empty($row['conference'])) {
            $nameBranch = new XMLBranch("name");
            $nameBranch->setTagAttribute("type", "conference");
            $nameBranch->setTagContent(encodeXMLField('conference', $row['conference']), "name/namePart");
            $record->addXMLBranch($nameBranch);
        }
        // genre
        //   type
        //      NOTE: Is there a better MARC genre[1] for 'manuscript?'
        //            [1]<http://www.loc.gov/marc/sourcecode/genre/genrelist.html>
        $genremarc = new XMLBranch("genre");
        $genre = new XMLBranch("genre");
        //      NOTE: According to the MARC "Source Codes for Genre"[1]
        //            the MARC authority should be 'marcgt', not 'marc'.
        //            [1]<http://www.loc.gov/marc/sourcecode/genre/genresource.html>
        $genremarc->setTagAttribute("authority", "marcgt");
        if (empty($row['thesis'])) {
            // theses will get their own genre (see below)
            if ($row['type'] == "Book Whole") {
                $record->setTagContent("monographic", "mods/originInfo/issuance");
                $genremarc->setTagContent("book");
            } else {
                if ($row['type'] == "Conference Volume") {
                    $genremarc->setTagContent("conference publication");
                } else {
                    if ($row['type'] == "Journal") {
                        $genremarc->setTagContent("periodical");
                        $genre->setTagContent("academic journal");
                    } else {
                        if ($row['type'] == "Manual") {
                            // should we set '<issuance>monographic' here (and for the ones below)?
                            $genremarc->setTagContent("instruction");
                            $genre->setTagContent("manual");
                        } else {
                            if ($row['type'] == "Manuscript") {
                                $genremarc->setTagContent("loose-leaf");
                                $genre->setTagContent("manuscript");
                            } else {
                                if ($row['type'] == "Map") {
                                    $genremarc->setTagContent("map");
                                } else {
                                    if ($row['type'] == "Miscellaneous") {
                                        $genre->setTagContent("miscellaneous");
                                    } else {
                                        if ($row['type'] == "Patent") {
                                            $genremarc->setTagContent("patent");
                                        } else {
                                            if ($row['type'] == "Report") {
                                                $genremarc->setTagContent("technical report");
                                                $genre->setTagContent("report");
                                            } else {
                                                if ($row['type'] == "Software") {
                                                    //        $genremarc->setTagContent("programmed text"); // would this be correct?
                                                    $genre->setTagContent("software");
                                                } else {
                                                    if (!empty($row['type'])) {
                                                        // catch-all: don't use a MARC genre
                                                        $genre->setTagContent(encodeXMLField('type', $row['type']));
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            if ($genremarc->hasLeaf()) {
                $record->addXMLBranch($genremarc);
            }
            if ($genre->hasLeaf()) {
                $record->addXMLBranch($genre);
            }
        } else {
            // if (!empty($row['thesis']))
            $record->setTagContent("monographic", "mods/originInfo/issuance");
            $thesismarc = new XMLBranch("genre");
            $thesis = new XMLBranch("genre");
            $thesismarc->setTagContent("thesis");
            $thesismarc->setTagAttribute("authority", "marcgt");
            // tweak thesis names so that Bibutils will recognize them:
            if ($row['thesis'] == "Master's thesis") {
                $row['thesis'] = "Masters thesis";
            }
            $thesis->setTagContent(encodeXMLField('thesis', $row['thesis']));
            $record->addXMLBranch($thesismarc);
            $record->addXMLBranch($thesis);
        }
        // physicalDescription
        //   pages
        if (!empty($row['pages'])) {
            $description = new XMLBranch("physicalDescription");
            $pages = new XMLBranch("extent");
            $pages->setTagAttribute("unit", "pages");
            if (preg_match("/[0-9] *- *[0-9]/", $row['pages'])) {
                // if a page range
                // split the page range into start and end pages
                list($pagestart, $pageend) = preg_split('/\\s*[-]\\s*/', $row['pages']);
                if ($pagestart < $pageend) {
                    // extents MUST span multiple pages
                    $pages->setTagContent(encodeXMLField('pages', $pagestart), "extent/start");
                    $pages->setTagContent(encodeXMLField('pages', $pageend), "extent/end");
                } else {
                    $pages->setTagContent(encodeXMLField('pages', $row['pages']));
                }
            } else {
                if (preg_match("/^\\d\\d*\\s*pp?.?\$/", $row['pages'])) {
                    list($pagetotal) = preg_split('/\\s*pp?/', $row['pages']);
                    $pages->setTagContent(encodeXMLField('pages', $pagetotal), "extent/total");
                } else {
                    $pages->setTagContent(encodeXMLField('pages', $row['pages']));
                }
            }
            $description->addXMLBranch($pages);
            $record->addXMLBranch($description);
        }
        // identifier
        //   isbn
        if (!empty($row['isbn'])) {
            $identifier = new XMLBranch("identifier");
            $identifier->setTagContent(encodeXMLField('isbn', $row['isbn']));
            $identifier->setTagAttribute("type", "isbn");
            $record->addXMLBranch($identifier);
        }
        //   issn
        if (!empty($row['issn'])) {
            $identifier = new XMLBranch("identifier");
            $identifier->setTagContent(encodeXMLField('issn', $row['issn']));
            $identifier->setTagAttribute("type", "issn");
            $record->addXMLBranch($identifier);
        }
        // series
        if (!empty($row['series_editor']) || !empty($row['series_title']) || !empty($row['abbrev_series_title']) || !empty($row['series_volume']) || !empty($row['series_issue'])) {
            $record->addXMLBranch(serialBranch($row['series_editor'], $row['series_title'], $row['abbrev_series_title'], $row['series_volume'], $row['series_issue']));
        }
    } else {
        // if (preg_match("/^(Abstract|Book Chapter|Conference Article|Journal Article|Magazine Article|Newspaper Article)$/", $row['type']))
        // relatedItem
        $related = new XMLBranch("relatedItem");
        $related->setTagAttribute("type", "host");
        // title (Publication)
        if (!empty($row['publication'])) {
            $related->setTagContent(encodeXMLField('publication', $row['publication']), "relatedItem/titleInfo/title");
        }
        // title (Abbreviated Journal)
        if (!empty($row['abbrev_journal'])) {
            $titleabbrev = new XMLBranch("titleInfo");
            $titleabbrev->setTagAttribute("type", "abbreviated");
            $titleabbrev->setTagContent(encodeXMLField('abbrev_journal', $row['abbrev_journal']), "titleInfo/title");
            $related->addXMLBranch($titleabbrev);
        }
        // name
        //   editor
        if (!empty($row['editor'])) {
            $editor = $row['editor'];
            if (preg_match("/ *\\(eds?\\)\$/", $editor)) {
                $editor = preg_replace("/[ \r\n]*\\(eds?\\)/i", "", $editor);
            }
            $nameArray = separateNames("editor", "/\\s*;\\s*/", "/\\s*,\\s*/", "/(?<=^|[{$word}])[^-{$word}]+|(?<=^|[{$upper}])(?=\$|[{$upper}])/{$patternModifiers}", $editor, "personal", "editor");
            foreach ($nameArray as $singleName) {
                $related->addXMLBranch($singleName);
            }
        }
        //   corporate
        //   NOTE: a copy of the code for 'corporate_author' above.
        //         Needs to be a separate function later.
        if (!empty($row['corporate_author'])) {
            $nameBranch = new XMLBranch("name");
            $nameBranch->setTagAttribute("type", "corporate");
            $nameBranch->setTagContent(encodeXMLField('corporate_author', $row['corporate_author']), "name/namePart");
            if (empty($row['thesis'])) {
                $nameBranch->setTagContent("author", "name/role/roleTerm");
            } else {
                // thesis
                $nameBranch->setTagContent("degree grantor", "name/role/roleTerm");
            }
            $nameBranch->setTagAttribute("authority", "marcrelator", "name/role/roleTerm");
            $nameBranch->setTagAttribute("type", "text", "name/role/roleTerm");
            $related->addXMLBranch($nameBranch);
        }
        //   conference
        //   NOTE: a copy of the code for 'conference' above.
        //         Needs to be a separate function later.
        if (!empty($row['conference'])) {
            $nameBranch = new XMLBranch("name");
            $nameBranch->setTagAttribute("type", "conference");
            $nameBranch->setTagContent(encodeXMLField('conference', $row['conference']), "name/namePart");
            $related->addXMLBranch($nameBranch);
        }
        // originInfo
        $relorigin = new XMLBranch("originInfo");
        // dateIssued
        if (!empty($row['year'])) {
            $relorigin->setTagContent(encodeXMLField('year', $row['year']), "originInfo/dateIssued");
        }
        // publisher
        if (!empty($row['publisher'])) {
            $relorigin->setTagContent(encodeXMLField('publisher', $row['publisher']), "originInfo/publisher");
        }
        // place
        if (!empty($row['place'])) {
            $relorigin->setTagContent(encodeXMLField('place', $row['place']), "originInfo/place/placeTerm");
            $relorigin->setTagAttribute("type", "text", "originInfo/place/placeTerm");
        }
        // edition
        if (!empty($row['edition'])) {
            $relorigin->setTagContent(encodeXMLField('edition', $row['edition']), "originInfo/edition");
        }
        if ($relorigin->hasBranch()) {
            $related->addXMLBranch($relorigin);
        }
        // genre (and originInfo/issuance)
        if (empty($row['thesis'])) {
            // theses will get their own genre (see below)
            if (preg_match("/^(Journal Article|Magazine Article)\$/", $row['type'])) {
                $related->setTagContent("continuing", "relatedItem/originInfo/issuance");
                $genremarc = new XMLBranch("genre");
                $genre = new XMLBranch("genre");
                $genremarc->setTagContent("periodical");
                $genremarc->setTagAttribute("authority", "marcgt");
                if ($row['type'] == "Magazine Article") {
                    $genre->setTagContent("magazine");
                } else {
                    $genre->setTagContent("academic journal");
                }
                $related->addXMLBranch($genremarc);
                $related->addXMLBranch($genre);
            } else {
                if ($row['type'] == "Abstract") {
                    $record->setTagContent("abstract or summary", "mods/genre");
                    $record->setTagAttribute("authority", "marcgt", "mods/genre");
                } else {
                    if ($row['type'] == "Conference Article") {
                        $related->setTagContent("conference publication", "relatedItem/genre");
                        $related->setTagAttribute("authority", "marcgt", "relatedItem/genre");
                    } else {
                        if ($row['type'] == "Newspaper Article") {
                            $related->setTagContent("continuing", "relatedItem/originInfo/issuance");
                            $related->setTagContent("newspaper", "relatedItem/genre");
                            $related->setTagAttribute("authority", "marcgt", "relatedItem/genre");
                        } else {
                            // if ($row['type'] == "Book Chapter")
                            $related->setTagContent("monographic", "relatedItem/originInfo/issuance");
                            $related->setTagContent("book", "relatedItem/genre");
                            $related->setTagAttribute("authority", "marcgt", "relatedItem/genre");
                        }
                    }
                }
            }
        } else {
            // if (!empty($row['thesis']))
            $thesismarc = new XMLBranch("genre");
            $thesis = new XMLBranch("genre");
            $thesismarc->setTagContent("thesis");
            $thesismarc->setTagAttribute("authority", "marcgt");
            // tweak thesis names so that Bibutils will recognize them:
            if ($row['thesis'] == "Master's thesis") {
                $row['thesis'] = "Masters thesis";
            }
            $thesis->setTagContent(encodeXMLField('thesis', $row['thesis']));
            $related->addXMLBranch($thesismarc);
            $related->addXMLBranch($thesis);
        }
        if (!empty($row['year']) || !empty($row['volume']) || !empty($row['issue']) || !empty($row['pages'])) {
            $part = new XMLBranch("part");
            if (!empty($row['year'])) {
                $part->setTagContent(encodeXMLField('year', $row['year']), "date");
            }
            if (!empty($row['volume'])) {
                $detailvolume = new XMLBranch("detail");
                $detailvolume->setTagContent(encodeXMLField('volume', $row['volume']), "detail/number");
                $detailvolume->setTagAttribute("type", "volume");
                $part->addXMLBranch($detailvolume);
            }
            if (!empty($row['issue'])) {
                $detailnumber = new XMLBranch("detail");
                $detailnumber->setTagContent(encodeXMLField('issue', $row['issue']), "detail/number");
                $detailnumber->setTagAttribute("type", "issue");
                $part->addXMLBranch($detailnumber);
            }
            if (!empty($row['pages'])) {
                if (preg_match("/[0-9] *- *[0-9]/", $row['pages'])) {
                    // if a page range
                    // split the page range into start and end pages
                    list($pagestart, $pageend) = preg_split('/\\s*[-]\\s*/', $row['pages']);
                    if ($pagestart < $pageend) {
                        // extents MUST span multiple pages
                        $pages = new XMLBranch("extent");
                        $pages->setTagContent(encodeXMLField('pages', $pagestart), "extent/start");
                        $pages->setTagContent(encodeXMLField('pages', $pageend), "extent/end");
                        $pages->setTagAttribute("unit", "page");
                    } else {
                        $pages = new XMLBranch("detail");
                        if ($pagestart == $pageend) {
                            // single-page item
                            $pages->setTagContent(encodeXMLField('pages', $pagestart), "detail/number");
                        } else {
                            $pages->setTagContent(encodeXMLField('pages', $row['pages']), "detail/number");
                        }
                        $pages->setTagAttribute("type", "page");
                    }
                } else {
                    $pages = new XMLBranch("detail");
                    $pages->setTagContent(encodeXMLField('pages', $row['pages']), "detail/number");
                    $pages->setTagAttribute("type", "page");
                }
                $part->addXMLBranch($pages);
            }
            $related->addXMLBranch($part);
        }
        // identifier
        //   isbn
        if (!empty($row['isbn'])) {
            $identifier = new XMLBranch("identifier");
            $identifier->setTagContent(encodeXMLField('isbn', $row['isbn']));
            $identifier->setTagAttribute("type", "isbn");
            $related->addXMLBranch($identifier);
        }
        //   issn
        if (!empty($row['issn'])) {
            $identifier = new XMLBranch("identifier");
            $identifier->setTagContent(encodeXMLField('issn', $row['issn']));
            $identifier->setTagAttribute("type", "issn");
            $related->addXMLBranch($identifier);
        }
        // series
        if (!empty($row['series_editor']) || !empty($row['series_title']) || !empty($row['abbrev_series_title']) || !empty($row['series_volume']) || !empty($row['series_issue'])) {
            $related->addXMLBranch(serialBranch($row['series_editor'], $row['series_title'], $row['abbrev_series_title'], $row['series_volume'], $row['series_issue']));
        }
        $record->addXMLBranch($related);
    }
    // --- END TYPE == ABSTRACT || BOOK CHAPTER || CONFERENCE ARTICLE || JOURNAL ARTICLE || MAGAZINE ARTICLE || NEWSPAPER ARTICLE ---
    return $record;
}
コード例 #2
0
ファイル: include.inc.php プロジェクト: Olari0/Finugriling
function generateRSS($result, $showRows, $rssChannelDescription)
{
    global $officialDatabaseName;
    // these variables are defined in 'ini.inc.php'
    global $databaseBaseURL;
    global $feedbackEmail;
    global $defaultCiteStyle;
    global $contentTypeCharset;
    global $logoImageURL;
    global $transtab_refbase_html;
    // defined in 'transtab_refbase_html.inc.php'
    // Note that we only convert those entities that are supported by XML (by use of the 'encodeHTMLspecialchars()' function).
    // All other higher ASCII chars are left unencoded and valid feed output is only possible if the '$contentTypeCharset' variable is set correctly in 'ini.inc.php'.
    // (The only exception is the item description which will contain HTML tags & entities that were defined by '$transtab_refbase_html' or by the 'reArrangeAuthorContents()' function)
    // Define inline text markup to be used by the 'citeRecord()' function:
    $markupPatternsArray = array("bold-prefix" => "<b>", "bold-suffix" => "</b>", "italic-prefix" => "<i>", "italic-suffix" => "</i>", "underline-prefix" => "<u>", "underline-suffix" => "</u>", "endash" => "&#8211;", "emdash" => "&#8212;", "ampersand" => "&", "double-quote" => "&quot;", "single-quote" => "'", "less-than" => "&lt;", "greater-than" => "&gt;", "newline" => "\n<br>\n");
    $currentDateTimeStamp = generateRFC2822TimeStamp();
    // get the current date & time (in UNIX/RFC-2822 time stamp format => "date('r')" or "date('D, j M Y H:i:s O')")
    // write RSS header:
    $rssData = "<?xml version=\"1.0\" encoding=\"" . $contentTypeCharset . "\"?>" . "\n<rss version=\"2.0\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">";
    // write channel info:
    $rssData .= "\n\t<channel>" . "\n\t\t<title>" . encodeHTMLspecialchars($officialDatabaseName) . "</title>" . "\n\t\t<link>" . $databaseBaseURL . "</link>" . "\n\t\t<description>" . encodeHTMLspecialchars($rssChannelDescription) . "</description>" . "\n\t\t<language>en</language>" . "\n\t\t<pubDate>" . $currentDateTimeStamp . "</pubDate>" . "\n\t\t<lastBuildDate>" . $currentDateTimeStamp . "</lastBuildDate>" . "\n\t\t<webMaster>" . $feedbackEmail . "</webMaster>";
    // write image data:
    $rssData .= "\n\n\t\t<image>" . "\n\t\t\t<url>" . $databaseBaseURL . $logoImageURL . "</url>" . "\n\t\t\t<title>" . encodeHTMLspecialchars($officialDatabaseName) . "</title>" . "\n\t\t\t<link>" . $databaseBaseURL . "</link>" . "\n\t\t</image>";
    // fetch results: upto the limit specified in '$showRows', fetch a row into the '$row' array and write out a RSS item:
    for ($rowCounter = 0; $rowCounter < $showRows && ($row = @mysql_fetch_array($result)); $rowCounter++) {
        $origTitle = $row['title'];
        // save the original title contents before applying any search & replace actions
        // Perform search & replace actions on the text of the 'title' field:
        // (the array '$transtab_refbase_html' in 'transtab_refbase_html.inc.php' defines which search & replace actions will be employed)
        $row['title'] = searchReplaceText($transtab_refbase_html, $row['title'], true);
        // this will provide for correct rendering of italic, super/sub-script and greek letters in item descriptions (which are enclosed by '<![CDATA[...]]>' to ensure well-formed XML);
        // item titles are still served in raw format, though, since the use of HTML in item titles breaks many news readers
        $citeStyleFile = getStyleFile($defaultCiteStyle);
        // fetch the name of the citation style file that's associated with the style given in '$defaultCiteStyle' (which, in turn, is defined in 'ini.inc.php')
        // include the found citation style file *once*:
        include_once "cite/" . $citeStyleFile;
        // instead of 'include_once' we could also use: 'if ($rowCounter == 0) { include "cite/" . $citeStyleFile; }'
        // Generate a proper citation for this record, ordering attributes according to the chosen output style & record type:
        $record = citeRecord($row, $defaultCiteStyle, "", $markupPatternsArray, true);
        // function 'citeRecord()' is defined in the citation style file given in '$citeStyleFile' (which, in turn, must reside in the 'styles' directory of the refbase root directory)
        // To avoid advertising email adresses in public RSS output, we remove the email address from contents of the 'modified_by' field which
        // get displayed in item descriptions. However, note that email adresses are NOT stripped from contents of the 'created_by' field
        // since a valid RSS feed must include an email address in the '<author>' element.
        // The following pattern does not attempt to do fancy parsing of email addresses but simply assumes the string format
        // of the 'modified_by' field (table 'refs'). If you change the string format, you must modify this pattern as well!
        $editorName = preg_replace("/(.+?) \\([^)]+\\)/", "\\1", $row['modified_by']);
        // append a RSS item for the current record:
        $rssData .= "\n\n\t\t<item>" . "\n\t\t\t<title>" . encodeHTMLspecialchars($origTitle) . "</title>" . "\n\t\t\t<link>" . $databaseBaseURL . "show.php?record=" . $row['serial'] . "</link>" . "\n\t\t\t<description><![CDATA[" . $record . "\n\t\t\t<br><br>Edited by " . encodeHTMLspecialchars($editorName) . " on " . generateRFC2822TimeStamp($row['modified_date'], $row['modified_time']) . ".]]></description>" . "\n\t\t\t<guid isPermaLink=\"true\">" . $databaseBaseURL . "show.php?record=" . $row['serial'] . "</guid>" . "\n\t\t\t<pubDate>" . generateRFC2822TimeStamp($row['created_date'], $row['created_time']) . "</pubDate>" . "\n\t\t\t<author>" . generateRFC2822EmailAddress($row['created_by']) . "</author>" . "\n\t\t</item>";
    }
    // finish RSS data:
    $rssData .= "\n\n\t</channel>" . "\n</rss>\n";
    return $rssData;
}