protected function parseAttribute($value)
{
if (($n = preg_match_all('/<%[#=].*?%>/msS', $value, $matches, PREG_OFFSET_CAPTURE)) > 0) {
$isDataBind = false;
$textStart = 0;
$expr = '';
for ($i = 0; $i < $n; ++$i) {
$match = $matches[0][$i];
$token = $match[0];
$offset = $match[1];
$length = strlen($token);
if ($token[2] === '#') {
$isDataBind = true;
}
if ($offset > $textStart) {
$expr .= ".'" . strtr(substr($value, $textStart, $offset - $textStart), array("'" => "\\'", "\\" => "\\\\")) . "'";
}
$expr .= '.(' . substr($token, 3, $length - 5) . ')';
$textStart = $offset + $length;
}
$length = strlen($value);
if ($length > $textStart) {
$expr .= ".'" . strtr(substr($value, $textStart, $length - $textStart), array("'" => "\\'", "\\" => "\\\\")) . "'";
}
if ($isDataBind) {
return array(self::CONFIG_DATABIND, ltrim($expr, '.'));
} else {
return array(self::CONFIG_EXPRESSION, ltrim($expr, '.'));
}
} else {
if (preg_match('/\\s*(<%~.*?%>|<%\\$.*?%>|<%\\[.*?\\]%>|<%\\/.*?%>)\\s*/msS', $value, $matches) && $matches[0] === $value) {
$value = $matches[1];
if ($value[2] === '~') {
return array(self::CONFIG_ASSET, trim(substr($value, 3, strlen($value) - 5)));
} elseif ($value[2] === '[') {
return array(self::CONFIG_LOCALIZATION, trim(substr($value, 3, strlen($value) - 6)));
} elseif ($value[2] === '$') {
return array(self::CONFIG_PARAMETER, trim(substr($value, 3, strlen($value) - 5)));
} elseif ($value[2] === '/') {
$literal = trim(substr($value, 3, strlen($value) - 5));
return array(self::CONFIG_EXPRESSION, "rtrim(dirname(\$this->getApplication()->getRequest()->getApplicationUrl()), '/').'/{$literal}'");
}
} else {
return $value;
}
}
}