Optimize regex using \d
This commit is contained in:
parent
cfc325ab57
commit
30ec11c7fa
|
@ -224,7 +224,7 @@ class FormulaParser
|
||||||
// scientific notation check
|
// scientific notation check
|
||||||
if (strpos(self::OPERATORS_SN, $this->formula[$index]) !== false) {
|
if (strpos(self::OPERATORS_SN, $this->formula[$index]) !== false) {
|
||||||
if (strlen($value) > 1) {
|
if (strlen($value) > 1) {
|
||||||
if (preg_match("/^[1-9]{1}(\.[0-9]+)?E{1}$/", $this->formula[$index]) != 0) {
|
if (preg_match("/^[1-9]{1}(\.\d+)?E{1}$/", $this->formula[$index]) != 0) {
|
||||||
$value .= $this->formula[$index];
|
$value .= $this->formula[$index];
|
||||||
++$index;
|
++$index;
|
||||||
|
|
||||||
|
|
|
@ -179,7 +179,7 @@ class LookupRef
|
||||||
if (is_array($cellAddress)) {
|
if (is_array($cellAddress)) {
|
||||||
foreach ($cellAddress as $columnKey => $rowValue) {
|
foreach ($cellAddress as $columnKey => $rowValue) {
|
||||||
foreach ($rowValue as $rowKey => $cellValue) {
|
foreach ($rowValue as $rowKey => $cellValue) {
|
||||||
return (int) preg_replace('/[^0-9]/', '', $rowKey);
|
return (int) preg_replace('/\D/', '', $rowKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -188,8 +188,8 @@ class LookupRef
|
||||||
}
|
}
|
||||||
if (strpos($cellAddress, ':') !== false) {
|
if (strpos($cellAddress, ':') !== false) {
|
||||||
list($startAddress, $endAddress) = explode(':', $cellAddress);
|
list($startAddress, $endAddress) = explode(':', $cellAddress);
|
||||||
$startAddress = preg_replace('/[^0-9]/', '', $startAddress);
|
$startAddress = preg_replace('/\D/', '', $startAddress);
|
||||||
$endAddress = preg_replace('/[^0-9]/', '', $endAddress);
|
$endAddress = preg_replace('/\D/', '', $endAddress);
|
||||||
$returnValue = [];
|
$returnValue = [];
|
||||||
do {
|
do {
|
||||||
$returnValue[][] = (int) $startAddress;
|
$returnValue[][] = (int) $startAddress;
|
||||||
|
@ -199,7 +199,7 @@ class LookupRef
|
||||||
}
|
}
|
||||||
list($cellAddress) = explode(':', $cellAddress);
|
list($cellAddress) = explode(':', $cellAddress);
|
||||||
|
|
||||||
return (int) preg_replace('/[^0-9]/', '', $cellAddress);
|
return (int) preg_replace('/\D/', '', $cellAddress);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@ class AdvancedValueBinder extends DefaultValueBinder implements IValueBinder
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for fraction
|
// Check for fraction
|
||||||
if (preg_match('/^([+-]?)\s*([0-9]+)\s?\/\s*([0-9]+)$/', $value, $matches)) {
|
if (preg_match('/^([+-]?)\s*(\d+)\s?\/\s*(\d+)$/', $value, $matches)) {
|
||||||
// Convert value to number
|
// Convert value to number
|
||||||
$value = $matches[2] / $matches[3];
|
$value = $matches[2] / $matches[3];
|
||||||
if ($matches[1] == '-') {
|
if ($matches[1] == '-') {
|
||||||
|
@ -61,7 +61,7 @@ class AdvancedValueBinder extends DefaultValueBinder implements IValueBinder
|
||||||
->getNumberFormat()->setFormatCode('??/??');
|
->getNumberFormat()->setFormatCode('??/??');
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} elseif (preg_match('/^([+-]?)([0-9]*) +([0-9]*)\s?\/\s*([0-9]*)$/', $value, $matches)) {
|
} elseif (preg_match('/^([+-]?)(\d*) +(\d*)\s?\/\s*(\d*)$/', $value, $matches)) {
|
||||||
// Convert value to number
|
// Convert value to number
|
||||||
$value = $matches[2] + ($matches[3] / $matches[4]);
|
$value = $matches[2] + ($matches[3] / $matches[4]);
|
||||||
if ($matches[1] == '-') {
|
if ($matches[1] == '-') {
|
||||||
|
@ -76,7 +76,7 @@ class AdvancedValueBinder extends DefaultValueBinder implements IValueBinder
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for percentage
|
// Check for percentage
|
||||||
if (preg_match('/^\-?[0-9]*\.?[0-9]*\s?\%$/', $value)) {
|
if (preg_match('/^\-?\d*\.?\d*\s?\%$/', $value)) {
|
||||||
// Convert value to number
|
// Convert value to number
|
||||||
$value = (float) str_replace('%', '', $value) / 100;
|
$value = (float) str_replace('%', '', $value) / 100;
|
||||||
$cell->setValueExplicit($value, DataType::TYPE_NUMERIC);
|
$cell->setValueExplicit($value, DataType::TYPE_NUMERIC);
|
||||||
|
|
|
@ -59,7 +59,7 @@ class DefaultValueBinder implements IValueBinder
|
||||||
return DataType::TYPE_BOOL;
|
return DataType::TYPE_BOOL;
|
||||||
} elseif (is_float($pValue) || is_int($pValue)) {
|
} elseif (is_float($pValue) || is_int($pValue)) {
|
||||||
return DataType::TYPE_NUMERIC;
|
return DataType::TYPE_NUMERIC;
|
||||||
} elseif (preg_match('/^[\+\-]?([0-9]+\\.?[0-9]*|[0-9]*\\.?[0-9]+)([Ee][\-\+]?[0-2]?\d{1,3})?$/', $pValue)) {
|
} elseif (preg_match('/^[\+\-]?(\d+\\.?\d*|\d*\\.?\d+)([Ee][\-\+]?[0-2]?\d{1,3})?$/', $pValue)) {
|
||||||
$tValue = ltrim($pValue, '+-');
|
$tValue = ltrim($pValue, '+-');
|
||||||
if (is_string($pValue) && $tValue[0] === '0' && strlen($tValue) > 1 && $tValue[1] !== '.') {
|
if (is_string($pValue) && $tValue[0] === '0' && strlen($tValue) > 1 && $tValue[1] !== '.') {
|
||||||
return DataType::TYPE_STRING;
|
return DataType::TYPE_STRING;
|
||||||
|
|
|
@ -4548,8 +4548,8 @@ class Xls extends BaseReader
|
||||||
}
|
}
|
||||||
|
|
||||||
// first column 'A' + last column 'IV' indicates that full row is selected
|
// first column 'A' + last column 'IV' indicates that full row is selected
|
||||||
if (preg_match('/^(A[0-9]+\:)IV([0-9]+)$/', $selectedCells)) {
|
if (preg_match('/^(A\d+\:)IV(\d+)$/', $selectedCells)) {
|
||||||
$selectedCells = preg_replace('/^(A[0-9]+\:)IV([0-9]+)$/', '${1}XFD${2}', $selectedCells);
|
$selectedCells = preg_replace('/^(A\d+\:)IV(\d+)$/', '${1}XFD${2}', $selectedCells);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->phpSheet->setSelectedCells($selectedCells);
|
$this->phpSheet->setSelectedCells($selectedCells);
|
||||||
|
|
|
@ -342,7 +342,7 @@ class Style extends Supervisor
|
||||||
// Selection type, inspect
|
// Selection type, inspect
|
||||||
if (preg_match('/^[A-Z]+1:[A-Z]+1048576$/', $pRange)) {
|
if (preg_match('/^[A-Z]+1:[A-Z]+1048576$/', $pRange)) {
|
||||||
$selectionType = 'COLUMN';
|
$selectionType = 'COLUMN';
|
||||||
} elseif (preg_match('/^A[0-9]+:XFD[0-9]+$/', $pRange)) {
|
} elseif (preg_match('/^A\d+:XFD\d+$/', $pRange)) {
|
||||||
$selectionType = 'ROW';
|
$selectionType = 'ROW';
|
||||||
} else {
|
} else {
|
||||||
$selectionType = 'CELL';
|
$selectionType = 'CELL';
|
||||||
|
|
|
@ -2424,13 +2424,13 @@ class Worksheet implements IComparable
|
||||||
$pCoordinate = preg_replace('/^([A-Z]+)$/', '${1}:${1}', $pCoordinate);
|
$pCoordinate = preg_replace('/^([A-Z]+)$/', '${1}:${1}', $pCoordinate);
|
||||||
|
|
||||||
// Convert '1' to '1:1'
|
// Convert '1' to '1:1'
|
||||||
$pCoordinate = preg_replace('/^([0-9]+)$/', '${1}:${1}', $pCoordinate);
|
$pCoordinate = preg_replace('/^(\d+)$/', '${1}:${1}', $pCoordinate);
|
||||||
|
|
||||||
// Convert 'A:C' to 'A1:C1048576'
|
// Convert 'A:C' to 'A1:C1048576'
|
||||||
$pCoordinate = preg_replace('/^([A-Z]+):([A-Z]+)$/', '${1}1:${2}1048576', $pCoordinate);
|
$pCoordinate = preg_replace('/^([A-Z]+):([A-Z]+)$/', '${1}1:${2}1048576', $pCoordinate);
|
||||||
|
|
||||||
// Convert '1:3' to 'A1:XFD3'
|
// Convert '1:3' to 'A1:XFD3'
|
||||||
$pCoordinate = preg_replace('/^([0-9]+):([0-9]+)$/', 'A${1}:XFD${2}', $pCoordinate);
|
$pCoordinate = preg_replace('/^(\d+):(\d+)$/', 'A${1}:XFD${2}', $pCoordinate);
|
||||||
|
|
||||||
if (strpos($pCoordinate, ':') !== false || strpos($pCoordinate, ',') !== false) {
|
if (strpos($pCoordinate, ':') !== false || strpos($pCoordinate, ',') !== false) {
|
||||||
list($first) = Coordinate::splitRange($pCoordinate);
|
list($first) = Coordinate::splitRange($pCoordinate);
|
||||||
|
|
|
@ -1019,21 +1019,21 @@ class Parser
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// if it's a reference A1 or $A$1 or $A1 or A$1
|
// if it's a reference A1 or $A$1 or $A1 or A$1
|
||||||
if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?[0-9]+$/', $token) and !preg_match('/[0-9]/', $this->lookAhead) and ($this->lookAhead != ':') and ($this->lookAhead != '.') and ($this->lookAhead != '!')) {
|
if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?\d+$/', $token) and !preg_match('/\d/', $this->lookAhead) and ($this->lookAhead != ':') and ($this->lookAhead != '.') and ($this->lookAhead != '!')) {
|
||||||
return $token;
|
return $token;
|
||||||
} elseif (preg_match('/^' . self::REGEX_SHEET_TITLE_UNQUOTED . "(\:" . self::REGEX_SHEET_TITLE_UNQUOTED . ")?\!\\$?[A-Ia-i]?[A-Za-z]\\$?[0-9]+$/u", $token) and !preg_match('/[0-9]/', $this->lookAhead) and ($this->lookAhead != ':') and ($this->lookAhead != '.')) {
|
} elseif (preg_match('/^' . self::REGEX_SHEET_TITLE_UNQUOTED . "(\:" . self::REGEX_SHEET_TITLE_UNQUOTED . ")?\!\\$?[A-Ia-i]?[A-Za-z]\\$?\d+$/u", $token) and !preg_match('/\d/', $this->lookAhead) and ($this->lookAhead != ':') and ($this->lookAhead != '.')) {
|
||||||
// If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1 or Sheet1!$A$1 or Sheet1:Sheet2!$A$1)
|
// If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1 or Sheet1!$A$1 or Sheet1:Sheet2!$A$1)
|
||||||
return $token;
|
return $token;
|
||||||
} elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . "(\:" . self::REGEX_SHEET_TITLE_QUOTED . ")?'\!\\$?[A-Ia-i]?[A-Za-z]\\$?[0-9]+$/u", $token) and !preg_match('/[0-9]/', $this->lookAhead) and ($this->lookAhead != ':') and ($this->lookAhead != '.')) {
|
} elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . "(\:" . self::REGEX_SHEET_TITLE_QUOTED . ")?'\!\\$?[A-Ia-i]?[A-Za-z]\\$?\d+$/u", $token) and !preg_match('/\d/', $this->lookAhead) and ($this->lookAhead != ':') and ($this->lookAhead != '.')) {
|
||||||
// If it's an external reference ('Sheet1'!A1 or 'Sheet1:Sheet2'!A1 or 'Sheet1'!$A$1 or 'Sheet1:Sheet2'!$A$1)
|
// If it's an external reference ('Sheet1'!A1 or 'Sheet1:Sheet2'!A1 or 'Sheet1'!$A$1 or 'Sheet1:Sheet2'!$A$1)
|
||||||
return $token;
|
return $token;
|
||||||
} elseif (preg_match('/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+:(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/', $token) && !preg_match('/[0-9]/', $this->lookAhead)) {
|
} elseif (preg_match('/^(\$)?[A-Ia-i]?[A-Za-z](\$)?\d+:(\$)?[A-Ia-i]?[A-Za-z](\$)?\d+$/', $token) && !preg_match('/\d/', $this->lookAhead)) {
|
||||||
// if it's a range A1:A2 or $A$1:$A$2
|
// if it's a range A1:A2 or $A$1:$A$2
|
||||||
return $token;
|
return $token;
|
||||||
} elseif (preg_match('/^' . self::REGEX_SHEET_TITLE_UNQUOTED . "(\:" . self::REGEX_SHEET_TITLE_UNQUOTED . ")?\!\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+:\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+$/u", $token) and !preg_match('/[0-9]/', $this->lookAhead)) {
|
} elseif (preg_match('/^' . self::REGEX_SHEET_TITLE_UNQUOTED . "(\:" . self::REGEX_SHEET_TITLE_UNQUOTED . ")?\!\\$?([A-Ia-i]?[A-Za-z])?\\$?\d+:\\$?([A-Ia-i]?[A-Za-z])?\\$?\d+$/u", $token) and !preg_match('/\d/', $this->lookAhead)) {
|
||||||
// If it's an external range like Sheet1!A1:B2 or Sheet1:Sheet2!A1:B2 or Sheet1!$A$1:$B$2 or Sheet1:Sheet2!$A$1:$B$2
|
// If it's an external range like Sheet1!A1:B2 or Sheet1:Sheet2!A1:B2 or Sheet1!$A$1:$B$2 or Sheet1:Sheet2!$A$1:$B$2
|
||||||
return $token;
|
return $token;
|
||||||
} elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . "(\:" . self::REGEX_SHEET_TITLE_QUOTED . ")?'\!\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+:\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+$/u", $token) and !preg_match('/[0-9]/', $this->lookAhead)) {
|
} elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . "(\:" . self::REGEX_SHEET_TITLE_QUOTED . ")?'\!\\$?([A-Ia-i]?[A-Za-z])?\\$?\d+:\\$?([A-Ia-i]?[A-Za-z])?\\$?\d+$/u", $token) and !preg_match('/\d/', $this->lookAhead)) {
|
||||||
// If it's an external range like 'Sheet1'!A1:B2 or 'Sheet1:Sheet2'!A1:B2 or 'Sheet1'!$A$1:$B$2 or 'Sheet1:Sheet2'!$A$1:$B$2
|
// If it's an external range like 'Sheet1'!A1:B2 or 'Sheet1:Sheet2'!A1:B2 or 'Sheet1'!$A$1:$B$2 or 'Sheet1:Sheet2'!$A$1:$B$2
|
||||||
return $token;
|
return $token;
|
||||||
} elseif (is_numeric($token) and (!is_numeric($token . $this->lookAhead) or ($this->lookAhead == '')) and ($this->lookAhead != '!') and ($this->lookAhead != ':')) {
|
} elseif (is_numeric($token) and (!is_numeric($token . $this->lookAhead) or ($this->lookAhead == '')) and ($this->lookAhead != '!') and ($this->lookAhead != ':')) {
|
||||||
|
@ -1250,39 +1250,39 @@ class Parser
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
// if it's a reference
|
// if it's a reference
|
||||||
if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?[0-9]+$/', $this->currentToken)) {
|
if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?\d+$/', $this->currentToken)) {
|
||||||
$result = $this->createTree($this->currentToken, '', '');
|
$result = $this->createTree($this->currentToken, '', '');
|
||||||
$this->advance();
|
$this->advance();
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
} elseif (preg_match('/^' . self::REGEX_SHEET_TITLE_UNQUOTED . "(\:" . self::REGEX_SHEET_TITLE_UNQUOTED . ")?\!\\$?[A-Ia-i]?[A-Za-z]\\$?[0-9]+$/u", $this->currentToken)) {
|
} elseif (preg_match('/^' . self::REGEX_SHEET_TITLE_UNQUOTED . "(\:" . self::REGEX_SHEET_TITLE_UNQUOTED . ")?\!\\$?[A-Ia-i]?[A-Za-z]\\$?\d+$/u", $this->currentToken)) {
|
||||||
// If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1 or Sheet1!$A$1 or Sheet1:Sheet2!$A$1)
|
// If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1 or Sheet1!$A$1 or Sheet1:Sheet2!$A$1)
|
||||||
$result = $this->createTree($this->currentToken, '', '');
|
$result = $this->createTree($this->currentToken, '', '');
|
||||||
$this->advance();
|
$this->advance();
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
} elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . "(\:" . self::REGEX_SHEET_TITLE_QUOTED . ")?'\!\\$?[A-Ia-i]?[A-Za-z]\\$?[0-9]+$/u", $this->currentToken)) {
|
} elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . "(\:" . self::REGEX_SHEET_TITLE_QUOTED . ")?'\!\\$?[A-Ia-i]?[A-Za-z]\\$?\d+$/u", $this->currentToken)) {
|
||||||
// If it's an external reference ('Sheet1'!A1 or 'Sheet1:Sheet2'!A1 or 'Sheet1'!$A$1 or 'Sheet1:Sheet2'!$A$1)
|
// If it's an external reference ('Sheet1'!A1 or 'Sheet1:Sheet2'!A1 or 'Sheet1'!$A$1 or 'Sheet1:Sheet2'!$A$1)
|
||||||
$result = $this->createTree($this->currentToken, '', '');
|
$result = $this->createTree($this->currentToken, '', '');
|
||||||
$this->advance();
|
$this->advance();
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
} elseif (preg_match('/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+:(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/', $this->currentToken) or
|
} elseif (preg_match('/^(\$)?[A-Ia-i]?[A-Za-z](\$)?\d+:(\$)?[A-Ia-i]?[A-Za-z](\$)?\d+$/', $this->currentToken) or
|
||||||
preg_match('/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+\.\.(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/', $this->currentToken)) {
|
preg_match('/^(\$)?[A-Ia-i]?[A-Za-z](\$)?\d+\.\.(\$)?[A-Ia-i]?[A-Za-z](\$)?\d+$/', $this->currentToken)) {
|
||||||
// if it's a range A1:B2 or $A$1:$B$2
|
// if it's a range A1:B2 or $A$1:$B$2
|
||||||
// must be an error?
|
// must be an error?
|
||||||
$result = $this->createTree($this->currentToken, '', '');
|
$result = $this->createTree($this->currentToken, '', '');
|
||||||
$this->advance();
|
$this->advance();
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
} elseif (preg_match('/^' . self::REGEX_SHEET_TITLE_UNQUOTED . "(\:" . self::REGEX_SHEET_TITLE_UNQUOTED . ")?\!\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+:\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+$/u", $this->currentToken)) {
|
} elseif (preg_match('/^' . self::REGEX_SHEET_TITLE_UNQUOTED . "(\:" . self::REGEX_SHEET_TITLE_UNQUOTED . ")?\!\\$?([A-Ia-i]?[A-Za-z])?\\$?\d+:\\$?([A-Ia-i]?[A-Za-z])?\\$?\d+$/u", $this->currentToken)) {
|
||||||
// If it's an external range (Sheet1!A1:B2 or Sheet1:Sheet2!A1:B2 or Sheet1!$A$1:$B$2 or Sheet1:Sheet2!$A$1:$B$2)
|
// If it's an external range (Sheet1!A1:B2 or Sheet1:Sheet2!A1:B2 or Sheet1!$A$1:$B$2 or Sheet1:Sheet2!$A$1:$B$2)
|
||||||
// must be an error?
|
// must be an error?
|
||||||
$result = $this->createTree($this->currentToken, '', '');
|
$result = $this->createTree($this->currentToken, '', '');
|
||||||
$this->advance();
|
$this->advance();
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
} elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . "(\:" . self::REGEX_SHEET_TITLE_QUOTED . ")?'\!\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+:\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+$/u", $this->currentToken)) {
|
} elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . "(\:" . self::REGEX_SHEET_TITLE_QUOTED . ")?'\!\\$?([A-Ia-i]?[A-Za-z])?\\$?\d+:\\$?([A-Ia-i]?[A-Za-z])?\\$?\d+$/u", $this->currentToken)) {
|
||||||
// If it's an external range ('Sheet1'!A1:B2 or 'Sheet1'!A1:B2 or 'Sheet1'!$A$1:$B$2 or 'Sheet1'!$A$1:$B$2)
|
// If it's an external range ('Sheet1'!A1:B2 or 'Sheet1'!A1:B2 or 'Sheet1'!$A$1:$B$2 or 'Sheet1'!$A$1:$B$2)
|
||||||
// must be an error?
|
// must be an error?
|
||||||
$result = $this->createTree($this->currentToken, '', '');
|
$result = $this->createTree($this->currentToken, '', '');
|
||||||
|
|
Loading…
Reference in New Issue