xref: /plugin/strata/syntax/entry.php (revision 5153720fcc1dd2b6e63035d45f7c2bc32e429371)
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