DOI var $pdfDoiNS =''; // Saving PDF using DOI.pdf // All files in this path must be named // {DOI}.pdf with a replacement of any '/' using '_' var $pdfPmidNS =''; // Saving PDF using PMID.pdf // All files in this path must be named // {PMID}.pdf var $abstractTrFormat =''; // Files containing the translated abstract /** * Initialization */ public function __construct($_name='plugin_cache',$_prefix='noname',$_ext='nbib'){ global $conf; $this->namespace = strtolower($_name); $this->pdfDoiNS = strtolower($_name."/doi_pdf"); $this->pdfPmidNS = strtolower($_name."/pmid_pdf"); $this->prefix = strtolower($_prefix); $this->extension = strtolower($_ext); if (empty($_prefix)){ $this->prefix = $_prefix; }else{ $this->prefix = $_prefix.'_'; } $delimiter = ($conf['useslash'])?'/':':'; $this->mediaDir = $conf['mediadir'].'/'.$this->namespace; $this->mediaFormat = $this->mediaDir.'/'.$this->prefix.'%s.'.$this->extension; $this->linkFormat = $this->namespace.$delimiter.$this->prefix.'%s.'.$this->extension; $this->abstractTrFormat = $this->mediaDir.'/'.$this->prefix.'%s_fr.txt'; $this->crossRefId = 'cross'; // echo "


".
//         "NS: ". $this->namespace.PHP_EOL.
//         "pdfDoiNS: ". $this->pdfDoiNS.PHP_EOL.
//         "pdfPmidNS: ". $this->pdfPmidNS.PHP_EOL.
//         "Prefix: ".$this->prefix.PHP_EOL.
//         "extension: ".$this->extension.PHP_EOL.
//         "delimiter: ".$delimiter.PHP_EOL.
//         "mediaDir: ".$this->mediaDir.PHP_EOL.
//         "mediaFormat: ".$this->mediaFormat.PHP_EOL.
//         "linkFormat: ".$this->linkFormat.PHP_EOL.
//         "crossRefId: ".$this->crossRefId.PHP_EOL.
//         "abstractTrFormat: ".$this->abstractTrFormat.PHP_EOL.
//         "

"; $this->checkDir(); } function startsWith($string, $startString) { $len = strlen($startString); return (substr($string, 0, $len) === $startString); } // ok, V2020 /** * Get local pdf file path if exists (checking PMID and DOI dirs) */ function GetLocalPdfPath($pmid, $doi) { global $conf; $delimiter = ($conf['useslash'])?'/':':'; // Check with PMID $ml = $this->pdfPmidNS.$delimiter.$pmid.".pdf"; $filename = mediaFN($ml); //echo "
".$ml." ".$filename."

"; if (!file_exists($filename)) { // Test DOI $ml = $this->pdfDoiNS.$delimiter.str_replace("/","_",$doi).".pdf"; $filename = mediaFN($ml); //echo "
".$ml." ".$filename."

"; if (!file_exists($filename)) { return ""; // Not found } } return ml($ml,'',true,'',true); } /** * Get media file path */ function getRawContentPath($base, $id) { $id = strtolower($id); $base = strtolower($base); $file = sprintf($this->mediaFormat, $id); if ($base === "pmcid") $file = str_replace($this->prefix, $base.'_' , $file); return $file; } /** * Get all media file paths array * array(ID,filepath) */ function getAllMediaPaths() { $dir = $this->mediaDir; $dirhandle = opendir($dir); $files = array(); $patten = array($this->prefix,'.'.$this->extension); $replace = array('',''); while($name = readdir($dirhandle)){ if (strpos($name,$this->extension)!==false){ $path = $dir.'/'.$name; $id = str_replace($patten,$replace,$name); if (!empty($id)) $files[$id] = $path; } } closedir(); return $files; } /** */ function recreateCrossRefFile(){ $files = $this->getAllMediaPaths(); $cross = Array(); foreach ($files as $id => $path) { // Read file $path if (@file_exists($path)){ $content = io_readFile($path); $doi = $this->_catchDoiFromRawMedlineContent($content); // What to do if doi not found ? if (!empty($doi)) $cross[$id] = $doi; } } // Save cross data $this->_save_array($this->crossRefId, $cross); return true; } function PmidFromDoi(&$pdfDois) { $cross = $this->_read_array("", "cross"); if (empty($cross)) return NULL; // echo "

".print_r($cross)."

