/** * Extracting the data of one entry * * @access private * @param string $entry The entry * @return array The representation of the entry or false if there is a problem */ function _postProcessing(&$ret) { // First post processing: Process accents, transform bibtex types foreach ($ret as $key => &$value) { switch ($key) { case "bibtex": case "cite": break; case "entrytype": if ($value == "conference") { $value = "inproceedings"; } break; default: PaperciteBibTexEntries::process_accents($value); } } // Remove braces and handles capitalization foreach (array("title", "booktitle", "journal") as $f) { if (in_array($f, array_keys($ret))) { $ret[$f] = $this->formatTitle($ret[$f]); } } // Handling pages if (in_array('pages', array_keys($ret))) { $matches = array(); if (preg_match("/^\\s*(\\d+)(?:\\s*--?\\s*(\\d+))?\\s*\$/", $ret['pages'], $matches)) { $ret['pages'] = new PaperciteBibtexPages($matches[1], sizeof($matches) > 2 ? $matches[2] : ""); } } //Handling the authors if (in_array('author', array_keys($ret))) { $ret['author'] = PaperciteBibTexEntries::_extractAuthors($ret['author']); } //Handling the editors if (in_array('editor', array_keys($ret))) { $ret['editor'] = PaperciteBibTexEntries::_extractAuthors($ret['editor']); } }
/** * Get the bibtex data from an URI */ function getData($biburis, $options) { global $wpdb, $papercite_table_name, $papercite_table_name_url; $timeout = $options["timeout"]; $processtitles = $options["process_titles"]; $sslverify = $options["ssl_check"]; // Loop over the different given URIs $bibFile = false; $array = explode(",", $biburis); $result = array(); foreach ($array as $biburi) { // (1) Get the context $data = FALSE; $stringedFile = false; $custom_prefix = "custom://"; // Handles custom:// by adding the post number if (papercite::startsWith($biburi, $custom_prefix)) { $stringedFile = true; $key = substr($biburi, strlen($custom_prefix)); $biburi = "post://" . get_the_ID() . "/" . $key; $data = get_post_custom_values("papercite_{$key}"); if ($data) { $data = $data[0]; } } if (!Papercite::array_get($this->cache, $biburi, false)) { if ($stringedFile) { // do nothing } else { if (preg_match('#^(ftp|http)s?://#', $biburi) == 1) { $bibFile = $this->getCached($biburi, $timeout, $sslverify); } else { $biburi = preg_replace("#\\.bib\$#", "", $biburi); $bibFile = $this->getDataFile("{$biburi}", "bib", "bib", "application/x-bibtex", $options); } } if ($data === FALSE && !($bibFile && file_exists($bibFile[0]))) { continue; } // Customize URIs depending on parsing options $biburi .= $processtitles ? "#pt=1" : "#pt=0"; // (2) Parse the BibTeX if ($data || file_exists($bibFile[0])) { if (!$data) { $fileTS = filemtime($bibFile[0]); // Check if we don't have the data in cache if ($this->useDb()) { $oldurlid = -1; // We use entrytype as a timestamp $row = $wpdb->get_row($wpdb->prepare("SELECT urlid, ts FROM {$papercite_table_name_url} WHERE url=%s", $biburi)); if ($row) { $oldurlid = $row->urlid; if ($row->ts >= $fileTS) { $result[$biburi] = $this->cache[$biburi] = array("__DB__", $row->urlid); continue; } } } $data = file_get_contents($bibFile[0]); } if (!empty($data)) { switch ($this->options["bibtex_parser"]) { case "pear": // Pear parser $this->_parser = new PaperciteStructures_BibTex(array('removeCurlyBraces' => true, 'extractAuthors' => true, 'processTitles' => $processtitles)); $this->_parser->loadString($data); $stat = $this->_parser->parse(); if (!$stat) { return $this->cache[$biburi] = false; } $this->cache[$biburi] =& $this->_parser->data; break; default: // OSBiB parser $parser = new PaperciteBibTexEntries(); $parser->processTitles($processtitles); if (!$parser->parse($data)) { $this->cache[$biburi] = false; continue; } else { $this->cache[$biburi] =& $parser->data; } break; } // Save to DB if (!$stringedFile && $this->useDb()) { // First delete everything if ($oldurlid >= 0) { $wpdb->query($wpdb->prepare("DELETE FROM {$papercite_table_name} WHERE urlid=%d", $oldurlid)); if ($code === FALSE) { break; } } else { $code = $wpdb->query($wpdb->prepare("INSERT INTO {$papercite_table_name_url}(url, ts) VALUES (%s, 0)", $biburi)); if ($code === FALSE) { break; } $oldurlid = $wpdb->insert_id; } $code = true; foreach ($this->cache[$biburi] as &$value) { $year = is_numeric($value["year"]) ? intval($value["year"]) : -1; $statement = $wpdb->prepare("REPLACE {$papercite_table_name}(urlid, bibtexid, entrytype, year, data) VALUES (%s,%s,%s,%s,%s)", $oldurlid, $value["cite"], $value["entrytype"], $year, maybe_serialize($value)); $code = $wpdb->query($statement); if ($code === FALSE) { break; } } if ($code !== FALSE) { $statement = $wpdb->prepare("REPLACE INTO {$papercite_table_name_url}(url, urlid, ts) VALUES(%s,%s,%s)", $biburi, $oldurlid, $fileTS); $code = $wpdb->query($statement); } } } } } // end bibtex processing (not in cache) // Add to the list if (Papercite::array_get($this->cache, $biburi, false)) { $result[$biburi] = $this->cache[$biburi]; } } // end loop over URIs return $result; }