1*5153720fSfkaag71<?php 2*5153720fSfkaag71/** 3*5153720fSfkaag71 * Strata, data entry plugin 4*5153720fSfkaag71 * 5*5153720fSfkaag71 * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 6*5153720fSfkaag71 * @author Brend Wanders <b.wanders@utwente.nl> 7*5153720fSfkaag71 */ 8*5153720fSfkaag71 9*5153720fSfkaag71if (!defined('DOKU_INC')) die('Meh.'); 10*5153720fSfkaag71 11*5153720fSfkaag71/** 12*5153720fSfkaag71 * Data entry syntax for dedicated data blocks. 13*5153720fSfkaag71 */ 14*5153720fSfkaag71class syntax_plugin_strata_entry extends DokuWiki_Syntax_Plugin { 15*5153720fSfkaag71 protected static $previewMetadata = array(); 16*5153720fSfkaag71 17*5153720fSfkaag71 function __construct() { 18*5153720fSfkaag71 $this->syntax =& plugin_load('helper', 'strata_syntax'); 19*5153720fSfkaag71 $this->util =& plugin_load('helper', 'strata_util'); 20*5153720fSfkaag71 $this->triples =& plugin_load('helper', 'strata_triples'); 21*5153720fSfkaag71 } 22*5153720fSfkaag71 23*5153720fSfkaag71 function getType() { 24*5153720fSfkaag71 return 'substition'; 25*5153720fSfkaag71 } 26*5153720fSfkaag71 27*5153720fSfkaag71 function getPType() { 28*5153720fSfkaag71 return 'block'; 29*5153720fSfkaag71 } 30*5153720fSfkaag71 31*5153720fSfkaag71 function getSort() { 32*5153720fSfkaag71 return 450; 33*5153720fSfkaag71 } 34*5153720fSfkaag71 35*5153720fSfkaag71 function connectTo($mode) { 36*5153720fSfkaag71 if($this->getConf('enable_entry')) { 37*5153720fSfkaag71 $this->Lexer->addSpecialPattern('<data(?: +[^#>]+?)?(?: *#[^>]*?)?>\s*?\n(?:.*?\n)*?\s*?</data>',$mode, 'plugin_strata_entry'); 38*5153720fSfkaag71 } 39*5153720fSfkaag71 } 40*5153720fSfkaag71 41*5153720fSfkaag71 function handle($match, $state, $pos, Doku_Handler $handler) { 42*5153720fSfkaag71 $result = array( 43*5153720fSfkaag71 'entry'=>'', 44*5153720fSfkaag71 'data'=> array( 45*5153720fSfkaag71 $this->util->getIsaKey(false) => array(), 46*5153720fSfkaag71 $this->util->getTitleKey(false) => array() 47*5153720fSfkaag71 ) 48*5153720fSfkaag71 ); 49*5153720fSfkaag71 50*5153720fSfkaag71 // allow for preprocessing by a subclass 51*5153720fSfkaag71 $match = $this->preprocess($match, $state, $pos, $handler, $result); 52*5153720fSfkaag71 53*5153720fSfkaag71 $lines = explode("\n",$match); 54*5153720fSfkaag71 $header = trim(array_shift($lines)); 55*5153720fSfkaag71 $footer = trim(array_pop($lines)); 56*5153720fSfkaag71 57*5153720fSfkaag71 58*5153720fSfkaag71 // allow subclasses to mangle header 59*5153720fSfkaag71 $header = $this->handleHeader($header, $result); 60*5153720fSfkaag71 61*5153720fSfkaag71 // extract header, and match it to get classes and fragment 62*5153720fSfkaag71 preg_match('/^( +[^#>]+)?(?: *#([^>]*?))?$/', $header, $header); 63*5153720fSfkaag71 64*5153720fSfkaag71 // process the classes into triples 65*5153720fSfkaag71 foreach(preg_split('/\s+/',trim($header[1])) as $class) { 66*5153720fSfkaag71 if($class == '') continue; 67*5153720fSfkaag71 $result['data'][$this->util->getIsaKey(false)][] = array('value'=>$class,'type'=>'text', 'hint'=>null); 68*5153720fSfkaag71 } 69*5153720fSfkaag71 70*5153720fSfkaag71 // process the fragment if necessary 71*5153720fSfkaag71 $result['entry'] = $header[2]; 72*5153720fSfkaag71 $result['position'] = $pos; 73*5153720fSfkaag71 if($result['entry'] != '') { 74*5153720fSfkaag71 $result['title candidate'] = array('value'=>$result['entry'], 'type'=>'text', 'hint'=>null); 75*5153720fSfkaag71 } 76*5153720fSfkaag71 77*5153720fSfkaag71 // parse tree 78*5153720fSfkaag71 $tree = $this->syntax->constructTree($lines,'data entry'); 79*5153720fSfkaag71 80*5153720fSfkaag71 // allow subclasses first pick in the tree 81*5153720fSfkaag71 $this->handleBody($tree, $result); 82*5153720fSfkaag71 83*5153720fSfkaag71 // fetch all lines 84*5153720fSfkaag71 $lines = $this->syntax->extractText($tree); 85*5153720fSfkaag71 86*5153720fSfkaag71 // sanity check 87*5153720fSfkaag71 if(count($tree['cs'])) { 88*5153720fSfkaag71 msg(sprintf($this->syntax->getLang('error_entry_block'), ($tree['cs'][0]['tag']?sprintf($this->syntax->getLang('named_group'),utf8_tohtml(hsc($tree['cs'][0]['tag']))):$this->syntax->getLang('unnamed_group')), utf8_tohtml(hsc($result['entry']))),-1); 89*5153720fSfkaag71 return array(); 90*5153720fSfkaag71 } 91*5153720fSfkaag71 92*5153720fSfkaag71 $p = $this->syntax->getPatterns(); 93*5153720fSfkaag71 94*5153720fSfkaag71 // now handle all lines 95*5153720fSfkaag71 foreach($lines as $line) { 96*5153720fSfkaag71 $line = $line['text']; 97*5153720fSfkaag71 // match a "property_type(hint)*: value" pattern 98*5153720fSfkaag71 // (the * is only used to indicate that the value is actually a comma-seperated list) 99*5153720fSfkaag71 // [grammar] ENTRY := PREDICATE TYPE? '*'? ':' ANY 100*5153720fSfkaag71 if(preg_match("/^({$p->predicate})\s*({$p->type})?\s*(\*)?\s*:\s*({$p->any}?)$/",$line,$parts)) { 101*5153720fSfkaag71 // assign useful names 102*5153720fSfkaag71 list(, $property, $ptype, $multi, $values) = $parts; 103*5153720fSfkaag71 list($type,$hint) = $p->type($ptype); 104*5153720fSfkaag71 105*5153720fSfkaag71 // trim property so we don't get accidental 'name ' keys 106*5153720fSfkaag71 $property = utf8_trim($property); 107*5153720fSfkaag71 108*5153720fSfkaag71 // lazy create key bucket 109*5153720fSfkaag71 if(!isset($result['data'][$property])) { 110*5153720fSfkaag71 $result['data'][$property] = array(); 111*5153720fSfkaag71 } 112*5153720fSfkaag71 113*5153720fSfkaag71 // determine values, splitting on commas if necessary 114*5153720fSfkaag71 $values = ($multi == '*') ? explode(',',$values) : array($values); 115*5153720fSfkaag71 116*5153720fSfkaag71 // generate triples from the values 117*5153720fSfkaag71 foreach($values as $v) { 118*5153720fSfkaag71 $v = utf8_trim($v); 119*5153720fSfkaag71 if($v == '') continue; 120*5153720fSfkaag71 // replace the [[]] quasi-magic token with the empty string 121*5153720fSfkaag71 if($v == '[[]]') $v = ''; 122*5153720fSfkaag71 if(!isset($type) || $type == '') { 123*5153720fSfkaag71 list($type, $hint) = $this->util->getDefaultType(); 124*5153720fSfkaag71 } 125*5153720fSfkaag71 $result['data'][$property][] = array('value'=>$v,'type'=>$type,'hint'=>($hint?:null)); 126*5153720fSfkaag71 } 127*5153720fSfkaag71 } else { 128*5153720fSfkaag71 msg(sprintf($this->syntax->getLang('error_entry_line'), utf8_tohtml(hsc($line))),-1); 129*5153720fSfkaag71 } 130*5153720fSfkaag71 } 131*5153720fSfkaag71 132*5153720fSfkaag71 // normalize data: 133*5153720fSfkaag71 // - Normalize all values 134*5153720fSfkaag71 $buckets = $result['data']; 135*5153720fSfkaag71 $result['data'] = array(); 136*5153720fSfkaag71 137*5153720fSfkaag71 foreach($buckets as $property=>&$bucket) { 138*5153720fSfkaag71 // normalize the predicate 139*5153720fSfkaag71 $property = $this->util->normalizePredicate($property); 140*5153720fSfkaag71 141*5153720fSfkaag71 // process all triples 142*5153720fSfkaag71 foreach($bucket as &$triple) { 143*5153720fSfkaag71 // normalize the value 144*5153720fSfkaag71 $type = $this->util->loadType($triple['type']); 145*5153720fSfkaag71 $triple['value'] = $type->normalize($triple['value'], $triple['hint']); 146*5153720fSfkaag71 147*5153720fSfkaag71 // lazy create property bucket 148*5153720fSfkaag71 if(!isset($result['data'][$property])) { 149*5153720fSfkaag71 $result['data'][$property] = array(); 150*5153720fSfkaag71 } 151*5153720fSfkaag71 152*5153720fSfkaag71 $result['data'][$property][] = $triple; 153*5153720fSfkaag71 } 154*5153720fSfkaag71 } 155*5153720fSfkaag71 156*5153720fSfkaag71 157*5153720fSfkaag71 // normalize title candidate 158*5153720fSfkaag71 if(!empty($result['title candidate'])) { 159*5153720fSfkaag71 $type = $this->util->loadType($result['title candidate']['type']); 160*5153720fSfkaag71 $result['title candidate']['value'] = $type->normalize($result['title candidate']['value'], $result['title candidate']['hint']); 161*5153720fSfkaag71 } 162*5153720fSfkaag71 163*5153720fSfkaag71 $footer = $this->handleFooter($footer, $result); 164*5153720fSfkaag71 165*5153720fSfkaag71 return $result; 166*5153720fSfkaag71 } 167*5153720fSfkaag71 168*5153720fSfkaag71 /** 169*5153720fSfkaag71 * Handles the whole match. This method is called before any processing 170*5153720fSfkaag71 * is done by the actual class. 171*5153720fSfkaag71 * 172*5153720fSfkaag71 * @param match string the complete match 173*5153720fSfkaag71 * @param state the parser state 174*5153720fSfkaag71 * @param pos the position in the source 175*5153720fSfkaag71 * @param the handler object 176*5153720fSfkaag71 * @param result array the result array passed to the render method 177*5153720fSfkaag71 * @return a preprocessed string 178*5153720fSfkaag71 */ 179*5153720fSfkaag71 function preprocess($match, $state, $pos, &$handler, &$result) { 180*5153720fSfkaag71 return $match; 181*5153720fSfkaag71 } 182*5153720fSfkaag71 183*5153720fSfkaag71 /** 184*5153720fSfkaag71 * Handles the header of the syntax. This method is called before 185*5153720fSfkaag71 * the header is handled. 186*5153720fSfkaag71 * 187*5153720fSfkaag71 * @param header string the complete header 188*5153720fSfkaag71 * @param result array the result array passed to the render method 189*5153720fSfkaag71 * @return a string containing the unhandled parts of the header 190*5153720fSfkaag71 */ 191*5153720fSfkaag71 function handleHeader($header, &$result) { 192*5153720fSfkaag71 // remove prefix and suffix 193*5153720fSfkaag71 return preg_replace('/(^<data)|( *>$)/','',$header); 194*5153720fSfkaag71 } 195*5153720fSfkaag71 196*5153720fSfkaag71 /** 197*5153720fSfkaag71 * Handles the body of the syntax. This method is called before any 198*5153720fSfkaag71 * of the body is handled. 199*5153720fSfkaag71 * 200*5153720fSfkaag71 * @param tree array the parsed tree 201*5153720fSfkaag71 * @param result array the result array passed to the render method 202*5153720fSfkaag71 */ 203*5153720fSfkaag71 function handleBody(&$tree, &$result) { 204*5153720fSfkaag71 } 205*5153720fSfkaag71 206*5153720fSfkaag71 /** 207*5153720fSfkaag71 * Handles the footer of the syntax. This method is called after the 208*5153720fSfkaag71 * data has been parsed and normalized. 209*5153720fSfkaag71 * 210*5153720fSfkaag71 * @param footer string the footer string 211*5153720fSfkaag71 * @param result array the result array passed to the render method 212*5153720fSfkaag71 * @return a string containing the unhandled parts of the footer 213*5153720fSfkaag71 */ 214*5153720fSfkaag71 function handleFooter($footer, &$result) { 215*5153720fSfkaag71 return ''; 216*5153720fSfkaag71 } 217*5153720fSfkaag71 218*5153720fSfkaag71 219*5153720fSfkaag71 protected function getPositions($data) { 220*5153720fSfkaag71 global $ID; 221*5153720fSfkaag71 222*5153720fSfkaag71 // determine positions of other data entries 223*5153720fSfkaag71 // (self::$previewMetadata is only filled if a preview_metadata was run) 224*5153720fSfkaag71 if(isset(self::$previewMetadata[$ID])) { 225*5153720fSfkaag71 $positions = self::$previewMetadata[$ID]['strata']['positions']; 226*5153720fSfkaag71 } else { 227*5153720fSfkaag71 $positions = p_get_metadata($ID, 'strata positions'); 228*5153720fSfkaag71 } 229*5153720fSfkaag71 230*5153720fSfkaag71 // only read positions if we have them 231*5153720fSfkaag71 if(is_array($positions) && isset($positions[$data['entry']])) { 232*5153720fSfkaag71 $positions = $positions[$data['entry']]; 233*5153720fSfkaag71 $currentPosition = array_search($data['position'],$positions); 234*5153720fSfkaag71 $previousPosition = isset($positions[$currentPosition-1])?'data_fragment_'.$positions[$currentPosition-1]:null; 235*5153720fSfkaag71 $nextPosition = isset($positions[$currentPosition+1])?'data_fragment_'.$positions[$currentPosition+1]:null; 236*5153720fSfkaag71 $currentPosition = 'data_fragment_'.$positions[$currentPosition]; 237*5153720fSfkaag71 } 238*5153720fSfkaag71 239*5153720fSfkaag71 return array($currentPosition, $previousPosition, $nextPosition); 240*5153720fSfkaag71 } 241*5153720fSfkaag71 242*5153720fSfkaag71 function render($mode, Doku_Renderer $R, $data) { 243*5153720fSfkaag71 global $ID; 244*5153720fSfkaag71 245*5153720fSfkaag71 if($data == array()) { 246*5153720fSfkaag71 return false; 247*5153720fSfkaag71 } 248*5153720fSfkaag71 249*5153720fSfkaag71 if($mode == 'xhtml' || $mode == 'odt') { 250*5153720fSfkaag71 list($currentPosition, $previousPosition, $nextPosition) = $this->getPositions($data); 251*5153720fSfkaag71 // render table header 252*5153720fSfkaag71 if($mode == 'xhtml') { $R->doc .= '<div class="strata-entry" '.(isset($currentPosition)?'id="'.$currentPosition.'"':'').'>'; } 253*5153720fSfkaag71 if($mode == 'odt' && isset($currentPosition) && method_exists ($R, 'insertBookmark')) { 254*5153720fSfkaag71 $R->insertBookmark($currentPosition, false); 255*5153720fSfkaag71 } 256*5153720fSfkaag71 $R->table_open(); 257*5153720fSfkaag71 $R->tablerow_open(); 258*5153720fSfkaag71 $R->tableheader_open(2); 259*5153720fSfkaag71 260*5153720fSfkaag71 // determine actual header text 261*5153720fSfkaag71 $heading = ''; 262*5153720fSfkaag71 if(isset($data['data'][$this->util->getTitleKey()])) { 263*5153720fSfkaag71 // use title triple if possible 264*5153720fSfkaag71 $heading = $data['data'][$this->util->getTitleKey()][0]['value']; 265*5153720fSfkaag71 } elseif (!empty($data['title candidate'])) { 266*5153720fSfkaag71 // use title candidate if possible 267*5153720fSfkaag71 $heading = $data['title candidate']['value']; 268*5153720fSfkaag71 } else { 269*5153720fSfkaag71 if(useHeading('content')) { 270*5153720fSfkaag71 // fall back to page title, depending on wiki configuration 271*5153720fSfkaag71 $heading = p_get_first_heading($ID); 272*5153720fSfkaag71 } 273*5153720fSfkaag71 274*5153720fSfkaag71 if(!$heading) { 275*5153720fSfkaag71 // use page id if all else fails 276*5153720fSfkaag71 $heading = noNS($ID); 277*5153720fSfkaag71 } 278*5153720fSfkaag71 } 279*5153720fSfkaag71 $R->cdata($heading); 280*5153720fSfkaag71 281*5153720fSfkaag71 // display a comma-separated list of classes if the entry has classes 282*5153720fSfkaag71 if(isset($data['data'][$this->util->getIsaKey()])) { 283*5153720fSfkaag71 $R->emphasis_open(); 284*5153720fSfkaag71 $R->cdata(' ('); 285*5153720fSfkaag71 $values = $data['data'][$this->util->getIsaKey()]; 286*5153720fSfkaag71 $this->util->openField($mode, $R, $this->util->getIsaKey()); 287*5153720fSfkaag71 for($i=0;$i<count($values);$i++) { 288*5153720fSfkaag71 $triple =& $values[$i]; 289*5153720fSfkaag71 if($i!=0) $R->cdata(', '); 290*5153720fSfkaag71 $type = $this->util->loadType($triple['type']); 291*5153720fSfkaag71 $this->util->renderValue($mode, $R, $this->triples, $triple['value'], $triple['type'], $type, $triple['hint']); 292*5153720fSfkaag71 } 293*5153720fSfkaag71 $this->util->closeField($mode, $R); 294*5153720fSfkaag71 $R->cdata(')'); 295*5153720fSfkaag71 $R->emphasis_close(); 296*5153720fSfkaag71 } 297*5153720fSfkaag71 $R->tableheader_close(); 298*5153720fSfkaag71 $R->tablerow_close(); 299*5153720fSfkaag71 300*5153720fSfkaag71 // render a row for each key, displaying the values as comma-separated list 301*5153720fSfkaag71 foreach($data['data'] as $key=>$values) { 302*5153720fSfkaag71 // skip isa and title keys 303*5153720fSfkaag71 if($key == $this->util->getTitleKey() || $key == $this->util->getIsaKey()) continue; 304*5153720fSfkaag71 305*5153720fSfkaag71 // render row header 306*5153720fSfkaag71 $R->tablerow_open(); 307*5153720fSfkaag71 $R->tableheader_open(); 308*5153720fSfkaag71 $this->util->renderPredicate($mode, $R, $this->triples, $key); 309*5153720fSfkaag71 $R->tableheader_close(); 310*5153720fSfkaag71 311*5153720fSfkaag71 // render row content 312*5153720fSfkaag71 $R->tablecell_open(); 313*5153720fSfkaag71 $this->util->openField($mode, $R, $key); 314*5153720fSfkaag71 for($i=0;$i<count($values);$i++) { 315*5153720fSfkaag71 $triple =& $values[$i]; 316*5153720fSfkaag71 if($i!=0) $R->cdata(', '); 317*5153720fSfkaag71 $this->util->renderValue($mode, $R, $this->triples, $triple['value'], $triple['type'], $triple['hint']); 318*5153720fSfkaag71 } 319*5153720fSfkaag71 $this->util->closeField($mode, $R); 320*5153720fSfkaag71 $R->tablecell_close(); 321*5153720fSfkaag71 $R->tablerow_close(); 322*5153720fSfkaag71 } 323*5153720fSfkaag71 324*5153720fSfkaag71 if($previousPosition || $nextPosition) { 325*5153720fSfkaag71 $R->tablerow_open(); 326*5153720fSfkaag71 $R->tableheader_open(2); 327*5153720fSfkaag71 if($previousPosition) { 328*5153720fSfkaag71 if($mode == 'xhtml') { $R->doc .= '<span class="strata-data-fragment-link-previous">'; } 329*5153720fSfkaag71 $R->locallink($previousPosition, $this->util->getLang('data_entry_previous')); 330*5153720fSfkaag71 if($mode == 'xhtml') { $R->doc .= '</span>'; } 331*5153720fSfkaag71 } 332*5153720fSfkaag71 $R->cdata(' '); 333*5153720fSfkaag71 if($nextPosition) { 334*5153720fSfkaag71 if($mode == 'xhtml') { $R->doc .= '<span class="strata-data-fragment-link-next">'; } 335*5153720fSfkaag71 $R->locallink($nextPosition, $this->util->getLang('data_entry_next')); 336*5153720fSfkaag71 if($mode == 'xhtml') { $R->doc .= '</span>'; } 337*5153720fSfkaag71 } 338*5153720fSfkaag71 $R->tableheader_close(); 339*5153720fSfkaag71 $R->tablerow_close(); 340*5153720fSfkaag71 } 341*5153720fSfkaag71 342*5153720fSfkaag71 $R->table_close(); 343*5153720fSfkaag71 if($mode == 'xhtml') { $R->doc .= '</div>'; } 344*5153720fSfkaag71 345*5153720fSfkaag71 return true; 346*5153720fSfkaag71 347*5153720fSfkaag71 } elseif($mode == 'metadata' || $mode == 'preview_metadata') { 348*5153720fSfkaag71 $triples = array(); 349*5153720fSfkaag71 $subject = $ID.'#'.$data['entry']; 350*5153720fSfkaag71 351*5153720fSfkaag71 // resolve the subject to normalize everything 352*5153720fSfkaag71 resolve_pageid(getNS($ID),$subject,$exists); 353*5153720fSfkaag71 354*5153720fSfkaag71 $titleKey = $this->util->getTitleKey(); 355*5153720fSfkaag71 356*5153720fSfkaag71 $fixTitle = false; 357*5153720fSfkaag71 358*5153720fSfkaag71 // we only use the title determination if no explicit title was given 359*5153720fSfkaag71 if(empty($data['data'][$titleKey])) { 360*5153720fSfkaag71 if(!empty($data['title candidate'])) { 361*5153720fSfkaag71 // we have a candidate from somewhere 362*5153720fSfkaag71 $data['data'][$titleKey][] = $data['title candidate']; 363*5153720fSfkaag71 } else { 364*5153720fSfkaag71 if(!empty($R->meta['title'])) { 365*5153720fSfkaag71 // we do not have a candidate, so we use the page title 366*5153720fSfkaag71 // (this is possible because fragments set the candidate) 367*5153720fSfkaag71 $data['data'][$titleKey][] = array( 368*5153720fSfkaag71 'value'=>$R->meta['title'], 369*5153720fSfkaag71 'type'=>'text', 370*5153720fSfkaag71 'hint'=>null 371*5153720fSfkaag71 ); 372*5153720fSfkaag71 } else { 373*5153720fSfkaag71 // we were added before the page title is known 374*5153720fSfkaag71 // however, we do require a page title (iff we actually store data) 375*5153720fSfkaag71 $fixTitle = true; 376*5153720fSfkaag71 } 377*5153720fSfkaag71 } 378*5153720fSfkaag71 } 379*5153720fSfkaag71 380*5153720fSfkaag71 // store positions information 381*5153720fSfkaag71 if($mode == 'preview_metadata') { 382*5153720fSfkaag71 self::$previewMetadata[$ID]['strata']['positions'][$data['entry']][] = $data['position']; 383*5153720fSfkaag71 } else { 384*5153720fSfkaag71 $R->meta['strata']['positions'][$data['entry']][] = $data['position']; 385*5153720fSfkaag71 } 386*5153720fSfkaag71 387*5153720fSfkaag71 // process triples 388*5153720fSfkaag71 foreach($data['data'] as $property=>$bucket) { 389*5153720fSfkaag71 $this->util->renderPredicate($mode, $R, $this->triples, $property); 390*5153720fSfkaag71 391*5153720fSfkaag71 foreach($bucket as $triple) { 392*5153720fSfkaag71 // render values for things like backlinks 393*5153720fSfkaag71 $type = $this->util->loadType($triple['type']); 394*5153720fSfkaag71 $type->render($mode, $R, $this->triples, $triple['value'], $triple['hint']); 395*5153720fSfkaag71 396*5153720fSfkaag71 // prepare triples for storage 397*5153720fSfkaag71 $triples[] = array('subject'=>$subject, 'predicate'=>$property, 'object'=>$triple['value']); 398*5153720fSfkaag71 } 399*5153720fSfkaag71 } 400*5153720fSfkaag71 401*5153720fSfkaag71 // we're done if nodata is flagged. 402*5153720fSfkaag71 if(!isset($R->info['data']) || $R->info['data']==true) { 403*5153720fSfkaag71 // batch-store triples if we're allowed to store 404*5153720fSfkaag71 $this->triples->addTriples($triples, $ID); 405*5153720fSfkaag71 406*5153720fSfkaag71 // set flag for title addendum 407*5153720fSfkaag71 if($fixTitle) { 408*5153720fSfkaag71 $R->meta['strata']['fixTitle'] = true; 409*5153720fSfkaag71 } 410*5153720fSfkaag71 } 411*5153720fSfkaag71 412*5153720fSfkaag71 return true; 413*5153720fSfkaag71 } 414*5153720fSfkaag71 415*5153720fSfkaag71 return false; 416*5153720fSfkaag71 } 417*5153720fSfkaag71} 418