name = 'pubchem';
if (!class_exists('plugin_cache'))
@require_once(DOKU_PLUGIN.$this->name.'/classes/cache.php');
if (!class_exists('rcsb')||!class_exists('ncbi')||!class_exists('xml'))
@require_once(DOKU_PLUGIN.$this->name.'/classes/sciencedb.php');
$this->ncbi = new ncbi();
$this->imgCache = new plugin_cache($this->name,'',"png");
$this->xmlCache = new plugin_cache($this->name,'',"xml.gz");
$this->propCache = new plugin_cache($this->name,'prop','json');
$this->summaryURL = 'https://pubchem.ncbi.nlm.nih.gov/summary/summary.cgi?cid=';
$this->downloadURL = 'https://pubchem.ncbi.nlm.nih.gov/image/imgsrv.fcgi?t=%s&cid=%s';
}
function getType(){ return 'substition'; }
function getSort(){ return 159; }
// Connect
function connectTo($mode){
$this->Lexer->addSpecialPattern('\{\{pubchem>[^}]*\}\}',$mode,'plugin_pubchem');
}
// Handling lexer
function handle($match, $state, $pos, Doku_Handler $handler){
$match = substr($match,10,-2);
return array($state,explode(':',$match));
}
/**
* Render PubChem image and link
*/
function render($mode, Doku_Renderer $renderer, $data){
if ($mode!='xhtml') return false;
global $pubchem_cache;
if(!is_array($pubchem_cache)) $pubchem_cache=array();
list($state, $match) = $data;
list($cmd,$cid) = $match;
$cmd = strtolower($cmd);
if(strpos($cid,'|')!==false){
list($cid,$title)=explode('|',$cid);
}
// Commands without CID
switch($cmd){
case 'searchbox':
$renderer->doc .= file_get_contents(DOKU_PLUGIN.$this->name.'/pubchem_search_box.htm').NL;
return true;
case 'clear':
$this->xmlCache->ClearCache();
$renderer->doc .= 'Cleared.';
return true;
case 'remove_dir':
$this->xmlCache->RemoveDir();
$renderer->doc .= 'Directory cleared.';
return true;
default:
if(!$cid){
$renderer->doc.='
'.sprintf($this->getLang('plugin_cmd_not_found'),$cmd).'
';
return true;
}
}
// Commands with CID
if (!is_numeric($cid)){
$renderer->doc .= sprintf($this->getLang('pubchem_invalid_cid'),$cid);
return false;
}
if ($this->propCache->Exists($cid)){
$ext_props = json_decode($this->propCache->GetMediaText($cid),true);
}else{
$ext_props = $this->getProperties($cid);
}
$iupac = array_key_exists('iupac', $ext_props) ? $ext_props['iupac']:'';
$formula = array_key_exists('formula',$ext_props) ? $ext_props['formula']:'';
$mw = array_key_exists('mw', $ext_props) ? $ext_props['mw']:'';
$xlogp = array_key_exists('xlogp', $ext_props) ? $ext_props['xlogp']:'';
switch($cmd){
case 'link':
$renderer->doc .= 'doc .= 'href="'.$this->summaryURL.$cid.'" title="Go to PubChem site" class="pubchem_link">'.$cid.''.NL;
return true;
case 'summaryxml':
$xml = $this->getPubchemXml($cid);
if ($xml===false){return true;}
$renderer->doc .= ''.htmlspecialchars($xml).'
';
return true;
case 'iupac':
$renderer->doc.= $iupac;
return true;
case 'formula':
$renderer->doc.= $formula;
return true;
case 'mw':
$renderer->doc.= $mw;
return true;
case 'xlogp':
$renderer->doc.= $xlogp;
return true;
default:
$mode = $cmd[0]; // s or l
$id = $cid.$mode;
$filename = $this->imgCache->GetMediaPath($id);
if(!is_readable($filename)){
$url = sprintf($this->downloadURL,$mode,$cid);
io_download($url,$filename);
}
if(strpos($cmd,'template')!==false){
if (empty($pubchem_cache[$cid]['iupac'])){
$this->getProperties($cid);
}
$renderer->doc.='';
$renderer->table_open(2);
$this->_name_row($renderer,$cid,$iupac,$title);
$this->_row($renderer,$this->getLang('mol_formula'),$formula);
$this->_row($renderer,$this->getLang('mol_weight'), $mw);
$this->_row($renderer,'LogP',$xlogp);
$renderer->table_close();
$renderer->doc.='
';
$renderer->doc .= $this->getImageHtml($cid,$mode);
$renderer->doc.='
'.DOKU_LF;
}else{
$renderer->doc .= $this->getImageHtml($cid,$mode);
}
return true;
}
// Command was not found..
$renderer->doc.=''.sprintf($this->getLang('plugin_cmd_not_found'),$cmd).'
';
return true;
}
/**
* Get PubChem image description
*/
function getImageHtml($cid,$mode){
$tag = '';
return $tag;
}
/**
* Get properties from XML data
* @param string $cid
* @return boolean
*/
function getProperties($cid){
$xml = $this->getPubchemXml($cid);
if ($xml===false){
return false;
}
$x = new Xml;
$XmlClass = $x->GetXmlObject($xml);
$xmls = $XmlClass[0]->next[0]->next;
$ext_props = array();
for($i=0;$itag=="PC-Compound_props"){
$props = $xmls[$i]->next;
for($j=0;$jnext;
$info_name1 = $infodata[0]->next[0]->next[0]->value;
$info_name2 = $infodata[0]->next[0]->next[1]->value;
$info_value = $infodata[1]->next[0]->value;
switch($info_name1){
case "Molecular Formula":
$ext_props['formula'] = $this->getChemFormat($info_value);
break;
case "IUPAC Name":
if ($info_name2=="Preferred"||$info_name2=="Allowed"){
if(strlen($info_value)>50){ $info_value = str_replace("-","- ",$info_value);}
$ext_props['iupac'] = $info_value;
}
break;
case "Molecular Weight":
$ext_props['mw'] = $info_value;
break;
case "Log P":
$ext_props['xlogp'] = $info_value;
break;
case "SMILES":
$ext_props['smiles'] = $info_value;
break;
}
}
}
}
// save extracted properties
$this->propCache->PutMediaText($cid,json_encode($ext_props));
return $ext_props;
}
/**
* Get PubChem XML
*/
function getPubchemXml($cid){
global $conf;
$xml = $this->ncbi->GetPubchemXml($cid);
if (!empty($xml)){
$filepath = $this->xmlCache->GetMediaPath($cid);
if(io_saveFile($filepath,$xml)){
chmod($filepath,$conf['fmode']);
}
return $xml;
}else{
return false;
}
}
/**
* Get chemical format.
*/
function getChemFormat($raw){
$pattern = array("/[\|]?([0-9]*\+|[0-9]*\-)/","/([A-Z]|[A-Z][a-z]|\)|\])([0-9]+)/");
$replace = array("\${1}","\${1}\${2}");
return preg_replace($pattern,$replace,$raw);
}
/**
* table name row for a template
* @param Doku_Renderer $renderer
* @param string $cid
* @param string $iupac
* @param string $title
*/
function _name_row(&$renderer,$cid,$iupac='',$title=''){
$renderer->tablerow_open();
$renderer->tableheader_open();
$renderer->doc.=($title!='')?$this->getLang('mol_name'):'CID';
$renderer->tableheader_close();
$renderer->tablecell_open();
$renderer->doc.=($title!='')?$title:$cid;
if($iupac){
$renderer->footnote_open();
$renderer->doc.=$iupac;
$renderer->footnote_close();
}
$renderer->tablecell_close();
$renderer->tablerow_close();
}
/**
* Render table row for a template
* @param Doku_Renderer $renderer
* @param string $head
* @param string $cell
*/
function _row(&$renderer,$head,$cell){
if(empty($cell))return;
$renderer->tablerow_open();
$renderer->tableheader_open();
$renderer->doc.=$head;
$renderer->tableheader_close();
$renderer->tablecell_open();
$renderer->doc.=$cell;
$renderer->tablecell_close();
$renderer->tablerow_close();
}
}
?>