"; $pmids = Array(); $removeDoi = Array(); foreach ($pdfDois as $doi) { $pmid = array_search($doi, $cross); // echo "
PMID:{$pmid}.............DOI:{$doi}
"; if (!empty($pmid)) { $pmids[] = $pmid; $removeDoi[] = $doi; } } $pdfDois = array_diff($pdfDois, $removeDoi); return $pmids; } /** * Get all local PDF file PMIDs */ function GetAllAvailableLocalPdfByPMIDs() { //$this->pdfDoiNS = strtolower($_name."/doi_pdf"); //$this->pdfPmidNS = strtolower($_name."/pmid_pdf"); // cache all PDF in PMID dir $dir = mediaFN($this->pdfPmidNS); $dirhandle = opendir($dir); $files = array(); while($name = readdir($dirhandle)){ if (strpos($name,".pdf")!==false){ $id = str_replace(".pdf","",$name); $files[] = $id; } } closedir(); return $files; } /** * Get all local PDF file DOIs */ function GetAllAvailableLocalPdfByDOIs() { // cache all PDF in DOI dir $dir = mediaFN($this->pdfDoiNS); // echo "*********** ".$dir."
"; $dirhandle = opendir($dir); $files = array(); while($name = readdir($dirhandle)){ if (strpos($name,".pdf")!==false){ $id = str_replace(".pdf","",$name); $id = str_replace("_","/",$id); $files[] = $id; } } closedir(); return $files; } /** * Get media link */ function GetMediaLink($id) { return ml(sprintf($this->linkFormat, $id),'',true,'',true); } function GetDoiPdfUrl($doi) { global $conf; $delimiter = ($conf['useslash'])?'/':':'; $doi = str_replace("/","_",$doi); $ml = $this->pdfDoiNS.$delimiter.$doi.".pdf"; // $filename = mediaFN($ml); // $file = mediaFN($this->pdfDoiNS.$this->delimiter.$doi.'.pdf'); return ml($ml,'',true,'',true); } function GetDoiPdfThumbnailUrl($doi){ global $conf; $delimiter = ($conf['useslash'])?'/':':'; $doi = str_replace("/","_",$doi); $ml = $this->pdfDoiNS.$delimiter.$doi.'.jpg'; return ml($ml,'',true,'',true); } /** * Get text from cache. If none, return false * * Uses gzip if extension is .gz * and bz2 if extension is .bz2 */ function getMedlineContent($base, $id) { $filepath = $this->getRawContentPath($base, $id); if (@file_exists($filepath)) { //@touch($filepath); return io_readFile($filepath); } return false; } /** * Return the content of the translated abstract of the PMID */ function GetTranslatedAbstract($pmid, $lang='fr'){ $filepath = sprintf($this->abstractTrFormat,$pmid); if (@file_exists($filepath)){ //@touch($filepath); return io_readFile($filepath); } return ""; } /** * Save string to cache with a permission of $conf['fmode']. * * Uses gzip if extension is .gz * and bz2 if extension is .bz2 */ function saveRawMedlineContent($base, $raw) { global $conf; $id = $this->_catchIdFromRawMedlineContent($base, $raw); $doi = $this->_catchDoiFromRawMedlineContent($raw); $path = $this->getRawContentPath($base, $id); if (io_saveFile($path,$raw)){ @chmod($path,$conf['fmode']); $crossrefs = $this->_read_array($base, $this->crossRefId); $crossrefs[$id] = $doi; $this->_save_array($this->crossRefId, $crossrefs); return true; } return false; } // Ok pubmed2020 /** * Check cache directories */ function checkDir() { global $conf; $dummyFN = mediaFN($this->namespace.':_dummy'); //echo "dummyFN: ".$dummyFN; $tmp = dirname($dummyFN); if (!@is_dir($tmp)){ io_makeFileDir($dummyFN); @chmod($tmp,$conf['dmode']); } $dummyFN=mediaFN($this->pdfDoiNS.':_dummy'); $tmp = dirname($dummyFN); //echo "dummyFN: ".$dummyFN." ".print_r(@is_dir($tmp))."
"; if (!@is_dir($tmp)){ io_makeFileDir($dummyFN); @chmod($tmp,$conf['dmode']); } $dummyFN=mediaFN($this->pdfPmidNS.':_dummy'); $tmp = dirname($dummyFN); //echo "dummyFN: ".$dummyFN." ".print_r(@is_dir($tmp))."
"; if (!@is_dir($tmp)){ io_makeFileDir($dummyFN); @chmod($tmp,$conf['dmode']); } if (auth_aclcheck($this->namespace.":*","","@ALL")==0){ global $AUTH_ACL; $acl = join("",file(DOKU_CONF.'acl.auth.php')); $p_acl = $this->namespace.":*\t@ALL\t1\n"; $p_acl .= $this->pdfDoiNS.":*\t@admin\t16\n"; $p_acl .= $this->pdfPmidNS.":*\t@admin\t16\n"; $p_acl .= $this->pdfDoiNS.":*\t@ALL\t0\n"; $p_acl .= $this->pdfPmidNS.":*\t@ALL\t0\n"; $new_acl = $acl.$p_acl; io_saveFile(DOKU_CONF.'acl.auth.php', $new_acl); $AUTH_ACL = file(DOKU_CONF.'acl.auth.php'); // Reload ACL } } /** * Clear all media files in a plugin's media directory */ function clearCache(){ global $conf; $handle = @opendir($this->mediaDir); if ($handle === false) return; while (($entry = readdir($handle))){ $path = $this->mediaDir.'/'.$entry; if(is_file($path)) @unlink($path); } closedir($handle); } /** * Remove cache and directory */ function removeDir() { $this->clearCache(); @rmdir($this->mediaDir); } /** * save key/value array as tab-text */ function _save_array($id, $array) { // WRONG: ADD BASE if (empty($id)) return false; if (empty($array)) return false; global $conf; $path = $this->getRawContentPath("", $id); if (io_saveFile($path,json_encode($array))) { @chmod($path,$conf['fmode']); return true; } return false; } /** * Return true if the ID cached file exists */ function _idExists($base, $id) { $path = $this->getRawContentPath($base, $id); if(@file_exists($path)!==false){ @touch($path); return true; } return false; } // Ok PubMed2020 /** * read array from tab-text */ function _read_array($base, $id) { if (empty($id) || !$this->_idExists($base, $id)) return NULL; $path = $this->getRawContentPath($base, $id); $array = json_decode(io_readFile($path), true); return $array; } function _catchDoiFromRawMedlineContent($raw) { $medlinePattern = '~AID - (.*) \[doi\]~'; $matches = ''; $r = preg_match($medlinePattern, $raw, $matches); return $matches[1]; } // Ok pubmed2020 function _catchIdFromRawMedlineContent($base, $raw) { $pattern = ""; if ($base === "pmcid") $pattern = '~PMC - PMC(.*)~'; else $pattern = '~PMID- (.*)~'; $matches = ''; $r = preg_match($pattern, $raw, $matches); return trim($matches[1]); } // Ok pubmed2020 } ?>