source: spip-zone/_libs_/html2spip/HTML2SPIPEngine.class @ 88967

Last change on this file since 88967 was 88967, checked in by real3t@…, 5 years ago

Version 0.3

File size: 22.1 KB
Line 
1<?php # vim: syntax=php tabstop=2 softtabstop=2 shiftwidth=2 expandtab textwidth=80 autoindent
2# Copyright (C) 2010  Jean-Jacques Puig
3#
4# This program is free software: you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by
6# the Free Software Foundation, either version 3 of the License, or
7# (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17class HTML2SPIPEngine extends HTMLEngine {
18
19  # Headings related members (H1, H2, H3...)
20  private $headingDepthSpip     = "{{{";
21  private $headingDepthHTML     = null;
22
23  # Lists related members (UL, OL, LI...)
24  private $listType             = array();
25  private $listDepth            = 0;
26
27  # Tables related members (TABLE, TH, TR, TD...)
28  private $tablesStack          = array();
29
30  # Within marks
31  private $withinStack          = array();
32
33  # SPIP Environment
34  private $spipDBResource       = null;
35  private $spipImagesPath       = null;
36
37  # Documents (images) injected in SPIP database
38  public $spipDocumentsIds      = array();
39
40  # Common substitutions
41  protected $tag2typo = array(
42    'br'  => "\n_ ",
43    'hr'  => "\n----",
44    'p'   => "\n\n",
45  );
46
47  # Main substitution rules
48  protected $attributeOuterSubstitute = array(
49  );
50
51  protected $attributeInnerSubstitute = array(
52    'align'         => '_align',
53    'style'         => '_style',
54  );
55
56  protected $tagSubstitute = array(
57    # array() as 3rd arg forces detail
58    # display of ignored attributes
59
60    '#document'     => null,
61    'html'          => null,
62    'body'          => null,
63    'meta'          => null,
64    'link'          => null,
65    'style'         => null,
66
67    'div'           => null, #array('_div', '_div', array('id', 'class', 'style',
68                             # 'align')),
69
70    'h1'            => array('_hiS', '_hiE', array('class')),
71    'h2'            => array('_hiS', '_hiE', array('class')),
72    'h3'            => array('_hiS', '_hiE', array('class')),
73    'h4'            => array('_hiS', '_hiE', array('class')),
74    'h5'            => array('_hiS', '_hiE', array('class')),
75    'h6'            => array('_hiS', '_hiE', array('class')),
76
77    'p'             => array('_p', '_p', array('class', 'style', 'align')),
78    'br'            => array('_br', ''),
79
80    'ul'            => array('_ulOrOlS', '_ulOrOlE'),
81    'ol'            => array('_ulOrOlS', '_ulOrOlE'),
82    'li'            => array('_li', '_li', array('style')),
83
84      # TABLES related tags
85
86    'table'         => array('_tableS', '_tableE', array(
87                        'summary', 'cellpadding', 'cellspacing',
88                        'border', 'width', 'class', 'style'
89                       )),
90    'caption'       => array('_captionS', '_captionE', array()),
91    'tr'            => array('_trS', '_trE', array('style')),
92    'th'            => array('_thOrTdS', '_thOrTdE', array(
93                        'colspan', 'rowspan', 'width', 'bgcolor', 'scope'
94                       )),
95    'td'            => array('_thOrTdS', '_thOrTdE', array(
96                        'colspan', 'rowspan', 'width', 'style', 'scope'
97                       )),
98
99    'colgroup'      => array('', '', array()),
100    'col'           => array('', '', array()),
101    'thead'         => array('', '', array()),
102    'tbody'         => array('', '', array()),
103    'tfoot'         => array('', '', array()),
104
105
106    'font'          => array('', '', array(
107                        'face', 'size', 'color',
108                       )),
109    'b'             => array('_strongS', '_strongE', array('style')),
110    'strong'        => array('_strongS', '_strongE'),
111    'blockquote'    => array('_quoteS', '_quoteE', array('class')),
112    'code'          => array('_codeS', '_codeE', array('class')),
113    'textarea'      => array('_cadreS', '_cadreE', array('class')),
114    'em'            => array('_emS', '_emE'),
115    'i'             => array('_emS', '_emE'),
116    'span'          => array('_spanS', '_spanE', array('id', 'class')),
117    'hr'            => array("_tag2typo", ''),
118    'u'             => array('', '', array()),
119    'sup'           => array('_supS', '_supE', array()),
120    'sub'           => array('_subS', '_subE', array()),
121    'strike'        => array('_delS', '_delE', array()),
122    'del'           => array('_delS', '_delE', array()),
123
124    'a'             => array('_a', '_a', array(
125                        'title', 'href', 'target', 'style', 'name',
126                       )),
127    'img'           => array('_imgS', '', array(
128                        'src', 'align', 'width', 'height', 'alt', 'title',
129                        'hspace', 'vspace', 'border', 'class',
130                       )),
131
132    '#text'         => '_raw',
133    '#cdata-section'=> '_raw',
134    '#comment'      => '_comment',
135  );
136
137  protected function getAlign($align, $part) {
138    switch ($align) {
139      case 'right':
140        return ($part == TAG_START) ? '[/ ' : ' /]';
141
142      case 'center':
143      case 'middle':
144        if (!$this->within('_thOrTd') && !$this->within('_tr'))
145          return ($part == TAG_START) ? '[| ' : ' |]';
146    }
147  }
148
149  # protected function getJustification($attributes, $part) {
150  #   if (
151  #     array_key_exists('style', $attributes)
152  #     && preg_match('/text-align: (center|justify|left|right)/i', $attributes['style'], $matches))
153  #     $align = $matches[1];
154  #   elseif (array_key_exists('align', $attributes))
155  #     $align = $attributes['align'];
156  #   else
157  #     $align = null;
158
159  #   return $this->getAlign($align, $part);
160  # }
161
162  protected function _align($attribute, $value, $tag, $textContent, $part) {
163    return $this->getAlign($value, $part);
164  }
165
166  protected function _style($attribute, $value, $tag, $textContent, $part) {
167      if (preg_match('/text-align: (center|justify|left|right)/i', $value, $matches))
168        return $this->getAlign($matches[1], $part);
169  }
170
171  protected function _identityS($tag, $attributes) {
172    $data = "<$tag";
173
174    foreach($attributes as $name => $value)
175      $data .= " $name=\"$value\"";
176
177    $data .= '>';
178
179    return $data;
180  }
181
182  protected function _identityE($tag) {
183    return "</$tag>";
184  }
185
186  # protected function _div($tag, $attributes, $text, $part) {
187  #   if (!strlen(trim($text)))
188  #     return '';
189
190  #   return $this->getJustification($attributes, $part);
191  # }
192
193  protected function _hiS($tag, $attributes, $text) {
194    $this->pushWithin('_hi');
195
196    if (!strlen(trim($text)))
197      return '';
198
199    if ($this->headingDepthHTML != null) {
200      $depth_diff = strcmp($tag, $this->headingDepthHTML);
201      $verity = ($depth_diff == 0) ? 0 : ($depth_diff / abs($depth_diff));
202    } else
203      $verity = 0;
204
205    $this->headingDepthHTML = $tag;
206
207    switch($verity) {
208      case -1:
209        $diff = strcmp($tag, 'h1');
210        $depth = ($diff > 1) ? str_repeat('*', $diff) : '';
211        $this->headingDepthSpip = "{{{" . $depth;
212        break;
213
214      case 1:
215        if ($this->headingDepthSpip == "{{{")
216          $this->headingDepthSpip .= '**';
217        else
218          $this->headingDepthSpip .= '*';
219        break;
220    }
221
222    $this->openChunk($this->headingDepthSpip);
223
224    return $this->headingDepthSpip;
225  }
226
227  protected function _hiE($tag, $attributes, $text) {
228    $this->popWithin('_hi');
229
230    if (!strlen(trim($text)))
231      return '';
232
233    $this->push('}}}');
234    $this->closeChunk($this->headingDepthSpip);
235
236    $data = $this->readChunk($this->headingDepthSpip);
237    $data = preg_replace("/\n+_ /", "\n", $data);
238    $data = preg_replace("/\n+/", "}}}\n$this->headingDepthSpip", $data);
239
240    $this->deleteChunk($this->headingDepthSpip);
241
242    return $data;
243  }
244
245  protected function _p($tag, $attributes, $text, $part) {
246    if (!strlen(trim($text)))
247      return '';
248
249    return (($part == TAG_START) ? $this->tag2typo[$tag] : '');
250    #         . $this->getJustification($attributes, $part);
251  }
252
253  protected function _br($tag) {
254    if (
255      (!$this->within('_a'))
256      && (!$this->within('_hi'))
257    )
258      return $this->tag2typo[$tag];
259
260    if ($this->within('_hi'))
261      return "\n";
262
263    return '';
264  }
265
266  protected function _tag2typo($tag) {
267    return $this->tag2typo[$tag];
268  }
269
270  protected function _ulOrOlS($tag, $attributes, $text) {
271    if (!strlen(trim($text)))
272      return '';
273
274    array_unshift($this->listType, $tag);
275    $this->listDepth++;
276  }
277
278  protected function _ulOrOlE($tag, $attributes, $text) {
279    if (!strlen(trim($text)))
280      return '';
281
282    array_shift($this->listType);
283    if ($this->listDepth > 0)
284      $this->listDepth--;
285    else
286      return "\n";
287  }
288
289  protected function _li($tag, $attributes, $text, $part) {
290    if (!strlen(trim($text)))
291      return '';
292
293    if ($part == TAG_END)
294      return;
295      # return $this->getJustification($attributes, $part);
296
297    if (sizeof($this->listType)) # This should not happen, but remember input comes from users
298      $listType = $this->listType[0];
299    else
300      $listType = 'ul';
301
302    switch ($listType) {
303      case 'ol':
304        return "\n-" . str_repeat('#', $this->listDepth) . ' '; # . $this->getJustification($attributes, $part);
305
306      default:
307        return "\n-" . str_repeat('*', $this->listDepth) . ' '; # . $this->getJustification($attributes, $part);
308    }
309  }
310
311
312  protected function _tableS($tag, $attributes) {
313    array_unshift(
314      $this->tablesStack,
315      array(
316        'row'     => 0,
317        'col'     => 0,
318        'map'     => array(),
319        'newrow'  => true,
320      )
321    );
322
323    if (array_key_exists('summary', $attributes))
324      $this->tablesStack[0]['summary'] = $attributes['summary'];
325
326    return "\n";  # AIDE SPIP: 'Il est impératif de laisser des lignes vides
327                  #   avant et après ce tableau.
328  }
329
330  protected function _tableE() {
331    array_shift($this->tablesStack);
332
333    return "\n";  # AIDE SPIP: 'Il est impératif de laisser des lignes vides
334                  #   avant et après ce tableau.
335  }
336
337  protected function popTableSummary() {
338    if (array_key_exists('summary', $this->tablesStack[0])) {
339      $summary = $this->tablesStack[0]['summary'];
340      unset($this->tablesStack[0]['summary']);
341    } else
342      $summary = '';
343
344    return $summary;
345  }
346
347  protected function _captionS($tag, $attributes, $text) {
348    if (!strlen(trim($text)))
349      return '';
350
351    return "\n|| ";
352  }
353
354  protected function _captionE($tag, $attributes, $text) {
355    if (!strlen(trim($text)))
356      return '';
357
358    return ' | ' . $this->popTableSummary() . ' ||';
359  }
360
361  protected function _trS() {
362    $this->pushWithin('_tr');
363
364    $this->tablesStack[0]['newrow'] = true;
365    $this->tablesStack[0]['row']++;
366    $this->tablesStack[0]['col'] = 0;
367
368    if (strlen($summary = $this->popTableSummary()))
369      return "\n|| | $summary ||\n";
370    else
371      return "\n";
372  }
373
374  protected function _trE() {
375    $this->popWithin('_tr');
376
377    return '';
378  }
379
380  protected function _thOrTdS($tag, $attributes) {
381    $this->pushWithin('_thOrTd');
382
383    $this->tablesStack[0]['col']++;
384
385    if ($this->tablesStack[0]['newrow'] == true) {
386      $this->tablesStack[0]['newrow'] = false;
387      $data = '|';
388    } else
389      $data = '';
390
391    while (
392      ($index = $this->tablesStack[0]['col'] . 'x' .  $this->tablesStack[0]['row'])
393      && (array_key_exists(
394        $index,
395        $this->tablesStack[0]['map']
396      ))
397    ) {
398      unset($this->tablesStack[0]['map'][$index]);
399      $data .= ' ^ |';
400      $this->tablesStack[0]['col']++;
401    }
402
403    if ($tag == 'th')
404      $data .= ' {{';
405    else
406      $data .= ' ';
407
408    return $data;
409  }
410
411  protected function _thOrTdE($tag, $attributes) {
412    $this->popWithin('_thOrTd');
413
414    if ($tag == 'th')
415      $data = '}} |';
416    else
417      $data = ' |';
418
419    if (array_key_exists('colspan', $attributes))
420      $colspan = $attributes['colspan'];
421    else
422      $colspan = 1;
423
424    $row = $this->tablesStack[0]['row'];
425
426    if (array_key_exists('rowspan', $attributes)) {
427      $rowspan = $attributes['rowspan'];
428      $col = $this->tablesStack[0]['col'];
429      for ($j = 1; $j < $rowspan; $j++)
430        for ($i = 0; $i < $colspan; $i++)
431          $this->tablesStack[0]['map'][($i + $col) . 'x' . ($j + $row)] = true;
432    }
433
434    for ($i = 2; $i <= $colspan; $i++) {
435      $data .= ' < |';
436      $this->tablesStack[0]['col']++;
437    }
438
439    while (
440      ($index = ($this->tablesStack[0]['col'] + 1) . 'x' .  $row)
441      && (array_key_exists(
442        $index,
443        $this->tablesStack[0]['map']
444      ))
445    ) {
446      unset($this->tablesStack[0]['map'][$index]);
447      $data .= ' ^ |';
448      $this->tablesStack[0]['col']++;
449    }
450
451    return $data;
452  }
453
454  protected function _codeS($tag, $attributes, $text) {
455    if (!strlen(trim($text)))
456      return '';
457
458    return ' <code>';
459  }
460
461  protected function _codeE($tag, $attributes, $text) {
462    if (!strlen(trim($text)))
463      return '';
464
465    return '</code> ';
466  }
467
468  protected function _cadreS($tag, $attributes, $text) {
469    if (!strlen(trim($text)))
470      return '';
471
472    return ' <cadre>';
473  }
474
475  protected function _cadreE($tag, $attributes, $text) {
476    if (!strlen(trim($text)))
477      return '';
478
479    return '</cadre> ';
480  }
481
482  protected function _quoteS($tag, $attributes, $text) {
483    if (!strlen(trim($text)))
484      return '';
485
486    if (array_key_exists('class', $attributes))
487      if (preg_match('/\bspip_poesie\b/', $attributes['class']))
488        return ' <poesie>';
489
490    return ' <quote>';
491  }
492
493  protected function _quoteE($tag, $attributes, $text) {
494    if (!strlen(trim($text)))
495      return '';
496
497    if (array_key_exists('class', $attributes))
498      if (preg_match('/\bspip_poesie\b/', $attributes['class']))
499        return '</poesie> ';
500
501    return '</quote> ';
502  }
503
504  protected function _strongS($tag, $attributes, $text) {
505    if (!strlen(trim($text)))
506      return '';
507
508    if (array_key_exists('class', $attributes))
509      if (preg_match('/\bcaractencadre-spip\b/', $attributes['class']))
510        return ' [*';
511
512    return ' {{';
513  }
514
515  protected function _strongE($tag, $attributes, $text) {
516    if (!strlen(trim($text)))
517      return '';
518
519    if (array_key_exists('class', $attributes))
520      if (preg_match('/\bcaractencadre-spip\b/', $attributes['class']))
521        return '*] ';
522
523    return '}} ';
524  }
525
526  protected function _emS($tag, $attributes, $text) {
527    if (!strlen(trim($text)))
528      return '';
529
530    return ' {';
531  }
532
533  protected function _emE($tag, $attributes, $text) {
534    if (!strlen(trim($text)))
535      return '';
536
537    return '} ';
538  }
539
540  protected function _supS($tag, $attributes, $text) {
541    if (!strlen(trim($text)))
542      return '';
543
544    return '<sup>';
545  }
546
547  protected function _supE($tag, $attributes, $text) {
548    if (!strlen(trim($text)))
549      return '';
550
551    return '</sup>';
552  }
553
554  protected function _subS($tag, $attributes, $text) {
555    if (!strlen(trim($text)))
556      return '';
557
558    return '<sub>';
559  }
560
561  protected function _subE($tag, $attributes, $text) {
562    if (!strlen(trim($text)))
563      return '';
564
565    return '</sub>';
566  }
567
568  protected function _delS($tag, $attributes, $text) {
569    if (!strlen(trim($text)))
570      return '';
571
572    return '<del>';
573  }
574
575  protected function _delE($tag, $attributes, $text) {
576    if (!strlen(trim($text)))
577      return '';
578
579    return '</del>';
580  }
581
582  protected function _spanS($tag, $attributes, $text) {
583    if (!strlen(trim($text)))
584      return '';
585
586    if (!array_key_exists('class', $attributes))
587      return '';
588
589    switch ($attributes['class']) {
590      case 'chapo':
591        if (!$this->within('_a'))
592          return ' [*';
593
594      default:
595        return '';
596    }
597  }
598
599  protected function _spanE($tag, $attributes, $text) {
600    if (!strlen(trim($text)))
601      return '';
602
603    if (!array_key_exists('class', $attributes))
604      return '';
605
606    switch ($attributes['class']) {
607      case 'chapo':
608        if (!$this->within('_a'))
609          return '*] ';
610
611      default:
612        return '';
613    }
614  }
615
616  protected function _aInternal($href, $tag, $attributes, $text, $part) {
617    if (!preg_match('|^.*\.([^./]+)$|', $href, $match))
618      return $href;
619
620    $ext = strtolower($match[1]);
621    switch($ext) {
622      case 'htm':
623      case 'html':
624        return $href;
625
626      case 'pdf':
627      case 'rtf':
628      case 'flv':
629      case 'mov':
630        $type = 'document';
631        break;
632
633      case 'jpg':
634        $type = 'image';
635        break;
636
637      default:
638        $this->interrupt("Extension not configured: $ext");
639    }
640
641    switch ($href[0]) {
642      case '/':
643        $url = "http://" . $_SERVER['SERVER_NAME'] . $href;
644        break;
645
646        case '.':
647      default:
648        $this->interrupt("Unexpected URL: $href");
649    }
650
651    $id = spip_add_document(
652      $url,
653      0,
654      0,
655      $type,
656      null,   # Auto-title !
657      '',
658      $this->spipImagesPath,
659      $this->spipDBResource
660    );
661
662    $this->spipDocumentsIds[] = $id;
663
664    return "$type$id";
665  }
666
667  protected function _a($tag, $attributes, $text, $part) {
668    if ($part == TAG_START)
669      $this->pushWithin('_a');
670    elseif ($part == TAG_END)
671      $this->popWithin('_a');
672
673    if (array_key_exists('href', $attributes)) {
674      $href = $attributes['href'];
675      $href = preg_replace('|^https?://[^/]*|', '', $href);
676    } else
677      $href = false;
678
679    if (array_key_exists('name', $attributes))
680      $name = $attributes['name'];
681    else
682      $name = false;
683
684    if (array_key_exists('title', $attributes))
685      $title = $attributes['title'];
686    else
687      $title = false;
688
689    if (strlen($name) && ($part == TAG_START))
690      $data = "[$name<-]";
691    else
692      $data = '';
693
694    if (preg_match('/^mailto:[A-Za-z0-9%+_.-]+@[A-Za-z0-9.-]+/', $href))
695      return $data;
696
697    if (!strlen(trim($text)))
698      return $data;
699
700    if (!$title && !$href)
701      return $data;
702
703    if ($part == TAG_START)
704      return $data. ' [';
705
706    if (preg_match("%^(\.|/)%", $href))
707      $href = $this->_aInternal($href, $tag, $attributes, $text, $part);
708
709    if ($title)
710      $data .= "|$title";
711
712    $data .= '->';
713
714    if ($href)
715      $data .= $href;
716
717    $data .= '] ';
718
719    return $data;
720  }
721
722  protected function _imgS($tag, $attributes) {
723    if (array_key_exists('class', $attributes) &&
724        ($attributes['class'] == 'puce'))
725      return "\n-";
726     
727    if (!array_key_exists('src', $attributes))
728      return '';
729
730    $url = $attributes['src'];
731    if (preg_match('|^file:///|', $url) > 0)
732      return '';
733
734    switch ($url[0]) {
735      case '/':
736        $url = "http://" . $_SERVER['SERVER_NAME'] . $url;
737        break;
738
739      case '.':
740        break;
741    }
742
743    if (array_key_exists('align', $attributes))
744      $align = '|' . $attributes['align'];
745    else
746      $align = '';
747
748    $image_name = preg_replace('|^.*/([^/]*)$|', '$1', $url);
749
750    $width = array_key_value_if_notEmpty('width', $attributes, 0);
751    $height = array_key_value_if_notEmpty('height', $attributes, 0);
752    $titre = utf8_decode(array_key_value_if_notEmpty('alt', $attributes, $image_name));
753    $descriptif = utf8_decode(array_key_value_if_notEmpty('title', $attributes, $image_name));
754
755    $id = spip_add_document(
756      $url,
757      $width,
758      $height,
759      'image',
760      $titre,
761      $descriptif,
762      $this->spipImagesPath,
763      $this->spipDBResource
764    );
765
766    $this->spipDocumentsIds[] = $id;
767    return "<img$id$align>";
768  }
769
770  protected function _raw($tag, $text) {
771    if ($this->within('_tr'))
772      return trim($text);
773
774    return $text;
775  }
776
777  protected function _comment($tag, $text) {
778    $this->info("Commentaire: $text\n");
779  }
780
781  protected function postProcessing($data, $chunkTitle = 'default') {
782    $replacements = array(
783      "/[ \t]+/"
784        => ' ',
785
786      "/({{{)+/"
787        => "\n\n{{{",
788
789      "/(}}})+/"
790        => "}}}",
791 
792      "/\s{{{}}}/"
793        => '',
794    );
795
796    $spans = array(
797      ' {',   '} ',
798      ' {{',  '}} ',
799      ' [',   '] ',   # hyperlinks
800      ' [*',  '*] ',
801      ' [**', '**]',
802      '[| ',  ' |]',
803      '[/ ',  ' /]',
804    );
805    foreach($spans as $span)
806      $replacements["/(" . preg_quote($span, '/') . ")+/"] = $span;
807
808    for ($i = 0; $i < sizeof($spans); $i += 2)
809      $replacements["/" . preg_quote($spans[$i] . $spans[$i+1], '/') . "/"] = '';
810
811    $replacements[ "/(\n\n)\n+/" ] = "\n\n";
812    $replacements[ "/(\n_ ~)+/" ] = "\n_ ";
813    $replacements[ "/(\n_ \n)+/" ] = "\n\n";
814    $replacements[ "/\n_ $/" ] = "\n";
815
816    foreach($spans as $span) {
817      $ts = preg_quote(trim($span), '/');
818      $replacements[ "/([a-z]') *(" . $ts. "[aehiouy])/i" ] = "$1$2";
819    }
820
821    return preg_replace(
822            array_keys($replacements),
823            array_values($replacements),
824            $data
825    );
826  }
827
828  protected function preProcessing($data) {
829    $data = html_entity_decode($data, ENT_COMPAT, 'UTF-8');
830
831    $replacements = array();
832
833    $block_tags = array('p', 'h[1-6]');
834
835    foreach($block_tags as $bt)
836      $replacements["|(<$bt(\s+[^>]*)?>)\s*([^\s].*[^\s])\s*(</$bt>)|SsiU"]
837        = '$1$3$4';
838
839    $other_rep = array(
840      '|(<td(\s+[^>]*)?>)\s*<p(\s+[^>]*)?>(.*)</p>\s*(</td>)|SsiU'
841        => '$1$4$5',
842
843      '|<br />\s*(<img alt="-" class="puce")|si'
844        => '$1',
845
846      '|<p>&nbsp;</p>|Si'
847        => '',
848
849      "/\s+/S"
850        => ' ',
851
852      "/&nbsp;/S"
853        => '~',
854
855      '|</caption>\s*<|si'
856        => '</caption><',
857    );
858
859    foreach($other_rep as $repp => $repv)
860      $replacements[$repp] = $repv;
861
862    $data = preg_replace(
863      array_keys($replacements),
864      array_values($replacements),
865      $data);
866
867    return $data;
868  }
869
870  public function __construct($spip_db_resource, $images_path) {
871    $this->spipDBResource = $spip_db_resource;
872    $this->spipImagesPath = $images_path;
873  }
874
875  public function addIdentityTags($tags) {
876        foreach ($tags as $tag)
877                $this->tagSubstitute[$tag] =
878                    array('_identityS', '_identityE', null);
879  }
880
881  protected function pushWithin($tag) {
882    array_unshift($this->withinStack, $tag);
883  }
884
885  protected function popWithin($tag) {
886    if ($this->withinStack[0] == $tag)
887      array_shift($this->withinStack);
888    else
889      $this->error("Incorrect nesting tags stack; expected $tag, found "
890                    . $this->withinStack[0]);
891  }
892
893  protected function within($tag) {
894    return in_array($tag, $this->withinStack);
895  }
896
897}
898
899?>
Note: See TracBrowser for help on using the repository browser.