ILIAS  Release_5_0_x_branch Revision 61816
 All Data Structures Namespaces Files Functions Variables Groups Pages
Custom.php
Go to the documentation of this file.
1 <?php
2 
10 {
14  public $type = 'custom';
15 
19  public $allow_empty = false;
20 
25  public $dtd_regex;
26 
31  private $_pcre_regex;
32 
36  public function __construct($dtd_regex)
37  {
38  $this->dtd_regex = $dtd_regex;
39  $this->_compileRegex();
40  }
41 
45  protected function _compileRegex()
46  {
47  $raw = str_replace(' ', '', $this->dtd_regex);
48  if ($raw{0} != '(') {
49  $raw = "($raw)";
50  }
51  $el = '[#a-zA-Z0-9_.-]+';
52  $reg = $raw;
53 
54  // COMPLICATED! AND MIGHT BE BUGGY! I HAVE NO CLUE WHAT I'M
55  // DOING! Seriously: if there's problems, please report them.
56 
57  // collect all elements into the $elements array
58  preg_match_all("/$el/", $reg, $matches);
59  foreach ($matches[0] as $match) {
60  $this->elements[$match] = true;
61  }
62 
63  // setup all elements as parentheticals with leading commas
64  $reg = preg_replace("/$el/", '(,\\0)', $reg);
65 
66  // remove commas when they were not solicited
67  $reg = preg_replace("/([^,(|]\(+),/", '\\1', $reg);
68 
69  // remove all non-paranthetical commas: they are handled by first regex
70  $reg = preg_replace("/,\(/", '(', $reg);
71 
72  $this->_pcre_regex = $reg;
73  }
74 
81  public function validateChildren($children, $config, $context)
82  {
83  $list_of_children = '';
84  $nesting = 0; // depth into the nest
85  foreach ($children as $node) {
86  if (!empty($node->is_whitespace)) {
87  continue;
88  }
89  $list_of_children .= $node->name . ',';
90  }
91  // add leading comma to deal with stray comma declarations
92  $list_of_children = ',' . rtrim($list_of_children, ',');
93  $okay =
94  preg_match(
95  '/^,?' . $this->_pcre_regex . '$/',
96  $list_of_children
97  );
98  return (bool)$okay;
99  }
100 }
101 
102 // vim: et sw=4 sts=4